Advertisement
EliteAnax17

Untitled

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