From 42071d139232f9ae3650f0995d1dcb745102c596 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 8 May 2026 15:55:32 +0200 Subject: [PATCH 01/30] Add City Checkpoint logic --- worlds/okamihd/Enums/RegionNames.py | 13 +++- worlds/okamihd/Regions.py | 1 + worlds/okamihd/RegionsData/__init__.py | 6 +- worlds/okamihd/RegionsData/r105.py | 85 ++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r105.py diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index e53153a030e3..121c5fe4602a 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -41,7 +41,7 @@ class RegionNames(StrEnum): SHINSHU_FIELD = "Shinshu Field" SHINSHU_FIELD_AGATA_CAVE = "Shinshu Field (Cave to Agata Forest)" TAMA_HOUSE = "Tama's house" - SHINSHU_PLATEAU="Shinshu Field Plateau" + SHINSHU_PLATEAU = "Shinshu Field Plateau" ## HANA VALLEY CURSED_HANA_VALLEY = "Cursed Hana Valley" @@ -117,6 +117,13 @@ class RegionNames(StrEnum): MOON_CAVE_4F_AFTER_CANON = "Moon Cave (4F after canon)" MOON_CAVE_OROCHI = "Moon Cave (Orochi)" + ##CITY CHECKPOINT + CITY_CHECKPOINT_TAKA="City Checkpoint (Taka side)" + CITY_CHECKPOINT_DRAWBRIDGE="City Checkpoint Drawbridge" + CITY_CHECKPOINT_RYOSHIMA="City Checkpoint (Ryoshima side)" + CITY_CHECKPOINT_RIVER="City Checkpoint (River)" + + # Reference https://github.com/Axertin/okami-apclient/blob/master/include/okami/maps.hpp class MapIds(Enum): CURSED_KAMIKI = 0x100 @@ -124,11 +131,12 @@ class MapIds(Enum): KAMIKI_VILLAGE = 0x102 HANA_VALLEY = 0x103 TSUTA_RUINS = 0x104 + CITY_CHECKPOINT = 0x105 GALE_SHRINE = 0x107 KUSA_VILLAGE = 0x108 SASA_SANCTUARY = 0x109 AGATA_FOREST_MME_FAWN = 0x10A - CALCIFIED_CAVERN=0x10E + CALCIFIED_CAVERN = 0x10E MOON_CAVE = 0x110 RIVER_OF_THE_HEAVENS = 0x122 CURSED_SHINSHU = 0xF01 @@ -145,6 +153,7 @@ class MapIndexes(Enum): KAMIKI_VILLAGE = 3 HANA_VALLEY = 4 TSUTA_RUINS = 5 + CITY_CHECKPOINT = 6 GALE_SHRINE = 8 KUSA_VILLAGE = 9 SASA_SANCTUARY = 10 diff --git a/worlds/okamihd/Regions.py b/worlds/okamihd/Regions.py index 35126c9c7602..3c1aa290309b 100644 --- a/worlds/okamihd/Regions.py +++ b/worlds/okamihd/Regions.py @@ -37,6 +37,7 @@ def create_region_exits(reg: Region, world: "OkamiWorld"): exiting_region = world.multiworld.get_region(exit_data.destination, world.player) ext = reg.connect(exiting_region, exit_data.name) apply_exit_rules(ext, ext.name, exit_data, world) + ext def get_region_location_count(world: "OkamiWorld", region_name: str, included_only: bool = True) -> int: diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index d02e6d853836..a9a49e256158 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 + r10e, r110, rf06, r105 if TYPE_CHECKING: from .. import OkamiWorld @@ -13,6 +13,7 @@ **r102.exits, **r103.exits, **r104.exits, + **r105.exits, **r107.exits, **r108.exits, **r109.exits, @@ -34,6 +35,7 @@ **r102.locations, **r103.locations, **r104.locations, + **r105.locations, **r107.locations, **r108.locations, **r109.locations, @@ -55,6 +57,7 @@ **r102.events, **r103.events, **r104.events, + **r105.events, **r107.events, **r108.events, **r109.events, @@ -73,6 +76,7 @@ # Shop locations are separate because they're conditionally created based on RandomizeShops okami_shop_locations = { **getattr(r102, 'shop_locations', {}), + **getattr(r105, 'shop_locations', {}), **getattr(r108, 'shop_locations', {}), **getattr(r109, 'shop_locations', {}), **getattr(r110, 'shop_locations', {}), diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py new file mode 100644 index 000000000000..ef6ec3d973cc --- /dev/null +++ b/worlds/okamihd/RegionsData/r105.py @@ -0,0 +1,85 @@ +from typing import TYPE_CHECKING + +from rule_builder.rules import Or, Has, HasAll +from ..CheckIds import shop_check_id, container_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.CITY_CHECKPOINT_TAKA: [ + ExitData("Enter the Drawbridge", RegionNames.CITY_CHECKPOINT_DRAWBRIDGE, + has_events=["City Checkpoint - Activate the Drawbridge"]), + # Setup this connection only bc it is always both ways. ignore the fact that you can go down to the river from the other side. + ExitData("Use ramp to go down to the river", RegionNames.CITY_CHECKPOINT_RIVER) + ], + RegionNames.CITY_CHECKPOINT_DRAWBRIDGE: [ + ExitData("Exit the Drawbridge", RegionNames.CITY_CHECKPOINT_RYOSHIMA) + ] +} +events = { + RegionNames.CITY_CHECKPOINT_TAKA: { + # Not setting any logic for this event yet, as we'll probably handle it in a specific way. + "City Checkpoint - Activate the Drawbridge": EventData() + }, + RegionNames.CITY_CHECKPOINT_RYOSHIMA: { + "City Checkpoint - Restore Cursed Patches on Ryoshima side": EventData( + required_brush_techniques=[BrushTechniques.GREENSPROUT_BLOOM]) + } +} +locations = { + + RegionNames.CITY_CHECKPOINT_TAKA: { + "City Checkpoint - Buried chest behind merchant": LocData(container_check_id(MapIds.CITY_CHECKPOINT, 6), + type=LocationType.BURIED_CHEST), + + "City Checkpoint - Chest under ramp": LocData(container_check_id(MapIds.CITY_CHECKPOINT, 7)), + + }, + + RegionNames.CITY_CHECKPOINT_DRAWBRIDGE: { + "City Checkpoint - Chest inside torches circle": LocData(container_check_id(MapIds.CITY_CHECKPOINT, 1), + required_brush_techniques=[ + BrushTechniques.GREENSPROUT_VINE]), + "City Checkpoint - Chest on top of rock": LocData(container_check_id(MapIds.CITY_CHECKPOINT, 2), + required_brush_techniques=[ + BrushTechniques.GREENSPROUT_VINE]), + }, + RegionNames.CITY_CHECKPOINT_RYOSHIMA: { + "City Checkpoint - Buried Chest on Ryoshima side after cursed patches": LocData( + container_check_id(MapIds.CITY_CHECKPOINT, 13), type=LocationType.BURIED_CHEST), + }, + RegionNames.CITY_CHECKPOINT_RIVER: { + "City Checkpoint - Southernmost buried chest on river's edge ": LocData( + container_check_id(MapIds.CITY_CHECKPOINT, 8)), + "City Checkpoint - Buried chest on river's edge South near waterfall ": LocData( + container_check_id(MapIds.CITY_CHECKPOINT, 9)), + "City Checkpoint - Burning chest on river's edge South near waterfall ": LocData( + container_check_id(MapIds.CITY_CHECKPOINT, 12), type=LocationType.BURNING_CHEST), + # Special Rule for the river access - You need either Water Tablet or (Waterlily and Gaelstrom) + "City Checkpoint - Buired Chest on River Northern Island": LocData( + container_check_id(MapIds.CITY_CHECKPOINT, 16), special_rule=Or(Has("Water Tablet"), HasAll( + BrushTechniques.GREENSPROUT_WATERLILY, BrushTechniques.GALESTORM))) + } +} + +shop_locations = { + RegionNames.CITY_CHECKPOINT_TAKA: { + "City Checkpoint - Shop Slot 1": LocData(shop_check_id(2, 0), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 2": LocData(shop_check_id(2, 1), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 3": LocData(shop_check_id(2, 2), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 4": LocData(shop_check_id(2, 3), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 5": LocData(shop_check_id(2, 4), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 6": LocData(shop_check_id(2, 5), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 7": LocData(shop_check_id(2, 6), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 8": LocData(shop_check_id(2, 7), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 9": LocData(shop_check_id(2, 8), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 10": LocData(shop_check_id(2, 9), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 11": LocData(shop_check_id(2, 10), type=LocationType.SHOP), + "City Checkpoint - Shop Slot 12": LocData(shop_check_id(2, 11), type=LocationType.SHOP), + } +} From 2d8e761cdc7ceeadc5d0185aca387462119fee36 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 8 May 2026 16:08:42 +0200 Subject: [PATCH 02/30] Link City Checkpoint to everything else --- worlds/okamihd/RegionsData/rf08.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/okamihd/RegionsData/rf08.py b/worlds/okamihd/RegionsData/rf08.py index 1e89b6a7c889..05cfba4f6bc7 100644 --- a/worlds/okamihd/RegionsData/rf08.py +++ b/worlds/okamihd/RegionsData/rf08.py @@ -12,7 +12,8 @@ exits={ RegionNames.TAKA_PASS:[ExitData("Kusa Village Entrance",RegionNames.KUSA_VILLAGE), - ExitData("Sasa Sanctuary Entrance",RegionNames.SASA_SANCTUARY_ENTRANCE)] + ExitData("Sasa Sanctuary Entrance",RegionNames.SASA_SANCTUARY_ENTRANCE), + ExitData("City Checkpoint Entrance",RegionNames.CITY_CHECKPOINT_TAKA)] } events={ From 6f8a17cef6dd94bc4a3311cfb8ea7973410167cb Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Fri, 8 May 2026 16:30:00 +0200 Subject: [PATCH 03/30] Ryoshima Coast Access and resotration --- worlds/okamihd/Enums/RegionNames.py | 12 ++++++++++- worlds/okamihd/RegionsData/r105.py | 3 +++ worlds/okamihd/RegionsData/rf09.py | 32 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 worlds/okamihd/RegionsData/rf09.py diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index 121c5fe4602a..aeecdf94fede 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -117,12 +117,19 @@ class RegionNames(StrEnum): MOON_CAVE_4F_AFTER_CANON = "Moon Cave (4F after canon)" MOON_CAVE_OROCHI = "Moon Cave (Orochi)" - ##CITY CHECKPOINT + ## CITY CHECKPOINT CITY_CHECKPOINT_TAKA="City Checkpoint (Taka side)" CITY_CHECKPOINT_DRAWBRIDGE="City Checkpoint Drawbridge" CITY_CHECKPOINT_RYOSHIMA="City Checkpoint (Ryoshima side)" CITY_CHECKPOINT_RIVER="City Checkpoint (River)" + # Western Nippon + + ## RYOSHIMA COAST + CURSED_RYOSHIMA_COAST="Cursed Ryoshima Coast" + CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE= "Cursed Ryoshima Coast" + RYOSHIMA_COAST="Ryoshima Coast" + # Reference https://github.com/Axertin/okami-apclient/blob/master/include/okami/maps.hpp class MapIds(Enum): @@ -145,6 +152,8 @@ class MapIds(Enum): HEALED_AGATA = 0xF04 CURSED_TAKA = 0xF07 HEALED_TAKA = 0xF08 + CURSED_RYOSHIMA = 0xF09 + HEALED_RYOSHIMA = 0xF0A class MapIndexes(Enum): @@ -164,3 +173,4 @@ class MapIndexes(Enum): SHINSHU_FIELD = 71 AGATA_FOREST = 72 TAKA_PASS = 74 + RYOSHIMA_COAST= 75 diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index ef6ec3d973cc..30e9eddfe1d3 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -19,6 +19,9 @@ ], RegionNames.CITY_CHECKPOINT_DRAWBRIDGE: [ ExitData("Exit the Drawbridge", RegionNames.CITY_CHECKPOINT_RYOSHIMA) + ], + RegionNames.CITY_CHECKPOINT_RYOSHIMA:[ + ExitData("Exit to Ryoshima Coast",RegionNames.CURSED_RYOSHIMA_COAST) ] } events = { diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py new file mode 100644 index 000000000000..45b54e1c88a6 --- /dev/null +++ b/worlds/okamihd/RegionsData/rf09.py @@ -0,0 +1,32 @@ +from typing import TYPE_CHECKING + +from ..Enums.BrushTechniques import BrushTechniques +from ..Types import ExitData, EventData, LocData +from ..Enums.RegionNames import RegionNames + +if TYPE_CHECKING: + pass + +exits = { + RegionNames.CURSED_RYOSHIMA_COAST: [ + ExitData('Enter Guardian Sapling Cave', RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE, + has_events=["Ryoshima Coast - Open Guardian Sapling Cave"]) + ], + RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE:[ + ExitData('Ryoshima Coast Restoration',RegionNames.RYOSHIMA_COAST,has_events=["Ryoshima Coast - Bloom the Guardian Sapling"]) + ] +} +events = { + RegionNames.CURSED_RYOSHIMA_COAST: { + "Ryoshima Coast - Open Guardian Sapling Cave": EventData(cherry_bomb_level=1) + }, + RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE: { + "Ryoshima Coast - Water the Guardian Sapling": EventData( + required_brush_techniques=[BrushTechniques.WATERSPOUT]), + "Ryoshima Coast - Bloom the Guardian Sapling": EventData( + required_brush_techniques=[BrushTechniques.GREENSPROUT_BLOOM], + required_items_events=["Ryoshima Coast - Water the Guardian Sapling"]) + } +} +locations = { +} From 27a8d18edd589cd27c0edf565ac96343295250ab Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sat, 9 May 2026 19:05:13 +0200 Subject: [PATCH 04/30] Rewrite City checkpoint entrances with new system --- worlds/okamihd/RegionsData/r105.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index ef6ec3d973cc..5facdc41b35c 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -12,13 +12,15 @@ exits = { RegionNames.CITY_CHECKPOINT_TAKA: [ - ExitData("Enter the Drawbridge", RegionNames.CITY_CHECKPOINT_DRAWBRIDGE, - has_events=["City Checkpoint - Activate the Drawbridge"]), - # Setup this connection only bc it is always both ways. ignore the fact that you can go down to the river from the other side. - ExitData("Use ramp to go down to the river", RegionNames.CITY_CHECKPOINT_RIVER) + ExitData(RegionNames.CITY_CHECKPOINT_DRAWBRIDGE, + has_events=["City Checkpoint - Activate the Drawbridge"],loading_screen=False), + ExitData(RegionNames.CITY_CHECKPOINT_RIVER,loading_screen=False) ], RegionNames.CITY_CHECKPOINT_DRAWBRIDGE: [ - ExitData("Exit the Drawbridge", RegionNames.CITY_CHECKPOINT_RYOSHIMA) + ExitData(RegionNames.CITY_CHECKPOINT_RYOSHIMA) + ], + RegionNames.CITY_CHECKPOINT_RYOSHIMA:[ + ExitData(RegionNames.CITY_CHECKPOINT_RIVER,loading_screen=False,one_way=True) ] } events = { From fc6ae2bd7ce29fdcc6311b1665e8ffbf97ecc0e8 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sat, 9 May 2026 20:37:25 +0200 Subject: [PATCH 05/30] Rewrite warps with new system --- worlds/okamihd/RegionsData/r105.py | 4 ++-- worlds/okamihd/RegionsData/rf09.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index fa8eae44110f..d532a86aec96 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -21,10 +21,10 @@ ], RegionNames.CITY_CHECKPOINT_RYOSHIMA:[ ExitData(RegionNames.CITY_CHECKPOINT_RIVER,loading_screen=False,one_way=True), - ExitData(RegionNames.CURSED_RYOSHIMA_COAST) + ExitData(RegionNames.CURSED_RYOSHIMA_COAST), + ExitData(RegionNames.RYOSHIMA_COAST,has_events=["Ryoshima Coast - Bloom the Guardian Sapling"]) ], - } events = { RegionNames.CITY_CHECKPOINT_TAKA: { diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py index 45b54e1c88a6..b552bbd91ea8 100644 --- a/worlds/okamihd/RegionsData/rf09.py +++ b/worlds/okamihd/RegionsData/rf09.py @@ -9,11 +9,11 @@ exits = { RegionNames.CURSED_RYOSHIMA_COAST: [ - ExitData('Enter Guardian Sapling Cave', RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE, - has_events=["Ryoshima Coast - Open Guardian Sapling Cave"]) + ExitData(RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE, + has_events=["Ryoshima Coast - Open Guardian Sapling Cave"],loading_screen=False) ], RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE:[ - ExitData('Ryoshima Coast Restoration',RegionNames.RYOSHIMA_COAST,has_events=["Ryoshima Coast - Bloom the Guardian Sapling"]) + ExitData(RegionNames.RYOSHIMA_COAST,has_events=["Ryoshima Coast - Bloom the Guardian Sapling"],one_way=True) ] } events = { From 9f1368767fdd9f40abd8e381ee212dab4875faa1 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 10 May 2026 00:45:02 +0200 Subject: [PATCH 06/30] Add Ryoshima Coast Logic --- worlds/okamihd/Enums/OkamiEnemies.py | 9 +- worlds/okamihd/Enums/RegionNames.py | 9 ++ worlds/okamihd/Items.py | 1 - worlds/okamihd/RegionsData/__init__.py | 17 ++- worlds/okamihd/RegionsData/rf0a.py | 188 +++++++++++++++++++++++++ worlds/okamihd/Rules.py | 11 +- worlds/okamihd/__init__.py | 2 +- 7 files changed, 222 insertions(+), 15 deletions(-) create mode 100644 worlds/okamihd/RegionsData/rf0a.py diff --git a/worlds/okamihd/Enums/OkamiEnemies.py b/worlds/okamihd/Enums/OkamiEnemies.py index 30f55fc9705a..aff001f5bac3 100644 --- a/worlds/okamihd/Enums/OkamiEnemies.py +++ b/worlds/okamihd/Enums/OkamiEnemies.py @@ -17,6 +17,7 @@ class EnnemyData(NamedTuple): requires_bomb: bool = False +# Reference for Ids https://github.com/whataboutclyde/okami-utils/blob/master/data/enemy_id.yaml class OkamiEnemies(Enum): GREEN_IMP = EnnemyData(0x03, "Green Imp", 0, BrushTechniques.POWER_SLASH) RED_IMP = EnnemyData(0x00, "Red Imp", 0, BrushTechniques.POWER_SLASH) @@ -36,10 +37,10 @@ class OkamiEnemies(Enum): CROW_TENGU = EnnemyData(0x57, "Crow Tengu", 1) 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]) - FIRE_EYE =EnnemyData(0x52,"Fire Eye", 1, required_techniques=[BrushTechniques.GALESTORM]) - OROCHI_1=EnnemyData(0x69,"Orochi (Moon Cave)", 1, required_techniques=[BrushTechniques.WATERSPOUT]) - + CRIMSON_HELM = EnnemyData(0x11, "Crimson Helm", 1, required_techniques=[BrushTechniques.GALESTORM]) + FIRE_EYE = EnnemyData(0x52, "Fire Eye", 1, required_techniques=[BrushTechniques.GALESTORM]) + OROCHI_1 = EnnemyData(0x69, "Orochi (Moon Cave)", 1, required_techniques=[BrushTechniques.WATERSPOUT]) + UBUME = EnnemyData(0x58, "Ubume", 1, required_techniques=[BrushTechniques.GALESTORM]) @staticmethod def list(): diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index 7106d613fea9..cc0a23ee1652 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -130,6 +130,15 @@ class RegionNames(StrEnum): CURSED_RYOSHIMA_COAST="Cursed Ryoshima Coast" CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE= "Cursed Ryoshima Coast" RYOSHIMA_COAST="Ryoshima Coast" + RYOSHIMA_COAST_SEA="Ryoshima Coast (Sea)" + RYOSHIMA_COAST_DOJO="Ryoshima Coast (Dojo)" + RYOSHIMA_COAST_SHIP_TOP="Ryoshima Coast (Top of Sunken Ship)" + RYOSHIMA_COAST_CATWALK_TOWER="Ryoshima Coast (Catwalk Tower)" + RYOSHIMA_COAST_SEIAN ="Ryoshima Coast (Near Seian City Entrance)" + RYOSHIMA_COAST_SEIAN_ENCOUNTER="Ryoshima Coast (Near Seian City Entrance Encounter)" + RYOSHIMA_COAST_LUNAR_LAGOON="Ryoshima Coast (Lunar Lagoon)" + RYOSHIMA_COAST_WEST_PIER="Ryoshima Coast (West of Pier)" + ANKOKU_TEMPLE="Ankoku Temple" # Reference https://github.com/Axertin/okami-apclient/blob/master/include/okami/maps.hpp diff --git a/worlds/okamihd/Items.py b/worlds/okamihd/Items.py index 98b2eeba0952..2ac24b1de9de 100644 --- a/worlds/okamihd/Items.py +++ b/worlds/okamihd/Items.py @@ -104,7 +104,6 @@ def create_static_precollected_item_list(world: "OkamiWorld") -> List[Item]: BrushTechniques.ICESTORM.value: ItemData(0x118, ItemClassification.useful), # bit 24 } equips = { - # Equips "Water Tablet": ItemData(0x9c, ItemClassification.progression), "Peace Bell": ItemData(0x0b, ItemClassification.useful), diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index a9a49e256158..3e10b526f686 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 + r10e, r110, rf06, r105, rf09, rf0a if TYPE_CHECKING: from .. import OkamiWorld @@ -26,7 +26,9 @@ **rf04.exits, **rf06.exits, **rf07.exits, - **rf08.exits + **rf08.exits, + **rf09.exits, + **rf0a.exits, } okami_locations = { @@ -48,7 +50,9 @@ **rf04.locations, **rf06.locations, **rf07.locations, - **rf08.locations + **rf08.locations, + **rf09.locations, + **rf0a.locations, } okami_events = { @@ -70,7 +74,9 @@ **rf04.events, **rf06.events, **rf07.events, - **rf08.events + **rf08.events, + **rf09.events, + **rf0a.events, } # Shop locations are separate because they're conditionally created based on RandomizeShops @@ -83,4 +89,5 @@ **getattr(rf02, 'shop_locations', {}), **getattr(rf04, 'shop_locations', {}), **getattr(rf08, 'shop_locations', {}), -} \ No newline at end of file + **getattr(rf0a, 'shop_locations', {}), +} diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py new file mode 100644 index 000000000000..7d3fd49e1277 --- /dev/null +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -0,0 +1,188 @@ +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 ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import ExitData, EventData, LocData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + pass + +exits = { + RegionNames.RYOSHIMA_COAST: [ + ExitData(RegionNames.RYOSHIMA_COAST_SEA, needs_long_swim=True, loading_screen=False), + ExitData(RegionNames.RYOSHIMA_COAST_CATWALK_TOWER, loading_screen=False, one_way=True, + has_events=["Ryoshima Coast - Climb catwalk tower"]), + # 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.RYOSHIMA_COAST_WEST_PIER,one_way=True,loading_screen=False), + ExitData(RegionNames.ANKOKU_TEMPLE), + ExitData(RegionNames.FAWNS_HOUSE,has_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]) + ], + RegionNames.RYOSHIMA_COAST_SEA: [ + ExitData(RegionNames.RYOSHIMA_COAST_DOJO, needs_long_swim=True, loading_screen=False), + ExitData(RegionNames.RYOSHIMA_COAST_SHIP_TOP, needs_long_swim=True, loading_screen=False), + ExitData(RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON, one_way=True, + has_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False) + ], + RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: [ + ExitData(RegionNames.RYOSHIMA_COAST, has_events=["Ryoshima Coast - Climb back to main area"], one_way=True, + loading_screen=False) + ], + # Special Handling for the encounter around Seian, city entrance as the enemies inside require galestrom to be beaten. + RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER: [ + ExitData(RegionNames.RYOSHIMA_COAST_SEIAN, loading_screen=False, one_way=True, + has_events=["Ryoshima Coast - Mandatory Ubume Encounter"]), + ExitData(RegionNames.RYOSHIMA_COAST, loading_screen=False, one_way=True, + has_events=["Ryoshima Coast - Mandatory Ubume Encounter"]) + ], + # Special Handling for the encounter around Seian, city entrance as the enemies inside require galestrom to be beaten. + RegionNames.RYOSHIMA_COAST_SEIAN: [ + ExitData(RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER, one_way=True, loading_screen=False) + ], + RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON: [ + ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False) + ], + RegionNames.RYOSHIMA_COAST_WEST_PIER:[ + ExitData(RegionNames.RYOSHIMA_COAST_SEA,loading_screen=False) + ] + +} +# Note to myself: Warp to lunar turret : 850,1000,3250 +events = { + RegionNames.RYOSHIMA_COAST: { + "Ryoshima Coast - Climb catwalk tower": EventData(required_brush_techniques=[BrushTechniques.CATWALK]), + "Ryoshima Coast - Open Lunar Lagoon": EventData(required_items_events=["Ryoshima Coast - Buy Holy Eagle"], + required_brush_techniques=[BrushTechniques.CRESCENT]), + "Ryoshima Coast - Open Shortcut To Mme Fawn's": EventData() + }, + RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: { + "Ryoshima Coast - Climb back to main area": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT]) + }, + RegionNames.RYOSHIMA_COAST_DOJO: { + # Convert these to items at some point when dojos techs/shops are randomizable + "Ryoshima Coast - Buy Holy Eagle": EventData(), + "Ryoshima Coast - Buy Digging Champ": EventData() + }, + RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER: { + "Ryoshima Coast - Mandatory Ubume Encounter": EventData(mandatory_enemies=[OkamiEnemies.UBUME]) + } +} +locations = { + RegionNames.RYOSHIMA_COAST: { + "Ryoshima Coast - Buried Chest behind temple": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 0), + type=LocationType.BURIED_CHEST), + "Ryoshima Coast - Freestanding Chest at Pier's Edge": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 31)), + "Ryoshima Coast - Eastern Clam on Beach": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 49)), + "Ryoshima Coast - Eastern Underwater clam on Beach": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 51),type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Center Underwater clam on Beach": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 52),type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Western Underwater clam on Beach east of Pier": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 53),type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Nothern Underwater Clam west of Lunar turret": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 55), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Southern Underwater Clam west of Lunar turret": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 56), type=LocationType.UNDERWATER_CHEST), + "Ryoshima Coast - Buried Chest east of pier ramp": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 60), type=LocationType.BURIED_CHEST), + "Ryoshima Coast - Buried Chest on ledge near pier": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 61), type=LocationType.BURIED_CHEST), + }, + RegionNames.RYOSHIMA_COAST_SEA: { + "Ryoshima Coast - Underwater Clam in dojo island bombable room": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 2), type=LocationType.UNDERWATER_CHEST_SHALLOW, + cherry_bomb_level=1), + "Ryoshima Coast - Clam on southernmost rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 5)), + "Ryoshima Coast - Clam between shimenawa rocks": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 24)), + "Ryoshima Coast - Southern underwater Clam between shimenawa rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 37), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Northern underwater Clam between shimenawa rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 38), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Clam on easternmost rocks": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 25)), + "Ryoshima Coast - Underwater Clam on southernmost rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 35), type=LocationType.UNDERWATER_CHEST), + "Ryoshima Coast - Clam on rocks northwest of shimenawa rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 39)), + "Ryoshima Coast - North Underwater clam on rocks northwest of shimenawa rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 40), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - South Underwater clam on rocks northwest of shimenawa rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 41), type=LocationType.UNDERWATER_CHEST_SHALLOW), + # For whatever reason, the ship is on opposite sides between the map and in game. + "Ryoshima Coast - Underwater clam on underwater rocks east of sunken ship": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 42), type=LocationType.UNDERWATER_CHEST), + "Ryoshima Coast - Underwater clam on underwater rocks south of ultimate origin mirror": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 43), type=LocationType.UNDERWATER_CHEST), + "Ryoshima Coast - Underwater Clam on easternmost rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 44), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Underwater Clam on easternmost underwater rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 45), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - East Underwater Clam on rocks south of Sunken Ship": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 46), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - West Underwater Clam on rocks south of Sunken Ship": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 47), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Underwater Clam southwest of ultimate origin mirror": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 57), type=LocationType.UNDERWATER_CHEST), + "Ryoshima Coast - Eastmost Underwater Clam, south of city checkpoint warp": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 58), type=LocationType.UNDERWATER_CHEST), + "Ryoshima Coast - Underwater Clam southeast of ultimate origin mirror": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 59), type=LocationType.UNDERWATER_CHEST), + }, + + RegionNames.RYOSHIMA_COAST_DOJO: { + "Ryoshima Coast - Stone Buried Chest near Dojo": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 6), + type=LocationType.STONE_BURIED_CHEST), + "Ryoshima Coast - Chest on top of dojo Lunar Turret": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 29), + required_items_events=[ + "Ryoshima Coast - Buy Holy Eagle"]), + "Ryoshima Coast - Freestanding chest on bottom of dojo island": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 30)) + }, + RegionNames.RYOSHIMA_COAST_SHIP_TOP: { + "Ryoshima Coast - Left Chest on top of Sunken Ship": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 20)), + "Ryoshima Coast - Right Chest on top of Sunken Ship": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 21)) + }, + RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: { + "Ryoshima Coast - Chest on top of catwalk tower": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 22)) + }, + RegionNames.RYOSHIMA_COAST_SEIAN: { + "Ryoshima Coast - Buried chest on ledge near Seian city entrance": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 33), type=LocationType.BURIED_CHEST), + "Ryoshima Coast - Freestanding chest near Seian city entrance stake fence": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 34)) + }, + RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON: { + "Ryoshima Coast - Buried Clam behind Sunken ship": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 36), + type=LocationType.BURIED_CHEST), + "Ryoshima Coast - Buried Clam in front of Sunken ship": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 48), + type=LocationType.BURIED_CHEST), + "Ryoshima Coast - Buried Clam in Lunar lagoon near rocks": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 50), + type=LocationType.BURIED_CHEST), + }, + RegionNames.RYOSHIMA_COAST_WEST_PIER:{ + "Ryoshima Coast - Underwater clam, west of Pier": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 54), + type=LocationType.UNDERWATER_CHEST_SHALLOW), + }, + RegionNames.ANKOKU_TEMPLE:{ + "Ryoshima Coast - Chest inside Ankoku Temple": LocData(container_check_id(MapIds.HEALED_RYOSHIMA,63)) + } + +} + +shop_locations = { + RegionNames.RYOSHIMA_COAST: { + "Ryoshima Coast - Shop Slot 1": LocData(shop_check_id(14, 0), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 2": LocData(shop_check_id(14, 1), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 3": LocData(shop_check_id(14, 2), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 4": LocData(shop_check_id(14, 3), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 5": LocData(shop_check_id(14, 4), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 6": LocData(shop_check_id(14, 5), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 7": LocData(shop_check_id(14, 6), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 8": LocData(shop_check_id(14, 7), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 9": LocData(shop_check_id(14, 8), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 10": LocData(shop_check_id(14, 9), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 11": LocData(shop_check_id(14, 10), type=LocationType.SHOP), + "Ryoshima Coast - Shop Slot 12": LocData(shop_check_id(14, 11), type=LocationType.SHOP), + } +} diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index 0c07e40ecec1..6f4360669cac 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -75,6 +75,8 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even ## RULE BUILDER REWORK: # - FOR EACH LOCATION, BUILD AN ARRAY OF RULES THAT WILL BE ADDED TO THE world.set_rule(loc,AND(*Rules)) + debug_rule=False + rules: List[Rule] = [] required_techinques = [] @@ -108,7 +110,8 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even if world.options.NightTimeChecksRequireCrescent: required_techinques += [BrushTechniques.CRESCENT] case LocationType.STONE_BURIED_CHEST: - # FIXME when dojo techniques are handled + # Digging Champ Requirement + rules.append(Has("Ryoshima Coast - Buy Digging Champ")) if world.options.NightTimeChecksRequireCrescent: required_techinques += [BrushTechniques.CRESCENT] case LocationType.BURNING_CHEST: @@ -158,9 +161,9 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even if len(rules) > 0: final_rule = And(*rules) world.set_rule(loc, final_rule) - - -# print(final_rule) + if debug_rule: + print("[Debug] - Rule for "+ loc.name) + print(final_rule) # else: # print("no rule for this check") diff --git a/worlds/okamihd/__init__.py b/worlds/okamihd/__init__.py index ef56e6aa1254..91e11dd13667 100644 --- a/worlds/okamihd/__init__.py +++ b/worlds/okamihd/__init__.py @@ -49,7 +49,7 @@ def create_regions(self): create_regions(self) # DEBUG - # visualize_regions(self.multiworld.get_region("Menu", self.player),"G:\projets\OkamiAP\worlds\okamihd\docs\OkamiHD.puml") + visualize_regions(self.multiworld.get_region("Menu", self.player),"G:\projets\OkamiAP\worlds\okamihd\docs\OkamiHD.puml") def create_items(self): self.multiworld.itempool += self.create_itempool() From 0ee91008998a139ffe0f9a157f65192c621189ce Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 10 May 2026 00:56:19 +0200 Subject: [PATCH 07/30] Comment debug region visualizer --- worlds/okamihd/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/okamihd/__init__.py b/worlds/okamihd/__init__.py index 91e11dd13667..ef56e6aa1254 100644 --- a/worlds/okamihd/__init__.py +++ b/worlds/okamihd/__init__.py @@ -49,7 +49,7 @@ def create_regions(self): create_regions(self) # DEBUG - visualize_regions(self.multiworld.get_region("Menu", self.player),"G:\projets\OkamiAP\worlds\okamihd\docs\OkamiHD.puml") + # visualize_regions(self.multiworld.get_region("Menu", self.player),"G:\projets\OkamiAP\worlds\okamihd\docs\OkamiHD.puml") def create_items(self): self.multiworld.itempool += self.create_itempool() From b8482791d69b256ef15910aa4323906bd1e7e5a4 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 18 May 2026 13:17:50 +0200 Subject: [PATCH 08/30] Seian City Commoners Base --- worlds/okamihd/Enums/RegionNames.py | 46 +++++++++++++++----------- worlds/okamihd/RegionsData/__init__.py | 8 +++-- worlds/okamihd/RegionsData/r201.py | 18 ++++++++++ worlds/okamihd/RegionsData/rf09.py | 3 ++ 4 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r201.py diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index cc0a23ee1652..d16849f941be 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -41,8 +41,8 @@ class RegionNames(StrEnum): SHINSHU_FIELD = "Shinshu Field" SHINSHU_FIELD_AGATA_CAVE = "Shinshu Field (Cave to Agata Forest)" TAMA_HOUSE = "Tama's house" - SHINSHU_PLATEAU="Shinshu Field Plateau" - SHINSHU_AGATA_SHORTCUT_LEDGE="Ledge Shortcut From Agata Forest" + SHINSHU_PLATEAU = "Shinshu Field Plateau" + SHINSHU_AGATA_SHORTCUT_LEDGE = "Ledge Shortcut From Agata Forest" ## HANA VALLEY CURSED_HANA_VALLEY = "Cursed Hana Valley" @@ -119,26 +119,31 @@ class RegionNames(StrEnum): MOON_CAVE_OROCHI = "Moon Cave (Orochi)" ## CITY CHECKPOINT - CITY_CHECKPOINT_TAKA="City Checkpoint (Taka side)" - CITY_CHECKPOINT_DRAWBRIDGE="City Checkpoint Drawbridge" - CITY_CHECKPOINT_RYOSHIMA="City Checkpoint (Ryoshima side)" - CITY_CHECKPOINT_RIVER="City Checkpoint (River)" + CITY_CHECKPOINT_TAKA = "City Checkpoint (Taka side)" + CITY_CHECKPOINT_DRAWBRIDGE = "City Checkpoint Drawbridge" + CITY_CHECKPOINT_RYOSHIMA = "City Checkpoint (Ryoshima side)" + CITY_CHECKPOINT_RIVER = "City Checkpoint (River)" # Western Nippon ## RYOSHIMA COAST - CURSED_RYOSHIMA_COAST="Cursed Ryoshima Coast" - CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE= "Cursed Ryoshima Coast" - RYOSHIMA_COAST="Ryoshima Coast" - RYOSHIMA_COAST_SEA="Ryoshima Coast (Sea)" - RYOSHIMA_COAST_DOJO="Ryoshima Coast (Dojo)" - RYOSHIMA_COAST_SHIP_TOP="Ryoshima Coast (Top of Sunken Ship)" - RYOSHIMA_COAST_CATWALK_TOWER="Ryoshima Coast (Catwalk Tower)" - RYOSHIMA_COAST_SEIAN ="Ryoshima Coast (Near Seian City Entrance)" - RYOSHIMA_COAST_SEIAN_ENCOUNTER="Ryoshima Coast (Near Seian City Entrance Encounter)" - RYOSHIMA_COAST_LUNAR_LAGOON="Ryoshima Coast (Lunar Lagoon)" - RYOSHIMA_COAST_WEST_PIER="Ryoshima Coast (West of Pier)" - ANKOKU_TEMPLE="Ankoku Temple" + CURSED_RYOSHIMA_COAST = "Cursed Ryoshima Coast" + CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE = "Cursed Ryoshima Coast" + RYOSHIMA_COAST = "Ryoshima Coast" + RYOSHIMA_COAST_SEA = "Ryoshima Coast (Sea)" + RYOSHIMA_COAST_DOJO = "Ryoshima Coast (Dojo)" + RYOSHIMA_COAST_SHIP_TOP = "Ryoshima Coast (Top of Sunken Ship)" + RYOSHIMA_COAST_CATWALK_TOWER = "Ryoshima Coast (Catwalk Tower)" + RYOSHIMA_COAST_SEIAN = "Ryoshima Coast (Near Seian City Entrance)" + RYOSHIMA_COAST_SEIAN_ENCOUNTER = "Ryoshima Coast (Near Seian City Entrance Encounter)" + RYOSHIMA_COAST_LUNAR_LAGOON = "Ryoshima Coast (Lunar Lagoon)" + RYOSHIMA_COAST_WEST_PIER = "Ryoshima Coast (West of Pier)" + ANKOKU_TEMPLE = "Ankoku Temple" + + ## SEIAN CITY + ### COMMONERS QUARTER + SEIAN_CITY_COMMONERS = "Sei-an City Commoners' Quarter" + SEIAN_CITY_COMMONERS_DRY = "Sei-an City Commoners' Quarter (No water)" # Reference https://github.com/Axertin/okami-apclient/blob/master/include/okami/maps.hpp @@ -156,6 +161,7 @@ class MapIds(Enum): CALCIFIED_CAVERN = 0x10E MOON_CAVE = 0x110 RIVER_OF_THE_HEAVENS = 0x122 + SEIAN_COMMONERS = 0x201 CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 CURSED_AGATA = 0xF03 @@ -180,7 +186,9 @@ class MapIndexes(Enum): CALCIFIED_CAVERN = 15 MOON_CAVE = 16 RIVER_OF_THE_HEAVENS = 30 + #FIXME: Ensure this is the right index + SEIAN_CITY_COMMONERS = 32 SHINSHU_FIELD = 71 AGATA_FOREST = 72 TAKA_PASS = 74 - RYOSHIMA_COAST= 75 + RYOSHIMA_COAST = 75 diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 3e10b526f686..2c54ddddb7c4 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 +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 if TYPE_CHECKING: from .. import OkamiWorld @@ -20,6 +20,7 @@ **r10e.exits, **r110.exits, **r122.exits, + **r201.exits, **rf01.exits, **rf02.exits, **rf03.exits, @@ -44,6 +45,7 @@ **r10e.locations, **r110.locations, **r122.locations, + **r201.locations, **rf01.locations, **rf02.locations, **rf03.locations, @@ -68,6 +70,7 @@ **r10e.events, **r110.events, **r122.events, + **r201.events, **rf01.events, **rf02.events, **rf03.events, @@ -86,6 +89,7 @@ **getattr(r108, 'shop_locations', {}), **getattr(r109, 'shop_locations', {}), **getattr(r110, 'shop_locations', {}), + **getattr(r201, 'shop_locations', {}), **getattr(rf02, 'shop_locations', {}), **getattr(rf04, 'shop_locations', {}), **getattr(rf08, 'shop_locations', {}), diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py new file mode 100644 index 000000000000..ca244727bf66 --- /dev/null +++ b/worlds/okamihd/RegionsData/r201.py @@ -0,0 +1,18 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.LocationType import LocationType +from ..Enums.RegionNames import RegionNames, MapIds +from ..Types import ExitData, LocData, EventData + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits={ +} +events={ +} +locations={ +} +shop_locations={ +} \ No newline at end of file diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py index b552bbd91ea8..ed52018049b8 100644 --- a/worlds/okamihd/RegionsData/rf09.py +++ b/worlds/okamihd/RegionsData/rf09.py @@ -14,6 +14,9 @@ ], RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE:[ ExitData(RegionNames.RYOSHIMA_COAST,has_events=["Ryoshima Coast - Bloom the Guardian Sapling"],one_way=True) + ], + RegionNames.RYOSHIMA_COAST_SEIAN:[ + ExitData(RegionNames.SEIAN_CITY_COMMONERS_DRY) ] } events = { From 44c34e79386942156bf4d5fa21bcd01a902b4cd6 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 18 May 2026 14:02:57 +0200 Subject: [PATCH 09/30] Add some checks in Seian City Commoners --- worlds/okamihd/CheckIds.py | 2 +- worlds/okamihd/Enums/RegionNames.py | 3 ++ worlds/okamihd/RegionsData/r201.py | 80 ++++++++++++++++++++++++++--- worlds/okamihd/RegionsData/rf09.py | 3 -- worlds/okamihd/RegionsData/rf0a.py | 29 ++++++----- 5 files changed, 95 insertions(+), 22 deletions(-) diff --git a/worlds/okamihd/CheckIds.py b/worlds/okamihd/CheckIds.py index e00cb24b9486..61d94db74d01 100644 --- a/worlds/okamihd/CheckIds.py +++ b/worlds/okamihd/CheckIds.py @@ -26,7 +26,7 @@ GAME_PROGRESS_BASE = 7_000_000_000 CONTAINER_BASE = 8_000_000_000 - +# Reference https://github.com/Axertin/okami-apclient/blob/master/include/okami/brushes.hpp def brush_check_id(brush_index: int) -> int: return BRUSH_BASE + brush_index diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index d16849f941be..240671506ba0 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -144,6 +144,9 @@ class RegionNames(StrEnum): ### COMMONERS QUARTER SEIAN_CITY_COMMONERS = "Sei-an City Commoners' Quarter" SEIAN_CITY_COMMONERS_DRY = "Sei-an City Commoners' Quarter (No water)" + SEIAN_CITY_YAMA ="Sei-an City (Yama's restaurant)" + SEIAN_CITY_FLOWERS="Sei-an City (Mr. Flower's house)" + SEIAN_CITY_SOUTHWEST="Sei-an City (Southwest building)" # Reference https://github.com/Axertin/okami-apclient/blob/master/include/okami/maps.hpp diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index ca244727bf66..ff5f1f60f26d 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING -from ..CheckIds import container_check_id +from ..CheckIds import container_check_id, brush_check_id from ..Enums.LocationType import LocationType from ..Enums.RegionNames import RegionNames, MapIds from ..Types import ExitData, LocData, EventData @@ -8,11 +8,79 @@ if TYPE_CHECKING: from .. import OkamiWorld -exits={ +exits = { + RegionNames.SEIAN_CITY_COMMONERS_DRY:[ + ExitData(RegionNames.SEIAN_CITY_COMMONERS,has_events="Inside the Emperor - Defeat Blight") + ], + RegionNames.SEIAN_CITY_COMMONERS:[ + ExitData(RegionNames.SEIAN_CITY_YAMA), + ExitData(RegionNames.SEIAN_CITY_FLOWERS), + ExitData(RegionNames.SEIAN_CITY_SOUTHWEST,has_events=["Sei-an City - Blow up wall to southwest building"]) + ] } -events={ +events = { + #FIXME: temporary placed here to ensure everything is acessible + RegionNames.SEIAN_CITY_COMMONERS_DRY:{ + "Inside the Emperor - Defeat Blight":EventData() + }, + + RegionNames.SEIAN_CITY_COMMONERS:{ + "Sei-an City - Blow up wall to southwest building": EventData(cherry_bomb_level=1) + }, + RegionNames.SEIAN_CITY_YAMA: { + "Sei-an City (Commoner's Quarter) - Give golden mushroom to Yama": EventData( + required_items_events=["Golden Mushroom"]) + } +} +locations = { + # TODO: Make some names clearer + # Always mark chests in Canal as underwater in case the water has been returned. + RegionNames.SEIAN_CITY_COMMONERS_DRY: { + "Sei-an City (Commoner's quarter) - Chest in Canal near Yellow Kimono lady": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 0), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal near Naguri": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 1), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal near empty Ferry Stop": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 3), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal near bridge": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 4), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal under balcony": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 5), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal near west bridge": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 6), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal in northwest corner": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 7), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal near southeast bridge": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 8), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal near stairs": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 10), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Commoner's quarter) - Buried chest Chest near bridge": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 11), type=LocationType.BURIED_CHEST), + "Sei-an City (Commoner's quarter) - Buried chest near east wall": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 12), type=LocationType.BURIED_CHEST), + "Sei-an City (Commoner's quarter) - Freestanding chest near Ryoshima entrance": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 13)), + "Sei-an City (Commoner's quarter) - Buried Chest behind Mr. Flower's house": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 14),type=LocationType.BURIED_CHEST), + "Sei-an City (Commoner's quarter) - Chest in Canal near Mr. Flower's house": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 15),type=LocationType.BURIED_CHEST), + "Sei-an City (Commoner's quarter) - Freestanding Chest behind building": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 16)), + "Sei-an City (Commoner's quarter) - Freestanding Chest near Ryoshima entrance 2": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 17)), + }, + RegionNames.SEIAN_CITY_YAMA: { + "Sei-an City (Commoner's quarter) - Chest after learning Fireburst": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 2), + required_items_events=["Sei-an City (Commoner's Quarter) - Give golden mushroom to Yama"]), + "Sei-an City (Commoner's quarter) - Moegami(Fireburst)": LocData(brush_check_id(11), required_items_events=[ + "Sei-an City (Commoner's Quarter) - Give golden mushroom to Yama"]) + + }, + RegionNames.SEIAN_CITY_FLOWERS:{ + "Sei-an City (Commoner's quarter) - Chest Buried in Mr Flower's house": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 9), type=LocationType.BURIED_CHEST), + } } -locations={ +shop_locations = { } -shop_locations={ -} \ No newline at end of file diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py index ed52018049b8..b552bbd91ea8 100644 --- a/worlds/okamihd/RegionsData/rf09.py +++ b/worlds/okamihd/RegionsData/rf09.py @@ -14,9 +14,6 @@ ], RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE:[ ExitData(RegionNames.RYOSHIMA_COAST,has_events=["Ryoshima Coast - Bloom the Guardian Sapling"],one_way=True) - ], - RegionNames.RYOSHIMA_COAST_SEIAN:[ - ExitData(RegionNames.SEIAN_CITY_COMMONERS_DRY) ] } events = { diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 7d3fd49e1277..5df7c34eb612 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -17,9 +17,9 @@ has_events=["Ryoshima Coast - Climb catwalk tower"]), # 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.RYOSHIMA_COAST_WEST_PIER,one_way=True,loading_screen=False), + ExitData(RegionNames.RYOSHIMA_COAST_WEST_PIER, one_way=True, loading_screen=False), ExitData(RegionNames.ANKOKU_TEMPLE), - ExitData(RegionNames.FAWNS_HOUSE,has_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]) + ExitData(RegionNames.FAWNS_HOUSE, has_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]) ], RegionNames.RYOSHIMA_COAST_SEA: [ ExitData(RegionNames.RYOSHIMA_COAST_DOJO, needs_long_swim=True, loading_screen=False), @@ -38,15 +38,17 @@ ExitData(RegionNames.RYOSHIMA_COAST, loading_screen=False, one_way=True, has_events=["Ryoshima Coast - Mandatory Ubume Encounter"]) ], - # Special Handling for the encounter around Seian, city entrance as the enemies inside require galestrom to be beaten. + RegionNames.RYOSHIMA_COAST_SEIAN: [ - ExitData(RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER, one_way=True, loading_screen=False) + # 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) ], RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON: [ ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False) ], - RegionNames.RYOSHIMA_COAST_WEST_PIER:[ - ExitData(RegionNames.RYOSHIMA_COAST_SEA,loading_screen=False) + RegionNames.RYOSHIMA_COAST_WEST_PIER: [ + ExitData(RegionNames.RYOSHIMA_COAST_SEA, loading_screen=False) ] } @@ -76,9 +78,12 @@ type=LocationType.BURIED_CHEST), "Ryoshima Coast - Freestanding Chest at Pier's Edge": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 31)), "Ryoshima Coast - Eastern Clam on Beach": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 49)), - "Ryoshima Coast - Eastern Underwater clam on Beach": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 51),type=LocationType.UNDERWATER_CHEST_SHALLOW), - "Ryoshima Coast - Center Underwater clam on Beach": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 52),type=LocationType.UNDERWATER_CHEST_SHALLOW), - "Ryoshima Coast - Western Underwater clam on Beach east of Pier": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 53),type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Eastern Underwater clam on Beach": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 51), + type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Center Underwater clam on Beach": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 52), + type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Ryoshima Coast - Western Underwater clam on Beach east of Pier": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 53), type=LocationType.UNDERWATER_CHEST_SHALLOW), "Ryoshima Coast - Nothern Underwater Clam west of Lunar turret": LocData( container_check_id(MapIds.HEALED_RYOSHIMA, 55), type=LocationType.UNDERWATER_CHEST_SHALLOW), "Ryoshima Coast - Southern Underwater Clam west of Lunar turret": LocData( @@ -160,12 +165,12 @@ container_check_id(MapIds.HEALED_RYOSHIMA, 50), type=LocationType.BURIED_CHEST), }, - RegionNames.RYOSHIMA_COAST_WEST_PIER:{ + RegionNames.RYOSHIMA_COAST_WEST_PIER: { "Ryoshima Coast - Underwater clam, west of Pier": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 54), type=LocationType.UNDERWATER_CHEST_SHALLOW), }, - RegionNames.ANKOKU_TEMPLE:{ - "Ryoshima Coast - Chest inside Ankoku Temple": LocData(container_check_id(MapIds.HEALED_RYOSHIMA,63)) + RegionNames.ANKOKU_TEMPLE: { + "Ryoshima Coast - Chest inside Ankoku Temple": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 63)) } } From 42d89e1bdb24645a102efa2b31293b09475d544d Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 18 May 2026 18:48:30 +0200 Subject: [PATCH 10/30] Seian Commoners Checks --- worlds/okamihd/Enums/RegionNames.py | 1 + worlds/okamihd/Items.py | 1 + worlds/okamihd/RegionsData/r201.py | 92 ++++++++++++++++++++++++----- 3 files changed, 80 insertions(+), 14 deletions(-) diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index 240671506ba0..9ceff8fd312d 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -147,6 +147,7 @@ class RegionNames(StrEnum): SEIAN_CITY_YAMA ="Sei-an City (Yama's restaurant)" SEIAN_CITY_FLOWERS="Sei-an City (Mr. Flower's house)" SEIAN_CITY_SOUTHWEST="Sei-an City (Southwest building)" + SEIAN_CITY_TAO="Sei-an City (Tao Troopers Headquarters)" # Reference https://github.com/Axertin/okami-apclient/blob/master/include/okami/maps.hpp diff --git a/worlds/okamihd/Items.py b/worlds/okamihd/Items.py index 2ac24b1de9de..28265c3b8983 100644 --- a/worlds/okamihd/Items.py +++ b/worlds/okamihd/Items.py @@ -278,6 +278,7 @@ def create_static_precollected_item_list(world: "OkamiWorld") -> List[Item]: **bitable_items, **useful_items, **filler_items, + **quest_items, **event_items, **weapons_items, **progressive_weapons, diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index ff5f1f60f26d..3b8d5ae72ec0 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING -from ..CheckIds import container_check_id, brush_check_id +from ..CheckIds import container_check_id, brush_check_id, shop_check_id +from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType from ..Enums.RegionNames import RegionNames, MapIds from ..Types import ExitData, LocData, EventData @@ -9,23 +10,30 @@ from .. import OkamiWorld exits = { - RegionNames.SEIAN_CITY_COMMONERS_DRY:[ - ExitData(RegionNames.SEIAN_CITY_COMMONERS,has_events="Inside the Emperor - Defeat Blight") + RegionNames.SEIAN_CITY_COMMONERS_DRY: [ + #FIXME - Replace later + ExitData(RegionNames.SEIAN_CITY_COMMONERS, has_events=["Inside the Emperor - Defeat Blight"],loading_screen=False) ], - RegionNames.SEIAN_CITY_COMMONERS:[ + RegionNames.SEIAN_CITY_COMMONERS: [ ExitData(RegionNames.SEIAN_CITY_YAMA), ExitData(RegionNames.SEIAN_CITY_FLOWERS), - ExitData(RegionNames.SEIAN_CITY_SOUTHWEST,has_events=["Sei-an City - Blow up wall to southwest building"]) + ExitData(RegionNames.SEIAN_CITY_SOUTHWEST, has_events=["Sei-an City - Blow up wall to southwest building"]), + ExitData(RegionNames.SEIAN_CITY_TAO, has_events=["Sei-an City - Climb to Tao Troopers Headquarters"], + one_way=True, loading_screen=False) + ], + RegionNames.SEIAN_CITY_TAO: [ + ExitData(RegionNames.SEIAN_CITY_COMMONERS, one_way=True) ] } events = { - #FIXME: temporary placed here to ensure everything is acessible - RegionNames.SEIAN_CITY_COMMONERS_DRY:{ - "Inside the Emperor - Defeat Blight":EventData() + # FIXME: temporary placed here to ensure everything is accessible + RegionNames.SEIAN_CITY_COMMONERS_DRY: { + "Inside the Emperor - Defeat Blight": EventData() }, - - RegionNames.SEIAN_CITY_COMMONERS:{ - "Sei-an City - Blow up wall to southwest building": EventData(cherry_bomb_level=1) + RegionNames.SEIAN_CITY_COMMONERS: { + "Sei-an City - Blow up wall to southwest building": EventData(cherry_bomb_level=1), + "Sei-an City - Climb to Tao Troopers Headquarters": EventData( + required_brush_techniques=[BrushTechniques.WATERSPOUT]) }, RegionNames.SEIAN_CITY_YAMA: { "Sei-an City (Commoner's Quarter) - Give golden mushroom to Yama": EventData( @@ -61,9 +69,9 @@ "Sei-an City (Commoner's quarter) - Freestanding chest near Ryoshima entrance": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 13)), "Sei-an City (Commoner's quarter) - Buried Chest behind Mr. Flower's house": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 14),type=LocationType.BURIED_CHEST), + container_check_id(MapIds.SEIAN_COMMONERS, 14), type=LocationType.BURIED_CHEST), "Sei-an City (Commoner's quarter) - Chest in Canal near Mr. Flower's house": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 15),type=LocationType.BURIED_CHEST), + container_check_id(MapIds.SEIAN_COMMONERS, 15), type=LocationType.BURIED_CHEST), "Sei-an City (Commoner's quarter) - Freestanding Chest behind building": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 16)), "Sei-an City (Commoner's quarter) - Freestanding Chest near Ryoshima entrance 2": LocData( @@ -77,10 +85,66 @@ "Sei-an City (Commoner's Quarter) - Give golden mushroom to Yama"]) }, - RegionNames.SEIAN_CITY_FLOWERS:{ + RegionNames.SEIAN_CITY_FLOWERS: { "Sei-an City (Commoner's quarter) - Chest Buried in Mr Flower's house": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 9), type=LocationType.BURIED_CHEST), + }, + RegionNames.SEIAN_CITY_SOUTHWEST: { + "Sei-an City (Commoner's quarter) - Chest in southwest building, 1F southwest Rafters": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 18)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, GF Freestanding Left": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 19)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F northwest Rafters Left": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 20)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F northwest Rafters Right": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 21)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F north central Rafters": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 22)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, GF Freestanding Right": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 23)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, GF in Cage": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 24)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, GF near Cage": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 25)), + }, + RegionNames.SEIAN_CITY_COMMONERS: { + "Sei-an City (Commoner's quarter) - Freestanding Chest behind west buildings": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 26), type=LocationType.BURIED_CHEST), + "Sei-an City (Commoner's quarter) - Buried Chest near west buildings": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 27), type=LocationType.BURIED_CHEST), + "Sei-an City (Commoner's quarter) - Buried Chest near Yama's restaurant": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 28), type=LocationType.BURIED_CHEST), + }, + RegionNames.SEIAN_CITY_TAO: { + "Sei-an City (Commoner's quarter) - Freestanding chest behind Tao Troopers headquarters": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 29), type=LocationType.BURIED_CHEST), } } shop_locations = { + RegionNames.SEIAN_CITY_COMMONERS_DRY: { + "Sei-an City Weapon Shop Slot 1": LocData(shop_check_id(16, 0), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 2": LocData(shop_check_id(16, 1), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 3": LocData(shop_check_id(16, 2), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 4": LocData(shop_check_id(16, 3), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 5": LocData(shop_check_id(16, 4), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 6": LocData(shop_check_id(16, 5), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 7": LocData(shop_check_id(16, 6), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 8": LocData(shop_check_id(16, 7), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 9": LocData(shop_check_id(16, 8), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 10": LocData(shop_check_id(16, 9), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 11": LocData(shop_check_id(16, 10), type=LocationType.SHOP), + "Sei-an City Weapon Shop Slot 12": LocData(shop_check_id(16, 11), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 1": LocData(shop_check_id(17, 0), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 2": LocData(shop_check_id(17, 1), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 3": LocData(shop_check_id(17, 2), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 4": LocData(shop_check_id(17, 3), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 5": LocData(shop_check_id(17, 4), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 6": LocData(shop_check_id(17, 5), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 7": LocData(shop_check_id(17, 6), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 8": LocData(shop_check_id(17, 7), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 9": LocData(shop_check_id(17, 8), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 10": LocData(shop_check_id(17, 9), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 11": LocData(shop_check_id(17, 10), type=LocationType.SHOP), + "Sei-an City Tool Shop Slot 12": LocData(shop_check_id(17, 11), type=LocationType.SHOP), + } } From 81def37e6b838aef4b7fc2ffdd2c04d4cf90a572 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Tue, 19 May 2026 21:18:20 +0200 Subject: [PATCH 11/30] Add arc 2 warps up to now and fix formatting --- worlds/okamihd/RegionsData/__init__.py | 2 ++ worlds/okamihd/RegionsData/r105.py | 21 ++++++++++++++------- worlds/okamihd/RegionsData/rf0a.py | 17 +++++++++++++++-- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 6278375f9c74..fd9d2d470664 100644 --- a/worlds/okamihd/RegionsData/__init__.py +++ b/worlds/okamihd/RegionsData/__init__.py @@ -98,9 +98,11 @@ okami_warps={ **r102.warps, + **r105.warps, **r108.warps, **r109.warps, **rf02.warps, **rf04.warps, **rf08.warps, + **rf0a.warps, } \ No newline at end of file diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index d532a86aec96..020e2b9bed5a 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -1,10 +1,11 @@ from typing import TYPE_CHECKING -from rule_builder.rules import Or, Has, HasAll +from rule_builder.rules import Or, Has, HasAll, True_ from ..CheckIds import shop_check_id, container_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: @@ -13,16 +14,16 @@ exits = { RegionNames.CITY_CHECKPOINT_TAKA: [ ExitData(RegionNames.CITY_CHECKPOINT_DRAWBRIDGE, - has_events=["City Checkpoint - Activate the Drawbridge"],loading_screen=False), - ExitData(RegionNames.CITY_CHECKPOINT_RIVER,loading_screen=False) + has_events=["City Checkpoint - Activate the Drawbridge"], loading_screen=False), + ExitData(RegionNames.CITY_CHECKPOINT_RIVER, loading_screen=False) ], RegionNames.CITY_CHECKPOINT_DRAWBRIDGE: [ ExitData(RegionNames.CITY_CHECKPOINT_RYOSHIMA) ], - RegionNames.CITY_CHECKPOINT_RYOSHIMA:[ - ExitData(RegionNames.CITY_CHECKPOINT_RIVER,loading_screen=False,one_way=True), + RegionNames.CITY_CHECKPOINT_RYOSHIMA: [ + ExitData(RegionNames.CITY_CHECKPOINT_RIVER, loading_screen=False, one_way=True), ExitData(RegionNames.CURSED_RYOSHIMA_COAST), - ExitData(RegionNames.RYOSHIMA_COAST,has_events=["Ryoshima Coast - Bloom the Guardian Sapling"]) + ExitData(RegionNames.RYOSHIMA_COAST, has_events=["Ryoshima Coast - Bloom the Guardian Sapling"]) ], } @@ -88,3 +89,9 @@ "City Checkpoint - Shop Slot 12": LocData(shop_check_id(2, 11), type=LocationType.SHOP), } } + +warps = { + RegionNames.CITY_CHECKPOINT_TAKA: [ + WarpData(type=WarpType.MIST_WARP, trigger_warp_to=True_, trigger_warp_from=True_) + ] +} diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 5df7c34eb612..61ac737ba34a 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -1,10 +1,12 @@ from typing import TYPE_CHECKING +from rule_builder.rules import Has, True_ from ..CheckIds import container_check_id, shop_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType from ..Enums.OkamiEnemies import OkamiEnemies -from ..Types import ExitData, EventData, LocData +from ..Enums.WarpType import WarpType +from ..Types import ExitData, EventData, LocData, WarpData from ..Enums.RegionNames import RegionNames, MapIds if TYPE_CHECKING: @@ -58,7 +60,9 @@ "Ryoshima Coast - Climb catwalk tower": EventData(required_brush_techniques=[BrushTechniques.CATWALK]), "Ryoshima Coast - Open Lunar Lagoon": EventData(required_items_events=["Ryoshima Coast - Buy Holy Eagle"], required_brush_techniques=[BrushTechniques.CRESCENT]), - "Ryoshima Coast - Open Shortcut To Mme Fawn's": EventData() + "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=[]) }, RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: { "Ryoshima Coast - Climb back to main area": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT]) @@ -191,3 +195,12 @@ "Ryoshima Coast - Shop Slot 12": LocData(shop_check_id(14, 11), type=LocationType.SHOP), } } + +warps = { + RegionNames.RYOSHIMA_COAST: [ + WarpData(type=WarpType.MERMAID_SPRING, + trigger_warp_to=Has("Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance"), + trigger_warp_from=Has("Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance")), + WarpData(type=WarpType.MIST_WARP, trigger_warp_to=True_, trigger_warp_from=True_) + ] +} From 159ae9267708439b29d4badce1119c75ce33ed70 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sat, 23 May 2026 21:53:13 +0200 Subject: [PATCH 12/30] Fix Sei-an locations names (1) --- worlds/okamihd/RegionsData/r201.py | 78 +++++++++++++++--------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index 3b8d5ae72ec0..b7eb12d9774c 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -11,8 +11,9 @@ exits = { RegionNames.SEIAN_CITY_COMMONERS_DRY: [ - #FIXME - Replace later - ExitData(RegionNames.SEIAN_CITY_COMMONERS, has_events=["Inside the Emperor - Defeat Blight"],loading_screen=False) + # FIXME - Replace later + ExitData(RegionNames.SEIAN_CITY_COMMONERS, has_events=["Inside the Emperor - Defeat Blight"], + loading_screen=False) ], RegionNames.SEIAN_CITY_COMMONERS: [ ExitData(RegionNames.SEIAN_CITY_YAMA), @@ -44,29 +45,29 @@ # TODO: Make some names clearer # Always mark chests in Canal as underwater in case the water has been returned. RegionNames.SEIAN_CITY_COMMONERS_DRY: { - "Sei-an City (Commoner's quarter) - Chest in Canal near Yellow Kimono lady": LocData( + "Sei-an City (Commoner's quarter) - Northern Chest in West Canal": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 0), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal near Naguri": LocData( + "Sei-an City (Commoner's quarter) - Chest in western Canal near water source": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 1), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal near empty Ferry Stop": LocData( + "Sei-an City (Commoner's quarter) - Chest in eastern Canal empty Ferry Stop": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 3), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal near bridge": LocData( + "Sei-an City (Commoner's quarter) - Southern Chest in eastern Canal near bridge": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 4), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal under balcony": LocData( + "Sei-an City (Commoner's quarter) - Chest in eastern canal under balcony": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 5), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal near west bridge": LocData( + "Sei-an City (Commoner's quarter) - Chest in western Canal between bridge and ferry spot": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 6), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal in northwest corner": LocData( + "Sei-an City (Commoner's quarter) - Chest in western canal north of ferry spor": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 7), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal near southeast bridge": LocData( + "Sei-an City (Commoner's quarter) - Southern chest in western Canal": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 8), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal near stairs": LocData( + "Sei-an City (Commoner's quarter) - Chest in Eastern Canal near stairs to Mr Flower's house": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 10), type=LocationType.UNDERWATER_CHEST), "Sei-an City (Commoner's quarter) - Buried chest Chest near bridge": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 11), type=LocationType.BURIED_CHEST), "Sei-an City (Commoner's quarter) - Buried chest near east wall": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 12), type=LocationType.BURIED_CHEST), - "Sei-an City (Commoner's quarter) - Freestanding chest near Ryoshima entrance": LocData( + "Sei-an City (Commoner's quarter) - Freestanding chest west of Ryoshima entrance": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 13)), "Sei-an City (Commoner's quarter) - Buried Chest behind Mr. Flower's house": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 14), type=LocationType.BURIED_CHEST), @@ -76,6 +77,8 @@ container_check_id(MapIds.SEIAN_COMMONERS, 16)), "Sei-an City (Commoner's quarter) - Freestanding Chest near Ryoshima entrance 2": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 17)), + "Sei-an City (Commoner's quarter) - Chest in canal northeast corner": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 21)), }, RegionNames.SEIAN_CITY_YAMA: { "Sei-an City (Commoner's quarter) - Chest after learning Fireburst": LocData( @@ -96,8 +99,7 @@ container_check_id(MapIds.SEIAN_COMMONERS, 19)), "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F northwest Rafters Left": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 20)), - "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F northwest Rafters Right": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 21)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F north central Rafters": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 22)), "Sei-an City (Commoner's quarter) - Chest in southwest building, GF Freestanding Right": LocData( @@ -122,29 +124,29 @@ } shop_locations = { RegionNames.SEIAN_CITY_COMMONERS_DRY: { - "Sei-an City Weapon Shop Slot 1": LocData(shop_check_id(16, 0), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 2": LocData(shop_check_id(16, 1), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 3": LocData(shop_check_id(16, 2), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 4": LocData(shop_check_id(16, 3), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 5": LocData(shop_check_id(16, 4), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 6": LocData(shop_check_id(16, 5), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 7": LocData(shop_check_id(16, 6), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 8": LocData(shop_check_id(16, 7), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 9": LocData(shop_check_id(16, 8), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 10": LocData(shop_check_id(16, 9), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 11": LocData(shop_check_id(16, 10), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 12": LocData(shop_check_id(16, 11), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 1": LocData(shop_check_id(17, 0), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 2": LocData(shop_check_id(17, 1), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 3": LocData(shop_check_id(17, 2), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 4": LocData(shop_check_id(17, 3), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 5": LocData(shop_check_id(17, 4), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 6": LocData(shop_check_id(17, 5), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 7": LocData(shop_check_id(17, 6), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 8": LocData(shop_check_id(17, 7), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 9": LocData(shop_check_id(17, 8), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 10": LocData(shop_check_id(17, 9), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 11": LocData(shop_check_id(17, 10), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 12": LocData(shop_check_id(17, 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), + "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), } } From e5367267136542196bb8b3a7788cdc68323f1fcb Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 01:03:02 +0200 Subject: [PATCH 13/30] Fixes in sei-an, some aristocratic quarter checks and story progression --- worlds/okamihd/Enums/LocationType.py | 30 +++---- worlds/okamihd/Enums/RegionNames.py | 34 ++++++-- worlds/okamihd/RegionsData/r200.py | 122 +++++++++++++++++++++++++++ worlds/okamihd/RegionsData/r201.py | 37 +++++--- worlds/okamihd/RegionsData/r206.py | 26 ++++++ worlds/okamihd/RegionsData/rf04.py | 6 +- worlds/okamihd/Rules.py | 14 +-- 7 files changed, 224 insertions(+), 45 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r200.py create mode 100644 worlds/okamihd/RegionsData/r206.py diff --git a/worlds/okamihd/Enums/LocationType.py b/worlds/okamihd/Enums/LocationType.py index bb0ccb8887b3..c8cf76d5eade 100644 --- a/worlds/okamihd/Enums/LocationType.py +++ b/worlds/okamihd/Enums/LocationType.py @@ -6,26 +6,26 @@ class LocationType(Enum): - FREESTANDING_ITEM=0, - NORMAL_CHEST=1, - UNDERWATER_CHEST=2, - TREASURE_BUD=3, - BURNING_CHEST=4, - BURIED_CHEST=5, - STONE_BURIED_CHEST=6, - CONSTELLATION=7, - BURIED_UNDER_LEAF_PILE=8, - EVENT=9 - BURNING_CHEST_NO_WATER=10, - DARUMA=11, + FREESTANDING_ITEM = 0, + NORMAL_CHEST = 1, + UNDERWATER_CHEST = 2, + TREASURE_BUD = 3, + BURNING_CHEST = 4, + BURIED_CHEST = 5, + STONE_BURIED_CHEST = 6, + CONSTELLATION = 7, + BURIED_UNDER_LEAF_PILE = 8, + EVENT = 9 + BURNING_CHEST_NO_WATER = 10, + DARUMA = 11, # Like underwater chest, but can also be obtained with cherry bomb. UNDERWATER_CHEST_SHALLOW = 12, # Slash, Bomb, Bloom - DIGGING_MINIGAME_EARLY=13, + DIGGING_MINIGAME_EARLY = 13, # + Watersprout + Galestrom DIGGING_MINIGAME_LATER = 14, # Frozen chest - FROZEN_CHEST= 15, + FROZEN_CHEST = 15, # Shop item slot SHOP = 16, - + FISHING_MINIGAME = 17 diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index 0bf508f6bd4c..c5b03b1b469a 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -114,7 +114,7 @@ class RegionNames(StrEnum): MOON_CAVE_3F_SAND = "Moon Cave (3F Sand room)" MOON_CAVE_2F_SAND_PIT = "Moon Cave (2F Sand pit)" MOON_CAVE_3F_RAFTERS_AFTER_SAND = "Moon Cave (3F Rafters after sand room)" - MOON_CAVE_2F_RAFTERS_CHEST="Moon Cave (2F Chest Rafter)" + MOON_CAVE_2F_RAFTERS_CHEST = "Moon Cave (2F Chest Rafter)" MOON_CAVE_4F_RAFTERS = "Moon Cave (4F Rafters)" MOON_CAVE_4F_CANON = "Moon Cave (4F Canon)" MOON_CAVE_4F_AFTER_CANON = "Moon Cave (4F after canon)" @@ -146,12 +146,29 @@ class RegionNames(StrEnum): ### COMMONERS QUARTER SEIAN_CITY_COMMONERS = "Sei-an City Commoners' Quarter" SEIAN_CITY_COMMONERS_DRY = "Sei-an City Commoners' Quarter (No water)" - SEIAN_CITY_YAMA ="Sei-an City (Yama's restaurant)" - SEIAN_CITY_FLOWERS="Sei-an City (Mr. Flower's house)" - SEIAN_CITY_SOUTHWEST="Sei-an City (Southwest building)" - SEIAN_CITY_TAO="Sei-an City (Tao Troopers Headquarters)" - - + SEIAN_CITY_YAMA = "Sei-an City (Yama's restaurant)" + SEIAN_CITY_FLOWERS = "Sei-an City (Mr. Flower's house)" + SEIAN_CITY_SOUTHWEST = "Sei-an City (Southwest building)" + SEIAN_CITY_TAO = "Sei-an City (Tao Troopers Headquarters)" + SEIAN_CITY_TOOL_SHOP = "Sei-an City (Tool Shop)" + SEIAN_CITY_WEAPON_SHOP = "Sei-an City (Weapon Shop)" + + ### ARISTOCRATIC QUARTERS + SEIAN_CITY_BRIDGE_COMMONERS = "Sei-an City Lake Beewa Bridge (Commoner's Side)" + SEIAN_CITY_BRIDGE_ARISTOCRATIC = "Sei-an City Lake Beewa Bridge(Aristocratic Side)" + SEIAN_CITY_LECTURE_HALL = "Sei-an City (Lecture Hall)" + SEIAN_CITY_ARISTOCRATIC_SICK = "Sei-an City Aristocratic Quarter (Sick)" + # Since she's the only one in here to have a name, it's her house now. + SEIAN_CITY_OKUNI = "Sei-an City (Okuni's house)" + SEIAN_CITY_ARISTOCRATIC_NORTH_EAST = "Sei-an City Aristocratic Quarter (Northeast house)" + SEIAN_CITY_CLOCK_TOWER = "Sei-an City (Clock tower)" + SEIAN_CITY_ARISTOCRATIC = "Sei-an City Aristocratic Quarter" + SEIAN_CITY_HIMIKO = "Sei-an City (Himiko's palace entrance)" + SEIAN_CITY_TREASURE_WEST= "Sei-an City (Himiko's palace West Treasure Room)" + SEIAN_CITY_TREASURE_EAST = "Sei-an City (Himiko's palace East Treasure Room)" + + ## IMPERIAL PALACE + IMPERIAL_PALACE_ENTRANCE="Imperial Palace (Entrance)" # SPECIAL REGIONS # Special Hub regions to handle warps @@ -174,6 +191,7 @@ class MapIds(Enum): CALCIFIED_CAVERN = 0x10E MOON_CAVE = 0x110 RIVER_OF_THE_HEAVENS = 0x122 + SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 @@ -199,7 +217,7 @@ class MapIndexes(Enum): CALCIFIED_CAVERN = 15 MOON_CAVE = 16 RIVER_OF_THE_HEAVENS = 30 - #FIXME: Ensure this is the right index + # FIXME: Ensure this is the right index SEIAN_CITY_COMMONERS = 32 SHINSHU_FIELD = 71 AGATA_FOREST = 72 diff --git a/worlds/okamihd/RegionsData/r200.py b/worlds/okamihd/RegionsData/r200.py new file mode 100644 index 000000000000..96c60f669d71 --- /dev/null +++ b/worlds/okamihd/RegionsData/r200.py @@ -0,0 +1,122 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id, shop_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.RegionNames import RegionNames, MapIds +from ..Types import ExitData, LocData, EventData + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.SEIAN_CITY_BRIDGE_COMMONERS: [ + ExitData(RegionNames.SEIAN_CITY_BRIDGE_ARISTOCRATIC, + has_events=["Sei-an City (Aristocratic Quarter) - Fish The Living Sword with Benkei"], + loading_screen=False) + ], + RegionNames.SEIAN_CITY_BRIDGE_ARISTOCRATIC: [ + ExitData(RegionNames.SEIAN_CITY_LECTURE_HALL) + ], + RegionNames.SEIAN_CITY_LECTURE_HALL: [ + ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC_SICK) + ], + RegionNames.SEIAN_CITY_ARISTOCRATIC_SICK: [ + ExitData(RegionNames.SEIAN_CITY_OKUNI), + ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC_NORTH_EAST), + ExitData(RegionNames.SEIAN_CITY_CLOCK_TOWER, one_way=True, + has_events=["Sei-an City (Aristocratic Quarter) - Climb clock tower"]), + ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC, loading_screen=False, + has_events=["Inside the Emperor - Defeat Blight"]), + ExitData(RegionNames.IMPERIAL_PALACE_ENTRANCE) + ], + RegionNames.SEIAN_CITY_CLOCK_TOWER: [ + ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC_SICK, one_way=True) + ], + RegionNames.SEIAN_CITY_ARISTOCRATIC: [ + ExitData(RegionNames.SEIAN_CITY_HIMIKO, one_way=True, loading_screen=False) + ], + RegionNames.SEIAN_CITY_HIMIKO: [ + ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC, one_way=True, loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC_SICK, one_way=True, loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_TREASURE_WEST), + ExitData(RegionNames.SEIAN_CITY_TREASURE_EAST) + ] +} +events = { + RegionNames.SEIAN_CITY_BRIDGE_COMMONERS: { + "Sei-an City (Aristocratic Quarter) - Fish The Living Sword with Benkei": EventData( + required_items_events=["Sei-an City (Commoner's Quarter) - Dig water source", "Blinding Snow"], + type=LocationType.FISHING_MINIGAME) + }, + RegionNames.SEIAN_CITY_ARISTOCRATIC_SICK: { + "Sei-an City (Aristocratic Quarter) - Climb clock tower": EventData( + required_brush_techniques=[BrushTechniques.CATWALK]) + }, + RegionNames.SEIAN_CITY_ARISTOCRATIC: { + "Sei-an City (Aristocratic Quarter) - Fool Himiko's Guards": EventData(required_brush_techniques=[BrushTechniques.VEIL_OF_MIST]) + }, + RegionNames.SEIAN_CITY_LECTURE_HALL:{ + #biteable check #2, do we have access to Rao to give her the item ? + "Sei-an City (Aristocratic Quarter) - Give Prayer Slips to Rao": EventData(required_items_events=["Imperial Palace - Grab Prayer Slips"]) + } +} +locations = { + RegionNames.SEIAN_CITY_LECTURE_HALL: { + "Sei-an City (Aristocratic Quarter) - West chest in lecture hall": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 9)), + "Sei-an City (Aristocratic Quarter) - East chest in lecture hall": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 13)) + }, + RegionNames.SEIAN_CITY_OKUNI: { + "Sei-an City (Aristocratic Quarter) - Chest in Okuni's house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 21)) + }, + RegionNames.SEIAN_CITY_ARISTOCRATIC_SICK: { + "Sei-an City (Aristocratic Quarter) - Freestanding Chest outside Okuni's house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 19)), + "Sei-an City (Aristocratic Quarter) - Buried chest outside Okuni's house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 20), type=LocationType.BURIED_CHEST), + "Sei-an City (Aristocratic Quarter) - Underwater chest east of central bridge": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 41), type=LocationType.UNDERWATER_CHEST), + "Sei-an City (Aristocratic Quarter) - Freestanding Chest outside northeast house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 4)), + "Sei-an City (Aristocratic Quarter) - Buried chest outside northeast house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 5), type=LocationType.BURIED_CHEST), + "Sei-an City (Aristocratic Quarter) - Buried chest east of Himiko's palace guards": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 2), type=LocationType.BURIED_CHEST), + "Sei-an City (Aristocratic Quarter) - Buried chest behind clock tower": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 3), type=LocationType.BURIED_CHEST), + }, + RegionNames.SEIAN_CITY_ARISTOCRATIC_NORTH_EAST: { + "Sei-an City (Aristocratic Quarter) - Chest in northeast house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 40)), + }, + # In Vanilla ,clock tower checks require story progression + RegionNames.SEIAN_CITY_CLOCK_TOWER: { + + }, + RegionNames.SEIAN_CITY_HIMIKO: { + "Sei-an City (Aristocratic Quarter) - East buried chest behind Himiko's guards": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 7), type=LocationType.BURIED_CHEST), + "Sei-an City (Aristocratic Quarter) - Northeast Freestanding chest in Himiko's palace entrance": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 6)), + "Sei-an City (Aristocratic Quarter) - Freestanding chest behind Himiko's palace": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 47)), + }, + RegionNames.SEIAN_CITY_TREASURE_WEST: { + "Sei-an City (Aristocratic Quarter) - Daruma doll inside Himiko's west treasure room": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 48)), + "Sei-an City (Aristocratic Quarter) - Freestanding chest inside Himiko's west treasure room": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 9)), + }, + RegionNames.SEIAN_CITY_TREASURE_EAST: { + "Sei-an City (Aristocratic Quarter) - West freestanding chest inside Himiko's east treasure room": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 11)), + "Sei-an City (Aristocratic Quarter) - West freestanding chest inside Himiko's east treasure room 2": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 8)), + "Sei-an City (Aristocratic Quarter) - East freestanding chest inside Himiko's east treasure room 2": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 12)), + + } +} diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index b7eb12d9774c..18326197ffb0 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -13,13 +13,16 @@ RegionNames.SEIAN_CITY_COMMONERS_DRY: [ # FIXME - Replace later ExitData(RegionNames.SEIAN_CITY_COMMONERS, has_events=["Inside the Emperor - Defeat Blight"], - loading_screen=False) + loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_WEAPON_SHOP,loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_TOOL_SHOP,loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_FLOWERS), + ExitData(RegionNames.SEIAN_CITY_BRIDGE_COMMONERS) ], RegionNames.SEIAN_CITY_COMMONERS: [ ExitData(RegionNames.SEIAN_CITY_YAMA), - ExitData(RegionNames.SEIAN_CITY_FLOWERS), - ExitData(RegionNames.SEIAN_CITY_SOUTHWEST, has_events=["Sei-an City - Blow up wall to southwest building"]), - ExitData(RegionNames.SEIAN_CITY_TAO, has_events=["Sei-an City - Climb to Tao Troopers Headquarters"], + ExitData(RegionNames.SEIAN_CITY_SOUTHWEST, has_events=["Sei-an City (Commoner's Quarter) - Blow up wall to southwest building"]), + ExitData(RegionNames.SEIAN_CITY_TAO, has_events=["Sei-an City (Commoner's Quarter) - Climb to Tao Troopers Headquarters"], one_way=True, loading_screen=False) ], RegionNames.SEIAN_CITY_TAO: [ @@ -27,13 +30,15 @@ ] } events = { - # FIXME: temporary placed here to ensure everything is accessible + RegionNames.SEIAN_CITY_COMMONERS_DRY: { + "Sei-an City (Commoner's Quarter) - Dig water source" :EventData(type=LocationType.DIGGING_MINIGAME_LATER), + # FIXME: temporary placed here to ensure everything is accessible "Inside the Emperor - Defeat Blight": EventData() }, RegionNames.SEIAN_CITY_COMMONERS: { - "Sei-an City - Blow up wall to southwest building": EventData(cherry_bomb_level=1), - "Sei-an City - Climb to Tao Troopers Headquarters": EventData( + "Sei-an City (Commoner's Quarter) - Blow up wall to southwest building": EventData(cherry_bomb_level=1), + "Sei-an City (Commoner's Quarter) - Climb to Tao Troopers Headquarters": EventData( required_brush_techniques=[BrushTechniques.WATERSPOUT]) }, RegionNames.SEIAN_CITY_YAMA: { @@ -42,7 +47,6 @@ } } locations = { - # TODO: Make some names clearer # Always mark chests in Canal as underwater in case the water has been returned. RegionNames.SEIAN_CITY_COMMONERS_DRY: { "Sei-an City (Commoner's quarter) - Northern Chest in West Canal": LocData( @@ -57,13 +61,13 @@ container_check_id(MapIds.SEIAN_COMMONERS, 5), type=LocationType.UNDERWATER_CHEST), "Sei-an City (Commoner's quarter) - Chest in western Canal between bridge and ferry spot": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 6), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Chest in western canal north of ferry spor": LocData( + "Sei-an City (Commoner's quarter) - Chest in western canal north of ferry spot": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 7), type=LocationType.UNDERWATER_CHEST), "Sei-an City (Commoner's quarter) - Southern chest in western Canal": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 8), type=LocationType.UNDERWATER_CHEST), "Sei-an City (Commoner's quarter) - Chest in Eastern Canal near stairs to Mr Flower's house": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 10), type=LocationType.UNDERWATER_CHEST), - "Sei-an City (Commoner's quarter) - Buried chest Chest near bridge": LocData( + "Sei-an City (Commoner's quarter) - Buried chest Chest near west ferry spot": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 11), type=LocationType.BURIED_CHEST), "Sei-an City (Commoner's quarter) - Buried chest near east wall": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 12), type=LocationType.BURIED_CHEST), @@ -71,14 +75,17 @@ container_check_id(MapIds.SEIAN_COMMONERS, 13)), "Sei-an City (Commoner's quarter) - Buried Chest behind Mr. Flower's house": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 14), type=LocationType.BURIED_CHEST), - "Sei-an City (Commoner's quarter) - Chest in Canal near Mr. Flower's house": LocData( + #FIXME + "Sei-an City (Commoner's quarter) - NOT Chest in Canal near Mr. Flower's house": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 15), type=LocationType.BURIED_CHEST), "Sei-an City (Commoner's quarter) - Freestanding Chest behind building": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 16)), - "Sei-an City (Commoner's quarter) - Freestanding Chest near Ryoshima entrance 2": LocData( + "Sei-an City (Commoner's quarter) - Chest in Canal near Mr. Flower's house": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 17)), "Sei-an City (Commoner's quarter) - Chest in canal northeast corner": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 21)), + "Sei-an City (Commoner's quarter) - Chest east of Aristocratic quarters entrance": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 23)), }, RegionNames.SEIAN_CITY_YAMA: { "Sei-an City (Commoner's quarter) - Chest after learning Fireburst": LocData( @@ -123,7 +130,7 @@ } } shop_locations = { - RegionNames.SEIAN_CITY_COMMONERS_DRY: { + 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), @@ -135,7 +142,9 @@ "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 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), diff --git a/worlds/okamihd/RegionsData/r206.py b/worlds/okamihd/RegionsData/r206.py new file mode 100644 index 000000000000..449d88bcb503 --- /dev/null +++ b/worlds/okamihd/RegionsData/r206.py @@ -0,0 +1,26 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id, shop_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.RegionNames import RegionNames, MapIds +from ..Types import ExitData, LocData, EventData + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + +} +events = { + RegionNames.IMPERIAL_PALACE_ENTRANCE:{ + # The purpose of this event is to add this item to the pool, since it doesn't have an id...for now. + "Imperial Palace - Prayer Slips":EventData(event_item_name="Prayer Slips"), + # biteable items check - Can we access their vanilla spanw point ? + "Imperial Palace - Grab Prayer Slips":EventData(required_items_events=["Prayer Slips"]) + } + +} +locations = { + +} diff --git a/worlds/okamihd/RegionsData/rf04.py b/worlds/okamihd/RegionsData/rf04.py index 2fcf91556e29..5a7b82908316 100644 --- a/worlds/okamihd/RegionsData/rf04.py +++ b/worlds/okamihd/RegionsData/rf04.py @@ -46,7 +46,7 @@ "Agata Forest - Fill Kushi's Barrel": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT]), "Agata Forest - Fight with Susano": EventData(power_slash_level=1, required_items_events=["Agata Forest - Fill Kushi's Barrel"]), - "Agata Forest - Fish Whopper with Kokari": EventData(power_slash_level=1, + "Agata Forest - Fish Whopper with Kokari": EventData(type=LocationType.FISHING_MINIGAME, required_items_events=[ "Agata Forest - Fight with Susano"]), "Agata Forest - Get Orb from Ume": EventData(id=127, mandatory_enemies=[OkamiEnemies.UME], @@ -118,8 +118,8 @@ "Agata Forest - Repair Bridge with Kokari"]), "Agata Forest - Chest near Kiba": LocData(container_check_id(MapIds.HEALED_AGATA, 49)), "Agata Forest - Chest near Tusta ruins door": LocData(container_check_id(MapIds.HEALED_AGATA, 50)), - ## Special check - "Agata Forest - Fish Giant Salmon with Kokari": LocData(77, power_slash_level=1), + ## Special check - gives Tsuta Ruins Key + "Agata Forest - Fish Giant Salmon with Kokari": LocData(77, type=LocationType.FISHING_MINIGAME), "Agata Forest - Yumigami": LocData(brush_check_id(18), type=LocationType.CONSTELLATION, # bit 18 required_items_events=["Agata Forest - Fish Whopper with Kokari"]) } diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index a8e5c780c42b..bf4559d090a4 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -22,6 +22,7 @@ moon_cave_access: Rule = Has("Serpent Crystal") + # Probably should be removed;Directly add it to the checks that require it. def has_soup_ingerdients(state: CollectionState, world: "OkamiWorld", amount: int) -> bool: return state.has_group("soup_ingredients", world.player, amount) @@ -75,7 +76,7 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even ## RULE BUILDER REWORK: # - FOR EACH LOCATION, BUILD AN ARRAY OF RULES THAT WILL BE ADDED TO THE world.set_rule(loc,AND(*Rules)) - debug_rule=False + debug_rule = False rules: List[Rule] = [] @@ -133,6 +134,8 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even BrushTechniques.GALESTORM] case LocationType.FROZEN_CHEST: required_techinques += [BrushTechniques.INFERNO] + case LocationType.FISHING_MINIGAME: + required_power_slash_level = max(required_power_slash_level, 1) case _: required_techinques += [] @@ -156,14 +159,15 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even # Append special rule if it's defined rules.append(data.special_rule) - # Set the location to require all concatenated rule if len(rules) > 0: final_rule = And(*rules) world.set_rule(loc, final_rule) if debug_rule: - print("[Debug] - Rule for "+ loc.name) + print("[Debug] - Rule for " + loc.name) print(final_rule) + + # else: # print("no rule for this check") @@ -176,13 +180,13 @@ def apply_exit_rules(etr: Entrance, name: str, data: ExitData, world: "OkamiWorl rules.append(HasAll(*data.has_events)) if len(rules) > 0: - final_rule = And(*rules) world.set_rule(etr, final_rule) 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")) + world.set_completion_rule(HasAll("Moon Cave - Defeat Orochi", "Gale Shrine - Defeat Crimson Helm", + "Tsuta Ruins - Defeat the spider queen")) world.multiworld.completion_condition[world.player] = lambda state: state.has( "Moon Cave - Defeat Orochi", world.player) return From 5743b7fb6588af2157a881afc75828be94636c36 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 01:07:40 +0200 Subject: [PATCH 14/30] Add Sunken Ship Base --- worlds/okamihd/Enums/RegionNames.py | 5 +++++ worlds/okamihd/RegionsData/__init__.py | 5 ++++- worlds/okamihd/RegionsData/r205.py | 20 ++++++++++++++++++++ worlds/okamihd/RegionsData/rf0a.py | 4 ++-- 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r205.py diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index c5b03b1b469a..1b2ec8515b85 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -167,6 +167,10 @@ class RegionNames(StrEnum): SEIAN_CITY_TREASURE_WEST= "Sei-an City (Himiko's palace West Treasure Room)" SEIAN_CITY_TREASURE_EAST = "Sei-an City (Himiko's palace East Treasure Room)" + + ## SUNKEN SHIP + SUNKEN_SHIP_ENTRANCE="Sunken Ship (Entrance)" + ## IMPERIAL PALACE IMPERIAL_PALACE_ENTRANCE="Imperial Palace (Entrance)" @@ -193,6 +197,7 @@ class MapIds(Enum): RIVER_OF_THE_HEAVENS = 0x122 SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 + SUNKEN_SHIP= 0x205 CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 CURSED_AGATA = 0xF03 diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index fd9d2d470664..9700f726a64b 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 + r110, rf06, r105, rf09, rf0a, r201,r205 if TYPE_CHECKING: from .. import OkamiWorld @@ -21,6 +21,7 @@ **r110.exits, **r122.exits, **r201.exits, + **r205.exits, **rf01.exits, **rf02.exits, **rf03.exits, @@ -46,6 +47,7 @@ **r110.locations, **r122.locations, **r201.locations, + **r205.locations, **rf01.locations, **rf02.locations, **rf03.locations, @@ -71,6 +73,7 @@ **r110.events, **r122.events, **r201.events, + **r205.events, **rf01.events, **rf02.events, **rf03.events, diff --git a/worlds/okamihd/RegionsData/r205.py b/worlds/okamihd/RegionsData/r205.py new file mode 100644 index 000000000000..1eee540be4ff --- /dev/null +++ b/worlds/okamihd/RegionsData/r205.py @@ -0,0 +1,20 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id, shop_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.RegionNames import RegionNames, MapIds +from ..Types import ExitData, LocData, EventData + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + +} +events = { + +} +locations = { + +} diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 61ac737ba34a..082cb1198e5b 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -40,14 +40,14 @@ ExitData(RegionNames.RYOSHIMA_COAST, loading_screen=False, one_way=True, has_events=["Ryoshima Coast - Mandatory Ubume Encounter"]) ], - 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) ], RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON: [ - ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False) + ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False), + ExitData(RegionNames.SUNKEN_SHIP_ENTRANCE) ], RegionNames.RYOSHIMA_COAST_WEST_PIER: [ ExitData(RegionNames.RYOSHIMA_COAST_SEA, loading_screen=False) From 9da32a8d5e24fd9b72bef5cb59ed96e577a971fe Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 01:09:58 +0200 Subject: [PATCH 15/30] loas new locations and exits --- worlds/okamihd/Enums/RegionNames.py | 1 + worlds/okamihd/RegionsData/__init__.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index c5b03b1b469a..f39263455198 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -193,6 +193,7 @@ class MapIds(Enum): RIVER_OF_THE_HEAVENS = 0x122 SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 + IMPERIAL_PALACE= 0x206 CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 CURSED_AGATA = 0xF03 diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index fd9d2d470664..1228987b7dd2 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 + r110, rf06, r105, rf09, rf0a, r201, r200, r206 if TYPE_CHECKING: from .. import OkamiWorld @@ -20,7 +20,9 @@ **r10e.exits, **r110.exits, **r122.exits, + **r200.exits, **r201.exits, + **r206.exits, **rf01.exits, **rf02.exits, **rf03.exits, @@ -45,7 +47,9 @@ **r10e.locations, **r110.locations, **r122.locations, + **r200.locations, **r201.locations, + **r206.locations, **rf01.locations, **rf02.locations, **rf03.locations, @@ -70,7 +74,9 @@ **r10e.events, **r110.events, **r122.events, + **r200.events, **r201.events, + **r206.events, **rf01.events, **rf02.events, **rf03.events, @@ -96,7 +102,7 @@ **getattr(rf0a, 'shop_locations', {}), } -okami_warps={ +okami_warps = { **r102.warps, **r105.warps, **r108.warps, @@ -105,4 +111,4 @@ **rf04.warps, **rf08.warps, **rf0a.warps, -} \ No newline at end of file +} From 72c3e041e97b3bc650de7cdeb7168cf22c5bedc1 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 01:15:18 +0200 Subject: [PATCH 16/30] Fix some ids --- worlds/okamihd/RegionsData/r200.py | 2 +- worlds/okamihd/RegionsData/r201.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/worlds/okamihd/RegionsData/r200.py b/worlds/okamihd/RegionsData/r200.py index 96c60f669d71..8163d0ef8b14 100644 --- a/worlds/okamihd/RegionsData/r200.py +++ b/worlds/okamihd/RegionsData/r200.py @@ -64,7 +64,7 @@ locations = { RegionNames.SEIAN_CITY_LECTURE_HALL: { "Sei-an City (Aristocratic Quarter) - West chest in lecture hall": LocData( - container_check_id(MapIds.SEIAN_ARISTORATIC, 9)), + container_check_id(MapIds.SEIAN_ARISTORATIC, 14)), "Sei-an City (Aristocratic Quarter) - East chest in lecture hall": LocData( container_check_id(MapIds.SEIAN_ARISTORATIC, 13)) }, diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index 18326197ffb0..50bc5a109faa 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -109,8 +109,6 @@ "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F north central Rafters": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 22)), - "Sei-an City (Commoner's quarter) - Chest in southwest building, GF Freestanding Right": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 23)), "Sei-an City (Commoner's quarter) - Chest in southwest building, GF in Cage": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 24)), "Sei-an City (Commoner's quarter) - Chest in southwest building, GF near Cage": LocData( From ed320bd99e07acc4eb8928fe7a68556af958816b Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 13:26:08 +0200 Subject: [PATCH 17/30] Add SUken Ship logic, fix rysohima coast warps --- worlds/okamihd/Enums/OkamiEnemies.py | 6 +- worlds/okamihd/Enums/RegionNames.py | 26 ++++-- worlds/okamihd/RegionsData/r205.py | 127 ++++++++++++++++++++++++++- worlds/okamihd/RegionsData/rf09.py | 15 +++- worlds/okamihd/RegionsData/rf0a.py | 18 ++-- worlds/okamihd/Rules.py | 2 +- 6 files changed, 172 insertions(+), 22 deletions(-) diff --git a/worlds/okamihd/Enums/OkamiEnemies.py b/worlds/okamihd/Enums/OkamiEnemies.py index f61691353fd3..0b593556cd54 100644 --- a/worlds/okamihd/Enums/OkamiEnemies.py +++ b/worlds/okamihd/Enums/OkamiEnemies.py @@ -16,6 +16,7 @@ class EnnemyData(NamedTuple): requires_slash: bool = False requires_bomb: bool = False + # Reference https://github.com/whataboutclyde/okami-utils/blob/master/data/enemy_id.yaml class OkamiEnemies(Enum): GREEN_IMP = EnnemyData(0x03, "Green Imp", 0, BrushTechniques.POWER_SLASH) @@ -41,7 +42,10 @@ class OkamiEnemies(Enum): FIRE_EYE = EnnemyData(0x52, "Fire Eye", 1) OROCHI_1 = EnnemyData(0x69, "Orochi (Moon Cave)", 1, required_techniques=[BrushTechniques.WATERSPOUT]) UBUME = EnnemyData(0x58, "Ubume", 1, required_techniques=[BrushTechniques.GALESTORM]) - ICE_LIPS = EnnemyData(0x53, "Ice Lips",1) + ICE_LIPS = EnnemyData(0x53, "Ice Lips", 1) + JIRO = EnnemyData(0x13, "Jiro", 2) + SABURO = EnnemyData(0x14, "Saburo", 2) + ICHIRO = EnnemyData(0x12, "Ichiro", 2,requires_slash=True) @staticmethod def list(): diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index 193ed60100b3..e5472f0e6f75 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -164,15 +164,29 @@ class RegionNames(StrEnum): SEIAN_CITY_CLOCK_TOWER = "Sei-an City (Clock tower)" SEIAN_CITY_ARISTOCRATIC = "Sei-an City Aristocratic Quarter" SEIAN_CITY_HIMIKO = "Sei-an City (Himiko's palace entrance)" - SEIAN_CITY_TREASURE_WEST= "Sei-an City (Himiko's palace West Treasure Room)" + SEIAN_CITY_TREASURE_WEST = "Sei-an City (Himiko's palace West Treasure Room)" SEIAN_CITY_TREASURE_EAST = "Sei-an City (Himiko's palace East Treasure Room)" - ## SUNKEN SHIP - SUNKEN_SHIP_ENTRANCE="Sunken Ship (Entrance)" + SUNKEN_SHIP_ENTRANCE = "Sunken Ship (Entrance)" + SUNKEN_SHIP_SW_LOW = "Sunken Ship (Southwest Room, Low water)" + SUNKEN_SHIP_BONES_LOW = "Sunken Ship (Bone Pile Room, Low water)" + SUNKEN_SHIP_NW_LOW = "Sunken Ship (Northwest Room, Low water)" + SUNKEN_SHIP_SW_HIGH = "Sunken Ship (Southwest Room, High water)" + SUNKEN_SHIP_BONES_HIGH = "Sunken Ship (Bone Pile Room, High water)" + SUNKEN_SHIP_NW_HIGH = "Sunken Ship (Northwest Room, High water)" + SUNKEN_SHIP_SE_HIGH = "Sunken Ship (Southeast Room, High water)" + SUNKEN_SHIP_E_HALLWAY_HIGH = "Sunken Ship (East Hallway High water)" + SUNKEN_SHIP_HANDS_HIGH = "Sunken Ship (Hands room High water)" + SUNKEN_SHIP_SE_LOW = "Sunken Ship (Southeast Room, Low water)" + SUNKEN_SHIP_E_HALLWAY_LOW = "Sunken Ship (East Hallway Low water)" + SUNKEN_SHIP_HANDS_LOW = "Sunken Ship (Hands room Low water)" + SUNKEN_SHIP_SE_CHESTS="Sunken Ship (Southeast Room Chests)" + SUNKEN_SHIP_TREASURE="Sunken Ship (Treasure Room)" + SUNKEN_SHIP_S_LEDGE="Sunken Ship (Southern room ledge)" ## IMPERIAL PALACE - IMPERIAL_PALACE_ENTRANCE="Imperial Palace (Entrance)" + IMPERIAL_PALACE_ENTRANCE = "Imperial Palace (Entrance)" # SPECIAL REGIONS # Special Hub regions to handle warps @@ -197,8 +211,8 @@ class MapIds(Enum): RIVER_OF_THE_HEAVENS = 0x122 SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 - SUNKEN_SHIP= 0x205 - IMPERIAL_PALACE= 0x206 + SUNKEN_SHIP = 0x205 + IMPERIAL_PALACE = 0x206 CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 CURSED_AGATA = 0xF03 diff --git a/worlds/okamihd/RegionsData/r205.py b/worlds/okamihd/RegionsData/r205.py index 1eee540be4ff..c97027f416c6 100644 --- a/worlds/okamihd/RegionsData/r205.py +++ b/worlds/okamihd/RegionsData/r205.py @@ -3,6 +3,7 @@ from ..CheckIds import container_check_id, brush_check_id, shop_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies from ..Enums.RegionNames import RegionNames, MapIds from ..Types import ExitData, LocData, EventData @@ -10,11 +11,135 @@ from .. import OkamiWorld exits = { + RegionNames.SUNKEN_SHIP_ENTRANCE: [ + ExitData(RegionNames.SUNKEN_SHIP_SW_LOW, has_events=["Sunken Ship - Open entrance Door"] + , loading_screen=False), + ], + RegionNames.SUNKEN_SHIP_SW_LOW: [ + ExitData(RegionNames.SUNKEN_SHIP_BONES_LOW, loading_screen=False) + ], + RegionNames.SUNKEN_SHIP_BONES_LOW: [ + ExitData(RegionNames.SUNKEN_SHIP_NW_LOW, loading_screen=False, + has_events=["Sunken Ship - Open Northwest cursed door"]) + ], + RegionNames.SUNKEN_SHIP_NW_LOW: [ + ExitData(RegionNames.SUNKEN_SHIP_NW_HIGH, one_way=True, loading_screen=False, + has_events=["Sunken Ship - Raise water level"]), + ExitData(RegionNames.SUNKEN_SHIP_HANDS_LOW, one_way=True, loading_screen=False, + has_events=["Sunken Ship - Set barrel on Scales"]) + ], + RegionNames.SUNKEN_SHIP_NW_HIGH: [ + ExitData(RegionNames.SUNKEN_SHIP_NW_LOW, one_way=True, loading_screen=False, + has_events=["Sunken Ship - Drain water level"]), + ExitData(RegionNames.SUNKEN_SHIP_BONES_HIGH, loading_screen=False, + has_events=["Sunken Ship - Open Northwest cursed door"]) + ], + RegionNames.SUNKEN_SHIP_BONES_HIGH: [ + ExitData(RegionNames.SUNKEN_SHIP_SW_HIGH, has_events=["Sunken Ship - Mandatory Ichiro fight"]) + ], + RegionNames.SUNKEN_SHIP_SW_HIGH: [ + ExitData(RegionNames.SUNKEN_SHIP_SE_HIGH, loading_screen=False, one_way=True), + ExitData(RegionNames.SUNKEN_SHIP_S_LEDGE, loading_screen=False, one_way=True) + ], + RegionNames.SUNKEN_SHIP_SE_HIGH: [ + ExitData(RegionNames.SUNKEN_SHIP_E_HALLWAY_HIGH, loading_screen=False), + ExitData(RegionNames.SUNKEN_SHIP_SE_CHESTS, one_way=True, loading_screen=False, needs_long_swim=True), + ExitData(RegionNames.SUNKEN_SHIP_SW_HIGH, loading_screen=False, one_way=True, needs_long_swim=True), + ExitData(RegionNames.SUNKEN_SHIP_S_LEDGE, loading_screen=False, one_way=True, needs_long_swim=True) + ], + RegionNames.SUNKEN_SHIP_SE_LOW: [ + ExitData(RegionNames.SUNKEN_SHIP_SE_CHESTS, one_way=True, loading_screen=False), + ExitData(RegionNames.SUNKEN_SHIP_SW_LOW, one_way=True, loading_screen=False, + has_events=["Sunken Ship - climb Waterspout pillar to southwest room"]), + ExitData(RegionNames.SUNKEN_SHIP_S_LEDGE, loading_screen=False, one_way=True, + has_events=["Sunken Ship - climb Waterspout pillar to southwest room"]), + ExitData(RegionNames.SUNKEN_SHIP_TREASURE, loading_screen=False, + has_events=["Sunken Ship - Open final cursed door"]) + ], + RegionNames.SUNKEN_SHIP_E_HALLWAY_HIGH: [ + ExitData(RegionNames.SUNKEN_SHIP_HANDS_HIGH, loading_screen=False) + ], + RegionNames.SUNKEN_SHIP_HANDS_HIGH: [ + ExitData(RegionNames.SUNKEN_SHIP_NW_HIGH, loading_screen=False, one_way=True) + ], + RegionNames.SUNKEN_SHIP_HANDS_LOW: [ + ExitData(RegionNames.SUNKEN_SHIP_NW_LOW, one_way=True, loading_screen=False), + ExitData(RegionNames.SUNKEN_SHIP_E_HALLWAY_LOW, loading_screen=False) + ], + RegionNames.SUNKEN_SHIP_E_HALLWAY_LOW: [ + ExitData(RegionNames.SUNKEN_SHIP_SE_LOW, loading_screen=False) + ] } events = { - + RegionNames.SUNKEN_SHIP_ENTRANCE: { + "Sunken Ship - Rao climbs on Ama's back": EventData( + required_items_events=["Sei-an City (Aristocratic Quarter) - Give Prayer Slips to Rao"]), + "Sunken Ship - Open entrance Door": EventData(required_items_events=["Sunken Ship - Rao climbs on Ama's back"]) + }, + RegionNames.SUNKEN_SHIP_SW_LOW: { + "Sunken Ship - Mandatory Jiro & Saburo fight": EventData( + mandatory_enemies=[OkamiEnemies.JIRO, OkamiEnemies.SABURO]), + "Sunken Ship - Open Northwest cursed door": EventData( + required_items_events=["Sunken Ship - Rao climbs on Ama's back", + "Sunken Ship - Mandatory Jiro & Saburo fight"]) + }, + RegionNames.SUNKEN_SHIP_NW_LOW: { + "Sunken Ship - Raise water level": EventData(required_brush_techniques=[BrushTechniques.SUNRISE]) + }, + RegionNames.SUNKEN_SHIP_NW_HIGH: { + "Sunken Ship - Drain water level": EventData(required_brush_techniques=[BrushTechniques.CRESCENT]) + }, + RegionNames.SUNKEN_SHIP_BONES_HIGH: { + "Sunken Ship - Mandatory Ichiro fight": EventData(mandatory_enemies=[OkamiEnemies.ICHIRO]) + }, + RegionNames.SUNKEN_SHIP_SE_HIGH: { + "Sunken Ship - use Cannon in southeast room (High water) ": EventData(cherry_bomb_level=1, + event_item_name="Sunken Ship - use Cannon in southeast room") + }, + RegionNames.SUNKEN_SHIP_SE_LOW: { + "Sunken Ship - use Cannon in southeast room (Low water) ": EventData(cherry_bomb_level=1, + event_item_name="Sunken Ship - use Cannon in southeast room"), + "Sunken Ship - climb Waterspout pillar to southwest room": EventData( + required_brush_techniques=[BrushTechniques.WATERSPOUT]), + "Sunken Ship - Open lockjaw": EventData(required_items_events=["Sunken Ship - use Cannon in southeast room"]), + "Sunken Ship - Open final cursed door": EventData( + required_items_events=["Sunken Ship - Open lockjaw", "Sunken Ship - Rao climbs on Ama's back"]) + }, + RegionNames.SUNKEN_SHIP_HANDS_HIGH: { + "Sunken Ship - Set barrel on Scales": EventData(power_slash_level=1) + } } locations = { + RegionNames.SUNKEN_SHIP_SW_LOW: { + "Sunken Ship - Chest in Southwest room 1": LocData(container_check_id(MapIds.SUNKEN_SHIP, 1)), + "Sunken Ship - Chest in Southwest room 2": LocData(container_check_id(MapIds.SUNKEN_SHIP, 0)), + "Sunken Ship - Chest in Southwest room 3": LocData(container_check_id(MapIds.SUNKEN_SHIP, 2)), + }, + RegionNames.SUNKEN_SHIP_SE_CHESTS: { + # Check if these are accessible in low water with holy eagle + "Sunken Ship - Lower Chest in Southeast room behind canon walls": LocData( + container_check_id(MapIds.SUNKEN_SHIP, 12), + required_items_events=["Sunken Ship - use Cannon in southeast room"]), + "Sunken Ship - Higher Chest in Southeast room behind canon walls": LocData( + container_check_id(MapIds.SUNKEN_SHIP, 4), + required_items_events=["Sunken Ship - use Cannon in southeast room"]), + }, + RegionNames.SUNKEN_SHIP_E_HALLWAY_HIGH: { + "Sunken Ship - Southern chest in eastern hallway": LocData(container_check_id(MapIds.SUNKEN_SHIP, 5)), + "Sunken Ship - Northern chest in eastern hallway": LocData(container_check_id(MapIds.SUNKEN_SHIP, 6)) + }, + RegionNames.SUNKEN_SHIP_HANDS_HIGH: { + "Sunken Ship - Chest on ledge in hands room": LocData(container_check_id(MapIds.SUNKEN_SHIP, 11)) + }, + RegionNames.SUNKEN_SHIP_TREASURE: { + "Sunken Ship - Chest in treasure room 1": LocData(container_check_id(MapIds.SUNKEN_SHIP, 9)), + # Vanilla Lucky mallet,triggers a cutscene + "Sunken Ship - Chest in treasure room 2": LocData(container_check_id(MapIds.SUNKEN_SHIP, 7)), + "Sunken Ship - Chest in treasure room 3": LocData(container_check_id(MapIds.SUNKEN_SHIP, 8)) + }, + RegionNames.SUNKEN_SHIP_S_LEDGE: { + "Sunken Ship - Chest in southern central ledge": LocData(container_check_id(MapIds.SUNKEN_SHIP, 10)) + } } diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py index b552bbd91ea8..78936fd4e2a9 100644 --- a/worlds/okamihd/RegionsData/rf09.py +++ b/worlds/okamihd/RegionsData/rf09.py @@ -1,7 +1,9 @@ from typing import TYPE_CHECKING +from rule_builder.rules import True_ from ..Enums.BrushTechniques import BrushTechniques -from ..Types import ExitData, EventData, LocData +from ..Enums.WarpType import WarpType +from ..Types import ExitData, EventData, LocData, WarpData from ..Enums.RegionNames import RegionNames if TYPE_CHECKING: @@ -10,10 +12,10 @@ exits = { RegionNames.CURSED_RYOSHIMA_COAST: [ ExitData(RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE, - has_events=["Ryoshima Coast - Open Guardian Sapling Cave"],loading_screen=False) + has_events=["Ryoshima Coast - Open Guardian Sapling Cave"], loading_screen=False) ], - RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE:[ - ExitData(RegionNames.RYOSHIMA_COAST,has_events=["Ryoshima Coast - Bloom the Guardian Sapling"],one_way=True) + RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE: [ + ExitData(RegionNames.RYOSHIMA_COAST, has_events=["Ryoshima Coast - Bloom the Guardian Sapling"], one_way=True) ] } events = { @@ -30,3 +32,8 @@ } locations = { } +warps = { + RegionNames.CURSED_RYOSHIMA_COAST: [ + WarpData(type=WarpType.MIST_WARP, trigger_warp_to=True_, trigger_warp_from=True_) + ] +} diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 082cb1198e5b..04635faf83d9 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -21,13 +21,14 @@ ExitData(RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER, one_way=True, loading_screen=False), ExitData(RegionNames.RYOSHIMA_COAST_WEST_PIER, one_way=True, loading_screen=False), ExitData(RegionNames.ANKOKU_TEMPLE), - ExitData(RegionNames.FAWNS_HOUSE, has_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]) + 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) ], RegionNames.RYOSHIMA_COAST_SEA: [ ExitData(RegionNames.RYOSHIMA_COAST_DOJO, needs_long_swim=True, loading_screen=False), ExitData(RegionNames.RYOSHIMA_COAST_SHIP_TOP, needs_long_swim=True, loading_screen=False), - ExitData(RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON, one_way=True, - has_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False) + ], RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: [ ExitData(RegionNames.RYOSHIMA_COAST, has_events=["Ryoshima Coast - Climb back to main area"], one_way=True, @@ -46,7 +47,7 @@ ExitData(RegionNames.SEIAN_CITY_COMMONERS_DRY) ], RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON: [ - ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False), + ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False,needs_long_swim=True), ExitData(RegionNames.SUNKEN_SHIP_ENTRANCE) ], RegionNames.RYOSHIMA_COAST_WEST_PIER: [ @@ -58,7 +59,7 @@ events = { RegionNames.RYOSHIMA_COAST: { "Ryoshima Coast - Climb catwalk tower": EventData(required_brush_techniques=[BrushTechniques.CATWALK]), - "Ryoshima Coast - Open Lunar Lagoon": EventData(required_items_events=["Ryoshima Coast - Buy Holy Eagle"], + "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 @@ -69,8 +70,8 @@ }, RegionNames.RYOSHIMA_COAST_DOJO: { # Convert these to items at some point when dojos techs/shops are randomizable - "Ryoshima Coast - Buy Holy Eagle": EventData(), - "Ryoshima Coast - Buy Digging Champ": EventData() + "Ryoshima Coast - Buy Holy Eagle": EventData(event_item_name="Holy Eagle"), + "Ryoshima Coast - Buy Digging Champ": EventData(event_item_name="Digging Champ") }, RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER: { "Ryoshima Coast - Mandatory Ubume Encounter": EventData(mandatory_enemies=[OkamiEnemies.UBUME]) @@ -143,7 +144,7 @@ type=LocationType.STONE_BURIED_CHEST), "Ryoshima Coast - Chest on top of dojo Lunar Turret": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 29), required_items_events=[ - "Ryoshima Coast - Buy Holy Eagle"]), + "Holy Eagle"]), "Ryoshima Coast - Freestanding chest on bottom of dojo island": LocData( container_check_id(MapIds.HEALED_RYOSHIMA, 30)) }, @@ -201,6 +202,5 @@ WarpData(type=WarpType.MERMAID_SPRING, trigger_warp_to=Has("Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance"), trigger_warp_from=Has("Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance")), - WarpData(type=WarpType.MIST_WARP, trigger_warp_to=True_, trigger_warp_from=True_) ] } diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index bf4559d090a4..7635da50108e 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -112,7 +112,7 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even required_techinques += [BrushTechniques.CRESCENT] case LocationType.STONE_BURIED_CHEST: # Digging Champ Requirement - rules.append(Has("Ryoshima Coast - Buy Digging Champ")) + rules.append(Has("Digging Champ")) if world.options.NightTimeChecksRequireCrescent: required_techinques += [BrushTechniques.CRESCENT] case LocationType.BURNING_CHEST: From 5492ef553e0f60445eaba3090a417420553d5203 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 17:23:03 +0200 Subject: [PATCH 18/30] Add Imperial Palace Logic --- worlds/okamihd/Enums/LocationType.py | 2 + worlds/okamihd/Enums/OkamiEnemies.py | 5 +- worlds/okamihd/Enums/RegionNames.py | 22 +++- worlds/okamihd/RegionsData/__init__.py | 5 +- worlds/okamihd/RegionsData/r200.py | 2 +- worlds/okamihd/RegionsData/r201.py | 5 +- worlds/okamihd/RegionsData/r206.py | 28 ++++- worlds/okamihd/RegionsData/r207.py | 140 +++++++++++++++++++++++++ worlds/okamihd/__init__.py | 2 +- 9 files changed, 196 insertions(+), 15 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r207.py diff --git a/worlds/okamihd/Enums/LocationType.py b/worlds/okamihd/Enums/LocationType.py index c8cf76d5eade..c7555b7ddaef 100644 --- a/worlds/okamihd/Enums/LocationType.py +++ b/worlds/okamihd/Enums/LocationType.py @@ -29,3 +29,5 @@ class LocationType(Enum): # Shop item slot SHOP = 16, FISHING_MINIGAME = 17 + #Chest that can only be opened by Issun in Tiny size + LOCKED_CHEST = 18 diff --git a/worlds/okamihd/Enums/OkamiEnemies.py b/worlds/okamihd/Enums/OkamiEnemies.py index 0b593556cd54..43ee5f55de9b 100644 --- a/worlds/okamihd/Enums/OkamiEnemies.py +++ b/worlds/okamihd/Enums/OkamiEnemies.py @@ -45,7 +45,10 @@ class OkamiEnemies(Enum): ICE_LIPS = EnnemyData(0x53, "Ice Lips", 1) JIRO = EnnemyData(0x13, "Jiro", 2) SABURO = EnnemyData(0x14, "Saburo", 2) - ICHIRO = EnnemyData(0x12, "Ichiro", 2,requires_slash=True) + ICHIRO = EnnemyData(0x12, "Ichiro", 2, requires_slash=True) + 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) @staticmethod def list(): diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index e5472f0e6f75..d9c15fbf7272 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -181,12 +181,27 @@ class RegionNames(StrEnum): SUNKEN_SHIP_SE_LOW = "Sunken Ship (Southeast Room, Low water)" SUNKEN_SHIP_E_HALLWAY_LOW = "Sunken Ship (East Hallway Low water)" SUNKEN_SHIP_HANDS_LOW = "Sunken Ship (Hands room Low water)" - SUNKEN_SHIP_SE_CHESTS="Sunken Ship (Southeast Room Chests)" - SUNKEN_SHIP_TREASURE="Sunken Ship (Treasure Room)" - SUNKEN_SHIP_S_LEDGE="Sunken Ship (Southern room ledge)" + SUNKEN_SHIP_SE_CHESTS = "Sunken Ship (Southeast Room Chests)" + SUNKEN_SHIP_TREASURE = "Sunken Ship (Treasure Room)" + SUNKEN_SHIP_S_LEDGE = "Sunken Ship (Southern room ledge)" ## IMPERIAL PALACE + ### Regular Size IMPERIAL_PALACE_ENTRANCE = "Imperial Palace (Entrance)" + IMPERIAL_PALACE="Imperial Palace" + + ### Small Size + IMPERIAL_PALACE_SMALL_ENTRANCE = "Imperial Palace (Small Size - Entrance)" + IMPERIAL_PALACE_FEET_HELL = "Imperial Palace (Small Size - Feet Hell)" + IMPERIAL_PALACE_WEST_CAVE = "Imperial Palace (Small Size - West cave after lockjaw)" + IMPERIAL_PALACE_SPIDER_CAVE = "Imperial Palace (Small Size - Spider Cave)" + IMPERIAL_PALACE_SPIDER_CAVE_TOP = "Imperial Palace (Small Size - Spider Cave Top Ledges)" + IMPERIAL_PALACE_FLASK_ROOM = "Imperial Palace (Small Size - Mist Flask Room)" + IMPERIAL_PALACE_POISON_SOZU = "Imperial Palace (Small Size - Poison Sōzu Room)" + IMPERIAL_PALACE_EMPERORS_ROOM = "Imperial Palace (Small Size - Emperor's Bedroom)" + IMPERIAL_PALACE_WEST_BEAM = "Imperial Palace (Small Size - West Beam)" + IMPERIAL_PALACE_INSIDE_EMPEROR="Imperial Palace (Small Size - Inside the Emperor's Body)" + # SPECIAL REGIONS # Special Hub regions to handle warps @@ -213,6 +228,7 @@ class MapIds(Enum): SEIAN_COMMONERS = 0x201 SUNKEN_SHIP = 0x205 IMPERIAL_PALACE = 0x206 + IMPERIAL_PALACE_SMALL = 0x207 CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 CURSED_AGATA = 0xF03 diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 00de53a6c856..5726cd3c5861 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 + r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207 if TYPE_CHECKING: from .. import OkamiWorld @@ -24,6 +24,7 @@ **r201.exits, **r205.exits, **r206.exits, + **r207.exits, **rf01.exits, **rf02.exits, **rf03.exits, @@ -52,6 +53,7 @@ **r201.locations, **r205.locations, **r206.locations, + **r207.locations, **rf01.locations, **rf02.locations, **rf03.locations, @@ -80,6 +82,7 @@ **r201.events, **r205.events, **r206.events, + **r207.events, **rf01.events, **rf02.events, **rf03.events, diff --git a/worlds/okamihd/RegionsData/r200.py b/worlds/okamihd/RegionsData/r200.py index 8163d0ef8b14..d6bff9aefb5d 100644 --- a/worlds/okamihd/RegionsData/r200.py +++ b/worlds/okamihd/RegionsData/r200.py @@ -27,7 +27,7 @@ ExitData(RegionNames.SEIAN_CITY_CLOCK_TOWER, one_way=True, has_events=["Sei-an City (Aristocratic Quarter) - Climb clock tower"]), ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC, loading_screen=False, - has_events=["Inside the Emperor - Defeat Blight"]), + has_events=["Imperial Palace - Defeat Blight"]), ExitData(RegionNames.IMPERIAL_PALACE_ENTRANCE) ], RegionNames.SEIAN_CITY_CLOCK_TOWER: [ diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index 50bc5a109faa..fe531bbb550b 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -11,8 +11,7 @@ exits = { RegionNames.SEIAN_CITY_COMMONERS_DRY: [ - # FIXME - Replace later - ExitData(RegionNames.SEIAN_CITY_COMMONERS, has_events=["Inside the Emperor - Defeat Blight"], + ExitData(RegionNames.SEIAN_CITY_COMMONERS, has_events=["Imperial Palace - Defeat Blight"], loading_screen=False), ExitData(RegionNames.SEIAN_CITY_WEAPON_SHOP,loading_screen=False), ExitData(RegionNames.SEIAN_CITY_TOOL_SHOP,loading_screen=False), @@ -33,8 +32,6 @@ RegionNames.SEIAN_CITY_COMMONERS_DRY: { "Sei-an City (Commoner's Quarter) - Dig water source" :EventData(type=LocationType.DIGGING_MINIGAME_LATER), - # FIXME: temporary placed here to ensure everything is accessible - "Inside the Emperor - Defeat Blight": EventData() }, RegionNames.SEIAN_CITY_COMMONERS: { "Sei-an City (Commoner's Quarter) - Blow up wall to southwest building": EventData(cherry_bomb_level=1), diff --git a/worlds/okamihd/RegionsData/r206.py b/worlds/okamihd/RegionsData/r206.py index 449d88bcb503..ee70f81843dd 100644 --- a/worlds/okamihd/RegionsData/r206.py +++ b/worlds/okamihd/RegionsData/r206.py @@ -10,17 +10,37 @@ from .. import OkamiWorld exits = { + RegionNames.IMPERIAL_PALACE_ENTRANCE: [ + ExitData(RegionNames.IMPERIAL_PALACE_SMALL_ENTRANCE, has_events=["Imperial Palace - Become Smol"]), + ExitData(RegionNames.IMPERIAL_PALACE, has_events=["Imperial Palace - Defeat Blight"]) + ], } events = { - RegionNames.IMPERIAL_PALACE_ENTRANCE:{ + RegionNames.IMPERIAL_PALACE_ENTRANCE: { # The purpose of this event is to add this item to the pool, since it doesn't have an id...for now. - "Imperial Palace - Prayer Slips":EventData(event_item_name="Prayer Slips"), - # biteable items check - Can we access their vanilla spanw point ? - "Imperial Palace - Grab Prayer Slips":EventData(required_items_events=["Prayer Slips"]) + "Imperial Palace - Prayer Slips": EventData(event_item_name="Prayer Slips"), + # biteable items check - Can we access their vanilla spawn point ? + "Imperial Palace - Grab Prayer Slips": EventData(required_items_events=["Prayer Slips"]), + "Imperial Palace - Become Smol": EventData(required_items_events=["Lucky Mallet"]), } } locations = { + RegionNames.IMPERIAL_PALACE: { + "Imperial Palace - Chest near the Emperor": LocData(container_check_id(MapIds.IMPERIAL_PALACE, 6)), + "Imperial Palace - Buried chest 1": LocData( + container_check_id(MapIds.IMPERIAL_PALACE, 4), type=LocationType.BURIED_CHEST), + "Imperial Palace - Buried chest 2": LocData( + container_check_id(MapIds.IMPERIAL_PALACE, 1), type=LocationType.BURIED_CHEST), + "Imperial Palace - Buried chest 3": LocData( + container_check_id(MapIds.IMPERIAL_PALACE, 2), type=LocationType.BURIED_CHEST), + "Imperial Palace - Buried chest 4": LocData( + container_check_id(MapIds.IMPERIAL_PALACE, 5), type=LocationType.BURIED_CHEST), + "Imperial Palace - Buried chest 5": LocData( + container_check_id(MapIds.IMPERIAL_PALACE, 3), type=LocationType.BURIED_CHEST), + # FIXME: Chest not randomized for now; It only spawns when you buy mist warp. which you can't do if you already have it/ + #"Imperial Palace - chest after buying Mist warp": LocData(container_check_id(MapIds.IMPERIAL_PALACE, 0)), + } } diff --git a/worlds/okamihd/RegionsData/r207.py b/worlds/okamihd/RegionsData/r207.py new file mode 100644 index 000000000000..40344b0cbd51 --- /dev/null +++ b/worlds/okamihd/RegionsData/r207.py @@ -0,0 +1,140 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id, shop_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Enums.RegionNames import RegionNames, MapIds +from ..Types import ExitData, LocData, EventData + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.IMPERIAL_PALACE_SMALL_ENTRANCE: [ + ExitData(RegionNames.IMPERIAL_PALACE_FEET_HELL, + has_events=["Imperial Palace - Mandatory Thunder Doom Mirror Encounter"]), + ExitData(RegionNames.IMPERIAL_PALACE_WEST_CAVE, + has_events=["Imperial Palace - Open west side lockjaw"]) + ], + RegionNames.IMPERIAL_PALACE_WEST_CAVE: [ + ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE, has_events=["Imperial Palace - Blow up west cave floor"]) + ], + RegionNames.IMPERIAL_PALACE_SPIDER_CAVE: [ + ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE_TOP, has_events=["Holy Eagle"], one_way=True, + loading_screen=False), + ExitData(RegionNames.IMPERIAL_PALACE_FLASK_ROOM, + has_events=["Imperial Palace - Blow up wall to mist flask room"], one_way=True) + ], + RegionNames.IMPERIAL_PALACE_SPIDER_CAVE_TOP: [ + ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE, one_way=True, loading_screen=False) + ], + RegionNames.IMPERIAL_PALACE_FLASK_ROOM: [ + ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE, one_way=True, + has_events=["Imperial Palace - Outspeed the spider"]) + ], + RegionNames.IMPERIAL_PALACE_FEET_HELL: [ + ExitData(RegionNames.IMPERIAL_PALACE_POISON_SOZU, has_events=["Imperial Palace - Outspeed the Brooms"]) + ], + RegionNames.IMPERIAL_PALACE_POISON_SOZU: [ + ExitData(RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM, has_events=["Imperial Palace - Cross the Sozu"]) + ], + RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM:[ + # Also should require Veil of Mist: + # TODO: After changing entrances has_events. + ExitData(RegionNames.IMPERIAL_PALACE_WEST_BEAM,has_events=["Holy Eagle"],loading_screen=False), + # Also should require Veil of Mist: + # TODO: After changing entrances has_events. + ExitData(RegionNames.IMPERIAL_PALACE_INSIDE_EMPEROR,one_way=True) + ], + RegionNames.IMPERIAL_PALACE_INSIDE_EMPEROR:[ + ExitData(RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM, one_way=True), + ExitData(RegionNames.IMPERIAL_PALACE, one_way=True,has_events=["Imperial Palace - Defeat Blight"]) + ] +} +events = { + RegionNames.IMPERIAL_PALACE_SMALL_ENTRANCE: { + "Imperial Palace - Mandatory Thunder Doom Mirror Encounter": EventData( + mandatory_enemies=[OkamiEnemies.THUNDER_DOOM_MIRROR]), + "Imperial Palace - Open west side lockjaw": EventData( + required_items_events=["Imperial Palace - Grab lockjaw key"]) + }, + RegionNames.IMPERIAL_PALACE_FEET_HELL: { + "Imperial Palace - Blow up alcove walls in feet hell": EventData(cherry_bomb_level=1), + "Imperial Palace - Grab lockjaw key": EventData(), + "Imperial Palace - Outspeed the Brooms": EventData(required_brush_techniques=[BrushTechniques.VEIL_OF_MIST]), + }, + RegionNames.IMPERIAL_PALACE_WEST_CAVE: { + "Imperial Palace - Blow up west cave floor": EventData(cherry_bomb_level=1) + }, + RegionNames.IMPERIAL_PALACE_SPIDER_CAVE: { + "Imperial Palace - Blow up wall to mist flask room": EventData(cherry_bomb_level=1) + }, + RegionNames.IMPERIAL_PALACE_FLASK_ROOM: { + "Imperial Palace - Outspeed the spider": EventData(required_brush_techniques=[BrushTechniques.VEIL_OF_MIST]), + # Not really in that room, but triggers when exiting it: + "Imperial Palace - Mandatory Wind Doom Mirror": EventData(mandatory_enemies=[OkamiEnemies.WIND_DOOM_MIRROR]) + }, + RegionNames.IMPERIAL_PALACE_POISON_SOZU: { + "Imperial Palace - Cross the Sozu": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT]) + }, + RegionNames.IMPERIAL_PALACE_INSIDE_EMPEROR: { + "Imperial Palace - Defeat Blight":EventData(mandatory_enemies=[OkamiEnemies.BLIGHT]) + } + +} +locations = { + RegionNames.IMPERIAL_PALACE_SMALL_ENTRANCE: { + # Tutorial for "Launching" Issun + "Imperial Palace - Chest at entrance": LocData(container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 0), + type=LocationType.LOCKED_CHEST), + "Imperial Palace - Locked Chest in poison puddle": LocData(container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 14), + type=LocationType.LOCKED_CHEST), + "Imperial Palace - Freestanding Chest on poison puddle rocks": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 10)) + }, + RegionNames.IMPERIAL_PALACE_FEET_HELL: { + "Imperial Palace - Chest in feet hell northern alcove": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 1), + required_items_events=["Imperial Palace - Blow up alcove walls in feet hell"]), + "Imperial Palace - Chest in feet hell southern alcove": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 8), + required_items_events=["Imperial Palace - Blow up alcove walls in feet hell"]), + + }, + RegionNames.IMPERIAL_PALACE_SPIDER_CAVE_TOP: { + "Imperial Palace - Locked Chest in spider cave webs": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 9), type=LocationType.LOCKED_CHEST + ) + }, + RegionNames.IMPERIAL_PALACE_FLASK_ROOM: { + "Imperial Palace - Kasugami": LocData(brush_check_id(16), type=LocationType.CONSTELLATION, + required_brush_techniques=[BrushTechniques.GALESTORM], + power_slash_level=1) + }, + RegionNames.IMPERIAL_PALACE_POISON_SOZU: { + "Imperial Palace - Locked chest near poison Sozu": LocData(container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 15), + type=LocationType.LOCKED_CHEST) + }, + RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM: { + "Imperial Palace - Northwest locked chest in webs above the emperor's bedroom": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 6), type=LocationType.LOCKED_CHEST), + "Imperial Palace - North central chest above the emperor's bedroom": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 5)), + "Imperial Palace - Southwest locked chest in webs above the emperor's bedroom": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 7), type=LocationType.LOCKED_CHEST, + required_brush_techniques=[BrushTechniques.VEIL_OF_MIST]) + }, + RegionNames.IMPERIAL_PALACE_WEST_BEAM:{ + "Imperial Palace - Southmost chest on west beam above the emperor's bedroom": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 12)), + "Imperial Palace - Soutwest chest on west beam above the emperor's bedroom": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 11)), + "Imperial Palace - center chest on west beam above the emperor's bedroom": LocData( + container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 13)) + }, + RegionNames.IMPERIAL_PALACE_INSIDE_EMPEROR:{ + "Imperial Palace - Defeat Blight Reward":LocData(999,required_items_events=["Imperial Palace - Defeat Blight"]) + } + +} diff --git a/worlds/okamihd/__init__.py b/worlds/okamihd/__init__.py index 539a0d55bcd3..fc41340272b1 100644 --- a/worlds/okamihd/__init__.py +++ b/worlds/okamihd/__init__.py @@ -49,7 +49,7 @@ def create_regions(self): create_regions(self) # DEBUG - # visualize_regions(self.multiworld.get_region("Menu", self.player),"G:\projets\OkamiAP\worlds\okamihd\docs\OkamiHD.puml") + #visualize_regions(self.multiworld.get_region("Menu", self.player),"G:\projets\OkamiAP\worlds\okamihd\docs\OkamiHD.puml") def create_items(self): self.multiworld.itempool += self.create_itempool() From f16f4a96674ee9764bdcf40bbf8a13636a4d4ba1 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 22:17:41 +0200 Subject: [PATCH 19/30] Update handling of elemental rules --- worlds/okamihd/Enums/LocationType.py | 6 +++++- worlds/okamihd/RegionsData/r110.py | 24 ++++++++++-------------- worlds/okamihd/Rules.py | 22 +++++++++++++++++----- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/worlds/okamihd/Enums/LocationType.py b/worlds/okamihd/Enums/LocationType.py index c7555b7ddaef..aba984cf7604 100644 --- a/worlds/okamihd/Enums/LocationType.py +++ b/worlds/okamihd/Enums/LocationType.py @@ -29,5 +29,9 @@ class LocationType(Enum): # Shop item slot SHOP = 16, FISHING_MINIGAME = 17 - #Chest that can only be opened by Issun in Tiny size + # Chest that can only be opened by Issun in Tiny size LOCKED_CHEST = 18 + THUNDER_CHEST = 19 + # 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 diff --git a/worlds/okamihd/RegionsData/r110.py b/worlds/okamihd/RegionsData/r110.py index ec502d6c96bc..a3afa1bffec1 100644 --- a/worlds/okamihd/RegionsData/r110.py +++ b/worlds/okamihd/RegionsData/r110.py @@ -215,14 +215,12 @@ required_items_events=['Moon Cave - 4F Fire the canon!']), }, RegionNames.MOON_CAVE_4F_CANON: { - "Moon Cave - 4F Fire the canon!": EventData(required_brush_techniques=[BrushTechniques.INFERNO], - special_rule=moon_cave_fire_rule), + "Moon Cave - 4F Fire the canon!": EventData(special_rule=moon_cave_fire_rule), }, RegionNames.MOON_CAVE_4F_AFTER_CANON: { "Moon Cave - 4F Move Fireball": EventData(required_brush_techniques=[BrushTechniques.GALESTORM]), - "Moon Cave - 4F Melt Ice Blocks": EventData(required_brush_techniques=[BrushTechniques.INFERNO], - special_rule=moon_cave_4f_fire_rule), + "Moon Cave - 4F Melt Ice Blocks": EventData(special_rule=moon_cave_4f_fire_rule), "Moon Cave - 4F Black Demon Horn Torii": EventData(mandatory_enemies=[OkamiEnemies.BLACK_IMP,OkamiEnemies.RED_IMP], required_items_events=["Moon Cave - 4F Melt Ice Blocks"]), "Moon Cave - 4F Get Black Demon Horn": EventData( @@ -241,16 +239,14 @@ required_items_events=[ "Moon Cave - 1F Free Ajimi from soup"]), "Moon Cave - 1F Frozen Chest after Black Demon Horn": LocData(container_check_id(MapIds.MOON_CAVE, 7), - type=LocationType.FROZEN_CHEST, special_rule=moon_cave_fire_rule,required_items_events=["Black Demon Horn"]), + type=LocationType.FROZEN_CHEST_SPECIAL_SOURCE, special_rule=moon_cave_fire_rule,required_items_events=["Black Demon Horn"]), "Moon Cave - 1F Chest after fire eye": LocData(container_check_id(MapIds.MOON_CAVE, 8), required_items_events=["Fire Eye"]), }, RegionNames.MOON_CAVE_B1F_LAKE: { "Moon Cave - B1F Chest on other side of Lake": LocData(container_check_id(MapIds.MOON_CAVE, 13), needs_long_swim=True), - "Moon Cave - B1F Chest behind ice": LocData(container_check_id(MapIds.MOON_CAVE, 14), - required_items_events=[BrushTechniques.INFERNO], - needs_long_swim=True, special_rule=moon_cave_fire_rule) + "Moon Cave - B1F Chest behind ice": LocData(container_check_id(MapIds.MOON_CAVE, 14),needs_long_swim=True, special_rule=moon_cave_fire_rule) }, RegionNames.MOON_CAVE_1F_LOCKED_CAVE: { "Moon Cave - 1F locked cave Treasure bud behind bombable wall": LocData( @@ -276,27 +272,27 @@ }, RegionNames.MOON_CAVE_3F_RAFTERS_AFTER_SAND: { "Moon Cave - 3F Frozen Chest near merchant": LocData(container_check_id(MapIds.MOON_CAVE, 12), - type=LocationType.FROZEN_CHEST, + type=LocationType.FROZEN_CHEST_SPECIAL_SOURCE, special_rule=moon_cave_fire_rule), }, RegionNames.MOON_CAVE_3F_FIRE_EYE: { "Moon Cave - 3F Left Frozen Chest after Fire eye room": LocData(container_check_id(MapIds.MOON_CAVE, 19), - type=LocationType.FROZEN_CHEST, + type=LocationType.FROZEN_CHEST_SPECIAL_SOURCE, special_rule=moon_cave_fire_rule), "Moon Cave - 3F Middle Frozen Chest after Fire eye room": LocData(container_check_id(MapIds.MOON_CAVE, 17), - type=LocationType.FROZEN_CHEST, + type=LocationType.FROZEN_CHEST_SPECIAL_SOURCE, special_rule=moon_cave_fire_rule), "Moon Cave - 3F Right Frozen Chest after Fire eye room": LocData(container_check_id(MapIds.MOON_CAVE, 18), - type=LocationType.FROZEN_CHEST, + type=LocationType.FROZEN_CHEST_SPECIAL_SOURCE, special_rule=moon_cave_fire_rule), }, RegionNames.MOON_CAVE_4F_AFTER_CANON: { "Moon Cave - 4F Lower ledge Frozen Chest": LocData(container_check_id(MapIds.MOON_CAVE, 20), - type=LocationType.FROZEN_CHEST, + type=LocationType.FROZEN_CHEST_SPECIAL_SOURCE, special_rule=moon_cave_4f_fire_rule), "Moon Cave - 4F Upper ledge Frozen Chest": LocData(container_check_id(MapIds.MOON_CAVE, 21), - type=LocationType.FROZEN_CHEST, + type=LocationType.FROZEN_CHEST_SPECIAL_SOURCE, special_rule=moon_cave_4f_fire_rule) } } diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index 7635da50108e..94e3ae0dc879 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -12,11 +12,17 @@ if TYPE_CHECKING: from . import OkamiWorld -has_portable_fire_source: Rule = Has(DivineInstruments.SOLAR_FLARE.value.item_name) +has_portable_fire_source: Rule = Or(And(Or(Has(DivineInstruments.SOLAR_FLARE.value.item_name), + Has("Progressive Mirror", 4)), Has(BrushTechniques.INFERNO)), + Has(BrushTechniques.FIREBURST)) -has_portable_thunder_source: Rule = Has(DivineInstruments.THUNDER_EDGE.value.item_name) +has_portable_thunder_source: Rule = Or(And(Or(Has(DivineInstruments.THUNDER_EDGE.value.item_name), + Has("Progressive Sword", 5)), Has(BrushTechniques.THUNDERSTORM)), + Has(BrushTechniques.THUNDERBOLT)) -has_portable_ice_source: Rule = Has(DivineInstruments.TUNDRA_BEADS.value.item_name) +has_portable_ice_source: Rule = Or(And(Or(Has(DivineInstruments.TUNDRA_BEADS.value.item_name), + Has("Progressive Rosary", 5)), Has(BrushTechniques.BLIZZARD)), + Has(BrushTechniques.ICESTORM)) gale_shrine_access: Rule = HasGroup("canine_warriors", count=FromOption(RequiredDoggorbs)) @@ -31,9 +37,13 @@ def has_soup_ingerdients(state: CollectionState, world: "OkamiWorld", amount: in night_time_check_rule: Rule = Has(BrushTechniques.CRESCENT, options=[ OptionFilter(NightTimeChecksRequireCrescent, NightTimeChecksRequireCrescent.option_true)], filtered_resolution=True) -moon_cave_fire_rule: Rule = Or(has_portable_fire_source, Has("Moon Cave - 3F Push the ball")) +moon_cave_fire_rule: Rule = Or(has_portable_fire_source, + HasAll("Moon Cave - 3F Push the ball", BrushTechniques.INFERNO)) -moon_cave_4f_fire_rule: Rule = Or(has_portable_fire_source, Has("Moon Cave - 4F Move Fireball")) +moon_cave_4f_fire_rule: Rule = Or(has_portable_fire_source, + HasAll("Moon Cave - 4F Move Fireball", BrushTechniques.INFERNO)) +# FIXME Once we've figured out which story trigger can spawn the thunder source here +gen_thunder_chest_rule:Rule = has_portable_thunder_source def has_divine_instrument_tier(tier: int) -> Rule: @@ -136,6 +146,8 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even required_techinques += [BrushTechniques.INFERNO] case LocationType.FISHING_MINIGAME: required_power_slash_level = max(required_power_slash_level, 1) + case LocationType.THUNDER_CHEST: + required_techinques += [BrushTechniques.THUNDERBOLT] case _: required_techinques += [] From 71710ec87b26ef7c81d54d841e5d5b7fd52a7b05 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 22:18:02 +0200 Subject: [PATCH 20/30] Finish Sei-an City Logic --- worlds/okamihd/Enums/RegionNames.py | 13 +++-- worlds/okamihd/RegionsData/__init__.py | 7 ++- worlds/okamihd/RegionsData/r200.py | 67 +++++++++++++++++++++----- worlds/okamihd/RegionsData/r201.py | 62 +++++++++++++----------- worlds/okamihd/RegionsData/r202.py | 33 +++++++++++++ 5 files changed, 138 insertions(+), 44 deletions(-) create mode 100644 worlds/okamihd/RegionsData/r202.py diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index d9c15fbf7272..cd83a5dab470 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -152,6 +152,7 @@ class RegionNames(StrEnum): SEIAN_CITY_TAO = "Sei-an City (Tao Troopers Headquarters)" SEIAN_CITY_TOOL_SHOP = "Sei-an City (Tool Shop)" SEIAN_CITY_WEAPON_SHOP = "Sei-an City (Weapon Shop)" + SEIAN_CITY_BLOSSOM = "Sei-an City (Blossom's house)" ### ARISTOCRATIC QUARTERS SEIAN_CITY_BRIDGE_COMMONERS = "Sei-an City Lake Beewa Bridge (Commoner's Side)" @@ -166,6 +167,12 @@ class RegionNames(StrEnum): SEIAN_CITY_HIMIKO = "Sei-an City (Himiko's palace entrance)" SEIAN_CITY_TREASURE_WEST = "Sei-an City (Himiko's palace West Treasure Room)" SEIAN_CITY_TREASURE_EAST = "Sei-an City (Himiko's palace East Treasure Room)" + SEIAN_CITY_GUARDS = "Sei-an City (Guards house)" + SEIAN_CITY_LAKE = "Sei-an City (Lake Beewa)" + + ## HIMIKO'S PALACE + HIMIKO_PALACE = "Himiko's Palace" + HIMIKO_CHAMBERS = "Himiko's Palace (Himiko's Chambers)" ## SUNKEN SHIP SUNKEN_SHIP_ENTRANCE = "Sunken Ship (Entrance)" @@ -188,7 +195,7 @@ class RegionNames(StrEnum): ## IMPERIAL PALACE ### Regular Size IMPERIAL_PALACE_ENTRANCE = "Imperial Palace (Entrance)" - IMPERIAL_PALACE="Imperial Palace" + IMPERIAL_PALACE = "Imperial Palace" ### Small Size IMPERIAL_PALACE_SMALL_ENTRANCE = "Imperial Palace (Small Size - Entrance)" @@ -200,8 +207,7 @@ class RegionNames(StrEnum): IMPERIAL_PALACE_POISON_SOZU = "Imperial Palace (Small Size - Poison Sōzu Room)" IMPERIAL_PALACE_EMPERORS_ROOM = "Imperial Palace (Small Size - Emperor's Bedroom)" IMPERIAL_PALACE_WEST_BEAM = "Imperial Palace (Small Size - West Beam)" - IMPERIAL_PALACE_INSIDE_EMPEROR="Imperial Palace (Small Size - Inside the Emperor's Body)" - + IMPERIAL_PALACE_INSIDE_EMPEROR = "Imperial Palace (Small Size - Inside the Emperor's Body)" # SPECIAL REGIONS # Special Hub regions to handle warps @@ -226,6 +232,7 @@ class MapIds(Enum): RIVER_OF_THE_HEAVENS = 0x122 SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 + HIMIKO_PALACE = 0x202 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 5726cd3c5861..1464edad8fef 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 + r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202 if TYPE_CHECKING: from .. import OkamiWorld @@ -22,6 +22,7 @@ **r122.exits, **r200.exits, **r201.exits, + **r202.exits, **r205.exits, **r206.exits, **r207.exits, @@ -51,6 +52,7 @@ **r122.locations, **r200.locations, **r201.locations, + **r202.locations, **r205.locations, **r206.locations, **r207.locations, @@ -80,6 +82,7 @@ **r122.events, **r200.events, **r201.events, + **r202.events, **r205.events, **r206.events, **r207.events, @@ -113,8 +116,10 @@ **r105.warps, **r108.warps, **r109.warps, + **r200.warps, **rf02.warps, **rf04.warps, **rf08.warps, **rf0a.warps, + } diff --git a/worlds/okamihd/RegionsData/r200.py b/worlds/okamihd/RegionsData/r200.py index d6bff9aefb5d..467fb7e6abe4 100644 --- a/worlds/okamihd/RegionsData/r200.py +++ b/worlds/okamihd/RegionsData/r200.py @@ -1,10 +1,13 @@ from typing import TYPE_CHECKING +from rule_builder.rules import True_ from ..CheckIds import container_check_id, brush_check_id, shop_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType from ..Enums.RegionNames import RegionNames, MapIds -from ..Types import ExitData, LocData, EventData +from ..Enums.WarpType import WarpType +from ..Rules import gen_thunder_chest_rule +from ..Types import ExitData, LocData, EventData, WarpData if TYPE_CHECKING: from .. import OkamiWorld @@ -34,13 +37,16 @@ ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC_SICK, one_way=True) ], RegionNames.SEIAN_CITY_ARISTOCRATIC: [ - ExitData(RegionNames.SEIAN_CITY_HIMIKO, one_way=True, loading_screen=False) + ExitData(RegionNames.SEIAN_CITY_HIMIKO, one_way=True, loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_GUARDS), + ExitData(RegionNames.SEIAN_CITY_LAKE,needs_long_swim=True,loading_screen=False) ], RegionNames.SEIAN_CITY_HIMIKO: [ ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC, one_way=True, loading_screen=False), ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC_SICK, one_way=True, loading_screen=False), ExitData(RegionNames.SEIAN_CITY_TREASURE_WEST), - ExitData(RegionNames.SEIAN_CITY_TREASURE_EAST) + ExitData(RegionNames.SEIAN_CITY_TREASURE_EAST), + ExitData(RegionNames.HIMIKO_PALACE) ] } events = { @@ -54,11 +60,13 @@ required_brush_techniques=[BrushTechniques.CATWALK]) }, RegionNames.SEIAN_CITY_ARISTOCRATIC: { - "Sei-an City (Aristocratic Quarter) - Fool Himiko's Guards": EventData(required_brush_techniques=[BrushTechniques.VEIL_OF_MIST]) + "Sei-an City (Aristocratic Quarter) - Fool Himiko's Guards": EventData( + required_brush_techniques=[BrushTechniques.VEIL_OF_MIST]) }, - RegionNames.SEIAN_CITY_LECTURE_HALL:{ - #biteable check #2, do we have access to Rao to give her the item ? - "Sei-an City (Aristocratic Quarter) - Give Prayer Slips to Rao": EventData(required_items_events=["Imperial Palace - Grab Prayer Slips"]) + RegionNames.SEIAN_CITY_LECTURE_HALL: { + # biteable check #2, do we have access to Rao to give her the item ? + "Sei-an City (Aristocratic Quarter) - Give Prayer Slips to Rao": EventData( + required_items_events=["Imperial Palace - Grab Prayer Slips"]) } } locations = { @@ -78,7 +86,7 @@ "Sei-an City (Aristocratic Quarter) - Buried chest outside Okuni's house": LocData( container_check_id(MapIds.SEIAN_ARISTORATIC, 20), type=LocationType.BURIED_CHEST), "Sei-an City (Aristocratic Quarter) - Underwater chest east of central bridge": LocData( - container_check_id(MapIds.SEIAN_ARISTORATIC, 41), type=LocationType.UNDERWATER_CHEST), + container_check_id(MapIds.SEIAN_ARISTORATIC, 41), type=LocationType.UNDERWATER_CHEST_SHALLOW), "Sei-an City (Aristocratic Quarter) - Freestanding Chest outside northeast house": LocData( container_check_id(MapIds.SEIAN_ARISTORATIC, 4)), "Sei-an City (Aristocratic Quarter) - Buried chest outside northeast house": LocData( @@ -92,9 +100,13 @@ "Sei-an City (Aristocratic Quarter) - Chest in northeast house": LocData( container_check_id(MapIds.SEIAN_ARISTORATIC, 40)), }, - # In Vanilla ,clock tower checks require story progression + # FIXME: Add chest after thunderbolt RegionNames.SEIAN_CITY_CLOCK_TOWER: { - + "Sei-an City (Aristocratic Quarter) - Thunder Chest in Clock Tower": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 10), type=LocationType.THUNDER_CHEST_SPECIAL_SOURCE, + special_rule=gen_thunder_chest_rule), + #"Sei-an City (Aristocratic Quarter) - Chest after thunderbolt": LocData( + # container_check_id(MapIds.SEIAN_ARISTORATIC, 0)) }, RegionNames.SEIAN_CITY_HIMIKO: { "Sei-an City (Aristocratic Quarter) - East buried chest behind Himiko's guards": LocData( @@ -103,6 +115,8 @@ container_check_id(MapIds.SEIAN_ARISTORATIC, 6)), "Sei-an City (Aristocratic Quarter) - Freestanding chest behind Himiko's palace": LocData( container_check_id(MapIds.SEIAN_ARISTORATIC, 47)), + #"Sei-an City (Aristocratic Quarter) - Chest after deluge": LocData( + # container_check_id(MapIds.SEIAN_ARISTORATIC, 1)) }, RegionNames.SEIAN_CITY_TREASURE_WEST: { "Sei-an City (Aristocratic Quarter) - Daruma doll inside Himiko's west treasure room": LocData( @@ -115,8 +129,37 @@ container_check_id(MapIds.SEIAN_ARISTORATIC, 11)), "Sei-an City (Aristocratic Quarter) - West freestanding chest inside Himiko's east treasure room 2": LocData( container_check_id(MapIds.SEIAN_ARISTORATIC, 8)), - "Sei-an City (Aristocratic Quarter) - East freestanding chest inside Himiko's east treasure room 2": LocData( + "Sei-an City (Aristocratic Quarter) - East freestanding chest inside Himiko's east treasure room": LocData( container_check_id(MapIds.SEIAN_ARISTORATIC, 12)), - + }, + RegionNames.SEIAN_CITY_ARISTOCRATIC: { + "Sei-an City (Aristocratic Quarter) - Chest in Canal near easter water wheel": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 42), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Sei-an City (Aristocratic Quarter) - Chest in Canal near western water wheel": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 30), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Sei-an City (Aristocratic Quarter) - Freestanding chest west of bridge gate": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 28)), + "Sei-an City (Aristocratic Quarter) - Buried chest west of bridge gate": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 29), type=LocationType.BURIED_CHEST), + "Sei-an City (Aristocratic Quarter) - Buried chest east of bridge gate": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 15), type=LocationType.BURIED_CHEST), + "Sei-an City (Aristocratic Quarter) - Freestanding chest near guard house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 23)), + "Sei-an City (Aristocratic Quarter) - Buried chest near guard house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 24), type=LocationType.BURIED_CHEST) + }, + RegionNames.SEIAN_CITY_GUARDS: { + "Sei-an City (Aristocratic Quarter) - Chest inside guard house": LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC, 45)) + }, + RegionNames.SEIAN_CITY_LAKE:{ + "Sei-an City (Aristocratic Quarter) - Underwater chest in Lake Beewa":LocData( + container_check_id(MapIds.SEIAN_ARISTORATIC,43) + ) } } +warps = { + RegionNames.SEIAN_CITY_ARISTOCRATIC: [ + WarpData(WarpType.MERMAID_SPRING, True_, True_) + ] +} diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index fe531bbb550b..e850043fd5cc 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -13,30 +13,33 @@ RegionNames.SEIAN_CITY_COMMONERS_DRY: [ ExitData(RegionNames.SEIAN_CITY_COMMONERS, has_events=["Imperial Palace - Defeat Blight"], loading_screen=False), - ExitData(RegionNames.SEIAN_CITY_WEAPON_SHOP,loading_screen=False), - ExitData(RegionNames.SEIAN_CITY_TOOL_SHOP,loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_WEAPON_SHOP, loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_TOOL_SHOP, loading_screen=False), ExitData(RegionNames.SEIAN_CITY_FLOWERS), ExitData(RegionNames.SEIAN_CITY_BRIDGE_COMMONERS) ], RegionNames.SEIAN_CITY_COMMONERS: [ ExitData(RegionNames.SEIAN_CITY_YAMA), - ExitData(RegionNames.SEIAN_CITY_SOUTHWEST, has_events=["Sei-an City (Commoner's Quarter) - Blow up wall to southwest building"]), - ExitData(RegionNames.SEIAN_CITY_TAO, has_events=["Sei-an City (Commoner's Quarter) - Climb to Tao Troopers Headquarters"], - one_way=True, loading_screen=False) + ExitData(RegionNames.SEIAN_CITY_SOUTHWEST, + has_events=["Sei-an City (Commoner's Quarter) - Blow up wall to southwest building"]), + ExitData(RegionNames.SEIAN_CITY_TAO, + has_events=["Sei-an City (Commoner's Quarter) - Climb to Tao Troopers Headquarters"], + one_way=True, loading_screen=False), + ExitData(RegionNames.SEIAN_CITY_BLOSSOM) ], RegionNames.SEIAN_CITY_TAO: [ ExitData(RegionNames.SEIAN_CITY_COMMONERS, one_way=True) ] } events = { - + RegionNames.SEIAN_CITY_COMMONERS_DRY: { - "Sei-an City (Commoner's Quarter) - Dig water source" :EventData(type=LocationType.DIGGING_MINIGAME_LATER), + "Sei-an City (Commoner's Quarter) - Dig water source": EventData(type=LocationType.DIGGING_MINIGAME_LATER), }, RegionNames.SEIAN_CITY_COMMONERS: { "Sei-an City (Commoner's Quarter) - Blow up wall to southwest building": EventData(cherry_bomb_level=1), "Sei-an City (Commoner's Quarter) - Climb to Tao Troopers Headquarters": EventData( - required_brush_techniques=[BrushTechniques.WATERSPOUT]) + required_brush_techniques=[BrushTechniques.WATERSPOUT],required_items_events=["Sei-an City (Commoner's Quarter) - Dig water source"]) }, RegionNames.SEIAN_CITY_YAMA: { "Sei-an City (Commoner's Quarter) - Give golden mushroom to Yama": EventData( @@ -71,16 +74,11 @@ "Sei-an City (Commoner's quarter) - Freestanding chest west of Ryoshima entrance": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 13)), "Sei-an City (Commoner's quarter) - Buried Chest behind Mr. Flower's house": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 14), type=LocationType.BURIED_CHEST), - #FIXME - "Sei-an City (Commoner's quarter) - NOT Chest in Canal near Mr. Flower's house": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 15), type=LocationType.BURIED_CHEST), - "Sei-an City (Commoner's quarter) - Freestanding Chest behind building": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 16)), - "Sei-an City (Commoner's quarter) - Chest in Canal near Mr. Flower's house": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 17)), "Sei-an City (Commoner's quarter) - Chest in canal northeast corner": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 21)), + "Sei-an City (Commoner's quarter) - Freestanding chest behind Aspiring Carpenter's house": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 22)), "Sei-an City (Commoner's quarter) - Chest east of Aristocratic quarters entrance": LocData( container_check_id(MapIds.SEIAN_COMMONERS, 23)), }, @@ -98,30 +96,38 @@ }, RegionNames.SEIAN_CITY_SOUTHWEST: { "Sei-an City (Commoner's quarter) - Chest in southwest building, 1F southwest Rafters": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 18)), + container_check_id(MapIds.SEIAN_COMMONERS, 24)), "Sei-an City (Commoner's quarter) - Chest in southwest building, GF Freestanding Left": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 19)), + container_check_id(MapIds.SEIAN_COMMONERS, 25)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, GF Freestanding Right": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 29)), "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F northwest Rafters Left": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 20)), - - "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F north central Rafters": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 22)), + container_check_id(MapIds.SEIAN_COMMONERS, 26)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F northwest Rafters Right": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 27)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, 2F north Rafters": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 28)), "Sei-an City (Commoner's quarter) - Chest in southwest building, GF in Cage": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 24)), + container_check_id(MapIds.SEIAN_COMMONERS, 30)), "Sei-an City (Commoner's quarter) - Chest in southwest building, GF near Cage": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 25)), + container_check_id(MapIds.SEIAN_COMMONERS, 31)), }, RegionNames.SEIAN_CITY_COMMONERS: { "Sei-an City (Commoner's quarter) - Freestanding Chest behind west buildings": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 26), type=LocationType.BURIED_CHEST), + container_check_id(MapIds.SEIAN_COMMONERS, 32)), "Sei-an City (Commoner's quarter) - Buried Chest near west buildings": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 27), type=LocationType.BURIED_CHEST), + container_check_id(MapIds.SEIAN_COMMONERS, 33), type=LocationType.BURIED_CHEST), "Sei-an City (Commoner's quarter) - Buried Chest near Yama's restaurant": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 28), type=LocationType.BURIED_CHEST), + container_check_id(MapIds.SEIAN_COMMONERS, 34), type=LocationType.BURIED_CHEST), + }, RegionNames.SEIAN_CITY_TAO: { "Sei-an City (Commoner's quarter) - Freestanding chest behind Tao Troopers headquarters": LocData( - container_check_id(MapIds.SEIAN_COMMONERS, 29), type=LocationType.BURIED_CHEST), + container_check_id(MapIds.SEIAN_COMMONERS, 44)), + }, + RegionNames.SEIAN_CITY_BLOSSOM: { + "Sei-an City (Commoner's quarter) - Chest in Blossom's house": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 45), cherry_bomb_level=1) } } shop_locations = { @@ -139,7 +145,7 @@ "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:{ + 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), diff --git a/worlds/okamihd/RegionsData/r202.py b/worlds/okamihd/RegionsData/r202.py new file mode 100644 index 000000000000..6430ab247db1 --- /dev/null +++ b/worlds/okamihd/RegionsData/r202.py @@ -0,0 +1,33 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id, shop_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.RegionNames import RegionNames, MapIds +from ..Types import ExitData, LocData, EventData + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.HIMIKO_PALACE:[ + ExitData(RegionNames.HIMIKO_CHAMBERS,has_events=["Himiko's Palace - Cross sea of fire"],loading_screen=False) + ] +} +events = { + RegionNames.HIMIKO_PALACE:{ + "Himiko's Palace - Cross sea of fire": EventData(required_items_events=["Fire Tablet"]) + } +} +locations = { + RegionNames.HIMIKO_PALACE: { + "Himiko's Palace - Chest behind elevator": LocData(container_check_id(MapIds.HIMIKO_PALACE, 0)), + # Only spawns if you have Fire tablet + "Himiko's Palace - Freestanding item before sea of Fire": LocData(container_check_id(MapIds.HIMIKO_PALACE, 1), + required_items_events=["Fire Tablet"]) + }, + # Special check + RegionNames.HIMIKO_CHAMBERS:{ + "Himiko's Palace - Get Border Key from Queen Himiko":LocData(1000) + } +} From b63932caf071611208dda8e46f719d99bb9b347a Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Sun, 24 May 2026 22:32:40 +0200 Subject: [PATCH 21/30] Add some logic to city checkpoint bridge --- worlds/okamihd/RegionsData/r105.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index 020e2b9bed5a..a6c3a73924f7 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -29,8 +29,9 @@ } events = { RegionNames.CITY_CHECKPOINT_TAKA: { - # Not setting any logic for this event yet, as we'll probably handle it in a specific way. - "City Checkpoint - Activate the Drawbridge": EventData() + # Not setting any more logic for this event yet, as we'll probably handle it in a specific way. + "City Checkpoint - Activate the Drawbridge": EventData(required_items_events=["Moon Cave - Defeat Orochi"], + required_brush_techniques=[BrushTechniques.INFERNO]) }, RegionNames.CITY_CHECKPOINT_RYOSHIMA: { "City Checkpoint - Restore Cursed Patches on Ryoshima side": EventData( From 65ad864e14123fc04ae3eef2d9d7a344a583089f Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 25 May 2026 01:17:53 +0200 Subject: [PATCH 22/30] Fix buried chests in city checkpoint not considered buried --- worlds/okamihd/RegionsData/r105.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index a6c3a73924f7..a248df101e0b 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -62,9 +62,9 @@ }, RegionNames.CITY_CHECKPOINT_RIVER: { "City Checkpoint - Southernmost buried chest on river's edge ": LocData( - container_check_id(MapIds.CITY_CHECKPOINT, 8)), + container_check_id(MapIds.CITY_CHECKPOINT, 8),type=LocationType.BURIED_CHEST), "City Checkpoint - Buried chest on river's edge South near waterfall ": LocData( - container_check_id(MapIds.CITY_CHECKPOINT, 9)), + container_check_id(MapIds.CITY_CHECKPOINT, 9),type=LocationType.BURIED_CHEST), "City Checkpoint - Burning chest on river's edge South near waterfall ": LocData( container_check_id(MapIds.CITY_CHECKPOINT, 12), type=LocationType.BURNING_CHEST), # Special Rule for the river access - You need either Water Tablet or (Waterlily and Gaelstrom) From 88ddc0d1b22ac3e795dd66e61ae7e45f4aaa40a6 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 25 May 2026 01:48:55 +0200 Subject: [PATCH 23/30] Update goal to include Himiko andn Blight, city Checkpoint now can be done with a portable fire source or Orochi --- worlds/okamihd/RegionsData/r105.py | 12 +++++++----- worlds/okamihd/Rules.py | 18 +++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index a248df101e0b..361d61794a5b 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -5,6 +5,7 @@ from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType from ..Enums.WarpType import WarpType +from ..Rules import has_portable_fire_source_strict from ..Types import LocData, EventData, ExitData, WarpData from ..Enums.RegionNames import RegionNames, MapIds @@ -29,9 +30,10 @@ } events = { RegionNames.CITY_CHECKPOINT_TAKA: { - # Not setting any more logic for this event yet, as we'll probably handle it in a specific way. - "City Checkpoint - Activate the Drawbridge": EventData(required_items_events=["Moon Cave - Defeat Orochi"], - required_brush_techniques=[BrushTechniques.INFERNO]) + # we'll probably handle it in a specific way. + "City Checkpoint - Activate the Drawbridge": EventData( + special_rule=Or(HasAll("Moon Cave - Defeat Orochi", BrushTechniques.INFERNO), + has_portable_fire_source_strict)) }, RegionNames.CITY_CHECKPOINT_RYOSHIMA: { "City Checkpoint - Restore Cursed Patches on Ryoshima side": EventData( @@ -62,9 +64,9 @@ }, RegionNames.CITY_CHECKPOINT_RIVER: { "City Checkpoint - Southernmost buried chest on river's edge ": LocData( - container_check_id(MapIds.CITY_CHECKPOINT, 8),type=LocationType.BURIED_CHEST), + container_check_id(MapIds.CITY_CHECKPOINT, 8), type=LocationType.BURIED_CHEST), "City Checkpoint - Buried chest on river's edge South near waterfall ": LocData( - container_check_id(MapIds.CITY_CHECKPOINT, 9),type=LocationType.BURIED_CHEST), + container_check_id(MapIds.CITY_CHECKPOINT, 9), type=LocationType.BURIED_CHEST), "City Checkpoint - Burning chest on river's edge South near waterfall ": LocData( container_check_id(MapIds.CITY_CHECKPOINT, 12), type=LocationType.BURNING_CHEST), # Special Rule for the river access - You need either Water Tablet or (Waterlily and Gaelstrom) diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index 41375e6bdaf0..64230b65ed92 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -12,9 +12,13 @@ if TYPE_CHECKING: from . import OkamiWorld -has_portable_fire_source: Rule = Or(And(Or(Has(DivineInstruments.SOLAR_FLARE.value.item_name), - Has("Progressive Mirror", 4)), Has(BrushTechniques.INFERNO)), - 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)), @@ -40,9 +44,7 @@ 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 = And( - Or(HasAny(DivineInstruments.SOLAR_FLARE.value.item_name, "Moon Cave - 3F Push the ball"), - Has("Progressive Mirror", 4)), Has(BrushTechniques.INFERNO)) +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)) @@ -200,7 +202,5 @@ 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")) - world.multiworld.completion_condition[world.player] = lambda state: state.has( - "Moon Cave - Defeat Orochi", world.player) + "Tsuta Ruins - Defeat the spider queen","Himiko's Palace - Cross sea of fire","Imperial Palace - Defeat Blight")) return From 4dbd2a469bb599d87640347f7425aa780c44d5fc Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 25 May 2026 02:26:53 +0200 Subject: [PATCH 24/30] Rebalance items fill for arc 2 current state --- worlds/okamihd/Items.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/okamihd/Items.py b/worlds/okamihd/Items.py index 39f3663dc3d3..56e11f440f3a 100644 --- a/worlds/okamihd/Items.py +++ b/worlds/okamihd/Items.py @@ -149,15 +149,15 @@ def create_static_precollected_item_list(world: "OkamiWorld") -> List[Item]: } useful_items = { # Useful items - Counts here are invalid, it's intended, to not fille the item pool with these - "Sun Fragment": ItemData(0x05, ItemClassification.useful,count_in_pool=4), # Should be 12 + "Sun Fragment": ItemData(0x05, ItemClassification.useful,count_in_pool=6), # Should be 12 "Astral Pouch": ItemData(0x06, ItemClassification.useful,count_in_pool=0),# Intended - "Stray Bead": ItemData(0xCC, ItemClassification.useful,count_in_pool=33),# Should be 99 + "Stray Bead": ItemData(0xCC, ItemClassification.useful,count_in_pool=50),# Should be 99 # probably will have to be changed to progession_skip balancing once DF shops get randomized "Demon Fang": ItemData(0x1F, ItemClassification.useful,count_in_pool=0),# to see when DF shops get randomized # Technically a filler item, but useful feels more appropriate. Warping with those without Fountain will probably be out of logic. "Mermaid Coin": ItemData(0x0e, ItemClassification.useful,count_in_pool=5),#Accurate count, kept it since it isn't too much - "Golden Peach": ItemData(0x0f, ItemClassification.useful,count_in_pool=5), # 14 in total... Probably not useful to have THAT many?, - "Gold Dust": ItemData(0x9e, ItemClassification.useful,count_in_pool=5) # 15 if we count the ones sold by merchants, which we may randomize, only 1 in a chest if we don't count those... + "Golden Peach": ItemData(0x0f, ItemClassification.useful,count_in_pool=7), # 14 in total... Probably not useful to have THAT many?, + "Gold Dust": ItemData(0x9e, ItemClassification.useful,count_in_pool=7) # 15 if we count the ones sold by merchants, which we may randomize, only 1 in a chest if we don't count those... } filler_items = { From eae12fd51fe850e16232961a4f456af7d236430b Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 25 May 2026 14:30:56 +0200 Subject: [PATCH 25/30] Fix Sei-an warp logic --- worlds/okamihd/RegionsData/r200.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/okamihd/RegionsData/r200.py b/worlds/okamihd/RegionsData/r200.py index 467fb7e6abe4..461cbf8bb487 100644 --- a/worlds/okamihd/RegionsData/r200.py +++ b/worlds/okamihd/RegionsData/r200.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING -from rule_builder.rules import True_ +from rule_builder.rules import True_, Has from ..CheckIds import container_check_id, brush_check_id, shop_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType @@ -160,6 +160,6 @@ } warps = { RegionNames.SEIAN_CITY_ARISTOCRATIC: [ - WarpData(WarpType.MERMAID_SPRING, True_, True_) + WarpData(WarpType.MERMAID_SPRING, Has("Imperial Palace - Defeat Blight"), Has("Imperial Palace - Defeat Blight")) ] } From 7e2854df472628d9caf4d06a1989ef92521c1d81 Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 25 May 2026 20:40:22 +0200 Subject: [PATCH 26/30] solve merge conflicts --- worlds/okamihd/RegionsData/rf04.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/okamihd/RegionsData/rf04.py b/worlds/okamihd/RegionsData/rf04.py index ea45d9517d7b..3d7e1d987660 100644 --- a/worlds/okamihd/RegionsData/rf04.py +++ b/worlds/okamihd/RegionsData/rf04.py @@ -118,7 +118,8 @@ "Agata Forest - Chest near Kiba": LocData(container_check_id(MapIds.HEALED_AGATA, 49)), "Agata Forest - Chest near Tusta ruins door": LocData(container_check_id(MapIds.HEALED_AGATA, 50)), ## Special check - gives Tsuta Ruins Key - "Agata Forest - Fish Giant Salmon with Kokari": LocData(77, power_slash_level=1,progress_type=LocationProgressType.EXCLUDED), + "Agata Forest - Fish Giant Salmon with Kokari": LocData(77, power_slash_level=1, + progress_type=LocationProgressType.EXCLUDED), "Agata Forest - Yumigami": LocData(brush_check_id(18), type=LocationType.CONSTELLATION, # bit 18 required_items_events=["Agata Forest - Fish Whopper with Kokari"],progress_type=LocationProgressType.EXCLUDED) } From 8c36150c9ea9f344a757a77d4f05785811981d0d Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 25 May 2026 20:42:19 +0200 Subject: [PATCH 27/30] exclude arc 2 location that won't work out of the box --- worlds/okamihd/RegionsData/r207.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/worlds/okamihd/RegionsData/r207.py b/worlds/okamihd/RegionsData/r207.py index 40344b0cbd51..d8ee7941d330 100644 --- a/worlds/okamihd/RegionsData/r207.py +++ b/worlds/okamihd/RegionsData/r207.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 @@ -110,7 +111,7 @@ RegionNames.IMPERIAL_PALACE_FLASK_ROOM: { "Imperial Palace - Kasugami": LocData(brush_check_id(16), type=LocationType.CONSTELLATION, required_brush_techniques=[BrushTechniques.GALESTORM], - power_slash_level=1) + power_slash_level=1,progress_type=LocationProgressType.EXCLUDED) }, RegionNames.IMPERIAL_PALACE_POISON_SOZU: { "Imperial Palace - Locked chest near poison Sozu": LocData(container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 15), @@ -134,7 +135,7 @@ container_check_id(MapIds.IMPERIAL_PALACE_SMALL, 13)) }, RegionNames.IMPERIAL_PALACE_INSIDE_EMPEROR:{ - "Imperial Palace - Defeat Blight Reward":LocData(999,required_items_events=["Imperial Palace - Defeat Blight"]) + "Imperial Palace - Blight Reward":LocData(999,required_items_events=["Imperial Palace - Defeat Blight"],progress_type=LocationProgressType.EXCLUDED) } } From d328bbe39d72069d93abf1dc397afbaaef16157c Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 25 May 2026 21:28:52 +0200 Subject: [PATCH 28/30] Update manifest --- worlds/okamihd/archipelago.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/okamihd/archipelago.json b/worlds/okamihd/archipelago.json index 1de9f2e97d15..50179630ce6e 100644 --- a/worlds/okamihd/archipelago.json +++ b/worlds/okamihd/archipelago.json @@ -2,5 +2,5 @@ "game": "Okami HD", "authors": ["Axertin", "Ragmoa"], "minimum_ap_version": "0.6.7", - "world_version": "0.4.5" + "world_version": "0.5.0" } From 6ec43b662d5f0b7c89bd253ff07e1f0fe39dcfea Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 8 Jun 2026 13:37:12 +0200 Subject: [PATCH 29/30] Update arc 2 with exit rule changes --- worlds/okamihd/RegionsData/r105.py | 4 ++-- worlds/okamihd/RegionsData/r200.py | 6 +++--- worlds/okamihd/RegionsData/r201.py | 6 +++--- worlds/okamihd/RegionsData/r202.py | 2 +- worlds/okamihd/RegionsData/r205.py | 20 ++++++++++---------- worlds/okamihd/RegionsData/r206.py | 4 ++-- worlds/okamihd/RegionsData/r207.py | 24 ++++++++++++------------ worlds/okamihd/RegionsData/rf09.py | 4 ++-- worlds/okamihd/RegionsData/rf0a.py | 12 ++++++------ 9 files changed, 41 insertions(+), 41 deletions(-) diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index 361d61794a5b..14e0a094b0bb 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -15,7 +15,7 @@ exits = { RegionNames.CITY_CHECKPOINT_TAKA: [ ExitData(RegionNames.CITY_CHECKPOINT_DRAWBRIDGE, - has_events=["City Checkpoint - Activate the Drawbridge"], loading_screen=False), + required_items_events=["City Checkpoint - Activate the Drawbridge"], loading_screen=False), ExitData(RegionNames.CITY_CHECKPOINT_RIVER, loading_screen=False) ], RegionNames.CITY_CHECKPOINT_DRAWBRIDGE: [ @@ -24,7 +24,7 @@ RegionNames.CITY_CHECKPOINT_RYOSHIMA: [ ExitData(RegionNames.CITY_CHECKPOINT_RIVER, loading_screen=False, one_way=True), ExitData(RegionNames.CURSED_RYOSHIMA_COAST), - ExitData(RegionNames.RYOSHIMA_COAST, has_events=["Ryoshima Coast - Bloom the Guardian Sapling"]) + ExitData(RegionNames.RYOSHIMA_COAST, required_items_events=["Ryoshima Coast - Bloom the Guardian Sapling"]) ], } diff --git a/worlds/okamihd/RegionsData/r200.py b/worlds/okamihd/RegionsData/r200.py index 461cbf8bb487..3953a37e4707 100644 --- a/worlds/okamihd/RegionsData/r200.py +++ b/worlds/okamihd/RegionsData/r200.py @@ -15,7 +15,7 @@ exits = { RegionNames.SEIAN_CITY_BRIDGE_COMMONERS: [ ExitData(RegionNames.SEIAN_CITY_BRIDGE_ARISTOCRATIC, - has_events=["Sei-an City (Aristocratic Quarter) - Fish The Living Sword with Benkei"], + required_items_events=["Sei-an City (Aristocratic Quarter) - Fish The Living Sword with Benkei"], loading_screen=False) ], RegionNames.SEIAN_CITY_BRIDGE_ARISTOCRATIC: [ @@ -28,9 +28,9 @@ ExitData(RegionNames.SEIAN_CITY_OKUNI), ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC_NORTH_EAST), ExitData(RegionNames.SEIAN_CITY_CLOCK_TOWER, one_way=True, - has_events=["Sei-an City (Aristocratic Quarter) - Climb clock tower"]), + required_items_events=["Sei-an City (Aristocratic Quarter) - Climb clock tower"]), ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC, loading_screen=False, - has_events=["Imperial Palace - Defeat Blight"]), + required_items_events=["Imperial Palace - Defeat Blight"]), ExitData(RegionNames.IMPERIAL_PALACE_ENTRANCE) ], RegionNames.SEIAN_CITY_CLOCK_TOWER: [ diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index e850043fd5cc..44bd0feb0530 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -11,7 +11,7 @@ exits = { RegionNames.SEIAN_CITY_COMMONERS_DRY: [ - ExitData(RegionNames.SEIAN_CITY_COMMONERS, has_events=["Imperial Palace - Defeat Blight"], + ExitData(RegionNames.SEIAN_CITY_COMMONERS, required_items_events=["Imperial Palace - Defeat Blight"], loading_screen=False), ExitData(RegionNames.SEIAN_CITY_WEAPON_SHOP, loading_screen=False), ExitData(RegionNames.SEIAN_CITY_TOOL_SHOP, loading_screen=False), @@ -21,9 +21,9 @@ RegionNames.SEIAN_CITY_COMMONERS: [ ExitData(RegionNames.SEIAN_CITY_YAMA), ExitData(RegionNames.SEIAN_CITY_SOUTHWEST, - has_events=["Sei-an City (Commoner's Quarter) - Blow up wall to southwest building"]), + required_items_events=["Sei-an City (Commoner's Quarter) - Blow up wall to southwest building"]), ExitData(RegionNames.SEIAN_CITY_TAO, - has_events=["Sei-an City (Commoner's Quarter) - Climb to Tao Troopers Headquarters"], + required_items_events=["Sei-an City (Commoner's Quarter) - Climb to Tao Troopers Headquarters"], one_way=True, loading_screen=False), ExitData(RegionNames.SEIAN_CITY_BLOSSOM) ], diff --git a/worlds/okamihd/RegionsData/r202.py b/worlds/okamihd/RegionsData/r202.py index 6430ab247db1..cc2505a1d2ad 100644 --- a/worlds/okamihd/RegionsData/r202.py +++ b/worlds/okamihd/RegionsData/r202.py @@ -11,7 +11,7 @@ exits = { RegionNames.HIMIKO_PALACE:[ - ExitData(RegionNames.HIMIKO_CHAMBERS,has_events=["Himiko's Palace - Cross sea of fire"],loading_screen=False) + ExitData(RegionNames.HIMIKO_CHAMBERS,required_items_events=["Himiko's Palace - Cross sea of fire"],loading_screen=False) ] } events = { diff --git a/worlds/okamihd/RegionsData/r205.py b/worlds/okamihd/RegionsData/r205.py index c97027f416c6..7be5a4220ab3 100644 --- a/worlds/okamihd/RegionsData/r205.py +++ b/worlds/okamihd/RegionsData/r205.py @@ -12,7 +12,7 @@ exits = { RegionNames.SUNKEN_SHIP_ENTRANCE: [ - ExitData(RegionNames.SUNKEN_SHIP_SW_LOW, has_events=["Sunken Ship - Open entrance Door"] + ExitData(RegionNames.SUNKEN_SHIP_SW_LOW, required_items_events=["Sunken Ship - Open entrance Door"] , loading_screen=False), ], RegionNames.SUNKEN_SHIP_SW_LOW: [ @@ -20,22 +20,22 @@ ], RegionNames.SUNKEN_SHIP_BONES_LOW: [ ExitData(RegionNames.SUNKEN_SHIP_NW_LOW, loading_screen=False, - has_events=["Sunken Ship - Open Northwest cursed door"]) + required_items_events=["Sunken Ship - Open Northwest cursed door"]) ], RegionNames.SUNKEN_SHIP_NW_LOW: [ ExitData(RegionNames.SUNKEN_SHIP_NW_HIGH, one_way=True, loading_screen=False, - has_events=["Sunken Ship - Raise water level"]), + required_items_events=["Sunken Ship - Raise water level"]), ExitData(RegionNames.SUNKEN_SHIP_HANDS_LOW, one_way=True, loading_screen=False, - has_events=["Sunken Ship - Set barrel on Scales"]) + required_items_events=["Sunken Ship - Set barrel on Scales"]) ], RegionNames.SUNKEN_SHIP_NW_HIGH: [ ExitData(RegionNames.SUNKEN_SHIP_NW_LOW, one_way=True, loading_screen=False, - has_events=["Sunken Ship - Drain water level"]), + required_items_events=["Sunken Ship - Drain water level"]), ExitData(RegionNames.SUNKEN_SHIP_BONES_HIGH, loading_screen=False, - has_events=["Sunken Ship - Open Northwest cursed door"]) + required_items_events=["Sunken Ship - Open Northwest cursed door"]) ], RegionNames.SUNKEN_SHIP_BONES_HIGH: [ - ExitData(RegionNames.SUNKEN_SHIP_SW_HIGH, has_events=["Sunken Ship - Mandatory Ichiro fight"]) + ExitData(RegionNames.SUNKEN_SHIP_SW_HIGH, required_items_events=["Sunken Ship - Mandatory Ichiro fight"]) ], RegionNames.SUNKEN_SHIP_SW_HIGH: [ ExitData(RegionNames.SUNKEN_SHIP_SE_HIGH, loading_screen=False, one_way=True), @@ -50,11 +50,11 @@ RegionNames.SUNKEN_SHIP_SE_LOW: [ ExitData(RegionNames.SUNKEN_SHIP_SE_CHESTS, one_way=True, loading_screen=False), ExitData(RegionNames.SUNKEN_SHIP_SW_LOW, one_way=True, loading_screen=False, - has_events=["Sunken Ship - climb Waterspout pillar to southwest room"]), + required_items_events=["Sunken Ship - climb Waterspout pillar to southwest room"]), ExitData(RegionNames.SUNKEN_SHIP_S_LEDGE, loading_screen=False, one_way=True, - has_events=["Sunken Ship - climb Waterspout pillar to southwest room"]), + required_items_events=["Sunken Ship - climb Waterspout pillar to southwest room"]), ExitData(RegionNames.SUNKEN_SHIP_TREASURE, loading_screen=False, - has_events=["Sunken Ship - Open final cursed door"]) + required_items_events=["Sunken Ship - Open final cursed door"]) ], RegionNames.SUNKEN_SHIP_E_HALLWAY_HIGH: [ ExitData(RegionNames.SUNKEN_SHIP_HANDS_HIGH, loading_screen=False) diff --git a/worlds/okamihd/RegionsData/r206.py b/worlds/okamihd/RegionsData/r206.py index ee70f81843dd..9014e19d423a 100644 --- a/worlds/okamihd/RegionsData/r206.py +++ b/worlds/okamihd/RegionsData/r206.py @@ -11,8 +11,8 @@ exits = { RegionNames.IMPERIAL_PALACE_ENTRANCE: [ - ExitData(RegionNames.IMPERIAL_PALACE_SMALL_ENTRANCE, has_events=["Imperial Palace - Become Smol"]), - ExitData(RegionNames.IMPERIAL_PALACE, has_events=["Imperial Palace - Defeat Blight"]) + ExitData(RegionNames.IMPERIAL_PALACE_SMALL_ENTRANCE, required_items_events=["Imperial Palace - Become Smol"]), + ExitData(RegionNames.IMPERIAL_PALACE, required_items_events=["Imperial Palace - Defeat Blight"]) ], } diff --git a/worlds/okamihd/RegionsData/r207.py b/worlds/okamihd/RegionsData/r207.py index d8ee7941d330..5f56113cc390 100644 --- a/worlds/okamihd/RegionsData/r207.py +++ b/worlds/okamihd/RegionsData/r207.py @@ -14,43 +14,43 @@ exits = { RegionNames.IMPERIAL_PALACE_SMALL_ENTRANCE: [ ExitData(RegionNames.IMPERIAL_PALACE_FEET_HELL, - has_events=["Imperial Palace - Mandatory Thunder Doom Mirror Encounter"]), + required_items_events=["Imperial Palace - Mandatory Thunder Doom Mirror Encounter"]), ExitData(RegionNames.IMPERIAL_PALACE_WEST_CAVE, - has_events=["Imperial Palace - Open west side lockjaw"]) + required_items_events=["Imperial Palace - Open west side lockjaw"]) ], RegionNames.IMPERIAL_PALACE_WEST_CAVE: [ - ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE, has_events=["Imperial Palace - Blow up west cave floor"]) + ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE, required_items_events=["Imperial Palace - Blow up west cave floor"]) ], RegionNames.IMPERIAL_PALACE_SPIDER_CAVE: [ - ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE_TOP, has_events=["Holy Eagle"], one_way=True, + ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE_TOP, required_items_events=["Holy Eagle"], one_way=True, loading_screen=False), ExitData(RegionNames.IMPERIAL_PALACE_FLASK_ROOM, - has_events=["Imperial Palace - Blow up wall to mist flask room"], one_way=True) + required_items_events=["Imperial Palace - Blow up wall to mist flask room"], one_way=True) ], RegionNames.IMPERIAL_PALACE_SPIDER_CAVE_TOP: [ ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE, one_way=True, loading_screen=False) ], RegionNames.IMPERIAL_PALACE_FLASK_ROOM: [ ExitData(RegionNames.IMPERIAL_PALACE_SPIDER_CAVE, one_way=True, - has_events=["Imperial Palace - Outspeed the spider"]) + required_items_events=["Imperial Palace - Outspeed the spider"]) ], RegionNames.IMPERIAL_PALACE_FEET_HELL: [ - ExitData(RegionNames.IMPERIAL_PALACE_POISON_SOZU, has_events=["Imperial Palace - Outspeed the Brooms"]) + ExitData(RegionNames.IMPERIAL_PALACE_POISON_SOZU, required_items_events=["Imperial Palace - Outspeed the Brooms"]) ], RegionNames.IMPERIAL_PALACE_POISON_SOZU: [ - ExitData(RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM, has_events=["Imperial Palace - Cross the Sozu"]) + ExitData(RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM, required_items_events=["Imperial Palace - Cross the Sozu"]) ], RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM:[ # Also should require Veil of Mist: - # TODO: After changing entrances has_events. - ExitData(RegionNames.IMPERIAL_PALACE_WEST_BEAM,has_events=["Holy Eagle"],loading_screen=False), + # TODO: After changing entrances required_items_events. + ExitData(RegionNames.IMPERIAL_PALACE_WEST_BEAM,required_items_events=["Holy Eagle"],loading_screen=False), # Also should require Veil of Mist: - # TODO: After changing entrances has_events. + # TODO: After changing entrances required_items_events. ExitData(RegionNames.IMPERIAL_PALACE_INSIDE_EMPEROR,one_way=True) ], RegionNames.IMPERIAL_PALACE_INSIDE_EMPEROR:[ ExitData(RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM, one_way=True), - ExitData(RegionNames.IMPERIAL_PALACE, one_way=True,has_events=["Imperial Palace - Defeat Blight"]) + ExitData(RegionNames.IMPERIAL_PALACE, one_way=True,required_items_events=["Imperial Palace - Defeat Blight"]) ] } events = { diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py index 78936fd4e2a9..575f22c40bc4 100644 --- a/worlds/okamihd/RegionsData/rf09.py +++ b/worlds/okamihd/RegionsData/rf09.py @@ -12,10 +12,10 @@ exits = { RegionNames.CURSED_RYOSHIMA_COAST: [ ExitData(RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE, - has_events=["Ryoshima Coast - Open Guardian Sapling Cave"], loading_screen=False) + required_items_events=["Ryoshima Coast - Open Guardian Sapling Cave"], loading_screen=False) ], RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE: [ - ExitData(RegionNames.RYOSHIMA_COAST, has_events=["Ryoshima Coast - Bloom the Guardian Sapling"], one_way=True) + ExitData(RegionNames.RYOSHIMA_COAST, required_items_events=["Ryoshima Coast - Bloom the Guardian Sapling"], one_way=True) ] } events = { diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 04635faf83d9..94b3faa72c98 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -16,14 +16,14 @@ RegionNames.RYOSHIMA_COAST: [ ExitData(RegionNames.RYOSHIMA_COAST_SEA, needs_long_swim=True, loading_screen=False), ExitData(RegionNames.RYOSHIMA_COAST_CATWALK_TOWER, loading_screen=False, one_way=True, - has_events=["Ryoshima Coast - Climb catwalk tower"]), + required_items_events=["Ryoshima Coast - Climb catwalk tower"]), # 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.RYOSHIMA_COAST_WEST_PIER, one_way=True, loading_screen=False), ExitData(RegionNames.ANKOKU_TEMPLE), - ExitData(RegionNames.FAWNS_HOUSE, has_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]), + ExitData(RegionNames.FAWNS_HOUSE, required_items_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) + required_items_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False) ], RegionNames.RYOSHIMA_COAST_SEA: [ ExitData(RegionNames.RYOSHIMA_COAST_DOJO, needs_long_swim=True, loading_screen=False), @@ -31,15 +31,15 @@ ], RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: [ - ExitData(RegionNames.RYOSHIMA_COAST, has_events=["Ryoshima Coast - Climb back to main area"], one_way=True, + ExitData(RegionNames.RYOSHIMA_COAST, required_items_events=["Ryoshima Coast - Climb back to main area"], one_way=True, loading_screen=False) ], # Special Handling for the encounter around Seian, city entrance as the enemies inside require galestrom to be beaten. RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER: [ ExitData(RegionNames.RYOSHIMA_COAST_SEIAN, loading_screen=False, one_way=True, - has_events=["Ryoshima Coast - Mandatory Ubume Encounter"]), + required_items_events=["Ryoshima Coast - Mandatory Ubume Encounter"]), ExitData(RegionNames.RYOSHIMA_COAST, loading_screen=False, one_way=True, - has_events=["Ryoshima Coast - Mandatory Ubume Encounter"]) + required_items_events=["Ryoshima Coast - Mandatory Ubume Encounter"]) ], RegionNames.RYOSHIMA_COAST_SEIAN: [ # Special Handling for the encounter around Seian, city entrance as the enemies inside require galestrom to be beaten. From 8847f0f224dbbea22c1c99eea906a42e1e9a443d Mon Sep 17 00:00:00 2001 From: Ragmoa Date: Mon, 8 Jun 2026 13:58:29 +0200 Subject: [PATCH 30/30] Update Ryoshima far chest requirements + Golden Ink pot for chest in city checkpoint --- worlds/okamihd/Enums/RegionNames.py | 1 + worlds/okamihd/Items.py | 2 +- worlds/okamihd/RegionsData/r105.py | 6 +++--- worlds/okamihd/RegionsData/rf0a.py | 17 +++++++++-------- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index aafc90b9792f..a6d5e69f2cac 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -137,6 +137,7 @@ class RegionNames(StrEnum): CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE = "Cursed Ryoshima Coast" RYOSHIMA_COAST = "Ryoshima Coast" RYOSHIMA_COAST_SEA = "Ryoshima Coast (Sea)" + RYOSHIMA_COAST_SEA_FAR = "Ryoshima Coast (Sea, far away)" RYOSHIMA_COAST_DOJO = "Ryoshima Coast (Dojo)" RYOSHIMA_COAST_SHIP_TOP = "Ryoshima Coast (Top of Sunken Ship)" RYOSHIMA_COAST_CATWALK_TOWER = "Ryoshima Coast (Catwalk Tower)" diff --git a/worlds/okamihd/Items.py b/worlds/okamihd/Items.py index d48af6ec4459..cb5297a93cd0 100644 --- a/worlds/okamihd/Items.py +++ b/worlds/okamihd/Items.py @@ -109,7 +109,7 @@ 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), + "Golden Ink Pot": ItemData(0x98, ItemClassification.progression), "Fire Tablet": ItemData(0x9d, ItemClassification.progression) } diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py index 14e0a094b0bb..ae544de0d825 100644 --- a/worlds/okamihd/RegionsData/r105.py +++ b/worlds/okamihd/RegionsData/r105.py @@ -4,13 +4,13 @@ from ..CheckIds import shop_check_id, container_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType +from ..Enums.RegionNames import RegionNames, MapIds from ..Enums.WarpType import WarpType from ..Rules import has_portable_fire_source_strict from ..Types import LocData, EventData, ExitData, WarpData -from ..Enums.RegionNames import RegionNames, MapIds if TYPE_CHECKING: - from .. import OkamiWorld + pass exits = { RegionNames.CITY_CHECKPOINT_TAKA: [ @@ -53,7 +53,7 @@ RegionNames.CITY_CHECKPOINT_DRAWBRIDGE: { "City Checkpoint - Chest inside torches circle": LocData(container_check_id(MapIds.CITY_CHECKPOINT, 1), required_brush_techniques=[ - BrushTechniques.GREENSPROUT_VINE]), + BrushTechniques.GREENSPROUT_VINE],required_items_events=["Golden Ink Pot"]), "City Checkpoint - Chest on top of rock": LocData(container_check_id(MapIds.CITY_CHECKPOINT, 2), required_brush_techniques=[ BrushTechniques.GREENSPROUT_VINE]), diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 94b3faa72c98..63902ebc299a 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -28,7 +28,7 @@ RegionNames.RYOSHIMA_COAST_SEA: [ ExitData(RegionNames.RYOSHIMA_COAST_DOJO, needs_long_swim=True, loading_screen=False), ExitData(RegionNames.RYOSHIMA_COAST_SHIP_TOP, needs_long_swim=True, loading_screen=False), - + ExitData(RegionNames.RYOSHIMA_COAST_SEA_FAR,loading_screen=False,required_items_events=["Water Tablet"]) ], RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: [ ExitData(RegionNames.RYOSHIMA_COAST, required_items_events=["Ryoshima Coast - Climb back to main area"], one_way=True, @@ -102,6 +102,14 @@ "Ryoshima Coast - Underwater Clam in dojo island bombable room": LocData( container_check_id(MapIds.HEALED_RYOSHIMA, 2), type=LocationType.UNDERWATER_CHEST_SHALLOW, cherry_bomb_level=1), + "Ryoshima Coast - Underwater Clam southwest of ultimate origin mirror": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 57), type=LocationType.UNDERWATER_CHEST), + "Ryoshima Coast - Eastmost Underwater Clam, south of city checkpoint warp": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 58), type=LocationType.UNDERWATER_CHEST), + "Ryoshima Coast - Underwater Clam southeast of ultimate origin mirror": LocData( + container_check_id(MapIds.HEALED_RYOSHIMA, 59), type=LocationType.UNDERWATER_CHEST), + }, + RegionNames.RYOSHIMA_COAST_SEA_FAR:{ "Ryoshima Coast - Clam on southernmost rocks": LocData( container_check_id(MapIds.HEALED_RYOSHIMA, 5)), "Ryoshima Coast - Clam between shimenawa rocks": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 24)), @@ -131,14 +139,7 @@ container_check_id(MapIds.HEALED_RYOSHIMA, 46), type=LocationType.UNDERWATER_CHEST_SHALLOW), "Ryoshima Coast - West Underwater Clam on rocks south of Sunken Ship": LocData( container_check_id(MapIds.HEALED_RYOSHIMA, 47), type=LocationType.UNDERWATER_CHEST_SHALLOW), - "Ryoshima Coast - Underwater Clam southwest of ultimate origin mirror": LocData( - container_check_id(MapIds.HEALED_RYOSHIMA, 57), type=LocationType.UNDERWATER_CHEST), - "Ryoshima Coast - Eastmost Underwater Clam, south of city checkpoint warp": LocData( - container_check_id(MapIds.HEALED_RYOSHIMA, 58), type=LocationType.UNDERWATER_CHEST), - "Ryoshima Coast - Underwater Clam southeast of ultimate origin mirror": LocData( - container_check_id(MapIds.HEALED_RYOSHIMA, 59), type=LocationType.UNDERWATER_CHEST), }, - RegionNames.RYOSHIMA_COAST_DOJO: { "Ryoshima Coast - Stone Buried Chest near Dojo": LocData(container_check_id(MapIds.HEALED_RYOSHIMA, 6), type=LocationType.STONE_BURIED_CHEST),