""" Prepare a release of Retromancer. Beware of this: an application has made an attempt to load the C runtime library incorrectly """ import os import py2exe import sys import zipfile import distutils.core import GameInfo import Global import NecroQuest import GameMap from xml.dom.minidom import parse, parseString UPXPath = "\"c:\Program Files\UPX\upx.exe\"" def GetText(nodelist): rc = "" for node in nodelist: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rc GlobalExcludeFileNames = {".svn":1} class ReleaseMaker: def __init__(self): self.CompressFlag = 1 self.MAMEDrivers = {} self.NESROMs = {} self.GBAROMs = {} self.DataFiles = {} self.IncludeRomsFlag = 0 #%%% Set true to make the FULL release, yarrrr. def InitMAMEDriverPrerequisites(self): """ Some drivers require other drivers. """ self.DriverPrerequisites = {} self.DriverPrerequisites["pacman"] = ["puckman"] self.DriverPrerequisites["bombrman"] = ["dynablst"] self.DriverPrerequisites["marioo"] = ["mario"] self.DriverPrerequisites["ghoulsu"] = ["ghouls"] self.DriverPrerequisites["blazstar"] = ["neogeo"] def AddFile(self, FilePath): (Dir, FileName) = os.path.split(FilePath) if not self.DataFiles.has_key(Dir): self.DataFiles[Dir] = [] self.DataFiles[Dir].append(FilePath) def AddFileToDir(self, FilePath, Dir): if not self.DataFiles.has_key(Dir): self.DataFiles[Dir] = [] self.DataFiles[Dir].append(FilePath) print "Add %s to %s"%(FilePath, Dir) def PackFile(self, FileName): CompressionCommand ="%s %s"%(UPXPath, FileName) print CompressionCommand os.system(CompressionCommand) def AddDir(self, Directory, RecurseFlag = 1, ExcludeFiles = {}): for FileName in os.listdir(Directory): if ExcludeFiles.has_key(FileName): continue if GlobalExcludeFileNames.has_key(FileName): continue Path = os.path.join(Directory, FileName) if os.path.isdir(Path): if RecurseFlag: self.AddDir(Path) else: self.AddFile(Path) def PrepareMisc(self): self.AddFile("MSVCP71.DLL") #self.AddFile("msvcp90.dll") self.AddFile("mame.ini") #self.AddFile("msvcr90.dll") self.AddFile("PyNESConfig.xml") self.AddFile("PyVBA.cfg") self.AddFile("NES\states\dummy.txt") self.AddFile("NES\screenshots\dummy.txt") self.AddFile("NES\save\dummy.txt") self.AddFile("NES\ips\dummy.txt") self.AddFile("NES\samples\dummy.txt") self.AddFile("english.nlg") self.AddFile(r"PyMAME\nvram\blswhstl.nv") if self.IncludeRomsFlag: self.AddFile("Retromancer.cfg") # Add libraries: #self.AddFile("NES\\delete.me") # Add documentation: self.AddDir("docs") self.AddDir("images") def PrepareQuests(self): self.AddFile("quests\\Games.xml") ExcludeFiles = {"Dot.hiscore":1, "Dot.backup":1, "Dot.tmp":1} self.AddDir("quests\\Dot", 0, ExcludeFiles) def PrepareGames(self): print ">>>PREPARE GAMES:", len(self.MAMEDrivers.keys()), len(self.NESROMs.keys()), len(self.GBAROMs.keys()) for DriverName in self.MAMEDrivers.keys(): # Add zipfiles: Path = os.path.join(r"g:\emu\mame\roms", "%s.zip"%DriverName) if os.path.exists(Path): self.AddFileToDir(Path, "roms") # Add samples: Path = os.path.join(r"g:\emu\mame\samples", "%s.zip"%DriverName) if os.path.exists(Path): self.AddFile(Path, "samples") for (ROMPath, SubDirectory) in self.NESROMs.items(): TargetDir = os.path.join("NES", SubDirectory) if os.path.exists(ROMPath): self.AddFileToDir(ROMPath, TargetDir) else: ROMPath = os.path.splitext(ROMPath)[0] + ".zip" if os.path.exists(ROMPath): self.AddFileToDir(ROMPath, TargetDir) else: print "???", ROMPath for (ROMPath, SubDirectory) in self.GBAROMs.items(): TargetDir = os.path.join("GBA", SubDirectory) if os.path.exists(ROMPath): self.AddFileToDir(ROMPath, TargetDir) else: ROMPath = os.path.splitext(ROMPath)[0] + ".zip" if os.path.exists(ROMPath): self.AddFileToDir(ROMPath, TargetDir) else: print "???", ROMPath def ParseDistributionQuest(self): FileName = os.path.join("Quests", "Games.xml") GameInfo.ParseGameInfoFromFile(FileName) QuestFilePath = os.path.join("Quests", "Dot", "Dot.qst") Metagame = GameMap.MetagameClass() Metagame.Load(QuestFilePath) Global.Metagame = Metagame for Quest in Global.Metagame.Quests: Game = Global.Games.get((Quest.GameType, Quest.DriverName.lower())) print "QUEST:", Quest.DriverName, Game if Quest.GameType == GameInfo.GameType.MAME: self.MAMEDrivers[Quest.DriverName] = 1 elif Quest.GameType == GameInfo.GameType.NES: if Game: Dir = r"g:\emu\nes\nesren" if Game.SubDirectory: Dir = os.path.join(Dir, Game.SubDirectory) Path = os.path.join(Dir, Game.DriverName) self.NESROMs[Path] = Game.SubDirectory elif Quest.GameType == GameInfo.GameType.GBA: if Game: Dir = r"g:\emu\gba\gbaren" if Game.SubDirectory: Dir = os.path.join(Dir, Game.SubDirectory) Path = os.path.join(Dir, Game.DriverName) self.GBAROMs[Path] = Game.SubDirectory def HandleDriverPrerequisites(self): Drivers = self.MAMEDrivers.keys() for Driver in Drivers: PrereqList = self.DriverPrerequisites.get(Driver, []) for Prereq in PrereqList: self.MAMEDrivers[Prereq] = 1 def Main(self): self.InitMAMEDriverPrerequisites() print "ParseDistributionQuest:" self.ParseDistributionQuest() self.HandleDriverPrerequisites() self.PackFile("PyMAME.pyd") self.PrepareMisc() self.PrepareQuests() if self.IncludeRomsFlag: self.PrepareGames() print "Data files:" print self.DataFiles self.BuildDistribution() self.CleanupBadFiles() def BuildDistribution(self): HappyDataFiles = [] for (Dir, FileNames) in self.DataFiles.items(): HappyDataFiles.append((Dir, FileNames)) distutils.core.setup(name="Retromancer", description="Retromancer", version=Global.RetromancerVersion.split()[0], scripts=("Retromancer.py",), console=["Retromancer.py"], data_files = HappyDataFiles, windows = [{"icon_resources": [(1, "Stalfos.ico")], "script": "Retromancer.py",}], ) # Hack: copy the compressed .pyd file into the distribtuion: Command = "copy PyMAME.pyd dist" os.system(Command) def CleanupBadFiles(self): BadFileNames = ["avifil32.dll", "msacm32.dll", "dinput.dll", "dinput8.dll", "BootstrapLog.txt"] for BadFileName in BadFileNames: BadFilePath = os.path.join("dist", BadFileName) if os.path.exists(BadFilePath): os.remove(BadFilePath) if __name__ == "__main__": if len(sys.argv)<2: sys.argv = ["Release.py", "py2exe", ] Bob = ReleaseMaker() Bob.Main()