Skip to content

Commit 84a0bf8

Browse files
committed
update to latest ksy
update to latest ksy
1 parent 3e9e907 commit 84a0bf8

File tree

1 file changed

+58
-33
lines changed

1 file changed

+58
-33
lines changed

io_ctr_tools/ctr_lev.py

Lines changed: 58 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)