Advertisement
EliteAnax17

Untitled

Mar 24th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. -- B2W2 (U) RNG Script v0.03 --
  2. -- written by ProjectRevoTPP --
  3. -- designed for DesMUmE v0.9.9 --
  4.  
  5. module("mt19937", package.seeall)
  6.  
  7. local UPPER_MASK = 0x80000000 -- most significant w-r bits
  8. local LOWER_MASK = 0x7fffffff -- least significant r bits
  9.  
  10. local mt = {} -- the array for the state vector
  11. local NUM = 624
  12. local M = 397
  13.  
  14. RNG_ADDR = 0x021FFC58
  15. IVRNG_ADDR = 0x21FED68
  16.  
  17. desired_seed = "0xDEADBEEFDEADBEEF"
  18.  
  19. -- main program below --
  20.  
  21. desired_seed_1 = string.sub(desired_seed, 0, 10) -- upper
  22. desired_seed_2 = "0x" .. string.sub(desired_seed, 11, 18) -- lower
  23.  
  24. function FramesAdvance(nframes)
  25. for frame = 1, nframes do
  26. emu.frameadvance()
  27. end
  28. end
  29.  
  30. -- initializes mt[N] with a seed
  31. function randomseed(s)
  32. s = bit.band(s, 0xffffffff)
  33. mt[1] = s
  34. for i = 1, NUM - 1 do
  35. -- s = 1812433253 * (bit.bxor(s, bit.rshift(s, 30))) + i
  36. s = bit.bxor(s, bit.rshift(s, 30))
  37. local s_lo = bit.band(s, 0xffff)
  38. local s_hi = bit.rshift(s, 16)
  39. local s_lo2 = bit.band(1812433253 * s_lo, 0xffffffff)
  40. local s_hi2 = bit.band(1812433253 * s_hi, 0xffff)
  41. s = bit.bor(bit.lshift(bit.rshift(s_lo2, 16) + s_hi2, 16),
  42. bit.band(s_lo2, 0xffff))
  43. -- s = bit.band(s + i, 0xffffffff)
  44. local s_lim = -bit.tobit(s)
  45. -- assumes i<2^31
  46. if (s_lim > 0 and s_lim <= i) then
  47. s = i - s_lim
  48. else
  49. s = s + i
  50. end
  51. mt[i+1] = s
  52. -- See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
  53. -- In the previous versions, MSBs of the seed affect
  54. -- only MSBs of the array mt[].
  55. -- 2002/01/09 modified by Makoto Matsumoto
  56. end
  57. mti = NUM
  58. end
  59.  
  60. local mag01 = { 0, MATRIX_A } -- mag01[x] = x * MATRIX_A for x=0,1
  61.  
  62. function writemersennetable(seed)
  63. local N
  64. randomseed(seed)
  65.  
  66. for N = 1, 624 do
  67. memory.writedword(IVRNG_ADDR + (4 * (N - 1)), mt[N])
  68. print(string.format("Wrote %i", N))
  69. N = N + 1
  70. end
  71.  
  72. end
  73.  
  74. last_known_rng_value_1 = 0; -- set initial local rng to 0
  75. last_known_rng_value_2 = 0; -- set initial local rng to 0
  76.  
  77. emu.reset()
  78.  
  79. FramesAdvance(30) -- wait for the first seed update before forcing
  80.  
  81. local rng1 = memory.readdword(RNG_ADDR)
  82. local rng2 = memory.readdword(RNG_ADDR + 4)
  83. print(string.format("First RNG seed: %08x%08x", rng2, rng1))
  84.  
  85. memory.writedword(RNG_ADDR, desired_seed_1)
  86. memory.writedword(RNG_ADDR + 4, desired_seed_2)
  87.  
  88. last_known_rng_value_1 = desired_seed_1
  89. last_known_rng_value_2 = desired_seed_2
  90.  
  91. local mtrng = memory.readdword(IVRNG_ADDR)
  92.  
  93. print(string.format("IVRNG 1: %08x", mtrng))
  94.  
  95. writemersennetable(desired_seed_1)
  96. mtrng = memory.readdword(IVRNG_ADDR)
  97. print(string.format("IVRNG 1 After updating: %08x", mtrng))
  98. print(string.format("RNG seed injected to: %08x%08x", desired_seed_1, desired_seed_2))
  99.  
  100. repeat
  101. local rng1 = memory.readdword(RNG_ADDR)
  102. local rng2 = memory.readdword(RNG_ADDR + 4)
  103.  
  104. if rng1 ~= last_known_rng_value_1 then
  105. if rng2 ~= last_known_rng_value_2 then
  106. print(string.format("New RNG seed: %08x%08x", rng2, rng1))
  107. last_known_rng_value_1 = rng1;
  108. last_known_rng_value_2 = rng2;
  109. end
  110. end
  111.  
  112. emu.frameadvance()
  113. until false
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement