@@ -141,20 +141,31 @@ def player_raster_from_xml(xml: ET.Element, back: bool = False) -> PlayerRaster:
141141 )
142142
143143
144- def player_xml_to_bytes (xml : ET .Element , asset_stack : Tuple [Path , ...]) -> List [bytes ]:
144+ def player_xml_to_bytes (sprite_xml : ET .Element , asset_stack : Tuple [Path , ...]) -> List [bytes ]:
145145 out_bytes = b""
146146 back_out_bytes = b""
147147
148- max_components = int (xml .attrib [MAX_COMPONENTS_XML ])
149- num_variations = int (xml .attrib [PALETTE_GROUPS_XML ])
150- has_back = xml .attrib [HAS_BACK_XML ] == "true"
148+ max_components = int (sprite_xml .attrib [MAX_COMPONENTS_XML ])
149+ num_variations = int (sprite_xml .attrib [PALETTE_GROUPS_XML ])
150+ has_back = sprite_xml .attrib [HAS_BACK_XML ] == "true"
151+
152+ anim_elems : List [ET .Element ] = sprite_xml .findall ("./AnimationList/Animation" )
153+ img_elems : List [ET .Element ] = sprite_xml .findall ("./RasterList/Raster" )
154+ pal_elems : List [ET .Element ] = sprite_xml .findall ("./PaletteList/Palette" )
155+
156+ palette_map = {palette_xml .attrib ["name" ]: idx for idx , palette_xml in enumerate (pal_elems )}
157+
158+ image_map = {image_xml .attrib ["name" ]: idx for idx , image_xml in enumerate (img_elems )}
151159
152160 # Animations
153161 animations : List [List [AnimComponent ]] = []
154- for anim_xml in xml [2 ]:
162+ for anim_xml in anim_elems :
163+ # get a mapping of component names -> list indices
164+ comp_map = {comp_xml .attrib ["name" ]: idx for idx , comp_xml in enumerate (anim_xml )}
165+ # read each component
155166 comps : List [AnimComponent ] = []
156167 for comp_xml in anim_xml :
157- comp : AnimComponent = AnimComponent .from_xml (comp_xml )
168+ comp : AnimComponent = AnimComponent .from_xml (comp_xml , comp_map , image_map , palette_map )
158169 comps .append (comp )
159170 animations .append (comps )
160171
@@ -216,7 +227,7 @@ def player_xml_to_bytes(xml: ET.Element, asset_stack: Tuple[Path, ...]) -> List[
216227 palette_list_start_back = len (back_out_bytes ) + 0x10
217228 palette_bytes : bytes = b""
218229 palette_bytes_back : bytes = b""
219- for palette_xml in xml [ 0 ] :
230+ for palette_xml in pal_elems :
220231 source = palette_xml .attrib ["src" ]
221232 front_only = bool (palette_xml .get ("front_only" , False ))
222233 if source not in PALETTE_CACHE :
@@ -252,15 +263,15 @@ def player_xml_to_bytes(xml: ET.Element, asset_stack: Tuple[Path, ...]) -> List[
252263 raster_bytes : bytes = b""
253264 raster_bytes_back : bytes = b""
254265 raster_offset = 0
255- for raster_xml in xml [ 1 ] :
266+ for raster_xml in img_elems :
256267 r = player_raster_from_xml (raster_xml , back = False )
257268 raster_bytes += struct .pack (">IBBBB" , raster_offset , r .width , r .height , r .palette_idx , 0xFF )
258269
259270 raster_offset += r .width * r .height // 2
260271
261272 if has_back :
262273 raster_offset = 0
263- for raster_xml in xml [ 1 ] :
274+ for raster_xml in img_elems :
264275 is_back = False
265276
266277 r = player_raster_from_xml (raster_xml , back = is_back )
@@ -290,7 +301,7 @@ def player_xml_to_bytes(xml: ET.Element, asset_stack: Tuple[Path, ...]) -> List[
290301 # Raster file offsets
291302 raster_offsets_bytes = b""
292303 raster_offsets_bytes_back = b""
293- for i in range (len (xml [ 1 ] )):
304+ for i in range (len (img_elems )):
294305 raster_offsets_bytes += int .to_bytes (raster_list_start + i * 8 , 4 , "big" )
295306 raster_offsets_bytes_back += int .to_bytes (raster_list_start_back + i * 8 , 4 , "big" )
296307 raster_offsets_bytes += LIST_END_BYTES
@@ -304,7 +315,7 @@ def player_xml_to_bytes(xml: ET.Element, asset_stack: Tuple[Path, ...]) -> List[
304315 palette_list_offset_back = len (back_out_bytes ) + 0x10
305316 palette_offsets_bytes = b""
306317 palette_offsets_bytes_back = b""
307- for i , palette_xml in enumerate (xml [ 0 ] ):
318+ for i , palette_xml in enumerate (pal_elems ):
308319 palette_offsets_bytes += int .to_bytes (palette_list_start + i * 0x20 , 4 , "big" )
309320 front_only = bool (palette_xml .attrib .get ("front_only" , False ))
310321 if not front_only :
@@ -358,17 +369,21 @@ def write_player_sprite_header(
358369 sprite_xml = PLAYER_XML_CACHE [sprite_name ]
359370 has_back = sprite_xml .attrib [HAS_BACK_XML ] == "true"
360371
372+ anim_elems : List [ET .Element ] = sprite_xml .findall ("./AnimationList/Animation" )
373+ img_elems : List [ET .Element ] = sprite_xml .findall ("./RasterList/Raster" )
374+ pal_elems : List [ET .Element ] = sprite_xml .findall ("./PaletteList/Palette" )
375+
361376 player_sprites [f"SPR_{ sprite_name } " ] = sprite_id
362377 player_rasters [sprite_name ] = {}
363378 player_palettes [sprite_name ] = {}
364379 player_anims [sprite_name ] = {}
365380
366- for palette_xml in sprite_xml [ 0 ] :
381+ for palette_xml in pal_elems :
367382 palette_id = int (palette_xml .attrib ["id" ], 0x10 )
368383 palette_name = palette_xml .attrib ["name" ]
369384 player_palettes [sprite_name ][f"SPR_PAL_{ sprite_name } _{ palette_name } " ] = palette_id
370385
371- for anim_id , anim_xml in enumerate (sprite_xml [ 2 ] ):
386+ for anim_id , anim_xml in enumerate (anim_elems ):
372387 anim_name = anim_xml .attrib ["name" ]
373388 if palette_id > 0 :
374389 anim_name = f"{ palette_name } _{ anim_name } "
@@ -377,7 +392,7 @@ def write_player_sprite_header(
377392 )
378393
379394 max_size = 0
380- for raster_xml in sprite_xml [ 1 ] :
395+ for raster_xml in img_elems :
381396 raster_id = int (raster_xml .attrib ["id" ], 0x10 )
382397 raster_name = raster_xml .attrib ["name" ]
383398 player_rasters [sprite_name ][f"SPR_IMG_{ sprite_name } _{ raster_name } " ] = raster_id
@@ -393,7 +408,7 @@ def write_player_sprite_header(
393408 player_sprites [f"SPR_{ sprite_name } _Back" ] = sprite_id
394409
395410 max_size = 0
396- for raster_xml in sprite_xml [ 1 ] :
411+ for raster_xml in img_elems :
397412 if "back" in raster_xml .attrib :
398413 raster = RASTER_CACHE [raster_xml .attrib ["back" ][:- 4 ]]
399414 if max_size < raster .size :
@@ -513,8 +528,10 @@ def build_player_rasters(sprite_order: List[str], raster_order: List[str]) -> by
513528 sheet_rtes : List [RasterTableEntry ] = []
514529 sheet_rtes_back : List [RasterTableEntry ] = []
515530
531+ img_elems : List [ET .Element ] = sprite_xml .findall ("./RasterList/Raster" )
532+
516533 has_back = False
517- for raster_xml in sprite_xml [ 1 ] :
534+ for raster_xml in img_elems :
518535 if "back" in raster_xml .attrib :
519536 has_back = True
520537
0 commit comments