diff --git a/BaseClasses.py b/BaseClasses.py index 42ccb07d..28673522 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -269,6 +269,9 @@ class MultiWorld(): def get_player_name(self, player: int) -> str: return self.player_name[player] + 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 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 ea6833aa..65894085 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -298,7 +298,7 @@ class ALTTPWorld(World): deathlink=world.death_link[player]) outfilepname = f'_P{player}' - outfilepname += f"_{world.player_name[player].replace(' ', '_')}" \ + 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') diff --git a/worlds/factorio/Mod.py b/worlds/factorio/Mod.py index 446bdab1..6cf8fdaf 100644 --- a/worlds/factorio/Mod.py +++ b/worlds/factorio/Mod.py @@ -91,7 +91,7 @@ def generate_mod(world, output_directory: str): for location in multiworld.get_filled_locations(player): if location.address: locations.append((location.name, location.item.name, location.item.player, location.item.advancement)) - mod_name = f"AP-{multiworld.seed_name}-P{player}-{multiworld.player_name[player]}" + mod_name = f"AP-{multiworld.seed_name}-P{player}-{multiworld.get_file_safe_player_name(player)}" tech_cost_scale = {0: 0.1, 1: 0.25, 2: 0.5, diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py index 4db1e9f1..38ee6275 100644 --- a/worlds/minecraft/__init__.py +++ b/worlds/minecraft/__init__.py @@ -112,7 +112,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_player_name(self.player)}.apmc" + filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(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 727413d2..9898f4b1 100644 --- a/worlds/oot/__init__.py +++ b/worlds/oot/__init__.py @@ -773,7 +773,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_player_name(self.player)}" + outfile_name = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(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 c268dda2..d9b13753 100644 --- a/worlds/sm/__init__.py +++ b/worlds/sm/__init__.py @@ -404,7 +404,7 @@ class SMWorld(World): def generate_output(self, output_directory: str): outfilebase = 'AP_' + self.world.seed_name outfilepname = f'_P{self.player}' - outfilepname += f"_{self.world.player_name[self.player].replace(' ', '_')}" + outfilepname += f"_{self.world.get_file_safe_player_name(self.player).replace(' ', '_')}" outputFilename = os.path.join(output_directory, f'{outfilebase}{outfilepname}.sfc') try: diff --git a/worlds/sm64ex/__init__.py b/worlds/sm64ex/__init__.py index f88c3b4a..5a4f2c7e 100644 --- a/worlds/sm64ex/__init__.py +++ b/worlds/sm64ex/__init__.py @@ -107,6 +107,6 @@ class SM64World(World): } } } - filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_player_name(self.player)}.apsm64ex" + filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(self.player)}.apsm64ex" with open(os.path.join(output_directory, filename), 'w') as f: json.dump(data, f) diff --git a/worlds/smz3/__init__.py b/worlds/smz3/__init__.py index 30b6200b..33a841a2 100644 --- a/worlds/smz3/__init__.py +++ b/worlds/smz3/__init__.py @@ -257,7 +257,7 @@ class SMZ3World(World): outfilebase = 'AP_' + self.world.seed_name outfilepname = f'_P{self.player}' - outfilepname += f"_{self.world.player_name[self.player].replace(' ', '_')}" \ + outfilepname += f"_{self.world.get_file_safe_player_name(self.player).replace(' ', '_')}" \ filename = os.path.join(output_directory, f'{outfilebase}{outfilepname}.sfc') with open(filename, "wb") as binary_file: diff --git a/worlds/soe/__init__.py b/worlds/soe/__init__.py index 29640a3e..c614d9ad 100644 --- a/worlds/soe/__init__.py +++ b/worlds/soe/__init__.py @@ -271,7 +271,8 @@ class SoEWorld(World): if self.world.death_link[self.player].value: switches.append("--death-link") rom_file = get_base_rom_path() - out_base = output_path(output_directory, f'AP_{self.world.seed_name}_P{self.player}_{player_name}') + 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_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 2460beeb..71c8bccc 100644 --- a/worlds/v6/__init__.py +++ b/worlds/v6/__init__.py @@ -79,6 +79,6 @@ class V6World(World): } } } - filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_player_name(self.player)}.apv6" + filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(self.player)}.apv6" with open(os.path.join(output_directory, filename), 'w') as f: json.dump(data, f)