mirror of
https://github.com/ArchipelagoMW/Archipelago.git
synced 2026-05-27 13:59:56 -07:00
Core: move PlandoConnections and PlandoTexts to the options system (#2904)
Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> Co-authored-by: Scipio Wright <scipiowright@gmail.com> Co-authored-by: beauxq <beauxq@yahoo.com> Co-authored-by: alwaysintreble <mmmcheese158@gmail.com>
This commit is contained in:
+25
-2
@@ -1,8 +1,11 @@
|
||||
import typing
|
||||
|
||||
from BaseClasses import MultiWorld
|
||||
from Options import Choice, Range, Option, Toggle, DefaultOnToggle, DeathLink, StartInventoryPool, PlandoBosses,\
|
||||
FreeText, Removed
|
||||
from Options import Choice, Range, Option, Toggle, DefaultOnToggle, DeathLink, \
|
||||
StartInventoryPool, PlandoBosses, PlandoConnections, PlandoTexts, FreeText, Removed
|
||||
from .EntranceShuffle import default_connections, default_dungeon_connections, \
|
||||
inverted_default_connections, inverted_default_dungeon_connections
|
||||
from .Text import TextTable
|
||||
|
||||
|
||||
class GlitchesRequired(Choice):
|
||||
@@ -721,7 +724,27 @@ class AllowCollect(DefaultOnToggle):
|
||||
display_name = "Allow Collection of checks for other players"
|
||||
|
||||
|
||||
class ALttPPlandoConnections(PlandoConnections):
|
||||
entrances = set([connection[0] for connection in (
|
||||
*default_connections, *default_dungeon_connections, *inverted_default_connections,
|
||||
*inverted_default_dungeon_connections)])
|
||||
exits = set([connection[1] for connection in (
|
||||
*default_connections, *default_dungeon_connections, *inverted_default_connections,
|
||||
*inverted_default_dungeon_connections)])
|
||||
|
||||
|
||||
class ALttPPlandoTexts(PlandoTexts):
|
||||
"""Text plando. Format is:
|
||||
- text: 'This is your text'
|
||||
at: text_key
|
||||
percentage: 100
|
||||
Percentage is an integer from 1 to 100, and defaults to 100 when omitted."""
|
||||
valid_keys = TextTable.valid_keys
|
||||
|
||||
|
||||
alttp_options: typing.Dict[str, type(Option)] = {
|
||||
"plando_connections": ALttPPlandoConnections,
|
||||
"plando_texts": ALttPPlandoTexts,
|
||||
"start_inventory_from_pool": StartInventoryPool,
|
||||
"goal": Goal,
|
||||
"mode": Mode,
|
||||
|
||||
+2
-2
@@ -2538,12 +2538,12 @@ def write_strings(rom, world, player):
|
||||
tt['menu_start_2'] = "{MENU}\n{SPEED0}\n≥@'s house\n Dark Chapel\n{CHOICE3}"
|
||||
tt['menu_start_3'] = "{MENU}\n{SPEED0}\n≥@'s house\n Dark Chapel\n Mountain Cave\n{CHOICE2}"
|
||||
|
||||
for at, text in world.plando_texts[player].items():
|
||||
for at, text, _ in world.plando_texts[player]:
|
||||
|
||||
if at not in tt:
|
||||
raise Exception(f"No text target \"{at}\" found.")
|
||||
else:
|
||||
tt[at] = text
|
||||
tt[at] = "\n".join(text)
|
||||
|
||||
rom.write_bytes(0xE0000, tt.getBytes())
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ from worlds.generic.Rules import add_rule
|
||||
|
||||
from BaseClasses import CollectionState
|
||||
from .SubClasses import ALttPLocation
|
||||
from .EntranceShuffle import door_addresses
|
||||
|
||||
from .Items import item_name_groups
|
||||
from .Options import small_key_shuffle, RandomizeShopInventories
|
||||
|
||||
from .StateHelpers import has_hearts, can_use_bombs, can_hold_arrows
|
||||
|
||||
logger = logging.getLogger("Shops")
|
||||
@@ -66,6 +66,7 @@ class Shop:
|
||||
return 0
|
||||
|
||||
def get_bytes(self) -> List[int]:
|
||||
from .EntranceShuffle import door_addresses
|
||||
# [id][roomID-low][roomID-high][doorID][zero][shop_config][shopkeeper_config][sram_index]
|
||||
entrances = self.region.entrances
|
||||
config = self.item_count
|
||||
@@ -181,7 +182,7 @@ def push_shop_inventories(multiworld):
|
||||
|
||||
|
||||
def create_shops(multiworld, player: int):
|
||||
|
||||
from .Options import RandomizeShopInventories
|
||||
player_shop_table = shop_table.copy()
|
||||
if multiworld.include_witch_hut[player]:
|
||||
player_shop_table["Potion Shop"] = player_shop_table["Potion Shop"]._replace(locked=False)
|
||||
@@ -304,6 +305,7 @@ shop_generation_types = {
|
||||
|
||||
|
||||
def set_up_shops(multiworld, player: int):
|
||||
from .Options import small_key_shuffle
|
||||
# TODO: move hard+ mode changes for shields here, utilizing the new shops
|
||||
|
||||
if multiworld.retro_bow[player]:
|
||||
@@ -426,7 +428,7 @@ def get_price_modifier(item):
|
||||
|
||||
def get_price(multiworld, item, player: int, price_type=None):
|
||||
"""Converts a raw Rupee price into a special price type"""
|
||||
|
||||
from .Options import small_key_shuffle
|
||||
if price_type:
|
||||
price_types = [price_type]
|
||||
else:
|
||||
|
||||
@@ -1289,6 +1289,415 @@ class LargeCreditBottomMapper(CharTextMapper):
|
||||
class TextTable(object):
|
||||
SIZE = 0x7355
|
||||
|
||||
valid_keys = [
|
||||
"set_cursor",
|
||||
"set_cursor2",
|
||||
"game_over_menu",
|
||||
"var_test",
|
||||
"follower_no_enter",
|
||||
"choice_1_3",
|
||||
"choice_2_3",
|
||||
"choice_3_3",
|
||||
"choice_1_2",
|
||||
"choice_2_2",
|
||||
"uncle_leaving_text",
|
||||
"uncle_dying_sewer",
|
||||
"tutorial_guard_1",
|
||||
"tutorial_guard_2",
|
||||
"tutorial_guard_3",
|
||||
"tutorial_guard_4",
|
||||
"tutorial_guard_5",
|
||||
"tutorial_guard_6",
|
||||
"tutorial_guard_7",
|
||||
"priest_sanctuary_before_leave",
|
||||
"sanctuary_enter",
|
||||
"zelda_sanctuary_story",
|
||||
"priest_sanctuary_before_pendants",
|
||||
"priest_sanctuary_after_pendants_before_master_sword",
|
||||
"priest_sanctuary_dying",
|
||||
"zelda_save_sewers",
|
||||
"priest_info",
|
||||
"zelda_sanctuary_before_leave",
|
||||
"telepathic_intro",
|
||||
"telepathic_reminder",
|
||||
"zelda_go_to_throne",
|
||||
"zelda_push_throne",
|
||||
"zelda_switch_room_pull",
|
||||
"zelda_save_lets_go",
|
||||
"zelda_save_repeat",
|
||||
"zelda_before_pendants",
|
||||
"zelda_after_pendants_before_master_sword",
|
||||
"telepathic_zelda_right_after_master_sword",
|
||||
"zelda_sewers",
|
||||
"zelda_switch_room",
|
||||
"kakariko_saharalasa_wife",
|
||||
"kakariko_saharalasa_wife_sword_story",
|
||||
"kakariko_saharalasa_wife_closing",
|
||||
"kakariko_saharalasa_after_master_sword",
|
||||
"kakariko_alert_guards",
|
||||
"sahasrahla_quest_have_pendants",
|
||||
"sahasrahla_quest_have_master_sword",
|
||||
"sahasrahla_quest_information",
|
||||
"sahasrahla_bring_courage",
|
||||
"sahasrahla_have_ice_rod",
|
||||
"telepathic_sahasrahla_beat_agahnim",
|
||||
"telepathic_sahasrahla_beat_agahnim_no_pearl",
|
||||
"sahasrahla_have_boots_no_icerod",
|
||||
"sahasrahla_have_courage",
|
||||
"sahasrahla_found",
|
||||
"sign_rain_north_of_links_house",
|
||||
"sign_north_of_links_house",
|
||||
"sign_path_to_death_mountain",
|
||||
"sign_lost_woods",
|
||||
"sign_zoras",
|
||||
"sign_outside_magic_shop",
|
||||
"sign_death_mountain_cave_back",
|
||||
"sign_east_of_links_house",
|
||||
"sign_south_of_lumberjacks",
|
||||
"sign_east_of_desert",
|
||||
"sign_east_of_sanctuary",
|
||||
"sign_east_of_castle",
|
||||
"sign_north_of_lake",
|
||||
"sign_desert_thief",
|
||||
"sign_lumberjacks_house",
|
||||
"sign_north_kakariko",
|
||||
"witch_bring_mushroom",
|
||||
"witch_brewing_the_item",
|
||||
"witch_assistant_no_bottle",
|
||||
"witch_assistant_no_empty_bottle",
|
||||
"witch_assistant_informational",
|
||||
"witch_assistant_no_bottle_buying",
|
||||
"potion_shop_no_empty_bottles",
|
||||
"item_get_lamp",
|
||||
"item_get_boomerang",
|
||||
"item_get_bow",
|
||||
"item_get_shovel",
|
||||
"item_get_magic_cape",
|
||||
"item_get_powder",
|
||||
"item_get_flippers",
|
||||
"item_get_power_gloves",
|
||||
"item_get_pendant_courage",
|
||||
"item_get_pendant_power",
|
||||
"item_get_pendant_wisdom",
|
||||
"item_get_mushroom",
|
||||
"item_get_book",
|
||||
"item_get_moonpearl",
|
||||
"item_get_compass",
|
||||
"item_get_map",
|
||||
"item_get_ice_rod",
|
||||
"item_get_fire_rod",
|
||||
"item_get_ether",
|
||||
"item_get_bombos",
|
||||
"item_get_quake",
|
||||
"item_get_hammer",
|
||||
"item_get_flute",
|
||||
"item_get_cane_of_somaria",
|
||||
"item_get_hookshot",
|
||||
"item_get_bombs",
|
||||
"item_get_bottle",
|
||||
"item_get_big_key",
|
||||
"item_get_titans_mitts",
|
||||
"item_get_magic_mirror",
|
||||
"item_get_fake_mastersword",
|
||||
"post_item_get_mastersword",
|
||||
"item_get_red_potion",
|
||||
"item_get_green_potion",
|
||||
"item_get_blue_potion",
|
||||
"item_get_bug_net",
|
||||
"item_get_blue_mail",
|
||||
"item_get_red_mail",
|
||||
"item_get_temperedsword",
|
||||
"item_get_mirror_shield",
|
||||
"item_get_cane_of_byrna",
|
||||
"missing_big_key",
|
||||
"missing_magic",
|
||||
"item_get_pegasus_boots",
|
||||
"talking_tree_info_start",
|
||||
"talking_tree_info_1",
|
||||
"talking_tree_info_2",
|
||||
"talking_tree_info_3",
|
||||
"talking_tree_info_4",
|
||||
"talking_tree_other",
|
||||
"item_get_pendant_power_alt",
|
||||
"item_get_pendant_wisdom_alt",
|
||||
"game_shooting_choice",
|
||||
"game_shooting_yes",
|
||||
"game_shooting_no",
|
||||
"game_shooting_continue",
|
||||
"pond_of_wishing",
|
||||
"pond_item_select",
|
||||
"pond_item_test",
|
||||
"pond_will_upgrade",
|
||||
"pond_item_test_no",
|
||||
"pond_item_test_no_no",
|
||||
"pond_item_boomerang",
|
||||
"pond_item_shield",
|
||||
"pond_item_silvers",
|
||||
"pond_item_bottle_filled",
|
||||
"pond_item_sword",
|
||||
"pond_of_wishing_happiness",
|
||||
"pond_of_wishing_choice",
|
||||
"pond_of_wishing_bombs",
|
||||
"pond_of_wishing_arrows",
|
||||
"pond_of_wishing_full_upgrades",
|
||||
"mountain_old_man_first",
|
||||
"mountain_old_man_deadend",
|
||||
"mountain_old_man_turn_right",
|
||||
"mountain_old_man_lost_and_alone",
|
||||
"mountain_old_man_drop_off",
|
||||
"mountain_old_man_in_his_cave_pre_agahnim",
|
||||
"mountain_old_man_in_his_cave",
|
||||
"mountain_old_man_in_his_cave_post_agahnim",
|
||||
"tavern_old_man_awake",
|
||||
"tavern_old_man_unactivated_flute",
|
||||
"tavern_old_man_know_tree_unactivated_flute",
|
||||
"tavern_old_man_have_flute",
|
||||
"chicken_hut_lady",
|
||||
"running_man",
|
||||
"game_race_sign",
|
||||
"sign_bumper_cave",
|
||||
"sign_catfish",
|
||||
"sign_north_village_of_outcasts",
|
||||
"sign_south_of_bumper_cave",
|
||||
"sign_east_of_pyramid",
|
||||
"sign_east_of_bomb_shop",
|
||||
"sign_east_of_mire",
|
||||
"sign_village_of_outcasts",
|
||||
"sign_before_wishing_pond",
|
||||
"sign_before_catfish_area",
|
||||
"castle_wall_guard",
|
||||
"gate_guard",
|
||||
"telepathic_tile_eastern_palace",
|
||||
"telepathic_tile_tower_of_hera_floor_4",
|
||||
"hylian_text_1",
|
||||
"mastersword_pedestal_translated",
|
||||
"telepathic_tile_spectacle_rock",
|
||||
"telepathic_tile_swamp_entrance",
|
||||
"telepathic_tile_thieves_town_upstairs",
|
||||
"telepathic_tile_misery_mire",
|
||||
"hylian_text_2",
|
||||
"desert_entry_translated",
|
||||
"telepathic_tile_under_ganon",
|
||||
"telepathic_tile_palace_of_darkness",
|
||||
"telepathic_tile_desert_bonk_torch_room",
|
||||
"telepathic_tile_castle_tower",
|
||||
"telepathic_tile_ice_large_room",
|
||||
"telepathic_tile_turtle_rock",
|
||||
"telepathic_tile_ice_entrance",
|
||||
"telepathic_tile_ice_stalfos_knights_room",
|
||||
"telepathic_tile_tower_of_hera_entrance",
|
||||
"houlihan_room",
|
||||
"caught_a_bee",
|
||||
"caught_a_fairy",
|
||||
"no_empty_bottles",
|
||||
"game_race_boy_time",
|
||||
"game_race_girl",
|
||||
"game_race_boy_success",
|
||||
"game_race_boy_failure",
|
||||
"game_race_boy_already_won",
|
||||
"game_race_boy_sneaky",
|
||||
"bottle_vendor_choice",
|
||||
"bottle_vendor_get",
|
||||
"bottle_vendor_no",
|
||||
"bottle_vendor_already_collected",
|
||||
"bottle_vendor_bee",
|
||||
"bottle_vendor_fish",
|
||||
"hobo_item_get_bottle",
|
||||
"blacksmiths_what_you_want",
|
||||
"blacksmiths_paywall",
|
||||
"blacksmiths_extra_okay",
|
||||
"blacksmiths_tempered_already",
|
||||
"blacksmiths_temper_no",
|
||||
"blacksmiths_bogart_sword",
|
||||
"blacksmiths_get_sword",
|
||||
"blacksmiths_shop_before_saving",
|
||||
"blacksmiths_shop_saving",
|
||||
"blacksmiths_collect_frog",
|
||||
"blacksmiths_still_working",
|
||||
"blacksmiths_saving_bows",
|
||||
"blacksmiths_hammer_anvil",
|
||||
"dark_flute_boy_storytime",
|
||||
"dark_flute_boy_get_shovel",
|
||||
"dark_flute_boy_no_get_shovel",
|
||||
"dark_flute_boy_flute_not_found",
|
||||
"dark_flute_boy_after_shovel_get",
|
||||
"shop_fortune_teller_lw_hint_0",
|
||||
"shop_fortune_teller_lw_hint_1",
|
||||
"shop_fortune_teller_lw_hint_2",
|
||||
"shop_fortune_teller_lw_hint_3",
|
||||
"shop_fortune_teller_lw_hint_4",
|
||||
"shop_fortune_teller_lw_hint_5",
|
||||
"shop_fortune_teller_lw_hint_6",
|
||||
"shop_fortune_teller_lw_hint_7",
|
||||
"shop_fortune_teller_lw_no_rupees",
|
||||
"shop_fortune_teller_lw",
|
||||
"shop_fortune_teller_lw_post_hint",
|
||||
"shop_fortune_teller_lw_no",
|
||||
"shop_fortune_teller_lw_hint_8",
|
||||
"shop_fortune_teller_lw_hint_9",
|
||||
"shop_fortune_teller_lw_hint_10",
|
||||
"shop_fortune_teller_lw_hint_11",
|
||||
"shop_fortune_teller_lw_hint_12",
|
||||
"shop_fortune_teller_lw_hint_13",
|
||||
"shop_fortune_teller_lw_hint_14",
|
||||
"shop_fortune_teller_lw_hint_15",
|
||||
"dark_sanctuary",
|
||||
"dark_sanctuary_hint_0",
|
||||
"dark_sanctuary_no",
|
||||
"dark_sanctuary_hint_1",
|
||||
"dark_sanctuary_yes",
|
||||
"dark_sanctuary_hint_2",
|
||||
"sick_kid_no_bottle",
|
||||
"sick_kid_trade",
|
||||
"sick_kid_post_trade",
|
||||
"desert_thief_sitting",
|
||||
"desert_thief_following",
|
||||
"desert_thief_question",
|
||||
"desert_thief_question_yes",
|
||||
"desert_thief_after_item_get",
|
||||
"desert_thief_reassure",
|
||||
"hylian_text_3",
|
||||
"tablet_ether_book",
|
||||
"tablet_bombos_book",
|
||||
"magic_bat_wake",
|
||||
"magic_bat_give_half_magic",
|
||||
"intro_main",
|
||||
"intro_throne_room",
|
||||
"intro_zelda_cell",
|
||||
"intro_agahnim",
|
||||
"pickup_purple_chest",
|
||||
"bomb_shop",
|
||||
"bomb_shop_big_bomb",
|
||||
"bomb_shop_big_bomb_buy",
|
||||
"item_get_big_bomb",
|
||||
"kiki_second_extortion",
|
||||
"kiki_second_extortion_no",
|
||||
"kiki_second_extortion_yes",
|
||||
"kiki_first_extortion",
|
||||
"kiki_first_extortion_yes",
|
||||
"kiki_first_extortion_no",
|
||||
"kiki_leaving_screen",
|
||||
"blind_in_the_cell",
|
||||
"blind_by_the_light",
|
||||
"blind_not_that_way",
|
||||
"aginah_l1sword_no_book",
|
||||
"aginah_l1sword_with_pendants",
|
||||
"aginah",
|
||||
"aginah_need_better_sword",
|
||||
"aginah_have_better_sword",
|
||||
"catfish",
|
||||
"catfish_after_item",
|
||||
"lumberjack_right",
|
||||
"lumberjack_left",
|
||||
"lumberjack_left_post_agahnim",
|
||||
"fighting_brothers_right",
|
||||
"fighting_brothers_right_opened",
|
||||
"fighting_brothers_left",
|
||||
"maiden_crystal_1",
|
||||
"maiden_crystal_2",
|
||||
"maiden_crystal_3",
|
||||
"maiden_crystal_4",
|
||||
"maiden_crystal_5",
|
||||
"maiden_crystal_6",
|
||||
"maiden_crystal_7",
|
||||
"maiden_ending",
|
||||
"maiden_confirm_understood",
|
||||
"barrier_breaking",
|
||||
"maiden_crystal_7_again",
|
||||
"agahnim_zelda_teleport",
|
||||
"agahnim_magic_running_away",
|
||||
"agahnim_hide_and_seek_found",
|
||||
"agahnim_defeated",
|
||||
"agahnim_final_meeting",
|
||||
"zora_meeting",
|
||||
"zora_tells_cost",
|
||||
"zora_get_flippers",
|
||||
"zora_no_cash",
|
||||
"zora_no_buy_item",
|
||||
"kakariko_saharalasa_grandson",
|
||||
"kakariko_saharalasa_grandson_next",
|
||||
"dark_palace_tree_dude",
|
||||
"fairy_wishing_ponds",
|
||||
"fairy_wishing_ponds_no",
|
||||
"pond_of_wishing_no",
|
||||
"pond_of_wishing_return_item",
|
||||
"pond_of_wishing_throw",
|
||||
"pond_pre_item_silvers",
|
||||
"pond_of_wishing_great_luck",
|
||||
"pond_of_wishing_good_luck",
|
||||
"pond_of_wishing_meh_luck",
|
||||
"pond_of_wishing_bad_luck",
|
||||
"pond_of_wishing_fortune",
|
||||
"item_get_14_heart",
|
||||
"item_get_24_heart",
|
||||
"item_get_34_heart",
|
||||
"item_get_whole_heart",
|
||||
"item_get_sanc_heart",
|
||||
"fairy_fountain_refill",
|
||||
"death_mountain_bullied_no_pearl",
|
||||
"death_mountain_bullied_with_pearl",
|
||||
"death_mountain_bully_no_pearl",
|
||||
"death_mountain_bully_with_pearl",
|
||||
"shop_darkworld_enter",
|
||||
"game_chest_village_of_outcasts",
|
||||
"game_chest_no_cash",
|
||||
"game_chest_not_played",
|
||||
"game_chest_played",
|
||||
"game_chest_village_of_outcasts_play",
|
||||
"shop_first_time",
|
||||
"shop_already_have",
|
||||
"shop_buy_shield",
|
||||
"shop_buy_red_potion",
|
||||
"shop_buy_arrows",
|
||||
"shop_buy_bombs",
|
||||
"shop_buy_bee",
|
||||
"shop_buy_heart",
|
||||
"shop_first_no_bottle_buy",
|
||||
"shop_buy_no_space",
|
||||
"ganon_fall_in",
|
||||
"ganon_phase_3",
|
||||
"lost_woods_thief",
|
||||
"blinds_hut_dude",
|
||||
"end_triforce",
|
||||
"toppi_fallen",
|
||||
"kakariko_tavern_fisherman",
|
||||
"thief_money",
|
||||
"thief_desert_rupee_cave",
|
||||
"thief_ice_rupee_cave",
|
||||
"telepathic_tile_south_east_darkworld_cave",
|
||||
"cukeman",
|
||||
"cukeman_2",
|
||||
"potion_shop_no_cash",
|
||||
"kakariko_powdered_chicken",
|
||||
"game_chest_south_of_kakariko",
|
||||
"game_chest_play_yes",
|
||||
"game_chest_play_no",
|
||||
"game_chest_lost_woods",
|
||||
"kakariko_flophouse_man_no_flippers",
|
||||
"kakariko_flophouse_man",
|
||||
"menu_start_2",
|
||||
"menu_start_3",
|
||||
"menu_pause",
|
||||
"game_digging_choice",
|
||||
"game_digging_start",
|
||||
"game_digging_no_cash",
|
||||
"game_digging_end_time",
|
||||
"game_digging_come_back_later",
|
||||
"game_digging_no_follower",
|
||||
"menu_start_4",
|
||||
"ganon_fall_in_alt",
|
||||
"ganon_phase_3_alt",
|
||||
"sign_east_death_mountain_bridge",
|
||||
"fish_money",
|
||||
"sign_ganons_tower",
|
||||
"sign_ganon",
|
||||
"ganon_phase_3_no_bow",
|
||||
"ganon_phase_3_no_silvers_alt",
|
||||
"ganon_phase_3_no_silvers",
|
||||
"ganon_phase_3_silvers",
|
||||
"murahdahla",
|
||||
]
|
||||
|
||||
def __init__(self):
|
||||
self._text = OrderedDict()
|
||||
self.setDefaultText()
|
||||
|
||||
Reference in New Issue
Block a user