require 'set' require 'yaml' configpath = ARGV[0] idspath = ARGV[1] outputpath = ARGV[2] CLASSIFICATION_NORMAL = 1 CLASSIFICATION_REDUCED = 2 CLASSIFICATION_INSANITY = 4 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 = {} 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 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 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? "group" door_groups[door["group"]] ||= Set[] door_groups[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? "group" warp_groups[door["group"]] ||= Set[] warp_groups[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 "]" end >136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
doors {
  name: "First Floor Puzzles"
  type: LOCATION_ONLY
  panels { room: "First Floor" name: "RIDE" }
  panels { room: "First Floor" name: "PROD" }
  panels { room: "First Floor" name: "WARM" }
  panels { room: "First Floor" name: "COLLEGE" }
  panels { room: "First Floor" name: "HER" }
  panels { room: "First Floor" name: "CRAM" }
  panels { room: "First Floor" name: "CUP" }
  panels { room: "First Floor" name: "IRONY" }
  panels { room: "First Floor" name: "IRE" }
  panels { room: "First Floor" name: "ADULT" }
  panels { room: "First Floor" name: "CALF" }
  panels { room: "First Floor" name: "BUTTER" }
  location_room: "First Floor"
}
doors {
  name: "First Floor Door"
  type: ITEM_ONLY
  receivers: "Components/Doors/entry_1"
  panels { room: "First Floor" name: "RIDE" }
  panels { room: "First Floor" name: "PROD" }
  panels { room: "First Floor" name: "WARM" }
  panels { room: "First Floor" name: "COLLEGE" }
  panels { room: "First Floor" name: "HER" }
  panels { room: "First Floor" name: "CRAM" }
  panels { room: "First Floor" name: "CUP" }
  panels { room: "First Floor" name: "IRONY" }
  panels { room: "First Floor" name: "IRE" }
  panels { room: "First Floor" name: "ADULT" }
  panels { room: "First Floor" name: "CALF" }
  panels { room: "First Floor" name: "BUTTER" }
  complete_at: 1
}
doors {
  name: "Second Floor Puzzles"
  type: LOCATION_ONLY
  panels { room: "Tower" name: "RHINO" }
  panels { room: "Tower" name: "FISH" }
  panels { room: "Tower" name: "LINEAGE" }
  panels { room: "Tower" name: "GRUMPY" }
  panels { room: "Tower" name: "ZEBRA" }
  panels { room: "Tower" name: "SLID" }
  panels { room: "Tower" name: "FUEL" }
  panels { room: "Tower" name: "DOUGH" }
  panels { room: "Tower" name: "LIQUID" }
  panels { room: "Tower" name: "ICE" }
  panels { room: "Tower" name: "FLEECE" }
  panels { room: "Tower" name: "NEED" }
  panels { room: "Tower" name: "ANNOY (1)" }
  panels { room: "Tower" name: "ANNOY (2)" }
  panels { room: "Tower" name: "GIGGLING" }
  location_room: "Tower"
}
doors {
  name: "Third Floor Puzzles"
  type: LOCATION_ONLY
  panels { room: "Tower" name: "MINUSCULE" }
  panels { room: "Tower" name: "TYPEWRITER" }
  panels { room: "Tower" name: "READJUST" }
  panels { room: "Tower" name: "REINDICT" }
  panels { room: "Tower" name: "COPYRIGHT" }
  panels { room: "Tower" name: "CONTINENT" }
  panels { room: "Tower" name: "FOOT" }
  panels { room: "Tower" name: "EYE" }
  panels { room: "Tower" name: "RIVER" }
  panels { room: "Tower" name: "NUCLEUS" }
  panels { room: "Tower" name: "MIX (1)" }
  panels { room: "Tower" name: "HEAL" }
  panels { room: "Tower" name: "SCREW" }
  panels { room: "Tower" name: "FLY" }
  panels { room: "Tower" name: "MIX (2)" }
  location_room: "Tower"
}
doors {
  name: "Fourth Floor Puzzles"
  type: LOCATION_ONLY
  panels { room: "Tower" name: "BARE" }
  panels { room: "Tower" name: "CANON" }
  panels { room: "Tower" name: "DUCTS" }
  panels { room: "Tower" name: "COY" }
  panels { room: "Tower" name: "LYNX" }
  panels { room: "Tower" name: "SCENTS (1)" }
  panels { room: "Tower" name: "SCENTS (2)" }
  panels { room: "Tower" name: "SEIZE (1)" }
  panels { room: "Tower" name: "SEIZE (2)" }
  panels { room: "Tower" name: "THROWN" }
  location_room: "Tower"
}
doors {
  name: "Fifth Floor Puzzles"
  type: LOCATION_ONLY
  panels { room: "Tower" name: "FUND" }
  panels { room: "Tower" name: "ENVELOPE" }
  panels { room: "Tower" name: "ROTE" }
  panels { room: "Tower" name: "ENVELOPES" }
  panels { room: "Tower" name: "ERECTS" }
  panels { room: "Tower" name: "HIDE (1)" }
  panels { room: "Tower" name: "HUE" }
  panels { room: "Tower" name: "CRUST" }
  panels { room: "Tower" name: "HIDE (2)" }
  panels { room: "Tower" name: "BETTER" }
  location_room: "Tower"
}
doors {
  name: "Colors Panel"
  type: EVENT
  panels { room: "First Floor" name: "RIDE" }
  panels { room: "First Floor" name: "PROD" }
  panels { room: "First Floor" name: "WARM" }
  panels { room: "First Floor" name: "COLLEGE" }
  panels { room: "First Floor" name: "HER" }
  panels { room: "First Floor" name: "CRAM" }
  panels { room: "First Floor" name: "CUP" }
  panels { room: "First Floor" name: "IRONY" }
  panels { room: "First Floor" name: "IRE" }
  panels { room: "First Floor" name: "ADULT" }
  panels { room: "First Floor" name: "CALF" }
  panels { room: "First Floor" name: "BUTTER" }
  panels { room: "Tower" name: "RHINO" }
  panels { room: "Tower" name: "FISH" }
  panels { room: "Tower" name: "LINEAGE" }
  panels { room: "Tower" name: "GRUMPY" }
  panels { room: "Tower" name: "ZEBRA" }
  panels { room: "Tower" name: "SLID" }
  panels { room: "Tower" name: "FUEL" }
  panels { room: "Tower" name: "DOUGH" }
  panels { room: "Tower" name: "LIQUID" }
  panels { room: "Tower" name: "ICE" }
  panels { room: "Tower" name: "FLEECE" }
  panels { room: "Tower" name: "NEED" }
  panels { room: "Tower" name: "ANNOY (1)" }
  panels { room: "Tower" name: "ANNOY (2)" }
  panels { room: "Tower" name: "GIGGLING" }
  panels { room: "Tower" name: "MINUSCULE" }
  panels { room: "Tower" name: "TYPEWRITER" }
  panels { room: "Tower" name: "READJUST" }
  panels { room: "Tower" name: "REINDICT" }
  panels { room: "Tower" name: "COPYRIGHT" }
  panels { room: "Tower" name: "CONTINENT" }
  panels { room: "Tower" name: "FOOT" }
  panels { room: "Tower" name: "EYE" }
  panels { room: "Tower" name: "RIVER" }
  panels { room: "Tower" name: "NUCLEUS" }
  panels { room: "Tower" name: "MIX (1)" }
  panels { room: "Tower" name: "HEAL" }
  panels { room: "Tower" name: "SCREW" }
  panels { room: "Tower" name: "FLY" }
  panels { room: "Tower" name: "MIX (2)" }
  panels { room: "Tower" name: "BARE" }
  panels { room: "Tower" name: "CANON" }
  panels { room: "Tower" name: "DUCTS" }
  panels { room: "Tower" name: "COY" }
  panels { room: "Tower" name: "LYNX" }
  panels { room: "Tower" name: "SCENTS (1)" }
  panels { room: "Tower" name: "SCENTS (2)" }
  panels { room: "Tower" name: "SEIZE (1)" }
  panels { room: "Tower" name: "SEIZE (2)" }
  panels { room: "Tower" name: "THROWN" }
  panels { room: "Tower" name: "FUND" }
  panels { room: "Tower" name: "ENVELOPE" }
  panels { room: "Tower" name: "ROTE" }
  panels { room: "Tower" name: "ENVELOPES" }
  panels { room: "Tower" name: "ERECTS" }
  panels { room: "Tower" name: "HIDE (1)" }
  panels { room: "Tower" name: "HUE" }
  panels { room: "Tower" name: "CRUST" }
  panels { room: "Tower" name: "HIDE (2)" }
  panels { room: "Tower" name: "BETTER" }
}
doors {
  name: "Context Panel"
  type: EVENT
  panels { room: "Tower" name: "Colors" }
}
doors {
  name: "Ending"
  type: EVENT
  panels { room: "Tower" name: "Context" }
}