#include "container.h" #include #include "util/naming.h" namespace com::fourisland::lingo2_archipelago { uint64_t Container::FindOrAddMap(std::string map_name) { auto it = map_id_by_name_.find(map_name); if (it == map_id_by_name_.end()) { uint64_t new_id = all_objects_.maps_size(); Map* map = all_objects_.add_maps(); map->set_id(new_id); map->set_name(map_name); map_id_by_name_[map_name] = new_id; return new_id; } else { return it->second; } } uint64_t Container::FindOrAddRoom(std::optional map_name, std::string room_name, std::optional map_fallback) { if (!map_name) { if (!map_fallback) { std::cout << "No map name provided for " << room_name << std::endl; map_name = "global"; } else { map_name = map_fallback; } } auto& map_container = room_id_by_map_room_names_[*map_name]; auto it = map_container.find(room_name); if (it == map_container.end()) { uint64_t new_id = all_objects_.rooms_size(); Room* room = all_objects_.add_rooms(); room->set_id(new_id); room->set_map_id(FindOrAddMap(*map_name)); room->set_name(room_name); map_container[room_name] = new_id; return new_id; } else { return it->second; } } uint64_t Container::FindOrAddPainting( std::optional map_name, std::optional room_name, std::string painting_name, std::optional map_fallback, std::optional room_fallback) { if (!map_name) { if (!map_fallback) { std::cout << "No map name provided for " << painting_name << std::endl; map_name = "global"; } else { map_name = map_fallback; } } if (!room_name) { if (!room_fallback) { std::cout << "No room name provided for " << painting_name << std::endl; room_name = "global"; } else { room_name = room_fallback; } } auto& room_container = painting_id_by_map_room_painting_names_[*map_name][*room_name]; auto it = room_container.find(painting_name); if (it == room_container.end()) { uint64_t new_id = all_objects_.paintings_size(); PaintingData* painting = all_objects_.add_paintings(); painting->set_id(new_id); painting->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); painting->set_name(painting_name); room_container[painting_name] = new_id; return new_id; } else { return it->second; } } uint64_t Container::FindOrAddPort(std::optional map_name, std::optional room_name, std::string port_name, std::optional map_fallback, std::optional room_fallback) { if (!map_name) { if (!map_fallback) { std::cout << "No map name provided for " << port_name << std::endl; map_name = "global"; } else { map_name = map_fallback; } } if (!room_name) { if (!room_fallback) { std::cout << "No room name provided for " << port_name << std::endl; room_name = "global"; } else { room_name = room_fallback; } } auto& room_container = port_id_by_map_room_port_names_[*map_name][*room_name]; auto it = room_container.find(port_name); if (it == room_container.end()) { uint64_t new_id = all_objects_.ports_size(); Port* port = all_objects_.add_ports(); port->set_id(new_id); port->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); port->set_name(port_name); room_container[port_name] = new_id; return new_id; } else { return it->second; } } uint64_t Container::FindOrAddPanel(std::optional map_name, std::optional room_name, std::string panel_name, std::optional map_fallback, std::optional room_fallback) { if (!map_name) { if (!map_fallback) { std::cout << "No map name provided for " << panel_name << std::endl; map_name = "global"; } else { map_name = map_fallback; } } if (!room_name) { if (!room_fallback) { std::cout << "No room name provided for " << panel_name << std::endl; room_name = "global"; } else { room_name = room_fallback; } } auto& room_container = panel_id_by_map_room_panel_names_[*map_name][*room_name]; auto it = room_container.find(panel_name); if (it == room_container.end()) { uint64_t new_id = all_objects_.panels_size(); PanelData* panel = all_objects_.add_panels(); panel->set_id(new_id); panel->set_room_id(FindOrAddRoom(map_name, *room_name, std::nullopt)); panel->set_name(panel_name); room_container[panel_name] = new_id; return new_id; } else
func on_map_load(root):
	var ap = global.get_node("Archipelago")

	# Add the mastery to Icarus.
	if ap.enable_icarus:
		var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
		var saver_prefab = preload("res://objects/nodes/saver.tscn")
		var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
		var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")

		var mastery = collectable_prefab.instantiate()
		mastery.name = "collectable"
		mastery.position = Vector3(0, -2000, 0)
		mastery.unlock_type = "smiley"
		mastery.material_override = load("res://assets/materials/gold.material")
		root.get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)

		var tpl = tpl_prefab.instantiate()
		tpl.teleport_point = Vector3(56.25, 0, -5.5)
		tpl.teleport_rotate = Vector3(0, 0, 0)
		tpl.target_path = mastery
		tpl.name = "Teleport"
		tpl.senderGroup.append(NodePath("/root/scene/Panels"))
		tpl.nested = true
		mastery.add_child.call_deferred(tpl)

		var usl = usl_prefab.instantiate()
		usl.name = "unlockSetterListenerMastery"
		usl.key = "icarus_mastery"
		usl.value = "unlocked"
		usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
		root.get_node("/root/scene/Components").add_child.call_deferred(usl)

		var saver = saver_prefab.instantiate()
		saver.name = "saver_collectables"
		saver.type = "collectables"
		saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
		root.get_node("/root/scene").add_child.call_deferred(saver)