feat: Implement Phase 18 palette image icons and update asset card functionality

This commit is contained in:
2026-10-14 18:08:06 -04:00
parent b7235c503d
commit ba85a967e3
11 changed files with 185 additions and 7 deletions
+45 -4
View File
@@ -2,16 +2,57 @@ extends SceneTree
const SPAWNER := preload("res://scripts/stage/stage_spawner.gd")
const CARD := preload("res://scripts/shared/ui/asset_card.gd")
const CHROME := preload("res://scripts/editors/stage/stage_chrome.gd")
var _failures: int = 0
var _last_activated_payload: Dictionary = {}
func _init() -> void:
var world := Node2D.new()
var spawner = SPAWNER.new(world)
var world: Node2D = Node2D.new()
var spawner: StageSpawner = SPAWNER.new(world) as StageSpawner
var entries: Array[Dictionary] = spawner.get_palette_entries()
_check(entries.size() == 6, "six registry cards")
_check(String(entries[0].get("placement_id", "")) == "ground", "registry id retained")
var card = CARD.new(); card.configure(entries[0]); _check(card.payload().get("kind", "") == "terrain", "card copies payload")
var card: AssetCard = CARD.new() as AssetCard
card.configure(entries[0])
_check(card.payload().get("kind", "") == "terrain", "card copies payload")
var chrome: StageChrome = CHROME.new() as StageChrome
chrome.configure(null, 0, 15.0, false, true, Color("#22C6FF"), Color("#FFB300"), Color("#33DD77"), 16, 18)
chrome.palette_activated.connect(_on_palette_activated)
chrome.build(entries)
var palette_buttons: Dictionary = chrome.get_palette_buttons()
_check(palette_buttons.size() == 6, "six stage palette cards")
for entry: Dictionary in entries:
var placement_id: String = String(entry.get("placement_id", ""))
var asset_card: AssetCard = palette_buttons.get(placement_id) as AssetCard
_check(asset_card != null, "%s card exists" % placement_id)
if asset_card == null:
continue
var icon: TextureRect = asset_card.thumbnail_rect()
_check(icon.visible, "%s image is visible" % placement_id)
var icon_texture: Texture2D = icon.texture as Texture2D
_check(icon_texture != null, "%s image texture is assigned" % placement_id)
if icon_texture != null:
var expected_path: String = "res://resources/icons/%s.png" % placement_id
_check(icon_texture.resource_path == expected_path, "%s uses its matching source image" % placement_id)
_check(icon_texture.get_width() <= 256 and icon_texture.get_height() <= 256, "%s import is capped at 256 px" % placement_id)
_check(icon.custom_minimum_size == Vector2(64.0, 64.0), "%s image area stays 64 px" % placement_id)
_check(icon.stretch_mode == TextureRect.STRETCH_KEEP_ASPECT_CENTERED, "%s image keeps aspect ratio" % placement_id)
var card_box: VBoxContainer = asset_card.get_child(0) as VBoxContainer
var glyph: Label = card_box.get_child(1) as Label
var title: Label = card_box.get_child(2) as Label
_check(not glyph.visible, "%s emoji fallback is hidden" % placement_id)
_check(title.text == String(entry.get("label", "")), "%s text label remains" % placement_id)
_check(asset_card.tooltip_text == String(entry.get("label", "")), "%s tooltip remains" % placement_id)
if placement_id == "prop":
asset_card._pressed()
_check(String(_last_activated_payload.get("placement_id", "")) == placement_id, "click activation still relays payload")
chrome.free()
card.free()
world.free()
print("PASS" if _failures == 0 else "FAIL: %d" % _failures); quit(0 if _failures == 0 else 1)
func _check(condition: bool, message: String) -> void:
if not condition: _failures += 1; push_error("Phase 7 palette: " + message)
if not condition: _failures += 1; push_error("Phase 18 palette: " + message)
func _on_palette_activated(payload: Dictionary) -> void:
_last_activated_payload = payload.duplicate(true)