From 9f75313d25f05fa31440c573856f9335bcbc9bd5 Mon Sep 17 00:00:00 2001 From: Nolan <10077353+nolanlocke@users.noreply.github.com> Date: Mon, 17 Jan 2022 07:09:20 -0500 Subject: [PATCH 01/16] add -bmbs flag: adds statues to shuffle pool --- args/bosses.py | 5 +++++ data/enemy_packs.py | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/args/bosses.py b/args/bosses.py index 29bffd56..3713ae54 100644 --- a/args/bosses.py +++ b/args/bosses.py @@ -11,6 +11,8 @@ def parse(parser): help = "Boss battles randomized") bosses.add_argument("-bmbd", "--mix-bosses-dragons", action = "store_true", help = "Shuffle/randomize bosses and dragons together") + bosses.add_argument("-bmbs", "--mix-bosses-statues", action = "store_true", + help = "Shuffle/randomize bosses and statues together") bosses.add_argument("-srp3", "--shuffle-random-phunbaba3", action = "store_true", help = "Apply Shuffle/Random to Phunbaba 3 (otherwise he will only appear in Mobliz WOR)") bosses.add_argument("-bnds", "--boss-normalize-distort-stats", action = "store_true", @@ -33,6 +35,8 @@ def flags(args): if args.mix_bosses_dragons: flags += " -bmbd" + if args.mix_bosses_statues: + flags += " -bmbs" if args.shuffle_random_phunbaba3: flags += " -srp3" if args.boss_normalize_distort_stats: @@ -54,6 +58,7 @@ def options(args): return [ ("Boss Battles", boss_battles), ("Mix Bosses & Dragons", args.mix_bosses_dragons), + ("Mix Bosses & Statues", args.mix_bosses_statues), ("Shuffle/Random Phunbaba 3", args.shuffle_random_phunbaba3), ("Normalize & Distort Stats", args.boss_normalize_distort_stats), ("Boss Experience", args.boss_experience), diff --git a/data/enemy_packs.py b/data/enemy_packs.py index e4415010..ae8bee98 100644 --- a/data/enemy_packs.py +++ b/data/enemy_packs.py @@ -18,6 +18,10 @@ class EnemyPacks(): PHUNBABA3 = 386 DOOM_GAZE = 349 + DOOM=354 + GODDESS=355 + POLTERGEIST=356 + def __init__(self, rom, args, formations): self.rom = rom self.args = args @@ -37,6 +41,10 @@ def __init__(self, rom, args, formations): def _replaceable_bosses(self): replaceable = list(bosses.normal_pack_name) + if not self.args.mix_bosses_statues: + for boss in [self.DOOM, self.GODDESS, self.POLTERGEIST]: + replaceable.remove(boss) + self.event_boss_replacements[boss] = boss if not self.args.shuffle_random_phunbaba3: replaceable.remove(self.PHUNBABA3) self.event_boss_replacements[self.PHUNBABA3] = self.PHUNBABA3 From a0518cda5aff98d6b59dc16eec44b579a6c3bb60 Mon Sep 17 00:00:00 2001 From: Nolan <10077353+nolanlocke@users.noreply.github.com> Date: Mon, 17 Jan 2022 07:10:13 -0500 Subject: [PATCH 02/16] add context for statue ids being in EnemyPacks --- data/enemy_packs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/data/enemy_packs.py b/data/enemy_packs.py index ae8bee98..9f55055e 100644 --- a/data/enemy_packs.py +++ b/data/enemy_packs.py @@ -18,6 +18,7 @@ class EnemyPacks(): PHUNBABA3 = 386 DOOM_GAZE = 349 + # statues removed from shuffle pool with -bmbs flag DOOM=354 GODDESS=355 POLTERGEIST=356 From c46f27e6e614c5d05806c7138f6072cdc0ed6b75 Mon Sep 17 00:00:00 2001 From: Nolan <10077353+nolanlocke@users.noreply.github.com> Date: Wed, 19 Jan 2022 07:54:11 -0500 Subject: [PATCH 03/16] set default true ffor backwards compatibility --- args/bosses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/args/bosses.py b/args/bosses.py index 3713ae54..5909cd8f 100644 --- a/args/bosses.py +++ b/args/bosses.py @@ -11,7 +11,7 @@ def parse(parser): help = "Boss battles randomized") bosses.add_argument("-bmbd", "--mix-bosses-dragons", action = "store_true", help = "Shuffle/randomize bosses and dragons together") - bosses.add_argument("-bmbs", "--mix-bosses-statues", action = "store_true", + bosses.add_argument("-bmbs", "--mix-bosses-statues", action = "store_true", default = True, help = "Shuffle/randomize bosses and statues together") bosses.add_argument("-srp3", "--shuffle-random-phunbaba3", action = "store_true", help = "Apply Shuffle/Random to Phunbaba 3 (otherwise he will only appear in Mobliz WOR)") From 937a9fb450ebea341c280599f2a23676df85bfe8 Mon Sep 17 00:00:00 2001 From: Nolan <10077353+nolanlocke@users.noreply.github.com> Date: Wed, 19 Jan 2022 08:06:08 -0500 Subject: [PATCH 04/16] remove default as no way to turn it off --- args/bosses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/args/bosses.py b/args/bosses.py index 5909cd8f..3713ae54 100644 --- a/args/bosses.py +++ b/args/bosses.py @@ -11,7 +11,7 @@ def parse(parser): help = "Boss battles randomized") bosses.add_argument("-bmbd", "--mix-bosses-dragons", action = "store_true", help = "Shuffle/randomize bosses and dragons together") - bosses.add_argument("-bmbs", "--mix-bosses-statues", action = "store_true", default = True, + bosses.add_argument("-bmbs", "--mix-bosses-statues", action = "store_true", help = "Shuffle/randomize bosses and statues together") bosses.add_argument("-srp3", "--shuffle-random-phunbaba3", action = "store_true", help = "Apply Shuffle/Random to Phunbaba 3 (otherwise he will only appear in Mobliz WOR)") From 31a42fde3d6d64df6d9776597d156352a2f867e3 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 9 Apr 2022 09:39:13 -0400 Subject: [PATCH 05/16] wip refactor shuffle to "boss location" flags --- args/bosses.py | 43 ++++++++++++++++++++++++++++++++++--------- data/bosses.py | 7 +++++++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/args/bosses.py b/args/bosses.py index 3713ae54..767ecd92 100644 --- a/args/bosses.py +++ b/args/bosses.py @@ -1,3 +1,6 @@ +from data.bosses import BossLocations + + def name(): return "Bosses" @@ -9,10 +12,22 @@ def parse(parser): help = "Boss battles shuffled") bosses_battles.add_argument("-bbr", "--boss-battles-random", action = "store_true", help = "Boss battles randomized") - bosses.add_argument("-bmbd", "--mix-bosses-dragons", action = "store_true", + + dragons = bosses.add_mutually_exclusive_group() + dragons.add_argument("-drloc", "--dragon-boss-location", default = BossLocations.SHUFFLE, type = str.lower, choices = BossLocations.ALL, + help = "Decides which locations the eight dragon encounters can be fought") + + dragons.add_argument("-bmbd", "--mix-bosses-dragons", action = "store_true", help = "Shuffle/randomize bosses and dragons together") - bosses.add_argument("-bmbs", "--mix-bosses-statues", action = "store_true", - help = "Shuffle/randomize bosses and statues together") + # dragons.add_argument("-shud", "--shuffle-dragons", action = "store_true", + # help = "Shuffles the eight dragon encounters") + + statues = bosses.add_mutually_exclusive_group() + + + statues.add_argument("-stloc", "--statue-boss-location", default = BossLocations.MIX, type = str.lower, choices = BossLocations.ALL, + help = "Decides which locations the three statue encounters can be fought") + bosses.add_argument("-srp3", "--shuffle-random-phunbaba3", action = "store_true", help = "Apply Shuffle/Random to Phunbaba 3 (otherwise he will only appear in Mobliz WOR)") bosses.add_argument("-bnds", "--boss-normalize-distort-stats", action = "store_true", @@ -23,7 +38,8 @@ def parse(parser): help = "Undead status removed from bosses") def process(args): - pass + if args.mix_bosses_dragons: + args.dragon_boss_location = BossLocations.MIX def flags(args): flags = "" @@ -33,10 +49,16 @@ def flags(args): elif args.boss_battles_random: flags += " -bbr" + if args.dragon_boss_location: + flags += f" -drloc {args.statue_boss_location}" if args.mix_bosses_dragons: - flags += " -bmbd" - if args.mix_bosses_statues: - flags += " -bmbs" + flags += f" -drloc {BossLocations.MIX}" + else: + flags += f" -drloc {BossLocations.SHUFFLE}" + + if args.statue_boss_location: + flags += f" -stloc {args.statue_boss_location}" + if args.shuffle_random_phunbaba3: flags += " -srp3" if args.boss_normalize_distort_stats: @@ -55,10 +77,13 @@ def options(args): elif args.boss_battles_random: boss_battles = "Random" + dragon_battles = args.dragon_boss_location + statue_battles = args.statue_boss_location + return [ ("Boss Battles", boss_battles), - ("Mix Bosses & Dragons", args.mix_bosses_dragons), - ("Mix Bosses & Statues", args.mix_bosses_statues), + ("Dragons", dragon_battles), + ("Statues", statue_battles), ("Shuffle/Random Phunbaba 3", args.shuffle_random_phunbaba3), ("Normalize & Distort Stats", args.boss_normalize_distort_stats), ("Boss Experience", args.boss_experience), diff --git a/data/bosses.py b/data/bosses.py index 612fd968..fd592acb 100644 --- a/data/bosses.py +++ b/data/bosses.py @@ -255,3 +255,10 @@ enemy_name.update(removed_enemy_name) name_enemy = {v: k for k, v in enemy_name.items()} + +class BossLocations: + MIX = "mix" + ORIGINAL = "original" + SHUFFLE = "shuffle" + + ALL = [MIX, ORIGINAL, SHUFFLE] \ No newline at end of file From a833caaa52e8a9f87b2d8790089e9b5a258c8ae9 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 16 Apr 2022 17:28:21 -0400 Subject: [PATCH 06/16] bug fixes --- args/bosses.py | 10 +-- data/bosses.py | 19 ++++++ data/enemy_packs.py | 144 ++++++++++++++++++++++++-------------------- 3 files changed, 100 insertions(+), 73 deletions(-) diff --git a/args/bosses.py b/args/bosses.py index 767ecd92..efd0b800 100644 --- a/args/bosses.py +++ b/args/bosses.py @@ -16,15 +16,10 @@ def parse(parser): dragons = bosses.add_mutually_exclusive_group() dragons.add_argument("-drloc", "--dragon-boss-location", default = BossLocations.SHUFFLE, type = str.lower, choices = BossLocations.ALL, help = "Decides which locations the eight dragon encounters can be fought") - dragons.add_argument("-bmbd", "--mix-bosses-dragons", action = "store_true", help = "Shuffle/randomize bosses and dragons together") - # dragons.add_argument("-shud", "--shuffle-dragons", action = "store_true", - # help = "Shuffles the eight dragon encounters") statues = bosses.add_mutually_exclusive_group() - - statues.add_argument("-stloc", "--statue-boss-location", default = BossLocations.MIX, type = str.lower, choices = BossLocations.ALL, help = "Decides which locations the three statue encounters can be fought") @@ -40,6 +35,7 @@ def parse(parser): def process(args): if args.mix_bosses_dragons: args.dragon_boss_location = BossLocations.MIX + args.mix_bosses_dragons = None def flags(args): flags = "" @@ -50,8 +46,8 @@ def flags(args): flags += " -bbr" if args.dragon_boss_location: - flags += f" -drloc {args.statue_boss_location}" - if args.mix_bosses_dragons: + flags += f" -drloc {args.dragon_boss_location}" + elif args.mix_bosses_dragons: flags += f" -drloc {BossLocations.MIX}" else: flags += f" -drloc {BossLocations.SHUFFLE}" diff --git a/data/bosses.py b/data/bosses.py index fd592acb..079023af 100644 --- a/data/bosses.py +++ b/data/bosses.py @@ -92,6 +92,25 @@ 396 : "Guardian", # defeatable guardian in kefka's tower 401 : "MagiMaster", } + +# These ids are repeated in normal_pack_name as well +# This is intentional as they are used to iterate over ALL bosses for things like objective conditions +statue_pack_name = { + 354 : "Doom", + 355 : "Goddess", + 356 : "Poltrgeist", +} +statue_formation_name = { + 468 : "Doom", + 469 : "Goddess", + 470 : "Poltrgeist", +} +statue_enemy_name = { + 295 : "Doom", + 296 : "Goddess", + 297 : "Poltrgeist", +} + normal_formation_name = { 79 : "Rizopas", 354 : "MagiMaster", diff --git a/data/enemy_packs.py b/data/enemy_packs.py index 29b4e642..d04c39db 100644 --- a/data/enemy_packs.py +++ b/data/enemy_packs.py @@ -40,12 +40,13 @@ def __init__(self, rom, args, formations): pack = EnemyPack2(pack2_index, self.pack2_data[pack2_index]) self.packs.append(pack) + # Returns the list of all non-statue, non-dragon bosses def _replaceable_bosses(self): - replaceable = list(bosses.normal_pack_name) - if not self.args.mix_bosses_statues: - for boss in [self.DOOM, self.GODDESS, self.POLTERGEIST]: - replaceable.remove(boss) - self.event_boss_replacements[boss] = boss + dragon_packs = list(bosses.dragon_pack_name) + statue_packs = list(bosses.statue_pack_name) + boss_packs = list(bosses.normal_pack_name) + replaceable = [boss for boss in boss_packs if boss not in statue_packs and boss not in dragon_packs] + if not self.args.shuffle_random_phunbaba3: replaceable.remove(self.PHUNBABA3) self.event_boss_replacements[self.PHUNBABA3] = self.PHUNBABA3 @@ -55,8 +56,57 @@ def _replaceable_bosses(self): # how would that work with him being in his original spot and the others? How to know when to get bahamut esper? replaceable.remove(self.DOOM_GAZE) self.event_boss_replacements[self.DOOM_GAZE] = self.DOOM_GAZE - return replaceable + return replaceable + self._replaceable_dragons() + self._replaceable_statues() + + # statue locations that become available for the general boss pool + def _replaceable_statues(self): + import random + statues = list(bosses.statue_pack_name) + random.shuffle(statues) + return statues if self.args.statue_boss_location == bosses.BossLocations.MIX else [] + # dragon locations that become available for the general boss pool + def _replaceable_dragons(self): + import random + statues = list(bosses.dragon_pack_name) + random.shuffle(statues) + return statues if self.args.dragon_boss_location == bosses.BossLocations.MIX else [] + + def _handle_statues(self): + statues = list(bosses.statue_pack_name) + + if self.args.statue_boss_location == bosses.BossLocations.ORIGINAL: + for statue in statues: + self.event_boss_replacements[statue] = statue + elif self.args.statue_boss_location == bosses.BossLocations.SHUFFLE: + import random + replacements = statues.copy() + random.shuffle(statues) + random.shuffle(replacements) + + for statue in statues: + self.event_boss_replacements[replacements.pop()] = statue + else: + # boss assignment is handled in the shuffle/random functions + pass + + + def _handle_dragons(self): + dragons = list(bosses.dragon_pack_name) + if self.args.dragon_boss_location == bosses.BossLocations.ORIGINAL: + for dragon in dragons: + self.event_boss_replacements[dragon] = dragon + elif self.args.dragon_boss_location == bosses.BossLocations.SHUFFLE: + import random + replacements = dragons.copy() + random.shuffle(dragons) + random.shuffle(replacements) + + for dragon in dragons: + self.event_boss_replacements[replacements.pop()] = dragon + else: + # boss assignment is handled in the shuffle/random functions + pass def phunbaba3_safety_check(self, bosses_possible): import random @@ -83,31 +133,14 @@ def shuffle_event_bosses(self): import random self.event_boss_replacements = {} - if self.args.mix_bosses_dragons: - bosses_dragons_to_replace = self._replaceable_bosses() + list(bosses.dragon_pack_name) - bosses_dragons_possible = bosses_dragons_to_replace.copy() - - random.shuffle(bosses_dragons_possible) - for index, boss in enumerate(bosses_dragons_to_replace): - self.event_boss_replacements[boss] = bosses_dragons_possible[index] - - self.phunbaba3_safety_check(bosses_dragons_to_replace) - else: - bosses_to_replace = self._replaceable_bosses() - bosses_possible = bosses_to_replace.copy() - - random.shuffle(bosses_possible) - for index, boss in enumerate(bosses_to_replace): - self.event_boss_replacements[boss] = bosses_possible[index] + bosses_to_replace = self._replaceable_bosses() + bosses_possible = bosses_to_replace.copy() - dragons_to_replace = list(bosses.dragon_pack_name) - dragons_possible = dragons_to_replace.copy() + random.shuffle(bosses_possible) + for index, boss in enumerate(bosses_to_replace): + self.event_boss_replacements[boss] = bosses_possible[index] - random.shuffle(dragons_possible) - for index, dragon in enumerate(dragons_to_replace): - self.event_boss_replacements[dragon] = dragons_possible[index] - - self.phunbaba3_safety_check(bosses_to_replace) + self.phunbaba3_safety_check(bosses_to_replace) def randomize_event_bosses(self): import args, random, objectives @@ -155,46 +188,21 @@ def randomize_event_bosses(self): if formation_id in required_dragon_formations: required_dragon_packs.add(pack_id) - if self.args.mix_bosses_dragons: - bosses_dragons_to_replace = self._replaceable_bosses() + list(bosses.dragon_pack_name) - random.shuffle(bosses_dragons_to_replace) - - for pack in required_boss_packs: - self.event_boss_replacements[bosses_dragons_to_replace.pop()] = pack - - for pack in required_dragon_packs: - self.event_boss_replacements[bosses_dragons_to_replace.pop()] = pack - - # guarantee 8 dragons - dragons_possible = list(bosses.dragon_pack_name) - for index in range(len(required_dragon_packs), len(bosses.dragon_pack_name)): - self.event_boss_replacements[bosses_dragons_to_replace.pop()] = random.choice(dragons_possible) - - bosses_possible = self._replaceable_bosses() - for boss in bosses_dragons_to_replace: - self.event_boss_replacements[boss] = random.choice(bosses_possible) + # randomizing and shuffling + bosses_to_replace = self._replaceable_bosses() + random.shuffle(bosses_to_replace) + for pack in required_boss_packs: + self.event_boss_replacements[bosses_to_replace.pop()] = pack - self.phunbaba3_safety_check(bosses_possible + dragons_possible) - else: - bosses_to_replace = self._replaceable_bosses() - random.shuffle(bosses_to_replace) - for pack in required_boss_packs: - self.event_boss_replacements[bosses_to_replace.pop()] = pack - - bosses_possible = self._replaceable_bosses() - for boss in bosses_to_replace: - self.event_boss_replacements[boss] = random.choice(bosses_possible) - - dragons_to_replace = list(bosses.dragon_pack_name) - random.shuffle(dragons_to_replace) - for pack in required_dragon_packs: - self.event_boss_replacements[dragons_to_replace.pop()] = pack + for pack in required_dragon_packs: + self.event_boss_replacements[bosses_to_replace.pop()] = pack - dragons_possible = list(bosses.dragon_pack_name) - for dragon in dragons_to_replace: - self.event_boss_replacements[dragon] = random.choice(dragons_possible) + random.shuffle(bosses_to_replace) + bosses_possible = self._replaceable_bosses() + for boss in bosses_to_replace: + self.event_boss_replacements[boss] = random.choice(bosses_possible) - self.phunbaba3_safety_check(bosses_possible) + self.phunbaba3_safety_check(bosses_possible) def randomize_packs(self, packs, boss_percent, no_phunbaba3 = False): exclude_bosses = None @@ -318,6 +326,10 @@ def mod(self): else: self.event_boss_replacements = None + self._handle_dragons() + + self._handle_statues() + if not self.args.fixed_encounters_original: self.randomize_fixed() From aaeba39edf51428c332f0ea7410a407d176a9a64 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 16 Apr 2022 18:27:29 -0400 Subject: [PATCH 07/16] add boilerplate for adding future checks --- constants/gates.py | 6 ++++++ constants/objectives/condition_bits.py | 5 +++++ data/event_bit.py | 9 ++++++++- event/kefka_tower.py | 16 ++++++++++++++++ wc.py | 5 +++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/constants/gates.py b/constants/gates.py index 266b975c..a384357a 100644 --- a/constants/gates.py +++ b/constants/gates.py @@ -81,6 +81,12 @@ "Auction2", "Fanatic's Tower Dragon", "Fanatic's Tower Leader", + # Add these once events are working + # "KT Left Triad Statue", + # "KT Mid Triad Statue", + # "KT Right Triad Statue", + # "Kefka's Tower Ambush", + # "Kefka's Tower Guardian", "Kefka's Tower Cell Beast", "Kefka's Tower Dragon G", "Kefka's Tower Dragon S", diff --git a/constants/objectives/condition_bits.py b/constants/objectives/condition_bits.py index bc46f131..691f8cee 100644 --- a/constants/objectives/condition_bits.py +++ b/constants/objectives/condition_bits.py @@ -29,9 +29,14 @@ NameBit("Floating Cont. Escape", event_bit.FINISHED_FLOATING_CONTINENT), NameBit("Gau's Father's House", event_bit.RECRUITED_SHADOW_GAU_FATHER_HOUSE), NameBit("Imperial Camp", event_bit.FINISHED_IMPERIAL_CAMP), + # NameBit("Kefka's Tower Ambush", event_bit.DEFEATED_INFERNO), + # NameBit("Kefka's Tower Guardian", event_bit.DEFEATED_GUARDIAN), NameBit("Kefka's Tower Cell Beast", event_bit.DEFEATED_ATMA), NameBit("Kefka's Tower Dragon G", event_bit.DEFEATED_KEFKA_TOWER_DRAGON_G), NameBit("Kefka's Tower Dragon S", event_bit.DEFEATED_KEFKA_TOWER_DRAGON_S), + # NameBit("KT Left Triad Statue", event_bit.DEFEATED_DOOM), + # NameBit("KT Mid Triad Statue", event_bit.DEFEATED_POLTERGEIST), + # NameBit("KT Right Triad Statue", event_bit.DEFEATED_GODDESS), NameBit("Kohlingen Cafe", event_bit.RECRUITED_SHADOW_KOHLINGEN), NameBit("Lete River", event_bit.RODE_RAFT_LETE_RIVER), NameBit("Lone Wolf Chase", event_bit.CHASING_LONE_WOLF7), diff --git a/data/event_bit.py b/data/event_bit.py index b8775c9d..3fab5490 100644 --- a/data/event_bit.py +++ b/data/event_bit.py @@ -1,5 +1,5 @@ # NOTE: (address - 1e80) * 0x8 + bit -# e.g. (1eb7 - 1e80) * 0x8 + 0x1 = 1b9 (airship visible) +# e.g. (1eb7 - 1e80) * 0x8 + 0x1 = 1b9 (airship visible) # (1f43 - 1e80) * 0x8 + 0x3 = 61b (characters on narshe battlefield) DISABLE_SAVE_POINT_TUTORIAL = 0x133 @@ -182,6 +182,13 @@ DEFEATED_PHOENIX_CAVE_DRAGON = 0x120 # custom DEFEATED_FANATICS_TOWER_DRAGON = 0x121 # custom +# KT Battles +DEFEATED_GUARDIAN = 0x0bc +DEFEATED_INFERNO = 0x0bd +DEFEATED_DOOM = 0x072 +DEFEATED_GODDESS = 0x073 +DEFEATED_POLTERGEIST = 0x074 + LEFT_WEIGHT_PUSHED_KEFKA_TOWER = 0x063 RIGHT_WEIGHT_PUSHED_KEFKA_TOWER = 0x064 WEST_PATH_BLOCKED_KEFKA_TOWER = 0x065 # path to doom in switch room diff --git a/event/kefka_tower.py b/event/kefka_tower.py index ba1b1264..b1189266 100644 --- a/event/kefka_tower.py +++ b/event/kefka_tower.py @@ -28,6 +28,11 @@ def mod(self): self.item = self.atma_reward.id self.atma_battle_mod() self.atma_mod() + self.inferno_mod() + self.guardian_mod() + self.doom_mod() + self.goddess_mod() + self.poltergeist_mod() self.inferno_battle_mod() if self.args.fix_boss_skip: @@ -243,6 +248,17 @@ def atma_battle_mod(self): field.InvokeBattle(boss_pack_id), ) + def guardian_mod(self): + pass + def inferno_mod(self): + pass + def doom_mod(self): + pass + def goddess_mod(self): + pass + def poltergeist_mod(self): + pass + def atma_mod(self): src = [ Read(0xc18d3, 0xc18d6), # show save point, set save point npc bit diff --git a/wc.py b/wc.py index a6d8ea49..0383207e 100644 --- a/wc.py +++ b/wc.py @@ -26,5 +26,10 @@ def main(): data.write() memory.write() + +import debugpy +debugpy.listen(5678) +debugpy.wait_for_client() # blocks execution until client is attached + if __name__ == '__main__': main() From d91cea48220d15533d1d88ebbb00272b00ada8bf Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 16 Apr 2022 18:29:28 -0400 Subject: [PATCH 08/16] chore: no longer appnd dragon locations to flags automatically --- args/bosses.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/args/bosses.py b/args/bosses.py index efd0b800..a834faa5 100644 --- a/args/bosses.py +++ b/args/bosses.py @@ -49,8 +49,6 @@ def flags(args): flags += f" -drloc {args.dragon_boss_location}" elif args.mix_bosses_dragons: flags += f" -drloc {BossLocations.MIX}" - else: - flags += f" -drloc {BossLocations.SHUFFLE}" if args.statue_boss_location: flags += f" -stloc {args.statue_boss_location}" From 953a3be75ee2b486fcc0444d825b58a92b9a7c42 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 16 Apr 2022 18:30:09 -0400 Subject: [PATCH 09/16] chore: add EOL --- data/bosses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/bosses.py b/data/bosses.py index 079023af..87eafbdd 100644 --- a/data/bosses.py +++ b/data/bosses.py @@ -280,4 +280,4 @@ class BossLocations: ORIGINAL = "original" SHUFFLE = "shuffle" - ALL = [MIX, ORIGINAL, SHUFFLE] \ No newline at end of file + ALL = [MIX, ORIGINAL, SHUFFLE] From 81bd325682bd6885def9420b5394192205bd90bf Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 16 Apr 2022 18:30:48 -0400 Subject: [PATCH 10/16] chore: remove unused ids from EnemyPacks --- data/enemy_packs.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/data/enemy_packs.py b/data/enemy_packs.py index d04c39db..d2662269 100644 --- a/data/enemy_packs.py +++ b/data/enemy_packs.py @@ -18,11 +18,6 @@ class EnemyPacks(): PHUNBABA3 = 386 DOOM_GAZE = 349 - # statues removed from shuffle pool with -bmbs flag - DOOM=354 - GODDESS=355 - POLTERGEIST=356 - def __init__(self, rom, args, formations): self.rom = rom self.args = args From f4f363ad26e12e50ac1e094ae4833a814ccc7cf4 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sat, 16 Apr 2022 18:31:43 -0400 Subject: [PATCH 11/16] remove dbugpy code --- wc.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/wc.py b/wc.py index 0383207e..a6d8ea49 100644 --- a/wc.py +++ b/wc.py @@ -26,10 +26,5 @@ def main(): data.write() memory.write() - -import debugpy -debugpy.listen(5678) -debugpy.wait_for_client() # blocks execution until client is attached - if __name__ == '__main__': main() From 63809e48912096ae62ded908c55c108b8b49895b Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sun, 17 Apr 2022 08:43:34 -0400 Subject: [PATCH 12/16] Clean up enemy_packs.randomize_event_bosses --- data/enemy_packs.py | 42 +++++++++++++++++++++++---------- objectives/conditions/boss.py | 9 +++---- objectives/conditions/dragon.py | 6 +++-- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/data/enemy_packs.py b/data/enemy_packs.py index d2662269..195a9240 100644 --- a/data/enemy_packs.py +++ b/data/enemy_packs.py @@ -35,7 +35,7 @@ def __init__(self, rom, args, formations): pack = EnemyPack2(pack2_index, self.pack2_data[pack2_index]) self.packs.append(pack) - # Returns the list of all non-statue, non-dragon bosses + # Returns the list of all boss packs that can be used during randomization def _replaceable_bosses(self): dragon_packs = list(bosses.dragon_pack_name) statue_packs = list(bosses.statue_pack_name) @@ -53,21 +53,22 @@ def _replaceable_bosses(self): self.event_boss_replacements[self.DOOM_GAZE] = self.DOOM_GAZE return replaceable + self._replaceable_dragons() + self._replaceable_statues() - # statue locations that become available for the general boss pool + # Statue locations that become available for the general boss pool def _replaceable_statues(self): import random statues = list(bosses.statue_pack_name) random.shuffle(statues) return statues if self.args.statue_boss_location == bosses.BossLocations.MIX else [] - # dragon locations that become available for the general boss pool + # Dragon locations that become available for the general boss pool def _replaceable_dragons(self): import random statues = list(bosses.dragon_pack_name) random.shuffle(statues) return statues if self.args.dragon_boss_location == bosses.BossLocations.MIX else [] - def _handle_statues(self): + # As MIX is handled in the shuffle/random functions, this is for handling the other options + def _handle_original_shuffle_statues(self): statues = list(bosses.statue_pack_name) if self.args.statue_boss_location == bosses.BossLocations.ORIGINAL: @@ -86,7 +87,8 @@ def _handle_statues(self): pass - def _handle_dragons(self): + # As MIX is handled in the shuffle/random functions, this is for handling the other options + def _handle_original_shuffle_dragons(self): dragons = list(bosses.dragon_pack_name) if self.args.dragon_boss_location == bosses.BossLocations.ORIGINAL: for dragon in dragons: @@ -102,6 +104,7 @@ def _handle_dragons(self): else: # boss assignment is handled in the shuffle/random functions pass + def phunbaba3_safety_check(self, bosses_possible): import random @@ -152,13 +155,19 @@ def randomize_event_bosses(self): required_boss_formations = set() required_dragon_formations = set() + required_statue_formations = set() + min_dragon_formations = 0 for objective in objectives: for condition in objective.conditions: if condition.NAME == boss_condition_name: - required_boss_formations.add(bosses.name_formation[condition.boss_name()]) + formation = condition.boss_formation + if formation in list(bosses.statue_formation_name): + required_statue_formations.add(formation) + else: + required_boss_formations.add(formation) elif condition.NAME == dragon_condition_name: - required_dragon_formations.add(bosses.name_formation[condition.dragon_name()]) + required_dragon_formations.add(condition.dragon_formation) elif condition.NAME == dragons_condition_name and condition.count > min_dragon_formations: min_dragon_formations = condition.count @@ -170,11 +179,14 @@ def randomize_event_bosses(self): required_dragon_formations |= set(random_dragon_formations) required_boss_packs = set() + required_statue_packs = set() for pack_id, pack_name in bosses.normal_pack_name.items(): formations = self.get_formations(pack_id) for formation_id in formations: if formation_id in required_boss_formations: required_boss_packs.add(pack_id) + elif formation_id in required_statue_formations: + required_statue_packs.add(pack_id) required_dragon_packs = set() for pack_id, pack_name in bosses.dragon_pack_name.items(): @@ -183,14 +195,21 @@ def randomize_event_bosses(self): if formation_id in required_dragon_formations: required_dragon_packs.add(pack_id) + # randomizing and shuffling bosses_to_replace = self._replaceable_bosses() random.shuffle(bosses_to_replace) for pack in required_boss_packs: self.event_boss_replacements[bosses_to_replace.pop()] = pack - for pack in required_dragon_packs: - self.event_boss_replacements[bosses_to_replace.pop()] = pack + # If statue locations are not mixed, they will always + if self.args.statue_boss_location == bosses.BossLocations.MIX: + for pack in required_statue_packs: + self.event_boss_replacements[bosses_to_replace.pop()] = pack + + if self.args.dragon_boss_location == bosses.BossLocations.MIX: + for pack in required_dragon_packs: + self.event_boss_replacements[bosses_to_replace.pop()] = pack random.shuffle(bosses_to_replace) bosses_possible = self._replaceable_bosses() @@ -321,9 +340,8 @@ def mod(self): else: self.event_boss_replacements = None - self._handle_dragons() - - self._handle_statues() + self._handle_original_shuffle_dragons() + self._handle_original_shuffle_statues() if not self.args.fixed_encounters_original: self.randomize_fixed() diff --git a/objectives/conditions/boss.py b/objectives/conditions/boss.py index 8e465871..7a852dbf 100644 --- a/objectives/conditions/boss.py +++ b/objectives/conditions/boss.py @@ -1,14 +1,15 @@ from objectives.conditions._objective_condition import * from constants.objectives.condition_bits import boss_bit +from data.bosses import name_formation, name_pack class Condition(ObjectiveCondition): NAME = "Boss" def __init__(self, boss): self.boss = boss + self.boss_name = boss_bit[self.boss].name + self.boss_formation = name_formation[self.boss_name] + self.boss_pack = name_pack[self.boss_name] super().__init__(ConditionType.BattleBit, boss_bit[self.boss].bit) def __str__(self): - return super().__str__(self.boss) - - def boss_name(self): - return boss_bit[self.boss].name + return super().__str__(self.boss) \ No newline at end of file diff --git a/objectives/conditions/dragon.py b/objectives/conditions/dragon.py index 90c0ca84..37a36664 100644 --- a/objectives/conditions/dragon.py +++ b/objectives/conditions/dragon.py @@ -1,14 +1,16 @@ from objectives.conditions._objective_condition import * from constants.objectives.condition_bits import dragon_bit +from data.bosses import name_formation, name_pack class Condition(ObjectiveCondition): NAME = "Dragon" def __init__(self, dragon): self.dragon = dragon + self.dragon_name = dragon_bit[self.dragon].name + self.dragon_formation = name_formation[self.dragon_name] + self.dragon_pack = name_pack[self.dragon_name] super().__init__(ConditionType.BattleBit, dragon_bit[self.dragon].bit) def __str__(self): return super().__str__(self.dragon) - def dragon_name(self): - return dragon_bit[self.dragon].name From 134012e5cf8f2b8c6716cf104141f1990c946ec2 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sun, 17 Apr 2022 09:18:03 -0400 Subject: [PATCH 13/16] fix when original bosses with mixed dragon/statues --- args/bosses.py | 21 +++++++++++++++++---- data/enemy_packs.py | 26 ++++++++++++++++---------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/args/bosses.py b/args/bosses.py index a834faa5..7fe1b107 100644 --- a/args/bosses.py +++ b/args/bosses.py @@ -1,6 +1,8 @@ from data.bosses import BossLocations +DEFAULT_DRAGON_PROTOCOL = BossLocations.SHUFFLE +DEFAULT_STATUE_PROTOCOL = BossLocations.MIX def name(): return "Bosses" @@ -14,13 +16,13 @@ def parse(parser): help = "Boss battles randomized") dragons = bosses.add_mutually_exclusive_group() - dragons.add_argument("-drloc", "--dragon-boss-location", default = BossLocations.SHUFFLE, type = str.lower, choices = BossLocations.ALL, + dragons.add_argument("-drloc", "--dragon-boss-location", default = DEFAULT_DRAGON_PROTOCOL, type = str.lower, choices = BossLocations.ALL, help = "Decides which locations the eight dragon encounters can be fought") dragons.add_argument("-bmbd", "--mix-bosses-dragons", action = "store_true", help = "Shuffle/randomize bosses and dragons together") statues = bosses.add_mutually_exclusive_group() - statues.add_argument("-stloc", "--statue-boss-location", default = BossLocations.MIX, type = str.lower, choices = BossLocations.ALL, + statues.add_argument("-stloc", "--statue-boss-location", default = DEFAULT_STATUE_PROTOCOL, type = str.lower, choices = BossLocations.ALL, help = "Decides which locations the three statue encounters can be fought") bosses.add_argument("-srp3", "--shuffle-random-phunbaba3", action = "store_true", @@ -36,6 +38,12 @@ def process(args): if args.mix_bosses_dragons: args.dragon_boss_location = BossLocations.MIX args.mix_bosses_dragons = None + # if neither shuffling or randomizing bosses, and we try to mix the dragons/statues, simply shuffle them instead + vanilla_locations = not (args.boss_battles_shuffle or args.boss_battles_random) + if vanilla_locations and args.dragon_boss_location == BossLocations.MIX: + args.dragon_boss_location = BossLocations.SHUFFLE + if vanilla_locations and args.statue_boss_location == BossLocations.MIX: + args.statue_boss_location = BossLocations.SHUFFLE def flags(args): flags = "" @@ -71,8 +79,13 @@ def options(args): elif args.boss_battles_random: boss_battles = "Random" - dragon_battles = args.dragon_boss_location - statue_battles = args.statue_boss_location + dragon_battles = DEFAULT_DRAGON_PROTOCOL + if args.dragon_boss_location: + dragon_battles = args.dragon_boss_location.capitalize() + + statue_battles = DEFAULT_DRAGON_PROTOCOL + if args.statue_boss_location: + statue_battles = args.statue_boss_location.capitalize() return [ ("Boss Battles", boss_battles), diff --git a/data/enemy_packs.py b/data/enemy_packs.py index 195a9240..61a89618 100644 --- a/data/enemy_packs.py +++ b/data/enemy_packs.py @@ -15,8 +15,9 @@ class EnemyPacks(): ZONE_EATER = 32 VELDT = 255 # placeholder for veldt in wob/wor - PHUNBABA3 = 386 - DOOM_GAZE = 349 + + PHUNBABA3 = bosses.name_pack["Phunbaba 3"] + DOOM_GAZE = bosses.name_pack["Doom Gaze"] def __init__(self, rom, args, formations): self.rom = rom @@ -43,14 +44,19 @@ def _replaceable_bosses(self): replaceable = [boss for boss in boss_packs if boss not in statue_packs and boss not in dragon_packs] if not self.args.shuffle_random_phunbaba3: - replaceable.remove(self.PHUNBABA3) self.event_boss_replacements[self.PHUNBABA3] = self.PHUNBABA3 + if self.PHUNBABA3 in replaceable: + replaceable.remove(self.PHUNBABA3) + if not self.args.doom_gaze_no_escape: # if doom gaze can escape, don't shuffle/randomize him # possibly having multiple doom gazes while trying to keep track of hp is awkward # how would that work with him being in his original spot and the others? How to know when to get bahamut esper? - replaceable.remove(self.DOOM_GAZE) self.event_boss_replacements[self.DOOM_GAZE] = self.DOOM_GAZE + + if self.DOOM_GAZE in replaceable: + replaceable.remove(self.DOOM_GAZE) + return replaceable + self._replaceable_dragons() + self._replaceable_statues() # Statue locations that become available for the general boss pool @@ -129,7 +135,6 @@ def phunbaba3_safety_check(self, bosses_possible): def shuffle_event_bosses(self): import random - self.event_boss_replacements = {} bosses_to_replace = self._replaceable_bosses() bosses_possible = bosses_to_replace.copy() @@ -144,8 +149,6 @@ def randomize_event_bosses(self): import args, random, objectives from constants.objectives.conditions import names as possible_condition_names - self.event_boss_replacements = {} - boss_condition_name = "Boss" dragon_condition_name = "Dragon" dragons_condition_name = "Dragons" @@ -321,7 +324,7 @@ def has_enemy(self, pack_id, enemy_id): def get_event_boss_replacement(self, original_boss_name): original_boss_id = self.get_id(original_boss_name) - if self.event_boss_replacements is None: + if not original_boss_id in self.event_boss_replacements: return original_boss_id return self.event_boss_replacements[original_boss_id] @@ -333,12 +336,15 @@ def remove_extra_formations(self): pack.extra_formations[formation_index] = False def mod(self): + self.event_boss_replacements = { + self.DOOM_GAZE: self.DOOM_GAZE, + self.PHUNBABA3: self.PHUNBABA3 + } + if self.args.boss_battles_shuffle: self.shuffle_event_bosses() elif self.args.boss_battles_random: self.randomize_event_bosses() - else: - self.event_boss_replacements = None self._handle_original_shuffle_dragons() self._handle_original_shuffle_statues() From cd4e48c58234ab87055e2711c00a115c37b08f13 Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sun, 17 Apr 2022 12:24:38 -0400 Subject: [PATCH 14/16] now exclude statues when not mix from normal encs --- data/enemy_formations.py | 6 ++++-- data/enemy_packs.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/data/enemy_formations.py b/data/enemy_formations.py index 22765e34..e6d334be 100644 --- a/data/enemy_formations.py +++ b/data/enemy_formations.py @@ -11,8 +11,10 @@ class EnemyFormations(): ENEMIES_END = 0xf83bf ENEMIES_SIZE = 15 - PHUNBABA3 = 422 - DOOM_GAZE = 463 + PHUNBABA3 = bosses.name_formation["Phunbaba 3"] + DOOM_GAZE = bosses.name_formation["Doom Gaze"] + ALL_STATUES = list(bosses.statue_formation_name) + ALL_DRAGONS = list(bosses.dragon_formation_name) PRESENTER = 433 COLISEUM = 575 diff --git a/data/enemy_packs.py b/data/enemy_packs.py index 61a89618..6166c516 100644 --- a/data/enemy_packs.py +++ b/data/enemy_packs.py @@ -231,6 +231,18 @@ def randomize_packs(self, packs, boss_percent, no_phunbaba3 = False): else: exclude_bosses.append(self.formations.DOOM_GAZE) + # We only want statues and dragons to show up when they are intentionally + # mixed into the general boss pool + # Statues are currently seen as normal bosses in regards to scaling, + # but the long-term goal is to add their own scaling option so it + # makes most sense to begin treating these similarly to dragons. + if self.args.statue_boss_location != bosses.BossLocations.MIX: + exclude_bosses += self.formations.ALL_STATUES + + # This is more futureproofing in the event we consolidate dragons in the future + if self.args.dragon_boss_location != bosses.BossLocations.MIX: + exclude_bosses += self.formations.ALL_DRAGONS + import random for pack_id in packs: if random.random() < boss_percent: From 89a6157bd80ed413771289e0924a535796ed8cfe Mon Sep 17 00:00:00 2001 From: kielbasiago <95580337+kielbasiago@users.noreply.github.com> Date: Fri, 27 May 2022 17:52:39 -0400 Subject: [PATCH 15/16] add KT bosses to condition checks (#2) Preview: https://youtu.be/wgBJHPq3p6o (Just me clearing KT while playing at 200-400%) Added the following KT boss locations as objective conditions: - Kefka's Tower Ambush - Inferno - Bit 59 - Kefka's Tower Guardian - Guardian - Bit 60 - KT Left Triad Statue - Doom - Bit 61 - KT Mid Triad Statue - Poltergeist - Bit 62 - KT Right Triad Statue - Goddess - Bit 63 ## Testing Used the following flags to test the five encounters: `-oa 40.1.1.11.59 -ob 40.1.1.11.60 -oc 40.1.1.11.61 -od 40.1.1.11.62 -oe 40.1.1.11.63` --- constants/gates.py | 6 --- constants/objectives/condition_bits.py | 13 +++--- event/kefka_tower.py | 60 +++++++++++++++++++++++--- 3 files changed, 63 insertions(+), 16 deletions(-) diff --git a/constants/gates.py b/constants/gates.py index a384357a..266b975c 100644 --- a/constants/gates.py +++ b/constants/gates.py @@ -81,12 +81,6 @@ "Auction2", "Fanatic's Tower Dragon", "Fanatic's Tower Leader", - # Add these once events are working - # "KT Left Triad Statue", - # "KT Mid Triad Statue", - # "KT Right Triad Statue", - # "Kefka's Tower Ambush", - # "Kefka's Tower Guardian", "Kefka's Tower Cell Beast", "Kefka's Tower Dragon G", "Kefka's Tower Dragon S", diff --git a/constants/objectives/condition_bits.py b/constants/objectives/condition_bits.py index 691f8cee..8e45eebe 100644 --- a/constants/objectives/condition_bits.py +++ b/constants/objectives/condition_bits.py @@ -29,14 +29,9 @@ NameBit("Floating Cont. Escape", event_bit.FINISHED_FLOATING_CONTINENT), NameBit("Gau's Father's House", event_bit.RECRUITED_SHADOW_GAU_FATHER_HOUSE), NameBit("Imperial Camp", event_bit.FINISHED_IMPERIAL_CAMP), - # NameBit("Kefka's Tower Ambush", event_bit.DEFEATED_INFERNO), - # NameBit("Kefka's Tower Guardian", event_bit.DEFEATED_GUARDIAN), NameBit("Kefka's Tower Cell Beast", event_bit.DEFEATED_ATMA), NameBit("Kefka's Tower Dragon G", event_bit.DEFEATED_KEFKA_TOWER_DRAGON_G), NameBit("Kefka's Tower Dragon S", event_bit.DEFEATED_KEFKA_TOWER_DRAGON_S), - # NameBit("KT Left Triad Statue", event_bit.DEFEATED_DOOM), - # NameBit("KT Mid Triad Statue", event_bit.DEFEATED_POLTERGEIST), - # NameBit("KT Right Triad Statue", event_bit.DEFEATED_GODDESS), NameBit("Kohlingen Cafe", event_bit.RECRUITED_SHADOW_KOHLINGEN), NameBit("Lete River", event_bit.RODE_RAFT_LETE_RIVER), NameBit("Lone Wolf Chase", event_bit.CHASING_LONE_WOLF7), @@ -73,6 +68,14 @@ NameBit("Zozo Tower", event_bit.GOT_ZOZO_REWARD), ] +check_bit += [ # Index + NameBit("Kefka's Tower Ambush", event_bit.DEFEATED_INFERNO), # 59 + NameBit("Kefka's Tower Guardian", event_bit.DEFEATED_GUARDIAN), # 60 + NameBit("KT Left Triad Statue", event_bit.DEFEATED_DOOM), # 61 + NameBit("KT Mid Triad Statue", event_bit.DEFEATED_POLTERGEIST), # 62 + NameBit("KT Right Triad Statue", event_bit.DEFEATED_GODDESS), # 63 +] + quest_bit = [ NameBit("Defeat Sealed Cave Ninja", event_bit.DEFEATED_NINJA_CAVE_TO_SEALED_GATE), NameBit("Help Injured Lad", event_bit.HELPED_INJURED_LAD), diff --git a/event/kefka_tower.py b/event/kefka_tower.py index b1189266..4b31ec08 100644 --- a/event/kefka_tower.py +++ b/event/kefka_tower.py @@ -248,16 +248,66 @@ def atma_battle_mod(self): field.InvokeBattle(boss_pack_id), ) + # Copy no less than 4 bytes between start_target and end_target + # This will be called after one of the kt encounters has completed, but just prior to finishing the check + def kt_encounter_objective_mod(self, boss_name, bit, start_target, end_target, description): + src = Read(start_target, end_target) + src += [ + field.SetEventBit(bit), + field.CheckObjectives(), + field.Return(), + ] + post_battle = Write(Bank['CC'], src, f"{boss_name} post-battle. 1) Set event bit. 2) Finish check") + + space = Reserve(start_target, end_target, description, asm.NOP()) + space.write([ + field.Call(post_battle.start_address) + ]) + def guardian_mod(self): - pass + self.kt_encounter_objective_mod( + "Guardian", + event_bit.DEFEATED_GUARDIAN, + 0xc186c, + 0xc186f, + "Guardian battle post-script, wait for fade, set bit", + ) + def inferno_mod(self): - pass + self.kt_encounter_objective_mod( + "Inferno", + event_bit.DEFEATED_INFERNO, + 0xc18ae, + 0xc18b1, + "Inferno battle post-script, fade in, wait, set bit", + ) + def doom_mod(self): - pass + self.kt_encounter_objective_mod( + "Doom", + event_bit.DEFEATED_DOOM, + 0xc16f0, + 0xc16f3, + "Doom battle post-script, Hide NPC 5, set npc bit", + ) + def goddess_mod(self): - pass + self.kt_encounter_objective_mod( + "Goddess", + event_bit.DEFEATED_GODDESS, + 0xc1730, + 0xc1733, + "Goddess battle post-script, Hide NPC 2, set npc bit", + ) + def poltergeist_mod(self): - pass + self.kt_encounter_objective_mod( + "Goddess", + event_bit.DEFEATED_POLTERGEIST, + 0xc1786, + 0xc1789, + "Poltergeist battle post-script, Hide NPCs, set npc bit", + ) def atma_mod(self): src = [ From 24d5994dff952aa717f92aeb836fffe7f44ed42d Mon Sep 17 00:00:00 2001 From: Kiel <95580337+kielbasiago@users.noreply.github.com> Date: Sun, 12 Jun 2022 18:20:36 -0400 Subject: [PATCH 16/16] fix initialization of exclude_bosses --- data/enemy_packs.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/data/enemy_packs.py b/data/enemy_packs.py index 6166c516..266dd3ad 100644 --- a/data/enemy_packs.py +++ b/data/enemy_packs.py @@ -222,14 +222,11 @@ def randomize_event_bosses(self): self.phunbaba3_safety_check(bosses_possible) def randomize_packs(self, packs, boss_percent, no_phunbaba3 = False): - exclude_bosses = None + exclude_bosses = [] if no_phunbaba3 or not self.args.shuffle_random_phunbaba3: - exclude_bosses = [self.formations.PHUNBABA3] + exclude_bosses += [self.formations.PHUNBABA3] if not self.args.doom_gaze_no_escape: - if exclude_bosses is None: - exclude_bosses = [self.formations.DOOM_GAZE] - else: - exclude_bosses.append(self.formations.DOOM_GAZE) + exclude_bosses += [self.formations.DOOM_GAZE] # We only want statues and dragons to show up when they are intentionally # mixed into the general boss pool