refactor: separate content from presentation assets

This commit is contained in:
Rijad Zuzo
2026-08-12 21:41:33 +02:00
parent 5a70aaaded
commit bf4bf73675
22 changed files with 480 additions and 70 deletions
+18 -3
View File
@@ -10,6 +10,7 @@ signal navigation_failed(animal_id: StringName, site_id: StringName)
static var _all: Array[AnimalNode] = []
static var _core_animal_catalog: AnimalCatalog
static var _core_presentation_catalog: PresentationCatalog
@export var animal_id: StringName
@export var display_name := "Animal"
@@ -39,6 +40,7 @@ var navigation_request_id := 0
var path_pending := false
var has_reported_navigation_result := true
var _animal_definition: AnimalDefinition
var _presentation_parameters: Dictionary = {}
func _ready() -> void:
@@ -132,7 +134,9 @@ func supports_action(action_id: StringName) -> bool:
return action_id in supported_action_ids
func apply_animal_definition(definition: AnimalDefinition) -> bool:
func apply_animal_definition(
definition: AnimalDefinition, presentation_parameters: Dictionary = {}
) -> bool:
if definition == null or not definition.validate().is_empty():
return false
if state != null and state.get_animal_definition_id() != definition.animal_definition_id:
@@ -142,9 +146,10 @@ func apply_animal_definition(definition: AnimalDefinition) -> bool:
species_id = definition.species_id
supported_action_ids = definition.supported_action_ids.duplicate()
move_speed = definition.movement_speed
_presentation_parameters = presentation_parameters.duplicate(true)
var visual := get_node_or_null("Visual")
if visual != null and visual.has_method("apply_animal_definition"):
return bool(visual.apply_animal_definition(definition))
return bool(visual.apply_animal_definition(definition, _presentation_parameters))
return true
@@ -164,7 +169,17 @@ func _ensure_animal_definition() -> bool:
_core_animal_catalog = AnimalCatalog.create_core()
if _core_animal_catalog == null:
return false
return apply_animal_definition(_core_animal_catalog.get_definition(animal_definition_id))
var definition := _core_animal_catalog.get_definition(animal_definition_id)
if _core_presentation_catalog == null:
_core_presentation_catalog = PresentationCatalog.create_core()
if (
definition == null
or _core_presentation_catalog == null
or not _core_presentation_catalog.is_valid()
):
return false
var cue := _core_presentation_catalog.get_definition(definition.presentation_cue_id)
return cue != null and apply_animal_definition(definition, cue.get_parameters())
func get_hunger() -> float:
+17 -8
View File
@@ -28,6 +28,7 @@ var body_base_scale: Vector3
var fluff_front_base_scale: Vector3
var fluff_back_base_scale: Vector3
var _animal_definition: AnimalDefinition
var _presentation_parameters: Dictionary = {}
func _ready() -> void:
@@ -40,10 +41,13 @@ func _ready() -> void:
reset_transient_feedback()
func apply_animal_definition(definition: AnimalDefinition) -> bool:
func apply_animal_definition(
definition: AnimalDefinition, presentation_parameters: Dictionary = {}
) -> bool:
if definition == null or not definition.validate().is_empty():
return false
_animal_definition = definition
_presentation_parameters = presentation_parameters.duplicate(true)
if is_node_ready():
_apply_definition_presentation()
return true
@@ -52,13 +56,18 @@ func apply_animal_definition(definition: AnimalDefinition) -> bool:
func _apply_definition_presentation() -> void:
if _animal_definition == null:
return
scale = _animal_definition.visual_scale
body.scale = body_base_scale * _animal_definition.body_scale
fluff_front.scale = fluff_front_base_scale * _animal_definition.fluff_scale
fluff_back.scale = fluff_back_base_scale * _animal_definition.fluff_scale
horn_left.visible = _animal_definition.show_horns
horn_right.visible = _animal_definition.show_horns
beard.visible = _animal_definition.show_beard
scale = _parameter_vector("visual_scale", Vector3.ONE)
body.scale = body_base_scale * _parameter_vector("body_scale", Vector3.ONE)
fluff_front.scale = fluff_front_base_scale * _parameter_vector("fluff_scale", Vector3.ONE)
fluff_back.scale = fluff_back_base_scale * _parameter_vector("fluff_scale", Vector3.ONE)
horn_left.visible = bool(_presentation_parameters.get("show_horns", true))
horn_right.visible = bool(_presentation_parameters.get("show_horns", true))
beard.visible = bool(_presentation_parameters.get("show_beard", true))
func _parameter_vector(key: String, fallback: Vector3) -> Vector3:
var value: Variant = _presentation_parameters.get(key, fallback)
return value as Vector3 if value is Vector3 else fallback
func _process(delta: float) -> void: