From db79b19b91b714f47725ee93061742af622f1631 Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 15 Mar 2024 15:17:10 -0400 Subject: [PATCH 01/56] Adding Aquaria game World --- docs/CODEOWNERS | 3 + worlds/aquaria/Items.py | 190 +++++ worlds/aquaria/Locations.py | 579 +++++++++++++++ worlds/aquaria/Options.py | 54 ++ worlds/aquaria/Regions.py | 1091 +++++++++++++++++++++++++++++ worlds/aquaria/__init__.py | 128 ++++ worlds/aquaria/docs/en_aquaria.md | 35 + worlds/aquaria/docs/fr_aquaria.md | 40 ++ worlds/aquaria/docs/setup_en.md | 3 + worlds/aquaria/docs/setup_fr.md | 3 + 10 files changed, 2126 insertions(+) create mode 100644 worlds/aquaria/Items.py create mode 100644 worlds/aquaria/Locations.py create mode 100644 worlds/aquaria/Options.py create mode 100644 worlds/aquaria/Regions.py create mode 100644 worlds/aquaria/__init__.py create mode 100644 worlds/aquaria/docs/en_aquaria.md create mode 100644 worlds/aquaria/docs/fr_aquaria.md create mode 100644 worlds/aquaria/docs/setup_en.md create mode 100644 worlds/aquaria/docs/setup_fr.md diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index d6730b7308a..af5ccbe8a05 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -16,6 +16,9 @@ # A Link to the Past /worlds/alttp/ @Berserker66 +# Aquaria +/worlds/aquaria/ @tioui + # ArchipIDLE /worlds/archipidle/ @LegendaryLinux diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py new file mode 100644 index 00000000000..39eb4687323 --- /dev/null +++ b/worlds/aquaria/Items.py @@ -0,0 +1,190 @@ +""" +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 + LOGIC = 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) + + +item_table = { + """Information data for every (not event) item.""" + # name: ID, Nb, Item Type, Item Group + "collectible_anemone": (0, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_arnassi_statue": (1, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_big_seed": (2, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_bio_seed": (3, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_blackpearl": (4, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_blaster": (5, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "collectible_crab_costume": (6, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "collectible_dumbo": (7, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "collectible_energy_boss": (8, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_energy_statue": (9, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_energy_temple": (10, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_gold_star": (11, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_golden_gear": (12, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_jelly_beacon": (13, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_jelly_costume": (14, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "collectible_jelly_plant": (15, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_mithala_doll": (16, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_mithalan_costume": (17, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_mithalas_banner": (18, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_mithalas_pot": (19, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_mutant_costume": (20, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_nautilus": (21, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "collectible_piranha": (22, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "collectible_seahorse_costume": (23, 1, ItemType.NORMAL, + ItemGroup.UTILITY), + "collectible_seed_bag": (24, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_skull": (25, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_spore_seed": (26, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_stone_head": (27, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_sun_key": (28, 1, ItemType.NORMAL, ItemGroup.COLLECTIBLE), + "collectible_teen_costume": (29, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_treasure_chest": (30, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_trident_head": (31, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_turtle_egg": (32, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "collectible_upsidedown_seed": (33, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_urchin_costume": (34, 1, ItemType.JUNK, + ItemGroup.COLLECTIBLE), + "collectible_walker": (35, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "ingredient_Vedha'sCure-All": (36, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_Zuuna'sperogi": (37, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_arcanepoultice": (38, 7, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_berryicecream": (39, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_butterysealoaf": (40, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_coldborscht": (41, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_coldsoup": (42, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_crabcake": (43, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_divinesoup": (44, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_dumboicecream": (45, 3, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_eeloil": (46, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_fishmeat": (47, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_fishoil": (48, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_glowingegg": (49, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_handroll": (50, 5, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_healingpoultice": (51, 4, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_heartysoup": (52, 5, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_hotborscht": (53, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_hotsoup": (54, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), + "ingredient_icecream": (55, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_leadershiproll": (56, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_leafpoultice": (57, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), + "ingredient_leechingpoultice": (58, 4, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_legendarycake": (59, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_loafoflife": (60, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_longlifesoup": (61, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_magicsoup": (62, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_mushroom_2": (63, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_perogi": (64, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_plantleaf": (65, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_plumpperogi": (66, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_poisonloaf": (67, 1, ItemType.JUNK, ItemGroup.RECIPE), + "ingredient_poisonsoup": (68, 1, ItemType.JUNK, ItemGroup.RECIPE), + "ingredient_rainbowmushroom": (69, 4, ItemType.NORMAL, + ItemGroup.INGREDIENT), + "ingredient_rainbowsoup": (70, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_redberry": (71, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_redbulb_2": (72, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_rottencake": (73, 1, ItemType.JUNK, ItemGroup.RECIPE), + "ingredient_rottenloaf_8": (74, 1, ItemType.JUNK, ItemGroup.RECIPE), + "ingredient_rottenmeat": (75, 5, ItemType.JUNK, ItemGroup.INGREDIENT), + "ingredient_royalsoup": (76, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_seacake": (77, 4, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_sealoaf": (78, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_sharkfinsoup": (79, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_sightpoultice": (80, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_smallbone_2": (81, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_smallegg": (82, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_smalltentacle_2": (83, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_specialbulb": (84, 5, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_specialcake": (85, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_spicymeat_2": (86, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_spicyroll": (87, 11, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_spicysoup": (88, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_spiderroll": (89, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_swampcake": (90, 3, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_tastycake": (91, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_tastyroll": (92, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_toughcake": (93, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_turtlesoup": (94, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_vedhaseacrisp": (95, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_veggiecake": (96, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_veggieicecream": (97, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_veggiesoup": (98, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_volcanoroll": (99, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "upgrade_health_1": (100, 1, ItemType.NORMAL, ItemGroup.HEALTH), + "upgrade_health_2": (101, 1, ItemType.NORMAL, ItemGroup.HEALTH), + "upgrade_health_3": (102, 1, ItemType.NORMAL, ItemGroup.HEALTH), + "upgrade_health_4": (103, 1, ItemType.NORMAL, ItemGroup.HEALTH), + "upgrade_health_5": (104, 1, ItemType.NORMAL, ItemGroup.HEALTH), + "upgrade_wok": (105, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "ingredient_eeloil_2": (106, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_fishmeat_2": (107, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_fishoil_3": (108, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_glowingegg_2": (109, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_healingpoultice_2": (110, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_hotsoup_2": (111, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), + "ingredient_leadershiproll_2": (112, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_leafpoultice_3": (113, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), + "ingredient_plantleaf_2": (114, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_plantleaf_3": (115, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_rottenmeat_2": (116, 1, ItemType.JUNK, ItemGroup.INGREDIENT), + "ingredient_rottenmeat_8": (117, 1, ItemType.JUNK, ItemGroup.INGREDIENT), + "ingredient_sealoaf_2": (118, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "ingredient_smallbone_3": (119, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), + "ingredient_smallegg_2": (120, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), +} diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py new file mode 100644 index 00000000000..01f961c02b6 --- /dev/null +++ b/worlds/aquaria/Locations.py @@ -0,0 +1,579 @@ +""" +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 + + +locations_verse_cave_r = { + "bulb_starting_cave_1": 698107, + "bulb_starting_cave_2": 698108, + "collect_big_seed": 698175, +} + +locations_verse_cave_l = { + "bulb_tutorial_1": 698021, + "bulb_tutorial_2": 698022, + "bulb_tutorial_3": 698023, +} + +locations_home_water = { + "bulb_home_water_1": 698058, + "bulb_home_water_2": 698059, + "bulb_home_water_3": 698060, + "bulb_home_water_4": 698061, + "bulb_home_water_5": 698062, + "bulb_home_water_6": 698063, + "bulb_home_water_7": 698064, + "bulb_home_water_8": 698065, + "collect_nautilus": 698194, +} + +locations_naija_home = { + "bulb_naija_home_1": 698119, + "bulb_naija_home_2": 698120, +} + +locations_song_cave = { + "bulb_song_cave_1": 698071, + "bulb_song_cave_2": 698072, + "bulb_song_cave_3": 698073, + "bulb_song_cave_4": 698074, + "bulb_song_cave_5": 698075, + "health_egg_4": 698160, + "collect_anemone": 698162, + "collect_jelly_beacon": 698178, +} + +locations_song_cave_anemone = { + "collect_anemone": 698162, +} + +locations_energy_temple_1 = { + "bulb_energy_temple_1_1": 698027, + "collect_energy_statue": 698170, +} + +locations_energy_temple_2 = { + "bulb_energy_temple_2_1": 698028, +} + +locations_energy_temple_altar = { + "collect_energy_temple": 698163, +} + +locations_energy_temple_3 = { + "bulb_energy_temple_3_1": 698029, +} + +locations_energy_temple_boss = { + "collect_energy_boss": 698169, + # Eventually, putting forest boss location here +} + +locations_energy_temple_blaster_room = { + "collect_blaster": 698195, +} + +locations_openwater_tl = { + "bulb_openwater_tl_1": 698001, + "bulb_openwater_tl_2": 698002, + "bulb_openwater_tl_3": 698003, +} + +locations_openwater_tr = { + "bulb_openwater_tr_1": 698004, + "bulb_openwater_tr_2": 698005, + "bulb_openwater_tr_3": 698006, + "bulb_openwater_tr_4": 698007, + "bulb_openwater_tr_5": 698008, + "urn_openwater_tr_1": 698148, + "urn_openwater_tr_2": 698149, + "urn_openwater_tr_3": 698150, +} + +locations_openwater_tr_turtle = { + "bulb_openwater_tr_6": 698009, +} + +locations_openwater_bl = { + "bulb_openwater_bl_2": 698011, +} + +locations_openwater_bl_fp = { + "bulb_openwater_bl_1": 698010, +} + +locations_skeleton_path = { + "bulb_skeleton_path_1": 698012, + "bulb_skeleton_path_2": 698013, +} + +locations_skeleton_path_sc = { + "collect_skull": 698177, +} + +locations_arnassi = { + "bulb_arnassi_1": 698014, + "bulb_arnassi_2": 698015, + "bulb_arnassi_3": 698016, + "collect_spore_seed": 698179, + "collect_seahorse_costume": 698191, +} + +locations_arnassi_path = { + "collect_arnassi_statue": 698164, +} + +locations_arnassi_crab_boss = { + "collect_crab_costume": 698187, +} + +locations_simon = { + "beating_simon": 698156, +} + +locations_mithalas_city = { + "bulb_mithalas_city_01": 698030, + "bulb_mithalas_city_02": 698031, + "bulb_mithalas_city_04": 698033, + "bulb_mithalas_city_05": 698034, + "bulb_mithalas_city_06": 698035, + "bulb_mithalas_city_08": 698037, + "bulb_mithalas_city_09": 698038, + "bulb_mithalas_city_10": 698039, + "bulb_mithalas_city_12": 698041, +} + +locations_mithalas_city_urns = { + "urn_mithalas_city_1": 698123, + "urn_mithalas_city_2": 698124, + "urn_mithalas_city_3": 698125, + "urn_mithalas_city_4": 698126, + "urn_mithalas_city_5": 698127, + "urn_mithalas_city_7": 698129, +} + +locations_mithalas_city_top_path = { + "bulb_mithalas_city_03": 698032, + "bulb_mithalas_city_07": 698036, + "bulb_mithalas_city_11": 698040, + "collect_mithalas_pot": 698174, +} + +locations_mithalas_city_top_path_urn = { + "urn_mithalas_city_6": 698128, +} + +locations_mithalas_city_fishpass = { + "collect_mithala_doll": 698173, +} + +locations_cathedral_l = { + "bulb_cathedral_l_2": 698042, + "collect_mithalas_banner": 698165, +} + +locations_cathedral_l_urns = { + "urn_cathedral_l_1": 698130, + "urn_cathedral_l_2": 698131, + "urn_cathedral_l_3": 698132, + "urn_cathedral_l_4": 698133, + "urn_cathedral_l_5": 698134, + "urn_cathedral_l_6": 698135, +} + +locations_cathedral_l_tube = { + # Eventually, putting mithalas friest boss location here +} + +locations_cathedral_l_sc = { + "collect_trident_head": 698183, +} + +locations_cathedral_r = { + "urn_cathedral_r_01": 698136, + "urn_cathedral_r_02": 698137, + "urn_cathedral_r_03": 698138, + "urn_cathedral_r_04": 698139, + "urn_cathedral_r_05": 698140, + "urn_cathedral_r_06": 698141, + "urn_cathedral_r_07": 698142, + "urn_cathedral_r_08": 698143, + "urn_cathedral_r_09": 698144, + "urn_cathedral_r_10": 698145, + "urn_cathedral_r_11": 698146, + "urn_cathedral_r_12": 698147, + "collect_mithalan_costume": 698189, +} + +locations_cathedral_underground = { + "bulb_cathedral_under_ground_1": 698113, + "bulb_cathedral_under_ground_2": 698114, + "bulb_cathedral_under_ground_3": 698115, + "bulb_cathedral_under_ground_4": 698116, + "bulb_cathedral_under_ground_5": 698117, + "bulb_cathedral_under_ground_6": 698118, +} + +locations_cathedral_boss = { + # Eventually, putting mithalas boss location here +} + +locations_forest_tl = { + "bulb_forest_tl_1": 698044, + "bulb_forest_tl_2": 698045, + "bulb_forest_tl_3": 698046, + "collect_upsidedown_seed": 698185, +} + +locations_forest_tl_fp = { + "bulb_forest_tl_4": 698047, + "health_egg_2": 698158, +} + +locations_forest_tr = { + "bulb_forest_tr_1": 698048, + "bulb_forest_tr_2": 698049, + "bulb_forest_tr_4": 698051, + "bulb_forest_tr_5": 698052, + "bulb_forest_tr_6": 698053, +} + +locations_forest_tr_dark = { + "collect_blackpearl": 698167, +} + +locations_forest_tr_fp = { + "bulb_forest_tr_3": 698050, +} + +locations_forest_bl_sc = { + "collect_walker": 698186, + "bulb_forest_bl_1": 698054, +} + +locations_forest_br_ship = { + "collect_treasure_chest": 698168, +} + +locations_forest_boss = { + # Eventually, putting forest boss location here +} + +locations_forest_boss_entrance = { + "bulb_forest_boss_room_1": 698055, +} + +locations_forest_fish_cave = { + # Eventually, putting fish cave location here +} + +locations_forest_sprite_cave = { + "bulb_forest_sprite_cave_1": 698056, +} + +locations_forest_sprite_cave_tube = { + "bulb_forest_sprite_cave_2": 698057, + "collect_seed_bag": 698176, +} + +locations_mermog_cave = { + "bulb_mermog_cave_1": 698121, +} + +locations_mermog_boss = { + "collect_piranha": 698197, +} + +locations_veil_tl = { + "bulb_veil_tl_3": 698078, +} + +locations_veil_tl_fp = { + "bulb_veil_tl_2": 698077, +} + +locations_veil_tl_rock = { + "bulb_veil_tl_1": 698076, +} + +locations_turtle_cave_rocks = { + "collect_turtle_egg": 698184, +} + +locations_turtle_cave_bubble = { + "bulb_turtlecave": 698000, +} + +locations_turtle_cave_top_bubble = { + "collect_urchin_costume": 698193, +} + +locations_veil_tr_l = { +} + +locations_veil_tr_r = { # Failaise nécessite le Beast form + "bulb_veil_tr_1": 698079, + "collect_gold_star": 698180, +} + +locations_veil_tr_water_fall = { + "bulb_veil_tr_2": 698080, +} + +locations_veil_bl = { + "bulb_veil_b_2": 698082, +} + +locations_veil_b_sc = { + "bulb_veil_b_1": 698081, +} + +locations_veil_bl_fp = { + "health_egg_1": 698157, +} + +locations_veil_br = { + "collect_stone_head": 698181, +} + +locations_octo_cave_t = { + "collect_dumbo": 698196, +} + +locations_octo_cave_b = { + "bulb_octo_cave_1": 698122, +} + +locations_bubble_cave = { + "bulb_bubble_cave_1": 698089, + "bulb_bubble_cave_2": 698090, + "health_egg_5": 698161, +} + +locations_sun_temple_l = { + "bulb_sun_temple_4": 698094, + "bulb_sun_temple_5": 698095, + "bulb_sun_temple_6": 698096, + "collect_golden_gear": 698171, +} + +locations_sun_temple_r = { + "bulb_sun_temple_1": 698091, + "bulb_sun_temple_2": 698092, + "bulb_sun_temple_3": 698093, + "collect_sun_key": 698182, +} + +locations_sun_temple_boss_lb = { + "bulb_sunworm_1": 698017, + "bulb_sunworm_2": 698018, +} + +locations_sun_temple_boss_lt = { + "bulb_sunworm_3": 698019, + "bulb_sunworm_4": 698020, +} + +locations_sun_temple_boss_r = { + # Eventually, putting sun boss location here +} + +locations_abyss_l = { + "bulb_abyss_l_1": 698024, + "bulb_abyss_l_2": 698025, + "collect_bio_seed": 698166, + "collect_jelly_plant": 698172, +} + +locations_abyss_l_fp = { + "bulb_abyss_l_3": 698026, +} + +locations_abyss_r = { + "bulb_abyss_r_1": 698109, + "bulb_abyss_r_2": 698110, + "bulb_abyss_r_3": 698111, + "bulb_abyss_r_4": 698112, +} + +locations_ice_cave = { + "bulb_ice_cave_1": 698083, + "bulb_ice_cave_2": 698084, + "bulb_ice_cave_3": 698085, + "bulb_ice_cave_4": 698086, + "bulb_ice_cave_5": 698087, +} + +locations_king_jellyfish_cave = { + "bulb_king_jellyfish_cave_1": 698088, + "collect_jelly_costume": 698188, +} + +locations_whale = { + "health_egg_3": 698159, +} + +locations_sunkencity_r = { + "crate_sunkencity_1_1": 698154, + "crate_sunkencity_1_2": 698155, +} + +locations_sunkencity_l = { + "crate_sunkencity_2_1": 698151, + "crate_sunkencity_2_2": 698152, + "crate_sunkencity_2_3": 698153, +} + +locations_sunkencity_l_bedroom = { + "collect_teen_costume": 698192, +} + +locations_sunkencity_boss = { + "bulb_boilerroom_1": 698043, +} + +locations_body_c = { + "bulb_final_c_1": 698097, +} + +locations_body_l = { + "bulb_final_l_1": 698066, + "bulb_final_l_2": 698067, + "bulb_final_l_3": 698068, + "bulb_final_l_4": 698069, + "bulb_final_l_5": 698070, +} + +locations_body_rt = { + "bulb_final_r_3": 698100, +} + +locations_body_rb = { + "bulb_final_r_1": 698098, + "bulb_final_r_2": 698099, +} + +locations_body_b = { + "bulb_final_b_1": 698101, + "bulb_final_b_2": 698102, + "collect_mutant_costume": 698190, +} + +locations_final_boss_tube = { + "bulb_final_boss_1": 698103, + "bulb_final_boss_2": 698104, + "bulb_final_boss_3": 698105, +} + +locations_final_boss_3_form = { + "bulb_final_boss_4": 698106, +} + +location_table = { + **locations_openwater_tl, + **locations_openwater_tr, + **locations_openwater_tr_turtle, + **locations_openwater_bl, + **locations_openwater_bl_fp, + **locations_skeleton_path, + **locations_skeleton_path_sc, + **locations_arnassi, + **locations_arnassi_path, + **locations_arnassi_crab_boss, + **locations_sun_temple_l, + **locations_sun_temple_r, + **locations_sun_temple_boss_lt, + **locations_sun_temple_boss_lb, + **locations_sun_temple_boss_r, + **locations_verse_cave_r, + **locations_verse_cave_l, + **locations_abyss_l, + **locations_abyss_l_fp, + **locations_abyss_r, + **locations_energy_temple_1, + **locations_energy_temple_2, + **locations_energy_temple_3, + **locations_energy_temple_boss, + **locations_energy_temple_blaster_room, + **locations_mithalas_city, + **locations_mithalas_city_urns, + **locations_mithalas_city_top_path, + **locations_mithalas_city_top_path_urn, + **locations_mithalas_city_fishpass, + **locations_cathedral_l, + **locations_cathedral_l_urns, + **locations_cathedral_l_tube, + **locations_cathedral_l_sc, + **locations_cathedral_r, + **locations_cathedral_underground, + **locations_cathedral_boss, + **locations_forest_tl, + **locations_forest_tl_fp, + **locations_forest_tr, + **locations_forest_tr_dark, + **locations_forest_tr_fp, + **locations_forest_bl_sc, + **locations_forest_br_ship, + **locations_forest_boss, + **locations_forest_boss_entrance, + **locations_forest_sprite_cave, + **locations_forest_sprite_cave_tube, + **locations_forest_fish_cave, + **locations_home_water, + **locations_body_l, + **locations_body_rt, + **locations_body_rb, + **locations_body_c, + **locations_body_b, + **locations_final_boss_tube, + **locations_final_boss_3_form, + **locations_song_cave, + **locations_veil_tl, + **locations_veil_tl_fp, + **locations_veil_tl_rock, + **locations_turtle_cave_rocks, + **locations_turtle_cave_bubble, + **locations_turtle_cave_top_bubble, + **locations_veil_tr_l, + **locations_veil_tr_r, + **locations_veil_tr_water_fall, + **locations_veil_bl, + **locations_veil_b_sc, + **locations_veil_bl_fp, + **locations_veil_br, + **locations_ice_cave, + **locations_king_jellyfish_cave, + **locations_bubble_cave, + **locations_naija_home, + **locations_mermog_cave, + **locations_mermog_boss, + **locations_octo_cave_t, + **locations_octo_cave_b, + **locations_sunkencity_l, + **locations_sunkencity_r, + **locations_sunkencity_boss, + **locations_simon, + **locations_whale, +} diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py new file mode 100644 index 00000000000..54df9a386f1 --- /dev/null +++ b/worlds/aquaria/Options.py @@ -0,0 +1,54 @@ +""" +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, DeathLink, PerGameCommonOptions + + +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 AquarianTranslation(Toggle): + """Translate to English the Aquarian scripture in the game.""" + display_name = "Translate Aquarian" + + +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 + + +@dataclass +class AquariaOptions(PerGameCommonOptions): + """ + Every options in the Aquaria randomizer + """ + ingredient_randomizer: IngredientRandomizer + dish_randomizer: DishRandomizer + aquarian_translation: AquarianTranslation + objective: Objective + death_link: DeathLink diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py new file mode 100644 index 00000000000..e3282c66724 --- /dev/null +++ b/worlds/aquaria/Regions.py @@ -0,0 +1,1091 @@ +""" +Author: Louis M +Date: Fri, 15 Mar 2024 18:41:40 +0000 +Description: Used to manage Regions in the Aquaria game multiworld randomizer +""" + +import Locations + +from typing import Dict, Optional +from BaseClasses import MultiWorld, Region, Entrance +from worlds.generic.Rules import set_rule +from .Items import AquariaItem + + +class AquariaRegion: + """ + Class used to create regions of the Aquaria game + """ + + verse_cave_r: Region + verse_cave_l: Region + home_water: Region + naija_home: Region + song_cave: Region + song_cave_anemone: Region + energy_temple_1: Region + energy_temple_2: Region + energy_temple_3: Region + energy_temple_boss: Region + energy_temple_blaster_room: Region + energy_temple_altar: Region + openwater_tl: Region + openwater_tr: Region + openwater_tr_turtle: Region + openwater_bl: Region + openwater_bl_fp: Region + openwater_br: Region + skeleton_path: Region + skeleton_path_sc: Region + arnassi: Region + arnassi_path: Region + arnassi_crab_boss: Region + simon: Region + mithalas_city: Region + mithalas_city_urns: Region + mithalas_city_top_path: Region + mithalas_city_top_path_urn: Region + mithalas_city_fishpass: Region + cathedral_l: Region + cathedral_l_urns: Region + cathedral_l_tube: Region + cathedral_l_sc: Region + cathedral_r: Region + cathedral_underground: Region + cathedral_boss_l: Region + cathedral_boss_r: Region + forest_tl: Region + forest_tl_fp: Region + forest_tr: Region + forest_tr_dark: Region + forest_tr_fp: Region + forest_bl: Region + forest_bl_sc: Region + forest_br: Region + forest_br_ship: Region + forest_boss: Region + forest_boss_entrance: Region + forest_sprite_cave: Region + forest_sprite_cave_tube: Region + mermog_cave: Region + mermog_boss: Region + forest_fish_cave: Region + veil_tl: Region + veil_tl_fp: Region + veil_tl_rock: Region + veil_tr_l: Region + veil_tr_r: Region + veil_tr_water_fall: Region + veil_bl: Region + veil_b_sc: Region + veil_bl_fp: Region + veil_br: Region + octo_cave_t: Region + octo_cave_b: Region + turtle_cave: Region + turtle_cave_rocks: Region + turtle_cave_bubble: Region + turtle_cave_top_bubble: Region + sun_temple_l: Region + sun_temple_r: Region + sun_temple_boss_lt: Region + sun_temple_boss_lb: Region + sun_temple_boss_r: Region + abyss_l: Region + abyss_lb: Region + abyss_l_fp: Region + abyss_r: Region + ice_cave: Region + bubble_cave: Region + king_jellyfish_cave: Region + whale: Region + sunken_city_l: Region + sunken_city_r: Region + sunken_city_boss: Region + sunkencity_l_bedroom: Region + body_c: Region + body_l: Region + body_rt: Region + body_rb: Region + body_b: Region + final_boss: Region + final_boss_tube: Region + final_boss_3_form: Region + final_boss_end: Region + """ + Every Region of the game + """ + + + world: MultiWorld + """ + The Current Multiworld game. + """ + + player: int + """ + The ID of the player + """ + + def __add_region(self, name: str, hint: str, + locations: Optional[Dict[str, Optional[int]]]) -> Region: + """ + Create a new Region, add it to the `world` regions and return it. + Be aware that this function have a side effect on ``world`.`regions` + """ + region: Region = Region(name, self.player, self.world, hint) + if locations is not None: + self.verse_cave_r.add_locations(locations, + Locations.AquariaLocation) + return region + + def __create_home_water_area(self): + """ + Create the `verse_cave`, `home_water` and `song_cave*` regions + """ + self.verse_cave_r = self.__add_region("Menu", "Verse Cave right area", + Locations.locations_verse_cave_r) + self.verse_cave_l = self.__add_region("verse_cave_left_area", + "Verse Cave left area", + Locations.locations_verse_cave_l) + self.home_water = self.__add_region("home_water", "Home Water", + Locations.locations_home_water) + self.naija_home = self.__add_region("naija_home", "Naija's home", + Locations.locations_naija_home) + self.song_cave = self.__add_region("song_cave", "Song cave", + Locations.locations_song_cave) + self.song_cave_anemone = self.__add_region("song_cave_anemone", + "Song cave", + Locations.locations_song_cave) + + def __create_energy_temple(self): + """ + Create the `energy_temple_*` regions + """ + self.energy_temple_1 = ( + self.__add_region("energy_temple_1", + "Energy temple first area", + Locations.locations_energy_temple_1)) + self.energy_temple_2 = ( + self.__add_region("energy_temple_2", + "Energy temple second area", + Locations.locations_energy_temple_2)) + self.energy_temple_3 = ( + self.__add_region("energy_temple_3", + "Energy temple third area", + Locations.locations_energy_temple_3)) + self.energy_temple_altar = ( + self.__add_region("energy_temple_altar", + "Energy temple bottom entrance", + Locations.locations_energy_temple_altar)) + self.energy_temple_boss = ( + self.__add_region("energy_temple_boss", + "Energy temple fallen God room", + Locations.locations_energy_temple_boss)) + self.energy_temple_blaster_room = ( + self.__add_region("energy_temple_blaster_room", + "Energy temple blaster room", + Locations.locations_energy_temple_blaster_room)) + + def __create_openwater(self): + """ + Create the `openwater_*`, `skeleton_path`, `arnassi*` and `simon` + regions + """ + self.openwater_tl = self.__add_region("openwater_tl", + "Open water top left area", + Locations.locations_openwater_tl) + self.openwater_tr = self.__add_region("openwater_tr", + "Open water top right area", + Locations.locations_openwater_tr) + self.openwater_tr_turtle = ( + self.__add_region("openwater_tr_turtle", + "Open water top right area, turtle room", + Locations.locations_openwater_tr_turtle)) + self.openwater_bl = self.__add_region("openwater_bl", + "Open water bottom left area", + Locations.locations_openwater_bl) + self.openwater_bl_fp = ( + self.__add_region("openwater_bl_fp", + "Open water bottom left area", + Locations.locations_openwater_bl_fp)) + self.openwater_br = self.__add_region("openwater_br", + "Open water bottom right area", + None) + self.skeleton_path = ( + self.__add_region("skeleton_path", + "Open water skeleton path", + Locations.locations_skeleton_path)) + self.skeleton_path_sc = ( + self.__add_region("skeleton_path_sc", + "Open water skeleton path", + Locations.locations_skeleton_path_sc)) + self.arnassi = self.__add_region("arnassi", + "Arnassi Ruins", + Locations.locations_arnassi) + self.simon = self.__add_region("simon", + "Arnassi Ruins, Simon's room", + Locations.locations_simon) + self.arnassi_path = ( + self.__add_region("arnassi_path", + "Arnassi Ruins, back entrance path", + Locations.locations_arnassi_path)) + self.arnassi_crab_boss = ( + self.__add_region("arnassi_crab_boss", + "Arnassi Ruins, Crabbius Maximus lair", + Locations.locations_arnassi_crab_boss)) + + def __create_mithalas(self): + """ + Create the `mithalas_city*` and `cathedral_*` regions + """ + self.mithalas_city = ( + self.__add_region("mithalas_city", + "Mithalas city", + Locations.locations_mithalas_city)) + self.mithalas_city_urns = ( + self.__add_region("mithalas_city_urns", + "Mithalas city", + Locations.locations_mithalas_city_urns)) + self.mithalas_city_fishpass = ( + self.__add_region("mithalas_city_fishpass", + "Mithalas city", + Locations.locations_mithalas_city_fishpass)) + self.mithalas_city_top_path = ( + self.__add_region("mithalas_city_top_path", + "Mithalas city", + Locations.locations_mithalas_city_top_path)) + self.mithalas_city_top_path_urn = self.__add_region( + "mithalas_city_top_path_urn", + "Mithalas city", Locations.locations_mithalas_city_top_path_urn) + self.cathedral_l = self.__add_region("cathedral_l", + "Mithalas castle", + Locations.locations_cathedral_l) + self.cathedral_l_urns = ( + self.__add_region("cathedral_l_urns", + "Mithalas castle", + Locations.locations_cathedral_l_urns)) + self.cathedral_l_tube = ( + self.__add_region("cathedral_l_tube", + "Mithalas castle, plant tube entrance", + Locations.locations_cathedral_l_tube)) + self.cathedral_l_sc = ( + self.__add_region("cathedral_l_sc", + "Mithalas castle", + Locations.locations_cathedral_l_sc)) + self.cathedral_r = self.__add_region("cathedral_r", + "Mithalas Cathedral", + Locations.locations_cathedral_r) + self.cathedral_underground = ( + self.__add_region("cathedral_underground", + "Mithalas Cathedral underground area", + Locations.locations_cathedral_underground)) + self.cathedral_boss_r = ( + self.__add_region("cathedral_boss_r", + "Mithalas Cathedral, Mithalan God room", + Locations.locations_cathedral_boss)) + self.cathedral_boss_l = ( + self.__add_region("cathedral_boss_l", + "Mithalas Cathedral, Mithalan God room", + None)) + + def __create_forest(self): + """ + Create the `forest_*` dans `mermog_cave` regions + """ + self.forest_tl = self.__add_region("forest_tl", + "Kelp forest top left area", + Locations.locations_forest_tl) + self.forest_tl_fp = self.__add_region("forest_tl_fp", + "Kelp forest top left area", + Locations.locations_forest_tl_fp) + self.forest_tr = self.__add_region("forest_tr", + "Kelp forest top right area", + Locations.locations_forest_tr) + self.forest_tr_fp = self.__add_region("forest_tr_fp", + "Kelp forest top right area", + Locations.locations_forest_tr_fp) + self.forest_tr_dark = ( + self.__add_region("forest_tr_dark", + "Kelp forest top right area, " + + "the dark behind the seawolf", + Locations.locations_forest_tr_dark)) + self.forest_bl = self.__add_region("forest_bl", + "Kelp forest bottom left area", + None) + self.forest_bl_sc = ( + self.__add_region("forest_bl_sc", + "Kelp forest bottom left area, spirit cristal", + Locations.locations_forest_bl_sc)) + self.forest_br = self.__add_region("forest_br", + "Kelp forest bottom right area", + None) + self.forest_br_ship = ( + self.__add_region("forest_br_ship", + "Kelp forest bottom right area, sunken ship", + Locations.locations_forest_br_ship)) + self.forest_sprite_cave = ( + self.__add_region("forest_sprite_cave", + "Kelp forest spirit cave", + Locations.locations_forest_sprite_cave)) + self.forest_sprite_cave_tube = ( + self.__add_region("forest_sprite_cave_tube", + "Kelp forest spirit cave after the plant tube", + Locations.locations_forest_sprite_cave_tube)) + self.forest_boss = self.__add_region("forest_boss", + "Kelp forest Drunian God room", + Locations.locations_forest_boss) + self.forest_boss_entrance = ( + self.__add_region("forest_boss_entrance", + "Kelp forest Drunian God room", + Locations.locations_forest_boss_entrance)) + self.mermog_cave = self.__add_region("mermog_cave", + "Kelp forest Mermog cave", + Locations.locations_mermog_cave) + self.mermog_boss = self.__add_region("mermog_boss", + "Kelp forest Mermog cave", + Locations.locations_mermog_boss) + self.forest_fish_cave = ( + self.__add_region("forest_fish_cave", + "Kelp forest fish cave", + Locations.locations_forest_fish_cave)) + + def __create_veil(self): + """ + Create the `veil_*`, `octo_cave` and `turtle_cave` regions + """ + self.veil_tl = self.__add_region("veil_tl", + "The veil top left area", + Locations.locations_veil_tl) + self.veil_tl_fp = self.__add_region("veil_tl_fp", + "The veil top left area", + Locations.locations_veil_tl_fp) + self.veil_tl_rock = ( + self.__add_region("veil_tl_rock", + "The veil top left area, after blocking rock", + Locations.locations_veil_tl_rock)) + self.turtle_cave = ( + self.__add_region("turtle_cave", + "The veil top left area, turtle cave", + None)) + self.turtle_cave_rocks = ( + self.__add_region("turtle_cave_rocks", + "The veil top left area, turtle cave", + Locations.locations_turtle_cave_rocks)) + self.turtle_cave_bubble = ( + self.__add_region("turtle_cave_bubble", + "The veil top left area, turtle cave bubble cliff", + Locations.locations_turtle_cave_bubble)) + self.turtle_cave_top_bubble = ( + self.__add_region("turtle_cave_top_bubble", + "The veil top left area, turtle cave bubble cliff", + Locations.locations_turtle_cave_top_bubble)) + self.veil_tr_l = ( + self.__add_region("veil_tr_l", + "The veil top right area, left of temple", + Locations.locations_veil_tr_l)) + self.veil_tr_r = ( + self.__add_region("veil_tr_r", + "The veil top right area, right of temple", + Locations.locations_veil_tr_r)) + self.veil_tr_water_fall = ( + self.__add_region("veil_tr_water_fall", + "The veil top right area, top of the water fall", + Locations.locations_veil_tr_water_fall)) + self.octo_cave_t = self.__add_region("octo_cave_t", + "Octopus cave top entrance", + Locations.locations_octo_cave_t) + self.octo_cave_b = self.__add_region("octo_cave_b", + "Octopus cave bottom entrance", + Locations.locations_octo_cave_b) + self.veil_bl = self.__add_region("veil_bl", + "The veil bottom left area", + Locations.locations_veil_bl) + self.veil_b_sc = ( + self.__add_region("veil_b_sc", + "The veil bottom spirit cristal area", + Locations.locations_veil_b_sc)) + self.veil_bl_fp = self.__add_region("veil_bl_fp", + "The veil bottom left area", + Locations.locations_veil_bl_fp) + self.veil_br = self.__add_region("veil_br", + "The veil bottom right area", + Locations.locations_veil_br) + + def __create_sun_temple(self): + """ + Create the `sun_temple*` regions + """ + self.sun_temple_l = self.__add_region("sun_temple_l", + "Sun temple left area", + Locations.locations_sun_temple_l) + self.sun_temple_r = self.__add_region("sun_temple_r", + "Sun temple right area", + Locations.locations_sun_temple_r) + self.sun_temple_boss_lt = ( + self.__add_region("sun_temple_boss_lt", + "Sun temple before boss area, " + + "top of the cliffs", + Locations.locations_sun_temple_boss_lt)) + self.sun_temple_boss_lb = ( + self.__add_region("sun_temple_boss_lb", + "Sun temple before boss area", + Locations.locations_sun_temple_boss_lb)) + self.sun_temple_boss_r = ( + self.__add_region("sun_temple_boss_r", + "Sun temple boss area", + Locations.locations_sun_temple_boss_r)) + + def __create_abyss(self): + """ + Create the `abyss_*`, `ice_cave`, `king_jellyfish_cave` and `whale` + regions + """ + self.abyss_l = self.__add_region("abyss_l", + "Abyss left area", + Locations.locations_abyss_l) + self.abyss_lb = self.__add_region("abyss_lb", + "Abyss left bottom area", + None) + self.abyss_l_fp = self.__add_region("abyss_l_fp", + "Abyss left buttom area", + Locations.locations_abyss_l_fp) + self.abyss_r = self.__add_region("abyss_r", + "Abyss right area", + Locations.locations_abyss_r) + self.ice_cave = self.__add_region("ice_cave", + "Ice cave", + Locations.locations_ice_cave) + self.bubble_cave = self.__add_region("bubble_cave", + "Bubble cave", + Locations.locations_bubble_cave) + self.king_jellyfish_cave = ( + self.__add_region("king_jellyfish_cave", + "Abyss left area, King jellyfish cave", + Locations.locations_king_jellyfish_cave)) + self.whale = self.__add_region("whale", + "Inside the whale", + Locations.locations_whale) + + def __create_sunken_city(self): + """ + Create the `sunken_city_*` regions + """ + self.sunkencity_l = self.__add_region("sunkencity_l", + "Sunken city left area", + Locations.locations_sunkencity_l) + self.sunkencity_l_bedroom = ( + self.__add_region("sunkencity_l_bedroom", + "Sunken city left area, bedroom", + Locations.locations_sunkencity_l_bedroom)) + self.sunkencity_r = self.__add_region("sunkencity_r", + "Sunken city right area", + Locations.locations_sunkencity_r) + self.sunkencity_boss = ( + self.__add_region("sunkencity_boss", + "Sunken city boss area", + Locations.locations_sunkencity_boss)) + + def __create_body(self): + """ + Create the `body_*` and `final_boss* regions + """ + self.body_c = self.__add_region("body_c", + "The body center area", + Locations.locations_body_c) + self.body_l = self.__add_region("body_l", + "The body left area", + Locations.locations_body_l) + self.body_rt = self.__add_region("body_rt", + "The body right area, top path", + Locations.locations_body_rt) + self.body_rb = self.__add_region("body_rb", + "The body right area, bottom path", + Locations.locations_body_rb) + self.body_b = self.__add_region("body_b", + "The body bottom area", + Locations.locations_body_b) + self.final_boss = self.__add_region("final_boss", + "The body, final boss area", + None) + self.final_boss_tube = ( + self.__add_region("final_boss_tube", + "The body, final boss area turtle room", + Locations.locations_final_boss_tube)) + self.final_boss_3_form = ( + self.__add_region("final_boss_3_form", + "The body final boss third form area", + Locations.locations_final_boss_3_form)) + self.final_boss_end = ( + self.__add_region("final_boss_end", + "The body, final boss area", None)) + + def __connect_one_way_regions(self, name: str, source_region: Region, + destination_region: Region, rule=None): + """ + Connect from the `source_region` to the `destination_region` + """ + entrance = Entrance(source_region.player, name, source_region) + source_region.exits.append(entrance) + entrance.connect(destination_region) + if rule is not None: + set_rule(entrance, rule) + + def __connect_regions(self, name: str, source_region: Region, + destination_region: Region, rule=None): + """ + Connect the `source_region` and the `destination_region` (two-way) + """ + self.__connect_one_way_regions(name, source_region, + destination_region, rule) + self.__connect_one_way_regions(name, destination_region, + source_region, rule) + + def __connect_home_water_regions(self): + """ + Connect entrances of the different regions around `home_water` + """ + self.__connect_regions("verse_cave_l_verse_cave_r", + self.verse_cave_l, self.verse_cave_r) + self.__connect_regions("verse_cave_l_home_water", + self.verse_cave_l, self.home_water) + self.__connect_regions("home_water_naija_home", + self.home_water, self.naija_home) + self.__connect_regions("home_water_song_cave", + self.home_water, self.song_cave) + self.__connect_regions("song_cave_song_cave_anemone", + self.song_cave, + self.song_cave_anemone) # Need Nature Form + self.__connect_regions("home_water_energy_temple_1", + self.home_water, + self.energy_temple_1) # Need bind song + self.__connect_regions("home_water_energy_temple_altar", + self.home_water, + self.energy_temple_altar) # Need energy form + self.__connect_regions("energy_temple_1_energy_temple_2", + self.energy_temple_1, + self.energy_temple_2) # Need energy form + self.__connect_regions("energy_temple_1_energy_temple_boss", + self.energy_temple_1, + self.energy_temple_boss) # Need Fish form or Energy form + self.__connect_regions("energy_temple_2_energy_temple_3", + self.energy_temple_2, + self.energy_temple_3) # Need Bind form and Energy form + self.__connect_regions("energy_temple_boss_energy_temple_blaster_room", + self.energy_temple_boss, + self.energy_temple_blaster_room) # Need Nature form, Bind form and energy form + self.__connect_regions("energy_temple_1_energy_temple_blaster_room", + self.energy_temple_1, + self.energy_temple_blaster_room) # Need Nature form, Bind form, energy form and Beast form + self.__connect_regions("home_water_openwater_tl", + self.home_water, + self.openwater_tl) # Need Bind song and energy form one-way + + def __connect_open_water_regions(self): + """ + Connect entrances of the different regions around open water + """ + self.__connect_regions("openwater_tl_openwater_tr", + self.openwater_tl, self.openwater_tr) + self.__connect_regions("openwater_tl_openwater_bl", + self.openwater_tl, self.openwater_bl) + self.__connect_regions("openwater_tl_forest_br", + self.openwater_tl, self.forest_br) + self.__connect_regions("openwater_tr_openwater_tr_turtle", + self.openwater_tr, + self.openwater_tr_turtle) # Beast form needed + self.__connect_regions("openwater_tr_openwater_br", + self.openwater_tr, self.openwater_br) + self.__connect_regions("openwater_tr_mithalas_city", + self.openwater_tr, self.mithalas_city) + self.__connect_regions("openwater_tr_veil_bl", + self.openwater_tr, self.veil_bl) + self.__connect_regions("openwater_tr_veil_br", + self.openwater_tr, + self.veil_br) # Beast form needed for one way + self.__connect_regions("openwater_bl_openwater_br", + self.openwater_bl, self.openwater_br) + self.__connect_regions("openwater_bl_skeleton_path", + self.openwater_bl, self.skeleton_path) + self.__connect_regions("openwater_bl_abyss_l", + self.openwater_bl, self.abyss_l) + self.__connect_regions("openwater_bl_openwater_bl_fp", + self.openwater_bl, + self.openwater_bl_fp) # Fish form + self.__connect_regions("skeleton_path_skeleton_path_sc", + self.skeleton_path, + self.skeleton_path_sc) # Spirit form needed + self.__connect_regions("openwater_br_abyss_r", + self.openwater_br, self.abyss_r) + self.__connect_regions("openwater_br_arnassi", + self.openwater_br, + self.arnassi) # Beast form needed for one-way + self.__connect_regions("arnassi_arnassi_path", + self.arnassi, self.arnassi_path) + self.__connect_regions("arnassi_path_arnassi_crab_boss", + self.arnassi_path, + self.arnassi_crab_boss) # Beast form needed for one-way + self.__connect_regions("arnassi_path_simon", + self.arnassi_path, + self.simon) # Fish form needed + + def __connect_mithalas_regions(self): + """ + Connect entrances of the different regions around Mithalas + """ + self.__connect_regions("mithalas_city_mithalas_city_urns", + self.mithalas_city, + self.mithalas_city_urns) # Energy form needed one-way + self.__connect_regions("mithalas_city_mithalas_city_top_path", + self.mithalas_city, + self.mithalas_city_top_path) # Beast form needed one-way + self.__connect_regions( + "mithalas_city_top_path_mithalas_city_top_path_urn", + self.mithalas_city_top_path, + self.mithalas_city_top_path_urn) # Energy form needed + self.__connect_regions("mithalas_city_mithalas_city_fishpass", + self.mithalas_city, + self.mithalas_city_fishpass) # Fish form needed + self.__connect_regions("mithalas_city_cathedral_l", + self.mithalas_city, + self.cathedral_l) # Fish form needed + self.__connect_regions("mithalas_city_top_path_cathedral_l_tube", + self.mithalas_city_top_path, + self.cathedral_l_tube) # Nature form needed Enlever le courrant + self.__connect_regions("cathedral_l_tube_cathedral_l_sc", + self.cathedral_l_tube, + self.cathedral_l_sc) # spirit form needed + self.__connect_regions("cathedral_l_tube_cathedral_l", + self.cathedral_l_tube, + self.cathedral_l) # spirit form needed + self.__connect_regions("cathedral_l_cathedral_l_sc", + self.cathedral_l, + self.cathedral_l_sc) # spirit form needed + self.__connect_regions("cathedral_l_cathedral_l_urns", + self.cathedral_l, + self.cathedral_l_urns) # energy form needed + self.__connect_regions("cathedral_l_cathedral_boss_l", + self.cathedral_l, + self.cathedral_boss_l) # beast form needed and Location mithalas boss needed + self.__connect_regions("cathedral_l_cathedral_underground", + self.cathedral_l, + self.cathedral_underground) # beast form and bind song needed + self.__connect_regions("cathedral_l_cathedral_r", + self.cathedral_l, + self.cathedral_r) # bind song and energy form needed + self.__connect_regions("cathedral_r_cathedral_underground", + self.cathedral_r, + self.cathedral_underground) # energy form needed + self.__connect_regions("cathedral_underground_cathedral_boss_l", + self.cathedral_underground, + self.cathedral_boss_l) # bind song and energy form needed one side + self.__connect_regions("cathedral_boss_r_cathedral_boss_l", + self.cathedral_boss_r, + self.cathedral_boss_l) # bind song and energy form needed one-way + + def __connect_forest_regions(self): + """ + Connect entrances of the different regions around the Kelp Forest + """ + self.__connect_regions("forest_br_forest_br_ship", + self.forest_br, + self.forest_br_ship) # Sun form needed + self.__connect_regions("forest_br_veil_bl", + self.forest_br, self.veil_bl) + self.__connect_regions("forest_br_forest_bl", + self.forest_br, self.forest_bl) + self.__connect_regions("forest_br_forest_tr", + self.forest_br, self.forest_tr) + self.__connect_regions("forest_bl_forest_bl_sc", + self.forest_bl, + self.forest_bl_sc) # spirit form needed + self.__connect_regions("forest_bl_forest_fish_cave", + self.forest_bl, self.forest_fish_cave) + self.__connect_regions("forest_bl_forest_tl", + self.forest_bl, self.forest_tl) + self.__connect_regions("forest_bl_forest_boss_entrance", + self.forest_bl, + self.forest_boss_entrance) # Nature form needed + self.__connect_regions("forest_tl_forest_tl_fp", + self.forest_tl, + self.forest_tl_fp) # Nature form, Bind song, Energy form and Fish form needed + self.__connect_regions("forest_tl_forest_tr", + self.forest_tl, self.forest_tr) + self.__connect_regions("forest_tl_forest_boss_entrance", + self.forest_tl, self.forest_boss_entrance) + self.__connect_regions("forest_boss_forest_boss_entrance", + self.forest_boss, + self.forest_boss_entrance) # Energy form needed + self.__connect_regions("forest_tr_forest_tr_dark", + self.forest_tr, + self.forest_tr_dark) # Sun form needed + self.__connect_regions("forest_tr_forest_tr_fp", + self.forest_tr, + self.forest_tr_fp) # Fish form needed + self.__connect_regions("forest_tr_forest_sprite_cave", + self.forest_tr, self.forest_sprite_cave) + self.__connect_regions("forest_sprite_cave_forest_sprite_cave_tube", + self.forest_sprite_cave, + self.forest_sprite_cave_tube) # Nature form needed + self.__connect_regions("forest_tr_mermog_cave", + self.forest_tr_fp, self.mermog_cave) + self.__connect_regions("mermog_cave_mermog_boss", + self.mermog_cave, + self.mermog_boss) # Beast form and energy form needed + + def __connect_veil_regions(self): + """ + Connect entrances of the different regions around The Veil + """ + self.__connect_regions("veil_bl_veil_bl_fp", + self.veil_bl, + self.veil_bl_fp) # Fish form, bind song and Energy form needed + self.__connect_regions("veil_bl_veil_b_sc", + self.veil_bl, + self.veil_b_sc) # Spirit form needed + self.__connect_regions("veil_b_sc_veil_br", + self.veil_b_sc, + self.veil_br) # Spirit form needed + self.__connect_regions("veil_br_veil_tl", + self.veil_br, self.veil_tl) # Beast form needed + self.__connect_regions("veil_tl_veil_tl_fp", + self.veil_tl, + self.veil_tl_fp) # Fish form needed + self.__connect_regions("veil_tl_veil_tl_rock", + self.veil_tl, + self.veil_tl_rock) # Bind song needed + self.__connect_regions("veil_tl_veil_tr_r", + self.veil_tl, self.veil_tr_r) + self.__connect_regions("veil_tl_turtle_cave", + self.veil_tl, self.turtle_cave) + self.__connect_regions("turtle_cave_turtle_cave_rocks", + self.turtle_cave, + self.turtle_cave_rocks) # Bind song needed + self.__connect_regions("turtle_cave_turtle_cave_bubble", + self.turtle_cave, + self.turtle_cave_bubble) # Beast form needed + self.__connect_regions("veil_tr_r_sun_temple_r", + self.veil_tr_r, self.sun_temple_r) + self.__connect_regions("sun_temple_r_sun_temple_l", + self.sun_temple_r, + self.sun_temple_l) # bind song needed + self.__connect_regions("sun_temple_l_veil_tr_l", + self.sun_temple_l, self.veil_tr_l) + self.__connect_regions("sun_temple_l_sun_temple_boss_lb", + self.sun_temple_l, self.sun_temple_boss_lb) + self.__connect_one_way_regions( + "sun_temple_boss_lb_sun_temple_boss_lt", + self.turtle_cave_bubble, self.turtle_cave_top_bubble, + lambda state: state.has("ingredient_hotsoup", self.player) + # Beast form needed + ) + + self.__connect_one_way_regions("sun_temple_boss_lt_sun_temple_boss_lb", + self.sun_temple_boss_lt, + self.sun_temple_boss_lb) + self.__connect_regions("sun_temple_boss_lb_sun_temple_boss_r", + self.sun_temple_boss_lb, + self.sun_temple_boss_r) # Energy form needed + self.__connect_one_way_regions("sun_temple_boss_r_veil_tr_l", + self.sun_temple_boss_r, self.veil_tr_l) + self.__connect_one_way_regions( + "turtle_cave_bubble_turtle_cave_top_bubble", + self.turtle_cave_bubble, self.turtle_cave_top_bubble, + lambda state: state.has("ingredient_hotsoup", self.player) + # Beast form needed + ) + self.__connect_one_way_regions( + "turtle_cave_bubble_turtle_cave_top_bubble", + self.turtle_cave_top_bubble, self.turtle_cave_bubble) + self.__connect_one_way_regions( + "veil_tr_l_veil_tr_water_fall", + self.veil_tr_l, self.veil_tr_water_fall, + lambda state: state.has("ingredient_hotsoup", self.player) + # Beast form needed + ) + self.__connect_one_way_regions("veil_tr_water_fall_veil_tr_l", + self.veil_tr_water_fall, self.veil_tr_l) + + self.__connect_regions("veil_tr_l_octo_cave", + self.veil_tr_l, + self.octo_cave_t) # Fish, sun and beast form form needed + self.__connect_regions("veil_tr_l_octo_cave", + self.veil_tr_l, + self.octo_cave_b) # Fish form needed + + def __connect_abyss_regions(self): + """ + Connect entrances of the different regions around The Abyss + """ + self.__connect_regions("abyss_l_abyss_lb", + self.abyss_l, + self.abyss_lb) # Nature form needed + self.__connect_regions("abyss_lb_abyss_l_fp", + self.abyss_lb, + self.abyss_l_fp) # Fish form needed + self.__connect_regions("abyss_lb_sunken_city_r", + self.abyss_lb, self.sunken_city_r) # Li needed + self.__connect_regions( + "abyss_lb_body_c", + self.abyss_lb, self.body_c, + lambda state: state.has("Body tongue cleared", self.player)) # Adding a check for opening + self.__connect_regions("abyss_l_king_jellyfish_cave", + self.abyss_l, + self.king_jellyfish_cave) # Energy form needed + self.__connect_regions("abyss_l_abyss_r", + self.abyss_l, self.abyss_r) + self.__connect_regions("abyss_r_whale", + self.abyss_r, + self.whale) # Spirit form and sun form needed + self.__connect_regions("abyss_r_ice_cave", + self.abyss_r, + self.ice_cave) # Spirit form needed + self.__connect_regions("abyss_r_bubble_cave", + self.abyss_r, + self.bubble_cave) # Beast form needed + + def __connect_sunken_city_regions(self): + """ + Connect entrances of the different regions around The Sunken City + """ + self.__connect_regions("sunken_city_r_sunken_city_l", + self.sunken_city_r, self.sunken_city_l) + self.__connect_regions("sunken_city_l_sunkencity_l_bedroom", + self.sunken_city_l, + self.sunkencity_l_bedroom) # Spirit form needed + self.__connect_regions("sunken_city_l_sunkencity_l_bedroom", + self.sunken_city_l, self.sunken_city_boss) + + def __connect_body_regions(self): + """ + Connect entrances of the different regions around The body + """ + self.__connect_regions("body_c_body_l", + self.body_c, self.body_l) + self.__connect_regions("body_c_body_rt", + self.body_c, self.body_rt) + self.__connect_regions("body_c_body_rb", + self.body_c, self.body_rb) + body_door_condition = \ + lambda state: state.has("Body door 1 opened", self.player) and \ + state.has("Body door 2 opened", self.player) and \ + state.has("Body door 3 opened", self.player) and \ + state.has("Body door 4 opened", self.player) + self.__connect_regions("body_c_body_b", + self.body_c, self.body_b, body_door_condition) + self.__connect_regions("body_b_final_boss", + self.body_b, self.final_boss, + body_door_condition) # Need 4 spirits + self.__connect_regions("final_boss_final_boss_tube", + self.final_boss, + self.final_boss_tube) # Nature form needed + self.__connect_one_way_regions("final_boss_final_boss_3_form", + self.final_boss, + self.final_boss_3_form) # Need final boss conditions + self.__connect_one_way_regions("final_boss_3_form_final_boss_end", + self.final_boss_3_form, + self.final_boss_end) + + def connect_regions(self): + """ + Connect every region (entrances and exits) + """ + self.__connect_home_water_regions() + self.__connect_open_water_regions() + self.__connect_mithalas_regions() + self.__connect_forest_regions() + self.__connect_veil_regions() + self.__connect_abyss_regions() + self.__connect_sunken_city_regions() + self.__connect_body_regions() + + def __add_event_location(self, region:Region, name: str, event_name: str): + """ + Add an event to the `region` with the name `name` and the item + `event_name` + """ + location: Locations.AquariaLocation = Locations.AquariaLocation( + self.player, name, None, region + ) + region.locations.append(location) + location.place_locked_item(AquariaItem(event_name, True, None, + self.player)) + + + def add_event_locations(self): + """ + Add every events (locations and items) to the `world` + """ + self.__add_event_location(self.abyss_lb, + "Sunken City cleared", + "Body tongue cleared") + self.__add_event_location(self.body_l, + "Trotite spirit freed", + "Body door 1 opened") + self.__add_event_location(self.body_l, "Drask spirit freed", + "Body door 2 opened") + self.__add_event_location(self.body_rt, "Druniad spirit freed", + "Body door 3 opened") + self.__add_event_location(self.body_rb, "Erulian spirit freed", + "Body door 4 opened") + self.__add_event_location(self.final_boss_end, "Objective complete", + "Victory") + + def __add_home_water_regions_to_world(self): + """ + Add every region around home water to the `world` + """ + self.world.regions.append(self.verse_cave_r) + self.world.regions.append(self.verse_cave_l) + self.world.regions.append(self.home_water) + self.world.regions.append(self.naija_home) + self.world.regions.append(self.song_cave) + self.world.regions.append(self.song_cave_anemone) + self.world.regions.append(self.energy_temple_1) + self.world.regions.append(self.energy_temple_2) + self.world.regions.append(self.energy_temple_3) + self.world.regions.append(self.energy_temple_boss) + self.world.regions.append(self.energy_temple_blaster_room) + self.world.regions.append(self.energy_temple_altar) + + def __add_open_water_regions_to_world(self): + """ + Add every region around open water to the `world` + """ + self.world.regions.append(self.openwater_tl) + self.world.regions.append(self.openwater_tr) + self.world.regions.append(self.openwater_tr_turtle) + self.world.regions.append(self.openwater_bl) + self.world.regions.append(self.openwater_bl_fp) + self.world.regions.append(self.openwater_br) + self.world.regions.append(self.skeleton_path) + self.world.regions.append(self.skeleton_path_sc) + self.world.regions.append(self.arnassi) + self.world.regions.append(self.arnassi_path) + self.world.regions.append(self.arnassi_crab_boss) + self.world.regions.append(self.simon) + + def __add_mithalas_regions_to_world(self): + """ + Add every region around Mithalas to the `world` + """ + self.world.regions.append(self.mithalas_city) + self.world.regions.append(self.mithalas_city_urns) + self.world.regions.append(self.mithalas_city_top_path) + self.world.regions.append(self.mithalas_city_top_path_urn) + self.world.regions.append(self.mithalas_city_fishpass) + self.world.regions.append(self.cathedral_l) + self.world.regions.append(self.cathedral_l_urns) + self.world.regions.append(self.cathedral_l_tube) + self.world.regions.append(self.cathedral_l_sc) + self.world.regions.append(self.cathedral_r) + self.world.regions.append(self.cathedral_underground) + self.world.regions.append(self.cathedral_boss_l) + self.world.regions.append(self.cathedral_boss_r) + + def __add_forest_regions_to_world(self): + """ + Add every region around the kelp forest to the `world` + """ + self.world.regions.append(self.forest_tl) + self.world.regions.append(self.forest_tl_fp) + self.world.regions.append(self.forest_tr) + self.world.regions.append(self.forest_tr_dark) + self.world.regions.append(self.forest_tr_fp) + self.world.regions.append(self.forest_bl) + self.world.regions.append(self.forest_bl_sc) + self.world.regions.append(self.forest_br) + self.world.regions.append(self.forest_br_ship) + self.world.regions.append(self.forest_boss) + self.world.regions.append(self.forest_boss_entrance) + self.world.regions.append(self.forest_sprite_cave) + self.world.regions.append(self.forest_sprite_cave_tube) + self.world.regions.append(self.mermog_cave) + self.world.regions.append(self.mermog_boss) + self.world.regions.append(self.forest_fish_cave) + + def __add_veil_regions_to_world(self): + """ + Add every region around the Veil to the `world` + """ + self.world.regions.append(self.veil_tl) + self.world.regions.append(self.veil_tl_fp) + self.world.regions.append(self.veil_tl_rock) + self.world.regions.append(self.veil_tr_l) + self.world.regions.append(self.veil_tr_r) + self.world.regions.append(self.veil_tr_water_fall) + self.world.regions.append(self.veil_bl) + self.world.regions.append(self.veil_b_sc) + self.world.regions.append(self.veil_bl_fp) + self.world.regions.append(self.veil_br) + self.world.regions.append(self.octo_cave_t) + self.world.regions.append(self.octo_cave_b) + self.world.regions.append(self.turtle_cave) + self.world.regions.append(self.turtle_cave_rocks) + self.world.regions.append(self.turtle_cave_bubble) + self.world.regions.append(self.turtle_cave_top_bubble) + self.world.regions.append(self.sun_temple_l) + self.world.regions.append(self.sun_temple_r) + self.world.regions.append(self.sun_temple_boss_lt) + self.world.regions.append(self.sun_temple_boss_lb) + self.world.regions.append(self.sun_temple_boss_r) + + def __add_abyss_regions_to_world(self): + """ + Add every region around the Abyss to the `world` + """ + self.world.regions.append(self.abyss_l) + self.world.regions.append(self.abyss_lb) + self.world.regions.append(self.abyss_l_fp) + self.world.regions.append(self.abyss_r) + self.world.regions.append(self.ice_cave) + self.world.regions.append(self.bubble_cave) + self.world.regions.append(self.king_jellyfish_cave) + self.world.regions.append(self.whale) + self.world.regions.append(self.sunken_city_l) + self.world.regions.append(self.sunken_city_r) + self.world.regions.append(self.sunken_city_boss) + self.world.regions.append(self.sunkencity_l_bedroom) + + def __add_body_regions_to_world(self): + """ + Add every region around the Body to the `world` + """ + self.world.regions.append(self.body_c) + self.world.regions.append(self.body_l) + self.world.regions.append(self.body_rt) + self.world.regions.append(self.body_rb) + self.world.regions.append(self.body_b) + self.world.regions.append(self.final_boss) + self.world.regions.append(self.final_boss_tube) + self.world.regions.append(self.final_boss_3_form) + self.world.regions.append(self.final_boss_end) + + def add_regions_to_world(self): + """ + Add every region to the `world` + """ + self.__add_home_water_regions_to_world() + self.__add_open_water_regions_to_world() + self.__add_mithalas_regions_to_world() + self.__add_forest_regions_to_world() + self.__add_veil_regions_to_world() + self.__add_abyss_regions_to_world() + self.__add_body_regions_to_world() + + def __init__(self, world: MultiWorld, player: int): + """ + Initialisation of the regions + """ + self.world = world + self.player = player + self.__create_home_water_area() + self.__create_energy_temple() + self.__create_openwater() + self.__create_mithalas() + self.__create_forest() + self.__create_veil() + self.__create_sun_temple() + self.__create_abyss() + self.__create_sunken_city() + self.__create_body() diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py new file mode 100644 index 00000000000..f74c253c658 --- /dev/null +++ b/worlds/aquaria/__init__.py @@ -0,0 +1,128 @@ +""" +Author: Louis M +Date: Fri, 15 Mar 2024 18:41:40 +0000 +Description: Main module for Aquaria game multiworld randomizer +""" + +from typing import Dict, ClassVar +from ..AutoWorld import World, WebWorld +from BaseClasses import Tutorial, MultiWorld, ItemClassification +from .Items import item_table, AquariaItem, ItemType +from .Locations import location_table +from .Options import AquariaOptions +from .Regions import AquariaRegion + + +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[0] + for name, data in item_table} + "The name and associated ID of each item of the world" + + 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: Dict[int, int] + "Used to randomize ingredient drop" + + options_dataclass = AquariaOptions + "Used to manage world options" + + options: AquariaOptions + "Every options of the world" + + regions: AquariaRegion + "Used to manage Regions" + + def __init__(self, world: MultiWorld, player: int): + """Initialisation of the Aquaria World""" + super(AquariaWorld, self).__init__(world, player) + self.regions = AquariaRegion(world, player) + + def create_regions(self) -> None: + """ + Create every Region in `regions` + """ + self.regions.add_regions_to_world() + self.regions.connect_regions() + + def create_items(self) -> None: + """Create every items in the world""" + for name, data in item_table: + classification: ItemClassification = ItemClassification.useful + if data[2] == ItemType.JUNK: + classification = ItemClassification.filler + elif data[2] == ItemType.PROGRESSION: + classification = ItemClassification.progression + for i in range(data[1]): + item = AquariaItem(name, classification, data[0] + self.base_id, + self.player) + self.multiworld.itempool.append(item) + + def set_rules(self) -> None: + """ + Launched when the Multiworld generator is ready to generate rules + """ + self.regions.add_event_locations() + self.multiworld.completion_condition[self.player] = lambda \ + state: state.has("Victory", self.player) + + # for debugging purposes, you may want to visualize the layout of your world. + # Uncomment the following code to write a PlantUML diagram to the file + # "aquaria_world.puml" that can help you see whether your regions and locations + # are connected and placed as desired + # from Utils import visualize_regions + # visualize_regions(self.multiworld.get_region("Menu", self.player), "aquaria_world.puml") \ No newline at end of file diff --git a/worlds/aquaria/docs/en_aquaria.md b/worlds/aquaria/docs/en_aquaria.md new file mode 100644 index 00000000000..fa83d7a4e5d --- /dev/null +++ b/worlds/aquaria/docs/en_aquaria.md @@ -0,0 +1,35 @@ +# Aquaria + +## Where is the settings page? + +The player settings page for this game contains all the options you need to configure and export a config file. Player +settings page link: [Aquaria Player Settings Page](../player-settings). + +## What does randomization do to this game? +All sing bulbs, Mithalas urns, Sunken City crates, collectible treasures (including +pet eggs and costumes) beating Simon are location checks. + +Also, there is the option to randomize every ingredient drops (from fishes, monsters +or plants). + +## What is the goal of the game? +The goal of the Aquaria game is to beat the final boss. + +## Which items can be in another player's world? +Any dishes that can be learned as recipe, collectible treasures (including baby pets +and costumes), the third cooking plate and some simple ingredients are items. + +Note that, not like in the vanilla game, the recipes for dishes (other than the Sea Loaf) +in the game cannot be cooked before being learned by receiving them as randomized +items. + +## What does another world's item look like in SM64EX? +No visual are shown when finding sing bulbs, Mithalas urns, Sunken City crates +or when beating Simon. For collectible treasures, the visual of the locations +are 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. \ No newline at end of file diff --git a/worlds/aquaria/docs/fr_aquaria.md b/worlds/aquaria/docs/fr_aquaria.md new file mode 100644 index 00000000000..4705235a58e --- /dev/null +++ b/worlds/aquaria/docs/fr_aquaria.md @@ -0,0 +1,40 @@ +# Aquaria + +## Où se trouve la page des paramètres ? + +La [page des paramètres du joueur pour ce jeu](../player-settings) contient tous +les paramètres dont vous avez besoin pour configurer et exporter le fichier. + +## Quel est l'effet de la randomisation sur ce jeu ? + +Tous les bulbes musicales, urnes de Mithalas, caisses de La Cité engloutie, +les trésores de collection (incluant les oeufs d'animal de compagnie et les +costumes) et battre Simon sont les localisations des "checks". + +À noter qu'il y a également une option pour mélanger les ingrédients que +les poissons, monstres et plantes laissent tomber. + +## Quel est le but de DLC Quest ? + +Dans Aquaria, le but est de battre le monstre final. + +## Quels objets peuvent se trouver dans le monde d'un autre joueur ? + +Tous les repas qui peuvent être appris comme recette , les trésors de collection +(incluant les animaux de compagnie bébé et costumes), la troisième assiette de +cuisson et certains ingrédients de bases. + +Noter que, contrirement à la version vanille du jeu, il est impossible de +cuisiner une recette qui n'a pas préalablement été apprise en l'ayant reçu comme +objet randomizé. + +## À quoi ressemble un objet d'un autre monde dans ce jeu + +Aucun visuel n'apparaît pour les bulbes, urnes, caisses et assiette. Pour les +trésors de collections, le visuel est exactement les mêmes que dans le jeu +vanille. + +## Que se passe-t-il lorsque le joueur reçoit un objet ? + +Chaque fois qu'un objet est reçu, une notification apparaît à l'écran +pour en informer le joueur. diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md new file mode 100644 index 00000000000..23407f068cc --- /dev/null +++ b/worlds/aquaria/docs/setup_en.md @@ -0,0 +1,3 @@ +# Aquaria Randomizer Setup Guide + +ToDo \ No newline at end of file diff --git a/worlds/aquaria/docs/setup_fr.md b/worlds/aquaria/docs/setup_fr.md new file mode 100644 index 00000000000..ff2537c8ca0 --- /dev/null +++ b/worlds/aquaria/docs/setup_fr.md @@ -0,0 +1,3 @@ +# # Guide de configuration MultiWorld de DLCQuest + +À faire From 061f1f96c1a1e4ad23a92b47c062076e4edbc50e Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 18 Mar 2024 18:39:08 -0400 Subject: [PATCH 02/56] Aquaria version 0 alpha --- worlds/aquaria/Items.py | 257 ++++---- worlds/aquaria/Locations.py | 1142 ++++++++++++++++++----------------- worlds/aquaria/Regions.py | 468 +++++++------- worlds/aquaria/__init__.py | 53 +- 4 files changed, 995 insertions(+), 925 deletions(-) diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index 39eb4687323..f1581783bfd 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -46,145 +46,124 @@ def __init__(self, name: str, classification: ItemClassification, """ super().__init__(name, classification, code, player) - +"""Information data for every (not event) item.""" item_table = { - """Information data for every (not event) item.""" # name: ID, Nb, Item Type, Item Group - "collectible_anemone": (0, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_arnassi_statue": (1, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_big_seed": (2, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_bio_seed": (3, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_blackpearl": (4, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_blaster": (5, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "collectible_crab_costume": (6, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "collectible_dumbo": (7, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "collectible_energy_boss": (8, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_energy_statue": (9, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_energy_temple": (10, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_gold_star": (11, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_golden_gear": (12, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_jelly_beacon": (13, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_jelly_costume": (14, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "collectible_jelly_plant": (15, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_mithala_doll": (16, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_mithalan_costume": (17, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_mithalas_banner": (18, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_mithalas_pot": (19, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_mutant_costume": (20, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_nautilus": (21, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "collectible_piranha": (22, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "collectible_seahorse_costume": (23, 1, ItemType.NORMAL, - ItemGroup.UTILITY), - "collectible_seed_bag": (24, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_skull": (25, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_spore_seed": (26, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_stone_head": (27, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_sun_key": (28, 1, ItemType.NORMAL, ItemGroup.COLLECTIBLE), - "collectible_teen_costume": (29, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_treasure_chest": (30, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_trident_head": (31, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_turtle_egg": (32, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "collectible_upsidedown_seed": (33, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_urchin_costume": (34, 1, ItemType.JUNK, - ItemGroup.COLLECTIBLE), - "collectible_walker": (35, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "ingredient_Vedha'sCure-All": (36, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_Zuuna'sperogi": (37, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_arcanepoultice": (38, 7, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_berryicecream": (39, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_butterysealoaf": (40, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_coldborscht": (41, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_coldsoup": (42, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_crabcake": (43, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_divinesoup": (44, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_dumboicecream": (45, 3, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_eeloil": (46, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_fishmeat": (47, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_fishoil": (48, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_glowingegg": (49, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_handroll": (50, 5, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_healingpoultice": (51, 4, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_heartysoup": (52, 5, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_hotborscht": (53, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_hotsoup": (54, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), - "ingredient_icecream": (55, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_leadershiproll": (56, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_leafpoultice": (57, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), - "ingredient_leechingpoultice": (58, 4, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_legendarycake": (59, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_loafoflife": (60, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_longlifesoup": (61, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_magicsoup": (62, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_mushroom_2": (63, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_perogi": (64, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_plantleaf": (65, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_plumpperogi": (66, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_poisonloaf": (67, 1, ItemType.JUNK, ItemGroup.RECIPE), - "ingredient_poisonsoup": (68, 1, ItemType.JUNK, ItemGroup.RECIPE), - "ingredient_rainbowmushroom": (69, 4, ItemType.NORMAL, - ItemGroup.INGREDIENT), - "ingredient_rainbowsoup": (70, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_redberry": (71, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_redbulb_2": (72, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_rottencake": (73, 1, ItemType.JUNK, ItemGroup.RECIPE), - "ingredient_rottenloaf_8": (74, 1, ItemType.JUNK, ItemGroup.RECIPE), - "ingredient_rottenmeat": (75, 5, ItemType.JUNK, ItemGroup.INGREDIENT), - "ingredient_royalsoup": (76, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_seacake": (77, 4, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_sealoaf": (78, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_sharkfinsoup": (79, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_sightpoultice": (80, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_smallbone_2": (81, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_smallegg": (82, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_smalltentacle_2": (83, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_specialbulb": (84, 5, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_specialcake": (85, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_spicymeat_2": (86, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_spicyroll": (87, 11, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_spicysoup": (88, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_spiderroll": (89, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_swampcake": (90, 3, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_tastycake": (91, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_tastyroll": (92, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_toughcake": (93, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_turtlesoup": (94, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_vedhaseacrisp": (95, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_veggiecake": (96, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_veggieicecream": (97, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_veggiesoup": (98, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_volcanoroll": (99, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "upgrade_health_1": (100, 1, ItemType.NORMAL, ItemGroup.HEALTH), - "upgrade_health_2": (101, 1, ItemType.NORMAL, ItemGroup.HEALTH), - "upgrade_health_3": (102, 1, ItemType.NORMAL, ItemGroup.HEALTH), - "upgrade_health_4": (103, 1, ItemType.NORMAL, ItemGroup.HEALTH), - "upgrade_health_5": (104, 1, ItemType.NORMAL, ItemGroup.HEALTH), - "upgrade_wok": (105, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "ingredient_eeloil_2": (106, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_fishmeat_2": (107, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_fishoil_3": (108, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_glowingegg_2": (109, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_healingpoultice_2": (110, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_hotsoup_2": (111, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), - "ingredient_leadershiproll_2": (112, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_leafpoultice_3": (113, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), - "ingredient_plantleaf_2": (114, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_plantleaf_3": (115, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_rottenmeat_2": (116, 1, ItemType.JUNK, ItemGroup.INGREDIENT), - "ingredient_rottenmeat_8": (117, 1, ItemType.JUNK, ItemGroup.INGREDIENT), - "ingredient_sealoaf_2": (118, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "ingredient_smallbone_3": (119, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), - "ingredient_smallegg_2": (120, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Anemone": (698000, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Arnassi statue": (698001, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Big seed": (698002, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Glowing seed": (698003, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Black pearl": (698004, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Baby blaster": (698005, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "Crab armor": (698006, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "Baby dumbo": (698007, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "Tooth": (698008, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Energy statue": (698009, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Krotite armor": (698010, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Golden starfish": (698011, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Golden gear": (698012, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Jelly beacon": (698013, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Jelly costume": (698014, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "Jelly plant": (698015, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Mithalas doll": (698016, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Mithalan dress": (698017, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Mithalas banner": (698018, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Mithalas pot": (698019, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Mutant costume": (698020, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Baby nautilus": (698021, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "Baby piranha": (698022, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "Arnassi Armor": (698023, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "Seed bag": (698024, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "King's Skull": (698025, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Song plant spore": (698026, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Stone head": (698027, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Sun key": (698028, 1, ItemType.NORMAL, ItemGroup.COLLECTIBLE), + "Girl costume": (698029, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Odd container": (698030, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Trident": (698031, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Turtle egg": (698032, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Jelly egg": (698033, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Urchin costume": (698034, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Baby walker": (698035, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), + "Vedha's Cure-All-All": (698036, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Zuuna's perogi": (698037, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Arcane poultice": (698038, 7, ItemType.NORMAL, ItemGroup.RECIPE), + "Berry ice cream": (698039, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Buttery sea loaf": (698040, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Cold borscht": (698041, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Cold soup": (698042, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Crab cake": (698043, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Divine soup": (698044, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Dumbo ice cream": (698045, 3, ItemType.NORMAL, ItemGroup.RECIPE), + "Eel oil": (698046, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Fish meat": (698047, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Fish oil": (698048, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Glowing egg": (698049, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Hand roll": (698050, 5, ItemType.NORMAL, ItemGroup.RECIPE), + "Healing poultice": (698051, 4, ItemType.NORMAL, ItemGroup.RECIPE), + "Hearty soup": (698052, 5, ItemType.NORMAL, ItemGroup.RECIPE), + "Hot borscht": (698053, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Hot soup": (698054, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), + "Ice cream": (698055, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Leadership roll": (698056, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Leaf poultice": (698057, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), + "Leeching poultice": (698058, 4, ItemType.NORMAL, ItemGroup.RECIPE), + "Legendary cake": (698059, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Loaf of life": (698060, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Long life soup": (698061, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Magic soup": (698062, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Mushroom x 2": (698063, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Perogi": (698064, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Plant leaf": (698065, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Plump perogi": (698066, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Poison loaf": (698067, 1, ItemType.JUNK, ItemGroup.RECIPE), + "Poison soup": (698068, 1, ItemType.JUNK, ItemGroup.RECIPE), + "Rainbow mushroom": (698069, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Rainbow soup": (698070, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Red berry": (698071, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Red bulb x 2": (698072, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Rotten cake": (698073, 1, ItemType.JUNK, ItemGroup.RECIPE), + "Rotten loaf x 8": (698074, 1, ItemType.JUNK, ItemGroup.RECIPE), + "Rotten meat": (698075, 5, ItemType.JUNK, ItemGroup.INGREDIENT), + "Royal soup": (698076, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Sea cake": (698077, 4, ItemType.NORMAL, ItemGroup.RECIPE), + "Sea loaf": (698078, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Shark fin soup": (698079, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Sight poultice": (698080, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Small bone x 2": (698081, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Small egg": (698082, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Small tentacle x 2": (698083, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Special bulb": (698084, 5, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Special cake": (698085, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Spicy meat x 2": (698086, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Spicy roll": (698087, 11, ItemType.NORMAL, ItemGroup.RECIPE), + "Spicy soup": (698088, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Spider roll": (698089, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Swamp cake": (698090, 3, ItemType.NORMAL, ItemGroup.RECIPE), + "Tasty cake": (698091, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Tasty roll": (698092, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Tough cake": (698093, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Turtle soup": (698094, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Vedha sea crisp": (698095, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Veggie cake": (698096, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Veggie ice cream": (698097, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Veggie soup": (698098, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Volcano roll": (698099, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Health upgrade": (698100, 5, ItemType.NORMAL, ItemGroup.HEALTH), + "Wok": (698101, 1, ItemType.NORMAL, ItemGroup.UTILITY), + "Eel oil x 2": (698102, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Fish meat x 2": (698103, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Fish oil x 3": (698104, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Glowing egg x 2": (698105, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Healing poultice x 2": (698106, 2, ItemType.NORMAL, ItemGroup.RECIPE), + "Hot soup x 2": (698107, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), + "Leadership roll x 2": (698108, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Leaf poultice x 3": (698109, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), + "Plant leaf x 2": (698110, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Plant leaf x 3": (698111, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Rotten meat x 2": (698112, 1, ItemType.JUNK, ItemGroup.INGREDIENT), + "Rotten meat x 8": (698113, 1, ItemType.JUNK, ItemGroup.INGREDIENT), + "Sea loaf x 2": (698114, 1, ItemType.NORMAL, ItemGroup.RECIPE), + "Small bone x 3": (698115, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Small egg x 2": (698116, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), } diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 01f961c02b6..26d2e76f409 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -24,556 +24,600 @@ def __init__(self, player: int, name="", code=None, parent=None) -> None: 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 behind the rock " + + "in the path left of the skeleton room": 698175, + } + + locations_verse_cave_l = { + "Verse cave left area, center part bulb": 698021, + "Verse cave left area, right part bulb": 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 tutorial 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 by beating Nautilus Prime": 698194, + } + + 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, 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, + "Verse egg of the Song cave": 698160, + "Song cave, Jelly beacon at the top of the cave": 698178, + } + + locations_song_cave_anemone = { + "Song cave, Anemone seed collectible behind of the big anemone": 698162, + } + + locations_energy_temple_1 = { + "Energy temple first area, bulb in the bottom room blocked by a rock": + 698027, + "Energy temple first area, Energy Idol inside the fish pass": 698170, + } + + locations_energy_temple_2 = { + "Energy temple second area, bulb under the rock": 698028, + } + + locations_energy_temple_altar = { + "Energy temple bottom entry, Krotite armor on the altar": 698163, + } + + locations_energy_temple_3 = { + "Energy temple third area, bulb in the bottom path": 698029, + } + + locations_energy_temple_boss = { + "Energy temple, fallen god tooth": 698169, + # Eventually, putting forest boss location here + } + + locations_energy_temple_blaster_room = { + "Energy temple, passage after the fallen got boss, " + + "blaster egg in the locked room": 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, + } + + locations_openwater_bl = { + "Open water bottom left area, bulb behind the chomper fish": 698011, + } + + locations_openwater_bl_fp = { + "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 between the streams": 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 (Seahorse Costume) by beating the race": + 698191, + } + + locations_arnassi_path = { + "Arnassi Ruins, Arnassi statue At the bottom of the right seahorse path" + : 698164, + } + + locations_arnassi_crab_boss = { + "Arnassi ruins, get a Crab armor by beating Crabbius Maximus": 698187, + } + + locations_simon = { + "Arnassi ruins, beating Simon says": 698156, + } + + 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, + } + + locations_mithalas_city_urns = { + "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, + "Mithalas city, urn inside a home fish pass": 698129, + } + + 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, pot in the top passway": 698174, + } + + locations_mithalas_city_top_path_urn = { + "Mithalas city, urn in the cathedral flower tube entrance": 698128, + } + + locations_mithalas_city_fishpass = { + "Mithalas city, Doll inside an home fish pass": 698173, + } + + locations_cathedral_l = { + "Mithalas city castle, bulb in the flesh hole": 698042, + "Mithalas city castle, Blue banner above the main entrance": 698165, + } + + locations_cathedral_l_urns = { + "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 = { + # Eventually, putting mithalas friest boss location here + } + + locations_cathedral_l_sc = { + "Mithalas city castle, trident head behind the spirit cristal": 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 right path": 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 in the book shelf after the current": 698189, + } + + 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 = { + # Eventually, putting mithalas boss location here + } + + 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 at the bottom of the current " + + "with upside down jellies": 698185, + } + + locations_forest_tl_fp = { + "Kelp Forest top left area, bulb in the center path": 698047, + "Verse egg in the Kelp forest top left area": 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, + } + + locations_forest_tr_dark = { + "Kelp forest top right area, Black pearl behind the seawolf": 698167, + } + + locations_forest_tr_fp = { + "Kelp Forest top right area, bulb in the top fish pass": 698050, + } + + locations_forest_bl_sc = { + "Kelp forest bottom left area, Walker baby at the end of the" + + " spirit cristal path": 698186, + "Kelp Forest bottom left area, bulb close to the spirit cristals": + 698054, + } + + locations_forest_br_ship = { + "Kelp forest bottom right area, Odd Container in the sunken ship": + 698168, + } + + locations_forest_boss = { + # Eventually, putting forest boss location here + } + + locations_forest_boss_entrance = { + "Kelp Forest boss room, bulb at the bottom of the area": 698055, + } + + locations_forest_fish_cave = { + # Eventually, putting fish cave location here + } + + 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 at the end of the path " + + "accross the flower portal": 698176, + } + + locations_mermog_cave = { + "Mermog cave, bulb in the left part of the cave": 698121, + } + + locations_mermog_boss = { + "Mermog cave, Piranha Egg by beating Mermog": 698197, + } + + locations_veil_tl = { + "The veil top left area, bulb under the rock in the top right path": + 698078, + } + + locations_veil_tl_fp = { + "The veil top left area, bulb inside the fish pass": 698077, + } + + locations_veil_tl_rock = { + "The veil top left area, bulb hidden behind the blocking rock": 698076, + } + + locations_turtle_cave_rocks = { + "Turtle cave, a Turtle Egg behind the blocking rocks": 698184, + } + + locations_turtle_cave_bubble = { + "Turtle cave, bulb in bubble cliff": 698000, + } + + locations_turtle_cave_top_bubble = { + "Turtle cave, Urchin costume at the very top bubble": 698193, + } + + locations_veil_tr_l = { + } + + locations_veil_tr_r = { # Failaise nécessite le Beast form + "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_water_fall = { + "The veil top right area, bulb in the top of the fall": 698080, + } + + 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 = { + "Verse egg on the sunken ship after the fish pass " + + "in the Veil bottom area": 698157, + } + + locations_veil_br = { + "The veil bottom area, Stone Head in the left passage to the top part": 698181, + } + + locations_octo_cave_t = { + "Octocave, Dumbo Egg by beating the Octopus Prime": 698196, + } + + locations_octo_cave_b = { + "Octopus cave, bulb in the path below the octopus cave path": 698122, + } + + 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, + "Verse egg when Mantis Shrimp Prime in the " + + "bubble cave is beaten": 698161, + } + + 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 where the gold lobster came from": 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 left part": 698093, + "Sun temple, Sun key in the secret passage in the " + + "rightest part of the temple": 698182, + } + + locations_sun_temple_boss_lb = { + "Sun Worm path, first path bulb": 698017, + "Sun Worm path, second path bulb": 698018, + } + + locations_sun_temple_boss_lt = { + "Sun Worm path, first cliff bulb": 698019, + "Sun Worm path, second cliff bulb": 698020, + } + + locations_sun_temple_boss_r = { + # Eventually, putting sun boss location here + } + + 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 in the small room with sun beam": 698166, + "Abyss left area, Glowing Plant in the rightest hidden passage": 698172, + } + + locations_abyss_l_fp = { + "Abyss left area, bulb in the bottom fish pass": 698026, + } + + locations_abyss_r = { + "Abyss right area, bulb behind the rock in the bottom left 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, + } + + locations_ice_cave = { + "Ice cave, bulb in the room to the right": 698083, + "Ice cave, Forst 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_king_jellyfish_cave = { + "King Jellyfish cave, bulb in the right path from King Jelly": 698088, + "Abyss left area, Jellyfish Costume after " + + "beating King Optimus Jelly Prime": 698188, + } + + locations_whale = { + "Verse egg in the whale": 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 in the bed room": 698192, + } + + locations_sunken_city_boss = { + "Sunken city, bulb on the top of the boss area (boiler room)": 698043, + } + + locations_body_c = { + "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 in the secret passage": 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, + } + + locations_final_boss_3_form = { + "Final boss area, bulb in the boss second form room": 698106, + } -locations_verse_cave_r = { - "bulb_starting_cave_1": 698107, - "bulb_starting_cave_2": 698108, - "collect_big_seed": 698175, -} - -locations_verse_cave_l = { - "bulb_tutorial_1": 698021, - "bulb_tutorial_2": 698022, - "bulb_tutorial_3": 698023, -} - -locations_home_water = { - "bulb_home_water_1": 698058, - "bulb_home_water_2": 698059, - "bulb_home_water_3": 698060, - "bulb_home_water_4": 698061, - "bulb_home_water_5": 698062, - "bulb_home_water_6": 698063, - "bulb_home_water_7": 698064, - "bulb_home_water_8": 698065, - "collect_nautilus": 698194, -} - -locations_naija_home = { - "bulb_naija_home_1": 698119, - "bulb_naija_home_2": 698120, -} - -locations_song_cave = { - "bulb_song_cave_1": 698071, - "bulb_song_cave_2": 698072, - "bulb_song_cave_3": 698073, - "bulb_song_cave_4": 698074, - "bulb_song_cave_5": 698075, - "health_egg_4": 698160, - "collect_anemone": 698162, - "collect_jelly_beacon": 698178, -} - -locations_song_cave_anemone = { - "collect_anemone": 698162, -} - -locations_energy_temple_1 = { - "bulb_energy_temple_1_1": 698027, - "collect_energy_statue": 698170, -} - -locations_energy_temple_2 = { - "bulb_energy_temple_2_1": 698028, -} - -locations_energy_temple_altar = { - "collect_energy_temple": 698163, -} - -locations_energy_temple_3 = { - "bulb_energy_temple_3_1": 698029, -} - -locations_energy_temple_boss = { - "collect_energy_boss": 698169, - # Eventually, putting forest boss location here -} - -locations_energy_temple_blaster_room = { - "collect_blaster": 698195, -} - -locations_openwater_tl = { - "bulb_openwater_tl_1": 698001, - "bulb_openwater_tl_2": 698002, - "bulb_openwater_tl_3": 698003, -} - -locations_openwater_tr = { - "bulb_openwater_tr_1": 698004, - "bulb_openwater_tr_2": 698005, - "bulb_openwater_tr_3": 698006, - "bulb_openwater_tr_4": 698007, - "bulb_openwater_tr_5": 698008, - "urn_openwater_tr_1": 698148, - "urn_openwater_tr_2": 698149, - "urn_openwater_tr_3": 698150, -} - -locations_openwater_tr_turtle = { - "bulb_openwater_tr_6": 698009, -} - -locations_openwater_bl = { - "bulb_openwater_bl_2": 698011, -} - -locations_openwater_bl_fp = { - "bulb_openwater_bl_1": 698010, -} - -locations_skeleton_path = { - "bulb_skeleton_path_1": 698012, - "bulb_skeleton_path_2": 698013, -} - -locations_skeleton_path_sc = { - "collect_skull": 698177, -} - -locations_arnassi = { - "bulb_arnassi_1": 698014, - "bulb_arnassi_2": 698015, - "bulb_arnassi_3": 698016, - "collect_spore_seed": 698179, - "collect_seahorse_costume": 698191, -} - -locations_arnassi_path = { - "collect_arnassi_statue": 698164, -} - -locations_arnassi_crab_boss = { - "collect_crab_costume": 698187, -} - -locations_simon = { - "beating_simon": 698156, -} - -locations_mithalas_city = { - "bulb_mithalas_city_01": 698030, - "bulb_mithalas_city_02": 698031, - "bulb_mithalas_city_04": 698033, - "bulb_mithalas_city_05": 698034, - "bulb_mithalas_city_06": 698035, - "bulb_mithalas_city_08": 698037, - "bulb_mithalas_city_09": 698038, - "bulb_mithalas_city_10": 698039, - "bulb_mithalas_city_12": 698041, -} - -locations_mithalas_city_urns = { - "urn_mithalas_city_1": 698123, - "urn_mithalas_city_2": 698124, - "urn_mithalas_city_3": 698125, - "urn_mithalas_city_4": 698126, - "urn_mithalas_city_5": 698127, - "urn_mithalas_city_7": 698129, -} - -locations_mithalas_city_top_path = { - "bulb_mithalas_city_03": 698032, - "bulb_mithalas_city_07": 698036, - "bulb_mithalas_city_11": 698040, - "collect_mithalas_pot": 698174, -} - -locations_mithalas_city_top_path_urn = { - "urn_mithalas_city_6": 698128, -} - -locations_mithalas_city_fishpass = { - "collect_mithala_doll": 698173, -} - -locations_cathedral_l = { - "bulb_cathedral_l_2": 698042, - "collect_mithalas_banner": 698165, -} - -locations_cathedral_l_urns = { - "urn_cathedral_l_1": 698130, - "urn_cathedral_l_2": 698131, - "urn_cathedral_l_3": 698132, - "urn_cathedral_l_4": 698133, - "urn_cathedral_l_5": 698134, - "urn_cathedral_l_6": 698135, -} - -locations_cathedral_l_tube = { - # Eventually, putting mithalas friest boss location here -} - -locations_cathedral_l_sc = { - "collect_trident_head": 698183, -} - -locations_cathedral_r = { - "urn_cathedral_r_01": 698136, - "urn_cathedral_r_02": 698137, - "urn_cathedral_r_03": 698138, - "urn_cathedral_r_04": 698139, - "urn_cathedral_r_05": 698140, - "urn_cathedral_r_06": 698141, - "urn_cathedral_r_07": 698142, - "urn_cathedral_r_08": 698143, - "urn_cathedral_r_09": 698144, - "urn_cathedral_r_10": 698145, - "urn_cathedral_r_11": 698146, - "urn_cathedral_r_12": 698147, - "collect_mithalan_costume": 698189, -} - -locations_cathedral_underground = { - "bulb_cathedral_under_ground_1": 698113, - "bulb_cathedral_under_ground_2": 698114, - "bulb_cathedral_under_ground_3": 698115, - "bulb_cathedral_under_ground_4": 698116, - "bulb_cathedral_under_ground_5": 698117, - "bulb_cathedral_under_ground_6": 698118, -} - -locations_cathedral_boss = { - # Eventually, putting mithalas boss location here -} - -locations_forest_tl = { - "bulb_forest_tl_1": 698044, - "bulb_forest_tl_2": 698045, - "bulb_forest_tl_3": 698046, - "collect_upsidedown_seed": 698185, -} - -locations_forest_tl_fp = { - "bulb_forest_tl_4": 698047, - "health_egg_2": 698158, -} - -locations_forest_tr = { - "bulb_forest_tr_1": 698048, - "bulb_forest_tr_2": 698049, - "bulb_forest_tr_4": 698051, - "bulb_forest_tr_5": 698052, - "bulb_forest_tr_6": 698053, -} - -locations_forest_tr_dark = { - "collect_blackpearl": 698167, -} - -locations_forest_tr_fp = { - "bulb_forest_tr_3": 698050, -} - -locations_forest_bl_sc = { - "collect_walker": 698186, - "bulb_forest_bl_1": 698054, -} - -locations_forest_br_ship = { - "collect_treasure_chest": 698168, -} - -locations_forest_boss = { - # Eventually, putting forest boss location here -} - -locations_forest_boss_entrance = { - "bulb_forest_boss_room_1": 698055, -} - -locations_forest_fish_cave = { - # Eventually, putting fish cave location here -} - -locations_forest_sprite_cave = { - "bulb_forest_sprite_cave_1": 698056, -} - -locations_forest_sprite_cave_tube = { - "bulb_forest_sprite_cave_2": 698057, - "collect_seed_bag": 698176, -} - -locations_mermog_cave = { - "bulb_mermog_cave_1": 698121, -} - -locations_mermog_boss = { - "collect_piranha": 698197, -} - -locations_veil_tl = { - "bulb_veil_tl_3": 698078, -} - -locations_veil_tl_fp = { - "bulb_veil_tl_2": 698077, -} - -locations_veil_tl_rock = { - "bulb_veil_tl_1": 698076, -} - -locations_turtle_cave_rocks = { - "collect_turtle_egg": 698184, -} - -locations_turtle_cave_bubble = { - "bulb_turtlecave": 698000, -} - -locations_turtle_cave_top_bubble = { - "collect_urchin_costume": 698193, -} - -locations_veil_tr_l = { -} - -locations_veil_tr_r = { # Failaise nécessite le Beast form - "bulb_veil_tr_1": 698079, - "collect_gold_star": 698180, -} - -locations_veil_tr_water_fall = { - "bulb_veil_tr_2": 698080, -} - -locations_veil_bl = { - "bulb_veil_b_2": 698082, -} - -locations_veil_b_sc = { - "bulb_veil_b_1": 698081, -} - -locations_veil_bl_fp = { - "health_egg_1": 698157, -} - -locations_veil_br = { - "collect_stone_head": 698181, -} - -locations_octo_cave_t = { - "collect_dumbo": 698196, -} - -locations_octo_cave_b = { - "bulb_octo_cave_1": 698122, -} - -locations_bubble_cave = { - "bulb_bubble_cave_1": 698089, - "bulb_bubble_cave_2": 698090, - "health_egg_5": 698161, -} - -locations_sun_temple_l = { - "bulb_sun_temple_4": 698094, - "bulb_sun_temple_5": 698095, - "bulb_sun_temple_6": 698096, - "collect_golden_gear": 698171, -} - -locations_sun_temple_r = { - "bulb_sun_temple_1": 698091, - "bulb_sun_temple_2": 698092, - "bulb_sun_temple_3": 698093, - "collect_sun_key": 698182, -} - -locations_sun_temple_boss_lb = { - "bulb_sunworm_1": 698017, - "bulb_sunworm_2": 698018, -} - -locations_sun_temple_boss_lt = { - "bulb_sunworm_3": 698019, - "bulb_sunworm_4": 698020, -} - -locations_sun_temple_boss_r = { - # Eventually, putting sun boss location here -} - -locations_abyss_l = { - "bulb_abyss_l_1": 698024, - "bulb_abyss_l_2": 698025, - "collect_bio_seed": 698166, - "collect_jelly_plant": 698172, -} - -locations_abyss_l_fp = { - "bulb_abyss_l_3": 698026, -} - -locations_abyss_r = { - "bulb_abyss_r_1": 698109, - "bulb_abyss_r_2": 698110, - "bulb_abyss_r_3": 698111, - "bulb_abyss_r_4": 698112, -} - -locations_ice_cave = { - "bulb_ice_cave_1": 698083, - "bulb_ice_cave_2": 698084, - "bulb_ice_cave_3": 698085, - "bulb_ice_cave_4": 698086, - "bulb_ice_cave_5": 698087, -} - -locations_king_jellyfish_cave = { - "bulb_king_jellyfish_cave_1": 698088, - "collect_jelly_costume": 698188, -} - -locations_whale = { - "health_egg_3": 698159, -} - -locations_sunkencity_r = { - "crate_sunkencity_1_1": 698154, - "crate_sunkencity_1_2": 698155, -} - -locations_sunkencity_l = { - "crate_sunkencity_2_1": 698151, - "crate_sunkencity_2_2": 698152, - "crate_sunkencity_2_3": 698153, -} - -locations_sunkencity_l_bedroom = { - "collect_teen_costume": 698192, -} - -locations_sunkencity_boss = { - "bulb_boilerroom_1": 698043, -} - -locations_body_c = { - "bulb_final_c_1": 698097, -} - -locations_body_l = { - "bulb_final_l_1": 698066, - "bulb_final_l_2": 698067, - "bulb_final_l_3": 698068, - "bulb_final_l_4": 698069, - "bulb_final_l_5": 698070, -} - -locations_body_rt = { - "bulb_final_r_3": 698100, -} - -locations_body_rb = { - "bulb_final_r_1": 698098, - "bulb_final_r_2": 698099, -} - -locations_body_b = { - "bulb_final_b_1": 698101, - "bulb_final_b_2": 698102, - "collect_mutant_costume": 698190, -} - -locations_final_boss_tube = { - "bulb_final_boss_1": 698103, - "bulb_final_boss_2": 698104, - "bulb_final_boss_3": 698105, -} - -locations_final_boss_3_form = { - "bulb_final_boss_4": 698106, -} location_table = { - **locations_openwater_tl, - **locations_openwater_tr, - **locations_openwater_tr_turtle, - **locations_openwater_bl, - **locations_openwater_bl_fp, - **locations_skeleton_path, - **locations_skeleton_path_sc, - **locations_arnassi, - **locations_arnassi_path, - **locations_arnassi_crab_boss, - **locations_sun_temple_l, - **locations_sun_temple_r, - **locations_sun_temple_boss_lt, - **locations_sun_temple_boss_lb, - **locations_sun_temple_boss_r, - **locations_verse_cave_r, - **locations_verse_cave_l, - **locations_abyss_l, - **locations_abyss_l_fp, - **locations_abyss_r, - **locations_energy_temple_1, - **locations_energy_temple_2, - **locations_energy_temple_3, - **locations_energy_temple_boss, - **locations_energy_temple_blaster_room, - **locations_mithalas_city, - **locations_mithalas_city_urns, - **locations_mithalas_city_top_path, - **locations_mithalas_city_top_path_urn, - **locations_mithalas_city_fishpass, - **locations_cathedral_l, - **locations_cathedral_l_urns, - **locations_cathedral_l_tube, - **locations_cathedral_l_sc, - **locations_cathedral_r, - **locations_cathedral_underground, - **locations_cathedral_boss, - **locations_forest_tl, - **locations_forest_tl_fp, - **locations_forest_tr, - **locations_forest_tr_dark, - **locations_forest_tr_fp, - **locations_forest_bl_sc, - **locations_forest_br_ship, - **locations_forest_boss, - **locations_forest_boss_entrance, - **locations_forest_sprite_cave, - **locations_forest_sprite_cave_tube, - **locations_forest_fish_cave, - **locations_home_water, - **locations_body_l, - **locations_body_rt, - **locations_body_rb, - **locations_body_c, - **locations_body_b, - **locations_final_boss_tube, - **locations_final_boss_3_form, - **locations_song_cave, - **locations_veil_tl, - **locations_veil_tl_fp, - **locations_veil_tl_rock, - **locations_turtle_cave_rocks, - **locations_turtle_cave_bubble, - **locations_turtle_cave_top_bubble, - **locations_veil_tr_l, - **locations_veil_tr_r, - **locations_veil_tr_water_fall, - **locations_veil_bl, - **locations_veil_b_sc, - **locations_veil_bl_fp, - **locations_veil_br, - **locations_ice_cave, - **locations_king_jellyfish_cave, - **locations_bubble_cave, - **locations_naija_home, - **locations_mermog_cave, - **locations_mermog_boss, - **locations_octo_cave_t, - **locations_octo_cave_b, - **locations_sunkencity_l, - **locations_sunkencity_r, - **locations_sunkencity_boss, - **locations_simon, - **locations_whale, + **AquariaLocations.locations_openwater_tl, + **AquariaLocations.locations_openwater_tr, + **AquariaLocations.locations_openwater_tr_turtle, + **AquariaLocations.locations_openwater_bl, + **AquariaLocations.locations_openwater_bl_fp, + **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_lt, + **AquariaLocations.locations_sun_temple_boss_lb, + **AquariaLocations.locations_sun_temple_boss_r, + **AquariaLocations.locations_verse_cave_r, + **AquariaLocations.locations_verse_cave_l, + **AquariaLocations.locations_abyss_l, + **AquariaLocations.locations_abyss_l_fp, + **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_mithalas_city, + **AquariaLocations.locations_mithalas_city_urns, + **AquariaLocations.locations_mithalas_city_top_path, + **AquariaLocations.locations_mithalas_city_top_path_urn, + **AquariaLocations.locations_mithalas_city_fishpass, + **AquariaLocations.locations_cathedral_l, + **AquariaLocations.locations_cathedral_l_urns, + **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_dark, + **AquariaLocations.locations_forest_tr_fp, + **AquariaLocations.locations_forest_bl_sc, + **AquariaLocations.locations_forest_br_ship, + **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_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_3_form, + **AquariaLocations.locations_song_cave, + **AquariaLocations.locations_song_cave_anemone, + **AquariaLocations.locations_veil_tl, + **AquariaLocations.locations_veil_tl_fp, + **AquariaLocations.locations_veil_tl_rock, + **AquariaLocations.locations_turtle_cave_rocks, + **AquariaLocations.locations_turtle_cave_bubble, + **AquariaLocations.locations_turtle_cave_top_bubble, + **AquariaLocations.locations_veil_tr_l, + **AquariaLocations.locations_veil_tr_r, + **AquariaLocations.locations_veil_tr_water_fall, + **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_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_simon, + **AquariaLocations.locations_whale, } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index e3282c66724..8e5de7b6a4c 100644 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -4,15 +4,15 @@ Description: Used to manage Regions in the Aquaria game multiworld randomizer """ -import Locations from typing import Dict, Optional -from BaseClasses import MultiWorld, Region, Entrance +from BaseClasses import MultiWorld, Region, Entrance, ItemClassification from worlds.generic.Rules import set_rule from .Items import AquariaItem +from .Locations import AquariaLocations, AquariaLocation -class AquariaRegion: +class AquariaRegions: """ Class used to create regions of the Aquaria game """ @@ -20,6 +20,7 @@ class AquariaRegion: verse_cave_r: Region verse_cave_l: Region home_water: Region + home_water_nautilus: Region naija_home: Region song_cave: Region song_cave_anemone: Region @@ -102,7 +103,7 @@ class AquariaRegion: sunken_city_l: Region sunken_city_r: Region sunken_city_boss: Region - sunkencity_l_bedroom: Region + sunken_city_l_bedroom: Region body_c: Region body_l: Region body_rt: Region @@ -135,28 +136,36 @@ def __add_region(self, name: str, hint: str, """ region: Region = Region(name, self.player, self.world, hint) if locations is not None: - self.verse_cave_r.add_locations(locations, - Locations.AquariaLocation) + region.add_locations(locations, + AquariaLocation) return region def __create_home_water_area(self): """ Create the `verse_cave`, `home_water` and `song_cave*` regions """ - self.verse_cave_r = self.__add_region("Menu", "Verse Cave right area", - Locations.locations_verse_cave_r) - self.verse_cave_l = self.__add_region("verse_cave_left_area", - "Verse Cave left area", - Locations.locations_verse_cave_l) - self.home_water = self.__add_region("home_water", "Home Water", - Locations.locations_home_water) - self.naija_home = self.__add_region("naija_home", "Naija's home", - Locations.locations_naija_home) + self.verse_cave_r = ( + self.__add_region("Menu", "Verse Cave right area", + AquariaLocations.locations_verse_cave_r)) + self.verse_cave_l = ( + self.__add_region("verse_cave_left_area", + "Verse Cave left area", + AquariaLocations.locations_verse_cave_l)) + self.home_water = ( + self.__add_region("home_water", "Home Water", + AquariaLocations.locations_home_water)) + self.home_water_nautilus = ( + self.__add_region("home_water_nautilus", "Home Water", + AquariaLocations.locations_home_water_nautilus)) + self.naija_home = ( + self.__add_region("naija_home", "Naija's home", + AquariaLocations.locations_naija_home)) self.song_cave = self.__add_region("song_cave", "Song cave", - Locations.locations_song_cave) - self.song_cave_anemone = self.__add_region("song_cave_anemone", - "Song cave", - Locations.locations_song_cave) + AquariaLocations.locations_song_cave) + self.song_cave_anemone = ( + self.__add_region("song_cave_anemone", + "Song cave", + AquariaLocations.locations_song_cave_anemone)) def __create_energy_temple(self): """ @@ -165,27 +174,27 @@ def __create_energy_temple(self): self.energy_temple_1 = ( self.__add_region("energy_temple_1", "Energy temple first area", - Locations.locations_energy_temple_1)) + AquariaLocations.locations_energy_temple_1)) self.energy_temple_2 = ( self.__add_region("energy_temple_2", "Energy temple second area", - Locations.locations_energy_temple_2)) + AquariaLocations.locations_energy_temple_2)) self.energy_temple_3 = ( self.__add_region("energy_temple_3", "Energy temple third area", - Locations.locations_energy_temple_3)) + AquariaLocations.locations_energy_temple_3)) self.energy_temple_altar = ( self.__add_region("energy_temple_altar", "Energy temple bottom entrance", - Locations.locations_energy_temple_altar)) + AquariaLocations.locations_energy_temple_altar)) self.energy_temple_boss = ( self.__add_region("energy_temple_boss", "Energy temple fallen God room", - Locations.locations_energy_temple_boss)) + AquariaLocations.locations_energy_temple_boss)) self.energy_temple_blaster_room = ( self.__add_region("energy_temple_blaster_room", "Energy temple blaster room", - Locations.locations_energy_temple_blaster_room)) + AquariaLocations.locations_energy_temple_blaster_room)) def __create_openwater(self): """ @@ -194,46 +203,46 @@ def __create_openwater(self): """ self.openwater_tl = self.__add_region("openwater_tl", "Open water top left area", - Locations.locations_openwater_tl) + AquariaLocations.locations_openwater_tl) self.openwater_tr = self.__add_region("openwater_tr", "Open water top right area", - Locations.locations_openwater_tr) + AquariaLocations.locations_openwater_tr) self.openwater_tr_turtle = ( self.__add_region("openwater_tr_turtle", "Open water top right area, turtle room", - Locations.locations_openwater_tr_turtle)) + AquariaLocations.locations_openwater_tr_turtle)) self.openwater_bl = self.__add_region("openwater_bl", "Open water bottom left area", - Locations.locations_openwater_bl) + AquariaLocations.locations_openwater_bl) self.openwater_bl_fp = ( self.__add_region("openwater_bl_fp", "Open water bottom left area", - Locations.locations_openwater_bl_fp)) + AquariaLocations.locations_openwater_bl_fp)) self.openwater_br = self.__add_region("openwater_br", "Open water bottom right area", None) self.skeleton_path = ( self.__add_region("skeleton_path", "Open water skeleton path", - Locations.locations_skeleton_path)) + AquariaLocations.locations_skeleton_path)) self.skeleton_path_sc = ( self.__add_region("skeleton_path_sc", "Open water skeleton path", - Locations.locations_skeleton_path_sc)) + AquariaLocations.locations_skeleton_path_sc)) self.arnassi = self.__add_region("arnassi", "Arnassi Ruins", - Locations.locations_arnassi) + AquariaLocations.locations_arnassi) self.simon = self.__add_region("simon", "Arnassi Ruins, Simon's room", - Locations.locations_simon) + AquariaLocations.locations_simon) self.arnassi_path = ( self.__add_region("arnassi_path", "Arnassi Ruins, back entrance path", - Locations.locations_arnassi_path)) + AquariaLocations.locations_arnassi_path)) self.arnassi_crab_boss = ( self.__add_region("arnassi_crab_boss", "Arnassi Ruins, Crabbius Maximus lair", - Locations.locations_arnassi_crab_boss)) + AquariaLocations.locations_arnassi_crab_boss)) def __create_mithalas(self): """ @@ -242,48 +251,48 @@ def __create_mithalas(self): self.mithalas_city = ( self.__add_region("mithalas_city", "Mithalas city", - Locations.locations_mithalas_city)) + AquariaLocations.locations_mithalas_city)) self.mithalas_city_urns = ( self.__add_region("mithalas_city_urns", "Mithalas city", - Locations.locations_mithalas_city_urns)) + AquariaLocations.locations_mithalas_city_urns)) self.mithalas_city_fishpass = ( self.__add_region("mithalas_city_fishpass", "Mithalas city", - Locations.locations_mithalas_city_fishpass)) + AquariaLocations.locations_mithalas_city_fishpass)) self.mithalas_city_top_path = ( self.__add_region("mithalas_city_top_path", "Mithalas city", - Locations.locations_mithalas_city_top_path)) + AquariaLocations.locations_mithalas_city_top_path)) self.mithalas_city_top_path_urn = self.__add_region( "mithalas_city_top_path_urn", - "Mithalas city", Locations.locations_mithalas_city_top_path_urn) + "Mithalas city", AquariaLocations.locations_mithalas_city_top_path_urn) self.cathedral_l = self.__add_region("cathedral_l", "Mithalas castle", - Locations.locations_cathedral_l) + AquariaLocations.locations_cathedral_l) self.cathedral_l_urns = ( self.__add_region("cathedral_l_urns", "Mithalas castle", - Locations.locations_cathedral_l_urns)) + AquariaLocations.locations_cathedral_l_urns)) self.cathedral_l_tube = ( self.__add_region("cathedral_l_tube", "Mithalas castle, plant tube entrance", - Locations.locations_cathedral_l_tube)) + AquariaLocations.locations_cathedral_l_tube)) self.cathedral_l_sc = ( self.__add_region("cathedral_l_sc", "Mithalas castle", - Locations.locations_cathedral_l_sc)) + AquariaLocations.locations_cathedral_l_sc)) self.cathedral_r = self.__add_region("cathedral_r", "Mithalas Cathedral", - Locations.locations_cathedral_r) + AquariaLocations.locations_cathedral_r) self.cathedral_underground = ( self.__add_region("cathedral_underground", "Mithalas Cathedral underground area", - Locations.locations_cathedral_underground)) + AquariaLocations.locations_cathedral_underground)) self.cathedral_boss_r = ( self.__add_region("cathedral_boss_r", "Mithalas Cathedral, Mithalan God room", - Locations.locations_cathedral_boss)) + AquariaLocations.locations_cathedral_boss)) self.cathedral_boss_l = ( self.__add_region("cathedral_boss_l", "Mithalas Cathedral, Mithalan God room", @@ -295,60 +304,60 @@ def __create_forest(self): """ self.forest_tl = self.__add_region("forest_tl", "Kelp forest top left area", - Locations.locations_forest_tl) + AquariaLocations.locations_forest_tl) self.forest_tl_fp = self.__add_region("forest_tl_fp", "Kelp forest top left area", - Locations.locations_forest_tl_fp) + AquariaLocations.locations_forest_tl_fp) self.forest_tr = self.__add_region("forest_tr", "Kelp forest top right area", - Locations.locations_forest_tr) + AquariaLocations.locations_forest_tr) self.forest_tr_fp = self.__add_region("forest_tr_fp", "Kelp forest top right area", - Locations.locations_forest_tr_fp) + AquariaLocations.locations_forest_tr_fp) self.forest_tr_dark = ( self.__add_region("forest_tr_dark", "Kelp forest top right area, " + "the dark behind the seawolf", - Locations.locations_forest_tr_dark)) + AquariaLocations.locations_forest_tr_dark)) self.forest_bl = self.__add_region("forest_bl", "Kelp forest bottom left area", None) self.forest_bl_sc = ( self.__add_region("forest_bl_sc", "Kelp forest bottom left area, spirit cristal", - Locations.locations_forest_bl_sc)) + AquariaLocations.locations_forest_bl_sc)) self.forest_br = self.__add_region("forest_br", "Kelp forest bottom right area", None) self.forest_br_ship = ( self.__add_region("forest_br_ship", "Kelp forest bottom right area, sunken ship", - Locations.locations_forest_br_ship)) + AquariaLocations.locations_forest_br_ship)) self.forest_sprite_cave = ( self.__add_region("forest_sprite_cave", "Kelp forest spirit cave", - Locations.locations_forest_sprite_cave)) + AquariaLocations.locations_forest_sprite_cave)) self.forest_sprite_cave_tube = ( self.__add_region("forest_sprite_cave_tube", "Kelp forest spirit cave after the plant tube", - Locations.locations_forest_sprite_cave_tube)) + AquariaLocations.locations_forest_sprite_cave_tube)) self.forest_boss = self.__add_region("forest_boss", "Kelp forest Drunian God room", - Locations.locations_forest_boss) + AquariaLocations.locations_forest_boss) self.forest_boss_entrance = ( self.__add_region("forest_boss_entrance", "Kelp forest Drunian God room", - Locations.locations_forest_boss_entrance)) + AquariaLocations.locations_forest_boss_entrance)) self.mermog_cave = self.__add_region("mermog_cave", "Kelp forest Mermog cave", - Locations.locations_mermog_cave) + AquariaLocations.locations_mermog_cave) self.mermog_boss = self.__add_region("mermog_boss", "Kelp forest Mermog cave", - Locations.locations_mermog_boss) + AquariaLocations.locations_mermog_boss) self.forest_fish_cave = ( self.__add_region("forest_fish_cave", "Kelp forest fish cave", - Locations.locations_forest_fish_cave)) + AquariaLocations.locations_forest_fish_cave)) def __create_veil(self): """ @@ -356,14 +365,14 @@ def __create_veil(self): """ self.veil_tl = self.__add_region("veil_tl", "The veil top left area", - Locations.locations_veil_tl) + AquariaLocations.locations_veil_tl) self.veil_tl_fp = self.__add_region("veil_tl_fp", "The veil top left area", - Locations.locations_veil_tl_fp) + AquariaLocations.locations_veil_tl_fp) self.veil_tl_rock = ( self.__add_region("veil_tl_rock", "The veil top left area, after blocking rock", - Locations.locations_veil_tl_rock)) + AquariaLocations.locations_veil_tl_rock)) self.turtle_cave = ( self.__add_region("turtle_cave", "The veil top left area, turtle cave", @@ -371,46 +380,46 @@ def __create_veil(self): self.turtle_cave_rocks = ( self.__add_region("turtle_cave_rocks", "The veil top left area, turtle cave", - Locations.locations_turtle_cave_rocks)) + AquariaLocations.locations_turtle_cave_rocks)) self.turtle_cave_bubble = ( self.__add_region("turtle_cave_bubble", "The veil top left area, turtle cave bubble cliff", - Locations.locations_turtle_cave_bubble)) + AquariaLocations.locations_turtle_cave_bubble)) self.turtle_cave_top_bubble = ( self.__add_region("turtle_cave_top_bubble", "The veil top left area, turtle cave bubble cliff", - Locations.locations_turtle_cave_top_bubble)) + AquariaLocations.locations_turtle_cave_top_bubble)) self.veil_tr_l = ( self.__add_region("veil_tr_l", "The veil top right area, left of temple", - Locations.locations_veil_tr_l)) + AquariaLocations.locations_veil_tr_l)) self.veil_tr_r = ( self.__add_region("veil_tr_r", "The veil top right area, right of temple", - Locations.locations_veil_tr_r)) + AquariaLocations.locations_veil_tr_r)) self.veil_tr_water_fall = ( self.__add_region("veil_tr_water_fall", "The veil top right area, top of the water fall", - Locations.locations_veil_tr_water_fall)) + AquariaLocations.locations_veil_tr_water_fall)) self.octo_cave_t = self.__add_region("octo_cave_t", "Octopus cave top entrance", - Locations.locations_octo_cave_t) + AquariaLocations.locations_octo_cave_t) self.octo_cave_b = self.__add_region("octo_cave_b", "Octopus cave bottom entrance", - Locations.locations_octo_cave_b) + AquariaLocations.locations_octo_cave_b) self.veil_bl = self.__add_region("veil_bl", "The veil bottom left area", - Locations.locations_veil_bl) + AquariaLocations.locations_veil_bl) self.veil_b_sc = ( self.__add_region("veil_b_sc", "The veil bottom spirit cristal area", - Locations.locations_veil_b_sc)) + AquariaLocations.locations_veil_b_sc)) self.veil_bl_fp = self.__add_region("veil_bl_fp", "The veil bottom left area", - Locations.locations_veil_bl_fp) + AquariaLocations.locations_veil_bl_fp) self.veil_br = self.__add_region("veil_br", "The veil bottom right area", - Locations.locations_veil_br) + AquariaLocations.locations_veil_br) def __create_sun_temple(self): """ @@ -418,23 +427,23 @@ def __create_sun_temple(self): """ self.sun_temple_l = self.__add_region("sun_temple_l", "Sun temple left area", - Locations.locations_sun_temple_l) + AquariaLocations.locations_sun_temple_l) self.sun_temple_r = self.__add_region("sun_temple_r", "Sun temple right area", - Locations.locations_sun_temple_r) + AquariaLocations.locations_sun_temple_r) self.sun_temple_boss_lt = ( self.__add_region("sun_temple_boss_lt", "Sun temple before boss area, " + "top of the cliffs", - Locations.locations_sun_temple_boss_lt)) + AquariaLocations.locations_sun_temple_boss_lt)) self.sun_temple_boss_lb = ( self.__add_region("sun_temple_boss_lb", "Sun temple before boss area", - Locations.locations_sun_temple_boss_lb)) + AquariaLocations.locations_sun_temple_boss_lb)) self.sun_temple_boss_r = ( self.__add_region("sun_temple_boss_r", "Sun temple boss area", - Locations.locations_sun_temple_boss_r)) + AquariaLocations.locations_sun_temple_boss_r)) def __create_abyss(self): """ @@ -443,48 +452,48 @@ def __create_abyss(self): """ self.abyss_l = self.__add_region("abyss_l", "Abyss left area", - Locations.locations_abyss_l) + AquariaLocations.locations_abyss_l) self.abyss_lb = self.__add_region("abyss_lb", "Abyss left bottom area", None) self.abyss_l_fp = self.__add_region("abyss_l_fp", "Abyss left buttom area", - Locations.locations_abyss_l_fp) + AquariaLocations.locations_abyss_l_fp) self.abyss_r = self.__add_region("abyss_r", "Abyss right area", - Locations.locations_abyss_r) + AquariaLocations.locations_abyss_r) self.ice_cave = self.__add_region("ice_cave", "Ice cave", - Locations.locations_ice_cave) + AquariaLocations.locations_ice_cave) self.bubble_cave = self.__add_region("bubble_cave", "Bubble cave", - Locations.locations_bubble_cave) + AquariaLocations.locations_bubble_cave) self.king_jellyfish_cave = ( self.__add_region("king_jellyfish_cave", "Abyss left area, King jellyfish cave", - Locations.locations_king_jellyfish_cave)) + AquariaLocations.locations_king_jellyfish_cave)) self.whale = self.__add_region("whale", "Inside the whale", - Locations.locations_whale) + AquariaLocations.locations_whale) def __create_sunken_city(self): """ Create the `sunken_city_*` regions """ - self.sunkencity_l = self.__add_region("sunkencity_l", + self.sunken_city_l = self.__add_region("sunken_city_l", "Sunken city left area", - Locations.locations_sunkencity_l) - self.sunkencity_l_bedroom = ( - self.__add_region("sunkencity_l_bedroom", + AquariaLocations.locations_sunken_city_l) + self.sunken_city_l_bedroom = ( + self.__add_region("sunken_city_l_bedroom", "Sunken city left area, bedroom", - Locations.locations_sunkencity_l_bedroom)) - self.sunkencity_r = self.__add_region("sunkencity_r", + AquariaLocations.locations_sunken_city_l_bedroom)) + self.sunken_city_r = self.__add_region("sunken_city_r", "Sunken city right area", - Locations.locations_sunkencity_r) - self.sunkencity_boss = ( - self.__add_region("sunkencity_boss", + AquariaLocations.locations_sunken_city_r) + self.sunken_city_boss = ( + self.__add_region("sunken_city_boss", "Sunken city boss area", - Locations.locations_sunkencity_boss)) + AquariaLocations.locations_sunken_city_boss)) def __create_body(self): """ @@ -492,92 +501,97 @@ def __create_body(self): """ self.body_c = self.__add_region("body_c", "The body center area", - Locations.locations_body_c) + AquariaLocations.locations_body_c) self.body_l = self.__add_region("body_l", "The body left area", - Locations.locations_body_l) + AquariaLocations.locations_body_l) self.body_rt = self.__add_region("body_rt", "The body right area, top path", - Locations.locations_body_rt) + AquariaLocations.locations_body_rt) self.body_rb = self.__add_region("body_rb", "The body right area, bottom path", - Locations.locations_body_rb) + AquariaLocations.locations_body_rb) self.body_b = self.__add_region("body_b", "The body bottom area", - Locations.locations_body_b) + AquariaLocations.locations_body_b) self.final_boss = self.__add_region("final_boss", "The body, final boss area", None) self.final_boss_tube = ( self.__add_region("final_boss_tube", "The body, final boss area turtle room", - Locations.locations_final_boss_tube)) + AquariaLocations.locations_final_boss_tube)) self.final_boss_3_form = ( self.__add_region("final_boss_3_form", "The body final boss third form area", - Locations.locations_final_boss_3_form)) + AquariaLocations.locations_final_boss_3_form)) self.final_boss_end = ( self.__add_region("final_boss_end", "The body, final boss area", None)) - def __connect_one_way_regions(self, name: str, source_region: Region, + def __connect_one_way_regions(self, source_name: str, destination_name: str, + source_region: Region, destination_region: Region, rule=None): """ Connect from the `source_region` to the `destination_region` """ - entrance = Entrance(source_region.player, name, source_region) + entrance = Entrance(source_region.player, source_name + "_" + + destination_name, source_region) source_region.exits.append(entrance) entrance.connect(destination_region) if rule is not None: set_rule(entrance, rule) - def __connect_regions(self, name: str, source_region: Region, + def __connect_regions(self, source_name: str, destination_name: str, + source_region: Region, destination_region: Region, rule=None): """ Connect the `source_region` and the `destination_region` (two-way) """ - self.__connect_one_way_regions(name, source_region, - destination_region, rule) - self.__connect_one_way_regions(name, destination_region, - source_region, rule) + self.__connect_one_way_regions(source_name, destination_name, + source_region, destination_region, rule) + self.__connect_one_way_regions(destination_name, source_name, + destination_region, source_region, rule) def __connect_home_water_regions(self): """ Connect entrances of the different regions around `home_water` """ - self.__connect_regions("verse_cave_l_verse_cave_r", + self.__connect_regions("verse_cave_l","verse_cave_r", self.verse_cave_l, self.verse_cave_r) - self.__connect_regions("verse_cave_l_home_water", + self.__connect_regions("verse_cave","l_home_water", self.verse_cave_l, self.home_water) - self.__connect_regions("home_water_naija_home", + self.__connect_regions("home_water", "naija_home", self.home_water, self.naija_home) - self.__connect_regions("home_water_song_cave", + self.__connect_regions("home_water","song_cave", self.home_water, self.song_cave) - self.__connect_regions("song_cave_song_cave_anemone", + self.__connect_regions("home_water","home_water_nautilus", + self.home_water, self.home_water_nautilus) # Need energy form + self.__connect_regions("song_cave","song_cave_anemone", self.song_cave, self.song_cave_anemone) # Need Nature Form - self.__connect_regions("home_water_energy_temple_1", + self.__connect_regions("home_water","energy_temple_1", self.home_water, self.energy_temple_1) # Need bind song - self.__connect_regions("home_water_energy_temple_altar", + self.__connect_regions("home_water","energy_temple_altar", self.home_water, self.energy_temple_altar) # Need energy form - self.__connect_regions("energy_temple_1_energy_temple_2", + self.__connect_regions("energy_temple_1","energy_temple_2", self.energy_temple_1, self.energy_temple_2) # Need energy form - self.__connect_regions("energy_temple_1_energy_temple_boss", + self.__connect_regions("energy_temple_1","energy_temple_boss", self.energy_temple_1, self.energy_temple_boss) # Need Fish form or Energy form - self.__connect_regions("energy_temple_2_energy_temple_3", + self.__connect_regions("energy_temple_2", "energy_temple_3", self.energy_temple_2, self.energy_temple_3) # Need Bind form and Energy form - self.__connect_regions("energy_temple_boss_energy_temple_blaster_room", + self.__connect_regions("energy_temple_boss", "energy_temple_blaster_room", self.energy_temple_boss, self.energy_temple_blaster_room) # Need Nature form, Bind form and energy form - self.__connect_regions("energy_temple_1_energy_temple_blaster_room", + self.__connect_regions("energy_temple_1_", "energy_temple_blaster_room", self.energy_temple_1, self.energy_temple_blaster_room) # Need Nature form, Bind form, energy form and Beast form - self.__connect_regions("home_water_openwater_tl", + self.__connect_regions("home_water", "openwater_tl", self.home_water, self.openwater_tl) # Need Bind song and energy form one-way @@ -585,47 +599,47 @@ def __connect_open_water_regions(self): """ Connect entrances of the different regions around open water """ - self.__connect_regions("openwater_tl_openwater_tr", + self.__connect_regions("openwater_tl", "openwater_tr", self.openwater_tl, self.openwater_tr) - self.__connect_regions("openwater_tl_openwater_bl", + self.__connect_regions("openwater_tl", "openwater_bl", self.openwater_tl, self.openwater_bl) - self.__connect_regions("openwater_tl_forest_br", + self.__connect_regions("openwater_tl", "forest_br", self.openwater_tl, self.forest_br) - self.__connect_regions("openwater_tr_openwater_tr_turtle", + self.__connect_regions("openwater_tr", "openwater_tr_turtle", self.openwater_tr, self.openwater_tr_turtle) # Beast form needed - self.__connect_regions("openwater_tr_openwater_br", + self.__connect_regions("openwater_tr", "openwater_br", self.openwater_tr, self.openwater_br) - self.__connect_regions("openwater_tr_mithalas_city", + self.__connect_regions("openwater_tr", "mithalas_city", self.openwater_tr, self.mithalas_city) - self.__connect_regions("openwater_tr_veil_bl", + self.__connect_regions("openwater_tr", "veil_bl", self.openwater_tr, self.veil_bl) - self.__connect_regions("openwater_tr_veil_br", + self.__connect_regions("openwater_tr", "veil_br", self.openwater_tr, self.veil_br) # Beast form needed for one way - self.__connect_regions("openwater_bl_openwater_br", + self.__connect_regions("openwater_bl", "openwater_br", self.openwater_bl, self.openwater_br) - self.__connect_regions("openwater_bl_skeleton_path", + self.__connect_regions("openwater_bl", "skeleton_path", self.openwater_bl, self.skeleton_path) - self.__connect_regions("openwater_bl_abyss_l", + self.__connect_regions("openwater_bl", "abyss_l", self.openwater_bl, self.abyss_l) - self.__connect_regions("openwater_bl_openwater_bl_fp", + self.__connect_regions("openwater_bl", "openwater_bl_fp", self.openwater_bl, self.openwater_bl_fp) # Fish form - self.__connect_regions("skeleton_path_skeleton_path_sc", + self.__connect_regions("skeleton_path", "skeleton_path_sc", self.skeleton_path, self.skeleton_path_sc) # Spirit form needed - self.__connect_regions("openwater_br_abyss_r", + self.__connect_regions("openwater_br", "abyss_r", self.openwater_br, self.abyss_r) - self.__connect_regions("openwater_br_arnassi", + self.__connect_regions("openwater_br", "arnassi", self.openwater_br, self.arnassi) # Beast form needed for one-way - self.__connect_regions("arnassi_arnassi_path", + self.__connect_regions("arnassi", "arnassi_path", self.arnassi, self.arnassi_path) - self.__connect_regions("arnassi_path_arnassi_crab_boss", + self.__connect_regions("arnassi_path", "arnassi_crab_boss", self.arnassi_path, self.arnassi_crab_boss) # Beast form needed for one-way - self.__connect_regions("arnassi_path_simon", + self.__connect_regions("arnassi_path", "simon", self.arnassi_path, self.simon) # Fish form needed @@ -633,53 +647,53 @@ def __connect_mithalas_regions(self): """ Connect entrances of the different regions around Mithalas """ - self.__connect_regions("mithalas_city_mithalas_city_urns", + self.__connect_regions("mithalas_city", "mithalas_city_urns", self.mithalas_city, self.mithalas_city_urns) # Energy form needed one-way - self.__connect_regions("mithalas_city_mithalas_city_top_path", + self.__connect_regions("mithalas_city", "mithalas_city_top_path", self.mithalas_city, self.mithalas_city_top_path) # Beast form needed one-way self.__connect_regions( - "mithalas_city_top_path_mithalas_city_top_path_urn", + "mithalas_city_top_path", "mithalas_city_top_path_urn", self.mithalas_city_top_path, self.mithalas_city_top_path_urn) # Energy form needed - self.__connect_regions("mithalas_city_mithalas_city_fishpass", + self.__connect_regions("mithalas_city", "mithalas_city_fishpass", self.mithalas_city, self.mithalas_city_fishpass) # Fish form needed - self.__connect_regions("mithalas_city_cathedral_l", + self.__connect_regions("mithalas_city", "cathedral_l", self.mithalas_city, self.cathedral_l) # Fish form needed - self.__connect_regions("mithalas_city_top_path_cathedral_l_tube", + self.__connect_regions("mithalas_city_top_path", "cathedral_l_tube", self.mithalas_city_top_path, self.cathedral_l_tube) # Nature form needed Enlever le courrant - self.__connect_regions("cathedral_l_tube_cathedral_l_sc", + self.__connect_regions("cathedral_l_tube", "cathedral_l_sc", self.cathedral_l_tube, self.cathedral_l_sc) # spirit form needed - self.__connect_regions("cathedral_l_tube_cathedral_l", + self.__connect_regions("cathedral_l_tube", "cathedral_l", self.cathedral_l_tube, self.cathedral_l) # spirit form needed - self.__connect_regions("cathedral_l_cathedral_l_sc", + self.__connect_regions("cathedral_l", "cathedral_l_sc", self.cathedral_l, self.cathedral_l_sc) # spirit form needed - self.__connect_regions("cathedral_l_cathedral_l_urns", + self.__connect_regions("cathedral_l", "cathedral_l_urns", self.cathedral_l, self.cathedral_l_urns) # energy form needed - self.__connect_regions("cathedral_l_cathedral_boss_l", + self.__connect_regions("cathedral_l", "cathedral_boss_l", self.cathedral_l, self.cathedral_boss_l) # beast form needed and Location mithalas boss needed - self.__connect_regions("cathedral_l_cathedral_underground", + self.__connect_regions("cathedral_l", "cathedral_underground", self.cathedral_l, self.cathedral_underground) # beast form and bind song needed - self.__connect_regions("cathedral_l_cathedral_r", + self.__connect_regions("cathedral_l", "cathedral_r", self.cathedral_l, self.cathedral_r) # bind song and energy form needed - self.__connect_regions("cathedral_r_cathedral_underground", + self.__connect_regions("cathedral_r", "cathedral_underground", self.cathedral_r, self.cathedral_underground) # energy form needed - self.__connect_regions("cathedral_underground_cathedral_boss_l", + self.__connect_regions("cathedral_underground", "cathedral_boss_l", self.cathedral_underground, self.cathedral_boss_l) # bind song and energy form needed one side - self.__connect_regions("cathedral_boss_r_cathedral_boss_l", + self.__connect_regions("cathedral_boss_r", "cathedral_boss_l", self.cathedral_boss_r, self.cathedral_boss_l) # bind song and energy form needed one-way @@ -687,49 +701,49 @@ def __connect_forest_regions(self): """ Connect entrances of the different regions around the Kelp Forest """ - self.__connect_regions("forest_br_forest_br_ship", + self.__connect_regions("forest_br", "forest_br_ship", self.forest_br, self.forest_br_ship) # Sun form needed - self.__connect_regions("forest_br_veil_bl", + self.__connect_regions("forest_br", "veil_bl", self.forest_br, self.veil_bl) - self.__connect_regions("forest_br_forest_bl", + self.__connect_regions("forest_br", "forest_bl", self.forest_br, self.forest_bl) - self.__connect_regions("forest_br_forest_tr", + self.__connect_regions("forest_br", "forest_tr", self.forest_br, self.forest_tr) - self.__connect_regions("forest_bl_forest_bl_sc", + self.__connect_regions("forest_bl", "forest_bl_sc", self.forest_bl, self.forest_bl_sc) # spirit form needed - self.__connect_regions("forest_bl_forest_fish_cave", + self.__connect_regions("forest_bl", "forest_fish_cave", self.forest_bl, self.forest_fish_cave) - self.__connect_regions("forest_bl_forest_tl", + self.__connect_regions("forest_bl", "forest_tl", self.forest_bl, self.forest_tl) - self.__connect_regions("forest_bl_forest_boss_entrance", + self.__connect_regions("forest_bl", "forest_boss_entrance", self.forest_bl, self.forest_boss_entrance) # Nature form needed - self.__connect_regions("forest_tl_forest_tl_fp", + self.__connect_regions("forest_tl", "forest_tl_fp", self.forest_tl, self.forest_tl_fp) # Nature form, Bind song, Energy form and Fish form needed - self.__connect_regions("forest_tl_forest_tr", + self.__connect_regions("forest_tl", "forest_tr", self.forest_tl, self.forest_tr) - self.__connect_regions("forest_tl_forest_boss_entrance", + self.__connect_regions("forest_tl", "forest_boss_entrance", self.forest_tl, self.forest_boss_entrance) - self.__connect_regions("forest_boss_forest_boss_entrance", + self.__connect_regions("forest_boss", "forest_boss_entrance", self.forest_boss, self.forest_boss_entrance) # Energy form needed - self.__connect_regions("forest_tr_forest_tr_dark", + self.__connect_regions("forest_tr", "forest_tr_dark", self.forest_tr, self.forest_tr_dark) # Sun form needed - self.__connect_regions("forest_tr_forest_tr_fp", + self.__connect_regions("forest_tr", "forest_tr_fp", self.forest_tr, self.forest_tr_fp) # Fish form needed - self.__connect_regions("forest_tr_forest_sprite_cave", + self.__connect_regions("forest_tr", "forest_sprite_cave", self.forest_tr, self.forest_sprite_cave) - self.__connect_regions("forest_sprite_cave_forest_sprite_cave_tube", + self.__connect_regions("forest_sprite_cave", "forest_sprite_cave_tube", self.forest_sprite_cave, self.forest_sprite_cave_tube) # Nature form needed - self.__connect_regions("forest_tr_mermog_cave", + self.__connect_regions("forest_tr", "mermog_cave", self.forest_tr_fp, self.mermog_cave) - self.__connect_regions("mermog_cave_mermog_boss", + self.__connect_regions("mermog_cave", "mermog_boss", self.mermog_cave, self.mermog_boss) # Beast form and energy form needed @@ -737,79 +751,79 @@ def __connect_veil_regions(self): """ Connect entrances of the different regions around The Veil """ - self.__connect_regions("veil_bl_veil_bl_fp", + self.__connect_regions("veil_bl", "veil_bl_fp", self.veil_bl, self.veil_bl_fp) # Fish form, bind song and Energy form needed - self.__connect_regions("veil_bl_veil_b_sc", + self.__connect_regions("veil_bl", "veil_b_sc", self.veil_bl, self.veil_b_sc) # Spirit form needed - self.__connect_regions("veil_b_sc_veil_br", + self.__connect_regions("veil_b_sc", "veil_br", self.veil_b_sc, self.veil_br) # Spirit form needed - self.__connect_regions("veil_br_veil_tl", + self.__connect_regions("veil_br", "veil_tl", self.veil_br, self.veil_tl) # Beast form needed - self.__connect_regions("veil_tl_veil_tl_fp", + self.__connect_regions("veil_tl", "veil_tl_fp", self.veil_tl, self.veil_tl_fp) # Fish form needed - self.__connect_regions("veil_tl_veil_tl_rock", + self.__connect_regions("veil_tl", "veil_tl_rock", self.veil_tl, self.veil_tl_rock) # Bind song needed - self.__connect_regions("veil_tl_veil_tr_r", + self.__connect_regions("veil_tl", "veil_tr_r", self.veil_tl, self.veil_tr_r) - self.__connect_regions("veil_tl_turtle_cave", + self.__connect_regions("veil_tl", "turtle_cave", self.veil_tl, self.turtle_cave) - self.__connect_regions("turtle_cave_turtle_cave_rocks", + self.__connect_regions("turtle_cave", "turtle_cave_rocks", self.turtle_cave, self.turtle_cave_rocks) # Bind song needed - self.__connect_regions("turtle_cave_turtle_cave_bubble", + self.__connect_regions("turtle_cave", "turtle_cave_bubble", self.turtle_cave, self.turtle_cave_bubble) # Beast form needed - self.__connect_regions("veil_tr_r_sun_temple_r", + self.__connect_regions("veil_tr_r", "sun_temple_r", self.veil_tr_r, self.sun_temple_r) - self.__connect_regions("sun_temple_r_sun_temple_l", + self.__connect_regions("sun_temple_r", "sun_temple_l", self.sun_temple_r, self.sun_temple_l) # bind song needed - self.__connect_regions("sun_temple_l_veil_tr_l", + self.__connect_regions("sun_temple_l", "veil_tr_l", self.sun_temple_l, self.veil_tr_l) - self.__connect_regions("sun_temple_l_sun_temple_boss_lb", + self.__connect_regions("sun_temple_l", "sun_temple_boss_lb", self.sun_temple_l, self.sun_temple_boss_lb) self.__connect_one_way_regions( - "sun_temple_boss_lb_sun_temple_boss_lt", + "sun_temple_boss_lb", "sun_temple_boss_lt", self.turtle_cave_bubble, self.turtle_cave_top_bubble, lambda state: state.has("ingredient_hotsoup", self.player) # Beast form needed ) - self.__connect_one_way_regions("sun_temple_boss_lt_sun_temple_boss_lb", + self.__connect_one_way_regions("sun_temple_boss_lt", "sun_temple_boss_lb", self.sun_temple_boss_lt, self.sun_temple_boss_lb) - self.__connect_regions("sun_temple_boss_lb_sun_temple_boss_r", + self.__connect_regions("sun_temple_boss_lb", "sun_temple_boss_r", self.sun_temple_boss_lb, self.sun_temple_boss_r) # Energy form needed - self.__connect_one_way_regions("sun_temple_boss_r_veil_tr_l", + self.__connect_one_way_regions("sun_temple_boss_r", "veil_tr_l", self.sun_temple_boss_r, self.veil_tr_l) self.__connect_one_way_regions( - "turtle_cave_bubble_turtle_cave_top_bubble", + "turtle_cave_bubble", "turtle_cave_top_bubble", self.turtle_cave_bubble, self.turtle_cave_top_bubble, lambda state: state.has("ingredient_hotsoup", self.player) # Beast form needed ) self.__connect_one_way_regions( - "turtle_cave_bubble_turtle_cave_top_bubble", + "turtle_cave_top_bubble", "turtle_cave_bubble", self.turtle_cave_top_bubble, self.turtle_cave_bubble) self.__connect_one_way_regions( - "veil_tr_l_veil_tr_water_fall", + "veil_tr_l", "veil_tr_water_fall", self.veil_tr_l, self.veil_tr_water_fall, lambda state: state.has("ingredient_hotsoup", self.player) # Beast form needed ) - self.__connect_one_way_regions("veil_tr_water_fall_veil_tr_l", + self.__connect_one_way_regions("veil_tr_water_fall", "veil_tr_l", self.veil_tr_water_fall, self.veil_tr_l) - self.__connect_regions("veil_tr_l_octo_cave", + self.__connect_regions("veil_tr_l", "octo_cave_t", self.veil_tr_l, self.octo_cave_t) # Fish, sun and beast form form needed - self.__connect_regions("veil_tr_l_octo_cave", + self.__connect_regions("veil_tr_l", "octo_cave_b", self.veil_tr_l, self.octo_cave_b) # Fish form needed @@ -817,30 +831,30 @@ def __connect_abyss_regions(self): """ Connect entrances of the different regions around The Abyss """ - self.__connect_regions("abyss_l_abyss_lb", + self.__connect_regions("abyss_l", "abyss_lb", self.abyss_l, self.abyss_lb) # Nature form needed - self.__connect_regions("abyss_lb_abyss_l_fp", + self.__connect_regions("abyss_lb", "abyss_l_fp", self.abyss_lb, self.abyss_l_fp) # Fish form needed - self.__connect_regions("abyss_lb_sunken_city_r", + self.__connect_regions("abyss_lb", "sunken_city_r", self.abyss_lb, self.sunken_city_r) # Li needed self.__connect_regions( - "abyss_lb_body_c", + "abyss_lb", "body_c", self.abyss_lb, self.body_c, lambda state: state.has("Body tongue cleared", self.player)) # Adding a check for opening - self.__connect_regions("abyss_l_king_jellyfish_cave", + self.__connect_regions("abyss_l", "king_jellyfish_cave", self.abyss_l, self.king_jellyfish_cave) # Energy form needed - self.__connect_regions("abyss_l_abyss_r", + self.__connect_regions("abyss_l", "abyss_r", self.abyss_l, self.abyss_r) - self.__connect_regions("abyss_r_whale", + self.__connect_regions("abyss_r", "whale", self.abyss_r, self.whale) # Spirit form and sun form needed - self.__connect_regions("abyss_r_ice_cave", + self.__connect_regions("abyss_r", "ice_cave", self.abyss_r, self.ice_cave) # Spirit form needed - self.__connect_regions("abyss_r_bubble_cave", + self.__connect_regions("abyss_r", "bubble_cave", self.abyss_r, self.bubble_cave) # Beast form needed @@ -848,41 +862,41 @@ def __connect_sunken_city_regions(self): """ Connect entrances of the different regions around The Sunken City """ - self.__connect_regions("sunken_city_r_sunken_city_l", + self.__connect_regions("sunken_city_r", "sunken_city_l", self.sunken_city_r, self.sunken_city_l) - self.__connect_regions("sunken_city_l_sunkencity_l_bedroom", + self.__connect_regions("sunken_city_l", "sunken_city_l_bedroom", self.sunken_city_l, - self.sunkencity_l_bedroom) # Spirit form needed - self.__connect_regions("sunken_city_l_sunkencity_l_bedroom", + self.sunken_city_l_bedroom) # Spirit form needed + self.__connect_regions("sunken_city_l", "sunken_city_boss", self.sunken_city_l, self.sunken_city_boss) def __connect_body_regions(self): """ Connect entrances of the different regions around The body """ - self.__connect_regions("body_c_body_l", + self.__connect_regions("body_c", "body_l", self.body_c, self.body_l) - self.__connect_regions("body_c_body_rt", + self.__connect_regions("body_c", "body_rt", self.body_c, self.body_rt) - self.__connect_regions("body_c_body_rb", + self.__connect_regions("body_c", "body_rb", self.body_c, self.body_rb) body_door_condition = \ lambda state: state.has("Body door 1 opened", self.player) and \ state.has("Body door 2 opened", self.player) and \ state.has("Body door 3 opened", self.player) and \ state.has("Body door 4 opened", self.player) - self.__connect_regions("body_c_body_b", + self.__connect_regions("body_c", "body_b", self.body_c, self.body_b, body_door_condition) - self.__connect_regions("body_b_final_boss", + self.__connect_regions("body_b", "final_boss", self.body_b, self.final_boss, body_door_condition) # Need 4 spirits - self.__connect_regions("final_boss_final_boss_tube", + self.__connect_regions("final_boss", "final_boss_tube", self.final_boss, self.final_boss_tube) # Nature form needed - self.__connect_one_way_regions("final_boss_final_boss_3_form", + self.__connect_one_way_regions("final_boss", "final_boss_3_form", self.final_boss, self.final_boss_3_form) # Need final boss conditions - self.__connect_one_way_regions("final_boss_3_form_final_boss_end", + self.__connect_one_way_regions("final_boss_3_form", "final_boss_end", self.final_boss_3_form, self.final_boss_end) @@ -904,11 +918,12 @@ def __add_event_location(self, region:Region, name: str, event_name: str): Add an event to the `region` with the name `name` and the item `event_name` """ - location: Locations.AquariaLocation = Locations.AquariaLocation( + location: AquariaLocation = AquariaLocation( self.player, name, None, region ) region.locations.append(location) - location.place_locked_item(AquariaItem(event_name, True, None, + location.place_locked_item(AquariaItem(event_name, + ItemClassification.progression, None, self.player)) @@ -938,6 +953,7 @@ def __add_home_water_regions_to_world(self): self.world.regions.append(self.verse_cave_r) self.world.regions.append(self.verse_cave_l) self.world.regions.append(self.home_water) + self.world.regions.append(self.home_water_nautilus) self.world.regions.append(self.naija_home) self.world.regions.append(self.song_cave) self.world.regions.append(self.song_cave_anemone) @@ -1045,7 +1061,7 @@ def __add_abyss_regions_to_world(self): self.world.regions.append(self.sunken_city_l) self.world.regions.append(self.sunken_city_r) self.world.regions.append(self.sunken_city_boss) - self.world.regions.append(self.sunkencity_l_bedroom) + self.world.regions.append(self.sunken_city_l_bedroom) def __add_body_regions_to_world(self): """ diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index f74c253c658..b2c7b871eb2 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -4,13 +4,13 @@ Description: Main module for Aquaria game multiworld randomizer """ -from typing import Dict, ClassVar +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 from .Locations import location_table from .Options import AquariaOptions -from .Regions import AquariaRegion +from .Regions import AquariaRegions class AquariaWeb(WebWorld): @@ -65,8 +65,8 @@ class AquariaWorld(World): web: WebWorld = AquariaWeb() "The web page generation informations" - item_name_to_id: ClassVar[Dict[str, int]] = {name: data[0] - for name, data in item_table} + item_name_to_id: ClassVar[Dict[str, int]] =\ + {name: data[0] for name, data in item_table.items()} "The name and associated ID of each item of the world" location_name_to_id = location_table @@ -75,7 +75,7 @@ class AquariaWorld(World): base_id = 698000 "The starting ID of the items and locations of the world" - ingredients_substitution: Dict[int, int] + ingredients_substitution: List[int] "Used to randomize ingredient drop" options_dataclass = AquariaOptions @@ -84,13 +84,14 @@ class AquariaWorld(World): options: AquariaOptions "Every options of the world" - regions: AquariaRegion + regions: AquariaRegions "Used to manage Regions" def __init__(self, world: MultiWorld, player: int): """Initialisation of the Aquaria World""" super(AquariaWorld, self).__init__(world, player) - self.regions = AquariaRegion(world, player) + self.regions = AquariaRegions(world, player) + self.ingredients_substitution = [] def create_regions(self) -> None: """ @@ -101,14 +102,14 @@ def create_regions(self) -> None: def create_items(self) -> None: """Create every items in the world""" - for name, data in item_table: + for name, data in item_table.items(): classification: ItemClassification = ItemClassification.useful if data[2] == ItemType.JUNK: classification = ItemClassification.filler elif data[2] == ItemType.PROGRESSION: classification = ItemClassification.progression for i in range(data[1]): - item = AquariaItem(name, classification, data[0] + self.base_id, + item = AquariaItem(name, classification, data[0], self.player) self.multiworld.itempool.append(item) @@ -120,9 +121,39 @@ def set_rules(self) -> None: self.multiworld.completion_condition[self.player] = lambda \ state: state.has("Victory", self.player) - # for debugging purposes, you may want to visualize the layout of your world. + # for debugging purposes, you may want to visualize the layout of your world. # Uncomment the following code to write a PlantUML diagram to the file # "aquaria_world.puml" that can help you see whether your regions and locations # are connected and placed as desired # from Utils import visualize_regions - # visualize_regions(self.multiworld.get_region("Menu", self.player), "aquaria_world.puml") \ No newline at end of file + # visualize_regions(self.multiworld.get_region("Menu", self.player), "aquaria_world.puml") + + def generate_basic(self): + """ + 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.multiworld.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.multiworld.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]: + aquarian_translation = False + if self.options.aquarian_translation: + aquarian_translation = True + return {"ingredientReplacement": self.ingredients_substitution, + "aquarianTranslate": aquarian_translation} \ No newline at end of file From 7111a484c8d08d706f07d84b9f339de6ec267cd2 Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 20 Mar 2024 14:36:41 -0400 Subject: [PATCH 03/56] Adding a forgotten locations in the cathedral --- Louis.yaml | 6 +++++ worlds/aquaria/Items.py | 2 +- worlds/aquaria/Locations.py | 4 ++- worlds/aquaria/Regions.py | 53 ++++++++++++++++++++++++++++++++----- worlds/aquaria/__init__.py | 11 +++++--- 5 files changed, 64 insertions(+), 12 deletions(-) create mode 100644 Louis.yaml diff --git a/Louis.yaml b/Louis.yaml new file mode 100644 index 00000000000..5bd49932601 --- /dev/null +++ b/Louis.yaml @@ -0,0 +1,6 @@ +Aquaria: + progression_balancing: 50 + accessibility: items +description: 'Generated by https://archipelago.gg with the default preset.' +game: Aquaria +name: Louis diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index f1581783bfd..5c86328dc1f 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -158,7 +158,7 @@ def __init__(self, name: str, classification: ItemClassification, "Healing poultice x 2": (698106, 2, ItemType.NORMAL, ItemGroup.RECIPE), "Hot soup x 2": (698107, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), "Leadership roll x 2": (698108, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Leaf poultice x 3": (698109, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), + "Leaf poultice x 3": (698109, 2, ItemType.PROGRESSION, ItemGroup.RECIPE), "Plant leaf x 2": (698110, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), "Plant leaf x 3": (698111, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), "Rotten meat x 2": (698112, 1, ItemType.JUNK, ItemGroup.INGREDIENT), diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 26d2e76f409..d1ddb137386 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -241,12 +241,13 @@ class AquariaLocations: "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 right path": 698143, + "Mithalas cathedral, urn in the top left eyes boss room": 698143, # Before: Mithalas cathedral, urn in the top right path "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 in the book shelf after the current": 698189, + "Mithalas cathedral right area, bellow the left entrance": 698198, } locations_cathedral_underground = { @@ -585,6 +586,7 @@ class AquariaLocations: **AquariaLocations.locations_forest_sprite_cave_tube, **AquariaLocations.locations_forest_fish_cave, **AquariaLocations.locations_home_water, + **AquariaLocations.locations_home_water_nautilus, **AquariaLocations.locations_body_l, **AquariaLocations.locations_body_rt, **AquariaLocations.locations_body_rb, diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 8e5de7b6a4c..e4775064fcc 100644 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -43,6 +43,7 @@ class AquariaRegions: arnassi_crab_boss: Region simon: Region mithalas_city: Region + mithalas_city_secret_2: Region mithalas_city_urns: Region mithalas_city_top_path: Region mithalas_city_top_path_urn: Region @@ -89,6 +90,7 @@ class AquariaRegions: turtle_cave_top_bubble: Region sun_temple_l: Region sun_temple_r: Region + sun_temple_secret_3: Region sun_temple_boss_lt: Region sun_temple_boss_lb: Region sun_temple_boss_r: Region @@ -96,6 +98,7 @@ class AquariaRegions: abyss_lb: Region abyss_l_fp: Region abyss_r: Region + abyss_r_secret_1: Region ice_cave: Region bubble_cave: Region king_jellyfish_cave: Region @@ -252,6 +255,10 @@ def __create_mithalas(self): self.__add_region("mithalas_city", "Mithalas city", AquariaLocations.locations_mithalas_city)) + self.mithalas_city_secret_2 = ( + self.__add_region("mithalas_city_secret_2", + "Mithalas city", + None)) self.mithalas_city_urns = ( self.__add_region("mithalas_city_urns", "Mithalas city", @@ -431,6 +438,9 @@ def __create_sun_temple(self): self.sun_temple_r = self.__add_region("sun_temple_r", "Sun temple right area", AquariaLocations.locations_sun_temple_r) + self.sun_temple_secret_3 = self.__add_region("sun_temple_secret_3", + "Sun temple's secret", + None) self.sun_temple_boss_lt = ( self.__add_region("sun_temple_boss_lt", "Sun temple before boss area, " + @@ -462,6 +472,9 @@ def __create_abyss(self): self.abyss_r = self.__add_region("abyss_r", "Abyss right area", AquariaLocations.locations_abyss_r) + self.abyss_r_secret_1 = self.__add_region("abyss_r_secret_1", + "Abyss right area's secret", + None) self.ice_cave = self.__add_region("ice_cave", "Ice cave", AquariaLocations.locations_ice_cave) @@ -650,6 +663,9 @@ def __connect_mithalas_regions(self): self.__connect_regions("mithalas_city", "mithalas_city_urns", self.mithalas_city, self.mithalas_city_urns) # Energy form needed one-way + self.__connect_regions("mithalas_city", "mithalas_city_secret_2", + self.mithalas_city, + self.mithalas_city_secret_2) self.__connect_regions("mithalas_city", "mithalas_city_top_path", self.mithalas_city, self.mithalas_city_top_path) # Beast form needed one-way @@ -780,6 +796,8 @@ def __connect_veil_regions(self): self.turtle_cave_bubble) # Beast form needed self.__connect_regions("veil_tr_r", "sun_temple_r", self.veil_tr_r, self.sun_temple_r) + self.__connect_regions("sun_temple_r", "sun_temple_secret_3", + self.sun_temple_r, self.sun_temple_secret_3) self.__connect_regions("sun_temple_r", "sun_temple_l", self.sun_temple_r, self.sun_temple_l) # bind song needed @@ -793,8 +811,8 @@ def __connect_veil_regions(self): lambda state: state.has("ingredient_hotsoup", self.player) # Beast form needed ) - - self.__connect_one_way_regions("sun_temple_boss_lt", "sun_temple_boss_lb", + self.__connect_one_way_regions("sun_temple_boss_lt", + "sun_temple_boss_lb", self.sun_temple_boss_lt, self.sun_temple_boss_lb) self.__connect_regions("sun_temple_boss_lb", "sun_temple_boss_r", @@ -858,6 +876,10 @@ def __connect_abyss_regions(self): self.abyss_r, self.bubble_cave) # Beast form needed + self.__connect_regions("whale", "abyss_r_secret_1", + self.whale, self.abyss_r_secret_1) # Energy form and bind song needed + + def __connect_sunken_city_regions(self): """ Connect entrances of the different regions around The Sunken City @@ -870,7 +892,7 @@ def __connect_sunken_city_regions(self): self.__connect_regions("sunken_city_l", "sunken_city_boss", self.sunken_city_l, self.sunken_city_boss) - def __connect_body_regions(self): + def __connect_body_regions(self, secret_required): """ Connect entrances of the different regions around The body """ @@ -896,11 +918,18 @@ def __connect_body_regions(self): self.__connect_one_way_regions("final_boss", "final_boss_3_form", self.final_boss, self.final_boss_3_form) # Need final boss conditions + + secret_condition = None + if secret_required: + secret_condition = \ + lambda state: (state.has("Secret 1 acquired", self.player) and + state.has("Secret 2 acquired", self.player) and + state.has("Secret 3 acquired", self.player)) self.__connect_one_way_regions("final_boss_3_form", "final_boss_end", self.final_boss_3_form, - self.final_boss_end) + self.final_boss_end, secret_condition) - def connect_regions(self): + def connect_regions(self, secret_required): """ Connect every region (entrances and exits) """ @@ -911,7 +940,7 @@ def connect_regions(self): self.__connect_veil_regions() self.__connect_abyss_regions() self.__connect_sunken_city_regions() - self.__connect_body_regions() + self.__connect_body_regions(secret_required) def __add_event_location(self, region:Region, name: str, event_name: str): """ @@ -926,7 +955,6 @@ def __add_event_location(self, region:Region, name: str, event_name: str): ItemClassification.progression, None, self.player)) - def add_event_locations(self): """ Add every events (locations and items) to the `world` @@ -943,6 +971,14 @@ def add_event_locations(self): "Body door 3 opened") self.__add_event_location(self.body_rb, "Erulian spirit freed", "Body door 4 opened") + self.__add_event_location(self.abyss_r_secret_1, "Getting secret 1", + "Secret 1 acquired") + self.__add_event_location(self.mithalas_city_secret_2, + "Getting secret 2", + "Secret 2 acquired") + self.__add_event_location(self.sun_temple_secret_3, + "Getting secret 3", + "Secret 3 acquired") self.__add_event_location(self.final_boss_end, "Objective complete", "Victory") @@ -986,6 +1022,7 @@ def __add_mithalas_regions_to_world(self): Add every region around Mithalas to the `world` """ self.world.regions.append(self.mithalas_city) + self.world.regions.append(self.mithalas_city_secret_2) self.world.regions.append(self.mithalas_city_urns) self.world.regions.append(self.mithalas_city_top_path) self.world.regions.append(self.mithalas_city_top_path_urn) @@ -1042,6 +1079,7 @@ def __add_veil_regions_to_world(self): self.world.regions.append(self.turtle_cave_top_bubble) self.world.regions.append(self.sun_temple_l) self.world.regions.append(self.sun_temple_r) + self.world.regions.append(self.sun_temple_secret_3) self.world.regions.append(self.sun_temple_boss_lt) self.world.regions.append(self.sun_temple_boss_lb) self.world.regions.append(self.sun_temple_boss_r) @@ -1054,6 +1092,7 @@ def __add_abyss_regions_to_world(self): self.world.regions.append(self.abyss_lb) self.world.regions.append(self.abyss_l_fp) self.world.regions.append(self.abyss_r) + self.world.regions.append(self.abyss_r_secret_1) self.world.regions.append(self.ice_cave) self.world.regions.append(self.bubble_cave) self.world.regions.append(self.king_jellyfish_cave) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index b2c7b871eb2..3e368e54161 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -98,7 +98,7 @@ def create_regions(self) -> None: Create every Region in `regions` """ self.regions.add_regions_to_world() - self.regions.connect_regions() + self.regions.connect_regions(self.options.objective.value != 0) def create_items(self) -> None: """Create every items in the world""" @@ -155,5 +155,10 @@ def fill_slot_data(self) -> Dict[str, Any]: aquarian_translation = False if self.options.aquarian_translation: aquarian_translation = True - return {"ingredientReplacement": self.ingredients_substitution, - "aquarianTranslate": aquarian_translation} \ No newline at end of file + death_link = False + if self.options.death_link: + death_link = True + return {"secret_needed": self.options.objective.value != 0, + "death_link": death_link, + "ingredientReplacement": self.ingredients_substitution, + "aquarianTranslate": aquarian_translation} From a1e73f9c56d94a5db13ae4e3cc0ca9ad4af8dea8 Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 22 Mar 2024 18:16:57 -0400 Subject: [PATCH 04/56] Adding rules def --- worlds/aquaria/Regions.py | 83 +++++++++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 8e5de7b6a4c..31de53deab0 100644 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -790,7 +790,7 @@ def __connect_veil_regions(self): self.__connect_one_way_regions( "sun_temple_boss_lb", "sun_temple_boss_lt", self.turtle_cave_bubble, self.turtle_cave_top_bubble, - lambda state: state.has("ingredient_hotsoup", self.player) + lambda state: __has_hot_soup(state, self.player) # Beast form needed ) @@ -805,7 +805,7 @@ def __connect_veil_regions(self): self.__connect_one_way_regions( "turtle_cave_bubble", "turtle_cave_top_bubble", self.turtle_cave_bubble, self.turtle_cave_top_bubble, - lambda state: state.has("ingredient_hotsoup", self.player) + lambda state: __has_hot_soup(state, self.player) # Beast form needed ) self.__connect_one_way_regions( @@ -814,7 +814,7 @@ def __connect_veil_regions(self): self.__connect_one_way_regions( "veil_tr_l", "veil_tr_water_fall", self.veil_tr_l, self.veil_tr_water_fall, - lambda state: state.has("ingredient_hotsoup", self.player) + lambda state: __has_hot_soup(state, self.player) # Beast form needed ) self.__connect_one_way_regions("veil_tr_water_fall", "veil_tr_l", @@ -842,7 +842,7 @@ def __connect_abyss_regions(self): self.__connect_regions( "abyss_lb", "body_c", self.abyss_lb, self.body_c, - lambda state: state.has("Body tongue cleared", self.player)) # Adding a check for opening + lambda state: __has_tongue_cleared(state, self.player)) self.__connect_regions("abyss_l", "king_jellyfish_cave", self.abyss_l, self.king_jellyfish_cave) # Energy form needed @@ -880,16 +880,14 @@ def __connect_body_regions(self): self.body_c, self.body_rt) self.__connect_regions("body_c", "body_rb", self.body_c, self.body_rb) - body_door_condition = \ - lambda state: state.has("Body door 1 opened", self.player) and \ - state.has("Body door 2 opened", self.player) and \ - state.has("Body door 3 opened", self.player) and \ - state.has("Body door 4 opened", self.player) self.__connect_regions("body_c", "body_b", - self.body_c, self.body_b, body_door_condition) + self.body_c, self.body_b, + lambda state: + __has_body_doors_opened(state, self.player)) self.__connect_regions("body_b", "final_boss", self.body_b, self.final_boss, - body_door_condition) # Need 4 spirits + lambda state: + __has_body_doors_opened(state, self.player)) self.__connect_regions("final_boss", "final_boss_tube", self.final_boss, self.final_boss_tube) # Nature form needed @@ -1105,3 +1103,66 @@ def __init__(self, world: MultiWorld, player: int): self.__create_abyss() self.__create_sunken_city() self.__create_body() + + +# Every condition to connect regions + +def __has_hot_soup(state, player) -> bool: + """`player` in `state` has the hotsoup item""" + return state.has("Hot soup", player) + + +def __has_tongue_cleared(state, player) -> bool: + """`player` in `state` has the Body tongue cleared item""" + return state.has("Body tongue cleared", player) + + +def __has_body_doors_opened(state, player) -> bool: + """`player` in `state` has the 4 body doors opened item""" + return state.has("Body door 1 opened", player) and \ + state.has("Body door 2 opened", player) and \ + state.has("Body door 3 opened", player) and \ + state.has("Body door 4 opened", player) + + +def __has_li(state, player) -> bool: + """`player` in `state` has Li in it's team""" + return state.has("Li and Li song", player) + + +def __has_shield_song(state, player) -> bool: + """`player` in `state` has the shield song item""" + return state.has("Shield song", player) + + +def __has_bind_song(state, player) -> bool: + """`player` in `state` has the bind song item""" + return state.has("Bind song", player) + +def __has_energy_form(state, player) -> bool: + """`player` in `state` has the energy form item""" + return state.has("Energy Form", player) + +def __has_beast_form(state, player) -> bool: + """`player` in `state` has the beast form item""" + return state.has("Beast Form", player) + +def __has_nature_form(state, player) -> bool: + """`player` in `state` has the nature form item""" + return state.has("Nature Form", player) + +def __has_sun_form(state, player) -> bool: + """`player` in `state` has the sun form item""" + return state.has("Sun Form", player) + +def __has_dual_form(state, player) -> bool: + """`player` in `state` has the dual form item""" + return state.has("Dual Form", player) + +def __has_fish_form(state, player) -> bool: + """`player` in `state` has the fish form item""" + return state.has("Fish Form", player) + +def __has_spirit_form(state, player) -> bool: + """`player` in `state` has the spirit form item""" + return state.has("Spirit Form", player) From a8041e9921155b838b15d58e2c13bde536d03fa7 Mon Sep 17 00:00:00 2001 From: Louis M Date: Sat, 23 Mar 2024 13:29:17 -0400 Subject: [PATCH 05/56] Forgot the Bedroom location --- worlds/aquaria/Locations.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 26d2e76f409..bc1f44e93f4 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -618,6 +618,7 @@ class AquariaLocations: **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, } From cfe2d5609c40dbee16510b6d852d9872e2827e10 Mon Sep 17 00:00:00 2001 From: Louis M Date: Sun, 24 Mar 2024 20:32:46 -0400 Subject: [PATCH 06/56] Code refactoring --- worlds/aquaria/Items.py | 12 +- worlds/aquaria/Locations.py | 204 +++--- worlds/aquaria/Regions.py | 1197 ++++++++++++++++------------------- worlds/aquaria/__init__.py | 7 + 4 files changed, 658 insertions(+), 762 deletions(-) mode change 100644 => 100755 worlds/aquaria/Regions.py diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index f1581783bfd..75f11db0294 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -158,7 +158,7 @@ def __init__(self, name: str, classification: ItemClassification, "Healing poultice x 2": (698106, 2, ItemType.NORMAL, ItemGroup.RECIPE), "Hot soup x 2": (698107, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), "Leadership roll x 2": (698108, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Leaf poultice x 3": (698109, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), + "Leaf poultice x 3": (698109, 2, ItemType.PROGRESSION, ItemGroup.RECIPE), "Plant leaf x 2": (698110, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), "Plant leaf x 3": (698111, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), "Rotten meat x 2": (698112, 1, ItemType.JUNK, ItemGroup.INGREDIENT), @@ -166,4 +166,14 @@ def __init__(self, name: str, classification: ItemClassification, "Sea loaf x 2": (698114, 1, ItemType.NORMAL, ItemGroup.RECIPE), "Small bone x 3": (698115, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), "Small egg x 2": (698116, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), + "Li and Li song": (698117, 1, ItemType.PROGRESSION, ItemGroup.SONG), + "Shield song": (698118, 1, ItemType.NORMAL, ItemGroup.SONG), + "Beast form": (698119, 1, ItemType.PROGRESSION, ItemGroup.SONG), + "Sun form": (698120, 1, ItemType.PROGRESSION, ItemGroup.SONG), + "Nature form": (698121, 1, ItemType.PROGRESSION, ItemGroup.SONG), + "Energy form": (698122, 1, ItemType.PROGRESSION, ItemGroup.SONG), + "Bind song": (698123, 1, ItemType.PROGRESSION, ItemGroup.SONG), + "Fish form": (698124, 1, ItemType.PROGRESSION, ItemGroup.SONG), + "Spirit form": (698125, 1, ItemType.PROGRESSION, ItemGroup.SONG), } + diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 26d2e76f409..85d0b480f8d 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -29,59 +29,58 @@ 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 behind the rock " + - "in the path left of the skeleton room": 698175, + "Big Seed in the Verse cave right area": 698175, } locations_verse_cave_l = { + "Verse cave, the Naija hint about here shield ability": 698200, "Verse cave left area, center part bulb": 698021, "Verse cave left area, right part bulb": 698022, - "Verse cave left area, bulb under the rock at the end of the path": - 698023, + "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 tutorial cave": - 698061, + "Home water, bulb in the end of the left path from the tutorial 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, + "Home water, bulb under the rock in the left path from the verse cave": 698065, } locations_home_water_nautilus = { - "Home water, Nautilus Egg by beating Nautilus Prime": 698194, + "Nautilus Egg in Home water": 698194, } 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, + "Naija's home, bulb under the rock at the right of the main path": 698120, } locations_song_cave = { + "Erulian spirit in the Song cave": 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 in the path to the singing statues": 698074, "Song cave, bulb under the rock close to the song door": 698075, - "Verse egg of the Song cave": 698160, - "Song cave, Jelly beacon at the top of the cave": 698178, + "Verse egg in the Song cave": 698160, + "Jelly beacon in the Song cave": 698178, } locations_song_cave_anemone = { - "Song cave, Anemone seed collectible behind of the big anemone": 698162, + "Anemone seed in the Song cave": 698162, } locations_energy_temple_1 = { - "Energy temple first area, bulb in the bottom room blocked by a rock": - 698027, - "Energy temple first area, Energy Idol inside the fish pass": 698170, + "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 Idol in the Energy temple first area": 698170, # Adding a Region for the idol } locations_energy_temple_2 = { @@ -89,7 +88,7 @@ class AquariaLocations: } locations_energy_temple_altar = { - "Energy temple bottom entry, Krotite armor on the altar": 698163, + "Krotite armor in the Energy temple": 698163, } locations_energy_temple_3 = { @@ -97,36 +96,29 @@ class AquariaLocations: } locations_energy_temple_boss = { - "Energy temple, fallen god tooth": 698169, - # Eventually, putting forest boss location here + "Fallen god tooth in the Energy temple": 698169, } locations_energy_temple_blaster_room = { - "Energy temple, passage after the fallen got boss, " + - "blaster egg in the locked room": 698195, + "Blaster egg in the Energy temple": 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, + "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, 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, + } + + locations_openwater_tr_urns = { + "Open water top right area, first urn in the Mithalas exit": 698148, # Need a way to break them "Open water top right area, second urn in the Mithalas exit": 698149, "Open water top right area, third urn in the Mithalas exit": 698150, } @@ -140,8 +132,7 @@ class AquariaLocations: } locations_openwater_bl_fp = { - "Open water bottom left area, bulb inside the downest fish pass": - 698010, + "Open water bottom left area, bulb inside the downest fish pass": 698010, } locations_skeleton_path = { @@ -150,7 +141,7 @@ class AquariaLocations: } locations_skeleton_path_sc = { - "Open water skeleton path, King skull between the streams": 698177, + "King skull in the Open water skeleton path": 698177, } locations_arnassi = { @@ -158,17 +149,15 @@ class AquariaLocations: "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 (Seahorse Costume) by beating the race": - 698191, + "Arnassi Armor in Arnassi ruins": 698191, } locations_arnassi_path = { - "Arnassi Ruins, Arnassi statue At the bottom of the right seahorse path" - : 698164, + "Arnassi statue in Arnassi Ruins": 698164, } locations_arnassi_crab_boss = { - "Arnassi ruins, get a Crab armor by beating Crabbius Maximus": 698187, + "Crab armor in Arnassi ruins": 698187, } locations_simon = { @@ -193,14 +182,13 @@ class AquariaLocations: "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, - "Mithalas city, urn inside a home fish pass": 698129, } 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, pot in the top passway": 698174, + "Mithalas pot in Mithalas city": 698174, } locations_mithalas_city_top_path_urn = { @@ -208,12 +196,13 @@ class AquariaLocations: } locations_mithalas_city_fishpass = { - "Mithalas city, Doll inside an home fish pass": 698173, + "Doll in Mithalas city": 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 above the main entrance": 698165, + "Blue banner in the Mithalas city castle": 698165, } locations_cathedral_l_urns = { @@ -226,11 +215,11 @@ class AquariaLocations: } locations_cathedral_l_tube = { - # Eventually, putting mithalas friest boss location here + "Mithalas castle, beating the priests": 698208, } locations_cathedral_l_sc = { - "Mithalas city castle, trident head behind the spirit cristal": 698183, + "Trident head in the Mithalas city castle": 698183, } locations_cathedral_r = { @@ -246,7 +235,8 @@ class AquariaLocations: "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 in the book shelf after the current": 698189, + "Mithalan Dress in the Mithalas cathedral": 698189, # Need Beast form + "Mithalas cathedral right area, bellow the left entrance": 698198, } locations_cathedral_underground = { @@ -259,57 +249,51 @@ class AquariaLocations: } locations_cathedral_boss = { - # Eventually, putting mithalas boss location here + "Cathedral boss area, beating Mithalas": 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 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 at the bottom of the current " + - "with upside down jellies": 698185, + "Jelly Egg in the Kelp Forest top left": 698185, } locations_forest_tl_fp = { - "Kelp Forest top left area, bulb in the center path": 698047, + "Kelp Forest top left area, bulb up to the Verse egg": 698047, "Verse egg in the Kelp forest top left area": 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 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, bulb in the left path's small room": 698052, + "Kelp Forest top right area, bulb at the top of the center clearing": 698053, } locations_forest_tr_dark = { - "Kelp forest top right area, Black pearl behind the seawolf": 698167, + "Black pearl in the Kelp forest top right area": 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 cristals": 698054, + } + locations_forest_bl_sc = { - "Kelp forest bottom left area, Walker baby at the end of the" + - " spirit cristal path": 698186, - "Kelp Forest bottom left area, bulb close to the spirit cristals": - 698054, + "Walker baby in the Kelp forest bottom left area": 698186, } locations_forest_br_ship = { - "Kelp forest bottom right area, Odd Container in the sunken ship": - 698168, + "Odd Container in the Kelp forest bottom right area": 698168, } locations_forest_boss = { - # Eventually, putting forest boss location here + "Kelp forest boss area, beating Drunian God": 698204, } locations_forest_boss_entrance = { @@ -317,7 +301,7 @@ class AquariaLocations: } locations_forest_fish_cave = { - # Eventually, putting fish cave location here + "Fish cave puzzle": 698207, } locations_forest_sprite_cave = { @@ -326,8 +310,7 @@ class AquariaLocations: locations_forest_sprite_cave_tube = { "Kelp Forest sprite cave, bulb in the second room": 698057, - "Kelp Forest Sprite Cave, Seed bag at the end of the path " + - "accross the flower portal": 698176, + "Seed bag in the Kelp Forest Sprite Cave": 698176, } locations_mermog_cave = { @@ -335,12 +318,12 @@ class AquariaLocations: } locations_mermog_boss = { - "Mermog cave, Piranha Egg by beating Mermog": 698197, + "Piranha Egg in the Mermog cave": 698197, } locations_veil_tl = { - "The veil top left area, bulb under the rock in the top right path": - 698078, + "In the Li cave": 698199, + "The veil top left area, bulb under the rock in the top right path": 698078, } locations_veil_tl_fp = { @@ -352,7 +335,7 @@ class AquariaLocations: } locations_turtle_cave_rocks = { - "Turtle cave, a Turtle Egg behind the blocking rocks": 698184, + "Turtle Egg in the Turtle cave": 698184, } locations_turtle_cave_bubble = { @@ -360,17 +343,15 @@ class AquariaLocations: } locations_turtle_cave_top_bubble = { - "Turtle cave, Urchin costume at the very top bubble": 698193, + "Urchin costume in the Turtle cave": 698193, } locations_veil_tr_l = { } - locations_veil_tr_r = { # Failaise nécessite le Beast form - "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_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_water_fall = { @@ -386,16 +367,15 @@ class AquariaLocations: } locations_veil_bl_fp = { - "Verse egg on the sunken ship after the fish pass " + - "in the Veil bottom area": 698157, + "Verse egg in the veil bottom area": 698157, } locations_veil_br = { - "The veil bottom area, Stone Head in the left passage to the top part": 698181, + "Stone Head in the veil bottom area": 698181, } locations_octo_cave_t = { - "Octocave, Dumbo Egg by beating the Octopus Prime": 698196, + "Dumbo Egg in the Octocave": 698196, } locations_octo_cave_b = { @@ -404,25 +384,22 @@ class AquariaLocations: 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, - "Verse egg when Mantis Shrimp Prime in the " + - "bubble cave is beaten": 698161, + "Bubble cave, bulb in the right cave wall (behind the ice cristal)": 698090, + "Verse egg in the Bubble cave": 698161, } 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 where the gold lobster came from": 698171, + "Golden Gear in the Sun temple": 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 left part": 698093, - "Sun temple, Sun key in the secret passage in the " + - "rightest part of the temple": 698182, + "Sun key in the Sun temple": 698182, } locations_sun_temple_boss_lb = { @@ -436,14 +413,14 @@ class AquariaLocations: } locations_sun_temple_boss_r = { - # Eventually, putting sun boss location here + "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 in the small room with sun beam": 698166, - "Abyss left area, Glowing Plant in the rightest hidden passage": 698172, + "Glowing seed in the Abyss left area": 698166, + "Glowing Plant in the Abyss left area": 698172, } locations_abyss_l_fp = { @@ -459,7 +436,7 @@ class AquariaLocations: locations_ice_cave = { "Ice cave, bulb in the room to the right": 698083, - "Ice cave, Forst bulbs in the top exit room": 698084, + "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, @@ -467,8 +444,7 @@ class AquariaLocations: locations_king_jellyfish_cave = { "King Jellyfish cave, bulb in the right path from King Jelly": 698088, - "Abyss left area, Jellyfish Costume after " + - "beating King Optimus Jelly Prime": 698188, + "Jellyfish Costume in the King Jellyfish cave": 698188, } locations_whale = { @@ -487,7 +463,7 @@ class AquariaLocations: } locations_sunken_city_l_bedroom = { - "Sunken city left area, Girl Costume in the bed room": 698192, + "Girl Costume in the Sunken city left area": 698192, } locations_sunken_city_boss = { @@ -495,6 +471,7 @@ class AquariaLocations: } locations_body_c = { + "The body center area, breaking li cage": 698201, "The body main area, bulb on the main path blocking tube": 698097, } @@ -511,15 +488,14 @@ class AquariaLocations: } 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 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 in the secret passage": 698190, + "Mutant Costume in the body bottom area": 698190, } locations_final_boss_tube = { @@ -536,6 +512,7 @@ class AquariaLocations: location_table = { **AquariaLocations.locations_openwater_tl, **AquariaLocations.locations_openwater_tr, + **AquariaLocations.locations_openwater_tr_urns, **AquariaLocations.locations_openwater_tr_turtle, **AquariaLocations.locations_openwater_bl, **AquariaLocations.locations_openwater_bl_fp, @@ -560,6 +537,7 @@ class AquariaLocations: **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_urns, **AquariaLocations.locations_mithalas_city_top_path, @@ -577,6 +555,7 @@ class AquariaLocations: **AquariaLocations.locations_forest_tr, **AquariaLocations.locations_forest_tr_dark, **AquariaLocations.locations_forest_tr_fp, + **AquariaLocations.locations_forest_bl, **AquariaLocations.locations_forest_bl_sc, **AquariaLocations.locations_forest_br_ship, **AquariaLocations.locations_forest_boss, @@ -618,6 +597,7 @@ class AquariaLocations: **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, } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py old mode 100644 new mode 100755 index 31de53deab0..077c9a9730b --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -4,7 +4,6 @@ Description: Used to manage Regions in the Aquaria game multiworld randomizer """ - from typing import Dict, Optional from BaseClasses import MultiWorld, Region, Entrance, ItemClassification from worlds.generic.Rules import set_rule @@ -12,6 +11,81 @@ from .Locations import AquariaLocations, AquariaLocation +# Every condition to connect regions + +def _has_hot_soup(state, player) -> bool: + """`player` in `state` has the hotsoup item""" + return state.has("Hot soup", player) + + +def _has_tongue_cleared(state, player) -> bool: + """`player` in `state` has the Body tongue cleared item""" + return state.has("Body tongue cleared", player) + + +def _has_body_doors_opened(state, player) -> bool: + """`player` in `state` has the 4 body doors opened item""" + return state.has("Body door 1 opened", player) and \ + state.has("Body door 2 opened", player) and \ + state.has("Body door 3 opened", player) and \ + state.has("Body door 4 opened", player) + + +def _has_li(state, player) -> bool: + """`player` in `state` has Li in it's team""" + return state.has("Li and Li song", player) + + +def _has_damaging_item(state, player) -> bool: + """`player` in `state` has the shield song item""" + return state.has_group("Damage", player) + + +def _has_shield_song(state, player) -> bool: + """`player` in `state` has the shield song item""" + return state.has("Shield song", player) + + +def _has_bind_song(state, player) -> bool: + """`player` in `state` has the bind song item""" + return state.has("Bind song", player) + + +def _has_energy_form(state, player) -> bool: + """`player` in `state` has the energy form item""" + return state.has("Energy form", player) + + +def _has_beast_form(state, player) -> bool: + """`player` in `state` has the beast form item""" + return state.has("Beast form", player) + + +def _has_nature_form(state, player) -> bool: + """`player` in `state` has the nature form item""" + return state.has("Nature form", player) + + +def _has_sun_form(state, player) -> bool: + """`player` in `state` has the sun form item""" + return state.has("Sun form", player) + + +def _has_dual_form(state, player) -> bool: + """`player` in `state` has the dual form item""" + return state.has("Dual form", player) + + +def _has_fish_form(state, player) -> bool: + """`player` in `state` has the fish form item""" + return state.has("Fish form", player) + + +def _has_spirit_form(state, player) -> bool: + """`player` in `state` has the spirit form item""" + return state.has("Spirit form", player) + + class AquariaRegions: """ Class used to create regions of the Aquaria game @@ -28,10 +102,12 @@ class AquariaRegions: energy_temple_2: Region energy_temple_3: Region energy_temple_boss: Region + energy_temple_idol: Region energy_temple_blaster_room: Region energy_temple_altar: Region openwater_tl: Region openwater_tr: Region + openwater_tr_urns: Region openwater_tr_turtle: Region openwater_bl: Region openwater_bl_fp: Region @@ -117,7 +193,6 @@ class AquariaRegions: Every Region of the game """ - world: MultiWorld """ The Current Multiworld game. @@ -136,8 +211,7 @@ def __add_region(self, name: str, hint: str, """ region: Region = Region(name, self.player, self.world, hint) if locations is not None: - region.add_locations(locations, - AquariaLocation) + region.add_locations(locations, AquariaLocation) return region def __create_home_water_area(self): @@ -145,389 +219,237 @@ def __create_home_water_area(self): Create the `verse_cave`, `home_water` and `song_cave*` regions """ self.verse_cave_r = ( - self.__add_region("Menu", "Verse Cave right area", - AquariaLocations.locations_verse_cave_r)) + self.__add_region("Menu", "Verse Cave right area", AquariaLocations.locations_verse_cave_r)) self.verse_cave_l = ( - self.__add_region("verse_cave_left_area", - "Verse Cave left area", - AquariaLocations.locations_verse_cave_l)) - self.home_water = ( - self.__add_region("home_water", "Home Water", - AquariaLocations.locations_home_water)) - self.home_water_nautilus = ( - self.__add_region("home_water_nautilus", "Home Water", - AquariaLocations.locations_home_water_nautilus)) - self.naija_home = ( - self.__add_region("naija_home", "Naija's home", - AquariaLocations.locations_naija_home)) - self.song_cave = self.__add_region("song_cave", "Song cave", - AquariaLocations.locations_song_cave) - self.song_cave_anemone = ( - self.__add_region("song_cave_anemone", - "Song cave", - AquariaLocations.locations_song_cave_anemone)) + self.__add_region("verse_cave_left_area", "Verse Cave left area", AquariaLocations.locations_verse_cave_l)) + self.home_water = self.__add_region("home_water", "Home Water", AquariaLocations.locations_home_water) + self.home_water_nautilus = self.__add_region("home_water_nautilus", "Home Water", + AquariaLocations.locations_home_water_nautilus) + self.naija_home = self.__add_region("naija_home", "Naija's home", AquariaLocations.locations_naija_home) + self.song_cave = self.__add_region("song_cave", "Song cave", AquariaLocations.locations_song_cave) + self.song_cave_anemone = self.__add_region("song_cave_anemone", "Song cave", + AquariaLocations.locations_song_cave_anemone) def __create_energy_temple(self): """ Create the `energy_temple_*` regions """ - self.energy_temple_1 = ( - self.__add_region("energy_temple_1", - "Energy temple first area", - AquariaLocations.locations_energy_temple_1)) - self.energy_temple_2 = ( - self.__add_region("energy_temple_2", - "Energy temple second area", - AquariaLocations.locations_energy_temple_2)) - self.energy_temple_3 = ( - self.__add_region("energy_temple_3", - "Energy temple third area", - AquariaLocations.locations_energy_temple_3)) - self.energy_temple_altar = ( - self.__add_region("energy_temple_altar", - "Energy temple bottom entrance", - AquariaLocations.locations_energy_temple_altar)) - self.energy_temple_boss = ( - self.__add_region("energy_temple_boss", - "Energy temple fallen God room", - AquariaLocations.locations_energy_temple_boss)) - self.energy_temple_blaster_room = ( - self.__add_region("energy_temple_blaster_room", - "Energy temple blaster room", - AquariaLocations.locations_energy_temple_blaster_room)) + self.energy_temple_1 = self.__add_region("energy_temple_1", "Energy temple first area", + AquariaLocations.locations_energy_temple_1) + self.energy_temple_2 = self.__add_region("energy_temple_2", "Energy temple second area", + AquariaLocations.locations_energy_temple_2) + self.energy_temple_3 = self.__add_region("energy_temple_3", "Energy temple third area", + AquariaLocations.locations_energy_temple_3) + self.energy_temple_altar = self.__add_region("energy_temple_altar", "Energy temple bottom entrance", + AquariaLocations.locations_energy_temple_altar) + self.energy_temple_boss = self.__add_region("energy_temple_boss", "Energy temple fallen God room", + AquariaLocations.locations_energy_temple_boss) + self.energy_temple_idol = self.__add_region("energy_temple_idol", "Energy temple Idol room", + AquariaLocations.locations_energy_temple_idol) + self.energy_temple_blaster_room = self.__add_region("energy_temple_blaster_room", "Energy temple blaster room", + AquariaLocations.locations_energy_temple_blaster_room) def __create_openwater(self): """ Create the `openwater_*`, `skeleton_path`, `arnassi*` and `simon` regions """ - self.openwater_tl = self.__add_region("openwater_tl", - "Open water top left area", + self.openwater_tl = self.__add_region("openwater_tl", "Open water top left area", AquariaLocations.locations_openwater_tl) - self.openwater_tr = self.__add_region("openwater_tr", - "Open water top right area", + self.openwater_tr = self.__add_region("openwater_tr", "Open water top right area", AquariaLocations.locations_openwater_tr) - self.openwater_tr_turtle = ( - self.__add_region("openwater_tr_turtle", - "Open water top right area, turtle room", - AquariaLocations.locations_openwater_tr_turtle)) - self.openwater_bl = self.__add_region("openwater_bl", - "Open water bottom left area", + self.openwater_tr_turtle = self.__add_region("openwater_tr_turtle", "Open water top right area, turtle room", + AquariaLocations.locations_openwater_tr_turtle) + self.openwater_tr_urns = self.__add_region("openwater_tr_urns", "Open water top right area", + AquariaLocations.locations_openwater_tr_urns) + self.openwater_bl = self.__add_region("openwater_bl", "Open water bottom left area", AquariaLocations.locations_openwater_bl) - self.openwater_bl_fp = ( - self.__add_region("openwater_bl_fp", - "Open water bottom left area", - AquariaLocations.locations_openwater_bl_fp)) - self.openwater_br = self.__add_region("openwater_br", - "Open water bottom right area", - None) - self.skeleton_path = ( - self.__add_region("skeleton_path", - "Open water skeleton path", - AquariaLocations.locations_skeleton_path)) - self.skeleton_path_sc = ( - self.__add_region("skeleton_path_sc", - "Open water skeleton path", - AquariaLocations.locations_skeleton_path_sc)) - self.arnassi = self.__add_region("arnassi", - "Arnassi Ruins", - AquariaLocations.locations_arnassi) - self.simon = self.__add_region("simon", - "Arnassi Ruins, Simon's room", - AquariaLocations.locations_simon) - self.arnassi_path = ( - self.__add_region("arnassi_path", - "Arnassi Ruins, back entrance path", - AquariaLocations.locations_arnassi_path)) - self.arnassi_crab_boss = ( - self.__add_region("arnassi_crab_boss", - "Arnassi Ruins, Crabbius Maximus lair", - AquariaLocations.locations_arnassi_crab_boss)) + self.openwater_bl_fp = self.__add_region("openwater_bl_fp", "Open water bottom left area", + AquariaLocations.locations_openwater_bl_fp) + self.openwater_br = self.__add_region("openwater_br", "Open water bottom right area", None) + self.skeleton_path = self.__add_region("skeleton_path", "Open water skeleton path", + AquariaLocations.locations_skeleton_path) + self.skeleton_path_sc = self.__add_region("skeleton_path_sc", "Open water skeleton path", + AquariaLocations.locations_skeleton_path_sc) + self.arnassi = self.__add_region("arnassi", "Arnassi Ruins", AquariaLocations.locations_arnassi) + self.simon = self.__add_region("simon", "Arnassi Ruins, Simon's room", AquariaLocations.locations_simon) + self.arnassi_path = self.__add_region("arnassi_path", "Arnassi Ruins, back entrance path", + AquariaLocations.locations_arnassi_path) + self.arnassi_crab_boss = self.__add_region("arnassi_crab_boss", "Arnassi Ruins, Crabbius Maximus lair", + AquariaLocations.locations_arnassi_crab_boss) def __create_mithalas(self): """ Create the `mithalas_city*` and `cathedral_*` regions """ - self.mithalas_city = ( - self.__add_region("mithalas_city", - "Mithalas city", - AquariaLocations.locations_mithalas_city)) - self.mithalas_city_urns = ( - self.__add_region("mithalas_city_urns", - "Mithalas city", - AquariaLocations.locations_mithalas_city_urns)) - self.mithalas_city_fishpass = ( - self.__add_region("mithalas_city_fishpass", - "Mithalas city", - AquariaLocations.locations_mithalas_city_fishpass)) - self.mithalas_city_top_path = ( - self.__add_region("mithalas_city_top_path", - "Mithalas city", - AquariaLocations.locations_mithalas_city_top_path)) - self.mithalas_city_top_path_urn = self.__add_region( - "mithalas_city_top_path_urn", - "Mithalas city", AquariaLocations.locations_mithalas_city_top_path_urn) - self.cathedral_l = self.__add_region("cathedral_l", - "Mithalas castle", - AquariaLocations.locations_cathedral_l) - self.cathedral_l_urns = ( - self.__add_region("cathedral_l_urns", - "Mithalas castle", - AquariaLocations.locations_cathedral_l_urns)) - self.cathedral_l_tube = ( - self.__add_region("cathedral_l_tube", - "Mithalas castle, plant tube entrance", - AquariaLocations.locations_cathedral_l_tube)) - self.cathedral_l_sc = ( - self.__add_region("cathedral_l_sc", - "Mithalas castle", - AquariaLocations.locations_cathedral_l_sc)) - self.cathedral_r = self.__add_region("cathedral_r", - "Mithalas Cathedral", + self.mithalas_city = self.__add_region("mithalas_city", "Mithalas city", + AquariaLocations.locations_mithalas_city) + self.mithalas_city_urns = self.__add_region("mithalas_city_urns", "Mithalas city", + AquariaLocations.locations_mithalas_city_urns) + self.mithalas_city_fishpass = self.__add_region("mithalas_city_fishpass", "Mithalas city", + AquariaLocations.locations_mithalas_city_fishpass) + self.mithalas_city_top_path = self.__add_region("mithalas_city_top_path", "Mithalas city", + AquariaLocations.locations_mithalas_city_top_path) + self.mithalas_city_top_path_urn = self.__add_region("mithalas_city_top_path_urn", "Mithalas city", + AquariaLocations.locations_mithalas_city_top_path_urn) + self.cathedral_l = self.__add_region("cathedral_l", "Mithalas castle", AquariaLocations.locations_cathedral_l) + self.cathedral_l_urns = self.__add_region("cathedral_l_urns", "Mithalas castle", + AquariaLocations.locations_cathedral_l_urns) + self.cathedral_l_tube = self.__add_region("cathedral_l_tube", "Mithalas castle, plant tube entrance", + AquariaLocations.locations_cathedral_l_tube) + self.cathedral_l_sc = self.__add_region("cathedral_l_sc", "Mithalas castle", + AquariaLocations.locations_cathedral_l_sc) + self.cathedral_r = self.__add_region("cathedral_r", "Mithalas Cathedral", AquariaLocations.locations_cathedral_r) - self.cathedral_underground = ( - self.__add_region("cathedral_underground", - "Mithalas Cathedral underground area", - AquariaLocations.locations_cathedral_underground)) - self.cathedral_boss_r = ( - self.__add_region("cathedral_boss_r", - "Mithalas Cathedral, Mithalan God room", - AquariaLocations.locations_cathedral_boss)) - self.cathedral_boss_l = ( - self.__add_region("cathedral_boss_l", - "Mithalas Cathedral, Mithalan God room", - None)) + self.cathedral_underground = self.__add_region("cathedral_underground", "Mithalas Cathedral underground area", + AquariaLocations.locations_cathedral_underground) + self.cathedral_boss_r = self.__add_region("cathedral_boss_r", "Mithalas Cathedral, Mithalan God room", + AquariaLocations.locations_cathedral_boss) + self.cathedral_boss_l = self.__add_region("cathedral_boss_l", "Mithalas Cathedral, Mithalan God room", None) def __create_forest(self): """ Create the `forest_*` dans `mermog_cave` regions """ - self.forest_tl = self.__add_region("forest_tl", - "Kelp forest top left area", + self.forest_tl = self.__add_region("forest_tl", "Kelp forest top left area", AquariaLocations.locations_forest_tl) - self.forest_tl_fp = self.__add_region("forest_tl_fp", - "Kelp forest top left area", + self.forest_tl_fp = self.__add_region("forest_tl_fp", "Kelp forest top left area", AquariaLocations.locations_forest_tl_fp) - self.forest_tr = self.__add_region("forest_tr", - "Kelp forest top right area", + self.forest_tr = self.__add_region("forest_tr", "Kelp forest top right area", AquariaLocations.locations_forest_tr) - self.forest_tr_fp = self.__add_region("forest_tr_fp", - "Kelp forest top right area", + self.forest_tr_fp = self.__add_region("forest_tr_fp", "Kelp forest top right area", AquariaLocations.locations_forest_tr_fp) - self.forest_tr_dark = ( - self.__add_region("forest_tr_dark", - "Kelp forest top right area, " + - "the dark behind the seawolf", - AquariaLocations.locations_forest_tr_dark)) - self.forest_bl = self.__add_region("forest_bl", - "Kelp forest bottom left area", - None) - self.forest_bl_sc = ( - self.__add_region("forest_bl_sc", - "Kelp forest bottom left area, spirit cristal", - AquariaLocations.locations_forest_bl_sc)) - self.forest_br = self.__add_region("forest_br", - "Kelp forest bottom right area", - None) - self.forest_br_ship = ( - self.__add_region("forest_br_ship", - "Kelp forest bottom right area, sunken ship", - AquariaLocations.locations_forest_br_ship)) - self.forest_sprite_cave = ( - self.__add_region("forest_sprite_cave", - "Kelp forest spirit cave", - AquariaLocations.locations_forest_sprite_cave)) - self.forest_sprite_cave_tube = ( - self.__add_region("forest_sprite_cave_tube", - "Kelp forest spirit cave after the plant tube", - AquariaLocations.locations_forest_sprite_cave_tube)) - self.forest_boss = self.__add_region("forest_boss", - "Kelp forest Drunian God room", + self.forest_tr_dark = self.__add_region("forest_tr_dark", + "Kelp forest top right area, the dark behind the seawolf", + AquariaLocations.locations_forest_tr_dark) + self.forest_bl = self.__add_region("forest_bl", "Kelp forest bottom left area", + AquariaLocations.locations_forest_bl) + self.forest_bl_sc = self.__add_region("forest_bl_sc", "Kelp forest bottom left area, spirit cristal", + AquariaLocations.locations_forest_bl_sc) + self.forest_br = self.__add_region("forest_br", "Kelp forest bottom right area", None) + self.forest_br_ship = self.__add_region("forest_br_ship", "Kelp forest bottom right area, sunken ship", + AquariaLocations.locations_forest_br_ship) + self.forest_sprite_cave = self.__add_region("forest_sprite_cave", "Kelp forest spirit cave", + AquariaLocations.locations_forest_sprite_cave) + self.forest_sprite_cave_tube = self.__add_region("forest_sprite_cave_tube", + "Kelp forest spirit cave after the plant tube", + AquariaLocations.locations_forest_sprite_cave_tube) + self.forest_boss = self.__add_region("forest_boss", "Kelp forest Drunian God room", AquariaLocations.locations_forest_boss) - self.forest_boss_entrance = ( - self.__add_region("forest_boss_entrance", - "Kelp forest Drunian God room", - AquariaLocations.locations_forest_boss_entrance)) - self.mermog_cave = self.__add_region("mermog_cave", - "Kelp forest Mermog cave", + self.forest_boss_entrance = self.__add_region("forest_boss_entrance", "Kelp forest Drunian God room", + AquariaLocations.locations_forest_boss_entrance) + self.mermog_cave = self.__add_region("mermog_cave", "Kelp forest Mermog cave", AquariaLocations.locations_mermog_cave) - self.mermog_boss = self.__add_region("mermog_boss", - "Kelp forest Mermog cave", + self.mermog_boss = self.__add_region("mermog_boss", "Kelp forest Mermog cave", AquariaLocations.locations_mermog_boss) - self.forest_fish_cave = ( - self.__add_region("forest_fish_cave", - "Kelp forest fish cave", - AquariaLocations.locations_forest_fish_cave)) + self.forest_fish_cave = self.__add_region("forest_fish_cave", "Kelp forest fish cave", + AquariaLocations.locations_forest_fish_cave) def __create_veil(self): """ Create the `veil_*`, `octo_cave` and `turtle_cave` regions """ - self.veil_tl = self.__add_region("veil_tl", - "The veil top left area", - AquariaLocations.locations_veil_tl) - self.veil_tl_fp = self.__add_region("veil_tl_fp", - "The veil top left area", + self.veil_tl = self.__add_region("veil_tl", "The veil top left area", AquariaLocations.locations_veil_tl) + self.veil_tl_fp = self.__add_region("veil_tl_fp", "The veil top left area", AquariaLocations.locations_veil_tl_fp) - self.veil_tl_rock = ( - self.__add_region("veil_tl_rock", - "The veil top left area, after blocking rock", - AquariaLocations.locations_veil_tl_rock)) - self.turtle_cave = ( - self.__add_region("turtle_cave", - "The veil top left area, turtle cave", - None)) - self.turtle_cave_rocks = ( - self.__add_region("turtle_cave_rocks", - "The veil top left area, turtle cave", - AquariaLocations.locations_turtle_cave_rocks)) - self.turtle_cave_bubble = ( - self.__add_region("turtle_cave_bubble", - "The veil top left area, turtle cave bubble cliff", - AquariaLocations.locations_turtle_cave_bubble)) - self.turtle_cave_top_bubble = ( - self.__add_region("turtle_cave_top_bubble", - "The veil top left area, turtle cave bubble cliff", - AquariaLocations.locations_turtle_cave_top_bubble)) - self.veil_tr_l = ( - self.__add_region("veil_tr_l", - "The veil top right area, left of temple", - AquariaLocations.locations_veil_tr_l)) - self.veil_tr_r = ( - self.__add_region("veil_tr_r", - "The veil top right area, right of temple", - AquariaLocations.locations_veil_tr_r)) - self.veil_tr_water_fall = ( - self.__add_region("veil_tr_water_fall", - "The veil top right area, top of the water fall", - AquariaLocations.locations_veil_tr_water_fall)) - self.octo_cave_t = self.__add_region("octo_cave_t", - "Octopus cave top entrance", + self.veil_tl_rock = self.__add_region("veil_tl_rock", "The veil top left area, after blocking rock", + AquariaLocations.locations_veil_tl_rock) + self.turtle_cave = self.__add_region("turtle_cave", "The veil top left area, turtle cave", None) + self.turtle_cave_rocks = self.__add_region("turtle_cave_rocks", "The veil top left area, turtle cave", + AquariaLocations.locations_turtle_cave_rocks) + self.turtle_cave_bubble = self.__add_region("turtle_cave_bubble", + "The veil top left area, turtle cave bubble cliff", + AquariaLocations.locations_turtle_cave_bubble) + self.turtle_cave_top_bubble = self.__add_region("turtle_cave_top_bubble", + "The veil top left area, turtle cave bubble cliff", + AquariaLocations.locations_turtle_cave_top_bubble) + self.veil_tr_l = self.__add_region("veil_tr_l", "The veil top right area, left of temple", + AquariaLocations.locations_veil_tr_l) + self.veil_tr_r = self.__add_region("veil_tr_r", "The veil top right area, right of temple", + AquariaLocations.locations_veil_tr_r) + self.veil_tr_water_fall = self.__add_region("veil_tr_water_fall", + "The veil top right area, top of the water fall", + AquariaLocations.locations_veil_tr_water_fall) + self.octo_cave_t = self.__add_region("octo_cave_t", "Octopus cave top entrance", AquariaLocations.locations_octo_cave_t) - self.octo_cave_b = self.__add_region("octo_cave_b", - "Octopus cave bottom entrance", + self.octo_cave_b = self.__add_region("octo_cave_b", "Octopus cave bottom entrance", AquariaLocations.locations_octo_cave_b) - self.veil_bl = self.__add_region("veil_bl", - "The veil bottom left area", + self.veil_bl = self.__add_region("veil_bl", "The veil bottom left area", AquariaLocations.locations_veil_bl) - self.veil_b_sc = ( - self.__add_region("veil_b_sc", - "The veil bottom spirit cristal area", - AquariaLocations.locations_veil_b_sc)) - self.veil_bl_fp = self.__add_region("veil_bl_fp", - "The veil bottom left area", + self.veil_b_sc = self.__add_region("veil_b_sc", "The veil bottom spirit cristal area", + AquariaLocations.locations_veil_b_sc) + self.veil_bl_fp = self.__add_region("veil_bl_fp", "The veil bottom left area", AquariaLocations.locations_veil_bl_fp) - self.veil_br = self.__add_region("veil_br", - "The veil bottom right area", + self.veil_br = self.__add_region("veil_br", "The veil bottom right area", AquariaLocations.locations_veil_br) def __create_sun_temple(self): """ Create the `sun_temple*` regions """ - self.sun_temple_l = self.__add_region("sun_temple_l", - "Sun temple left area", + self.sun_temple_l = self.__add_region("sun_temple_l", "Sun temple left area", AquariaLocations.locations_sun_temple_l) - self.sun_temple_r = self.__add_region("sun_temple_r", - "Sun temple right area", + self.sun_temple_r = self.__add_region("sun_temple_r", "Sun temple right area", AquariaLocations.locations_sun_temple_r) - self.sun_temple_boss_lt = ( - self.__add_region("sun_temple_boss_lt", - "Sun temple before boss area, " + - "top of the cliffs", - AquariaLocations.locations_sun_temple_boss_lt)) - self.sun_temple_boss_lb = ( - self.__add_region("sun_temple_boss_lb", - "Sun temple before boss area", - AquariaLocations.locations_sun_temple_boss_lb)) - self.sun_temple_boss_r = ( - self.__add_region("sun_temple_boss_r", - "Sun temple boss area", - AquariaLocations.locations_sun_temple_boss_r)) + self.sun_temple_boss_lt = self.__add_region("sun_temple_boss_lt", + "Sun temple before boss area, top of the cliffs", + AquariaLocations.locations_sun_temple_boss_lt) + self.sun_temple_boss_lb = self.__add_region("sun_temple_boss_lb", "Sun temple before boss area", + AquariaLocations.locations_sun_temple_boss_lb) + self.sun_temple_boss_r = self.__add_region("sun_temple_boss_r", "Sun temple boss area", + AquariaLocations.locations_sun_temple_boss_r) def __create_abyss(self): """ Create the `abyss_*`, `ice_cave`, `king_jellyfish_cave` and `whale` regions """ - self.abyss_l = self.__add_region("abyss_l", - "Abyss left area", + self.abyss_l = self.__add_region("abyss_l", "Abyss left area", AquariaLocations.locations_abyss_l) - self.abyss_lb = self.__add_region("abyss_lb", - "Abyss left bottom area", - None) - self.abyss_l_fp = self.__add_region("abyss_l_fp", - "Abyss left buttom area", + self.abyss_lb = self.__add_region("abyss_lb", "Abyss left bottom area", None) + self.abyss_l_fp = self.__add_region("abyss_l_fp", "Abyss left buttom area", AquariaLocations.locations_abyss_l_fp) - self.abyss_r = self.__add_region("abyss_r", - "Abyss right area", - AquariaLocations.locations_abyss_r) - self.ice_cave = self.__add_region("ice_cave", - "Ice cave", - AquariaLocations.locations_ice_cave) - self.bubble_cave = self.__add_region("bubble_cave", - "Bubble cave", - AquariaLocations.locations_bubble_cave) - self.king_jellyfish_cave = ( - self.__add_region("king_jellyfish_cave", - "Abyss left area, King jellyfish cave", - AquariaLocations.locations_king_jellyfish_cave)) - self.whale = self.__add_region("whale", - "Inside the whale", - AquariaLocations.locations_whale) + self.abyss_r = self.__add_region("abyss_r", "Abyss right area", AquariaLocations.locations_abyss_r) + self.ice_cave = self.__add_region("ice_cave", "Ice cave", AquariaLocations.locations_ice_cave) + self.bubble_cave = self.__add_region("bubble_cave", "Bubble cave", AquariaLocations.locations_bubble_cave) + self.king_jellyfish_cave = self.__add_region("king_jellyfish_cave", "Abyss left area, King jellyfish cave", + AquariaLocations.locations_king_jellyfish_cave) + self.whale = self.__add_region("whale", "Inside the whale", AquariaLocations.locations_whale) def __create_sunken_city(self): """ Create the `sunken_city_*` regions """ - self.sunken_city_l = self.__add_region("sunken_city_l", - "Sunken city left area", - AquariaLocations.locations_sunken_city_l) - self.sunken_city_l_bedroom = ( - self.__add_region("sunken_city_l_bedroom", - "Sunken city left area, bedroom", - AquariaLocations.locations_sunken_city_l_bedroom)) - self.sunken_city_r = self.__add_region("sunken_city_r", - "Sunken city right area", - AquariaLocations.locations_sunken_city_r) + self.sunken_city_l = self.__add_region("sunken_city_l", "Sunken city left area", + AquariaLocations.locations_sunken_city_l) + self.sunken_city_l_bedroom = self.__add_region("sunken_city_l_bedroom", "Sunken city left area, bedroom", + AquariaLocations.locations_sunken_city_l_bedroom) + self.sunken_city_r = self.__add_region("sunken_city_r", "Sunken city right area", + AquariaLocations.locations_sunken_city_r) self.sunken_city_boss = ( - self.__add_region("sunken_city_boss", - "Sunken city boss area", + self.__add_region("sunken_city_boss", "Sunken city boss area", AquariaLocations.locations_sunken_city_boss)) def __create_body(self): """ Create the `body_*` and `final_boss* regions """ - self.body_c = self.__add_region("body_c", - "The body center area", + self.body_c = self.__add_region("body_c", "The body center area", AquariaLocations.locations_body_c) - self.body_l = self.__add_region("body_l", - "The body left area", + self.body_l = self.__add_region("body_l", "The body left area", AquariaLocations.locations_body_l) - self.body_rt = self.__add_region("body_rt", - "The body right area, top path", + self.body_rt = self.__add_region("body_rt", "The body right area, top path", AquariaLocations.locations_body_rt) - self.body_rb = self.__add_region("body_rb", - "The body right area, bottom path", + self.body_rb = self.__add_region("body_rb", "The body right area, bottom path", AquariaLocations.locations_body_rb) - self.body_b = self.__add_region("body_b", - "The body bottom area", + self.body_b = self.__add_region("body_b", "The body bottom area", AquariaLocations.locations_body_b) - self.final_boss = self.__add_region("final_boss", - "The body, final boss area", - None) - self.final_boss_tube = ( - self.__add_region("final_boss_tube", - "The body, final boss area turtle room", - AquariaLocations.locations_final_boss_tube)) - self.final_boss_3_form = ( - self.__add_region("final_boss_3_form", - "The body final boss third form area", - AquariaLocations.locations_final_boss_3_form)) - self.final_boss_end = ( - self.__add_region("final_boss_end", - "The body, final boss area", None)) + self.final_boss = self.__add_region("final_boss", "The body, final boss area", None) + self.final_boss_tube = self.__add_region("final_boss_tube", "The body, final boss area turtle room", + AquariaLocations.locations_final_boss_tube) + self.final_boss_3_form = self.__add_region("final_boss_3_form", "The body final boss third form area", + AquariaLocations.locations_final_boss_3_form) + self.final_boss_end = self.__add_region("final_boss_end", "The body, final boss area", None) def __connect_one_way_regions(self, source_name: str, destination_name: str, source_region: Region, @@ -535,8 +457,7 @@ def __connect_one_way_regions(self, source_name: str, destination_name: str, """ Connect from the `source_region` to the `destination_region` """ - entrance = Entrance(source_region.player, source_name + "_" + - destination_name, source_region) + entrance = Entrance(source_region.player, source_name + " to " + destination_name, source_region) source_region.exits.append(entrance) entrance.connect(destination_region) if rule is not None: @@ -548,355 +469,396 @@ def __connect_regions(self, source_name: str, destination_name: str, """ Connect the `source_region` and the `destination_region` (two-way) """ - self.__connect_one_way_regions(source_name, destination_name, - source_region, destination_region, rule) - self.__connect_one_way_regions(destination_name, source_name, - destination_region, source_region, rule) + self.__connect_one_way_regions(source_name, destination_name, source_region, destination_region, rule) + self.__connect_one_way_regions(destination_name, source_name, destination_region, source_region, rule) def __connect_home_water_regions(self): """ Connect entrances of the different regions around `home_water` """ - self.__connect_regions("verse_cave_l","verse_cave_r", + self.__connect_regions("Verse cave left area", "Verse cave right area", self.verse_cave_l, self.verse_cave_r) - self.__connect_regions("verse_cave","l_home_water", - self.verse_cave_l, self.home_water) - self.__connect_regions("home_water", "naija_home", - self.home_water, self.naija_home) - self.__connect_regions("home_water","song_cave", - self.home_water, self.song_cave) - self.__connect_regions("home_water","home_water_nautilus", - self.home_water, self.home_water_nautilus) # Need energy form - self.__connect_regions("song_cave","song_cave_anemone", - self.song_cave, - self.song_cave_anemone) # Need Nature Form - self.__connect_regions("home_water","energy_temple_1", - self.home_water, - self.energy_temple_1) # Need bind song - self.__connect_regions("home_water","energy_temple_altar", - self.home_water, - self.energy_temple_altar) # Need energy form - self.__connect_regions("energy_temple_1","energy_temple_2", - self.energy_temple_1, - self.energy_temple_2) # Need energy form - self.__connect_regions("energy_temple_1","energy_temple_boss", - self.energy_temple_1, - self.energy_temple_boss) # Need Fish form or Energy form - self.__connect_regions("energy_temple_2", "energy_temple_3", - self.energy_temple_2, - self.energy_temple_3) # Need Bind form and Energy form - self.__connect_regions("energy_temple_boss", "energy_temple_blaster_room", - self.energy_temple_boss, - self.energy_temple_blaster_room) # Need Nature form, Bind form and energy form - self.__connect_regions("energy_temple_1_", "energy_temple_blaster_room", - self.energy_temple_1, - self.energy_temple_blaster_room) # Need Nature form, Bind form, energy form and Beast form - self.__connect_regions("home_water", "openwater_tl", - self.home_water, - self.openwater_tl) # Need Bind song and energy form one-way + self.__connect_regions("Verse cave", "Home water", self.verse_cave_l, self.home_water) + self.__connect_regions("Home Water", "Haija's home", self.home_water, self.naija_home) + self.__connect_regions("Home Water", "Song cave", self.home_water, self.song_cave) + self.__connect_regions("Home Water", "home_water_nautilus", + self.home_water, self.home_water_nautilus, + lambda state: _has_energy_form(state, self.player)) # Need energy form# ToDo: Remove + self.__connect_regions("Song cave", "Song cave Anemone", + self.song_cave, self.song_cave_anemone, + lambda state: _has_nature_form(state, self.player)) # Need Nature Form # ToDo: Remove + self.__connect_regions("Home Water", "Energy temple first area", + self.home_water, self.energy_temple_1, + lambda state: _has_bind_song(state, self.player)) # Need bind song + self.__connect_regions("Home Water", "Energy temple_altar", + self.home_water, self.energy_temple_altar, + lambda state: _has_energy_form(state, self.player)) # Need energy form + self.__connect_regions("Energy temple first area", "Energy temple second area", + self.energy_temple_1, self.energy_temple_2, + lambda state: _has_energy_form(state, self.player)) # Need energy form + self.__connect_regions("Energy temple first area", "Energy temple idol room", + self.energy_temple_1, self.energy_temple_idol, + lambda state: _has_fish_form(state, self.player)) # Need Fish form + self.__connect_regions("Energy temple idol room", "Energy temple boss area", + self.energy_temple_idol, self.energy_temple_boss, + lambda state: _has_energy_form(state, self.player)) # Need Energy form + self.__connect_one_way_regions("Energy temple first area", "Energy temple boss area", + self.energy_temple_1, self.energy_temple_boss, + lambda state: _has_beast_form(state, self.player) and + _has_energy_form(state, + self.player)) # Need Beast forma and Energy form + self.__connect_one_way_regions("Energy temple boss area", "Energy temple first area", + self.energy_temple_boss, self.energy_temple_1, + lambda state: _has_energy_form(state, self.player)) # Need Energy form + self.__connect_regions("Energy temple second area", "Energy temple third area", + self.energy_temple_2, self.energy_temple_3, + lambda state: _has_bind_song(state, self.player) and + _has_energy_form(state, self.player)) # Need Bind form and Energy form + self.__connect_regions("Energy temple boss area", "Energy temple blaster room", + self.energy_temple_boss, self.energy_temple_blaster_room, + lambda state: _has_nature_form(state, self.player) and + _has_bind_song(state, self.player) and + _has_energy_form(state, + self.player)) # Need Nature form, Bind form and energy form + self.__connect_regions("Energy temple first area", "Energy temple_blaster_room", + self.energy_temple_1, self.energy_temple_blaster_room, + lambda state: _has_nature_form(state, self.player) and + _has_bind_song(state, self.player) and + _has_energy_form(state, self.player) and + _has_beast_form(state, + self.player)) # Need Nature form, Bind form, energy form and Beast form + self.__connect_regions("Home Water", "Open water top left area", + self.home_water, self.openwater_tl, + lambda state: _has_bind_song(state, self.player) and + _has_energy_form(state, self.player)) # Need Bind song and energy form def __connect_open_water_regions(self): """ Connect entrances of the different regions around open water """ - self.__connect_regions("openwater_tl", "openwater_tr", + self.__connect_regions("Open water top left area", "Open water top right area", self.openwater_tl, self.openwater_tr) - self.__connect_regions("openwater_tl", "openwater_bl", + self.__connect_regions("Open water top left area", "Open water bottom left area", self.openwater_tl, self.openwater_bl) - self.__connect_regions("openwater_tl", "forest_br", + self.__connect_regions("Open water top left area", "forest bottom right area", self.openwater_tl, self.forest_br) - self.__connect_regions("openwater_tr", "openwater_tr_turtle", - self.openwater_tr, - self.openwater_tr_turtle) # Beast form needed - self.__connect_regions("openwater_tr", "openwater_br", + self.__connect_regions("Open water top right area", "Open water top right area, turtle room", + self.openwater_tr, self.openwater_tr_turtle, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_one_way_regions("Open water top right area", "Open water top right area_urns", + self.openwater_tr, self.openwater_tr_urns, + lambda state: _has_damaging_item(state, self.player)) + self.__connect_one_way_regions("Open water top right area_urns", "Open water top right area", + self.openwater_tr_urns, self.openwater_tr) + self.__connect_regions("Open water top right area", "Open water bottom right", self.openwater_tr, self.openwater_br) - self.__connect_regions("openwater_tr", "mithalas_city", + self.__connect_regions("Open water top right area", "Mithalas city", self.openwater_tr, self.mithalas_city) - self.__connect_regions("openwater_tr", "veil_bl", + self.__connect_regions("Open water top right area", "Veil bottom left area", self.openwater_tr, self.veil_bl) - self.__connect_regions("openwater_tr", "veil_br", - self.openwater_tr, - self.veil_br) # Beast form needed for one way - self.__connect_regions("openwater_bl", "openwater_br", + self.__connect_one_way_regions("Open water top right area", "Veil bottom right", + self.openwater_tr, self.veil_br, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_one_way_regions("Veil bottom right", "Open water top right area", + self.veil_br, self.openwater_tr, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_regions("Open water bottom left area", "Open water bottom right", self.openwater_bl, self.openwater_br) - self.__connect_regions("openwater_bl", "skeleton_path", + self.__connect_regions("Open water bottom left area", "skeleton_path", self.openwater_bl, self.skeleton_path) - self.__connect_regions("openwater_bl", "abyss_l", + self.__connect_regions("Open water bottom left area", "Abyss left area", self.openwater_bl, self.abyss_l) - self.__connect_regions("openwater_bl", "openwater_bl_fp", - self.openwater_bl, - self.openwater_bl_fp) # Fish form + self.__connect_regions("Open water bottom left area", "Open water_bl_fp", + self.openwater_bl, self.openwater_bl_fp, + lambda state: _has_fish_form(state, self.player)) # Fish form self.__connect_regions("skeleton_path", "skeleton_path_sc", - self.skeleton_path, - self.skeleton_path_sc) # Spirit form needed - self.__connect_regions("openwater_br", "abyss_r", + self.skeleton_path, self.skeleton_path_sc, + lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + self.__connect_regions("Open water bottom right", "Abyss right area", self.openwater_br, self.abyss_r) - self.__connect_regions("openwater_br", "arnassi", - self.openwater_br, - self.arnassi) # Beast form needed for one-way - self.__connect_regions("arnassi", "arnassi_path", + self.__connect_one_way_regions("Open water bottom right", "Arnassi", + self.openwater_br, self.arnassi, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_one_way_regions("Arnassi", "Open water bottom right", + self.arnassi, self.openwater_br) + self.__connect_regions("Arnassi", "Arnassi path", self.arnassi, self.arnassi_path) - self.__connect_regions("arnassi_path", "arnassi_crab_boss", - self.arnassi_path, - self.arnassi_crab_boss) # Beast form needed for one-way - self.__connect_regions("arnassi_path", "simon", - self.arnassi_path, - self.simon) # Fish form needed + self.__connect_one_way_regions("Arnassi path", "Arnassi crab boss area", + self.arnassi_path, self.arnassi_crab_boss, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_one_way_regions("Arnassi crab boss area", "Arnassi path", + self.arnassi_crab_boss, self.arnassi_path) + self.__connect_regions("Arnassi path", "simon", self.arnassi_path, self.simon, + lambda state: _has_fish_form(state, self.player)) # Fish form needed def __connect_mithalas_regions(self): """ Connect entrances of the different regions around Mithalas """ - self.__connect_regions("mithalas_city", "mithalas_city_urns", - self.mithalas_city, - self.mithalas_city_urns) # Energy form needed one-way - self.__connect_regions("mithalas_city", "mithalas_city_top_path", - self.mithalas_city, - self.mithalas_city_top_path) # Beast form needed one-way - self.__connect_regions( - "mithalas_city_top_path", "mithalas_city_top_path_urn", - self.mithalas_city_top_path, - self.mithalas_city_top_path_urn) # Energy form needed - self.__connect_regions("mithalas_city", "mithalas_city_fishpass", - self.mithalas_city, - self.mithalas_city_fishpass) # Fish form needed - self.__connect_regions("mithalas_city", "cathedral_l", - self.mithalas_city, - self.cathedral_l) # Fish form needed - self.__connect_regions("mithalas_city_top_path", "cathedral_l_tube", - self.mithalas_city_top_path, - self.cathedral_l_tube) # Nature form needed Enlever le courrant - self.__connect_regions("cathedral_l_tube", "cathedral_l_sc", - self.cathedral_l_tube, - self.cathedral_l_sc) # spirit form needed - self.__connect_regions("cathedral_l_tube", "cathedral_l", - self.cathedral_l_tube, - self.cathedral_l) # spirit form needed - self.__connect_regions("cathedral_l", "cathedral_l_sc", - self.cathedral_l, - self.cathedral_l_sc) # spirit form needed - self.__connect_regions("cathedral_l", "cathedral_l_urns", - self.cathedral_l, - self.cathedral_l_urns) # energy form needed - self.__connect_regions("cathedral_l", "cathedral_boss_l", - self.cathedral_l, - self.cathedral_boss_l) # beast form needed and Location mithalas boss needed - self.__connect_regions("cathedral_l", "cathedral_underground", - self.cathedral_l, - self.cathedral_underground) # beast form and bind song needed - self.__connect_regions("cathedral_l", "cathedral_r", - self.cathedral_l, - self.cathedral_r) # bind song and energy form needed - self.__connect_regions("cathedral_r", "cathedral_underground", - self.cathedral_r, - self.cathedral_underground) # energy form needed - self.__connect_regions("cathedral_underground", "cathedral_boss_l", - self.cathedral_underground, - self.cathedral_boss_l) # bind song and energy form needed one side - self.__connect_regions("cathedral_boss_r", "cathedral_boss_l", - self.cathedral_boss_r, - self.cathedral_boss_l) # bind song and energy form needed one-way + self.__connect_one_way_regions("Mithalas city", "Mithalas city_urns", + self.mithalas_city, self.mithalas_city_urns, + lambda state: _has_energy_form(state, self.player)) # Energy form needed + self.__connect_one_way_regions("Mithalas city_urns", "Mithalas city", + self.mithalas_city_urns, self.mithalas_city) + self.__connect_one_way_regions("Mithalas city", "Mithalas city_top_path", + self.mithalas_city, self.mithalas_city_top_path, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_one_way_regions("Mithalas city_top_path", "Mithalas city", + self.mithalas_city_top_path, self.mithalas_city) + self.__connect_regions("Mithalas city_top_path", "Mithalas city_top_path_urn", + self.mithalas_city_top_path, self.mithalas_city_top_path_urn, + lambda state: _has_energy_form(state, self.player)) # Energy form needed + self.__connect_regions("Mithalas city", "Mithalas city home with fishpass", + self.mithalas_city, self.mithalas_city_fishpass, + lambda state: _has_fish_form(state, self.player)) # Fish form needed + self.__connect_regions("Mithalas city", "Cathedral left area", + self.mithalas_city, self.cathedral_l, + lambda state: _has_fish_form(state, self.player)) # Fish form needed + self.__connect_one_way_regions("Mithalas city top path", "Cathedral left area, flower tube", + self.mithalas_city_top_path, + self.cathedral_l_tube, + lambda state: _has_nature_form(state, self.player)) # Nature form + self.__connect_one_way_regions("Cathedral left area, flower tube area", "Mithalas city top path", + self.cathedral_l_tube, + self.mithalas_city_top_path, + lambda state: _has_beast_form(state, self.player) and + _has_nature_form(state, self.player)) # Nature form + self.__connect_regions("Cathedral left area flower tube area", "Cathedral left area, spirit crystals", + self.cathedral_l_tube, self.cathedral_l_sc, + lambda state: _has_spirit_form(state, self.player)) # spirit form needed + self.__connect_regions("Cathedral left area_flower tube area", "Cathedral left area", + self.cathedral_l_tube, self.cathedral_l, + lambda state: _has_spirit_form(state, self.player)) # spirit form needed + self.__connect_regions("Cathedral left area", "Cathedral left area, spirit crystals", + self.cathedral_l, self.cathedral_l_sc, + lambda state: _has_spirit_form(state, self.player)) # spirit form needed + self.__connect_regions("Cathedral left area", "Cathedral left area urns", + self.cathedral_l, self.cathedral_l_urns, + lambda state: _has_energy_form(state, self.player)) # energy form needed + self.__connect_regions("Cathedral left area", "Cathedral boss left area", + self.cathedral_l, self.cathedral_boss_l) # ToDo: beast form needed and Location mithalas boss needed + self.__connect_regions("Cathedral left area", "Cathedral underground", + self.cathedral_l, self.cathedral_underground, + lambda state: _has_beast_form(state, self.player) and + _has_bind_song(state, self.player)) # beast form and bind song needed + self.__connect_regions("Cathedral left area", "Cathedral right area", + self.cathedral_l, self.cathedral_r, + lambda state: _has_bind_song(state, self.player) and + _has_energy_form(state, self.player)) # bind song and energy form needed + self.__connect_regions("Cathedral right area", "Cathedral underground", + self.cathedral_r, self.cathedral_underground, + lambda state: _has_energy_form(state, self.player)) # energy form needed + self.__connect_one_way_regions("Cathedral underground", "Cathedral boss left area", + self.cathedral_underground, self.cathedral_boss_r, + lambda state: _has_energy_form(state, self.player)) # bind song and energy form needed + self.__connect_one_way_regions("Cathedral boss left area", "Cathedral underground", + self.cathedral_boss_r, self.cathedral_underground, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_one_way_regions("Cathedral boss right area", "Cathedral boss left area", + self.cathedral_boss_r, self.cathedral_boss_l, + lambda state: _has_bind_song(state, self.player) and + _has_energy_form(state, self.player)) # bind song and energy form + self.__connect_one_way_regions("Cathedral boss left area", "Cathedral boss right area", + self.cathedral_boss_l, self.cathedral_boss_r) def __connect_forest_regions(self): """ Connect entrances of the different regions around the Kelp Forest """ - self.__connect_regions("forest_br", "forest_br_ship", - self.forest_br, - self.forest_br_ship) # Sun form needed - self.__connect_regions("forest_br", "veil_bl", + self.__connect_regions("forest bottom right", "forest_br_ship", + self.forest_br, self.forest_br_ship, + lambda state: _has_sun_form(state, self.player)) # Sun form needed + self.__connect_regions("Forest bottom right", "Veil bottom left area", self.forest_br, self.veil_bl) - self.__connect_regions("forest_br", "forest_bl", + self.__connect_regions("Forest bottom right", "Forest bottom left area", self.forest_br, self.forest_bl) - self.__connect_regions("forest_br", "forest_tr", + self.__connect_regions("Forest bottom right", "Forest top right area", self.forest_br, self.forest_tr) - self.__connect_regions("forest_bl", "forest_bl_sc", - self.forest_bl, - self.forest_bl_sc) # spirit form needed - self.__connect_regions("forest_bl", "forest_fish_cave", + self.__connect_regions("Forest bottom left area", "Forest bottom left area, spirit crystals", + self.forest_bl, self.forest_bl_sc, + lambda state: _has_spirit_form(state, self.player)) # spirit form needed + self.__connect_regions("Forest bottom left area", "Forest fish cave", self.forest_bl, self.forest_fish_cave) - self.__connect_regions("forest_bl", "forest_tl", + self.__connect_regions("Forest bottom left area", "Forest top left area", self.forest_bl, self.forest_tl) - self.__connect_regions("forest_bl", "forest_boss_entrance", - self.forest_bl, - self.forest_boss_entrance) # Nature form needed - self.__connect_regions("forest_tl", "forest_tl_fp", - self.forest_tl, - self.forest_tl_fp) # Nature form, Bind song, Energy form and Fish form needed - self.__connect_regions("forest_tl", "forest_tr", + self.__connect_regions("Forest bottom left area", "Forest boss entrance", + self.forest_bl, self.forest_boss_entrance, + lambda state: _has_nature_form(state, self.player)) # Nature form needed + self.__connect_regions("Forest top left area", "Forest top left area, fish pass", + self.forest_tl, self.forest_tl_fp, + lambda state: _has_nature_form(state, self.player) and + _has_bind_song(state, self.player) and + _has_energy_form(state, self.player) and + _has_fish_form(state, self.player)) # Nature form, Bind song, Energy form and Fish form needed + self.__connect_regions("Forest top left area", "Forest top right area", self.forest_tl, self.forest_tr) - self.__connect_regions("forest_tl", "forest_boss_entrance", + self.__connect_regions("Forest top left area", "Forest boss entrance", self.forest_tl, self.forest_boss_entrance) - self.__connect_regions("forest_boss", "forest_boss_entrance", - self.forest_boss, - self.forest_boss_entrance) # Energy form needed - self.__connect_regions("forest_tr", "forest_tr_dark", - self.forest_tr, - self.forest_tr_dark) # Sun form needed - self.__connect_regions("forest_tr", "forest_tr_fp", - self.forest_tr, - self.forest_tr_fp) # Fish form needed - self.__connect_regions("forest_tr", "forest_sprite_cave", + self.__connect_regions("Forest boss area", "Forest boss entrance", + self.forest_boss, self.forest_boss_entrance, + lambda state: _has_energy_form(state, self.player)) # Energy form needed + self.__connect_regions("Forest top right area", "Forest top right area dark place", + self.forest_tr, self.forest_tr_dark, + lambda state: _has_sun_form(state, self.player)) # Sun form needed + self.__connect_regions("Forest top right area", "Forest top right area fish pass", + self.forest_tr, self.forest_tr_fp, + lambda state: _has_fish_form(state, self.player)) # Fish form needed + self.__connect_regions("Forest top right area", "Forest sprite cave", self.forest_tr, self.forest_sprite_cave) - self.__connect_regions("forest_sprite_cave", "forest_sprite_cave_tube", - self.forest_sprite_cave, - self.forest_sprite_cave_tube) # Nature form needed - self.__connect_regions("forest_tr", "mermog_cave", + self.__connect_regions("Forest sprite cave", "Forest sprite cave flower tube", + self.forest_sprite_cave, self.forest_sprite_cave_tube, + lambda state: _has_nature_form(state, self.player)) # Nature form needed + self.__connect_regions("Forest top right area", "Mermog cave", self.forest_tr_fp, self.mermog_cave) - self.__connect_regions("mermog_cave", "mermog_boss", - self.mermog_cave, - self.mermog_boss) # Beast form and energy form needed + self.__connect_regions("Fermog cave", "Fermog boss", + self.mermog_cave, self.mermog_boss, + lambda state: _has_beast_form(state, self.player) and + _has_energy_form(state, self.player)) # Beast form and energy form needed def __connect_veil_regions(self): """ Connect entrances of the different regions around The Veil """ - self.__connect_regions("veil_bl", "veil_bl_fp", - self.veil_bl, - self.veil_bl_fp) # Fish form, bind song and Energy form needed - self.__connect_regions("veil_bl", "veil_b_sc", - self.veil_bl, - self.veil_b_sc) # Spirit form needed - self.__connect_regions("veil_b_sc", "veil_br", - self.veil_b_sc, - self.veil_br) # Spirit form needed - self.__connect_regions("veil_br", "veil_tl", - self.veil_br, self.veil_tl) # Beast form needed - self.__connect_regions("veil_tl", "veil_tl_fp", - self.veil_tl, - self.veil_tl_fp) # Fish form needed - self.__connect_regions("veil_tl", "veil_tl_rock", - self.veil_tl, - self.veil_tl_rock) # Bind song needed - self.__connect_regions("veil_tl", "veil_tr_r", + self.__connect_regions("Veil bottom left area", "Veil bottom left area, fish pass", + self.veil_bl, self.veil_bl_fp, + lambda state: _has_fish_form(state, self.player) and + _has_bind_song(state, self.player) and + _has_energy_form(state, self.player)) # Fish form, bind song and Energy form needed + self.__connect_regions("Veil bottom left area", "Veil bottom area spirit crystals path", + self.veil_bl, self.veil_b_sc, + lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + self.__connect_regions("Veil bottom area spirit crystals path", "Veil bottom right", + self.veil_b_sc, self.veil_br, + lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + self.__connect_regions("Veil bottom right", "Veil top left area", + self.veil_br, self.veil_tl, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_regions("Veil top left area", "Veil_top left area, fish pass", + self.veil_tl, self.veil_tl_fp, + lambda state: _has_fish_form(state, self.player)) # Fish form needed + self.__connect_regions("Veil top left area", "Veil_top left area, under the rock", + self.veil_tl, self.veil_tl_rock, + lambda state: _has_bind_song(state, self.player)) # Bind song needed + self.__connect_regions("Veil top left area", "Veil right of sun temple", self.veil_tl, self.veil_tr_r) - self.__connect_regions("veil_tl", "turtle_cave", + self.__connect_regions("Veil top left area", "Turtle cave", self.veil_tl, self.turtle_cave) - self.__connect_regions("turtle_cave", "turtle_cave_rocks", - self.turtle_cave, - self.turtle_cave_rocks) # Bind song needed - self.__connect_regions("turtle_cave", "turtle_cave_bubble", - self.turtle_cave, - self.turtle_cave_bubble) # Beast form needed - self.__connect_regions("veil_tr_r", "sun_temple_r", + self.__connect_regions("Turtle cave", "Turtle cave under the rocks", + self.turtle_cave, self.turtle_cave_rocks, + lambda state: _has_bind_song(state, self.player)) # Bind song needed + self.__connect_regions("Turtle cave", "Turtle cave bubble cliff", + self.turtle_cave, self.turtle_cave_bubble, + lambda state: _has_beast_form(state, self.player)) # Beast form needed + self.__connect_regions("Veil right of sun temple", "Sun temple right area", self.veil_tr_r, self.sun_temple_r) - self.__connect_regions("sun_temple_r", "sun_temple_l", - self.sun_temple_r, - self.sun_temple_l) # bind song needed - self.__connect_regions("sun_temple_l", "veil_tr_l", + self.__connect_regions("Sun temple right area", "Sun temple left area", + self.sun_temple_r, self.sun_temple_l, + lambda state: _has_bind_song(state, self.player)) # bind song needed + self.__connect_regions("Sun temple left area", "Veil left of top sun temple", self.sun_temple_l, self.veil_tr_l) - self.__connect_regions("sun_temple_l", "sun_temple_boss_lb", + self.__connect_regions("Sun temple left area", "Sun temple_boss left bottom area", self.sun_temple_l, self.sun_temple_boss_lb) - self.__connect_one_way_regions( - "sun_temple_boss_lb", "sun_temple_boss_lt", - self.turtle_cave_bubble, self.turtle_cave_top_bubble, - lambda state: __has_hot_soup(state, self.player) - # Beast form needed - ) - - self.__connect_one_way_regions("sun_temple_boss_lt", "sun_temple_boss_lb", - self.sun_temple_boss_lt, - self.sun_temple_boss_lb) - self.__connect_regions("sun_temple_boss_lb", "sun_temple_boss_r", - self.sun_temple_boss_lb, - self.sun_temple_boss_r) # Energy form needed - self.__connect_one_way_regions("sun_temple_boss_r", "veil_tr_l", + self.__connect_one_way_regions("Sun temple_boss left bottom area", "Sun temple_boss top of left area", + self.sun_temple_boss_lb, self.sun_temple_boss_lt, + lambda state: _has_hot_soup(state, self.player) and + _has_beast_form(state, self.player))# Beast form needed + self.__connect_one_way_regions("Sun temple_boss top of left area", "Sun temple_boss left bottom area", + self.sun_temple_boss_lt, self.sun_temple_boss_lb) + self.__connect_regions("Sun temple_boss left bottom area", "Sun temple_boss right area", + self.sun_temple_boss_lb, self.sun_temple_boss_r, + lambda state: _has_energy_form(state, self.player)) # Energy form needed + self.__connect_one_way_regions("Sun temple_boss right area", "Veil left of sun temple", self.sun_temple_boss_r, self.veil_tr_l) + self.__connect_one_way_regions( "Turtle cave bubble cliff", "Turtle cave top bubble", + self.turtle_cave_bubble, self.turtle_cave_top_bubble, + lambda state: _has_hot_soup(state, self.player) and + _has_beast_form(state, self.player)) # Beast form needed self.__connect_one_way_regions( - "turtle_cave_bubble", "turtle_cave_top_bubble", - self.turtle_cave_bubble, self.turtle_cave_top_bubble, - lambda state: __has_hot_soup(state, self.player) - # Beast form needed - ) - self.__connect_one_way_regions( - "turtle_cave_top_bubble", "turtle_cave_bubble", + "Turtle cave top bubble", "Turtle cave bubble cliff", self.turtle_cave_top_bubble, self.turtle_cave_bubble) - self.__connect_one_way_regions( - "veil_tr_l", "veil_tr_water_fall", - self.veil_tr_l, self.veil_tr_water_fall, - lambda state: __has_hot_soup(state, self.player) - # Beast form needed - ) - self.__connect_one_way_regions("veil_tr_water_fall", "veil_tr_l", + self.__connect_one_way_regions("Veil left of sun temple", "Veil left of sun temple, water fall", + self.veil_tr_l, self.veil_tr_water_fall, + lambda state: _has_hot_soup(state, self.player) and + _has_beast_form(state, self.player))# Beast form needed + self.__connect_one_way_regions("Veil left of sun temple, water fall", "Veil left of sun temple", self.veil_tr_water_fall, self.veil_tr_l) - - self.__connect_regions("veil_tr_l", "octo_cave_t", - self.veil_tr_l, - self.octo_cave_t) # Fish, sun and beast form form needed - self.__connect_regions("veil_tr_l", "octo_cave_b", - self.veil_tr_l, - self.octo_cave_b) # Fish form needed + self.__connect_regions("Veil left of sun temple", "Octo cave top path", + self.veil_tr_l, self.octo_cave_t, + lambda state: _has_fish_form(state, self.player) and + _has_sun_form(state, self.player) and + _has_beast_form(state, self.player)) # Fish, sun and beast form needed + self.__connect_regions("Veil left of sun temple", "Octo cave bottom path", + self.veil_tr_l, self.octo_cave_b, + lambda state: _has_fish_form(state, self.player)) # Fish form needed def __connect_abyss_regions(self): """ Connect entrances of the different regions around The Abyss """ - self.__connect_regions("abyss_l", "abyss_lb", - self.abyss_l, - self.abyss_lb) # Nature form needed - self.__connect_regions("abyss_lb", "abyss_l_fp", - self.abyss_lb, - self.abyss_l_fp) # Fish form needed - self.__connect_regions("abyss_lb", "sunken_city_r", - self.abyss_lb, self.sunken_city_r) # Li needed - self.__connect_regions( - "abyss_lb", "body_c", - self.abyss_lb, self.body_c, - lambda state: __has_tongue_cleared(state, self.player)) - self.__connect_regions("abyss_l", "king_jellyfish_cave", - self.abyss_l, - self.king_jellyfish_cave) # Energy form needed - self.__connect_regions("abyss_l", "abyss_r", + self.__connect_regions("Abyss left area", "Abyss bottom of left area", + self.abyss_l, self.abyss_lb, + lambda state: _has_nature_form(state, self.player)) # Nature form needed + self.__connect_regions("Abyss bottom of left area", "Abyss left area, fish pass", + self.abyss_lb, self.abyss_l_fp, + lambda state: _has_fish_form(state, self.player)) # Fish form needed + self.__connect_regions("Abyss left bottom area", "Sunken city right area", + self.abyss_lb, self.sunken_city_r, + lambda state: _has_li(state, self.player)) # Li needed + self.__connect_regions( "Abyss left bottom area", "Body center area", + self.abyss_lb, self.body_c, + lambda state: _has_tongue_cleared(state, self.player)) + self.__connect_regions("Abyss left area", "king_jellyfish_cave", + self.abyss_l, self.king_jellyfish_cave, + lambda state: _has_energy_form(state, self.player)) # Energy form needed + self.__connect_regions("Abyss left area", "Abyss right area", self.abyss_l, self.abyss_r) - self.__connect_regions("abyss_r", "whale", - self.abyss_r, - self.whale) # Spirit form and sun form needed - self.__connect_regions("abyss_r", "ice_cave", - self.abyss_r, - self.ice_cave) # Spirit form needed - self.__connect_regions("abyss_r", "bubble_cave", - self.abyss_r, - self.bubble_cave) # Beast form needed + self.__connect_regions("Abyss right area", "whale", + self.abyss_r, self.whale, + lambda state: _has_spirit_form(state, self.player) and + _has_sun_form(state, self.player)) # Spirit form and sun form needed + self.__connect_regions("Abyss right area", "ice_cave", + self.abyss_r, self.ice_cave, + lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + self.__connect_regions("Abyss right area", "bubble_cave", + self.abyss_r, self.bubble_cave, + lambda state: _has_beast_form(state, self.player)) # Beast form needed def __connect_sunken_city_regions(self): """ Connect entrances of the different regions around The Sunken City """ - self.__connect_regions("sunken_city_r", "sunken_city_l", + self.__connect_regions("Sunken city right area", + "Sunken city left area", self.sunken_city_r, self.sunken_city_l) - self.__connect_regions("sunken_city_l", "sunken_city_l_bedroom", - self.sunken_city_l, - self.sunken_city_l_bedroom) # Spirit form needed - self.__connect_regions("sunken_city_l", "sunken_city_boss", + self.__connect_regions("Sunken city left area", "Sunken city bedroom", + self.sunken_city_l, self.sunken_city_l_bedroom, + lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + self.__connect_regions("Sunken city left area", "Sunken city boss area", self.sunken_city_l, self.sunken_city_boss) def __connect_body_regions(self): """ Connect entrances of the different regions around The body """ - self.__connect_regions("body_c", "body_l", + self.__connect_regions("Body center area", "Body left area", self.body_c, self.body_l) - self.__connect_regions("body_c", "body_rt", + self.__connect_regions("Body center area", "Body right area top path", self.body_c, self.body_rt) - self.__connect_regions("body_c", "body_rb", + self.__connect_regions("Body center area", "Body right area bottom path", self.body_c, self.body_rb) - self.__connect_regions("body_c", "body_b", + self.__connect_regions("Body center area", "Body bottom area", self.body_c, self.body_b, - lambda state: - __has_body_doors_opened(state, self.player)) - self.__connect_regions("body_b", "final_boss", + lambda state: _has_body_doors_opened(state, self.player)) + self.__connect_regions("Body bottom area", "Final boss area", self.body_b, self.final_boss, - lambda state: - __has_body_doors_opened(state, self.player)) - self.__connect_regions("final_boss", "final_boss_tube", - self.final_boss, - self.final_boss_tube) # Nature form needed - self.__connect_one_way_regions("final_boss", "final_boss_3_form", - self.final_boss, - self.final_boss_3_form) # Need final boss conditions - self.__connect_one_way_regions("final_boss_3_form", "final_boss_end", - self.final_boss_3_form, - self.final_boss_end) + lambda state: _has_body_doors_opened(state, self.player)) + self.__connect_regions("Final boss area", "Final boss tube", + self.final_boss, self.final_boss_tube, + lambda state: _has_nature_form(state, self.player)) # Nature form needed + self.__connect_one_way_regions("Final boss area", "Final boss third form area", + self.final_boss, self.final_boss_3_form) # ToDo: Need final boss conditions + self.__connect_one_way_regions("final boss third form area", "final boss end", + self.final_boss_3_form, self.final_boss_end) def connect_regions(self): """ @@ -911,7 +873,7 @@ def connect_regions(self): self.__connect_sunken_city_regions() self.__connect_body_regions() - def __add_event_location(self, region:Region, name: str, event_name: str): + def __add_event_location(self, region: Region, name: str, event_name: str): """ Add an event to the `region` with the name `name` and the item `event_name` @@ -921,10 +883,10 @@ def __add_event_location(self, region:Region, name: str, event_name: str): ) region.locations.append(location) location.place_locked_item(AquariaItem(event_name, - ItemClassification.progression, None, + ItemClassification.progression, + None, self.player)) - def add_event_locations(self): """ Add every events (locations and items) to the `world` @@ -1103,66 +1065,3 @@ def __init__(self, world: MultiWorld, player: int): self.__create_abyss() self.__create_sunken_city() self.__create_body() - - -# Every condition to connect regions - -def __has_hot_soup(state, player) -> bool: - """`player` in `state` has the hotsoup item""" - return state.has("Hot soup", player) - - -def __has_tongue_cleared(state, player) -> bool: - """`player` in `state` has the Body tongue cleared item""" - return state.has("Body tongue cleared", player) - - -def __has_body_doors_opened(state, player) -> bool: - """`player` in `state` has the 4 body doors opened item""" - return state.has("Body door 1 opened", player) and \ - state.has("Body door 2 opened", player) and \ - state.has("Body door 3 opened", player) and \ - state.has("Body door 4 opened", player) - - -def __has_li(state, player) -> bool: - """`player` in `state` has Li in it's team""" - return state.has("Li and Li song", player) - - -def __has_shield_song(state, player) -> bool: - """`player` in `state` has the shield song item""" - return state.has("Shield song", player) - - -def __has_bind_song(state, player) -> bool: - """`player` in `state` has the bind song item""" - return state.has("Bind song", player) - -def __has_energy_form(state, player) -> bool: - """`player` in `state` has the energy form item""" - return state.has("Energy Form", player) - -def __has_beast_form(state, player) -> bool: - """`player` in `state` has the beast form item""" - return state.has("Beast Form", player) - -def __has_nature_form(state, player) -> bool: - """`player` in `state` has the nature form item""" - return state.has("Nature Form", player) - -def __has_sun_form(state, player) -> bool: - """`player` in `state` has the sun form item""" - return state.has("Sun Form", player) - -def __has_dual_form(state, player) -> bool: - """`player` in `state` has the dual form item""" - return state.has("Dual Form", player) - -def __has_fish_form(state, player) -> bool: - """`player` in `state` has the fish form item""" - return state.has("Fish Form", player) - -def __has_spirit_form(state, player) -> bool: - """`player` in `state` has the spirit form item""" - return state.has("Spirit Form", player) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index b2c7b871eb2..a51cebb346d 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -69,6 +69,13 @@ class AquariaWorld(World): {name: data[0] 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", "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" From 56158724002447a362342783426734f35c2ee508 Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 25 Mar 2024 16:19:57 -0400 Subject: [PATCH 07/56] Massive code refactoring --- worlds/aquaria/Items.py | 251 +++++++------ worlds/aquaria/Locations.py | 91 +---- worlds/aquaria/Options.py | 39 +- worlds/aquaria/Regions.py | 686 +++++++++++++++++++----------------- worlds/aquaria/__init__.py | 57 ++- 5 files changed, 591 insertions(+), 533 deletions(-) diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index 75f11db0294..ff05c0846a7 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -49,131 +49,130 @@ def __init__(self, name: str, classification: ItemClassification, """Information data for every (not event) item.""" item_table = { # name: ID, Nb, Item Type, Item Group - "Anemone": (698000, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Arnassi statue": (698001, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Big seed": (698002, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Glowing seed": (698003, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Black pearl": (698004, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Baby blaster": (698005, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "Crab armor": (698006, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "Baby dumbo": (698007, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "Tooth": (698008, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Energy statue": (698009, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Krotite armor": (698010, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Golden starfish": (698011, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Golden gear": (698012, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Jelly beacon": (698013, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Jelly costume": (698014, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "Jelly plant": (698015, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Mithalas doll": (698016, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Mithalan dress": (698017, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Mithalas banner": (698018, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Mithalas pot": (698019, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Mutant costume": (698020, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Baby nautilus": (698021, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "Baby piranha": (698022, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "Arnassi Armor": (698023, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "Seed bag": (698024, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "King's Skull": (698025, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Song plant spore": (698026, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Stone head": (698027, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Sun key": (698028, 1, ItemType.NORMAL, ItemGroup.COLLECTIBLE), - "Girl costume": (698029, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Odd container": (698030, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Trident": (698031, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Turtle egg": (698032, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Jelly egg": (698033, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Urchin costume": (698034, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Baby walker": (698035, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), - "Vedha's Cure-All-All": (698036, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Zuuna's perogi": (698037, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Arcane poultice": (698038, 7, ItemType.NORMAL, ItemGroup.RECIPE), - "Berry ice cream": (698039, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Buttery sea loaf": (698040, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Cold borscht": (698041, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Cold soup": (698042, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Crab cake": (698043, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Divine soup": (698044, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Dumbo ice cream": (698045, 3, ItemType.NORMAL, ItemGroup.RECIPE), - "Eel oil": (698046, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Fish meat": (698047, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Fish oil": (698048, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Glowing egg": (698049, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Hand roll": (698050, 5, ItemType.NORMAL, ItemGroup.RECIPE), - "Healing poultice": (698051, 4, ItemType.NORMAL, ItemGroup.RECIPE), - "Hearty soup": (698052, 5, ItemType.NORMAL, ItemGroup.RECIPE), - "Hot borscht": (698053, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Hot soup": (698054, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), - "Ice cream": (698055, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Leadership roll": (698056, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Leaf poultice": (698057, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), - "Leeching poultice": (698058, 4, ItemType.NORMAL, ItemGroup.RECIPE), - "Legendary cake": (698059, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Loaf of life": (698060, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Long life soup": (698061, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Magic soup": (698062, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Mushroom x 2": (698063, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Perogi": (698064, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Plant leaf": (698065, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Plump perogi": (698066, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Poison loaf": (698067, 1, ItemType.JUNK, ItemGroup.RECIPE), - "Poison soup": (698068, 1, ItemType.JUNK, ItemGroup.RECIPE), - "Rainbow mushroom": (698069, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Rainbow soup": (698070, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Red berry": (698071, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Red bulb x 2": (698072, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Rotten cake": (698073, 1, ItemType.JUNK, ItemGroup.RECIPE), - "Rotten loaf x 8": (698074, 1, ItemType.JUNK, ItemGroup.RECIPE), - "Rotten meat": (698075, 5, ItemType.JUNK, ItemGroup.INGREDIENT), - "Royal soup": (698076, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Sea cake": (698077, 4, ItemType.NORMAL, ItemGroup.RECIPE), - "Sea loaf": (698078, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Shark fin soup": (698079, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Sight poultice": (698080, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Small bone x 2": (698081, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Small egg": (698082, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Small tentacle x 2": (698083, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Special bulb": (698084, 5, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Special cake": (698085, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Spicy meat x 2": (698086, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Spicy roll": (698087, 11, ItemType.NORMAL, ItemGroup.RECIPE), - "Spicy soup": (698088, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Spider roll": (698089, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Swamp cake": (698090, 3, ItemType.NORMAL, ItemGroup.RECIPE), - "Tasty cake": (698091, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Tasty roll": (698092, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Tough cake": (698093, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Turtle soup": (698094, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Vedha sea crisp": (698095, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Veggie cake": (698096, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Veggie ice cream": (698097, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Veggie soup": (698098, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Volcano roll": (698099, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Health upgrade": (698100, 5, ItemType.NORMAL, ItemGroup.HEALTH), - "Wok": (698101, 1, ItemType.NORMAL, ItemGroup.UTILITY), - "Eel oil x 2": (698102, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Fish meat x 2": (698103, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Fish oil x 3": (698104, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Glowing egg x 2": (698105, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Healing poultice x 2": (698106, 2, ItemType.NORMAL, ItemGroup.RECIPE), - "Hot soup x 2": (698107, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), - "Leadership roll x 2": (698108, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Leaf poultice x 3": (698109, 2, ItemType.PROGRESSION, ItemGroup.RECIPE), - "Plant leaf x 2": (698110, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Plant leaf x 3": (698111, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Rotten meat x 2": (698112, 1, ItemType.JUNK, ItemGroup.INGREDIENT), - "Rotten meat x 8": (698113, 1, ItemType.JUNK, ItemGroup.INGREDIENT), - "Sea loaf x 2": (698114, 1, ItemType.NORMAL, ItemGroup.RECIPE), - "Small bone x 3": (698115, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Small egg x 2": (698116, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), - "Li and Li song": (698117, 1, ItemType.PROGRESSION, ItemGroup.SONG), - "Shield song": (698118, 1, ItemType.NORMAL, ItemGroup.SONG), - "Beast form": (698119, 1, ItemType.PROGRESSION, ItemGroup.SONG), - "Sun form": (698120, 1, ItemType.PROGRESSION, ItemGroup.SONG), - "Nature form": (698121, 1, ItemType.PROGRESSION, ItemGroup.SONG), - "Energy form": (698122, 1, ItemType.PROGRESSION, ItemGroup.SONG), - "Bind song": (698123, 1, ItemType.PROGRESSION, ItemGroup.SONG), - "Fish form": (698124, 1, ItemType.PROGRESSION, ItemGroup.SONG), - "Spirit form": (698125, 1, ItemType.PROGRESSION, ItemGroup.SONG), + "Anemone": (698000, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_anemone + "Arnassi statue": (698001, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_arnassi_statue + "Big seed": (698002, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_big_seed + "Glowing seed": (698003, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_bio_seed + "Black pearl": (698004, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_blackpearl + "Baby blaster": (698005, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_blaster + "Crab armor": (698006, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_crab_costume + "Baby dumbo": (698007, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_dumbo + "Tooth": (698008, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_boss + "Energy statue": (698009, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_statue + "Krotite armor": (698010, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_temple + "Golden starfish": (698011, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_gold_star + "Golden gear": (698012, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_golden_gear + "Jelly beacon": (698013, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_jelly_beacon + "Jelly costume": (698014, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_jelly_costume + "Jelly plant": (698015, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_jelly_plant + "Mithalas doll": (698016, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithala_doll + "Mithalan dress": (698017, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalan_costume + "Mithalas banner": (698018, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalas_banner + "Mithalas pot": (698019, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalas_pot + "Mutant costume": (698020, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mutant_costume + "Baby nautilus": (698021, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_nautilus + "Baby piranha": (698022, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_piranha + "Arnassi Armor": (698023, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_seahorse_costume + "Seed bag": (698024, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_seed_bag + "King's Skull": (698025, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_skull + "Song plant spore": (698026, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_spore_seed + "Stone head": (698027, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_stone_head + "Sun key": (698028, 1, ItemType.NORMAL, ItemGroup.COLLECTIBLE), # collectible_sun_key + "Girl costume": (698029, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_teen_costume + "Odd container": (698030, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_treasure_chest + "Trident": (698031, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_trident_head + "Turtle egg": (698032, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_turtle_egg + "Jelly egg": (698033, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_upsidedown_seed + "Urchin costume": (698034, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_urchin_costume + "Baby walker": (698035, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_walker + "Vedha's Cure-All-All": (698036, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_Vedha'sCure-All + "Zuuna's perogi": (698037, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_Zuuna'sperogi + "Arcane poultice": (698038, 7, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_arcanepoultice + "Berry ice cream": (698039, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_berryicecream + "Buttery sea loaf": (698040, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_butterysealoaf + "Cold borscht": (698041, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_coldborscht + "Cold soup": (698042, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_coldsoup + "Crab cake": (698043, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_crabcake + "Divine soup": (698044, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_divinesoup + "Dumbo ice cream": (698045, 3, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_dumboicecream + "Fish oil": (698046, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishoil + "Glowing egg": (698047, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_glowingegg + "Hand roll": (698048, 5, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_handroll + "Healing poultice": (698049, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_healingpoultice + "Hearty soup": (698050, 5, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_heartysoup + "Hot borscht": (698051, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_hotborscht + "Hot soup": (698052, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_hotsoup + "Ice cream": (698053, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_icecream + "Leadership roll": (698054, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leadershiproll + "Leaf poultice": (698055, 5, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_leafpoultice + "Leeching poultice": (698056, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leechingpoultice + "Legendary cake": (698057, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_legendarycake + "Loaf of life": (698058, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_loafoflife + "Long life soup": (698059, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_longlifesoup + "Magic soup": (698060, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_magicsoup + "Mushroom x 2": (698061, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_mushroom + "Perogi": (698062, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_perogi + "Plant leaf": (698063, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf + "Plump perogi": (698064, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_plumpperogi + "Poison loaf": (698065, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_poisonloaf + "Poison soup": (698066, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_poisonsoup + "Rainbow mushroom": (698067, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_rainbowmushroom + "Rainbow soup": (698068, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_rainbowsoup + "Red berry": (698069, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_redberry + "Red bulb x 2": (698070, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_redbulb + "Rotten cake": (698071, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_rottencake + "Rotten loaf x 8": (698072, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_rottenloaf + "Rotten meat": (698073, 5, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat + "Royal soup": (698074, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_royalsoup + "Sea cake": (698075, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_seacake + "Sea loaf": (698076, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sealoaf + "Shark fin soup": (698077, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sharkfinsoup + "Sight poultice": (698078, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sightpoultice + "Small bone x 2": (698079, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallbone + "Small egg": (698080, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallegg + "Small tentacle x 2": (698081, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smalltentacle + "Special bulb": (698082, 5, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_specialbulb + "Special cake": (698083, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_specialcake + "Spicy meat x 2": (698084, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_spicymeat + "Spicy roll": (698085, 11, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spicyroll + "Spicy soup": (698086, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spicysoup + "Spider roll": (698087, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spiderroll + "Swamp cake": (698088, 3, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_swampcake + "Tasty cake": (698089, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_tastycake + "Tasty roll": (698090, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_tastyroll + "Tough cake": (698091, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_toughcake + "Turtle soup": (698092, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_turtlesoup + "Vedha sea crisp": (698093, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_vedhaseacrisp + "Veggie cake": (698094, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggiecake + "Veggie ice cream": (698095, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggieicecream + "Veggie soup": (698096, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggiesoup + "Volcano roll": (698097, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_volcanoroll + "Health upgrade": (698098, 5, ItemType.NORMAL, ItemGroup.HEALTH), # upgrade_health_1 .. upgrade_health_5 + "Wok": (698099, 1, ItemType.NORMAL, ItemGroup.UTILITY), # upgrade_wok + "Eel oil x 2": (698100, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_eeloil + "Fish meat x 2": (698101, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishmeat + "Fish oil x 3": (698102, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishoil + "Glowing egg x 2": (698103, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_glowingegg + "Healing poultice x 2": (698104, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_healingpoultice + "Hot soup x 2": (698105, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_hotsoup + "Leadership roll x 2": (698106, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leadershiproll + "Leaf poultice x 3": (698107, 2, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_leafpoultice + "Plant leaf x 2": (698108, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf + "Plant leaf x 3": (698109, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf + "Rotten meat x 2": (698110, 1, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat + "Rotten meat x 8": (698111, 1, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat + "Sea loaf x 2": (698112, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sealoaf + "Small bone x 3": (698113, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallbone + "Small egg x 2": (698114, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallegg + "Li and Li song": (698115, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_li + "Shield song": (698116, 1, ItemType.NORMAL, ItemGroup.SONG), # song_shield + "Beast form": (698117, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_beast + "Sun form": (698118, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_sun + "Nature form": (698119, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_nature + "Energy form": (698120, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_energy + "Bind song": (698121, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_bind + "Fish form": (698122, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_fish + "Spirit form": (698123, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_spirit + "Dual form": (698124, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_dual } diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 85d0b480f8d..81412e8eebc 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -34,8 +34,8 @@ class AquariaLocations: locations_verse_cave_l = { "Verse cave, the Naija hint about here shield ability": 698200, - "Verse cave left area, center part bulb": 698021, - "Verse cave left area, right part bulb": 698022, + "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, } @@ -68,9 +68,6 @@ class AquariaLocations: "Song cave, bulb under the rock close to the song door": 698075, "Verse egg in the Song cave": 698160, "Jelly beacon in the Song cave": 698178, - } - - locations_song_cave_anemone = { "Anemone seed in the Song cave": 698162, } @@ -80,7 +77,7 @@ class AquariaLocations: } locations_energy_temple_idol = { - "Energy Idol in the Energy temple first area": 698170, # Adding a Region for the idol + "Energy Idol in the Energy temple first area": 698170, } locations_energy_temple_2 = { @@ -115,23 +112,16 @@ class AquariaLocations: "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, - } - - locations_openwater_tr_urns = { - "Open water top right area, first urn in the Mithalas exit": 698148, # Need a way to break them + "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, } locations_openwater_bl = { "Open water bottom left area, bulb behind the chomper fish": 698011, - } - - locations_openwater_bl_fp = { "Open water bottom left area, bulb inside the downest fish pass": 698010, } @@ -174,9 +164,6 @@ class AquariaLocations: "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, - } - - locations_mithalas_city_urns = { "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, @@ -189,9 +176,6 @@ class AquariaLocations: "Mithalas city, second bulb at the end of the top path": 698040, "Mithalas city, bulb in the top path": 698036, "Mithalas pot in Mithalas city": 698174, - } - - locations_mithalas_city_top_path_urn = { "Mithalas city, urn in the cathedral flower tube entrance": 698128, } @@ -203,9 +187,6 @@ class AquariaLocations: locations_cathedral_l = { "Mithalas city castle, bulb in the flesh hole": 698042, "Blue banner in the Mithalas city castle": 698165, - } - - locations_cathedral_l_urns = { "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, @@ -235,8 +216,8 @@ class AquariaLocations: "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, - "Mithalan Dress in the Mithalas cathedral": 698189, # Need Beast form - "Mithalas cathedral right area, bellow the left entrance": 698198, + "Mithalan Dress in the Mithalas cathedral": 698189, + "Mithalas cathedral right area, urn bellow the left entrance": 698198, } locations_cathedral_underground = { @@ -249,7 +230,7 @@ class AquariaLocations: } locations_cathedral_boss = { - "Cathedral boss area, beating Mithalas": 698202, + "Cathedral boss area, beating Mithalan God": 698202, } locations_forest_tl = { @@ -270,9 +251,6 @@ class AquariaLocations: "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, - } - - locations_forest_tr_dark = { "Black pearl in the Kelp forest top right area": 698167, } @@ -282,13 +260,10 @@ class AquariaLocations: locations_forest_bl = { "Kelp Forest bottom left area, bulb close to the spirit cristals": 698054, - } - - locations_forest_bl_sc = { "Walker baby in the Kelp forest bottom left area": 698186, } - locations_forest_br_ship = { + locations_forest_br = { "Odd Container in the Kelp forest bottom right area": 698168, } @@ -324,38 +299,29 @@ class AquariaLocations: locations_veil_tl = { "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, } locations_veil_tl_fp = { "The veil top left area, bulb inside the fish pass": 698077, } - locations_veil_tl_rock = { - "The veil top left area, bulb hidden behind the blocking rock": 698076, - } - - locations_turtle_cave_rocks = { + locations_turtle_cave = { "Turtle Egg in the Turtle cave": 698184, } locations_turtle_cave_bubble = { "Turtle cave, bulb in bubble cliff": 698000, - } - - locations_turtle_cave_top_bubble = { "Urchin costume in the Turtle cave": 698193, } - locations_veil_tr_l = { - } - 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_water_fall = { - "The veil top right area, bulb in the top of the fall": 698080, + "The veil top right area, bulb in the top of the water fall": 698080, } locations_veil_bl = { @@ -402,17 +368,14 @@ class AquariaLocations: "Sun key in the Sun temple": 698182, } - locations_sun_temple_boss_lb = { + locations_sun_temple_boss_path = { "Sun Worm path, first path bulb": 698017, "Sun Worm path, second path bulb": 698018, - } - - locations_sun_temple_boss_lt = { "Sun Worm path, first cliff bulb": 698019, "Sun Worm path, second cliff bulb": 698020, } - locations_sun_temple_boss_r = { + locations_sun_temple_boss = { "Sun temple boss area, beating Sun God": 698203, } @@ -421,9 +384,6 @@ class AquariaLocations: "Abyss left area, bulb in the right part": 698025, "Glowing seed in the Abyss left area": 698166, "Glowing Plant in the Abyss left area": 698172, - } - - locations_abyss_l_fp = { "Abyss left area, bulb in the bottom fish pass": 698026, } @@ -504,7 +464,7 @@ class AquariaLocations: "Final boss area, third bulbs in the turtle room": 698105, } - locations_final_boss_3_form = { + locations_final_boss = { "Final boss area, bulb in the boss second form room": 698106, } @@ -512,10 +472,8 @@ class AquariaLocations: location_table = { **AquariaLocations.locations_openwater_tl, **AquariaLocations.locations_openwater_tr, - **AquariaLocations.locations_openwater_tr_urns, **AquariaLocations.locations_openwater_tr_turtle, **AquariaLocations.locations_openwater_bl, - **AquariaLocations.locations_openwater_bl_fp, **AquariaLocations.locations_skeleton_path, **AquariaLocations.locations_skeleton_path_sc, **AquariaLocations.locations_arnassi, @@ -523,13 +481,11 @@ class AquariaLocations: **AquariaLocations.locations_arnassi_crab_boss, **AquariaLocations.locations_sun_temple_l, **AquariaLocations.locations_sun_temple_r, - **AquariaLocations.locations_sun_temple_boss_lt, - **AquariaLocations.locations_sun_temple_boss_lb, - **AquariaLocations.locations_sun_temple_boss_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_l_fp, **AquariaLocations.locations_abyss_r, **AquariaLocations.locations_energy_temple_1, **AquariaLocations.locations_energy_temple_2, @@ -539,12 +495,9 @@ class AquariaLocations: **AquariaLocations.locations_energy_temple_altar, **AquariaLocations.locations_energy_temple_idol, **AquariaLocations.locations_mithalas_city, - **AquariaLocations.locations_mithalas_city_urns, **AquariaLocations.locations_mithalas_city_top_path, - **AquariaLocations.locations_mithalas_city_top_path_urn, **AquariaLocations.locations_mithalas_city_fishpass, **AquariaLocations.locations_cathedral_l, - **AquariaLocations.locations_cathedral_l_urns, **AquariaLocations.locations_cathedral_l_tube, **AquariaLocations.locations_cathedral_l_sc, **AquariaLocations.locations_cathedral_r, @@ -553,11 +506,9 @@ class AquariaLocations: **AquariaLocations.locations_forest_tl, **AquariaLocations.locations_forest_tl_fp, **AquariaLocations.locations_forest_tr, - **AquariaLocations.locations_forest_tr_dark, **AquariaLocations.locations_forest_tr_fp, **AquariaLocations.locations_forest_bl, - **AquariaLocations.locations_forest_bl_sc, - **AquariaLocations.locations_forest_br_ship, + **AquariaLocations.locations_forest_br, **AquariaLocations.locations_forest_boss, **AquariaLocations.locations_forest_boss_entrance, **AquariaLocations.locations_forest_sprite_cave, @@ -570,16 +521,12 @@ class AquariaLocations: **AquariaLocations.locations_body_c, **AquariaLocations.locations_body_b, **AquariaLocations.locations_final_boss_tube, - **AquariaLocations.locations_final_boss_3_form, + **AquariaLocations.locations_final_boss, **AquariaLocations.locations_song_cave, - **AquariaLocations.locations_song_cave_anemone, **AquariaLocations.locations_veil_tl, **AquariaLocations.locations_veil_tl_fp, - **AquariaLocations.locations_veil_tl_rock, - **AquariaLocations.locations_turtle_cave_rocks, + **AquariaLocations.locations_turtle_cave, **AquariaLocations.locations_turtle_cave_bubble, - **AquariaLocations.locations_turtle_cave_top_bubble, - **AquariaLocations.locations_veil_tr_l, **AquariaLocations.locations_veil_tr_r, **AquariaLocations.locations_veil_tr_water_fall, **AquariaLocations.locations_veil_bl, diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index 54df9a386f1..a688ba93e49 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -31,6 +31,41 @@ class AquarianTranslation(Toggle): display_name = "Translate Aquarian" +class BigBossesToBeat(Choice): + """ + 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" + option_none = 0 + option_1 = 1 + option_2 = 2 + option_3 = 3 + option_4 = 4 + default = 0 + + + +class MiniBossesToBeat(Choice): + """ + A number of Minibosses to beat before having access to the creator (the final boss). Mini bosses are + "Nautilus Prime", "Blaster Peg Prime", "Mermog", "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" + option_none = 0 + option_1 = 1 + option_2 = 2 + option_3 = 3 + option_4 = 4 + option_5 = 5 + option_6 = 6 + option_7 = 7 + option_8 = 8 + default = 0 + + class Objective(Choice): """ The game objective can be only to kill the creator or to kill the creator @@ -45,10 +80,12 @@ class Objective(Choice): @dataclass class AquariaOptions(PerGameCommonOptions): """ - Every options in the Aquaria randomizer + Every option in the Aquaria randomizer """ ingredient_randomizer: IngredientRandomizer dish_randomizer: DishRandomizer aquarian_translation: AquarianTranslation objective: Objective + big_bosses_to_beat: BigBossesToBeat + mini_bosses_to_beat: MiniBossesToBeat death_link: DeathLink diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 077c9a9730b..3e9849f9356 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -6,98 +6,113 @@ from typing import Dict, Optional from BaseClasses import MultiWorld, Region, Entrance, ItemClassification -from worlds.generic.Rules import set_rule from .Items import AquariaItem from .Locations import AquariaLocations, AquariaLocation +from .Options import AquariaOptions +from worlds.generic.Rules import add_rule, set_rule # Every condition to connect regions -def _has_hot_soup(state, player) -> bool: +def _has_hot_soup(state, player: int) -> bool: """`player` in `state` has the hotsoup item""" return state.has("Hot soup", player) -def _has_tongue_cleared(state, player) -> bool: +def _has_tongue_cleared(state, player: int) -> bool: """`player` in `state` has the Body tongue cleared item""" return state.has("Body tongue cleared", player) -def _has_body_doors_opened(state, player) -> bool: - """`player` in `state` has the 4 body doors opened item""" - return state.has("Body door 1 opened", player) and \ - state.has("Body door 2 opened", player) and \ - state.has("Body door 3 opened", player) and \ - state.has("Body door 4 opened", player) - - -def _has_li(state, player) -> bool: +def _has_li(state, player: int) -> bool: """`player` in `state` has Li in it's team""" return state.has("Li and Li song", player) -def _has_damaging_item(state, player) -> bool: +def _has_damaging_item(state, player: int) -> bool: """`player` in `state` has the shield song item""" return state.has_group("Damage", player) -def _has_shield_song(state, player) -> bool: +def _has_shield_song(state, player: int) -> bool: """`player` in `state` has the shield song item""" return state.has("Shield song", player) -def _has_bind_song(state, player) -> bool: +def _has_bind_song(state, player: int) -> bool: """`player` in `state` has the bind song item""" return state.has("Bind song", player) -def _has_energy_form(state, player) -> bool: +def _has_energy_form(state, player: int) -> bool: """`player` in `state` has the energy form item""" return state.has("Energy form", player) -def _has_beast_form(state, player) -> bool: +def _has_beast_form(state, player: int) -> bool: """`player` in `state` has the beast form item""" return state.has("Beast form", player) -def _has_nature_form(state, player) -> bool: +def _has_nature_form(state, player: int) -> bool: """`player` in `state` has the nature form item""" return state.has("Nature form", player) -def _has_sun_form(state, player) -> bool: +def _has_sun_form(state, player: int) -> bool: """`player` in `state` has the sun form item""" return state.has("Sun form", player) -def _has_dual_form(state, player) -> bool: +def _has_dual_form(state, player: int) -> bool: """`player` in `state` has the dual form item""" return state.has("Dual form", player) -def _has_fish_form(state, player) -> bool: +def _has_fish_form(state, player: int) -> bool: """`player` in `state` has the fish form item""" return state.has("Fish form", player) -def _has_spirit_form(state, player) -> bool: +def _has_spirit_form(state, player: int) -> bool: """`player` in `state` has the spirit form item""" return state.has("Spirit form", player) +def _has_big_bosses(state, player: int) -> bool: + """`player` in `state` has beated every big bosses""" + return (state.has("Fallen God beated", player) and + state.has("Mithalan God beated", player) and + state.has("Drunian God beated", player) and + state.has("Sun God beated", player) and + state.has("The Golem beated", player) + ) + + +def _has_mini_bosses(state, player: int) -> bool: + """`player` in `state` has beated every big bosses""" + return (state.has("Nautilus Prime beated", player) and + state.has("Blaster Peg Prime beated", player) and + state.has("Mermog beated", player) and + state.has("Mithalan priests beated", player) and + state.has("Octopus Prime beated", player) and + state.has("Crabbius Maximus beated", player) and + state.has("Mantis Shrimp Prime beated", player) and + state.has("King Jellyfish God Prime beated", player) + ) + + class AquariaRegions: """ Class used to create regions of the Aquaria game """ - + menu: Region verse_cave_r: Region verse_cave_l: Region home_water: Region home_water_nautilus: Region naija_home: Region song_cave: Region - song_cave_anemone: Region energy_temple_1: Region energy_temple_2: Region energy_temple_3: Region @@ -107,10 +122,8 @@ class AquariaRegions: energy_temple_altar: Region openwater_tl: Region openwater_tr: Region - openwater_tr_urns: Region openwater_tr_turtle: Region openwater_bl: Region - openwater_bl_fp: Region openwater_br: Region skeleton_path: Region skeleton_path_sc: Region @@ -119,12 +132,9 @@ class AquariaRegions: arnassi_crab_boss: Region simon: Region mithalas_city: Region - mithalas_city_urns: Region mithalas_city_top_path: Region - mithalas_city_top_path_urn: Region mithalas_city_fishpass: Region cathedral_l: Region - cathedral_l_urns: Region cathedral_l_tube: Region cathedral_l_sc: Region cathedral_r: Region @@ -134,12 +144,9 @@ class AquariaRegions: forest_tl: Region forest_tl_fp: Region forest_tr: Region - forest_tr_dark: Region forest_tr_fp: Region forest_bl: Region - forest_bl_sc: Region forest_br: Region - forest_br_ship: Region forest_boss: Region forest_boss_entrance: Region forest_sprite_cave: Region @@ -149,7 +156,6 @@ class AquariaRegions: forest_fish_cave: Region veil_tl: Region veil_tl_fp: Region - veil_tl_rock: Region veil_tr_l: Region veil_tr_r: Region veil_tr_water_fall: Region @@ -160,17 +166,13 @@ class AquariaRegions: octo_cave_t: Region octo_cave_b: Region turtle_cave: Region - turtle_cave_rocks: Region turtle_cave_bubble: Region - turtle_cave_top_bubble: Region sun_temple_l: Region sun_temple_r: Region - sun_temple_boss_lt: Region - sun_temple_boss_lb: Region - sun_temple_boss_r: Region + sun_temple_boss_path: Region + sun_temple_boss: Region abyss_l: Region abyss_lb: Region - abyss_l_fp: Region abyss_r: Region ice_cave: Region bubble_cave: Region @@ -185,9 +187,9 @@ class AquariaRegions: body_rt: Region body_rb: Region body_b: Region - final_boss: Region + final_boss_loby: Region final_boss_tube: Region - final_boss_3_form: Region + final_boss: Region final_boss_end: Region """ Every Region of the game @@ -203,50 +205,51 @@ class AquariaRegions: The ID of the player """ - def __add_region(self, name: str, hint: str, + def __add_region(self, hint: str, locations: Optional[Dict[str, Optional[int]]]) -> Region: """ Create a new Region, add it to the `world` regions and return it. Be aware that this function have a side effect on ``world`.`regions` """ - region: Region = Region(name, self.player, self.world, hint) + region: Region = Region(hint, self.player, self.world, hint) if locations is not None: region.add_locations(locations, AquariaLocation) return region + + def __create_home_water_area(self): """ Create the `verse_cave`, `home_water` and `song_cave*` regions """ - self.verse_cave_r = ( - self.__add_region("Menu", "Verse Cave right area", AquariaLocations.locations_verse_cave_r)) - self.verse_cave_l = ( - self.__add_region("verse_cave_left_area", "Verse Cave left area", AquariaLocations.locations_verse_cave_l)) - self.home_water = self.__add_region("home_water", "Home Water", AquariaLocations.locations_home_water) - self.home_water_nautilus = self.__add_region("home_water_nautilus", "Home Water", + self.menu = self.__add_region("Menu", None) + self.verse_cave_r = self.__add_region("Verse Cave right area", + AquariaLocations.locations_verse_cave_r) + self.verse_cave_l = self.__add_region("Verse Cave left area", + AquariaLocations.locations_verse_cave_l) + self.home_water = self.__add_region("Home Water", AquariaLocations.locations_home_water) + self.home_water_nautilus = self.__add_region("Home Water, Nautilus nest", AquariaLocations.locations_home_water_nautilus) - self.naija_home = self.__add_region("naija_home", "Naija's home", AquariaLocations.locations_naija_home) - self.song_cave = self.__add_region("song_cave", "Song cave", AquariaLocations.locations_song_cave) - self.song_cave_anemone = self.__add_region("song_cave_anemone", "Song cave", - AquariaLocations.locations_song_cave_anemone) + self.naija_home = self.__add_region("Naija's home", AquariaLocations.locations_naija_home) + self.song_cave = self.__add_region("Song cave", AquariaLocations.locations_song_cave) def __create_energy_temple(self): """ Create the `energy_temple_*` regions """ - self.energy_temple_1 = self.__add_region("energy_temple_1", "Energy temple first area", + self.energy_temple_1 = self.__add_region("Energy temple first area", AquariaLocations.locations_energy_temple_1) - self.energy_temple_2 = self.__add_region("energy_temple_2", "Energy temple second area", + self.energy_temple_2 = self.__add_region("Energy temple second area", AquariaLocations.locations_energy_temple_2) - self.energy_temple_3 = self.__add_region("energy_temple_3", "Energy temple third area", + self.energy_temple_3 = self.__add_region("Energy temple third area", AquariaLocations.locations_energy_temple_3) - self.energy_temple_altar = self.__add_region("energy_temple_altar", "Energy temple bottom entrance", + self.energy_temple_altar = self.__add_region("Energy temple bottom entrance", AquariaLocations.locations_energy_temple_altar) - self.energy_temple_boss = self.__add_region("energy_temple_boss", "Energy temple fallen God room", + self.energy_temple_boss = self.__add_region("Energy temple fallen God room", AquariaLocations.locations_energy_temple_boss) - self.energy_temple_idol = self.__add_region("energy_temple_idol", "Energy temple Idol room", + self.energy_temple_idol = self.__add_region("Energy temple Idol room", AquariaLocations.locations_energy_temple_idol) - self.energy_temple_blaster_room = self.__add_region("energy_temple_blaster_room", "Energy temple blaster room", + self.energy_temple_blaster_room = self.__add_region("Energy temple blaster room", AquariaLocations.locations_energy_temple_blaster_room) def __create_openwater(self): @@ -254,202 +257,170 @@ def __create_openwater(self): Create the `openwater_*`, `skeleton_path`, `arnassi*` and `simon` regions """ - self.openwater_tl = self.__add_region("openwater_tl", "Open water top left area", + self.openwater_tl = self.__add_region("Open water top left area", AquariaLocations.locations_openwater_tl) - self.openwater_tr = self.__add_region("openwater_tr", "Open water top right area", + self.openwater_tr = self.__add_region("Open water top right area", AquariaLocations.locations_openwater_tr) - self.openwater_tr_turtle = self.__add_region("openwater_tr_turtle", "Open water top right area, turtle room", + self.openwater_tr_turtle = self.__add_region("Open water top right area, turtle room", AquariaLocations.locations_openwater_tr_turtle) - self.openwater_tr_urns = self.__add_region("openwater_tr_urns", "Open water top right area", - AquariaLocations.locations_openwater_tr_urns) - self.openwater_bl = self.__add_region("openwater_bl", "Open water bottom left area", + self.openwater_bl = self.__add_region("Open water bottom left area", AquariaLocations.locations_openwater_bl) - self.openwater_bl_fp = self.__add_region("openwater_bl_fp", "Open water bottom left area", - AquariaLocations.locations_openwater_bl_fp) - self.openwater_br = self.__add_region("openwater_br", "Open water bottom right area", None) - self.skeleton_path = self.__add_region("skeleton_path", "Open water skeleton path", + self.openwater_br = self.__add_region("Open water bottom right area", None) + self.skeleton_path = self.__add_region("Open water skeleton path", AquariaLocations.locations_skeleton_path) - self.skeleton_path_sc = self.__add_region("skeleton_path_sc", "Open water skeleton path", + self.skeleton_path_sc = self.__add_region("Open water skeleton path spirit cristal", AquariaLocations.locations_skeleton_path_sc) - self.arnassi = self.__add_region("arnassi", "Arnassi Ruins", AquariaLocations.locations_arnassi) - self.simon = self.__add_region("simon", "Arnassi Ruins, Simon's room", AquariaLocations.locations_simon) - self.arnassi_path = self.__add_region("arnassi_path", "Arnassi Ruins, back entrance path", + self.arnassi = self.__add_region("Arnassi Ruins", AquariaLocations.locations_arnassi) + self.simon = self.__add_region("Arnassi Ruins, Simon's room", AquariaLocations.locations_simon) + self.arnassi_path = self.__add_region("Arnassi Ruins, back entrance path", AquariaLocations.locations_arnassi_path) - self.arnassi_crab_boss = self.__add_region("arnassi_crab_boss", "Arnassi Ruins, Crabbius Maximus lair", + self.arnassi_crab_boss = self.__add_region("Arnassi Ruins, Crabbius Maximus lair", AquariaLocations.locations_arnassi_crab_boss) def __create_mithalas(self): """ Create the `mithalas_city*` and `cathedral_*` regions """ - self.mithalas_city = self.__add_region("mithalas_city", "Mithalas city", + self.mithalas_city = self.__add_region("Mithalas city", AquariaLocations.locations_mithalas_city) - self.mithalas_city_urns = self.__add_region("mithalas_city_urns", "Mithalas city", - AquariaLocations.locations_mithalas_city_urns) - self.mithalas_city_fishpass = self.__add_region("mithalas_city_fishpass", "Mithalas city", + self.mithalas_city_fishpass = self.__add_region("Mithalas city fish pass", AquariaLocations.locations_mithalas_city_fishpass) - self.mithalas_city_top_path = self.__add_region("mithalas_city_top_path", "Mithalas city", + self.mithalas_city_top_path = self.__add_region("Mithalas city top path", AquariaLocations.locations_mithalas_city_top_path) - self.mithalas_city_top_path_urn = self.__add_region("mithalas_city_top_path_urn", "Mithalas city", - AquariaLocations.locations_mithalas_city_top_path_urn) - self.cathedral_l = self.__add_region("cathedral_l", "Mithalas castle", AquariaLocations.locations_cathedral_l) - self.cathedral_l_urns = self.__add_region("cathedral_l_urns", "Mithalas castle", - AquariaLocations.locations_cathedral_l_urns) - self.cathedral_l_tube = self.__add_region("cathedral_l_tube", "Mithalas castle, plant tube entrance", + self.cathedral_l = self.__add_region("Mithalas castle", AquariaLocations.locations_cathedral_l) + self.cathedral_l_tube = self.__add_region("Mithalas castle, plant tube entrance", AquariaLocations.locations_cathedral_l_tube) - self.cathedral_l_sc = self.__add_region("cathedral_l_sc", "Mithalas castle", + self.cathedral_l_sc = self.__add_region("Mithalas castle spirit cristal", AquariaLocations.locations_cathedral_l_sc) - self.cathedral_r = self.__add_region("cathedral_r", "Mithalas Cathedral", + self.cathedral_r = self.__add_region("Mithalas Cathedral", AquariaLocations.locations_cathedral_r) - self.cathedral_underground = self.__add_region("cathedral_underground", "Mithalas Cathedral underground area", + self.cathedral_underground = self.__add_region("Mithalas Cathedral underground area", AquariaLocations.locations_cathedral_underground) - self.cathedral_boss_r = self.__add_region("cathedral_boss_r", "Mithalas Cathedral, Mithalan God room", + self.cathedral_boss_r = self.__add_region("Mithalas Cathedral, Mithalan God room", AquariaLocations.locations_cathedral_boss) - self.cathedral_boss_l = self.__add_region("cathedral_boss_l", "Mithalas Cathedral, Mithalan God room", None) + self.cathedral_boss_l = self.__add_region("Mithalas Cathedral, after Mithalan God room", None) def __create_forest(self): """ Create the `forest_*` dans `mermog_cave` regions """ - self.forest_tl = self.__add_region("forest_tl", "Kelp forest top left area", + self.forest_tl = self.__add_region("Kelp forest top left area", AquariaLocations.locations_forest_tl) - self.forest_tl_fp = self.__add_region("forest_tl_fp", "Kelp forest top left area", + self.forest_tl_fp = self.__add_region("Kelp forest top left area fish pass", AquariaLocations.locations_forest_tl_fp) - self.forest_tr = self.__add_region("forest_tr", "Kelp forest top right area", + self.forest_tr = self.__add_region("Kelp forest top right area", AquariaLocations.locations_forest_tr) - self.forest_tr_fp = self.__add_region("forest_tr_fp", "Kelp forest top right area", + self.forest_tr_fp = self.__add_region("Kelp forest top right area fish pass", AquariaLocations.locations_forest_tr_fp) - self.forest_tr_dark = self.__add_region("forest_tr_dark", - "Kelp forest top right area, the dark behind the seawolf", - AquariaLocations.locations_forest_tr_dark) - self.forest_bl = self.__add_region("forest_bl", "Kelp forest bottom left area", + self.forest_bl = self.__add_region("Kelp forest bottom left area", AquariaLocations.locations_forest_bl) - self.forest_bl_sc = self.__add_region("forest_bl_sc", "Kelp forest bottom left area, spirit cristal", - AquariaLocations.locations_forest_bl_sc) - self.forest_br = self.__add_region("forest_br", "Kelp forest bottom right area", None) - self.forest_br_ship = self.__add_region("forest_br_ship", "Kelp forest bottom right area, sunken ship", - AquariaLocations.locations_forest_br_ship) - self.forest_sprite_cave = self.__add_region("forest_sprite_cave", "Kelp forest spirit cave", + self.forest_br = self.__add_region("Kelp forest bottom right area", + AquariaLocations.locations_forest_br) + self.forest_sprite_cave = self.__add_region("Kelp forest spirit cave", AquariaLocations.locations_forest_sprite_cave) - self.forest_sprite_cave_tube = self.__add_region("forest_sprite_cave_tube", - "Kelp forest spirit cave after the plant tube", + self.forest_sprite_cave_tube = self.__add_region("Kelp forest spirit cave after the plant tube", AquariaLocations.locations_forest_sprite_cave_tube) - self.forest_boss = self.__add_region("forest_boss", "Kelp forest Drunian God room", + self.forest_boss = self.__add_region("Kelp forest Drunian God room", AquariaLocations.locations_forest_boss) - self.forest_boss_entrance = self.__add_region("forest_boss_entrance", "Kelp forest Drunian God room", + self.forest_boss_entrance = self.__add_region("Kelp forest Drunian God room entrance", AquariaLocations.locations_forest_boss_entrance) - self.mermog_cave = self.__add_region("mermog_cave", "Kelp forest Mermog cave", + self.mermog_cave = self.__add_region("Kelp forest Mermog cave", AquariaLocations.locations_mermog_cave) - self.mermog_boss = self.__add_region("mermog_boss", "Kelp forest Mermog cave", + self.mermog_boss = self.__add_region("Kelp forest Mermog cave boss", AquariaLocations.locations_mermog_boss) - self.forest_fish_cave = self.__add_region("forest_fish_cave", "Kelp forest fish cave", + self.forest_fish_cave = self.__add_region("Kelp forest fish cave", AquariaLocations.locations_forest_fish_cave) def __create_veil(self): """ Create the `veil_*`, `octo_cave` and `turtle_cave` regions """ - self.veil_tl = self.__add_region("veil_tl", "The veil top left area", AquariaLocations.locations_veil_tl) - self.veil_tl_fp = self.__add_region("veil_tl_fp", "The veil top left area", + self.veil_tl = self.__add_region("The veil top left area", AquariaLocations.locations_veil_tl) + self.veil_tl_fp = self.__add_region("The veil top left area fish pass", AquariaLocations.locations_veil_tl_fp) - self.veil_tl_rock = self.__add_region("veil_tl_rock", "The veil top left area, after blocking rock", - AquariaLocations.locations_veil_tl_rock) - self.turtle_cave = self.__add_region("turtle_cave", "The veil top left area, turtle cave", None) - self.turtle_cave_rocks = self.__add_region("turtle_cave_rocks", "The veil top left area, turtle cave", - AquariaLocations.locations_turtle_cave_rocks) - self.turtle_cave_bubble = self.__add_region("turtle_cave_bubble", - "The veil top left area, turtle cave bubble cliff", + self.turtle_cave = self.__add_region("The veil top left area, turtle cave", + AquariaLocations.locations_turtle_cave) + self.turtle_cave_bubble = self.__add_region("The veil top left area, turtle cave bubble cliff", AquariaLocations.locations_turtle_cave_bubble) - self.turtle_cave_top_bubble = self.__add_region("turtle_cave_top_bubble", - "The veil top left area, turtle cave bubble cliff", - AquariaLocations.locations_turtle_cave_top_bubble) - self.veil_tr_l = self.__add_region("veil_tr_l", "The veil top right area, left of temple", - AquariaLocations.locations_veil_tr_l) - self.veil_tr_r = self.__add_region("veil_tr_r", "The veil top right area, right of temple", + self.veil_tr_l = self.__add_region("The veil top right area, left of temple", None) + self.veil_tr_r = self.__add_region("The veil top right area, right of temple", AquariaLocations.locations_veil_tr_r) - self.veil_tr_water_fall = self.__add_region("veil_tr_water_fall", - "The veil top right area, top of the water fall", + self.veil_tr_water_fall = self.__add_region("The veil top right area, top of the water fall", AquariaLocations.locations_veil_tr_water_fall) - self.octo_cave_t = self.__add_region("octo_cave_t", "Octopus cave top entrance", + self.octo_cave_t = self.__add_region("Octopus cave top entrance", AquariaLocations.locations_octo_cave_t) - self.octo_cave_b = self.__add_region("octo_cave_b", "Octopus cave bottom entrance", + self.octo_cave_b = self.__add_region("Octopus cave bottom entrance", AquariaLocations.locations_octo_cave_b) - self.veil_bl = self.__add_region("veil_bl", "The veil bottom left area", + self.veil_bl = self.__add_region("The veil bottom left area", AquariaLocations.locations_veil_bl) - self.veil_b_sc = self.__add_region("veil_b_sc", "The veil bottom spirit cristal area", + self.veil_b_sc = self.__add_region("The veil bottom spirit cristal area", AquariaLocations.locations_veil_b_sc) - self.veil_bl_fp = self.__add_region("veil_bl_fp", "The veil bottom left area", + self.veil_bl_fp = self.__add_region("The veil bottom left area, in the sunken ship", AquariaLocations.locations_veil_bl_fp) - self.veil_br = self.__add_region("veil_br", "The veil bottom right area", + self.veil_br = self.__add_region("The veil bottom right area", AquariaLocations.locations_veil_br) def __create_sun_temple(self): """ Create the `sun_temple*` regions """ - self.sun_temple_l = self.__add_region("sun_temple_l", "Sun temple left area", + self.sun_temple_l = self.__add_region("Sun temple left area", AquariaLocations.locations_sun_temple_l) - self.sun_temple_r = self.__add_region("sun_temple_r", "Sun temple right area", + self.sun_temple_r = self.__add_region("Sun temple right area", AquariaLocations.locations_sun_temple_r) - self.sun_temple_boss_lt = self.__add_region("sun_temple_boss_lt", - "Sun temple before boss area, top of the cliffs", - AquariaLocations.locations_sun_temple_boss_lt) - self.sun_temple_boss_lb = self.__add_region("sun_temple_boss_lb", "Sun temple before boss area", - AquariaLocations.locations_sun_temple_boss_lb) - self.sun_temple_boss_r = self.__add_region("sun_temple_boss_r", "Sun temple boss area", - AquariaLocations.locations_sun_temple_boss_r) + self.sun_temple_boss_path = self.__add_region("Sun temple before boss area", + AquariaLocations.locations_sun_temple_boss_path) + self.sun_temple_boss = self.__add_region("Sun temple boss area", + AquariaLocations.locations_sun_temple_boss) def __create_abyss(self): """ Create the `abyss_*`, `ice_cave`, `king_jellyfish_cave` and `whale` regions """ - self.abyss_l = self.__add_region("abyss_l", "Abyss left area", + self.abyss_l = self.__add_region("Abyss left area", AquariaLocations.locations_abyss_l) - self.abyss_lb = self.__add_region("abyss_lb", "Abyss left bottom area", None) - self.abyss_l_fp = self.__add_region("abyss_l_fp", "Abyss left buttom area", - AquariaLocations.locations_abyss_l_fp) - self.abyss_r = self.__add_region("abyss_r", "Abyss right area", AquariaLocations.locations_abyss_r) - self.ice_cave = self.__add_region("ice_cave", "Ice cave", AquariaLocations.locations_ice_cave) - self.bubble_cave = self.__add_region("bubble_cave", "Bubble cave", AquariaLocations.locations_bubble_cave) - self.king_jellyfish_cave = self.__add_region("king_jellyfish_cave", "Abyss left area, King jellyfish cave", + self.abyss_lb = self.__add_region("Abyss left bottom area", None) + self.abyss_r = self.__add_region("Abyss right area", AquariaLocations.locations_abyss_r) + self.ice_cave = self.__add_region("Ice cave", AquariaLocations.locations_ice_cave) + self.bubble_cave = self.__add_region("Bubble cave", AquariaLocations.locations_bubble_cave) + self.king_jellyfish_cave = self.__add_region("Abyss left area, King jellyfish cave", AquariaLocations.locations_king_jellyfish_cave) - self.whale = self.__add_region("whale", "Inside the whale", AquariaLocations.locations_whale) + self.whale = self.__add_region("Inside the whale", AquariaLocations.locations_whale) def __create_sunken_city(self): """ Create the `sunken_city_*` regions """ - self.sunken_city_l = self.__add_region("sunken_city_l", "Sunken city left area", + self.sunken_city_l = self.__add_region("Sunken city left area", AquariaLocations.locations_sunken_city_l) - self.sunken_city_l_bedroom = self.__add_region("sunken_city_l_bedroom", "Sunken city left area, bedroom", + self.sunken_city_l_bedroom = self.__add_region("Sunken city left area, bedroom", AquariaLocations.locations_sunken_city_l_bedroom) - self.sunken_city_r = self.__add_region("sunken_city_r", "Sunken city right area", + self.sunken_city_r = self.__add_region("Sunken city right area", AquariaLocations.locations_sunken_city_r) - self.sunken_city_boss = ( - self.__add_region("sunken_city_boss", "Sunken city boss area", - AquariaLocations.locations_sunken_city_boss)) + self.sunken_city_boss = self.__add_region("Sunken city boss area", + AquariaLocations.locations_sunken_city_boss) def __create_body(self): """ Create the `body_*` and `final_boss* regions """ - self.body_c = self.__add_region("body_c", "The body center area", + self.body_c = self.__add_region("The body center area", AquariaLocations.locations_body_c) - self.body_l = self.__add_region("body_l", "The body left area", + self.body_l = self.__add_region("The body left area", AquariaLocations.locations_body_l) - self.body_rt = self.__add_region("body_rt", "The body right area, top path", + self.body_rt = self.__add_region("The body right area, top path", AquariaLocations.locations_body_rt) - self.body_rb = self.__add_region("body_rb", "The body right area, bottom path", + self.body_rb = self.__add_region("The body right area, bottom path", AquariaLocations.locations_body_rb) - self.body_b = self.__add_region("body_b", "The body bottom area", + self.body_b = self.__add_region("The body bottom area", AquariaLocations.locations_body_b) - self.final_boss = self.__add_region("final_boss", "The body, final boss area", None) - self.final_boss_tube = self.__add_region("final_boss_tube", "The body, final boss area turtle room", + self.final_boss_loby = self.__add_region("The body, before final boss", None) + self.final_boss_tube = self.__add_region("The body, final boss area turtle room", AquariaLocations.locations_final_boss_tube) - self.final_boss_3_form = self.__add_region("final_boss_3_form", "The body final boss third form area", - AquariaLocations.locations_final_boss_3_form) - self.final_boss_end = self.__add_region("final_boss_end", "The body, final boss area", None) + self.final_boss = self.__add_region("The body, final boss", + AquariaLocations.locations_final_boss) + self.final_boss_end = self.__add_region("The body, final boss area", None) def __connect_one_way_regions(self, source_name: str, destination_name: str, source_region: Region, @@ -476,6 +447,8 @@ def __connect_home_water_regions(self): """ Connect entrances of the different regions around `home_water` """ + self.__connect_regions("Menu", "Verse cave right area", + self.menu, self.verse_cave_r) self.__connect_regions("Verse cave left area", "Verse cave right area", self.verse_cave_l, self.verse_cave_r) self.__connect_regions("Verse cave", "Home water", self.verse_cave_l, self.home_water) @@ -483,54 +456,48 @@ def __connect_home_water_regions(self): self.__connect_regions("Home Water", "Song cave", self.home_water, self.song_cave) self.__connect_regions("Home Water", "home_water_nautilus", self.home_water, self.home_water_nautilus, - lambda state: _has_energy_form(state, self.player)) # Need energy form# ToDo: Remove - self.__connect_regions("Song cave", "Song cave Anemone", - self.song_cave, self.song_cave_anemone, - lambda state: _has_nature_form(state, self.player)) # Need Nature Form # ToDo: Remove + lambda state: _has_energy_form(state, self.player)) self.__connect_regions("Home Water", "Energy temple first area", self.home_water, self.energy_temple_1, - lambda state: _has_bind_song(state, self.player)) # Need bind song + lambda state: _has_bind_song(state, self.player)) self.__connect_regions("Home Water", "Energy temple_altar", self.home_water, self.energy_temple_altar, - lambda state: _has_energy_form(state, self.player)) # Need energy form + lambda state: _has_energy_form(state, self.player)) self.__connect_regions("Energy temple first area", "Energy temple second area", self.energy_temple_1, self.energy_temple_2, - lambda state: _has_energy_form(state, self.player)) # Need energy form + lambda state: _has_energy_form(state, self.player)) self.__connect_regions("Energy temple first area", "Energy temple idol room", self.energy_temple_1, self.energy_temple_idol, - lambda state: _has_fish_form(state, self.player)) # Need Fish form + lambda state: _has_fish_form(state, self.player)) self.__connect_regions("Energy temple idol room", "Energy temple boss area", self.energy_temple_idol, self.energy_temple_boss, - lambda state: _has_energy_form(state, self.player)) # Need Energy form + lambda state: _has_energy_form(state, self.player)) self.__connect_one_way_regions("Energy temple first area", "Energy temple boss area", self.energy_temple_1, self.energy_temple_boss, lambda state: _has_beast_form(state, self.player) and - _has_energy_form(state, - self.player)) # Need Beast forma and Energy form + _has_energy_form(state, self.player)) self.__connect_one_way_regions("Energy temple boss area", "Energy temple first area", self.energy_temple_boss, self.energy_temple_1, - lambda state: _has_energy_form(state, self.player)) # Need Energy form + lambda state: _has_energy_form(state, self.player)) self.__connect_regions("Energy temple second area", "Energy temple third area", self.energy_temple_2, self.energy_temple_3, lambda state: _has_bind_song(state, self.player) and - _has_energy_form(state, self.player)) # Need Bind form and Energy form + _has_energy_form(state, self.player)) self.__connect_regions("Energy temple boss area", "Energy temple blaster room", self.energy_temple_boss, self.energy_temple_blaster_room, lambda state: _has_nature_form(state, self.player) and _has_bind_song(state, self.player) and - _has_energy_form(state, - self.player)) # Need Nature form, Bind form and energy form + _has_energy_form(state, self.player)) self.__connect_regions("Energy temple first area", "Energy temple_blaster_room", self.energy_temple_1, self.energy_temple_blaster_room, lambda state: _has_nature_form(state, self.player) and _has_bind_song(state, self.player) and _has_energy_form(state, self.player) and - _has_beast_form(state, - self.player)) # Need Nature form, Bind form, energy form and Beast form + _has_beast_form(state, self.player)) self.__connect_regions("Home Water", "Open water top left area", self.home_water, self.openwater_tl, lambda state: _has_bind_song(state, self.player) and - _has_energy_form(state, self.player)) # Need Bind song and energy form + _has_energy_form(state, self.player)) def __connect_open_water_regions(self): """ @@ -544,12 +511,7 @@ def __connect_open_water_regions(self): self.openwater_tl, self.forest_br) self.__connect_regions("Open water top right area", "Open water top right area, turtle room", self.openwater_tr, self.openwater_tr_turtle, - lambda state: _has_beast_form(state, self.player)) # Beast form needed - self.__connect_one_way_regions("Open water top right area", "Open water top right area_urns", - self.openwater_tr, self.openwater_tr_urns, - lambda state: _has_damaging_item(state, self.player)) - self.__connect_one_way_regions("Open water top right area_urns", "Open water top right area", - self.openwater_tr_urns, self.openwater_tr) + lambda state: _has_beast_form(state, self.player)) self.__connect_regions("Open water top right area", "Open water bottom right", self.openwater_tr, self.openwater_br) self.__connect_regions("Open water top right area", "Mithalas city", @@ -558,106 +520,94 @@ def __connect_open_water_regions(self): self.openwater_tr, self.veil_bl) self.__connect_one_way_regions("Open water top right area", "Veil bottom right", self.openwater_tr, self.veil_br, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) self.__connect_one_way_regions("Veil bottom right", "Open water top right area", self.veil_br, self.openwater_tr, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) self.__connect_regions("Open water bottom left area", "Open water bottom right", self.openwater_bl, self.openwater_br) self.__connect_regions("Open water bottom left area", "skeleton_path", self.openwater_bl, self.skeleton_path) self.__connect_regions("Open water bottom left area", "Abyss left area", self.openwater_bl, self.abyss_l) - self.__connect_regions("Open water bottom left area", "Open water_bl_fp", - self.openwater_bl, self.openwater_bl_fp, - lambda state: _has_fish_form(state, self.player)) # Fish form self.__connect_regions("skeleton_path", "skeleton_path_sc", self.skeleton_path, self.skeleton_path_sc, - lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Open water bottom right", "Abyss right area", self.openwater_br, self.abyss_r) self.__connect_one_way_regions("Open water bottom right", "Arnassi", self.openwater_br, self.arnassi, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) self.__connect_one_way_regions("Arnassi", "Open water bottom right", self.arnassi, self.openwater_br) self.__connect_regions("Arnassi", "Arnassi path", self.arnassi, self.arnassi_path) self.__connect_one_way_regions("Arnassi path", "Arnassi crab boss area", self.arnassi_path, self.arnassi_crab_boss, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) self.__connect_one_way_regions("Arnassi crab boss area", "Arnassi path", self.arnassi_crab_boss, self.arnassi_path) self.__connect_regions("Arnassi path", "simon", self.arnassi_path, self.simon, - lambda state: _has_fish_form(state, self.player)) # Fish form needed + lambda state: _has_fish_form(state, self.player)) def __connect_mithalas_regions(self): """ Connect entrances of the different regions around Mithalas """ - self.__connect_one_way_regions("Mithalas city", "Mithalas city_urns", - self.mithalas_city, self.mithalas_city_urns, - lambda state: _has_energy_form(state, self.player)) # Energy form needed - self.__connect_one_way_regions("Mithalas city_urns", "Mithalas city", - self.mithalas_city_urns, self.mithalas_city) self.__connect_one_way_regions("Mithalas city", "Mithalas city_top_path", self.mithalas_city, self.mithalas_city_top_path, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) self.__connect_one_way_regions("Mithalas city_top_path", "Mithalas city", self.mithalas_city_top_path, self.mithalas_city) - self.__connect_regions("Mithalas city_top_path", "Mithalas city_top_path_urn", - self.mithalas_city_top_path, self.mithalas_city_top_path_urn, - lambda state: _has_energy_form(state, self.player)) # Energy form needed self.__connect_regions("Mithalas city", "Mithalas city home with fishpass", self.mithalas_city, self.mithalas_city_fishpass, - lambda state: _has_fish_form(state, self.player)) # Fish form needed + lambda state: _has_fish_form(state, self.player)) self.__connect_regions("Mithalas city", "Cathedral left area", self.mithalas_city, self.cathedral_l, - lambda state: _has_fish_form(state, self.player)) # Fish form needed + lambda state: _has_fish_form(state, self.player)) self.__connect_one_way_regions("Mithalas city top path", "Cathedral left area, flower tube", self.mithalas_city_top_path, self.cathedral_l_tube, - lambda state: _has_nature_form(state, self.player)) # Nature form + lambda state: _has_nature_form(state, self.player)) self.__connect_one_way_regions("Cathedral left area, flower tube area", "Mithalas city top path", self.cathedral_l_tube, self.mithalas_city_top_path, lambda state: _has_beast_form(state, self.player) and - _has_nature_form(state, self.player)) # Nature form + _has_nature_form(state, self.player)) self.__connect_regions("Cathedral left area flower tube area", "Cathedral left area, spirit crystals", self.cathedral_l_tube, self.cathedral_l_sc, - lambda state: _has_spirit_form(state, self.player)) # spirit form needed + lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Cathedral left area_flower tube area", "Cathedral left area", self.cathedral_l_tube, self.cathedral_l, - lambda state: _has_spirit_form(state, self.player)) # spirit form needed + lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Cathedral left area", "Cathedral left area, spirit crystals", self.cathedral_l, self.cathedral_l_sc, - lambda state: _has_spirit_form(state, self.player)) # spirit form needed - self.__connect_regions("Cathedral left area", "Cathedral left area urns", - self.cathedral_l, self.cathedral_l_urns, - lambda state: _has_energy_form(state, self.player)) # energy form needed + lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Cathedral left area", "Cathedral boss left area", - self.cathedral_l, self.cathedral_boss_l) # ToDo: beast form needed and Location mithalas boss needed + self.cathedral_l, self.cathedral_boss_l, + lambda state: _has_beast_form(state, self.player) and + state.has("Mithalan God beated", self.player)) self.__connect_regions("Cathedral left area", "Cathedral underground", self.cathedral_l, self.cathedral_underground, lambda state: _has_beast_form(state, self.player) and - _has_bind_song(state, self.player)) # beast form and bind song needed + _has_bind_song(state, self.player)) self.__connect_regions("Cathedral left area", "Cathedral right area", self.cathedral_l, self.cathedral_r, lambda state: _has_bind_song(state, self.player) and - _has_energy_form(state, self.player)) # bind song and energy form needed + _has_energy_form(state, self.player)) self.__connect_regions("Cathedral right area", "Cathedral underground", self.cathedral_r, self.cathedral_underground, - lambda state: _has_energy_form(state, self.player)) # energy form needed + lambda state: _has_energy_form(state, self.player)) self.__connect_one_way_regions("Cathedral underground", "Cathedral boss left area", self.cathedral_underground, self.cathedral_boss_r, - lambda state: _has_energy_form(state, self.player)) # bind song and energy form needed + lambda state: _has_energy_form(state, self.player)) self.__connect_one_way_regions("Cathedral boss left area", "Cathedral underground", self.cathedral_boss_r, self.cathedral_underground, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) self.__connect_one_way_regions("Cathedral boss right area", "Cathedral boss left area", self.cathedral_boss_r, self.cathedral_boss_l, lambda state: _has_bind_song(state, self.player) and - _has_energy_form(state, self.player)) # bind song and energy form + _has_energy_form(state, self.player)) self.__connect_one_way_regions("Cathedral boss left area", "Cathedral boss right area", self.cathedral_boss_l, self.cathedral_boss_r) @@ -665,55 +615,46 @@ def __connect_forest_regions(self): """ Connect entrances of the different regions around the Kelp Forest """ - self.__connect_regions("forest bottom right", "forest_br_ship", - self.forest_br, self.forest_br_ship, - lambda state: _has_sun_form(state, self.player)) # Sun form needed self.__connect_regions("Forest bottom right", "Veil bottom left area", self.forest_br, self.veil_bl) self.__connect_regions("Forest bottom right", "Forest bottom left area", self.forest_br, self.forest_bl) self.__connect_regions("Forest bottom right", "Forest top right area", self.forest_br, self.forest_tr) - self.__connect_regions("Forest bottom left area", "Forest bottom left area, spirit crystals", - self.forest_bl, self.forest_bl_sc, - lambda state: _has_spirit_form(state, self.player)) # spirit form needed self.__connect_regions("Forest bottom left area", "Forest fish cave", self.forest_bl, self.forest_fish_cave) self.__connect_regions("Forest bottom left area", "Forest top left area", self.forest_bl, self.forest_tl) self.__connect_regions("Forest bottom left area", "Forest boss entrance", self.forest_bl, self.forest_boss_entrance, - lambda state: _has_nature_form(state, self.player)) # Nature form needed + lambda state: _has_nature_form(state, self.player)) self.__connect_regions("Forest top left area", "Forest top left area, fish pass", self.forest_tl, self.forest_tl_fp, lambda state: _has_nature_form(state, self.player) and _has_bind_song(state, self.player) and _has_energy_form(state, self.player) and - _has_fish_form(state, self.player)) # Nature form, Bind song, Energy form and Fish form needed + _has_fish_form(state, self.player)) self.__connect_regions("Forest top left area", "Forest top right area", self.forest_tl, self.forest_tr) self.__connect_regions("Forest top left area", "Forest boss entrance", self.forest_tl, self.forest_boss_entrance) self.__connect_regions("Forest boss area", "Forest boss entrance", self.forest_boss, self.forest_boss_entrance, - lambda state: _has_energy_form(state, self.player)) # Energy form needed - self.__connect_regions("Forest top right area", "Forest top right area dark place", - self.forest_tr, self.forest_tr_dark, - lambda state: _has_sun_form(state, self.player)) # Sun form needed + lambda state: _has_energy_form(state, self.player)) self.__connect_regions("Forest top right area", "Forest top right area fish pass", self.forest_tr, self.forest_tr_fp, - lambda state: _has_fish_form(state, self.player)) # Fish form needed + lambda state: _has_fish_form(state, self.player)) self.__connect_regions("Forest top right area", "Forest sprite cave", self.forest_tr, self.forest_sprite_cave) self.__connect_regions("Forest sprite cave", "Forest sprite cave flower tube", self.forest_sprite_cave, self.forest_sprite_cave_tube, - lambda state: _has_nature_form(state, self.player)) # Nature form needed + lambda state: _has_nature_form(state, self.player)) self.__connect_regions("Forest top right area", "Mermog cave", self.forest_tr_fp, self.mermog_cave) self.__connect_regions("Fermog cave", "Fermog boss", self.mermog_cave, self.mermog_boss, lambda state: _has_beast_form(state, self.player) and - _has_energy_form(state, self.player)) # Beast form and energy form needed + _has_energy_form(state, self.player)) def __connect_veil_regions(self): """ @@ -723,73 +664,54 @@ def __connect_veil_regions(self): self.veil_bl, self.veil_bl_fp, lambda state: _has_fish_form(state, self.player) and _has_bind_song(state, self.player) and - _has_energy_form(state, self.player)) # Fish form, bind song and Energy form needed + _has_energy_form(state, self.player)) self.__connect_regions("Veil bottom left area", "Veil bottom area spirit crystals path", self.veil_bl, self.veil_b_sc, - lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Veil bottom area spirit crystals path", "Veil bottom right", self.veil_b_sc, self.veil_br, - lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Veil bottom right", "Veil top left area", self.veil_br, self.veil_tl, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) self.__connect_regions("Veil top left area", "Veil_top left area, fish pass", self.veil_tl, self.veil_tl_fp, - lambda state: _has_fish_form(state, self.player)) # Fish form needed - self.__connect_regions("Veil top left area", "Veil_top left area, under the rock", - self.veil_tl, self.veil_tl_rock, - lambda state: _has_bind_song(state, self.player)) # Bind song needed + lambda state: _has_fish_form(state, self.player)) self.__connect_regions("Veil top left area", "Veil right of sun temple", self.veil_tl, self.veil_tr_r) self.__connect_regions("Veil top left area", "Turtle cave", self.veil_tl, self.turtle_cave) - self.__connect_regions("Turtle cave", "Turtle cave under the rocks", - self.turtle_cave, self.turtle_cave_rocks, - lambda state: _has_bind_song(state, self.player)) # Bind song needed self.__connect_regions("Turtle cave", "Turtle cave bubble cliff", self.turtle_cave, self.turtle_cave_bubble, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) self.__connect_regions("Veil right of sun temple", "Sun temple right area", self.veil_tr_r, self.sun_temple_r) self.__connect_regions("Sun temple right area", "Sun temple left area", self.sun_temple_r, self.sun_temple_l, - lambda state: _has_bind_song(state, self.player)) # bind song needed + lambda state: _has_bind_song(state, self.player)) self.__connect_regions("Sun temple left area", "Veil left of top sun temple", self.sun_temple_l, self.veil_tr_l) - self.__connect_regions("Sun temple left area", "Sun temple_boss left bottom area", - self.sun_temple_l, self.sun_temple_boss_lb) - self.__connect_one_way_regions("Sun temple_boss left bottom area", "Sun temple_boss top of left area", - self.sun_temple_boss_lb, self.sun_temple_boss_lt, - lambda state: _has_hot_soup(state, self.player) and - _has_beast_form(state, self.player))# Beast form needed - self.__connect_one_way_regions("Sun temple_boss top of left area", "Sun temple_boss left bottom area", - self.sun_temple_boss_lt, self.sun_temple_boss_lb) - self.__connect_regions("Sun temple_boss left bottom area", "Sun temple_boss right area", - self.sun_temple_boss_lb, self.sun_temple_boss_r, - lambda state: _has_energy_form(state, self.player)) # Energy form needed - self.__connect_one_way_regions("Sun temple_boss right area", "Veil left of sun temple", - self.sun_temple_boss_r, self.veil_tr_l) - self.__connect_one_way_regions( "Turtle cave bubble cliff", "Turtle cave top bubble", - self.turtle_cave_bubble, self.turtle_cave_top_bubble, - lambda state: _has_hot_soup(state, self.player) and - _has_beast_form(state, self.player)) # Beast form needed - self.__connect_one_way_regions( - "Turtle cave top bubble", "Turtle cave bubble cliff", - self.turtle_cave_top_bubble, self.turtle_cave_bubble) + self.__connect_regions("Sun temple left area", "Sun temple before boss area", + self.sun_temple_l, self.sun_temple_boss_path) + self.__connect_regions("Sun temple before boss area", "Sun temple boss area", + self.sun_temple_boss_path, self.sun_temple_boss, + lambda state: _has_energy_form(state, self.player)) + self.__connect_one_way_regions("Sun temple boss area", "Veil left of sun temple", + self.sun_temple_boss, self.veil_tr_l) self.__connect_one_way_regions("Veil left of sun temple", "Veil left of sun temple, water fall", self.veil_tr_l, self.veil_tr_water_fall, lambda state: _has_hot_soup(state, self.player) and - _has_beast_form(state, self.player))# Beast form needed + _has_beast_form(state, self.player)) self.__connect_one_way_regions("Veil left of sun temple, water fall", "Veil left of sun temple", self.veil_tr_water_fall, self.veil_tr_l) self.__connect_regions("Veil left of sun temple", "Octo cave top path", self.veil_tr_l, self.octo_cave_t, lambda state: _has_fish_form(state, self.player) and _has_sun_form(state, self.player) and - _has_beast_form(state, self.player)) # Fish, sun and beast form needed + _has_beast_form(state, self.player)) self.__connect_regions("Veil left of sun temple", "Octo cave bottom path", self.veil_tr_l, self.octo_cave_b, - lambda state: _has_fish_form(state, self.player)) # Fish form needed + lambda state: _has_fish_form(state, self.player)) def __connect_abyss_regions(self): """ @@ -797,44 +719,45 @@ def __connect_abyss_regions(self): """ self.__connect_regions("Abyss left area", "Abyss bottom of left area", self.abyss_l, self.abyss_lb, - lambda state: _has_nature_form(state, self.player)) # Nature form needed - self.__connect_regions("Abyss bottom of left area", "Abyss left area, fish pass", - self.abyss_lb, self.abyss_l_fp, - lambda state: _has_fish_form(state, self.player)) # Fish form needed + lambda state: _has_nature_form(state, self.player)) self.__connect_regions("Abyss left bottom area", "Sunken city right area", self.abyss_lb, self.sunken_city_r, - lambda state: _has_li(state, self.player)) # Li needed - self.__connect_regions( "Abyss left bottom area", "Body center area", - self.abyss_lb, self.body_c, - lambda state: _has_tongue_cleared(state, self.player)) + lambda state: _has_li(state, self.player)) + self.__connect_regions("Abyss left bottom area", "Body center area", + self.abyss_lb, self.body_c, + lambda state: _has_tongue_cleared(state, self.player)) self.__connect_regions("Abyss left area", "king_jellyfish_cave", self.abyss_l, self.king_jellyfish_cave, - lambda state: _has_energy_form(state, self.player)) # Energy form needed + lambda state: _has_energy_form(state, self.player) and + _has_beast_form(state, self.player)) self.__connect_regions("Abyss left area", "Abyss right area", self.abyss_l, self.abyss_r) self.__connect_regions("Abyss right area", "whale", self.abyss_r, self.whale, lambda state: _has_spirit_form(state, self.player) and - _has_sun_form(state, self.player)) # Spirit form and sun form needed + _has_sun_form(state, self.player)) self.__connect_regions("Abyss right area", "ice_cave", self.abyss_r, self.ice_cave, - lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Abyss right area", "bubble_cave", self.abyss_r, self.bubble_cave, - lambda state: _has_beast_form(state, self.player)) # Beast form needed + lambda state: _has_beast_form(state, self.player)) def __connect_sunken_city_regions(self): """ Connect entrances of the different regions around The Sunken City """ - self.__connect_regions("Sunken city right area", - "Sunken city left area", - self.sunken_city_r, self.sunken_city_l) + self.__connect_regions("Sunken city right area", "Sunken city left area", + self.sunken_city_r, self.sunken_city_l, + lambda state: _has_damaging_item(state, self.player)) self.__connect_regions("Sunken city left area", "Sunken city bedroom", self.sunken_city_l, self.sunken_city_l_bedroom, - lambda state: _has_spirit_form(state, self.player)) # Spirit form needed + lambda state: _has_spirit_form(state, self.player) and + _has_damaging_item(state, self.player)) self.__connect_regions("Sunken city left area", "Sunken city boss area", - self.sunken_city_l, self.sunken_city_boss) + self.sunken_city_l, self.sunken_city_boss, + lambda state: _has_beast_form(state, self.player) and + _has_energy_form(state, self.player)) def __connect_body_regions(self): """ @@ -848,17 +771,18 @@ def __connect_body_regions(self): self.body_c, self.body_rb) self.__connect_regions("Body center area", "Body bottom area", self.body_c, self.body_b, - lambda state: _has_body_doors_opened(state, self.player)) + lambda state: _has_dual_form(state, self.player)) self.__connect_regions("Body bottom area", "Final boss area", - self.body_b, self.final_boss, - lambda state: _has_body_doors_opened(state, self.player)) - self.__connect_regions("Final boss area", "Final boss tube", - self.final_boss, self.final_boss_tube, - lambda state: _has_nature_form(state, self.player)) # Nature form needed - self.__connect_one_way_regions("Final boss area", "Final boss third form area", - self.final_boss, self.final_boss_3_form) # ToDo: Need final boss conditions + self.body_b, self.final_boss_loby, + lambda state: _has_dual_form(state, self.player)) + self.__connect_regions("Before Final boss area", "Final boss tube", + self.final_boss_loby, self.final_boss_tube, + lambda state: _has_nature_form(state, self.player)) + self.__connect_one_way_regions("Before Final boss", "Final boss", + self.final_boss_loby, self.final_boss, + lambda state: _has_energy_form(state, self.player)) self.__connect_one_way_regions("final boss third form area", "final boss end", - self.final_boss_3_form, self.final_boss_end) + self.final_boss, self.final_boss_end) def connect_regions(self): """ @@ -887,36 +811,146 @@ def __add_event_location(self, region: Region, name: str, event_name: str): None, self.player)) + def __add_event_big_bosses(self): + """ + Add every bit bosses (other than the creator) events to the `world` + """ + self.__add_event_location(self.energy_temple_boss, + "Beating Fallen God", + "Fallen God beated") + self.__add_event_location(self.cathedral_boss_r, + "Beating Mithalan God", + "Mithalan God beated") + self.__add_event_location(self.forest_boss, + "Beating Drunian God", + "Drunian God beated") + self.__add_event_location(self.sun_temple_boss, + "Beating Sun God", + "Sun God beated") + self.__add_event_location(self.sunken_city_boss, + "Beating the Golem", + "The Golem beated") + + def __add_event_mini_bosses(self): + """ + Add every mini bosses (excluding Energy statue and Simon says) + events to the `world` + """ + self.__add_event_location(self.home_water_nautilus, + "Beating Nautilus Prime", + "Nautilus Prime beated") + self.__add_event_location(self.energy_temple_blaster_room, + "Beating Blaster Peg Prime", + "Blaster Peg Prime beated") + self.__add_event_location(self.mermog_boss, + "Beating Mermog", + "Mermog beated") + self.__add_event_location(self.cathedral_l_tube, + "Beating Mithalan priests", + "Mithalan priests beated") + self.__add_event_location(self.octo_cave_t, + "Beating Octopus Prime", + "Octopus Prime beated") + self.__add_event_location(self.arnassi_crab_boss, + "Beating Crabbius Maximus", + "Crabbius Maximus beated") + self.__add_event_location(self.bubble_cave, + "Beating Mantis Shrimp Prime", + "Mantis Shrimp Prime beated") + self.__add_event_location(self.king_jellyfish_cave, + "Beating King Jellyfish God Prime", + "King Jellyfish God Prime beated") + def add_event_locations(self): """ - Add every events (locations and items) to the `world` + Add every event (locations and items) to the `world` """ + self.__add_event_mini_bosses() + self.__add_event_big_bosses() self.__add_event_location(self.abyss_lb, "Sunken City cleared", "Body tongue cleared") - self.__add_event_location(self.body_l, - "Trotite spirit freed", - "Body door 1 opened") - self.__add_event_location(self.body_l, "Drask spirit freed", - "Body door 2 opened") - self.__add_event_location(self.body_rt, "Druniad spirit freed", - "Body door 3 opened") - self.__add_event_location(self.body_rb, "Erulian spirit freed", - "Body door 4 opened") self.__add_event_location(self.final_boss_end, "Objective complete", "Victory") + def __adjusting_urns_rules(self): + add_rule(self.world.get_location("Open water top right area, first urn in the Mithalas exit", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Open water top right area, second urn in the Mithalas exit", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Open water top right area, third urn in the Mithalas exit", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city, first urn in one of the homes", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city, second urn in one of the homes", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city, first urn in the city reserve", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city, second urn in the city reserve", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city, third urn in the city reserve", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city, urn in the cathedral flower tube entrance", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city castle, urn in the bedroom", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city castle, first urn of the single lamp path", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city castle, second urn of the single lamp path", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city castle, urn in the bottom room", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city castle, first urn on the entrance path", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Mithalas city castle, second urn on the entrance path", self.player), + lambda state: _has_damaging_item(state, self.player)) + + def adjusting_rules(self, options: AquariaOptions): + """ + Modify rules for single location or optional rules + """ + add_rule(self.world.get_location("Mithalan Dress in the Mithalas cathedral", self.player), + lambda state: _has_beast_form(state, self.player)) + add_rule(self.world.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), + lambda state: _has_fish_form(state, self.player)) + add_rule(self.world.get_location("Black pearl in the Kelp forest top right area", self.player), + lambda state: _has_sun_form(state, self.player)) # ToDo: Not needed in hard mode + add_rule(self.world.get_location("Walker baby in the Kelp forest bottom left area", self.player), + lambda state: _has_spirit_form(state, self.player)) + add_rule(self.world.get_location("Odd Container in the Kelp forest bottom right area", self.player), + lambda state: _has_sun_form(state, self.player)) # ToDo: Not needed in hard mode + add_rule(self.world.get_location("The veil top left area, bulb hidden behind the blocking rock", self.player), + lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Turtle Egg in the Turtle cave", self.player), + lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Urchin costume in the Turtle cave", self.player), + lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) + add_rule(self.world.get_location("Sun Worm path, first cliff bulb", self.player), + lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) + add_rule(self.world.get_location("Sun Worm path, second cliff bulb", self.player), + lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) + add_rule(self.world.get_location("Abyss left area, bulb in the bottom fish pass", self.player), + lambda state: _has_fish_form(state, self.player)) + add_rule(self.world.get_location("Anemone seed in the Song cave", self.player), + lambda state: _has_nature_form(state, self.player)) + if options.mini_bosses_to_beat.value > 0: + add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), + lambda state: _has_mini_bosses(state, self.player)) + if options.big_bosses_to_beat.value > 0: + add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), + lambda state: _has_big_bosses(state, self.player)) + def __add_home_water_regions_to_world(self): """ Add every region around home water to the `world` """ + self.world.regions.append(self.menu) self.world.regions.append(self.verse_cave_r) self.world.regions.append(self.verse_cave_l) self.world.regions.append(self.home_water) self.world.regions.append(self.home_water_nautilus) self.world.regions.append(self.naija_home) self.world.regions.append(self.song_cave) - self.world.regions.append(self.song_cave_anemone) self.world.regions.append(self.energy_temple_1) self.world.regions.append(self.energy_temple_2) self.world.regions.append(self.energy_temple_3) @@ -932,7 +966,6 @@ def __add_open_water_regions_to_world(self): self.world.regions.append(self.openwater_tr) self.world.regions.append(self.openwater_tr_turtle) self.world.regions.append(self.openwater_bl) - self.world.regions.append(self.openwater_bl_fp) self.world.regions.append(self.openwater_br) self.world.regions.append(self.skeleton_path) self.world.regions.append(self.skeleton_path_sc) @@ -946,12 +979,9 @@ def __add_mithalas_regions_to_world(self): Add every region around Mithalas to the `world` """ self.world.regions.append(self.mithalas_city) - self.world.regions.append(self.mithalas_city_urns) self.world.regions.append(self.mithalas_city_top_path) - self.world.regions.append(self.mithalas_city_top_path_urn) self.world.regions.append(self.mithalas_city_fishpass) self.world.regions.append(self.cathedral_l) - self.world.regions.append(self.cathedral_l_urns) self.world.regions.append(self.cathedral_l_tube) self.world.regions.append(self.cathedral_l_sc) self.world.regions.append(self.cathedral_r) @@ -966,12 +996,9 @@ def __add_forest_regions_to_world(self): self.world.regions.append(self.forest_tl) self.world.regions.append(self.forest_tl_fp) self.world.regions.append(self.forest_tr) - self.world.regions.append(self.forest_tr_dark) self.world.regions.append(self.forest_tr_fp) self.world.regions.append(self.forest_bl) - self.world.regions.append(self.forest_bl_sc) self.world.regions.append(self.forest_br) - self.world.regions.append(self.forest_br_ship) self.world.regions.append(self.forest_boss) self.world.regions.append(self.forest_boss_entrance) self.world.regions.append(self.forest_sprite_cave) @@ -986,7 +1013,6 @@ def __add_veil_regions_to_world(self): """ self.world.regions.append(self.veil_tl) self.world.regions.append(self.veil_tl_fp) - self.world.regions.append(self.veil_tl_rock) self.world.regions.append(self.veil_tr_l) self.world.regions.append(self.veil_tr_r) self.world.regions.append(self.veil_tr_water_fall) @@ -997,14 +1023,11 @@ def __add_veil_regions_to_world(self): self.world.regions.append(self.octo_cave_t) self.world.regions.append(self.octo_cave_b) self.world.regions.append(self.turtle_cave) - self.world.regions.append(self.turtle_cave_rocks) self.world.regions.append(self.turtle_cave_bubble) - self.world.regions.append(self.turtle_cave_top_bubble) self.world.regions.append(self.sun_temple_l) self.world.regions.append(self.sun_temple_r) - self.world.regions.append(self.sun_temple_boss_lt) - self.world.regions.append(self.sun_temple_boss_lb) - self.world.regions.append(self.sun_temple_boss_r) + self.world.regions.append(self.sun_temple_boss_path) + self.world.regions.append(self.sun_temple_boss) def __add_abyss_regions_to_world(self): """ @@ -1012,7 +1035,6 @@ def __add_abyss_regions_to_world(self): """ self.world.regions.append(self.abyss_l) self.world.regions.append(self.abyss_lb) - self.world.regions.append(self.abyss_l_fp) self.world.regions.append(self.abyss_r) self.world.regions.append(self.ice_cave) self.world.regions.append(self.bubble_cave) @@ -1032,9 +1054,9 @@ def __add_body_regions_to_world(self): self.world.regions.append(self.body_rt) self.world.regions.append(self.body_rb) self.world.regions.append(self.body_b) - self.world.regions.append(self.final_boss) + self.world.regions.append(self.final_boss_loby) self.world.regions.append(self.final_boss_tube) - self.world.regions.append(self.final_boss_3_form) + self.world.regions.append(self.final_boss) self.world.regions.append(self.final_boss_end) def add_regions_to_world(self): diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index a51cebb346d..e1ad6924131 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -6,7 +6,7 @@ from typing import List, Dict, ClassVar, Any from ..AutoWorld import World, WebWorld -from BaseClasses import Tutorial, MultiWorld, ItemClassification +from BaseClasses import Tutorial, MultiWorld, ItemClassification, LocationProgressType from .Items import item_table, AquariaItem, ItemType from .Locations import location_table from .Options import AquariaOptions @@ -120,11 +120,61 @@ def create_items(self) -> None: self.player) self.multiworld.itempool.append(item) + def __set_excluded_location(self): + if self.options.big_bosses_to_beat.value > 0: + self.multiworld.get_location("Fallen god tooth in the Energy temple", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Cathedral boss area, beating Mithalan God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Kelp forest boss area, beating Drunian God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Sun temple boss area, beating Sun God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Sunken city, bulb on the top of the boss area (boiler room)", + self.player).progress_type = LocationProgressType.EXCLUDED + if self.options.mini_bosses_to_beat.value > 0: + self.multiworld.get_location("Nautilus Egg in Home water", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Blaster egg in the Energy temple", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Mithalas castle, beating the priests", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Piranha Egg in the Mermog cave", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Dumbo Egg in the Octocave", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Verse egg in the Bubble cave", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("King Jellyfish cave, bulb in the right path from King Jelly", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Jellyfish Costume in the King Jellyfish cave", + self.player).progress_type = LocationProgressType.EXCLUDED + + # ToDo: Removing the following exclusion on Hard mode + self.multiworld.get_location("Sun Worm path, first cliff bulb", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Sun Worm path, second cliff bulb", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("The veil top right area, bulb in the top of the water fall", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Bubble cave, bulb in the left cave wall", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Verse egg in the Bubble cave", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Walker baby in the Kelp forest bottom left area", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + def set_rules(self) -> None: """ Launched when the Multiworld generator is ready to generate rules """ self.regions.add_event_locations() + self.regions.adjusting_rules(self.options) + self.__set_excluded_location() self.multiworld.completion_condition[self.player] = lambda \ state: state.has("Victory", self.player) @@ -163,4 +213,7 @@ def fill_slot_data(self) -> Dict[str, Any]: if self.options.aquarian_translation: aquarian_translation = True return {"ingredientReplacement": self.ingredients_substitution, - "aquarianTranslate": aquarian_translation} \ No newline at end of file + "aquarianTranslate": aquarian_translation, + "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} \ No newline at end of file From 2098f714920dbe9d7fa8e8a9e3601fff3ae823f2 Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 25 Mar 2024 17:59:02 -0400 Subject: [PATCH 08/56] The boss is Mergog and not Mermog --- worlds/aquaria/Options.py | 2 +- worlds/aquaria/Regions.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index a688ba93e49..4c52bef69f7 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -49,7 +49,7 @@ class BigBossesToBeat(Choice): class MiniBossesToBeat(Choice): """ A number of Minibosses to beat before having access to the creator (the final boss). Mini bosses are - "Nautilus Prime", "Blaster Peg Prime", "Mermog", "Mithalan priests", "Octopus Prime", "Crabbius Maximus", + "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. """ diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 3e9849f9356..d9007c43baf 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -93,7 +93,7 @@ def _has_mini_bosses(state, player: int) -> bool: """`player` in `state` has beated every big bosses""" return (state.has("Nautilus Prime beated", player) and state.has("Blaster Peg Prime beated", player) and - state.has("Mermog beated", player) and + state.has("Mergog beated", player) and state.has("Mithalan priests beated", player) and state.has("Octopus Prime beated", player) and state.has("Crabbius Maximus beated", player) and @@ -843,8 +843,8 @@ def __add_event_mini_bosses(self): "Beating Blaster Peg Prime", "Blaster Peg Prime beated") self.__add_event_location(self.mermog_boss, - "Beating Mermog", - "Mermog beated") + "Beating Mergog", + "Mergog beated") self.__add_event_location(self.cathedral_l_tube, "Beating Mithalan priests", "Mithalan priests beated") From 5b59c0ee236f8f617dc03b9df436e039ceaac28a Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 25 Mar 2024 22:02:53 -0400 Subject: [PATCH 09/56] Adding transportation turtle as Checks --- worlds/aquaria/Items.py | 11 +++++- worlds/aquaria/Locations.py | 13 +++++-- worlds/aquaria/Options.py | 17 +++++++-- worlds/aquaria/Regions.py | 70 ++++++++++++++++++++++++++++--------- worlds/aquaria/__init__.py | 52 ++++++++++++++++++++------- 5 files changed, 128 insertions(+), 35 deletions(-) diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index ff05c0846a7..984bc82163c 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -26,7 +26,7 @@ class ItemGroup(Enum): HEALTH = 3 UTILITY = 4 SONG = 5 - LOGIC = 6 + TURTLE = 6 class AquariaItem(Item): """ @@ -174,5 +174,14 @@ def __init__(self, name: str, classification: ItemClassification, "Fish form": (698122, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_fish "Spirit form": (698123, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_spirit "Dual form": (698124, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_dual + "Transturtle Veil top left": (698125, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_veil01 + "Transturtle Veil top right": (698126, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_veil02 + "Transturtle Open Water top left": (698127, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_openwater03 + "Transturtle Forest bottom left": (698128, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_forest04 + "Transturtle Home water": (698129, 1, ItemType.NORMAL, ItemGroup.TURTLE), # transport_mainarea + "Transturtle Abyss right": (698130, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_abyss03 + "Transturtle Final Boss": (698131, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_finalboss + "Transturtle Simon says": (698132, 1, ItemType.NORMAL, ItemGroup.TURTLE), # transport_forest05 + "Transturtle Arnassi ruins": (698133, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_seahorse } diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 81412e8eebc..226481fcda9 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -48,6 +48,7 @@ class AquariaLocations: "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, + "Home water, Transturtle": 698213, } locations_home_water_nautilus = { @@ -118,6 +119,7 @@ class AquariaLocations: } 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 = { @@ -144,6 +146,7 @@ class AquariaLocations: locations_arnassi_path = { "Arnassi statue in Arnassi Ruins": 698164, + "Arnassi Ruins, Transturtle": 698217, } locations_arnassi_crab_boss = { @@ -152,6 +155,7 @@ class AquariaLocations: locations_simon = { "Arnassi ruins, beating Simon says": 698156, + "Simon says area, Transturtle": 698216, } locations_mithalas_city = { @@ -261,6 +265,7 @@ class AquariaLocations: locations_forest_bl = { "Kelp Forest bottom left area, bulb close to the spirit cristals": 698054, "Walker baby in the Kelp forest bottom left area": 698186, + "Kelp Forest bottom left area, Transturtle": 698212, } locations_forest_br = { @@ -300,6 +305,7 @@ class AquariaLocations: "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 = { @@ -320,8 +326,9 @@ class AquariaLocations: "The veil top right area, golden starfish at the bottom right of the bottom path": 698180, } - locations_veil_tr_water_fall = { + 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 = { @@ -392,6 +399,7 @@ class AquariaLocations: "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 = { @@ -462,6 +470,7 @@ class AquariaLocations: "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 = { @@ -528,7 +537,7 @@ class AquariaLocations: **AquariaLocations.locations_turtle_cave, **AquariaLocations.locations_turtle_cave_bubble, **AquariaLocations.locations_veil_tr_r, - **AquariaLocations.locations_veil_tr_water_fall, + **AquariaLocations.locations_veil_tr_l, **AquariaLocations.locations_veil_bl, **AquariaLocations.locations_veil_b_sc, **AquariaLocations.locations_veil_bl_fp, diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index 4c52bef69f7..e41171f15f1 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -5,7 +5,7 @@ """ from dataclasses import dataclass -from Options import Toggle, Choice, DeathLink, PerGameCommonOptions +from Options import Toggle, Choice, DeathLink, PerGameCommonOptions, DefaultOnToggle class IngredientRandomizer(Choice): @@ -26,6 +26,18 @@ class DishRandomizer(Toggle): display_name = "Dish Randomizer" +class TurtleRandomizer(DefaultOnToggle): + """Randomize the transportation turtle.""" + display_name = "Turtle Randomizer" + + +class FinalTurtleRandomizer(Toggle): + """ + If randomisation of the transportation turtle is enable, also enable + the transportation turtle before the final boss.""" + display_name = "Final Turtle Randomisation" + + class AquarianTranslation(Toggle): """Translate to English the Aquarian scripture in the game.""" display_name = "Translate Aquarian" @@ -45,7 +57,6 @@ class BigBossesToBeat(Choice): default = 0 - class MiniBossesToBeat(Choice): """ A number of Minibosses to beat before having access to the creator (the final boss). Mini bosses are @@ -86,6 +97,8 @@ class AquariaOptions(PerGameCommonOptions): dish_randomizer: DishRandomizer aquarian_translation: AquarianTranslation objective: Objective + turtle_randomizer: TurtleRandomizer + final_turtle_randomisation: FinalTurtleRandomizer big_bosses_to_beat: BigBossesToBeat mini_bosses_to_beat: MiniBossesToBeat death_link: DeathLink diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index d9007c43baf..96666fd19e8 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -158,7 +158,6 @@ class AquariaRegions: veil_tl_fp: Region veil_tr_l: Region veil_tr_r: Region - veil_tr_water_fall: Region veil_bl: Region veil_b_sc: Region veil_bl_fp: Region @@ -342,11 +341,10 @@ def __create_veil(self): AquariaLocations.locations_turtle_cave) self.turtle_cave_bubble = self.__add_region("The veil top left area, turtle cave bubble cliff", AquariaLocations.locations_turtle_cave_bubble) - self.veil_tr_l = self.__add_region("The veil top right area, left of temple", None) + self.veil_tr_l = self.__add_region("The veil top right area, left of temple", + AquariaLocations.locations_veil_tr_l) self.veil_tr_r = self.__add_region("The veil top right area, right of temple", AquariaLocations.locations_veil_tr_r) - self.veil_tr_water_fall = self.__add_region("The veil top right area, top of the water fall", - AquariaLocations.locations_veil_tr_water_fall) self.octo_cave_t = self.__add_region("Octopus cave top entrance", AquariaLocations.locations_octo_cave_t) self.octo_cave_b = self.__add_region("Octopus cave bottom entrance", @@ -698,12 +696,6 @@ def __connect_veil_regions(self): lambda state: _has_energy_form(state, self.player)) self.__connect_one_way_regions("Sun temple boss area", "Veil left of sun temple", self.sun_temple_boss, self.veil_tr_l) - self.__connect_one_way_regions("Veil left of sun temple", "Veil left of sun temple, water fall", - self.veil_tr_l, self.veil_tr_water_fall, - lambda state: _has_hot_soup(state, self.player) and - _has_beast_form(state, self.player)) - self.__connect_one_way_regions("Veil left of sun temple, water fall", "Veil left of sun temple", - self.veil_tr_water_fall, self.veil_tr_l) self.__connect_regions("Veil left of sun temple", "Octo cave top path", self.veil_tr_l, self.octo_cave_t, lambda state: _has_fish_form(state, self.player) and @@ -784,6 +776,41 @@ def __connect_body_regions(self): self.__connect_one_way_regions("final boss third form area", "final boss end", self.final_boss, self.final_boss_end) + def __connect_transturtle(self, item_source: str, item_target: str, region_source: Region, region_target: Region, + rule=None): + if item_source != item_target: + if rule is None: + self.__connect_one_way_regions(item_source, item_target, region_source, region_target, + lambda state: state.has(item_target, self.player)) + else: + self.__connect_one_way_regions(item_source, item_target, region_source, region_target, rule) + + + def _connect_transturtle_to_other(self, item: str, region: Region): + self.__connect_transturtle(item, "Transturtle Veil top left", region, self.veil_tl) + self.__connect_transturtle(item, "Transturtle Veil top right", region, self.veil_tr_l) + self.__connect_one_way_regions(item, "Transturtle Open Water top left", region, self.openwater_tl) + self.__connect_one_way_regions(item, "Transturtle Forest bottom left", region, self.forest_bl) + self.__connect_one_way_regions(item, "Transturtle Home water", region, self.home_water) + self.__connect_one_way_regions(item, "Transturtle Abyss right", region, self.abyss_r, + lambda state: state.has("Transturtle Abyss right", self.player) and + _has_sun_form(state, self.player)) + self.__connect_one_way_regions(item, "Transturtle Final Boss", region, self.final_boss_tube) + self.__connect_one_way_regions(item, "Transturtle Simon says", region, self.simon) + self.__connect_one_way_regions(item, "Transturtle Arnassi ruins", region, self.arnassi_path, + lambda state: state.has("Transturtle Arnassi ruins", self.player) and + _has_fish_form(state, self.player)) + def __connect_transturtles(self): + self._connect_transturtle_to_other("Transturtle Veil top left", self.veil_tl) + self._connect_transturtle_to_other("Transturtle Veil top right", self.veil_tr_l) + self._connect_transturtle_to_other("Transturtle Open Water top left", self.openwater_tl) + self._connect_transturtle_to_other("Transturtle Forest bottom left", self.forest_bl) + self._connect_transturtle_to_other("Transturtle Home water", self.home_water) + self._connect_transturtle_to_other("Transturtle Abyss right", self.abyss_r) + self._connect_transturtle_to_other("Transturtle Final Boss", self.final_boss_tube) + self._connect_transturtle_to_other("Transturtle Simon says", self.simon) + self._connect_transturtle_to_other("Transturtle Arnassi ruins", self.arnassi_path) + def connect_regions(self): """ Connect every region (entrances and exits) @@ -796,6 +823,7 @@ def connect_regions(self): self.__connect_abyss_regions() self.__connect_sunken_city_regions() self.__connect_body_regions() + self.__connect_transturtles() def __add_event_location(self, region: Region, name: str, event_name: str): """ @@ -905,10 +933,25 @@ def __adjusting_urns_rules(self): add_rule(self.world.get_location("Mithalas city castle, second urn on the entrance path", self.player), lambda state: _has_damaging_item(state, self.player)) + def __adjusting_soup_rules(self): + """ + Modify rules for location that need soup + """ + add_rule(self.world.get_location("Urchin costume in the Turtle cave", self.player), + lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) + add_rule(self.world.get_location("Sun Worm path, first cliff bulb", self.player), + lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) + add_rule(self.world.get_location("Sun Worm path, second cliff bulb", self.player), + lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) + add_rule(self.world.get_location("The veil top right area, bulb in the top of the water fall", self.player), + lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) + def adjusting_rules(self, options: AquariaOptions): """ Modify rules for single location or optional rules """ + self.__adjusting_urns_rules() + self.__adjusting_soup_rules() add_rule(self.world.get_location("Mithalan Dress in the Mithalas cathedral", self.player), lambda state: _has_beast_form(state, self.player)) add_rule(self.world.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), @@ -923,12 +966,6 @@ def adjusting_rules(self, options: AquariaOptions): lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Turtle Egg in the Turtle cave", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Urchin costume in the Turtle cave", self.player), - lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) - add_rule(self.world.get_location("Sun Worm path, first cliff bulb", self.player), - lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) - add_rule(self.world.get_location("Sun Worm path, second cliff bulb", self.player), - lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) add_rule(self.world.get_location("Abyss left area, bulb in the bottom fish pass", self.player), lambda state: _has_fish_form(state, self.player)) add_rule(self.world.get_location("Anemone seed in the Song cave", self.player), @@ -1015,7 +1052,6 @@ def __add_veil_regions_to_world(self): self.world.regions.append(self.veil_tl_fp) self.world.regions.append(self.veil_tr_l) self.world.regions.append(self.veil_tr_r) - self.world.regions.append(self.veil_tr_water_fall) self.world.regions.append(self.veil_bl) self.world.regions.append(self.veil_b_sc) self.world.regions.append(self.veil_bl_fp) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index e1ad6924131..edea951470c 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -94,11 +94,14 @@ class AquariaWorld(World): regions: AquariaRegions "Used to manage Regions" + exclude: List[str] + def __init__(self, world: MultiWorld, player: int): """Initialisation of the Aquaria World""" super(AquariaWorld, self).__init__(world, player) self.regions = AquariaRegions(world, player) self.ingredients_substitution = [] + self.exclude = [] def create_regions(self) -> None: """ @@ -107,18 +110,39 @@ def create_regions(self) -> None: self.regions.add_regions_to_world() self.regions.connect_regions() + def __pre_fill_item(self, item_name: str, location_name: str): + """Pre-assign an item to a location""" + self.exclude.append(item_name) + data = item_table[item_name] + item = AquariaItem(item_name, ItemClassification.useful, data[0], self.player) + self.multiworld.get_location(location_name, self.player).place_locked_item(item) + def create_items(self) -> None: - """Create every items in the world""" + """Create every item in the world""" + if self.options.turtle_randomizer: + if not self.options.final_turtle_randomisation: + self.__pre_fill_item("Transturtle Final Boss", "Final boss area, Transturtle") + else: + self.__pre_fill_item("Transturtle Veil top left", "The veil top left area, Transturtle") + self.__pre_fill_item("Transturtle Veil top right", "The veil top right area, Transturtle") + self.__pre_fill_item("Transturtle Open Water top left", "Open water top right area, Transturtle") + self.__pre_fill_item("Transturtle Forest bottom left", "Kelp Forest bottom left area, Transturtle") + self.__pre_fill_item("Transturtle Home water", "Home water, Transturtle") + self.__pre_fill_item("Transturtle Abyss right", "Abyss right area, Transturtle") + self.__pre_fill_item("Transturtle Final Boss", "Final boss area, Transturtle") + # 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") + self.__pre_fill_item("Transturtle Arnassi ruins", "Simon says area, Transturtle") for name, data in item_table.items(): - classification: ItemClassification = ItemClassification.useful - if data[2] == ItemType.JUNK: - classification = ItemClassification.filler - elif data[2] == ItemType.PROGRESSION: - classification = ItemClassification.progression - for i in range(data[1]): - item = AquariaItem(name, classification, data[0], - self.player) - self.multiworld.itempool.append(item) + if name not in self.exclude: + classification: ItemClassification = ItemClassification.useful + if data[2] == ItemType.JUNK: + classification = ItemClassification.filler + elif data[2] == ItemType.PROGRESSION: + classification = ItemClassification.progression + for i in range(data[1]): + item = AquariaItem(name, classification, data[0], self.player) + self.multiworld.itempool.append(item) def __set_excluded_location(self): if self.options.big_bosses_to_beat.value > 0: @@ -149,7 +173,8 @@ def __set_excluded_location(self): self.player).progress_type = LocationProgressType.EXCLUDED self.multiworld.get_location("Jellyfish Costume in the King Jellyfish cave", self.player).progress_type = LocationProgressType.EXCLUDED - + self.multiworld.get_location("Final boss area, bulb in the boss second form room", + self.player).progress_type = LocationProgressType.EXCLUDED # ToDo: Removing the following exclusion on Hard mode self.multiworld.get_location("Sun Worm path, first cliff bulb", self.player).progress_type = ( LocationProgressType.EXCLUDED) @@ -168,6 +193,7 @@ def __set_excluded_location(self): self.multiworld.get_location("Walker baby in the Kelp forest bottom left area", self.player).progress_type = ( LocationProgressType.EXCLUDED) + def set_rules(self) -> None: """ Launched when the Multiworld generator is ready to generate rules @@ -175,10 +201,11 @@ def set_rules(self) -> None: self.regions.add_event_locations() self.regions.adjusting_rules(self.options) self.__set_excluded_location() + self.multiworld.completion_condition[self.player] = lambda \ state: state.has("Victory", self.player) - # for debugging purposes, you may want to visualize the layout of your world. + # for debugging purposes, you may want to visualize the layout of your world. # Uncomment the following code to write a PlantUML diagram to the file # "aquaria_world.puml" that can help you see whether your regions and locations # are connected and placed as desired @@ -199,7 +226,6 @@ def generate_basic(self): self.multiworld.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.multiworld.random.shuffle(dishes_substitution) From a0dedc044056354a97e20ed088a81d3522c34ff6 Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 26 Mar 2024 08:51:00 -0400 Subject: [PATCH 10/56] Fixing options --- worlds/aquaria/Locations.py | 7 ++- worlds/aquaria/Options.py | 19 +++--- worlds/aquaria/Regions.py | 116 +++++++++++++++++++++++------------- worlds/aquaria/__init__.py | 23 +++---- 4 files changed, 105 insertions(+), 60 deletions(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 226481fcda9..8bee7e45878 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -48,13 +48,16 @@ class AquariaLocations: "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, - "Home water, Transturtle": 698213, } locations_home_water_nautilus = { "Nautilus Egg in Home water": 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, @@ -524,6 +527,8 @@ class AquariaLocations: **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, diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index e41171f15f1..420cb4476be 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -26,17 +26,19 @@ class DishRandomizer(Toggle): display_name = "Dish Randomizer" -class TurtleRandomizer(DefaultOnToggle): +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 FinalTurtleRandomizer(Toggle): +class EarlyEnergyForm(DefaultOnToggle): """ - If randomisation of the transportation turtle is enable, also enable - the transportation turtle before the final boss.""" - display_name = "Final Turtle Randomisation" - + 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.""" @@ -54,6 +56,7 @@ class BigBossesToBeat(Choice): option_2 = 2 option_3 = 3 option_4 = 4 + option_5 = 5 default = 0 @@ -98,7 +101,7 @@ class AquariaOptions(PerGameCommonOptions): aquarian_translation: AquarianTranslation objective: Objective turtle_randomizer: TurtleRandomizer - final_turtle_randomisation: FinalTurtleRandomizer + early_energy_form: EarlyEnergyForm big_bosses_to_beat: BigBossesToBeat mini_bosses_to_beat: MiniBossesToBeat death_link: DeathLink diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 96666fd19e8..81a44979946 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -101,6 +101,11 @@ def _has_mini_bosses(state, player: int) -> bool: state.has("King Jellyfish God Prime beated", player) ) +def _has_secrets(state, player: int) -> bool: + return (state.has("First secret obtained",player) and + state.has("Second secret obtained",player) and + state.has("Third secret obtained",player)) + class AquariaRegions: """ @@ -111,6 +116,7 @@ class AquariaRegions: verse_cave_l: Region home_water: Region home_water_nautilus: Region + home_water_transturtle: Region naija_home: Region song_cave: Region energy_temple_1: Region @@ -217,7 +223,7 @@ def __add_region(self, hint: str, - def __create_home_water_area(self): + def __create_home_water_area(self) -> None: """ Create the `verse_cave`, `home_water` and `song_cave*` regions """ @@ -229,10 +235,12 @@ def __create_home_water_area(self): self.home_water = self.__add_region("Home Water", AquariaLocations.locations_home_water) self.home_water_nautilus = self.__add_region("Home Water, Nautilus nest", AquariaLocations.locations_home_water_nautilus) + self.home_water_transturtle = self.__add_region("Home Water, turtle room", + AquariaLocations.locations_home_water_transturtle) self.naija_home = self.__add_region("Naija's home", AquariaLocations.locations_naija_home) self.song_cave = self.__add_region("Song cave", AquariaLocations.locations_song_cave) - def __create_energy_temple(self): + def __create_energy_temple(self) -> None: """ Create the `energy_temple_*` regions """ @@ -251,7 +259,7 @@ def __create_energy_temple(self): self.energy_temple_blaster_room = self.__add_region("Energy temple blaster room", AquariaLocations.locations_energy_temple_blaster_room) - def __create_openwater(self): + def __create_openwater(self) -> None: """ Create the `openwater_*`, `skeleton_path`, `arnassi*` and `simon` regions @@ -276,7 +284,7 @@ def __create_openwater(self): self.arnassi_crab_boss = self.__add_region("Arnassi Ruins, Crabbius Maximus lair", AquariaLocations.locations_arnassi_crab_boss) - def __create_mithalas(self): + def __create_mithalas(self) -> None: """ Create the `mithalas_city*` and `cathedral_*` regions """ @@ -299,7 +307,7 @@ def __create_mithalas(self): AquariaLocations.locations_cathedral_boss) self.cathedral_boss_l = self.__add_region("Mithalas Cathedral, after Mithalan God room", None) - def __create_forest(self): + def __create_forest(self) -> None: """ Create the `forest_*` dans `mermog_cave` regions """ @@ -330,7 +338,7 @@ def __create_forest(self): self.forest_fish_cave = self.__add_region("Kelp forest fish cave", AquariaLocations.locations_forest_fish_cave) - def __create_veil(self): + def __create_veil(self) -> None: """ Create the `veil_*`, `octo_cave` and `turtle_cave` regions """ @@ -358,7 +366,7 @@ def __create_veil(self): self.veil_br = self.__add_region("The veil bottom right area", AquariaLocations.locations_veil_br) - def __create_sun_temple(self): + def __create_sun_temple(self) -> None: """ Create the `sun_temple*` regions """ @@ -371,7 +379,7 @@ def __create_sun_temple(self): self.sun_temple_boss = self.__add_region("Sun temple boss area", AquariaLocations.locations_sun_temple_boss) - def __create_abyss(self): + def __create_abyss(self) -> None: """ Create the `abyss_*`, `ice_cave`, `king_jellyfish_cave` and `whale` regions @@ -386,7 +394,7 @@ def __create_abyss(self): AquariaLocations.locations_king_jellyfish_cave) self.whale = self.__add_region("Inside the whale", AquariaLocations.locations_whale) - def __create_sunken_city(self): + def __create_sunken_city(self) -> None: """ Create the `sunken_city_*` regions """ @@ -399,7 +407,7 @@ def __create_sunken_city(self): self.sunken_city_boss = self.__add_region("Sunken city boss area", AquariaLocations.locations_sunken_city_boss) - def __create_body(self): + def __create_body(self) -> None: """ Create the `body_*` and `final_boss* regions """ @@ -422,7 +430,7 @@ def __create_body(self): def __connect_one_way_regions(self, source_name: str, destination_name: str, source_region: Region, - destination_region: Region, rule=None): + destination_region: Region, rule=None) -> None: """ Connect from the `source_region` to the `destination_region` """ @@ -434,14 +442,14 @@ def __connect_one_way_regions(self, source_name: str, destination_name: str, def __connect_regions(self, source_name: str, destination_name: str, source_region: Region, - destination_region: Region, rule=None): + destination_region: Region, rule=None) -> None: """ Connect the `source_region` and the `destination_region` (two-way) """ self.__connect_one_way_regions(source_name, destination_name, source_region, destination_region, rule) self.__connect_one_way_regions(destination_name, source_name, destination_region, source_region, rule) - def __connect_home_water_regions(self): + def __connect_home_water_regions(self) -> None: """ Connect entrances of the different regions around `home_water` """ @@ -452,9 +460,12 @@ def __connect_home_water_regions(self): self.__connect_regions("Verse cave", "Home water", self.verse_cave_l, self.home_water) self.__connect_regions("Home Water", "Haija's home", self.home_water, self.naija_home) self.__connect_regions("Home Water", "Song cave", self.home_water, self.song_cave) - self.__connect_regions("Home Water", "home_water_nautilus", + self.__connect_regions("Home Water", "Home water, nautilus nest", self.home_water, self.home_water_nautilus, lambda state: _has_energy_form(state, self.player)) + self.__connect_regions("Home Water", "Home water transturtle room", + self.home_water, self.home_water_transturtle, + lambda state: _has_bind_song(state, self.player)) self.__connect_regions("Home Water", "Energy temple first area", self.home_water, self.energy_temple_1, lambda state: _has_bind_song(state, self.player)) @@ -497,7 +508,7 @@ def __connect_home_water_regions(self): lambda state: _has_bind_song(state, self.player) and _has_energy_form(state, self.player)) - def __connect_open_water_regions(self): + def __connect_open_water_regions(self) -> None: """ Connect entrances of the different regions around open water """ @@ -548,7 +559,7 @@ def __connect_open_water_regions(self): self.__connect_regions("Arnassi path", "simon", self.arnassi_path, self.simon, lambda state: _has_fish_form(state, self.player)) - def __connect_mithalas_regions(self): + def __connect_mithalas_regions(self) -> None: """ Connect entrances of the different regions around Mithalas """ @@ -609,7 +620,7 @@ def __connect_mithalas_regions(self): self.__connect_one_way_regions("Cathedral boss left area", "Cathedral boss right area", self.cathedral_boss_l, self.cathedral_boss_r) - def __connect_forest_regions(self): + def __connect_forest_regions(self) -> None: """ Connect entrances of the different regions around the Kelp Forest """ @@ -654,7 +665,7 @@ def __connect_forest_regions(self): lambda state: _has_beast_form(state, self.player) and _has_energy_form(state, self.player)) - def __connect_veil_regions(self): + def __connect_veil_regions(self) -> None: """ Connect entrances of the different regions around The Veil """ @@ -705,7 +716,7 @@ def __connect_veil_regions(self): self.veil_tr_l, self.octo_cave_b, lambda state: _has_fish_form(state, self.player)) - def __connect_abyss_regions(self): + def __connect_abyss_regions(self) -> None: """ Connect entrances of the different regions around The Abyss """ @@ -735,7 +746,7 @@ def __connect_abyss_regions(self): self.abyss_r, self.bubble_cave, lambda state: _has_beast_form(state, self.player)) - def __connect_sunken_city_regions(self): + def __connect_sunken_city_regions(self) -> None: """ Connect entrances of the different regions around The Sunken City """ @@ -751,7 +762,7 @@ def __connect_sunken_city_regions(self): lambda state: _has_beast_form(state, self.player) and _has_energy_form(state, self.player)) - def __connect_body_regions(self): + def __connect_body_regions(self) -> None: """ Connect entrances of the different regions around The body """ @@ -777,7 +788,8 @@ def __connect_body_regions(self): self.final_boss, self.final_boss_end) def __connect_transturtle(self, item_source: str, item_target: str, region_source: Region, region_target: Region, - rule=None): + rule=None) -> None: + """Connect a single transturtle to another one""" if item_source != item_target: if rule is None: self.__connect_one_way_regions(item_source, item_target, region_source, region_target, @@ -786,7 +798,8 @@ def __connect_transturtle(self, item_source: str, item_target: str, region_sourc self.__connect_one_way_regions(item_source, item_target, region_source, region_target, rule) - def _connect_transturtle_to_other(self, item: str, region: Region): + def _connect_transturtle_to_other(self, item: str, region: Region) -> None: + """Connect a single transturtle to all others""" self.__connect_transturtle(item, "Transturtle Veil top left", region, self.veil_tl) self.__connect_transturtle(item, "Transturtle Veil top right", region, self.veil_tr_l) self.__connect_one_way_regions(item, "Transturtle Open Water top left", region, self.openwater_tl) @@ -800,7 +813,8 @@ def _connect_transturtle_to_other(self, item: str, region: Region): self.__connect_one_way_regions(item, "Transturtle Arnassi ruins", region, self.arnassi_path, lambda state: state.has("Transturtle Arnassi ruins", self.player) and _has_fish_form(state, self.player)) - def __connect_transturtles(self): + def __connect_transturtles(self) -> None: + """Connect every transturtle with others""" self._connect_transturtle_to_other("Transturtle Veil top left", self.veil_tl) self._connect_transturtle_to_other("Transturtle Veil top right", self.veil_tr_l) self._connect_transturtle_to_other("Transturtle Open Water top left", self.openwater_tl) @@ -811,7 +825,8 @@ def __connect_transturtles(self): self._connect_transturtle_to_other("Transturtle Simon says", self.simon) self._connect_transturtle_to_other("Transturtle Arnassi ruins", self.arnassi_path) - def connect_regions(self): + + def connect_regions(self) -> None: """ Connect every region (entrances and exits) """ @@ -825,7 +840,7 @@ def connect_regions(self): self.__connect_body_regions() self.__connect_transturtles() - def __add_event_location(self, region: Region, name: str, event_name: str): + def __add_event_location(self, region: Region, name: str, event_name: str) -> None: """ Add an event to the `region` with the name `name` and the item `event_name` @@ -839,7 +854,7 @@ def __add_event_location(self, region: Region, name: str, event_name: str): None, self.player)) - def __add_event_big_bosses(self): + def __add_event_big_bosses(self) -> None: """ Add every bit bosses (other than the creator) events to the `world` """ @@ -859,7 +874,7 @@ def __add_event_big_bosses(self): "Beating the Golem", "The Golem beated") - def __add_event_mini_bosses(self): + def __add_event_mini_bosses(self) -> None: """ Add every mini bosses (excluding Energy statue and Simon says) events to the `world` @@ -889,19 +904,34 @@ def __add_event_mini_bosses(self): "Beating King Jellyfish God Prime", "King Jellyfish God Prime beated") - def add_event_locations(self): + def __add_event_secrets(self) -> None: + """ + Add secrets events to the `world` + """ + self.__add_event_location(self.whale, + "First secret", + "First secret obtained") + self.__add_event_location(self.mithalas_city, + "Second secret", + "Second secret obtained") + self.__add_event_location(self.sun_temple_l, + "Third secret", + "Third secret obtained") + + def add_event_locations(self) -> None: """ Add every event (locations and items) to the `world` """ self.__add_event_mini_bosses() self.__add_event_big_bosses() + self.__add_event_secrets() self.__add_event_location(self.abyss_lb, "Sunken City cleared", "Body tongue cleared") self.__add_event_location(self.final_boss_end, "Objective complete", "Victory") - def __adjusting_urns_rules(self): + def __adjusting_urns_rules(self) -> None: add_rule(self.world.get_location("Open water top right area, first urn in the Mithalas exit", self.player), lambda state: _has_damaging_item(state, self.player)) add_rule(self.world.get_location("Open water top right area, second urn in the Mithalas exit", self.player), @@ -933,7 +963,7 @@ def __adjusting_urns_rules(self): add_rule(self.world.get_location("Mithalas city castle, second urn on the entrance path", self.player), lambda state: _has_damaging_item(state, self.player)) - def __adjusting_soup_rules(self): + def __adjusting_soup_rules(self) -> None: """ Modify rules for location that need soup """ @@ -946,7 +976,7 @@ def __adjusting_soup_rules(self): add_rule(self.world.get_location("The veil top right area, bulb in the top of the water fall", self.player), lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) - def adjusting_rules(self, options: AquariaOptions): + def adjusting_rules(self, options: AquariaOptions) -> None: """ Modify rules for single location or optional rules """ @@ -976,8 +1006,14 @@ def adjusting_rules(self, options: AquariaOptions): if options.big_bosses_to_beat.value > 0: add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_big_bosses(state, self.player)) + if options.objective.value == 1: + add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), + lambda state: _has_secrets(state, self.player)) + if options.early_energy_form: + add_rule(self.world.get_entrance("Home Water to Home water transturtle room", self.player), + lambda state: _has_energy_form(state, self.player)) - def __add_home_water_regions_to_world(self): + def __add_home_water_regions_to_world(self) -> None: """ Add every region around home water to the `world` """ @@ -995,7 +1031,7 @@ def __add_home_water_regions_to_world(self): self.world.regions.append(self.energy_temple_blaster_room) self.world.regions.append(self.energy_temple_altar) - def __add_open_water_regions_to_world(self): + def __add_open_water_regions_to_world(self) -> None: """ Add every region around open water to the `world` """ @@ -1011,7 +1047,7 @@ def __add_open_water_regions_to_world(self): self.world.regions.append(self.arnassi_crab_boss) self.world.regions.append(self.simon) - def __add_mithalas_regions_to_world(self): + def __add_mithalas_regions_to_world(self) -> None: """ Add every region around Mithalas to the `world` """ @@ -1026,7 +1062,7 @@ def __add_mithalas_regions_to_world(self): self.world.regions.append(self.cathedral_boss_l) self.world.regions.append(self.cathedral_boss_r) - def __add_forest_regions_to_world(self): + def __add_forest_regions_to_world(self) -> None: """ Add every region around the kelp forest to the `world` """ @@ -1044,7 +1080,7 @@ def __add_forest_regions_to_world(self): self.world.regions.append(self.mermog_boss) self.world.regions.append(self.forest_fish_cave) - def __add_veil_regions_to_world(self): + def __add_veil_regions_to_world(self) -> None: """ Add every region around the Veil to the `world` """ @@ -1065,7 +1101,7 @@ def __add_veil_regions_to_world(self): self.world.regions.append(self.sun_temple_boss_path) self.world.regions.append(self.sun_temple_boss) - def __add_abyss_regions_to_world(self): + def __add_abyss_regions_to_world(self) -> None: """ Add every region around the Abyss to the `world` """ @@ -1081,7 +1117,7 @@ def __add_abyss_regions_to_world(self): self.world.regions.append(self.sunken_city_boss) self.world.regions.append(self.sunken_city_l_bedroom) - def __add_body_regions_to_world(self): + def __add_body_regions_to_world(self) -> None: """ Add every region around the Body to the `world` """ @@ -1095,7 +1131,7 @@ def __add_body_regions_to_world(self): self.world.regions.append(self.final_boss) self.world.regions.append(self.final_boss_end) - def add_regions_to_world(self): + def add_regions_to_world(self) -> None: """ Add every region to the `world` """ diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index edea951470c..c5bb3b2e187 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -110,7 +110,7 @@ def create_regions(self) -> None: self.regions.add_regions_to_world() self.regions.connect_regions() - def __pre_fill_item(self, item_name: str, location_name: str): + def __pre_fill_item(self, item_name: str, location_name: str) -> None: """Pre-assign an item to a location""" self.exclude.append(item_name) data = item_table[item_name] @@ -119,8 +119,8 @@ def __pre_fill_item(self, item_name: str, location_name: str): def create_items(self) -> None: """Create every item in the world""" - if self.options.turtle_randomizer: - if not self.options.final_turtle_randomisation: + 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") else: self.__pre_fill_item("Transturtle Veil top left", "The veil top left area, Transturtle") @@ -144,7 +144,7 @@ def create_items(self) -> None: item = AquariaItem(name, classification, data[0], self.player) self.multiworld.itempool.append(item) - def __set_excluded_location(self): + def __set_excluded_location(self) -> None: if self.options.big_bosses_to_beat.value > 0: self.multiworld.get_location("Fallen god tooth in the Energy temple", self.player).progress_type = ( LocationProgressType.EXCLUDED) @@ -180,20 +180,22 @@ def __set_excluded_location(self): LocationProgressType.EXCLUDED) self.multiworld.get_location("Sun Worm path, second cliff bulb", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("The veil top right area, bulb in the top of the water fall", self.player).progress_type = ( + self.multiworld.get_location("The veil top right area, bulb in the top of the water fall", + self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("Bubble cave, bulb in the left cave wall", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", self.player).progress_type = ( + self.multiworld.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", + self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("Verse egg in the Bubble cave", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", self.player).progress_type = ( + self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", + self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("Walker baby in the Kelp forest bottom left area", self.player).progress_type = ( LocationProgressType.EXCLUDED) - def set_rules(self) -> None: """ Launched when the Multiworld generator is ready to generate rules @@ -212,7 +214,7 @@ def set_rules(self) -> None: # from Utils import visualize_regions # visualize_regions(self.multiworld.get_region("Menu", self.player), "aquaria_world.puml") - def generate_basic(self): + def generate_basic(self) -> None: """ Player-specific randomization that does not affect logic. Used to fill then `ingredients_substitution` list @@ -233,7 +235,6 @@ def generate_basic(self): self.ingredients_substitution.extend(simple_ingredients_substitution) self.ingredients_substitution.extend(dishes_substitution) - def fill_slot_data(self) -> Dict[str, Any]: aquarian_translation = False if self.options.aquarian_translation: @@ -242,4 +243,4 @@ def fill_slot_data(self) -> Dict[str, Any]: "aquarianTranslate": aquarian_translation, "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} \ No newline at end of file + "bigbosses_to_kill": self.options.big_bosses_to_beat.value} From 7de67c194c954b76552383f2080593fe85f94193 Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 26 Mar 2024 20:28:52 -0400 Subject: [PATCH 11/56] Needing Li, sun and dual form for last boss --- worlds/aquaria/Regions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index a834399b55e..b5c4b9cd0b2 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -784,7 +784,8 @@ def __connect_body_regions(self) -> None: lambda state: _has_nature_form(state, self.player)) self.__connect_one_way_regions("Before Final boss", "Final boss", self.final_boss_loby, self.final_boss, - lambda state: _has_energy_form(state, self.player)) + lambda state: _has_energy_form(state, self.player) and + _has_li(state, self.player) and _has_dual_form(state, self.player)) self.__connect_one_way_regions("final boss third form area", "final boss end", self.final_boss, self.final_boss_end) From 802743cfdb0229a75894a65819d43ce6761a3967 Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 26 Mar 2024 20:29:53 -0400 Subject: [PATCH 12/56] Needing sun form for final boss --- worlds/aquaria/Regions.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index b5c4b9cd0b2..37e772d38f5 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -785,7 +785,9 @@ def __connect_body_regions(self) -> None: self.__connect_one_way_regions("Before Final boss", "Final boss", self.final_boss_loby, self.final_boss, lambda state: _has_energy_form(state, self.player) and - _has_li(state, self.player) and _has_dual_form(state, self.player)) + _has_li(state, self.player) and + _has_dual_form(state, self.player) and + _has_sun_form(state, self.player)) self.__connect_one_way_regions("final boss third form area", "final boss end", self.final_boss, self.final_boss_end) From 0afe679e8d11b155473b51a39deffda8bedd7c83 Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 26 Mar 2024 20:41:57 -0400 Subject: [PATCH 13/56] Bind song also important for the final boss --- worlds/aquaria/Regions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 37e772d38f5..c5aba90c9fc 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -787,7 +787,8 @@ def __connect_body_regions(self) -> None: lambda state: _has_energy_form(state, self.player) and _has_li(state, self.player) and _has_dual_form(state, self.player) and - _has_sun_form(state, self.player)) + _has_sun_form(state, self.player) and + _has_bind_song(state, self.player)) self.__connect_one_way_regions("final boss third form area", "final boss end", self.final_boss, self.final_boss_end) From ccc4bc5bf8b072e9002b95d29c02c473a63bef70 Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 26 Mar 2024 20:46:38 -0400 Subject: [PATCH 14/56] Some merging bug fix --- worlds/aquaria/Regions.py | 16 +++++++--------- worlds/aquaria/__init__.py | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index c5aba90c9fc..2078db73ead 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -179,7 +179,6 @@ class AquariaRegions: abyss_l: Region abyss_lb: Region abyss_r: Region - abyss_r_secret_1: Region ice_cave: Region bubble_cave: Region king_jellyfish_cave: Region @@ -498,7 +497,7 @@ def __connect_home_water_regions(self) -> None: lambda state: _has_nature_form(state, self.player) and _has_bind_song(state, self.player) and _has_energy_form(state, self.player)) - self.__connect_regions("Energy temple first area", "Energy temple_blaster_room", + self.__connect_regions("Energy temple first area", "Energy temple blaster room", self.energy_temple_1, self.energy_temple_blaster_room, lambda state: _has_nature_form(state, self.player) and _has_bind_song(state, self.player) and @@ -536,11 +535,11 @@ def __connect_open_water_regions(self) -> None: lambda state: _has_beast_form(state, self.player)) self.__connect_regions("Open water bottom left area", "Open water bottom right", self.openwater_bl, self.openwater_br) - self.__connect_regions("Open water bottom left area", "skeleton_path", + self.__connect_regions("Open water bottom left area", "sSkeleton path", self.openwater_bl, self.skeleton_path) self.__connect_regions("Open water bottom left area", "Abyss left area", self.openwater_bl, self.abyss_l) - self.__connect_regions("skeleton_path", "skeleton_path_sc", + self.__connect_regions("Skeleton path", "skeleton_path_sc", self.skeleton_path, self.skeleton_path_sc, lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Open water bottom right", "Abyss right area", @@ -564,7 +563,7 @@ def __connect_mithalas_regions(self) -> None: """ Connect entrances of the different regions around Mithalas """ - self.__connect_one_way_regions("Mithalas city", "Mithalas city_top_path", + self.__connect_one_way_regions("Mithalas city", "Mithalas city top path", self.mithalas_city, self.mithalas_city_top_path, lambda state: _has_beast_form(state, self.player)) self.__connect_one_way_regions("Mithalas city_top_path", "Mithalas city", @@ -730,7 +729,7 @@ def __connect_abyss_regions(self) -> None: self.__connect_regions("Abyss left bottom area", "Body center area", self.abyss_lb, self.body_c, lambda state: _has_tongue_cleared(state, self.player)) - self.__connect_regions("Abyss left area", "king_jellyfish_cave", + self.__connect_regions("Abyss left area", "King jellyfish cave", self.abyss_l, self.king_jellyfish_cave, lambda state: _has_energy_form(state, self.player) and _has_beast_form(state, self.player)) @@ -740,10 +739,10 @@ def __connect_abyss_regions(self) -> None: self.abyss_r, self.whale, lambda state: _has_spirit_form(state, self.player) and _has_sun_form(state, self.player)) - self.__connect_regions("Abyss right area", "ice_cave", + self.__connect_regions("Abyss right area", "Ice cave", self.abyss_r, self.ice_cave, lambda state: _has_spirit_form(state, self.player)) - self.__connect_regions("Abyss right area", "bubble_cave", + self.__connect_regions("Abyss right area", "Bubble cave", self.abyss_r, self.bubble_cave, lambda state: _has_beast_form(state, self.player)) @@ -1113,7 +1112,6 @@ def __add_abyss_regions_to_world(self) -> None: self.world.regions.append(self.abyss_l) self.world.regions.append(self.abyss_lb) self.world.regions.append(self.abyss_r) - self.world.regions.append(self.abyss_r_secret_1) self.world.regions.append(self.ice_cave) self.world.regions.append(self.bubble_cave) self.world.regions.append(self.king_jellyfish_cave) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 6742cb86e94..c5bb3b2e187 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -108,7 +108,7 @@ def create_regions(self) -> None: Create every Region in `regions` """ self.regions.add_regions_to_world() - self.regions.connect_regions(self.options.objective.value != 0) + self.regions.connect_regions() def __pre_fill_item(self, item_name: str, location_name: str) -> None: """Pre-assign an item to a location""" From 568435dae31b4947ac8c58e928cf818cf08d592d Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 27 Mar 2024 19:08:00 -0400 Subject: [PATCH 15/56] Changing damage rules for crate for coherence --- worlds/aquaria/Locations.py | 2 ++ worlds/aquaria/Regions.py | 24 ++++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 1d2866c9b52..88c38691c17 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -6,6 +6,7 @@ from BaseClasses import Location + class AquariaLocation(Location): """ A location in the game. @@ -24,6 +25,7 @@ def __init__(self, player: int, name="", code=None, parent=None) -> None: super(AquariaLocation, self).__init__(player, name, code, parent) self.event = code is None + class AquariaLocations: locations_verse_cave_r = { diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 2078db73ead..b30d2ac4e74 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -66,7 +66,7 @@ def _has_sun_form(state, player: int) -> bool: def _has_dual_form(state, player: int) -> bool: """`player` in `state` has the dual form item""" - return state.has("Dual form", player) + return _has_li(state, player) and state.has("Dual form", player) def _has_fish_form(state, player: int) -> bool: @@ -751,12 +751,10 @@ def __connect_sunken_city_regions(self) -> None: Connect entrances of the different regions around The Sunken City """ self.__connect_regions("Sunken city right area", "Sunken city left area", - self.sunken_city_r, self.sunken_city_l, - lambda state: _has_damaging_item(state, self.player)) + self.sunken_city_r, self.sunken_city_l) self.__connect_regions("Sunken city left area", "Sunken city bedroom", self.sunken_city_l, self.sunken_city_l_bedroom, - lambda state: _has_spirit_form(state, self.player) and - _has_damaging_item(state, self.player)) + lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Sunken city left area", "Sunken city boss area", self.sunken_city_l, self.sunken_city_boss, lambda state: _has_beast_form(state, self.player) and @@ -784,7 +782,6 @@ def __connect_body_regions(self) -> None: self.__connect_one_way_regions("Before Final boss", "Final boss", self.final_boss_loby, self.final_boss, lambda state: _has_energy_form(state, self.player) and - _has_li(state, self.player) and _has_dual_form(state, self.player) and _has_sun_form(state, self.player) and _has_bind_song(state, self.player)) @@ -936,6 +933,7 @@ def add_event_locations(self) -> None: "Victory") def __adjusting_urns_rules(self) -> None: + """Since Urns need to be broken, add a damaging item to rules""" add_rule(self.world.get_location("Open water top right area, first urn in the Mithalas exit", self.player), lambda state: _has_damaging_item(state, self.player)) add_rule(self.world.get_location("Open water top right area, second urn in the Mithalas exit", self.player), @@ -967,6 +965,19 @@ def __adjusting_urns_rules(self) -> None: add_rule(self.world.get_location("Mithalas city castle, second urn on the entrance path", self.player), lambda state: _has_damaging_item(state, self.player)) + def __adjusting_crates_rules(self) -> None: + """Since Crate need to be broken, add a damaging item to rules""" + add_rule(self.world.get_location("Sunken city right area, crate close to the save cristal", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Sunken city right area, crate in the left bottom room", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Sunken city left area, crate in the little pipe room", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Sunken city left area, crate close to the save cristal", self.player), + lambda state: _has_damaging_item(state, self.player)) + add_rule(self.world.get_location("Sunken city left area, crate before the bedroom", self.player), + lambda state: _has_damaging_item(state, self.player)) + def __adjusting_soup_rules(self) -> None: """ Modify rules for location that need soup @@ -985,6 +996,7 @@ def adjusting_rules(self, options: AquariaOptions) -> None: Modify rules for single location or optional rules """ self.__adjusting_urns_rules() + self.__adjusting_crates_rules() self.__adjusting_soup_rules() add_rule(self.world.get_location("Mithalan Dress in the Mithalas cathedral", self.player), lambda state: _has_beast_form(state, self.player)) From 3eeb3021462a47650531f79128b0c72f32e4f420 Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 27 Mar 2024 21:10:08 -0400 Subject: [PATCH 16/56] Adding Bind song rules for bulb under a rock and Transturtle fix --- worlds/aquaria/Items.py | 2 +- worlds/aquaria/Locations.py | 2 +- worlds/aquaria/Regions.py | 72 +++++++++++++++++++++++++++++-------- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index 984bc82163c..db8fd50c576 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -176,7 +176,7 @@ def __init__(self, name: str, classification: ItemClassification, "Dual form": (698124, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_dual "Transturtle Veil top left": (698125, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_veil01 "Transturtle Veil top right": (698126, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_veil02 - "Transturtle Open Water top left": (698127, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_openwater03 + "Transturtle Open Water top right": (698127, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_openwater03 "Transturtle Forest bottom left": (698128, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_forest04 "Transturtle Home water": (698129, 1, ItemType.NORMAL, ItemGroup.TURTLE), # transport_mainarea "Transturtle Abyss right": (698130, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_abyss03 diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 88c38691c17..69494fdae40 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -400,7 +400,7 @@ class AquariaLocations: } locations_abyss_r = { - "Abyss right area, bulb behind the rock in the bottom left room": 698109, + "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, diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index b30d2ac4e74..c33c47a4641 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -535,15 +535,21 @@ def __connect_open_water_regions(self) -> None: lambda state: _has_beast_form(state, self.player)) self.__connect_regions("Open water bottom left area", "Open water bottom right", self.openwater_bl, self.openwater_br) - self.__connect_regions("Open water bottom left area", "sSkeleton path", + self.__connect_regions("Open water bottom left area", "Skeleton path", self.openwater_bl, self.skeleton_path) - self.__connect_regions("Open water bottom left area", "Abyss left area", - self.openwater_bl, self.abyss_l) + self.__connect_one_way_regions("Open water bottom left area", "Abyss left area", + self.openwater_bl, self.abyss_l, + lambda state: _has_sun_form(state, self.player)) + self.__connect_regions("Abyss left area", "Open water bottom left area", + self.abyss_l, self.openwater_bl) self.__connect_regions("Skeleton path", "skeleton_path_sc", self.skeleton_path, self.skeleton_path_sc, lambda state: _has_spirit_form(state, self.player)) - self.__connect_regions("Open water bottom right", "Abyss right area", - self.openwater_br, self.abyss_r) + self.__connect_one_way_regions("Open water bottom right", "Abyss right area", + self.openwater_br, self.abyss_r, + lambda state: _has_sun_form(state, self.player)) + self.__connect_one_way_regions("Abyss right area", "Open water bottom right", + self.abyss_r, self.openwater_br) self.__connect_one_way_regions("Open water bottom right", "Arnassi", self.openwater_br, self.arnassi, lambda state: _has_beast_form(state, self.player)) @@ -726,9 +732,13 @@ def __connect_abyss_regions(self) -> None: self.__connect_regions("Abyss left bottom area", "Sunken city right area", self.abyss_lb, self.sunken_city_r, lambda state: _has_li(state, self.player)) - self.__connect_regions("Abyss left bottom area", "Body center area", + self.__connect_one_way_regions("Abyss left bottom area", "Body center area", self.abyss_lb, self.body_c, lambda state: _has_tongue_cleared(state, self.player)) + self.__connect_one_way_regions("Body center area", "Abyss left bottom area", + self.body_c, self.abyss_lb, + lambda state: _has_tongue_cleared(state, self.player) and + _has_sun_form(state, self.player)) self.__connect_regions("Abyss left area", "King jellyfish cave", self.abyss_l, self.king_jellyfish_cave, lambda state: _has_energy_form(state, self.player) and @@ -803,24 +813,24 @@ def _connect_transturtle_to_other(self, item: str, region: Region) -> None: """Connect a single transturtle to all others""" self.__connect_transturtle(item, "Transturtle Veil top left", region, self.veil_tl) self.__connect_transturtle(item, "Transturtle Veil top right", region, self.veil_tr_l) - self.__connect_one_way_regions(item, "Transturtle Open Water top left", region, self.openwater_tl) - self.__connect_one_way_regions(item, "Transturtle Forest bottom left", region, self.forest_bl) - self.__connect_one_way_regions(item, "Transturtle Home water", region, self.home_water) - self.__connect_one_way_regions(item, "Transturtle Abyss right", region, self.abyss_r, + self.__connect_transturtle(item, "Transturtle Open Water top right", region, self.openwater_tr_turtle) + self.__connect_transturtle(item, "Transturtle Forest bottom left", region, self.forest_bl) + self.__connect_transturtle(item, "Transturtle Home water", region, self.home_water_transturtle) + self.__connect_transturtle(item, "Transturtle Abyss right", region, self.abyss_r, lambda state: state.has("Transturtle Abyss right", self.player) and _has_sun_form(state, self.player)) - self.__connect_one_way_regions(item, "Transturtle Final Boss", region, self.final_boss_tube) - self.__connect_one_way_regions(item, "Transturtle Simon says", region, self.simon) - self.__connect_one_way_regions(item, "Transturtle Arnassi ruins", region, self.arnassi_path, + self.__connect_transturtle(item, "Transturtle Final Boss", region, self.final_boss_tube) + self.__connect_transturtle(item, "Transturtle Simon says", region, self.simon) + self.__connect_transturtle(item, "Transturtle Arnassi ruins", region, self.arnassi_path, lambda state: state.has("Transturtle Arnassi ruins", self.player) and _has_fish_form(state, self.player)) def __connect_transturtles(self) -> None: """Connect every transturtle with others""" self._connect_transturtle_to_other("Transturtle Veil top left", self.veil_tl) self._connect_transturtle_to_other("Transturtle Veil top right", self.veil_tr_l) - self._connect_transturtle_to_other("Transturtle Open Water top left", self.openwater_tl) + self._connect_transturtle_to_other("Transturtle Open Water top right", self.openwater_tr_turtle) self._connect_transturtle_to_other("Transturtle Forest bottom left", self.forest_bl) - self._connect_transturtle_to_other("Transturtle Home water", self.home_water) + self._connect_transturtle_to_other("Transturtle Home water", self.home_water_transturtle) self._connect_transturtle_to_other("Transturtle Abyss right", self.abyss_r) self._connect_transturtle_to_other("Transturtle Final Boss", self.final_boss_tube) self._connect_transturtle_to_other("Transturtle Simon says", self.simon) @@ -991,6 +1001,35 @@ def __adjusting_soup_rules(self) -> None: add_rule(self.world.get_location("The veil top right area, bulb in the top of the water fall", self.player), lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) + def __adjusting_under_rock_location(self) -> None: + """ + Modify rules implying bind song needed for bulb under rocks + """ + add_rule(self.world.get_location("Naija's home, bulb under the rock at the right of the main path", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Song cave, bulb under the rock in the path to the singing statues", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Song cave, bulb under the rock close to the song door", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Energy temple second area, bulb under the rock", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Open water top left area, bulb under the rock in the right path", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Open water top left area, bulb under the rock in the left path", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Kelp Forest top right area, bulb under the rock in the right path", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("The veil top left area, bulb under the rock in the top right path", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Abyss right area, bulb behind the rock in the whale room", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Abyss right area, bulb in the middle path", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("The veil top left area, bulb under the rock in the top right path", + self.player), lambda state: _has_bind_song(state, self.player)) + + + def adjusting_rules(self, options: AquariaOptions) -> None: """ Modify rules for single location or optional rules @@ -998,6 +1037,7 @@ def adjusting_rules(self, options: AquariaOptions) -> None: self.__adjusting_urns_rules() self.__adjusting_crates_rules() self.__adjusting_soup_rules() + self.__adjusting_under_rock_location() # ToDo: Removing in hard mode add_rule(self.world.get_location("Mithalan Dress in the Mithalas cathedral", self.player), lambda state: _has_beast_form(state, self.player)) add_rule(self.world.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), @@ -1016,6 +1056,8 @@ def adjusting_rules(self, options: AquariaOptions) -> None: lambda state: _has_fish_form(state, self.player)) add_rule(self.world.get_location("Anemone seed in the Song cave", self.player), lambda state: _has_nature_form(state, self.player)) + add_rule(self.world.get_location("Big Seed in the Verse cave right area", self.player), + lambda state: _has_bind_song(state, self.player)) if options.mini_bosses_to_beat.value > 0: add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_mini_bosses(state, self.player)) From 1a83f2ef1071b5f21c5312493fb4440ee03ef267 Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 27 Mar 2024 21:12:20 -0400 Subject: [PATCH 17/56] Fix duplicate Entrances --- worlds/aquaria/Regions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index c33c47a4641..9195bf03714 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -540,7 +540,7 @@ def __connect_open_water_regions(self) -> None: self.__connect_one_way_regions("Open water bottom left area", "Abyss left area", self.openwater_bl, self.abyss_l, lambda state: _has_sun_form(state, self.player)) - self.__connect_regions("Abyss left area", "Open water bottom left area", + self.__connect_one_way_regions("Abyss left area", "Open water bottom left area", self.abyss_l, self.openwater_bl) self.__connect_regions("Skeleton path", "skeleton_path_sc", self.skeleton_path, self.skeleton_path_sc, From c8cfebae3b0458347230dd36b3131b5092d8702d Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 29 Mar 2024 13:37:40 -0400 Subject: [PATCH 18/56] Manage the start items --- worlds/aquaria/Items.py | 2 +- worlds/aquaria/__init__.py | 69 +++++++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index db8fd50c576..a47f75747f5 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -125,7 +125,7 @@ def __init__(self, name: str, classification: ItemClassification, "Rotten meat": (698073, 5, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat "Royal soup": (698074, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_royalsoup "Sea cake": (698075, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_seacake - "Sea loaf": (698076, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sealoaf + "Sea loaf": (698076, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_sealoaf "Shark fin soup": (698077, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sharkfinsoup "Sight poultice": (698078, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sightpoultice "Small bone x 2": (698079, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallbone diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index c5bb3b2e187..6846703320e 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -110,39 +110,60 @@ def create_regions(self) -> None: self.regions.add_regions_to_world() self.regions.connect_regions() - def __pre_fill_item(self, item_name: str, location_name: str) -> None: + 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[2] == ItemType.JUNK: + classification = ItemClassification.filler + elif data[2] == ItemType.PROGRESSION: + classification = ItemClassification.progression + result = AquariaItem(name, classification, data[0], 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""" - self.exclude.append(item_name) - data = item_table[item_name] - item = AquariaItem(item_name, ItemClassification.useful, data[0], self.player) - self.multiworld.get_location(location_name, self.player).place_locked_item(item) + if item_name not in precollected: + self.exclude.append(item_name) + data = item_table[item_name] + item = AquariaItem(item_name, ItemClassification.useful, data[0], self.player) + self.multiworld.get_location(location_name, self.player).place_locked_item(item) 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") + 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") - self.__pre_fill_item("Transturtle Veil top right", "The veil top right area, Transturtle") - self.__pre_fill_item("Transturtle Open Water top left", "Open water top right area, Transturtle") - self.__pre_fill_item("Transturtle Forest bottom left", "Kelp Forest bottom left area, Transturtle") - self.__pre_fill_item("Transturtle Home water", "Home water, Transturtle") - self.__pre_fill_item("Transturtle Abyss right", "Abyss right area, Transturtle") - self.__pre_fill_item("Transturtle Final Boss", "Final boss area, Transturtle") + 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 left", "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") - self.__pre_fill_item("Transturtle Arnassi ruins", "Simon says area, Transturtle") + 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 not in self.exclude: - classification: ItemClassification = ItemClassification.useful - if data[2] == ItemType.JUNK: - classification = ItemClassification.filler - elif data[2] == ItemType.PROGRESSION: - classification = ItemClassification.progression - for i in range(data[1]): - item = AquariaItem(name, classification, data[0], self.player) - self.multiworld.itempool.append(item) + if name in precollected: + precollected.remove(name) + self.multiworld.itempool.append(self.create_item("Sea loaf")) + else: + if name not in self.exclude: + for i in range(data[1]): + item = self.create_item(name) + self.multiworld.itempool.append(item) def __set_excluded_location(self) -> None: if self.options.big_bosses_to_beat.value > 0: From f71ec6d6e25a242f2cb164f045891b9bd374a02a Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 3 Apr 2024 10:27:48 -0400 Subject: [PATCH 19/56] Adding doc and options. --- worlds/aquaria/Items.py | 2 +- worlds/aquaria/Options.py | 36 ++++++++++++++ worlds/aquaria/Regions.py | 69 ++++++++++++++++++--------- worlds/aquaria/__init__.py | 79 ++++++++++++++++++------------- worlds/aquaria/docs/en_aquaria.md | 55 ++++++++++++++------- worlds/aquaria/docs/fr_aquaria.md | 61 ++++++++++++++++-------- 6 files changed, 208 insertions(+), 94 deletions(-) diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index a47f75747f5..05ba7cae9e0 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -161,7 +161,7 @@ def __init__(self, name: str, classification: ItemClassification, "Plant leaf x 3": (698109, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf "Rotten meat x 2": (698110, 1, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat "Rotten meat x 8": (698111, 1, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat - "Sea loaf x 2": (698112, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sealoaf + "Sea loaf x 2": (698112, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_sealoaf "Small bone x 3": (698113, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallbone "Small egg x 2": (698114, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallegg "Li and Li song": (698115, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_li diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index 420cb4476be..ce64f6bc3d5 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -34,12 +34,14 @@ class TurtleRandomizer(Choice): 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" @@ -90,6 +92,36 @@ class Objective(Choice): 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 ExcludeHardOrHiddenLocation(Toggle): + """ + Make sure that there is no progression items at hard to get or hard to find locations. + Locations that will be excluded are 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 = "Exclude 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" + + @dataclass class AquariaOptions(PerGameCommonOptions): @@ -104,4 +136,8 @@ class AquariaOptions(PerGameCommonOptions): early_energy_form: EarlyEnergyForm big_bosses_to_beat: BigBossesToBeat mini_bosses_to_beat: MiniBossesToBeat + skip_first_vision: SkipFirstVision + exclude_hard_or_hidden_locations: ExcludeHardOrHiddenLocation + light_needed_to_get_to_dark_places: LightNeededToGetToDarkPlaces + bind_song_needed_to_get_under_rock_bulb: BindSongNeededToGetUnderRockBulb death_link: DeathLink diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 9195bf03714..09e7170b341 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -64,6 +64,11 @@ def _has_sun_form(state, player: int) -> bool: return state.has("Sun form", player) +def _has_light(state, player: int) -> bool: + """`player` in `state` has the light item""" + return state.has_group("Light", player) + + def _has_dual_form(state, player: int) -> bool: """`player` in `state` has the dual form item""" return _has_li(state, player) and state.has("Dual form", player) @@ -521,7 +526,7 @@ def __connect_open_water_regions(self) -> None: self.__connect_regions("Open water top right area", "Open water top right area, turtle room", self.openwater_tr, self.openwater_tr_turtle, lambda state: _has_beast_form(state, self.player)) - self.__connect_regions("Open water top right area", "Open water bottom right", + self.__connect_regions("Open water top right area", "Open water bottom right area", self.openwater_tr, self.openwater_br) self.__connect_regions("Open water top right area", "Mithalas city", self.openwater_tr, self.mithalas_city) @@ -533,27 +538,21 @@ def __connect_open_water_regions(self) -> None: self.__connect_one_way_regions("Veil bottom right", "Open water top right area", self.veil_br, self.openwater_tr, lambda state: _has_beast_form(state, self.player)) - self.__connect_regions("Open water bottom left area", "Open water bottom right", + self.__connect_regions("Open water bottom left area", "Open water bottom right area", self.openwater_bl, self.openwater_br) self.__connect_regions("Open water bottom left area", "Skeleton path", self.openwater_bl, self.skeleton_path) - self.__connect_one_way_regions("Open water bottom left area", "Abyss left area", - self.openwater_bl, self.abyss_l, - lambda state: _has_sun_form(state, self.player)) - self.__connect_one_way_regions("Abyss left area", "Open water bottom left area", + self.__connect_regions("Abyss left area", "Open water bottom left area", self.abyss_l, self.openwater_bl) self.__connect_regions("Skeleton path", "skeleton_path_sc", self.skeleton_path, self.skeleton_path_sc, lambda state: _has_spirit_form(state, self.player)) - self.__connect_one_way_regions("Open water bottom right", "Abyss right area", - self.openwater_br, self.abyss_r, - lambda state: _has_sun_form(state, self.player)) - self.__connect_one_way_regions("Abyss right area", "Open water bottom right", + self.__connect_regions("Abyss right area", "Open water bottom right area", self.abyss_r, self.openwater_br) - self.__connect_one_way_regions("Open water bottom right", "Arnassi", + self.__connect_one_way_regions("Open water bottom right area", "Arnassi", self.openwater_br, self.arnassi, lambda state: _has_beast_form(state, self.player)) - self.__connect_one_way_regions("Arnassi", "Open water bottom right", + self.__connect_one_way_regions("Arnassi", "Open water bottom right area", self.arnassi, self.openwater_br) self.__connect_regions("Arnassi", "Arnassi path", self.arnassi, self.arnassi_path) @@ -737,8 +736,7 @@ def __connect_abyss_regions(self) -> None: lambda state: _has_tongue_cleared(state, self.player)) self.__connect_one_way_regions("Body center area", "Abyss left bottom area", self.body_c, self.abyss_lb, - lambda state: _has_tongue_cleared(state, self.player) and - _has_sun_form(state, self.player)) + lambda state: _has_tongue_cleared(state, self.player)) self.__connect_regions("Abyss left area", "King jellyfish cave", self.abyss_l, self.king_jellyfish_cave, lambda state: _has_energy_form(state, self.player) and @@ -816,9 +814,7 @@ def _connect_transturtle_to_other(self, item: str, region: Region) -> None: self.__connect_transturtle(item, "Transturtle Open Water top right", region, self.openwater_tr_turtle) self.__connect_transturtle(item, "Transturtle Forest bottom left", region, self.forest_bl) self.__connect_transturtle(item, "Transturtle Home water", region, self.home_water_transturtle) - self.__connect_transturtle(item, "Transturtle Abyss right", region, self.abyss_r, - lambda state: state.has("Transturtle Abyss right", self.player) and - _has_sun_form(state, self.player)) + self.__connect_transturtle(item, "Transturtle Abyss right", region, self.abyss_r) self.__connect_transturtle(item, "Transturtle Final Boss", region, self.final_boss_tube) self.__connect_transturtle(item, "Transturtle Simon says", region, self.simon) self.__connect_transturtle(item, "Transturtle Arnassi ruins", region, self.arnassi_path, @@ -1028,7 +1024,35 @@ def __adjusting_under_rock_location(self) -> None: add_rule(self.world.get_location("The veil top left area, bulb under the rock in the top right path", self.player), lambda state: _has_bind_song(state, self.player)) - + def __adjusting_light_in_dark_place_rules(self) -> None: + add_rule(self.world.get_location("Black pearl in the Kelp forest top right area", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_location("Odd Container in the Kelp forest bottom right area", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Transturtle Veil top left to Transturtle Abyss right", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Transturtle Open Water top right to Transturtle Abyss right", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Transturtle Veil top right to Transturtle Abyss right", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Transturtle Forest bottom left to Transturtle Abyss right", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Transturtle Home water to Transturtle Abyss right", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Transturtle Final Boss to Transturtle Abyss right", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Transturtle Simon says to Transturtle Abyss right", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Transturtle Arnassi ruins to Transturtle Abyss right", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Body center area to Abyss left bottom area", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Veil left of sun temple to Octo cave top path", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Open water bottom right area to Abyss right area", self.player), + lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Open water bottom left area to Abyss left area", self.player), + lambda state: _has_light(state, self.player)) def adjusting_rules(self, options: AquariaOptions) -> None: """ @@ -1037,17 +1061,16 @@ def adjusting_rules(self, options: AquariaOptions) -> None: self.__adjusting_urns_rules() self.__adjusting_crates_rules() self.__adjusting_soup_rules() - self.__adjusting_under_rock_location() # ToDo: Removing in hard mode + if options.light_needed_to_get_to_dark_places: + self.__adjusting_light_in_dark_place_rules() + if options.bind_song_needed_to_get_under_rock_bulb: + self.__adjusting_under_rock_location() add_rule(self.world.get_location("Mithalan Dress in the Mithalas cathedral", self.player), lambda state: _has_beast_form(state, self.player)) add_rule(self.world.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), lambda state: _has_fish_form(state, self.player)) - add_rule(self.world.get_location("Black pearl in the Kelp forest top right area", self.player), - lambda state: _has_sun_form(state, self.player)) # ToDo: Not needed in hard mode add_rule(self.world.get_location("Walker baby in the Kelp forest bottom left area", self.player), lambda state: _has_spirit_form(state, self.player)) - add_rule(self.world.get_location("Odd Container in the Kelp forest bottom right area", self.player), - lambda state: _has_sun_form(state, self.player)) # ToDo: Not needed in hard mode add_rule(self.world.get_location("The veil top left area, bulb hidden behind the blocking rock", self.player), lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Turtle Egg in the Turtle cave", self.player), diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 6846703320e..e38574d5fb7 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -72,7 +72,8 @@ class AquariaWorld(World): item_name_groups = { "Damage": {"Energy form", "Nature form", "Beast form", "Li and Li song", "Baby nautilus", "Baby piranha", - "Baby blaster", "Baby dumbo"}, + "Baby blaster"}, + "Light": {"Sun form", "Baby dumbo"} } """Grouping item make it easier to find them""" @@ -165,38 +166,36 @@ def create_items(self) -> None: item = self.create_item(name) self.multiworld.itempool.append(item) - def __set_excluded_location(self) -> None: - if self.options.big_bosses_to_beat.value > 0: - self.multiworld.get_location("Fallen god tooth in the Energy temple", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Cathedral boss area, beating Mithalan God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Kelp forest boss area, beating Drunian God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Sun temple boss area, beating Sun God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Sunken city, bulb on the top of the boss area (boiler room)", - self.player).progress_type = LocationProgressType.EXCLUDED - if self.options.mini_bosses_to_beat.value > 0: - self.multiworld.get_location("Nautilus Egg in Home water", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Blaster egg in the Energy temple", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Mithalas castle, beating the priests", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Piranha Egg in the Mermog cave", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Dumbo Egg in the Octocave", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Verse egg in the Bubble cave", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("King Jellyfish cave, bulb in the right path from King Jelly", - self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Jellyfish Costume in the King Jellyfish cave", - self.player).progress_type = LocationProgressType.EXCLUDED + + def __excluded_hard_or_hidden_location(self) -> None: + self.multiworld.get_location("Fallen god tooth in the Energy temple", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Cathedral boss area, beating Mithalan God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Kelp forest boss area, beating Drunian God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Sun temple boss area, beating Sun God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Sunken city, bulb on the top of the boss area (boiler room)", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Nautilus Egg in Home water", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Blaster egg in the Energy temple", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Mithalas castle, beating the priests", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Piranha Egg in the Mermog cave", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Dumbo Egg in the Octocave", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Verse egg in the Bubble cave", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("King Jellyfish cave, bulb in the right path from King Jelly", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Jellyfish Costume in the King Jellyfish cave", + self.player).progress_type = LocationProgressType.EXCLUDED self.multiworld.get_location("Final boss area, bulb in the boss second form room", self.player).progress_type = LocationProgressType.EXCLUDED - # ToDo: Removing the following exclusion on Hard mode self.multiworld.get_location("Sun Worm path, first cliff bulb", self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("Sun Worm path, second cliff bulb", self.player).progress_type = ( @@ -214,16 +213,23 @@ def __set_excluded_location(self) -> None: self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Walker baby in the Kelp forest bottom left area", self.player).progress_type = ( + self.multiworld.get_location("Walker baby in the Kelp forest bottom left area", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Sun key in the Sun temple", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.multiworld.get_location("Mutant Costume in the body bottom area", self.player).progress_type = ( LocationProgressType.EXCLUDED) + + def set_rules(self) -> None: """ Launched when the Multiworld generator is ready to generate rules """ self.regions.add_event_locations() self.regions.adjusting_rules(self.options) - self.__set_excluded_location() + if self.options.exclude_hard_or_hidden_locations: + self.__excluded_hard_or_hidden_location() self.multiworld.completion_condition[self.player] = lambda \ state: state.has("Victory", self.player) @@ -260,8 +266,13 @@ def fill_slot_data(self) -> Dict[str, Any]: aquarian_translation = False if self.options.aquarian_translation: aquarian_translation = True + skip_first_vision = False + if self.options.skip_first_vision: + skip_first_vision = True return {"ingredientReplacement": self.ingredients_substitution, "aquarianTranslate": aquarian_translation, "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} + "bigbosses_to_kill": self.options.big_bosses_to_beat.value, + "skip_first_vision": skip_first_vision, + } diff --git a/worlds/aquaria/docs/en_aquaria.md b/worlds/aquaria/docs/en_aquaria.md index fa83d7a4e5d..cfcbd55fa42 100644 --- a/worlds/aquaria/docs/en_aquaria.md +++ b/worlds/aquaria/docs/en_aquaria.md @@ -6,29 +6,52 @@ The player settings page for this game contains all the options you need to conf settings page link: [Aquaria Player Settings Page](../player-settings). ## What does randomization do to this game? -All sing bulbs, Mithalas urns, Sunken City crates, collectible treasures (including -pet eggs and costumes) beating Simon are location checks. +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 Simom 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, + +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 final boss. +The goal of the Aquaria game is to beat the final boss. 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 dishes that can be learned as recipe, collectible treasures (including baby pets -and costumes), the third cooking plate and some simple ingredients are items. - -Note that, not like in the vanilla game, the recipes for dishes (other than the Sea Loaf) -in the game cannot be cooked before being learned by receiving them as randomized -items. - -## What does another world's item look like in SM64EX? -No visual are shown when finding sing bulbs, Mithalas urns, Sunken City crates -or when beating Simon. For collectible treasures, the visual of the locations -are 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. +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 are 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 diff --git a/worlds/aquaria/docs/fr_aquaria.md b/worlds/aquaria/docs/fr_aquaria.md index 4705235a58e..74611f270dc 100644 --- a/worlds/aquaria/docs/fr_aquaria.md +++ b/worlds/aquaria/docs/fr_aquaria.md @@ -2,39 +2,60 @@ ## Où se trouve la page des paramètres ? -La [page des paramètres du joueur pour ce jeu](../player-settings) contient tous +La [page des paramètres du joueur pour ce jeu](../player-settings) contiens tous les paramètres dont vous avez besoin pour configurer et exporter le fichier. ## Quel est l'effet de la randomisation sur ce jeu ? -Tous les bulbes musicales, urnes de Mithalas, caisses de La Cité engloutie, -les trésores de collection (incluant les oeufs d'animal de compagnie et les -costumes) et battre Simon sont les localisations des "checks". - -À noter qu'il y a également une option pour mélanger les ingrédients que -les poissons, monstres et plantes laissent tomber. +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, + +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 montres, 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 DLC Quest ? -Dans Aquaria, le but est de battre le monstre final. +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 repas qui peuvent être appris comme recette , les trésors de collection -(incluant les animaux de compagnie bébé et costumes), la troisième assiette de -cuisson et certains ingrédients de bases. - -Noter que, contrirement à la version vanille du jeu, il est impossible de -cuisiner une recette qui n'a pas préalablement été apprise en l'ayant reçu comme -objet randomizé. +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 -Aucun visuel n'apparaît pour les bulbes, urnes, caisses et assiette. Pour les -trésors de collections, le visuel est exactement les mêmes que dans le jeu -vanille. +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, une notification apparaît à l'écran -pour en informer le joueur. +Chaque fois qu'un objet est reçu, un message apparaît à l'écran pour en informer le joueur. From c96e1a8d75f5ae0f81a066cf478f82dcbd408294 Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 5 Apr 2024 23:15:38 -0400 Subject: [PATCH 20/56] Add a location in easy exclusions --- worlds/aquaria/Locations.py | 2 +- worlds/aquaria/Regions.py | 2 ++ worlds/aquaria/__init__.py | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 69494fdae40..885e9c7a619 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -376,7 +376,7 @@ class AquariaLocations: 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 left part": 698093, + "Sun temple, bulb in the hidden room of the right part": 698093, "Sun key in the Sun temple": 698182, } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 09e7170b341..d7549067254 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -1081,6 +1081,8 @@ def adjusting_rules(self, options: AquariaOptions) -> None: lambda state: _has_nature_form(state, self.player)) add_rule(self.world.get_location("Big Seed in the Verse cave right area", self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Arnassi ruins, Song plant spore on the top of the ruins", self.player), + lambda state: _has_beast_form(state, self.player)) if options.mini_bosses_to_beat.value > 0: add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_mini_bosses(state, self.player)) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index e38574d5fb7..5d9a46e04fb 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -219,6 +219,10 @@ def __excluded_hard_or_hidden_location(self) -> None: LocationProgressType.EXCLUDED) self.multiworld.get_location("Mutant Costume in the body bottom area", self.player).progress_type = ( LocationProgressType.EXCLUDED) + self.multiworld.get_location("Sun temple, bulb in the hidden room of the right part", + self.player).progress_type = LocationProgressType.EXCLUDED + + From 057265239dce608d9f57bc37db88051585e31ca0 Mon Sep 17 00:00:00 2001 From: Louis M Date: Thu, 11 Apr 2024 18:03:30 -0400 Subject: [PATCH 21/56] Continuing documentation --- Louis.yaml | 6 -- worlds/aquaria/Regions.py | 2 + worlds/aquaria/__init__.py | 4 -- worlds/aquaria/docs/setup_en.md | 108 +++++++++++++++++++++++++++++++- 4 files changed, 109 insertions(+), 11 deletions(-) delete mode 100644 Louis.yaml diff --git a/Louis.yaml b/Louis.yaml deleted file mode 100644 index 5bd49932601..00000000000 --- a/Louis.yaml +++ /dev/null @@ -1,6 +0,0 @@ -Aquaria: - progression_balancing: 50 - accessibility: items -description: 'Generated by https://archipelago.gg with the default preset.' -game: Aquaria -name: Louis diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index d7549067254..e7db1c5acf5 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -1083,6 +1083,8 @@ def adjusting_rules(self, options: AquariaOptions) -> None: lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Arnassi ruins, Song plant spore on the top of the ruins", self.player), lambda state: _has_beast_form(state, self.player)) + add_rule(self.world.get_location("Energy temple first area, bulb in the bottom room blocked by a rock", + self.player), lambda state: _has_energy_form(state, self.player)) if options.mini_bosses_to_beat.value > 0: add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_mini_bosses(state, self.player)) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 5d9a46e04fb..98a7792efca 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -222,10 +222,6 @@ def __excluded_hard_or_hidden_location(self) -> None: self.multiworld.get_location("Sun temple, bulb in the hidden room of the right part", self.player).progress_type = LocationProgressType.EXCLUDED - - - - def set_rules(self) -> None: """ Launched when the Multiworld generator is ready to generate rules diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index 23407f068cc..d07b32e82e3 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -1,3 +1,109 @@ # Aquaria Randomizer Setup Guide -ToDo \ No newline at end of file +## 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 keep on working. +Also, in Windows, the save files are store in the Aquaria folder. So copying the Aquaria folder for every Multiworld +game you play will make sure that every game have their own save game. + +Unzip the Aquaria randomizer release and copy every 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 + +If there is 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 hava a password: + +```bash +aquaria_randomizer.exe --name YourName --server theServer:thePort --password thePassword +``` + +### Linux Preparations using the AppImage + +If you use the AppImage, juste 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 hava a password: + +```bash +./Aquaria_Randomizer-*.AppImage --name YourName --server theServer:thePort --password thePassword +``` + +### Linux Preparations 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 keep on working. + +Untar the Aquaria randomizer release and copy every extracted files in the Aquaria game folder. The extracted +files are those: +- aquaria_randomizer +- override (directory) +- usersettings.xml + +If there is 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 hava 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 used this command line to be +sure that your executable have the executable permission: + +```bash +chmod +x aquaria_randomizer +``` From 6f168659e5aa2bba2e470049bad13980f1812dce Mon Sep 17 00:00:00 2001 From: Louis M Date: Sun, 14 Apr 2024 10:14:25 -0400 Subject: [PATCH 22/56] Documentation and logic errors fix --- worlds/aquaria/Locations.py | 2 +- worlds/aquaria/Regions.py | 8 +++++++- worlds/aquaria/docs/en_aquaria.md | 9 ++++++--- worlds/aquaria/docs/fr_aquaria.md | 4 ++++ worlds/aquaria/docs/setup_fr.md | 4 ++-- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 885e9c7a619..366c58c131d 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -45,7 +45,7 @@ class AquariaLocations: "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 tutorial cave": 698061, + "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, diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index e7db1c5acf5..5393b607714 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -467,7 +467,7 @@ def __connect_home_water_regions(self) -> None: self.__connect_regions("Home Water", "Song cave", self.home_water, self.song_cave) self.__connect_regions("Home Water", "Home water, nautilus nest", self.home_water, self.home_water_nautilus, - lambda state: _has_energy_form(state, self.player)) + lambda state: _has_energy_form(state, self.player) and _has_bind_song(state, self.player)) self.__connect_regions("Home Water", "Home water transturtle room", self.home_water, self.home_water_transturtle, lambda state: _has_bind_song(state, self.player)) @@ -1085,6 +1085,12 @@ def adjusting_rules(self, options: AquariaOptions) -> None: lambda state: _has_beast_form(state, self.player)) add_rule(self.world.get_location("Energy temple first area, bulb in the bottom room blocked by a rock", self.player), lambda state: _has_energy_form(state, self.player)) + add_rule(self.world.get_location("Home water, bulb in the bottom left room", self.player), + lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Home water, bulb in the path bellow Nautilus Prime", self.player), + lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Naija's home, bulb after the energy door", self.player), + lambda state: _has_energy_form(state, self.player)) if options.mini_bosses_to_beat.value > 0: add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_mini_bosses(state, self.player)) diff --git a/worlds/aquaria/docs/en_aquaria.md b/worlds/aquaria/docs/en_aquaria.md index cfcbd55fa42..828b7c08459 100644 --- a/worlds/aquaria/docs/en_aquaria.md +++ b/worlds/aquaria/docs/en_aquaria.md @@ -12,7 +12,7 @@ The locations in the randomizer are: - All Mithalas Urns; - All Sunken City crates; - Collectible treasure locations (including pet eggs and costumes); -- Beating Simom says; +- Beating Simon says; - Li cave; - Every Transportation Turtle (also called transturtle); - Locations where you get songs, @@ -22,7 +22,10 @@ The locations in the randomizer are: * Fish cave puzzle, * Beating Drunian God boss, * Beating Sun God boss, - * Breaking Li cage in the body, + * 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*); @@ -55,4 +58,4 @@ 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. \ No newline at end of file +the item from, and which one it is. \ No newline at end of file diff --git a/worlds/aquaria/docs/fr_aquaria.md b/worlds/aquaria/docs/fr_aquaria.md index 74611f270dc..a4dc12d03f3 100644 --- a/worlds/aquaria/docs/fr_aquaria.md +++ b/worlds/aquaria/docs/fr_aquaria.md @@ -25,6 +25,10 @@ Les localisations du "Ransomizer" sont: * 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; diff --git a/worlds/aquaria/docs/setup_fr.md b/worlds/aquaria/docs/setup_fr.md index ff2537c8ca0..b69ca4dcfbb 100644 --- a/worlds/aquaria/docs/setup_fr.md +++ b/worlds/aquaria/docs/setup_fr.md @@ -1,3 +1,3 @@ -# # Guide de configuration MultiWorld de DLCQuest +# # Guide de configuration MultiWorld d'Aquaria -À faire +ToDo \ No newline at end of file From e54eacf2a2ca37ecdf008655b67b5e36440b5986 Mon Sep 17 00:00:00 2001 From: Louis M Date: Sun, 14 Apr 2024 17:13:56 -0400 Subject: [PATCH 23/56] Fixing some locations --- worlds/aquaria/Options.py | 3 ++- worlds/aquaria/Regions.py | 31 ++++++++++++++++++++----------- worlds/aquaria/__init__.py | 5 ++++- worlds/aquaria/docs/setup_fr.md | 2 +- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index ce64f6bc3d5..6b14c3652ba 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -5,7 +5,7 @@ """ from dataclasses import dataclass -from Options import Toggle, Choice, DeathLink, PerGameCommonOptions, DefaultOnToggle +from Options import Toggle, Choice, DeathLink, PerGameCommonOptions, DefaultOnToggle, StartInventoryPool class IngredientRandomizer(Choice): @@ -140,4 +140,5 @@ class AquariaOptions(PerGameCommonOptions): exclude_hard_or_hidden_locations: ExcludeHardOrHiddenLocation light_needed_to_get_to_dark_places: LightNeededToGetToDarkPlaces bind_song_needed_to_get_under_rock_bulb: BindSongNeededToGetUnderRockBulb + start_inventory_from_pool: StartInventoryPool death_link: DeathLink diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 5393b607714..8360379ac90 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -1001,6 +1001,10 @@ def __adjusting_under_rock_location(self) -> None: """ Modify rules implying bind song needed for bulb under rocks """ + add_rule(self.world.get_location("Home water, bulb under the rock in the left path from the verse cave", + self.player), lambda state: _has_bind_song(state, self.player)) + add_rule(self.world.get_location("Verse cave left area, bulb under the rock at the end of the path", + self.player), lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Naija's home, bulb under the rock at the right of the main path", self.player), lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Song cave, bulb under the rock in the path to the singing statues", @@ -1054,17 +1058,7 @@ def __adjusting_light_in_dark_place_rules(self) -> None: add_rule(self.world.get_entrance("Open water bottom left area to Abyss left area", self.player), lambda state: _has_light(state, self.player)) - def adjusting_rules(self, options: AquariaOptions) -> None: - """ - Modify rules for single location or optional rules - """ - self.__adjusting_urns_rules() - self.__adjusting_crates_rules() - self.__adjusting_soup_rules() - if options.light_needed_to_get_to_dark_places: - self.__adjusting_light_in_dark_place_rules() - if options.bind_song_needed_to_get_under_rock_bulb: - self.__adjusting_under_rock_location() + def __adjusting_manual_rules(self) -> None: add_rule(self.world.get_location("Mithalan Dress in the Mithalas cathedral", self.player), lambda state: _has_beast_form(state, self.player)) add_rule(self.world.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), @@ -1079,6 +1073,8 @@ def adjusting_rules(self, options: AquariaOptions) -> None: lambda state: _has_fish_form(state, self.player)) add_rule(self.world.get_location("Anemone seed in the Song cave", self.player), lambda state: _has_nature_form(state, self.player)) + add_rule(self.world.get_location("Verse egg in the Song cave", self.player), + lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Big Seed in the Verse cave right area", self.player), lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Arnassi ruins, Song plant spore on the top of the ruins", self.player), @@ -1091,6 +1087,19 @@ def adjusting_rules(self, options: AquariaOptions) -> None: lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Naija's home, bulb after the energy door", self.player), lambda state: _has_energy_form(state, self.player)) + def adjusting_rules(self, options: AquariaOptions) -> None: + """ + Modify rules for single location or optional rules + """ + self.__adjusting_urns_rules() + self.__adjusting_crates_rules() + self.__adjusting_soup_rules() + self.__adjusting_manual_rules() + if options.light_needed_to_get_to_dark_places: + self.__adjusting_light_in_dark_place_rules() + if options.bind_song_needed_to_get_under_rock_bulb: + self.__adjusting_under_rock_location() + if options.mini_bosses_to_beat.value > 0: add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_mini_bosses(state, self.player)) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 98a7792efca..93983a6a160 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -137,6 +137,9 @@ def __pre_fill_item(self, item_name: str, location_name: str, precollected) -> N item = AquariaItem(item_name, ItemClassification.useful, data[0], self.player) self.multiworld.get_location(location_name, self.player).place_locked_item(item) + def get_filler_item_name(self): + filler_item_name = "Sea loaf" # or write something if there's other filler items that could be genned + 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]] @@ -159,7 +162,7 @@ def create_items(self) -> None: for name, data in item_table.items(): if name in precollected: precollected.remove(name) - self.multiworld.itempool.append(self.create_item("Sea loaf")) + self.multiworld.itempool.append(self.create_item(self.get_filler_item_name())) else: if name not in self.exclude: for i in range(data[1]): diff --git a/worlds/aquaria/docs/setup_fr.md b/worlds/aquaria/docs/setup_fr.md index b69ca4dcfbb..4b778953445 100644 --- a/worlds/aquaria/docs/setup_fr.md +++ b/worlds/aquaria/docs/setup_fr.md @@ -1,3 +1,3 @@ # # Guide de configuration MultiWorld d'Aquaria -ToDo \ No newline at end of file +Todo \ No newline at end of file From ca791530a5b414489793e7cabd3def57c91936c5 Mon Sep 17 00:00:00 2001 From: Louis M Date: Sun, 14 Apr 2024 21:44:26 -0400 Subject: [PATCH 24/56] Location naming coherence --- worlds/aquaria/Locations.py | 88 ++++++++++++------------ worlds/aquaria/Regions.py | 16 ++--- worlds/aquaria/__init__.py | 22 +++--- worlds/aquaria/docs/setup_en.md | 30 +++++---- worlds/aquaria/docs/setup_fr.md | 116 +++++++++++++++++++++++++++++++- 5 files changed, 192 insertions(+), 80 deletions(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 366c58c131d..16da1d49b92 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -31,7 +31,7 @@ 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, - "Big Seed in the Verse cave right area": 698175, + "Verse cave right area, Big Seed": 698175, } locations_verse_cave_l = { @@ -53,7 +53,7 @@ class AquariaLocations: } locations_home_water_nautilus = { - "Nautilus Egg in Home water": 698194, + "Home water, Nautilus Egg": 698194, } locations_home_water_transturtle = { @@ -66,15 +66,15 @@ class AquariaLocations: } locations_song_cave = { - "Erulian spirit in the Song cave": 698206, + "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, "Verse egg in the Song cave": 698160, - "Jelly beacon in the Song cave": 698178, - "Anemone seed in the Song cave": 698162, + "Song cave, Jelly beacon": 698178, + "Song cave, Anemone seed": 698162, } locations_energy_temple_1 = { @@ -83,7 +83,7 @@ class AquariaLocations: } locations_energy_temple_idol = { - "Energy Idol in the Energy temple first area": 698170, + "Energy temple first area, Energy Idol": 698170, } locations_energy_temple_2 = { @@ -91,7 +91,7 @@ class AquariaLocations: } locations_energy_temple_altar = { - "Krotite armor in the Energy temple": 698163, + "Energy temple bottom entrance, Krotite armor": 698163, } locations_energy_temple_3 = { @@ -99,11 +99,11 @@ class AquariaLocations: } locations_energy_temple_boss = { - "Fallen god tooth in the Energy temple": 698169, + "Energy temple boss area, Fallen god tooth": 698169, } locations_energy_temple_blaster_room = { - "Blaster egg in the Energy temple": 698195, + "Energy temple blaster room, Blaster egg": 698195, } locations_openwater_tl = { @@ -138,7 +138,7 @@ class AquariaLocations: } locations_skeleton_path_sc = { - "King skull in the Open water skeleton path": 698177, + "Open water skeleton path, King skull": 698177, } locations_arnassi = { @@ -146,16 +146,16 @@ class AquariaLocations: "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 Armor in Arnassi ruins": 698191, + "Arnassi ruins, Arnassi Armor": 698191, } locations_arnassi_path = { - "Arnassi statue in Arnassi Ruins": 698164, + "Arnassi Ruins, Arnassi statue": 698164, "Arnassi Ruins, Transturtle": 698217, } locations_arnassi_crab_boss = { - "Crab armor in Arnassi ruins": 698187, + "Arnassi ruins, Crab armor": 698187, } locations_simon = { @@ -184,18 +184,18 @@ class AquariaLocations: "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 pot in Mithalas city": 698174, + "Mithalas city, Mithalas pot": 698174, "Mithalas city, urn in the cathedral flower tube entrance": 698128, } locations_mithalas_city_fishpass = { - "Doll in Mithalas city": 698173, + "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, - "Blue banner in the Mithalas city castle": 698165, + "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, @@ -209,7 +209,7 @@ class AquariaLocations: } locations_cathedral_l_sc = { - "Trident head in the Mithalas city castle": 698183, + "Mithalas city castle, Trident head": 698183, } locations_cathedral_r = { @@ -220,18 +220,18 @@ class AquariaLocations: "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, # Before: Mithalas cathedral, urn in the top right path + "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, - "Mithalan Dress in the Mithalas cathedral": 698189, + "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, 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, @@ -246,12 +246,12 @@ class AquariaLocations: "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, - "Jelly Egg in the Kelp Forest top left": 698185, + "Kelp Forest top left, Jelly Egg": 698185, } locations_forest_tl_fp = { - "Kelp Forest top left area, bulb up to the Verse egg": 698047, - "Verse egg in the Kelp forest top left area": 698158, + "Kelp Forest top left area, bulb close to the Verse egg": 698047, + "Kelp forest top left area, Verse egg": 698158, } locations_forest_tr = { @@ -260,7 +260,7 @@ class AquariaLocations: "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, - "Black pearl in the Kelp forest top right area": 698167, + "Kelp forest top right area, Black pearl": 698167, } locations_forest_tr_fp = { @@ -269,12 +269,12 @@ class AquariaLocations: locations_forest_bl = { "Kelp Forest bottom left area, bulb close to the spirit cristals": 698054, - "Walker baby in the Kelp forest bottom left area": 698186, + "Kelp forest bottom left area, Walker baby": 698186, "Kelp Forest bottom left area, Transturtle": 698212, } locations_forest_br = { - "Odd Container in the Kelp forest bottom right area": 698168, + "Kelp forest bottom right area, Odd Container": 698168, } locations_forest_boss = { @@ -286,7 +286,7 @@ class AquariaLocations: } locations_forest_fish_cave = { - "Fish cave puzzle": 698207, + "Kelp Forest bottom left area, Fish cave puzzle": 698207, } locations_forest_sprite_cave = { @@ -295,7 +295,7 @@ class AquariaLocations: locations_forest_sprite_cave_tube = { "Kelp Forest sprite cave, bulb in the second room": 698057, - "Seed bag in the Kelp Forest Sprite Cave": 698176, + "Kelp Forest Sprite Cave, Seed bag": 698176, } locations_mermog_cave = { @@ -303,11 +303,11 @@ class AquariaLocations: } locations_mermog_boss = { - "Piranha Egg in the Mermog cave": 698197, + "Mermog cave, Piranha Egg": 698197, } locations_veil_tl = { - "In the Li cave": 698199, + "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, @@ -318,12 +318,12 @@ class AquariaLocations: } locations_turtle_cave = { - "Turtle Egg in the Turtle cave": 698184, + "Turtle cave, Turtle Egg": 698184, } locations_turtle_cave_bubble = { "Turtle cave, bulb in bubble cliff": 698000, - "Urchin costume in the Turtle cave": 698193, + "Turtle cave, Urchin costume": 698193, } locations_veil_tr_r = { @@ -345,15 +345,15 @@ class AquariaLocations: } locations_veil_bl_fp = { - "Verse egg in the veil bottom area": 698157, + "The veil bottom areaVerse egg": 698157, } locations_veil_br = { - "Stone Head in the veil bottom area": 698181, + "The veil bottom area, Stone Head": 698181, } locations_octo_cave_t = { - "Dumbo Egg in the Octocave": 698196, + "Octopus cave, Dumbo Egg": 698196, } locations_octo_cave_b = { @@ -363,21 +363,21 @@ class AquariaLocations: 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, - "Verse egg in the Bubble cave": 698161, + "Bubble cave, Verse egg": 698161, } 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, - "Golden Gear in the Sun temple": 698171, + "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 key in the Sun temple": 698182, + "Sun temple, Sun key": 698182, } locations_sun_temple_boss_path = { @@ -394,8 +394,8 @@ class AquariaLocations: locations_abyss_l = { "Abyss left area, bulb in hidden path room": 698024, "Abyss left area, bulb in the right part": 698025, - "Glowing seed in the Abyss left area": 698166, - "Glowing Plant in the Abyss left area": 698172, + "Abyss left area, Glowing seed": 698166, + "Abyss left area, Glowing Plant": 698172, "Abyss left area, bulb in the bottom fish pass": 698026, } @@ -417,11 +417,11 @@ class AquariaLocations: locations_king_jellyfish_cave = { "King Jellyfish cave, bulb in the right path from King Jelly": 698088, - "Jellyfish Costume in the King Jellyfish cave": 698188, + "King Jellyfish cave, Jellyfish Costume": 698188, } locations_whale = { - "Verse egg in the whale": 698159, + "The whale, Verse egg": 698159, } locations_sunken_city_r = { @@ -436,7 +436,7 @@ class AquariaLocations: } locations_sunken_city_l_bedroom = { - "Girl Costume in the Sunken city left area": 698192, + "Sunken city left area, Girl Costume": 698192, } locations_sunken_city_boss = { @@ -468,7 +468,7 @@ class AquariaLocations: locations_body_b = { "The body bottom area, bulb in the Jelly Zap room": 698101, "The body bottom area, bulb in the nautilus room": 698102, - "Mutant Costume in the body bottom area": 698190, + "The body bottom area, Mutant Costume": 698190, } locations_final_boss_tube = { diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 8360379ac90..f8d9b928755 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -988,7 +988,7 @@ def __adjusting_soup_rules(self) -> None: """ Modify rules for location that need soup """ - add_rule(self.world.get_location("Urchin costume in the Turtle cave", self.player), + add_rule(self.world.get_location("Turtle cave, Urchin costume", self.player), lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) add_rule(self.world.get_location("Sun Worm path, first cliff bulb", self.player), lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) @@ -1029,9 +1029,9 @@ def __adjusting_under_rock_location(self) -> None: self.player), lambda state: _has_bind_song(state, self.player)) def __adjusting_light_in_dark_place_rules(self) -> None: - add_rule(self.world.get_location("Black pearl in the Kelp forest top right area", self.player), + add_rule(self.world.get_location("Kelp forest top right area, Black pearl", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_location("Odd Container in the Kelp forest bottom right area", self.player), + add_rule(self.world.get_location("Kelp forest bottom right area, Odd Container", self.player), lambda state: _has_light(state, self.player)) add_rule(self.world.get_entrance("Transturtle Veil top left to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) @@ -1059,23 +1059,23 @@ def __adjusting_light_in_dark_place_rules(self) -> None: lambda state: _has_light(state, self.player)) def __adjusting_manual_rules(self) -> None: - add_rule(self.world.get_location("Mithalan Dress in the Mithalas cathedral", self.player), + add_rule(self.world.get_location("Mithalas cathedral, Mithalan Dress", self.player), lambda state: _has_beast_form(state, self.player)) add_rule(self.world.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), lambda state: _has_fish_form(state, self.player)) - add_rule(self.world.get_location("Walker baby in the Kelp forest bottom left area", self.player), + add_rule(self.world.get_location("Kelp forest bottom left area, Walker baby", self.player), lambda state: _has_spirit_form(state, self.player)) add_rule(self.world.get_location("The veil top left area, bulb hidden behind the blocking rock", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Turtle Egg in the Turtle cave", self.player), + add_rule(self.world.get_location("Turtle cave, Turtle Egg", self.player), lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Abyss left area, bulb in the bottom fish pass", self.player), lambda state: _has_fish_form(state, self.player)) - add_rule(self.world.get_location("Anemone seed in the Song cave", self.player), + add_rule(self.world.get_location("Song cave, Anemone seed", self.player), lambda state: _has_nature_form(state, self.player)) add_rule(self.world.get_location("Verse egg in the Song cave", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Big Seed in the Verse cave right area", self.player), + add_rule(self.world.get_location("Verse cave right area, Big Seed", self.player), lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Arnassi ruins, Song plant spore on the top of the ruins", self.player), lambda state: _has_beast_form(state, self.player)) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 93983a6a160..374b7433b5b 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -171,7 +171,7 @@ def create_items(self) -> None: def __excluded_hard_or_hidden_location(self) -> None: - self.multiworld.get_location("Fallen god tooth in the Energy temple", self.player).progress_type = ( + self.multiworld.get_location("Energy temple boss area, Fallen god tooth", self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("Cathedral boss area, beating Mithalan God", self.player).progress_type = ( LocationProgressType.EXCLUDED) @@ -181,21 +181,19 @@ def __excluded_hard_or_hidden_location(self) -> None: LocationProgressType.EXCLUDED) self.multiworld.get_location("Sunken city, bulb on the top of the boss area (boiler room)", self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Nautilus Egg in Home water", self.player).progress_type = ( + self.multiworld.get_location("Home water, Nautilus Egg", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Blaster egg in the Energy temple", self.player).progress_type = ( + self.multiworld.get_location("Energy temple blaster room, Blaster egg", self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("Mithalas castle, beating the priests", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Piranha Egg in the Mermog cave", self.player).progress_type = ( + self.multiworld.get_location("Mermog cave, Piranha Egg", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Dumbo Egg in the Octocave", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Verse egg in the Bubble cave", self.player).progress_type = ( + self.multiworld.get_location("Octopus cave, Dumbo Egg", self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("King Jellyfish cave, bulb in the right path from King Jelly", self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Jellyfish Costume in the King Jellyfish cave", + self.multiworld.get_location("King Jellyfish cave, Jellyfish Costume", self.player).progress_type = LocationProgressType.EXCLUDED self.multiworld.get_location("Final boss area, bulb in the boss second form room", self.player).progress_type = LocationProgressType.EXCLUDED @@ -211,16 +209,16 @@ def __excluded_hard_or_hidden_location(self) -> None: self.multiworld.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Verse egg in the Bubble cave", self.player).progress_type = ( + self.multiworld.get_location("Bubble cave, Verse egg", self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Walker baby in the Kelp forest bottom left area", + self.multiworld.get_location("Kelp forest bottom left area, Walker baby", self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Sun key in the Sun temple", self.player).progress_type = ( + self.multiworld.get_location("Sun temple, Sun key", self.player).progress_type = ( LocationProgressType.EXCLUDED) - self.multiworld.get_location("Mutant Costume in the body bottom area", self.player).progress_type = ( + self.multiworld.get_location("The body bottom area, Mutant Costume", self.player).progress_type = ( LocationProgressType.EXCLUDED) self.multiworld.get_location("Sun temple, bulb in the hidden room of the right part", self.player).progress_type = LocationProgressType.EXCLUDED diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index d07b32e82e3..f730f2f723a 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -11,11 +11,11 @@ ### 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 keep on working. -Also, in Windows, the save files are store in the Aquaria folder. So copying the Aquaria folder for every Multiworld -game you play will make sure that every game have their own save game. +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 every unzipped files in the Aquaria game folder. The unzipped files +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 @@ -23,8 +23,9 @@ are those: - SDL2.dll - usersettings.xml - wrap_oal.dll +- cacert.pem -If there is conflict between file in the original game folder and the unzipped files, you should override +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 @@ -35,7 +36,7 @@ randomizer: aquaria_randomizer.exe --name YourName --server theServer:thePort ``` -or, if the room hava a password: +or, if the room has a password: ```bash aquaria_randomizer.exe --name YourName --server theServer:thePort --password thePassword @@ -43,7 +44,7 @@ aquaria_randomizer.exe --name YourName --server theServer:thePort --password th ### Linux Preparations using the AppImage -If you use the AppImage, juste copy it in the Aquaria game folder. You then have to make it executable. You +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 @@ -58,7 +59,7 @@ To launch the randomizer, just launch in command line: ./Aquaria_Randomizer-*.AppImage --name YourName --server theServer:thePort ``` -or, if the room hava a password: +or, if the room has a password: ```bash ./Aquaria_Randomizer-*.AppImage --name YourName --server theServer:thePort --password thePassword @@ -67,15 +68,16 @@ or, if the room hava a password: ### Linux Preparations 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 keep on working. +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 every extracted files in the Aquaria game folder. The extracted +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 conflict between file in the original game folder and the extracted files, you should override +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. @@ -95,14 +97,14 @@ To launch the randomizer, just launch in command line: ./aquaria_randomizer --name YourName --server theServer:thePort ``` -or, if the room hava a password: +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 used this command line to be -sure that your executable have the executable permission: +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 diff --git a/worlds/aquaria/docs/setup_fr.md b/worlds/aquaria/docs/setup_fr.md index 4b778953445..a0afacab0f1 100644 --- a/worlds/aquaria/docs/setup_fr.md +++ b/worlds/aquaria/docs/setup_fr.md @@ -1,3 +1,115 @@ -# # Guide de configuration MultiWorld d'Aquaria +# Guide de configuration MultiWorld d'Aquaria -Todo \ No newline at end of file +## 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 randomiser 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 des fichiers de l'archive zip et des fichiers du jeu original, vous devez utiliser +les fichiers contenus dans l'archive zip. + +Finalement, pour lancer le randomiser, 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 randomiser: + +```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 jsu 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 +``` + +### 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 randomiser auront comme impact de rendre le jeu d'origine non fonctionnel. Donc, effectuer la copie du jeu +avant de déposer le randomiser à 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 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 des fichiers de l'archive tar et des 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 randomiser 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 +``` From 2bb885bc30b433bbdde50a2959ff3f81bf1d7d41 Mon Sep 17 00:00:00 2001 From: Louis M Date: Sun, 14 Apr 2024 22:08:48 -0400 Subject: [PATCH 25/56] Using player random instead of multiworld random --- worlds/aquaria/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 374b7433b5b..c67b04710de 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -253,12 +253,12 @@ def generate_basic(self) -> None: simple_ingredients_substitution.pop(-1) simple_ingredients_substitution.pop(-1) simple_ingredients_substitution.pop(-1) - self.multiworld.random.shuffle(simple_ingredients_substitution) + 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.multiworld.random.shuffle(dishes_substitution) + self.random.shuffle(dishes_substitution) self.ingredients_substitution.clear() self.ingredients_substitution.extend(simple_ingredients_substitution) self.ingredients_substitution.extend(dishes_substitution) From 6b20467cd8126f64d9afbef0fb658429fc84af10 Mon Sep 17 00:00:00 2001 From: Louis M Date: Sun, 14 Apr 2024 22:21:07 -0400 Subject: [PATCH 26/56] Changing the SeaLoaf filler by random ingredients --- worlds/aquaria/__init__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index c67b04710de..bdd65def31d 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -7,7 +7,7 @@ from typing import List, Dict, ClassVar, Any from ..AutoWorld import World, WebWorld from BaseClasses import Tutorial, MultiWorld, ItemClassification, LocationProgressType -from .Items import item_table, AquariaItem, ItemType +from .Items import item_table, AquariaItem, ItemType, ItemGroup from .Locations import location_table from .Options import AquariaOptions from .Regions import AquariaRegions @@ -138,8 +138,14 @@ def __pre_fill_item(self, item_name: str, location_name: str, precollected) -> N self.multiworld.get_location(location_name, self.player).place_locked_item(item) def get_filler_item_name(self): - filler_item_name = "Sea loaf" # or write something if there's other filler items that could be genned + """Getting a random ingredient item as filler""" + ingredients = [] + for name, data in item_table.items(): + if data[3] == 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]] From 8b689b6c7012a49b1802dd4bd392ad2b28e9734e Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 16 Apr 2024 14:01:00 -0400 Subject: [PATCH 27/56] Adding Bind song tests --- worlds/aquaria/Regions.py | 3 +- worlds/aquaria/__init__.py | 10 +- worlds/aquaria/test/__init__.py | 5 + .../test/test_bind_song_access_test.py | 232 ++++++++++++++++++ 4 files changed, 241 insertions(+), 9 deletions(-) create mode 100644 worlds/aquaria/test/__init__.py create mode 100644 worlds/aquaria/test/test_bind_song_access_test.py diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index f8d9b928755..925690c0476 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -476,7 +476,8 @@ def __connect_home_water_regions(self) -> None: lambda state: _has_bind_song(state, self.player)) self.__connect_regions("Home Water", "Energy temple_altar", self.home_water, self.energy_temple_altar, - lambda state: _has_energy_form(state, self.player)) + lambda state: _has_energy_form(state, self.player) and + _has_bind_song(state, self.player)) self.__connect_regions("Energy temple first area", "Energy temple second area", self.energy_temple_1, self.energy_temple_2, lambda state: _has_energy_form(state, self.player)) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index bdd65def31d..2d89cbba1bd 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -110,6 +110,7 @@ def create_regions(self) -> None: """ self.regions.add_regions_to_world() self.regions.connect_regions() + self.regions.add_event_locations() def create_item(self, name: str) -> AquariaItem: """ @@ -233,7 +234,7 @@ def set_rules(self) -> None: """ Launched when the Multiworld generator is ready to generate rules """ - self.regions.add_event_locations() + self.regions.adjusting_rules(self.options) if self.options.exclude_hard_or_hidden_locations: self.__excluded_hard_or_hidden_location() @@ -241,13 +242,6 @@ def set_rules(self) -> None: self.multiworld.completion_condition[self.player] = lambda \ state: state.has("Victory", self.player) - # for debugging purposes, you may want to visualize the layout of your world. - # Uncomment the following code to write a PlantUML diagram to the file - # "aquaria_world.puml" that can help you see whether your regions and locations - # are connected and placed as desired - # from Utils import visualize_regions - # visualize_regions(self.multiworld.get_region("Menu", self.player), "aquaria_world.puml") - def generate_basic(self) -> None: """ Player-specific randomization that does not affect logic. diff --git a/worlds/aquaria/test/__init__.py b/worlds/aquaria/test/__init__.py new file mode 100644 index 00000000000..e21e81ef73d --- /dev/null +++ b/worlds/aquaria/test/__init__.py @@ -0,0 +1,5 @@ +from test.bases import WorldTestBase + + +class AquariaTestBase(WorldTestBase): + game = "Aquaria" diff --git a/worlds/aquaria/test/test_bind_song_access_test.py b/worlds/aquaria/test/test_bind_song_access_test.py new file mode 100644 index 00000000000..79afc83c674 --- /dev/null +++ b/worlds/aquaria/test/test_bind_song_access_test.py @@ -0,0 +1,232 @@ +from worlds.aquaria.test import AquariaTestBase + + +class BindSongAccessTest(AquariaTestBase): + options = { + "bind_song_needed_to_get_under_rock_bulb": False, + } + + def test_sword_chests(self) -> None: + """Test locations that require a sword""" + 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", + "Home water, Transturtle", + "Verse egg in the Song cave", + "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", + "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", + "Arnassi ruins, beating Simon says", + "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 cristals", + "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 areaVerse 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 second 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 Mantis Shrimp Prime", + "Beating King Jellyfish God Prime", + "First secret", + "Second secret", + "Third secret", + "Sunken City cleared", + "Objective complete", + ] + items = [["Bind song"]] + # This tests that the provided locations aren't accessible without the provided items, but can be accessed once + # the items are obtained. + # This will also check that any locations not provided don't have the same dependency requirement. + # Optionally, passing only_check_listed=True to the method will only check the locations provided. + self.assertAccessDependency(locations, items) From 3aba89b8237d3370b5692c8aff915faa6aa2cab6 Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 17 Apr 2024 14:59:14 -0400 Subject: [PATCH 28/56] Adding tests --- worlds/aquaria/Locations.py | 4 +- worlds/aquaria/Regions.py | 58 +++-- worlds/aquaria/__init__.py | 2 +- .../docs/{en_aquaria.md => en_Aquaria.md} | 0 .../docs/{fr_aquaria.md => fr_Aquaria.md} | 0 worlds/aquaria/test/__init__.py | 203 +++++++++++++++ worlds/aquaria/test/test_beast_form_access.py | 41 ++++ worlds/aquaria/test/test_bind_song_access.py | 28 +++ .../test/test_bind_song_access_test.py | 232 ------------------ .../test/test_bind_song_option_access.py | 34 +++ .../aquaria/test/test_energy_form_access.py | 64 +++++ .../test/test_energy_form_access_option.py | 22 ++ worlds/aquaria/test/test_li_song_access.py | 32 +++ 13 files changed, 464 insertions(+), 256 deletions(-) rename worlds/aquaria/docs/{en_aquaria.md => en_Aquaria.md} (100%) rename worlds/aquaria/docs/{fr_aquaria.md => fr_Aquaria.md} (100%) create mode 100644 worlds/aquaria/test/test_beast_form_access.py create mode 100644 worlds/aquaria/test/test_bind_song_access.py delete mode 100644 worlds/aquaria/test/test_bind_song_access_test.py create mode 100644 worlds/aquaria/test/test_bind_song_option_access.py create mode 100644 worlds/aquaria/test/test_energy_form_access.py create mode 100644 worlds/aquaria/test/test_energy_form_access_option.py create mode 100644 worlds/aquaria/test/test_li_song_access.py diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 16da1d49b92..939721703ed 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -345,7 +345,7 @@ class AquariaLocations: } locations_veil_bl_fp = { - "The veil bottom areaVerse egg": 698157, + "The veil bottom area, Verse egg": 698157, } locations_veil_br = { @@ -479,7 +479,7 @@ class AquariaLocations: } locations_final_boss = { - "Final boss area, bulb in the boss second form room": 698106, + "Final boss area, bulb in the boss third form room": 698106, } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 925690c0476..6b23f13aff5 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -188,6 +188,7 @@ class AquariaRegions: bubble_cave: Region king_jellyfish_cave: Region whale: Region + first_secret: Region sunken_city_l: Region sunken_city_r: Region sunken_city_boss: Region @@ -398,6 +399,7 @@ def __create_abyss(self) -> None: self.king_jellyfish_cave = self.__add_region("Abyss left area, King jellyfish cave", AquariaLocations.locations_king_jellyfish_cave) self.whale = self.__add_region("Inside the whale", AquariaLocations.locations_whale) + self.first_secret = self.__add_region("First secret area", None) def __create_sunken_city(self) -> None: """ @@ -559,7 +561,8 @@ def __connect_open_water_regions(self) -> None: self.arnassi, self.arnassi_path) self.__connect_one_way_regions("Arnassi path", "Arnassi crab boss area", self.arnassi_path, self.arnassi_crab_boss, - lambda state: _has_beast_form(state, self.player)) + lambda state: _has_beast_form(state, self.player) and + _has_energy_form(state, self.player)) self.__connect_one_way_regions("Arnassi crab boss area", "Arnassi path", self.arnassi_crab_boss, self.arnassi_path) self.__connect_regions("Arnassi path", "simon", self.arnassi_path, self.simon, @@ -577,36 +580,38 @@ def __connect_mithalas_regions(self) -> None: self.__connect_regions("Mithalas city", "Mithalas city home with fishpass", self.mithalas_city, self.mithalas_city_fishpass, lambda state: _has_fish_form(state, self.player)) - self.__connect_regions("Mithalas city", "Cathedral left area", + self.__connect_regions("Mithalas city", "Mithalas castle", self.mithalas_city, self.cathedral_l, lambda state: _has_fish_form(state, self.player)) - self.__connect_one_way_regions("Mithalas city top path", "Cathedral left area, flower tube", + self.__connect_one_way_regions("Mithalas city top path", "Mithalas castle, flower tube", self.mithalas_city_top_path, self.cathedral_l_tube, - lambda state: _has_nature_form(state, self.player)) - self.__connect_one_way_regions("Cathedral left area, flower tube area", "Mithalas city top path", + lambda state: _has_nature_form(state, self.player) and + _has_energy_form(state, self.player)) + self.__connect_one_way_regions("Mithalas castle, flower tube area", "Mithalas city top path", self.cathedral_l_tube, self.mithalas_city_top_path, lambda state: _has_beast_form(state, self.player) and _has_nature_form(state, self.player)) - self.__connect_regions("Cathedral left area flower tube area", "Cathedral left area, spirit crystals", + self.__connect_one_way_regions("Mithalas castle flower tube area", "Mithalas castle, spirit crystals", self.cathedral_l_tube, self.cathedral_l_sc, lambda state: _has_spirit_form(state, self.player)) - self.__connect_regions("Cathedral left area_flower tube area", "Cathedral left area", + self.__connect_one_way_regions("Mithalas castle_flower tube area", "Mithalas castle", self.cathedral_l_tube, self.cathedral_l, lambda state: _has_spirit_form(state, self.player)) - self.__connect_regions("Cathedral left area", "Cathedral left area, spirit crystals", + self.__connect_regions("Mithalas castle", "Mithalas castle, spirit crystals", self.cathedral_l, self.cathedral_l_sc, lambda state: _has_spirit_form(state, self.player)) - self.__connect_regions("Cathedral left area", "Cathedral boss left area", + self.__connect_regions("Mithalas castle", "Cathedral boss left area", self.cathedral_l, self.cathedral_boss_l, lambda state: _has_beast_form(state, self.player) and - state.has("Mithalan God beated", self.player)) - self.__connect_regions("Cathedral left area", "Cathedral underground", + _has_energy_form(state, self.player) and + _has_bind_song(state, self.player)) + self.__connect_regions("Mithalas castle", "Cathedral underground", self.cathedral_l, self.cathedral_underground, lambda state: _has_beast_form(state, self.player) and _has_bind_song(state, self.player)) - self.__connect_regions("Cathedral left area", "Cathedral right area", + self.__connect_regions("Mithalas castle", "Cathedral right area", self.cathedral_l, self.cathedral_r, lambda state: _has_bind_song(state, self.player) and _has_energy_form(state, self.player)) @@ -615,16 +620,15 @@ def __connect_mithalas_regions(self) -> None: lambda state: _has_energy_form(state, self.player)) self.__connect_one_way_regions("Cathedral underground", "Cathedral boss left area", self.cathedral_underground, self.cathedral_boss_r, - lambda state: _has_energy_form(state, self.player)) + lambda state: _has_energy_form(state, self.player) and + _has_bind_song(state, self.player)) self.__connect_one_way_regions("Cathedral boss left area", "Cathedral underground", self.cathedral_boss_r, self.cathedral_underground, lambda state: _has_beast_form(state, self.player)) - self.__connect_one_way_regions("Cathedral boss right area", "Cathedral boss left area", + self.__connect_regions("Cathedral boss right area", "Cathedral boss left area", self.cathedral_boss_r, self.cathedral_boss_l, lambda state: _has_bind_song(state, self.player) and _has_energy_form(state, self.player)) - self.__connect_one_way_regions("Cathedral boss left area", "Cathedral boss right area", - self.cathedral_boss_l, self.cathedral_boss_r) def __connect_forest_regions(self) -> None: """ @@ -679,7 +683,7 @@ def __connect_veil_regions(self) -> None: self.veil_bl, self.veil_bl_fp, lambda state: _has_fish_form(state, self.player) and _has_bind_song(state, self.player) and - _has_energy_form(state, self.player)) + _has_damaging_item(state, self.player)) self.__connect_regions("Veil bottom left area", "Veil bottom area spirit crystals path", self.veil_bl, self.veil_b_sc, lambda state: _has_spirit_form(state, self.player)) @@ -717,7 +721,8 @@ def __connect_veil_regions(self) -> None: self.veil_tr_l, self.octo_cave_t, lambda state: _has_fish_form(state, self.player) and _has_sun_form(state, self.player) and - _has_beast_form(state, self.player)) + _has_beast_form(state, self.player) and + _has_energy_form(state, self.player)) self.__connect_regions("Veil left of sun temple", "Octo cave bottom path", self.veil_tr_l, self.octo_cave_b, lambda state: _has_fish_form(state, self.player)) @@ -744,10 +749,16 @@ def __connect_abyss_regions(self) -> None: _has_beast_form(state, self.player)) self.__connect_regions("Abyss left area", "Abyss right area", self.abyss_l, self.abyss_r) - self.__connect_regions("Abyss right area", "whale", + self.__connect_regions("Abyss right area", "Inside the whale", self.abyss_r, self.whale, lambda state: _has_spirit_form(state, self.player) and _has_sun_form(state, self.player)) + self.__connect_regions("Abyss right area", "First secret area", + self.abyss_r, self.first_secret, + lambda state: _has_spirit_form(state, self.player) and + _has_sun_form(state, self.player) and + _has_bind_song(state, self.player) and + _has_energy_form(state, self.player)) self.__connect_regions("Abyss right area", "Ice cave", self.abyss_r, self.ice_cave, lambda state: _has_spirit_form(state, self.player)) @@ -916,7 +927,7 @@ def __add_event_secrets(self) -> None: """ Add secrets events to the `world` """ - self.__add_event_location(self.whale, + self.__add_event_location(self.first_secret, # Doit ajouter une région pour le "first secret" "First secret", "First secret obtained") self.__add_event_location(self.mithalas_city, @@ -933,7 +944,7 @@ def add_event_locations(self) -> None: self.__add_event_mini_bosses() self.__add_event_big_bosses() self.__add_event_secrets() - self.__add_event_location(self.abyss_lb, + self.__add_event_location(self.sunken_city_boss, "Sunken City cleared", "Body tongue cleared") self.__add_event_location(self.final_boss_end, "Objective complete", @@ -1088,6 +1099,11 @@ def __adjusting_manual_rules(self) -> None: lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Naija's home, bulb after the energy door", self.player), lambda state: _has_energy_form(state, self.player)) + add_rule(self.world.get_location("Abyss right area, bulb behind the rock in the whale room", self.player), + lambda state: _has_spirit_form(state, self.player) and + _has_sun_form(state, self.player)) + + def adjusting_rules(self, options: AquariaOptions) -> None: """ Modify rules for single location or optional rules diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 2d89cbba1bd..94636963bab 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -202,7 +202,7 @@ def __excluded_hard_or_hidden_location(self) -> None: self.player).progress_type = LocationProgressType.EXCLUDED self.multiworld.get_location("King Jellyfish cave, Jellyfish Costume", self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Final boss area, bulb in the boss second form room", + self.multiworld.get_location("Final boss area, bulb in the boss third form room", self.player).progress_type = LocationProgressType.EXCLUDED self.multiworld.get_location("Sun Worm path, first cliff bulb", self.player).progress_type = ( LocationProgressType.EXCLUDED) diff --git a/worlds/aquaria/docs/en_aquaria.md b/worlds/aquaria/docs/en_Aquaria.md similarity index 100% rename from worlds/aquaria/docs/en_aquaria.md rename to worlds/aquaria/docs/en_Aquaria.md diff --git a/worlds/aquaria/docs/fr_aquaria.md b/worlds/aquaria/docs/fr_Aquaria.md similarity index 100% rename from worlds/aquaria/docs/fr_aquaria.md rename to worlds/aquaria/docs/fr_Aquaria.md diff --git a/worlds/aquaria/test/__init__.py b/worlds/aquaria/test/__init__.py index e21e81ef73d..8c015002832 100644 --- a/worlds/aquaria/test/__init__.py +++ b/worlds/aquaria/test/__init__.py @@ -1,5 +1,208 @@ from test.bases import WorldTestBase +after_home_water_locations = [ + "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", + "Arnassi ruins, beating Simon says", + "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 cristals", + "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", + "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): game = "Aquaria" diff --git a/worlds/aquaria/test/test_beast_form_access.py b/worlds/aquaria/test/test_beast_form_access.py new file mode 100644 index 00000000000..35c34fdf2ea --- /dev/null +++ b/worlds/aquaria/test/test_beast_form_access.py @@ -0,0 +1,41 @@ +from worlds.aquaria.test import AquariaTestBase + + +class BeastFormAccessTest(AquariaTestBase): + + 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) diff --git a/worlds/aquaria/test/test_bind_song_access.py b/worlds/aquaria/test/test_bind_song_access.py new file mode 100644 index 00000000000..da3cb8e3cdf --- /dev/null +++ b/worlds/aquaria/test/test_bind_song_access.py @@ -0,0 +1,28 @@ +from worlds.aquaria.test import AquariaTestBase, after_home_water_locations + + +class BindSongAccessTest(AquariaTestBase): + 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", + "Verse egg in the Song cave", + "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) diff --git a/worlds/aquaria/test/test_bind_song_access_test.py b/worlds/aquaria/test/test_bind_song_access_test.py deleted file mode 100644 index 79afc83c674..00000000000 --- a/worlds/aquaria/test/test_bind_song_access_test.py +++ /dev/null @@ -1,232 +0,0 @@ -from worlds.aquaria.test import AquariaTestBase - - -class BindSongAccessTest(AquariaTestBase): - options = { - "bind_song_needed_to_get_under_rock_bulb": False, - } - - def test_sword_chests(self) -> None: - """Test locations that require a sword""" - 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", - "Home water, Transturtle", - "Verse egg in the Song cave", - "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", - "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", - "Arnassi ruins, beating Simon says", - "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 cristals", - "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 areaVerse 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 second 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 Mantis Shrimp Prime", - "Beating King Jellyfish God Prime", - "First secret", - "Second secret", - "Third secret", - "Sunken City cleared", - "Objective complete", - ] - items = [["Bind song"]] - # This tests that the provided locations aren't accessible without the provided items, but can be accessed once - # the items are obtained. - # This will also check that any locations not provided don't have the same dependency requirement. - # Optionally, passing only_check_listed=True to the method will only check the locations provided. - self.assertAccessDependency(locations, items) diff --git a/worlds/aquaria/test/test_bind_song_option_access.py b/worlds/aquaria/test/test_bind_song_option_access.py new file mode 100644 index 00000000000..d7da7f08dc0 --- /dev/null +++ b/worlds/aquaria/test/test_bind_song_option_access.py @@ -0,0 +1,34 @@ +from worlds.aquaria.test import AquariaTestBase +from worlds.aquaria.test.test_bind_song_access import after_home_water_locations + + +class BindSongOptionAccessTest(AquariaTestBase): + 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", + "Verse egg in the Song cave", + "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) diff --git a/worlds/aquaria/test/test_energy_form_access.py b/worlds/aquaria/test/test_energy_form_access.py new file mode 100644 index 00000000000..1e67cd5fb51 --- /dev/null +++ b/worlds/aquaria/test/test_energy_form_access.py @@ -0,0 +1,64 @@ +from worlds.aquaria.test import AquariaTestBase + +class EnergyFormAccessTest(AquariaTestBase): + 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) \ No newline at end of file diff --git a/worlds/aquaria/test/test_energy_form_access_option.py b/worlds/aquaria/test/test_energy_form_access_option.py new file mode 100644 index 00000000000..078ed27d44c --- /dev/null +++ b/worlds/aquaria/test/test_energy_form_access_option.py @@ -0,0 +1,22 @@ +from worlds.aquaria.test import AquariaTestBase, after_home_water_locations + +class EnergyFormAccessTest(AquariaTestBase): + 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) \ No newline at end of file diff --git a/worlds/aquaria/test/test_li_song_access.py b/worlds/aquaria/test/test_li_song_access.py new file mode 100644 index 00000000000..f8009625c6e --- /dev/null +++ b/worlds/aquaria/test/test_li_song_access.py @@ -0,0 +1,32 @@ +from worlds.aquaria.test import AquariaTestBase + + +class LiAccessTest(AquariaTestBase): + + 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", + ] + items = [["Li and Li song"]] + self.assertAccessDependency(locations, items) From b77e64b0fbd51d77a8df20d43bc5ad4d6aced9b8 Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 17 Apr 2024 15:33:17 -0400 Subject: [PATCH 29/56] Adding Li tests --- worlds/aquaria/test/test_li_song_access.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/worlds/aquaria/test/test_li_song_access.py b/worlds/aquaria/test/test_li_song_access.py index f8009625c6e..7d797ffc6a7 100644 --- a/worlds/aquaria/test/test_li_song_access.py +++ b/worlds/aquaria/test/test_li_song_access.py @@ -2,6 +2,9 @@ class LiAccessTest(AquariaTestBase): + options = { + "turtle_randomizer": 1, + } def test_li_song_location(self) -> None: """Test locations that require Li""" @@ -27,6 +30,9 @@ def test_li_song_location(self) -> None: "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"]] + items = [["Li and Li song", "Body tongue cleared"]] self.assertAccessDependency(locations, items) From ad17acf409daeec1b5664e8249ad3bd5bbc1466e Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 17 Apr 2024 17:54:49 -0400 Subject: [PATCH 30/56] Adding nature, spirit and sun form tests --- worlds/aquaria/Items.py | 2 +- worlds/aquaria/Locations.py | 4 ++ worlds/aquaria/Regions.py | 18 ++++--- .../aquaria/test/test_nature_form_access.py | 48 +++++++++++++++++++ .../aquaria/test/test_spirit_form_access.py | 28 +++++++++++ worlds/aquaria/test/test_sun_form_access.py | 18 +++++++ 6 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 worlds/aquaria/test/test_nature_form_access.py create mode 100644 worlds/aquaria/test/test_spirit_form_access.py create mode 100644 worlds/aquaria/test/test_sun_form_access.py diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index 05ba7cae9e0..b611b9dd2d9 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -56,7 +56,7 @@ def __init__(self, name: str, classification: ItemClassification, "Black pearl": (698004, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_blackpearl "Baby blaster": (698005, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_blaster "Crab armor": (698006, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_crab_costume - "Baby dumbo": (698007, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_dumbo + "Baby dumbo": (698007, 1, ItemType.PROGRESSION, ItemGroup.UTILITY), # collectible_dumbo "Tooth": (698008, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_boss "Energy statue": (698009, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_statue "Krotite armor": (698010, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_temple diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 939721703ed..147274d9a33 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -396,6 +396,9 @@ class AquariaLocations: "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, } @@ -500,6 +503,7 @@ class AquariaLocations: **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, diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 6b23f13aff5..d67e0edff36 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -31,7 +31,14 @@ def _has_li(state, player: int) -> bool: def _has_damaging_item(state, player: int) -> bool: """`player` in `state` has the shield song item""" - return state.has_group("Damage", player) + return (state.has("Energy form", player) or + state.has("Nature form", player) or + state.has("Beast form", player) or + state.has("Li and Li song", player) or + state.has("Baby nautilus", player) or + state.has("Baby piranha", player) or + state.has("Baby blaster", player) + ) def _has_shield_song(state, player: int) -> bool: @@ -66,7 +73,7 @@ def _has_sun_form(state, player: int) -> bool: def _has_light(state, player: int) -> bool: """`player` in `state` has the light item""" - return state.has_group("Light", player) + return state.has("Baby dumbo", player)# or _has_sun_form(state, player) def _has_dual_form(state, player: int) -> bool: @@ -392,7 +399,7 @@ def __create_abyss(self) -> None: """ self.abyss_l = self.__add_region("Abyss left area", AquariaLocations.locations_abyss_l) - self.abyss_lb = self.__add_region("Abyss left bottom area", None) + self.abyss_lb = self.__add_region("Abyss left bottom area", AquariaLocations.locations_abyss_lb) self.abyss_r = self.__add_region("Abyss right area", AquariaLocations.locations_abyss_r) self.ice_cave = self.__add_region("Ice cave", AquariaLocations.locations_ice_cave) self.bubble_cave = self.__add_region("Bubble cave", AquariaLocations.locations_bubble_cave) @@ -741,8 +748,7 @@ def __connect_abyss_regions(self) -> None: self.abyss_lb, self.body_c, lambda state: _has_tongue_cleared(state, self.player)) self.__connect_one_way_regions("Body center area", "Abyss left bottom area", - self.body_c, self.abyss_lb, - lambda state: _has_tongue_cleared(state, self.player)) + self.body_c, self.abyss_lb) self.__connect_regions("Abyss left area", "King jellyfish cave", self.abyss_l, self.king_jellyfish_cave, lambda state: _has_energy_form(state, self.player) and @@ -763,7 +769,7 @@ def __connect_abyss_regions(self) -> None: self.abyss_r, self.ice_cave, lambda state: _has_spirit_form(state, self.player)) self.__connect_regions("Abyss right area", "Bubble cave", - self.abyss_r, self.bubble_cave, + self.ice_cave, self.bubble_cave, lambda state: _has_beast_form(state, self.player)) def __connect_sunken_city_regions(self) -> None: diff --git a/worlds/aquaria/test/test_nature_form_access.py b/worlds/aquaria/test/test_nature_form_access.py new file mode 100644 index 00000000000..ebf0c90e54a --- /dev/null +++ b/worlds/aquaria/test/test_nature_form_access.py @@ -0,0 +1,48 @@ +from worlds.aquaria.test import AquariaTestBase + + +class NatureFormAccessTest(AquariaTestBase): + 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", + "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) diff --git a/worlds/aquaria/test/test_spirit_form_access.py b/worlds/aquaria/test/test_spirit_form_access.py new file mode 100644 index 00000000000..e9016e16667 --- /dev/null +++ b/worlds/aquaria/test/test_spirit_form_access.py @@ -0,0 +1,28 @@ +from worlds.aquaria.test import AquariaTestBase + + +class SpiritFormAccessTest(AquariaTestBase): + + 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", + ] + items = [["Spirit form"]] + self.assertAccessDependency(locations, items) diff --git a/worlds/aquaria/test/test_sun_form_access.py b/worlds/aquaria/test/test_sun_form_access.py new file mode 100644 index 00000000000..48dffbc5f4b --- /dev/null +++ b/worlds/aquaria/test/test_sun_form_access.py @@ -0,0 +1,18 @@ +from worlds.aquaria.test import AquariaTestBase + + +class SunFormAccessTest(AquariaTestBase): + + 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) From 7986519210c8bd5f03bb7b4746848ff3c389a038 Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 17 Apr 2024 22:16:15 -0400 Subject: [PATCH 31/56] Adding fish form tests --- worlds/aquaria/Items.py | 2 +- worlds/aquaria/Locations.py | 2 +- worlds/aquaria/Regions.py | 28 +++++++++++++++---- worlds/aquaria/test/__init__.py | 2 +- worlds/aquaria/test/test_fish_form_access.py | 29 ++++++++++++++++++++ 5 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 worlds/aquaria/test/test_fish_form_access.py diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index b611b9dd2d9..3e275a6175e 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -181,7 +181,7 @@ def __init__(self, name: str, classification: ItemClassification, "Transturtle Home water": (698129, 1, ItemType.NORMAL, ItemGroup.TURTLE), # transport_mainarea "Transturtle Abyss right": (698130, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_abyss03 "Transturtle Final Boss": (698131, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_finalboss - "Transturtle Simon says": (698132, 1, ItemType.NORMAL, ItemGroup.TURTLE), # transport_forest05 + "Transturtle Simon says": (698132, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_forest05 "Transturtle Arnassi ruins": (698133, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_seahorse } diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 147274d9a33..8ceaf63b85d 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -159,7 +159,7 @@ class AquariaLocations: } locations_simon = { - "Arnassi ruins, beating Simon says": 698156, + "Kelp forest, beating Simon says": 698156, "Simon says area, Transturtle": 698216, } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index d67e0edff36..d39f0925f54 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -73,7 +73,7 @@ def _has_sun_form(state, player: int) -> bool: def _has_light(state, player: int) -> bool: """`player` in `state` has the light item""" - return state.has("Baby dumbo", player)# or _has_sun_form(state, player) + return state.has("Baby dumbo", player) or _has_sun_form(state, player) def _has_dual_form(state, player: int) -> bool: @@ -291,7 +291,6 @@ def __create_openwater(self) -> None: self.skeleton_path_sc = self.__add_region("Open water skeleton path spirit cristal", AquariaLocations.locations_skeleton_path_sc) self.arnassi = self.__add_region("Arnassi Ruins", AquariaLocations.locations_arnassi) - self.simon = self.__add_region("Arnassi Ruins, Simon's room", AquariaLocations.locations_simon) self.arnassi_path = self.__add_region("Arnassi Ruins, back entrance path", AquariaLocations.locations_arnassi_path) self.arnassi_crab_boss = self.__add_region("Arnassi Ruins, Crabbius Maximus lair", @@ -350,6 +349,7 @@ def __create_forest(self) -> None: AquariaLocations.locations_mermog_boss) self.forest_fish_cave = self.__add_region("Kelp forest fish cave", AquariaLocations.locations_forest_fish_cave) + self.simon = self.__add_region("Kelp forest, Simon's room", AquariaLocations.locations_simon) def __create_veil(self) -> None: """ @@ -572,8 +572,6 @@ def __connect_open_water_regions(self) -> None: _has_energy_form(state, self.player)) self.__connect_one_way_regions("Arnassi crab boss area", "Arnassi path", self.arnassi_crab_boss, self.arnassi_path) - self.__connect_regions("Arnassi path", "simon", self.arnassi_path, self.simon, - lambda state: _has_fish_form(state, self.player)) def __connect_mithalas_regions(self) -> None: """ @@ -824,6 +822,12 @@ def __connect_transturtle(self, item_source: str, item_target: str, region_sourc else: self.__connect_one_way_regions(item_source, item_target, region_source, region_target, rule) + def __connect_arnassi_path_transturtle(self, item_source: str, item_target: str, region_source: Region, + region_target: Region) -> None: + """Connect the Arnassi ruins transturtle to another one""" + self.__connect_one_way_regions(item_source, item_target, region_source, region_target, + lambda state: state.has(item_target, self.player) and + _has_fish_form(state, self.player)) def _connect_transturtle_to_other(self, item: str, region: Region) -> None: """Connect a single transturtle to all others""" @@ -838,6 +842,19 @@ def _connect_transturtle_to_other(self, item: str, region: Region) -> None: self.__connect_transturtle(item, "Transturtle Arnassi ruins", region, self.arnassi_path, lambda state: state.has("Transturtle Arnassi ruins", self.player) and _has_fish_form(state, self.player)) + + def _connect_arnassi_path_transturtle_to_other(self, item: str, region: Region) -> None: + """Connect the Arnassi ruins transturtle to all others""" + self.__connect_arnassi_path_transturtle(item, "Transturtle Veil top left", region, self.veil_tl) + self.__connect_arnassi_path_transturtle(item, "Transturtle Veil top right", region, self.veil_tr_l) + self.__connect_arnassi_path_transturtle(item, "Transturtle Open Water top right", region, + self.openwater_tr_turtle) + self.__connect_arnassi_path_transturtle(item, "Transturtle Forest bottom left", region, self.forest_bl) + self.__connect_arnassi_path_transturtle(item, "Transturtle Home water", region, self.home_water_transturtle) + self.__connect_arnassi_path_transturtle(item, "Transturtle Abyss right", region, self.abyss_r) + self.__connect_arnassi_path_transturtle(item, "Transturtle Final Boss", region, self.final_boss_tube) + self.__connect_arnassi_path_transturtle(item, "Transturtle Simon says", region, self.simon) + def __connect_transturtles(self) -> None: """Connect every transturtle with others""" self._connect_transturtle_to_other("Transturtle Veil top left", self.veil_tl) @@ -848,8 +865,7 @@ def __connect_transturtles(self) -> None: self._connect_transturtle_to_other("Transturtle Abyss right", self.abyss_r) self._connect_transturtle_to_other("Transturtle Final Boss", self.final_boss_tube) self._connect_transturtle_to_other("Transturtle Simon says", self.simon) - self._connect_transturtle_to_other("Transturtle Arnassi ruins", self.arnassi_path) - + self._connect_arnassi_path_transturtle_to_other("Transturtle Arnassi ruins", self.arnassi_path) def connect_regions(self) -> None: """ diff --git a/worlds/aquaria/test/__init__.py b/worlds/aquaria/test/__init__.py index 8c015002832..3cce8a14fb8 100644 --- a/worlds/aquaria/test/__init__.py +++ b/worlds/aquaria/test/__init__.py @@ -28,7 +28,6 @@ "Arnassi Ruins, Arnassi statue", "Arnassi Ruins, Transturtle", "Arnassi ruins, Crab armor", - "Arnassi ruins, beating Simon says", "Simon says area, Transturtle", "Mithalas city, first bulb in the left city part", "Mithalas city, second bulb in the left city part", @@ -184,6 +183,7 @@ "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", diff --git a/worlds/aquaria/test/test_fish_form_access.py b/worlds/aquaria/test/test_fish_form_access.py new file mode 100644 index 00000000000..2818c6f9c2c --- /dev/null +++ b/worlds/aquaria/test/test_fish_form_access.py @@ -0,0 +1,29 @@ +from worlds.aquaria.test import AquariaTestBase + + +class FishFormAccessTest(AquariaTestBase): + 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", + ] + items = [["Fish form"]] + self.assertAccessDependency(locations, items) From 71b9789c28abac246c9d7a208142dab5969780b9 Mon Sep 17 00:00:00 2001 From: Louis M Date: Thu, 18 Apr 2024 14:25:50 -0400 Subject: [PATCH 32/56] Adding light test and fix light needed in sun temple --- worlds/aquaria/Locations.py | 12 ++--- worlds/aquaria/Regions.py | 17 ++++++- worlds/aquaria/test/test_light_access.py | 64 ++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 worlds/aquaria/test/test_light_access.py diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 8ceaf63b85d..8f48dd59e8e 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -360,12 +360,6 @@ class AquariaLocations: "Octopus cave, bulb in the path below the octopus cave path": 698122, } - 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, - "Bubble cave, Verse egg": 698161, - } - locations_sun_temple_l = { "Sun temple, bulb in the top left part": 698094, "Sun temple, bulb in the top right part": 698095, @@ -418,6 +412,12 @@ class AquariaLocations: "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, + "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, diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index d39f0925f54..1411eb83bc3 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -23,6 +23,10 @@ def _has_tongue_cleared(state, player: int) -> bool: """`player` in `state` has the Body tongue cleared item""" return state.has("Body tongue cleared", player) +def _has_sun_crystal(state, player: int) -> bool: + """`player` in `state` has the Sun crystal item""" + return state.has("Has sun crystal", player) + def _has_li(state, player: int) -> bool: """`player` in `state` has Li in it's team""" @@ -713,7 +717,7 @@ def __connect_veil_regions(self) -> None: self.__connect_regions("Sun temple right area", "Sun temple left area", self.sun_temple_r, self.sun_temple_l, lambda state: _has_bind_song(state, self.player)) - self.__connect_regions("Sun temple left area", "Veil left of top sun temple", + self.__connect_regions("Sun temple left area", "Veil left of sun temple", self.sun_temple_l, self.veil_tr_l) self.__connect_regions("Sun temple left area", "Sun temple before boss area", self.sun_temple_l, self.sun_temple_boss_path) @@ -969,6 +973,9 @@ def add_event_locations(self) -> None: self.__add_event_location(self.sunken_city_boss, "Sunken City cleared", "Body tongue cleared") + self.__add_event_location(self.sun_temple_r, + "Sun Crystal", + "Has sun crystal") self.__add_event_location(self.final_boss_end, "Objective complete", "Victory") @@ -1091,6 +1098,14 @@ def __adjusting_light_in_dark_place_rules(self) -> None: lambda state: _has_light(state, self.player)) add_rule(self.world.get_entrance("Open water bottom left area to Abyss left area", self.player), lambda state: _has_light(state, self.player)) + add_rule(self.world.get_entrance("Sun temple left area to Sun temple right area", self.player), + lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) + add_rule(self.world.get_entrance("Sun temple right area to Sun temple left area", self.player), + lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) + add_rule(self.world.get_entrance("Veil left of sun temple to Sun temple left area", self.player), + lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) + + def __adjusting_manual_rules(self) -> None: add_rule(self.world.get_location("Mithalas cathedral, Mithalan Dress", self.player), diff --git a/worlds/aquaria/test/test_light_access.py b/worlds/aquaria/test/test_light_access.py new file mode 100644 index 00000000000..55c433bd9b6 --- /dev/null +++ b/worlds/aquaria/test/test_light_access.py @@ -0,0 +1,64 @@ +from worlds.aquaria.test import AquariaTestBase + + +class LightAccessTest(AquariaTestBase): + 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) From a8c900d94c7dc7a672552ab4808bd8974a2287a4 Mon Sep 17 00:00:00 2001 From: Louis M Date: Thu, 18 Apr 2024 15:12:19 -0400 Subject: [PATCH 33/56] Refactoring and testing documentation --- worlds/aquaria/Regions.py | 66 ++- worlds/aquaria/__init__.py | 57 --- worlds/aquaria/test/__init__.py | 413 +++++++++--------- worlds/aquaria/test/test_beast_form_access.py | 7 + worlds/aquaria/test/test_bind_song_access.py | 8 + .../test/test_bind_song_option_access.py | 8 + worlds/aquaria/test/test_dual_song_access.py | 26 ++ .../aquaria/test/test_energy_form_access.py | 9 + .../test/test_energy_form_access_option.py | 9 + worlds/aquaria/test/test_fish_form_access.py | 8 + worlds/aquaria/test/test_li_song_access.py | 7 + worlds/aquaria/test/test_light_access.py | 7 + .../aquaria/test/test_nature_form_access.py | 7 + .../aquaria/test/test_spirit_form_access.py | 8 + worlds/aquaria/test/test_sun_form_access.py | 7 + 15 files changed, 387 insertions(+), 260 deletions(-) create mode 100644 worlds/aquaria/test/test_dual_song_access.py diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 1411eb83bc3..f86a7226a62 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -5,7 +5,7 @@ """ from typing import Dict, Optional -from BaseClasses import MultiWorld, Region, Entrance, ItemClassification +from BaseClasses import MultiWorld, Region, Entrance, ItemClassification, LocationProgressType from .Items import AquariaItem from .Locations import AquariaLocations, AquariaLocation from .Options import AquariaOptions @@ -1139,7 +1139,67 @@ def __adjusting_manual_rules(self) -> None: add_rule(self.world.get_location("Abyss right area, bulb behind the rock in the whale room", self.player), lambda state: _has_spirit_form(state, self.player) and _has_sun_form(state, self.player)) - + add_rule(self.world.get_location("Arnassi ruins, Arnassi Armor", self.player), + lambda state: _has_fish_form(state, self.player) and + _has_spirit_form(state, self.player)) + + + + + def __excluded_hard_or_hidden_location(self) -> None: + self.world.get_location("Energy temple boss area, Fallen god tooth", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Cathedral boss area, beating Mithalan God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Kelp forest boss area, beating Drunian God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Sun temple boss area, beating Sun God", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Sunken city, bulb on the top of the boss area (boiler room)", + self.player).progress_type = LocationProgressType.EXCLUDED + self.world.get_location("Home water, Nautilus Egg", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Energy temple blaster room, Blaster egg", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Mithalas castle, beating the priests", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Mermog cave, Piranha Egg", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Octopus cave, Dumbo Egg", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("King Jellyfish cave, bulb in the right path from King Jelly", + self.player).progress_type = LocationProgressType.EXCLUDED + self.world.get_location("King Jellyfish cave, Jellyfish Costume", + self.player).progress_type = LocationProgressType.EXCLUDED + self.world.get_location("Final boss area, bulb in the boss third form room", + self.player).progress_type = LocationProgressType.EXCLUDED + self.world.get_location("Sun Worm path, first cliff bulb", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Sun Worm path, second cliff bulb", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("The veil top right area, bulb in the top of the water fall", + self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Bubble cave, bulb in the left cave wall", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", + self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Bubble cave, Verse egg", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", + self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Kelp forest bottom left area, Walker baby", + self.player).progress_type = LocationProgressType.EXCLUDED + self.world.get_location("Sun temple, Sun key", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("The body bottom area, Mutant Costume", self.player).progress_type = ( + LocationProgressType.EXCLUDED) + self.world.get_location("Sun temple, bulb in the hidden room of the right part", + self.player).progress_type = LocationProgressType.EXCLUDED + self.world.get_location("Arnassi ruins, Arnassi Armor", + self.player).progress_type = LocationProgressType.EXCLUDED def adjusting_rules(self, options: AquariaOptions) -> None: """ @@ -1166,6 +1226,8 @@ def adjusting_rules(self, options: AquariaOptions) -> None: if options.early_energy_form: add_rule(self.world.get_entrance("Home Water to Home water transturtle room", self.player), lambda state: _has_energy_form(state, self.player)) + if options.exclude_hard_or_hidden_locations: + self.__excluded_hard_or_hidden_location() def __add_home_water_regions_to_world(self) -> None: """ diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 94636963bab..14cc1bb78db 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -176,69 +176,12 @@ def create_items(self) -> None: item = self.create_item(name) self.multiworld.itempool.append(item) - - def __excluded_hard_or_hidden_location(self) -> None: - self.multiworld.get_location("Energy temple boss area, Fallen god tooth", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Cathedral boss area, beating Mithalan God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Kelp forest boss area, beating Drunian God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Sun temple boss area, beating Sun God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Sunken city, bulb on the top of the boss area (boiler room)", - self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Home water, Nautilus Egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Energy temple blaster room, Blaster egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Mithalas castle, beating the priests", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Mermog cave, Piranha Egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Octopus cave, Dumbo Egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("King Jellyfish cave, bulb in the right path from King Jelly", - self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("King Jellyfish cave, Jellyfish Costume", - self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Final boss area, bulb in the boss third form room", - self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Sun Worm path, first cliff bulb", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Sun Worm path, second cliff bulb", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("The veil top right area, bulb in the top of the water fall", - self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Bubble cave, bulb in the left cave wall", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", - self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Bubble cave, Verse egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", - self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Kelp forest bottom left area, Walker baby", - self.player).progress_type = LocationProgressType.EXCLUDED - self.multiworld.get_location("Sun temple, Sun key", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("The body bottom area, Mutant Costume", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.multiworld.get_location("Sun temple, bulb in the hidden room of the right part", - self.player).progress_type = LocationProgressType.EXCLUDED - def set_rules(self) -> None: """ Launched when the Multiworld generator is ready to generate rules """ self.regions.adjusting_rules(self.options) - if self.options.exclude_hard_or_hidden_locations: - self.__excluded_hard_or_hidden_location() - self.multiworld.completion_condition[self.player] = lambda \ state: state.has("Victory", self.player) diff --git a/worlds/aquaria/test/__init__.py b/worlds/aquaria/test/__init__.py index 3cce8a14fb8..132d0ad4376 100644 --- a/worlds/aquaria/test/__init__.py +++ b/worlds/aquaria/test/__init__.py @@ -1,208 +1,219 @@ +""" +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 = [ - "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 cristals", - "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", + + "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 cristals", + "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" diff --git a/worlds/aquaria/test/test_beast_form_access.py b/worlds/aquaria/test/test_beast_form_access.py index 35c34fdf2ea..a8d5551586a 100644 --- a/worlds/aquaria/test/test_beast_form_access.py +++ b/worlds/aquaria/test/test_beast_form_access.py @@ -1,7 +1,14 @@ +""" +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""" diff --git a/worlds/aquaria/test/test_bind_song_access.py b/worlds/aquaria/test/test_bind_song_access.py index da3cb8e3cdf..fbf5a2594f9 100644 --- a/worlds/aquaria/test/test_bind_song_access.py +++ b/worlds/aquaria/test/test_bind_song_access.py @@ -1,7 +1,15 @@ +""" +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, } diff --git a/worlds/aquaria/test/test_bind_song_option_access.py b/worlds/aquaria/test/test_bind_song_option_access.py index d7da7f08dc0..00f5a80e4c6 100644 --- a/worlds/aquaria/test/test_bind_song_option_access.py +++ b/worlds/aquaria/test/test_bind_song_option_access.py @@ -1,8 +1,16 @@ +""" +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, } diff --git a/worlds/aquaria/test/test_dual_song_access.py b/worlds/aquaria/test/test_dual_song_access.py new file mode 100644 index 00000000000..14c921d7cfe --- /dev/null +++ b/worlds/aquaria/test/test_dual_song_access.py @@ -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) diff --git a/worlds/aquaria/test/test_energy_form_access.py b/worlds/aquaria/test/test_energy_form_access.py index 1e67cd5fb51..17fb8d3b454 100644 --- a/worlds/aquaria/test/test_energy_form_access.py +++ b/worlds/aquaria/test/test_energy_form_access.py @@ -1,6 +1,15 @@ +""" +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, } diff --git a/worlds/aquaria/test/test_energy_form_access_option.py b/worlds/aquaria/test/test_energy_form_access_option.py index 078ed27d44c..4dcbce67701 100644 --- a/worlds/aquaria/test/test_energy_form_access_option.py +++ b/worlds/aquaria/test/test_energy_form_access_option.py @@ -1,6 +1,15 @@ +""" +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, } diff --git a/worlds/aquaria/test/test_fish_form_access.py b/worlds/aquaria/test/test_fish_form_access.py index 2818c6f9c2c..e6c24cf03fd 100644 --- a/worlds/aquaria/test/test_fish_form_access.py +++ b/worlds/aquaria/test/test_fish_form_access.py @@ -1,7 +1,14 @@ +""" +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, } @@ -24,6 +31,7 @@ def test_fish_form_location(self) -> None: "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) diff --git a/worlds/aquaria/test/test_li_song_access.py b/worlds/aquaria/test/test_li_song_access.py index 7d797ffc6a7..74f385ab788 100644 --- a/worlds/aquaria/test/test_li_song_access.py +++ b/worlds/aquaria/test/test_li_song_access.py @@ -1,7 +1,14 @@ +""" +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, } diff --git a/worlds/aquaria/test/test_light_access.py b/worlds/aquaria/test/test_light_access.py index 55c433bd9b6..49414e5ace9 100644 --- a/worlds/aquaria/test/test_light_access.py +++ b/worlds/aquaria/test/test_light_access.py @@ -1,7 +1,14 @@ +""" +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, diff --git a/worlds/aquaria/test/test_nature_form_access.py b/worlds/aquaria/test/test_nature_form_access.py index ebf0c90e54a..8ee94f01c51 100644 --- a/worlds/aquaria/test/test_nature_form_access.py +++ b/worlds/aquaria/test/test_nature_form_access.py @@ -1,7 +1,14 @@ +""" +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, } diff --git a/worlds/aquaria/test/test_spirit_form_access.py b/worlds/aquaria/test/test_spirit_form_access.py index e9016e16667..4d59d90a401 100644 --- a/worlds/aquaria/test/test_spirit_form_access.py +++ b/worlds/aquaria/test/test_spirit_form_access.py @@ -1,7 +1,14 @@ +""" +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""" @@ -23,6 +30,7 @@ def test_spirit_form_location(self) -> None: "Sunken city left area, Girl Costume", "Beating Mantis Shrimp Prime", "First secret", + "Arnassi ruins, Arnassi Armor", ] items = [["Spirit form"]] self.assertAccessDependency(locations, items) diff --git a/worlds/aquaria/test/test_sun_form_access.py b/worlds/aquaria/test/test_sun_form_access.py index 48dffbc5f4b..159ab717c2a 100644 --- a/worlds/aquaria/test/test_sun_form_access.py +++ b/worlds/aquaria/test/test_sun_form_access.py @@ -1,7 +1,14 @@ +""" +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""" From 8c1160887e092f0bfe2dc31b40a5e990ddec7dec Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 19 Apr 2024 11:30:54 -0400 Subject: [PATCH 34/56] Typo in a transturtle item --- worlds/aquaria/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 14cc1bb78db..c919348653f 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -156,7 +156,7 @@ def create_items(self) -> None: 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 left", "Open water top right area, Transturtle", + 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) From ed173e419e2002a36153f1e4eb050c2e3994b03a Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 22 Apr 2024 09:36:12 -0400 Subject: [PATCH 35/56] Forgot to rename a location. --- worlds/aquaria/Locations.py | 2 +- worlds/aquaria/Regions.py | 2 +- worlds/aquaria/test/test_bind_song_access.py | 2 +- worlds/aquaria/test/test_bind_song_option_access.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 8f48dd59e8e..1570d2c0296 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -72,7 +72,7 @@ class AquariaLocations: "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, - "Verse egg in the Song cave": 698160, + "Song cave, Verse egg": 698160, "Song cave, Jelly beacon": 698178, "Song cave, Anemone seed": 698162, } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index f86a7226a62..89de8b03bb8 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -1122,7 +1122,7 @@ def __adjusting_manual_rules(self) -> None: lambda state: _has_fish_form(state, self.player)) add_rule(self.world.get_location("Song cave, Anemone seed", self.player), lambda state: _has_nature_form(state, self.player)) - add_rule(self.world.get_location("Verse egg in the Song cave", self.player), + add_rule(self.world.get_location("Song cave, Verse egg", self.player), lambda state: _has_bind_song(state, self.player)) add_rule(self.world.get_location("Verse cave right area, Big Seed", self.player), lambda state: _has_bind_song(state, self.player)) diff --git a/worlds/aquaria/test/test_bind_song_access.py b/worlds/aquaria/test/test_bind_song_access.py index fbf5a2594f9..b3a5c95c4d2 100644 --- a/worlds/aquaria/test/test_bind_song_access.py +++ b/worlds/aquaria/test/test_bind_song_access.py @@ -21,7 +21,7 @@ def test_bind_song_location(self) -> None: "Home water, bulb in the path bellow Nautilus Prime", "Home water, bulb in the bottom left room", "Home water, Nautilus Egg", - "Verse egg in the Song cave", + "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", diff --git a/worlds/aquaria/test/test_bind_song_option_access.py b/worlds/aquaria/test/test_bind_song_option_access.py index 00f5a80e4c6..9405b83e8e1 100644 --- a/worlds/aquaria/test/test_bind_song_option_access.py +++ b/worlds/aquaria/test/test_bind_song_option_access.py @@ -27,7 +27,7 @@ def test_bind_song_location(self) -> None: "Home water, bulb in the path bellow Nautilus Prime", "Home water, bulb in the bottom left room", "Home water, Nautilus Egg", - "Verse egg in the Song cave", + "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", From cac2e5eaad6775f98fed56569517b8d55de78a36 Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 22 Apr 2024 15:41:00 -0400 Subject: [PATCH 36/56] Various modifications from peer review --- worlds/aquaria/Regions.py | 436 +++++++++++++++--------------- worlds/aquaria/__init__.py | 16 +- worlds/aquaria/docs/en_Aquaria.md | 6 +- worlds/aquaria/docs/fr_Aquaria.md | 8 +- 4 files changed, 223 insertions(+), 243 deletions(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 89de8b03bb8..018e8f91c42 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -97,30 +97,19 @@ def _has_spirit_form(state, player: int) -> bool: def _has_big_bosses(state, player: int) -> bool: """`player` in `state` has beated every big bosses""" - return (state.has("Fallen God beated", player) and - state.has("Mithalan God beated", player) and - state.has("Drunian God beated", player) and - state.has("Sun God beated", player) and - state.has("The Golem beated", player) - ) + return state.has_all("Fallen God beated", "Mithalan God beated", "Drunian God beated", + "Sun God beated", "The Golem beated", player) def _has_mini_bosses(state, player: int) -> bool: """`player` in `state` has beated every big bosses""" - return (state.has("Nautilus Prime beated", player) and - state.has("Blaster Peg Prime beated", player) and - state.has("Mergog beated", player) and - state.has("Mithalan priests beated", player) and - state.has("Octopus Prime beated", player) and - state.has("Crabbius Maximus beated", player) and - state.has("Mantis Shrimp Prime beated", player) and - state.has("King Jellyfish God Prime beated", player) - ) + return state.has_all("Nautilus Prime beated", "Blaster Peg Prime beated", "Mergog beated", + "Mithalan priests beated", "Octopus Prime beated", "Crabbius Maximus beated", + "Mantis Shrimp Prime beated", "King Jellyfish God Prime beated", player) + def _has_secrets(state, player: int) -> bool: - return (state.has("First secret obtained",player) and - state.has("Second secret obtained",player) and - state.has("Third secret obtained",player)) + return state.has_all("First secret obtained", "Second secret obtained", "Third secret obtained",player) class AquariaRegions: @@ -217,7 +206,7 @@ class AquariaRegions: Every Region of the game """ - world: MultiWorld + multiworld: MultiWorld """ The Current Multiworld game. """ @@ -233,7 +222,7 @@ def __add_region(self, hint: str, Create a new Region, add it to the `world` regions and return it. Be aware that this function have a side effect on ``world`.`regions` """ - region: Region = Region(hint, self.player, self.world, hint) + region: Region = Region(hint, self.player, self.multiworld, hint) if locations is not None: region.add_locations(locations, AquariaLocation) return region @@ -981,165 +970,165 @@ def add_event_locations(self) -> None: def __adjusting_urns_rules(self) -> None: """Since Urns need to be broken, add a damaging item to rules""" - add_rule(self.world.get_location("Open water top right area, first urn in the Mithalas exit", self.player), + add_rule(self.multiworld.get_location("Open water top right area, first urn in the Mithalas exit", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Open water top right area, second urn in the Mithalas exit", self.player), + add_rule(self.multiworld.get_location("Open water top right area, second urn in the Mithalas exit", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Open water top right area, third urn in the Mithalas exit", self.player), + add_rule(self.multiworld.get_location("Open water top right area, third urn in the Mithalas exit", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city, first urn in one of the homes", self.player), + add_rule(self.multiworld.get_location("Mithalas city, first urn in one of the homes", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city, second urn in one of the homes", self.player), + add_rule(self.multiworld.get_location("Mithalas city, second urn in one of the homes", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city, first urn in the city reserve", self.player), + add_rule(self.multiworld.get_location("Mithalas city, first urn in the city reserve", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city, second urn in the city reserve", self.player), + add_rule(self.multiworld.get_location("Mithalas city, second urn in the city reserve", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city, third urn in the city reserve", self.player), + add_rule(self.multiworld.get_location("Mithalas city, third urn in the city reserve", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city, urn in the cathedral flower tube entrance", self.player), + add_rule(self.multiworld.get_location("Mithalas city, urn in the cathedral flower tube entrance", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city castle, urn in the bedroom", self.player), + add_rule(self.multiworld.get_location("Mithalas city castle, urn in the bedroom", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city castle, first urn of the single lamp path", self.player), + add_rule(self.multiworld.get_location("Mithalas city castle, first urn of the single lamp path", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city castle, second urn of the single lamp path", self.player), + add_rule(self.multiworld.get_location("Mithalas city castle, second urn of the single lamp path", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city castle, urn in the bottom room", self.player), + add_rule(self.multiworld.get_location("Mithalas city castle, urn in the bottom room", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city castle, first urn on the entrance path", self.player), + add_rule(self.multiworld.get_location("Mithalas city castle, first urn on the entrance path", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Mithalas city castle, second urn on the entrance path", self.player), + add_rule(self.multiworld.get_location("Mithalas city castle, second urn on the entrance path", self.player), lambda state: _has_damaging_item(state, self.player)) def __adjusting_crates_rules(self) -> None: """Since Crate need to be broken, add a damaging item to rules""" - add_rule(self.world.get_location("Sunken city right area, crate close to the save cristal", self.player), + add_rule(self.multiworld.get_location("Sunken city right area, crate close to the save cristal", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Sunken city right area, crate in the left bottom room", self.player), + add_rule(self.multiworld.get_location("Sunken city right area, crate in the left bottom room", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Sunken city left area, crate in the little pipe room", self.player), + add_rule(self.multiworld.get_location("Sunken city left area, crate in the little pipe room", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Sunken city left area, crate close to the save cristal", self.player), + add_rule(self.multiworld.get_location("Sunken city left area, crate close to the save cristal", self.player), lambda state: _has_damaging_item(state, self.player)) - add_rule(self.world.get_location("Sunken city left area, crate before the bedroom", self.player), + add_rule(self.multiworld.get_location("Sunken city left area, crate before the bedroom", self.player), lambda state: _has_damaging_item(state, self.player)) def __adjusting_soup_rules(self) -> None: """ Modify rules for location that need soup """ - add_rule(self.world.get_location("Turtle cave, Urchin costume", self.player), + add_rule(self.multiworld.get_location("Turtle cave, Urchin costume", self.player), lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) - add_rule(self.world.get_location("Sun Worm path, first cliff bulb", self.player), + add_rule(self.multiworld.get_location("Sun Worm path, first cliff bulb", self.player), lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) - add_rule(self.world.get_location("Sun Worm path, second cliff bulb", self.player), + add_rule(self.multiworld.get_location("Sun Worm path, second cliff bulb", self.player), lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) - add_rule(self.world.get_location("The veil top right area, bulb in the top of the water fall", self.player), + add_rule(self.multiworld.get_location("The veil top right area, bulb in the top of the water fall", self.player), lambda state: _has_hot_soup(state, self.player) and _has_beast_form(state, self.player)) def __adjusting_under_rock_location(self) -> None: """ Modify rules implying bind song needed for bulb under rocks """ - add_rule(self.world.get_location("Home water, bulb under the rock in the left path from the verse cave", + add_rule(self.multiworld.get_location("Home water, bulb under the rock in the left path from the verse cave", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Verse cave left area, bulb under the rock at the end of the path", + add_rule(self.multiworld.get_location("Verse cave left area, bulb under the rock at the end of the path", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Naija's home, bulb under the rock at the right of the main path", + add_rule(self.multiworld.get_location("Naija's home, bulb under the rock at the right of the main path", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Song cave, bulb under the rock in the path to the singing statues", + add_rule(self.multiworld.get_location("Song cave, bulb under the rock in the path to the singing statues", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Song cave, bulb under the rock close to the song door", + add_rule(self.multiworld.get_location("Song cave, bulb under the rock close to the song door", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Energy temple second area, bulb under the rock", + add_rule(self.multiworld.get_location("Energy temple second area, bulb under the rock", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Open water top left area, bulb under the rock in the right path", + add_rule(self.multiworld.get_location("Open water top left area, bulb under the rock in the right path", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Open water top left area, bulb under the rock in the left path", + add_rule(self.multiworld.get_location("Open water top left area, bulb under the rock in the left path", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Kelp Forest top right area, bulb under the rock in the right path", + add_rule(self.multiworld.get_location("Kelp Forest top right area, bulb under the rock in the right path", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("The veil top left area, bulb under the rock in the top right path", + add_rule(self.multiworld.get_location("The veil top left area, bulb under the rock in the top right path", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Abyss right area, bulb behind the rock in the whale room", + add_rule(self.multiworld.get_location("Abyss right area, bulb behind the rock in the whale room", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Abyss right area, bulb in the middle path", + add_rule(self.multiworld.get_location("Abyss right area, bulb in the middle path", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("The veil top left area, bulb under the rock in the top right path", + add_rule(self.multiworld.get_location("The veil top left area, bulb under the rock in the top right path", self.player), lambda state: _has_bind_song(state, self.player)) def __adjusting_light_in_dark_place_rules(self) -> None: - add_rule(self.world.get_location("Kelp forest top right area, Black pearl", self.player), + add_rule(self.multiworld.get_location("Kelp forest top right area, Black pearl", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_location("Kelp forest bottom right area, Odd Container", self.player), + add_rule(self.multiworld.get_location("Kelp forest bottom right area, Odd Container", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Transturtle Veil top left to Transturtle Abyss right", self.player), + add_rule(self.multiworld.get_entrance("Transturtle Veil top left to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Transturtle Open Water top right to Transturtle Abyss right", self.player), + add_rule(self.multiworld.get_entrance("Transturtle Open Water top right to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Transturtle Veil top right to Transturtle Abyss right", self.player), + add_rule(self.multiworld.get_entrance("Transturtle Veil top right to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Transturtle Forest bottom left to Transturtle Abyss right", self.player), + add_rule(self.multiworld.get_entrance("Transturtle Forest bottom left to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Transturtle Home water to Transturtle Abyss right", self.player), + add_rule(self.multiworld.get_entrance("Transturtle Home water to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Transturtle Final Boss to Transturtle Abyss right", self.player), + add_rule(self.multiworld.get_entrance("Transturtle Final Boss to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Transturtle Simon says to Transturtle Abyss right", self.player), + add_rule(self.multiworld.get_entrance("Transturtle Simon says to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Transturtle Arnassi ruins to Transturtle Abyss right", self.player), + add_rule(self.multiworld.get_entrance("Transturtle Arnassi ruins to Transturtle Abyss right", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Body center area to Abyss left bottom area", self.player), + add_rule(self.multiworld.get_entrance("Body center area to Abyss left bottom area", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Veil left of sun temple to Octo cave top path", self.player), + add_rule(self.multiworld.get_entrance("Veil left of sun temple to Octo cave top path", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Open water bottom right area to Abyss right area", self.player), + add_rule(self.multiworld.get_entrance("Open water bottom right area to Abyss right area", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Open water bottom left area to Abyss left area", self.player), + add_rule(self.multiworld.get_entrance("Open water bottom left area to Abyss left area", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.world.get_entrance("Sun temple left area to Sun temple right area", self.player), + add_rule(self.multiworld.get_entrance("Sun temple left area to Sun temple right area", self.player), lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) - add_rule(self.world.get_entrance("Sun temple right area to Sun temple left area", self.player), + add_rule(self.multiworld.get_entrance("Sun temple right area to Sun temple left area", self.player), lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) - add_rule(self.world.get_entrance("Veil left of sun temple to Sun temple left area", self.player), + add_rule(self.multiworld.get_entrance("Veil left of sun temple to Sun temple left area", self.player), lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) def __adjusting_manual_rules(self) -> None: - add_rule(self.world.get_location("Mithalas cathedral, Mithalan Dress", self.player), + add_rule(self.multiworld.get_location("Mithalas cathedral, Mithalan Dress", self.player), lambda state: _has_beast_form(state, self.player)) - add_rule(self.world.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), + add_rule(self.multiworld.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), lambda state: _has_fish_form(state, self.player)) - add_rule(self.world.get_location("Kelp forest bottom left area, Walker baby", self.player), + add_rule(self.multiworld.get_location("Kelp forest bottom left area, Walker baby", self.player), lambda state: _has_spirit_form(state, self.player)) - add_rule(self.world.get_location("The veil top left area, bulb hidden behind the blocking rock", self.player), + add_rule(self.multiworld.get_location("The veil top left area, bulb hidden behind the blocking rock", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Turtle cave, Turtle Egg", self.player), + add_rule(self.multiworld.get_location("Turtle cave, Turtle Egg", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Abyss left area, bulb in the bottom fish pass", self.player), + add_rule(self.multiworld.get_location("Abyss left area, bulb in the bottom fish pass", self.player), lambda state: _has_fish_form(state, self.player)) - add_rule(self.world.get_location("Song cave, Anemone seed", self.player), + add_rule(self.multiworld.get_location("Song cave, Anemone seed", self.player), lambda state: _has_nature_form(state, self.player)) - add_rule(self.world.get_location("Song cave, Verse egg", self.player), + add_rule(self.multiworld.get_location("Song cave, Verse egg", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Verse cave right area, Big Seed", self.player), + add_rule(self.multiworld.get_location("Verse cave right area, Big Seed", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Arnassi ruins, Song plant spore on the top of the ruins", self.player), + add_rule(self.multiworld.get_location("Arnassi ruins, Song plant spore on the top of the ruins", self.player), lambda state: _has_beast_form(state, self.player)) - add_rule(self.world.get_location("Energy temple first area, bulb in the bottom room blocked by a rock", + add_rule(self.multiworld.get_location("Energy temple first area, bulb in the bottom room blocked by a rock", self.player), lambda state: _has_energy_form(state, self.player)) - add_rule(self.world.get_location("Home water, bulb in the bottom left room", self.player), + add_rule(self.multiworld.get_location("Home water, bulb in the bottom left room", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Home water, bulb in the path bellow Nautilus Prime", self.player), + add_rule(self.multiworld.get_location("Home water, bulb in the path bellow Nautilus Prime", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.world.get_location("Naija's home, bulb after the energy door", self.player), + add_rule(self.multiworld.get_location("Naija's home, bulb after the energy door", self.player), lambda state: _has_energy_form(state, self.player)) - add_rule(self.world.get_location("Abyss right area, bulb behind the rock in the whale room", self.player), + add_rule(self.multiworld.get_location("Abyss right area, bulb behind the rock in the whale room", self.player), lambda state: _has_spirit_form(state, self.player) and _has_sun_form(state, self.player)) - add_rule(self.world.get_location("Arnassi ruins, Arnassi Armor", self.player), + add_rule(self.multiworld.get_location("Arnassi ruins, Arnassi Armor", self.player), lambda state: _has_fish_form(state, self.player) and _has_spirit_form(state, self.player)) @@ -1147,58 +1136,55 @@ def __adjusting_manual_rules(self) -> None: def __excluded_hard_or_hidden_location(self) -> None: - self.world.get_location("Energy temple boss area, Fallen god tooth", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Cathedral boss area, beating Mithalan God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Kelp forest boss area, beating Drunian God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Sun temple boss area, beating Sun God", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Sunken city, bulb on the top of the boss area (boiler room)", + self.multiworld.get_location("Energy temple boss area, Fallen god tooth", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Cathedral boss area, beating Mithalan God", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Kelp forest boss area, beating Drunian God", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Sun temple boss area, beating Sun God", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Sunken city, bulb on the top of the boss area (boiler room)", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Home water, Nautilus Egg", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Energy temple blaster room, Blaster egg", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Mithalas castle, beating the priests", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Mermog cave, Piranha Egg", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Octopus cave, Dumbo Egg", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("King Jellyfish cave, bulb in the right path from King Jelly", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("King Jellyfish cave, Jellyfish Costume", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Final boss area, bulb in the boss third form room", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Sun Worm path, first cliff bulb", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Sun Worm path, second cliff bulb", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("The veil top right area, bulb in the top of the water fall", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Bubble cave, bulb in the left cave wall", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", + self.player).progress_type = LocationProgressType.EXCLUDED + self.multiworld.get_location("Bubble cave, Verse egg", self.player).progress_type = LocationProgressType.EXCLUDED - self.world.get_location("Home water, Nautilus Egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Energy temple blaster room, Blaster egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Mithalas castle, beating the priests", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Mermog cave, Piranha Egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Octopus cave, Dumbo Egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("King Jellyfish cave, bulb in the right path from King Jelly", + self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", self.player).progress_type = LocationProgressType.EXCLUDED - self.world.get_location("King Jellyfish cave, Jellyfish Costume", + self.multiworld.get_location("Kelp forest bottom left area, Walker baby", self.player).progress_type = LocationProgressType.EXCLUDED - self.world.get_location("Final boss area, bulb in the boss third form room", + self.multiworld.get_location("Sun temple, Sun key", self.player).progress_type = LocationProgressType.EXCLUDED - self.world.get_location("Sun Worm path, first cliff bulb", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Sun Worm path, second cliff bulb", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("The veil top right area, bulb in the top of the water fall", - self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Bubble cave, bulb in the left cave wall", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", - self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Bubble cave, Verse egg", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", - self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Kelp forest bottom left area, Walker baby", + self.multiworld.get_location("The body bottom area, Mutant Costume", self.player).progress_type = LocationProgressType.EXCLUDED - self.world.get_location("Sun temple, Sun key", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("The body bottom area, Mutant Costume", self.player).progress_type = ( - LocationProgressType.EXCLUDED) - self.world.get_location("Sun temple, bulb in the hidden room of the right part", + self.multiworld.get_location("Sun temple, bulb in the hidden room of the right part", self.player).progress_type = LocationProgressType.EXCLUDED - self.world.get_location("Arnassi ruins, Arnassi Armor", + self.multiworld.get_location("Arnassi ruins, Arnassi Armor", self.player).progress_type = LocationProgressType.EXCLUDED def adjusting_rules(self, options: AquariaOptions) -> None: @@ -1215,16 +1201,16 @@ def adjusting_rules(self, options: AquariaOptions) -> None: self.__adjusting_under_rock_location() if options.mini_bosses_to_beat.value > 0: - add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), + add_rule(self.multiworld.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_mini_bosses(state, self.player)) if options.big_bosses_to_beat.value > 0: - add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), + add_rule(self.multiworld.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_big_bosses(state, self.player)) if options.objective.value == 1: - add_rule(self.world.get_entrance("Before Final boss to Final boss", self.player), + add_rule(self.multiworld.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_secrets(state, self.player)) if options.early_energy_form: - add_rule(self.world.get_entrance("Home Water to Home water transturtle room", self.player), + add_rule(self.multiworld.get_entrance("Home Water to Home water transturtle room", self.player), lambda state: _has_energy_form(state, self.player)) if options.exclude_hard_or_hidden_locations: self.__excluded_hard_or_hidden_location() @@ -1233,119 +1219,119 @@ def __add_home_water_regions_to_world(self) -> None: """ Add every region around home water to the `world` """ - self.world.regions.append(self.menu) - self.world.regions.append(self.verse_cave_r) - self.world.regions.append(self.verse_cave_l) - self.world.regions.append(self.home_water) - self.world.regions.append(self.home_water_nautilus) - self.world.regions.append(self.naija_home) - self.world.regions.append(self.song_cave) - self.world.regions.append(self.energy_temple_1) - self.world.regions.append(self.energy_temple_2) - self.world.regions.append(self.energy_temple_3) - self.world.regions.append(self.energy_temple_boss) - self.world.regions.append(self.energy_temple_blaster_room) - self.world.regions.append(self.energy_temple_altar) + self.multiworld.regions.append(self.menu) + self.multiworld.regions.append(self.verse_cave_r) + self.multiworld.regions.append(self.verse_cave_l) + self.multiworld.regions.append(self.home_water) + self.multiworld.regions.append(self.home_water_nautilus) + self.multiworld.regions.append(self.naija_home) + self.multiworld.regions.append(self.song_cave) + self.multiworld.regions.append(self.energy_temple_1) + self.multiworld.regions.append(self.energy_temple_2) + self.multiworld.regions.append(self.energy_temple_3) + self.multiworld.regions.append(self.energy_temple_boss) + self.multiworld.regions.append(self.energy_temple_blaster_room) + self.multiworld.regions.append(self.energy_temple_altar) def __add_open_water_regions_to_world(self) -> None: """ Add every region around open water to the `world` """ - self.world.regions.append(self.openwater_tl) - self.world.regions.append(self.openwater_tr) - self.world.regions.append(self.openwater_tr_turtle) - self.world.regions.append(self.openwater_bl) - self.world.regions.append(self.openwater_br) - self.world.regions.append(self.skeleton_path) - self.world.regions.append(self.skeleton_path_sc) - self.world.regions.append(self.arnassi) - self.world.regions.append(self.arnassi_path) - self.world.regions.append(self.arnassi_crab_boss) - self.world.regions.append(self.simon) + self.multiworld.regions.append(self.openwater_tl) + self.multiworld.regions.append(self.openwater_tr) + self.multiworld.regions.append(self.openwater_tr_turtle) + self.multiworld.regions.append(self.openwater_bl) + self.multiworld.regions.append(self.openwater_br) + self.multiworld.regions.append(self.skeleton_path) + self.multiworld.regions.append(self.skeleton_path_sc) + self.multiworld.regions.append(self.arnassi) + self.multiworld.regions.append(self.arnassi_path) + self.multiworld.regions.append(self.arnassi_crab_boss) + self.multiworld.regions.append(self.simon) def __add_mithalas_regions_to_world(self) -> None: """ Add every region around Mithalas to the `world` """ - self.world.regions.append(self.mithalas_city) - self.world.regions.append(self.mithalas_city_top_path) - self.world.regions.append(self.mithalas_city_fishpass) - self.world.regions.append(self.cathedral_l) - self.world.regions.append(self.cathedral_l_tube) - self.world.regions.append(self.cathedral_l_sc) - self.world.regions.append(self.cathedral_r) - self.world.regions.append(self.cathedral_underground) - self.world.regions.append(self.cathedral_boss_l) - self.world.regions.append(self.cathedral_boss_r) + self.multiworld.regions.append(self.mithalas_city) + self.multiworld.regions.append(self.mithalas_city_top_path) + self.multiworld.regions.append(self.mithalas_city_fishpass) + self.multiworld.regions.append(self.cathedral_l) + self.multiworld.regions.append(self.cathedral_l_tube) + self.multiworld.regions.append(self.cathedral_l_sc) + self.multiworld.regions.append(self.cathedral_r) + self.multiworld.regions.append(self.cathedral_underground) + self.multiworld.regions.append(self.cathedral_boss_l) + self.multiworld.regions.append(self.cathedral_boss_r) def __add_forest_regions_to_world(self) -> None: """ Add every region around the kelp forest to the `world` """ - self.world.regions.append(self.forest_tl) - self.world.regions.append(self.forest_tl_fp) - self.world.regions.append(self.forest_tr) - self.world.regions.append(self.forest_tr_fp) - self.world.regions.append(self.forest_bl) - self.world.regions.append(self.forest_br) - self.world.regions.append(self.forest_boss) - self.world.regions.append(self.forest_boss_entrance) - self.world.regions.append(self.forest_sprite_cave) - self.world.regions.append(self.forest_sprite_cave_tube) - self.world.regions.append(self.mermog_cave) - self.world.regions.append(self.mermog_boss) - self.world.regions.append(self.forest_fish_cave) + self.multiworld.regions.append(self.forest_tl) + self.multiworld.regions.append(self.forest_tl_fp) + self.multiworld.regions.append(self.forest_tr) + self.multiworld.regions.append(self.forest_tr_fp) + self.multiworld.regions.append(self.forest_bl) + self.multiworld.regions.append(self.forest_br) + self.multiworld.regions.append(self.forest_boss) + self.multiworld.regions.append(self.forest_boss_entrance) + self.multiworld.regions.append(self.forest_sprite_cave) + self.multiworld.regions.append(self.forest_sprite_cave_tube) + self.multiworld.regions.append(self.mermog_cave) + self.multiworld.regions.append(self.mermog_boss) + self.multiworld.regions.append(self.forest_fish_cave) def __add_veil_regions_to_world(self) -> None: """ Add every region around the Veil to the `world` """ - self.world.regions.append(self.veil_tl) - self.world.regions.append(self.veil_tl_fp) - self.world.regions.append(self.veil_tr_l) - self.world.regions.append(self.veil_tr_r) - self.world.regions.append(self.veil_bl) - self.world.regions.append(self.veil_b_sc) - self.world.regions.append(self.veil_bl_fp) - self.world.regions.append(self.veil_br) - self.world.regions.append(self.octo_cave_t) - self.world.regions.append(self.octo_cave_b) - self.world.regions.append(self.turtle_cave) - self.world.regions.append(self.turtle_cave_bubble) - self.world.regions.append(self.sun_temple_l) - self.world.regions.append(self.sun_temple_r) - self.world.regions.append(self.sun_temple_boss_path) - self.world.regions.append(self.sun_temple_boss) + self.multiworld.regions.append(self.veil_tl) + self.multiworld.regions.append(self.veil_tl_fp) + self.multiworld.regions.append(self.veil_tr_l) + self.multiworld.regions.append(self.veil_tr_r) + self.multiworld.regions.append(self.veil_bl) + self.multiworld.regions.append(self.veil_b_sc) + self.multiworld.regions.append(self.veil_bl_fp) + self.multiworld.regions.append(self.veil_br) + self.multiworld.regions.append(self.octo_cave_t) + self.multiworld.regions.append(self.octo_cave_b) + self.multiworld.regions.append(self.turtle_cave) + self.multiworld.regions.append(self.turtle_cave_bubble) + self.multiworld.regions.append(self.sun_temple_l) + self.multiworld.regions.append(self.sun_temple_r) + self.multiworld.regions.append(self.sun_temple_boss_path) + self.multiworld.regions.append(self.sun_temple_boss) def __add_abyss_regions_to_world(self) -> None: """ Add every region around the Abyss to the `world` """ - self.world.regions.append(self.abyss_l) - self.world.regions.append(self.abyss_lb) - self.world.regions.append(self.abyss_r) - self.world.regions.append(self.ice_cave) - self.world.regions.append(self.bubble_cave) - self.world.regions.append(self.king_jellyfish_cave) - self.world.regions.append(self.whale) - self.world.regions.append(self.sunken_city_l) - self.world.regions.append(self.sunken_city_r) - self.world.regions.append(self.sunken_city_boss) - self.world.regions.append(self.sunken_city_l_bedroom) + self.multiworld.regions.append(self.abyss_l) + self.multiworld.regions.append(self.abyss_lb) + self.multiworld.regions.append(self.abyss_r) + self.multiworld.regions.append(self.ice_cave) + self.multiworld.regions.append(self.bubble_cave) + self.multiworld.regions.append(self.king_jellyfish_cave) + self.multiworld.regions.append(self.whale) + self.multiworld.regions.append(self.sunken_city_l) + self.multiworld.regions.append(self.sunken_city_r) + self.multiworld.regions.append(self.sunken_city_boss) + self.multiworld.regions.append(self.sunken_city_l_bedroom) def __add_body_regions_to_world(self) -> None: """ Add every region around the Body to the `world` """ - self.world.regions.append(self.body_c) - self.world.regions.append(self.body_l) - self.world.regions.append(self.body_rt) - self.world.regions.append(self.body_rb) - self.world.regions.append(self.body_b) - self.world.regions.append(self.final_boss_loby) - self.world.regions.append(self.final_boss_tube) - self.world.regions.append(self.final_boss) - self.world.regions.append(self.final_boss_end) + self.multiworld.regions.append(self.body_c) + self.multiworld.regions.append(self.body_l) + self.multiworld.regions.append(self.body_rt) + self.multiworld.regions.append(self.body_rb) + self.multiworld.regions.append(self.body_b) + self.multiworld.regions.append(self.final_boss_loby) + self.multiworld.regions.append(self.final_boss_tube) + self.multiworld.regions.append(self.final_boss) + self.multiworld.regions.append(self.final_boss_end) def add_regions_to_world(self) -> None: """ @@ -1359,11 +1345,11 @@ def add_regions_to_world(self) -> None: self.__add_abyss_regions_to_world() self.__add_body_regions_to_world() - def __init__(self, world: MultiWorld, player: int): + def __init__(self, multiworld: MultiWorld, player: int): """ Initialisation of the regions """ - self.world = world + self.multiworld = multiworld self.player = player self.__create_home_water_area() self.__create_energy_temple() diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index c919348653f..08b61f38bdb 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -97,10 +97,10 @@ class AquariaWorld(World): exclude: List[str] - def __init__(self, world: MultiWorld, player: int): + def __init__(self, multiworld: MultiWorld, player: int): """Initialisation of the Aquaria World""" - super(AquariaWorld, self).__init__(world, player) - self.regions = AquariaRegions(world, player) + super(AquariaWorld, self).__init__(multiworld, player) + self.regions = AquariaRegions(multiworld, player) self.ingredients_substitution = [] self.exclude = [] @@ -207,16 +207,10 @@ def generate_basic(self) -> None: self.ingredients_substitution.extend(dishes_substitution) def fill_slot_data(self) -> Dict[str, Any]: - aquarian_translation = False - if self.options.aquarian_translation: - aquarian_translation = True - skip_first_vision = False - if self.options.skip_first_vision: - skip_first_vision = True return {"ingredientReplacement": self.ingredients_substitution, - "aquarianTranslate": aquarian_translation, + "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": skip_first_vision, + "skip_first_vision": bool(self.options.skip_first_vision.value), } diff --git a/worlds/aquaria/docs/en_Aquaria.md b/worlds/aquaria/docs/en_Aquaria.md index 828b7c08459..7ae2ec6daac 100644 --- a/worlds/aquaria/docs/en_Aquaria.md +++ b/worlds/aquaria/docs/en_Aquaria.md @@ -1,9 +1,9 @@ # Aquaria -## Where is the settings page? +## Where is the options page? -The player settings page for this game contains all the options you need to configure and export a config file. Player -settings page link: [Aquaria Player Settings Page](../player-settings). +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: diff --git a/worlds/aquaria/docs/fr_Aquaria.md b/worlds/aquaria/docs/fr_Aquaria.md index a4dc12d03f3..670ecfd99da 100644 --- a/worlds/aquaria/docs/fr_Aquaria.md +++ b/worlds/aquaria/docs/fr_Aquaria.md @@ -1,9 +1,9 @@ # Aquaria -## Où se trouve la page des paramètres ? +## Où se trouve la page des options ? -La [page des paramètres du joueur pour ce jeu](../player-settings) contiens tous -les paramètres dont vous avez besoin pour configurer et exporter le fichier. +La [page des options du joueur pour ce jeu](../player-options) contiens tous +les options dont vous avez besoin pour configurer et exporter le fichier. ## Quel est l'effet de la randomisation sur ce jeu ? @@ -45,7 +45,7 @@ Il y a également l'option pour mélanger les ingrédients obtenus en éliminant 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 DLC Quest ? +## 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. From 953c6d6004bd8772bbcbb72494d878c04861ca84 Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 23 Apr 2024 10:35:27 -0400 Subject: [PATCH 37/56] Adding bracket to has_all methods --- worlds/aquaria/Regions.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 018e8f91c42..856ff43e5de 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -23,6 +23,7 @@ def _has_tongue_cleared(state, player: int) -> bool: """`player` in `state` has the Body tongue cleared item""" return state.has("Body tongue cleared", player) + def _has_sun_crystal(state, player: int) -> bool: """`player` in `state` has the Sun crystal item""" return state.has("Has sun crystal", player) @@ -97,19 +98,19 @@ def _has_spirit_form(state, player: int) -> bool: def _has_big_bosses(state, player: int) -> bool: """`player` in `state` has beated every big bosses""" - return state.has_all("Fallen God beated", "Mithalan God beated", "Drunian God beated", - "Sun God beated", "The Golem beated", player) + return state.has_all({"Fallen God beated", "Mithalan God beated", "Drunian God beated", + "Sun God beated", "The Golem beated"}, player) def _has_mini_bosses(state, player: int) -> bool: """`player` in `state` has beated every big bosses""" - return state.has_all("Nautilus Prime beated", "Blaster Peg Prime beated", "Mergog beated", + return state.has_all({"Nautilus Prime beated", "Blaster Peg Prime beated", "Mergog beated", "Mithalan priests beated", "Octopus Prime beated", "Crabbius Maximus beated", - "Mantis Shrimp Prime beated", "King Jellyfish God Prime beated", player) + "Mantis Shrimp Prime beated", "King Jellyfish God Prime beated"}, player) def _has_secrets(state, player: int) -> bool: - return state.has_all("First secret obtained", "Second secret obtained", "Third secret obtained",player) + return state.has_all({"First secret obtained", "Second secret obtained", "Third secret obtained"},player) class AquariaRegions: From ae7e2af50202884c1e894dccbc5d8f2354c5bed2 Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 23 Apr 2024 11:00:02 -0400 Subject: [PATCH 38/56] Changing Choice options by range options --- worlds/aquaria/Options.py | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index 6b14c3652ba..a007d33e598 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -5,7 +5,7 @@ """ from dataclasses import dataclass -from Options import Toggle, Choice, DeathLink, PerGameCommonOptions, DefaultOnToggle, StartInventoryPool +from Options import Toggle, Choice, Range, DeathLink, PerGameCommonOptions, DefaultOnToggle, StartInventoryPool class IngredientRandomizer(Choice): @@ -47,22 +47,18 @@ class AquarianTranslation(Toggle): display_name = "Translate Aquarian" -class BigBossesToBeat(Choice): +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" - option_none = 0 - option_1 = 1 - option_2 = 2 - option_3 = 3 - option_4 = 4 - option_5 = 5 + range_start = 0 + range_end = 5 default = 0 -class MiniBossesToBeat(Choice): +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", @@ -70,15 +66,8 @@ class MiniBossesToBeat(Choice): mini bosses. """ display_name = "Mini bosses to beat" - option_none = 0 - option_1 = 1 - option_2 = 2 - option_3 = 3 - option_4 = 4 - option_5 = 5 - option_6 = 6 - option_7 = 7 - option_8 = 8 + range_start = 0 + range_end = 8 default = 0 From 5ca85b1b538308c61114438b7c31ccaead30e306 Mon Sep 17 00:00:00 2001 From: Louis M Date: Tue, 23 Apr 2024 11:05:27 -0400 Subject: [PATCH 39/56] Replacing exclusive has by has_any --- worlds/aquaria/Regions.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 856ff43e5de..6f4872aa9d0 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -36,14 +36,8 @@ def _has_li(state, player: int) -> bool: def _has_damaging_item(state, player: int) -> bool: """`player` in `state` has the shield song item""" - return (state.has("Energy form", player) or - state.has("Nature form", player) or - state.has("Beast form", player) or - state.has("Li and Li song", player) or - state.has("Baby nautilus", player) or - state.has("Baby piranha", player) or - state.has("Baby blaster", player) - ) + return state.has_any({"Energy form", "Nature form", "Beast form", "Li and Li song", "Baby nautilus", + "Baby piranha", "Baby blaster"}, player) def _has_shield_song(state, player: int) -> bool: From aa7aef8479b488f40b37080b25cf36354c2f959f Mon Sep 17 00:00:00 2001 From: Louis M Date: Wed, 24 Apr 2024 12:12:14 -0400 Subject: [PATCH 40/56] Removing unused import. Co-authored-by: Scipio Wright --- worlds/aquaria/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 08b61f38bdb..ec997fa1883 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -6,7 +6,7 @@ from typing import List, Dict, ClassVar, Any from ..AutoWorld import World, WebWorld -from BaseClasses import Tutorial, MultiWorld, ItemClassification, LocationProgressType +from BaseClasses import Tutorial, MultiWorld, ItemClassification from .Items import item_table, AquariaItem, ItemType, ItemGroup from .Locations import location_table from .Options import AquariaOptions From 478681e1d860a5fed7d8a8a823ee2a0b9eed3b8d Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 29 Apr 2024 10:03:10 -0400 Subject: [PATCH 41/56] Adding state type and use class to contain data in the imte mlist --- worlds/aquaria/Items.py | 291 +++++++++++++++++--------------- worlds/aquaria/Regions.py | 40 ++--- worlds/aquaria/__init__.py | 14 +- worlds/aquaria/test/__init__.py | 1 - 4 files changed, 184 insertions(+), 162 deletions(-) diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index 3e275a6175e..72334846849 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -46,142 +46,165 @@ def __init__(self, name: str, classification: ItemClassification, """ 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": (698000, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_anemone - "Arnassi statue": (698001, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_arnassi_statue - "Big seed": (698002, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_big_seed - "Glowing seed": (698003, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_bio_seed - "Black pearl": (698004, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_blackpearl - "Baby blaster": (698005, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_blaster - "Crab armor": (698006, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_crab_costume - "Baby dumbo": (698007, 1, ItemType.PROGRESSION, ItemGroup.UTILITY), # collectible_dumbo - "Tooth": (698008, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_boss - "Energy statue": (698009, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_statue - "Krotite armor": (698010, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_energy_temple - "Golden starfish": (698011, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_gold_star - "Golden gear": (698012, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_golden_gear - "Jelly beacon": (698013, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_jelly_beacon - "Jelly costume": (698014, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_jelly_costume - "Jelly plant": (698015, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_jelly_plant - "Mithalas doll": (698016, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithala_doll - "Mithalan dress": (698017, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalan_costume - "Mithalas banner": (698018, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalas_banner - "Mithalas pot": (698019, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mithalas_pot - "Mutant costume": (698020, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_mutant_costume - "Baby nautilus": (698021, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_nautilus - "Baby piranha": (698022, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_piranha - "Arnassi Armor": (698023, 1, ItemType.NORMAL, ItemGroup.UTILITY), # collectible_seahorse_costume - "Seed bag": (698024, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_seed_bag - "King's Skull": (698025, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_skull - "Song plant spore": (698026, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_spore_seed - "Stone head": (698027, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_stone_head - "Sun key": (698028, 1, ItemType.NORMAL, ItemGroup.COLLECTIBLE), # collectible_sun_key - "Girl costume": (698029, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_teen_costume - "Odd container": (698030, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_treasure_chest - "Trident": (698031, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_trident_head - "Turtle egg": (698032, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_turtle_egg - "Jelly egg": (698033, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_upsidedown_seed - "Urchin costume": (698034, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_urchin_costume - "Baby walker": (698035, 1, ItemType.JUNK, ItemGroup.COLLECTIBLE), # collectible_walker - "Vedha's Cure-All-All": (698036, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_Vedha'sCure-All - "Zuuna's perogi": (698037, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_Zuuna'sperogi - "Arcane poultice": (698038, 7, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_arcanepoultice - "Berry ice cream": (698039, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_berryicecream - "Buttery sea loaf": (698040, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_butterysealoaf - "Cold borscht": (698041, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_coldborscht - "Cold soup": (698042, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_coldsoup - "Crab cake": (698043, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_crabcake - "Divine soup": (698044, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_divinesoup - "Dumbo ice cream": (698045, 3, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_dumboicecream - "Fish oil": (698046, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishoil - "Glowing egg": (698047, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_glowingegg - "Hand roll": (698048, 5, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_handroll - "Healing poultice": (698049, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_healingpoultice - "Hearty soup": (698050, 5, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_heartysoup - "Hot borscht": (698051, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_hotborscht - "Hot soup": (698052, 3, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_hotsoup - "Ice cream": (698053, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_icecream - "Leadership roll": (698054, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leadershiproll - "Leaf poultice": (698055, 5, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_leafpoultice - "Leeching poultice": (698056, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leechingpoultice - "Legendary cake": (698057, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_legendarycake - "Loaf of life": (698058, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_loafoflife - "Long life soup": (698059, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_longlifesoup - "Magic soup": (698060, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_magicsoup - "Mushroom x 2": (698061, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_mushroom - "Perogi": (698062, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_perogi - "Plant leaf": (698063, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf - "Plump perogi": (698064, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_plumpperogi - "Poison loaf": (698065, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_poisonloaf - "Poison soup": (698066, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_poisonsoup - "Rainbow mushroom": (698067, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_rainbowmushroom - "Rainbow soup": (698068, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_rainbowsoup - "Red berry": (698069, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_redberry - "Red bulb x 2": (698070, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_redbulb - "Rotten cake": (698071, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_rottencake - "Rotten loaf x 8": (698072, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_rottenloaf - "Rotten meat": (698073, 5, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat - "Royal soup": (698074, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_royalsoup - "Sea cake": (698075, 4, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_seacake - "Sea loaf": (698076, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_sealoaf - "Shark fin soup": (698077, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sharkfinsoup - "Sight poultice": (698078, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_sightpoultice - "Small bone x 2": (698079, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallbone - "Small egg": (698080, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallegg - "Small tentacle x 2": (698081, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smalltentacle - "Special bulb": (698082, 5, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_specialbulb - "Special cake": (698083, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_specialcake - "Spicy meat x 2": (698084, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_spicymeat - "Spicy roll": (698085, 11, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spicyroll - "Spicy soup": (698086, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spicysoup - "Spider roll": (698087, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_spiderroll - "Swamp cake": (698088, 3, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_swampcake - "Tasty cake": (698089, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_tastycake - "Tasty roll": (698090, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_tastyroll - "Tough cake": (698091, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_toughcake - "Turtle soup": (698092, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_turtlesoup - "Vedha sea crisp": (698093, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_vedhaseacrisp - "Veggie cake": (698094, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggiecake - "Veggie ice cream": (698095, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggieicecream - "Veggie soup": (698096, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_veggiesoup - "Volcano roll": (698097, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_volcanoroll - "Health upgrade": (698098, 5, ItemType.NORMAL, ItemGroup.HEALTH), # upgrade_health_1 .. upgrade_health_5 - "Wok": (698099, 1, ItemType.NORMAL, ItemGroup.UTILITY), # upgrade_wok - "Eel oil x 2": (698100, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_eeloil - "Fish meat x 2": (698101, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishmeat - "Fish oil x 3": (698102, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_fishoil - "Glowing egg x 2": (698103, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_glowingegg - "Healing poultice x 2": (698104, 2, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_healingpoultice - "Hot soup x 2": (698105, 1, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_hotsoup - "Leadership roll x 2": (698106, 1, ItemType.NORMAL, ItemGroup.RECIPE), # ingredient_leadershiproll - "Leaf poultice x 3": (698107, 2, ItemType.PROGRESSION, ItemGroup.RECIPE), # ingredient_leafpoultice - "Plant leaf x 2": (698108, 2, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf - "Plant leaf x 3": (698109, 4, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_plantleaf - "Rotten meat x 2": (698110, 1, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat - "Rotten meat x 8": (698111, 1, ItemType.JUNK, ItemGroup.INGREDIENT), # ingredient_rottenmeat - "Sea loaf x 2": (698112, 1, ItemType.JUNK, ItemGroup.RECIPE), # ingredient_sealoaf - "Small bone x 3": (698113, 3, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallbone - "Small egg x 2": (698114, 1, ItemType.NORMAL, ItemGroup.INGREDIENT), # ingredient_smallegg - "Li and Li song": (698115, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_li - "Shield song": (698116, 1, ItemType.NORMAL, ItemGroup.SONG), # song_shield - "Beast form": (698117, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_beast - "Sun form": (698118, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_sun - "Nature form": (698119, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_nature - "Energy form": (698120, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_energy - "Bind song": (698121, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_bind - "Fish form": (698122, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_fish - "Spirit form": (698123, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_spirit - "Dual form": (698124, 1, ItemType.PROGRESSION, ItemGroup.SONG), # song_dual - "Transturtle Veil top left": (698125, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_veil01 - "Transturtle Veil top right": (698126, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_veil02 - "Transturtle Open Water top right": (698127, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_openwater03 - "Transturtle Forest bottom left": (698128, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_forest04 - "Transturtle Home water": (698129, 1, ItemType.NORMAL, ItemGroup.TURTLE), # transport_mainarea - "Transturtle Abyss right": (698130, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_abyss03 - "Transturtle Final Boss": (698131, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_finalboss - "Transturtle Simon says": (698132, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_forest05 - "Transturtle Arnassi ruins": (698133, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_seahorse + "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 } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 6f4872aa9d0..2a0e9a44893 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -5,7 +5,7 @@ """ from typing import Dict, Optional -from BaseClasses import MultiWorld, Region, Entrance, ItemClassification, LocationProgressType +from BaseClasses import MultiWorld, Region, Entrance, ItemClassification, LocationProgressType, CollectionState from .Items import AquariaItem from .Locations import AquariaLocations, AquariaLocation from .Options import AquariaOptions @@ -14,96 +14,96 @@ # Every condition to connect regions -def _has_hot_soup(state, player: int) -> bool: +def _has_hot_soup(state:CollectionState, player: int) -> bool: """`player` in `state` has the hotsoup item""" return state.has("Hot soup", player) -def _has_tongue_cleared(state, player: int) -> bool: +def _has_tongue_cleared(state:CollectionState, player: int) -> bool: """`player` in `state` has the Body tongue cleared item""" return state.has("Body tongue cleared", player) -def _has_sun_crystal(state, player: int) -> bool: +def _has_sun_crystal(state:CollectionState, player: int) -> bool: """`player` in `state` has the Sun crystal item""" return state.has("Has sun crystal", player) -def _has_li(state, player: int) -> bool: +def _has_li(state:CollectionState, player: int) -> bool: """`player` in `state` has Li in it's team""" return state.has("Li and Li song", player) -def _has_damaging_item(state, player: int) -> bool: +def _has_damaging_item(state:CollectionState, player: int) -> bool: """`player` in `state` has the shield song item""" return state.has_any({"Energy form", "Nature form", "Beast form", "Li and Li song", "Baby nautilus", "Baby piranha", "Baby blaster"}, player) -def _has_shield_song(state, player: int) -> bool: +def _has_shield_song(state:CollectionState, player: int) -> bool: """`player` in `state` has the shield song item""" return state.has("Shield song", player) -def _has_bind_song(state, player: int) -> bool: +def _has_bind_song(state:CollectionState, player: int) -> bool: """`player` in `state` has the bind song item""" return state.has("Bind song", player) -def _has_energy_form(state, player: int) -> bool: +def _has_energy_form(state:CollectionState, player: int) -> bool: """`player` in `state` has the energy form item""" return state.has("Energy form", player) -def _has_beast_form(state, player: int) -> bool: +def _has_beast_form(state:CollectionState, player: int) -> bool: """`player` in `state` has the beast form item""" return state.has("Beast form", player) -def _has_nature_form(state, player: int) -> bool: +def _has_nature_form(state:CollectionState, player: int) -> bool: """`player` in `state` has the nature form item""" return state.has("Nature form", player) -def _has_sun_form(state, player: int) -> bool: +def _has_sun_form(state:CollectionState, player: int) -> bool: """`player` in `state` has the sun form item""" return state.has("Sun form", player) -def _has_light(state, player: int) -> bool: +def _has_light(state:CollectionState, player: int) -> bool: """`player` in `state` has the light item""" return state.has("Baby dumbo", player) or _has_sun_form(state, player) -def _has_dual_form(state, player: int) -> bool: +def _has_dual_form(state:CollectionState, player: int) -> bool: """`player` in `state` has the dual form item""" return _has_li(state, player) and state.has("Dual form", player) -def _has_fish_form(state, player: int) -> bool: +def _has_fish_form(state:CollectionState, player: int) -> bool: """`player` in `state` has the fish form item""" return state.has("Fish form", player) -def _has_spirit_form(state, player: int) -> bool: +def _has_spirit_form(state:CollectionState, player: int) -> bool: """`player` in `state` has the spirit form item""" return state.has("Spirit form", player) -def _has_big_bosses(state, player: int) -> bool: +def _has_big_bosses(state:CollectionState, player: int) -> bool: """`player` in `state` has beated every big bosses""" return state.has_all({"Fallen God beated", "Mithalan God beated", "Drunian God beated", "Sun God beated", "The Golem beated"}, player) -def _has_mini_bosses(state, player: int) -> bool: +def _has_mini_bosses(state:CollectionState, player: int) -> bool: """`player` in `state` has beated every big bosses""" return state.has_all({"Nautilus Prime beated", "Blaster Peg Prime beated", "Mergog beated", "Mithalan priests beated", "Octopus Prime beated", "Crabbius Maximus beated", "Mantis Shrimp Prime beated", "King Jellyfish God Prime beated"}, player) -def _has_secrets(state, player: int) -> bool: +def _has_secrets(state:CollectionState, player: int) -> bool: return state.has_all({"First secret obtained", "Second secret obtained", "Third secret obtained"},player) @@ -788,7 +788,7 @@ def __connect_body_regions(self) -> None: self.__connect_regions("Body bottom area", "Final boss area", self.body_b, self.final_boss_loby, lambda state: _has_dual_form(state, self.player)) - self.__connect_regions("Before Final boss area", "Final boss tube", + self.__connect_regions("Before Final boss", "Final boss tube", self.final_boss_loby, self.final_boss_tube, lambda state: _has_nature_form(state, self.player)) self.__connect_one_way_regions("Before Final boss", "Final boss", diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 08b61f38bdb..2b700210a46 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -66,7 +66,7 @@ class AquariaWorld(World): "The web page generation informations" item_name_to_id: ClassVar[Dict[str, int]] =\ - {name: data[0] for name, data in item_table.items()} + {name: data.id for name, data in item_table.items()} "The name and associated ID of each item of the world" item_name_groups = { @@ -120,11 +120,11 @@ def create_item(self, name: str) -> AquariaItem: try: data = item_table[name] classification: ItemClassification = ItemClassification.useful - if data[2] == ItemType.JUNK: + if data.type == ItemType.JUNK: classification = ItemClassification.filler - elif data[2] == ItemType.PROGRESSION: + elif data.type == ItemType.PROGRESSION: classification = ItemClassification.progression - result = AquariaItem(name, classification, data[0], self.player) + result = AquariaItem(name, classification, data.id, self.player) except BaseException: raise Exception('The item ' + name + ' is not valid.') @@ -135,14 +135,14 @@ def __pre_fill_item(self, item_name: str, location_name: str, precollected) -> N if item_name not in precollected: self.exclude.append(item_name) data = item_table[item_name] - item = AquariaItem(item_name, ItemClassification.useful, data[0], self.player) + 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[3] == ItemGroup.INGREDIENT: + if data.group == ItemGroup.INGREDIENT: ingredients.append(name) filler_item_name = self.random.choice(ingredients) return filler_item_name @@ -172,7 +172,7 @@ def create_items(self) -> None: self.multiworld.itempool.append(self.create_item(self.get_filler_item_name())) else: if name not in self.exclude: - for i in range(data[1]): + for i in range(data.count): item = self.create_item(name) self.multiworld.itempool.append(item) diff --git a/worlds/aquaria/test/__init__.py b/worlds/aquaria/test/__init__.py index 132d0ad4376..9c2021ecbb3 100644 --- a/worlds/aquaria/test/__init__.py +++ b/worlds/aquaria/test/__init__.py @@ -9,7 +9,6 @@ # 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", From 54e12658070acc046f83f0f64900c995d227c391 Mon Sep 17 00:00:00 2001 From: Louis M Date: Thu, 2 May 2024 00:43:12 -0400 Subject: [PATCH 42/56] Documentation modifications after pull request comments --- worlds/aquaria/docs/en_Aquaria.md | 6 +++--- worlds/aquaria/docs/fr_Aquaria.md | 4 ++-- worlds/aquaria/docs/setup_en.md | 4 ++-- worlds/aquaria/docs/setup_fr.md | 12 ++++++------ 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/worlds/aquaria/docs/en_Aquaria.md b/worlds/aquaria/docs/en_Aquaria.md index 7ae2ec6daac..5f530682446 100644 --- a/worlds/aquaria/docs/en_Aquaria.md +++ b/worlds/aquaria/docs/en_Aquaria.md @@ -24,7 +24,7 @@ The locations in the randomizer are: * 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, +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: @@ -44,7 +44,7 @@ cannot be cooked (and learn) before being obtained as randomized items. Also, en 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 final boss. You can also add other goals like getting +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? @@ -52,7 +52,7 @@ 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 are visually unchanged. +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. diff --git a/worlds/aquaria/docs/fr_Aquaria.md b/worlds/aquaria/docs/fr_Aquaria.md index 670ecfd99da..4395b6dff95 100644 --- a/worlds/aquaria/docs/fr_Aquaria.md +++ b/worlds/aquaria/docs/fr_Aquaria.md @@ -2,7 +2,7 @@ ## Où se trouve la page des options ? -La [page des options du joueur pour ce jeu](../player-options) contiens tous +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 ? @@ -38,7 +38,7 @@ Les objets pouvant être obtenus sont: - 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 montres, des poissons ou des plantes. +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 diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index f730f2f723a..416894aac31 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -42,7 +42,7 @@ or, if the room has a password: aquaria_randomizer.exe --name YourName --server theServer:thePort --password thePassword ``` -### Linux Preparations using the AppImage +### 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 @@ -65,7 +65,7 @@ or, if the room has a password: ./Aquaria_Randomizer-*.AppImage --name YourName --server theServer:thePort --password thePassword ``` -### Linux Preparations using the tar file +### 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. diff --git a/worlds/aquaria/docs/setup_fr.md b/worlds/aquaria/docs/setup_fr.md index a0afacab0f1..3ccc394122d 100644 --- a/worlds/aquaria/docs/setup_fr.md +++ b/worlds/aquaria/docs/setup_fr.md @@ -11,13 +11,13 @@ ### 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 randomiser modifie des fichiers qui rendront possiblement +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 +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 @@ -27,7 +27,7 @@ fichier d'archive devrait contenir les fichiers suivants: - wrap_oal.dll - cacert.pem -S'il y a des conflits entre des fichiers de l'archive zip et des fichiers du jeu original, vous devez utiliser +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 randomiser, vous devez utiliser la ligne de commande (vous pouvez ouvrir une interface de @@ -46,7 +46,7 @@ aquaria_randomizer.exe --name VotreNom --server leServeur:LePort --password leMo ### Linux avec le fichier AppImage -Si vous utilisez le fichier AppImage, copiez le fichier dans le répertoire du jsu d'Aquaria. Ensuite, assurez-vous de +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 @@ -73,14 +73,14 @@ En premier lieu, assurez-vous de faire une copie du répertoire du jeu d'origine dans le randomiser auront comme impact de rendre le jeu d'origine non fonctionnel. Donc, effectuer la copie du jeu avant de déposer le randomiser à 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 Aquaria. Les +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 des fichiers de l'archive tar et des fichiers du jeu original, vous devez utiliser +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 From 1b996b894bd88a407251b8953c399158e5fa2e55 Mon Sep 17 00:00:00 2001 From: Louis M Date: Thu, 2 May 2024 01:00:51 -0400 Subject: [PATCH 43/56] Replacing randomiser by randomizer in french --- worlds/aquaria/docs/en_Aquaria.md | 3 +++ worlds/aquaria/docs/setup_en.md | 3 +++ worlds/aquaria/docs/setup_fr.md | 13 ++++++++----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/worlds/aquaria/docs/en_Aquaria.md b/worlds/aquaria/docs/en_Aquaria.md index 5f530682446..aa095b83568 100644 --- a/worlds/aquaria/docs/en_Aquaria.md +++ b/worlds/aquaria/docs/en_Aquaria.md @@ -1,5 +1,8 @@ # 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 diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index 416894aac31..435761e3f84 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -65,6 +65,9 @@ or, if the room has a password: ./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 diff --git a/worlds/aquaria/docs/setup_fr.md b/worlds/aquaria/docs/setup_fr.md index 3ccc394122d..2c34f1e6a50 100644 --- a/worlds/aquaria/docs/setup_fr.md +++ b/worlds/aquaria/docs/setup_fr.md @@ -30,9 +30,9 @@ fichier d'archive devrait contenir les fichiers suivants: 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 randomiser, vous devez utiliser la ligne de commande (vous pouvez ouvrir une interface de +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 randomiser: +la ligne de commande à utiliser pour lancer le randomizer: ```bash aquaria_randomizer.exe --name VotreNom --server leServeur:LePort @@ -67,11 +67,14 @@ Si vous devez entrer un mot de passe: ./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 randomiser auront comme impact de rendre le jeu d'origine non fonctionnel. Donc, effectuer la copie du jeu -avant de déposer le randomiser à l'intérieur permet de vous assurer de garder une version du jeu d'origine fonctionnel. +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: @@ -93,7 +96,7 @@ sudo apt install liblua5.1-0-dev libogg-dev libvorbis-dev libopenal-dev libsdl2- 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 randomiser de fonctionner. +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: From 1e0a8091434f52a94f240119e513dccdf68e6566 Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 3 May 2024 11:19:57 -0400 Subject: [PATCH 44/56] Adding unconfinment methods to exit home water without bind song --- worlds/aquaria/Options.py | 28 +++++++++++++------ worlds/aquaria/Regions.py | 18 ++++++++---- worlds/aquaria/__init__.py | 2 ++ .../aquaria/test/test_confined_home_water.py | 20 +++++++++++++ .../test_unconfine_home_water_via_both.py | 21 ++++++++++++++ ...st_unconfine_home_water_via_energy_door.py | 20 +++++++++++++ ...st_unconfine_home_water_via_transturtle.py | 20 +++++++++++++ 7 files changed, 116 insertions(+), 13 deletions(-) create mode 100644 worlds/aquaria/test/test_confined_home_water.py create mode 100644 worlds/aquaria/test/test_unconfine_home_water_via_both.py create mode 100644 worlds/aquaria/test/test_unconfine_home_water_via_energy_door.py create mode 100644 worlds/aquaria/test/test_unconfine_home_water_via_transturtle.py diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index a007d33e598..eeef9144fb3 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -111,23 +111,35 @@ class BindSongNeededToGetUnderRockBulb(Toggle): 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_no = 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 """ - ingredient_randomizer: IngredientRandomizer - dish_randomizer: DishRandomizer - aquarian_translation: AquarianTranslation + start_inventory_from_pool: StartInventoryPool objective: Objective + mini_bosses_to_beat: MiniBossesToBeat + big_bosses_to_beat: BigBossesToBeat turtle_randomizer: TurtleRandomizer early_energy_form: EarlyEnergyForm - big_bosses_to_beat: BigBossesToBeat - mini_bosses_to_beat: MiniBossesToBeat - skip_first_vision: SkipFirstVision - exclude_hard_or_hidden_locations: ExcludeHardOrHiddenLocation light_needed_to_get_to_dark_places: LightNeededToGetToDarkPlaces bind_song_needed_to_get_under_rock_bulb: BindSongNeededToGetUnderRockBulb - start_inventory_from_pool: StartInventoryPool + unconfine_home_water: UnconfineHomeWater + exclude_hard_or_hidden_locations: ExcludeHardOrHiddenLocation + ingredient_randomizer: IngredientRandomizer + dish_randomizer: DishRandomizer + aquarian_translation: AquarianTranslation + skip_first_vision: SkipFirstVision death_link: DeathLink diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 2a0e9a44893..4fb7de16007 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -466,8 +466,7 @@ def __connect_home_water_regions(self) -> None: self.home_water, self.home_water_nautilus, lambda state: _has_energy_form(state, self.player) and _has_bind_song(state, self.player)) self.__connect_regions("Home Water", "Home water transturtle room", - self.home_water, self.home_water_transturtle, - lambda state: _has_bind_song(state, self.player)) + self.home_water, self.home_water_transturtle) self.__connect_regions("Home Water", "Energy temple first area", self.home_water, self.energy_temple_1, lambda state: _has_bind_song(state, self.player)) @@ -507,9 +506,7 @@ def __connect_home_water_regions(self) -> None: _has_energy_form(state, self.player) and _has_beast_form(state, self.player)) self.__connect_regions("Home Water", "Open water top left area", - self.home_water, self.openwater_tl, - lambda state: _has_bind_song(state, self.player) and - _has_energy_form(state, self.player)) + self.home_water, self.openwater_tl) def __connect_open_water_regions(self) -> None: """ @@ -1204,9 +1201,19 @@ def adjusting_rules(self, options: AquariaOptions) -> None: if options.objective.value == 1: add_rule(self.multiworld.get_entrance("Before Final boss to Final boss", self.player), lambda state: _has_secrets(state, self.player)) + if options.unconfine_home_water.value in [0, 1]: + add_rule(self.multiworld.get_entrance("Home Water to Home water transturtle room", self.player), + lambda state: _has_bind_song(state, self.player)) if options.early_energy_form: add_rule(self.multiworld.get_entrance("Home Water to Home water transturtle room", self.player), lambda state: _has_energy_form(state, self.player)) + if options.unconfine_home_water.value in [0, 2]: + add_rule(self.multiworld.get_entrance("Home Water to Open water top left area", self.player), + lambda state: _has_bind_song(state, self.player) and _has_energy_form(state, self.player)) + if options.early_energy_form: + add_rule(self.multiworld.get_entrance("Home Water to Open water top left area", self.player), + lambda state: _has_energy_form(state, self.player)) + if options.exclude_hard_or_hidden_locations: self.__excluded_hard_or_hidden_location() @@ -1219,6 +1226,7 @@ def __add_home_water_regions_to_world(self) -> None: self.multiworld.regions.append(self.verse_cave_l) self.multiworld.regions.append(self.home_water) self.multiworld.regions.append(self.home_water_nautilus) + self.multiworld.regions.append(self.home_water_transturtle) self.multiworld.regions.append(self.naija_home) self.multiworld.regions.append(self.song_cave) self.multiworld.regions.append(self.energy_temple_1) diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 87abef39226..e87e8c8b306 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -213,4 +213,6 @@ def fill_slot_data(self) -> Dict[str, Any]: "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], } diff --git a/worlds/aquaria/test/test_confined_home_water.py b/worlds/aquaria/test/test_confined_home_water.py new file mode 100644 index 00000000000..f4e0e7b6796 --- /dev/null +++ b/worlds/aquaria/test/test_confined_home_water.py @@ -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") \ No newline at end of file diff --git a/worlds/aquaria/test/test_unconfine_home_water_via_both.py b/worlds/aquaria/test/test_unconfine_home_water_via_both.py new file mode 100644 index 00000000000..3af17f1b75d --- /dev/null +++ b/worlds/aquaria/test/test_unconfine_home_water_via_both.py @@ -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") \ No newline at end of file diff --git a/worlds/aquaria/test/test_unconfine_home_water_via_energy_door.py b/worlds/aquaria/test/test_unconfine_home_water_via_energy_door.py new file mode 100644 index 00000000000..bfa82d65eac --- /dev/null +++ b/worlds/aquaria/test/test_unconfine_home_water_via_energy_door.py @@ -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") \ No newline at end of file diff --git a/worlds/aquaria/test/test_unconfine_home_water_via_transturtle.py b/worlds/aquaria/test/test_unconfine_home_water_via_transturtle.py new file mode 100644 index 00000000000..627a92db291 --- /dev/null +++ b/worlds/aquaria/test/test_unconfine_home_water_via_transturtle.py @@ -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") \ No newline at end of file From 45f8873b51576cf781601147c40f7d3ff957058b Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 3 May 2024 11:56:13 -0400 Subject: [PATCH 45/56] Adding bubble cave boss location to add rules on it --- worlds/aquaria/Locations.py | 4 ++++ worlds/aquaria/Options.py | 2 +- worlds/aquaria/Regions.py | 9 ++++++++- worlds/aquaria/test/test_nature_form_access.py | 2 ++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 1570d2c0296..fe6e70f0093 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -415,6 +415,9 @@ class AquariaLocations: 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, } @@ -556,6 +559,7 @@ class AquariaLocations: **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, diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index eeef9144fb3..8849f1bf315 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -116,7 +116,7 @@ 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_no = 0 + option_off = 0 option_via_energy_door = 1 option_via_transturtle = 2 option_via_both = 3 diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 4fb7de16007..3a9d2b9f81b 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -181,6 +181,7 @@ class AquariaRegions: abyss_r: Region ice_cave: Region bubble_cave: Region + bubble_cave_boss: Region king_jellyfish_cave: Region whale: Region first_secret: Region @@ -391,6 +392,7 @@ def __create_abyss(self) -> None: self.abyss_r = self.__add_region("Abyss right area", AquariaLocations.locations_abyss_r) self.ice_cave = self.__add_region("Ice cave", AquariaLocations.locations_ice_cave) self.bubble_cave = self.__add_region("Bubble cave", AquariaLocations.locations_bubble_cave) + self.bubble_cave_boss = self.__add_region("Bubble cave boss area", AquariaLocations.locations_bubble_cave_boss) self.king_jellyfish_cave = self.__add_region("Abyss left area, King jellyfish cave", AquariaLocations.locations_king_jellyfish_cave) self.whale = self.__add_region("Inside the whale", AquariaLocations.locations_whale) @@ -754,6 +756,10 @@ def __connect_abyss_regions(self) -> None: self.__connect_regions("Abyss right area", "Bubble cave", self.ice_cave, self.bubble_cave, lambda state: _has_beast_form(state, self.player)) + self.__connect_regions("Bubble cave boss area", "Bubble cave", + self.bubble_cave, self.bubble_cave_boss, + lambda state: _has_nature_form(state, self.player) and _has_bind_song(state, self.player) + ) def __connect_sunken_city_regions(self) -> None: """ @@ -923,7 +929,7 @@ def __add_event_mini_bosses(self) -> None: self.__add_event_location(self.arnassi_crab_boss, "Beating Crabbius Maximus", "Crabbius Maximus beated") - self.__add_event_location(self.bubble_cave, + self.__add_event_location(self.bubble_cave_boss, "Beating Mantis Shrimp Prime", "Mantis Shrimp Prime beated") self.__add_event_location(self.king_jellyfish_cave, @@ -1315,6 +1321,7 @@ def __add_abyss_regions_to_world(self) -> None: self.multiworld.regions.append(self.abyss_r) self.multiworld.regions.append(self.ice_cave) self.multiworld.regions.append(self.bubble_cave) + self.multiworld.regions.append(self.bubble_cave_boss) self.multiworld.regions.append(self.king_jellyfish_cave) self.multiworld.regions.append(self.whale) self.multiworld.regions.append(self.sunken_city_l) diff --git a/worlds/aquaria/test/test_nature_form_access.py b/worlds/aquaria/test/test_nature_form_access.py index 8ee94f01c51..07d4377b33b 100644 --- a/worlds/aquaria/test/test_nature_form_access.py +++ b/worlds/aquaria/test/test_nature_form_access.py @@ -26,6 +26,8 @@ def test_nature_form_location(self) -> None: "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", From 0329b01b10c8527c99994a9502150693a8a2ffc3 Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 3 May 2024 12:35:02 -0400 Subject: [PATCH 46/56] Adding bind song rules for sunken city boss --- worlds/aquaria/Regions.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 3a9d2b9f81b..d4ddcf251a8 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -26,11 +26,11 @@ def _has_tongue_cleared(state:CollectionState, player: int) -> bool: def _has_sun_crystal(state:CollectionState, player: int) -> bool: """`player` in `state` has the Sun crystal item""" - return state.has("Has sun crystal", player) + return state.has("Has sun crystal", player) and _has_bind_song(state, player) def _has_li(state:CollectionState, player: int) -> bool: - """`player` in `state` has Li in it's team""" + """`player` in `state` has Li in its team""" return state.has("Li and Li song", player) @@ -773,7 +773,8 @@ def __connect_sunken_city_regions(self) -> None: self.__connect_regions("Sunken city left area", "Sunken city boss area", self.sunken_city_l, self.sunken_city_boss, lambda state: _has_beast_form(state, self.player) and - _has_energy_form(state, self.player)) + _has_energy_form(state, self.player) and + _has_bind_song(state, self.player)) def __connect_body_regions(self) -> None: """ From b7ab54fa90bc7339fb0f7d271beec6abc5a05a17 Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 10 May 2024 14:34:40 -0400 Subject: [PATCH 47/56] Changing exclusion to item rules for progression --- worlds/aquaria/Options.py | 8 +- worlds/aquaria/Regions.py | 87 ++++++++++++------- ...st_no_progression_hard_hidden_locations.py | 60 +++++++++++++ .../test_progression_hard_hidden_locations.py | 53 +++++++++++ 4 files changed, 173 insertions(+), 35 deletions(-) create mode 100644 worlds/aquaria/test/test_no_progression_hard_hidden_locations.py create mode 100644 worlds/aquaria/test/test_progression_hard_hidden_locations.py diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index 8849f1bf315..5c4936e44b3 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -88,14 +88,14 @@ class SkipFirstVision(Toggle): """ display_name = "Skip first Naija's vision" -class ExcludeHardOrHiddenLocation(Toggle): +class NoProgressionHardOrHiddenLocation(Toggle): """ Make sure that there is no progression items at hard to get or hard to find locations. - Locations that will be excluded are very High location (that need beast form, soup and skill to get), every + 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 = "Exclude hard or hidden locations" + display_name = "No progression in hard or hidden locations" class LightNeededToGetToDarkPlaces(DefaultOnToggle): """ @@ -137,7 +137,7 @@ class AquariaOptions(PerGameCommonOptions): light_needed_to_get_to_dark_places: LightNeededToGetToDarkPlaces bind_song_needed_to_get_under_rock_bulb: BindSongNeededToGetUnderRockBulb unconfine_home_water: UnconfineHomeWater - exclude_hard_or_hidden_locations: ExcludeHardOrHiddenLocation + no_progression_hard_or_hidden_locations: NoProgressionHardOrHiddenLocation ingredient_randomizer: IngredientRandomizer dish_randomizer: DishRandomizer aquarian_translation: AquarianTranslation diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index d4ddcf251a8..eeaec619ebf 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -1134,57 +1134,82 @@ def __adjusting_manual_rules(self) -> None: - def __excluded_hard_or_hidden_location(self) -> None: + def __no_progression_hard_or_hidden_location(self) -> None: self.multiworld.get_location("Energy temple boss area, Fallen god tooth", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Cathedral boss area, beating Mithalan God", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Kelp forest boss area, beating Drunian God", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Sun temple boss area, beating Sun God", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Sunken city, bulb on the top of the boss area (boiler room)", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Home water, Nautilus Egg", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Energy temple blaster room, Blaster egg", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Mithalas castle, beating the priests", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Mermog cave, Piranha Egg", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Octopus cave, Dumbo Egg", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("King Jellyfish cave, bulb in the right path from King Jelly", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("King Jellyfish cave, Jellyfish Costume", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Final boss area, bulb in the boss third form room", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Sun Worm path, first cliff bulb", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Sun Worm path, second cliff bulb", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("The veil top right area, bulb in the top of the water fall", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Bubble cave, bulb in the left cave wall", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Bubble cave, bulb in the right cave wall (behind the ice cristal)", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Bubble cave, Verse egg", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Kelp forest bottom left area, Walker baby", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Sun temple, Sun key", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("The body bottom area, Mutant Costume", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Sun temple, bulb in the hidden room of the right part", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Arnassi ruins, Arnassi Armor", - self.player).progress_type = LocationProgressType.EXCLUDED + self.player).item_rule =\ + lambda item: item.classification != ItemClassification.progression def adjusting_rules(self, options: AquariaOptions) -> None: """ @@ -1211,18 +1236,18 @@ def adjusting_rules(self, options: AquariaOptions) -> None: if options.unconfine_home_water.value in [0, 1]: add_rule(self.multiworld.get_entrance("Home Water to Home water transturtle room", self.player), lambda state: _has_bind_song(state, self.player)) - if options.early_energy_form: - add_rule(self.multiworld.get_entrance("Home Water to Home water transturtle room", self.player), - lambda state: _has_energy_form(state, self.player)) if options.unconfine_home_water.value in [0, 2]: add_rule(self.multiworld.get_entrance("Home Water to Open water top left area", self.player), lambda state: _has_bind_song(state, self.player) and _has_energy_form(state, self.player)) + if options.early_energy_form: + add_rule(self.multiworld.get_entrance("Home Water to Home water transturtle room", self.player), + lambda state: _has_energy_form(state, self.player)) if options.early_energy_form: add_rule(self.multiworld.get_entrance("Home Water to Open water top left area", self.player), lambda state: _has_energy_form(state, self.player)) - if options.exclude_hard_or_hidden_locations: - self.__excluded_hard_or_hidden_location() + if options.no_progression_hard_or_hidden_locations: + self.__no_progression_hard_or_hidden_location() def __add_home_water_regions_to_world(self) -> None: """ diff --git a/worlds/aquaria/test/test_no_progression_hard_hidden_locations.py b/worlds/aquaria/test/test_no_progression_hard_hidden_locations.py new file mode 100644 index 00000000000..7cec5c7d80e --- /dev/null +++ b/worlds/aquaria/test/test_no_progression_hard_hidden_locations.py @@ -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 cristals", + "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 + "\"") + diff --git a/worlds/aquaria/test/test_progression_hard_hidden_locations.py b/worlds/aquaria/test/test_progression_hard_hidden_locations.py new file mode 100644 index 00000000000..c03ca3a35b0 --- /dev/null +++ b/worlds/aquaria/test/test_progression_hard_hidden_locations.py @@ -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 cristals", + "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 + "\"") + From e3715a6a4bd1d595c6bfa77f53f6a2c14d438579 Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 13 May 2024 06:58:13 -0400 Subject: [PATCH 48/56] Fixing a typo --- worlds/aquaria/Locations.py | 2 +- worlds/aquaria/Regions.py | 2 +- worlds/aquaria/test/__init__.py | 2 +- .../aquaria/test/test_no_progression_hard_hidden_locations.py | 2 +- worlds/aquaria/test/test_progression_hard_hidden_locations.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index fe6e70f0093..824b98a362b 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -268,7 +268,7 @@ class AquariaLocations: } locations_forest_bl = { - "Kelp Forest bottom left area, bulb close to the spirit cristals": 698054, + "Kelp Forest bottom left area, bulb close to the spirit crystals": 698054, "Kelp forest bottom left area, Walker baby": 698186, "Kelp Forest bottom left area, Transturtle": 698212, } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index eeaec619ebf..369ac3b6d14 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -1192,7 +1192,7 @@ def __no_progression_hard_or_hidden_location(self) -> None: self.multiworld.get_location("Bubble cave, Verse egg", self.player).item_rule =\ lambda item: item.classification != ItemClassification.progression - self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit cristals", + self.multiworld.get_location("Kelp Forest bottom left area, bulb close to the spirit crystals", self.player).item_rule =\ lambda item: item.classification != ItemClassification.progression self.multiworld.get_location("Kelp forest bottom left area, Walker baby", diff --git a/worlds/aquaria/test/__init__.py b/worlds/aquaria/test/__init__.py index 9c2021ecbb3..75dfd738021 100644 --- a/worlds/aquaria/test/__init__.py +++ b/worlds/aquaria/test/__init__.py @@ -103,7 +103,7 @@ "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 cristals", + "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", diff --git a/worlds/aquaria/test/test_no_progression_hard_hidden_locations.py b/worlds/aquaria/test/test_no_progression_hard_hidden_locations.py index 7cec5c7d80e..5876ff31aa0 100644 --- a/worlds/aquaria/test/test_no_progression_hard_hidden_locations.py +++ b/worlds/aquaria/test/test_no_progression_hard_hidden_locations.py @@ -34,7 +34,7 @@ class UNoProgressionHardHiddenTest(AquariaTestBase): "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 cristals", + "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", diff --git a/worlds/aquaria/test/test_progression_hard_hidden_locations.py b/worlds/aquaria/test/test_progression_hard_hidden_locations.py index c03ca3a35b0..6450236097c 100644 --- a/worlds/aquaria/test/test_progression_hard_hidden_locations.py +++ b/worlds/aquaria/test/test_progression_hard_hidden_locations.py @@ -34,7 +34,7 @@ class UNoProgressionHardHiddenTest(AquariaTestBase): "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 cristals", + "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", From 5af7ca3f043b4ded1b352221ddda9608cc145037 Mon Sep 17 00:00:00 2001 From: Louis M Date: Mon, 13 May 2024 13:59:34 -0400 Subject: [PATCH 49/56] Adding a rules to be able to break an urn --- worlds/aquaria/Regions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 369ac3b6d14..d16ef9f3344 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -999,6 +999,8 @@ def __adjusting_urns_rules(self) -> None: lambda state: _has_damaging_item(state, self.player)) add_rule(self.multiworld.get_location("Mithalas city castle, second urn on the entrance path", self.player), lambda state: _has_damaging_item(state, self.player)) + add_rule(self.multiworld.get_location("Mithalas city, urn inside a home fish pass", self.player), + lambda state: _has_damaging_item(state, self.player)) def __adjusting_crates_rules(self) -> None: """Since Crate need to be broken, add a damaging item to rules""" From 3d963a7dc781bb41a3b1f301c1845404985313bb Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 17 May 2024 08:33:16 -0400 Subject: [PATCH 50/56] Adding Aquaria to the README --- README.md | 1 + worlds/aquaria/Options.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fb824650309..0bb156f2891 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Currently, the following games are supported: * Yoshi's Island * Mario & Luigi: Superstar Saga * Bomb Rush Cyberfunk +* Aquaria For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index 5c4936e44b3..d2935d10d7f 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -29,9 +29,9 @@ class DishRandomizer(Toggle): 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 + option_none = 0 + option_all = 1 + option_all_except_final = 2 default = 2 From 9f2ea30b474cac4b2d63268e4ee81b58c2570c75 Mon Sep 17 00:00:00 2001 From: Exempt-Medic Date: Fri, 17 May 2024 09:25:26 -0400 Subject: [PATCH 51/56] Removing deprecated item_count --- worlds/aquaria/Items.py | 20 +++++--- worlds/aquaria/Locations.py | 2 +- worlds/aquaria/Options.py | 44 ++++++++-------- worlds/aquaria/Regions.py | 13 ++--- worlds/aquaria/__init__.py | 4 +- worlds/aquaria/docs/en_Aquaria.md | 54 ++++++++++---------- worlds/aquaria/docs/setup_en.md | 35 +++++++------ worlds/aquaria/test/__init__.py | 2 +- worlds/aquaria/test/test_fish_form_access.py | 2 +- 9 files changed, 89 insertions(+), 87 deletions(-) diff --git a/worlds/aquaria/Items.py b/worlds/aquaria/Items.py index 72334846849..5494c87e8cf 100644 --- a/worlds/aquaria/Items.py +++ b/worlds/aquaria/Items.py @@ -8,14 +8,16 @@ 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 + Used to indicate to the multi-world if an item is useful or not """ NORMAL = 0 PROGRESSION = 1 JUNK = 2 + class ItemGroup(Enum): """ Used to group items @@ -28,6 +30,7 @@ class ItemGroup(Enum): SONG = 5 TURTLE = 6 + class AquariaItem(Item): """ A single item in the Aquaria game. @@ -40,22 +43,23 @@ def __init__(self, name: str, classification: ItemClassification, """ Initialisation of the Item :param name: The name of the item - :param classification: If the item is usefull or not + :param classification: If the item is useful 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 + id: int + count: int + type: ItemType + group: ItemGroup - def __init__(self, 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 @@ -68,6 +72,7 @@ def __init__(self, id:int, count:int, type:ItemType, group:ItemGroup): self.type = type self.group = group + """Information data for every (not event) item.""" item_table = { # name: ID, Nb, Item Type, Item Group @@ -207,4 +212,3 @@ def __init__(self, id:int, count:int, type:ItemType, group:ItemGroup): "Transturtle Simon says": ItemData(698132, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_forest05 "Transturtle Arnassi ruins": ItemData(698133, 1, ItemType.PROGRESSION, ItemGroup.TURTLE), # transport_seahorse } - diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index 824b98a362b..f75f936e4b3 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -129,7 +129,7 @@ class AquariaLocations: 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, + "Open water bottom left area, bulb inside the lowest fish pass": 698010, } locations_skeleton_path = { diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index 5c4936e44b3..3dec912dbd6 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -10,9 +10,8 @@ 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". + Select if the simple ingredients (that do 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 @@ -43,13 +42,13 @@ class EarlyEnergyForm(DefaultOnToggle): class AquarianTranslation(Toggle): - """Translate to English the Aquarian scripture in the game.""" + """Translate the Aquarian scripture in the game into English.""" 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 + The 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" @@ -60,12 +59,12 @@ class BigBossesToBeat(Range): class MiniBossesToBeat(Range): """ - A number of Minibosses to beat before having access to the creator (the final boss). Mini bosses are + The number of minibosses to beat before having access to the creator (the final boss). The minibosses 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. + "Mantis Shrimp Prime" and "King Jellyfish God Prime". + Note that the Energy Statue and Simon Says are not minibosses. """ - display_name = "Mini bosses to beat" + display_name = "Minibosses to beat" range_start = 0 range_end = 8 default = 0 @@ -73,47 +72,50 @@ class MiniBossesToBeat(Range): 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 + The game objective can be to kill the creator or to kill the creator after obtaining all three 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 + The first vision in the game, where Naija transforms into Energy Form and gets flooded by enemies, 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" + display_name = "Skip Naija's first 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. + Make sure that there are no progression items at hard-to-reach or hard-to-find locations. + Those locations are very High locations (that need beast form, soup and skill to get), + every location in the bubble cave, locations where need you to cross a false wall without any indication, + the Arnassi race, bosses and minibosses. Useful for those that want a more 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. + Make sure that the sun form or the dumbo pet can be acquired 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. + Make sure that the bind song can be acquired 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. + Open the way out of the 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 diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index d16ef9f3344..60ebf6eed39 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -5,7 +5,7 @@ """ from typing import Dict, Optional -from BaseClasses import MultiWorld, Region, Entrance, ItemClassification, LocationProgressType, CollectionState +from BaseClasses import MultiWorld, Region, Entrance, ItemClassification, CollectionState from .Items import AquariaItem from .Locations import AquariaLocations, AquariaLocation from .Options import AquariaOptions @@ -223,8 +223,6 @@ def __add_region(self, hint: str, region.add_locations(locations, AquariaLocation) return region - - def __create_home_water_area(self) -> None: """ Create the `verse_cave`, `home_water` and `song_cave*` regions @@ -941,7 +939,7 @@ def __add_event_secrets(self) -> None: """ Add secrets events to the `world` """ - self.__add_event_location(self.first_secret, # Doit ajouter une région pour le "first secret" + self.__add_event_location(self.first_secret, # Doit ajouter une région pour le "first secret" "First secret", "First secret obtained") self.__add_event_location(self.mithalas_city, @@ -1095,12 +1093,10 @@ def __adjusting_light_in_dark_place_rules(self) -> None: add_rule(self.multiworld.get_entrance("Veil left of sun temple to Sun temple left area", self.player), lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) - - def __adjusting_manual_rules(self) -> None: add_rule(self.multiworld.get_location("Mithalas cathedral, Mithalan Dress", self.player), lambda state: _has_beast_form(state, self.player)) - add_rule(self.multiworld.get_location("Open water bottom left area, bulb inside the downest fish pass", self.player), + add_rule(self.multiworld.get_location("Open water bottom left area, bulb inside the lowest fish pass", self.player), lambda state: _has_fish_form(state, self.player)) add_rule(self.multiworld.get_location("Kelp forest bottom left area, Walker baby", self.player), lambda state: _has_spirit_form(state, self.player)) @@ -1133,9 +1129,6 @@ def __adjusting_manual_rules(self) -> None: lambda state: _has_fish_form(state, self.player) and _has_spirit_form(state, self.player)) - - - def __no_progression_hard_or_hidden_location(self) -> None: self.multiworld.get_location("Energy temple boss area, Fallen god tooth", self.player).item_rule =\ diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index e87e8c8b306..7c92d33a9c7 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -5,7 +5,7 @@ """ from typing import List, Dict, ClassVar, Any -from ..AutoWorld import World, WebWorld +from worlds.AutoWorld import World, WebWorld from BaseClasses import Tutorial, MultiWorld, ItemClassification from .Items import item_table, AquariaItem, ItemType, ItemGroup from .Locations import location_table @@ -114,7 +114,7 @@ def create_regions(self) -> None: def create_item(self, name: str) -> AquariaItem: """ - Create an AquariaItem using `name' as item name. + Create an AquariaItem using 'name' as item name. """ result: AquariaItem try: diff --git a/worlds/aquaria/docs/en_Aquaria.md b/worlds/aquaria/docs/en_Aquaria.md index aa095b83568..c37f27568d9 100644 --- a/worlds/aquaria/docs/en_Aquaria.md +++ b/worlds/aquaria/docs/en_Aquaria.md @@ -11,39 +11,39 @@ 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 +- 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. +nothing will come out of them. The moment those bulbs, urns and crates are opened, the location is considered checked. 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. +- Dishes (used to learn recipes)* +- Some ingredients +- The Wok (third plate used to cook 3-ingredient recipes everywhere) +- All collectible treasure (including pet eggs and costumes) +- Li and Li's 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 +* Note that, unlike in the vanilla game, the recipes for dishes (other than the Sea Loaf) +cannot be cooked (or learned) 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? @@ -57,8 +57,8 @@ Any items specified above can be in another player's world. 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. +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. \ No newline at end of file +the item from and which one it was. \ No newline at end of file diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index 435761e3f84..cd36283b791 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -2,9 +2,12 @@ ## Required Software -- The original Aquaria Game (buyable from a lot of online game seller); +- 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) + +## Optional Software +- +- 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 @@ -13,10 +16,10 @@ 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. +game you play will make sure that every game has its own save game. Unzip the Aquaria randomizer release and copy all unzipped files in the Aquaria game folder. The unzipped files -are those: +are: - aquaria_randomizer.exe - OpenAL32.dll - override (directory) @@ -25,11 +28,11 @@ are those: - 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. +If there is a conflict between files in the original game folder and the unzipped files, you should overwrite +the original files with the ones from 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 +by typing `cmd` in the address bar of the Windows File Explorer). Here is the command line used to start the randomizer: ```bash @@ -44,8 +47,8 @@ aquaria_randomizer.exe --name YourName --server theServer:thePort --password th ### 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 +If you use the AppImage, just copy it into 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 @@ -65,7 +68,7 @@ or, if the room has a password: ./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, +Note that you should not have multiple Aquaria_Randomizer AppImage file in the same folder. If this situation occurs, the preceding commands will launch the game multiple times. ### Linux when using the tar file @@ -74,23 +77,23 @@ First, you should copy the original Aquaria folder game. The randomizer will pos 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: +files are: - 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. +If there is a conflict between files in the original game folder and the extracted files, you should overwrite +the original files with the ones from the extracted randomizer files. -Then, you should use your system package manager to install liblua5, libogg, libvorbis, libopenal and libsdl2. +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`, +Also, if there are certain `.so` files in the original Aquaria 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. @@ -106,7 +109,7 @@ or, if the room has a password: ./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 +Note: If you get a permission denied error when using the command line, you can use this command to be sure that your executable has executable permission: ```bash diff --git a/worlds/aquaria/test/__init__.py b/worlds/aquaria/test/__init__.py index 75dfd738021..33c6bf3cbcf 100644 --- a/worlds/aquaria/test/__init__.py +++ b/worlds/aquaria/test/__init__.py @@ -25,7 +25,7 @@ "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 bottom left area, bulb inside the lowest 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", diff --git a/worlds/aquaria/test/test_fish_form_access.py b/worlds/aquaria/test/test_fish_form_access.py index e6c24cf03fd..30772371721 100644 --- a/worlds/aquaria/test/test_fish_form_access.py +++ b/worlds/aquaria/test/test_fish_form_access.py @@ -21,7 +21,7 @@ def test_fish_form_location(self) -> None: "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", + "Open water bottom left area, bulb inside the lowest 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", From 0fd8121056eebfe09c227e0413400f7f610edf79 Mon Sep 17 00:00:00 2001 From: Exempt-Medic Date: Fri, 17 May 2024 09:37:59 -0400 Subject: [PATCH 52/56] Spacing fix --- worlds/aquaria/docs/setup_en.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index cd36283b791..69e52859907 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -18,8 +18,7 @@ the original game will stop working. Copying the folder will guarantee that the 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 its own save game. -Unzip the Aquaria randomizer release and copy all unzipped files in the Aquaria game folder. The unzipped files -are: +Unzip the Aquaria randomizer release and copy all unzipped files in the Aquaria game folder. The unzipped files are: - aquaria_randomizer.exe - OpenAL32.dll - override (directory) @@ -76,8 +75,7 @@ the preceding commands will launch the game multiple times. 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: +Untar the Aquaria randomizer release and copy all extracted files in the Aquaria game folder. The extracted files are: - aquaria_randomizer - override (directory) - usersettings.xml From eabd14d8892bb7473c2a7b5327587d56b12ea92e Mon Sep 17 00:00:00 2001 From: Exempt-Medic Date: Fri, 17 May 2024 09:40:00 -0400 Subject: [PATCH 53/56] Plural fix --- worlds/aquaria/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index 3dec912dbd6..af5007f2e05 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -108,7 +108,7 @@ class LightNeededToGetToDarkPlaces(DefaultOnToggle): class BindSongNeededToGetUnderRockBulb(Toggle): """ - Make sure that the bind song can be acquired before having to obtain sing bulb under rocks. + Make sure that the bind song can be acquired before having to obtain sing bulbs under rocks. """ display_name = "Bind song needed to get sing bulbs under rocks" From 3db6056a5a565ad7faaae078a14de28e6aefd3ed Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 17 May 2024 16:28:35 -0400 Subject: [PATCH 54/56] modifications proposed by remyjette --- worlds/aquaria/Options.py | 2 +- worlds/aquaria/docs/setup_en.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index a1dea1323c3..e16632fd4e7 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -101,7 +101,7 @@ class NoProgressionHardOrHiddenLocation(Toggle): class LightNeededToGetToDarkPlaces(DefaultOnToggle): """ Make sure that the sun form or the dumbo pet can be acquired before getting to dark places. - Be aware that navigating in dark place without light is extremely difficult. + Be aware that navigating in dark places without light is extremely difficult. """ display_name = "Light needed to get to dark places" diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index 69e52859907..34196757a31 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -2,11 +2,11 @@ ## Required Software -- The original Aquaria Game (buyable from a lot of online game seller) +- The original Aquaria Game (purchasable from most online game stores) - The [Aquaria randomizer](https://github.com/tioui/Aquaria_Randomizer/releases) ## Optional Software -- + - 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 From 4e9175dbb45cecc218ba3671e0a22b5f84165713 Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 17 May 2024 16:37:57 -0400 Subject: [PATCH 55/56] Early energy form now use multiworld.early_items --- worlds/aquaria/Options.py | 4 +-- worlds/aquaria/Regions.py | 6 +--- .../aquaria/test/test_energy_form_access.py | 1 - .../test/test_energy_form_access_option.py | 31 ------------------- 4 files changed, 2 insertions(+), 40 deletions(-) delete mode 100644 worlds/aquaria/test/test_energy_form_access_option.py diff --git a/worlds/aquaria/Options.py b/worlds/aquaria/Options.py index e16632fd4e7..9a49e915b9c 100644 --- a/worlds/aquaria/Options.py +++ b/worlds/aquaria/Options.py @@ -35,9 +35,7 @@ class TurtleRandomizer(Choice): class EarlyEnergyForm(DefaultOnToggle): - """ - Force the Energy Form to be in a location before leaving the areas around the Home Water. - """ + """ Force the Energy Form to be in a location early in the game """ display_name = "Early Energy Form" diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 60ebf6eed39..e0110b7feb3 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -1235,11 +1235,7 @@ def adjusting_rules(self, options: AquariaOptions) -> None: add_rule(self.multiworld.get_entrance("Home Water to Open water top left area", self.player), lambda state: _has_bind_song(state, self.player) and _has_energy_form(state, self.player)) if options.early_energy_form: - add_rule(self.multiworld.get_entrance("Home Water to Home water transturtle room", self.player), - lambda state: _has_energy_form(state, self.player)) - if options.early_energy_form: - add_rule(self.multiworld.get_entrance("Home Water to Open water top left area", self.player), - lambda state: _has_energy_form(state, self.player)) + self.multiworld.early_items[self.player]["Energy form"] = 1 if options.no_progression_hard_or_hidden_locations: self.__no_progression_hard_or_hidden_location() diff --git a/worlds/aquaria/test/test_energy_form_access.py b/worlds/aquaria/test/test_energy_form_access.py index 17fb8d3b454..d84a0ec9f3f 100644 --- a/worlds/aquaria/test/test_energy_form_access.py +++ b/worlds/aquaria/test/test_energy_form_access.py @@ -67,7 +67,6 @@ def test_energy_form_location(self) -> None: "First secret", "Sunken City cleared", "Objective complete", - ] items = [["Energy form"]] self.assertAccessDependency(locations, items) \ No newline at end of file diff --git a/worlds/aquaria/test/test_energy_form_access_option.py b/worlds/aquaria/test/test_energy_form_access_option.py deleted file mode 100644 index 4dcbce67701..00000000000 --- a/worlds/aquaria/test/test_energy_form_access_option.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -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) \ No newline at end of file From 70286d7d2166830081b15cb0c1010d96cc216d03 Mon Sep 17 00:00:00 2001 From: Louis M Date: Fri, 17 May 2024 19:43:05 -0400 Subject: [PATCH 56/56] Change 'bellow' by 'below' --- worlds/aquaria/Locations.py | 6 +++--- worlds/aquaria/Regions.py | 2 +- worlds/aquaria/test/__init__.py | 4 ++-- worlds/aquaria/test/test_bind_song_access.py | 2 +- worlds/aquaria/test/test_bind_song_option_access.py | 2 +- worlds/aquaria/test/test_energy_form_access.py | 2 +- worlds/aquaria/test/test_li_song_access.py | 2 +- worlds/aquaria/test/test_nature_form_access.py | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/worlds/aquaria/Locations.py b/worlds/aquaria/Locations.py index f75f936e4b3..e4f6f104ccf 100644 --- a/worlds/aquaria/Locations.py +++ b/worlds/aquaria/Locations.py @@ -43,7 +43,7 @@ class AquariaLocations: 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 path below 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, @@ -226,7 +226,7 @@ class AquariaLocations: "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, + "Mithalas cathedral right area, urn below the left entrance": 698198, } locations_cathedral_underground = { @@ -457,7 +457,7 @@ class AquariaLocations: 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 below 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, } diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index e0110b7feb3..5956e0ca842 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -1118,7 +1118,7 @@ def __adjusting_manual_rules(self) -> None: self.player), lambda state: _has_energy_form(state, self.player)) add_rule(self.multiworld.get_location("Home water, bulb in the bottom left room", self.player), lambda state: _has_bind_song(state, self.player)) - add_rule(self.multiworld.get_location("Home water, bulb in the path bellow Nautilus Prime", self.player), + add_rule(self.multiworld.get_location("Home water, bulb in the path below Nautilus Prime", self.player), lambda state: _has_bind_song(state, self.player)) add_rule(self.multiworld.get_location("Naija's home, bulb after the energy door", self.player), lambda state: _has_energy_form(state, self.player)) diff --git a/worlds/aquaria/test/__init__.py b/worlds/aquaria/test/__init__.py index 33c6bf3cbcf..ba42ac6d2c5 100644 --- a/worlds/aquaria/test/__init__.py +++ b/worlds/aquaria/test/__init__.py @@ -82,7 +82,7 @@ "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", + "Mithalas cathedral right area, urn below 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", @@ -178,7 +178,7 @@ "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 below the water stream", "The body left area, bulb in the top path to the top face room", "The body left area, bulb in the bottom face room", "The body right area, bulb in the top face room", diff --git a/worlds/aquaria/test/test_bind_song_access.py b/worlds/aquaria/test/test_bind_song_access.py index b3a5c95c4d2..b137d48ca9c 100644 --- a/worlds/aquaria/test/test_bind_song_access.py +++ b/worlds/aquaria/test/test_bind_song_access.py @@ -18,7 +18,7 @@ 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 path below Nautilus Prime", "Home water, bulb in the bottom left room", "Home water, Nautilus Egg", "Song cave, Verse egg", diff --git a/worlds/aquaria/test/test_bind_song_option_access.py b/worlds/aquaria/test/test_bind_song_option_access.py index 9405b83e8e1..522a064b625 100644 --- a/worlds/aquaria/test/test_bind_song_option_access.py +++ b/worlds/aquaria/test/test_bind_song_option_access.py @@ -24,7 +24,7 @@ def test_bind_song_location(self) -> None: "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 path below Nautilus Prime", "Home water, bulb in the bottom left room", "Home water, Nautilus Egg", "Song cave, Verse egg", diff --git a/worlds/aquaria/test/test_energy_form_access.py b/worlds/aquaria/test/test_energy_form_access.py index d84a0ec9f3f..edfe8a3f6c1 100644 --- a/worlds/aquaria/test/test_energy_form_access.py +++ b/worlds/aquaria/test/test_energy_form_access.py @@ -39,7 +39,7 @@ def test_energy_form_location(self) -> None: "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", + "Mithalas cathedral right area, urn below 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", diff --git a/worlds/aquaria/test/test_li_song_access.py b/worlds/aquaria/test/test_li_song_access.py index 74f385ab788..e26d5b5fcd9 100644 --- a/worlds/aquaria/test/test_li_song_access.py +++ b/worlds/aquaria/test/test_li_song_access.py @@ -27,7 +27,7 @@ def test_li_song_location(self) -> None: "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 below the water stream", "The body left area, bulb in the top path to the top face room", "The body left area, bulb in the bottom face room", "The body right area, bulb in the top face room", diff --git a/worlds/aquaria/test/test_nature_form_access.py b/worlds/aquaria/test/test_nature_form_access.py index 07d4377b33b..89e7ceecbbd 100644 --- a/worlds/aquaria/test/test_nature_form_access.py +++ b/worlds/aquaria/test/test_nature_form_access.py @@ -41,7 +41,7 @@ def test_nature_form_location(self) -> None: "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 below the water stream", "The body left area, bulb in the top path to the top face room", "The body left area, bulb in the bottom face room", "The body right area, bulb in the top face room",