From fdd7ffb0895a36689d3cd5fa092668a1915ad360 Mon Sep 17 00:00:00 2001 From: Doug Hoskisson Date: Sun, 2 Oct 2022 07:53:18 -0700 Subject: [PATCH] Core: move output file name logic into core (#1066) * move output file name logic into core I see the same logic with small variations in each different world implementation. It seems to me, it would be better in the core to keep it consistent. * missed a few * remove review comment * + smw * double quote strings Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * revert change to DS3 output file name Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- BaseClasses.py | 7 +++++++ worlds/alttp/__init__.py | 6 +----- worlds/dkc3/__init__.py | 6 +----- worlds/minecraft/__init__.py | 2 +- worlds/oot/__init__.py | 2 +- worlds/sm/__init__.py | 6 ++---- worlds/sm64ex/__init__.py | 2 +- worlds/smw/__init__.py | 6 +----- worlds/smz3/__init__.py | 6 ++---- worlds/soe/__init__.py | 3 +-- worlds/v6/__init__.py | 2 +- 11 files changed, 19 insertions(+), 29 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index c5e7640b..d32749f5 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -300,6 +300,13 @@ class MultiWorld(): def get_file_safe_player_name(self, player: int) -> str: return ''.join(c for c in self.get_player_name(player) if c not in '<>:"/\\|?*') + def get_out_file_name_base(self, player: int) -> str: + """ the base name (without file extension) for each player's output file for a seed """ + return f"AP_{self.seed_name}_P{player}" \ + + (f"_{self.get_file_safe_player_name(player).replace(' ', '_')}" + if (self.player_name[player] != f"Player{player}") + else '') + def initialize_regions(self, regions=None): for region in regions if regions else self.regions: region.world = self diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index 88d2c2f2..169d21ab 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -400,11 +400,7 @@ class ALTTPWorld(World): deathlink=world.death_link[player], allowcollect=world.allow_collect[player]) - outfilepname = f'_P{player}' - outfilepname += f"_{world.get_file_safe_player_name(player).replace(' ', '_')}" \ - if world.player_name[player] != 'Player%d' % player else '' - - rompath = os.path.join(output_directory, f'AP_{world.seed_name}{outfilepname}.sfc') + rompath = os.path.join(output_directory, f"{self.world.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rompath) patch = LttPDeltaPatch(os.path.splitext(rompath)[0]+LttPDeltaPatch.patch_file_ending, player=player, player_name=world.player_name[player], patched_path=rompath) diff --git a/worlds/dkc3/__init__.py b/worlds/dkc3/__init__.py index 5c575b85..1389f83e 100644 --- a/worlds/dkc3/__init__.py +++ b/worlds/dkc3/__init__.py @@ -146,11 +146,7 @@ class DKC3World(World): self.active_level_list.append(LocationName.rocket_rush_region) - outfilepname = f'_P{player}' - outfilepname += f"_{world.player_name[player].replace(' ', '_')}" \ - if world.player_name[player] != 'Player%d' % player else '' - - rompath = os.path.join(output_directory, f'AP_{world.seed_name}{outfilepname}.sfc') + rompath = os.path.join(output_directory, f"{self.world.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rompath) self.rom_name = rom.name diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py index 6e7addb2..fd5752bd 100644 --- a/worlds/minecraft/__init__.py +++ b/worlds/minecraft/__init__.py @@ -150,7 +150,7 @@ class MinecraftWorld(World): def generate_output(self, output_directory: str): data = self._get_mc_data() - filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(self.player)}.apmc" + filename = f"{self.world.get_out_file_name_base(self.player)}.apmc" with open(os.path.join(output_directory, filename), 'wb') as f: f.write(b64encode(bytes(json.dumps(data), 'utf-8'))) diff --git a/worlds/oot/__init__.py b/worlds/oot/__init__.py index b65882c8..2536c3d4 100644 --- a/worlds/oot/__init__.py +++ b/worlds/oot/__init__.py @@ -819,7 +819,7 @@ class OOTWorld(World): # Seed hint RNG, used for ganon text lines also self.hint_rng = self.world.slot_seeds[self.player] - outfile_name = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(self.player)}" + outfile_name = self.world.get_out_file_name_base(self.player) rom = Rom(file=get_options()['oot_options']['rom_file']) if self.hints != 'none': buildWorldGossipHints(self) diff --git a/worlds/sm/__init__.py b/worlds/sm/__init__.py index 0bf12ca7..d9013032 100644 --- a/worlds/sm/__init__.py +++ b/worlds/sm/__init__.py @@ -505,10 +505,8 @@ class SMWorld(World): romPatcher.writeRandoSettings(self.variaRando.randoExec.randoSettings, itemLocs) def generate_output(self, output_directory: str): - outfilebase = 'AP_' + self.world.seed_name - outfilepname = f'_P{self.player}' - outfilepname += f"_{self.world.get_file_safe_player_name(self.player).replace(' ', '_')}" - outputFilename = os.path.join(output_directory, f'{outfilebase}{outfilepname}.sfc') + outfilebase = self.world.get_out_file_name_base(self.player) + outputFilename = os.path.join(output_directory, f"{outfilebase}.sfc") try: self.variaRando.PatchRom(outputFilename, self.APPrePatchRom, self.APPostPatchRom) diff --git a/worlds/sm64ex/__init__.py b/worlds/sm64ex/__init__.py index 88b2261a..8cf2f743 100644 --- a/worlds/sm64ex/__init__.py +++ b/worlds/sm64ex/__init__.py @@ -173,7 +173,7 @@ class SM64World(World): } } } - filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(self.player)}.apsm64ex" + filename = f"{self.world.get_out_file_name_base(self.player)}.apsm64ex" with open(os.path.join(output_directory, filename), 'w') as f: json.dump(data, f) diff --git a/worlds/smw/__init__.py b/worlds/smw/__init__.py index c31d4af7..77931b7c 100644 --- a/worlds/smw/__init__.py +++ b/worlds/smw/__init__.py @@ -153,11 +153,7 @@ class SMWWorld(World): rom = LocalRom(get_base_rom_path()) patch_rom(self.world, rom, self.player, self.active_level_dict) - outfilepname = f'_P{player}' - outfilepname += f"_{world.player_name[player].replace(' ', '_')}" \ - if world.player_name[player] != 'Player%d' % player else '' - - rompath = os.path.join(output_directory, f'AP_{world.seed_name}{outfilepname}.sfc') + rompath = os.path.join(output_directory, f"{self.world.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rompath) self.rom_name = rom.name diff --git a/worlds/smz3/__init__.py b/worlds/smz3/__init__.py index b796c2a4..753fb556 100644 --- a/worlds/smz3/__init__.py +++ b/worlds/smz3/__init__.py @@ -426,11 +426,9 @@ class SMZ3World(World): base_combined_rom[addr + offset] = byte offset += 1 - outfilebase = 'AP_' + self.world.seed_name - outfilepname = f'_P{self.player}' - outfilepname += f"_{self.world.get_file_safe_player_name(self.player).replace(' ', '_')}" \ + outfilebase = self.world.get_out_file_name_base(self.player) - filename = os.path.join(output_directory, f'{outfilebase}{outfilepname}.sfc') + filename = os.path.join(output_directory, f"{outfilebase}.sfc") with open(filename, "wb") as binary_file: binary_file.write(base_combined_rom) patch = SMZ3DeltaPatch(os.path.splitext(filename)[0]+SMZ3DeltaPatch.patch_file_ending, player=self.player, diff --git a/worlds/soe/__init__.py b/worlds/soe/__init__.py index a0dc41c3..4885fd31 100644 --- a/worlds/soe/__init__.py +++ b/worlds/soe/__init__.py @@ -333,8 +333,7 @@ class SoEWorld(World): switches.extend(('--available-fragments', str(self.available_fragments), '--required-fragments', str(self.required_fragments))) rom_file = get_base_rom_path() - out_base = output_path(output_directory, f'AP_{self.world.seed_name}_P{self.player}_' - f'{self.world.get_file_safe_player_name(self.player)}') + out_base = output_path(output_directory, self.world.get_out_file_name_base(self.player)) out_file = out_base + '.sfc' placement_file = out_base + '.txt' patch_file = out_base + '.apsoe' diff --git a/worlds/v6/__init__.py b/worlds/v6/__init__.py index 38690e5a..9c5fdbc8 100644 --- a/worlds/v6/__init__.py +++ b/worlds/v6/__init__.py @@ -91,6 +91,6 @@ class V6World(World): } } } - filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(self.player)}.apv6" + filename = f"{self.world.get_out_file_name_base(self.player)}.apv6" with open(os.path.join(output_directory, filename), 'w') as f: json.dump(data, f)