diff pytouhou/formats/t6rp.py @ 187:46793ccfedca

Implement replays.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Wed, 26 Oct 2011 17:54:03 -0700
parents
children 008f90ebfdc0
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/pytouhou/formats/t6rp.py
@@ -0,0 +1,70 @@
+# -*- encoding: utf-8 -*-
+##
+## Copyright (C) 2011 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published
+## by the Free Software Foundation; version 3 only.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+
+from struct import unpack
+from pytouhou.utils.helpers import read_string
+
+from pytouhou.utils.helpers import get_logger
+
+logger = get_logger(__name__)
+
+
+class Level(object):
+    def __init__(self):
+        self.keys = []
+
+
+class T6RP(object):
+    def __init__(self):
+        self.levels = []
+
+
+    @classmethod
+    def read(cls, file):
+        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('<BBHIBB', file.read(10))
+        replay.date = read_string(file, 9, 'ascii')
+        replay.name = read_string(file, 9, 'ascii').rstrip()
+        unknown, replay.score, unknown, replay.slowdown, unknown = unpack('<HIIfI', file.read(18))
+
+        stages_offsets = unpack('<7I', file.read(28))
+
+        replay.levels = []
+
+        for offset in stages_offsets:
+            replay.levels.append(None)
+
+            if offset == 0:
+                continue
+
+            level = Level()
+            replay.levels[-1] = level
+
+            file.seek(offset)
+            level.score, level.random_seed, unknown, level.power, level.lives, level.bombs, level.difficulty, unknown = unpack('<IHHBbbBI', file.read(16))
+
+            while True:
+                time, keys, unknown = unpack('<IHH', file.read(8))
+
+                if time == 9999999:
+                    break
+
+                level.keys.append((time, keys))
+