diff --git a/worlds/okamihd/Enums/LocationType.py b/worlds/okamihd/Enums/LocationType.py index 94cd65c4cf62..8b038d79a444 100644 --- a/worlds/okamihd/Enums/LocationType.py +++ b/worlds/okamihd/Enums/LocationType.py @@ -35,8 +35,10 @@ class LocationType(Enum): # Chest with element Sources that depend on special rules; Don't apply any requirments except the special rule one THUNDER_CHEST_SPECIAL_SOURCE = 20 FROZEN_CHEST_SPECIAL_SOURCE = 21 + # + Holy Eagle + Golden Ink Pot + DIGGING_MINIGAME_HARD = 22 excluded_biteable_location_types = [LocationType.CONSTELLATION, LocationType.EVENT, LocationType.DIGGING_MINIGAME_EARLY, - LocationType.DIGGING_MINIGAME_LATER, LocationType.SHOP, + LocationType.DIGGING_MINIGAME_LATER,LocationType.DIGGING_MINIGAME_HARD, LocationType.SHOP, LocationType.FISHING_MINIGAME,LocationType.UNDERWATER_CHEST_SHALLOW,LocationType.UNDERWATER_CHEST] diff --git a/worlds/okamihd/Enums/OkamiEnemies.py b/worlds/okamihd/Enums/OkamiEnemies.py index 71aeade71640..46969f2aa81d 100644 --- a/worlds/okamihd/Enums/OkamiEnemies.py +++ b/worlds/okamihd/Enums/OkamiEnemies.py @@ -36,7 +36,7 @@ class OkamiEnemies(Enum): UME = EnnemyData(0x22, "Ume", 1) TAKE = EnnemyData(0x23, "Take", 1) CUTTERS = EnnemyData(0x57, "Mr and Ms.Cutter", 1) - CROW_TENGU = EnnemyData(0x57, "Crow Tengu", 1) + CROW_TENGU = EnnemyData(0x57, "Crow Tengu", 1, requires_slash=True) CHIMERA = EnnemyData(0x4e, "Chimera", 1, requires_slash=True) # don't require slash here bc it's required in the cutscene that follows, not to beat the boss itself CRIMSON_HELM = EnnemyData(0x11, "Crimson Helm", 1, required_techniques=[BrushTechniques.GALESTORM]) @@ -50,6 +50,11 @@ class OkamiEnemies(Enum): THUNDER_DOOM_MIRROR = EnnemyData(0x5d, "Thunder Doom Mirror", 2) WIND_DOOM_MIRROR = EnnemyData(0x5c, "Wind Doom Mirror", 2, required_techniques=[BrushTechniques.VEIL_OF_MIST]) BLIGHT = EnnemyData(0x7c, "Blight", 2, requires_slash=True) + THUNDER_EAR = EnnemyData(0x55, "Thunder Ear", 2) + EARTH_NOSE = EnnemyData(0x54, "Earth Nose", 2, required_techniques=[BrushTechniques.VEIL_OF_MIST]) + BLUE_CYCLOPS = EnnemyData(0x29, "Blue Cyclops", 2) + BANDIT_SPIDER = EnnemyData(0x0b, "Bandit Spider", 2, required_techniques=[BrushTechniques.GREENSPROUT_VINE]) + TUBE_FOX = EnnemyData(0x0e, "Tube Fox", 3) @staticmethod def list(): diff --git a/worlds/okamihd/Enums/RegionNames.py b/worlds/okamihd/Enums/RegionNames.py index a6d5e69f2cac..211616cc7a30 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -52,7 +52,7 @@ class RegionNames(StrEnum): ## AGATA FOREST CURSED_AGATA_FOREST = "Cursed Agata Forest" - AGATA_COMMON_LOGIC= "Agata Forest (Common)" + AGATA_COMMON_LOGIC = "Agata Forest (Common)" AGATA_FOREST_WAKA = "Agata Forest (Pre-waka fight)" AGATA_FOREST = "Agata Forest" AGATA_FOREST_TAKA = "Agata Forest (Behind Bridge to Taka Pass)" @@ -69,11 +69,12 @@ class RegionNames(StrEnum): ## TAKA PASS CURSED_TAKA_PASS = "Curesd Taka Pass" - TAKA_COMMON_LOGIC="Taka Pass (Common)" + TAKA_COMMON_LOGIC = "Taka Pass (Common)" CURSED_TAKA_PASS_WAKA = "Cursed Taka Pass (Waka Fight)" CURSED_TAKA_PASS_CAVE = "Cursed Taka Pass (Cave)" CURSED_TAKA_PASS_GUARDIAN_SAPLING = "Cursed Taka Pass (Guardian Sapling)" TAKA_PASS = "Taka Pass" + TAKA_PASS_CAVE = "Taka Pass Cave" ## KUSA VILLAGE KUSA_VILLAGE = "Kusa Village" @@ -146,6 +147,7 @@ class RegionNames(StrEnum): RYOSHIMA_COAST_LUNAR_LAGOON = "Ryoshima Coast (Lunar Lagoon)" RYOSHIMA_COAST_WEST_PIER = "Ryoshima Coast (West of Pier)" ANKOKU_TEMPLE = "Ankoku Temple" + RYOSHIMA_COAST_BANDIT_SPIDER = "Ryoshima Coast (Bandit spider cave)" ## SEIAN CITY ### COMMONERS QUARTER @@ -214,6 +216,43 @@ class RegionNames(StrEnum): IMPERIAL_PALACE_WEST_BEAM = "Imperial Palace (Small Size - West Beam)" IMPERIAL_PALACE_INSIDE_EMPEROR = "Imperial Palace (Small Size - Inside the Emperor's Body)" + ## Northern Ryoshima Coast + NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT = "Nothern Rysohima Coast (Mandatory Fight)" + NORTHERN_RYOSHIMA_COAST = "Nothern Rysohima Coast" + NORTHERN_RYOSHIMA_COAST_MIST_WARP = "Northern Ryoshima Coast (Secret Mist Warp Area)" + NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER = "Northern Ryoshima Coast (Watcher's cape mandatory Encounter)" + NORTHERN_RYOSHIMA_COAST_WATCHERS = "Northern Ryoshima Coast (Watcher's cape)" + NORTHERN_RYOSHIMA_COAST_SAPLING = "Northern Ryoshima Coast (Guardian Sapling Island)" + NORTHERN_RYOSHIMA_COAST_TOMB = "Northern Ryoshima Coast (Tomb Cave)" + NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND = "Northern Ryoshima Coast (Westernmost Island)" + NORTHERN_RYOSHIMA_COAST_UMI = "Northern Ryoshima Coast (Umi's Restaurant)" + NORTHERN_RYOSHIMA_COAST_CATCALL_NORTH = "Northern Ryoshima Coast (Island North of Catcall Tower)" + NORTHERN_RYOSHIMA_COAST_CB2_ISLAND = "Northern Ryoshima Coast (Cherry Bomb 2 Island)" + NORTHERN_RYOSHIMA_COAST_PS2_ISLAND = "Northern Ryoshima Coast (Power Slash 2 Island)" + NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND = "Northern Ryoshima Coast (Bandit Spider Island)" + NORTHERN_RYOSHIMA_COAST_SEA = "Northern Ryoshima Coast (Sea)" + NORTHERN_RYOSHIMA_COAST_PS2_CAVE = "Northern Ryoshima Coast (Power Slash 2 Cave)" + NORTHERN_RYOSHIMA_COAST_CB2_CAVE = "Northern Ryoshima Coast (Cherry Bomb 2 Cave)" + NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE = "Northern Ryoshima Coast (Bandit spider cave)" + NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE = "Northern Ryoshima Coast (Treasure cave)" + NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND = "Northern Ryoshima Coast (Catcall Tower Island)" + + ## Catcall Tower + CATCALL_TOWER_BOTTOM = "Catcall Tower (Bottom)" + CATCALL_TOWER = "Catcall Tower" + CATCALL_TOWER_TOP = "Catcall Tower(Top)" + + ## DRAGON PALACE + DRAGON_PALACE = "Dragon Palace" + DRAGON_PALACE_SPRING = "Dragon Palace (Soothing Spring)" + DRAGON_PALACE_CAVE = "Dragon Palace (Treasure Cave)" + DRAGON_PALACE_GARDEN = "Dragon Palace (Water Dragon's Garden)" + + ## INSIDE THE DRAGON + INSIDE_THE_DRAGON = "Inside the dragon" + INSIDE_THE_DRAGON_DEEP = "Inside the dragon (Deeper part)" + INSIDE_THE_DRAGON_ORB = "Inside the dragon (Orb area)" + # SPECIAL REGIONS # Special Hub regions to handle warps MIST_WARP_HUB = "Mist Warp Hub" @@ -234,13 +273,23 @@ class MapIds(Enum): AGATA_FOREST_MME_FAWN = 0x10A CALCIFIED_CAVERN = 0x10E MOON_CAVE = 0x110 + RYOSHIMA_BANDIT_SPIDER = 0x113 + TAKA_PASS_CAVE = 0x114 + POWER_SLASH_2_CAVE = 0x116 + CHERRY_BOMB_2_CAVE = 0x117 + NORTHERN_RYOSHIMA_BANDIT_SPIDER = 0x11A + DRAGON_PALACE_TREASURE = 0x11C + NORTHERN_RYOSHIMA_TREASURE = 0x11D RIVER_OF_THE_HEAVENS = 0x122 SEIAN_ARISTORATIC = 0x200 SEIAN_COMMONERS = 0x201 HIMIKO_PALACE = 0x202 + DRAGON_PALACE = 0x203 + INSIDE_THE_DRAGON = 0x204 SUNKEN_SHIP = 0x205 IMPERIAL_PALACE = 0x206 IMPERIAL_PALACE_SMALL = 0x207 + CATCALL_TOWER = 0x20A CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 CURSED_AGATA = 0xF03 @@ -249,6 +298,7 @@ class MapIds(Enum): HEALED_TAKA = 0xF08 CURSED_RYOSHIMA = 0xF09 HEALED_RYOSHIMA = 0xF0A + NORTHERN_RYOSHIMA = 0xF0C class MapIndexes(Enum): diff --git a/worlds/okamihd/Items.py b/worlds/okamihd/Items.py index 3ab69181691f..3cf48e6f32e9 100644 --- a/worlds/okamihd/Items.py +++ b/worlds/okamihd/Items.py @@ -110,6 +110,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), + # Has to be progression since we require it for some checks. "Golden Ink Pot": ItemData(0x98, ItemClassification.progression), "Fire Tablet": ItemData(0x9d, ItemClassification.progression) } diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 845311483359..6a9b2e880e72 100644 --- a/worlds/okamihd/RegionsData/__init__.py +++ b/worlds/okamihd/RegionsData/__init__.py @@ -1,7 +1,8 @@ from typing import TYPE_CHECKING from . import menu, r100, r122, r101, r102, r103, r104, rf01, rf02, rf03, rf04, rf07, rf08, r108, r109, r107, r10e, \ - r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202,r10a + r110, rf06, r105, rf09, rf0a, r201, r205, r200, r206, r207, r202, r10a, rf0c, r113, r114, r116, r117, r11a, r11d, \ + r20a, r203, r11c, r204 if TYPE_CHECKING: from .. import OkamiWorld @@ -20,13 +21,23 @@ **r10a.exits, **r10e.exits, **r110.exits, + **r113.exits, + **r114.exits, + **r116.exits, + **r117.exits, + **r11a.exits, + **r11c.exits, + **r11d.exits, **r122.exits, **r200.exits, **r201.exits, **r202.exits, + **r203.exits, + **r204.exits, **r205.exits, **r206.exits, **r207.exits, + **r20a.exits, **rf01.exits, **rf02.exits, **rf03.exits, @@ -36,6 +47,7 @@ **rf08.exits, **rf09.exits, **rf0a.exits, + **rf0c.exits, } okami_locations = { @@ -51,13 +63,23 @@ **r10a.locations, **r10e.locations, **r110.locations, + **r113.locations, + **r114.locations, + **r116.locations, + **r117.locations, + **r11a.locations, + **r11c.locations, + **r11d.locations, **r122.locations, **r200.locations, **r201.locations, **r202.locations, + **r203.locations, + **r204.locations, **r205.locations, **r206.locations, **r207.locations, + **r20a.locations, **rf01.locations, **rf02.locations, **rf03.locations, @@ -67,6 +89,7 @@ **rf08.locations, **rf09.locations, **rf0a.locations, + **rf0c.locations, } okami_events = { @@ -82,13 +105,23 @@ **r10a.events, **r10e.events, **r110.events, + **r113.events, + **r114.events, + **r116.events, + **r117.events, + **r11a.events, + **r11c.events, + **r11d.events, **r122.events, **r200.events, **r201.events, **r202.events, + **r203.events, + **r204.events, **r205.events, **r206.events, **r207.events, + **r20a.events, **rf01.events, **rf02.events, **rf03.events, @@ -98,6 +131,7 @@ **rf08.events, **rf09.events, **rf0a.events, + **rf0c.events, } # Shop locations are separate because they're conditionally created based on RandomizeShops @@ -108,10 +142,12 @@ **getattr(r109, 'shop_locations', {}), **getattr(r110, 'shop_locations', {}), **getattr(r201, 'shop_locations', {}), + **getattr(r203, 'shop_locations', {}), **getattr(rf02, 'shop_locations', {}), **getattr(rf04, 'shop_locations', {}), **getattr(rf08, 'shop_locations', {}), **getattr(rf0a, 'shop_locations', {}), + **getattr(rf0c, 'shop_locations', {}) } okami_warps = { @@ -120,9 +156,11 @@ **r108.warps, **r109.warps, **r200.warps, + **r203.warps, + **r20a.warps, **rf02.warps, **rf04.warps, **rf08.warps, **rf0a.warps, - + **rf0c.warps } diff --git a/worlds/okamihd/RegionsData/r113.py b/worlds/okamihd/RegionsData/r113.py new file mode 100644 index 000000000000..c2bad7bf25c7 --- /dev/null +++ b/worlds/okamihd/RegionsData/r113.py @@ -0,0 +1,32 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER: [ + ExitData(RegionNames.RYOSHIMA_COAST, one_way=True, required_items_events=["Ryoshima Coast - Defeat Bandit Spider in cave"]) + ] +} +events = { + RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER: { + "Ryoshima Coast - Defeat Bandit Spider in cave": EventData(mandatory_enemies=[OkamiEnemies.BANDIT_SPIDER]), + "Ryoshima Coast - Clear 10 Devil Gates in cave": EventData( + mandatory_enemies=[OkamiEnemies.GREEN_IMP, OkamiEnemies.RED_IMP, OkamiEnemies.YELLOW_IMP, + OkamiEnemies.DEAD_FISH, OkamiEnemies.BUD_OGRE, OkamiEnemies.BLUE_IMP, + OkamiEnemies.CROW_TENGU, OkamiEnemies.CHIMERA, OkamiEnemies.BLACK_IMP, + OkamiEnemies.ICE_LIPS, OkamiEnemies.FIRE_EYE]), + } + +} +locations = { + RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER: { + "Ryoshima Coast - Chest after Bandit Spider": LocData(container_check_id(MapIds.RYOSHIMA_BANDIT_SPIDER, 0)), + "Ryoshima Coast - Chest after 10 devil gates": LocData(container_check_id(MapIds.RYOSHIMA_BANDIT_SPIDER, 1)) + } +} diff --git a/worlds/okamihd/RegionsData/r114.py b/worlds/okamihd/RegionsData/r114.py new file mode 100644 index 000000000000..e1955d2b8371 --- /dev/null +++ b/worlds/okamihd/RegionsData/r114.py @@ -0,0 +1,21 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { +} +locations = { + RegionNames.TAKA_PASS_CAVE: { + "Taka Pass - Chest in treasure cave 1": LocData(container_check_id(MapIds.TAKA_PASS_CAVE, 1)), + "Taka Pass - Chest in treasure cave 2": LocData(container_check_id(MapIds.TAKA_PASS_CAVE, 0)), + "Taka Pass - Chest in treasure cave 3": LocData(container_check_id(MapIds.TAKA_PASS_CAVE, 2)), + } +} diff --git a/worlds/okamihd/RegionsData/r116.py b/worlds/okamihd/RegionsData/r116.py new file mode 100644 index 000000000000..6be73d287c7c --- /dev/null +++ b/worlds/okamihd/RegionsData/r116.py @@ -0,0 +1,26 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE:{ + "Northern Ryoshima Coast - Offer 60,000 yen in Power Slash 2 Fountain": EventData() + } +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE: { + # Brush upgrade id 12 + "Northern Ryoshima Coast - Tachigami (Power Slash 2)": LocData(12, type=LocationType.CONSTELLATION), + "Northern Ryoshima Coast - Chest after Power Slash 2": LocData(container_check_id(MapIds.POWER_SLASH_2_CAVE, 0)) + } + +} diff --git a/worlds/okamihd/RegionsData/r117.py b/worlds/okamihd/RegionsData/r117.py new file mode 100644 index 000000000000..9c1438488136 --- /dev/null +++ b/worlds/okamihd/RegionsData/r117.py @@ -0,0 +1,26 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id, brush_check_id +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { + RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_CAVE:{ + "Northern Ryoshima Coast - Offer 120,000 yen in Cherry Bomb 2 Fountain": EventData() + } +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE: { + # Brush upgrade id 25 + "Northern Ryoshima Coast - Bakugami (Cherry Bomb 2)": LocData(25, type=LocationType.CONSTELLATION), + "Northern Ryoshima Coast - Chest after Cherry Bomb 2": LocData(container_check_id(MapIds.CHERRY_BOMB_2_CAVE, 0)) + } + +} diff --git a/worlds/okamihd/RegionsData/r11a.py b/worlds/okamihd/RegionsData/r11a.py new file mode 100644 index 000000000000..970e811a4be9 --- /dev/null +++ b/worlds/okamihd/RegionsData/r11a.py @@ -0,0 +1,30 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND, one_way=True, required_items_events=["Northern Ryoshima Coast - Defeat Bandit Spider in cave"]) + ] +} +events = { + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE: { + "Northern Ryoshima Coast - Defeat Bandit Spider in cave": EventData(mandatory_enemies=[OkamiEnemies.BANDIT_SPIDER]), + #FIXME: Add enemies, requires game progression to appear. + "Northern Ryoshima Coast - Clear 10 Devil Gates in cave": EventData( + mandatory_enemies=[]), + } + +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE: { + "Northern Ryoshima Coast - Chest after Bandit Spider": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_BANDIT_SPIDER, 0)), + "Northern Ryoshima Coast - Chest after 10 devil gates": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_BANDIT_SPIDER, 1)) + } +} diff --git a/worlds/okamihd/RegionsData/r11c.py b/worlds/okamihd/RegionsData/r11c.py new file mode 100644 index 000000000000..366531e03e66 --- /dev/null +++ b/worlds/okamihd/RegionsData/r11c.py @@ -0,0 +1,21 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { +} +locations = { + RegionNames.DRAGON_PALACE_CAVE: { + "Dragon Palace - Chest in treasure cave 1": LocData(container_check_id(MapIds.DRAGON_PALACE_TREASURE, 2)), + "Dragon Palace - Chest in treasure cave 2": LocData(container_check_id(MapIds.DRAGON_PALACE_TREASURE, 1)), + "Dragon Palace - Chest in treasure cave 3": LocData(container_check_id(MapIds.DRAGON_PALACE_TREASURE, 0)), + } +} diff --git a/worlds/okamihd/RegionsData/r11d.py b/worlds/okamihd/RegionsData/r11d.py new file mode 100644 index 000000000000..5c1245a46890 --- /dev/null +++ b/worlds/okamihd/RegionsData/r11d.py @@ -0,0 +1,21 @@ +from typing import TYPE_CHECKING + +from ..CheckIds import container_check_id +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Types import LocData, EventData, ExitData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { +} +events = { +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE: { + "Northern Ryoshima Coast - Chest in treasure cave 1": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_TREASURE, 1)), + "Northern Ryoshima Coast - Chest in treasure cave 2": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_TREASURE, 0)), + "Northern Ryoshima Coast - Chest in treasure cave 3": LocData(container_check_id(MapIds.NORTHERN_RYOSHIMA_TREASURE, 2)), + } +} diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py index 44bd0feb0530..00a5cba3d1b7 100644 --- a/worlds/okamihd/RegionsData/r201.py +++ b/worlds/okamihd/RegionsData/r201.py @@ -132,31 +132,31 @@ } shop_locations = { RegionNames.SEIAN_CITY_TOOL_SHOP: { - "Sei-an City Tool Shop Slot 1": LocData(shop_check_id(16, 0), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 2": LocData(shop_check_id(16, 1), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 3": LocData(shop_check_id(16, 2), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 4": LocData(shop_check_id(16, 3), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 5": LocData(shop_check_id(16, 4), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 6": LocData(shop_check_id(16, 5), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 7": LocData(shop_check_id(16, 6), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 8": LocData(shop_check_id(16, 7), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 9": LocData(shop_check_id(16, 8), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 10": LocData(shop_check_id(16, 9), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 11": LocData(shop_check_id(16, 10), type=LocationType.SHOP), - "Sei-an City Tool Shop Slot 12": LocData(shop_check_id(16, 11), type=LocationType.SHOP) + "Sei-an City - Tool Shop Slot 1": LocData(shop_check_id(16, 0), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 2": LocData(shop_check_id(16, 1), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 3": LocData(shop_check_id(16, 2), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 4": LocData(shop_check_id(16, 3), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 5": LocData(shop_check_id(16, 4), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 6": LocData(shop_check_id(16, 5), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 7": LocData(shop_check_id(16, 6), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 8": LocData(shop_check_id(16, 7), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 9": LocData(shop_check_id(16, 8), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 10": LocData(shop_check_id(16, 9), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 11": LocData(shop_check_id(16, 10), type=LocationType.SHOP), + "Sei-an City - Tool Shop Slot 12": LocData(shop_check_id(16, 11), type=LocationType.SHOP) }, RegionNames.SEIAN_CITY_WEAPON_SHOP: { - "Sei-an City Weapon Shop Slot 1": LocData(shop_check_id(17, 0), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 2": LocData(shop_check_id(17, 1), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 3": LocData(shop_check_id(17, 2), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 4": LocData(shop_check_id(17, 3), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 5": LocData(shop_check_id(17, 4), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 6": LocData(shop_check_id(17, 5), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 7": LocData(shop_check_id(17, 6), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 8": LocData(shop_check_id(17, 7), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 9": LocData(shop_check_id(17, 8), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 10": LocData(shop_check_id(17, 9), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 11": LocData(shop_check_id(17, 10), type=LocationType.SHOP), - "Sei-an City Weapon Shop Slot 12": LocData(shop_check_id(17, 11), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 1": LocData(shop_check_id(17, 0), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 2": LocData(shop_check_id(17, 1), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 3": LocData(shop_check_id(17, 2), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 4": LocData(shop_check_id(17, 3), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 5": LocData(shop_check_id(17, 4), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 6": LocData(shop_check_id(17, 5), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 7": LocData(shop_check_id(17, 6), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 8": LocData(shop_check_id(17, 7), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 9": LocData(shop_check_id(17, 8), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 10": LocData(shop_check_id(17, 9), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 11": LocData(shop_check_id(17, 10), type=LocationType.SHOP), + "Sei-an City - Weapon Shop Slot 12": LocData(shop_check_id(17, 11), type=LocationType.SHOP), } } diff --git a/worlds/okamihd/RegionsData/r202.py b/worlds/okamihd/RegionsData/r202.py index cc2505a1d2ad..f9ab3b7f7914 100644 --- a/worlds/okamihd/RegionsData/r202.py +++ b/worlds/okamihd/RegionsData/r202.py @@ -1,5 +1,6 @@ from typing import TYPE_CHECKING +from BaseClasses import LocationProgressType from ..CheckIds import container_check_id, brush_check_id, shop_check_id from ..Enums.BrushTechniques import BrushTechniques from ..Enums.LocationType import LocationType @@ -15,8 +16,15 @@ ] } events = { - RegionNames.HIMIKO_PALACE:{ - "Himiko's Palace - Cross sea of fire": EventData(required_items_events=["Fire Tablet"]) + RegionNames.HIMIKO_PALACE: { + "Himiko's Palace - Cross sea of fire": EventData(required_items_events=["Fire Tablet"]) + }, + RegionNames.HIMIKO_CHAMBERS: { + # Vanilla event that opens N. Ryoshima Coast - to replace with something else when needed. + "Himiko's Palace - Hear Himiko's request": EventData(), + "Himiko's Palace - Get Oni Island Location": EventData( + required_items_events=["Dragon Palace - Give Dragon Orb to Otohime", + "Ryoshima Coast - Open shortcut to Sei-an City"]) } } locations = { @@ -27,7 +35,7 @@ required_items_events=["Fire Tablet"]) }, # Special check - RegionNames.HIMIKO_CHAMBERS:{ - "Himiko's Palace - Get Border Key from Queen Himiko":LocData(1000) + RegionNames.HIMIKO_CHAMBERS: { + "Himiko's Palace - Get Border Key from Queen Himiko": LocData(1000, progress_type=LocationProgressType.EXCLUDED) } } diff --git a/worlds/okamihd/RegionsData/r203.py b/worlds/okamihd/RegionsData/r203.py new file mode 100644 index 000000000000..112a72f92266 --- /dev/null +++ b/worlds/okamihd/RegionsData/r203.py @@ -0,0 +1,93 @@ +from typing import TYPE_CHECKING + +from BaseClasses import LocationProgressType +from rule_builder.rules import Has +from ..CheckIds import container_check_id, shop_check_id, brush_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.WarpType import WarpType +from ..Types import LocData, EventData, ExitData, WarpData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.DRAGON_PALACE: [ + ExitData(RegionNames.DRAGON_PALACE_SPRING, one_way=True, + required_items_events=["Dragon Palace - Get Shell Amulet from Otohime"]), + ExitData(RegionNames.DRAGON_PALACE_GARDEN, one_way=True, + required_items_events=["Dragon Palace - Get Shell Amulet from Otohime"]), + ExitData(RegionNames.DRAGON_PALACE_CAVE, required_items_events=["Dragon Palace - Open Treasure Cave behind stairs"]) + ], + RegionNames.DRAGON_PALACE_SPRING: [ + ExitData(RegionNames.DRAGON_PALACE, one_way=True) + ], + RegionNames.DRAGON_PALACE_GARDEN: [ + ExitData(RegionNames.DRAGON_PALACE, one_way=True), + ExitData(RegionNames.INSIDE_THE_DRAGON) + ] +} +events = { + RegionNames.DRAGON_PALACE: { + "Dragon Palace - Open Treasure Cave behind stairs": EventData(cherry_bomb_level=1), + # FIXME: This should give shell amulet, and it should be removed from pool since it can't be picked up rn + # FIXME: Change this to a location later + "Dragon Palace - Get Shell Amulet from Otohime": EventData(), + "Dragon Palace - Give Dragon Orb to Otohime": EventData(required_items_events=["Inside the dragon - Get Dragon Orb"]) + }, + RegionNames.DRAGON_PALACE_SPRING: { + "Dragon Palace - Restore the soothing spring": EventData(type=LocationType.DIGGING_MINIGAME_HARD, + required_items_events=["Digging Champ"]) + } +} +locations = { + RegionNames.DRAGON_PALACE: { + "Dragon Palace - West Clam at entrance 1": LocData(container_check_id(MapIds.DRAGON_PALACE, 3)), + "Dragon Palace - West Clam at entrance 2": LocData(container_check_id(MapIds.DRAGON_PALACE, 4)), + "Dragon Palace - East Clam at entrance": LocData(container_check_id(MapIds.DRAGON_PALACE, 5)), + "Dragon Palace - Chest inside guardhouse": LocData(container_check_id(MapIds.DRAGON_PALACE, 1)) + }, + RegionNames.DRAGON_PALACE_SPRING: { + "Dragon Palace - North Clam near Soothing Spring": LocData(container_check_id(MapIds.DRAGON_PALACE, 10)), + "Dragon Palace - West Clam near Soothing Spring": LocData(container_check_id(MapIds.DRAGON_PALACE, 9)), + "Dragon Palace -Chest on Pillars": LocData(container_check_id(MapIds.DRAGON_PALACE, 2), + required_brush_techniques=[BrushTechniques.REJUVENATION], + required_items_events=["Holy Eagle"]), + "Dragon Palace - Nuregami (Fountain)": LocData(brush_check_id(16), required_items_events=[ + "Dragon Palace - Restore the soothing spring"]), + # FIXME: This chest doesn't have a container id ! + "Dragon Palace - Chest after fountain": LocData(1001, required_items_events=[ + "Dragon Palace - Restore the soothing spring"], progress_type=LocationProgressType.EXCLUDED) + }, + RegionNames.DRAGON_PALACE_GARDEN: { + "Dragon Palace - East Clam in garden": LocData(container_check_id(MapIds.DRAGON_PALACE, 8)), + "Dragon Palace - North Clam in garden": LocData(container_check_id(MapIds.DRAGON_PALACE, 7)), + "Dragon Palace - North Clam on ledge in garden": LocData(container_check_id(MapIds.DRAGON_PALACE, 6)), + "Dragon Palace - Chest after blooming the dragon's remains": LocData( + container_check_id(MapIds.DRAGON_PALACE, 0), required_brush_techniques=[BrushTechniques.GREENSPROUT_BLOOM], + required_items_events=["Inside the dragon - Get Dragon Orb"]) + } +} +shop_locations = { + RegionNames.DRAGON_PALACE: { + "Dragon Palace - Ms. Turtle's Shop Slot 1": LocData(shop_check_id(3, 0), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 2": LocData(shop_check_id(3, 1), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 3": LocData(shop_check_id(3, 2), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 4": LocData(shop_check_id(3, 3), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 5": LocData(shop_check_id(3, 4), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 6": LocData(shop_check_id(3, 5), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 7": LocData(shop_check_id(3, 6), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 8": LocData(shop_check_id(3, 7), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 9": LocData(shop_check_id(3, 8), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 10": LocData(shop_check_id(3, 9), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 11": LocData(shop_check_id(3, 10), type=LocationType.SHOP), + "Dragon Palace - Ms. Turtle's Shop Slot 12": LocData(shop_check_id(3, 11), type=LocationType.SHOP) + } +} +warps = { + RegionNames.DRAGON_PALACE_SPRING: [ + WarpData(WarpType.MERMAID_SPRING, Has("Dragon Palace - Restore the soothing spring"), + Has("Dragon Palace - Restore the soothing spring")) + ] +} diff --git a/worlds/okamihd/RegionsData/r204.py b/worlds/okamihd/RegionsData/r204.py new file mode 100644 index 000000000000..37d4f4f48868 --- /dev/null +++ b/worlds/okamihd/RegionsData/r204.py @@ -0,0 +1,79 @@ +from typing import TYPE_CHECKING + +from BaseClasses import LocationProgressType +from rule_builder.rules import Has, HasAny +from ..CheckIds import container_check_id, shop_check_id, brush_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Enums.WarpType import WarpType +from ..Types import LocData, EventData, ExitData, WarpData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.INSIDE_THE_DRAGON: [ + ExitData(RegionNames.INSIDE_THE_DRAGON_DEEP, required_items_events=["Inside the dragon - Cross to deeper part"]) + ], + RegionNames.INSIDE_THE_DRAGON_DEEP: [ + ExitData(RegionNames.INSIDE_THE_DRAGON_ORB, required_items_events=["Inside the dragon - Open door to dragon orb"]) + ] +} +events = { + RegionNames.INSIDE_THE_DRAGON: { + "Inside the dragon - Cross to deeper part": EventData( + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + "Inside the dragon - Grab the key": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT]) + + }, + RegionNames.INSIDE_THE_DRAGON_DEEP: { + "Inside the dragon - Open door to dragon orb": EventData( + required_items_events=["Inside the dragon - Grab the key"]) + }, + RegionNames.INSIDE_THE_DRAGON_ORB: { + "Inside the dragon - Flood with acid": EventData( + required_brush_techniques=[BrushTechniques.WATERSPOUT],needs_long_swim=True), + "Inside the dragon - Get Dragon Orb": EventData( + required_brush_techniques=[BrushTechniques.WATERSPOUT], needs_long_swim=True ,mandatory_enemies=[OkamiEnemies.TUBE_FOX]), + } + +} +locations = { + RegionNames.INSIDE_THE_DRAGON: { + "Inside the dragon - Clam on pillar near entrance": LocData(container_check_id(MapIds.INSIDE_THE_DRAGON, 3)), + "Inside the dragon - Freestanding Clam near entrance 1": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 4)), + "Inside the dragon - Freestanding Clam near entrance 2": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 0)), + "Inside the dragon - Freestanding Clam on high east pillar near entrance": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 1)), + "Inside the dragon - Clam on first pillar after tunnel": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 2), + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + "Inside the dragon - Clam on middle pillar after tunnel": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 5), + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + "Inside the dragon - Clam on last pillars after tunnel high": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 7), + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + "Inside the dragon - Clam on last pillars after tunnel low": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 6), + special_rule=HasAny(BrushTechniques.WATERSPOUT, "Holy Eagle")), + + # FIXME: Check if those really need digging champ + "Inside the dragon - Buried Clam near entrance west of river": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 9), type=LocationType.STONE_BURIED_CHEST), + "Inside the dragon - Buried Clam before small bridge": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 10), type=LocationType.STONE_BURIED_CHEST), + }, + RegionNames.INSIDE_THE_DRAGON_DEEP: { + "Inside the dragon - Chest in hidden waterspout area near origin mirror": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 8), required_brush_techniques=[BrushTechniques.WATERSPOUT]), + "Inside the dragon - Buried Clam After crossing pillars": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 11), type=LocationType.STONE_BURIED_CHEST), + "Inside the dragon - Buried Clam near origin mirror": LocData( + container_check_id(MapIds.INSIDE_THE_DRAGON, 12), type=LocationType.STONE_BURIED_CHEST), + } +} diff --git a/worlds/okamihd/RegionsData/r207.py b/worlds/okamihd/RegionsData/r207.py index 5f56113cc390..da9862f560b5 100644 --- a/worlds/okamihd/RegionsData/r207.py +++ b/worlds/okamihd/RegionsData/r207.py @@ -109,7 +109,7 @@ ) }, RegionNames.IMPERIAL_PALACE_FLASK_ROOM: { - "Imperial Palace - Kasugami": LocData(brush_check_id(16), type=LocationType.CONSTELLATION, + "Imperial Palace - Kasugami": LocData(brush_check_id(15), type=LocationType.CONSTELLATION, required_brush_techniques=[BrushTechniques.GALESTORM], power_slash_level=1,progress_type=LocationProgressType.EXCLUDED) }, diff --git a/worlds/okamihd/RegionsData/r20a.py b/worlds/okamihd/RegionsData/r20a.py new file mode 100644 index 000000000000..ee8c6835db67 --- /dev/null +++ b/worlds/okamihd/RegionsData/r20a.py @@ -0,0 +1,60 @@ +from typing import TYPE_CHECKING + +from rule_builder.rules import Has +from ..CheckIds import container_check_id, brush_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.WarpType import WarpType +from ..Types import LocData, ExitData, WarpData, EventData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.CATCALL_TOWER_BOTTOM: [ + ExitData(RegionNames.CATCALL_TOWER, loading_screen=False), + ], + RegionNames.CATCALL_TOWER: [ + ExitData(RegionNames.CATCALL_TOWER_TOP, loading_screen=False) + ] +} +events = { + RegionNames.CATCALL_TOWER_TOP: { + "Catcall Tower - Unlock warp": EventData() + } +} +locations = { + RegionNames.CATCALL_TOWER_BOTTOM: { + "Catcall Tower - Freestanding Chest in front of tower": LocData(container_check_id(MapIds.CATCALL_TOWER, 11)), + "Catcall Tower - Freestanding Chest on west pillar": LocData(container_check_id(MapIds.CATCALL_TOWER, 10), + required_brush_techniques=[ + BrushTechniques.CATWALK]), + "Catcall Tower - Freestanding Chest on east pillar": LocData(container_check_id(MapIds.CATCALL_TOWER, 9), + required_brush_techniques=[ + BrushTechniques.CATWALK]) + }, + RegionNames.CATCALL_TOWER: { + "Catcall Tower - Chest on 3rd cloud platform": LocData(container_check_id(MapIds.CATCALL_TOWER, 8)), + "Catcall Tower - Chest on stone platform above 3rd cloud platform": LocData( + container_check_id(MapIds.CATCALL_TOWER, 7)), + "Catcall Tower - Chest on 4th cloud platform": LocData(container_check_id(MapIds.CATCALL_TOWER, 6)), + "Catcall Tower - Chest on stone platform above 4th cloud platform": LocData( + container_check_id(MapIds.CATCALL_TOWER, 5)), + "Catcall Tower - Chest on 5th cloud platform": LocData(container_check_id(MapIds.CATCALL_TOWER, 4)), + }, + RegionNames.CATCALL_TOWER_TOP: { + "Catcall Tower - Freestanding chest near mermaid spring": LocData(container_check_id(MapIds.CATCALL_TOWER, 3)), + "Catcall Tower - Freestanding chest on top of tower 2F": LocData(container_check_id(MapIds.CATCALL_TOWER, 0)), + # Requires Feedbag fish - Maybe place one guaranteed in the tower ? + "Catcall Tower - Kabegami": LocData(brush_check_id(1),type=LocationType.CONSTELLATION), + "Catcall Tower - Freestanding chest on top of tower behind cat statue": LocData(container_check_id(MapIds.CATCALL_TOWER, 2)), + "Catcall Tower - Secret chest after climbing the tower twice": LocData(container_check_id(MapIds.CATCALL_TOWER, 1)), + } + +} +warps = { + RegionNames.CATCALL_TOWER_TOP: [ + WarpData(WarpType.MERMAID_SPRING, Has("Catcall Tower - Unlock warp"), Has("Catcall Tower - Unlock warp")) + ] +} diff --git a/worlds/okamihd/RegionsData/rf08.py b/worlds/okamihd/RegionsData/rf08.py index 6a5dda573bb7..6abc7f8f90c9 100644 --- a/worlds/okamihd/RegionsData/rf08.py +++ b/worlds/okamihd/RegionsData/rf08.py @@ -12,12 +12,13 @@ if TYPE_CHECKING: from .. import OkamiWorld -exits={ - RegionNames.TAKA_PASS:[ExitData(RegionNames.KUSA_VILLAGE), - ExitData(RegionNames.SASA_SANCTUARY_ENTRANCE), - ExitData(RegionNames.CITY_CHECKPOINT_TAKA), - ExitData(RegionNames.TAKA_COMMON_LOGIC, one_way=True, loading_screen=False) - ] +exits = { + RegionNames.TAKA_PASS: [ExitData(RegionNames.KUSA_VILLAGE), + ExitData(RegionNames.SASA_SANCTUARY_ENTRANCE), + ExitData(RegionNames.CITY_CHECKPOINT_TAKA), + ExitData(RegionNames.TAKA_COMMON_LOGIC, one_way=True, loading_screen=False), + ExitData(RegionNames.TAKA_PASS_CAVE,required_items_events=["Taka Pass - Open Digging Cave"]) + ] } events = { @@ -25,7 +26,8 @@ "Taka Pass - Clear Devil gate near waterfall": EventData( mandatory_enemies=[OkamiEnemies.BUD_OGRE, OkamiEnemies.YELLOW_IMP]), "Taka Pass - Save Chun": EventData(cherry_bomb_level=1, mandatory_enemies=[OkamiEnemies.CUTTERS], - required_items_events=["Satomi Power Orb (Tei)"]) + required_items_events=["Satomi Power Orb (Tei)"]), + "Taka Pass - Open Digging Cave": EventData(required_items_events=["Digging Champ"]) } } diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py index 575f22c40bc4..922bddfa982c 100644 --- a/worlds/okamihd/RegionsData/rf09.py +++ b/worlds/okamihd/RegionsData/rf09.py @@ -7,7 +7,7 @@ from ..Enums.RegionNames import RegionNames if TYPE_CHECKING: - pass + from .. import OkamiWorld exits = { RegionNames.CURSED_RYOSHIMA_COAST: [ diff --git a/worlds/okamihd/RegionsData/rf0a.py b/worlds/okamihd/RegionsData/rf0a.py index 63902ebc299a..0caf72916d63 100644 --- a/worlds/okamihd/RegionsData/rf0a.py +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -10,7 +10,7 @@ from ..Enums.RegionNames import RegionNames, MapIds if TYPE_CHECKING: - pass + from .. import OkamiWorld exits = { RegionNames.RYOSHIMA_COAST: [ @@ -23,7 +23,10 @@ ExitData(RegionNames.ANKOKU_TEMPLE), ExitData(RegionNames.FAWNS_HOUSE, required_items_events=["Ryoshima Coast - Open Shortcut To Mme Fawn's"]), ExitData(RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON, one_way=True, - required_items_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False) + required_items_events=["Ryoshima Coast - Open Lunar Lagoon"], loading_screen=False), + ExitData(RegionNames.RYOSHIMA_COAST_BANDIT_SPIDER,required_items_events=["Ryoshima Coast - Open Bandit Spider Cave"],one_way=True), + ExitData(RegionNames.SEIAN_CITY_TREASURE_EAST,required_items_events=["Ryoshima Coast - Open shortcut to Sei-an City"]) + ], RegionNames.RYOSHIMA_COAST_SEA: [ ExitData(RegionNames.RYOSHIMA_COAST_DOJO, needs_long_swim=True, loading_screen=False), @@ -44,11 +47,12 @@ RegionNames.RYOSHIMA_COAST_SEIAN: [ # Special Handling for the encounter around Seian, city entrance as the enemies inside require galestrom to be beaten. ExitData(RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER, one_way=True, loading_screen=False), - ExitData(RegionNames.SEIAN_CITY_COMMONERS_DRY) + ExitData(RegionNames.SEIAN_CITY_COMMONERS_DRY), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT, required_items_events=["Ryoshima Coast - Open Door to North Ryoshima Coast"],one_way=True) ], RegionNames.RYOSHIMA_COAST_LUNAR_LAGOON: [ ExitData(RegionNames.RYOSHIMA_COAST_SEA, one_way=True, loading_screen=False,needs_long_swim=True), - ExitData(RegionNames.SUNKEN_SHIP_ENTRANCE) + ExitData(RegionNames.SUNKEN_SHIP_ENTRANCE,one_way=True) ], RegionNames.RYOSHIMA_COAST_WEST_PIER: [ ExitData(RegionNames.RYOSHIMA_COAST_SEA, loading_screen=False) @@ -62,8 +66,10 @@ "Ryoshima Coast - Open Lunar Lagoon": EventData(required_items_events=["Holy Eagle"], required_brush_techniques=[BrushTechniques.CRESCENT]), "Ryoshima Coast - Open Shortcut To Mme Fawn's": EventData(), - # FIXME: Fill Enemies - "Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance": EventData(mandatory_enemies=[]) + "Ryoshima Coast - Clear Devil Gate near North Ryoshima Coast Entrance": EventData(mandatory_enemies=[OkamiEnemies.ICE_LIPS,OkamiEnemies.THUNDER_EAR]), + "Ryoshima Coast - Open Bandit Spider Cave": EventData(required_items_events=["Digging Champ"]), + "Ryoshima Coast - Open shortcut to Sei-an City":EventData(required_items_events=["Dragon Palace - Give Dragon Orb to Otohime"]) + }, RegionNames.RYOSHIMA_COAST_CATWALK_TOWER: { "Ryoshima Coast - Climb back to main area": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT]) @@ -75,6 +81,9 @@ }, RegionNames.RYOSHIMA_COAST_SEIAN_ENCOUNTER: { "Ryoshima Coast - Mandatory Ubume Encounter": EventData(mandatory_enemies=[OkamiEnemies.UBUME]) + }, + RegionNames.RYOSHIMA_COAST_SEIAN:{ + "Ryoshima Coast - Open Door to North Ryoshima Coast":EventData(required_items_events=["Himiko's Palace - Hear Himiko's request"]) } } locations = { diff --git a/worlds/okamihd/RegionsData/rf0c.py b/worlds/okamihd/RegionsData/rf0c.py new file mode 100644 index 000000000000..82c550ca9e36 --- /dev/null +++ b/worlds/okamihd/RegionsData/rf0c.py @@ -0,0 +1,258 @@ +from typing import TYPE_CHECKING + +from rule_builder.rules import True_, Has, HasAny, Or +from ..CheckIds import shop_check_id, container_check_id, brush_check_id +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.LocationType import LocationType +from ..Enums.OkamiEnemies import OkamiEnemies +from ..Enums.WarpType import WarpType +from ..Rules import long_swim_rule, n_ryoshima_guardian_sapling_rule, n_ryoshima_islands_dragon_rule +from ..Types import ExitData, EventData, LocData, WarpData +from ..Enums.RegionNames import RegionNames, MapIds + +if TYPE_CHECKING: + from .. import OkamiWorld + +exits = { + RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT: [ + ExitData(RegionNames.RYOSHIMA_COAST_SEIAN, one_way=True, loading_screen=False, + required_items_events=["Northern Ryoshima Coast - Mandatory Earth Nose Fight"]), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False, + required_items_events=["Northern Ryoshima Coast - Mandatory Earth Nose Fight"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT, one_way=True, loading_screen=False), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER, one_way=True, loading_screen=False), + # Special rule to account for Orca + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_SAPLING, loading_screen=False, + special_rule=n_ryoshima_guardian_sapling_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB, loading_screen=False, one_way=True, + required_items_events=["Northern Ryoshima Coast - Climb to Tomb Cave"]), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_NORTH, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_UMI), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_SEA, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule), + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_TREASURE_CAVE, + required_items_events=["Northern Ryoshima Coast - Open Treasure Cave"]), + ExitData(RegionNames.DRAGON_PALACE, loading_screen=False, + special_rule=n_ryoshima_islands_dragon_rule,required_items_events=["Northern Ryoshima Coast - Open Whirlpool"]), + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS, one_way=True, loading_screen=False, + required_items_events=["Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST, one_way=True, loading_screen=False) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_ISLAND: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_CAVE, + required_items_events=["Northern Ryoshima Coast - Open Power Slash 2 Cave"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_CAVE, + required_items_events=["Northern Ryoshima Coast - Open Cherry Bomb 2 Cave"]) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND: [ + ExitData(RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_CAVE, + required_items_events=["Northern Ryoshima Coast - Open Bandit Spider Cave"], + one_way=True) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_ISLAND:[ + ExitData(RegionNames.CATCALL_TOWER_BOTTOM) + ] +} +events = { + RegionNames.NORTHERN_RYOSHIMA_COAST_MANDATORY_FIGHT: { + "Northern Ryoshima Coast - Mandatory Earth Nose Fight": EventData(mandatory_enemies=[OkamiEnemies.EARTH_NOSE]) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST: { + "Northern Ryoshima Coast - Unlock Warp Points": EventData(), + ## Needs Holy eagle or to be able to swim to access the statue + "Northern Ryoshima Coast - Climb to Watcher's Cape": EventData( + required_brush_techniques=[BrushTechniques.CATWALK], special_rule=Or(long_swim_rule, Has("Holy Eagle"))), + "Northern Ryoshima Coast - Climb to Tomb Cave": EventData(required_brush_techniques=[BrushTechniques.CATWALK]), + "Northern Ryoshima Coast - Meet Orca": EventData(required_brush_techniques=[BrushTechniques.SUNRISE], + event_item_name="Orca"), + "Northern Ryoshima Coast - Open Treasure Cave": EventData(required_items_events=["Digging Champ"]), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS_ENCOUNTER: { + "Northern Ryoshima Coast - Mandatory encounter in Watcher's Cape": EventData( + mandatory_enemies=[OkamiEnemies.BLUE_CYCLOPS]), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS:{ + "Northern Ryoshima Coast - Open Whirlpool":EventData(required_brush_techniques=[BrushTechniques.GALESTORM]), + "Northern Ryoshima Coast - Open Bridge to Oni Island":EventData(required_items_events=["Himiko's Palace - Get Oni Island Location"]) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND: { + "Northern Ryoshima Coast - Fish Marlin": EventData( + type=LocationType.FISHING_MINIGAME, + required_items_events=["Marlin Rod"]) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_PS2_ISLAND: { + "Northern Ryoshima Coast - Open Power Slash 2 Cave": EventData(power_slash_level=1) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND: { + "Northern Ryoshima Coast - Open Cherry Bomb 2 Cave": EventData(cherry_bomb_level=1) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND: { + "Northern Ryoshima Coast - Open Bandit Spider Cave": EventData(required_items_events=["Digging Champ"]) + } +} +locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST_UMI: { + "Northern Ryoshima Coast - Kazegami (Whirlwind)": LocData( + brush_check_id(24), required_items_events=["Northern Ryoshima Coast - Fish Marlin"], + type=LocationType.CONSTELLATION), + "Northern Ryoshima Coast - Chest after Whirlwind": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 0), + required_items_events=["Northern Ryoshima Coast - Fish Marlin"]), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST: { + + "Northern Ryoshima Coast - Buried Chest southwest on mainland": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 3), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Buried Chest southwest of Umi's restaurant": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 7), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Buried Chest on eastern beach mainland": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 8), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Buried Chest near Yoichi": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 18), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Buried Chest near Tomb cave entrance": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 22), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - West underwater clam near Umi's restaurant 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 26), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - West underwater clam near Umi's restaurant 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 27), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - East underwater clam near Umi's restaurant": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 28), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam near mainland east beach 1 ": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 29), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam near mainland east beach 2 ": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 30), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam near mainland east beach 3 ": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 31), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam near mainland east beach 4 ": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 32), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater chest in river 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 36), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater chest in river 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 37), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater chest in river 3": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 39), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater chest in river 4": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 38), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Buried Chest south of ultimate origin mirror": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 42), type=LocationType.BURIED_CHEST), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WATCHERS: { + "Northern Ryoshima Coast - Buried Chest in watcher's cape": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 5), type=LocationType.BURIED_CHEST) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_SAPLING: { + "Northern Ryoshima Coast - Buried Chest on guardian sapling island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 9), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Freestanding Chest on guardian sapling island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 67)) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_TOMB: { + "Northern Ryoshima Coast - Chest in Tomb Cave 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 19)), + "Northern Ryoshima Coast - Chest in Tomb Cave 3": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 20)), + "Northern Ryoshima Coast - Chest in Tomb Cave 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 21)) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_MIST_WARP: { + "Northern Ryoshima Coast - Chest in secret Mist Warp Area": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 33)) + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_CATCALL_NORTH: { + "Northern Ryoshima Coast - Southern Buried Chest on island north of catcall tower": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 11), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Northern Buried Chest on island north of catcall tower": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 91), type=LocationType.BURIED_CHEST), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_CB2_ISLAND: { + "Northern Ryoshima Coast - Burning Chest on Cherry Bomb 2 Island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 12), type=LocationType.BURNING_CHEST), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_WESTERN_ISLAND: { + "Northern Ryoshima Coast - Buried Chest on Westernmost island beach": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 17), type=LocationType.BURIED_CHEST), + "Northern Ryoshima Coast - Freestanding Chest on Westernmost island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 24)), + "Northern Ryoshima Coast - Underwater Clam on Westernmost island beach 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 75), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam on Westernmost island beach 3": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 76), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Underwater Clam on Westernmost island beach 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 77), type=LocationType.UNDERWATER_CHEST_SHALLOW), + "Northern Ryoshima Coast - Buried Chest on Westernmost island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 83), type=LocationType.BURIED_CHEST), + }, + RegionNames.NORTHERN_RYOSHIMA_COAST_BANDIT_SPIDER_ISLAND: { + "Northern Ryoshima Coast - Buried Chest on bandit spider island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 25), type=LocationType.BURIED_CHEST), + }, + # All of these require Orca, even though you can get some without - This is for bot my and the player's sanity + RegionNames.NORTHERN_RYOSHIMA_COAST_SEA: { + "Northern Ryoshima Coast - Underwater Clam on rocks west of watcher's cape": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 95), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks north of Guardian Sapling": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 96), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks southwest of watcher's cape": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 97), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks north of bandit spider island": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 98), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks west of watcher's cape 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 99), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks between Power Slash 2 and Cherry Bomb 2 Island 1": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 100), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks between Power Slash 2 and Cherry Bomb 2 Island 2": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 101), type=LocationType.UNDERWATER_CHEST), + "Northern Ryoshima Coast - Underwater Clam on rocks north of Catcall Tower": LocData( + container_check_id(MapIds.NORTHERN_RYOSHIMA, 102), type=LocationType.UNDERWATER_CHEST) + } +} +warps = { + RegionNames.NORTHERN_RYOSHIMA_COAST: [ + WarpData(WarpType.MIST_WARP, Has("Northern Ryoshima Coast - Unlock Warp Points"), + Has("Northern Ryoshima Coast - Unlock Warp Points")), + WarpData(WarpType.MERMAID_SPRING, Has("Northern Ryoshima Coast - Unlock Warp Points"), + Has("Northern Ryoshima Coast - Unlock Warp Points")) + ], + RegionNames.NORTHERN_RYOSHIMA_COAST_MIST_WARP: [ + WarpData(WarpType.MIST_WARP, Has("Northern Ryoshima Coast - Unlock Warp Points"), + Has("Northern Ryoshima Coast - Unlock Warp Points")) + ] +} +shop_locations = { + RegionNames.NORTHERN_RYOSHIMA_COAST: { + "Northern Ryoshima Coast - Shop Slot 1": LocData(shop_check_id(11, 0), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 2": LocData(shop_check_id(11, 1), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 3": LocData(shop_check_id(11, 2), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 4": LocData(shop_check_id(11, 3), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 5": LocData(shop_check_id(11, 4), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 6": LocData(shop_check_id(11, 5), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 7": LocData(shop_check_id(11, 6), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 8": LocData(shop_check_id(11, 7), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 9": LocData(shop_check_id(11, 8), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 10": LocData(shop_check_id(11, 9), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 11": LocData(shop_check_id(11, 10), type=LocationType.SHOP), + "Northern Ryoshima Coast - Shop Slot 12": LocData(shop_check_id(11, 11), type=LocationType.SHOP), + } +} diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index 9949b8a961ce..a54109ff0cab 100644 --- a/worlds/okamihd/Rules.py +++ b/worlds/okamihd/Rules.py @@ -12,13 +12,12 @@ if TYPE_CHECKING: from . import OkamiWorld +long_swim_rule: Rule = HasAny("Water Tablet", BrushTechniques.GREENSPROUT_WATERLILY) -has_portable_fire_source_strict:Rule= And(Or(Has(DivineInstruments.SOLAR_FLARE.value.item_name), - Has("Progressive Mirror", 4)), Has(BrushTechniques.INFERNO)) - - -has_portable_fire_source: Rule = Or(has_portable_fire_source_strict,Has(BrushTechniques.FIREBURST)) +has_portable_fire_source_strict: Rule = And(Or(Has(DivineInstruments.SOLAR_FLARE.value.item_name), + Has("Progressive Mirror", 4)), Has(BrushTechniques.INFERNO)) +has_portable_fire_source: Rule = Or(has_portable_fire_source_strict, Has(BrushTechniques.FIREBURST)) has_portable_thunder_source: Rule = Or(And(Or(Has(DivineInstruments.THUNDER_EDGE.value.item_name), Has("Progressive Sword", 5)), Has(BrushTechniques.THUNDERSTORM)), @@ -31,6 +30,10 @@ gale_shrine_access: Rule = HasGroup("canine_warriors", count=FromOption(RequiredDoggorbs)) moon_cave_access: Rule = Has("Serpent Crystal") +n_ryoshima_islands_dragon_rule: Rule = Or(Has("Orca"), HasAll("Water Tablet", "Inside the dragon - Get Dragon Orb")) + +n_ryoshima_guardian_sapling_rule:Rule= Or(long_swim_rule,Has("Orca")) + # Probably should be removed;Directly add it to the checks that require it. @@ -43,8 +46,9 @@ def has_soup_ingerdients(state: CollectionState, world: "OkamiWorld", amount: in moon_cave_fire_rule: Rule = Or(has_portable_fire_source, HasAll("Moon Cave - 3F Push the ball", BrushTechniques.INFERNO)) -#Fireburst doesn't light the canons' fuse. -moon_cave_canon_rule: Rule = Or(has_portable_fire_source_strict,HasAll("Moon Cave - 3F Push the ball",BrushTechniques.INFERNO)) +# Fireburst doesn't light the canons' fuse. +moon_cave_canon_rule: Rule = Or(has_portable_fire_source_strict, + HasAll("Moon Cave - 3F Push the ball", BrushTechniques.INFERNO)) moon_cave_4f_fire_rule: Rule = Or(has_portable_fire_source, HasAll("Moon Cave - 4F Move Fireball", BrushTechniques.INFERNO)) @@ -146,6 +150,12 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even required_cherry_bomb_level = max(required_cherry_bomb_level, 1) required_techinques += [BrushTechniques.GREENSPROUT_BLOOM, BrushTechniques.WATERSPOUT, BrushTechniques.GALESTORM] + case LocationType.DIGGING_MINIGAME_HARD: + required_power_slash_level = max(required_power_slash_level, 1) + required_cherry_bomb_level = max(required_cherry_bomb_level, 1) + required_techinques += [BrushTechniques.GREENSPROUT_BLOOM, BrushTechniques.WATERSPOUT, + BrushTechniques.GALESTORM] + rules.append(HasAll("Holy Eagle","Golden Ink Pot")) case LocationType.FROZEN_CHEST: rules.append(HasAny(BrushTechniques.INFERNO,BrushTechniques.FIREBURST)) case LocationType.FISHING_MINIGAME: @@ -157,7 +167,7 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even required_techinques += [] if data.needs_long_swim: - rules.append(HasAny("Water Tablet", BrushTechniques.GREENSPROUT_WATERLILY)) + rules.append(long_swim_rule) if len(required_techinques) > 0: rules.append(HasAll(*required_techinques)) @@ -190,11 +200,15 @@ def apply_event_or_location_rules(loc: Location, name: str, data: LocData | Even def apply_exit_rules(etr: Entrance, name: str, data: ExitData, world: "OkamiWorld"): rules: List[Rule] = [] if data.needs_long_swim: - rules.append(HasAny("Water Tablet", BrushTechniques.GREENSPROUT_WATERLILY)) + rules.append(long_swim_rule) if len(data.required_items_events) > 0: rules.append(HasAll(*data.required_items_events)) + if data.special_rule is not None: + # Append special rule if it's defined + rules.append(data.special_rule) + if len(rules) > 0: final_rule = And(*rules) world.set_rule(etr, final_rule) @@ -202,5 +216,6 @@ def apply_exit_rules(etr: Entrance, name: str, data: ExitData, world: "OkamiWorl def set_completion_rules(world: "OkamiWorld"): world.set_completion_rule(HasAll("Moon Cave - Defeat Orochi", "Gale Shrine - Defeat Crimson Helm", - "Tsuta Ruins - Defeat the spider queen","Himiko's Palace - Cross sea of fire","Imperial Palace - Defeat Blight")) + "Tsuta Ruins - Defeat the spider queen", "Himiko's Palace - Cross sea of fire", + "Imperial Palace - Defeat Blight")) return diff --git a/worlds/okamihd/Types.py b/worlds/okamihd/Types.py index 71ec5262621d..f8c9448a95b6 100644 --- a/worlds/okamihd/Types.py +++ b/worlds/okamihd/Types.py @@ -69,6 +69,7 @@ class ExitData(NamedTuple): needs_long_swim: bool = False one_way: bool = False loading_screen: bool = True + special_rule:Rule | None = None class WarpData(NamedTuple):