From b524e153ad71e368afbe50da78c4b73c3ac65c5f Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 27 Sep 2025 11:10:07 -0400 Subject: Added accessible locations tab to game --- apworld/client/gamedata.gd | 120 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 4 deletions(-) (limited to 'apworld/client/gamedata.gd') diff --git a/apworld/client/gamedata.gd b/apworld/client/gamedata.gd index 9eeec3b..39e0583 100644 --- a/apworld/client/gamedata.gd +++ b/apworld/client/gamedata.gd @@ -13,6 +13,7 @@ var progressive_id_by_ap_id = {} var letter_id_by_ap_id = {} var symbol_item_ids = [] var anti_trap_ids = {} +var location_name_by_id = {} var kSYMBOL_ITEMS @@ -70,6 +71,7 @@ func load(data_bytes): if door.has_ap_id(): door_id_by_ap_id[door.get_ap_id()] = door.get_id() + location_name_by_id[door.get_ap_id()] = _get_door_location_name(door) for painting in objects.get_paintings(): var room = objects.get_rooms()[painting.get_room_id()] @@ -95,6 +97,17 @@ func load(data_bytes): for letter in objects.get_letters(): letter_id_by_ap_id[letter.get_ap_id()] = letter.get_id() + location_name_by_id[letter.get_ap_id()] = _get_letter_location_name(letter) + + for mastery in objects.get_masteries(): + location_name_by_id[mastery.get_ap_id()] = _get_mastery_location_name(mastery) + + for ending in objects.get_endings(): + location_name_by_id[ending.get_ap_id()] = _get_ending_location_name(ending) + + for keyholder in objects.get_keyholders(): + if keyholder.has_key(): + location_name_by_id[keyholder.get_ap_id()] = _get_keyholder_location_name(keyholder) for panel in objects.get_panels(): var room = objects.get_rooms()[panel.get_room_id()] @@ -153,7 +166,106 @@ func get_door_receivers(door_id): return door.get_receivers() -func get_door_map_name(door_id): - var door = objects.get_doors()[door_id] - var map = objects.get_maps()[door.get_map_id()] - return map.get_name() +func _get_map_object_map_name(obj): + return objects.get_maps()[obj.get_map_id()].get_display_name() + + +func _get_room_object_map_name(obj): + return _get_map_object_map_name(objects.get_rooms()[obj.get_room_id()]) + + +func _get_room_object_location_prefix(obj): + var room = objects.get_rooms()[obj.get_room_id()] + var game_map = objects.get_maps()[room.get_map_id()] + + if room.has_panel_display_name(): + return "%s (%s)" % [game_map.get_display_name(), room.get_panel_display_name()] + else: + return game_map.get_display_name() + + +func _get_door_location_name(door): + var map_part = _get_room_object_location_prefix(door) + + if door.has_location_name(): + return "%s - %s" % [map_part, door.get_location_name()] + + var generated_location_name = _get_generated_door_location_name(door) + if generated_location_name != null: + return generated_location_name + + return "%s - %s" % [map_part, door.get_name()] + + +func _get_generated_door_location_name(door): + if door.get_type() != SCRIPT_proto.DoorType.STANDARD: + return null + + if door.get_keyholders().size() > 0 or door.get_endings().size() > 0 or door.has_complete_at(): + return null + + if door.get_panels().size() > 4: + return null + + var map_areas = [] + for panel_id in door.get_panels(): + var panel = objects.get_panels()[panel_id.get_panel()] + var panel_room = objects.get_rooms()[panel.get_room_id()] + # It's okay if panel_display_name is not present because then it's coalesced with other unnamed areas. + if not map_areas.has(panel_room.get_panel_display_name()): + map_areas.append(panel_room.get_panel_display_name()) + + if map_areas.size() > 1: + return null + + var game_map = objects.get_maps()[door.get_map_id()] + var map_area = map_areas[0] + var map_part + if map_area == "": + map_part = game_map.get_display_name() + else: + map_part = "%s (%s)" % [game_map.get_display_name(), map_area] + + var panel_names = [] + for panel_id in door.get_panels(): + var panel_data = objects.get_panels()[panel_id.get_panel()] + var panel_name + if panel_data.has_display_name(): + panel_name = panel_data.get_display_name() + else: + panel_name = panel_data.get_name() + + var location_part + if panel_id.has_answer(): + location_part = "%s/%s" % [panel_name, panel_id.get_answer().to_upper()] + else: + location_part = panel_name + + panel_names.append(location_part) + + panel_names.sort() + + return map_part + " - " + ", ".join(panel_names) + + +func _get_letter_location_name(letter): + var letter_level = 2 if letter.get_level2() else 1 + var letter_name = "%s%d" % [letter.get_key().to_upper(), letter_level] + return "%s - %s" % [_get_room_object_map_name(letter), letter_name] + + +func _get_mastery_location_name(mastery): + return "%s - Mastery" % _get_room_object_map_name(mastery) + + +func _get_ending_location_name(ending): + return ( + "%s - %s Ending" % [_get_room_object_map_name(ending), ending.get_name().to_pascal_case()] + ) + + +func _get_keyholder_location_name(keyholder): + return ( + "%s - %s Keyholder" + % [_get_room_object_location_prefix(keyholder), keyholder.get_key().to_upper()] + ) -- cgit 1.4.1