From 2abfa5dc55092d5baf2a6632913f8463667f433a Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 31 May 2026 01:43:18 +0200 Subject: [PATCH 01/10] Start Nothern Ryoshima Coast, skipping all the checks that require Orca/beating the dragon for now --- worlds/okamihd/Enums/OkamiEnemies.py | 3 + worlds/okamihd/Enums/RegionNames.py | 14 ++- worlds/okamihd/RegionsData/__init__.py | 8 +- worlds/okamihd/RegionsData/r202.py | 9 +- worlds/okamihd/RegionsData/rf09.py | 2 +- worlds/okamihd/RegionsData/rf0a.py | 14 ++- worlds/okamihd/RegionsData/rf0c.py | 147 +++++++++++++++++++++++++ worlds/okamihd/Rules.py | 30 +++-- worlds/okamihd/Types.py | 1 + 9 files changed, 206 insertions(+), 22 deletions(-) create mode 100644 worlds/okamihd/RegionsData/rf0c.py diff --git a/worlds/okamihd/Enums/OkamiEnemies.py b/worlds/okamihd/Enums/OkamiEnemies.py index 71aeade71640..80a6908dacff 100644 --- a/worlds/okamihd/Enums/OkamiEnemies.py +++ b/worlds/okamihd/Enums/OkamiEnemies.py @@ -50,6 +50,9 @@ class OkamiEnemies(Enum): THUNDER_DOOM_MIRROR = EnnemyData(0x5d, "Thunder Doom Mirror", 2) WIND_DOOM_MIRROR = EnnemyData(0x5c, "Wind Doom Mirror", 2, required_techniques=[BrushTechniques.VEIL_OF_MIST]) BLIGHT = EnnemyData(0x7c, "Blight", 2, requires_slash=True) + THUNDER_EAR=EnnemyData(0x55,"Thunder Ear",2) + EARTH_NOSE = EnnemyData(0x54, "Earth Nose", 2,required_techniques=[BrushTechniques.VEIL_OF_MIST]) + BLUE_CYCLOPS = EnnemyData(0x29,"Blue Cyclops",2) @staticmethod def list(): diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index aafc90b9792f..f7f5998cfff9 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -52,7 +52,7 @@ class RegionNames(StrEnum): ## AGATA FOREST CURSED_AGATA_FOREST = "Cursed Agata Forest" - AGATA_COMMON_LOGIC= "Agata Forest (Common)" + AGATA_COMMON_LOGIC = "Agata Forest (Common)" AGATA_FOREST_WAKA = "Agata Forest (Pre-waka fight)" AGATA_FOREST = "Agata Forest" AGATA_FOREST_TAKA = "Agata Forest (Behind Bridge to Taka Pass)" @@ -69,7 +69,7 @@ class RegionNames(StrEnum): ## TAKA PASS CURSED_TAKA_PASS = "Curesd Taka Pass" - TAKA_COMMON_LOGIC="Taka Pass (Common)" + TAKA_COMMON_LOGIC = "Taka Pass (Common)" CURSED_TAKA_PASS_WAKA = "Cursed Taka Pass (Waka Fight)" CURSED_TAKA_PASS_CAVE = "Cursed Taka Pass (Cave)" CURSED_TAKA_PASS_GUARDIAN_SAPLING = "Cursed Taka Pass (Guardian Sapling)" @@ -213,6 +213,15 @@ class RegionNames(StrEnum): IMPERIAL_PALACE_WEST_BEAM = "Imperial Palace (Small Size - West Beam)" IMPERIAL_PALACE_INSIDE_EMPEROR = "Imperial Palace (Small Size - Inside the Emperor's Body)" + ## Northern Ryoshima Coast + NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT = "Nothern Rysohima Coast (Mandatory Fight)" + NORTHERN_RYOSHIMA_COAST = "Nothern Rysohima Coast" + NORTHERN_RYOSHIMA_COAST_MIST_WARP = "Northern Ryoshima Coast (Secret Mist Warp Area)" + NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER = "Northern Ryoshima Coast (Watcher's cape mandatory Encounter)" + NORTHERN_RYOSHIMA_COAST_WATCHERS = "Northern Ryoshima Coast (Watcher's cape)" + NORTHERN_RYOSHIMA_COAST_SAPLING = "Northern Ryoshima Coast (Guardian Sapling Island)" + NORTHERN_RYOSHIMA_COAST_TOMB = "Northern Ryoshima Coast (Tomb Cave)" + # SPECIAL REGIONS # Special Hub regions to handle warps MIST_WARP_HUB = "Mist Warp Hub" @@ -248,6 +257,7 @@ class MapIds(Enum): HEALED_TAKA = 0xF08 CURSED_RYOSHIMA = 0xF09 HEALED_RYOSHIMA = 0xF0A + NORTHERN_RYOSHIMA = 0xF0C class MapIndexes(Enum): diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 845311483359..b062d6cd1e5f 100644 --- a/worlds/okamihd/RegionsData/__init__.py +++ b/worlds/okamihd/RegionsData/__init__.py @@ -1,7 +1,7 @@ from typing import TYPE_CHECKING from . import menu, r100, r122, r101, r102, r103, r104, rf01, rf02, rf03, rf04, rf07, rf08, r108, r109, r107, r10e, \ - r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202,r10a + r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c if TYPE_CHECKING: from .. import OkamiWorld @@ -36,6 +36,7 @@ **rf08.exits, **rf09.exits, **rf0a.exits, + **rf0c.exits, } okami_locations = { @@ -67,6 +68,7 @@ **rf08.locations, **rf09.locations, **rf0a.locations, + **rf0c.locations, } okami_events = { @@ -98,6 +100,7 @@ **rf08.events, **rf09.events, **rf0a.events, + **rf0c.events, } # Shop locations are separate because they're conditionally created based on RandomizeShops @@ -112,6 +115,7 @@ **getattr(rf04, 'shop_locations', {}), **getattr(rf08, 'shop_locations', {}), **getattr(rf0a, 'shop_locations', {}), + **getattr(rf0c, 'shop_locations', {}) } okami_warps = { @@ -124,5 +128,5 @@ **rf04.warps, **rf08.warps, **rf0a.warps, - + **rf0c.warps } diff --git a/worlds/okamihd/RegionsData/r202.py b/worlds/okamihd/RegionsData/r202.py index 6430ab247db1..ad32b2096b25 100644 --- a/worlds/okamihd/RegionsData/r202.py +++ b/worlds/okamihd/RegionsData/r202.py @@ -1,5 +1,6 @@ from typing import TYPE_CHECKING +from BaseClasses import LocationProgressType from ..CheckIds import container_check_id, brush_check_id, shop_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType @@ -16,7 +17,11 @@ } events = { RegionNames.HIMIKO_PALACE:{ - "Himiko's Palace - Cross sea of fire": EventData(required_items_events=["Fire Tablet"]) + "Himiko's Palace - Cross sea of fire": EventData(required_items_events=["Fire Tablet"]) + }, + RegionNames.HIMIKO_CHAMBERS:{ + # Vanilla event that opens N. Ryoshima Coast - to replace with something else when needed. + "Himiko's Palace - Hear Himiko's request": EventData() } } locations = { @@ -28,6 +33,6 @@ }, # Special check RegionNames.HIMIKO_CHAMBERS:{ - "Himiko's Palace - Get Border Key from Queen Himiko":LocData(1000) + "Himiko's Palace - Get Border Key from Queen Himiko":LocData(1000,progress_type=LocationProgressType.EXCLUDED) } } diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py index 78936fd4e2a9..061fa007d041 100644 --- a/worlds/okamihd/RegionsData/rf09.py +++ b/worlds/okamihd/RegionsData/rf09.py @@ -7,7 +7,7 @@ from ..Enums.RegionNames import RegionNames if TYPE_CHECKING: - pass + from .. import OkamiWorld exits = { RegionNames.CURSED_RYOSHIMA_COAST: [ diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 04635faf83d9..be1ae7564da1 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -10,7 +10,7 @@ from ..Enums.RegionNames import RegionNames, MapIds if TYPE_CHECKING: - pass + from .. import OkamiWorld exits = { RegionNames.RYOSHIMA_COAST: [ @@ -44,11 +44,12 @@ RegionNames.RYOSHIMA_COAST_SEIAN: [ # Special Handling for the encounter around Seian, city entrance as the enemies inside require galestrom to be beaten. ExitData(RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER, one_way=True, loading_screen=False), - ExitData(RegionNames.SEIAN_CITY_COMMONERS_DRY) + ExitData(RegionNames.SEIAN_CITY_COMMONERS_DRY), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT, has_events=["Ryoshima Coast - Open Door to North Ryoshima Coast"],one_way=True) ], RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON: [ ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False,needs_long_swim=True), - ExitData(RegionNames.SUNKEN_SHIP_ENTRANCE) + ExitData(RegionNames.SUNKEN_SHIP_ENTRANCE,one_way=True) ], RegionNames.RYOSHIMA_COAST_WEST_PIER: [ ExitData(RegionNames.RYOSHIMA_COAST_SEA, loading_screen=False) @@ -62,8 +63,8 @@ "Ryoshima Coast - Open Lunar Lagoon": EventData(required_items_events=["Holy Eagle"], required_brush_techniques=[BrushTechniques.CRESCENT]), "Ryoshima Coast - Open Shortcut To Mme Fawn's": EventData(), - # FIXME: Fill Enemies - "Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance": EventData(mandatory_enemies=[]) + "Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance": EventData(mandatory_enemies=[OkamiEnemies.ICE_LIPS,OkamiEnemies.THUNDER_EAR]), + }, RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: { "Ryoshima Coast - Climb back to main area": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT]) @@ -75,6 +76,9 @@ }, RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER: { "Ryoshima Coast - Mandatory Ubume Encounter": EventData(mandatory_enemies=[OkamiEnemies.UBUME]) + }, + RegionNames.RYOSHIMA_COAST_SEIAN:{ + "Ryoshima Coast - Open Door to North Ryoshima Coast":EventData(required_items_events=["Himiko's Palace - Hear Himiko's request"]) } } locations = { diff --git a/worlds/okamihd/RegionsData/rf0c.py b/worlds/okamihd/RegionsData/rf0c.py new file mode 100644 index 000000000000..5af12ddc7752 --- /dev/null +++ b/worlds/okamihd/RegionsData/rf0c.py @@ -0,0 +1,147 @@ +from typing import TYPE_CHECKING + +from rule_builder.rules import True_, Has, HasAny, Or +from ..CheckIds import shop_check_id, container_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Enums.WarpType import WarpType +from ..Rules import long_swim_rule, n_ryoshima_guardian_sapling_rule +from ..Types import ExitData, EventData, LocData, WarpData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT: [ + ExitData(RegionNames.RYOSHIMA_COAST_SEIAN, one_way=True, loading_screen=False, + has_events=["Northern Ryoshima Coast - Mandatory Earth Nose Fight"]), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False, + has_events=["Northern Ryoshima Coast - Mandatory Earth Nose Fight"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT, one_way=True, loading_screen=False), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER, one_way=True, loading_screen=False), + # Special rule to account for Orca + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_SAPLING, loading_screen=False, + special_rule=n_ryoshima_guardian_sapling_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB, loading_screen=False, one_way=True, + has_events=["Northern Ryoshima Coast - Climb to Tomb Cave"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS, one_way=True, loading_screen=False, + has_events=["Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False) + ] +} +events = { + RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT: { + "Northern Ryoshima Coast - Mandatory Earth Nose Fight": EventData(mandatory_enemies=[OkamiEnemies.EARTH_NOSE]) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST: { + "Northern Ryoshima Coast - Unlock Warp Points": EventData(), + ## Needs Holy eagle or to be able to swim to access the statue + "Northern Ryoshima Coast - Climb to Watcher's Cape": EventData( + required_brush_techniques=[BrushTechniques.CATWALK], special_rule=Or(long_swim_rule, Has("Holy Eagle"))), + "Northern Ryoshima Coast - Climb to Tomb Cave": EventData(required_brush_techniques=[BrushTechniques.CATWALK]), + "Northern Ryoshima Coast - Meet Orca": EventData(required_brush_techniques=[BrushTechniques.SUNRISE],event_item_name="Orca"), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: { + "Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape": EventData( + mandatory_enemies=[OkamiEnemies.BLUE_CYCLOPS]), + } +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST: { + "Northern Ryoshima Coast - Buried Chest southwest on mainland": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 3), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Buried Chest southwest of Umi's restaurant": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 7), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Buried Chest on eastern beach mainland": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 8), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Buried Chest near Yoichi": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 18), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Buried Chest near Tomb cave entrance": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 22), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - West underwater clam near Umi's restaurant 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 26), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - West underwater clam near Umi's restaurant 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 27), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - East underwater clam near Umi's restaurant": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 28), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam near mainland east beach 1 ": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 29), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam near mainland east beach 2 ": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 30), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam near mainland east beach 3 ": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 31), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam near mainland east beach 4 ": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 32), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater chest in river 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 36), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater chest in river 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 37), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater chest in river 3": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 39), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater chest in river 4": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 38), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Buried Chest south of ultimate origin mirror": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 42), type=LocationType.BURIED_CHEST), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS: { + "Northern Ryoshima Coast - Buried Chest in watcher's cape": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 5), type=LocationType.BURIED_CHEST) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_SAPLING: { + "Northern Ryoshima Coast - Buried Chest on guardian sapling island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 9), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Freestanding Chest on guardian sapling island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 67)) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB: { + "Northern Ryoshima Coast - Chest in Tomb Cave 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 19)), + "Northern Ryoshima Coast - Chest in Tomb Cave 3": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 20)), + "Northern Ryoshima Coast - Chest in Tomb Cave 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 21)) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_MIST_WARP: { + "Northern Ryoshima Coast - Chest in secret Mist Warp Area": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 33)) + } +} +warps = { + RegionNames.NORTHERN_RYOSHIMA_COAST: [ + WarpData(WarpType.MIST_WARP, Has("Northern Ryoshima Coast - Unlock Warp Points"), + Has("Northern Ryoshima Coast - Unlock Warp Points")), + WarpData(WarpType.MERMAID_SPRING, Has("Northern Ryoshima Coast - Unlock Warp Points"), + Has("Northern Ryoshima Coast - Unlock Warp Points")) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_MIST_WARP: [ + WarpData(WarpType.MIST_WARP, Has("Northern Ryoshima Coast - Unlock Warp Points"), + Has("Northern Ryoshima Coast - Unlock Warp Points")) + ] +} +shop_locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST: { + "Northern Ryoshima Coast - Shop Slot 1": LocData(shop_check_id(11, 0), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 2": LocData(shop_check_id(11, 1), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 3": LocData(shop_check_id(11, 2), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 4": LocData(shop_check_id(11, 3), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 5": LocData(shop_check_id(11, 4), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 6": LocData(shop_check_id(11, 5), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 7": LocData(shop_check_id(11, 6), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 8": LocData(shop_check_id(11, 7), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 9": LocData(shop_check_id(11, 8), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 10": LocData(shop_check_id(11, 9), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 11": LocData(shop_check_id(11, 10), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 12": LocData(shop_check_id(11, 11), type=LocationType.SHOP), + } +} diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index 8d9cc9381c69..e65428ff1943 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -12,13 +12,12 @@ if TYPE_CHECKING: from . import OkamiWorld +long_swim_rule: Rule = HasAny("Water Tablet", BrushTechniques.GREENSPROUT_WATERLILY) -has_portable_fire_source_strict:Rule= And(Or(Has(DivineInstruments.SOLAR_FLARE.value.item_name), - Has("Progressive Mirror", 4)), Has(BrushTechniques.INFERNO)) - - -has_portable_fire_source: Rule = Or(has_portable_fire_source_strict,Has(BrushTechniques.FIREBURST)) +has_portable_fire_source_strict: Rule = And(Or(Has(DivineInstruments.SOLAR_FLARE.value.item_name), + Has("Progressive Mirror", 4)), Has(BrushTechniques.INFERNO)) +has_portable_fire_source: Rule = Or(has_portable_fire_source_strict, Has(BrushTechniques.FIREBURST)) has_portable_thunder_source: Rule = Or(And(Or(Has(DivineInstruments.THUNDER_EDGE.value.item_name), Has("Progressive Sword", 5)), Has(BrushTechniques.THUNDERSTORM)), @@ -31,6 +30,11 @@ gale_shrine_access: Rule = HasGroup("canine_warriors", count=FromOption(RequiredDoggorbs)) moon_cave_access: Rule = Has("Serpent Crystal") +# FIXME: Set correct event name for dragon +n_ryoshima_islands_dragon_rule: Rule = Or(Has("Orca"), HasAll("Water Tablet", "Defeat the Dragon")) + +n_ryoshima_guardian_sapling_rule:Rule= Or(long_swim_rule,Has("Orca")) + # Probably should be removed;Directly add it to the checks that require it. @@ -43,8 +47,9 @@ def has_soup_ingerdients(state: CollectionState, world: "OkamiWorld", amount: in moon_cave_fire_rule: Rule = Or(has_portable_fire_source, HasAll("Moon Cave - 3F Push the ball", BrushTechniques.INFERNO)) -#Fireburst doesn't light the canons' fuse. -moon_cave_canon_rule: Rule = Or(has_portable_fire_source_strict,HasAll("Moon Cave - 3F Push the ball",BrushTechniques.INFERNO)) +# Fireburst doesn't light the canons' fuse. +moon_cave_canon_rule: Rule = Or(has_portable_fire_source_strict, + HasAll("Moon Cave - 3F Push the ball", BrushTechniques.INFERNO)) moon_cave_4f_fire_rule: Rule = Or(has_portable_fire_source, HasAll("Moon Cave - 4F Move Fireball", BrushTechniques.INFERNO)) @@ -157,7 +162,7 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even required_techinques += [] if data.needs_long_swim: - rules.append(HasAny("Water Tablet", BrushTechniques.GREENSPROUT_WATERLILY)) + rules.append(long_swim_rule) if len(required_techinques) > 0: rules.append(HasAll(*required_techinques)) @@ -190,11 +195,15 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even def apply_exit_rules(etr: Entrance, name: str, data: ExitData, world: "OkamiWorld"): rules: List[Rule] = [] if data.needs_long_swim: - rules.append(HasAny("Water Tablet", BrushTechniques.GREENSPROUT_WATERLILY)) + rules.append(long_swim_rule) if len(data.has_events) > 0: rules.append(HasAll(*data.has_events)) + if data.special_rule is not None: + # Append special rule if it's defined + rules.append(data.special_rule) + if len(rules) > 0: final_rule = And(*rules) world.set_rule(etr, final_rule) @@ -202,5 +211,6 @@ def apply_exit_rules(etr: Entrance, name: str, data: ExitData, world: "OkamiWorl def set_completion_rules(world: "OkamiWorld"): world.set_completion_rule(HasAll("Moon Cave - Defeat Orochi", "Gale Shrine - Defeat Crimson Helm", - "Tsuta Ruins - Defeat the spider queen","Himiko's Palace - Cross sea of fire","Imperial Palace - Defeat Blight")) + "Tsuta Ruins - Defeat the spider queen", "Himiko's Palace - Cross sea of fire", + "Imperial Palace - Defeat Blight")) return diff --git a/worlds/okamihd/Types.py b/worlds/okamihd/Types.py index 4d2b6451aa5a..4139a5b2c668 100644 --- a/worlds/okamihd/Types.py +++ b/worlds/okamihd/Types.py @@ -68,6 +68,7 @@ class ExitData(NamedTuple): needs_long_swim: bool = False one_way: bool = False loading_screen: bool = True + special_rule:Rule | None = None class WarpData(NamedTuple): From 34110445ac146cfd86b683b020c21e6adb29ba93 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 31 May 2026 22:13:57 +0200 Subject: [PATCH 02/10] Northern Ryoshima Coast --- worlds/okamihd/Enums/RegionNames.py | 7 +++ worlds/okamihd/RegionsData/rf0c.py | 83 +++++++++++++++++++++++++++-- 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index f7f5998cfff9..240a7553b6cf 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -221,6 +221,13 @@ class RegionNames(StrEnum): NORTHERN_RYOSHIMA_COAST_WATCHERS = "Northern Ryoshima Coast (Watcher's cape)" NORTHERN_RYOSHIMA_COAST_SAPLING = "Northern Ryoshima Coast (Guardian Sapling Island)" NORTHERN_RYOSHIMA_COAST_TOMB = "Northern Ryoshima Coast (Tomb Cave)" + NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND = "Northern Ryoshima Coast (Westernmost Island)" + NORTHERN_RYOSHIMA_COAST_UMI = "Northern Ryoshima Coast (Umi's Restaurant)" + NORTHERN_RYOSHIMA_COAST_CATCALL_NORTH = "Northern Ryoshima Coast (Island North of Catcall Tower)" + NORTHERN_RYOSHIMA_COAST_CB2_ISLAND = "Northern Ryoshima Coast (Cherry Bomb 2 Island)" + NORTHERN_RYOSHIMA_COAST_PS2_ISLAND = "Northern Ryoshima Coast (Power Slash 2 Island)" + NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND = "Northern Ryoshima Coast (Bandit Spider Island)" + NORTHERN_RYOSHIMA_COAST_SEA = "Northern Ryoshima Coast (Sea)" # SPECIAL REGIONS # Special Hub regions to handle warps diff --git a/worlds/okamihd/RegionsData/rf0c.py b/worlds/okamihd/RegionsData/rf0c.py index 5af12ddc7752..cd4d5ef7358a 100644 --- a/worlds/okamihd/RegionsData/rf0c.py +++ b/worlds/okamihd/RegionsData/rf0c.py @@ -1,12 +1,12 @@ from typing import TYPE_CHECKING from rule_builder.rules import True_, Has, HasAny, Or -from ..CheckIds import shop_check_id, container_check_id +from ..CheckIds import shop_check_id, container_check_id, brush_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType from ..Enums.OkamiEnemies import OkamiEnemies from ..Enums.WarpType import WarpType -from ..Rules import long_swim_rule, n_ryoshima_guardian_sapling_rule +from ..Rules import long_swim_rule, n_ryoshima_guardian_sapling_rule, n_ryoshima_islands_dragon_rule from ..Types import ExitData, EventData, LocData, WarpData from ..Enums.RegionNames import RegionNames, MapIds @@ -27,7 +27,20 @@ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_SAPLING, loading_screen=False, special_rule=n_ryoshima_guardian_sapling_rule), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB, loading_screen=False, one_way=True, - has_events=["Northern Ryoshima Coast - Climb to Tomb Cave"]) + has_events=["Northern Ryoshima Coast - Climb to Tomb Cave"]), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_NORTH, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_UMI), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_SEA, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule) ], RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS, one_way=True, loading_screen=False, @@ -50,15 +63,30 @@ "Northern Ryoshima Coast - Climb to Watcher's Cape": EventData( required_brush_techniques=[BrushTechniques.CATWALK], special_rule=Or(long_swim_rule, Has("Holy Eagle"))), "Northern Ryoshima Coast - Climb to Tomb Cave": EventData(required_brush_techniques=[BrushTechniques.CATWALK]), - "Northern Ryoshima Coast - Meet Orca": EventData(required_brush_techniques=[BrushTechniques.SUNRISE],event_item_name="Orca"), + "Northern Ryoshima Coast - Meet Orca": EventData(required_brush_techniques=[BrushTechniques.SUNRISE], + event_item_name="Orca"), }, RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: { "Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape": EventData( mandatory_enemies=[OkamiEnemies.BLUE_CYCLOPS]), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND: { + "Northern Ryoshima Coast - Fish Marlin": EventData( + type=LocationType.FISHING_MINIGAME, + required_items_events=["Marlin Rod"]) } } locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_UMI: { + "Northern Ryoshima Coast - Kazegami (Whirlwind)": LocData( + brush_check_id(24), required_items_events=["Northern Ryoshima Coast - Fish Marlin"], + type=LocationType.CONSTELLATION), + "Northern Ryoshima Coast - Chest after Whirlwind": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 0), + required_items_events=["Northern Ryoshima Coast - Fish Marlin"]), + }, RegionNames.NORTHERN_RYOSHIMA_COAST: { + "Northern Ryoshima Coast - Buried Chest southwest on mainland": LocData( container_check_id(MapIds.NORTHERN_RYOSHIMA, 3), type=LocationType.BURIED_CHEST), "Northern Ryoshima Coast - Buried Chest southwest of Umi's restaurant": LocData( @@ -115,6 +143,53 @@ RegionNames.NORTHERN_RYOSHIMA_COAST_MIST_WARP: { "Northern Ryoshima Coast - Chest in secret Mist Warp Area": LocData( container_check_id(MapIds.NORTHERN_RYOSHIMA, 33)) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_NORTH: { + "Northern Ryoshima Coast - Southern Buried Chest on island north of catcall tower": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 11), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Northern Buried Chest on island north of catcall tower": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 91), type=LocationType.BURIED_CHEST), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND: { + "Northern Ryoshima Coast - Burning Chest on Cherry Bomb 2 Island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 12), type=LocationType.BURNING_CHEST), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND: { + "Northern Ryoshima Coast - Buried Chest on Westernmost island beach": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 17), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Freestanding Chest on Westernmost island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 24)), + "Northern Ryoshima Coast - Underwater Clam on Westernmost island beach 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 75), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam on Westernmost island beach 3": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 76), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam on Westernmost island beach 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 77), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Buried Chest on Westernmost island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 83), type=LocationType.BURIED_CHEST), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND: { + "Northern Ryoshima Coast - Buried Chest on bandit spider island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 25), type=LocationType.BURIED_CHEST), + }, + # All of these require Orca, even though you can get some without - This is for bot my and the player's sanity + RegionNames.NORTHERN_RYOSHIMA_COAST_SEA: { + "Northern Ryoshima Coast - Underwater Clam on rocks west of watcher's cape": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 95), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks north of Guardian Sapling": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 96), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks southwest of watcher's cape": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 97), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks north of bandit spider island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 98), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks west of watcher's cape 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 99), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks between Power Slash 2 and Cherry Bomb 2 Island 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 100), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks between Power Slash 2 and Cherry Bomb 2 Island 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 101), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks north of Catcall Tower": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 102), type=LocationType.UNDERWATER_CHEST) } } warps = { From 4c63b08fb55b4176b2c14c853a372a036ad0dda3 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 1 Jun 2026 19:55:31 +0200 Subject: [PATCH 03/10] Caves Logic --- worlds/okamihd/Enums/OkamiEnemies.py | 9 ++++---- worlds/okamihd/Enums/RegionNames.py | 12 ++++++++++ worlds/okamihd/RegionsData/__init__.py | 20 +++++++++++++++- worlds/okamihd/RegionsData/r113.py | 32 ++++++++++++++++++++++++++ worlds/okamihd/RegionsData/r114.py | 21 +++++++++++++++++ worlds/okamihd/RegionsData/r116.py | 26 +++++++++++++++++++++ worlds/okamihd/RegionsData/r117.py | 26 +++++++++++++++++++++ worlds/okamihd/RegionsData/r11a.py | 30 ++++++++++++++++++++++++ worlds/okamihd/RegionsData/r11d.py | 21 +++++++++++++++++ worlds/okamihd/RegionsData/rf08.py | 16 +++++++------ worlds/okamihd/RegionsData/rf0a.py | 4 +++- worlds/okamihd/RegionsData/rf0c.py | 27 +++++++++++++++++++++- 12 files changed, 230 insertions(+), 14 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r113.py create mode 100644 worlds/okamihd/RegionsData/r114.py create mode 100644 worlds/okamihd/RegionsData/r116.py create mode 100644 worlds/okamihd/RegionsData/r117.py create mode 100644 worlds/okamihd/RegionsData/r11a.py create mode 100644 worlds/okamihd/RegionsData/r11d.py diff --git a/worlds/okamihd/Enums/OkamiEnemies.py b/worlds/okamihd/Enums/OkamiEnemies.py index 80a6908dacff..c7b25dfce532 100644 --- a/worlds/okamihd/Enums/OkamiEnemies.py +++ b/worlds/okamihd/Enums/OkamiEnemies.py @@ -36,7 +36,7 @@ class OkamiEnemies(Enum): UME = EnnemyData(0x22, "Ume", 1) TAKE = EnnemyData(0x23, "Take", 1) CUTTERS = EnnemyData(0x57, "Mr and Ms.Cutter", 1) - CROW_TENGU = EnnemyData(0x57, "Crow Tengu", 1) + CROW_TENGU = EnnemyData(0x57, "Crow Tengu", 1,requires_slash=True) CHIMERA = EnnemyData(0x4e, "Chimera", 1, requires_slash=True) # don't require slash here bc it's required in the cutscene that follows, not to beat the boss itself CRIMSON_HELM = EnnemyData(0x11, "Crimson Helm", 1, required_techniques=[BrushTechniques.GALESTORM]) @@ -50,9 +50,10 @@ class OkamiEnemies(Enum): THUNDER_DOOM_MIRROR = EnnemyData(0x5d, "Thunder Doom Mirror", 2) WIND_DOOM_MIRROR = EnnemyData(0x5c, "Wind Doom Mirror", 2, required_techniques=[BrushTechniques.VEIL_OF_MIST]) BLIGHT = EnnemyData(0x7c, "Blight", 2, requires_slash=True) - THUNDER_EAR=EnnemyData(0x55,"Thunder Ear",2) - EARTH_NOSE = EnnemyData(0x54, "Earth Nose", 2,required_techniques=[BrushTechniques.VEIL_OF_MIST]) - BLUE_CYCLOPS = EnnemyData(0x29,"Blue Cyclops",2) + THUNDER_EAR = EnnemyData(0x55, "Thunder Ear", 2) + EARTH_NOSE = EnnemyData(0x54, "Earth Nose", 2, required_techniques=[BrushTechniques.VEIL_OF_MIST]) + BLUE_CYCLOPS = EnnemyData(0x29, "Blue Cyclops", 2) + BANDIT_SPIDER = EnnemyData(0x0b, "Bandit Spider", 2, required_techniques=[BrushTechniques.GREENSPROUT_VINE]) @staticmethod def list(): diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index 240a7553b6cf..31701a72ee17 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -74,6 +74,7 @@ class RegionNames(StrEnum): CURSED_TAKA_PASS_CAVE = "Cursed Taka Pass (Cave)" CURSED_TAKA_PASS_GUARDIAN_SAPLING = "Cursed Taka Pass (Guardian Sapling)" TAKA_PASS = "Taka Pass" + TAKA_PASS_CAVE = "Taka Pass Cave" ## KUSA VILLAGE KUSA_VILLAGE = "Kusa Village" @@ -145,6 +146,7 @@ class RegionNames(StrEnum): RYOSHIMA_COAST_LUNAR_LAGOON = "Ryoshima Coast (Lunar Lagoon)" RYOSHIMA_COAST_WEST_PIER = "Ryoshima Coast (West of Pier)" ANKOKU_TEMPLE = "Ankoku Temple" + RYOSHIMA_COAST_BANDIT_SPIDER = "Ryoshima Coast (Bandit spider cave)" ## SEIAN CITY ### COMMONERS QUARTER @@ -228,6 +230,10 @@ class RegionNames(StrEnum): NORTHERN_RYOSHIMA_COAST_PS2_ISLAND = "Northern Ryoshima Coast (Power Slash 2 Island)" NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND = "Northern Ryoshima Coast (Bandit Spider Island)" NORTHERN_RYOSHIMA_COAST_SEA = "Northern Ryoshima Coast (Sea)" + NORTHERN_RYOSHIMA_COAST_PS2_CAVE = "Northern Ryoshima Coast (Power Slash 2 Cave)" + NORTHERN_RYOSHIMA_COAST_CB2_CAVE = "Northern Ryoshima Coast (Cherry Bomb 2 Cave)" + NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE = "Northern Ryoshima Coast (Bandit spider cave)" + NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE = "Northern Ryoshima Coast (Treasure cave)" # SPECIAL REGIONS # Special Hub regions to handle warps @@ -249,6 +255,12 @@ class MapIds(Enum): AGATA_FOREST_MME_FAWN = 0x10A CALCIFIED_CAVERN = 0x10E MOON_CAVE = 0x110 + RYOSHIMA_BANDIT_SPIDER = 0x113 + TAKA_PASS_CAVE = 0x114 + POWER_SLASH_2_CAVE=0x116 + CHERRY_BOMB_2_CAVE = 0x117 + NORTHERN_RYOSHIMA_BANDIT_SPIDER = 0x11A + NORTHERN_RYOSHIMA_TREASURE = 0x11D RIVER_OF_THE_HEAVENS = 0x122 SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index b062d6cd1e5f..77401d5e199d 100644 --- a/worlds/okamihd/RegionsData/__init__.py +++ b/worlds/okamihd/RegionsData/__init__.py @@ -1,7 +1,7 @@ from typing import TYPE_CHECKING from . import menu, r100, r122, r101, r102, r103, r104, rf01, rf02, rf03, rf04, rf07, rf08, r108, r109, r107, r10e, \ - r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c + r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c, r113, r114, r116, r117,r11a,r11d if TYPE_CHECKING: from .. import OkamiWorld @@ -20,6 +20,12 @@ **r10a.exits, **r10e.exits, **r110.exits, + **r113.exits, + **r114.exits, + **r116.exits, + **r117.exits, + **r11a.exits, + **r11d.exits, **r122.exits, **r200.exits, **r201.exits, @@ -52,6 +58,12 @@ **r10a.locations, **r10e.locations, **r110.locations, + **r113.locations, + **r114.locations, + **r116.locations, + **r117.locations, + **r11a.locations, + **r11d.locations, **r122.locations, **r200.locations, **r201.locations, @@ -84,6 +96,12 @@ **r10a.events, **r10e.events, **r110.events, + **r113.events, + **r114.events, + **r116.events, + **r117.events, + **r11a.events, + **r11d.events, **r122.events, **r200.events, **r201.events, diff --git a/worlds/okamihd/RegionsData/r113.py b/worlds/okamihd/RegionsData/r113.py new file mode 100644 index 000000000000..71ade7b11bc8 --- /dev/null +++ b/worlds/okamihd/RegionsData/r113.py @@ -0,0 +1,32 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER: [ + ExitData(RegionNames.RYOSHIMA_COAST, one_way=True, has_events=["Ryoshima Coast - Defeat Bandit Spider in cave"]) + ] +} +events = { + RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER: { + "Ryoshima Coast - Defeat Bandit Spider in cave": EventData(mandatory_enemies=[OkamiEnemies.BANDIT_SPIDER]), + "Ryoshima Coast - Clear 10 Devil Gates in cave": EventData( + mandatory_enemies=[OkamiEnemies.GREEN_IMP, OkamiEnemies.RED_IMP, OkamiEnemies.YELLOW_IMP, + OkamiEnemies.DEAD_FISH, OkamiEnemies.BUD_OGRE, OkamiEnemies.BLUE_IMP, + OkamiEnemies.CROW_TENGU, OkamiEnemies.CHIMERA, OkamiEnemies.BLACK_IMP, + OkamiEnemies.ICE_LIPS, OkamiEnemies.FIRE_EYE]), + } + +} +locations = { + RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER: { + "Ryoshima Coast - Chest after Bandit Spider": LocData(container_check_id(MapIds.RYOSHIMA_BANDIT_SPIDER, 0)), + "Ryoshima Coast - Chest after 10 devil gates": LocData(container_check_id(MapIds.RYOSHIMA_BANDIT_SPIDER, 1)) + } +} diff --git a/worlds/okamihd/RegionsData/r114.py b/worlds/okamihd/RegionsData/r114.py new file mode 100644 index 000000000000..e1955d2b8371 --- /dev/null +++ b/worlds/okamihd/RegionsData/r114.py @@ -0,0 +1,21 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { +} +locations = { + RegionNames.TAKA_PASS_CAVE: { + "Taka Pass - Chest in treasure cave 1": LocData(container_check_id(MapIds.TAKA_PASS_CAVE, 1)), + "Taka Pass - Chest in treasure cave 2": LocData(container_check_id(MapIds.TAKA_PASS_CAVE, 0)), + "Taka Pass - Chest in treasure cave 3": LocData(container_check_id(MapIds.TAKA_PASS_CAVE, 2)), + } +} diff --git a/worlds/okamihd/RegionsData/r116.py b/worlds/okamihd/RegionsData/r116.py new file mode 100644 index 000000000000..6be73d287c7c --- /dev/null +++ b/worlds/okamihd/RegionsData/r116.py @@ -0,0 +1,26 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE:{ + "Northern Ryoshima Coast - Offer 60,000 yen in Power Slash 2 Fountain": EventData() + } +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE: { + # Brush upgrade id 12 + "Northern Ryoshima Coast - Tachigami (Power Slash 2)": LocData(12, type=LocationType.CONSTELLATION), + "Northern Ryoshima Coast - Chest after Power Slash 2": LocData(container_check_id(MapIds.POWER_SLASH_2_CAVE, 0)) + } + +} diff --git a/worlds/okamihd/RegionsData/r117.py b/worlds/okamihd/RegionsData/r117.py new file mode 100644 index 000000000000..9c1438488136 --- /dev/null +++ b/worlds/okamihd/RegionsData/r117.py @@ -0,0 +1,26 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { + RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_CAVE:{ + "Northern Ryoshima Coast - Offer 120,000 yen in Cherry Bomb 2 Fountain": EventData() + } +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE: { + # Brush upgrade id 25 + "Northern Ryoshima Coast - Bakugami (Cherry Bomb 2)": LocData(25, type=LocationType.CONSTELLATION), + "Northern Ryoshima Coast - Chest after Cherry Bomb 2": LocData(container_check_id(MapIds.CHERRY_BOMB_2_CAVE, 0)) + } + +} diff --git a/worlds/okamihd/RegionsData/r11a.py b/worlds/okamihd/RegionsData/r11a.py new file mode 100644 index 000000000000..a53b331d23a6 --- /dev/null +++ b/worlds/okamihd/RegionsData/r11a.py @@ -0,0 +1,30 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND, one_way=True, has_events=["Northern Ryoshima Coast - Defeat Bandit Spider in cave"]) + ] +} +events = { + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE: { + "Northern Ryoshima Coast - Defeat Bandit Spider in cave": EventData(mandatory_enemies=[OkamiEnemies.BANDIT_SPIDER]), + #FIXME: Add enemies, requires game progression to appear. + "Northern Ryoshima Coast - Clear 10 Devil Gates in cave": EventData( + mandatory_enemies=[]), + } + +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE: { + "Northern Ryoshima Coast - Chest after Bandit Spider": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_BANDIT_SPIDER, 0)), + "Northern Ryoshima Coast - Chest after 10 devil gates": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_BANDIT_SPIDER, 1)) + } +} diff --git a/worlds/okamihd/RegionsData/r11d.py b/worlds/okamihd/RegionsData/r11d.py new file mode 100644 index 000000000000..5c1245a46890 --- /dev/null +++ b/worlds/okamihd/RegionsData/r11d.py @@ -0,0 +1,21 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE: { + "Northern Ryoshima Coast - Chest in treasure cave 1": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_TREASURE, 1)), + "Northern Ryoshima Coast - Chest in treasure cave 2": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_TREASURE, 0)), + "Northern Ryoshima Coast - Chest in treasure cave 3": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_TREASURE, 2)), + } +} diff --git a/worlds/okamihd/RegionsData/rf08.py b/worlds/okamihd/RegionsData/rf08.py index 708bed7b4701..31da46537d5d 100644 --- a/worlds/okamihd/RegionsData/rf08.py +++ b/worlds/okamihd/RegionsData/rf08.py @@ -12,12 +12,13 @@ if TYPE_CHECKING: from .. import OkamiWorld -exits={ - RegionNames.TAKA_PASS:[ExitData(RegionNames.KUSA_VILLAGE), - ExitData(RegionNames.SASA_SANCTUARY_ENTRANCE), - ExitData(RegionNames.CITY_CHECKPOINT_TAKA), - ExitData(RegionNames.TAKA_COMMON_LOGIC, one_way=True, loading_screen=False) - ] +exits = { + RegionNames.TAKA_PASS: [ExitData(RegionNames.KUSA_VILLAGE), + ExitData(RegionNames.SASA_SANCTUARY_ENTRANCE), + ExitData(RegionNames.CITY_CHECKPOINT_TAKA), + ExitData(RegionNames.TAKA_COMMON_LOGIC, one_way=True, loading_screen=False), + ExitData(RegionNames.TAKA_PASS_CAVE,has_events=["Taka Pass - Open Digging Cave"]) + ] } events = { @@ -25,7 +26,8 @@ "Taka Pass - Clear Devil gate near waterfall": EventData( mandatory_enemies=[OkamiEnemies.BUD_OGRE, OkamiEnemies.YELLOW_IMP]), "Taka Pass - Save Chun": EventData(cherry_bomb_level=1, mandatory_enemies=[OkamiEnemies.CUTTERS], - required_items_events=["Satomi Power Orb (Tei)"]) + required_items_events=["Satomi Power Orb (Tei)"]), + "Taka Pass - Open Digging Cave": EventData(required_items_events=["Digging Champ"]) } } diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index be1ae7564da1..ca2bb3b5d76e 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -23,7 +23,8 @@ ExitData(RegionNames.ANKOKU_TEMPLE), ExitData(RegionNames.FAWNS_HOUSE, has_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]), ExitData(RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON, one_way=True, - has_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False) + has_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False), + ExitData(RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER,has_events=["Ryoshima Coast - Open Bandit Spider Cave"],one_way=True) ], RegionNames.RYOSHIMA_COAST_SEA: [ ExitData(RegionNames.RYOSHIMA_COAST_DOJO, needs_long_swim=True, loading_screen=False), @@ -64,6 +65,7 @@ required_brush_techniques=[BrushTechniques.CRESCENT]), "Ryoshima Coast - Open Shortcut To Mme Fawn's": EventData(), "Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance": EventData(mandatory_enemies=[OkamiEnemies.ICE_LIPS,OkamiEnemies.THUNDER_EAR]), + "Ryoshima Coast - Open Bandit Spider Cave": EventData(required_items_events=["Digging Champ"]), }, RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: { diff --git a/worlds/okamihd/RegionsData/rf0c.py b/worlds/okamihd/RegionsData/rf0c.py index cd4d5ef7358a..e32624c6abb2 100644 --- a/worlds/okamihd/RegionsData/rf0c.py +++ b/worlds/okamihd/RegionsData/rf0c.py @@ -40,7 +40,9 @@ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND, loading_screen=False, special_rule=n_ryoshima_islands_dragon_rule), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_SEA, loading_screen=False, - special_rule=n_ryoshima_islands_dragon_rule) + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE, + has_events=["Northern Ryoshima Coast - Open Treasure Cave"]) ], RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS, one_way=True, loading_screen=False, @@ -51,6 +53,19 @@ ], RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_ISLAND: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE, + has_events=["Northern Ryoshima Coast - Open Power Slash 2 Cave"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_CAVE, + has_events=["Northern Ryoshima Coast - Open Cherry Bomb 2 Cave"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE, + has_events=["Northern Ryoshima Coast - Open Bandit Spider Cave"], + one_way=True) ] } events = { @@ -65,6 +80,7 @@ "Northern Ryoshima Coast - Climb to Tomb Cave": EventData(required_brush_techniques=[BrushTechniques.CATWALK]), "Northern Ryoshima Coast - Meet Orca": EventData(required_brush_techniques=[BrushTechniques.SUNRISE], event_item_name="Orca"), + "Northern Ryoshima Coast - Open Treasure Cave": EventData(required_items_events=["Digging Champ"]), }, RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: { "Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape": EventData( @@ -74,6 +90,15 @@ "Northern Ryoshima Coast - Fish Marlin": EventData( type=LocationType.FISHING_MINIGAME, required_items_events=["Marlin Rod"]) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_ISLAND: { + "Northern Ryoshima Coast - Open Power Slash 2 Cave": EventData(power_slash_level=1) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND: { + "Northern Ryoshima Coast - Open Cherry Bomb 2 Cave": EventData(cherry_bomb_level=1) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND: { + "Northern Ryoshima Coast - Open Bandit Spider Cave": EventData(required_items_events=["Digging Champ"]) } } locations = { From 20f9f689e1efe048ca7939795bbb407fdb30f943 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 5 Jun 2026 10:53:04 +0200 Subject: [PATCH 04/10] Add Catcall Tower Logic --- worlds/okamihd/Enums/RegionNames.py | 9 +++- worlds/okamihd/RegionsData/__init__.py | 7 ++- worlds/okamihd/RegionsData/r20a.py | 60 ++++++++++++++++++++++++++ worlds/okamihd/RegionsData/rf0c.py | 5 +++ 4 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r20a.py diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index 31701a72ee17..8b1cc16bb73d 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -234,6 +234,12 @@ class RegionNames(StrEnum): NORTHERN_RYOSHIMA_COAST_CB2_CAVE = "Northern Ryoshima Coast (Cherry Bomb 2 Cave)" NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE = "Northern Ryoshima Coast (Bandit spider cave)" NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE = "Northern Ryoshima Coast (Treasure cave)" + NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND = "Northern Ryoshima Coast (Catcall Tower Island)" + + ## Catcall Tower + CATCALL_TOWER_BOTTOM = "Catcall Tower (Bottom)" + CATCALL_TOWER = "Catcall Tower" + CATCALL_TOWER_TOP = "Catcall Tower(Top)" # SPECIAL REGIONS # Special Hub regions to handle warps @@ -257,7 +263,7 @@ class MapIds(Enum): MOON_CAVE = 0x110 RYOSHIMA_BANDIT_SPIDER = 0x113 TAKA_PASS_CAVE = 0x114 - POWER_SLASH_2_CAVE=0x116 + POWER_SLASH_2_CAVE = 0x116 CHERRY_BOMB_2_CAVE = 0x117 NORTHERN_RYOSHIMA_BANDIT_SPIDER = 0x11A NORTHERN_RYOSHIMA_TREASURE = 0x11D @@ -268,6 +274,7 @@ class MapIds(Enum): SUNKEN_SHIP = 0x205 IMPERIAL_PALACE = 0x206 IMPERIAL_PALACE_SMALL = 0x207 + CATCALL_TOWER = 0x20A CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 CURSED_AGATA = 0xF03 diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 77401d5e199d..1992b31d45b9 100644 --- a/worlds/okamihd/RegionsData/__init__.py +++ b/worlds/okamihd/RegionsData/__init__.py @@ -1,7 +1,8 @@ from typing import TYPE_CHECKING from . import menu, r100, r122, r101, r102, r103, r104, rf01, rf02, rf03, rf04, rf07, rf08, r108, r109, r107, r10e, \ - r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c, r113, r114, r116, r117,r11a,r11d + r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c, r113, r114, r116, r117, r11a, r11d, \ + r20a if TYPE_CHECKING: from .. import OkamiWorld @@ -33,6 +34,7 @@ **r205.exits, **r206.exits, **r207.exits, + **r20a.exits, **rf01.exits, **rf02.exits, **rf03.exits, @@ -71,6 +73,7 @@ **r205.locations, **r206.locations, **r207.locations, + **r20a.locations, **rf01.locations, **rf02.locations, **rf03.locations, @@ -109,6 +112,7 @@ **r205.events, **r206.events, **r207.events, + **r20a.events, **rf01.events, **rf02.events, **rf03.events, @@ -142,6 +146,7 @@ **r108.warps, **r109.warps, **r200.warps, + **r20a.warps, **rf02.warps, **rf04.warps, **rf08.warps, diff --git a/worlds/okamihd/RegionsData/r20a.py b/worlds/okamihd/RegionsData/r20a.py new file mode 100644 index 000000000000..ee8c6835db67 --- /dev/null +++ b/worlds/okamihd/RegionsData/r20a.py @@ -0,0 +1,60 @@ +from typing import TYPE_CHECKING + +from rule_builder.rules import Has +from ..CheckIds import container_check_id, brush_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.WarpType import WarpType +from ..Types import LocData, ExitData, WarpData, EventData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.CATCALL_TOWER_BOTTOM: [ + ExitData(RegionNames.CATCALL_TOWER, loading_screen=False), + ], + RegionNames.CATCALL_TOWER: [ + ExitData(RegionNames.CATCALL_TOWER_TOP, loading_screen=False) + ] +} +events = { + RegionNames.CATCALL_TOWER_TOP: { + "Catcall Tower - Unlock warp": EventData() + } +} +locations = { + RegionNames.CATCALL_TOWER_BOTTOM: { + "Catcall Tower - Freestanding Chest in front of tower": LocData(container_check_id(MapIds.CATCALL_TOWER, 11)), + "Catcall Tower - Freestanding Chest on west pillar": LocData(container_check_id(MapIds.CATCALL_TOWER, 10), + required_brush_techniques=[ + BrushTechniques.CATWALK]), + "Catcall Tower - Freestanding Chest on east pillar": LocData(container_check_id(MapIds.CATCALL_TOWER, 9), + required_brush_techniques=[ + BrushTechniques.CATWALK]) + }, + RegionNames.CATCALL_TOWER: { + "Catcall Tower - Chest on 3rd cloud platform": LocData(container_check_id(MapIds.CATCALL_TOWER, 8)), + "Catcall Tower - Chest on stone platform above 3rd cloud platform": LocData( + container_check_id(MapIds.CATCALL_TOWER, 7)), + "Catcall Tower - Chest on 4th cloud platform": LocData(container_check_id(MapIds.CATCALL_TOWER, 6)), + "Catcall Tower - Chest on stone platform above 4th cloud platform": LocData( + container_check_id(MapIds.CATCALL_TOWER, 5)), + "Catcall Tower - Chest on 5th cloud platform": LocData(container_check_id(MapIds.CATCALL_TOWER, 4)), + }, + RegionNames.CATCALL_TOWER_TOP: { + "Catcall Tower - Freestanding chest near mermaid spring": LocData(container_check_id(MapIds.CATCALL_TOWER, 3)), + "Catcall Tower - Freestanding chest on top of tower 2F": LocData(container_check_id(MapIds.CATCALL_TOWER, 0)), + # Requires Feedbag fish - Maybe place one guaranteed in the tower ? + "Catcall Tower - Kabegami": LocData(brush_check_id(1),type=LocationType.CONSTELLATION), + "Catcall Tower - Freestanding chest on top of tower behind cat statue": LocData(container_check_id(MapIds.CATCALL_TOWER, 2)), + "Catcall Tower - Secret chest after climbing the tower twice": LocData(container_check_id(MapIds.CATCALL_TOWER, 1)), + } + +} +warps = { + RegionNames.CATCALL_TOWER_TOP: [ + WarpData(WarpType.MERMAID_SPRING, Has("Catcall Tower - Unlock warp"), Has("Catcall Tower - Unlock warp")) + ] +} diff --git a/worlds/okamihd/RegionsData/rf0c.py b/worlds/okamihd/RegionsData/rf0c.py index e32624c6abb2..0528d10814cc 100644 --- a/worlds/okamihd/RegionsData/rf0c.py +++ b/worlds/okamihd/RegionsData/rf0c.py @@ -41,6 +41,8 @@ special_rule=n_ryoshima_islands_dragon_rule), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_SEA, loading_screen=False, special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE, has_events=["Northern Ryoshima Coast - Open Treasure Cave"]) ], @@ -66,6 +68,9 @@ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE, has_events=["Northern Ryoshima Coast - Open Bandit Spider Cave"], one_way=True) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND:[ + ExitData(RegionNames.CATCALL_TOWER_BOTTOM) ] } events = { From 897dc1c801e9c472ab7f48f95d4625c2067db649 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 5 Jun 2026 12:06:43 +0200 Subject: [PATCH 05/10] Add some Dragon Palace checks --- worlds/okamihd/Enums/RegionNames.py | 5 ++ worlds/okamihd/RegionsData/__init__.py | 7 ++- worlds/okamihd/RegionsData/r201.py | 48 +++++++++---------- worlds/okamihd/RegionsData/r203.py | 64 ++++++++++++++++++++++++++ worlds/okamihd/RegionsData/rf0c.py | 7 ++- 5 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r203.py diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index 8b1cc16bb73d..c465398f4f74 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -241,6 +241,10 @@ class RegionNames(StrEnum): CATCALL_TOWER = "Catcall Tower" CATCALL_TOWER_TOP = "Catcall Tower(Top)" + ## DRAGON PALACE + DRAGON_PALACE = "Dragon Palace" + DRAGON_PALACE_SPRING = "Dragon Palace (Soothing Spring)" + # SPECIAL REGIONS # Special Hub regions to handle warps MIST_WARP_HUB = "Mist Warp Hub" @@ -271,6 +275,7 @@ class MapIds(Enum): SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 HIMIKO_PALACE = 0x202 + DRAGON_PALACE=0x203 SUNKEN_SHIP = 0x205 IMPERIAL_PALACE = 0x206 IMPERIAL_PALACE_SMALL = 0x207 diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 1992b31d45b9..684d0371f8c2 100644 --- a/worlds/okamihd/RegionsData/__init__.py +++ b/worlds/okamihd/RegionsData/__init__.py @@ -2,7 +2,7 @@ from . import menu, r100, r122, r101, r102, r103, r104, rf01, rf02, rf03, rf04, rf07, rf08, r108, r109, r107, r10e, \ r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c, r113, r114, r116, r117, r11a, r11d, \ - r20a + r20a, r203 if TYPE_CHECKING: from .. import OkamiWorld @@ -31,6 +31,7 @@ **r200.exits, **r201.exits, **r202.exits, + **r203.exits, **r205.exits, **r206.exits, **r207.exits, @@ -70,6 +71,7 @@ **r200.locations, **r201.locations, **r202.locations, + **r203.locations, **r205.locations, **r206.locations, **r207.locations, @@ -109,6 +111,7 @@ **r200.events, **r201.events, **r202.events, + **r203.events, **r205.events, **r206.events, **r207.events, @@ -133,6 +136,7 @@ **getattr(r109, 'shop_locations', {}), **getattr(r110, 'shop_locations', {}), **getattr(r201, 'shop_locations', {}), + **getattr(r203, 'shop_locations', {}), **getattr(rf02, 'shop_locations', {}), **getattr(rf04, 'shop_locations', {}), **getattr(rf08, 'shop_locations', {}), @@ -146,6 +150,7 @@ **r108.warps, **r109.warps, **r200.warps, + **r203.warps, **r20a.warps, **rf02.warps, **rf04.warps, diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index e850043fd5cc..7bb38518594c 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -132,31 +132,31 @@ } shop_locations = { RegionNames.SEIAN_CITY_TOOL_SHOP: { - "Sei-an City Tool Shop Slot 1": LocData(shop_check_id(16, 0), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 2": LocData(shop_check_id(16, 1), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 3": LocData(shop_check_id(16, 2), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 4": LocData(shop_check_id(16, 3), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 5": LocData(shop_check_id(16, 4), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 6": LocData(shop_check_id(16, 5), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 7": LocData(shop_check_id(16, 6), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 8": LocData(shop_check_id(16, 7), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 9": LocData(shop_check_id(16, 8), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 10": LocData(shop_check_id(16, 9), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 11": LocData(shop_check_id(16, 10), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 12": LocData(shop_check_id(16, 11), type=LocationType.SHOP) + "Sei-an City - Tool Shop Slot 1": LocData(shop_check_id(16, 0), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 2": LocData(shop_check_id(16, 1), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 3": LocData(shop_check_id(16, 2), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 4": LocData(shop_check_id(16, 3), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 5": LocData(shop_check_id(16, 4), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 6": LocData(shop_check_id(16, 5), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 7": LocData(shop_check_id(16, 6), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 8": LocData(shop_check_id(16, 7), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 9": LocData(shop_check_id(16, 8), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 10": LocData(shop_check_id(16, 9), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 11": LocData(shop_check_id(16, 10), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 12": LocData(shop_check_id(16, 11), type=LocationType.SHOP) }, RegionNames.SEIAN_CITY_WEAPON_SHOP: { - "Sei-an City Weapon Shop Slot 1": LocData(shop_check_id(17, 0), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 2": LocData(shop_check_id(17, 1), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 3": LocData(shop_check_id(17, 2), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 4": LocData(shop_check_id(17, 3), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 5": LocData(shop_check_id(17, 4), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 6": LocData(shop_check_id(17, 5), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 7": LocData(shop_check_id(17, 6), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 8": LocData(shop_check_id(17, 7), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 9": LocData(shop_check_id(17, 8), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 10": LocData(shop_check_id(17, 9), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 11": LocData(shop_check_id(17, 10), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 12": LocData(shop_check_id(17, 11), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 1": LocData(shop_check_id(17, 0), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 2": LocData(shop_check_id(17, 1), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 3": LocData(shop_check_id(17, 2), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 4": LocData(shop_check_id(17, 3), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 5": LocData(shop_check_id(17, 4), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 6": LocData(shop_check_id(17, 5), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 7": LocData(shop_check_id(17, 6), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 8": LocData(shop_check_id(17, 7), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 9": LocData(shop_check_id(17, 8), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 10": LocData(shop_check_id(17, 9), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 11": LocData(shop_check_id(17, 10), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 12": LocData(shop_check_id(17, 11), type=LocationType.SHOP), } } diff --git a/worlds/okamihd/RegionsData/r203.py b/worlds/okamihd/RegionsData/r203.py new file mode 100644 index 000000000000..fa8404153b04 --- /dev/null +++ b/worlds/okamihd/RegionsData/r203.py @@ -0,0 +1,64 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, shop_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.DRAGON_PALACE: [ + ExitData(RegionNames.DRAGON_PALACE_SPRING, one_way=True, + has_events=["Dragon Palace - Get Shell Amulet from Otohime"]) + ], + RegionNames.DRAGON_PALACE_SPRING: [ + ExitData(RegionNames.DRAGON_PALACE, one_way=True) + ] +} +events = { + RegionNames.DRAGON_PALACE: { + "Dragon Palace - Open Secret Cave": EventData(cherry_bomb_level=1), + # FIXME: Change this to a location later + "Dragon Palace - Get Shell Amulet from Otohime": EventData(), + }, + RegionNames.DRAGON_PALACE_SPRING:{ + "Dragon Palace - Restore the soothing spring":EventData(type=LocationType.DIGGING_MINIGAME_LATER,required_items_events=["Digging Champ"]) + } +} +locations = { + RegionNames.DRAGON_PALACE: { + "Dragon Palace - West Clam at entrance 1": LocData(container_check_id(MapIds.DRAGON_PALACE, 3)), + "Dragon Palace - West Clam at entrance 2": LocData(container_check_id(MapIds.DRAGON_PALACE, 4)), + "Dragon Palace - East Clam at entrance": LocData(container_check_id(MapIds.DRAGON_PALACE, 5)), + "Dragon Palace - Chest inside guardhouse": LocData(container_check_id(MapIds.DRAGON_PALACE, 1)) + }, + RegionNames.DRAGON_PALACE_SPRING: { + "Dragon Palace - North Clam near Soothing Spring": LocData(container_check_id(MapIds.DRAGON_PALACE, 10)), + "Dragon Palace - West Clam near Soothing Spring": LocData(container_check_id(MapIds.DRAGON_PALACE, 9)), + "Dragon Palace -Chest on Pillars": LocData(container_check_id(MapIds.DRAGON_PALACE, 2), + required_brush_techniques=[BrushTechniques.REJUVENATION], + required_items_events=["Holy Eagle"]) + } +} +shop_locations = { + RegionNames.DRAGON_PALACE: { + "Dragon Palace - Ms. Turtle's Shop Slot 1": LocData(shop_check_id(3, 0), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 2": LocData(shop_check_id(3, 1), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 3": LocData(shop_check_id(3, 2), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 4": LocData(shop_check_id(3, 3), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 5": LocData(shop_check_id(3, 4), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 6": LocData(shop_check_id(3, 5), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 7": LocData(shop_check_id(3, 6), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 8": LocData(shop_check_id(3, 7), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 9": LocData(shop_check_id(3, 8), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 10": LocData(shop_check_id(3, 9), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 11": LocData(shop_check_id(3, 10), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 12": LocData(shop_check_id(3, 11), type=LocationType.SHOP) + } +} +warps={ + +} \ No newline at end of file diff --git a/worlds/okamihd/RegionsData/rf0c.py b/worlds/okamihd/RegionsData/rf0c.py index 0528d10814cc..a83fea4b8594 100644 --- a/worlds/okamihd/RegionsData/rf0c.py +++ b/worlds/okamihd/RegionsData/rf0c.py @@ -44,7 +44,9 @@ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND, loading_screen=False, special_rule=n_ryoshima_islands_dragon_rule), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE, - has_events=["Northern Ryoshima Coast - Open Treasure Cave"]) + has_events=["Northern Ryoshima Coast - Open Treasure Cave"]), + ExitData(RegionNames.DRAGON_PALACE, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule,has_events=["Northern Ryoshima Coast - Open Whirlpool"]), ], RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS, one_way=True, loading_screen=False, @@ -91,6 +93,9 @@ "Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape": EventData( mandatory_enemies=[OkamiEnemies.BLUE_CYCLOPS]), }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS:{ + "Northern Ryoshima Coast - Open Whirlpool":EventData(required_brush_techniques=[BrushTechniques.GALESTORM]) + }, RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND: { "Northern Ryoshima Coast - Fish Marlin": EventData( type=LocationType.FISHING_MINIGAME, From a28e606a02dc1e42538f380d07493aad49c54381 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 5 Jun 2026 14:23:13 +0200 Subject: [PATCH 06/10] Dragon Palace loigc --- worlds/okamihd/Enums/LocationType.py | 2 ++ worlds/okamihd/Enums/RegionNames.py | 5 ++- worlds/okamihd/Items.py | 3 +- worlds/okamihd/RegionsData/__init__.py | 5 ++- worlds/okamihd/RegionsData/r11c.py | 21 +++++++++++ worlds/okamihd/RegionsData/r203.py | 48 ++++++++++++++++++++------ worlds/okamihd/RegionsData/r207.py | 2 +- 7 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r11c.py diff --git a/worlds/okamihd/Enums/LocationType.py b/worlds/okamihd/Enums/LocationType.py index aba984cf7604..16d32319f08d 100644 --- a/worlds/okamihd/Enums/LocationType.py +++ b/worlds/okamihd/Enums/LocationType.py @@ -35,3 +35,5 @@ class LocationType(Enum): # Chest with element Sources that depend on special rules; Don't apply any requirments except the special rule one THUNDER_CHEST_SPECIAL_SOURCE = 20 FROZEN_CHEST_SPECIAL_SOURCE = 21 + # + Holy Eagle + Golden Ink Pot + DIGGING_MINIGAME_HARD = 22 diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index c465398f4f74..fe81bb3425ab 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -244,6 +244,8 @@ class RegionNames(StrEnum): ## DRAGON PALACE DRAGON_PALACE = "Dragon Palace" DRAGON_PALACE_SPRING = "Dragon Palace (Soothing Spring)" + DRAGON_PALACE_CAVE = "Dragon Palace (Treasure Cave)" + DRAGON_PALACE_GARDEN = "Dragon Palace (Water Dragon's Garden)" # SPECIAL REGIONS # Special Hub regions to handle warps @@ -270,12 +272,13 @@ class MapIds(Enum): POWER_SLASH_2_CAVE = 0x116 CHERRY_BOMB_2_CAVE = 0x117 NORTHERN_RYOSHIMA_BANDIT_SPIDER = 0x11A + DRAGON_PALACE_TREASURE = 0x11C NORTHERN_RYOSHIMA_TREASURE = 0x11D RIVER_OF_THE_HEAVENS = 0x122 SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 HIMIKO_PALACE = 0x202 - DRAGON_PALACE=0x203 + DRAGON_PALACE = 0x203 SUNKEN_SHIP = 0x205 IMPERIAL_PALACE = 0x206 IMPERIAL_PALACE_SMALL = 0x207 diff --git a/worlds/okamihd/Items.py b/worlds/okamihd/Items.py index d48af6ec4459..aac1c7282b1c 100644 --- a/worlds/okamihd/Items.py +++ b/worlds/okamihd/Items.py @@ -109,7 +109,8 @@ def create_static_precollected_item_list(world: "OkamiWorld") -> List[Item]: "Golden Lucky Cat": ItemData(0x95, ItemClassification.useful), "Thief's Glove": ItemData(0x96, ItemClassification.useful), "Wood Mat": ItemData(0x97, ItemClassification.useful), - "Golden Ink Pot": ItemData(0x98, ItemClassification.useful), + # Has to be progression since we require it for some checks. + "Golden Ink Pot": ItemData(0x98, ItemClassification.progression), "Fire Tablet": ItemData(0x9d, ItemClassification.progression) } diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 684d0371f8c2..04b007c00117 100644 --- a/worlds/okamihd/RegionsData/__init__.py +++ b/worlds/okamihd/RegionsData/__init__.py @@ -2,7 +2,7 @@ from . import menu, r100, r122, r101, r102, r103, r104, rf01, rf02, rf03, rf04, rf07, rf08, r108, r109, r107, r10e, \ r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c, r113, r114, r116, r117, r11a, r11d, \ - r20a, r203 + r20a, r203, r11c if TYPE_CHECKING: from .. import OkamiWorld @@ -26,6 +26,7 @@ **r116.exits, **r117.exits, **r11a.exits, + **r11c.exits, **r11d.exits, **r122.exits, **r200.exits, @@ -66,6 +67,7 @@ **r116.locations, **r117.locations, **r11a.locations, + **r11c.locations, **r11d.locations, **r122.locations, **r200.locations, @@ -106,6 +108,7 @@ **r116.events, **r117.events, **r11a.events, + **r11c.events, **r11d.events, **r122.events, **r200.events, diff --git a/worlds/okamihd/RegionsData/r11c.py b/worlds/okamihd/RegionsData/r11c.py new file mode 100644 index 000000000000..366531e03e66 --- /dev/null +++ b/worlds/okamihd/RegionsData/r11c.py @@ -0,0 +1,21 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { +} +locations = { + RegionNames.DRAGON_PALACE_CAVE: { + "Dragon Palace - Chest in treasure cave 1": LocData(container_check_id(MapIds.DRAGON_PALACE_TREASURE, 2)), + "Dragon Palace - Chest in treasure cave 2": LocData(container_check_id(MapIds.DRAGON_PALACE_TREASURE, 1)), + "Dragon Palace - Chest in treasure cave 3": LocData(container_check_id(MapIds.DRAGON_PALACE_TREASURE, 0)), + } +} diff --git a/worlds/okamihd/RegionsData/r203.py b/worlds/okamihd/RegionsData/r203.py index fa8404153b04..74082b5e9994 100644 --- a/worlds/okamihd/RegionsData/r203.py +++ b/worlds/okamihd/RegionsData/r203.py @@ -1,9 +1,12 @@ from typing import TYPE_CHECKING -from ..CheckIds import container_check_id, shop_check_id +from BaseClasses import LocationProgressType +from rule_builder.rules import Has +from ..CheckIds import container_check_id, shop_check_id, brush_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType -from ..Types import LocData, EventData, ExitData +from ..Enums.WarpType import WarpType +from ..Types import LocData, EventData, ExitData, WarpData from ..Enums.RegionNames import RegionNames, MapIds if TYPE_CHECKING: @@ -12,20 +15,28 @@ exits = { RegionNames.DRAGON_PALACE: [ ExitData(RegionNames.DRAGON_PALACE_SPRING, one_way=True, - has_events=["Dragon Palace - Get Shell Amulet from Otohime"]) + has_events=["Dragon Palace - Get Shell Amulet from Otohime"]), + ExitData(RegionNames.DRAGON_PALACE_GARDEN, one_way=True, + has_events=["Dragon Palace - Get Shell Amulet from Otohime"]), + ExitData(RegionNames.DRAGON_PALACE_CAVE, has_events=["Dragon Palace - Open Treasure Cave behind stairs"]) ], RegionNames.DRAGON_PALACE_SPRING: [ ExitData(RegionNames.DRAGON_PALACE, one_way=True) + ], + RegionNames.DRAGON_PALACE_GARDEN: [ + ExitData(RegionNames.DRAGON_PALACE, one_way=True) ] } events = { RegionNames.DRAGON_PALACE: { - "Dragon Palace - Open Secret Cave": EventData(cherry_bomb_level=1), + "Dragon Palace - Open Treasure Cave behind stairs": EventData(cherry_bomb_level=1), + # FIXME: This should give shell amulet, and it should be removed from pool since it can't be picked up rn # FIXME: Change this to a location later - "Dragon Palace - Get Shell Amulet from Otohime": EventData(), + "Dragon Palace - Get Shell Amulet from Otohime": EventData() }, - RegionNames.DRAGON_PALACE_SPRING:{ - "Dragon Palace - Restore the soothing spring":EventData(type=LocationType.DIGGING_MINIGAME_LATER,required_items_events=["Digging Champ"]) + RegionNames.DRAGON_PALACE_SPRING: { + "Dragon Palace - Restore the soothing spring": EventData(type=LocationType.DIGGING_MINIGAME_HARD, + required_items_events=["Digging Champ"]) } } locations = { @@ -40,7 +51,19 @@ "Dragon Palace - West Clam near Soothing Spring": LocData(container_check_id(MapIds.DRAGON_PALACE, 9)), "Dragon Palace -Chest on Pillars": LocData(container_check_id(MapIds.DRAGON_PALACE, 2), required_brush_techniques=[BrushTechniques.REJUVENATION], - required_items_events=["Holy Eagle"]) + required_items_events=["Holy Eagle"]), + "Dragon Palace - Nuregami (Fountain)": LocData(brush_check_id(16), required_items_events=[ + "Dragon Palace - Restore the soothing spring"]), + # FIXME: This chest doesn't have a cotnainer id ! + "Dragon Palace - Chest after fountain": LocData(1001, required_items_events=[ + "Dragon Palace - Restore the soothing spring"], progress_type=LocationProgressType.EXCLUDED) + }, + RegionNames.DRAGON_PALACE_GARDEN: { + "Dragon Palace - East Clam in garden": LocData(container_check_id(MapIds.DRAGON_PALACE, 8)), + "Dragon Palace - North Clam in garden": LocData(container_check_id(MapIds.DRAGON_PALACE, 7)), + "Dragon Palace - North Clam on ledge in garden": LocData(container_check_id(MapIds.DRAGON_PALACE, 6)), + "Dragon Palace - Chest after blooming the dragon's remains": LocData( + container_check_id(MapIds.DRAGON_PALACE, 0), required_brush_techniques=[BrushTechniques.GREENSPROUT_BLOOM]) } } shop_locations = { @@ -59,6 +82,9 @@ "Dragon Palace - Ms. Turtle's Shop Slot 12": LocData(shop_check_id(3, 11), type=LocationType.SHOP) } } -warps={ - -} \ No newline at end of file +warps = { + RegionNames.DRAGON_PALACE_SPRING: [ + WarpData(WarpType.MERMAID_SPRING, Has("Dragon Palace - Restore the soothing spring"), + Has("Dragon Palace - Restore the soothing spring")) + ] +} diff --git a/worlds/okamihd/RegionsData/r207.py b/worlds/okamihd/RegionsData/r207.py index d8ee7941d330..e12dbf6a5948 100644 --- a/worlds/okamihd/RegionsData/r207.py +++ b/worlds/okamihd/RegionsData/r207.py @@ -109,7 +109,7 @@ ) }, RegionNames.IMPERIAL_PALACE_FLASK_ROOM: { - "Imperial Palace - Kasugami": LocData(brush_check_id(16), type=LocationType.CONSTELLATION, + "Imperial Palace - Kasugami": LocData(brush_check_id(15), type=LocationType.CONSTELLATION, required_brush_techniques=[BrushTechniques.GALESTORM], power_slash_level=1,progress_type=LocationProgressType.EXCLUDED) }, From 82f054c3dc346b16c5cc2b722670442c1d923cab Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 5 Jun 2026 14:38:38 +0200 Subject: [PATCH 07/10] Missing rule for hard digging games --- worlds/okamihd/Rules.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index e65428ff1943..f003dad288ff 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -151,6 +151,12 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even required_cherry_bomb_level = max(required_cherry_bomb_level, 1) required_techinques += [BrushTechniques.GREENSPROUT_BLOOM, BrushTechniques.WATERSPOUT, BrushTechniques.GALESTORM] + case LocationType.DIGGING_MINIGAME_HARD: + required_power_slash_level = max(required_power_slash_level, 1) + required_cherry_bomb_level = max(required_cherry_bomb_level, 1) + required_techinques += [BrushTechniques.GREENSPROUT_BLOOM, BrushTechniques.WATERSPOUT, + BrushTechniques.GALESTORM] + rules.append(HasAll("Holy Eagle","Golden Ink Pot")) case LocationType.FROZEN_CHEST: required_techinques += [BrushTechniques.INFERNO] case LocationType.FISHING_MINIGAME: From 8a2d63d5f3dbdac864410cd8f71d43963a6e559f Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 5 Jun 2026 16:39:32 +0200 Subject: [PATCH 08/10] Add inside the dragon logic --- worlds/okamihd/Enums/OkamiEnemies.py | 3 +- worlds/okamihd/Enums/RegionNames.py | 6 ++ worlds/okamihd/RegionsData/__init__.py | 5 +- worlds/okamihd/RegionsData/r202.py | 17 +++--- worlds/okamihd/RegionsData/r203.py | 11 ++-- worlds/okamihd/RegionsData/r204.py | 79 ++++++++++++++++++++++++++ worlds/okamihd/RegionsData/rf0a.py | 5 +- 7 files changed, 112 insertions(+), 14 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r204.py diff --git a/worlds/okamihd/Enums/OkamiEnemies.py b/worlds/okamihd/Enums/OkamiEnemies.py index c7b25dfce532..46969f2aa81d 100644 --- a/worlds/okamihd/Enums/OkamiEnemies.py +++ b/worlds/okamihd/Enums/OkamiEnemies.py @@ -36,7 +36,7 @@ class OkamiEnemies(Enum): UME = EnnemyData(0x22, "Ume", 1) TAKE = EnnemyData(0x23, "Take", 1) CUTTERS = EnnemyData(0x57, "Mr and Ms.Cutter", 1) - CROW_TENGU = EnnemyData(0x57, "Crow Tengu", 1,requires_slash=True) + CROW_TENGU = EnnemyData(0x57, "Crow Tengu", 1, requires_slash=True) CHIMERA = EnnemyData(0x4e, "Chimera", 1, requires_slash=True) # don't require slash here bc it's required in the cutscene that follows, not to beat the boss itself CRIMSON_HELM = EnnemyData(0x11, "Crimson Helm", 1, required_techniques=[BrushTechniques.GALESTORM]) @@ -54,6 +54,7 @@ class OkamiEnemies(Enum): EARTH_NOSE = EnnemyData(0x54, "Earth Nose", 2, required_techniques=[BrushTechniques.VEIL_OF_MIST]) BLUE_CYCLOPS = EnnemyData(0x29, "Blue Cyclops", 2) BANDIT_SPIDER = EnnemyData(0x0b, "Bandit Spider", 2, required_techniques=[BrushTechniques.GREENSPROUT_VINE]) + TUBE_FOX = EnnemyData(0x0e, "Tube Fox", 3) @staticmethod def list(): diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index fe81bb3425ab..f63a66a05ca2 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -247,6 +247,11 @@ class RegionNames(StrEnum): DRAGON_PALACE_CAVE = "Dragon Palace (Treasure Cave)" DRAGON_PALACE_GARDEN = "Dragon Palace (Water Dragon's Garden)" + ## INSIDE THE DRAGON + INSIDE_THE_DRAGON = "Inside the dragon" + INSIDE_THE_DRAGON_DEEP = "Inside the dragon (Deeper part)" + INSIDE_THE_DRAGON_ORB = "Inside the dragon (Orb area)" + # SPECIAL REGIONS # Special Hub regions to handle warps MIST_WARP_HUB = "Mist Warp Hub" @@ -279,6 +284,7 @@ class MapIds(Enum): SEIAN_COMMONERS = 0x201 HIMIKO_PALACE = 0x202 DRAGON_PALACE = 0x203 + INSIDE_THE_DRAGON = 0x204 SUNKEN_SHIP = 0x205 IMPERIAL_PALACE = 0x206 IMPERIAL_PALACE_SMALL = 0x207 diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 04b007c00117..6a9b2e880e72 100644 --- a/worlds/okamihd/RegionsData/__init__.py +++ b/worlds/okamihd/RegionsData/__init__.py @@ -2,7 +2,7 @@ from . import menu, r100, r122, r101, r102, r103, r104, rf01, rf02, rf03, rf04, rf07, rf08, r108, r109, r107, r10e, \ r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c, r113, r114, r116, r117, r11a, r11d, \ - r20a, r203, r11c + r20a, r203, r11c, r204 if TYPE_CHECKING: from .. import OkamiWorld @@ -33,6 +33,7 @@ **r201.exits, **r202.exits, **r203.exits, + **r204.exits, **r205.exits, **r206.exits, **r207.exits, @@ -74,6 +75,7 @@ **r201.locations, **r202.locations, **r203.locations, + **r204.locations, **r205.locations, **r206.locations, **r207.locations, @@ -115,6 +117,7 @@ **r201.events, **r202.events, **r203.events, + **r204.events, **r205.events, **r206.events, **r207.events, diff --git a/worlds/okamihd/RegionsData/r202.py b/worlds/okamihd/RegionsData/r202.py index ad32b2096b25..3549c373daba 100644 --- a/worlds/okamihd/RegionsData/r202.py +++ b/worlds/okamihd/RegionsData/r202.py @@ -11,17 +11,20 @@ from .. import OkamiWorld exits = { - RegionNames.HIMIKO_PALACE:[ - ExitData(RegionNames.HIMIKO_CHAMBERS,has_events=["Himiko's Palace - Cross sea of fire"],loading_screen=False) + RegionNames.HIMIKO_PALACE: [ + ExitData(RegionNames.HIMIKO_CHAMBERS, has_events=["Himiko's Palace - Cross sea of fire"], loading_screen=False) ] } events = { - RegionNames.HIMIKO_PALACE:{ + RegionNames.HIMIKO_PALACE: { "Himiko's Palace - Cross sea of fire": EventData(required_items_events=["Fire Tablet"]) }, - RegionNames.HIMIKO_CHAMBERS:{ + RegionNames.HIMIKO_CHAMBERS: { # Vanilla event that opens N. Ryoshima Coast - to replace with something else when needed. - "Himiko's Palace - Hear Himiko's request": EventData() + "Himiko's Palace - Hear Himiko's request": EventData(), + "Himiko's Palace - Get Oni Island Location": EventData( + required_items_events=["Dragon Palace - Give Dragon Orb to Otohime", + "Ryoshima Coast - Open shortcut to Sei-an City"]) } } locations = { @@ -32,7 +35,7 @@ required_items_events=["Fire Tablet"]) }, # Special check - RegionNames.HIMIKO_CHAMBERS:{ - "Himiko's Palace - Get Border Key from Queen Himiko":LocData(1000,progress_type=LocationProgressType.EXCLUDED) + RegionNames.HIMIKO_CHAMBERS: { + "Himiko's Palace - Get Border Key from Queen Himiko": LocData(1000, progress_type=LocationProgressType.EXCLUDED) } } diff --git a/worlds/okamihd/RegionsData/r203.py b/worlds/okamihd/RegionsData/r203.py index 74082b5e9994..294dd67127d9 100644 --- a/worlds/okamihd/RegionsData/r203.py +++ b/worlds/okamihd/RegionsData/r203.py @@ -24,7 +24,8 @@ ExitData(RegionNames.DRAGON_PALACE, one_way=True) ], RegionNames.DRAGON_PALACE_GARDEN: [ - ExitData(RegionNames.DRAGON_PALACE, one_way=True) + ExitData(RegionNames.DRAGON_PALACE, one_way=True), + ExitData(RegionNames.INSIDE_THE_DRAGON) ] } events = { @@ -32,7 +33,8 @@ "Dragon Palace - Open Treasure Cave behind stairs": EventData(cherry_bomb_level=1), # FIXME: This should give shell amulet, and it should be removed from pool since it can't be picked up rn # FIXME: Change this to a location later - "Dragon Palace - Get Shell Amulet from Otohime": EventData() + "Dragon Palace - Get Shell Amulet from Otohime": EventData(), + "Dragon Palace - Give Dragon Orb to Otohime": EventData(required_items_events=["Inside the dragon - Get Dragon Orb"]) }, RegionNames.DRAGON_PALACE_SPRING: { "Dragon Palace - Restore the soothing spring": EventData(type=LocationType.DIGGING_MINIGAME_HARD, @@ -54,7 +56,7 @@ required_items_events=["Holy Eagle"]), "Dragon Palace - Nuregami (Fountain)": LocData(brush_check_id(16), required_items_events=[ "Dragon Palace - Restore the soothing spring"]), - # FIXME: This chest doesn't have a cotnainer id ! + # FIXME: This chest doesn't have a container id ! "Dragon Palace - Chest after fountain": LocData(1001, required_items_events=[ "Dragon Palace - Restore the soothing spring"], progress_type=LocationProgressType.EXCLUDED) }, @@ -63,7 +65,8 @@ "Dragon Palace - North Clam in garden": LocData(container_check_id(MapIds.DRAGON_PALACE, 7)), "Dragon Palace - North Clam on ledge in garden": LocData(container_check_id(MapIds.DRAGON_PALACE, 6)), "Dragon Palace - Chest after blooming the dragon's remains": LocData( - container_check_id(MapIds.DRAGON_PALACE, 0), required_brush_techniques=[BrushTechniques.GREENSPROUT_BLOOM]) + container_check_id(MapIds.DRAGON_PALACE, 0), required_brush_techniques=[BrushTechniques.GREENSPROUT_BLOOM], + required_items_events=["Inside the dragon - Get Dragon Orb"]) } } shop_locations = { diff --git a/worlds/okamihd/RegionsData/r204.py b/worlds/okamihd/RegionsData/r204.py new file mode 100644 index 000000000000..56b777606def --- /dev/null +++ b/worlds/okamihd/RegionsData/r204.py @@ -0,0 +1,79 @@ +from typing import TYPE_CHECKING + +from BaseClasses import LocationProgressType +from rule_builder.rules import Has, HasAny +from ..CheckIds import container_check_id, shop_check_id, brush_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Enums.WarpType import WarpType +from ..Types import LocData, EventData, ExitData, WarpData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.INSIDE_THE_DRAGON: [ + ExitData(RegionNames.INSIDE_THE_DRAGON_DEEP, has_events=["Inside the dragon - Cross to deeper part"]) + ], + RegionNames.INSIDE_THE_DRAGON_DEEP: [ + ExitData(RegionNames.INSIDE_THE_DRAGON_ORB, has_events=["Inside the dragon - Open door to dragon orb"]) + ] +} +events = { + RegionNames.INSIDE_THE_DRAGON: { + "Inside the dragon - Cross to deeper part": EventData( + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + "Inside the dragon - Grab the key": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT]) + + }, + RegionNames.INSIDE_THE_DRAGON_DEEP: { + "Inside the dragon - Open door to dragon orb": EventData( + required_items_events=["Inside the dragon - Grab the key"]) + }, + RegionNames.INSIDE_THE_DRAGON_ORB: { + "Inside the dragon - Flood with acid": EventData( + required_brush_techniques=[BrushTechniques.WATERSPOUT],needs_long_swim=True), + "Inside the dragon - Get Dragon Orb": EventData( + required_brush_techniques=[BrushTechniques.WATERSPOUT], needs_long_swim=True ,mandatory_enemies=[OkamiEnemies.TUBE_FOX]), + } + +} +locations = { + RegionNames.INSIDE_THE_DRAGON: { + "Inside the dragon - Clam on pillar near entrance": LocData(container_check_id(MapIds.INSIDE_THE_DRAGON, 3)), + "Inside the dragon - Freestanding Clam near entrance 1": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 4)), + "Inside the dragon - Freestanding Clam near entrance 2": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 0)), + "Inside the dragon - Freestanding Clam on high east pillar near entrance": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 1)), + "Inside the dragon - Clam on first pillar after tunnel": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 2), + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + "Inside the dragon - Clam on middle pillar after tunnel": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 5), + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + "Inside the dragon - Clam on last pillars after tunnel high": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 7), + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + "Inside the dragon - Clam on last pillars after tunnel low": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 6), + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + + # FIXME: Check if those really need digging champ + "Inside the dragon - Buried Clam near entrance west of river": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 9), type=LocationType.STONE_BURIED_CHEST), + "Inside the dragon - Buried Clam before small bridge": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 10), type=LocationType.STONE_BURIED_CHEST), + }, + RegionNames.INSIDE_THE_DRAGON_DEEP: { + "Inside the dragon - Chest in hidden waterspout area near origin mirror": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 8), required_brush_techniques=[BrushTechniques.WATERSPOUT]), + "Inside the dragon - Buried Clam After crossing pillars": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 11), type=LocationType.STONE_BURIED_CHEST), + "Inside the dragon - Buried Clam near origin mirror": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 12), type=LocationType.STONE_BURIED_CHEST), + } +} diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index ca2bb3b5d76e..4b16441f270b 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -24,7 +24,9 @@ ExitData(RegionNames.FAWNS_HOUSE, has_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]), ExitData(RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON, one_way=True, has_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False), - ExitData(RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER,has_events=["Ryoshima Coast - Open Bandit Spider Cave"],one_way=True) + ExitData(RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER,has_events=["Ryoshima Coast - Open Bandit Spider Cave"],one_way=True), + ExitData(RegionNames.SEIAN_CITY_TREASURE_EAST,has_events=["Ryoshima Coast - Open shortcut to Sei-an City"]) + ], RegionNames.RYOSHIMA_COAST_SEA: [ ExitData(RegionNames.RYOSHIMA_COAST_DOJO, needs_long_swim=True, loading_screen=False), @@ -66,6 +68,7 @@ "Ryoshima Coast - Open Shortcut To Mme Fawn's": EventData(), "Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance": EventData(mandatory_enemies=[OkamiEnemies.ICE_LIPS,OkamiEnemies.THUNDER_EAR]), "Ryoshima Coast - Open Bandit Spider Cave": EventData(required_items_events=["Digging Champ"]), + "Ryoshima Coast - Open shortcut to Sei-an City":EventData(required_items_events=["Dragon Palace - Give Dragon Orb to Otohime"]) }, RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: { From a7a7d1022e078f97001c7b08e4090cadcf2c64de Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 5 Jun 2026 18:04:36 +0200 Subject: [PATCH 09/10] add some left behind changes --- worlds/okamihd/RegionsData/rf0c.py | 3 ++- worlds/okamihd/Rules.py | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/okamihd/RegionsData/rf0c.py b/worlds/okamihd/RegionsData/rf0c.py index a83fea4b8594..debd419340a2 100644 --- a/worlds/okamihd/RegionsData/rf0c.py +++ b/worlds/okamihd/RegionsData/rf0c.py @@ -94,7 +94,8 @@ mandatory_enemies=[OkamiEnemies.BLUE_CYCLOPS]), }, RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS:{ - "Northern Ryoshima Coast - Open Whirlpool":EventData(required_brush_techniques=[BrushTechniques.GALESTORM]) + "Northern Ryoshima Coast - Open Whirlpool":EventData(required_brush_techniques=[BrushTechniques.GALESTORM]), + "Northern Ryoshima Coast - Open Bridge to Oni Island":EventData(required_items_events=["Himiko's Palace - Get Oni Island Location"]) }, RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND: { "Northern Ryoshima Coast - Fish Marlin": EventData( diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index f003dad288ff..c3d8ce83f3af 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -30,8 +30,7 @@ gale_shrine_access: Rule = HasGroup("canine_warriors", count=FromOption(RequiredDoggorbs)) moon_cave_access: Rule = Has("Serpent Crystal") -# FIXME: Set correct event name for dragon -n_ryoshima_islands_dragon_rule: Rule = Or(Has("Orca"), HasAll("Water Tablet", "Defeat the Dragon")) +n_ryoshima_islands_dragon_rule: Rule = Or(Has("Orca"), HasAll("Water Tablet", "Inside the dragon - Get Dragon Orb")) n_ryoshima_guardian_sapling_rule:Rule= Or(long_swim_rule,Has("Orca")) From 65882acc036b39adc46a010bec84972495a0de1a Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 8 Jun 2026 14:07:49 +0200 Subject: [PATCH 10/10] change field name for new ExitData struc --- worlds/okamihd/RegionsData/r113.py | 2 +- worlds/okamihd/RegionsData/r11a.py | 2 +- worlds/okamihd/RegionsData/r203.py | 6 +++--- worlds/okamihd/RegionsData/r204.py | 4 ++-- worlds/okamihd/RegionsData/rf08.py | 2 +- worlds/okamihd/RegionsData/rf0a.py | 6 +++--- worlds/okamihd/RegionsData/rf0c.py | 18 +++++++++--------- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/worlds/okamihd/RegionsData/r113.py b/worlds/okamihd/RegionsData/r113.py index 71ade7b11bc8..c2bad7bf25c7 100644 --- a/worlds/okamihd/RegionsData/r113.py +++ b/worlds/okamihd/RegionsData/r113.py @@ -10,7 +10,7 @@ exits = { RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER: [ - ExitData(RegionNames.RYOSHIMA_COAST, one_way=True, has_events=["Ryoshima Coast - Defeat Bandit Spider in cave"]) + ExitData(RegionNames.RYOSHIMA_COAST, one_way=True, required_items_events=["Ryoshima Coast - Defeat Bandit Spider in cave"]) ] } events = { diff --git a/worlds/okamihd/RegionsData/r11a.py b/worlds/okamihd/RegionsData/r11a.py index a53b331d23a6..970e811a4be9 100644 --- a/worlds/okamihd/RegionsData/r11a.py +++ b/worlds/okamihd/RegionsData/r11a.py @@ -10,7 +10,7 @@ exits = { RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE: [ - ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND, one_way=True, has_events=["Northern Ryoshima Coast - Defeat Bandit Spider in cave"]) + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND, one_way=True, required_items_events=["Northern Ryoshima Coast - Defeat Bandit Spider in cave"]) ] } events = { diff --git a/worlds/okamihd/RegionsData/r203.py b/worlds/okamihd/RegionsData/r203.py index 294dd67127d9..112a72f92266 100644 --- a/worlds/okamihd/RegionsData/r203.py +++ b/worlds/okamihd/RegionsData/r203.py @@ -15,10 +15,10 @@ exits = { RegionNames.DRAGON_PALACE: [ ExitData(RegionNames.DRAGON_PALACE_SPRING, one_way=True, - has_events=["Dragon Palace - Get Shell Amulet from Otohime"]), + required_items_events=["Dragon Palace - Get Shell Amulet from Otohime"]), ExitData(RegionNames.DRAGON_PALACE_GARDEN, one_way=True, - has_events=["Dragon Palace - Get Shell Amulet from Otohime"]), - ExitData(RegionNames.DRAGON_PALACE_CAVE, has_events=["Dragon Palace - Open Treasure Cave behind stairs"]) + required_items_events=["Dragon Palace - Get Shell Amulet from Otohime"]), + ExitData(RegionNames.DRAGON_PALACE_CAVE, required_items_events=["Dragon Palace - Open Treasure Cave behind stairs"]) ], RegionNames.DRAGON_PALACE_SPRING: [ ExitData(RegionNames.DRAGON_PALACE, one_way=True) diff --git a/worlds/okamihd/RegionsData/r204.py b/worlds/okamihd/RegionsData/r204.py index 56b777606def..37d4f4f48868 100644 --- a/worlds/okamihd/RegionsData/r204.py +++ b/worlds/okamihd/RegionsData/r204.py @@ -15,10 +15,10 @@ exits = { RegionNames.INSIDE_THE_DRAGON: [ - ExitData(RegionNames.INSIDE_THE_DRAGON_DEEP, has_events=["Inside the dragon - Cross to deeper part"]) + ExitData(RegionNames.INSIDE_THE_DRAGON_DEEP, required_items_events=["Inside the dragon - Cross to deeper part"]) ], RegionNames.INSIDE_THE_DRAGON_DEEP: [ - ExitData(RegionNames.INSIDE_THE_DRAGON_ORB, has_events=["Inside the dragon - Open door to dragon orb"]) + ExitData(RegionNames.INSIDE_THE_DRAGON_ORB, required_items_events=["Inside the dragon - Open door to dragon orb"]) ] } events = { diff --git a/worlds/okamihd/RegionsData/rf08.py b/worlds/okamihd/RegionsData/rf08.py index 750f31de565d..6abc7f8f90c9 100644 --- a/worlds/okamihd/RegionsData/rf08.py +++ b/worlds/okamihd/RegionsData/rf08.py @@ -17,7 +17,7 @@ ExitData(RegionNames.SASA_SANCTUARY_ENTRANCE), ExitData(RegionNames.CITY_CHECKPOINT_TAKA), ExitData(RegionNames.TAKA_COMMON_LOGIC, one_way=True, loading_screen=False), - ExitData(RegionNames.TAKA_PASS_CAVE,has_events=["Taka Pass - Open Digging Cave"]) + ExitData(RegionNames.TAKA_PASS_CAVE,required_items_events=["Taka Pass - Open Digging Cave"]) ] } diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 0935a43afc9d..0caf72916d63 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -24,8 +24,8 @@ ExitData(RegionNames.FAWNS_HOUSE, required_items_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]), ExitData(RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON, one_way=True, required_items_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False), - ExitData(RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER,has_events=["Ryoshima Coast - Open Bandit Spider Cave"],one_way=True), - ExitData(RegionNames.SEIAN_CITY_TREASURE_EAST,has_events=["Ryoshima Coast - Open shortcut to Sei-an City"]) + ExitData(RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER,required_items_events=["Ryoshima Coast - Open Bandit Spider Cave"],one_way=True), + ExitData(RegionNames.SEIAN_CITY_TREASURE_EAST,required_items_events=["Ryoshima Coast - Open shortcut to Sei-an City"]) ], RegionNames.RYOSHIMA_COAST_SEA: [ @@ -48,7 +48,7 @@ # Special Handling for the encounter around Seian, city entrance as the enemies inside require galestrom to be beaten. ExitData(RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER, one_way=True, loading_screen=False), ExitData(RegionNames.SEIAN_CITY_COMMONERS_DRY), - ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT, has_events=["Ryoshima Coast - Open Door to North Ryoshima Coast"],one_way=True) + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT, required_items_events=["Ryoshima Coast - Open Door to North Ryoshima Coast"],one_way=True) ], RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON: [ ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False,needs_long_swim=True), diff --git a/worlds/okamihd/RegionsData/rf0c.py b/worlds/okamihd/RegionsData/rf0c.py index debd419340a2..82c550ca9e36 100644 --- a/worlds/okamihd/RegionsData/rf0c.py +++ b/worlds/okamihd/RegionsData/rf0c.py @@ -16,9 +16,9 @@ exits = { RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT: [ ExitData(RegionNames.RYOSHIMA_COAST_SEIAN, one_way=True, loading_screen=False, - has_events=["Northern Ryoshima Coast - Mandatory Earth Nose Fight"]), + required_items_events=["Northern Ryoshima Coast - Mandatory Earth Nose Fight"]), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False, - has_events=["Northern Ryoshima Coast - Mandatory Earth Nose Fight"]) + required_items_events=["Northern Ryoshima Coast - Mandatory Earth Nose Fight"]) ], RegionNames.NORTHERN_RYOSHIMA_COAST: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT, one_way=True, loading_screen=False), @@ -27,7 +27,7 @@ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_SAPLING, loading_screen=False, special_rule=n_ryoshima_guardian_sapling_rule), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB, loading_screen=False, one_way=True, - has_events=["Northern Ryoshima Coast - Climb to Tomb Cave"]), + required_items_events=["Northern Ryoshima Coast - Climb to Tomb Cave"]), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND, loading_screen=False, special_rule=n_ryoshima_islands_dragon_rule), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_NORTH, loading_screen=False, @@ -44,13 +44,13 @@ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND, loading_screen=False, special_rule=n_ryoshima_islands_dragon_rule), ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE, - has_events=["Northern Ryoshima Coast - Open Treasure Cave"]), + required_items_events=["Northern Ryoshima Coast - Open Treasure Cave"]), ExitData(RegionNames.DRAGON_PALACE, loading_screen=False, - special_rule=n_ryoshima_islands_dragon_rule,has_events=["Northern Ryoshima Coast - Open Whirlpool"]), + special_rule=n_ryoshima_islands_dragon_rule,required_items_events=["Northern Ryoshima Coast - Open Whirlpool"]), ], RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS, one_way=True, loading_screen=False, - has_events=["Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape"]) + required_items_events=["Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape"]) ], RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False) @@ -60,15 +60,15 @@ ], RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_ISLAND: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE, - has_events=["Northern Ryoshima Coast - Open Power Slash 2 Cave"]) + required_items_events=["Northern Ryoshima Coast - Open Power Slash 2 Cave"]) ], RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_CAVE, - has_events=["Northern Ryoshima Coast - Open Cherry Bomb 2 Cave"]) + required_items_events=["Northern Ryoshima Coast - Open Cherry Bomb 2 Cave"]) ], RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND: [ ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE, - has_events=["Northern Ryoshima Coast - Open Bandit Spider Cave"], + required_items_events=["Northern Ryoshima Coast - Open Bandit Spider Cave"], one_way=True) ], RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND:[