Skip to content

Commit

Permalink
Replace mersenne twister (closes #896)
Browse files Browse the repository at this point in the history
LordMonoxide committed Dec 3, 2023
1 parent 2e6deec commit 91e8672
Showing 5 changed files with 139 additions and 158 deletions.
17 changes: 17 additions & 0 deletions src/main/java/legend/core/Random.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package legend.core;

public class Random extends java.util.Random {
/**
* Returns the 32 high bits of Stafford variant 4 mix64 function as int.
* http://zimbry.blogspot.com/2011/09/better-bit-mixing-improving-on.html
*/
private static int mix32(long z) {
z = (z ^ (z >>> 33)) * 0x62a9d9ed799705f5L;
return (int)(((z ^ (z >>> 28)) * 0xcb24d0a5c88c35b3L) >>> 32);
}

@Override
public int nextInt() {
return mix32(super.nextInt());
}
}
10 changes: 5 additions & 5 deletions src/main/java/legend/game/combat/Bttl_800c.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package legend.game.combat;

import legend.core.MathHelper;
import legend.core.Random;
import legend.core.gpu.GpuCommandPoly;
import legend.core.gpu.GpuCommandQuad;
import legend.core.gpu.RECT;
@@ -69,7 +70,6 @@
import legend.game.combat.types.CombatantStruct1a8;
import legend.game.combat.types.DragoonSpells09;
import legend.game.combat.types.EnemyDrop;
import legend.game.combat.types.MersenneTwisterSeed;
import legend.game.combat.ui.BattleDisplayStats144;
import legend.game.combat.ui.BattleHudCharacterDisplay3c;
import legend.game.combat.ui.BattleMenuStruct58;
@@ -461,8 +461,7 @@ private Bttl_800c() { }

public static final ArrayRef<UnsignedShortRef> additionNextLevelXp_800fa744 = MEMORY.ref(2, 0x800fa744L, ArrayRef.of(UnsignedShortRef.class, 5, 2, UnsignedShortRef::new));

/** Mersenne Twister seed */
public static final MersenneTwisterSeed seed_800fa754 = MEMORY.ref(4, 0x800fa754L, MersenneTwisterSeed::new);
public static final Random seed_800fa754 = new Random();
/**
* <ol start="0">
* <li>{@link Bttl_800d#renderDiscGradientEffect}</li>
@@ -4489,7 +4488,8 @@ public static FlowControl scriptAllocateFullScreenOverlay(final RunningScript<?
@Method(0x800cee50L)
public static FlowControl scriptRand(final RunningScript<?> script) {
final int min = script.params_20[1].get();
script.params_20[0].set((int)(seed_800fa754.advance().get() % (script.params_20[2].get() - min + 1) + min));
final int max = script.params_20[2].get();
script.params_20[0].set(seed_800fa754.nextInt(min, max));
return FlowControl.CONTINUE;
}

@@ -4727,7 +4727,7 @@ public static FlowControl FUN_800cfec8(final RunningScript<?> script) {

@Method(0x800cfed0L)
public static void setMtSeed(final long seed) {
seed_800fa754.set(seed ^ 0x75b_d924L);
seed_800fa754.setSeed(seed ^ 0x75b_d924L);
}

@ScriptDescription("Sets the Mersenne Twister random number seed")
36 changes: 18 additions & 18 deletions src/main/java/legend/game/combat/Bttl_800d.java
Original file line number Diff line number Diff line change
@@ -295,16 +295,16 @@ public static FlowControl scriptAllocateProjectileHitEffect(final RunningScript<
struct.g_36 = script.params_20[3].get() << 8;
struct.b_38 = script.params_20[4].get() << 8;

final short x = (short)(seed_800fa754.advance().get() % 301 + 200);
final short y = (short)(seed_800fa754.advance().get() % 401 - 300);
final short z = (short)(seed_800fa754.advance().get() % 601 - 300);
final short x = (short)(seed_800fa754.nextInt(301) + 200);
final short y = (short)(seed_800fa754.nextInt(401) - 300);
final short z = (short)(seed_800fa754.nextInt(601) - 300);
struct._24[0].set(x, y, z);
struct._24[1].set(x, y, z);

struct._04[0].x = 0.0f;
struct._04[0].y = seed_800fa754.advance().get() % 101 - 50;
struct._04[0].z = seed_800fa754.advance().get() % 101 - 50;
struct.frames_44 = (int)(seed_800fa754.advance().get() % 9 + 7);
struct._04[0].y = seed_800fa754.nextInt(101) - 50;
struct._04[0].z = seed_800fa754.nextInt(101) - 50;
struct.frames_44 = seed_800fa754.nextInt(9) + 7;

struct._40 = 0;
struct._24[1].y += 25.0f;
@@ -436,12 +436,12 @@ public static FlowControl scriptAllocateAdditionSparksEffect(final RunningScript

inst.ticksExisted_00 = 0;

inst.delay_04 = (byte)(seed_800fa754.advance().get() % (s4 + 1));
inst.ticksRemaining_05 = (byte)(seed_800fa754.advance().get() % 9 + 7);
inst.delay_04 = (byte)(seed_800fa754.nextInt(s4 + 1));
inst.ticksRemaining_05 = (byte)(seed_800fa754.nextInt(9) + 7);

inst.startPos_08.set(inst.delay_04 * s1, 0, 0);
inst.endPos_18.set(0, 0, 0);
inst.speed_28.set((int)seed_800fa754.advance().get() % 201, (int)seed_800fa754.advance().get() % 201 - 100, (int)seed_800fa754.advance().get() % 201 - 100);
inst.speed_28.set(seed_800fa754.nextInt(201), seed_800fa754.nextInt(201) - 100, seed_800fa754.nextInt(201) - 100);
inst.acceleration_38.set(0.0f, 15.0f, 0.0f);

inst.r_40 = script.params_20[2].get() << 8;
@@ -613,11 +613,11 @@ public static FlowControl scriptAllocateAdditionStarburstEffect(final RunningScr
//LAB_800d1ac4
for(int rayNum = 0; rayNum < rayCount; rayNum++) {
rayArray[rayNum].renderRay_00 = true;
rayArray[rayNum].angle_02 = MathHelper.psxDegToRad(seed_800fa754.advance().get() % 4097);
rayArray[rayNum].angle_02 = seed_800fa754.nextFloat(MathHelper.TWO_PI);
rayArray[rayNum].unused_04 = 16;
rayArray[rayNum].endpointTranslationMagnitude_06 = (short)(seed_800fa754.advance().get() % 31);
rayArray[rayNum].endpointTranslationMagnitudeVelocity_08 = (short)(seed_800fa754.advance().get() % 21 + 10);
rayArray[rayNum].angleModifier_0a = MathHelper.psxDegToRad(seed_800fa754.advance().get() % 11 - 5);
rayArray[rayNum].endpointTranslationMagnitude_06 = (short)(seed_800fa754.nextInt(31));
rayArray[rayNum].endpointTranslationMagnitudeVelocity_08 = (short)(seed_800fa754.nextInt(21) + 10);
rayArray[rayNum].angleModifier_0a = MathHelper.psxDegToRad(seed_800fa754.nextInt(11) - 5);
rayArray[rayNum].unused_0c = 0;
}

@@ -995,8 +995,8 @@ public static void monsterDeathEffectTicker(final ScriptState<EffectManagerData6
objArray[objIndex].destructionState_00 = 1;
objArray[objIndex].stepCount_01 = 8;
objArray[objIndex].scaleModifier_04 = 0;
objArray[objIndex].scaleModifierVelocity_08 = (int)(seed_800fa754.advance().get() % 49 + 104) / (float)0x1000;
objArray[objIndex].angleModifier_0c = MathHelper.psxDegToRad((int)(seed_800fa754.advance().get() % 4097));
objArray[objIndex].scaleModifierVelocity_08 = (seed_800fa754.nextInt(49) + 104) / (float)0x1000;
objArray[objIndex].angleModifier_0c = seed_800fa754.nextFloat(MathHelper.TWO_PI);
objArray[objIndex].angleModifierVelocity_10 = 0;
objArray[objIndex].r_24 = manager._10.colour_1c.x << 8;
objArray[objIndex].g_26 = manager._10.colour_1c.y << 8;
@@ -1798,7 +1798,7 @@ public static void FUN_800d5ec8(final float x, final float y, final float z, fin
* @param z 8-bit fixed-point
*/
@Method(0x800d60b0L)
public static void FUN_800d60b0(final float x, final float y, final float z, final int ticks, final int stepSmoothingMode, final float stepZ, final int stepType, BattleObject bobj) {
public static void FUN_800d60b0(final float x, final float y, final float z, final int ticks, final int stepSmoothingMode, final float stepZ, final int stepType, final BattleObject bobj) {
final BattleCamera cam = camera_800c67f0;

cam.viewpointAngleX_ac = calculateCameraValue(false, 1, 0, null);
@@ -1831,7 +1831,7 @@ public static void FUN_800d60b0(final float x, final float y, final float z, fin
* @param z 8-bit fixed-point
*/
@Method(0x800d62d8L)
public static void FUN_800d62d8(final float x, final float y, final float z, final int ticks, final int stepSmoothingMode, final float stepZ, final int stepType, BattleObject bobj) {
public static void FUN_800d62d8(final float x, final float y, final float z, final int ticks, final int stepSmoothingMode, final float stepZ, final int stepType, final BattleObject bobj) {
final BattleCamera cam = camera_800c67f0;

cam.viewpointBaseTranslation_94.x = calculateCameraValue(false, 4, 0, null);
@@ -1860,7 +1860,7 @@ public static void FUN_800d62d8(final float x, final float y, final float z, fin
* @param z 8-bit fixed-point
*/
@Method(0x800d64e4L)
public static void FUN_800d64e4(final float x, final float y, final float z, final int ticks, final int stepSmoothingMode, final float stepZ, final int stepType, BattleObject bobj) {
public static void FUN_800d64e4(final float x, final float y, final float z, final int ticks, final int stepSmoothingMode, final float stepZ, final int stepType, final BattleObject bobj) {
final BattleCamera cam = camera_800c67f0;

cam.viewpointAngleX_ac = calculateCameraValue(false, 5, 0, null);
220 changes: 99 additions & 121 deletions src/main/java/legend/game/combat/SEffe.java

Large diffs are not rendered by default.

14 changes: 0 additions & 14 deletions src/main/java/legend/game/combat/types/MersenneTwisterSeed.java

This file was deleted.

0 comments on commit 91e8672

Please sign in to comment.