Aquaria: Logic bug fixes (#3679)

* Fixing logic bugs

* Require energy attack in the cathedral and energy form in the body

* King Jelly can be beaten easily with only the Dual Form

* I think that I have a problem with my left and right...

* There is a monster that is blocking the path, soo need attack to pass

* The Li cage is not accessible without the Sunken city boss

* Removing useless space.

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

* Two more minors logic modification

* Adapting tests to af9b6cd

* Reformat the Region file

---------

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
This commit is contained in:
Louis M 2024-08-07 18:19:52 -04:00 committed by GitHub
parent 05ce29f7dc
commit 575c338aa3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 396 additions and 288 deletions

View File

@ -99,7 +99,7 @@ item_table = {
"Mutant Costume": ItemData(698020, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mutant_costume "Mutant Costume": ItemData(698020, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mutant_costume
"Baby Nautilus": ItemData(698021, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_nautilus "Baby Nautilus": ItemData(698021, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_nautilus
"Baby Piranha": ItemData(698022, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_piranha "Baby Piranha": ItemData(698022, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_piranha
"Arnassi Armor": ItemData(698023, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_seahorse_costume "Arnassi Armor": ItemData(698023, 1, ItemType.PROGRESSION, ItemGroup.UTILITY), # collectible_seahorse_costume
"Seed Bag": ItemData(698024, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_seed_bag "Seed Bag": ItemData(698024, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_seed_bag
"King's Skull": ItemData(698025, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_skull "King's Skull": ItemData(698025, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_skull
"Song Plant Spore": ItemData(698026, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_spore_seed "Song Plant Spore": ItemData(698026, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_spore_seed

View File

@ -45,7 +45,7 @@ class AquariaLocations:
"Home Water, bulb below the grouper fish": 698058, "Home Water, bulb below the grouper fish": 698058,
"Home Water, bulb in the path below Nautilus Prime": 698059, "Home Water, bulb in the path below Nautilus Prime": 698059,
"Home Water, bulb in the little room above the grouper fish": 698060, "Home Water, bulb in the little room above the grouper fish": 698060,
"Home Water, bulb in the end of the left path from the Verse Cave": 698061, "Home Water, bulb in the end of the path close to the Verse Cave": 698061,
"Home Water, bulb in the top left path": 698062, "Home Water, bulb in the top left path": 698062,
"Home Water, bulb in the bottom left room": 698063, "Home Water, bulb in the bottom left room": 698063,
"Home Water, bulb close to Naija's Home": 698064, "Home Water, bulb close to Naija's Home": 698064,
@ -67,7 +67,7 @@ class AquariaLocations:
locations_song_cave = { locations_song_cave = {
"Song Cave, Erulian spirit": 698206, "Song Cave, Erulian spirit": 698206,
"Song Cave, bulb in the top left part": 698071, "Song Cave, bulb in the top right part": 698071,
"Song Cave, bulb in the big anemone room": 698072, "Song Cave, bulb in the big anemone room": 698072,
"Song Cave, bulb in the path to the singing statues": 698073, "Song Cave, bulb in the path to the singing statues": 698073,
"Song Cave, bulb under the rock in the path to the singing statues": 698074, "Song Cave, bulb under the rock in the path to the singing statues": 698074,
@ -152,6 +152,9 @@ class AquariaLocations:
locations_arnassi_path = { locations_arnassi_path = {
"Arnassi Ruins, Arnassi Statue": 698164, "Arnassi Ruins, Arnassi Statue": 698164,
}
locations_arnassi_cave_transturtle = {
"Arnassi Ruins, Transturtle": 698217, "Arnassi Ruins, Transturtle": 698217,
} }
@ -269,9 +272,12 @@ class AquariaLocations:
} }
locations_forest_bl = { locations_forest_bl = {
"Kelp Forest bottom left area, Transturtle": 698212,
}
locations_forest_bl_sc = {
"Kelp Forest bottom left area, bulb close to the spirit crystals": 698054, "Kelp Forest bottom left area, bulb close to the spirit crystals": 698054,
"Kelp Forest bottom left area, Walker Baby": 698186, "Kelp Forest bottom left area, Walker Baby": 698186,
"Kelp Forest bottom left area, Transturtle": 698212,
} }
locations_forest_br = { locations_forest_br = {
@ -370,7 +376,7 @@ class AquariaLocations:
locations_sun_temple_r = { locations_sun_temple_r = {
"Sun Temple, first bulb of the temple": 698091, "Sun Temple, first bulb of the temple": 698091,
"Sun Temple, bulb on the left part": 698092, "Sun Temple, bulb on the right part": 698092,
"Sun Temple, bulb in the hidden room of the right part": 698093, "Sun Temple, bulb in the hidden room of the right part": 698093,
"Sun Temple, Sun Key": 698182, "Sun Temple, Sun Key": 698182,
} }
@ -402,6 +408,9 @@ class AquariaLocations:
"Abyss right area, bulb in the middle path": 698110, "Abyss right area, bulb in the middle path": 698110,
"Abyss right area, bulb behind the rock in the middle path": 698111, "Abyss right area, bulb behind the rock in the middle path": 698111,
"Abyss right area, bulb in the left green room": 698112, "Abyss right area, bulb in the left green room": 698112,
}
locations_abyss_r_transturtle = {
"Abyss right area, Transturtle": 698214, "Abyss right area, Transturtle": 698214,
} }
@ -499,6 +508,7 @@ location_table = {
**AquariaLocations.locations_skeleton_path_sc, **AquariaLocations.locations_skeleton_path_sc,
**AquariaLocations.locations_arnassi, **AquariaLocations.locations_arnassi,
**AquariaLocations.locations_arnassi_path, **AquariaLocations.locations_arnassi_path,
**AquariaLocations.locations_arnassi_cave_transturtle,
**AquariaLocations.locations_arnassi_crab_boss, **AquariaLocations.locations_arnassi_crab_boss,
**AquariaLocations.locations_sun_temple_l, **AquariaLocations.locations_sun_temple_l,
**AquariaLocations.locations_sun_temple_r, **AquariaLocations.locations_sun_temple_r,
@ -509,6 +519,7 @@ location_table = {
**AquariaLocations.locations_abyss_l, **AquariaLocations.locations_abyss_l,
**AquariaLocations.locations_abyss_lb, **AquariaLocations.locations_abyss_lb,
**AquariaLocations.locations_abyss_r, **AquariaLocations.locations_abyss_r,
**AquariaLocations.locations_abyss_r_transturtle,
**AquariaLocations.locations_energy_temple_1, **AquariaLocations.locations_energy_temple_1,
**AquariaLocations.locations_energy_temple_2, **AquariaLocations.locations_energy_temple_2,
**AquariaLocations.locations_energy_temple_3, **AquariaLocations.locations_energy_temple_3,
@ -530,6 +541,7 @@ location_table = {
**AquariaLocations.locations_forest_tr, **AquariaLocations.locations_forest_tr,
**AquariaLocations.locations_forest_tr_fp, **AquariaLocations.locations_forest_tr_fp,
**AquariaLocations.locations_forest_bl, **AquariaLocations.locations_forest_bl,
**AquariaLocations.locations_forest_bl_sc,
**AquariaLocations.locations_forest_br, **AquariaLocations.locations_forest_br,
**AquariaLocations.locations_forest_boss, **AquariaLocations.locations_forest_boss,
**AquariaLocations.locations_forest_boss_entrance, **AquariaLocations.locations_forest_boss_entrance,

View File

@ -14,97 +14,112 @@ from worlds.generic.Rules import add_rule, set_rule
# Every condition to connect regions # Every condition to connect regions
def _has_hot_soup(state:CollectionState, player: int) -> bool: def _has_hot_soup(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the hotsoup item""" """`player` in `state` has the hotsoup item"""
return state.has("Hot soup", player) return state.has_any({"Hot soup", "Hot soup x 2"}, player)
def _has_tongue_cleared(state:CollectionState, player: int) -> bool: def _has_tongue_cleared(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the Body tongue cleared item""" """`player` in `state` has the Body tongue cleared item"""
return state.has("Body tongue cleared", player) return state.has("Body tongue cleared", player)
def _has_sun_crystal(state:CollectionState, player: int) -> bool: def _has_sun_crystal(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the Sun crystal item""" """`player` in `state` has the Sun crystal item"""
return state.has("Has sun crystal", player) and _has_bind_song(state, player) return state.has("Has sun crystal", player) and _has_bind_song(state, player)
def _has_li(state:CollectionState, player: int) -> bool: def _has_li(state: CollectionState, player: int) -> bool:
"""`player` in `state` has Li in its team""" """`player` in `state` has Li in its team"""
return state.has("Li and Li song", player) return state.has("Li and Li song", player)
def _has_damaging_item(state:CollectionState, player: int) -> bool: def _has_damaging_item(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the shield song item""" """`player` in `state` has the shield song item"""
return state.has_any({"Energy form", "Nature form", "Beast form", "Li and Li song", "Baby Nautilus", return state.has_any({"Energy form", "Nature form", "Beast form", "Li and Li song", "Baby Nautilus",
"Baby Piranha", "Baby Blaster"}, player) "Baby Piranha", "Baby Blaster"}, player)
def _has_shield_song(state:CollectionState, player: int) -> bool: def _has_energy_attack_item(state: CollectionState, player: int) -> bool:
"""`player` in `state` has items that can do a lot of damage (enough to beat bosses)"""
return _has_energy_form(state, player) or _has_dual_form(state, player)
def _has_shield_song(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the shield song item""" """`player` in `state` has the shield song item"""
return state.has("Shield song", player) return state.has("Shield song", player)
def _has_bind_song(state:CollectionState, player: int) -> bool: def _has_bind_song(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the bind song item""" """`player` in `state` has the bind song item"""
return state.has("Bind song", player) return state.has("Bind song", player)
def _has_energy_form(state:CollectionState, player: int) -> bool: def _has_energy_form(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the energy form item""" """`player` in `state` has the energy form item"""
return state.has("Energy form", player) return state.has("Energy form", player)
def _has_beast_form(state:CollectionState, player: int) -> bool: def _has_beast_form(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the beast form item""" """`player` in `state` has the beast form item"""
return state.has("Beast form", player) return state.has("Beast form", player)
def _has_nature_form(state:CollectionState, player: int) -> bool: def _has_beast_and_soup_form(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the beast form item"""
return _has_beast_form(state, player) and _has_hot_soup(state, player)
def _has_beast_form_or_arnassi_armor(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the beast form item"""
return _has_beast_form(state, player) or state.has("Arnassi Armor", player)
def _has_nature_form(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the nature form item""" """`player` in `state` has the nature form item"""
return state.has("Nature form", player) return state.has("Nature form", player)
def _has_sun_form(state:CollectionState, player: int) -> bool: def _has_sun_form(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the sun form item""" """`player` in `state` has the sun form item"""
return state.has("Sun form", player) return state.has("Sun form", player)
def _has_light(state:CollectionState, player: int) -> bool: def _has_light(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the light item""" """`player` in `state` has the light item"""
return state.has("Baby Dumbo", player) or _has_sun_form(state, player) return state.has("Baby Dumbo", player) or _has_sun_form(state, player)
def _has_dual_form(state:CollectionState, player: int) -> bool: def _has_dual_form(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the dual form item""" """`player` in `state` has the dual form item"""
return _has_li(state, player) and state.has("Dual form", player) return _has_li(state, player) and state.has("Dual form", player)
def _has_fish_form(state:CollectionState, player: int) -> bool: def _has_fish_form(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the fish form item""" """`player` in `state` has the fish form item"""
return state.has("Fish form", player) return state.has("Fish form", player)
def _has_spirit_form(state:CollectionState, player: int) -> bool: def _has_spirit_form(state: CollectionState, player: int) -> bool:
"""`player` in `state` has the spirit form item""" """`player` in `state` has the spirit form item"""
return state.has("Spirit form", player) return state.has("Spirit form", player)
def _has_big_bosses(state:CollectionState, player: int) -> bool: def _has_big_bosses(state: CollectionState, player: int) -> bool:
"""`player` in `state` has beated every big bosses""" """`player` in `state` has beated every big bosses"""
return state.has_all({"Fallen God beated", "Mithalan God beated", "Drunian God beated", return state.has_all({"Fallen God beated", "Mithalan God beated", "Drunian God beated",
"Sun God beated", "The Golem beated"}, player) "Sun God beated", "The Golem beated"}, player)
def _has_mini_bosses(state:CollectionState, player: int) -> bool: def _has_mini_bosses(state: CollectionState, player: int) -> bool:
"""`player` in `state` has beated every big bosses""" """`player` in `state` has beated every big bosses"""
return state.has_all({"Nautilus Prime beated", "Blaster Peg Prime beated", "Mergog beated", return state.has_all({"Nautilus Prime beated", "Blaster Peg Prime beated", "Mergog beated",
"Mithalan priests beated", "Octopus Prime beated", "Crabbius Maximus beated", "Mithalan priests beated", "Octopus Prime beated", "Crabbius Maximus beated",
"Mantis Shrimp Prime beated", "King Jellyfish God Prime beated"}, player) "Mantis Shrimp Prime beated", "King Jellyfish God Prime beated"}, player)
def _has_secrets(state:CollectionState, player: int) -> bool: def _has_secrets(state: CollectionState, player: int) -> bool:
return state.has_all({"First secret obtained", "Second secret obtained", "Third secret obtained"},player) return state.has_all({"First secret obtained", "Second secret obtained", "Third secret obtained"}, player)
class AquariaRegions: class AquariaRegions:
@ -134,6 +149,7 @@ class AquariaRegions:
skeleton_path: Region skeleton_path: Region
skeleton_path_sc: Region skeleton_path_sc: Region
arnassi: Region arnassi: Region
arnassi_cave_transturtle: Region
arnassi_path: Region arnassi_path: Region
arnassi_crab_boss: Region arnassi_crab_boss: Region
simon: Region simon: Region
@ -152,6 +168,7 @@ class AquariaRegions:
forest_tr: Region forest_tr: Region
forest_tr_fp: Region forest_tr_fp: Region
forest_bl: Region forest_bl: Region
forest_bl_sc: Region
forest_br: Region forest_br: Region
forest_boss: Region forest_boss: Region
forest_boss_entrance: Region forest_boss_entrance: Region
@ -179,6 +196,7 @@ class AquariaRegions:
abyss_l: Region abyss_l: Region
abyss_lb: Region abyss_lb: Region
abyss_r: Region abyss_r: Region
abyss_r_transturtle: Region
ice_cave: Region ice_cave: Region
bubble_cave: Region bubble_cave: Region
bubble_cave_boss: Region bubble_cave_boss: Region
@ -213,7 +231,7 @@ class AquariaRegions:
""" """
def __add_region(self, hint: str, def __add_region(self, hint: str,
locations: Optional[Dict[str, Optional[int]]]) -> Region: locations: Optional[Dict[str, int]]) -> Region:
""" """
Create a new Region, add it to the `world` regions and return it. Create a new Region, add it to the `world` regions and return it.
Be aware that this function have a side effect on ``world`.`regions` Be aware that this function have a side effect on ``world`.`regions`
@ -236,7 +254,7 @@ class AquariaRegions:
self.home_water_nautilus = self.__add_region("Home Water, Nautilus nest", self.home_water_nautilus = self.__add_region("Home Water, Nautilus nest",
AquariaLocations.locations_home_water_nautilus) AquariaLocations.locations_home_water_nautilus)
self.home_water_transturtle = self.__add_region("Home Water, turtle room", self.home_water_transturtle = self.__add_region("Home Water, turtle room",
AquariaLocations.locations_home_water_transturtle) AquariaLocations.locations_home_water_transturtle)
self.naija_home = self.__add_region("Naija's Home", AquariaLocations.locations_naija_home) self.naija_home = self.__add_region("Naija's Home", AquariaLocations.locations_naija_home)
self.song_cave = self.__add_region("Song Cave", AquariaLocations.locations_song_cave) self.song_cave = self.__add_region("Song Cave", AquariaLocations.locations_song_cave)
@ -280,6 +298,8 @@ class AquariaRegions:
self.arnassi = self.__add_region("Arnassi Ruins", AquariaLocations.locations_arnassi) self.arnassi = self.__add_region("Arnassi Ruins", AquariaLocations.locations_arnassi)
self.arnassi_path = self.__add_region("Arnassi Ruins, back entrance path", self.arnassi_path = self.__add_region("Arnassi Ruins, back entrance path",
AquariaLocations.locations_arnassi_path) AquariaLocations.locations_arnassi_path)
self.arnassi_cave_transturtle = self.__add_region("Arnassi Ruins, transturtle area",
AquariaLocations.locations_arnassi_cave_transturtle)
self.arnassi_crab_boss = self.__add_region("Arnassi Ruins, Crabbius Maximus lair", self.arnassi_crab_boss = self.__add_region("Arnassi Ruins, Crabbius Maximus lair",
AquariaLocations.locations_arnassi_crab_boss) AquariaLocations.locations_arnassi_crab_boss)
@ -302,9 +322,9 @@ class AquariaRegions:
AquariaLocations.locations_cathedral_r) AquariaLocations.locations_cathedral_r)
self.cathedral_underground = self.__add_region("Mithalas Cathedral underground", self.cathedral_underground = self.__add_region("Mithalas Cathedral underground",
AquariaLocations.locations_cathedral_underground) AquariaLocations.locations_cathedral_underground)
self.cathedral_boss_r = self.__add_region("Mithalas Cathedral, Mithalan God room", self.cathedral_boss_r = self.__add_region("Mithalas Cathedral, Mithalan God room", None)
self.cathedral_boss_l = self.__add_region("Mithalas Cathedral, after Mithalan God room",
AquariaLocations.locations_cathedral_boss) AquariaLocations.locations_cathedral_boss)
self.cathedral_boss_l = self.__add_region("Mithalas Cathedral, after Mithalan God room", None)
def __create_forest(self) -> None: def __create_forest(self) -> None:
""" """
@ -320,6 +340,8 @@ class AquariaRegions:
AquariaLocations.locations_forest_tr_fp) AquariaLocations.locations_forest_tr_fp)
self.forest_bl = self.__add_region("Kelp Forest bottom left area", self.forest_bl = self.__add_region("Kelp Forest bottom left area",
AquariaLocations.locations_forest_bl) AquariaLocations.locations_forest_bl)
self.forest_bl_sc = self.__add_region("Kelp Forest bottom left area, spirit crystals",
AquariaLocations.locations_forest_bl_sc)
self.forest_br = self.__add_region("Kelp Forest bottom right area", self.forest_br = self.__add_region("Kelp Forest bottom right area",
AquariaLocations.locations_forest_br) AquariaLocations.locations_forest_br)
self.forest_sprite_cave = self.__add_region("Kelp Forest spirit cave", self.forest_sprite_cave = self.__add_region("Kelp Forest spirit cave",
@ -375,9 +397,9 @@ class AquariaRegions:
self.sun_temple_r = self.__add_region("Sun Temple right area", self.sun_temple_r = self.__add_region("Sun Temple right area",
AquariaLocations.locations_sun_temple_r) AquariaLocations.locations_sun_temple_r)
self.sun_temple_boss_path = self.__add_region("Sun Temple before boss area", self.sun_temple_boss_path = self.__add_region("Sun Temple before boss area",
AquariaLocations.locations_sun_temple_boss_path) AquariaLocations.locations_sun_temple_boss_path)
self.sun_temple_boss = self.__add_region("Sun Temple boss area", self.sun_temple_boss = self.__add_region("Sun Temple boss area",
AquariaLocations.locations_sun_temple_boss) AquariaLocations.locations_sun_temple_boss)
def __create_abyss(self) -> None: def __create_abyss(self) -> None:
""" """
@ -388,6 +410,8 @@ class AquariaRegions:
AquariaLocations.locations_abyss_l) AquariaLocations.locations_abyss_l)
self.abyss_lb = self.__add_region("Abyss left bottom area", AquariaLocations.locations_abyss_lb) self.abyss_lb = self.__add_region("Abyss left bottom area", AquariaLocations.locations_abyss_lb)
self.abyss_r = self.__add_region("Abyss right area", AquariaLocations.locations_abyss_r) self.abyss_r = self.__add_region("Abyss right area", AquariaLocations.locations_abyss_r)
self.abyss_r_transturtle = self.__add_region("Abyss right area, transturtle",
AquariaLocations.locations_abyss_r_transturtle)
self.ice_cave = self.__add_region("Ice Cave", AquariaLocations.locations_ice_cave) self.ice_cave = self.__add_region("Ice Cave", AquariaLocations.locations_ice_cave)
self.bubble_cave = self.__add_region("Bubble Cave", AquariaLocations.locations_bubble_cave) self.bubble_cave = self.__add_region("Bubble Cave", AquariaLocations.locations_bubble_cave)
self.bubble_cave_boss = self.__add_region("Bubble Cave boss area", AquariaLocations.locations_bubble_cave_boss) self.bubble_cave_boss = self.__add_region("Bubble Cave boss area", AquariaLocations.locations_bubble_cave_boss)
@ -407,7 +431,7 @@ class AquariaRegions:
self.sunken_city_r = self.__add_region("Sunken City right area", self.sunken_city_r = self.__add_region("Sunken City right area",
AquariaLocations.locations_sunken_city_r) AquariaLocations.locations_sunken_city_r)
self.sunken_city_boss = self.__add_region("Sunken City boss area", self.sunken_city_boss = self.__add_region("Sunken City boss area",
AquariaLocations.locations_sunken_city_boss) AquariaLocations.locations_sunken_city_boss)
def __create_body(self) -> None: def __create_body(self) -> None:
""" """
@ -427,7 +451,7 @@ class AquariaRegions:
self.final_boss_tube = self.__add_region("The Body, final boss area turtle room", self.final_boss_tube = self.__add_region("The Body, final boss area turtle room",
AquariaLocations.locations_final_boss_tube) AquariaLocations.locations_final_boss_tube)
self.final_boss = self.__add_region("The Body, final boss", self.final_boss = self.__add_region("The Body, final boss",
AquariaLocations.locations_final_boss) AquariaLocations.locations_final_boss)
self.final_boss_end = self.__add_region("The Body, final boss area", None) self.final_boss_end = self.__add_region("The Body, final boss area", None)
def __connect_one_way_regions(self, source_name: str, destination_name: str, def __connect_one_way_regions(self, source_name: str, destination_name: str,
@ -455,8 +479,8 @@ class AquariaRegions:
""" """
Connect entrances of the different regions around `home_water` Connect entrances of the different regions around `home_water`
""" """
self.__connect_regions("Menu", "Verse Cave right area", self.__connect_one_way_regions("Menu", "Verse Cave right area",
self.menu, self.verse_cave_r) self.menu, self.verse_cave_r)
self.__connect_regions("Verse Cave left area", "Verse Cave right area", self.__connect_regions("Verse Cave left area", "Verse Cave right area",
self.verse_cave_l, self.verse_cave_r) self.verse_cave_l, self.verse_cave_r)
self.__connect_regions("Verse Cave", "Home Water", self.verse_cave_l, self.home_water) self.__connect_regions("Verse Cave", "Home Water", self.verse_cave_l, self.home_water)
@ -464,7 +488,8 @@ class AquariaRegions:
self.__connect_regions("Home Water", "Song Cave", self.home_water, self.song_cave) self.__connect_regions("Home Water", "Song Cave", self.home_water, self.song_cave)
self.__connect_regions("Home Water", "Home Water, nautilus nest", self.__connect_regions("Home Water", "Home Water, nautilus nest",
self.home_water, self.home_water_nautilus, self.home_water, self.home_water_nautilus,
lambda state: _has_energy_form(state, self.player) and _has_bind_song(state, self.player)) lambda state: _has_energy_attack_item(state, self.player) and
_has_bind_song(state, self.player))
self.__connect_regions("Home Water", "Home Water transturtle room", self.__connect_regions("Home Water", "Home Water transturtle room",
self.home_water, self.home_water_transturtle) self.home_water, self.home_water_transturtle)
self.__connect_regions("Home Water", "Energy Temple first area", self.__connect_regions("Home Water", "Energy Temple first area",
@ -472,7 +497,7 @@ class AquariaRegions:
lambda state: _has_bind_song(state, self.player)) lambda state: _has_bind_song(state, self.player))
self.__connect_regions("Home Water", "Energy Temple_altar", self.__connect_regions("Home Water", "Energy Temple_altar",
self.home_water, self.energy_temple_altar, self.home_water, self.energy_temple_altar,
lambda state: _has_energy_form(state, self.player) and lambda state: _has_energy_attack_item(state, self.player) and
_has_bind_song(state, self.player)) _has_bind_song(state, self.player))
self.__connect_regions("Energy Temple first area", "Energy Temple second area", self.__connect_regions("Energy Temple first area", "Energy Temple second area",
self.energy_temple_1, self.energy_temple_2, self.energy_temple_1, self.energy_temple_2,
@ -482,28 +507,28 @@ class AquariaRegions:
lambda state: _has_fish_form(state, self.player)) lambda state: _has_fish_form(state, self.player))
self.__connect_regions("Energy Temple idol room", "Energy Temple boss area", self.__connect_regions("Energy Temple idol room", "Energy Temple boss area",
self.energy_temple_idol, self.energy_temple_boss, self.energy_temple_idol, self.energy_temple_boss,
lambda state: _has_energy_form(state, self.player)) lambda state: _has_energy_attack_item(state, self.player) and
_has_fish_form(state, self.player))
self.__connect_one_way_regions("Energy Temple first area", "Energy Temple boss area", self.__connect_one_way_regions("Energy Temple first area", "Energy Temple boss area",
self.energy_temple_1, self.energy_temple_boss, self.energy_temple_1, self.energy_temple_boss,
lambda state: _has_beast_form(state, self.player) and lambda state: _has_beast_form(state, self.player) and
_has_energy_form(state, self.player)) _has_energy_attack_item(state, self.player))
self.__connect_one_way_regions("Energy Temple boss area", "Energy Temple first area", self.__connect_one_way_regions("Energy Temple boss area", "Energy Temple first area",
self.energy_temple_boss, self.energy_temple_1, self.energy_temple_boss, self.energy_temple_1,
lambda state: _has_energy_form(state, self.player)) lambda state: _has_energy_attack_item(state, self.player))
self.__connect_regions("Energy Temple second area", "Energy Temple third area", self.__connect_regions("Energy Temple second area", "Energy Temple third area",
self.energy_temple_2, self.energy_temple_3, self.energy_temple_2, self.energy_temple_3,
lambda state: _has_bind_song(state, self.player) and lambda state: _has_energy_form(state, self.player))
_has_energy_form(state, self.player))
self.__connect_regions("Energy Temple boss area", "Energy Temple blaster room", self.__connect_regions("Energy Temple boss area", "Energy Temple blaster room",
self.energy_temple_boss, self.energy_temple_blaster_room, self.energy_temple_boss, self.energy_temple_blaster_room,
lambda state: _has_nature_form(state, self.player) and lambda state: _has_nature_form(state, self.player) and
_has_bind_song(state, self.player) and _has_bind_song(state, self.player) and
_has_energy_form(state, self.player)) _has_energy_attack_item(state, self.player))
self.__connect_regions("Energy Temple first area", "Energy Temple blaster room", self.__connect_regions("Energy Temple first area", "Energy Temple blaster room",
self.energy_temple_1, self.energy_temple_blaster_room, self.energy_temple_1, self.energy_temple_blaster_room,
lambda state: _has_nature_form(state, self.player) and lambda state: _has_nature_form(state, self.player) and
_has_bind_song(state, self.player) and _has_bind_song(state, self.player) and
_has_energy_form(state, self.player) and _has_energy_attack_item(state, self.player) and
_has_beast_form(state, self.player)) _has_beast_form(state, self.player))
self.__connect_regions("Home Water", "Open Water top left area", self.__connect_regions("Home Water", "Open Water top left area",
self.home_water, self.openwater_tl) self.home_water, self.openwater_tl)
@ -520,7 +545,7 @@ class AquariaRegions:
self.openwater_tl, self.forest_br) self.openwater_tl, self.forest_br)
self.__connect_regions("Open Water top right area", "Open Water top right area, turtle room", self.__connect_regions("Open Water top right area", "Open Water top right area, turtle room",
self.openwater_tr, self.openwater_tr_turtle, self.openwater_tr, self.openwater_tr_turtle,
lambda state: _has_beast_form(state, self.player)) lambda state: _has_beast_form_or_arnassi_armor(state, self.player))
self.__connect_regions("Open Water top right area", "Open Water bottom right area", self.__connect_regions("Open Water top right area", "Open Water bottom right area",
self.openwater_tr, self.openwater_br) self.openwater_tr, self.openwater_br)
self.__connect_regions("Open Water top right area", "Mithalas City", self.__connect_regions("Open Water top right area", "Mithalas City",
@ -529,10 +554,9 @@ class AquariaRegions:
self.openwater_tr, self.veil_bl) self.openwater_tr, self.veil_bl)
self.__connect_one_way_regions("Open Water top right area", "Veil bottom right", self.__connect_one_way_regions("Open Water top right area", "Veil bottom right",
self.openwater_tr, self.veil_br, self.openwater_tr, self.veil_br,
lambda state: _has_beast_form(state, self.player)) lambda state: _has_beast_form_or_arnassi_armor(state, self.player))
self.__connect_one_way_regions("Veil bottom right", "Open Water top right area", self.__connect_one_way_regions("Veil bottom right", "Open Water top right area",
self.veil_br, self.openwater_tr, self.veil_br, self.openwater_tr)
lambda state: _has_beast_form(state, self.player))
self.__connect_regions("Open Water bottom left area", "Open Water bottom right area", self.__connect_regions("Open Water bottom left area", "Open Water bottom right area",
self.openwater_bl, self.openwater_br) self.openwater_bl, self.openwater_br)
self.__connect_regions("Open Water bottom left area", "Skeleton path", self.__connect_regions("Open Water bottom left area", "Skeleton path",
@ -551,10 +575,14 @@ class AquariaRegions:
self.arnassi, self.openwater_br) self.arnassi, self.openwater_br)
self.__connect_regions("Arnassi", "Arnassi path", self.__connect_regions("Arnassi", "Arnassi path",
self.arnassi, self.arnassi_path) self.arnassi, self.arnassi_path)
self.__connect_regions("Arnassi ruins, transturtle area", "Arnassi path",
self.arnassi_cave_transturtle, self.arnassi_path,
lambda state: _has_fish_form(state, self.player))
self.__connect_one_way_regions("Arnassi path", "Arnassi crab boss area", self.__connect_one_way_regions("Arnassi path", "Arnassi crab boss area",
self.arnassi_path, self.arnassi_crab_boss, self.arnassi_path, self.arnassi_crab_boss,
lambda state: _has_beast_form(state, self.player) and lambda state: _has_beast_form_or_arnassi_armor(state, self.player) and
_has_energy_form(state, self.player)) (_has_energy_attack_item(state, self.player) or
_has_nature_form(state, self.player)))
self.__connect_one_way_regions("Arnassi crab boss area", "Arnassi path", self.__connect_one_way_regions("Arnassi crab boss area", "Arnassi path",
self.arnassi_crab_boss, self.arnassi_path) self.arnassi_crab_boss, self.arnassi_path)
@ -564,61 +592,62 @@ class AquariaRegions:
""" """
self.__connect_one_way_regions("Mithalas City", "Mithalas City top path", self.__connect_one_way_regions("Mithalas City", "Mithalas City top path",
self.mithalas_city, self.mithalas_city_top_path, self.mithalas_city, self.mithalas_city_top_path,
lambda state: _has_beast_form(state, self.player)) lambda state: _has_beast_form_or_arnassi_armor(state, self.player))
self.__connect_one_way_regions("Mithalas City_top_path", "Mithalas City", self.__connect_one_way_regions("Mithalas City_top_path", "Mithalas City",
self.mithalas_city_top_path, self.mithalas_city) self.mithalas_city_top_path, self.mithalas_city)
self.__connect_regions("Mithalas City", "Mithalas City home with fishpass", self.__connect_regions("Mithalas City", "Mithalas City home with fishpass",
self.mithalas_city, self.mithalas_city_fishpass, self.mithalas_city, self.mithalas_city_fishpass,
lambda state: _has_fish_form(state, self.player)) lambda state: _has_fish_form(state, self.player))
self.__connect_regions("Mithalas City", "Mithalas castle", self.__connect_regions("Mithalas City", "Mithalas castle",
self.mithalas_city, self.cathedral_l, self.mithalas_city, self.cathedral_l)
lambda state: _has_fish_form(state, self.player))
self.__connect_one_way_regions("Mithalas City top path", "Mithalas castle, flower tube", self.__connect_one_way_regions("Mithalas City top path", "Mithalas castle, flower tube",
self.mithalas_city_top_path, self.mithalas_city_top_path,
self.cathedral_l_tube, self.cathedral_l_tube,
lambda state: _has_nature_form(state, self.player) and lambda state: _has_nature_form(state, self.player) and
_has_energy_form(state, self.player)) _has_energy_attack_item(state, self.player))
self.__connect_one_way_regions("Mithalas castle, flower tube area", "Mithalas City top path", self.__connect_one_way_regions("Mithalas castle, flower tube area", "Mithalas City top path",
self.cathedral_l_tube, self.cathedral_l_tube,
self.mithalas_city_top_path, self.mithalas_city_top_path,
lambda state: _has_beast_form(state, self.player) and lambda state: _has_nature_form(state, self.player))
_has_nature_form(state, self.player))
self.__connect_one_way_regions("Mithalas castle flower tube area", "Mithalas castle, spirit crystals", self.__connect_one_way_regions("Mithalas castle flower tube area", "Mithalas castle, spirit crystals",
self.cathedral_l_tube, self.cathedral_l_sc, self.cathedral_l_tube, self.cathedral_l_sc,
lambda state: _has_spirit_form(state, self.player)) lambda state: _has_spirit_form(state, self.player))
self.__connect_one_way_regions("Mithalas castle_flower tube area", "Mithalas castle", self.__connect_one_way_regions("Mithalas castle_flower tube area", "Mithalas castle",
self.cathedral_l_tube, self.cathedral_l, self.cathedral_l_tube, self.cathedral_l,
lambda state: _has_spirit_form(state, self.player)) lambda state: _has_spirit_form(state, self.player))
self.__connect_regions("Mithalas castle", "Mithalas castle, spirit crystals", self.__connect_regions("Mithalas castle", "Mithalas castle, spirit crystals",
self.cathedral_l, self.cathedral_l_sc, self.cathedral_l, self.cathedral_l_sc,
lambda state: _has_spirit_form(state, self.player)) lambda state: _has_spirit_form(state, self.player))
self.__connect_regions("Mithalas castle", "Cathedral boss left area", self.__connect_one_way_regions("Mithalas castle", "Cathedral boss right area",
self.cathedral_l, self.cathedral_boss_l, self.cathedral_l, self.cathedral_boss_r,
lambda state: _has_beast_form(state, self.player) and lambda state: _has_beast_form(state, self.player))
_has_energy_form(state, self.player) and self.__connect_one_way_regions("Cathedral boss left area", "Mithalas castle",
_has_bind_song(state, self.player)) self.cathedral_boss_l, self.cathedral_l,
lambda state: _has_beast_form(state, self.player))
self.__connect_regions("Mithalas castle", "Mithalas Cathedral underground", self.__connect_regions("Mithalas castle", "Mithalas Cathedral underground",
self.cathedral_l, self.cathedral_underground, self.cathedral_l, self.cathedral_underground,
lambda state: _has_beast_form(state, self.player) and lambda state: _has_beast_form(state, self.player))
_has_bind_song(state, self.player)) self.__connect_one_way_regions("Mithalas castle", "Mithalas Cathedral",
self.__connect_regions("Mithalas castle", "Mithalas Cathedral", self.cathedral_l, self.cathedral_r,
self.cathedral_l, self.cathedral_r, lambda state: _has_bind_song(state, self.player) and
lambda state: _has_bind_song(state, self.player) and _has_energy_attack_item(state, self.player))
_has_energy_form(state, self.player)) self.__connect_one_way_regions("Mithalas Cathedral", "Mithalas Cathedral underground",
self.__connect_regions("Mithalas Cathedral", "Mithalas Cathedral underground", self.cathedral_r, self.cathedral_underground)
self.cathedral_r, self.cathedral_underground, self.__connect_one_way_regions("Mithalas Cathedral underground", "Mithalas Cathedral",
lambda state: _has_energy_form(state, self.player)) self.cathedral_underground, self.cathedral_r,
self.__connect_one_way_regions("Mithalas Cathedral underground", "Cathedral boss left area", lambda state: _has_beast_form(state, self.player) and
self.cathedral_underground, self.cathedral_boss_r, _has_energy_attack_item(state, self.player))
lambda state: _has_energy_form(state, self.player) and self.__connect_one_way_regions("Mithalas Cathedral underground", "Cathedral boss right area",
_has_bind_song(state, self.player)) self.cathedral_underground, self.cathedral_boss_r)
self.__connect_one_way_regions("Cathedral boss left area", "Mithalas Cathedral underground", self.__connect_one_way_regions("Cathedral boss right area", "Mithalas Cathedral underground",
self.cathedral_boss_r, self.cathedral_underground, self.cathedral_boss_r, self.cathedral_underground,
lambda state: _has_beast_form(state, self.player)) lambda state: _has_beast_form(state, self.player))
self.__connect_regions("Cathedral boss right area", "Cathedral boss left area", self.__connect_one_way_regions("Cathedral boss right area", "Cathedral boss left area",
self.cathedral_boss_r, self.cathedral_boss_l, self.cathedral_boss_r, self.cathedral_boss_l,
lambda state: _has_bind_song(state, self.player) and lambda state: _has_bind_song(state, self.player) and
_has_energy_form(state, self.player)) _has_energy_attack_item(state, self.player))
self.__connect_one_way_regions("Cathedral boss left area", "Cathedral boss right area",
self.cathedral_boss_l, self.cathedral_boss_r)
def __connect_forest_regions(self) -> None: def __connect_forest_regions(self) -> None:
""" """
@ -628,6 +657,12 @@ class AquariaRegions:
self.forest_br, self.veil_bl) self.forest_br, self.veil_bl)
self.__connect_regions("Forest bottom right", "Forest bottom left area", self.__connect_regions("Forest bottom right", "Forest bottom left area",
self.forest_br, self.forest_bl) self.forest_br, self.forest_bl)
self.__connect_one_way_regions("Forest bottom left area", "Forest bottom left area, spirit crystals",
self.forest_bl, self.forest_bl_sc,
lambda state: _has_energy_attack_item(state, self.player) or
_has_fish_form(state, self.player))
self.__connect_one_way_regions("Forest bottom left area, spirit crystals", "Forest bottom left area",
self.forest_bl_sc, self.forest_bl)
self.__connect_regions("Forest bottom right", "Forest top right area", self.__connect_regions("Forest bottom right", "Forest top right area",
self.forest_br, self.forest_tr) self.forest_br, self.forest_tr)
self.__connect_regions("Forest bottom left area", "Forest fish cave", self.__connect_regions("Forest bottom left area", "Forest fish cave",
@ -641,7 +676,7 @@ class AquariaRegions:
self.forest_tl, self.forest_tl_fp, self.forest_tl, self.forest_tl_fp,
lambda state: _has_nature_form(state, self.player) and lambda state: _has_nature_form(state, self.player) and
_has_bind_song(state, self.player) and _has_bind_song(state, self.player) and
_has_energy_form(state, self.player) and _has_energy_attack_item(state, self.player) and
_has_fish_form(state, self.player)) _has_fish_form(state, self.player))
self.__connect_regions("Forest top left area", "Forest top right area", self.__connect_regions("Forest top left area", "Forest top right area",
self.forest_tl, self.forest_tr) self.forest_tl, self.forest_tr)
@ -649,7 +684,7 @@ class AquariaRegions:
self.forest_tl, self.forest_boss_entrance) self.forest_tl, self.forest_boss_entrance)
self.__connect_regions("Forest boss area", "Forest boss entrance", self.__connect_regions("Forest boss area", "Forest boss entrance",
self.forest_boss, self.forest_boss_entrance, self.forest_boss, self.forest_boss_entrance,
lambda state: _has_energy_form(state, self.player)) lambda state: _has_energy_attack_item(state, self.player))
self.__connect_regions("Forest top right area", "Forest top right area fish pass", self.__connect_regions("Forest top right area", "Forest top right area fish pass",
self.forest_tr, self.forest_tr_fp, self.forest_tr, self.forest_tr_fp,
lambda state: _has_fish_form(state, self.player)) lambda state: _has_fish_form(state, self.player))
@ -663,7 +698,7 @@ class AquariaRegions:
self.__connect_regions("Fermog cave", "Fermog boss", self.__connect_regions("Fermog cave", "Fermog boss",
self.mermog_cave, self.mermog_boss, self.mermog_cave, self.mermog_boss,
lambda state: _has_beast_form(state, self.player) and lambda state: _has_beast_form(state, self.player) and
_has_energy_form(state, self.player)) _has_energy_attack_item(state, self.player))
def __connect_veil_regions(self) -> None: def __connect_veil_regions(self) -> None:
""" """
@ -681,8 +716,7 @@ class AquariaRegions:
self.veil_b_sc, self.veil_br, self.veil_b_sc, self.veil_br,
lambda state: _has_spirit_form(state, self.player)) lambda state: _has_spirit_form(state, self.player))
self.__connect_regions("Veil bottom right", "Veil top left area", self.__connect_regions("Veil bottom right", "Veil top left area",
self.veil_br, self.veil_tl, self.veil_br, self.veil_tl)
lambda state: _has_beast_form(state, self.player))
self.__connect_regions("Veil top left area", "Veil_top left area, fish pass", self.__connect_regions("Veil top left area", "Veil_top left area, fish pass",
self.veil_tl, self.veil_tl_fp, self.veil_tl, self.veil_tl_fp,
lambda state: _has_fish_form(state, self.player)) lambda state: _has_fish_form(state, self.player))
@ -691,20 +725,25 @@ class AquariaRegions:
self.__connect_regions("Veil top left area", "Turtle cave", self.__connect_regions("Veil top left area", "Turtle cave",
self.veil_tl, self.turtle_cave) self.veil_tl, self.turtle_cave)
self.__connect_regions("Turtle cave", "Turtle cave Bubble Cliff", self.__connect_regions("Turtle cave", "Turtle cave Bubble Cliff",
self.turtle_cave, self.turtle_cave_bubble, self.turtle_cave, self.turtle_cave_bubble)
lambda state: _has_beast_form(state, self.player))
self.__connect_regions("Veil right of sun temple", "Sun Temple right area", self.__connect_regions("Veil right of sun temple", "Sun Temple right area",
self.veil_tr_r, self.sun_temple_r) self.veil_tr_r, self.sun_temple_r)
self.__connect_regions("Sun Temple right area", "Sun Temple left area", self.__connect_one_way_regions("Sun Temple right area", "Sun Temple left area",
self.sun_temple_r, self.sun_temple_l, self.sun_temple_r, self.sun_temple_l,
lambda state: _has_bind_song(state, self.player)) lambda state: _has_bind_song(state, self.player) or
_has_light(state, self.player))
self.__connect_one_way_regions("Sun Temple left area", "Sun Temple right area",
self.sun_temple_l, self.sun_temple_r,
lambda state: _has_light(state, self.player))
self.__connect_regions("Sun Temple left area", "Veil left of sun temple", self.__connect_regions("Sun Temple left area", "Veil left of sun temple",
self.sun_temple_l, self.veil_tr_l) self.sun_temple_l, self.veil_tr_l)
self.__connect_regions("Sun Temple left area", "Sun Temple before boss area", self.__connect_regions("Sun Temple left area", "Sun Temple before boss area",
self.sun_temple_l, self.sun_temple_boss_path) self.sun_temple_l, self.sun_temple_boss_path,
lambda state: _has_light(state, self.player) or
_has_sun_crystal(state, self.player))
self.__connect_regions("Sun Temple before boss area", "Sun Temple boss area", self.__connect_regions("Sun Temple before boss area", "Sun Temple boss area",
self.sun_temple_boss_path, self.sun_temple_boss, self.sun_temple_boss_path, self.sun_temple_boss,
lambda state: _has_energy_form(state, self.player)) lambda state: _has_energy_attack_item(state, self.player))
self.__connect_one_way_regions("Sun Temple boss area", "Veil left of sun temple", self.__connect_one_way_regions("Sun Temple boss area", "Veil left of sun temple",
self.sun_temple_boss, self.veil_tr_l) self.sun_temple_boss, self.veil_tr_l)
self.__connect_regions("Veil left of sun temple", "Octo cave top path", self.__connect_regions("Veil left of sun temple", "Octo cave top path",
@ -712,7 +751,7 @@ class AquariaRegions:
lambda state: _has_fish_form(state, self.player) and lambda state: _has_fish_form(state, self.player) and
_has_sun_form(state, self.player) and _has_sun_form(state, self.player) and
_has_beast_form(state, self.player) and _has_beast_form(state, self.player) and
_has_energy_form(state, self.player)) _has_energy_attack_item(state, self.player))
self.__connect_regions("Veil left of sun temple", "Octo cave bottom path", self.__connect_regions("Veil left of sun temple", "Octo cave bottom path",
self.veil_tr_l, self.octo_cave_b, self.veil_tr_l, self.octo_cave_b,
lambda state: _has_fish_form(state, self.player)) lambda state: _has_fish_form(state, self.player))
@ -728,16 +767,22 @@ class AquariaRegions:
self.abyss_lb, self.sunken_city_r, self.abyss_lb, self.sunken_city_r,
lambda state: _has_li(state, self.player)) lambda state: _has_li(state, self.player))
self.__connect_one_way_regions("Abyss left bottom area", "Body center area", self.__connect_one_way_regions("Abyss left bottom area", "Body center area",
self.abyss_lb, self.body_c, self.abyss_lb, self.body_c,
lambda state: _has_tongue_cleared(state, self.player)) lambda state: _has_tongue_cleared(state, self.player))
self.__connect_one_way_regions("Body center area", "Abyss left bottom area", self.__connect_one_way_regions("Body center area", "Abyss left bottom area",
self.body_c, self.abyss_lb) self.body_c, self.abyss_lb)
self.__connect_regions("Abyss left area", "King jellyfish cave", self.__connect_regions("Abyss left area", "King jellyfish cave",
self.abyss_l, self.king_jellyfish_cave, self.abyss_l, self.king_jellyfish_cave,
lambda state: _has_energy_form(state, self.player) and lambda state: (_has_energy_form(state, self.player) and
_has_beast_form(state, self.player)) _has_beast_form(state, self.player)) or
_has_dual_form(state, self.player))
self.__connect_regions("Abyss left area", "Abyss right area", self.__connect_regions("Abyss left area", "Abyss right area",
self.abyss_l, self.abyss_r) self.abyss_l, self.abyss_r)
self.__connect_one_way_regions("Abyss right area", "Abyss right area, transturtle",
self.abyss_r, self.abyss_r_transturtle)
self.__connect_one_way_regions("Abyss right area, transturtle", "Abyss right area",
self.abyss_r_transturtle, self.abyss_r,
lambda state: _has_light(state, self.player))
self.__connect_regions("Abyss right area", "Inside the whale", self.__connect_regions("Abyss right area", "Inside the whale",
self.abyss_r, self.whale, self.abyss_r, self.whale,
lambda state: _has_spirit_form(state, self.player) and lambda state: _has_spirit_form(state, self.player) and
@ -747,13 +792,14 @@ class AquariaRegions:
lambda state: _has_spirit_form(state, self.player) and lambda state: _has_spirit_form(state, self.player) and
_has_sun_form(state, self.player) and _has_sun_form(state, self.player) and
_has_bind_song(state, self.player) and _has_bind_song(state, self.player) and
_has_energy_form(state, self.player)) _has_energy_attack_item(state, self.player))
self.__connect_regions("Abyss right area", "Ice Cave", self.__connect_regions("Abyss right area", "Ice Cave",
self.abyss_r, self.ice_cave, self.abyss_r, self.ice_cave,
lambda state: _has_spirit_form(state, self.player)) lambda state: _has_spirit_form(state, self.player))
self.__connect_regions("Abyss right area", "Bubble Cave", self.__connect_regions("Ice cave", "Bubble Cave",
self.ice_cave, self.bubble_cave, self.ice_cave, self.bubble_cave,
lambda state: _has_beast_form(state, self.player)) lambda state: _has_beast_form(state, self.player) or
_has_hot_soup(state, self.player))
self.__connect_regions("Bubble Cave boss area", "Bubble Cave", self.__connect_regions("Bubble Cave boss area", "Bubble Cave",
self.bubble_cave, self.bubble_cave_boss, self.bubble_cave, self.bubble_cave_boss,
lambda state: _has_nature_form(state, self.player) and _has_bind_song(state, self.player) lambda state: _has_nature_form(state, self.player) and _has_bind_song(state, self.player)
@ -772,7 +818,7 @@ class AquariaRegions:
self.sunken_city_l, self.sunken_city_boss, self.sunken_city_l, self.sunken_city_boss,
lambda state: _has_beast_form(state, self.player) and lambda state: _has_beast_form(state, self.player) and
_has_sun_form(state, self.player) and _has_sun_form(state, self.player) and
_has_energy_form(state, self.player) and _has_energy_attack_item(state, self.player) and
_has_bind_song(state, self.player)) _has_bind_song(state, self.player))
def __connect_body_regions(self) -> None: def __connect_body_regions(self) -> None:
@ -780,11 +826,13 @@ class AquariaRegions:
Connect entrances of the different regions around The Body Connect entrances of the different regions around The Body
""" """
self.__connect_regions("Body center area", "Body left area", self.__connect_regions("Body center area", "Body left area",
self.body_c, self.body_l) self.body_c, self.body_l,
lambda state: _has_energy_form(state, self.player))
self.__connect_regions("Body center area", "Body right area top path", self.__connect_regions("Body center area", "Body right area top path",
self.body_c, self.body_rt) self.body_c, self.body_rt)
self.__connect_regions("Body center area", "Body right area bottom path", self.__connect_regions("Body center area", "Body right area bottom path",
self.body_c, self.body_rb) self.body_c, self.body_rb,
lambda state: _has_energy_form(state, self.player))
self.__connect_regions("Body center area", "Body bottom area", self.__connect_regions("Body center area", "Body bottom area",
self.body_c, self.body_b, self.body_c, self.body_b,
lambda state: _has_dual_form(state, self.player)) lambda state: _has_dual_form(state, self.player))
@ -803,22 +851,12 @@ class AquariaRegions:
self.__connect_one_way_regions("final boss third form area", "final boss end", self.__connect_one_way_regions("final boss third form area", "final boss end",
self.final_boss, self.final_boss_end) self.final_boss, self.final_boss_end)
def __connect_transturtle(self, item_source: str, item_target: str, region_source: Region, region_target: Region, def __connect_transturtle(self, item_source: str, item_target: str, region_source: Region,
rule=None) -> None: region_target: Region) -> None:
"""Connect a single transturtle to another one""" """Connect a single transturtle to another one"""
if item_source != item_target: if item_source != item_target:
if rule is None: self.__connect_one_way_regions(item_source, item_target, region_source, region_target,
self.__connect_one_way_regions(item_source, item_target, region_source, region_target, lambda state: state.has(item_target, self.player))
lambda state: state.has(item_target, self.player))
else:
self.__connect_one_way_regions(item_source, item_target, region_source, region_target, rule)
def __connect_arnassi_path_transturtle(self, item_source: str, item_target: str, region_source: Region,
region_target: Region) -> None:
"""Connect the Arnassi Ruins transturtle to another one"""
self.__connect_one_way_regions(item_source, item_target, region_source, region_target,
lambda state: state.has(item_target, self.player) and
_has_fish_form(state, self.player))
def _connect_transturtle_to_other(self, item: str, region: Region) -> None: def _connect_transturtle_to_other(self, item: str, region: Region) -> None:
"""Connect a single transturtle to all others""" """Connect a single transturtle to all others"""
@ -827,24 +865,10 @@ class AquariaRegions:
self.__connect_transturtle(item, "Transturtle Open Water top right", region, self.openwater_tr_turtle) self.__connect_transturtle(item, "Transturtle Open Water top right", region, self.openwater_tr_turtle)
self.__connect_transturtle(item, "Transturtle Forest bottom left", region, self.forest_bl) self.__connect_transturtle(item, "Transturtle Forest bottom left", region, self.forest_bl)
self.__connect_transturtle(item, "Transturtle Home Water", region, self.home_water_transturtle) self.__connect_transturtle(item, "Transturtle Home Water", region, self.home_water_transturtle)
self.__connect_transturtle(item, "Transturtle Abyss right", region, self.abyss_r) self.__connect_transturtle(item, "Transturtle Abyss right", region, self.abyss_r_transturtle)
self.__connect_transturtle(item, "Transturtle Final Boss", region, self.final_boss_tube) self.__connect_transturtle(item, "Transturtle Final Boss", region, self.final_boss_tube)
self.__connect_transturtle(item, "Transturtle Simon Says", region, self.simon) self.__connect_transturtle(item, "Transturtle Simon Says", region, self.simon)
self.__connect_transturtle(item, "Transturtle Arnassi Ruins", region, self.arnassi_path, self.__connect_transturtle(item, "Transturtle Arnassi Ruins", region, self.arnassi_cave_transturtle)
lambda state: state.has("Transturtle Arnassi Ruins", self.player) and
_has_fish_form(state, self.player))
def _connect_arnassi_path_transturtle_to_other(self, item: str, region: Region) -> None:
"""Connect the Arnassi Ruins transturtle to all others"""
self.__connect_arnassi_path_transturtle(item, "Transturtle Veil top left", region, self.veil_tl)
self.__connect_arnassi_path_transturtle(item, "Transturtle Veil top right", region, self.veil_tr_l)
self.__connect_arnassi_path_transturtle(item, "Transturtle Open Water top right", region,
self.openwater_tr_turtle)
self.__connect_arnassi_path_transturtle(item, "Transturtle Forest bottom left", region, self.forest_bl)
self.__connect_arnassi_path_transturtle(item, "Transturtle Home Water", region, self.home_water_transturtle)
self.__connect_arnassi_path_transturtle(item, "Transturtle Abyss right", region, self.abyss_r)
self.__connect_arnassi_path_transturtle(item, "Transturtle Final Boss", region, self.final_boss_tube)
self.__connect_arnassi_path_transturtle(item, "Transturtle Simon Says", region, self.simon)
def __connect_transturtles(self) -> None: def __connect_transturtles(self) -> None:
"""Connect every transturtle with others""" """Connect every transturtle with others"""
@ -853,10 +877,10 @@ class AquariaRegions:
self._connect_transturtle_to_other("Transturtle Open Water top right", self.openwater_tr_turtle) self._connect_transturtle_to_other("Transturtle Open Water top right", self.openwater_tr_turtle)
self._connect_transturtle_to_other("Transturtle Forest bottom left", self.forest_bl) self._connect_transturtle_to_other("Transturtle Forest bottom left", self.forest_bl)
self._connect_transturtle_to_other("Transturtle Home Water", self.home_water_transturtle) self._connect_transturtle_to_other("Transturtle Home Water", self.home_water_transturtle)
self._connect_transturtle_to_other("Transturtle Abyss right", self.abyss_r) self._connect_transturtle_to_other("Transturtle Abyss right", self.abyss_r_transturtle)
self._connect_transturtle_to_other("Transturtle Final Boss", self.final_boss_tube) self._connect_transturtle_to_other("Transturtle Final Boss", self.final_boss_tube)
self._connect_transturtle_to_other("Transturtle Simon Says", self.simon) self._connect_transturtle_to_other("Transturtle Simon Says", self.simon)
self._connect_arnassi_path_transturtle_to_other("Transturtle Arnassi Ruins", self.arnassi_path) self._connect_transturtle_to_other("Transturtle Arnassi Ruins", self.arnassi_cave_transturtle)
def connect_regions(self) -> None: def connect_regions(self) -> None:
""" """
@ -893,7 +917,7 @@ class AquariaRegions:
self.__add_event_location(self.energy_temple_boss, self.__add_event_location(self.energy_temple_boss,
"Beating Fallen God", "Beating Fallen God",
"Fallen God beated") "Fallen God beated")
self.__add_event_location(self.cathedral_boss_r, self.__add_event_location(self.cathedral_boss_l,
"Beating Mithalan God", "Beating Mithalan God",
"Mithalan God beated") "Mithalan God beated")
self.__add_event_location(self.forest_boss, self.__add_event_location(self.forest_boss,
@ -970,8 +994,9 @@ class AquariaRegions:
"""Since Urns need to be broken, add a damaging item to rules""" """Since Urns need to be broken, add a damaging item to rules"""
add_rule(self.multiworld.get_location("Open Water top right area, first urn in the Mithalas exit", self.player), add_rule(self.multiworld.get_location("Open Water top right area, first urn in the Mithalas exit", self.player),
lambda state: _has_damaging_item(state, self.player)) lambda state: _has_damaging_item(state, self.player))
add_rule(self.multiworld.get_location("Open Water top right area, second urn in the Mithalas exit", self.player), add_rule(
lambda state: _has_damaging_item(state, self.player)) self.multiworld.get_location("Open Water top right area, second urn in the Mithalas exit", self.player),
lambda state: _has_damaging_item(state, self.player))
add_rule(self.multiworld.get_location("Open Water top right area, third urn in the Mithalas exit", self.player), add_rule(self.multiworld.get_location("Open Water top right area, third urn in the Mithalas exit", self.player),
lambda state: _has_damaging_item(state, self.player)) lambda state: _has_damaging_item(state, self.player))
add_rule(self.multiworld.get_location("Mithalas City, first urn in one of the homes", self.player), add_rule(self.multiworld.get_location("Mithalas City, first urn in one of the homes", self.player),
@ -1019,66 +1044,46 @@ class AquariaRegions:
Modify rules for location that need soup Modify rules for location that need soup
""" """
add_rule(self.multiworld.get_location("Turtle cave, Urchin Costume", self.player), add_rule(self.multiworld.get_location("Turtle cave, Urchin Costume", self.player),
lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) lambda state: _has_hot_soup(state, self.player))
add_rule(self.multiworld.get_location("Sun Worm path, first cliff bulb", self.player),
lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player))
add_rule(self.multiworld.get_location("Sun Worm path, second cliff bulb", self.player),
lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player))
add_rule(self.multiworld.get_location("The Veil top right area, bulb at the top of the waterfall", self.player), add_rule(self.multiworld.get_location("The Veil top right area, bulb at the top of the waterfall", self.player),
lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) lambda state: _has_beast_and_soup_form(state, self.player))
def __adjusting_under_rock_location(self) -> None: def __adjusting_under_rock_location(self) -> None:
""" """
Modify rules implying bind song needed for bulb under rocks Modify rules implying bind song needed for bulb under rocks
""" """
add_rule(self.multiworld.get_location("Home Water, bulb under the rock in the left path from the Verse Cave", add_rule(self.multiworld.get_location("Home Water, bulb under the rock in the left path from the Verse Cave",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Verse Cave left area, bulb under the rock at the end of the path", add_rule(self.multiworld.get_location("Verse Cave left area, bulb under the rock at the end of the path",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Naija's Home, bulb under the rock at the right of the main path", add_rule(self.multiworld.get_location("Naija's Home, bulb under the rock at the right of the main path",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Song Cave, bulb under the rock in the path to the singing statues", add_rule(self.multiworld.get_location("Song Cave, bulb under the rock in the path to the singing statues",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Song Cave, bulb under the rock close to the song door", add_rule(self.multiworld.get_location("Song Cave, bulb under the rock close to the song door",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Energy Temple second area, bulb under the rock", add_rule(self.multiworld.get_location("Energy Temple second area, bulb under the rock",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Open Water top left area, bulb under the rock in the right path", add_rule(self.multiworld.get_location("Open Water top left area, bulb under the rock in the right path",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Open Water top left area, bulb under the rock in the left path", add_rule(self.multiworld.get_location("Open Water top left area, bulb under the rock in the left path",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Kelp Forest top right area, bulb under the rock in the right path", add_rule(self.multiworld.get_location("Kelp Forest top right area, bulb under the rock in the right path",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("The Veil top left area, bulb under the rock in the top right path", add_rule(self.multiworld.get_location("The Veil top left area, bulb under the rock in the top right path",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Abyss right area, bulb behind the rock in the whale room", add_rule(self.multiworld.get_location("Abyss right area, bulb behind the rock in the whale room",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Abyss right area, bulb in the middle path", add_rule(self.multiworld.get_location("Abyss right area, bulb in the middle path",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("The Veil top left area, bulb under the rock in the top right path", add_rule(self.multiworld.get_location("The Veil top left area, bulb under the rock in the top right path",
self.player), lambda state: _has_bind_song(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
def __adjusting_light_in_dark_place_rules(self) -> None: def __adjusting_light_in_dark_place_rules(self) -> None:
add_rule(self.multiworld.get_location("Kelp Forest top right area, Black Pearl", self.player), add_rule(self.multiworld.get_location("Kelp Forest top right area, Black Pearl", self.player),
lambda state: _has_light(state, self.player)) lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_location("Kelp Forest bottom right area, Odd Container", self.player), add_rule(self.multiworld.get_location("Kelp Forest bottom right area, Odd Container", self.player),
lambda state: _has_light(state, self.player)) lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Transturtle Veil top left to Transturtle Abyss right", self.player),
lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Transturtle Open Water top right to Transturtle Abyss right", self.player),
lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Transturtle Veil top right to Transturtle Abyss right", self.player),
lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Transturtle Forest bottom left to Transturtle Abyss right", self.player),
lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Transturtle Home Water to Transturtle Abyss right", self.player),
lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Transturtle Final Boss to Transturtle Abyss right", self.player),
lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Transturtle Simon Says to Transturtle Abyss right", self.player),
lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Transturtle Arnassi Ruins to Transturtle Abyss right", self.player),
lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Body center area to Abyss left bottom area", self.player), add_rule(self.multiworld.get_entrance("Body center area to Abyss left bottom area", self.player),
lambda state: _has_light(state, self.player)) lambda state: _has_light(state, self.player))
add_rule(self.multiworld.get_entrance("Veil left of sun temple to Octo cave top path", self.player), add_rule(self.multiworld.get_entrance("Veil left of sun temple to Octo cave top path", self.player),
@ -1097,12 +1102,14 @@ class AquariaRegions:
def __adjusting_manual_rules(self) -> None: def __adjusting_manual_rules(self) -> None:
add_rule(self.multiworld.get_location("Mithalas Cathedral, Mithalan Dress", self.player), add_rule(self.multiworld.get_location("Mithalas Cathedral, Mithalan Dress", self.player),
lambda state: _has_beast_form(state, self.player)) lambda state: _has_beast_form(state, self.player))
add_rule(self.multiworld.get_location("Open Water bottom left area, bulb inside the lowest fish pass", self.player), add_rule(
lambda state: _has_fish_form(state, self.player)) self.multiworld.get_location("Open Water bottom left area, bulb inside the lowest fish pass", self.player),
lambda state: _has_fish_form(state, self.player))
add_rule(self.multiworld.get_location("Kelp Forest bottom left area, Walker Baby", self.player), add_rule(self.multiworld.get_location("Kelp Forest bottom left area, Walker Baby", self.player),
lambda state: _has_spirit_form(state, self.player)) lambda state: _has_spirit_form(state, self.player))
add_rule(self.multiworld.get_location("The Veil top left area, bulb hidden behind the blocking rock", self.player), add_rule(
lambda state: _has_bind_song(state, self.player)) self.multiworld.get_location("The Veil top left area, bulb hidden behind the blocking rock", self.player),
lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Turtle cave, Turtle Egg", self.player), add_rule(self.multiworld.get_location("Turtle cave, Turtle Egg", self.player),
lambda state: _has_bind_song(state, self.player)) lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Abyss left area, bulb in the bottom fish pass", self.player), add_rule(self.multiworld.get_location("Abyss left area, bulb in the bottom fish pass", self.player),
@ -1114,103 +1121,119 @@ class AquariaRegions:
add_rule(self.multiworld.get_location("Verse Cave right area, Big Seed", self.player), add_rule(self.multiworld.get_location("Verse Cave right area, Big Seed", self.player),
lambda state: _has_bind_song(state, self.player)) lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Arnassi Ruins, Song Plant Spore", self.player), add_rule(self.multiworld.get_location("Arnassi Ruins, Song Plant Spore", self.player),
lambda state: _has_beast_form(state, self.player)) lambda state: _has_beast_form_or_arnassi_armor(state, self.player))
add_rule(self.multiworld.get_location("Energy Temple first area, bulb in the bottom room blocked by a rock", add_rule(self.multiworld.get_location("Energy Temple first area, bulb in the bottom room blocked by a rock",
self.player), lambda state: _has_energy_form(state, self.player)) self.player), lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Home Water, bulb in the bottom left room", self.player), add_rule(self.multiworld.get_location("Home Water, bulb in the bottom left room", self.player),
lambda state: _has_bind_song(state, self.player)) lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Home Water, bulb in the path below Nautilus Prime", self.player), add_rule(self.multiworld.get_location("Home Water, bulb in the path below Nautilus Prime", self.player),
lambda state: _has_bind_song(state, self.player)) lambda state: _has_bind_song(state, self.player))
add_rule(self.multiworld.get_location("Naija's Home, bulb after the energy door", self.player), add_rule(self.multiworld.get_location("Naija's Home, bulb after the energy door", self.player),
lambda state: _has_energy_form(state, self.player)) lambda state: _has_energy_attack_item(state, self.player))
add_rule(self.multiworld.get_location("Abyss right area, bulb behind the rock in the whale room", self.player), add_rule(self.multiworld.get_location("Abyss right area, bulb behind the rock in the whale room", self.player),
lambda state: _has_spirit_form(state, self.player) and lambda state: _has_spirit_form(state, self.player) and
_has_sun_form(state, self.player)) _has_sun_form(state, self.player))
add_rule(self.multiworld.get_location("Arnassi Ruins, Arnassi Armor", self.player), add_rule(self.multiworld.get_location("Arnassi Ruins, Arnassi Armor", self.player),
lambda state: _has_fish_form(state, self.player) and lambda state: _has_fish_form(state, self.player) or
_has_spirit_form(state, self.player)) _has_beast_and_soup_form(state, self.player))
add_rule(self.multiworld.get_location("Mithalas City, urn inside a home fish pass", self.player),
lambda state: _has_damaging_item(state, self.player))
add_rule(self.multiworld.get_location("Mithalas City, urn in the Castle flower tube entrance", self.player),
lambda state: _has_damaging_item(state, self.player))
add_rule(self.multiworld.get_location(
"The Veil top right area, bulb in the middle of the wall jump cliff", self.player
), lambda state: _has_beast_form_or_arnassi_armor(state, self.player))
add_rule(self.multiworld.get_location("Kelp Forest top left area, Jelly Egg", self.player),
lambda state: _has_beast_form(state, self.player))
add_rule(self.multiworld.get_location("Sun Worm path, first cliff bulb", self.player),
lambda state: state.has("Sun God beated", self.player))
add_rule(self.multiworld.get_location("Sun Worm path, second cliff bulb", self.player),
lambda state: state.has("Sun God beated", self.player))
add_rule(self.multiworld.get_location("The Body center area, breaking Li's cage", self.player),
lambda state: _has_tongue_cleared(state, self.player))
def __no_progression_hard_or_hidden_location(self) -> None: def __no_progression_hard_or_hidden_location(self) -> None:
self.multiworld.get_location("Energy Temple boss area, Fallen God Tooth", self.multiworld.get_location("Energy Temple boss area, Fallen God Tooth",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Mithalas boss area, beating Mithalan God", self.multiworld.get_location("Mithalas boss area, beating Mithalan God",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Kelp Forest boss area, beating Drunian God", self.multiworld.get_location("Kelp Forest boss area, beating Drunian God",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Sun Temple boss area, beating Sun God", self.multiworld.get_location("Sun Temple boss area, beating Sun God",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Sunken City, bulb on top of the boss area", self.multiworld.get_location("Sunken City, bulb on top of the boss area",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Home Water, Nautilus Egg", self.multiworld.get_location("Home Water, Nautilus Egg",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Energy Temple blaster room, Blaster Egg", self.multiworld.get_location("Energy Temple blaster room, Blaster Egg",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Mithalas City Castle, beating the Priests", self.multiworld.get_location("Mithalas City Castle, beating the Priests",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Mermog cave, Piranha Egg", self.multiworld.get_location("Mermog cave, Piranha Egg",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Octopus Cave, Dumbo Egg", self.multiworld.get_location("Octopus Cave, Dumbo Egg",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("King Jellyfish Cave, bulb in the right path from King Jelly", self.multiworld.get_location("King Jellyfish Cave, bulb in the right path from King Jelly",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("King Jellyfish Cave, Jellyfish Costume", self.multiworld.get_location("King Jellyfish Cave, Jellyfish Costume",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Final Boss area, bulb in the boss third form room", self.multiworld.get_location("Final Boss area, bulb in the boss third form room",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Sun Worm path, first cliff bulb", self.multiworld.get_location("Sun Worm path, first cliff bulb",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Sun Worm path, second cliff bulb", self.multiworld.get_location("Sun Worm path, second cliff bulb",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("The Veil top right area, bulb at the top of the waterfall", self.multiworld.get_location("The Veil top right area, bulb at the top of the waterfall",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Bubble Cave, bulb in the left cave wall", self.multiworld.get_location("Bubble Cave, bulb in the left cave wall",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Bubble Cave, bulb in the right cave wall (behind the ice crystal)", self.multiworld.get_location("Bubble Cave, bulb in the right cave wall (behind the ice crystal)",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Bubble Cave, Verse Egg", self.multiworld.get_location("Bubble Cave, Verse Egg",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit crystals", self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit crystals",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Kelp Forest bottom left area, Walker Baby", self.multiworld.get_location("Kelp Forest bottom left area, Walker Baby",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Sun Temple, Sun Key", self.multiworld.get_location("Sun Temple, Sun Key",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("The Body bottom area, Mutant Costume", self.multiworld.get_location("The Body bottom area, Mutant Costume",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Sun Temple, bulb in the hidden room of the right part", self.multiworld.get_location("Sun Temple, bulb in the hidden room of the right part",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
self.multiworld.get_location("Arnassi Ruins, Arnassi Armor", self.multiworld.get_location("Arnassi Ruins, Arnassi Armor",
self.player).item_rule =\ self.player).item_rule = \
lambda item: item.classification != ItemClassification.progression lambda item: item.classification != ItemClassification.progression
def adjusting_rules(self, options: AquariaOptions) -> None: def adjusting_rules(self, options: AquariaOptions) -> None:
""" """
Modify rules for single location or optional rules Modify rules for single location or optional rules
""" """
self.multiworld.get_entrance("Before Final Boss to Final Boss", self.player)
self.__adjusting_urns_rules() self.__adjusting_urns_rules()
self.__adjusting_crates_rules() self.__adjusting_crates_rules()
self.__adjusting_soup_rules() self.__adjusting_soup_rules()
@ -1234,7 +1257,7 @@ class AquariaRegions:
lambda state: _has_bind_song(state, self.player)) lambda state: _has_bind_song(state, self.player))
if options.unconfine_home_water.value in [0, 2]: if options.unconfine_home_water.value in [0, 2]:
add_rule(self.multiworld.get_entrance("Home Water to Open Water top left area", self.player), add_rule(self.multiworld.get_entrance("Home Water to Open Water top left area", self.player),
lambda state: _has_bind_song(state, self.player) and _has_energy_form(state, self.player)) lambda state: _has_bind_song(state, self.player) and _has_energy_attack_item(state, self.player))
if options.early_energy_form: if options.early_energy_form:
self.multiworld.early_items[self.player]["Energy form"] = 1 self.multiworld.early_items[self.player]["Energy form"] = 1
@ -1274,6 +1297,7 @@ class AquariaRegions:
self.multiworld.regions.append(self.arnassi) self.multiworld.regions.append(self.arnassi)
self.multiworld.regions.append(self.arnassi_path) self.multiworld.regions.append(self.arnassi_path)
self.multiworld.regions.append(self.arnassi_crab_boss) self.multiworld.regions.append(self.arnassi_crab_boss)
self.multiworld.regions.append(self.arnassi_cave_transturtle)
self.multiworld.regions.append(self.simon) self.multiworld.regions.append(self.simon)
def __add_mithalas_regions_to_world(self) -> None: def __add_mithalas_regions_to_world(self) -> None:
@ -1300,6 +1324,7 @@ class AquariaRegions:
self.multiworld.regions.append(self.forest_tr) self.multiworld.regions.append(self.forest_tr)
self.multiworld.regions.append(self.forest_tr_fp) self.multiworld.regions.append(self.forest_tr_fp)
self.multiworld.regions.append(self.forest_bl) self.multiworld.regions.append(self.forest_bl)
self.multiworld.regions.append(self.forest_bl_sc)
self.multiworld.regions.append(self.forest_br) self.multiworld.regions.append(self.forest_br)
self.multiworld.regions.append(self.forest_boss) self.multiworld.regions.append(self.forest_boss)
self.multiworld.regions.append(self.forest_boss_entrance) self.multiworld.regions.append(self.forest_boss_entrance)
@ -1337,6 +1362,7 @@ class AquariaRegions:
self.multiworld.regions.append(self.abyss_l) self.multiworld.regions.append(self.abyss_l)
self.multiworld.regions.append(self.abyss_lb) self.multiworld.regions.append(self.abyss_lb)
self.multiworld.regions.append(self.abyss_r) self.multiworld.regions.append(self.abyss_r)
self.multiworld.regions.append(self.abyss_r_transturtle)
self.multiworld.regions.append(self.ice_cave) self.multiworld.regions.append(self.ice_cave)
self.multiworld.regions.append(self.bubble_cave) self.multiworld.regions.append(self.bubble_cave)
self.multiworld.regions.append(self.bubble_cave_boss) self.multiworld.regions.append(self.bubble_cave_boss)

View File

@ -141,7 +141,7 @@ after_home_water_locations = [
"Sun Temple, bulb at the top of the high dark room", "Sun Temple, bulb at the top of the high dark room",
"Sun Temple, Golden Gear", "Sun Temple, Golden Gear",
"Sun Temple, first bulb of the temple", "Sun Temple, first bulb of the temple",
"Sun Temple, bulb on the left part", "Sun Temple, bulb on the right part",
"Sun Temple, bulb in the hidden room of the right part", "Sun Temple, bulb in the hidden room of the right part",
"Sun Temple, Sun Key", "Sun Temple, Sun Key",
"Sun Worm path, first path bulb", "Sun Worm path, first path bulb",

View File

@ -13,36 +13,16 @@ class BeastFormAccessTest(AquariaTestBase):
def test_beast_form_location(self) -> None: def test_beast_form_location(self) -> None:
"""Test locations that require beast form""" """Test locations that require beast form"""
locations = [ locations = [
"Mithalas City Castle, beating the Priests",
"Arnassi Ruins, Crab Armor",
"Arnassi Ruins, Song Plant Spore",
"Mithalas City, first bulb at the end of the top path",
"Mithalas City, second bulb at the end of the top path",
"Mithalas City, bulb in the top path",
"Mithalas City, Mithalas Pot",
"Mithalas City, urn in the Castle flower tube entrance",
"Mermog cave, Piranha Egg", "Mermog cave, Piranha Egg",
"Kelp Forest top left area, Jelly Egg",
"Mithalas Cathedral, Mithalan Dress", "Mithalas Cathedral, Mithalan Dress",
"Turtle cave, bulb in Bubble Cliff",
"Turtle cave, Urchin Costume",
"Sun Worm path, first cliff bulb",
"Sun Worm path, second cliff bulb",
"The Veil top right area, bulb at the top of the waterfall", "The Veil top right area, bulb at the top of the waterfall",
"Bubble Cave, bulb in the left cave wall",
"Bubble Cave, bulb in the right cave wall (behind the ice crystal)",
"Bubble Cave, Verse Egg",
"Sunken City, bulb on top of the boss area", "Sunken City, bulb on top of the boss area",
"Octopus Cave, Dumbo Egg", "Octopus Cave, Dumbo Egg",
"Beating the Golem", "Beating the Golem",
"Beating Mergog", "Beating Mergog",
"Beating Crabbius Maximus",
"Beating Octopus Prime", "Beating Octopus Prime",
"Beating Mantis Shrimp Prime", "Sunken City cleared",
"King Jellyfish Cave, Jellyfish Costume",
"King Jellyfish Cave, bulb in the right path from King Jelly",
"Beating King Jellyfish God Prime",
"Beating Mithalan priests",
"Sunken City cleared"
] ]
items = [["Beast form"]] items = [["Beast form"]]
self.assertAccessDependency(locations, items) self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,39 @@
"""
Author: Louis M
Date: Thu, 18 Apr 2024 18:45:56 +0000
Description: Unit test used to test accessibility of locations with and without the beast form or arnassi armor
"""
from . import AquariaTestBase
class BeastForArnassiArmormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the beast form or arnassi armor"""
def test_beast_form_arnassi_armor_location(self) -> None:
"""Test locations that require beast form or arnassi armor"""
locations = [
"Mithalas City Castle, beating the Priests",
"Arnassi Ruins, Crab Armor",
"Arnassi Ruins, Song Plant Spore",
"Mithalas City, first bulb at the end of the top path",
"Mithalas City, second bulb at the end of the top path",
"Mithalas City, bulb in the top path",
"Mithalas City, Mithalas Pot",
"Mithalas City, urn in the Castle flower tube entrance",
"Mermog cave, Piranha Egg",
"Mithalas Cathedral, Mithalan Dress",
"Kelp Forest top left area, Jelly Egg",
"The Veil top right area, bulb in the middle of the wall jump cliff",
"The Veil top right area, bulb at the top of the waterfall",
"Sunken City, bulb on top of the boss area",
"Octopus Cave, Dumbo Egg",
"Beating the Golem",
"Beating Mergog",
"Beating Crabbius Maximus",
"Beating Octopus Prime",
"Beating Mithalan priests",
"Sunken City cleared"
]
items = [["Beast form", "Arnassi Armor"]]
self.assertAccessDependency(locations, items)

View File

@ -17,55 +17,16 @@ class EnergyFormAccessTest(AquariaTestBase):
def test_energy_form_location(self) -> None: def test_energy_form_location(self) -> None:
"""Test locations that require Energy form""" """Test locations that require Energy form"""
locations = [ locations = [
"Home Water, Nautilus Egg",
"Naija's Home, bulb after the energy door",
"Energy Temple first area, bulb in the bottom room blocked by a rock",
"Energy Temple second area, bulb under the rock", "Energy Temple second area, bulb under the rock",
"Energy Temple bottom entrance, Krotite Armor",
"Energy Temple third area, bulb in the bottom path", "Energy Temple third area, bulb in the bottom path",
"Energy Temple boss area, Fallen God Tooth", "The Body left area, first bulb in the top face room",
"Energy Temple blaster room, Blaster Egg", "The Body left area, second bulb in the top face room",
"Mithalas City Castle, beating the Priests", "The Body left area, bulb below the water stream",
"Mithalas Cathedral, first urn in the top right room", "The Body left area, bulb in the top path to the top face room",
"Mithalas Cathedral, second urn in the top right room", "The Body left area, bulb in the bottom face room",
"Mithalas Cathedral, third urn in the top right room", "The Body right area, bulb in the top path to the bottom face room",
"Mithalas Cathedral, urn in the flesh room with fleas", "The Body right area, bulb in the bottom face room",
"Mithalas Cathedral, first urn in the bottom right path",
"Mithalas Cathedral, second urn in the bottom right path",
"Mithalas Cathedral, urn behind the flesh vein",
"Mithalas Cathedral, urn in the top left eyes boss room",
"Mithalas Cathedral, first urn in the path behind the flesh vein",
"Mithalas Cathedral, second urn in the path behind the flesh vein",
"Mithalas Cathedral, third urn in the path behind the flesh vein",
"Mithalas Cathedral, fourth urn in the top right room",
"Mithalas Cathedral, Mithalan Dress",
"Mithalas Cathedral, urn below the left entrance",
"Mithalas boss area, beating Mithalan God",
"Kelp Forest top left area, bulb close to the Verse Egg",
"Kelp Forest top left area, Verse Egg",
"Kelp Forest boss area, beating Drunian God",
"Mermog cave, Piranha Egg",
"Octopus Cave, Dumbo Egg",
"Sun Temple boss area, beating Sun God",
"Arnassi Ruins, Crab Armor",
"King Jellyfish Cave, bulb in the right path from King Jelly",
"King Jellyfish Cave, Jellyfish Costume",
"Sunken City, bulb on top of the boss area",
"Final Boss area, bulb in the boss third form room", "Final Boss area, bulb in the boss third form room",
"Beating Fallen God",
"Beating Mithalan God",
"Beating Drunian God",
"Beating Sun God",
"Beating the Golem",
"Beating Nautilus Prime",
"Beating Blaster Peg Prime",
"Beating Mergog",
"Beating Mithalan priests",
"Beating Octopus Prime",
"Beating Crabbius Maximus",
"Beating King Jellyfish God Prime",
"First secret",
"Sunken City cleared",
"Objective complete", "Objective complete",
] ]
items = [["Energy form"]] items = [["Energy form"]]

View File

@ -0,0 +1,92 @@
"""
Author: Louis M
Date: Thu, 18 Apr 2024 18:45:56 +0000
Description: Unit test used to test accessibility of locations with and without the energy form and dual form (and Li)
"""
from . import AquariaTestBase
class EnergyFormDualFormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the energy form and dual form (and Li)"""
options = {
"early_energy_form": False,
}
def test_energy_form_or_dual_form_location(self) -> None:
"""Test locations that require Energy form or dual form"""
locations = [
"Naija's Home, bulb after the energy door",
"Home Water, Nautilus Egg",
"Energy Temple second area, bulb under the rock",
"Energy Temple bottom entrance, Krotite Armor",
"Energy Temple third area, bulb in the bottom path",
"Energy Temple blaster room, Blaster Egg",
"Energy Temple boss area, Fallen God Tooth",
"Mithalas City Castle, beating the Priests",
"Mithalas boss area, beating Mithalan God",
"Mithalas Cathedral, first urn in the top right room",
"Mithalas Cathedral, second urn in the top right room",
"Mithalas Cathedral, third urn in the top right room",
"Mithalas Cathedral, urn in the flesh room with fleas",
"Mithalas Cathedral, first urn in the bottom right path",
"Mithalas Cathedral, second urn in the bottom right path",
"Mithalas Cathedral, urn behind the flesh vein",
"Mithalas Cathedral, urn in the top left eyes boss room",
"Mithalas Cathedral, first urn in the path behind the flesh vein",
"Mithalas Cathedral, second urn in the path behind the flesh vein",
"Mithalas Cathedral, third urn in the path behind the flesh vein",
"Mithalas Cathedral, fourth urn in the top right room",
"Mithalas Cathedral, Mithalan Dress",
"Mithalas Cathedral, urn below the left entrance",
"Kelp Forest top left area, bulb close to the Verse Egg",
"Kelp Forest top left area, Verse Egg",
"Kelp Forest boss area, beating Drunian God",
"Mermog cave, Piranha Egg",
"Octopus Cave, Dumbo Egg",
"Sun Temple boss area, beating Sun God",
"King Jellyfish Cave, bulb in the right path from King Jelly",
"King Jellyfish Cave, Jellyfish Costume",
"Sunken City right area, crate close to the save crystal",
"Sunken City right area, crate in the left bottom room",
"Sunken City left area, crate in the little pipe room",
"Sunken City left area, crate close to the save crystal",
"Sunken City left area, crate before the bedroom",
"Sunken City left area, Girl Costume",
"Sunken City, bulb on top of the boss area",
"The Body center area, breaking Li's cage",
"The Body center area, bulb on the main path blocking tube",
"The Body left area, first bulb in the top face room",
"The Body left area, second bulb in the top face room",
"The Body left area, bulb below the water stream",
"The Body left area, bulb in the top path to the top face room",
"The Body left area, bulb in the bottom face room",
"The Body right area, bulb in the top face room",
"The Body right area, bulb in the top path to the bottom face room",
"The Body right area, bulb in the bottom face room",
"The Body bottom area, bulb in the Jelly Zap room",
"The Body bottom area, bulb in the nautilus room",
"The Body bottom area, Mutant Costume",
"Final Boss area, bulb in the boss third form room",
"Final Boss area, first bulb in the turtle room",
"Final Boss area, second bulb in the turtle room",
"Final Boss area, third bulb in the turtle room",
"Final Boss area, Transturtle",
"Beating Fallen God",
"Beating Blaster Peg Prime",
"Beating Mithalan God",
"Beating Drunian God",
"Beating Sun God",
"Beating the Golem",
"Beating Nautilus Prime",
"Beating Mergog",
"Beating Mithalan priests",
"Beating Octopus Prime",
"Beating King Jellyfish God Prime",
"Beating the Golem",
"Sunken City cleared",
"First secret",
"Objective complete"
]
items = [["Energy form", "Dual form", "Li and Li song", "Body tongue cleared"]]
self.assertAccessDependency(locations, items)

View File

@ -17,6 +17,7 @@ class FishFormAccessTest(AquariaTestBase):
"""Test locations that require fish form""" """Test locations that require fish form"""
locations = [ locations = [
"The Veil top left area, bulb inside the fish pass", "The Veil top left area, bulb inside the fish pass",
"Energy Temple first area, Energy Idol",
"Mithalas City, Doll", "Mithalas City, Doll",
"Mithalas City, urn inside a home fish pass", "Mithalas City, urn inside a home fish pass",
"Kelp Forest top right area, bulb in the top fish pass", "Kelp Forest top right area, bulb in the top fish pass",
@ -30,8 +31,7 @@ class FishFormAccessTest(AquariaTestBase):
"Octopus Cave, Dumbo Egg", "Octopus Cave, Dumbo Egg",
"Octopus Cave, bulb in the path below the Octopus Cave path", "Octopus Cave, bulb in the path below the Octopus Cave path",
"Beating Octopus Prime", "Beating Octopus Prime",
"Abyss left area, bulb in the bottom fish pass", "Abyss left area, bulb in the bottom fish pass"
"Arnassi Ruins, Arnassi Armor"
] ]
items = [["Fish form"]] items = [["Fish form"]]
self.assertAccessDependency(locations, items) self.assertAccessDependency(locations, items)

View File

@ -39,7 +39,6 @@ class LightAccessTest(AquariaTestBase):
"Abyss right area, bulb in the middle path", "Abyss right area, bulb in the middle path",
"Abyss right area, bulb behind the rock in the middle path", "Abyss right area, bulb behind the rock in the middle path",
"Abyss right area, bulb in the left green room", "Abyss right area, bulb in the left green room",
"Abyss right area, Transturtle",
"Ice Cave, bulb in the room to the right", "Ice Cave, bulb in the room to the right",
"Ice Cave, first bulb in the top exit room", "Ice Cave, first bulb in the top exit room",
"Ice Cave, second bulb in the top exit room", "Ice Cave, second bulb in the top exit room",

View File

@ -30,7 +30,6 @@ class SpiritFormAccessTest(AquariaTestBase):
"Sunken City left area, Girl Costume", "Sunken City left area, Girl Costume",
"Beating Mantis Shrimp Prime", "Beating Mantis Shrimp Prime",
"First secret", "First secret",
"Arnassi Ruins, Arnassi Armor",
] ]
items = [["Spirit form"]] items = [["Spirit form"]]
self.assertAccessDependency(locations, items) self.assertAccessDependency(locations, items)