Advertisement
EliteAnax17

Untitled

Mar 26th, 2017
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.88 KB | None | 0 0
  1. -- Gen5 RNG Script v1.2 --
  2. -- written by ProjectRevoTPP --
  3. -- based on MKDasher's scripts --
  4. -- v1.1 by dabomstew: added BW1 support and autodetect game --
  5. -- designed for DesMUmE v0.9.9+ --
  6.  
  7. -- DO NOT USE 32-BIT DESMUME WITH THIS SCRIPT, IT WONT WORK!--
  8.  
  9. module("mt19937", package.seeall)
  10.  
  11. -- CONFIG --
  12.  
  13. desired_seed = "0x8D133658030FC2E7"
  14. display_config = 1 -- 0 for lua window, 1 for gui text, anything else to not print
  15. game = -1 -- 0 for white2, 1 for black2, 2 for white1, 3 for black1, -1 for autodetect
  16.  
  17. ------------------------------------------
  18. -- main program below --
  19.  
  20. emu.reset() -- reset the game.
  21. emu.unpause()
  22.  
  23. print("Waiting 180 frames for injection window...")
  24.  
  25. function FramesAdvance(nframes)
  26. for frame = 1, nframes do
  27. emu.frameadvance()
  28. end
  29. end
  30.  
  31. FramesAdvance(180)
  32.  
  33. if game == -1 then
  34. arm9part1 = memory.readdword(0x2000024)
  35. arm9part2 = memory.readdword(0x2000028)
  36. if arm9part1 == 0x0221B2F0 and arm9part2 == 0x020AA9C4 then
  37. game = 3 -- black 1
  38. elseif arm9part1 == 0x0221B310 and arm9part2 == 0x020AA9E4 then
  39. game = 2 -- white 1
  40. elseif arm9part1 == 0x02204CC4 and arm9part2 == 0x0209E288 then
  41. game = 1 -- black 2
  42. elseif arm9part1 == 0x02204D04 and arm9part2 == 0x0209E2C8 then
  43. game = 0 -- white 2
  44. else
  45. print("Auto-Detect failed, ROM not open or non-English ROM open.")
  46. return
  47. end
  48. print("Auto-Detect game="..game)
  49. end
  50.  
  51. emu.reset() -- reset the game again.
  52. emu.unpause()
  53.  
  54. if game >= 2 then -- black1/white1
  55. RNG_ADDR = 0x02216244-0x20*(game-2)
  56. IVRNG_ADDR = 0x02215374-0x20*(game-2)
  57. STEPCOUNT_ADDR = 0x02235148-0x20*(game-2)
  58. BATTLE_RNG_ADDR = 0x021F6388-0x20*(game-2) -- 64 bit
  59. IS_IN_BATTLE = 0x021E092A-0x20*(game-2)
  60. else -- black2/white2, off by 0x40 between versions.
  61. RNG_ADDR = 0x021FFC58-0x40*game
  62. IVRNG_ADDR = 0x21FED68-0x40*game
  63. STEPCOUNT_ADDR = 0x0221EBA0-0x40*game
  64. BATTLE_RNG_ADDR = 0x021DD88C-0x40*game
  65. IS_IN_BATTLE = 0x0213B320-0x40*game
  66. end
  67.  
  68. local UPPER_MASK = 0x80000000 -- most significant w-r bits
  69. local LOWER_MASK = 0x7fffffff -- least significant r bits
  70.  
  71. local mt = {} -- the array for the state vector
  72. local NUM = 624
  73. local M = 397
  74.  
  75. desired_seed_1 = string.sub(desired_seed, 0, 10) -- upper
  76. desired_seed_2 = "0x" .. string.sub(desired_seed, 11, 18) -- lower
  77.  
  78. function drawguitext(rng2, rng1, last_lag_frame_counter, step_counter, in_battle, battle_rng2, battle_rng1)
  79. gui.text(1,10,string.format("Current: %08X%08X",rng2,rng1))
  80. gui.text(160,20,string.format("Last Lag: %i",last_lag_frame_counter))
  81. if in_battle == 1 then
  82. gui.text(1,20,string.format("Battle: %08X%08X",battle_rng2, battle_rng1))
  83. else
  84. gui.text(1,20,string.format("Battle: Not in a battle."))
  85. end
  86. gui.text(178,10,string.format("Steps: %i",step_counter))
  87. end
  88.  
  89. -- initializes mt[N] with a seed
  90. function randomseed(s)
  91. s = bit.band(s, 0xffffffff)
  92. mt[1] = s
  93. for i = 1, NUM - 1 do
  94. -- s = 1812433253 * (bit.bxor(s, bit.rshift(s, 30))) + i
  95. s = bit.bxor(s, bit.rshift(s, 30))
  96. local s_lo = bit.band(s, 0xffff)
  97. local s_hi = bit.rshift(s, 16)
  98. local s_lo2 = bit.band(1812433253 * s_lo, 0xffffffff)
  99. local s_hi2 = bit.band(1812433253 * s_hi, 0xffff)
  100. s = bit.bor(bit.lshift(bit.rshift(s_lo2, 16) + s_hi2, 16),
  101. bit.band(s_lo2, 0xffff))
  102. -- s = bit.band(s + i, 0xffffffff)
  103. local s_lim = -bit.tobit(s)
  104. -- assumes i<2^31
  105. if (s_lim > 0 and s_lim <= i) then
  106. s = i - s_lim
  107. else
  108. s = s + i
  109. end
  110. mt[i+1] = s
  111. -- See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
  112. -- In the previous versions, MSBs of the seed affect
  113. -- only MSBs of the array mt[].
  114. -- 2002/01/09 modified by Makoto Matsumoto
  115. end
  116. mti = NUM
  117. end
  118.  
  119. local mag01 = { 0, MATRIX_A } -- mag01[x] = x * MATRIX_A for x=0,1
  120.  
  121. function writemersennetable(seed)
  122. local N
  123. randomseed(seed)
  124.  
  125. print("Writing mersenne table...")
  126. for N = 1, 624 do
  127. memory.writedword(IVRNG_ADDR + (4 * (N - 1)), mt[N])
  128. N = N + 1
  129. end
  130. print("Write complete.")
  131.  
  132. end
  133.  
  134. -- begin program --
  135.  
  136. FramesAdvance(30) -- wait for the first seed update before forcing
  137.  
  138. last_known_rng_value_1 = 0; -- set initial local rng to 0
  139. last_known_rng_value_2 = 0; -- set initial local rng to 0
  140. step_counter = 0;
  141. in_battle = 0;
  142.  
  143. local rng1 = memory.readdword(RNG_ADDR)
  144. local rng2 = memory.readdword(RNG_ADDR + 4)
  145. print(string.format("Initial RNG seed: %08x%08x", rng2, rng1))
  146.  
  147. -- WARNING: does not support 32-bit! --
  148. -- write the forced seed and backup. --
  149. memory.writedword(RNG_ADDR, desired_seed_2)
  150. memory.writedword(RNG_ADDR + 4, desired_seed_1)
  151.  
  152. last_known_rng_value_1 = desired_seed_1
  153. last_known_rng_value_2 = desired_seed_2
  154. last_lag_frame_counter = 0;
  155.  
  156. local mtrng = memory.readdword(IVRNG_ADDR)
  157.  
  158. print(string.format("Initial IVRNG: %08x", mtrng))
  159. print("RNG seed to be injected is: ", desired_seed)
  160.  
  161. -- force mersenne table. --
  162. writemersennetable(desired_seed_1)
  163. mtrng = memory.readdword(IVRNG_ADDR)
  164. print(string.format("IVRNG After updating: %08x", mtrng))
  165. print(string.format("RNG seed injected: %08x%08x", desired_seed_1, desired_seed_2))
  166.  
  167. -- do main loop. --
  168. repeat
  169. local rng1 = memory.readdword(RNG_ADDR)
  170. local rng2 = memory.readdword(RNG_ADDR + 4)
  171. local step_counter = memory.readdword(STEPCOUNT_ADDR)
  172. local in_battle = memory.readbyte(IS_IN_BATTLE)
  173. local battle_rng1 = memory.readdword(BATTLE_RNG_ADDR)
  174. local battle_rng2 = memory.readdword(BATTLE_RNG_ADDR + 4)
  175.  
  176. if rng1 ~= last_known_rng_value_1 then
  177. if rng2 ~= last_known_rng_value_2 then
  178. if display_config == 0 then
  179. print(string.format("Current: %08x%08x", rng2, rng1))
  180. end
  181. last_known_rng_value_1 = rng1
  182. last_known_rng_value_2 = rng2
  183. end
  184. end
  185.  
  186. if display_config == 1 then
  187. drawguitext(rng2, rng1, last_lag_frame_counter, step_counter, in_battle, battle_rng2, battle_rng1)
  188. end
  189.  
  190. if emu.lagged() == true then
  191. last_lag_frame_counter = 0
  192. else
  193. last_lag_frame_counter = last_lag_frame_counter + 1
  194. end
  195.  
  196. emu.frameadvance()
  197. until false
  198.  
  199. gui.register(drawguitext)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement