From 7d19567f1ac1cf4fd6373303e0e767a8adeb89a7 Mon Sep 17 00:00:00 2001
From: Star Rauchenberger <fefferburbia@gmail.com>
Date: Thu, 13 Mar 2025 12:44:05 -0400
Subject: Sort panel solve index by location ID

---
 Archipelago/load.gd       |  6 ++----
 util/generate_gamedata.rb | 21 +++++++++++++++++----
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/Archipelago/load.gd b/Archipelago/load.gd
index 8510008..57c49a3 100644
--- a/Archipelago/load.gd
+++ b/Archipelago/load.gd
@@ -569,7 +569,6 @@ func _load():
 	# Attach a script to every panel so that we can do things like conditionally
 	# disable them.
 	var panel_script = apclient.SCRIPT_panel
-	var panel_index = 0
 	for panel in gamedata.panels:
 		var panel_node
 		if panel["id"].begins_with("EndPanel"):
@@ -579,14 +578,13 @@ func _load():
 		var script_instance = panel_script.new()
 		script_instance.name = "AP_Panel"
 		script_instance.data = panel
-		script_instance.solve_index = panel_index
+		script_instance.solve_index = panel["solve_index"]
 		if apclient._panel_door_shuffle and gamedata.mentioned_panels.has(panel["id"]):
 			script_instance.locked = true
 		panel_node.add_child(script_instance)
 		apclient.connect("evaluate_solvability", script_instance, "evaluate_solvability")
 
-		apclient._panelsBySolveIndex[panel_index] = panel["id"]
-		panel_index += 1
+		apclient._panelsBySolveIndex[panel["solve_index"]] = panel["id"]
 
 	# Hook up the goal panel.
 	if apclient._victory_condition == apclient.kTHE_MASTER:
diff --git a/util/generate_gamedata.rb b/util/generate_gamedata.rb
index 83099ad..7db06ca 100644
--- a/util/generate_gamedata.rb
+++ b/util/generate_gamedata.rb
@@ -30,10 +30,25 @@ mentioned_warps = Set[]
 painting_output = {}
 door_items_by_progressive_id = {}
 panel_items_by_progressive_id = {}
+panel_location_ids = []
+solve_index_by_location = {}
 
 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]
+      panel_location_ids << location_id
+    end
+  end
+end
+
+panel_location_ids.sort.each_with_index do |location_id, index|
+  solve_index_by_location[location_id] = index
+end
+
 config.each do |room_name, room_data|
   if room_data.include? "panels"
     room_data["panels"].each do |panel_name, panel|
@@ -45,6 +60,7 @@ config.each do |room_name, room_data|
       ret = {}
       ret["id"] = "\"#{panel["id"]}\""
       ret["loc"] = location_id
+      ret["solve_index"] = solve_index_by_location[location_id]
       if panel.include? "colors"
         if panel["colors"].kind_of? String
           ret["color"] = "[\"#{panel["colors"]}\"]"
@@ -73,9 +89,6 @@ config.each do |room_name, room_data|
       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"]]
-- 
cgit 1.4.1