Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
42071d1
Add City Checkpoint logic
Ragmoa May 8, 2026
2d8e761
Link City Checkpoint to everything else
Ragmoa May 8, 2026
6f8a17c
Ryoshima Coast Access and resotration
Ragmoa May 8, 2026
a441021
Merge pull request #54 from Ragmoa/city-checkpoint
Ragmoa May 8, 2026
0646967
Merge branch 'main' into arc2
Ragmoa May 9, 2026
27a8d18
Rewrite City checkpoint entrances with new system
Ragmoa May 9, 2026
a85730b
Merge branch 'arc2' into ryoshima-coast
Ragmoa May 9, 2026
fc6ae2b
Rewrite warps with new system
Ragmoa May 9, 2026
9f13687
Add Ryoshima Coast Logic
Ragmoa May 9, 2026
0ee9100
Comment debug region visualizer
Ragmoa May 9, 2026
0a161a9
Merge pull request #55 from Ragmoa/ryoshima-coast
Ragmoa May 9, 2026
b848279
Seian City Commoners Base
Ragmoa May 18, 2026
44c34e7
Add some checks in Seian City Commoners
Ragmoa May 18, 2026
42d89e1
Seian Commoners Checks
Ragmoa May 18, 2026
ef0648b
Merge branch 'main' into arc2
Ragmoa May 19, 2026
9897ff0
Merge branch 'arc2' into seian-city-commoners
Ragmoa May 19, 2026
81def37
Add arc 2 warps up to now and fix formatting
Ragmoa May 19, 2026
48c7499
Merge branch 'main' into arc2
Ragmoa May 23, 2026
945974d
Merge branch 'arc2' into seian-city-commoners
Ragmoa May 23, 2026
159ae92
Fix Sei-an locations names (1)
Ragmoa May 23, 2026
207187a
Merge branch 'main' into arc2
Ragmoa May 23, 2026
a226e48
Merge branch 'arc2' into seian-city-commoners
Ragmoa May 23, 2026
306fd4d
Merge branch 'main' into arc2
Ragmoa May 23, 2026
2c4794b
Merge branch 'arc2' into seian-city-commoners
Ragmoa May 23, 2026
15857c6
Merge branch 'main' into arc2
Ragmoa May 23, 2026
f1c8438
Merge branch 'arc2' into seian-city-commoners
Ragmoa May 23, 2026
e536726
Fixes in sei-an, some aristocratic quarter checks and story progression
Ragmoa May 23, 2026
5743b7f
Add Sunken Ship Base
Ragmoa May 23, 2026
9da32a8
loas new locations and exits
Ragmoa May 23, 2026
72c3e04
Fix some ids
Ragmoa May 23, 2026
37e7307
Merge branch 'seian-city-commoners' into sunken-ship
Ragmoa May 23, 2026
ed320bd
Add SUken Ship logic, fix rysohima coast warps
Ragmoa May 24, 2026
86d753a
Merge pull request #69 from Ragmoa/sunken-ship
Ragmoa May 24, 2026
5492ef5
Add Imperial Palace Logic
Ragmoa May 24, 2026
27ace97
Merge pull request #73 from Ragmoa/imperial-palace
Ragmoa May 24, 2026
f16f4a9
Update handling of elemental rules
Ragmoa May 24, 2026
71710ec
Finish Sei-an City Logic
Ragmoa May 24, 2026
b63932c
Add some logic to city checkpoint bridge
Ragmoa May 24, 2026
e3e7f7e
Merge pull request #59 from Ragmoa/seian-city-commoners
Ragmoa May 24, 2026
e0dceae
Merge branch 'main' into arc2
Ragmoa May 24, 2026
65ad864
Fix buried chests in city checkpoint not considered buried
Ragmoa May 24, 2026
717e455
Merge branch 'main' into arc2
Ragmoa May 24, 2026
8525e52
Merge branch 'main' into arc2
Ragmoa May 24, 2026
88ddc0d
Update goal to include Himiko andn Blight, city Checkpoint now can be…
Ragmoa May 24, 2026
5000313
Merge branch 'main' into arc2
Ragmoa May 25, 2026
4dbd2a4
Rebalance items fill for arc 2 current state
Ragmoa May 25, 2026
e4fe830
Merge branch 'main' into arc2
Ragmoa May 25, 2026
647fc6f
Merge branch 'main' into arc2
Ragmoa May 25, 2026
eae12fd
Fix Sei-an warp logic
Ragmoa May 25, 2026
c79313d
Merge branch 'main' into arc2
Ragmoa May 25, 2026
931ea8c
Merge branch 'main' into arc2
Ragmoa May 25, 2026
7e2854d
solve merge conflicts
Ragmoa May 25, 2026
8c36150
exclude arc 2 location that won't work out of the box
Ragmoa May 25, 2026
0176a72
Merge branch 'main' into arc2
Ragmoa May 25, 2026
d328bbe
Update manifest
Ragmoa May 25, 2026
f3226e8
Merge branch 'main' into arc2
Ragmoa Jun 8, 2026
6ec43b6
Update arc 2 with exit rule changes
Ragmoa Jun 8, 2026
8847f0f
Update Ryoshima far chest requirements + Golden Ink pot for chest in …
Ragmoa Jun 8, 2026
e00e9ac
Merge branch 'main' into arc2
Ragmoa Jun 11, 2026
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
2 changes: 1 addition & 1 deletion worlds/okamihd/CheckIds.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
10 changes: 9 additions & 1 deletion worlds/okamihd/Enums/OkamiEnemies.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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():
Expand Down
103 changes: 103 additions & 0 deletions worlds/okamihd/Enums/RegionNames.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -137,19 +227,28 @@ class MapIds(Enum):
KAMIKI_VILLAGE = 0x102
HANA_VALLEY = 0x103
TSUTA_RUINS = 0x104
CITY_CHECKPOINT = 0x105
GALE_SHRINE = 0x107
KUSA_VILLAGE = 0x108
SASA_SANCTUARY = 0x109
AGATA_FOREST_MME_FAWN = 0x10A
CALCIFIED_CAVERN = 0x10E
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):
Expand All @@ -158,13 +257,17 @@ class MapIndexes(Enum):
KAMIKI_VILLAGE = 3
HANA_VALLEY = 4
TSUTA_RUINS = 5
CITY_CHECKPOINT = 6
GALE_SHRINE = 8
KUSA_VILLAGE = 9
SASA_SANCTUARY = 10
AGATA_FOREST_MME_FAWN = 11
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
21 changes: 9 additions & 12 deletions worlds/okamihd/Items.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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,
Expand Down
48 changes: 41 additions & 7 deletions worlds/okamihd/RegionsData/__init__.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -13,20 +13,29 @@
**r102.exits,
**r103.exits,
**r104.exits,
**r105.exits,
**r107.exits,
**r108.exits,
**r109.exits,
**r10a.exits,
**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 = {
Expand All @@ -35,20 +44,29 @@
**r102.locations,
**r103.locations,
**r104.locations,
**r105.locations,
**r107.locations,
**r108.locations,
**r109.locations,
**r10a.locations,
**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 = {
Expand All @@ -57,38 +75,54 @@
**r102.events,
**r103.events,
**r104.events,
**r105.events,
**r107.events,
**r108.events,
**r109.events,
**r10a.events,
**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,
}
**rf0a.warps,

}
Loading
Loading