From bbbbc71bee25cfd22c5304f98f5a7881383585a3 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 8 Nov 2023 18:35:12 -0500 Subject: Lingo: New game (#1806) Co-authored-by: Aaron Wagener Co-authored-by: Fabian Dill Co-authored-by: Phar --- utils/assign_ids.rb | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 utils/assign_ids.rb (limited to 'utils/assign_ids.rb') diff --git a/utils/assign_ids.rb b/utils/assign_ids.rb new file mode 100644 index 0000000..9e1ce67 --- /dev/null +++ b/utils/assign_ids.rb @@ -0,0 +1,178 @@ +# This utility goes through the provided Lingo config and assigns item and +# location IDs to entities that require them (such as doors and panels). These +# IDs are output in a separate yaml file. If the output file already exists, +# then it will be updated with any newly assigned IDs rather than overwritten. +# In this event, all new IDs will be greater than any already existing IDs, +# even if there are gaps in the ID space; this is to prevent collision when IDs +# are retired. +# +# This utility should be run whenever logically new items or locations are +# required. If an item or location is created that is logically equivalent to +# one that used to exist, this utility should not be used, and instead the ID +# file should be manually edited so that the old ID can be reused. + +require 'set' +require 'yaml' + +configpath = ARGV[0] +outputpath = ARGV[1] + +next_item_id = 444400 +next_location_id = 444400 + +location_id_by_name = {} + +old_generated = YAML.load_file(outputpath) +File.write(outputpath + ".old", old_generated.to_yaml) + +if old_generated.include? "special_items" then + old_generated["special_items"].each do |name, id| + if id >= next_item_id then + next_item_id = id + 1 + end + end +end +if old_generated.include? "special_locations" then + old_generated["special_locations"].each do |name, id| + if id >= next_location_id then + next_location_id = id + 1 + end + end +end +if old_generated.include? "panels" then + old_generated["panels"].each do |room, panels| + panels.each do |name, id| + if id >= next_location_id then + next_location_id = id + 1 + end + location_name = "#{room} - #{name}" + location_id_by_name[location_name] = id + end + end +end +if old_generated.include? "doors" then + old_generated["doors"].each do |room, doors| + doors.each do |name, ids| + if ids.include? "location" then + if ids["location"] >= next_location_id then + next_location_id = ids["location"] + 1 + end + end + if ids.include? "item" then + if ids["item"] >= next_item_id then + next_item_id = ids["item"] + 1 + end + end + end + end +end +if old_generated.include? "door_groups" then + old_generated["door_groups"].each do |name, id| + if id >= next_item_id then + next_item_id = id + 1 + end + end +end +if old_generated.include? "progression" then + old_generated["progression"].each do |name, id| + if id >= next_item_id then + next_item_id = id + 1 + end + end +end + +door_groups = Set[] + +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| + unless old_generated.include? "panels" and old_generated["panels"].include? room_name and old_generated["panels"][room_name].include? panel_name then + old_generated["panels"] ||= {} + old_generated["panels"][room_name] ||= {} + old_generated["panels"][room_name][panel_name] = next_location_id + + location_name = "#{room_name} - #{panel_name}" + location_id_by_name[location_name] = next_location_id + + next_location_id += 1 + end + end + end +end + +config.each do |room_name, room_data| + if room_data.include? "doors" + room_data["doors"].each do |door_name, door| + if door.include? "event" and door["event"] then + next + end + + unless door.include? "skip_item" and door["skip_item"] then + unless old_generated.include? "doors" and old_generated["doors"].include? room_name and old_generated["doors"][room_name].include? door_name and old_generated["doors"][room_name][door_name].include? "item" then + old_generated["doors"] ||= {} + old_generated["doors"][room_name] ||= {} + old_generated["doors"][room_name][door_name] ||= {} + old_generated["doors"][room_name][door_name]["item"] = next_item_id + + next_item_id += 1 + end + + if door.include? "group" and not door_groups.include? door["group"] then + door_groups.add(door["group"]) + + unless old_generated.include? "door_groups" and old_generated["door_groups"].include? door["group"] then + old_generated["door_groups"] ||= {} + old_generated["door_groups"][door["group"]] = next_item_id + + next_item_id += 1 + end + end + end + + unless door.include? "skip_location" and door["skip_location"] then + location_name = "" + if door.include? "location_name" then + location_name = door["location_name"] + elsif door.include? "panels" then + location_name = door["panels"].map do |panel| + if panel.kind_of? Hash then + panel + else + {"room" => room_name, "panel" => panel} + end + end.sort_by {|panel| panel["room"]}.chunk {|panel| panel["room"]}.map do |room_panels| + room_panels[0] + " - " + room_panels[1].map{|panel| panel["panel"]}.join(", ") + end.join(" and ") + end + + if location_id_by_name.has_key? location_name then + old_generated["doors"] ||= {} + old_generated["doors"][room_name] ||= {} + old_generated["doors"][room_name][door_name] ||= {} + old_generated["doors"][room_name][door_name]["location"] = location_id_by_name[location_name] + elsif not (old_generated.include? "doors" and old_generated["doors"].include? room_name and old_generated["doors"][room_name].include? door_name and old_generated["doors"][room_name][door_name].include? "location") then + old_generated["doors"] ||= {} + old_generated["doors"][room_name] ||= {} + old_generated["doors"][room_name][door_name] ||= {} + old_generated["doors"][room_name][door_name]["location"] = next_location_id + + next_location_id += 1 + end + end + end + end + + if room_data.include? "progression" + room_data["progression"].each do |progression_name, pdata| + unless old_generated.include? "progression" and old_generated["progression"].include? progression_name then + old_generated["progression"] ||= {} + old_generated["progression"][progression_name] = next_item_id + + next_item_id += 1 + end + end + end +end + +File.write(outputpath, old_generated.to_yaml) -- cgit 1.4.1