extends Node var SCRIPT_proto var objects var door_id_by_map_node_path = {} var painting_id_by_map_node_path = {} var panel_id_by_map_node_path = {} var port_id_by_map_node_path = {} var door_id_by_ap_id = {} var map_id_by_name = {} 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 func _init(proto_script): SCRIPT_proto = proto_script kSYMBOL_ITEMS = { SCRIPT_proto.PuzzleSymbol.SUN: "Sun Symbol", SCRIPT_proto.PuzzleSymbol.SPARKLES: "Sparkles Symbol", SCRIPT_proto.PuzzleSymbol.ZERO: "Zero Symbol", SCRIPT_proto.PuzzleSymbol.EXAMPLE: "Example Symbol", SCRIPT_proto.PuzzleSymbol.BOXES: "Boxes Symbol", SCRIPT_proto.PuzzleSymbol.PLANET: "Planet Symbol", SCRIPT_proto.PuzzleSymbol.PYRAMID: "Pyramid Symbol", SCRIPT_proto.PuzzleSymbol.CROSS: "Cross Symbol", SCRIPT_proto.PuzzleSymbol.SWEET: "Sweet Symbol", SCRIPT_proto.PuzzleSymbol.GENDER: "Gender Symbol", SCRIPT_proto.PuzzleSymbol.AGE: "Age Symbol", SCRIPT_proto.PuzzleSymbol.SOUND: "Sound Symbol", SCRIPT_proto.PuzzleSymbol.ANAGRAM: "Anagram Symbol", SCRIPT_proto.PuzzleSymbol.JOB: "Job Symbol", SCRIPT_proto.PuzzleSymbol.STARS: "Stars Symbol", SCRIPT_proto.PuzzleSymbol.NULL: "Null Symbol", SCRIPT_proto.PuzzleSymbol.EVAL: "Eval Symbol", SCRIPT_proto.PuzzleSymbol.LINGO: "Lingo Symbol", SCRIPT_proto.PuzzleSymbol.QUESTION: "Question Symbol", } func load(data_bytes): objects = SCRIPT_proto.AllObjects.new() var result_code = objects.from_bytes(data_bytes) if result_code != SCRIPT_proto.PB_ERR.NO_ERRORS: print("Could not load generated data: %d" % result_code) return for map in objects.get_maps(): map_id_by_name[map.get_name()] = map.get_id() for door in objects.get_doors(): var map = objects.get_maps()[door.get_map_id()] if not map.get_name() in door_id_by_map_node_path: door_id_by_map_node_path[map.get_name()] = {} var map_data = door_id_by_map_node_path[map.get_name()] for receiver in door.get_receivers(): map_data[receiver] = door.get_id() for painting_id in door.get_move_paintings(): var painting = objects.get_paintings()[painting_id] map_data[painting.get_path()] = door.get_id() 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()] var map = objects.get_maps()[room.get_map_id()] if not map.get_name() in painting_id_by_map_node_path: painting_id_by_map_node_path[map.get_name()] = {} var _map_data = painting_id_by_map_node_path[map.get_name()] for port in objects.get_ports(): var room = objects.get_rooms()[port.get_room_id()] var map = objects.get_maps()[room.get_map_id()] if not map.get_name() in port_id_by_map_node_path: port_id_by_map_node_path[map.get_name()] = {} var map_data = port_id_by_map_node_path[map.get_name()] map_data[port.get_path()] = port.get_id() for progressive in objects.get_progressives(): progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id() 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()] var map = objects.get_maps()[room.get_map_id()] if not map.get_name() in panel_id_by_map_node_path: panel_id_by_map_node_path[map.get_name()] = {} var map_data = panel_id_by_map_node_path[map.get_name()] map_data[panel.get_path()] = panel.get_id() for symbol_name in kSYMBOL_ITEMS.values(): symbol_item_ids.append(objects.get_special_ids()[symbol_name]) for special_name in objects.get_special_ids().keys(): if special_name.begins_with("Anti "): anti_trap_ids[objects.get_special_ids()[special_name]] = ( special_name.substr(5).to_lower() ) func get_door_for_map_node_path(map_name, node_path): if not door_id_by_map_node_path.has(map_name): return null var map_data = door_id_by_map_node_path[map_name] return map_data.get(node_path, null) func get_panel_for_map_node_path(map_name, node_path): if not panel_id_by_map_node_path.has(map_name): return null var map_data = panel_id_by_map_node_path[map_name] return map_data.get(node_path, null) func get_port_for_map_node_path(map_name, node_path): if not port_id_by_map_node_path.has(map_name): return null var map_data = port_id_by_map_node_path[map_name] return map_data.get(node_path, null) func get_door_ap_id(door_id): var door = objects.get_doors()[door_id] if door.has_ap_id(): return door.get_ap_id() else: return null func get_door_map_name(door_id): var door = objects.get_doors()[door_id] var room = objects.get_rooms()[door.get_room_id()] var map = objects.get_maps()[room.get_map_id()] return map.get_name() func get_door_receivers(door_id): var door = objects.get_doors()[door_id] return door.get_receivers() func get_worldport_display_name(port_id): var port = objects.get_ports()[port_id] return "%s - %s (Worldport)" % [_get_room_object_map_name(port), port.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()] )