@@ -157,7 +157,7 @@ def _read(self):
157157
158158
159159 class SceneHeader (KaitaiStruct ):
160- """scene header, contains pointer to other data within the file and
160+ """scene header, contains pointers to other data within the file and
161161 variouis global data like starting grid, background colors, etc.
162162 """
163163 def __init__ (self , _io , _parent = None , _root = None ):
@@ -225,6 +225,8 @@ def _read(self):
225225
226226
227227 class NavFrame (KaitaiStruct ):
228+ """describes a single navigation point for bots
229+ """
228230 def __init__ (self , _io , _parent = None , _root = None ):
229231 self ._io = _io
230232 self ._parent = _parent
@@ -266,14 +268,16 @@ def _read(self):
266268
267269
268270 class AiFrameHeader (KaitaiStruct ):
271+ """ai path header data
272+ """
269273 def __init__ (self , _io , _parent = None , _root = None ):
270274 self ._io = _io
271275 self ._parent = _parent
272276 self ._root = _root if _root else self
273277 self ._read ()
274278
275279 def _read (self ):
276- self .unk1 = self ._io .read_u2le ()
280+ self .version = self ._io .read_u2le ()
277281 self .num_frames = self ._io .read_u2le ()
278282 self .skip = self ._io .read_bytes (72 )
279283
@@ -443,6 +447,8 @@ def _read(self):
443447
444448
445449 class IconGroup (KaitaiStruct ):
450+ """some icons are grouped together (like all wheel sprites)
451+ """
446452 def __init__ (self , _io , _parent = None , _root = None ):
447453 self ._io = _io
448454 self ._parent = _parent
@@ -542,6 +548,8 @@ def _read(self):
542548
543549
544550 class Vcolor (KaitaiStruct ):
551+ """controls vertex animation, both color and position (roo's tubes best example).
552+ """
545553 def __init__ (self , _io , _parent = None , _root = None ):
546554 self ._io = _io
547555 self ._parent = _parent
@@ -597,49 +605,57 @@ def icons(self):
597605 if hasattr (self , '_m_icons' ):
598606 return self ._m_icons if hasattr (self , '_m_icons' ) else None
599607
600- _pos = self ._io .pos ()
601- self ._io .seek (self .header .ptr_icons )
602- self ._m_icons = self ._root .IconPack (self ._io , self , self ._root )
603- self ._io .seek (_pos )
608+ if self .header .ptr_icons != 0 :
609+ _pos = self ._io .pos ()
610+ self ._io .seek (self .header .ptr_icons )
611+ self ._m_icons = self ._root .IconPack (self ._io , self , self ._root )
612+ self ._io .seek (_pos )
613+
604614 return self ._m_icons if hasattr (self , '_m_icons' ) else None
605615
606616 @property
607617 def water_data (self ):
608618 if hasattr (self , '_m_water_data' ):
609619 return self ._m_water_data if hasattr (self , '_m_water_data' ) else None
610620
611- _pos = self ._io .pos ()
612- self ._io .seek (self .header .ptr_water )
613- self ._m_water_data = [None ] * (self .header .cnt_water )
614- for i in range (self .header .cnt_water ):
615- self ._m_water_data [i ] = self ._root .WaterPacket (self ._io , self , self ._root )
621+ if self .header .ptr_water != 0 :
622+ _pos = self ._io .pos ()
623+ self ._io .seek (self .header .ptr_water )
624+ self ._m_water_data = [None ] * (self .header .cnt_water )
625+ for i in range (self .header .cnt_water ):
626+ self ._m_water_data [i ] = self ._root .WaterPacket (self ._io , self , self ._root )
627+
628+ self ._io .seek (_pos )
616629
617- self ._io .seek (_pos )
618630 return self ._m_water_data if hasattr (self , '_m_water_data' ) else None
619631
620632 @property
621633 def vis_data_array (self ):
622634 if hasattr (self , '_m_vis_data_array' ):
623635 return self ._m_vis_data_array if hasattr (self , '_m_vis_data_array' ) else None
624636
625- _pos = self ._io .pos ()
626- self ._io .seek (self .mesh_info_header .ptr_vis_data )
627- self ._m_vis_data_array = [None ] * (self .mesh_info_header .num_vis_data )
628- for i in range (self .mesh_info_header .num_vis_data ):
629- self ._m_vis_data_array [i ] = self ._root .VisData (self ._io , self , self ._root )
637+ if self .mesh_info_header .ptr_vis_data != 0 :
638+ _pos = self ._io .pos ()
639+ self ._io .seek (self .mesh_info_header .ptr_vis_data )
640+ self ._m_vis_data_array = [None ] * (self .mesh_info_header .num_vis_data )
641+ for i in range (self .mesh_info_header .num_vis_data ):
642+ self ._m_vis_data_array [i ] = self ._root .VisData (self ._io , self , self ._root )
643+
644+ self ._io .seek (_pos )
630645
631- self ._io .seek (_pos )
632646 return self ._m_vis_data_array if hasattr (self , '_m_vis_data_array' ) else None
633647
634648 @property
635649 def ai_nav (self ):
636650 if hasattr (self , '_m_ai_nav' ):
637651 return self ._m_ai_nav if hasattr (self , '_m_ai_nav' ) else None
638652
639- _pos = self ._io .pos ()
640- self ._io .seek (self .header .ptr_ai_nav )
641- self ._m_ai_nav = self ._root .AiPaths (self ._io , self , self ._root )
642- self ._io .seek (_pos )
653+ if self .header .ptr_ai_nav != 0 :
654+ _pos = self ._io .pos ()
655+ self ._io .seek (self .header .ptr_ai_nav )
656+ self ._m_ai_nav = self ._root .AiPaths (self ._io , self , self ._root )
657+ self ._io .seek (_pos )
658+
643659 return self ._m_ai_nav if hasattr (self , '_m_ai_nav' ) else None
644660
645661 @property
@@ -660,24 +676,28 @@ def vcolors(self):
660676 if hasattr (self , '_m_vcolors' ):
661677 return self ._m_vcolors if hasattr (self , '_m_vcolors' ) else None
662678
663- _pos = self ._io .pos ()
664- self ._io .seek (self .header .ptr_vcanim )
665- self ._m_vcolors = [None ] * (self .header .num_vcanim )
666- for i in range (self .header .num_vcanim ):
667- self ._m_vcolors [i ] = self ._root .Vcolor (self ._io , self , self ._root )
679+ if self .header .ptr_vcanim != 0 :
680+ _pos = self ._io .pos ()
681+ self ._io .seek (self .header .ptr_vcanim )
682+ self ._m_vcolors = [None ] * (self .header .num_vcanim )
683+ for i in range (self .header .num_vcanim ):
684+ self ._m_vcolors [i ] = self ._root .Vcolor (self ._io , self , self ._root )
685+
686+ self ._io .seek (_pos )
668687
669- self ._io .seek (_pos )
670688 return self ._m_vcolors if hasattr (self , '_m_vcolors' ) else None
671689
672690 @property
673691 def trial (self ):
674692 if hasattr (self , '_m_trial' ):
675693 return self ._m_trial if hasattr (self , '_m_trial' ) else None
676694
677- _pos = self ._io .pos ()
678- self ._io .seek (self .header .ptr_trial_data )
679- self ._m_trial = self ._root .TrialData (self ._io , self , self ._root )
680- self ._io .seek (_pos )
695+ if self .header .ptr_trial_data != 0 :
696+ _pos = self ._io .pos ()
697+ self ._io .seek (self .header .ptr_trial_data )
698+ self ._m_trial = self ._root .TrialData (self ._io , self , self ._root )
699+ self ._io .seek (_pos )
700+
681701 return self ._m_trial if hasattr (self , '_m_trial' ) else None
682702
683703
@@ -697,6 +717,8 @@ def _read(self):
697717
698718
699719 class SkyboxVertex (KaitaiStruct ):
720+ """shorter vertex defintion without morph color
721+ """
700722 def __init__ (self , _io , _parent = None , _root = None ):
701723 self ._io = _io
702724 self ._parent = _parent
@@ -709,6 +731,9 @@ def _read(self):
709731
710732
711733 class AddTex (KaitaiStruct ):
734+ """points to 4 structs, one of them assumed to store mosaic texture def
735+ each pointer might include flag hidden in lsb
736+ """
712737 def __init__ (self , _io , _parent = None , _root = None ):
713738 self ._io = _io
714739 self ._parent = _parent
@@ -852,7 +877,7 @@ def _read(self):
852877
853878
854879 class MeshInfo (KaitaiStruct ):
855- """meash header struct, contains pointer to vertex array, quadblock array
880+ """mesh header struct, contains pointer to vertex array, quadblock array
856881 and visdata array
857882 """
858883 def __init__ (self , _io , _parent = None , _root = None ):
0 commit comments