|
20 | 20 | @dataclass |
21 | 21 | class DatFile(GenieClass): |
22 | 22 | version: str |
23 | | - terrain_restrictions_size: int |
24 | | - terrains_used_1: int |
25 | 23 | float_ptr_terrain_tables: list[int] |
26 | 24 | terrain_pass_graphic_pointers: list[int] |
27 | 25 | terrain_restrictions: list[TerrainRestriction] |
28 | | - player_colours_size: int |
29 | 26 | player_colours: list[PlayerColour] |
30 | | - sounds_size: int |
31 | 27 | sounds: list[Sound] |
32 | | - graphics_size: int |
33 | | - graphic_pointers: list[int] |
34 | 28 | graphics: list[Graphic | None] |
35 | 29 | terrain_block: TerrainBlock |
36 | 30 | random_maps: RandomMaps |
37 | | - effects_size: int |
38 | 31 | effects: list[Effect] |
39 | | - unit_headers_size: int |
40 | 32 | unit_headers: list[UnitHeaders] |
41 | | - civs_size: int |
42 | 33 | civs: list[Civ] |
43 | | - techs_size: int |
44 | 34 | techs: list[Tech] |
45 | 35 | time_slice: int |
46 | 36 | unit_kill_rate: int |
@@ -98,63 +88,63 @@ def from_bytes(cls, content: ByteHandler) -> 'DatFile': |
98 | 88 | razing_kill_total = content.read_int_32() |
99 | 89 | tech_tree = content.read_class(TechTree) |
100 | 90 | return cls( |
101 | | - version, |
102 | | - terrain_restrictions_size, |
103 | | - terrains_used_1, |
104 | | - float_ptr_terrain_tables, |
105 | | - terrain_pass_graphic_pointers, |
106 | | - terrain_restrictions, |
107 | | - player_colours_size, |
108 | | - player_colours, |
109 | | - sounds_size, |
110 | | - sounds, |
111 | | - graphics_size, |
112 | | - graphic_pointers, |
113 | | - graphics, |
114 | | - terrain_block, |
115 | | - random_maps, |
116 | | - effects_size, |
117 | | - effects, |
118 | | - unit_headers_size, |
119 | | - unit_headers, |
120 | | - civs_size, |
121 | | - civs, |
122 | | - techs_size, |
123 | | - techs, |
124 | | - time_slice, |
125 | | - unit_kill_rate, |
126 | | - unit_kill_total, |
127 | | - unit_hit_point_rate, |
128 | | - unit_hit_point_total, |
129 | | - razing_kill_rate, |
130 | | - razing_kill_total, |
131 | | - tech_tree, |
| 91 | + version=version, |
| 92 | + float_ptr_terrain_tables=float_ptr_terrain_tables, |
| 93 | + terrain_pass_graphic_pointers=terrain_pass_graphic_pointers, |
| 94 | + terrain_restrictions=terrain_restrictions, |
| 95 | + player_colours=player_colours, |
| 96 | + sounds=sounds, |
| 97 | + graphics=graphics, |
| 98 | + terrain_block=terrain_block, |
| 99 | + random_maps=random_maps, |
| 100 | + effects=effects, |
| 101 | + unit_headers=unit_headers, |
| 102 | + civs=civs, |
| 103 | + techs=techs, |
| 104 | + time_slice=time_slice, |
| 105 | + unit_kill_rate=unit_kill_rate, |
| 106 | + unit_kill_total=unit_kill_total, |
| 107 | + unit_hit_point_rate=unit_hit_point_rate, |
| 108 | + unit_hit_point_total=unit_hit_point_total, |
| 109 | + razing_kill_rate=razing_kill_rate, |
| 110 | + razing_kill_total=razing_kill_total, |
| 111 | + tech_tree=tech_tree, |
132 | 112 | ) |
133 | 113 |
|
| 114 | + @property |
| 115 | + def graphic_pointers(self) -> list[int]: |
| 116 | + return [(0 if g is None else 1) for g in self.graphics] |
| 117 | + |
134 | 118 | def to_bytes(self) -> bytes: |
| 119 | + terrain_restrictions_size = len(self.terrain_restrictions) |
| 120 | + assert len(self.float_ptr_terrain_tables) == len(self.terrain_pass_graphic_pointers) == terrain_restrictions_size |
| 121 | + terrains_used = 0 |
| 122 | + if self.terrain_restrictions: |
| 123 | + terrains_used = len(self.terrain_restrictions[0].passable_buildable_dmg_multiplier) |
| 124 | + |
135 | 125 | return b''.join([ |
136 | 126 | self.write_string(8, self.version), |
137 | | - self.write_int_16(self.terrain_restrictions_size), |
138 | | - self.write_int_16(self.terrains_used_1), |
| 127 | + self.write_int_16(terrain_restrictions_size), |
| 128 | + self.write_int_16(terrains_used), |
139 | 129 | self.write_int_32_array(self.float_ptr_terrain_tables), |
140 | 130 | self.write_int_32_array(self.terrain_pass_graphic_pointers), |
141 | 131 | self.write_class_array(self.terrain_restrictions), |
142 | | - self.write_int_16(self.player_colours_size), |
| 132 | + self.write_int_16(len(self.player_colours)), |
143 | 133 | self.write_class_array(self.player_colours), |
144 | | - self.write_int_16(self.sounds_size), |
| 134 | + self.write_int_16(len(self.sounds)), |
145 | 135 | self.write_class_array(self.sounds), |
146 | | - self.write_int_16(self.graphics_size), |
| 136 | + self.write_int_16(len(self.graphics)), |
147 | 137 | self.write_int_32_array(self.graphic_pointers), |
148 | | - self.write_class_array_with_pointers(self.graphic_pointers, self.graphics), |
| 138 | + self.write_class_array(self.graphics), |
149 | 139 | self.write_class(self.terrain_block), |
150 | 140 | self.write_class(self.random_maps), |
151 | | - self.write_int_32(self.effects_size), |
| 141 | + self.write_int_32(len(self.effects)), |
152 | 142 | self.write_class_array(self.effects), |
153 | | - self.write_int_32(self.unit_headers_size), |
| 143 | + self.write_int_32(len(self.unit_headers)), |
154 | 144 | self.write_class_array(self.unit_headers), |
155 | | - self.write_int_16(self.civs_size), |
| 145 | + self.write_int_16(len(self.civs)), |
156 | 146 | self.write_class_array(self.civs), |
157 | | - self.write_int_16(self.techs_size), |
| 147 | + self.write_int_16(len(self.techs)), |
158 | 148 | self.write_class_array(self.techs), |
159 | 149 | self.write_int_32(self.time_slice), |
160 | 150 | self.write_int_32(self.unit_kill_rate), |
|
0 commit comments