Пример #1
0
    def read_header(self):
        #"""Read the header of a MPQ archive."""
        ## Read the header of a WC3 MPQ archive
        
        magic = self.file.read(4)
        self.file.seek(0)
        
        #print(magic)
        
        if magic == "HM3W":
            datReader = DataReader(self.file)
            header = {}
            ## should be HM3W
            header["wc3map_magic"] = datReader.charArray(4)
            
            ## unknown
            datReader.int()
            header["wc3map_mapName"] = datReader.string()
            print(header["wc3map_mapName"])
            """
            0x0001: 1=hide minimap in preview screens
            0x0002: 1=modify ally priorities
            0x0004: 1=melee map
            0x0008: 1=playable map size was large and has never been reduced to medium
            0x0010: 1=masked area are partially visible
            0x0020: 1=fixed player setting for custom forces
            0x0040: 1=use custom forces
            0x0080: 1=use custom techtree
            0x0100: 1=use custom abilities
            0x0200: 1=use custom upgrades
            0x0400: 1=map properties menu opened at least once since map creation
            0x0800: 1=show water waves on cliff shores
            0x1000: 1=show water waves on rolling shores
            """
            header["wc3map_mapFlags"] = datReader.flags()
            header["wc3map_maxPlayers"] = datReader.int()
            self.file.seek(512)
        else:
            ## If the magic isn't HM3W, we will skip the first 512 bytes of the 
            ## file anyway 
            self.file.seek(512)
            
        print(self.file.tell())
        magic = self.file.read(4)
        self.file.seek(512)
        print( len(magic))
        print(magic, hex(ord(magic[3])) )
        
        if magic == b'MPQ\x1a' or self.forceV1 == True:
            i = 1
            
            while magic != "MPQ\x1a":
                i += 1
                self.file.seek(512*i)
                magic = self.file.read(4)
            
            self.file.seek(512*i)
            header.update(self.__read_mpq_header__())
            header['offset'] = 512*i
        elif magic == b'MPQ\x1b':
            user_data_header = self.__read_mpq_user_data_header__()
            header.update(self.__read_mpq_header__(user_data_header['mpq_header_offset']))
            header['offset'] = user_data_header['mpq_header_offset']
            header['user_data_header'] = user_data_header
            
        else:
            raise ValueError("Invalid file header.")

        return header
Пример #2
0
class WC3Info:
    def __init__(self, filename):
        self.read = DataReader(filename)
    
    def ReadFile(self):
        self.info = {}
        self.ReadInfo()
        
    def ReadInfo(self):
        info = self.info
        
        info["version"] = self.read.int()
        print info["version"]
        
        info["saveCount"] = self.read.int()
        info["editVersion"] = self.read.int()
        info["name"] = self.read.string()
        info["author"] = self.read.string()
        info["description"] = self.read.string()
        info["recommendedPlayers"] = self.read.string()
        
        info["cameraBounds"] = [
                self.read.float(), #1
                self.read.float(), #2
                self.read.float(), #3
                self.read.float(), #4
                self.read.float(), #5
                self.read.float(), #6
                self.read.float(), #7
                self.read.float()  #8
            ]
        info["cameraComplements"] = [
                self.read.int(),
                self.read.int(),
                self.read.int(),
                self.read.int()
            ]
        
        info["playWidth"] = self.read.int()
        info["playHeight"] = self.read.int()
        info["flags"] = self.read.flags()
        info["groundType"] = self.read.char()
        info["backgroundImageID"] = self.read.int() #-1 == none or custom,
        info["customLoadingScreen"] = self.read.string() #empty if none or not custom,
        info["loadingText"] = self.read.string()
        info["loadingTitle"] = self.read.string()
        info["loadingSubtitle"] = self.read.string()
        info["gameDataSet"] = self.read.int() #index in the preset list, 0=standard,
        info["prologuePath"] = self.read.string()
        info["prologueText"] = self.read.string()
        info["prologueTitle"] = self.read.string()
        info["prologueSubtitle"] = self.read.string()
        
        
        info["useTerrainFog"] = self.read.int() #0 == not used, >0 = index of terrain fog style dropdown
        info["fogInfo"] = {
                "startZ" : self.read.float(),
                "endZ" : self.read.float(),
                "density" : self.read.float(),
                "red" : self.read.byte(),
                "green" : self.read.byte(),
                "blue" : self.read.byte(),
                "alpha" : self.read.byte()
            }
        
        info["weatherID"] = self.read.int() #0=none, else is the id in TerrainArt\Weather.slk
        info["soundEnvironment"] = self.read.string()
        info["tilesetLightID"] = self.read.char()
        info["waterInfo"] = {
                "red" : self.read.byte(),
                "green" : self.read.byte(),
                "blue" : self.read.byte(),
                "alpha" : self.read.byte()
            }
        
        info["playerData"] = self.ReadArray(self.readPlayerData)
        info["forceData"] = self.ReadArray(self.readForceData)
        info["upgradeData"] = self.ReadArray(self.readUpgradeData)
        info["techData"] = self.ReadArray(self.readTechData)
        info["unitData"] = self.ReadArray(self.readUnitData)
        
        print info["playerData"]
        print info["forceData"]
        print info["upgradeData"]
        print info["techData"]
        print info["unitData"]
        
        info["itemData"] = self.ReadArray(self.readItemData)
    
    def ReadArray(self, func):
        print "Starting to read an array!"
        
        arrayInfo = {}
        arrayInfo["data"] = []
        
        try:
            arrayInfo["count"] = self.read.int()
        
        except struct.error:
            arrayInfo["count"] = 0
            print "Array does not exist. Function: {0}".format(func.__name__)
            
            return arrayInfo
        
        else:
            print "{0} elements in this array. Using {1} for reading.".format(arrayInfo["count"], func.__name__)
            
            for i in xrange(arrayInfo["count"]):
                data = func()
                arrayInfo["data"].append(data)
                
            return arrayInfo
    
    def readPlayerData(self):
        playerData = {}
        playerData["playerNumber"] = self.read.int()
        playerData["playerType"] = self.read.int()
        playerData["race"] = self.read.int()
        playerData["startPos"] = self.read.int()
        playerData["name"] = self.read.string()
        playerData["startX"] = self.read.float()
        playerData["startY"] = self.read.float()
        playerData["allyLowFlags"] = self.read.int()
        playerData["allyHighFlags"] = self.read.int()
        
        #print("###PLAYER DATA###")
        #print("PlayerType: "+str(playerData["playerType"]))
        #print("Race: "+str(playerData["race"]))
        #print("startPos "+str(playerData["startPos"]))
        
        return playerData
    
    def readForceData(self):
        forceData = {}
        forceData["flags"] = self.read.flags()
        forceData["mask"] = self.read.int()
        forceData["name"] = self.read.string()
        
        print(forceData)
        return forceData
    
    def readUpgradeData(self):
        upgradeData = {}
        upgradeData["flags"] = self.read.flags()
        upgradeData["id"] = self.read.charArray(4)
        upgradeData["level"] = self.read.int()
        upgradeData["Availability"] = self.read.int()
        
        return upgradeData
        
    def readTechData(self):
        techData = {}
        techData["flags"] = self.read.flags()
        techData["id"] = self.read.charArray(4)
        
        return techData
        
    def readUnitData(self):
        groupCount = self.read.int()
        
        for i in xrange(groupCount):
            groupInfo = {}
            groupInfo["number"] = self.read.int()
            groupInfo["name"] = self.read.string()
            groupInfo["posCount"] = self.read.int() #columns
            groupInfo["tableTypes"] = []
            groupInfo["entities"] = []
            
            for j in xrange(groupInfo["posCount"]):
                tableType = self.read.int()
                groupInfo["tableTypes"].append(tableType)
                
            groupInfo["unitCount"] = self.read.int() #rows
            
            for j in xrange(groupInfo["unitCount"]):
                entity = {}
                entity["chance"] = self.read.int()
                entity["ids"] = [self.read.charArray(4) for k in xrange(groupInfo["posCount"])]
                
                groupInfo["entities"].append(entity)
        
        return groupInfo
    
    def readItemData(self):
        itemInfo = {}
        itemInfo["tableCount"] = self.read.int()
        itemInfo["table"] = []
        
        for i in xrange(itemInfo["tableCount"]):
            tableInfo = {}
            
            tableInfo["tableNumber"] = self.read.int()
            tableInfo["tableName"] = self.read.string()
            tableInfo["setCount"] = self.read.int()
            tableInfo["set"] = []
            
            for j in xrange(tableInfo["setCount"]):
                setInfo = {}
                setInfo["itemCount"] = self.read.int()
                setInfo["items"] = []
                
                for k in xrange(setInfo["itemCount"]):
                    itemData = {}
                    itemData["percentualChance"] = self.read.int()
                    itemData["itemID"] = self.read.charArray(4)
                    
                    setInfo["items"].append(itemData)
                    
                tableInfo["set"].append(setInfo)
                
            itemInfo["table"].append(tableInfo)
            
        return itemInfo
Пример #3
0
def read_W3I(filehandle, triggerStrings = None):    
#    def ReadFile(self):
#        self.info = {}
#        self.ReadInfo()
    read = DataReader(filehandle)
    if triggerStrings != None:
        read.load_triggerDB(triggerStrings)
        
    info = {}
    
    info["version"] = read.int()
    #print info["version"]
    
    info["saveCount"] = read.int()
    info["editVersion"] = read.int()
    info["name"] = read.string()
    info["author"] = read.string()
    info["description"] = read.string()
    info["recommendedPlayers"] = read.string()
    
    info["cameraBounds"] = [
            read.float(), #1
            read.float(), #2
            read.float(), #3
            read.float(), #4
            read.float(), #5
            read.float(), #6
            read.float(), #7
            read.float()  #8
        ]
    info["cameraComplements"] = [
            read.int(),
            read.int(),
            read.int(),
            read.int()
        ]
    
    info["playWidth"] = read.int()
    info["playHeight"] = read.int()
    info["flags"] = read.flags()
    info["groundType"] = read.char()
    info["backgroundImageID"] = read.int() #-1 == none or custom,
    info["customLoadingScreen"] = read.string() #empty if none or not custom,
    info["loadingText"] = read.string()
    info["loadingTitle"] = read.string()
    info["loadingSubtitle"] = read.string()
    info["gameDataSet"] = read.int() #index in the preset list, 0=standard,
    info["prologuePath"] = read.string()
    info["prologueText"] = read.string()
    info["prologueTitle"] = read.string()
    info["prologueSubtitle"] = read.string()
    
    
    info["useTerrainFog"] = read.int() #0 == not used, >0 = index of terrain fog style dropdown
    info["fogInfo"] = {
            "startZ" : read.float(),
            "endZ" : read.float(),
            "density" : read.float(),
            "red" : read.byte(),
            "green" : read.byte(),
            "blue" : read.byte(),
            "alpha" : read.byte()
        }
    
    info["weatherID"] = read.int() #0=none; else = the id is in TerrainArt\Weather.slk
    info["soundEnvironment"] = read.string()
    info["tilesetLightID"] = read.char()
    info["waterInfo"] = {
            "red" : read.byte(),
            "green" : read.byte(),
            "blue" : read.byte(),
            "alpha" : read.byte()
        }
    
    info["playerData"] = __ReadArray__(read, __readPlayerData__ )
    
    try:
        info["forceData"] = __ReadArray__(read, __readForceData__ )
    except struct.error:
        info["forceData"] = None
    
    try:
        info["upgradeData"] = __ReadArray__(read, __readUpgradeData__ )
    except struct.error:
        info["upgradeData"] = None
        
    try:
        info["techData"] = __ReadArray__(read, __readTechData__ )
    except struct.error:
        info["techData"] = None
        
    try:
        info["unitData"] = __ReadArray__(read, __readUnitData__ )
    except struct.error:
        info["unitData"] = None
        
    #print info["playerData"]
    #print info["forceData"]
    #print info["upgradeData"]
    #print info["techData"]
    #print info["unitData"]
    
    try:
        info["itemData"] = __ReadArray__(read, __readItemData__ )
    except struct.error:
        info["itemData"] = None
    
    return info
Пример #4
0
def read_W3I(filehandle, triggerStrings=None):
    #    def ReadFile(self):
    #        self.info = {}
    #        self.ReadInfo()
    read = DataReader(filehandle)
    if triggerStrings != None:
        read.load_triggerDB(triggerStrings)

    info = {}

    info["version"] = read.int()
    #print info["version"]

    info["saveCount"] = read.int()
    info["editVersion"] = read.int()
    info["name"] = read.string()
    info["author"] = read.string()
    info["description"] = read.string()
    info["recommendedPlayers"] = read.string()

    info["cameraBounds"] = [
        read.float(),  #1
        read.float(),  #2
        read.float(),  #3
        read.float(),  #4
        read.float(),  #5
        read.float(),  #6
        read.float(),  #7
        read.float()  #8
    ]
    info["cameraComplements"] = [
        read.int(), read.int(), read.int(),
        read.int()
    ]

    info["playWidth"] = read.int()
    info["playHeight"] = read.int()
    info["flags"] = read.flags()
    info["groundType"] = read.char()
    info["backgroundImageID"] = read.int()  #-1 == none or custom,
    info["customLoadingScreen"] = read.string()  #empty if none or not custom,
    info["loadingText"] = read.string()
    info["loadingTitle"] = read.string()
    info["loadingSubtitle"] = read.string()
    info["gameDataSet"] = read.int()  #index in the preset list, 0=standard,
    info["prologuePath"] = read.string()
    info["prologueText"] = read.string()
    info["prologueTitle"] = read.string()
    info["prologueSubtitle"] = read.string()

    info["useTerrainFog"] = read.int(
    )  #0 == not used, >0 = index of terrain fog style dropdown
    info["fogInfo"] = {
        "startZ": read.float(),
        "endZ": read.float(),
        "density": read.float(),
        "red": read.byte(),
        "green": read.byte(),
        "blue": read.byte(),
        "alpha": read.byte()
    }

    info["weatherID"] = read.int(
    )  #0=none; else = the id is in TerrainArt\Weather.slk
    info["soundEnvironment"] = read.string()
    info["tilesetLightID"] = read.char()
    info["waterInfo"] = {
        "red": read.byte(),
        "green": read.byte(),
        "blue": read.byte(),
        "alpha": read.byte()
    }

    info["playerData"] = __ReadArray__(read, __readPlayerData__)

    try:
        info["forceData"] = __ReadArray__(read, __readForceData__)
    except struct.error:
        info["forceData"] = None

    try:
        info["upgradeData"] = __ReadArray__(read, __readUpgradeData__)
    except struct.error:
        info["upgradeData"] = None

    try:
        info["techData"] = __ReadArray__(read, __readTechData__)
    except struct.error:
        info["techData"] = None

    try:
        info["unitData"] = __ReadArray__(read, __readUnitData__)
    except struct.error:
        info["unitData"] = None

    #print info["playerData"]
    #print info["forceData"]
    #print info["upgradeData"]
    #print info["techData"]
    #print info["unitData"]

    try:
        info["itemData"] = __ReadArray__(read, __readItemData__)
    except struct.error:
        info["itemData"] = None

    return info