Mercurial > touhou
annotate pytouhou/formats/std.py @ 316:f0be7ea62330
Fix a bug with ECL instruction 96, and fix overall ECL handling.
The issue with instruction 96 was about death callbacks,
being executed on the caller of instruction 96 instead of the dying enemies.
This was introduced by changeset 5930b33a0370.
Additionnaly, ECL processes are now an attribute of the Enemy,
and death/timeout conditions are checked right after the ECL frame,
even if the ECL script has already ended, just like in the original game.
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Thu, 29 Mar 2012 21:18:35 +0200 |
parents | 88361534c77e |
children | 61adb5453e46 |
rev | line source |
---|---|
52
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
1 # -*- encoding: utf-8 -*- |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
2 ## |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
3 ## Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com> |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
4 ## |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
5 ## This program is free software; you can redistribute it and/or modify |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
6 ## it under the terms of the GNU General Public License as published |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
7 ## by the Free Software Foundation; version 3 only. |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
8 ## |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
9 ## This program is distributed in the hope that it will be useful, |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
12 ## GNU General Public License for more details. |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
13 ## |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
14 |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
15 """Stage Definition (STD) files handling. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
16 |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
17 This module provides classes for handling the Stage Definition file format. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
18 The STD file format is a format used in Touhou 6: EoSD to describe non-gameplay |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
19 aspects of a stage: its name, its music, 3D models composing its background, |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
20 and various scripted events such as camera movement. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
21 """ |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
22 |
52
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
20
diff
changeset
|
23 |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
24 from struct import pack, unpack, calcsize |
58 | 25 from pytouhou.utils.helpers import read_string, get_logger |
0 | 26 |
58 | 27 logger = get_logger(__name__) |
0 | 28 |
29 | |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
30 class Model(object): |
111
340fcda8e64a
Fix a few, minor things
Thibaut Girka <thib@sitedethib.com>
parents:
110
diff
changeset
|
31 def __init__(self, unknown=0, bounding_box=None, quads=None): |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
32 self.unknown = 0 |
111
340fcda8e64a
Fix a few, minor things
Thibaut Girka <thib@sitedethib.com>
parents:
110
diff
changeset
|
33 self.bounding_box = bounding_box or (0., 0., 0., |
340fcda8e64a
Fix a few, minor things
Thibaut Girka <thib@sitedethib.com>
parents:
110
diff
changeset
|
34 0., 0., 0.) |
340fcda8e64a
Fix a few, minor things
Thibaut Girka <thib@sitedethib.com>
parents:
110
diff
changeset
|
35 self.quads = quads or [] |
0 | 36 |
37 | |
38 | |
39 class Stage(object): | |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
40 """Handle Touhou 6 Stage Definition files. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
41 |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
42 Stage Definition files are structured files describing non-gameplay aspects |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
43 aspects of a stage. They are split in a header an 3 additional sections. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
44 |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
45 The header contains the name of the stage, the background musics (BGM) used, |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
46 as well as the number of quads and objects composing the background. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
47 The first section describes the models composing the background, whereas |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
48 the second section dictates how they are used. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
49 The last section describes the changes to the camera, fog, and other things. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
50 |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
51 Instance variables: |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
52 name -- name of the stage |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
53 bgms -- list of (name, path) describing the different background musics used |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
54 models -- list of Model objects |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
55 object_instances -- list of instances of the aforementioned models |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
56 script -- stage script (camera, fog, etc.) |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
57 """ |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
58 |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
59 _instructions = {0: ('fff', 'set_viewpos'), |
111
340fcda8e64a
Fix a few, minor things
Thibaut Girka <thib@sitedethib.com>
parents:
110
diff
changeset
|
60 1: ('BBBxff', 'set_fog'), |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
61 2: ('fff', 'set_viewpos2'), |
118 | 62 3: ('Ixxxxxxxx', 'start_interpolating_viewpos2'), |
63 4: ('Ixxxxxxxx', 'start_interpolating_fog')} | |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
64 |
97 | 65 def __init__(self): |
0 | 66 self.name = '' |
111
340fcda8e64a
Fix a few, minor things
Thibaut Girka <thib@sitedethib.com>
parents:
110
diff
changeset
|
67 self.bgms = (('', ''), ('', ''), ('', ''), ('', '')) |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
68 self.models = [] |
0 | 69 self.object_instances = [] |
70 self.script = [] | |
71 | |
72 | |
73 @classmethod | |
97 | 74 def read(cls, file): |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
75 """Read a Stage Definition file. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
76 |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
77 Raise an exception if the file is invalid. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
78 Return a STD instance otherwise. |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
79 """ |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
80 |
97 | 81 stage = Stage() |
0 | 82 |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
83 nb_models, nb_faces = unpack('<HH', file.read(4)) |
0 | 84 object_instances_offset, script_offset = unpack('<II', file.read(8)) |
85 if file.read(4) != b'\x00\x00\x00\x00': | |
86 raise Exception #TODO | |
87 | |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
88 stage.name = read_string(file, 128, 'shift_jis') |
0 | 89 |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
90 bgm_a = read_string(file, 128, 'shift_jis') |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
91 bgm_b = read_string(file, 128, 'shift_jis') |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
92 bgm_c = read_string(file, 128, 'shift_jis') |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
93 bgm_d = read_string(file, 128, 'shift_jis') |
0 | 94 |
95 bgm_a_path = read_string(file, 128, 'ascii') | |
96 bgm_b_path = read_string(file, 128, 'ascii') | |
97 bgm_c_path = read_string(file, 128, 'ascii') | |
98 bgm_d_path = read_string(file, 128, 'ascii') | |
99 | |
100 stage.bgms = [(bgm_a, bgm_a_path), (bgm_b, bgm_b_path), (bgm_c, bgm_c_path), (bgm_d, bgm_d_path)] #TODO: handle ' ' | |
101 | |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
102 # Read model definitions |
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
103 offsets = unpack('<%s' % ('I' * nb_models), file.read(4 * nb_models)) |
0 | 104 for offset in offsets: |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
105 model = Model() |
111
340fcda8e64a
Fix a few, minor things
Thibaut Girka <thib@sitedethib.com>
parents:
110
diff
changeset
|
106 file.seek(offset) |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
107 |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
108 # Read model header |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
109 id_, unknown, x, y, z, width, height, depth = unpack('<HHffffff', file.read(28)) |
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
110 model.unknown = unknown |
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
111 model.bounding_box = x, y, z, width, height, depth #TODO: check |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
112 |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
113 # Read model quads |
0 | 114 while True: |
115 unknown, size = unpack('<HH', file.read(4)) | |
116 if unknown == 0xffff: | |
117 break | |
118 if size != 0x1c: | |
119 raise Exception #TODO | |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
120 script_index, x, y, z, width, height = unpack('<Hxxfffff', file.read(24)) |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
121 model.quads.append((script_index, x, y, z, width, height)) |
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
122 stage.models.append(model) |
0 | 123 |
124 | |
125 # Read object usages | |
126 file.seek(object_instances_offset) | |
127 while True: | |
128 obj_id, unknown, x, y, z = unpack('<HHfff', file.read(16)) | |
129 if (obj_id, unknown) == (0xffff, 0xffff): | |
130 break | |
131 if unknown != 256: | |
132 raise Exception #TODO | |
94
ca571697ec83
Various minor optimisations and refactoring
Thibaut Girka <thib@sitedethib.com>
parents:
58
diff
changeset
|
133 stage.object_instances.append((obj_id, x, y, z)) |
0 | 134 |
135 | |
136 # Read other funny things (script) | |
137 file.seek(script_offset) | |
138 while True: | |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
139 frame, opcode, size = unpack('<IHH', file.read(8)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
140 if (frame, opcode, size) == (0xffffffff, 0xffff, 0xffff): |
0 | 141 break |
142 if size != 0x0c: | |
143 raise Exception #TODO | |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
144 data = file.read(size) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
145 if opcode in cls._instructions: |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
146 args = unpack('<%s' % cls._instructions[opcode][0], data) |
13 | 147 else: |
148 args = (data,) | |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
149 logger.warn('unknown opcode %d', opcode) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
150 stage.script.append((frame, opcode, args)) |
0 | 151 |
152 return stage | |
153 | |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
154 |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
155 def write(self, file): |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
156 """Write to a Stage Definition file.""" |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
157 model_offsets = [] |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
158 second_section_offset = 0 |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
159 third_section_offset = 0 |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
160 |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
161 nb_faces = sum(len(model.quads) for model in self.models) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
162 |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
163 # Write header (offsets, number of quads, name and background musics) |
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
164 file.write(pack('<HH', len(self.models), nb_faces)) |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
165 file.write(pack('<II', 0, 0)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
166 file.write(pack('<I', 0)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
167 file.write(pack('<128s', self.name.encode('shift_jis'))) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
168 for bgm_name, bgm_path in self.bgms: |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
169 file.write(pack('<128s', bgm_name.encode('shift_jis'))) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
170 for bgm_name, bgm_path in self.bgms: |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
171 file.write(pack('<128s', bgm_path.encode('ascii'))) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
172 file.write(b'\x00\x00\x00\x00' * len(self.models)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
173 |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
174 # Write first section (models) |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
175 for i, model in enumerate(self.models): |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
176 model_offsets.append(file.tell()) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
177 file.write(pack('<HHffffff', i, model.unknown, *model.bounding_box)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
178 for quad in model.quads: |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
179 file.write(pack('<HH', 0x00, 0x1c)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
180 file.write(pack('<Hxxfffff', *quad)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
181 file.write(pack('<HH', 0xffff, 4)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
182 |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
183 # Write second section (object instances) |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
184 second_section_offset = file.tell() |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
185 for obj_id, x, y, z in self.object_instances: |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
186 file.write(pack('<HHfff', obj_id, 256, x, y, z)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
187 file.write(b'\xff' * 16) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
188 |
204
88361534c77e
Add some documentation (argh, so much left to document!)
Thibaut Girka <thib@sitedethib.com>
parents:
118
diff
changeset
|
189 # Write third section (script) |
110
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
190 third_section_offset = file.tell() |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
191 for frame, opcode, args in self.script: |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
192 size = calcsize(self._instructions[opcode][0]) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
193 file.write(pack('<IHH%s' % self._instructions[opcode][0], frame, opcode, size, *args)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
194 file.write(b'\xff' * 20) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
195 |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
196 # Fix offsets |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
197 file.seek(4) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
198 file.write(pack('<II', second_section_offset, third_section_offset)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
199 file.seek(16+128+128*2*4) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
200 file.write(pack('<%sI' % len(self.models), *model_offsets)) |
3ac41b966fed
Add writing support to pytouhou.formats.std!
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
201 |