Add transparent enemy unit art

This commit is contained in:
2026-06-18 18:49:29 +09:00
parent 4bd18a3f53
commit e748db1598
13 changed files with 70 additions and 10 deletions

View File

@@ -51,6 +51,16 @@ func _check_battle_visual_data(failures: Array[String]) -> void:
failures.append("missing expected unit: %s" % unit_id)
continue
_check_image_path(failures, str(unit.get("sprite", "")), "unit %s sprite" % unit_id)
_check_unit_sprite_resolution(failures, state, "cao_cao", "res://art/units/strategist.png", false)
_check_unit_sprite_resolution(failures, state, "yellow_turban_1", "res://art/units/enemies/enemy_warrior.png", true)
_check_unit_sprite_resolution(failures, state, "yellow_turban_2", "res://art/units/enemies/enemy_infantry.png", true)
_check_unit_sprite_resolution(failures, state, "yellow_turban_3", "res://art/units/enemies/enemy_archer.png", true)
var gate_state = BattleStateScript.new()
if not gate_state.load_battle("res://data/scenarios/002_sishui_gate.json"):
failures.append("could not load Sishui Gate for enemy cavalry sprite")
else:
_check_unit_sprite_resolution(failures, gate_state, "hua_xiong_vanguard", "res://art/units/enemies/enemy_cavalry.png", true)
for item_id in ["bronze_sword", "training_spear", "short_bow", "hand_axe", "iron_armor", "panacea"]:
var item := state.get_item_def(item_id)
@@ -178,8 +188,11 @@ func _check_terrain_and_unit_presentation(failures: Array[String]) -> void:
if scene._is_generic_enemy_unit({"team": "player", "officer_id": ""}):
failures.append("player unit should not be marked as generic enemy")
var enemy_modulate: Color = scene._unit_sprite_modulate(generic_enemy, false)
if enemy_modulate == Color.WHITE or enemy_modulate.a >= 1.0:
failures.append("generic enemy sprite should receive a distinct semi-real tint")
if enemy_modulate.r < 0.99 or enemy_modulate.g < 0.99 or enemy_modulate.b < 0.99 or enemy_modulate.a < 0.97:
failures.append("transparent enemy class sprite should render near its original colors")
var fallback_enemy_modulate: Color = scene._unit_sprite_modulate({"team": "enemy", "officer_id": ""}, false)
if fallback_enemy_modulate == Color.WHITE or fallback_enemy_modulate.a >= 1.0:
failures.append("generic enemy fallback sprite should still receive a distinct semi-real tint")
var acted_modulate: Color = scene._unit_sprite_modulate(generic_enemy, true)
if acted_modulate.a >= enemy_modulate.a:
failures.append("acted generic enemy sprite should still dim below active tint")
@@ -322,6 +335,19 @@ func _check_camp_conversation(failures: Array[String], conversation: Dictionary,
failures.append("camp conversation officer portrait missing for %s" % expected_id)
func _check_unit_sprite_resolution(failures: Array[String], state, unit_id: String, expected_sprite: String, expected_enemy_sprite: bool) -> void:
var unit: Dictionary = state.get_unit(unit_id)
if unit.is_empty():
failures.append("missing unit for sprite resolution: %s" % unit_id)
return
var sprite := str(unit.get("sprite", ""))
if sprite != expected_sprite:
failures.append("%s sprite mismatch: expected %s got %s" % [unit_id, expected_sprite, sprite])
if bool(unit.get("uses_enemy_sprite", false)) != expected_enemy_sprite:
failures.append("%s enemy sprite flag mismatch: expected %s got %s" % [unit_id, str(expected_enemy_sprite), str(unit.get("uses_enemy_sprite", false))])
_check_image_path(failures, sprite, "unit %s resolved sprite" % unit_id)
func _check_image_path(failures: Array[String], path: String, context: String) -> void:
if path.is_empty():
failures.append("%s has an empty image path" % context)

View File

@@ -1926,6 +1926,9 @@ foreach ($classProp in $classes.PSObject.Properties) {
if (Has-Prop $classProp.Value "sprite") {
Check-Portrait-Path (Get-Prop $classProp.Value "sprite" "") "Class $($classProp.Name) sprite"
}
if (Has-Prop $classProp.Value "enemy_sprite") {
Check-Portrait-Path (Get-Prop $classProp.Value "enemy_sprite" "") "Class $($classProp.Name) enemy_sprite"
}
}
$officerNames = New-Object System.Collections.Generic.HashSet[string]