refactor: separate content from presentation assets
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user