AceZephyr

FF7 World Map RNG

May 17th, 2021
769
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. def _scramble_rng(rng: list):
  2.     a0 = 0
  3.     while a0 < 0x20:
  4.         v0 = rng[a0]
  5.         v1 = rng[a0 + 489]
  6.         v0 = v0 ^ v1
  7.         rng[a0] = v0
  8.         a0 += 1
  9.     a0 = 0x20
  10.     a1 = 0
  11.     while a0 < 0x209:
  12.         v0 = rng[a1]
  13.         v1 = rng[a0]
  14.         v0 = v0 ^ v1
  15.         rng[a0] = v0
  16.         a0 += 1
  17.         a1 += 1
  18.     return rng
  19.  
  20.  
  21. def _seed_rng(igt: int):
  22.     stack = []
  23.     rng = []
  24.  
  25.     a0 = igt
  26.  
  27.     a3 = 0
  28.  
  29.     t0 = 0x5D588B65
  30.     t1 = 0x80000000
  31.     while len(stack) < 17:  # outer loop
  32.         a1 = 31
  33.         while a1 >= 0:  # inner loop
  34.             a1 -= 1
  35.             a0 = ((a0 * t0) + 1) % 2 ** 32
  36.             v1 = a3 >> 1
  37.             v0 = a0 & t1
  38.             a3 = v1 | v0
  39.         stack.append(a3)
  40.     v0 = stack[-1]
  41.     v1 = stack[0]
  42.     a0 = stack[-2]
  43.     v0 = (v0 << 0x17) % 2 ** 32
  44.     v1 = v1 >> 9
  45.     v0 = v0 ^ v1
  46.     v0 = v0 ^ a0
  47.     stack[-1] = v0
  48.     a2 = 0x11
  49.     a1 = 0
  50.     while a2 < 0x209:
  51.         a2 += 1
  52.         v0 = stack[a1]
  53.         v1 = stack[a1 + 1]
  54.         a0 = stack[a1 + 16]
  55.         v0 = (v0 << 0x17) % 2 ** 32
  56.         v1 = v1 >> 9
  57.         v0 = v0 ^ v1
  58.         v0 = v0 ^ a0
  59.         stack.append(v0)
  60.         a1 += 1
  61.     a2 = 0
  62.     v1 = 0  # index
  63.     while a2 < 0x209:
  64.         v0 = stack[v1] % 2 ** 8
  65.         rng.append(v0)
  66.         a2 += 1
  67.         v1 += 1
  68.     rng = _scramble_rng(rng)
  69.     rng = _scramble_rng(rng)
  70.     rng = _scramble_rng(rng)
  71.     return rng
  72.  
  73.  
  74. class WorldMapRNG:
  75.  
  76.     def get(self):
  77.         self.idx += 1
  78.         if self.idx >= 521:
  79.             self.rng = _scramble_rng(self.rng)
  80.             self.idx = 0
  81.         return self.rng[self.idx]
  82.  
  83.  
  84.     def __init__(self, igt: int):
  85.         self.rng = _seed_rng(igt)
  86.         self.idx = 520
RAW Paste Data