# HG changeset patch # User Thibaut Girka # Date 1327276683 -3600 # Node ID 8fa660da5f0cc7e31785afbb84b455442bfec281 # Parent 2876c267be00d4356f3bacc0b08ea05e86f59419 Automatically search data files using different names. diff --git a/eosd b/eosd --- a/eosd +++ b/eosd @@ -41,6 +41,7 @@ def main(path, stage_num, rank, characte prng = None resource_loader = Loader(path) + resource_loader.scan_archives(data) game = EoSDGame(resource_loader, [PlayerState(character=character)], stage_num, rank, 16, prng=prng) @@ -56,9 +57,14 @@ def main(path, stage_num, rank, characte runner.start() +default_data = ('CM.DAT:th06*_CM.DAT:*CM.DAT:*cm.dat', + 'ST.DAT:th6*ST.DAT:*ST.DAT:*st.dat', + '102h.exe:102*.exe:東方紅魔郷.exe:*.exe') + + parser = argparse.ArgumentParser(description='Libre reimplementation of the Touhou 6 engine.') -parser.add_argument('data', metavar='DAT', default=('CM.DAT', 'ST.DAT'), nargs='*', help='Game’s .DAT data files') +parser.add_argument('data', metavar='DAT', default=default_data, nargs='*', help='Game’s data files') parser.add_argument('-p', '--path', metavar='DIRECTORY', default='.', help='Game directory path.') parser.add_argument('-s', '--stage', metavar='STAGE', type=int, required=True, help='Stage, 1 to 7 (Extra).') parser.add_argument('-r', '--rank', metavar='RANK', type=int, default=0, help='Rank, from 0 (Easy, default) to 3 (Lunatic).') diff --git a/pytouhou/games/eosd.py b/pytouhou/games/eosd.py --- a/pytouhou/games/eosd.py +++ b/pytouhou/games/eosd.py @@ -49,7 +49,7 @@ class EoSDGame(Game): ItemType(etama3, 5, 12), #1up ItemType(etama3, 6, 13)] #Star - characters = resource_loader.get_eosd_characters('102h.exe') + characters = resource_loader.get_eosd_characters() players = [EoSDPlayer(state, self, resource_loader, characters[state.character]) for state in player_states] Game.__init__(self, resource_loader, players, stage, rank, difficulty, diff --git a/pytouhou/resource/loader.py b/pytouhou/resource/loader.py --- a/pytouhou/resource/loader.py +++ b/pytouhou/resource/loader.py @@ -1,4 +1,6 @@ import os +from glob import glob +from itertools import chain from io import BytesIO from pytouhou.formats.pbg3 import PBG3 @@ -42,6 +44,7 @@ class ArchiveDescription(object): class Loader(object): def __init__(self, game_dir=None): + self.exe = None self.game_dir = game_dir self.known_files = {} self.instanced_ecls = {} @@ -51,13 +54,21 @@ class Loader(object): self.instanced_shts = {} - def scan_archives(self, paths): - for path in paths: - if self.game_dir and not os.path.isabs(path): - path = os.path.join(self.game_dir, path) - archive_description = ArchiveDescription.get_from_path(path) - for name in archive_description.file_list: - self.known_files[name] = archive_description + def scan_archives(self, paths_lists): + for paths in paths_lists: + def _expand_paths(): + for path in paths.split(':'): + if self.game_dir and not os.path.isabs(path): + path = os.path.join(self.game_dir, path) + yield glob(path) + paths = list(chain(*_expand_paths())) + path = paths[0] + if os.path.splitext(path)[1] == '.exe': + self.exe = path + else: + archive_description = ArchiveDescription.get_from_path(path) + for name in archive_description.file_list: + self.known_files[name] = archive_description def get_file_data(self, name): @@ -107,8 +118,9 @@ class Loader(object): return self.instanced_shts[name] - def get_eosd_characters(self, path): + def get_eosd_characters(self): #TODO: Move to pytouhou.games.eosd? + path = self.exe if self.game_dir and not os.path.isabs(path): path = os.path.join(self.game_dir, path) with open(path, 'rb') as file: