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)
Esempio n. 7
0
    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))
Esempio n. 8
0
    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())
Esempio n. 10
0
 def extract(self, dg, verbose=False):
     super(TagExtension, self).extract(dg, verbose)
     self.tag = ParseName(dg, verbose)
Esempio n. 11
0
 def extract(self, dg, verbose=False):
     self.name = ParseName(dg, verbose)
Esempio n. 12
0
    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)
Esempio n. 15
0
 def extract(self, dg):
     super(cSGResource, self).extract(dg)
     self.filename = ParseName(dg)