From 91e8672d4a2df1054d129048e1f891b28b8aea34 Mon Sep 17 00:00:00 2001 From: Corey Frenette Date: Sat, 2 Dec 2023 21:44:40 -0400 Subject: [PATCH] Replace mersenne twister (closes #896) --- src/main/java/legend/core/Random.java | 17 ++ .../java/legend/game/combat/Bttl_800c.java | 10 +- .../java/legend/game/combat/Bttl_800d.java | 36 +-- src/main/java/legend/game/combat/SEffe.java | 220 ++++++++---------- .../combat/types/MersenneTwisterSeed.java | 14 -- 5 files changed, 139 insertions(+), 158 deletions(-) create mode 100644 src/main/java/legend/core/Random.java delete mode 100644 src/main/java/legend/game/combat/types/MersenneTwisterSeed.java diff --git a/src/main/java/legend/core/Random.java b/src/main/java/legend/core/Random.java new file mode 100644 index 000000000..8a66d14d3 --- /dev/null +++ b/src/main/java/legend/core/Random.java @@ -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()); + } +} diff --git a/src/main/java/legend/game/combat/Bttl_800c.java b/src/main/java/legend/game/combat/Bttl_800c.java index 3c9934e79..1375c171d 100644 --- a/src/main/java/legend/game/combat/Bttl_800c.java +++ b/src/main/java/legend/game/combat/Bttl_800c.java @@ -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 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(); /** *
    *
  1. {@link Bttl_800d#renderDiscGradientEffect}
  2. @@ -4489,7 +4488,8 @@ public static FlowControl scriptAllocateFullScreenOverlay(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") diff --git a/src/main/java/legend/game/combat/Bttl_800d.java b/src/main/java/legend/game/combat/Bttl_800d.java index 6633a5411..5a2a1dd39 100644 --- a/src/main/java/legend/game/combat/Bttl_800d.java +++ b/src/main/java/legend/game/combat/Bttl_800d.java @@ -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>> 8) * effect.effectInner_08._18; particle.particleVelocity_58.z = (rcos(angle) >>> 8) * effect.effectInner_08._18; } @@ -1616,16 +1616,12 @@ public static void FUN_800fea68(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - seed_800fa754.advance(); - final int angle = (int)(seed_800fa754.get() % 4097); + final int angle = seed_800fa754.nextInt(4097); particle.particleVelocity_58.x = rcos(angle) >> 8; particle.particleVelocity_58.z = rsin(angle) >> 8; + particle.particleVelocity_58.y = -seed_800fa754.nextInt(91) - 10; - seed_800fa754.advance(); - particle.particleVelocity_58.y = -(seed_800fa754.get() % 91 + 10); - - seed_800fa754.advance(); - final float colourStep = (seed_800fa754.get() % 101 - 50) / (float)0x80; + final float colourStep = (seed_800fa754.nextInt(101) - 50) / (float)0x80; particle.r_84 += colourStep; particle.g_86 += colourStep; particle.b_88 += colourStep; @@ -1636,7 +1632,6 @@ public static long FUN_800fea70(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { final int s0 = (short)FUN_800fea70(manager, effect, particle, effectInner); - seed_800fa754.advance(); particle.particleVelocity_58.x = rcos(s0) >> 6; particle.particleVelocity_58.y = 0.0f; particle.particleVelocity_58.z = rsin(s0) >> 6; @@ -1644,63 +1639,56 @@ public static void FUN_800fec3c(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - seed_800fa754.advance(); - final int angle = (int)(seed_800fa754.get() % 4097); + final int angle = seed_800fa754.nextInt(4097); particle.particleVelocity_58.x = rcos(angle) >> 10; - seed_800fa754.advance(); - particle.particleVelocity_58.y = -(seed_800fa754.get() % 33 + 13); + particle.particleVelocity_58.y = -(seed_800fa754.nextInt(33) + 13); particle.particleVelocity_58.z = rsin(angle) >> 10; - seed_800fa754.advance(); - particle._14 = (short)(seed_800fa754.get() % 3 + 1); - seed_800fa754.advance(); - particle._16 = (short)(seed_800fa754.get() % 3); + particle._14 = (short)(seed_800fa754.nextInt(3) + 1); + particle._16 = (short)(seed_800fa754.nextInt(3)); particle.framesUntilRender_04 = (short)(particle.framesUntilRender_04 / 4 * 4 + 1); } @Method(0x800fee9cL) public static void FUN_800fee9c(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - seed_800fa754.advance(); - final int angle = (int)(seed_800fa754.get() % 4097); + final int angle = seed_800fa754.nextInt(4097); particle.particleVelocity_58.x = rcos(angle) / 0x80; particle.particleVelocity_58.y = 0.0f; particle.particleVelocity_58.z = rsin(angle) / 0x80; particle.framesUntilRender_04 = 1; - seed_800fa754.advance(); - particle._14 = (short)(seed_800fa754.get() % 6); + particle._14 = (short)(seed_800fa754.nextInt(6)); } @Method(0x800fefe4L) public static void FUN_800fefe4(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { FUN_800fee9c(manager, effect, particle, effectInner); - particle._14 = (short)(seed_800fa754.advance().get() % 4097); + particle._14 = (short)(seed_800fa754.nextInt(4097)); particle._16 = effectInner._10; - particle._18 = (short)(seed_800fa754.advance().get() % 91 + 10); + particle._18 = (short)(seed_800fa754.nextInt(91) + 10); particle._1a.x = 120.0f; particle.particleVelocity_58.x = 0.0f; - particle.particleVelocity_58.y = -(seed_800fa754.advance().get() % 11 + 5); + particle.particleVelocity_58.y = -seed_800fa754.nextInt(11) - 5; particle.particleVelocity_58.z = 0.0f; } @Method(0x800ff15cL) public static void FUN_800ff15c(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - seed_800fa754.advance(); - particle.particleVelocity_58.y = -(seed_800fa754.get() % 61 + 60); + particle.particleVelocity_58.y = -seed_800fa754.nextInt(61) - 60; final float scaleStep; if(vsyncMode_8007a3b8 != 4) { - scaleStep = (short)-(seed_800fa754.advance().get() % 14 + 5) / (float)0x1000; + scaleStep = (short)-(seed_800fa754.nextInt(14) + 5) / (float)0x1000; } else { //LAB_800ff248 - scaleStep = (short)-(seed_800fa754.advance().get() % 21 + 10) / (float)0x1000; + scaleStep = (short)-(seed_800fa754.nextInt(21) + 10) / (float)0x1000; } particle.scaleHorizontalStep_0a = scaleStep; particle.scaleVerticalStep_0c = scaleStep; //LAB_800ff2b4 - particle._14 = (short)(seed_800fa754.advance().get() % 4097); - particle._1a.x = seed_800fa754.advance().get() % 4097; - particle._1a.z = seed_800fa754.advance().get() % 1025 - 512; + particle._14 = (short)seed_800fa754.nextInt(4097); + particle._1a.x = seed_800fa754.nextInt(4097); + particle._1a.z = seed_800fa754.nextInt(1025) - 512; particle._1a.y = 100.0f; particle._16 = effectInner._10; @@ -1726,9 +1714,9 @@ public static void FUN_800ff430(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { particle.ticksRemaining_12 = -1; - particle._14 = (short)(seed_800fa754.advance().get() % 4097); + particle._14 = (short)seed_800fa754.nextInt(4097); particle._16 = effectInner._10; - particle._18 = (short)(seed_800fa754.advance().get() % 4097); - particle._1a.x = seed_800fa754.advance().get() % 4097; + particle._18 = (short)seed_800fa754.nextInt(4097); + particle._1a.x = seed_800fa754.nextInt(4097); } @Method(0x800ff890L) public static void FUN_800ff890(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - seed_800fa754.advance(); - seed_800fa754.advance(); - final int angle1 = (int)(seed_800fa754.get() % 4097); - - seed_800fa754.advance(); - final int angle2 = (int)(seed_800fa754.get() % 2049); + final int angle1 = seed_800fa754.nextInt(4097); + final int angle2 = seed_800fa754.nextInt(2049); particle.particleVelocity_58.x = rcos(angle1) * rsin(angle2) / 0x40 >> 12; particle.particleVelocity_58.y = rcos(angle2) / 0x40; particle.particleVelocity_58.z = rsin(angle1) * rsin(angle2) / 0x40 >> 12; - seed_800fa754.advance(); - particle.ticksRemaining_12 += (short)(seed_800fa754.get() % 21 - 10); + particle.ticksRemaining_12 += (short)(seed_800fa754.nextInt(21) - 10); if(particle.ticksRemaining_12 <= 0) { particle.ticksRemaining_12 = 1; @@ -1830,7 +1811,7 @@ public static void FUN_800ffa80(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - particle._14 = (short)(seed_800fa754.advance().get() % 4097); + particle._14 = (short)(seed_800fa754.nextInt(4097)); final int v0 = -effectInner._10 >> 5; particle.r_84 = 0; particle.g_86 = 0; @@ -1859,24 +1840,22 @@ public static void FUN_800ffb80(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { particle._14 = 0; - particle._18 = (short)(seed_800fa754.advance().get() % 21 - 10); - particle._1a.x = seed_800fa754.advance().get() % 21 - 10; - particle._1a.y = seed_800fa754.advance().get() % 81 - 40; + particle._18 = (short)(seed_800fa754.nextInt(21) - 10); + particle._1a.x = seed_800fa754.nextInt(21) - 10; + particle._1a.y = seed_800fa754.nextInt(81) - 40; particle._1a.z = particle.ticksRemaining_12; - particle.particleVelocity_58.x = (seed_800fa754.advance().get() % 41 + 44) * effectInner._18; - particle.particleVelocity_58.y = (seed_800fa754.advance().get() % 81 - 40) * effectInner._18; - particle.particleVelocity_58.z = (seed_800fa754.advance().get() % 41 + 44) * effectInner._18; + particle.particleVelocity_58.x = (seed_800fa754.nextInt(41) + 44) * effectInner._18; + particle.particleVelocity_58.y = (seed_800fa754.nextInt(81) - 40) * effectInner._18; + particle.particleVelocity_58.z = (seed_800fa754.nextInt(41) + 44) * effectInner._18; particle.ticksRemaining_12 += 20; } @Method(0x800ffe80L) public static void FUN_800ffe80(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { + particle._14 = (short)(seed_800fa754.nextInt(4097)); particle._16 = effectInner._10; particle._18 = (short)(effectInner._18 * 32.0f); particle.particleAcceleration_60.y = effectInner._18 * 2.0f; - - seed_800fa754.advance(); - particle._14 = (short)(seed_800fa754.get() % 4097); } @Method(0x800ffefcL) @@ -1897,14 +1876,14 @@ public static void FUN_800fff04(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - particle.particleVelocity_58.x = seed_800fa754.advance().get() % 769 + 256; + particle.particleVelocity_58.x = seed_800fa754.nextInt(769) + 256; } @Method(0x800fffa0L) public static void FUN_800fffa0(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { particle._1a.x = effectInner._10; - particle._14 = (short)(seed_800fa754.advance().get() % 4097); - particle._16 = (short)((seed_800fa754.advance().get() % 123 + 64) * effectInner._18); + particle._14 = (short)(seed_800fa754.nextInt(4097)); + particle._16 = (short)((seed_800fa754.nextInt(123) + 64) * effectInner._18); particle._18 = (short)(0x800 / effect.countParticleInstance_50 * currentParticleIndex_8011a008.get()); } @@ -1923,21 +1902,19 @@ public static void FUN_801000f8(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - seed_800fa754.advance(); - particle._1a.x = (short)(seed_800fa754.get() % 4097); + particle._1a.x = (short)(seed_800fa754.nextInt(4097)); particle._14 = (short)particle.particlePosition_50.x; particle._16 = (short)particle.particlePosition_50.y; particle._18 = (short)particle.particlePosition_50.z; particle._1a.z = effectInner._10 / 4.0f; particle.particleVelocity_58.y = effectInner._18 * -64.0f; - seed_800fa754.advance(); - particle._1a.y = (seed_800fa754.get() % 513 - 256) * effectInner._18; + particle._1a.y = (seed_800fa754.nextInt(513) - 256) * effectInner._18; } @Method(0x8010025cL) public static void FUN_8010025c(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { particle.particleVelocity_58.y = 64.0f; - final int angle = (int)(seed_800fa754.advance().get() % 4097); + final int angle = seed_800fa754.nextInt(4097); if(effectInner.callbackIndex_20 == 0x2a) { final int velocityMagnitude = (effectInner._10 & 0xffff) >>> 5; particle.particleVelocity_58.x = rcos(angle) * velocityMagnitude >> 12; @@ -1954,8 +1931,8 @@ public static void FUN_801003e8(final EffectManagerData6c>> 16 & 0xff); particle.particlePosition_50.x = (rcos(angle1) * rsin(angle2) >> 12) * s4 >> 12; particle.particlePosition_50.y = rcos(angle2) * s4 >> 12; @@ -1977,14 +1954,14 @@ public static void FUN_80100364(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { final int s2 = effectInner._10; FUN_800ff890(manager, effect, particle, effectInner); - final int angle = (int)(seed_800fa754.advance().get() % 4097); + final int angle = seed_800fa754.nextInt(4097); particle.particlePosition_50.y = rsin(angle) * s2 >> 12; particle.particlePosition_50.z = rcos(angle) * s2 >> 12; - particle.particleVelocity_58.x = (seed_800fa754.advance().get() % 65 + 54) * effectInner._18; + particle.particleVelocity_58.x = (seed_800fa754.nextInt(65) + 54) * effectInner._18; particle.particleAcceleration_60.x = -particle.particleVelocity_58.x / particle.ticksRemaining_12; particle.particleAcceleration_60.y = 16.0f; final int a1_0 = -((rsin(angle) * s2 >> 12) + s2) / 2; - particle.particleVelocity_58.y = (seed_800fa754.advance().get() % (-a1_0 + 1) + a1_0) * effectInner._18; + particle.particleVelocity_58.y = (seed_800fa754.nextInt(-a1_0 + 1) + a1_0) * effectInner._18; } @Method(0x801007b4L) @@ -1996,7 +1973,7 @@ public static void FUN_801007b4(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { particle._16 = (short)(effectInner._18 * 64.0f); particle._18 = effectInner._10; - particle._14 = (short)(seed_800fa754.advance().get() % 4097); + particle._14 = (short)(seed_800fa754.nextInt(4097)); } @Method(0x80100878L) @@ -2004,7 +1981,7 @@ public static void FUN_80100878(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - particle._14 = (short)(seed_800fa754.advance().get() % 4097); - particle._16 = (short)(seed_800fa754.advance().get() % ((effectInner._10 & 0xffff) + 1)); - particle._18 = (short)(seed_800fa754.advance().get() % 4097); - particle._1a.x = (seed_800fa754.advance().get() % 41 + 150) * effectInner._18; + particle._14 = (short)(seed_800fa754.nextInt(4097)); + particle._16 = (short)(seed_800fa754.nextInt((effectInner._10 & 0xffff) + 1)); + particle._18 = (short)(seed_800fa754.nextInt(4097)); + particle._1a.x = (seed_800fa754.nextInt(41) + 150) * effectInner._18; particle.particleVelocity_58.y = -64.0f; } @@ -2040,7 +2017,7 @@ public static void FUN_80100af4(final EffectManagerData6c manager, final ParticleEffectData98 effect, final ParticleEffectInstance94 particle, final ParticleEffectData98Inner24 effectInner) { - particle.particleVelocity_58.y = seed_800fa754.advance().get() % 33 + 16; + particle.particleVelocity_58.y = seed_800fa754.nextInt(33) + 16; } @Method(0x80100c18L) @@ -2124,9 +2101,9 @@ public static void FUN_80100ea0(final ScriptState>> 4); - particle.particleVelocity_58.y = diffTranslation.y / 8.0f + (seed_800fa754.advance().get() % mod - s1 >>> 4); - particle.particleVelocity_58.z = diffTranslation.z / 8.0f + (seed_800fa754.advance().get() % mod - s1 >>> 4); + particle.particleVelocity_58.x = diffTranslation.x / 8.0f + (seed_800fa754.nextInt(mod) - s1 >>> 4); + particle.particleVelocity_58.y = diffTranslation.y / 8.0f + (seed_800fa754.nextInt(mod) - s1 >>> 4); + particle.particleVelocity_58.z = diffTranslation.z / 8.0f + (seed_800fa754.nextInt(mod) - s1 >>> 4); particle.particleVelocity_58.x *= effect.effectInner_08._18; particle.particleVelocity_58.y *= effect.effectInner_08._18; particle.particleVelocity_58.z *= effect.effectInner_08._18; @@ -2231,27 +2208,27 @@ public static void initializeParticleInstance(final EffectManagerData6c>> 16); final float colour = ((effectInner.particleInnerStuff_1c & 0xff00) >>> 8) / (float)0x80; particle.r_84 = colour; particle.g_86 = colour; particle.b_88 = colour; particle.flags_90 |= 0x1; - particle.angle_0e = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 4097)); - particle.angleVelocity_10 = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 513 - 256)); - particle.spriteRotation_70.x = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 4097)); - particle.spriteRotation_70.y = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 4097)); - particle.spriteRotation_70.z = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 4097)); - particle.spriteRotationStep_78.x = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 129 - 64)); - particle.spriteRotationStep_78.y = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 129 - 64)); + particle.angle_0e = seed_800fa754.nextFloat() * MathHelper.TWO_PI; + particle.angleVelocity_10 = seed_800fa754.nextFloat() * MathHelper.TWO_PI / 8.0f - MathHelper.TWO_PI / 16.0f; + particle.spriteRotation_70.x = seed_800fa754.nextFloat() * MathHelper.TWO_PI; + particle.spriteRotation_70.y = seed_800fa754.nextFloat() * MathHelper.TWO_PI; + particle.spriteRotation_70.z = seed_800fa754.nextFloat() * MathHelper.TWO_PI; + particle.spriteRotationStep_78.x = seed_800fa754.nextFloat() * MathHelper.TWO_PI / 32.0f - MathHelper.TWO_PI / 64.0f; + particle.spriteRotationStep_78.y = seed_800fa754.nextFloat() * MathHelper.TWO_PI / 32.0f - MathHelper.TWO_PI / 64.0f; particle.spriteRotationStep_78.z = 0.0f; - particle.flags_90 = particle.flags_90 & 0xffff_fff1 | (seed_800fa754.advance().get() % 101 < 50 ? 0 : 0x8); + particle.flags_90 = particle.flags_90 & 0xffff_fff1 | (seed_800fa754.nextFloat() < 0.5f ? 0 : 0x8); final ParticleInitialTransformationMetrics10 metrics = particleInitialTransformationMetrics_801198f0.get(callbackIndex); final int initialPositionMode = metrics.initialPositionMode_00.get(); if(initialPositionMode == 1) { //LAB_80101840 - final int angle = (int)(seed_800fa754.advance().get() % 4097); + final int angle = seed_800fa754.nextInt(4097); final short baseTranslationMagnitude = effectInner._10; particle.particlePosition_50.x = rcos(angle) * baseTranslationMagnitude >> metrics.initialTranslationMagnitudeReductionFactor1_02.get(); particle.particlePosition_50.y = 0.0f; @@ -2259,18 +2236,18 @@ public static void initializeParticleInstance(final EffectManagerData6c> metrics.initialTranslationMagnitudeReductionFactor1_02.get(); particle.particlePosition_50.y = 0.0f; particle.particlePosition_50.z = rsin(angle) * baseTranslationMagnitude >> metrics.initialTranslationMagnitudeReductionFactor1_02.get(); } else if(initialPositionMode == 3) { //LAB_80101990 - particle.particlePosition_50.y = seed_800fa754.advance().get() % (metrics.initialTranslationMagnitudeReductionFactor2_04.get() - metrics.initialTranslationMagnitudeReductionFactor1_02.get() + 1) + metrics.initialTranslationMagnitudeReductionFactor1_02.get(); + particle.particlePosition_50.y = seed_800fa754.nextInt(metrics.initialTranslationMagnitudeReductionFactor2_04.get() - metrics.initialTranslationMagnitudeReductionFactor1_02.get() + 1) + metrics.initialTranslationMagnitudeReductionFactor1_02.get(); } else if(initialPositionMode == 4) { //LAB_801019e4 - final int angle1 = (int)(seed_800fa754.advance().get() % 4097); - final int angle2 = (int)(seed_800fa754.advance().get() % 2049); + final int angle1 = seed_800fa754.nextInt(4097); + final int angle2 = seed_800fa754.nextInt(2049); particle.particlePosition_50.x = (rcos(angle1) * rsin(angle2) >> metrics.initialTranslationMagnitudeReductionFactor1_02.get()) * effectInner._10 >> metrics.initialTranslationMagnitudeReductionFactor2_04.get(); particle.particlePosition_50.y = rcos(angle2) * effectInner._10 >> metrics.initialTranslationMagnitudeReductionFactor2_04.get(); particle.particlePosition_50.z = (rsin(angle1) * rsin(angle2) >> metrics.initialTranslationMagnitudeReductionFactor1_02.get()) * effectInner._10 >> metrics.initialTranslationMagnitudeReductionFactor2_04.get(); @@ -2288,7 +2265,7 @@ public static void initializeParticleInstance(final EffectManagerData6c> 7; - newOrigin.z += (seed_800fa754.advance().get() % 257 - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; + newOrigin.x += (seed_800fa754.nextInt(257) - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; + newOrigin.z += (seed_800fa754.nextInt(257) - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; newOrigin.add(secondaryScriptTranslation); } } @@ -2679,18 +2656,18 @@ public static void initializeElectricityNodes(final EffectManagerData6c> 7; - segmentOriginZ += (seed_800fa754.advance().get() % 257 - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; + segmentOriginX += (seed_800fa754.nextInt(257) - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; + segmentOriginZ += (seed_800fa754.nextInt(257) - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; //LAB_80102e58 } else if(i < electricEffect.boltSegmentCount_28 - 2) { - segmentOriginX = (seed_800fa754.advance().get() % 257 - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; - segmentOriginZ = (seed_800fa754.advance().get() % 257 - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; + segmentOriginX = (seed_800fa754.nextInt(257) - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; + segmentOriginZ = (seed_800fa754.nextInt(257) - 128) * electricEffect.segmentOriginTranslationModifier_26 >> 7; } else { //LAB_80102f44 segmentOriginX = 0; @@ -3033,7 +3010,7 @@ public static void renderElectricEffectType1(final ScriptState a0, final ElectricityEffect38 a1, final LightningBoltEffect14 bolt, final int a3) { - bolt.rotation_04.x = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 4097)); - bolt.rotation_04.y = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 4097)); - bolt.rotation_04.z = MathHelper.psxDegToRad((short)(seed_800fa754.advance().get() % 4097)); + bolt.rotation_04.x = seed_800fa754.nextFloat(MathHelper.TWO_PI); + bolt.rotation_04.y = seed_800fa754.nextFloat(MathHelper.TWO_PI); + bolt.rotation_04.z = seed_800fa754.nextFloat(MathHelper.TWO_PI); } @Method(0x80104b10L) @@ -3274,7 +3251,7 @@ public static FlowControl scriptAllocateElectricityEffect(final RunningScript> 12; - final float z = (rcos(angle) + rsin(angle)) * scale >> 12; + star.toggleOffFrameThreshold_38 = seed_800fa754.nextInt(181); + final int scale = seed_800fa754.nextInt(maxScale + 1); + final float angle = seed_800fa754.nextFloat(MathHelper.TWO_PI); + final float sin = MathHelper.sin(angle); + final float cos = MathHelper.cosFromSin(sin, angle); + final float x = (cos - sin) * scale; + final float z = (cos + sin) * scale; star.translation_04.set(x, 0.0f, z); } @@ -6700,7 +6678,7 @@ public static void tickMoonlightStarsEffect(final ScriptState star.toggleOffFrameThreshold_38) { star.renderStars_03 = false; star.currentFrame_00 = 0; - star.toggleOffFrameThreshold_38 = (short)(seed_800fa754.advance().get() % (star.maxToggleFrameThreshold_36 + 1)); + star.toggleOffFrameThreshold_38 = (short)(seed_800fa754.nextInt(star.maxToggleFrameThreshold_36 + 1)); } else { //LAB_8010ffb0 star.renderStars_03 = true; diff --git a/src/main/java/legend/game/combat/types/MersenneTwisterSeed.java b/src/main/java/legend/game/combat/types/MersenneTwisterSeed.java deleted file mode 100644 index 5a25d90de..000000000 --- a/src/main/java/legend/game/combat/types/MersenneTwisterSeed.java +++ /dev/null @@ -1,14 +0,0 @@ -package legend.game.combat.types; - -import legend.core.memory.Value; -import legend.core.memory.types.UnsignedIntRef; - -public class MersenneTwisterSeed extends UnsignedIntRef { - public MersenneTwisterSeed(final Value ref) { - super(ref); - } - - public MersenneTwisterSeed advance() { - return (MersenneTwisterSeed)this.incr().mulOverflow(0x10dcdL); - } -}