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/OkamiEnemies.py b/worlds/okamihd/Enums/OkamiEnemies.py index 50a7c3d1d0da..71aeade71640 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,14 @@ class OkamiEnemies(Enum): CRIMSON_HELM = EnnemyData(0x11, "Crimson Helm", 1, required_techniques=[BrushTechniques.GALESTORM]) FIRE_EYE = EnnemyData(0x52, "Fire Eye", 1) OROCHI_1 = EnnemyData(0x69, "Orochi (Moon Cave)", 1, required_techniques=[BrushTechniques.WATERSPOUT]) - ICE_LIPS = EnnemyData(0x53, "Ice Lips",1) + UBUME = EnnemyData(0x58, "Ubume", 1, required_techniques=[BrushTechniques.GALESTORM]) + 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) + 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 077799c48c2d..a6d5e69f2cac 100644 --- a/worlds/okamihd/Enums/RegionNames.py +++ b/worlds/okamihd/Enums/RegionNames.py @@ -124,6 +124,96 @@ 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)" + + # 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_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)" + 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)" + 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)" + SEIAN_CITY_BLOSSOM = "Sei-an City (Blossom's house)" + + ### 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)" + 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)" + 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 + ### 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 MIST_WARP_HUB = "Mist Warp Hub" @@ -137,6 +227,7 @@ class MapIds(Enum): KAMIKI_VILLAGE = 0x102 HANA_VALLEY = 0x103 TSUTA_RUINS = 0x104 + CITY_CHECKPOINT = 0x105 GALE_SHRINE = 0x107 KUSA_VILLAGE = 0x108 SASA_SANCTUARY = 0x109 @@ -144,12 +235,20 @@ class MapIds(Enum): CALCIFIED_CAVERN = 0x10E MOON_CAVE = 0x110 RIVER_OF_THE_HEAVENS = 0x122 + SEIAN_ARISTORATIC = 0x200 + SEIAN_COMMONERS = 0x201 + HIMIKO_PALACE = 0x202 + SUNKEN_SHIP = 0x205 + IMPERIAL_PALACE = 0x206 + IMPERIAL_PALACE_SMALL = 0x207 CURSED_SHINSHU = 0xF01 HEALED_SHINSHU = 0xF02 CURSED_AGATA = 0xF03 HEALED_AGATA = 0xF04 CURSED_TAKA = 0xF07 HEALED_TAKA = 0xF08 + CURSED_RYOSHIMA = 0xF09 + HEALED_RYOSHIMA = 0xF0A class MapIndexes(Enum): @@ -158,6 +257,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 @@ -165,6 +265,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 diff --git a/worlds/okamihd/Items.py b/worlds/okamihd/Items.py index 8c2462b6cb94..3ab69181691f 100644 --- a/worlds/okamihd/Items.py +++ b/worlds/okamihd/Items.py @@ -110,7 +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), - "Golden Ink Pot": ItemData(0x98, ItemClassification.useful), + "Golden Ink Pot": ItemData(0x98, ItemClassification.progression), "Fire Tablet": ItemData(0x9d, ItemClassification.progression) } @@ -150,20 +150,16 @@ def create_static_precollected_item_list(world: "OkamiWorld") -> List[Item]: # "Oddly Shaped Turnip": ItemData(0x41, ItemClassification.progression) } useful_items = { - # Useful items - Counts here are invalid, it's intended, to not fill the item pool with these - "Sun Fragment": ItemData(0x05, ItemClassification.useful, count_in_pool=4), # Should be 12 - "Astral Pouch": ItemData(0x06, ItemClassification.useful, count_in_pool=0), # Intended - "Stray Bead": ItemData(0xCC, ItemClassification.useful, count_in_pool=0), - # Should be 99, set to 0 for now cause they mess with container collection states + # 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=6), # Should be 12 + "Astral Pouch": ItemData(0x06, ItemClassification.useful,count_in_pool=0),# Intended + "Stray Bead": ItemData(0xCC, ItemClassification.useful,count_in_pool=0),# Should be 99, set to 0 for now cause they mess with container collection states # 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... + "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=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 = { @@ -285,6 +281,7 @@ def create_static_precollected_item_list(world: "OkamiWorld") -> List[Item]: **useful_items, **quest_items, **filler_items, + **quest_items, **event_items, **weapons_items, **progressive_weapons, diff --git a/worlds/okamihd/RegionsData/__init__.py b/worlds/okamihd/RegionsData/__init__.py index 4edf9327bd21..845311483359 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,r10a +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 if TYPE_CHECKING: from .. import OkamiWorld @@ -13,6 +13,7 @@ **r102.exits, **r103.exits, **r104.exits, + **r105.exits, **r107.exits, **r108.exits, **r109.exits, @@ -20,13 +21,21 @@ **r10e.exits, **r110.exits, **r122.exits, + **r200.exits, + **r201.exits, + **r202.exits, + **r205.exits, + **r206.exits, + **r207.exits, **rf01.exits, **rf02.exits, **rf03.exits, **rf04.exits, **rf06.exits, **rf07.exits, - **rf08.exits + **rf08.exits, + **rf09.exits, + **rf0a.exits, } okami_locations = { @@ -35,6 +44,7 @@ **r102.locations, **r103.locations, **r104.locations, + **r105.locations, **r107.locations, **r108.locations, **r109.locations, @@ -42,13 +52,21 @@ **r10e.locations, **r110.locations, **r122.locations, + **r200.locations, + **r201.locations, + **r202.locations, + **r205.locations, + **r206.locations, + **r207.locations, **rf01.locations, **rf02.locations, **rf03.locations, **rf04.locations, **rf06.locations, **rf07.locations, - **rf08.locations + **rf08.locations, + **rf09.locations, + **rf0a.locations, } okami_events = { @@ -57,6 +75,7 @@ **r102.events, **r103.events, **r104.events, + **r105.events, **r107.events, **r108.events, **r109.events, @@ -64,31 +83,46 @@ **r10e.events, **r110.events, **r122.events, + **r200.events, + **r201.events, + **r202.events, + **r205.events, + **r206.events, + **r207.events, **rf01.events, **rf02.events, **rf03.events, **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 okami_shop_locations = { **getattr(r102, 'shop_locations', {}), + **getattr(r105, 'shop_locations', {}), **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', {}), + **getattr(rf0a, 'shop_locations', {}), } -okami_warps={ +okami_warps = { **r102.warps, + **r105.warps, **r108.warps, **r109.warps, + **r200.warps, **rf02.warps, **rf04.warps, **rf08.warps, -} \ No newline at end of file + **rf0a.warps, + +} diff --git a/worlds/okamihd/RegionsData/r105.py b/worlds/okamihd/RegionsData/r105.py new file mode 100644 index 000000000000..ae544de0d825 --- /dev/null +++ b/worlds/okamihd/RegionsData/r105.py @@ -0,0 +1,100 @@ +from typing import TYPE_CHECKING + +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 ..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 + +if TYPE_CHECKING: + pass + +exits = { + RegionNames.CITY_CHECKPOINT_TAKA: [ + ExitData(RegionNames.CITY_CHECKPOINT_DRAWBRIDGE, + required_items_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), + ExitData(RegionNames.CURSED_RYOSHIMA_COAST), + ExitData(RegionNames.RYOSHIMA_COAST, required_items_events=["Ryoshima Coast - Bloom the Guardian Sapling"]) + ], + +} +events = { + RegionNames.CITY_CHECKPOINT_TAKA: { + # 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( + 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],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]), + }, + 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), 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), + "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), + } +} + +warps = { + RegionNames.CITY_CHECKPOINT_TAKA: [ + WarpData(type=WarpType.MIST_WARP, trigger_warp_to=True_, trigger_warp_from=True_) + ] +} diff --git a/worlds/okamihd/RegionsData/r200.py b/worlds/okamihd/RegionsData/r200.py new file mode 100644 index 000000000000..3953a37e4707 --- /dev/null +++ b/worlds/okamihd/RegionsData/r200.py @@ -0,0 +1,165 @@ +from typing import TYPE_CHECKING + +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 +from ..Enums.RegionNames import RegionNames, MapIds +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 + +exits = { + RegionNames.SEIAN_CITY_BRIDGE_COMMONERS: [ + ExitData(RegionNames.SEIAN_CITY_BRIDGE_ARISTOCRATIC, + required_items_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, + required_items_events=["Sei-an City (Aristocratic Quarter) - Climb clock tower"]), + ExitData(RegionNames.SEIAN_CITY_ARISTOCRATIC, loading_screen=False, + required_items_events=["Imperial Palace - 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), + 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.HIMIKO_PALACE) + ] +} +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, 14)), + "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_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( + 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)), + }, + # 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( + 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)), + #"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( + 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": 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, Has("Imperial Palace - Defeat Blight"), Has("Imperial Palace - Defeat Blight")) + ] +} diff --git a/worlds/okamihd/RegionsData/r201.py b/worlds/okamihd/RegionsData/r201.py new file mode 100644 index 000000000000..44bd0feb0530 --- /dev/null +++ b/worlds/okamihd/RegionsData/r201.py @@ -0,0 +1,162 @@ +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_COMMONERS_DRY: [ + 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), + 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, + required_items_events=["Sei-an City (Commoner's Quarter) - Blow up wall to southwest building"]), + ExitData(RegionNames.SEIAN_CITY_TAO, + 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) + ], + 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), + }, + 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_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( + required_items_events=["Golden Mushroom"]) + } +} +locations = { + # 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( + container_check_id(MapIds.SEIAN_COMMONERS, 0), type=LocationType.UNDERWATER_CHEST), + "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 eastern Canal empty Ferry Stop": LocData( + container_check_id(MapIds.SEIAN_COMMONERS, 3), type=LocationType.UNDERWATER_CHEST), + "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 eastern canal under balcony": LocData( + 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 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 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), + "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, 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)), + }, + 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), + }, + RegionNames.SEIAN_CITY_SOUTHWEST: { + "Sei-an City (Commoner's quarter) - Chest in southwest building, 1F southwest Rafters": LocData( + 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, 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, 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, 30)), + "Sei-an City (Commoner's quarter) - Chest in southwest building, GF near Cage": LocData( + 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, 32)), + "Sei-an City (Commoner's quarter) - Buried Chest near west buildings": LocData( + 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, 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, 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 = { + 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) + }, + 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), + } +} diff --git a/worlds/okamihd/RegionsData/r202.py b/worlds/okamihd/RegionsData/r202.py new file mode 100644 index 000000000000..cc2505a1d2ad --- /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,required_items_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) + } +} diff --git a/worlds/okamihd/RegionsData/r205.py b/worlds/okamihd/RegionsData/r205.py new file mode 100644 index 000000000000..7be5a4220ab3 --- /dev/null +++ b/worlds/okamihd/RegionsData/r205.py @@ -0,0 +1,145 @@ +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.SUNKEN_SHIP_ENTRANCE: [ + ExitData(RegionNames.SUNKEN_SHIP_SW_LOW, required_items_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, + 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, + required_items_events=["Sunken Ship - Raise water level"]), + ExitData(RegionNames.SUNKEN_SHIP_HANDS_LOW, one_way=True, loading_screen=False, + 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, + required_items_events=["Sunken Ship - Drain water level"]), + ExitData(RegionNames.SUNKEN_SHIP_BONES_HIGH, loading_screen=False, + required_items_events=["Sunken Ship - Open Northwest cursed door"]) + ], + RegionNames.SUNKEN_SHIP_BONES_HIGH: [ + 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), + 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, + required_items_events=["Sunken Ship - climb Waterspout pillar to southwest room"]), + ExitData(RegionNames.SUNKEN_SHIP_S_LEDGE, loading_screen=False, one_way=True, + required_items_events=["Sunken Ship - climb Waterspout pillar to southwest room"]), + ExitData(RegionNames.SUNKEN_SHIP_TREASURE, loading_screen=False, + required_items_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/r206.py b/worlds/okamihd/RegionsData/r206.py new file mode 100644 index 000000000000..9014e19d423a --- /dev/null +++ b/worlds/okamihd/RegionsData/r206.py @@ -0,0 +1,46 @@ +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.IMPERIAL_PALACE_ENTRANCE: [ + ExitData(RegionNames.IMPERIAL_PALACE_SMALL_ENTRANCE, required_items_events=["Imperial Palace - Become Smol"]), + ExitData(RegionNames.IMPERIAL_PALACE, required_items_events=["Imperial Palace - Defeat Blight"]) + ], + +} +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 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..5f56113cc390 --- /dev/null +++ b/worlds/okamihd/RegionsData/r207.py @@ -0,0 +1,141 @@ +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 +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, + required_items_events=["Imperial Palace - Mandatory Thunder Doom Mirror Encounter"]), + ExitData(RegionNames.IMPERIAL_PALACE_WEST_CAVE, + required_items_events=["Imperial Palace - Open west side lockjaw"]) + ], + RegionNames.IMPERIAL_PALACE_WEST_CAVE: [ + 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, required_items_events=["Holy Eagle"], one_way=True, + loading_screen=False), + ExitData(RegionNames.IMPERIAL_PALACE_FLASK_ROOM, + 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, + required_items_events=["Imperial Palace - Outspeed the spider"]) + ], + RegionNames.IMPERIAL_PALACE_FEET_HELL: [ + 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, required_items_events=["Imperial Palace - Cross the Sozu"]) + ], + RegionNames.IMPERIAL_PALACE_EMPERORS_ROOM:[ + # Also should require Veil of Mist: + # 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 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,required_items_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,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), + 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 - Blight Reward":LocData(999,required_items_events=["Imperial Palace - Defeat Blight"],progress_type=LocationProgressType.EXCLUDED) + } + +} diff --git a/worlds/okamihd/RegionsData/rf04.py b/worlds/okamihd/RegionsData/rf04.py index 0d5ffd77a5b9..b58c6ad3dd6b 100644 --- a/worlds/okamihd/RegionsData/rf04.py +++ b/worlds/okamihd/RegionsData/rf04.py @@ -45,7 +45,7 @@ "Agata Forest - Fill Kushi's Barrel": EventData(required_brush_techniques=[BrushTechniques.WATERSPOUT],required_items_events=["Satomi Power Orb (Tei)"]), "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], @@ -117,8 +117,9 @@ "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,progress_type=LocationProgressType.EXCLUDED), + ## 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 - Yumigami": LocData(brush_check_id(18), type=LocationType.CONSTELLATION, # bit 18 required_items_events=["Agata Forest - Fish Whopper with Kokari"],progress_type=LocationProgressType.EXCLUDED) } diff --git a/worlds/okamihd/RegionsData/rf08.py b/worlds/okamihd/RegionsData/rf08.py index c937ebefcfb2..6a5dda573bb7 100644 --- a/worlds/okamihd/RegionsData/rf08.py +++ b/worlds/okamihd/RegionsData/rf08.py @@ -12,11 +12,12 @@ if TYPE_CHECKING: from .. import OkamiWorld -exits = { - RegionNames.TAKA_PASS: [ExitData(RegionNames.KUSA_VILLAGE), - ExitData(RegionNames.SASA_SANCTUARY_ENTRANCE), - 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) + ] } events = { diff --git a/worlds/okamihd/RegionsData/rf09.py b/worlds/okamihd/RegionsData/rf09.py new file mode 100644 index 000000000000..575f22c40bc4 --- /dev/null +++ b/worlds/okamihd/RegionsData/rf09.py @@ -0,0 +1,39 @@ +from typing import TYPE_CHECKING + +from rule_builder.rules import True_ +from ..Enums.BrushTechniques import BrushTechniques +from ..Enums.WarpType import WarpType +from ..Types import ExitData, EventData, LocData, WarpData +from ..Enums.RegionNames import RegionNames + +if TYPE_CHECKING: + pass + +exits = { + RegionNames.CURSED_RYOSHIMA_COAST: [ + ExitData(RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE, + required_items_events=["Ryoshima Coast - Open Guardian Sapling Cave"], loading_screen=False) + ], + RegionNames.CURSED_RYOSHIMA_COAST_GUARDIAN_SAPLING_CAVE: [ + ExitData(RegionNames.RYOSHIMA_COAST, required_items_events=["Ryoshima Coast - Bloom the Guardian Sapling"], one_way=True) + ] +} +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 = { +} +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 new file mode 100644 index 000000000000..63902ebc299a --- /dev/null +++ b/worlds/okamihd/RegionsData/rf0a.py @@ -0,0 +1,207 @@ +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 ..Enums.WarpType import WarpType +from ..Types import ExitData, EventData, LocData, WarpData +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, + 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, 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) + ], + 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, + 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, + required_items_events=["Ryoshima Coast - Mandatory Ubume Encounter"]), + ExitData(RegionNames.RYOSHIMA_COAST, loading_screen=False, one_way=True, + 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. + 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,needs_long_swim=True), + ExitData(RegionNames.SUNKEN_SHIP_ENTRANCE) + ], + 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=["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=[]) + }, + 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(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]) + } +} +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 - 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)), + "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), + }, + 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=[ + "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), + } +} + +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")), + ] +} diff --git a/worlds/okamihd/Rules.py b/worlds/okamihd/Rules.py index 0d9af3ca9b86..9949b8a961ce 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)), @@ -28,6 +32,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) @@ -39,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)) @@ -89,6 +92,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 = [] @@ -120,7 +125,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("Digging Champ")) if world.options.NightTimeChecksRequireCrescent: required_techinques += [BrushTechniques.CRESCENT] case LocationType.BURNING_CHEST: @@ -169,14 +175,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(final_rule) -# print(final_rule) # else: # print("no rule for this check") @@ -189,12 +196,11 @@ def apply_exit_rules(etr: Entrance, name: str, data: ExitData, world: "OkamiWorl rules.append(HasAll(*data.required_items_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","Himiko's Palace - Cross sea of fire","Imperial Palace - Defeat Blight")) return diff --git a/worlds/okamihd/__init__.py b/worlds/okamihd/__init__.py index 260d5f910edb..9fd0a1b0533c 100644 --- a/worlds/okamihd/__init__.py +++ b/worlds/okamihd/__init__.py @@ -52,7 +52,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.prepare_local_items() 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" }