Aquaria: implement new game (#3197)

This is a new world for the Aquaria game (https://www.bit-blot.com/aquaria/).
This commit is contained in:
Louis M 2024-05-17 06:29:00 -04:00 committed by GitHub
parent 7900e4c9a4
commit 89a2a3c35b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 3851 additions and 0 deletions

View File

@ -16,6 +16,9 @@
# A Link to the Past # A Link to the Past
/worlds/alttp/ @Berserker66 /worlds/alttp/ @Berserker66
# Aquaria
/worlds/aquaria/ @tioui
# ArchipIDLE # ArchipIDLE
/worlds/archipidle/ @LegendaryLinux /worlds/archipidle/ @LegendaryLinux

210
worlds/aquaria/Items.py Normal file
View File

@ -0,0 +1,210 @@
"""
Author: Louis M
Date: Fri, 15 Mar 2024 18:41:40 +0000
Description: Manage items in the Aquaria game multiworld randomizer
"""
from typing import Optional
from enum import Enum
from BaseClasses import Item, ItemClassification
class ItemType(Enum):
"""
Used to indicate to the multi-world if an item is usefull or not
"""
NORMAL = 0
PROGRESSION = 1
JUNK = 2
class ItemGroup(Enum):
"""
Used to group items
"""
COLLECTIBLE = 0
INGREDIENT = 1
RECIPE = 2
HEALTH = 3
UTILITY = 4
SONG = 5
TURTLE = 6
class AquariaItem(Item):
"""
A single item in the Aquaria game.
"""
game: str = "Aquaria"
"""The name of the game"""
def __init__(self, name: str, classification: ItemClassification,
code: Optional[int], player: int):
"""
Initialisation of the Item
:param name: The name of the item
:param classification: If the item is usefull or not
:param code: The ID of the item (if None, it is an event)
:param player: The ID of the player in the multiworld
"""
super().__init__(name, classification, code, player)
class ItemData:
"""
Data of an item.
"""
id:int
count:int
type:ItemType
group:ItemGroup
def __init__(self, id:int, count:int, type:ItemType, group:ItemGroup):
"""
Initialisation of the item data
@param id: The item ID
@param count: the number of items in the pool
@param type: the importance type of the item
@param group: the usage of the item in the game
"""
self.id = id
self.count = count
self.type = type
self.group = group
"""Information data for every (not event) item."""
item_table = {
# name: ID, Nb, Item Type, Item Group
"Anemone": ItemData(698000, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_anemone
"Arnassi statue": ItemData(698001, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_arnassi_statue
"Big seed": ItemData(698002, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_big_seed
"Glowing seed": ItemData(698003, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_bio_seed
"Black pearl": ItemData(698004, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_blackpearl
"Baby blaster": ItemData(698005, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_blaster
"Crab armor": ItemData(698006, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_crab_costume
"Baby dumbo": ItemData(698007, 1, ItemType.PROGRESSION, ItemGroup.UTILITY), # collectible_dumbo
"Tooth": ItemData(698008, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_boss
"Energy statue": ItemData(698009, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_statue
"Krotite armor": ItemData(698010, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_temple
"Golden starfish": ItemData(698011, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_gold_star
"Golden gear": ItemData(698012, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_golden_gear
"Jelly beacon": ItemData(698013, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_jelly_beacon
"Jelly costume": ItemData(698014, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_jelly_costume
"Jelly plant": ItemData(698015, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_jelly_plant
"Mithalas doll": ItemData(698016, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithala_doll
"Mithalan dress": ItemData(698017, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalan_costume
"Mithalas banner": ItemData(698018, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalas_banner
"Mithalas pot": ItemData(698019, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalas_pot
"Mutant costume": ItemData(698020, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mutant_costume
"Baby nautilus": ItemData(698021, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_nautilus
"Baby piranha": ItemData(698022, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_piranha
"Arnassi Armor": ItemData(698023, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_seahorse_costume
"Seed bag": ItemData(698024, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_seed_bag
"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
"Stone head": ItemData(698027, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_stone_head
"Sun key": ItemData(698028, 1, ItemType.NORMAL, ItemGroup.COLLECTIBLE), # collectible_sun_key
"Girl costume": ItemData(698029, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_teen_costume
"Odd container": ItemData(698030, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_treasure_chest
"Trident": ItemData(698031, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_trident_head
"Turtle egg": ItemData(698032, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_turtle_egg
"Jelly egg": ItemData(698033, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_upsidedown_seed
"Urchin costume": ItemData(698034, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_urchin_costume
"Baby walker": ItemData(698035, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_walker
"Vedha's Cure-All-All": ItemData(698036, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_Vedha'sCure-All
"Zuuna's perogi": ItemData(698037, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_Zuuna'sperogi
"Arcane poultice": ItemData(698038, 7, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_arcanepoultice
"Berry ice cream": ItemData(698039, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_berryicecream
"Buttery sea loaf": ItemData(698040, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_butterysealoaf
"Cold borscht": ItemData(698041, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_coldborscht
"Cold soup": ItemData(698042, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_coldsoup
"Crab cake": ItemData(698043, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_crabcake
"Divine soup": ItemData(698044, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_divinesoup
"Dumbo ice cream": ItemData(698045, 3, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_dumboicecream
"Fish oil": ItemData(698046, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishoil
"Glowing egg": ItemData(698047, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_glowingegg
"Hand roll": ItemData(698048, 5, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_handroll
"Healing poultice": ItemData(698049, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_healingpoultice
"Hearty soup": ItemData(698050, 5, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_heartysoup
"Hot borscht": ItemData(698051, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_hotborscht
"Hot soup": ItemData(698052, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_hotsoup
"Ice cream": ItemData(698053, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_icecream
"Leadership roll": ItemData(698054, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leadershiproll
"Leaf poultice": ItemData(698055, 5, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_leafpoultice
"Leeching poultice": ItemData(698056, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leechingpoultice
"Legendary cake": ItemData(698057, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_legendarycake
"Loaf of life": ItemData(698058, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_loafoflife
"Long life soup": ItemData(698059, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_longlifesoup
"Magic soup": ItemData(698060, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_magicsoup
"Mushroom x 2": ItemData(698061, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_mushroom
"Perogi": ItemData(698062, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_perogi
"Plant leaf": ItemData(698063, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf
"Plump perogi": ItemData(698064, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_plumpperogi
"Poison loaf": ItemData(698065, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_poisonloaf
"Poison soup": ItemData(698066, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_poisonsoup
"Rainbow mushroom": ItemData(698067, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_rainbowmushroom
"Rainbow soup": ItemData(698068, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_rainbowsoup
"Red berry": ItemData(698069, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_redberry
"Red bulb x 2": ItemData(698070, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_redbulb
"Rotten cake": ItemData(698071, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_rottencake
"Rotten loaf x 8": ItemData(698072, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_rottenloaf
"Rotten meat": ItemData(698073, 5, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat
"Royal soup": ItemData(698074, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_royalsoup
"Sea cake": ItemData(698075, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_seacake
"Sea loaf": ItemData(698076, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_sealoaf
"Shark fin soup": ItemData(698077, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sharkfinsoup
"Sight poultice": ItemData(698078, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sightpoultice
"Small bone x 2": ItemData(698079, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallbone
"Small egg": ItemData(698080, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallegg
"Small tentacle x 2": ItemData(698081, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smalltentacle
"Special bulb": ItemData(698082, 5, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_specialbulb
"Special cake": ItemData(698083, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_specialcake
"Spicy meat x 2": ItemData(698084, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_spicymeat
"Spicy roll": ItemData(698085, 11, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spicyroll
"Spicy soup": ItemData(698086, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spicysoup
"Spider roll": ItemData(698087, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spiderroll
"Swamp cake": ItemData(698088, 3, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_swampcake
"Tasty cake": ItemData(698089, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_tastycake
"Tasty roll": ItemData(698090, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_tastyroll
"Tough cake": ItemData(698091, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_toughcake
"Turtle soup": ItemData(698092, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_turtlesoup
"Vedha sea crisp": ItemData(698093, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_vedhaseacrisp
"Veggie cake": ItemData(698094, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggiecake
"Veggie ice cream": ItemData(698095, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggieicecream
"Veggie soup": ItemData(698096, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggiesoup
"Volcano roll": ItemData(698097, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_volcanoroll
"Health upgrade": ItemData(698098, 5, ItemType.NORMAL, ItemGroup.HEALTH), # upgrade_health_?
"Wok": ItemData(698099, 1, ItemType.NORMAL, ItemGroup.UTILITY), # upgrade_wok
"Eel oil x 2": ItemData(698100, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_eeloil
"Fish meat x 2": ItemData(698101, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishmeat
"Fish oil x 3": ItemData(698102, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishoil
"Glowing egg x 2": ItemData(698103, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_glowingegg
"Healing poultice x 2": ItemData(698104, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_healingpoultice
"Hot soup x 2": ItemData(698105, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_hotsoup
"Leadership roll x 2": ItemData(698106, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leadershiproll
"Leaf poultice x 3": ItemData(698107, 2, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_leafpoultice
"Plant leaf x 2": ItemData(698108, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf
"Plant leaf x 3": ItemData(698109, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf
"Rotten meat x 2": ItemData(698110, 1, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat
"Rotten meat x 8": ItemData(698111, 1, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat
"Sea loaf x 2": ItemData(698112, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_sealoaf
"Small bone x 3": ItemData(698113, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallbone
"Small egg x 2": ItemData(698114, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallegg
"Li and Li song": ItemData(698115, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_li
"Shield song": ItemData(698116, 1, ItemType.NORMAL, ItemGroup.SONG), # song_shield
"Beast form": ItemData(698117, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_beast
"Sun form": ItemData(698118, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_sun
"Nature form": ItemData(698119, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_nature
"Energy form": ItemData(698120, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_energy
"Bind song": ItemData(698121, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_bind
"Fish form": ItemData(698122, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_fish
"Spirit form": ItemData(698123, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_spirit
"Dual form": ItemData(698124, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_dual
"Transturtle Veil top left": ItemData(698125, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_veil01
"Transturtle Veil top right": ItemData(698126, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_veil02
"Transturtle Open Water top right": ItemData(698127, 1, ItemType.PROGRESSION,
ItemGroup.TURTLE), # transport_openwater03
"Transturtle Forest bottom left": ItemData(698128, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_forest04
"Transturtle Home water": ItemData(698129, 1, ItemType.NORMAL, ItemGroup.TURTLE), # transport_mainarea
"Transturtle Abyss right": ItemData(698130, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_abyss03
"Transturtle Final Boss": ItemData(698131, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_finalboss
"Transturtle Simon says": ItemData(698132, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_forest05
"Transturtle Arnassi ruins": ItemData(698133, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_seahorse
}

574
worlds/aquaria/Locations.py Normal file
View File

@ -0,0 +1,574 @@
"""
Author: Louis M
Date: Fri, 15 Mar 2024 18:41:40 +0000
Description: Manage locations in the Aquaria game multiworld randomizer
"""
from BaseClasses import Location
class AquariaLocation(Location):
"""
A location in the game.
"""
game: str = "Aquaria"
"""The name of the game"""
def __init__(self, player: int, name="", code=None, parent=None) -> None:
"""
Initialisation of the object
:param player: the ID of the player
:param name: the name of the location
:param code: the ID (or address) of the location (Event if None)
:param parent: the Region that this location belongs to
"""
super(AquariaLocation, self).__init__(player, name, code, parent)
self.event = code is None
class AquariaLocations:
locations_verse_cave_r = {
"Verse cave, bulb in the skeleton room": 698107,
"Verse cave, bulb in the path left of the skeleton room": 698108,
"Verse cave right area, Big Seed": 698175,
}
locations_verse_cave_l = {
"Verse cave, the Naija hint about here shield ability": 698200,
"Verse cave left area, bulb in the center part": 698021,
"Verse cave left area, bulb in the right part": 698022,
"Verse cave left area, bulb under the rock at the end of the path": 698023,
}
locations_home_water = {
"Home water, bulb below the grouper fish": 698058,
"Home water, bulb in the path bellow Nautilus Prime": 698059,
"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 top left path": 698062,
"Home water, bulb in the bottom left room": 698063,
"Home water, bulb close to the Naija's home": 698064,
"Home water, bulb under the rock in the left path from the verse cave": 698065,
}
locations_home_water_nautilus = {
"Home water, Nautilus Egg": 698194,
}
locations_home_water_transturtle = {
"Home water, Transturtle": 698213,
}
locations_naija_home = {
"Naija's home, bulb after the energy door": 698119,
"Naija's home, bulb under the rock at the right of the main path": 698120,
}
locations_song_cave = {
"Song cave, Erulian spirit": 698206,
"Song cave, bulb in the top left part": 698071,
"Song cave, bulb in the big anemone room": 698072,
"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 close to the song door": 698075,
"Song cave, Verse egg": 698160,
"Song cave, Jelly beacon": 698178,
"Song cave, Anemone seed": 698162,
}
locations_energy_temple_1 = {
"Energy temple first area, beating the energy statue": 698205,
"Energy temple first area, bulb in the bottom room blocked by a rock": 698027,
}
locations_energy_temple_idol = {
"Energy temple first area, Energy Idol": 698170,
}
locations_energy_temple_2 = {
"Energy temple second area, bulb under the rock": 698028,
}
locations_energy_temple_altar = {
"Energy temple bottom entrance, Krotite armor": 698163,
}
locations_energy_temple_3 = {
"Energy temple third area, bulb in the bottom path": 698029,
}
locations_energy_temple_boss = {
"Energy temple boss area, Fallen god tooth": 698169,
}
locations_energy_temple_blaster_room = {
"Energy temple blaster room, Blaster egg": 698195,
}
locations_openwater_tl = {
"Open water top left area, bulb under the rock in the right path": 698001,
"Open water top left area, bulb under the rock in the left path": 698002,
"Open water top left area, bulb to the right of the save cristal": 698003,
}
locations_openwater_tr = {
"Open water top right area, bulb in the small path before Mithalas": 698004,
"Open water top right area, bulb in the path from the left entrance": 698005,
"Open water top right area, bulb in the clearing close to the bottom exit": 698006,
"Open water top right area, bulb in the big clearing close to the save cristal": 698007,
"Open water top right area, bulb in the big clearing to the top exit": 698008,
"Open water top right area, first urn in the Mithalas exit": 698148,
"Open water top right area, second urn in the Mithalas exit": 698149,
"Open water top right area, third urn in the Mithalas exit": 698150,
}
locations_openwater_tr_turtle = {
"Open water top right area, bulb in the turtle room": 698009,
"Open water top right area, Transturtle": 698211,
}
locations_openwater_bl = {
"Open water bottom left area, bulb behind the chomper fish": 698011,
"Open water bottom left area, bulb inside the downest fish pass": 698010,
}
locations_skeleton_path = {
"Open water skeleton path, bulb close to the right exit": 698012,
"Open water skeleton path, bulb behind the chomper fish": 698013,
}
locations_skeleton_path_sc = {
"Open water skeleton path, King skull": 698177,
}
locations_arnassi = {
"Arnassi Ruins, bulb in the right part": 698014,
"Arnassi Ruins, bulb in the left part": 698015,
"Arnassi Ruins, bulb in the center part": 698016,
"Arnassi ruins, Song plant spore on the top of the ruins": 698179,
"Arnassi ruins, Arnassi Armor": 698191,
}
locations_arnassi_path = {
"Arnassi Ruins, Arnassi statue": 698164,
"Arnassi Ruins, Transturtle": 698217,
}
locations_arnassi_crab_boss = {
"Arnassi ruins, Crab armor": 698187,
}
locations_simon = {
"Kelp forest, beating Simon says": 698156,
"Simon says area, Transturtle": 698216,
}
locations_mithalas_city = {
"Mithalas city, first bulb in the left city part": 698030,
"Mithalas city, second bulb in the left city part": 698035,
"Mithalas city, bulb in the right part": 698031,
"Mithalas city, bulb at the top of the city": 698033,
"Mithalas city, first bulb in a broken home": 698034,
"Mithalas city, second bulb in a broken home": 698041,
"Mithalas city, bulb in the bottom left part": 698037,
"Mithalas city, first bulb in one of the homes": 698038,
"Mithalas city, second bulb in one of the homes": 698039,
"Mithalas city, first urn in one of the homes": 698123,
"Mithalas city, second urn in one of the homes": 698124,
"Mithalas city, first urn in the city reserve": 698125,
"Mithalas city, second urn in the city reserve": 698126,
"Mithalas city, third urn in the city reserve": 698127,
}
locations_mithalas_city_top_path = {
"Mithalas city, first bulb at the end of the top path": 698032,
"Mithalas city, second bulb at the end of the top path": 698040,
"Mithalas city, bulb in the top path": 698036,
"Mithalas city, Mithalas pot": 698174,
"Mithalas city, urn in the cathedral flower tube entrance": 698128,
}
locations_mithalas_city_fishpass = {
"Mithalas city, Doll": 698173,
"Mithalas city, urn inside a home fish pass": 698129,
}
locations_cathedral_l = {
"Mithalas city castle, bulb in the flesh hole": 698042,
"Mithalas city castle, Blue banner": 698165,
"Mithalas city castle, urn in the bedroom": 698130,
"Mithalas city castle, first urn of the single lamp path": 698131,
"Mithalas city castle, second urn of the single lamp path": 698132,
"Mithalas city castle, urn in the bottom room": 698133,
"Mithalas city castle, first urn on the entrance path": 698134,
"Mithalas city castle, second urn on the entrance path": 698135,
}
locations_cathedral_l_tube = {
"Mithalas castle, beating the priests": 698208,
}
locations_cathedral_l_sc = {
"Mithalas city castle, Trident head": 698183,
}
locations_cathedral_r = {
"Mithalas cathedral, first urn in the top right room": 698136,
"Mithalas cathedral, second urn in the top right room": 698137,
"Mithalas cathedral, third urn in the top right room": 698138,
"Mithalas cathedral, urn in the flesh room with fleas": 698139,
"Mithalas cathedral, first urn in the bottom right path": 698140,
"Mithalas cathedral, second urn in the bottom right path": 698141,
"Mithalas cathedral, urn behind the flesh vein": 698142,
"Mithalas cathedral, urn in the top left eyes boss room": 698143,
"Mithalas cathedral, first urn in the path behind the flesh vein": 698144,
"Mithalas cathedral, second urn in the path behind the flesh vein": 698145,
"Mithalas cathedral, third urn in the path behind the flesh vein": 698146,
"Mithalas cathedral, one of the urns in the top right room": 698147,
"Mithalas cathedral, Mithalan Dress": 698189,
"Mithalas cathedral right area, urn bellow the left entrance": 698198,
}
locations_cathedral_underground = {
"Cathedral underground, bulb in the center part": 698113,
"Cathedral underground, first bulb in the top left part": 698114,
"Cathedral underground, second bulb in the top left part": 698115,
"Cathedral underground, third bulb in the top left part": 698116,
"Cathedral underground, bulb close to the save cristal": 698117,
"Cathedral underground, bulb in the bottom right path": 698118,
}
locations_cathedral_boss = {
"Cathedral boss area, beating Mithalan God": 698202,
}
locations_forest_tl = {
"Kelp Forest top left area, bulb in the bottom left clearing": 698044,
"Kelp Forest top left area, bulb in the path down from the top left clearing": 698045,
"Kelp Forest top left area, bulb in the top left clearing": 698046,
"Kelp Forest top left, Jelly Egg": 698185,
}
locations_forest_tl_fp = {
"Kelp Forest top left area, bulb close to the Verse egg": 698047,
"Kelp forest top left area, Verse egg": 698158,
}
locations_forest_tr = {
"Kelp Forest top right area, bulb under the rock in the right path": 698048,
"Kelp Forest top right area, bulb at the left of the center clearing": 698049,
"Kelp Forest top right area, bulb in the left path's big room": 698051,
"Kelp Forest top right area, bulb in the left path's small room": 698052,
"Kelp Forest top right area, bulb at the top of the center clearing": 698053,
"Kelp forest top right area, Black pearl": 698167,
}
locations_forest_tr_fp = {
"Kelp Forest top right area, bulb in the top fish pass": 698050,
}
locations_forest_bl = {
"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, Transturtle": 698212,
}
locations_forest_br = {
"Kelp forest bottom right area, Odd Container": 698168,
}
locations_forest_boss = {
"Kelp forest boss area, beating Drunian God": 698204,
}
locations_forest_boss_entrance = {
"Kelp Forest boss room, bulb at the bottom of the area": 698055,
}
locations_forest_fish_cave = {
"Kelp Forest bottom left area, Fish cave puzzle": 698207,
}
locations_forest_sprite_cave = {
"Kelp Forest sprite cave, bulb inside the fish pass": 698056,
}
locations_forest_sprite_cave_tube = {
"Kelp Forest sprite cave, bulb in the second room": 698057,
"Kelp Forest Sprite Cave, Seed bag": 698176,
}
locations_mermog_cave = {
"Mermog cave, bulb in the left part of the cave": 698121,
}
locations_mermog_boss = {
"Mermog cave, Piranha Egg": 698197,
}
locations_veil_tl = {
"The veil top left area, In the Li cave": 698199,
"The veil top left area, bulb under the rock in the top right path": 698078,
"The veil top left area, bulb hidden behind the blocking rock": 698076,
"The veil top left area, Transturtle": 698209,
}
locations_veil_tl_fp = {
"The veil top left area, bulb inside the fish pass": 698077,
}
locations_turtle_cave = {
"Turtle cave, Turtle Egg": 698184,
}
locations_turtle_cave_bubble = {
"Turtle cave, bulb in bubble cliff": 698000,
"Turtle cave, Urchin costume": 698193,
}
locations_veil_tr_r = {
"The veil top right area, bulb in the middle of the wall jump cliff": 698079,
"The veil top right area, golden starfish at the bottom right of the bottom path": 698180,
}
locations_veil_tr_l = {
"The veil top right area, bulb in the top of the water fall": 698080,
"The veil top right area, Transturtle": 698210,
}
locations_veil_bl = {
"The veil bottom area, bulb in the left path": 698082,
}
locations_veil_b_sc = {
"The veil bottom area, bulb in the spirit path": 698081,
}
locations_veil_bl_fp = {
"The veil bottom area, Verse egg": 698157,
}
locations_veil_br = {
"The veil bottom area, Stone Head": 698181,
}
locations_octo_cave_t = {
"Octopus cave, Dumbo Egg": 698196,
}
locations_octo_cave_b = {
"Octopus cave, bulb in the path below the octopus cave path": 698122,
}
locations_sun_temple_l = {
"Sun temple, bulb in the top left part": 698094,
"Sun temple, bulb in the top right part": 698095,
"Sun temple, bulb at the top of the high dark room": 698096,
"Sun temple, Golden Gear": 698171,
}
locations_sun_temple_r = {
"Sun temple, first bulb of the temple": 698091,
"Sun temple, bulb on the left part": 698092,
"Sun temple, bulb in the hidden room of the right part": 698093,
"Sun temple, Sun key": 698182,
}
locations_sun_temple_boss_path = {
"Sun Worm path, first path bulb": 698017,
"Sun Worm path, second path bulb": 698018,
"Sun Worm path, first cliff bulb": 698019,
"Sun Worm path, second cliff bulb": 698020,
}
locations_sun_temple_boss = {
"Sun temple boss area, beating Sun God": 698203,
}
locations_abyss_l = {
"Abyss left area, bulb in hidden path room": 698024,
"Abyss left area, bulb in the right part": 698025,
"Abyss left area, Glowing seed": 698166,
"Abyss left area, Glowing Plant": 698172,
}
locations_abyss_lb = {
"Abyss left area, bulb in the bottom fish pass": 698026,
}
locations_abyss_r = {
"Abyss right area, bulb behind the rock in the whale room": 698109,
"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 in the left green room": 698112,
"Abyss right area, Transturtle": 698214,
}
locations_ice_cave = {
"Ice cave, bulb in the room to the right": 698083,
"Ice cave, First bulbs in the top exit room": 698084,
"Ice cave, Second bulbs in the top exit room": 698085,
"Ice cave, third bulbs in the top exit room": 698086,
"Ice cave, bulb in the left room": 698087,
}
locations_bubble_cave = {
"Bubble cave, bulb in the left cave wall": 698089,
"Bubble cave, bulb in the right cave wall (behind the ice cristal)": 698090,
}
locations_bubble_cave_boss = {
"Bubble cave, Verse egg": 698161,
}
locations_king_jellyfish_cave = {
"King Jellyfish cave, bulb in the right path from King Jelly": 698088,
"King Jellyfish cave, Jellyfish Costume": 698188,
}
locations_whale = {
"The whale, Verse egg": 698159,
}
locations_sunken_city_r = {
"Sunken city right area, crate close to the save cristal": 698154,
"Sunken city right area, crate in the left bottom room": 698155,
}
locations_sunken_city_l = {
"Sunken city left area, crate in the little pipe room": 698151,
"Sunken city left area, crate close to the save cristal": 698152,
"Sunken city left area, crate before the bedroom": 698153,
}
locations_sunken_city_l_bedroom = {
"Sunken city left area, Girl Costume": 698192,
}
locations_sunken_city_boss = {
"Sunken city, bulb on the top of the boss area (boiler room)": 698043,
}
locations_body_c = {
"The body center area, breaking li cage": 698201,
"The body main area, bulb on the main path blocking tube": 698097,
}
locations_body_l = {
"The body left area, first bulb in the top face room": 698066,
"The body left area, second bulb in the top face room": 698069,
"The body left area, bulb bellow the water stream": 698067,
"The body left area, bulb in the top path to the top face room": 698068,
"The body left area, bulb in the bottom face room": 698070,
}
locations_body_rt = {
"The body right area, bulb in the top face room": 698100,
}
locations_body_rb = {
"The body right area, bulb in the top path to the bottom face room": 698098,
"The body right area, bulb in the bottom face room": 698099,
}
locations_body_b = {
"The body bottom area, bulb in the Jelly Zap room": 698101,
"The body bottom area, bulb in the nautilus room": 698102,
"The body bottom area, Mutant Costume": 698190,
}
locations_final_boss_tube = {
"Final boss area, first bulb in the turtle room": 698103,
"Final boss area, second bulbs in the turtle room": 698104,
"Final boss area, third bulbs in the turtle room": 698105,
"Final boss area, Transturtle": 698215,
}
locations_final_boss = {
"Final boss area, bulb in the boss third form room": 698106,
}
location_table = {
**AquariaLocations.locations_openwater_tl,
**AquariaLocations.locations_openwater_tr,
**AquariaLocations.locations_openwater_tr_turtle,
**AquariaLocations.locations_openwater_bl,
**AquariaLocations.locations_skeleton_path,
**AquariaLocations.locations_skeleton_path_sc,
**AquariaLocations.locations_arnassi,
**AquariaLocations.locations_arnassi_path,
**AquariaLocations.locations_arnassi_crab_boss,
**AquariaLocations.locations_sun_temple_l,
**AquariaLocations.locations_sun_temple_r,
**AquariaLocations.locations_sun_temple_boss_path,
**AquariaLocations.locations_sun_temple_boss,
**AquariaLocations.locations_verse_cave_r,
**AquariaLocations.locations_verse_cave_l,
**AquariaLocations.locations_abyss_l,
**AquariaLocations.locations_abyss_lb,
**AquariaLocations.locations_abyss_r,
**AquariaLocations.locations_energy_temple_1,
**AquariaLocations.locations_energy_temple_2,
**AquariaLocations.locations_energy_temple_3,
**AquariaLocations.locations_energy_temple_boss,
**AquariaLocations.locations_energy_temple_blaster_room,
**AquariaLocations.locations_energy_temple_altar,
**AquariaLocations.locations_energy_temple_idol,
**AquariaLocations.locations_mithalas_city,
**AquariaLocations.locations_mithalas_city_top_path,
**AquariaLocations.locations_mithalas_city_fishpass,
**AquariaLocations.locations_cathedral_l,
**AquariaLocations.locations_cathedral_l_tube,
**AquariaLocations.locations_cathedral_l_sc,
**AquariaLocations.locations_cathedral_r,
**AquariaLocations.locations_cathedral_underground,
**AquariaLocations.locations_cathedral_boss,
**AquariaLocations.locations_forest_tl,
**AquariaLocations.locations_forest_tl_fp,
**AquariaLocations.locations_forest_tr,
**AquariaLocations.locations_forest_tr_fp,
**AquariaLocations.locations_forest_bl,
**AquariaLocations.locations_forest_br,
**AquariaLocations.locations_forest_boss,
**AquariaLocations.locations_forest_boss_entrance,
**AquariaLocations.locations_forest_sprite_cave,
**AquariaLocations.locations_forest_sprite_cave_tube,
**AquariaLocations.locations_forest_fish_cave,
**AquariaLocations.locations_home_water,
**AquariaLocations.locations_home_water_transturtle,
**AquariaLocations.locations_home_water_nautilus,
**AquariaLocations.locations_body_l,
**AquariaLocations.locations_body_rt,
**AquariaLocations.locations_body_rb,
**AquariaLocations.locations_body_c,
**AquariaLocations.locations_body_b,
**AquariaLocations.locations_final_boss_tube,
**AquariaLocations.locations_final_boss,
**AquariaLocations.locations_song_cave,
**AquariaLocations.locations_veil_tl,
**AquariaLocations.locations_veil_tl_fp,
**AquariaLocations.locations_turtle_cave,
**AquariaLocations.locations_turtle_cave_bubble,
**AquariaLocations.locations_veil_tr_r,
**AquariaLocations.locations_veil_tr_l,
**AquariaLocations.locations_veil_bl,
**AquariaLocations.locations_veil_b_sc,
**AquariaLocations.locations_veil_bl_fp,
**AquariaLocations.locations_veil_br,
**AquariaLocations.locations_ice_cave,
**AquariaLocations.locations_king_jellyfish_cave,
**AquariaLocations.locations_bubble_cave,
**AquariaLocations.locations_bubble_cave_boss,
**AquariaLocations.locations_naija_home,
**AquariaLocations.locations_mermog_cave,
**AquariaLocations.locations_mermog_boss,
**AquariaLocations.locations_octo_cave_t,
**AquariaLocations.locations_octo_cave_b,
**AquariaLocations.locations_sunken_city_l,
**AquariaLocations.locations_sunken_city_r,
**AquariaLocations.locations_sunken_city_boss,
**AquariaLocations.locations_sunken_city_l_bedroom,
**AquariaLocations.locations_simon,
**AquariaLocations.locations_whale,
}

145
worlds/aquaria/Options.py Normal file
View File

@ -0,0 +1,145 @@
"""
Author: Louis M
Date: Fri, 15 Mar 2024 18:41:40 +0000
Description: Manage options in the Aquaria game multiworld randomizer
"""
from dataclasses import dataclass
from Options import Toggle, Choice, Range, DeathLink, PerGameCommonOptions, DefaultOnToggle, StartInventoryPool
class IngredientRandomizer(Choice):
"""
Randomize Ingredients. Select if the simple ingredients (that does not have
a recipe) should be randomized. If 'common_ingredients' is selected, the
randomization will exclude the "Red Bulb", "Special Bulb" and "Rukh Egg".
"""
display_name = "Randomize Ingredients"
option_off = 0
option_common_ingredients = 1
option_all_ingredients = 2
default = 0
class DishRandomizer(Toggle):
"""Randomize the drop of Dishes (Ingredients with recipe)."""
display_name = "Dish Randomizer"
class TurtleRandomizer(Choice):
"""Randomize the transportation turtle."""
display_name = "Turtle Randomizer"
option_no_turtle_randomization = 0
option_randomize_all_turtle = 1
option_randomize_turtle_other_than_the_final_one = 2
default = 2
class EarlyEnergyForm(DefaultOnToggle):
"""
Force the Energy Form to be in a location before leaving the areas around the Home Water.
"""
display_name = "Early Energy Form"
class AquarianTranslation(Toggle):
"""Translate to English the Aquarian scripture in the game."""
display_name = "Translate Aquarian"
class BigBossesToBeat(Range):
"""
A number of big bosses to beat before having access to the creator (the final boss). The big bosses are
"Fallen God", "Mithalan God", "Drunian God", "Sun God" and "The Golem".
"""
display_name = "Big bosses to beat"
range_start = 0
range_end = 5
default = 0
class MiniBossesToBeat(Range):
"""
A number of Minibosses to beat before having access to the creator (the final boss). Mini bosses are
"Nautilus Prime", "Blaster Peg Prime", "Mergog", "Mithalan priests", "Octopus Prime", "Crabbius Maximus",
"Mantis Shrimp Prime" and "King Jellyfish God Prime". Note that the Energy statue and Simon says are not
mini bosses.
"""
display_name = "Mini bosses to beat"
range_start = 0
range_end = 8
default = 0
class Objective(Choice):
"""
The game objective can be only to kill the creator or to kill the creator
and having obtained the three every secret memories
"""
display_name = "Objective"
option_kill_the_creator = 0
option_obtain_secrets_and_kill_the_creator = 1
default = 0
class SkipFirstVision(Toggle):
"""
The first vision in the game; where Naija transform to Energy Form and get fload by enemy; is quite cool but
can be quite long when you already know what is going on. This option can be used to skip this vision.
"""
display_name = "Skip first Naija's vision"
class NoProgressionHardOrHiddenLocation(Toggle):
"""
Make sure that there is no progression items at hard to get or hard to find locations.
Those locations that will be very High location (that need beast form, soup and skill to get), every
location in the bubble cave, locations that need you to cross a false wall without any indication, Arnassi
race, bosses and mini-bosses. Usefull for those that want a casual run.
"""
display_name = "No progression in hard or hidden locations"
class LightNeededToGetToDarkPlaces(DefaultOnToggle):
"""
Make sure that the sun form or the dumbo pet can be aquired before getting to dark places. Be aware that navigating
in dark place without light is extremely difficult.
"""
display_name = "Light needed to get to dark places"
class BindSongNeededToGetUnderRockBulb(Toggle):
"""
Make sure that the bind song can be aquired before having to obtain sing bulb under rocks.
"""
display_name = "Bind song needed to get sing bulbs under rocks"
class UnconfineHomeWater(Choice):
"""
Open the way out of Home water area so that Naija can go to open water and beyond without the bind song.
"""
display_name = "Unconfine Home Water Area"
option_off = 0
option_via_energy_door = 1
option_via_transturtle = 2
option_via_both = 3
default = 0
@dataclass
class AquariaOptions(PerGameCommonOptions):
"""
Every option in the Aquaria randomizer
"""
start_inventory_from_pool: StartInventoryPool
objective: Objective
mini_bosses_to_beat: MiniBossesToBeat
big_bosses_to_beat: BigBossesToBeat
turtle_randomizer: TurtleRandomizer
early_energy_form: EarlyEnergyForm
light_needed_to_get_to_dark_places: LightNeededToGetToDarkPlaces
bind_song_needed_to_get_under_rock_bulb: BindSongNeededToGetUnderRockBulb
unconfine_home_water: UnconfineHomeWater
no_progression_hard_or_hidden_locations: NoProgressionHardOrHiddenLocation
ingredient_randomizer: IngredientRandomizer
dish_randomizer: DishRandomizer
aquarian_translation: AquarianTranslation
skip_first_vision: SkipFirstVision
death_link: DeathLink

1401
worlds/aquaria/Regions.py Executable file

File diff suppressed because it is too large Load Diff

218
worlds/aquaria/__init__.py Normal file
View File

@ -0,0 +1,218 @@
"""
Author: Louis M
Date: Fri, 15 Mar 2024 18:41:40 +0000
Description: Main module for Aquaria game multiworld randomizer
"""
from typing import List, Dict, ClassVar, Any
from ..AutoWorld import World, WebWorld
from BaseClasses import Tutorial, MultiWorld, ItemClassification
from .Items import item_table, AquariaItem, ItemType, ItemGroup
from .Locations import location_table
from .Options import AquariaOptions
from .Regions import AquariaRegions
class AquariaWeb(WebWorld):
"""
Class used to generate the Aquaria Game Web pages (setup, tutorial, etc.)
"""
theme = "ocean"
bug_report_page = "https://github.com/tioui/Aquaria_Randomizer/issues"
setup = Tutorial(
"Multiworld Setup Guide",
"A guide to setting up Aquaria for MultiWorld.",
"English",
"setup_en.md",
"setup/en",
["Tioui"]
)
setup_fr = Tutorial(
"Guide de configuration Multimonde",
"Un guide pour configurer Aquaria MultiWorld",
"Français",
"setup_fr.md",
"setup/fr",
["Tioui"]
)
tutorials = [setup, setup_fr]
class AquariaWorld(World):
"""
Aquaria is a side-scrolling action-adventure game. It follows Naija, an
aquatic humanoid woman, as she explores the underwater world of Aquaria.
Along her journey, she learns about the history of the world she inhabits
as well as her own past. The gameplay focuses on a combination of swimming,
singing, and combat, through which Naija can interact with the world. Her
songs can move items, affect plants and animals, and change her physical
appearance into other forms that have different abilities, like firing
projectiles at hostile creatures, or passing through barriers inaccessible
to her in her natural form.
From: https://en.wikipedia.org/wiki/Aquaria_(video_game)
"""
game: str = "Aquaria"
"The name of the game"
topology_present = True
"show path to required location checks in spoiler"
web: WebWorld = AquariaWeb()
"The web page generation informations"
item_name_to_id: ClassVar[Dict[str, int]] =\
{name: data.id for name, data in item_table.items()}
"The name and associated ID of each item of the world"
item_name_groups = {
"Damage": {"Energy form", "Nature form", "Beast form",
"Li and Li song", "Baby nautilus", "Baby piranha",
"Baby blaster"},
"Light": {"Sun form", "Baby dumbo"}
}
"""Grouping item make it easier to find them"""
location_name_to_id = location_table
"The name and associated ID of each location of the world"
base_id = 698000
"The starting ID of the items and locations of the world"
ingredients_substitution: List[int]
"Used to randomize ingredient drop"
options_dataclass = AquariaOptions
"Used to manage world options"
options: AquariaOptions
"Every options of the world"
regions: AquariaRegions
"Used to manage Regions"
exclude: List[str]
def __init__(self, multiworld: MultiWorld, player: int):
"""Initialisation of the Aquaria World"""
super(AquariaWorld, self).__init__(multiworld, player)
self.regions = AquariaRegions(multiworld, player)
self.ingredients_substitution = []
self.exclude = []
def create_regions(self) -> None:
"""
Create every Region in `regions`
"""
self.regions.add_regions_to_world()
self.regions.connect_regions()
self.regions.add_event_locations()
def create_item(self, name: str) -> AquariaItem:
"""
Create an AquariaItem using `name' as item name.
"""
result: AquariaItem
try:
data = item_table[name]
classification: ItemClassification = ItemClassification.useful
if data.type == ItemType.JUNK:
classification = ItemClassification.filler
elif data.type == ItemType.PROGRESSION:
classification = ItemClassification.progression
result = AquariaItem(name, classification, data.id, self.player)
except BaseException:
raise Exception('The item ' + name + ' is not valid.')
return result
def __pre_fill_item(self, item_name: str, location_name: str, precollected) -> None:
"""Pre-assign an item to a location"""
if item_name not in precollected:
self.exclude.append(item_name)
data = item_table[item_name]
item = AquariaItem(item_name, ItemClassification.useful, data.id, self.player)
self.multiworld.get_location(location_name, self.player).place_locked_item(item)
def get_filler_item_name(self):
"""Getting a random ingredient item as filler"""
ingredients = []
for name, data in item_table.items():
if data.group == ItemGroup.INGREDIENT:
ingredients.append(name)
filler_item_name = self.random.choice(ingredients)
return filler_item_name
def create_items(self) -> None:
"""Create every item in the world"""
precollected = [item.name for item in self.multiworld.precollected_items[self.player]]
if self.options.turtle_randomizer.value > 0:
if self.options.turtle_randomizer.value == 2:
self.__pre_fill_item("Transturtle Final Boss", "Final boss area, Transturtle", precollected)
else:
self.__pre_fill_item("Transturtle Veil top left", "The veil top left area, Transturtle", precollected)
self.__pre_fill_item("Transturtle Veil top right", "The veil top right area, Transturtle", precollected)
self.__pre_fill_item("Transturtle Open Water top right", "Open water top right area, Transturtle",
precollected)
self.__pre_fill_item("Transturtle Forest bottom left", "Kelp Forest bottom left area, Transturtle",
precollected)
self.__pre_fill_item("Transturtle Home water", "Home water, Transturtle", precollected)
self.__pre_fill_item("Transturtle Abyss right", "Abyss right area, Transturtle", precollected)
self.__pre_fill_item("Transturtle Final Boss", "Final boss area, Transturtle", precollected)
# The last two are inverted because in the original game, they are special turtle that communicate directly
self.__pre_fill_item("Transturtle Simon says", "Arnassi Ruins, Transturtle", precollected)
self.__pre_fill_item("Transturtle Arnassi ruins", "Simon says area, Transturtle", precollected)
for name, data in item_table.items():
if name in precollected:
precollected.remove(name)
self.multiworld.itempool.append(self.create_item(self.get_filler_item_name()))
else:
if name not in self.exclude:
for i in range(data.count):
item = self.create_item(name)
self.multiworld.itempool.append(item)
def set_rules(self) -> None:
"""
Launched when the Multiworld generator is ready to generate rules
"""
self.regions.adjusting_rules(self.options)
self.multiworld.completion_condition[self.player] = lambda \
state: state.has("Victory", self.player)
def generate_basic(self) -> None:
"""
Player-specific randomization that does not affect logic.
Used to fill then `ingredients_substitution` list
"""
simple_ingredients_substitution = [i for i in range(27)]
if self.options.ingredient_randomizer.value > 0:
if self.options.ingredient_randomizer.value == 1:
simple_ingredients_substitution.pop(-1)
simple_ingredients_substitution.pop(-1)
simple_ingredients_substitution.pop(-1)
self.random.shuffle(simple_ingredients_substitution)
if self.options.ingredient_randomizer.value == 1:
simple_ingredients_substitution.extend([24, 25, 26])
dishes_substitution = [i for i in range(27, 76)]
if self.options.dish_randomizer:
self.random.shuffle(dishes_substitution)
self.ingredients_substitution.clear()
self.ingredients_substitution.extend(simple_ingredients_substitution)
self.ingredients_substitution.extend(dishes_substitution)
def fill_slot_data(self) -> Dict[str, Any]:
return {"ingredientReplacement": self.ingredients_substitution,
"aquarianTranslate": bool(self.options.aquarian_translation.value),
"secret_needed": self.options.objective.value > 0,
"minibosses_to_kill": self.options.mini_bosses_to_beat.value,
"bigbosses_to_kill": self.options.big_bosses_to_beat.value,
"skip_first_vision": bool(self.options.skip_first_vision.value),
"unconfine_home_water_energy_door": self.options.unconfine_home_water.value in [1, 3],
"unconfine_home_water_transturtle": self.options.unconfine_home_water.value in [2, 3],
}

View File

@ -0,0 +1,64 @@
# Aquaria
## Game page in other languages:
* [Français](/games/Aquaria/info/fr)
## Where is the options page?
The player options page for this game contains all the options you need to configure and export a config file. Player
options page link: [Aquaria Player Options Page](../player-options).
## What does randomization do to this game?
The locations in the randomizer are:
- All sing bulbs;
- All Mithalas Urns;
- All Sunken City crates;
- Collectible treasure locations (including pet eggs and costumes);
- Beating Simon says;
- Li cave;
- Every Transportation Turtle (also called transturtle);
- Locations where you get songs,
* Erulian spirit cristal,
* Energy status mini-boss,
* Beating Mithalan God boss,
* Fish cave puzzle,
* Beating Drunian God boss,
* Beating Sun God boss,
* Breaking Li cage in the body
Note that, unlike the vanilla game, when opening sing bulbs, Mithalas urns and Sunken City crates,
nothing will come out of them. The moment those bulbs, urns and crates are opened, the location is considered received.
The items in the randomizer are:
- Dishes (used to learn recipes*);
- Some ingredients;
- The Wok (third plate used to cook 3 ingredients recipes everywhere);
- All collectible treasure (including pet eggs and costumes);
- Li and Li song;
- All songs (other than Li's song since it is learned when Li is obtained);
- Transportation to transturtles.
Also, there is the option to randomize every ingredient drops (from fishes, monsters
or plants).
*Note that, unlike in the vanilla game, the recipes for dishes (other than the Sea Loaf)
cannot be cooked (and learn) before being obtained as randomized items. Also, enemies and plants
that drop dishes that have not been learned before will drop ingredients of this dish instead.
## What is the goal of the game?
The goal of the Aquaria game is to beat the creator. You can also add other goals like getting
secret memories, beating a number of mini-bosses and beating a number of bosses.
## Which items can be in another player's world?
Any items specified above can be in another player's world.
## What does another world's item look like in Aquaria?
No visuals are shown when finding locations other than collectible treasure.
For those treasures, the visual of the treasure is visually unchanged.
After collecting a location check, a message will be shown to inform the player
what has been collected, and who will receive it.
## When the player receives an item, what happens?
When you receive an item, a message will pop up to inform you where you received
the item from, and which one it is.

View File

@ -0,0 +1,65 @@
# Aquaria
## Où se trouve la page des options ?
La [page des options du joueur pour ce jeu](../player-options) contient tous
les options dont vous avez besoin pour configurer et exporter le fichier.
## Quel est l'effet de la randomisation sur ce jeu ?
Les localisations du "Ransomizer" sont:
- tous les bulbes musicaux;
- toutes les urnes de Mithalas;
- toutes les caisses de la cité engloutie;
- les localisations des trésors de collections (incluant les oeufs d'animaux de compagnie et les costumes);
- Battre Simom dit;
- La caverne de Li;
- Les tortues de transportation (transturtle);
- Localisation ou on obtient normalement les musiques,
* cristal de l'esprit Erulien,
* le mini-boss de la statue de l'énergie,
* battre le dieu de Mithalas,
* résoudre l'énigme de la caverne des poissons,
* battre le dieu Drunien,
* battre le dieu du soleil,
* détruire la cage de Li dans le corps,
À noter que, contrairement au jeu original, lors de l'ouverture d'un bulbe musical, d'une urne de Mithalas ou
d'une caisse de la cité engloutie, aucun objet n'en sortira. La localisation représentée par l'objet ouvert est reçue
dès l'ouverture.
Les objets pouvant être obtenus sont:
- les recettes (permettant d'apprendre les recettes*);
- certains ingrédients;
- le Wok (la troisième assiette permettant de cuisiner avec trois ingrédients n'importe où);
- Tous les trésors de collection (incluant les oeufs d'animal de compagnie et les costumes);
- Li et la musique de Li;
- Toutes les musiques (autre que la musique de Li puisque cette dernière est apprise en obtenant Li);
- Les localisations de transportation.
Il y a également l'option pour mélanger les ingrédients obtenus en éliminant des monstres, des poissons ou des plantes.
*À noter que, contrairement au jeu original, il est impossible de cuisiner une recette qui n'a pas préalablement
été apprise en obtenant un repas en tant qu'objet. À noter également que les ennemies et plantes qui
donnent un repas dont la recette n'a pas préalablement été apprise vont donner les ingrédients de cette
recette.
## Quel est le but de Aquaria ?
Dans Aquaria, le but est de battre le monstre final (le créateur). Il est également possible d'ajouter
des buts comme obtenir les trois souvenirs secrets, ou devoir battre une quantité de boss ou de mini-boss.
## Quels objets peuvent se trouver dans le monde d'un autre joueur ?
Tous les objets indiqués plus haut peuvent être obtenus à partir du monde d'un autre joueur.
## À quoi ressemble un objet d'un autre monde dans ce jeu
Autre que pour les trésors de collection (dont le visuel demeure inchangé),
les autres localisations n'ont aucun visuel. Lorsqu'une localisation randomisée est obtenue,
un message est affiché à l'écran pour indiquer quel objet a été trouvé et pour quel joueur.
## Que se passe-t-il lorsque le joueur reçoit un objet ?
Chaque fois qu'un objet est reçu, un message apparaît à l'écran pour en informer le joueur.

View File

@ -0,0 +1,114 @@
# Aquaria Randomizer Setup Guide
## Required Software
- The original Aquaria Game (buyable from a lot of online game seller);
- The [Aquaria randomizer](https://github.com/tioui/Aquaria_Randomizer/releases)
- Optional, for sending [commands](/tutorial/Archipelago/commands/en) like `!hint`: the TextClient from [the most recent Archipelago release](https://github.com/ArchipelagoMW/Archipelago/releases)
## Installation and execution Procedures
### Windows
First, you should copy the original Aquaria folder game. The randomizer will possibly modify the game so that
the original game will stop working. Copying the folder will guarantee that the original game keeps on working.
Also, in Windows, the save files are stored in the Aquaria folder. So copying the Aquaria folder for every Multiworld
game you play will make sure that every game has their own save game.
Unzip the Aquaria randomizer release and copy all unzipped files in the Aquaria game folder. The unzipped files
are those:
- aquaria_randomizer.exe
- OpenAL32.dll
- override (directory)
- SDL2.dll
- usersettings.xml
- wrap_oal.dll
- cacert.pem
If there is a conflict between file in the original game folder and the unzipped files, you should override
the original files with the one of the unzipped randomizer.
Finally, to launch the randomizer, you must use the command line interface (you can open the command line interface
by writing `cmd` in the address bar of the Windows file explorer). Here is the command line to use to start the
randomizer:
```bash
aquaria_randomizer.exe --name YourName --server theServer:thePort
```
or, if the room has a password:
```bash
aquaria_randomizer.exe --name YourName --server theServer:thePort --password thePassword
```
### Linux when using the AppImage
If you use the AppImage, just copy it in the Aquaria game folder. You then have to make it executable. You
can do that from command line by using
```bash
chmod +x Aquaria_Randomizer-*.AppImage
```
or by using the Graphical Explorer of your system.
To launch the randomizer, just launch in command line:
```bash
./Aquaria_Randomizer-*.AppImage --name YourName --server theServer:thePort
```
or, if the room has a password:
```bash
./Aquaria_Randomizer-*.AppImage --name YourName --server theServer:thePort --password thePassword
```
Note that you should not have multiple Aquaria_Randomizer AppImage file in the same folder. If this situation occurred,
the preceding commands will launch the game multiple times.
### Linux when using the tar file
First, you should copy the original Aquaria folder game. The randomizer will possibly modify the game so that
the original game will stop working. Copying the folder will guarantee that the original game keeps on working.
Untar the Aquaria randomizer release and copy all extracted files in the Aquaria game folder. The extracted
files are those:
- aquaria_randomizer
- override (directory)
- usersettings.xml
- cacert.pem
If there is a conflict between file in the original game folder and the extracted files, you should override
the original files with the one of the extracted randomizer files.
Then, you should use your system package manager to install liblua5, libogg, libvorbis, libopenal and libsdl2.
On Debian base system (like Ubuntu), you can use the following command:
```bash
sudo apt install liblua5.1-0-dev libogg-dev libvorbis-dev libopenal-dev libsdl2-dev
```
Also, if there is some `.so` files in the Aquaria original game folder (`libgcc_s.so.1`, `libopenal.so.1`,
`libSDL-1.2.so.0` and `libstdc++.so.6`), you should remove them from the Aquaria Randomizer game folder. Those are
old libraries that will not work on the recent build of the randomizer.
To launch the randomizer, just launch in command line:
```bash
./aquaria_randomizer --name YourName --server theServer:thePort
```
or, if the room has a password:
```bash
./aquaria_randomizer --name YourName --server theServer:thePort --password thePassword
```
Note: If you have a permission denied error when using the command line, you can use this command line to be
sure that your executable has executable permission:
```bash
chmod +x aquaria_randomizer
```

View File

@ -0,0 +1,118 @@
# Guide de configuration MultiWorld d'Aquaria
## Logiciels nécessaires
- Le jeu Aquaria original (trouvable sur la majorité des sites de ventes de jeux vidéo en ligne)
- Le client Randomizer d'Aquaria [Aquaria randomizer](https://github.com/tioui/Aquaria_Randomizer/releases)
- De manière optionnel, pour pouvoir envoyer des [commandes](/tutorial/Archipelago/commands/en) comme `!hint`: utilisez le client texte de [la version la plus récente d'Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases)
## Procédures d'installation et d'exécution
### Windows
En premier lieu, vous devriez effectuer une nouvelle copie du jeu d'Aquaria original à chaque fois que vous effectuez une
nouvelle partie. La première raison de cette copie est que le randomizer modifie des fichiers qui rendront possiblement
le jeu original non fonctionnel. La seconde raison d'effectuer cette copie est que les sauvegardes sont créées
directement dans le répertoire du jeu. Donc, la copie permet d'éviter de perdre vos sauvegardes du jeu d'origine ou
encore de charger une sauvegarde d'une ancienne partie de multiworld (ce qui pourrait avoir comme conséquence de briser
la logique du multiworld).
Désarchiver le randomizer d'Aquaria et copier tous les fichiers de l'archive dans le répertoire du jeu d'Aquaria. Le
fichier d'archive devrait contenir les fichiers suivants:
- aquaria_randomizer.exe
- OpenAL32.dll
- override (directory)
- SDL2.dll
- usersettings.xml
- wrap_oal.dll
- cacert.pem
S'il y a des conflits entre les fichiers de l'archive zip et les fichiers du jeu original, vous devez utiliser
les fichiers contenus dans l'archive zip.
Finalement, pour lancer le randomizer, vous devez utiliser la ligne de commande (vous pouvez ouvrir une interface de
ligne de commande, entrez l'adresse `cmd` dans la barre d'adresse de l'explorateur de fichier de Windows). Voici
la ligne de commande à utiliser pour lancer le randomizer:
```bash
aquaria_randomizer.exe --name VotreNom --server leServeur:LePort
```
ou, si vous devez entrer un mot de passe:
```bash
aquaria_randomizer.exe --name VotreNom --server leServeur:LePort --password leMotDePasse
```
### Linux avec le fichier AppImage
Si vous utilisez le fichier AppImage, copiez le fichier dans le répertoire du jeu d'Aquaria. Ensuite, assurez-vous de
le mettre exécutable. Vous pouvez mettre le fichier exécutable avec la commande suivante:
```bash
chmod +x Aquaria_Randomizer-*.AppImage
```
ou bien en utilisant l'explorateur graphique de votre système.
Pour lancer le randomizer, utiliser la commande suivante:
```bash
./Aquaria_Randomizer-*.AppImage --name VotreNom --server LeServeur:LePort
```
Si vous devez entrer un mot de passe:
```bash
./Aquaria_Randomizer-*.AppImage --name VotreNom --server LeServeur:LePort --password LeMotDePasse
```
À noter que vous ne devez pas avoir plusieurs fichiers AppImage différents dans le même répertoire. Si cette situation
survient, le jeu sera lancé plusieurs fois.
### Linux avec le fichier tar
En premier lieu, assurez-vous de faire une copie du répertoire du jeu d'origine d'Aquaria. Les fichiers contenus
dans le randomizer auront comme impact de rendre le jeu d'origine non fonctionnel. Donc, effectuer la copie du jeu
avant de déposer le randomizer à l'intérieur permet de vous assurer de garder une version du jeu d'origine fonctionnel.
Désarchiver le fichier tar et copier tous les fichiers qu'il contient dans le répertoire du jeu d'origine d'Aquaria. Les
fichiers extraient du fichier tar devraient être les suivants:
- aquaria_randomizer
- override (directory)
- usersettings.xml
- cacert.pem
S'il y a des conflits entre les fichiers de l'archive tar et les fichiers du jeu original, vous devez utiliser
les fichiers contenus dans l'archive tar.
Ensuite, vous devez installer manuellement les librairies dont dépend le jeu: liblua5, libogg, libvorbis, libopenal and
libsdl2. Vous pouvez utiliser le système de "package" de votre système pour les installer. Voici un exemple avec
Debian (et Ubuntu):
```bash
sudo apt install liblua5.1-0-dev libogg-dev libvorbis-dev libopenal-dev libsdl2-dev
```
Notez également que s'il y a des fichiers ".so" dans le répertoire d'Aquaria (`libgcc_s.so.1`, `libopenal.so.1`,
`libSDL-1.2.so.0` and `libstdc++.so.6`), vous devriez les retirer. Il s'agit de vieille version des librairies qui
ne sont plus fonctionnelles dans les systèmes modernes et qui pourrait empêcher le randomizer de fonctionner.
Pour lancer le randomizer, utiliser la commande suivante:
```bash
./aquaria_randomizer --name VotreNom --server LeServeur:LePort
```
Si vous devez entrer un mot de passe:
```bash
./aquaria_randomizer --name VotreNom --server LeServeur:LePort --password LeMotDePasse
```
Note: Si vous avez une erreur de permission lors de l'exécution du randomizer, vous pouvez utiliser cette commande
pour vous assurer que votre fichier est exécutable:
```bash
chmod +x aquaria_randomizer
```

View File

@ -0,0 +1,218 @@
"""
Author: Louis M
Date: Thu, 18 Apr 2024 18:45:56 +0000
Description: Base class for the Aquaria randomizer unit tests
"""
from test.bases import WorldTestBase
# Every location accessible after the home water.
after_home_water_locations = [
"Sun Crystal",
"Home water, Transturtle",
"Open water top left area, bulb under the rock in the right path",
"Open water top left area, bulb under the rock in the left path",
"Open water top left area, bulb to the right of the save cristal",
"Open water top right area, bulb in the small path before Mithalas",
"Open water top right area, bulb in the path from the left entrance",
"Open water top right area, bulb in the clearing close to the bottom exit",
"Open water top right area, bulb in the big clearing close to the save cristal",
"Open water top right area, bulb in the big clearing to the top exit",
"Open water top right area, first urn in the Mithalas exit",
"Open water top right area, second urn in the Mithalas exit",
"Open water top right area, third urn in the Mithalas exit",
"Open water top right area, bulb in the turtle room",
"Open water top right area, Transturtle",
"Open water bottom left area, bulb behind the chomper fish",
"Open water bottom left area, bulb inside the downest fish pass",
"Open water skeleton path, bulb close to the right exit",
"Open water skeleton path, bulb behind the chomper fish",
"Open water skeleton path, King skull",
"Arnassi Ruins, bulb in the right part",
"Arnassi Ruins, bulb in the left part",
"Arnassi Ruins, bulb in the center part",
"Arnassi ruins, Song plant spore on the top of the ruins",
"Arnassi ruins, Arnassi Armor",
"Arnassi Ruins, Arnassi statue",
"Arnassi Ruins, Transturtle",
"Arnassi ruins, Crab armor",
"Simon says area, Transturtle",
"Mithalas city, first bulb in the left city part",
"Mithalas city, second bulb in the left city part",
"Mithalas city, bulb in the right part",
"Mithalas city, bulb at the top of the city",
"Mithalas city, first bulb in a broken home",
"Mithalas city, second bulb in a broken home",
"Mithalas city, bulb in the bottom left part",
"Mithalas city, first bulb in one of the homes",
"Mithalas city, second bulb in one of the homes",
"Mithalas city, first urn in one of the homes",
"Mithalas city, second urn in one of the homes",
"Mithalas city, first urn in the city reserve",
"Mithalas city, second urn in the city reserve",
"Mithalas city, third urn in the city reserve",
"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 cathedral flower tube entrance",
"Mithalas city, Doll",
"Mithalas city, urn inside a home fish pass",
"Mithalas city castle, bulb in the flesh hole",
"Mithalas city castle, Blue banner",
"Mithalas city castle, urn in the bedroom",
"Mithalas city castle, first urn of the single lamp path",
"Mithalas city castle, second urn of the single lamp path",
"Mithalas city castle, urn in the bottom room",
"Mithalas city castle, first urn on the entrance path",
"Mithalas city castle, second urn on the entrance path",
"Mithalas castle, beating the priests",
"Mithalas city castle, Trident head",
"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, one of the urns in the top right room",
"Mithalas cathedral, Mithalan Dress",
"Mithalas cathedral right area, urn bellow the left entrance",
"Cathedral underground, bulb in the center part",
"Cathedral underground, first bulb in the top left part",
"Cathedral underground, second bulb in the top left part",
"Cathedral underground, third bulb in the top left part",
"Cathedral underground, bulb close to the save cristal",
"Cathedral underground, bulb in the bottom right path",
"Cathedral boss area, beating Mithalan God",
"Kelp Forest top left area, bulb in the bottom left clearing",
"Kelp Forest top left area, bulb in the path down from the top left clearing",
"Kelp Forest top left area, bulb in the top left clearing",
"Kelp Forest top left, Jelly Egg",
"Kelp Forest top left area, bulb close to the Verse egg",
"Kelp forest top left area, Verse egg",
"Kelp Forest top right area, bulb under the rock in the right path",
"Kelp Forest top right area, bulb at the left of the center clearing",
"Kelp Forest top right area, bulb in the left path's big room",
"Kelp Forest top right area, bulb in the left path's small room",
"Kelp Forest top right area, bulb at the top of the center clearing",
"Kelp forest top right area, Black pearl",
"Kelp Forest top right area, bulb in the top fish pass",
"Kelp Forest bottom left area, bulb close to the spirit crystals",
"Kelp forest bottom left area, Walker baby",
"Kelp Forest bottom left area, Transturtle",
"Kelp forest bottom right area, Odd Container",
"Kelp forest boss area, beating Drunian God",
"Kelp Forest boss room, bulb at the bottom of the area",
"Kelp Forest bottom left area, Fish cave puzzle",
"Kelp Forest sprite cave, bulb inside the fish pass",
"Kelp Forest sprite cave, bulb in the second room",
"Kelp Forest Sprite Cave, Seed bag",
"Mermog cave, bulb in the left part of the cave",
"Mermog cave, Piranha Egg",
"The veil top left area, In the Li cave",
"The veil top left area, bulb under the rock in the top right path",
"The veil top left area, bulb hidden behind the blocking rock",
"The veil top left area, Transturtle",
"The veil top left area, bulb inside the fish pass",
"Turtle cave, Turtle Egg",
"Turtle cave, bulb in bubble cliff",
"Turtle cave, Urchin costume",
"The veil top right area, bulb in the middle of the wall jump cliff",
"The veil top right area, golden starfish at the bottom right of the bottom path",
"The veil top right area, bulb in the top of the water fall",
"The veil top right area, Transturtle",
"The veil bottom area, bulb in the left path",
"The veil bottom area, bulb in the spirit path",
"The veil bottom area, Verse egg",
"The veil bottom area, Stone Head",
"Octopus cave, Dumbo Egg",
"Octopus cave, bulb in the path below the octopus cave path",
"Bubble cave, bulb in the left cave wall",
"Bubble cave, bulb in the right cave wall (behind the ice cristal)",
"Bubble cave, Verse egg",
"Sun temple, bulb in the top left part",
"Sun temple, bulb in the top right part",
"Sun temple, bulb at the top of the high dark room",
"Sun temple, Golden Gear",
"Sun temple, first bulb of the temple",
"Sun temple, bulb on the left part",
"Sun temple, bulb in the hidden room of the right part",
"Sun temple, Sun key",
"Sun Worm path, first path bulb",
"Sun Worm path, second path bulb",
"Sun Worm path, first cliff bulb",
"Sun Worm path, second cliff bulb",
"Sun temple boss area, beating Sun God",
"Abyss left area, bulb in hidden path room",
"Abyss left area, bulb in the right part",
"Abyss left area, Glowing seed",
"Abyss left area, Glowing Plant",
"Abyss left area, bulb in the bottom fish pass",
"Abyss right area, bulb behind the rock in the whale room",
"Abyss right area, bulb 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, Transturtle",
"Ice cave, bulb in the room to the right",
"Ice cave, First bulbs in the top exit room",
"Ice cave, Second bulbs in the top exit room",
"Ice cave, third bulbs in the top exit room",
"Ice cave, bulb in the left room",
"King Jellyfish cave, bulb in the right path from King Jelly",
"King Jellyfish cave, Jellyfish Costume",
"The whale, Verse egg",
"Sunken city right area, crate close to the save cristal",
"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 cristal",
"Sunken city left area, crate before the bedroom",
"Sunken city left area, Girl Costume",
"Sunken city, bulb on the top of the boss area (boiler room)",
"The body center area, breaking li cage",
"The body main 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 bellow 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, first bulb in the turtle room",
"Final boss area, second bulbs in the turtle room",
"Final boss area, third bulbs in the turtle room",
"Final boss area, Transturtle",
"Final boss area, bulb in the boss third form room",
"Kelp forest, beating Simon says",
"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 Mantis Shrimp Prime",
"Beating King Jellyfish God Prime",
"First secret",
"Second secret",
"Third secret",
"Sunken City cleared",
"Objective complete",
]
class AquariaTestBase(WorldTestBase):
"""Base class for Aquaria unit tests"""
game = "Aquaria"

View File

@ -0,0 +1,48 @@
"""
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
"""
from worlds.aquaria.test import AquariaTestBase
class BeastFormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the beast form"""
def test_beast_form_location(self) -> None:
"""Test locations that require beast form"""
locations = [
"Mithalas castle, beating the priests",
"Arnassi ruins, Crab armor",
"Arnassi ruins, Song plant spore on the top of the ruins",
"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 cathedral flower tube entrance",
"Mermog cave, Piranha Egg",
"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 in the top of the water fall",
"Bubble cave, bulb in the left cave wall",
"Bubble cave, bulb in the right cave wall (behind the ice cristal)",
"Bubble cave, Verse egg",
"Sunken city, bulb on the top of the boss area (boiler room)",
"Octopus cave, Dumbo Egg",
"Beating the Golem",
"Beating Mergog",
"Beating Crabbius Maximus",
"Beating Octopus Prime",
"Beating Mantis Shrimp Prime",
"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"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,36 @@
"""
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 bind song (without the location
under rock needing bind song option)
"""
from worlds.aquaria.test import AquariaTestBase, after_home_water_locations
class BindSongAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the bind song"""
options = {
"bind_song_needed_to_get_under_rock_bulb": False,
}
def test_bind_song_location(self) -> None:
"""Test locations that require Bind song"""
locations = [
"Verse cave right area, Big Seed",
"Home water, bulb in the path bellow Nautilus Prime",
"Home water, bulb in the bottom left room",
"Home water, Nautilus Egg",
"Song cave, Verse egg",
"Energy temple first area, beating the energy statue",
"Energy temple first area, bulb in the bottom room blocked by a rock",
"Energy temple first area, Energy Idol",
"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 boss area, Fallen god tooth",
"Energy temple blaster room, Blaster egg",
*after_home_water_locations
]
items = [["Bind song"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,42 @@
"""
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 bind song (with the location
under rock needing bind song option)
"""
from worlds.aquaria.test import AquariaTestBase
from worlds.aquaria.test.test_bind_song_access import after_home_water_locations
class BindSongOptionAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the bind song"""
options = {
"bind_song_needed_to_get_under_rock_bulb": True,
}
def test_bind_song_location(self) -> None:
"""Test locations that require Bind song with the bind song needed option activated"""
locations = [
"Verse cave right area, Big Seed",
"Verse cave left area, bulb under the rock at the end of the path",
"Home water, bulb under the rock in the left path from the verse cave",
"Song cave, bulb under the rock close to the song door",
"Song cave, bulb under the rock in the path to the singing statues",
"Naija's home, bulb under the rock at the right of the main path",
"Home water, bulb in the path bellow Nautilus Prime",
"Home water, bulb in the bottom left room",
"Home water, Nautilus Egg",
"Song cave, Verse egg",
"Energy temple first area, beating the energy statue",
"Energy temple first area, bulb in the bottom room blocked by a rock",
"Energy temple first area, Energy Idol",
"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 boss area, Fallen god tooth",
"Energy temple blaster room, Blaster egg",
*after_home_water_locations
]
items = [["Bind song"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,20 @@
"""
Author: Louis M
Date: Fri, 03 May 2024 14:07:35 +0000
Description: Unit test used to test accessibility of region with the home water confine via option
"""
from worlds.aquaria.test import AquariaTestBase
class ConfinedHomeWaterAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of region with the unconfine home water option disabled"""
options = {
"unconfine_home_water": 0,
"early_energy_form": False
}
def test_confine_home_water_location(self) -> None:
"""Test region accessible with confined home water"""
self.assertFalse(self.can_reach_region("Open water top left area"), "Can reach Open water top left area")
self.assertFalse(self.can_reach_region("Home Water, turtle room"), "Can reach Home Water, turtle room")

View File

@ -0,0 +1,26 @@
"""
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 dual song
"""
from worlds.aquaria.test import AquariaTestBase
class LiAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the dual song"""
options = {
"turtle_randomizer": 1,
}
def test_li_song_location(self) -> None:
"""Test locations that require the dual song"""
locations = [
"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",
"Objective complete"
]
items = [["Dual form"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,73 @@
"""
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 bind song (without the early
energy form option)
"""
from worlds.aquaria.test import AquariaTestBase
class EnergyFormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the energy form"""
options = {
"early_energy_form": False,
}
def test_energy_form_location(self) -> None:
"""Test locations that require Energy form"""
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 bottom entrance, Krotite armor",
"Energy temple third area, bulb in the bottom path",
"Energy temple boss area, Fallen god tooth",
"Energy temple blaster room, Blaster egg",
"Mithalas castle, beating the priests",
"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, one of the urns in the top right room",
"Mithalas cathedral, Mithalan Dress",
"Mithalas cathedral right area, urn bellow the left entrance",
"Cathedral 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 the top of the boss area (boiler 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",
]
items = [["Energy form"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,31 @@
"""
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 bind song (with the early
energy form option)
"""
from worlds.aquaria.test import AquariaTestBase, after_home_water_locations
class EnergyFormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the energy form"""
options = {
"early_energy_form": True,
}
def test_energy_form_location(self) -> None:
"""Test locations that require Energy form with early energy song enable"""
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 bottom entrance, Krotite armor",
"Energy temple third area, bulb in the bottom path",
"Energy temple boss area, Fallen god tooth",
"Energy temple blaster room, Blaster egg",
*after_home_water_locations
]
items = [["Energy form"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,37 @@
"""
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 fish form
"""
from worlds.aquaria.test import AquariaTestBase
class FishFormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the fish form"""
options = {
"turtle_randomizer": 1,
}
def test_fish_form_location(self) -> None:
"""Test locations that require fish form"""
locations = [
"The veil top left area, bulb inside the fish pass",
"Mithalas city, Doll",
"Mithalas city, urn inside a home fish pass",
"Kelp Forest top right area, bulb in the top fish pass",
"The veil bottom area, Verse egg",
"Open water bottom left area, bulb inside the downest fish pass",
"Kelp Forest top left area, bulb close to the Verse egg",
"Kelp forest top left area, Verse egg",
"Mermog cave, bulb in the left part of the cave",
"Mermog cave, Piranha Egg",
"Beating Mergog",
"Octopus cave, Dumbo Egg",
"Octopus cave, bulb in the path below the octopus cave path",
"Beating Octopus Prime",
"Abyss left area, bulb in the bottom fish pass",
"Arnassi ruins, Arnassi Armor"
]
items = [["Fish form"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,45 @@
"""
Author: Louis M
Date: Thu, 18 Apr 2024 18:45:56 +0000
Description: Unit test used to test accessibility of locations with and without Li
"""
from worlds.aquaria.test import AquariaTestBase
class LiAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without Li"""
options = {
"turtle_randomizer": 1,
}
def test_li_song_location(self) -> None:
"""Test locations that require Li"""
locations = [
"Sunken city right area, crate close to the save cristal",
"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 cristal",
"Sunken city left area, crate before the bedroom",
"Sunken city left area, Girl Costume",
"Sunken city, bulb on the top of the boss area (boiler room)",
"The body center area, breaking li cage",
"The body main 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 bellow 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",
"Beating the Golem",
"Sunken City cleared",
"Objective complete"
]
items = [["Li and Li song", "Body tongue cleared"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,71 @@
"""
Author: Louis M
Date: Thu, 18 Apr 2024 18:45:56 +0000
Description: Unit test used to test accessibility of locations with and without a light (Dumbo pet or sun form)
"""
from worlds.aquaria.test import AquariaTestBase
class LightAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without light"""
options = {
"turtle_randomizer": 1,
"light_needed_to_get_to_dark_places": True,
}
def test_light_location(self) -> None:
"""Test locations that require light"""
locations = [
# Since the `assertAccessDependency` sweep for events even if I tell it not to, those location cannot be
# tested.
# "Third secret",
# "Sun temple, bulb in the top left part",
# "Sun temple, bulb in the top right part",
# "Sun temple, bulb at the top of the high dark room",
# "Sun temple, Golden Gear",
# "Sun Worm path, first path bulb",
# "Sun Worm path, second path bulb",
# "Sun Worm path, first cliff bulb",
"Octopus cave, Dumbo Egg",
"Kelp forest bottom right area, Odd Container",
"Kelp forest top right area, Black pearl",
"Abyss left area, bulb in hidden path room",
"Abyss left area, bulb in the right part",
"Abyss left area, Glowing seed",
"Abyss left area, Glowing Plant",
"Abyss left area, bulb in the bottom fish pass",
"Abyss right area, bulb behind the rock in the whale room",
"Abyss right area, bulb 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, Transturtle",
"Ice cave, bulb in the room to the right",
"Ice cave, First bulbs in the top exit room",
"Ice cave, Second bulbs in the top exit room",
"Ice cave, third bulbs in the top exit room",
"Ice cave, bulb in the left room",
"Bubble cave, bulb in the left cave wall",
"Bubble cave, bulb in the right cave wall (behind the ice cristal)",
"Bubble cave, Verse egg",
"Beating Mantis Shrimp Prime",
"King Jellyfish cave, bulb in the right path from King Jelly",
"King Jellyfish cave, Jellyfish Costume",
"Beating King Jellyfish God Prime",
"The whale, Verse egg",
"First secret",
"Sunken city right area, crate close to the save cristal",
"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 cristal",
"Sunken city left area, crate before the bedroom",
"Sunken city left area, Girl Costume",
"Sunken city, bulb on the top of the boss area (boiler room)",
"Sunken City cleared",
"Beating the Golem",
"Beating Octopus Prime",
"Final boss area, bulb in the boss third form room",
"Objective complete",
]
items = [["Sun form", "Baby dumbo", "Has sun crystal"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,57 @@
"""
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 nature form
"""
from worlds.aquaria.test import AquariaTestBase
class NatureFormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the nature form"""
options = {
"turtle_randomizer": 1,
}
def test_nature_form_location(self) -> None:
"""Test locations that require nature form"""
locations = [
"Song cave, Anemone seed",
"Energy temple blaster room, Blaster egg",
"Beating Blaster Peg Prime",
"Kelp forest top left area, Verse egg",
"Kelp Forest top left area, bulb close to the Verse egg",
"Mithalas castle, beating the priests",
"Kelp Forest sprite cave, bulb in the second room",
"Kelp Forest Sprite Cave, Seed bag",
"Beating Mithalan priests",
"Abyss left area, bulb in the bottom fish pass",
"Bubble cave, Verse egg",
"Beating Mantis Shrimp Prime",
"Sunken city right area, crate close to the save cristal",
"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 cristal",
"Sunken city left area, crate before the bedroom",
"Sunken city left area, Girl Costume",
"Sunken city, bulb on the top of the boss area (boiler room)",
"Beating the Golem",
"Sunken City cleared",
"The body center area, breaking li cage",
"The body main 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 bellow 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",
"Objective complete"
]
items = [["Nature form"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,60 @@
"""
Author: Louis M
Date: Fri, 03 May 2024 14:07:35 +0000
Description: Unit test used to test that no progression items can be put in hard or hidden locations when option enabled
"""
from worlds.aquaria.test import AquariaTestBase
from BaseClasses import ItemClassification
class UNoProgressionHardHiddenTest(AquariaTestBase):
"""Unit test used to test that no progression items can be put in hard or hidden locations when option enabled"""
options = {
"no_progression_hard_or_hidden_locations": True
}
unfillable_locations = [
"Energy temple boss area, Fallen god tooth",
"Cathedral boss area, beating Mithalan God",
"Kelp forest boss area, beating Drunian God",
"Sun temple boss area, beating Sun God",
"Sunken city, bulb on the top of the boss area (boiler room)",
"Home water, Nautilus Egg",
"Energy temple blaster room, Blaster egg",
"Mithalas castle, beating the priests",
"Mermog cave, Piranha Egg",
"Octopus cave, Dumbo Egg",
"King Jellyfish cave, bulb in the right path from King Jelly",
"King Jellyfish cave, Jellyfish Costume",
"Final boss area, bulb in the boss third form room",
"Sun Worm path, first cliff bulb",
"Sun Worm path, second cliff bulb",
"The veil top right area, bulb in the top of the water fall",
"Bubble cave, bulb in the left cave wall",
"Bubble cave, bulb in the right cave wall (behind the ice cristal)",
"Bubble cave, Verse egg",
"Kelp Forest bottom left area, bulb close to the spirit crystals",
"Kelp forest bottom left area, Walker baby",
"Sun temple, Sun key",
"The body bottom area, Mutant Costume",
"Sun temple, bulb in the hidden room of the right part",
"Arnassi ruins, Arnassi Armor",
]
def test_unconfine_home_water_both_location_fillable(self) -> None:
"""
Unit test used to test that no progression items can be put in hard or hidden locations when option enabled
"""
for location in self.unfillable_locations:
for item_name in self.world.item_names:
item = self.get_item_by_name(item_name)
if item.classification == ItemClassification.progression:
self.assertFalse(
self.world.get_location(location).can_fill(self.multiworld.state, item, False),
"The location \"" + location + "\" can be filled with \"" + item_name + "\"")
else:
self.assertTrue(
self.world.get_location(location).can_fill(self.multiworld.state, item, False),
"The location \"" + location + "\" cannot be filled with \"" + item_name + "\"")

View File

@ -0,0 +1,53 @@
"""
Author: Louis M
Date: Fri, 03 May 2024 14:07:35 +0000
Description: Unit test used to test that progression items can be put in hard or hidden locations when option disabled
"""
from worlds.aquaria.test import AquariaTestBase
from BaseClasses import ItemClassification
class UNoProgressionHardHiddenTest(AquariaTestBase):
"""Unit test used to test that no progression items can be put in hard or hidden locations when option disabled"""
options = {
"no_progression_hard_or_hidden_locations": False
}
unfillable_locations = [
"Energy temple boss area, Fallen god tooth",
"Cathedral boss area, beating Mithalan God",
"Kelp forest boss area, beating Drunian God",
"Sun temple boss area, beating Sun God",
"Sunken city, bulb on the top of the boss area (boiler room)",
"Home water, Nautilus Egg",
"Energy temple blaster room, Blaster egg",
"Mithalas castle, beating the priests",
"Mermog cave, Piranha Egg",
"Octopus cave, Dumbo Egg",
"King Jellyfish cave, bulb in the right path from King Jelly",
"King Jellyfish cave, Jellyfish Costume",
"Final boss area, bulb in the boss third form room",
"Sun Worm path, first cliff bulb",
"Sun Worm path, second cliff bulb",
"The veil top right area, bulb in the top of the water fall",
"Bubble cave, bulb in the left cave wall",
"Bubble cave, bulb in the right cave wall (behind the ice cristal)",
"Bubble cave, Verse egg",
"Kelp Forest bottom left area, bulb close to the spirit crystals",
"Kelp forest bottom left area, Walker baby",
"Sun temple, Sun key",
"The body bottom area, Mutant Costume",
"Sun temple, bulb in the hidden room of the right part",
"Arnassi ruins, Arnassi Armor",
]
def test_unconfine_home_water_both_location_fillable(self) -> None:
"""Unit test used to test that progression items can be put in hard or hidden locations when option disabled"""
for location in self.unfillable_locations:
for item_name in self.world.item_names:
item = self.get_item_by_name(item_name)
self.assertTrue(
self.world.get_location(location).can_fill(self.multiworld.state, item, False),
"The location \"" + location + "\" cannot be filled with \"" + item_name + "\"")

View File

@ -0,0 +1,36 @@
"""
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 spirit form
"""
from worlds.aquaria.test import AquariaTestBase
class SpiritFormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the spirit form"""
def test_spirit_form_location(self) -> None:
"""Test locations that require spirit form"""
locations = [
"The veil bottom area, bulb in the spirit path",
"Mithalas city castle, Trident head",
"Open water skeleton path, King skull",
"Kelp forest bottom left area, Walker baby",
"Abyss right area, bulb behind the rock in the whale room",
"The whale, Verse egg",
"Ice cave, bulb in the room to the right",
"Ice cave, First bulbs in the top exit room",
"Ice cave, Second bulbs in the top exit room",
"Ice cave, third bulbs in the top exit room",
"Ice cave, bulb in the left room",
"Bubble cave, bulb in the left cave wall",
"Bubble cave, bulb in the right cave wall (behind the ice cristal)",
"Bubble cave, Verse egg",
"Sunken city left area, Girl Costume",
"Beating Mantis Shrimp Prime",
"First secret",
"Arnassi ruins, Arnassi Armor",
]
items = [["Spirit form"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,25 @@
"""
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 sun form
"""
from worlds.aquaria.test import AquariaTestBase
class SunFormAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of locations with and without the sun form"""
def test_sun_form_location(self) -> None:
"""Test locations that require sun form"""
locations = [
"First secret",
"The whale, Verse egg",
"Abyss right area, bulb behind the rock in the whale room",
"Octopus cave, Dumbo Egg",
"Beating Octopus Prime",
"Final boss area, bulb in the boss third form room",
"Objective complete"
]
items = [["Sun form"]]
self.assertAccessDependency(locations, items)

View File

@ -0,0 +1,21 @@
"""
Author: Louis M
Date: Fri, 03 May 2024 14:07:35 +0000
Description: Unit test used to test accessibility of region with the unconfined home water option via transportation
turtle and energy door
"""
from worlds.aquaria.test import AquariaTestBase
class UnconfineHomeWaterBothAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of region with the unconfine home water option enabled"""
options = {
"unconfine_home_water": 3,
"early_energy_form": False
}
def test_unconfine_home_water_both_location(self) -> None:
"""Test locations accessible with unconfined home water via energy door and transportation turtle"""
self.assertTrue(self.can_reach_region("Open water top left area"), "Cannot reach Open water top left area")
self.assertTrue(self.can_reach_region("Home Water, turtle room"), "Cannot reach Home Water, turtle room")

View File

@ -0,0 +1,20 @@
"""
Author: Louis M
Date: Fri, 03 May 2024 14:07:35 +0000
Description: Unit test used to test accessibility of region with the unconfined home water option via the energy door
"""
from worlds.aquaria.test import AquariaTestBase
class UnconfineHomeWaterEnergyDoorAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of region with the unconfine home water option enabled"""
options = {
"unconfine_home_water": 1,
"early_energy_form": False
}
def test_unconfine_home_water_energy_door_location(self) -> None:
"""Test locations accessible with unconfined home water via energy door"""
self.assertTrue(self.can_reach_region("Open water top left area"), "Cannot reach Open water top left area")
self.assertFalse(self.can_reach_region("Home Water, turtle room"), "Can reach Home Water, turtle room")

View File

@ -0,0 +1,20 @@
"""
Author: Louis M
Date: Fri, 03 May 2024 14:07:35 +0000
Description: Unit test used to test accessibility of region with the unconfined home water option via transturtle
"""
from worlds.aquaria.test import AquariaTestBase
class UnconfineHomeWaterTransturtleAccessTest(AquariaTestBase):
"""Unit test used to test accessibility of region with the unconfine home water option enabled"""
options = {
"unconfine_home_water": 2,
"early_energy_form": False
}
def test_unconfine_home_water_transturtle_location(self) -> None:
"""Test locations accessible with unconfined home water via transportation turtle"""
self.assertTrue(self.can_reach_region("Home Water, turtle room"), "Cannot reach Home Water, turtle room")
self.assertFalse(self.can_reach_region("Open water top left area"), "Can reach Open water top left area")