From 6d8b971e7824dd6486bb4cb5a0f72eda7c5e47d3 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 1 Aug 2023 17:11:10 -0400 Subject: Gamedata is generated from main AP yaml We now also include static data that was previously sent in slot data. --- Archipelago/client.gd | 49 +++-------- Archipelago/load.gd | 55 ++++++------ util/generate_gamedata.rb | 215 ++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 224 insertions(+), 95 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index a816c42..a4ffb1b 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -73,12 +73,6 @@ var _players = [] var _player_name_by_slot = {} var _checked_locations = [] var _slot_data = {} -var _door_ids_by_item = {} -var _mentioned_doors = [] -var _painting_ids_by_item = {} -var _mentioned_paintings = [] -var _panel_ids_by_location = {} -var _paintings = {} var _paintings_mapping = {} var _localdata_file = "" var _death_link = false @@ -230,25 +224,6 @@ func _on_data(): for player in _players: _player_name_by_slot[player["slot"]] = player["alias"] - if _slot_data.has("door_ids_by_item_id"): - _door_ids_by_item = _slot_data["door_ids_by_item_id"] - - _mentioned_doors = [] - for item in _door_ids_by_item.values(): - for door in item: - _mentioned_doors.append(door) - if _slot_data.has("painting_ids_by_item_id"): - _painting_ids_by_item = _slot_data["painting_ids_by_item_id"] - - _mentioned_paintings = [] - for item in _painting_ids_by_item.values(): - for painting in item: - _mentioned_paintings.append(painting) - if _slot_data.has("panel_ids_by_location_id"): - _panel_ids_by_location = _slot_data["panel_ids_by_location_id"] - if _slot_data.has("paintings"): - _paintings = _slot_data["paintings"] - _death_link = _slot_data.has("death_link") and _slot_data["death_link"] if _death_link: sendConnectUpdate(["DeathLink"]) @@ -260,7 +235,7 @@ func _on_data(): if _slot_data.has("shuffle_doors"): _door_shuffle = (_slot_data["shuffle_doors"] > 0) if _slot_data.has("shuffle_paintings"): - _painting_shuffle = (_slot_data["shuffle_paintings"] > 0) + _painting_shuffle = _slot_data["shuffle_paintings"] if _slot_data.has("shuffle_panels"): _panel_shuffle = _slot_data["shuffle_panels"] if _slot_data.has("seed"): @@ -585,17 +560,21 @@ func processItem(item, index, from, flags): global._print(item) - var stringified = String(item) - if _door_ids_by_item.has(stringified): + var gamedata = $Gamedata + var item_name = "Unknown" + if _item_id_to_name.has(item): + item_name = _item_id_to_name[item] + + if gamedata.door_ids_by_item_id.has(item_name): var doorsNode = get_tree().get_root().get_node("Spatial/Doors") - for door_id in _door_ids_by_item[stringified]: + for door_id in gamedata.door_ids_by_item_id[item_name]: doorsNode.get_node(door_id).openDoor() - if _painting_ids_by_item.has(stringified): + if gamedata.painting_ids_by_item_id.has(item_name): var real_parent_node = get_tree().get_root().get_node("Spatial/Decorations/Paintings") var fake_parent_node = get_tree().get_root().get_node_or_null("Spatial/AP_Paintings") - for painting_id in _painting_ids_by_item[stringified]: + for painting_id in gamedata.painting_ids_by_item_id[item_name]: var painting_node = real_parent_node.get_node_or_null(painting_id) if painting_node != null: painting_node.movePainting() @@ -606,10 +585,6 @@ func processItem(item, index, from, flags): painting_node.get_node("Script").movePainting() # Handle progressive items. - var item_name = "Unknown" - if _item_id_to_name.has(item): - item_name = _item_id_to_name[item] - if item_name in progressive_items.keys(): if not item_name in _progressive_progress: _progressive_progress[item_name] = 0 @@ -659,11 +634,11 @@ func processItem(item, index, from, flags): func doorIsVanilla(door): - return !_mentioned_doors.has(door) + return !$Gamedata.mentioned_doors.has(door) func paintingIsVanilla(painting): - return !_mentioned_paintings.has(painting) + return !$Gamedata.mentioned_paintings.has(painting) func evaluateSolvability(): diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 0157395..95f0fb8 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd @@ -93,27 +93,31 @@ func _load(): # This is the best time to create the location nodes, since the map is now # loaded but the panels haven't been solved from the save file yet. + var gamedata = apclient.get_node("Gamedata") var panels_parent = self.get_node("Panels") var location_script = ResourceLoader.load("user://maps/Archipelago/location.gd") - for location_id in apclient._panel_ids_by_location.keys(): - var location = location_script.new() - location.ap_id = int(location_id) - location.name = "AP_location_" + location.ap_id - self.add_child(location) - - var panels = apclient._panel_ids_by_location[String(location.ap_id)] - location.total = panels.size() - - for panel in panels: - var that_panel - if panel.begins_with("EndPanel"): - that_panel = self.get_node("Decorations").get_node(panel) - else: - that_panel = panels_parent.get_node(panel) - - that_panel.get_node("Viewport/GUI/Panel/TextEdit").connect( - "answer_correct", location, "handle_correct" - ) + for location_id in gamedata.panel_ids_by_location_id.keys(): + if apclient._location_name_to_id.has(location_id): + var location = location_script.new() + location.ap_id = int(apclient._location_name_to_id[location_id]) + location.name = "AP_location_%d" % location.ap_id + self.add_child(location) + + var panels = gamedata.panel_ids_by_location_id[location_id] + location.total = panels.size() + + for panel in panels: + var that_panel + if panel.begins_with("EndPanel"): + that_panel = self.get_node("Decorations").get_node(panel) + else: + that_panel = panels_parent.get_node(panel) + + that_panel.get_node("Viewport/GUI/Panel/TextEdit").connect( + "answer_correct", location, "handle_correct" + ) + else: + global._print("Could not find location ID for %s" % location_id) # HOT CRUSTS should be at eye-level, have a yellow block behind it, and # not vanish when solved. @@ -133,8 +137,6 @@ func _load(): var rng = RandomNumberGenerator.new() rng.seed = apclient._slot_seed - var gamedata = apclient.get_node("Gamedata") - # Remove opaque wall in front of FOURTH. set_gridmap_tile(-71.5, 1.5, -64.5, "MeshInstance18") @@ -309,7 +311,7 @@ func _load(): remaining.append(all_paintings[j]) all_paintings.remove(j) - for painting in apclient._paintings.keys(): + for painting in gamedata.paintings.keys(): if randomized.has(painting): continue @@ -364,7 +366,11 @@ func _load(): # disable them. var panel_script = ResourceLoader.load("user://maps/Archipelago/panel.gd") for panel in gamedata.panels: - var panel_node = panels_parent.get_node(panel["id"]) + var panel_node + if panel["id"].begins_with("EndPanel"): + panel_node = self.get_node("Decorations").get_node(panel["id"]) + else: + panel_node = panels_parent.get_node(panel["id"]) var script_instance = panel_script.new() script_instance.name = "AP_Panel" script_instance.data = panel @@ -445,7 +451,8 @@ func instantiate_painting(name, scene): var mps_inst = mypainting_script.new() mps_inst.set_name("Script") - var pconfig = apclient._paintings[name] + var gamedata = apclient.get_node("Gamedata") + var pconfig = gamedata.paintings[name] mps_inst.orientation = pconfig["orientation"] if pconfig["move"]: mps_inst.move = true diff --git a/util/generate_gamedata.rb b/util/generate_gamedata.rb index 3b57f76..bf8e3ae 100644 --- a/util/generate_gamedata.rb +++ b/util/generate_gamedata.rb @@ -1,46 +1,193 @@ +require 'set' require 'yaml' configpath = ARGV[0] outputpath = ARGV[1] +panel_to_id = {} +door_groups = {} + +panel_output = [] +door_ids_by_item_id = {} +painting_ids_by_item_id = {} +panel_ids_by_location_id = {} +mentioned_doors = Set[] +mentioned_paintings = Set[] +painting_output = {} + config = YAML.load_file(configpath) -output = config.map do |panel| - ret = panel - if ret["color"].kind_of? String - ret["color"] = [ret["color"]] - end - ret -end.map do |panel| - ret = {} - ret["id"] = "\"#{panel["id"]}\"" - ret["color"] = "[\"" + panel["color"].join("\",\"") + "\"]" - ret["tag"] = "\"#{panel["tag"]}\"" - if panel.include? "subtag" - ret["subtag"] = "\"#{panel["subtag"]}\"" - end - if panel.include? "link" - ret["link"] = "\"#{panel["link"]}\"" +config.each do |room_name, room_data| + if room_data.include? "panels" + room_data["panels"].each do |panel_name, panel| + full_name = "#{room_name} - #{panel_name}" + panel_to_id[full_name] = panel["id"] + + ret = {} + ret["id"] = "\"#{panel["id"]}\"" + if panel.include? "colors" + if panel["colors"].kind_of? String + ret["color"] = "[\"#{panel["colors"]}\"]" + else + ret["color"] = "[\"" + panel["colors"].join("\",\"") + "\"]" + end + else + ret["color"] = "[\"white\"]" + end + ret["tag"] = "\"#{panel["tag"]}\"" + if panel.include? "subtag" + ret["subtag"] = "\"#{panel["subtag"]}\"" + end + if panel.include? "link" + ret["link"] = "\"#{panel["link"]}\"" + end + if panel.include? "copy_to_sign" + copytos = [] + if panel["copy_to_sign"].kind_of? String + copytos = [panel["copy_to_sign"]] + else + copytos = panel["copy_to_sign"] + end + ret["copy_to_sign"] = "[\"" + copytos.join("\",\"") + "\"]" + end + if panel.include? "achievement" + ret["achievement"] = "\"#{panel["achievement"]}\"" + end + panel_output << ret + + if panel.include? "check" and panel["check"] + panel_ids_by_location_id[full_name] = [panel["id"]] + end + end end - if panel.include? "copy_to_sign" - copytos = [] - if panel["copy_to_sign"].kind_of? String - copytos = [panel["copy_to_sign"]] - else - copytos = panel["copy_to_sign"] + + if room_data.include? "paintings" + room_data["paintings"].each do |painting| + painting_output[painting["id"]] = painting end - ret["copy_to_sign"] = "[\"" + copytos.join("\",\"") + "\"]" end - if panel.include? "achievement" - ret["achievement"] = "\"#{panel["achievement"]}\"" +end + +config.each do |room_name, room_data| + if room_data.include? "doors" + room_data["doors"].each do |door_name, door| + full_name = "#{room_name} - #{door_name}" + + if not (door.include? "skip_location" and door["skip_location"]) and + not (door.include? "event" and door["event"]) and + door.include? "panels" then + + chosen_name = full_name + if door.include? "location_name" + chosen_name = door["location_name"] + else + panels_per_room = {} + door["panels"].each do |panel_identifier| + if panel_identifier.kind_of? String + panels_per_room[room_name] ||= [] + panels_per_room[room_name] << panel_identifier + else + panels_per_room[panel_identifier["room"]] ||= [] + panels_per_room[panel_identifier["room"]] << panel_identifier["panel"] + end + end + + chosen_name = panels_per_room.map do |room_name, panels| + room_name + " - " + panels.join(", ") + end.join(" and ") + end + + panel_ids_by_location_id[chosen_name] = door["panels"].map do |panel_identifier| + other_name = "" + if panel_identifier.kind_of? String + other_name = "#{room_name} - #{panel_identifier}" + else + other_name = "#{panel_identifier["room"]} - #{panel_identifier["panel"]}" + end + panel_to_id[other_name] + end + end + + if not (door.include? "skip_item" and door["skip_item"]) and + not (door.include? "event" and door["event"]) then + + chosen_name = full_name + if door.include? "item_name" + chosen_name = door["item_name"] + end + + if door.include? "id" + internal_door_ids = [] + if door["id"].kind_of? String + internal_door_ids = [door["id"]] + else + internal_door_ids = door["id"] + end + + if door.include? "group" + door_groups[door["group"]] ||= Set[] + door_groups[door["group"]].merge(internal_door_ids) + end + + door_ids_by_item_id[chosen_name] = internal_door_ids + mentioned_doors.merge(internal_door_ids) + end + + if door.include? "painting_id" + internal_painting_ids = [] + if door["painting_id"].kind_of? String + internal_painting_ids = [door["painting_id"]] + else + internal_painting_ids = door["painting_id"] + end + + painting_ids_by_item_id[chosen_name] = internal_painting_ids + mentioned_paintings.merge(internal_painting_ids) + end + end + end end - ret -end.map do |panel| - "{" + panel.to_a.map do |element| - "\"#{element[0]}\":#{element[1]}" - end.join(",") + "}" -end.join(",") +end -header = "extends Node\n\nvar panels = [" -footer = "]" +door_groups.each do |group_name, door_ids| + door_ids_by_item_id[group_name] = door_ids.to_a +end -File.write(outputpath, header + output + footer) \ No newline at end of file +File.open(outputpath, "w") do |f| + f.write "extends Node\n\nvar panels = [" + f.write(panel_output.map do |panel| + "{" + panel.to_a.map do |element| + "\"#{element[0]}\":#{element[1]}" + end.join(",") + "}" + end.join(",")) + f.write "]\nvar door_ids_by_item_id = {" + f.write(door_ids_by_item_id.map do |item_id, door_ids| + "\"#{item_id}\":[" + door_ids.map do |door_id| + "\"#{door_id}\"" + end.join(",") + "]" + end.join(",")) + f.write "}\nvar painting_ids_by_item_id = {" + f.write(painting_ids_by_item_id.map do |item_id, painting_ids| + "\"#{item_id}\":[" + painting_ids.map do |painting_id| + "\"#{painting_id}\"" + end.join(",") + "]" + end.join(",")) + f.write "}\nvar panel_ids_by_location_id = {" + f.write(panel_ids_by_location_id.map do |location_id, panel_ids| + "\"#{location_id}\":[" + panel_ids.map do |panel_id| + "\"#{panel_id}\"" + end.join(",") + "]" + end.join(",")) + f.write "}\nvar mentioned_doors = [" + f.write(mentioned_doors.map do |door_id| + "\"#{door_id}\"" + end.join(",")) + f.write "]\nvar mentioned_paintings = [" + f.write(mentioned_paintings.map do |painting_id| + "\"#{painting_id}\"" + end.join(",")) + f.write "]\nvar paintings = {" + f.write(painting_output.map do |painting_id, painting| + "\"#{painting_id}\":{\"orientation\":\"#{painting["orientation"]}\",\"move\":#{painting.include? "move" and painting["move"]}}" + end.join(",")) + f.write "}" +end -- cgit 1.4.1