require 'set' require 'yaml' configpath = ARGV[0] idspath = ARGV[1] outputpath = ARGV[2] CLASSIFICATION_NORMAL = 1 CLASSIFICATION_REDUCED = 2 CLASSIFICATION_INSANITY = 4 CLASSIFICATION_SMALL_SPHERE_ONE = 8 panel_to_id = {} door_groups = {} warp_groups = {} panel_output = [] door_ids_by_item_id = {} painting_ids_by_item_id = {} warp_ids_by_item_id = {} panel_ids_by_location_id = {} classification_by_location_id = {} sunwarps = Array.new(12) {Hash.new} mentioned_doors = Set[] mentioned_paintings = Set[] mentioned_warps = Set[] painting_output = {} items_by_progressive_id = {} ids_config = YAML.load_file(idspath) config = YAML.load_file(configpath) config.each do |room_name, room_data| if room_data.include? "panels" room_data["panels"].each do |panel_name, panel| location_id = ids_config["panels"][room_name][panel_name] full_name = "#{room_name} - #{panel_name}" panel_to_id[full_name] = panel["id"] ret = {} ret["id"] = "\"#{panel["id"]}\"" ret["loc"] = location_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 if panel.include? "hunt" and panel["hunt"] ret["hunt"] = "true" end panel_output << ret panel_ids_by_location_id[location_id] = [panel["id"]] classification_by_location_id[location_id] ||= 0 classification_by_location_id[location_id] += CLASSIFICATION_INSANITY if panel.include? "check" and panel["check"] classification_by_location_id[location_id] += CLASSIFICATION_NORMAL unless panel.include? "exclude_reduce" and panel["exclude_reduce"] classification_by_location_id[location_id] += CLASSIFICATION_REDUCED end end if room_name == "Starting Room" classification_by_location_id[location_id] += CLASSIFICATION_SMALL_SPHERE_ONE end end end if room_data.include? "paintings" room_data["paintings"].each do |painting| painting_output[painting["id"]] = painting end end if room_data.include? "sunwarps" room_data["sunwarps"].each do |sunwarp| index = sunwarp["dots"] - 1 if sunwarp["direction"] == "exit" then index += 6 end sunwarps[index] = sunwarp end end if room_data.include? "progression" room_data["progression"].each do |progressive_item_name, progression| progressive_id = ids_config["progression"][progressive_item_name] items_by_progressive_id[progressive_id] = [] progression.each do |item| item_room_name = (item.kind_of? Hash) ? item["room"] : room_name item_item_name = (item.kind_of? Hash) ? item["door"] : item items_by_progressive_id[progressive_id] << ids_config["doors"][item_room_name][item_item_name]["item"] end end end 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 location_id = ids_config["doors"][room_name][door_name]["location"] panel_ids_by_location_id[location_id] = 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 classification_by_location_id[location_id] ||= 0 classification_by_location_id[location_id] += CLASSIFICATION_NORMAL if door.include? "include_reduce" and door["include_reduce"] classification_by_location_id[location_id] += CLASSIFICATION_REDUCED end end if not (door.include? "skip_item" and door["skip_item"]) and not (door.include? "event" and door["event"]) then item_id = ids_config["doors"][room_name][door_name]["item"] 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? "door_group" door_groups[door["door_group"]] ||= Set[] door_groups[door["door_group"]].merge(internal_door_ids) end door_ids_by_item_id[item_id] = 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[item_id] = internal_painting_ids mentioned_paintings.merge(internal_painting_ids) end if door.include? "warp_id" internal_warp_ids = [] if door["warp_id"].kind_of? String internal_warp_ids = [door["warp_id"]] else internal_warp_ids = door["warp_id"] end if door.include? "door_group" warp_groups[door["door_group"]] ||= Set[] warp_groups[door["door_group"]].merge(internal_warp_ids) end warp_ids_by_item_id[item_id] = internal_warp_ids mentioned_warps.merge(internal_warp_ids) end end end end end door_groups.each do |group_name, door_ids| item_id = ids_config["door_groups"][group_name] door_ids_by_item_id[item_id] = door_ids.to_a end warp_groups.each do |group_name, warp_ids| item_id = ids_config["door_groups"][group_name] warp_ids_by_item_id[item_id] = warp_ids.to_a end 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 warp_ids_by_item_id = {" f.write(warp_ids_by_item_id.map do |item_id, warp_ids| "#{item_id}:[" + warp_ids.map do |warp_id| "\"#{warp_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 mentioned_warps = [" f.write(mentioned_warps.map do |warp_id| "\"#{warp_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 "}\nvar classification_by_location_id = {" f.write(classification_by_location_id.map do |location_id, classification| "#{location_id}:#{classification}" end.join(",")) f.write "}\nvar sunwarps = [" f.write(sunwarps.map do |sunwarp| "{\"orientation\":\"#{sunwarp["orientation"]}\",\"entrance_indicator_pos\":#{sunwarp["entrance_indicator_pos"].to_s}}" end.join(",")) f.write "]\nvar items_by_progressive_id = {" f.write(items_by_progressive_id.map do |item_id, progression_ids| "#{item_id}:[" + progression_ids.map(&:to_s).join(",") + "]" end.join(",")) f.write "}" end