Advertisement
EliteAnax17

B2W2 Force RNG on Game Init 1.0

Mar 24th, 2017
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.69 KB | None | 0 0
  1. -- B2W2 (U) RNG Script v1.0 --
  2. -- written by ProjectRevoTPP --
  3. -- based on MKDasher's scripts --
  4. -- designed for DesMUmE v0.9.9+ --
  5.  
  6. -- DO NOT USE 32-BIT DESMUME WITH THIS SCRIPT, IT WONT WORK!--
  7.  
  8. module("mt19937", package.seeall)
  9.  
  10. -- CONFIG --
  11.  
  12. desired_seed = "0x8D133658030FC2E7"
  13. display_config = 1 -- 0 for lua window, 1 for gui text, anything else to not print
  14. game = 0 -- 0 for white2, 1 for black2
  15.  
  16. RNG_ADDR = 0x021FFC58-0x20*game
  17. IVRNG_ADDR = 0x21FED68-0x20*game
  18.  
  19. ------------------------------------------
  20. -- main program below --
  21.  
  22. local UPPER_MASK = 0x80000000 -- most significant w-r bits
  23. local LOWER_MASK = 0x7fffffff -- least significant r bits
  24.  
  25. local mt = {} -- the array for the state vector
  26. local NUM = 624
  27. local M = 397
  28.  
  29. desired_seed_1 = string.sub(desired_seed, 0, 10) -- upper
  30. desired_seed_2 = "0x" .. string.sub(desired_seed, 11, 18) -- lower
  31.  
  32. function FramesAdvance(nframes)
  33. for frame = 1, nframes do
  34. emu.frameadvance()
  35. end
  36. end
  37.  
  38. function drawguitext(rng2, rng1)
  39. gui.text(1,10,string.format("Current: %08X%08X",rng2,rng1))
  40. end
  41.  
  42. -- initializes mt[N] with a seed
  43. function randomseed(s)
  44. s = bit.band(s, 0xffffffff)
  45. mt[1] = s
  46. for i = 1, NUM - 1 do
  47. -- s = 1812433253 * (bit.bxor(s, bit.rshift(s, 30))) + i
  48. s = bit.bxor(s, bit.rshift(s, 30))
  49. local s_lo = bit.band(s, 0xffff)
  50. local s_hi = bit.rshift(s, 16)
  51. local s_lo2 = bit.band(1812433253 * s_lo, 0xffffffff)
  52. local s_hi2 = bit.band(1812433253 * s_hi, 0xffff)
  53. s = bit.bor(bit.lshift(bit.rshift(s_lo2, 16) + s_hi2, 16),
  54. bit.band(s_lo2, 0xffff))
  55. -- s = bit.band(s + i, 0xffffffff)
  56. local s_lim = -bit.tobit(s)
  57. -- assumes i<2^31
  58. if (s_lim > 0 and s_lim <= i) then
  59. s = i - s_lim
  60. else
  61. s = s + i
  62. end
  63. mt[i+1] = s
  64. -- See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
  65. -- In the previous versions, MSBs of the seed affect
  66. -- only MSBs of the array mt[].
  67. -- 2002/01/09 modified by Makoto Matsumoto
  68. end
  69. mti = NUM
  70. end
  71.  
  72. local mag01 = { 0, MATRIX_A } -- mag01[x] = x * MATRIX_A for x=0,1
  73.  
  74. function writemersennetable(seed)
  75. local N
  76. randomseed(seed)
  77.  
  78. print("Writing mersenne table...")
  79. for N = 1, 624 do
  80. memory.writedword(IVRNG_ADDR + (4 * (N - 1)), mt[N])
  81. N = N + 1
  82. end
  83. print("Write complete.")
  84.  
  85. end
  86.  
  87. last_known_rng_value_1 = 0; -- set initial local rng to 0
  88. last_known_rng_value_2 = 0; -- set initial local rng to 0
  89.  
  90. emu.reset() -- reset the game.
  91.  
  92. FramesAdvance(30) -- wait for the first seed update before forcing
  93.  
  94. local rng1 = memory.readdword(RNG_ADDR)
  95. local rng2 = memory.readdword(RNG_ADDR + 4)
  96. print(string.format("Initial RNG seed: %08x%08x", rng2, rng1))
  97.  
  98. -- WARNING: does not support 32-bit! --
  99. -- write the forced seed and backup. --
  100. memory.writedword(RNG_ADDR, desired_seed_2)
  101. memory.writedword(RNG_ADDR + 4, desired_seed_1)
  102.  
  103. last_known_rng_value_1 = desired_seed_1
  104. last_known_rng_value_2 = desired_seed_2
  105.  
  106. local mtrng = memory.readdword(IVRNG_ADDR)
  107.  
  108. print(string.format("Initial IVRNG: %08x", mtrng))
  109. print("RNG seed to be injected is: ", desired_seed)
  110.  
  111. -- force mersenne table. --
  112. writemersennetable(desired_seed_1)
  113. mtrng = memory.readdword(IVRNG_ADDR)
  114. print(string.format("IVRNG After updating: %08x", mtrng))
  115. print(string.format("RNG seed injected: %08x%08x", desired_seed_1, desired_seed_2))
  116.  
  117. -- do main loop. --
  118. repeat
  119. local rng1 = memory.readdword(RNG_ADDR)
  120. local rng2 = memory.readdword(RNG_ADDR + 4)
  121.  
  122. if rng1 ~= last_known_rng_value_1 then
  123. if rng2 ~= last_known_rng_value_2 then
  124. if display_config == 0 then
  125. print(string.format("Current: %08x%08x", rng2, rng1))
  126. end
  127. last_known_rng_value_1 = rng1
  128. last_known_rng_value_2 = rng2
  129. end
  130. end
  131.  
  132. if display_config == 1 then
  133. drawguitext(rng2, rng1)
  134. end
  135.  
  136. emu.frameadvance()
  137. until false
  138.  
  139. gui.register(drawguitext)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement