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
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
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
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