Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion worlds/okamihd/Enums/LocationType.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
7 changes: 6 additions & 1 deletion worlds/okamihd/Enums/OkamiEnemies.py
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand All @@ -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():
Expand Down
54 changes: 52 additions & 2 deletions worlds/okamihd/Enums/RegionNames.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
Expand All @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand All @@ -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
Expand All @@ -249,6 +298,7 @@ class MapIds(Enum):
HEALED_TAKA = 0xF08
CURSED_RYOSHIMA = 0xF09
HEALED_RYOSHIMA = 0xF0A
NORTHERN_RYOSHIMA = 0xF0C


class MapIndexes(Enum):
Expand Down
1 change: 1 addition & 0 deletions worlds/okamihd/Items.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
42 changes: 40 additions & 2 deletions worlds/okamihd/RegionsData/__init__.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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,
Expand All @@ -36,6 +47,7 @@
**rf08.exits,
**rf09.exits,
**rf0a.exits,
**rf0c.exits,
}

okami_locations = {
Expand All @@ -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,
Expand All @@ -67,6 +89,7 @@
**rf08.locations,
**rf09.locations,
**rf0a.locations,
**rf0c.locations,
}

okami_events = {
Expand All @@ -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,
Expand All @@ -98,6 +131,7 @@
**rf08.events,
**rf09.events,
**rf0a.events,
**rf0c.events,
}

# Shop locations are separate because they're conditionally created based on RandomizeShops
Expand All @@ -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 = {
Expand All @@ -120,9 +156,11 @@
**r108.warps,
**r109.warps,
**r200.warps,
**r203.warps,
**r20a.warps,
**rf02.warps,
**rf04.warps,
**rf08.warps,
**rf0a.warps,

**rf0c.warps
}
32 changes: 32 additions & 0 deletions worlds/okamihd/RegionsData/r113.py
Original file line number Diff line number Diff line change
@@ -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))
}
}
21 changes: 21 additions & 0 deletions worlds/okamihd/RegionsData/r114.py
Original file line number Diff line number Diff line change
@@ -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)),
}
}
26 changes: 26 additions & 0 deletions worlds/okamihd/RegionsData/r116.py
Original file line number Diff line number Diff line change
@@ -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))
}

}
26 changes: 26 additions & 0 deletions worlds/okamihd/RegionsData/r117.py
Original file line number Diff line number Diff line change
@@ -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))
}

}
Loading
Loading