def extract(self, dg, shallow=False, verbose=False): # First get the common Node header super(cViewerRefNodeRecursive, self).extract(dg, verbose) # Som nodes self.base = cViewerRefNodeBase(dg) self.renderablenode = cRenderableNode(dg) self.boundednode = cBoundedNode(dg) self.transformnode = cTransformNode(dg) # Got name so terminate early if shallow if shallow: return # Unknown _ = dg.get_word() # Use types count = dg.get_dword() self.use_types = [] for _ in range(count): self.use_types.append(ParseName(dg, verbose)) # Unknown _ = dg.get_dword() # 0 _ = dg.get_word() # 257 self.name = ParseName(dg, verbose) _ = dg.get_dwords(16)
def extract(self, dg, version=8, verbose=False): self.version = version self.lodtype = dg.get_dword() if self.version == 6 or self.version == 7: self.chain = Chain(dg) else: # Version 8? self.enabled = ParseBool(dg) self.name = ParseName(dg) self.target = None
def extract(self, dg, shallow=False, verbose=False): # First get the common Node header super(LGHTData, self).extract(dg, verbose) # A load of mostly pointless nodes self.standard_light_base = cStandardLightBase(dg) self.sgres1 = cSGResource(dg) # Got name so terminate early if shallow if shallow: return self.light = cLightT(dg) self.sgres2 = cSGResource(dg) self.refer = cReferentNode(dg) self.objgraphnode = cObjectGraphNode(dg) # Name self.light_name = ParseName(dg) # Parameters data = dg.get_floats(5) self.far_attenuation = data[0] self.near_attenuation = data[1] self.red = data[2] self.green = data[3] self.blue = data[4]
def extract(self, dg, shallow=False, verbose=False): # First get the common Node header super(cLightRefNode, self).extract(dg, verbose) # Some nodes self.renderablenode = cRenderableNode(dg) self.boundednode = cBoundedNode(dg) self.transformnode = cTransformNode(dg) # Got name so terminate early if shallow if shallow: return # Unknown _ = dg.get_word() # Use types count = dg.get_dword() self.use_types = [] for _ in range(count): self.use_types.append(ParseName(dg, verbose)) self.light_file_link_index = dg.get_dword() # Unknown _ = dg.get_dword() _ = dg.get_bytes(5)
class LOD(Sims2Reader): def __init__(self, dg=None, version=8, verbose=False): if dg: self.extract(dg, version, verbose) def extract(self, dg, version=8, verbose=False): self.version = version self.lodtype = dg.get_dword() if self.version == 6 or self.version == 7: self.chain = Chain(dg) else: # Version 8? self.enabled = ParseBool(dg) self.name = ParseName(dg) self.target = None def resolve(self, packman, dbpf, verbose=False): if self.version != 6 and self.version != 7: targ_descriptor = dbpf.findname(PackedFile.GMND, self.name) if targ_descriptor: if verbose: print("Found target descriptor: %s => %s" % (self.name, str(DecodeDescriptor(targ_descriptor)))) else: print( "Failed to find target descriptor for %s in local name map, checking global" % self.name) targ_descriptor = packman.findname(PackedFile.GMND, self.name) if targ_descriptor: if verbose: print("Found target descriptor: %s => %s" % (self.name, str( DecodeDescriptor(targ_descriptor)))) else: raise ValueError( "Failed to find target descriptor for %s in name maps" % self.name) self.target = packman.GetRCOL(targ_descriptor) if not self.target: resource = sims2crc32(self.name.lower().encode('ascii')) resource_bytes = struct.pack('I', resource) descriptor = b''.join((targ_descriptor, resource_bytes)) self.target = packman.GetRCOL(descriptor) self.target.ResolveAllLinks(packman, verbose) def __str__(self): res = "Type = %d, " % self.lodtype if self.version == 6 or self.version == 7: res += "Chain: %s" % str(self.chain) else: if self.enabled: res += "enabled, " res += "name = %s" % self.name return res def dump_target(self, indent=0): if self.version != 6 and self.version != 7: print() self.target.dump(indent)
def extract(self, dg, verbose=False): self.groupname = ParseName(dg) self.matdefname = ParseName(dg) # Unknowns if verbose: print("Checking unknowns") tmp = dg.get_dword() if tmp != 0: raise ValueError("Expected unknown parameter value 0, got %d" % tmp) tmp = dg.get_byte() if tmp != 0: raise ValueError("Expected unknown parameter value 0, got %d" % tmp) tmp = dg.get_dword() if tmp != 0: raise ValueError("Expected unknown parameter value 0, got %d" % tmp)
def extract(self, dg, verbose=False): # Read the common Node stuff first super(cObjectGraphNode, self).extract(dg, verbose) # Now a section of Chains which are called "extensions" self.extensions = [] count = dg.get_dword() if verbose: print("Extension count: %d" % count) for _ in range(0, count): self.extensions.append(Chain(dg, True)) # Optional resource name if self.version == 4: self.resourcename = ParseName(dg) if verbose: print("Resource name: %s" % DumpName(self.resourcename))
def extract(self, dg, verbose=False): if verbose: print("Offset of start of block: %d (%s)" % (dg.tell(), hex(dg.tell()))) # First get name of node self.node_name = ParseName(dg, verbose) if verbose: print("Name of Node: %s" % self.node_name) # Now ID and version data = dg.get_dwords(2) #self.type = data[0] self.type = self.get_nodetype(data[0]) self.version = data[1] super(Node, self).extract(dg, verbose)
def extract(self, dg, verbose=False): if verbose: print("Offset of start of block: %d (%s)" % (dg.tell(), hex(dg.tell()))) # Integer type based on GMDC version if self.version == 4: face_func = dg.get_words subset_func = dg.get_word else: face_func = dg.get_dwords subset_func = dg.get_dword # Basics self.primitive_type = dg.get_dword() self.link_index = dg.get_dword() self.name = ParseName(dg) if verbose: print("Group name: %s" % DumpName(self.name)) # Faces face_count = dg.get_dword() if verbose: print("Face count = %d" % (face_count // 3)) if (face_count % 3) != 0: raise ValueError( "Face count (%d) is not a multiple of 3, current offset: %d (%s)" % (face_count, dg.tell(), hex(dg.tell()))) self.faces = [] for _ in range(face_count // 3): self.faces.append( face_func(3) ) # N.B. As get_dwords returns a list, and we're using append rather than extend, this creates a list of lists # Opacity self.opacity = dg.get_dword() # Subsets if self.version == 2 or self.version == 4: # i.e. not 1 subset_count = dg.get_dword() if verbose: print("Subset count = %d" % subset_count) self.subsets = [] for _ in range(subset_count): self.subsets.append(subset_func())
def extract(self, dg, verbose=False): super(TagExtension, self).extract(dg, verbose) self.tag = ParseName(dg, verbose)
def extract(self, dg, verbose=False): self.name = ParseName(dg, verbose)
def extract(self, dg, shallow=False, verbose=False): super(cTagExtension, self).extract(dg, shallow, verbose) self.node = Node(dg, verbose) self.tag = ParseName(dg, verbose)
def extract(self, dg, shallow=False, verbose=False): # First get the common RCOLDataBlock header super(cShapeRefNode, self).extract(dg) # Then a bunch of nodes self.renderablenode = cRenderableNode(dg) self.boundednode = cBoundedNode(dg) self.transformnode = cTransformNode(dg) # Unknowns if verbose: print("Checking unknowns 1") tmp = dg.get_word() if tmp != 1: raise ValueError("Expected unknown parameter value 1, got %d" % tmp) tmp = dg.get_dword() if tmp != 1: raise ValueError("Expected unknown parameter value 1, got %d" % tmp) # Kind self.kind = ParseName(dg, verbose) # Got name so terminate early if shallow if shallow: return # More unknowns if verbose: print("Checking unknowns 2") tmp = dg.get_dword() if tmp != 0: raise ValueError("Expected unknown parameter value 0, got %d" % tmp) tmp = dg.get_byte() if tmp != 1: raise ValueError("Expected unknown parameter value 1, got %d" % tmp) # Shape links if verbose: print("Extracting Shape Links") count = dg.get_dword() if verbose: print("Shape link count = %d" % count) self.shapelinks = [] for _ in range(count): self.shapelinks.append(Chain(dg)) # More unknowns if verbose: print("Checking unknowns 3") tmp = dg.get_dword() if tmp != 0 and tmp != 16: raise ValueError( "Expected unknown parameter value 0 or 16, got %d" % tmp) # Blends? if verbose: print("Extracting blend info") self.blendnames = {} count = dg.get_dword() if verbose: print("Blend count = %d" % count) blendvalues = list(dg.get_dwords(count)) if self.version == 21: for index in range(count): self.blendnames[blendvalues[index]] = ParseName(dg, verbose) else: self.blendvalues = blendvalues # Unknown section if verbose: print("Extracting unknown section") count = dg.get_dword() if verbose: print("Unknown count = %d" % count) for index in range(count): tmp = dg.get_byte() if tmp != 0: raise ValueError( "Expected unknown parameter value 0 at position %d, got %d" % (index, tmp)) # A final unknown DWORD tmp = dg.get_dword() if tmp != 0xffffffff: raise ValueError( "Expected unknown parameter value 0xffffffff, got %s" % hex(tmp))
def extract(self, dg, shallow=False, verbose=False): # No name so terminate early if shallow #if shallow: # return if verbose: print("Start offset of cIndexedMeshBuilder: %s" % hex(dg.tell())) # First get the common RCOLDataBlock header super(cIndexedMeshBuilder, self).extract(dg) # Nodes self.geo = cGeometryBuilder(dg, verbose) # Unknown count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dwords(3) count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dwords(3) count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dwords(2) if verbose: print("Start offset of cIndexedMeshBuilder zeroes: %s" % hex(dg.tell())) # 20 zeroes for _ in range(5): _ = dg.get_dword() count = dg.get_dword() _ = dg.get_dword() # 0x41 # 20 zeroes for _ in range(5): _ = dg.get_dword() count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dwords(2) count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dwords(2) count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dwords(2) _ = dg.get_dwords(512) count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = ParseName(dg, verbose) _ = ParseName(dg, verbose) inner = dg.get_dword() for _ in range(inner): _ = dg.get_dwords(4) _ = dg.get_dword() _ = dg.get_dword() # 1 _ = dg.get_dword() # 3 count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dword() count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dword() count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dword() count = dg.get_dword() if verbose: print("Unknown count: %d" % count) for _ in range(count): _ = dg.get_dword() _ = dg.get_dword() # 1 _ = dg.get_dword() # 0 _ = dg.get_dword() # 0 _ = dg.get_dword() # 0 _ = dg.get_dword() # Count _ = dg.get_dword() # 1 self.name = ParseName(dg, verbose)
def extract(self, dg): super(cSGResource, self).extract(dg) self.filename = ParseName(dg)