From 7de86d6f9eb4f540d15a9966bd41711ffc3bd7b1 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 12 Mar 2022 23:19:59 -0500 Subject: [PATCH 1/8] add --starting-espers-random flag - this will give you between the selected range of espers from the very start --- args/espers.py | 14 ++++++++++++++ data/espers.py | 10 ++++++++++ event/start.py | 17 +++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/args/espers.py b/args/espers.py index 6cfbb466..96f3d6ee 100644 --- a/args/espers.py +++ b/args/espers.py @@ -1,3 +1,6 @@ +from data.espers import Espers + + def name(): return "Espers" @@ -6,7 +9,13 @@ def parse(parser): from data.characters import Characters espers = parser.add_argument_group("Espers") + esper_start = espers.add_mutually_exclusive_group() + esper_start.add_argument("-sespr", "--starting-espers-random", default = [0, 0], type = int, + nargs = 2, metavar = ("MIN", "MAX"), choices = range(Espers.ESPER_COUNT + 1), + help = "Starting espers random") + esper_spells = espers.add_mutually_exclusive_group() + esper_spells.add_argument("-esrr", "--esper-spells-random-rates", action = "store_true", help = "Original esper spells with random learn rates") esper_spells.add_argument("-ess", "--esper-spells-shuffle", action = "store_true", @@ -50,6 +59,7 @@ def parse(parser): help = "Espers can be summoned multiple times in battle") def process(args): + args._process_min_max("starting_espers_random") args._process_min_max("esper_spells_random") args._process_min_max("esper_mp_random_value") args._process_min_max("esper_mp_random_percent") @@ -66,6 +76,9 @@ def process(args): def flags(args): flags = "" + if args.starting_espers_random_min != 100 or args.starting_espers_random_max != 100: + flags += f" -sespr {args.starting_espers_random_min} {args.starting_espers_random_max}" + if args.esper_spells_random_rates: flags += " -esrr" elif args.esper_spells_shuffle: @@ -133,6 +146,7 @@ def options(args): equipable = f"Balanced Random {args.esper_equipable_balanced_random_value}" result = [] + result.append(("Starting Espers", f"{args.starting_espers_random_min}-{args.starting_espers_random_max}")) result.append(("Spells", spells)) result.append(("Bonuses", bonuses)) if args.esper_bonuses_random: diff --git a/data/espers.py b/data/espers.py index 8d41a950..9d50f1c3 100644 --- a/data/espers.py +++ b/data/espers.py @@ -45,6 +45,11 @@ def __init__(self, rom, args, spells, characters): self.espers.append(esper) self.available_espers = set(range(self.ESPER_COUNT)) + self.starting_espers = [] + + if args.starting_espers_random_min > 0 or args.starting_espers_random_max <= self.ESPER_COUNT: + count = random.randint(args.starting_espers_random_min, args.starting_espers_random_max) + self.starting_espers = [self.get_random_esper() for _esp in range(count)] def receive_dialogs_mod(self, dialogs): self.receive_dialogs = [1133, 1380, 1381, 1134, 1535, 1082, 1091, 1092, 1136, 1534, 2618, 1093, 1087,\ @@ -271,6 +276,9 @@ def mod(self, dialogs): if self.args.esper_spells_random_rates or self.args.esper_spells_shuffle_random_rates: self.randomize_rates() + if len(self.starting_espers): + self.randomize_rates() + if self.args.esper_spells_shuffle or self.args.esper_spells_shuffle_random_rates: self.shuffle_spells() elif self.args.esper_spells_random: @@ -371,6 +379,8 @@ def log(self): character_names = wrap(character_names, width = COLUMN_WIDTH - 1) entry.append(character_names) + if esper_index in self.starting_espers: + entry.append("Start With Esper") if entry_index % 2: rentries.append(entry) else: diff --git a/event/start.py b/event/start.py index 80f35b42..320ef8a2 100644 --- a/event/start.py +++ b/event/start.py @@ -63,6 +63,7 @@ def mod(self): self.intro_loop_mod() self.init_characters_mod() self.start_party_mod() + self.start_esper_mod() self.start_gold_mod() self.start_items_mod() self.start_game_mod() @@ -73,6 +74,7 @@ def mod(self): field.Call(self.event_bit_init), field.Call(self.character_init), field.Call(self.start_party), + field.Call(self.start_esper), field.Call(self.start_gold), field.Call(self.start_items), field.Call(self.start_game), @@ -142,6 +144,21 @@ def start_party_mod(self): space = Write(Bank.CC, src, "start party") self.start_party = space.start_address + def start_esper_mod(self): + src = [] + + for esper_id in self.espers.starting_espers: + src += [ + field.AddEsper(esper_id, sound_effect = False) + ] + + src += [ + field.Return() + ] + + space = Write(Bank.CC, src, "start espers") + self.start_esper = space.start_address + def start_gold_mod(self): gold = self.args.gold if self.args.debug: From a01c7c1549bcb6dfed4ade3971ffd0fe3550fec0 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 12 Mar 2022 23:20:24 -0500 Subject: [PATCH 2/8] fix err --- args/espers.py | 2 +- data/espers.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/args/espers.py b/args/espers.py index 96f3d6ee..bbda92a9 100644 --- a/args/espers.py +++ b/args/espers.py @@ -76,7 +76,7 @@ def process(args): def flags(args): flags = "" - if args.starting_espers_random_min != 100 or args.starting_espers_random_max != 100: + if args.starting_espers_random_min or args.starting_espers_random_max: flags += f" -sespr {args.starting_espers_random_min} {args.starting_espers_random_max}" if args.esper_spells_random_rates: diff --git a/data/espers.py b/data/espers.py index 9d50f1c3..b83113d1 100644 --- a/data/espers.py +++ b/data/espers.py @@ -353,8 +353,12 @@ def log(self): for entry_index in range(self.ESPER_COUNT): esper_index = self.esper_menu_order[entry_index] esper = self.espers[esper_index] + prefix = "*" if esper.id in self.starting_espers else "" + # esper_name = f"{esper.get_name()}" + # esper_name = "*" + esper_name if esper_name in self.starting_espers else esper_name + # entry = [f"{esper_name:3} MP"] + entry = [f"{prefix}{esper.get_name():<{self.NAME_SIZE}} {esper.mp:>3} MP"] - entry = [f"{esper.get_name():<{self.NAME_SIZE}} {esper.mp:>3} MP"] for spell_index in range(esper.spell_count): spell_name = self.spells.get_name(esper.spells[spell_index].id) learn_rate = esper.spells[spell_index].rate From 069a88df1fadd51186c3d6bbb7e3144d71fc960f Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 16 Apr 2022 15:22:06 -0400 Subject: [PATCH 3/8] Add better esper log --- args/espers.py | 2 +- data/espers.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/args/espers.py b/args/espers.py index bbda92a9..a4b11b61 100644 --- a/args/espers.py +++ b/args/espers.py @@ -146,7 +146,7 @@ def options(args): equipable = f"Balanced Random {args.esper_equipable_balanced_random_value}" result = [] - result.append(("Starting Espers", f"{args.starting_espers_random_min}-{args.starting_espers_random_max}")) + result.append(("Starting Espers", f"Random {args.starting_espers_random_min}-{args.starting_espers_random_max}")) result.append(("Spells", spells)) result.append(("Bonuses", bonuses)) if args.esper_bonuses_random: diff --git a/data/espers.py b/data/espers.py index b83113d1..5c96a96a 100644 --- a/data/espers.py +++ b/data/espers.py @@ -383,13 +383,14 @@ def log(self): character_names = wrap(character_names, width = COLUMN_WIDTH - 1) entry.append(character_names) - if esper_index in self.starting_espers: - entry.append("Start With Esper") if entry_index % 2: rentries.append(entry) else: lentries.append(entry) + lentries.append("") + lentries.append("* = Starting Esper") + section_entries("Espers", lentries, rentries) def print(self): From 92130541517ef726c720097f033634cb372f10ea Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 16 Apr 2022 15:35:05 -0400 Subject: [PATCH 4/8] chore: update flag from sespr => stesp --- args/espers.py | 10 +++++----- data/espers.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/args/espers.py b/args/espers.py index a4b11b61..92539a30 100644 --- a/args/espers.py +++ b/args/espers.py @@ -10,7 +10,7 @@ def parse(parser): espers = parser.add_argument_group("Espers") esper_start = espers.add_mutually_exclusive_group() - esper_start.add_argument("-sespr", "--starting-espers-random", default = [0, 0], type = int, + esper_start.add_argument("-stesp", "--starting-espers", default = [0, 0], type = int, nargs = 2, metavar = ("MIN", "MAX"), choices = range(Espers.ESPER_COUNT + 1), help = "Starting espers random") @@ -59,7 +59,7 @@ def parse(parser): help = "Espers can be summoned multiple times in battle") def process(args): - args._process_min_max("starting_espers_random") + args._process_min_max("starting_espers") args._process_min_max("esper_spells_random") args._process_min_max("esper_mp_random_value") args._process_min_max("esper_mp_random_percent") @@ -76,8 +76,8 @@ def process(args): def flags(args): flags = "" - if args.starting_espers_random_min or args.starting_espers_random_max: - flags += f" -sespr {args.starting_espers_random_min} {args.starting_espers_random_max}" + if args.starting_espers_min or args.starting_espers_max: + flags += f" -stesp {args.starting_espers_min} {args.starting_espers_max}" if args.esper_spells_random_rates: flags += " -esrr" @@ -146,7 +146,7 @@ def options(args): equipable = f"Balanced Random {args.esper_equipable_balanced_random_value}" result = [] - result.append(("Starting Espers", f"Random {args.starting_espers_random_min}-{args.starting_espers_random_max}")) + result.append(("Starting Espers", f"Random {args.starting_espers_min}-{args.starting_espers_max}")) result.append(("Spells", spells)) result.append(("Bonuses", bonuses)) if args.esper_bonuses_random: diff --git a/data/espers.py b/data/espers.py index 5c96a96a..0fe85700 100644 --- a/data/espers.py +++ b/data/espers.py @@ -47,8 +47,8 @@ def __init__(self, rom, args, spells, characters): self.available_espers = set(range(self.ESPER_COUNT)) self.starting_espers = [] - if args.starting_espers_random_min > 0 or args.starting_espers_random_max <= self.ESPER_COUNT: - count = random.randint(args.starting_espers_random_min, args.starting_espers_random_max) + if args.starting_espers_min > 0 or args.starting_espers_max <= self.ESPER_COUNT: + count = random.randint(args.starting_espers_min, args.starting_espers_max) self.starting_espers = [self.get_random_esper() for _esp in range(count)] def receive_dialogs_mod(self, dialogs): From 9628f4bef5677fa87486848a0ba950bda26419f2 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sun, 17 Apr 2022 07:29:47 -0400 Subject: [PATCH 5/8] chore: remove commented code --- data/espers.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/data/espers.py b/data/espers.py index 0fe85700..3a9bd12f 100644 --- a/data/espers.py +++ b/data/espers.py @@ -354,9 +354,7 @@ def log(self): esper_index = self.esper_menu_order[entry_index] esper = self.espers[esper_index] prefix = "*" if esper.id in self.starting_espers else "" - # esper_name = f"{esper.get_name()}" - # esper_name = "*" + esper_name if esper_name in self.starting_espers else esper_name - # entry = [f"{esper_name:3} MP"] + entry = [f"{prefix}{esper.get_name():<{self.NAME_SIZE}} {esper.mp:>3} MP"] for spell_index in range(esper.spell_count): From 00e112851d49859b6efe2da23bbd7dd64084628b Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sun, 17 Apr 2022 07:48:48 -0400 Subject: [PATCH 6/8] Remove "Random" from "Starting Espers" menu --- args/espers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/args/espers.py b/args/espers.py index 92539a30..84d8392a 100644 --- a/args/espers.py +++ b/args/espers.py @@ -146,7 +146,7 @@ def options(args): equipable = f"Balanced Random {args.esper_equipable_balanced_random_value}" result = [] - result.append(("Starting Espers", f"Random {args.starting_espers_min}-{args.starting_espers_max}")) + result.append(("Starting Espers", f"{args.starting_espers_min}-{args.starting_espers_max}")) result.append(("Spells", spells)) result.append(("Bonuses", bonuses)) if args.esper_bonuses_random: From 1c117509dbb484ad73ba3d9699f3ea6b80250580 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sun, 1 May 2022 10:21:50 -0400 Subject: [PATCH 7/8] Update starting_espers MAX to account for logic issues --- args/espers.py | 9 ++++++++- data/espers.py | 2 +- event/event_reward.py | 1 + event/events.py | 15 +++++++++++++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/args/espers.py b/args/espers.py index 84d8392a..f7c4ac5f 100644 --- a/args/espers.py +++ b/args/espers.py @@ -1,6 +1,13 @@ from data.espers import Espers +from event.event_reward import CHARACTER_ESPER_ONLY_REWARDS +# If all 27 espers are allocated at start, there will be logic errors when it comes to +# assigning characters to character/esper only checks. +# We would have to ensure that a character is assigned to the {6} char/esper only rewards. +# We could account for this in the logic, but it would gentrify the routing logic a bit much. +MAX_STARTING_ESPERS = Espers.ESPER_COUNT - CHARACTER_ESPER_ONLY_REWARDS + def name(): return "Espers" @@ -11,7 +18,7 @@ def parse(parser): esper_start = espers.add_mutually_exclusive_group() esper_start.add_argument("-stesp", "--starting-espers", default = [0, 0], type = int, - nargs = 2, metavar = ("MIN", "MAX"), choices = range(Espers.ESPER_COUNT + 1), + nargs = 2, metavar = ("MIN", "MAX"), choices = range(MAX_STARTING_ESPERS + 1), help = "Starting espers random") esper_spells = espers.add_mutually_exclusive_group() diff --git a/data/espers.py b/data/espers.py index 3a9bd12f..8f0007f4 100644 --- a/data/espers.py +++ b/data/espers.py @@ -47,7 +47,7 @@ def __init__(self, rom, args, spells, characters): self.available_espers = set(range(self.ESPER_COUNT)) self.starting_espers = [] - if args.starting_espers_min > 0 or args.starting_espers_max <= self.ESPER_COUNT: + if args.starting_espers_min > 0: count = random.randint(args.starting_espers_min, args.starting_espers_max) self.starting_espers = [self.get_random_esper() for _esp in range(count)] diff --git a/event/event_reward.py b/event/event_reward.py index 0334886d..f1063e2e 100644 --- a/event/event_reward.py +++ b/event/event_reward.py @@ -6,6 +6,7 @@ class RewardType(Flag): ESPER = auto() ITEM = auto() +CHARACTER_ESPER_ONLY_REWARDS = 6 class Reward: def __init__(self, event, possible_types): self.id = None diff --git a/event/events.py b/event/events.py index cb0887b7..f1d40477 100644 --- a/event/events.py +++ b/event/events.py @@ -1,5 +1,5 @@ from memory.space import Bank, Allocate -from event.event_reward import RewardType, Reward, choose_reward, weighted_reward_choice +from event.event_reward import CHARACTER_ESPER_ONLY_REWARDS, RewardType, choose_reward, weighted_reward_choice import instruction.field as field class Events(): @@ -15,7 +15,9 @@ def __init__(self, rom, args, data): self.espers = data.espers self.shops = data.shops - self.mod() + events = self.mod() + + self.validate(events) def mod(self): # generate list of events from files @@ -58,6 +60,8 @@ def mod(self): from log import section section("Events", log_strings, []) + return events + def init_reward_slots(self, events): import random reward_slots = [] @@ -161,3 +165,10 @@ def open_world_mod(self, events): # choose the rest of the rewards, items given to events after all characters/events assigned self.choose_item_possible_rewards(reward_slots) + + def validate(self, events): + char_esper_checks = [] + for event in events: + char_esper_checks += [r for r in event.rewards if r.possible_types == (RewardType.CHARACTER | RewardType.ESPER)] + + assert len(char_esper_checks) == CHARACTER_ESPER_ONLY_REWARDS, "Number of char/esper only checks changed - Check usages of CHARACTER_ESPER_ONLY_REWARDS and ensure no breaking changes" \ No newline at end of file From 1736da69641f662cdc689b4b739129ca109eda24 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sun, 1 May 2022 10:25:43 -0400 Subject: [PATCH 8/8] ws, help updated --- args/espers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/args/espers.py b/args/espers.py index f7c4ac5f..9d097c5d 100644 --- a/args/espers.py +++ b/args/espers.py @@ -1,7 +1,6 @@ from data.espers import Espers from event.event_reward import CHARACTER_ESPER_ONLY_REWARDS - # If all 27 espers are allocated at start, there will be logic errors when it comes to # assigning characters to character/esper only checks. # We would have to ensure that a character is assigned to the {6} char/esper only rewards. @@ -19,7 +18,7 @@ def parse(parser): esper_start = espers.add_mutually_exclusive_group() esper_start.add_argument("-stesp", "--starting-espers", default = [0, 0], type = int, nargs = 2, metavar = ("MIN", "MAX"), choices = range(MAX_STARTING_ESPERS + 1), - help = "Starting espers random") + help = "Party starts with %(metavar) random espers") esper_spells = espers.add_mutually_exclusive_group()