From af7992eb7fc3f9aec599408f74c3e1cd3bb50456 Mon Sep 17 00:00:00 2001 From: Natalie Date: Mon, 11 May 2026 19:49:49 -0700 Subject: [PATCH] =?UTF-8?q?fix(@projects/@magic-civilization):=20?= =?UTF-8?q?=F0=9F=90=9B=20handle=20mixed=20json=20array/object=20parsing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .../scenes/headless/claude_player_main.gd | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/game/engine/scenes/headless/claude_player_main.gd b/src/game/engine/scenes/headless/claude_player_main.gd index 57be72b3..1298e44a 100644 --- a/src/game/engine/scenes/headless/claude_player_main.gd +++ b/src/game/engine/scenes/headless/claude_player_main.gd @@ -187,12 +187,19 @@ func _apply_runtime_units_catalog(gs: RefCounted) -> void: if f != null: var raw: String = f.get_as_text() f.close() - # Per-unit file is a single object — wrap all into one - # array to ship in one call. Rust loader accepts both - # object and array shapes; we always send an array. - var parsed: Dictionary = JSON.parse_string(raw) as Dictionary - if parsed != null and not parsed.is_empty(): - entries.append(parsed) + # Per-unit file is either a single object or a single-element + # array (canonical post-data-architecture migration is array- + # rooted; pre-migration is object-rooted). Accept both shapes. + # Rust loader accepts an array; we always ship one. + var parsed_arr: Array = JSON.parse_string(raw) as Array + if parsed_arr != null: + for item: Dictionary in parsed_arr: + if not item.is_empty(): + entries.append(item) + else: + var parsed_obj: Dictionary = JSON.parse_string(raw) as Dictionary + if parsed_obj != null and not parsed_obj.is_empty(): + entries.append(parsed_obj) fname = dir.get_next() dir.list_dir_end() if entries.is_empty():