Advertisement
EliteAnax17

Untitled

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