diff --git a/args/arguments.py b/args/arguments.py index cc372d13..9bcce51a 100644 --- a/args/arguments.py +++ b/args/arguments.py @@ -67,6 +67,15 @@ def __init__(self): if self.debug: self.spoiler_log = True + # Update the global args module attributes to match this Arguments instance, + # which is helpful if a wrapper script instantiates Arguments dynamically + # instead of importing the args module directly. + import sys + if "args" in sys.modules: + module = sys.modules["args"] + for name, value in self.__dict__.items(): + setattr(module, name, value) + def _process_min_max(self, arg_name): values = getattr(self, arg_name) if values: diff --git a/args/graphics.py b/args/graphics.py index 7f3f7b13..d1aaa197 100644 --- a/args/graphics.py +++ b/args/graphics.py @@ -22,11 +22,32 @@ def parse(parser): graphics.add_argument("-ahtc", "--alternate-healing-text-color", action = "store_true", help = "Makes healing text blue, to be able to distinguish from damage.") + graphics.add_argument("-steve", "--steveify", type = str, nargs='?', const='Steve', default=None, + help = "Steveify the seed: rename all characters, items, espers, magic, enemies, etc. to a given name (default: Steve)") + def process(args): import graphics.palettes.palettes as palettes import graphics.portraits.portraits as portraits import graphics.sprites.sprites as sprites + if args.steveify is not None: + if isinstance(args.steveify, bool): + if args.steveify: + args.steveify = "STEVE" + else: + args.steveify = None + else: + args.steveify = args.steveify.strip() + steveify_upper = args.steveify.upper() + if steveify_upper in ("NONE", "FALSE"): + args.steveify = None + elif not args.steveify: + args.steveify = "STEVE" + + if args.steveify is not None: + if len(args.steveify) > 6: + args.steveify = args.steveify[:6] + if args.character_names is not None: args.names = args.character_names.split('.') if len(args.names) != Characters.CHARACTER_COUNT: @@ -40,6 +61,9 @@ def process(args): else: args.names = Characters.DEFAULT_NAME + if args.steveify is not None: + args.names = [args.steveify] * Characters.CHARACTER_COUNT + args.palettes = [] if args.character_palettes: args.palette_ids = [int(palette_id) for palette_id in args.character_palettes.split('.')] @@ -101,6 +125,8 @@ def flags(args): if args.character_names: flags += " -name " + args.character_names + if args.steveify: + flags += f' -steve "{args.steveify}"' if args.character_palettes: flags += " -cpal " + args.character_palettes if args.character_portraits: @@ -189,8 +215,9 @@ def _other_options_log(args): entries = [ ("Remove Flashes", remove_flashes, "remove_flashes"), - ("World Minimap", world_minimap, "world_minimap"), + ("Minimap", world_minimap, "world_minimap"), ("Healing Text", healing_text, "healing_text"), + ("Steveify", args.steveify if args.steveify else "None", "steveify"), ] for entry in entries: diff --git a/data/characters.py b/data/characters.py index c5f258d5..761075b0 100644 --- a/data/characters.py +++ b/data/characters.py @@ -133,6 +133,10 @@ def mod(self): if self.args.character_names: self.mod_names() + if self.args.steveify: + for character in self.characters: + character.name = self.args.steveify + if self.args.original_name_display: characters_asm.show_original_names() diff --git a/data/dances.py b/data/dances.py index 843249ea..f26cfec3 100644 --- a/data/dances.py +++ b/data/dances.py @@ -164,6 +164,10 @@ def shuffle(self): dance.dances = abilities[ability_index : ability_index + self.DATA_SIZE] def mod(self): + if self.args.steveify: + for dance in self.dances: + dance.name = self.args.steveify + self.write_learners_table() self.write_is_learner() self.after_battle_check_mod() diff --git a/data/data.py b/data/data.py index 3624b986..b79315b9 100644 --- a/data/data.py +++ b/data/data.py @@ -21,6 +21,8 @@ class Data: def __init__(self, rom, args): + self.rom = rom + self.args = args self.dialogs = dialogs self.spells = spells.Spells(rom, args) @@ -81,6 +83,16 @@ def __init__(self, rom, args): self.title_graphics.mod() def write(self): + if self.args.steveify: + import data.text as text + ability_name_bytes = bytearray() + name_bytes = bytearray(text.get_bytes(self.args.steveify, text.TEXT2)) + name_bytes = name_bytes[:10] + name_bytes.extend([0xff] * (10 - len(name_bytes))) + for i in range(175): + ability_name_bytes.extend(name_bytes) + self.rom.set_bytes(0x26f7b9, ability_name_bytes) + self.dialogs.write() self.characters.write() self.items.write() diff --git a/data/enemies.py b/data/enemies.py index 7e16dd83..b384cf45 100644 --- a/data/enemies.py +++ b/data/enemies.py @@ -75,6 +75,8 @@ def get_enemy(self, name): return enemy.id def get_name(self, enemy_id): + if self.args.steveify: + return self.args.steveify if enemy_id in bosses.enemy_name: return bosses.enemy_name[enemy_id] return self.enemies[enemy_id].name @@ -439,6 +441,13 @@ def print(self): enemy.print() def write(self): + if self.args.steveify: + for enemy in self.enemies: + if enemy.name: + enemy.name = self.args.steveify + if enemy.special_name: + enemy.special_name = self.args.steveify + for enemy_index in range(len(self.enemies)): self.enemy_data[enemy_index] = self.enemies[enemy_index].data() self.enemy_name_data[enemy_index] = self.enemies[enemy_index].name_data() diff --git a/data/espers.py b/data/espers.py index bf2c0957..f3c50629 100644 --- a/data/espers.py +++ b/data/espers.py @@ -275,6 +275,10 @@ def multi_summon(self): space = Reserve(0x24da3, 0x24da5, "espers set used in battle bit", asm.NOP()) def mod(self, dialogs): + if self.args.steveify: + for esper in self.espers: + esper.name = self.args.steveify + self.receive_dialogs_mod(dialogs) if self.args.esper_spells_shuffle or self.args.esper_spells_shuffle_random_rates: @@ -353,7 +357,7 @@ def get_receive_esper_dialog(self, esper): return self.receive_dialogs[esper] def get_name(self, esper): - return self.esper_names[esper] + return self.espers[esper].get_name() def log(self): from log import COLUMN_WIDTH, section_entries, format_option diff --git a/data/items.py b/data/items.py index f90bf5b1..0338b72e 100644 --- a/data/items.py +++ b/data/items.py @@ -220,6 +220,15 @@ def moogle_starting_equipment(self): self.characters.characters[index].init_head = random.choice(tiers[Item.HELMET][1]) def mod(self): + if self.args.steveify: + for item in self.items: + if item.id != self.EMPTY: + icon = "" + if item.name.startswith("<"): + end_tag = item.name.find(">") + if end_tag != -1: + icon = item.name[:end_tag + 1] + item.name = f"{icon}{self.args.steveify}" not_relic_condition = lambda x: x != Item.RELIC if self.args.item_equipable_random: self.equipable_random(not_relic_condition, self.args.item_equipable_random_min, diff --git a/data/lores.py b/data/lores.py index c4cfa602..0029d504 100644 --- a/data/lores.py +++ b/data/lores.py @@ -271,6 +271,15 @@ def mod(self, dialogs): if self.args.lores_level_randomize: self.random_lx_levels(dialogs) + if self.args.steveify: + import re + for lore in self.lores: + match = re.search('L.*[?1-9]', lore.name) + if match: + lore.name = f"{match.group()} {self.args.steveify}"[:self.NAME_SIZE] + else: + lore.name = self.args.steveify[:self.NAME_SIZE] + def write(self): if self.args.spoiler_log: self.log() diff --git a/data/magiteks.py b/data/magiteks.py index 1dadccec..8cb93327 100644 --- a/data/magiteks.py +++ b/data/magiteks.py @@ -34,6 +34,10 @@ def fix_reflectable_beams(self): self.magiteks[self.ICE_BEAM].flags2 = 0x22 def mod(self): + if self.args.steveify: + for magitek in self.magiteks: + magitek.name = self.args.steveify + self.fix_reflectable_beams() pass diff --git a/data/spells.py b/data/spells.py index ad82b430..47374109 100644 --- a/data/spells.py +++ b/data/spells.py @@ -102,6 +102,23 @@ def alternate_healing_text_color(self): space.write(0x44, 0x7f) #default: F6 4B def mod(self): + if self.args.steveify: + for spell in self.spells: + icon = "" + for tag in ['', '', '']: + if spell.name.startswith(tag): + icon = tag + break + suffix = "" + for s in [" 2", " 3", "2"]: + if spell.name.endswith(s): + suffix = s + break + + max_steve_len = 6 - len(suffix) + steve_part = self.args.steveify[:max_steve_len] + spell.name = f"{icon}{steve_part}{suffix}" + if self.args.magic_mp_shuffle: self.shuffle_mp() elif self.args.magic_mp_random_value: diff --git a/data/swdtechs.py b/data/swdtechs.py index 847cbe85..866c2d5a 100644 --- a/data/swdtechs.py +++ b/data/swdtechs.py @@ -130,6 +130,10 @@ def enable_fast_swdtech(self): space.write(0x00) def mod(self): + if self.args.steveify: + for swdtech in self.swdtechs: + swdtech.name = self.args.steveify + self.write_learners_table() self.write_is_learner()