From 738a9ebb7d5a04f916f80114bb81a27bff1a9b2c Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Mon, 26 Feb 2024 02:30:20 -0500 Subject: [PATCH] TUNIC: Misc Logic Changes, Additions (#2856) * Add nmg boss scav kill * Add boss quick kills * Fix name of orb * Remove getting into zig with ice grapple * Remove connection from quarry to zig * Add a few missing dependent regions * Separate the atoll statue and portal pad so that it doesn't assume you can get from one to the other without prayer --- worlds/tunic/er_data.py | 27 ++++++++++++++++++++------- worlds/tunic/er_rules.py | 12 ++++++++++-- worlds/tunic/regions.py | 2 +- worlds/tunic/rules.py | 5 ++--- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/worlds/tunic/er_data.py b/worlds/tunic/er_data.py index d76af1133906..7678d77fe034 100644 --- a/worlds/tunic/er_data.py +++ b/worlds/tunic/er_data.py @@ -211,7 +211,7 @@ def scene_destination(self) -> str: # full, nonchanging name to interpret by th destination="Shop_"), Portal(name="Atoll to Far Shore", region="Ruined Atoll Portal", destination="Transit_teleporter_atoll"), - Portal(name="Atoll Statue Teleporter", region="Ruined Atoll Portal", + Portal(name="Atoll Statue Teleporter", region="Ruined Atoll Statue", destination="Library Exterior_"), Portal(name="Frog Stairs Eye Entrance", region="Ruined Atoll", destination="Frog Stairs_eye"), @@ -600,6 +600,7 @@ class Hint(IntEnum): "Ruined Atoll Lower Entry Area": RegionInfo("Atoll Redux"), "Ruined Atoll Frog Mouth": RegionInfo("Atoll Redux"), "Ruined Atoll Portal": RegionInfo("Atoll Redux"), + "Ruined Atoll Statue": RegionInfo("Atoll Redux"), "Frog's Domain Entry": RegionInfo("Frog Stairs"), "Frog's Domain": RegionInfo("frog cave main", hint=Hint.region), "Frog's Domain Back": RegionInfo("frog cave main", hint=Hint.scene), @@ -749,6 +750,8 @@ class Hint(IntEnum): ["Forest Belltower Main", "Forest Belltower Lower"], ("East Forest", "East Forest Dance Fox Spot", "East Forest Portal"): ["East Forest", "East Forest Dance Fox Spot", "East Forest Portal"], + ("Guard House 1 East", "Guard House 1 West"): + ["Guard House 1 East", "Guard House 1 West"], ("Forest Grave Path Main", "Forest Grave Path Upper"): ["Forest Grave Path Main", "Forest Grave Path Upper", "Forest Grave Path by Grave", "Forest Hero's Grave"], ("Forest Grave Path by Grave", "Forest Hero's Grave"): @@ -762,8 +765,10 @@ class Hint(IntEnum): ("West Garden", "West Garden Laurels Exit", "West Garden after Boss", "West Garden Hero's Grave"): ["West Garden", "West Garden Laurels Exit", "West Garden after Boss", "West Garden Hero's Grave"], ("West Garden Portal", "West Garden Portal Item"): ["West Garden Portal", "West Garden Portal Item"], - ("Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal"): - ["Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal"], + ("Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal", + "Ruined Atoll Statue"): + ["Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal", + "Ruined Atoll Statue"], ("Frog's Domain",): ["Frog's Domain", "Frog's Domain Back"], ("Library Exterior Ladder", "Library Exterior Tree"): @@ -842,6 +847,8 @@ class Hint(IntEnum): ["Forest Belltower Main", "Forest Belltower Lower"], ("East Forest", "East Forest Dance Fox Spot", "East Forest Portal"): ["East Forest", "East Forest Dance Fox Spot", "East Forest Portal"], + ("Guard House 1 East", "Guard House 1 West"): + ["Guard House 1 East", "Guard House 1 West"], ("Forest Grave Path Main", "Forest Grave Path Upper", "Forest Grave Path by Grave", "Forest Hero's Grave"): ["Forest Grave Path Main", "Forest Grave Path Upper", "Forest Grave Path by Grave", "Forest Hero's Grave"], ("Beneath the Well Front", "Beneath the Well Main", "Beneath the Well Back"): @@ -854,8 +861,10 @@ class Hint(IntEnum): "West Garden Portal", "West Garden Portal Item"): ["West Garden", "West Garden Laurels Exit", "West Garden after Boss", "West Garden Hero's Grave", "West Garden Portal", "West Garden Portal Item"], - ("Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal"): - ["Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal"], + ("Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal", + "Ruined Atoll Statue"): + ["Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal", + "Ruined Atoll Statue"], ("Frog's Domain",): ["Frog's Domain", "Frog's Domain Back"], ("Library Exterior Ladder", "Library Exterior Tree"): @@ -934,6 +943,8 @@ class Hint(IntEnum): ["Forest Belltower Main", "Forest Belltower Lower"], ("East Forest", "East Forest Dance Fox Spot", "East Forest Portal"): ["East Forest", "East Forest Dance Fox Spot", "East Forest Portal"], + ("Guard House 1 East", "Guard House 1 West"): + ["Guard House 1 East", "Guard House 1 West"], # can use laurels, ice grapple, or ladder storage to traverse ("Forest Grave Path Main", "Forest Grave Path Upper", "Forest Grave Path by Grave", "Forest Hero's Grave"): ["Forest Grave Path Main", "Forest Grave Path Upper", "Forest Grave Path by Grave", "Forest Hero's Grave"], @@ -948,8 +959,10 @@ class Hint(IntEnum): "West Garden Portal", "West Garden Portal Item"): ["West Garden", "West Garden Laurels Exit", "West Garden after Boss", "West Garden Hero's Grave", "West Garden Portal", "West Garden Portal Item"], - ("Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal"): - ["Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal"], + ("Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal", + "Ruined Atoll Statue"): + ["Ruined Atoll", "Ruined Atoll Lower Entry Area", "Ruined Atoll Frog Mouth", "Ruined Atoll Portal", + "Ruined Atoll Statue"], ("Frog's Domain",): ["Frog's Domain", "Frog's Domain Back"], ("Library Exterior Ladder", "Library Exterior Tree"): diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index 2f9604c1035a..a7d0543c3f17 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -295,6 +295,12 @@ def set_er_region_rules(world: "TunicWorld", ability_unlocks: Dict[str, int], re regions["Ruined Atoll Portal"].connect( connecting_region=regions["Ruined Atoll"]) + regions["Ruined Atoll"].connect( + connecting_region=regions["Ruined Atoll Statue"], + rule=lambda state: has_ability(state, player, prayer, options, ability_unlocks)) + regions["Ruined Atoll Statue"].connect( + connecting_region=regions["Ruined Atoll"]) + regions["Frog's Domain"].connect( connecting_region=regions["Frog's Domain Back"], rule=lambda state: state.has(grapple, player)) @@ -944,10 +950,12 @@ def set_er_location_rules(world: "TunicWorld", ability_unlocks: Dict[str, int]) # Bosses set_rule(multiworld.get_location("Fortress Arena - Siege Engine/Vault Key Pickup", player), lambda state: has_sword(state, player)) + # nmg - kill Librarian with a lure, or gun I guess set_rule(multiworld.get_location("Librarian - Hexagon Green", player), - lambda state: has_sword(state, player)) + lambda state: has_sword(state, player) or options.logic_rules) + # nmg - kill boss scav with orb + firecracker, or similar set_rule(multiworld.get_location("Rooted Ziggurat Lower - Hexagon Blue", player), - lambda state: has_sword(state, player)) + lambda state: has_sword(state, player) or (state.has(grapple, player) and options.logic_rules)) # Swamp set_rule(multiworld.get_location("Cathedral Gauntlet - Gauntlet Reward", player), diff --git a/worlds/tunic/regions.py b/worlds/tunic/regions.py index 5d5248f210d6..70204c639733 100644 --- a/worlds/tunic/regions.py +++ b/worlds/tunic/regions.py @@ -16,7 +16,7 @@ "Eastern Vault Fortress": {"Beneath the Vault"}, "Beneath the Vault": {"Eastern Vault Fortress"}, "Quarry Back": {"Quarry"}, - "Quarry": {"Lower Quarry", "Rooted Ziggurat"}, + "Quarry": {"Lower Quarry"}, "Lower Quarry": {"Rooted Ziggurat"}, "Rooted Ziggurat": set(), "Swamp": {"Cathedral"}, diff --git a/worlds/tunic/rules.py b/worlds/tunic/rules.py index 6e5639b4ebaf..b3dd0b683220 100644 --- a/worlds/tunic/rules.py +++ b/worlds/tunic/rules.py @@ -131,8 +131,6 @@ def set_region_rules(world: "TunicWorld", ability_unlocks: Dict[str, int]) -> No lambda state: has_mask(state, player, options) multiworld.get_entrance("Lower Quarry -> Rooted Ziggurat", player).access_rule = \ lambda state: state.has(grapple, player) and has_ability(state, player, prayer, options, ability_unlocks) - multiworld.get_entrance("Quarry -> Rooted Ziggurat", player).access_rule = \ - lambda state: has_ice_grapple_logic(False, state, player, options, ability_unlocks) multiworld.get_entrance("Swamp -> Cathedral", player).access_rule = \ lambda state: state.has(laurels, player) and has_ability(state, player, prayer, options, ability_unlocks) \ or has_ice_grapple_logic(False, state, player, options, ability_unlocks) @@ -312,8 +310,9 @@ def set_location_rules(world: "TunicWorld", ability_unlocks: Dict[str, int]) -> lambda state: state.has(laurels, player)) set_rule(multiworld.get_location("Quarry - [West] Upper Area Bombable Wall", player), lambda state: has_mask(state, player, options)) + # nmg - kill boss scav with orb + firecracker, or similar set_rule(multiworld.get_location("Rooted Ziggurat Lower - Hexagon Blue", player), - lambda state: has_sword(state, player)) + lambda state: has_sword(state, player) or (state.has(grapple, player) and options.logic_rules)) # Swamp set_rule(multiworld.get_location("Cathedral Gauntlet - Gauntlet Reward", player),