Add new test file for phase 19 scenery with unique identifier

This commit is contained in:
2026-10-17 12:53:38 -04:00
parent 36032ebb1e
commit a0510e6405
74 changed files with 40948 additions and 149 deletions
+19 -4
View File
@@ -2,7 +2,7 @@ class_name PropFile
extends RefCounted
## PropFile - Static schema + converters for .prop vector prop assets.
##
## The file stores the editor's full multi-shape stack (version "1.0") plus
## The file stores the editor's full multi-shape stack (version "1.1") plus
## enough provenance for later sandbox placement. flatten_to_payload() converts
## the stack into the single-shape payload PropUtils.spawn_prop() already
## consumes: frontmost closed polygon -> else circle -> else first shape.
@@ -12,10 +12,11 @@ const TerrainUtilsScript := preload("res://scripts/terrain/terrain_utils.gd")
const PropAnchorDataScript := preload("res://scripts/props/prop_anchor_data.gd")
const ContentPathsScript := preload("res://scripts/shared/content_paths.gd")
const FILE_VERSION: String = "1.0"
const FILE_VERSION: String = "1.1"
const FILE_EXT: String = ".prop"
const DEFAULT_DIR: String = "res://content/props"
const SUPPORTED_VERSIONS: Array[String] = ["1.0"]
const SUPPORTED_VERSIONS: Array[String] = ["1.0", "1.1"]
const KNOWN_TAGS: Array[String] = ["nature", "buildings", "walls", "roads", "objects"]
# index == PropBlock.MaterialPreset
const PRESET_STRINGS: PackedStringArray = ["none", "wood", "rubber", "cardboard", "metal"]
const SHAPE_STRINGS: PackedStringArray = ["polygon", "circle", "line"]
@@ -63,7 +64,7 @@ static func sanitize_shape(shape: Dictionary, grid_size: float = TerrainUtilsScr
return result
static func to_file_dict(prop_name: String, material_preset: int, shapes: Array[Dictionary], anchors: Dictionary = {}) -> Dictionary:
static func to_file_dict(prop_name: String, material_preset: int, shapes: Array[Dictionary], anchors: Dictionary = {}, tags: Array[String] = []) -> Dictionary:
var serialized: Array = []
for shape: Dictionary in shapes:
serialized.append(_serialize_shape(shape))
@@ -74,6 +75,7 @@ static func to_file_dict(prop_name: String, material_preset: int, shapes: Array[
"material_preset": preset_to_string(material_preset),
"shapes": serialized,
"anchors": PropAnchorDataScript.serialize_anchors(anchors),
"tags": normalize_tags(tags),
"metadata": {"created_at": now, "modified_at": now},
}
@@ -98,6 +100,7 @@ static func from_file_dict(data: Variant) -> Dictionary:
return {}
var preset: int = preset_from_string(str(dict.get("material_preset", "none")))
var tags: Array[String] = normalize_tags(dict.get("tags", []))
var shapes: Array[Dictionary] = []
var raw_shapes: Variant = dict.get("shapes", [])
if raw_shapes is Array:
@@ -109,9 +112,21 @@ static func from_file_dict(data: Variant) -> Dictionary:
"material_preset": preset,
"shapes": shapes,
"anchors": PropAnchorDataScript.normalize_anchors(dict.get("anchors", {})),
"tags": tags,
}
static func normalize_tags(value: Variant) -> Array[String]:
var tags: Array[String] = []
if not value is Array:
return tags
for raw_tag: Variant in value as Array:
var tag: String = str(raw_tag).strip_edges().to_lower()
if KNOWN_TAGS.has(tag) and not tags.has(tag):
tags.append(tag)
return tags
## Deterministic conversion of the multi-shape stack into a single
## PropUtils.spawn_prop payload. Rule: frontmost closed polygon -> else circle
## -> else first shape. Returns {} when shapes is empty.