# HG changeset patch # User Thibaut Girka # Date 1319718247 -7200 # Node ID 008f90ebfdc0ea10062aa6fcfa7ee6a45bdda46e # Parent 46793ccfedca917eecc21c07bafab182f742164b Fix replay handling and add support for encrypted replays diff --git a/eclviewer.py b/eclviewer.py --- a/eclviewer.py +++ b/eclviewer.py @@ -35,11 +35,16 @@ def main(path, stage_num, rank, characte character = replay.character if not replay.levels[stage_num-1]: raise Exception + from pytouhou.utils.random import Random + prng = Random(replay.levels[stage_num-1].random_seed) + else: + prng = None resource_loader = Loader() resource_loader.scan_archives(os.path.join(path, name) for name in ('CM.DAT', 'ST.DAT')) - game = EoSDGame(resource_loader, [PlayerState(character=character)], stage_num, rank, 16) + game = EoSDGame(resource_loader, [PlayerState(character=character)], stage_num, rank, 16, + prng=prng) # Load stage data stage = resource_loader.get_stage('stage%d.std' % stage_num) diff --git a/pytouhou/formats/t6rp.py b/pytouhou/formats/t6rp.py --- a/pytouhou/formats/t6rp.py +++ b/pytouhou/formats/t6rp.py @@ -13,6 +13,9 @@ ## from struct import unpack +from io import BytesIO + +from pytouhou.utils.random import Random from pytouhou.utils.helpers import read_string from pytouhou.utils.helpers import get_logger @@ -22,43 +25,70 @@ logger = get_logger(__name__) class Level(object): def __init__(self): + self.score = 0 + self.random_seed = 0 + + self.power = 0 + self.lives = 2 + self.bombs = 3 + self.difficulty = 16 self.keys = [] class T6RP(object): def __init__(self): + self.version = 0x102 + self.character = 0 + self.rank = 0 + self.key = 0 self.levels = [] @classmethod - def read(cls, file): + def read(cls, file, decrypt=True, verify=True): if file.read(4) != b'T6RP': raise Exception - if file.read(2) != b'\x02\x01': - raise Exception replay = cls() - replay.character, replay.rank, checksum, unknown, key, unknown = unpack(' self.game.frame: - self.game.run_iter(self.keys) - return - - self.instruction_pointer += 1 - - if frame == self.game.frame: - self.keys = keys - - self.game.run_iter(self.keys) + self.game.run_iter(keystate) def on_draw(self):