Mercurial > touhou
changeset 12:776453783743
Add PRNG reverse-engineered from EoSD's 102h.exe.
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Fri, 05 Aug 2011 10:19:14 +0200 |
parents | 548662d70860 |
children | 58bc264aba38 |
files | pytouhou/utils/random.py |
diffstat | 1 files changed, 36 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/pytouhou/utils/random.py @@ -0,0 +1,36 @@ +""" +This file provides a pseudo-random number generator identical to the one used in +Touhou 6: The Embodiment of Scarlet Devil. +It is the only truly reverse-engineered piece of code of this project, +as it is needed in order to retain compatibility with replay files produced by +the offical game code. + +It has been reverse engineered from 102h.exe@0x41e780.""" + + +#TODO: maybe some post-processing is missing + + +from time import time + +class Random(object): + def __init__(self, seed=None): + if seed is None: + seed = int(time.time() % 65536) + self.counter = 0 + + + def set_seed(self, seed): + self.seed = seed + self.counter = 0 + + + def cycle(self): + # Named this way because the actual return value may be different. + # Further reverse engineering might be needed. + x = ((seed ^ 0x9630) - 0x6553) & 0xffff + self.seed = (((x & 0x0c000) >> 0xe) + x*4) & 0xffff + self.counter += 1 + self.counter &= 0xffff + return self.seed +