Files
gamedev-the-steward/simulation/definitions/SimulationDefinitions.gd
T

149 lines
4.6 KiB
GDScript

class_name SimulationDefinitions
extends RefCounted
const ACTION_PATHS := [
"res://simulation/definitions/actions/gather_food.tres",
"res://simulation/definitions/actions/gather_wood.tres",
"res://simulation/definitions/actions/feed_animal.tres",
"res://simulation/definitions/actions/patrol.tres",
"res://simulation/definitions/actions/study.tres",
"res://simulation/definitions/actions/eat.tres",
"res://simulation/definitions/actions/rest.tres",
"res://simulation/definitions/actions/wander.tres",
"res://simulation/definitions/actions/deposit_food.tres",
"res://simulation/definitions/actions/withdraw_food.tres",
"res://simulation/definitions/actions/sleep.tres",
"res://simulation/definitions/actions/deposit_wood.tres",
"res://simulation/definitions/actions/defend.tres"
]
const PROFESSION_PATHS := [
"res://simulation/definitions/professions/farmer.tres",
"res://simulation/definitions/professions/woodcutter.tres",
"res://simulation/definitions/professions/guard.tres",
"res://simulation/definitions/professions/scholar.tres",
"res://simulation/definitions/professions/wanderer.tres"
]
static var _action_list: Array[ActionDefinition] = []
static var _profession_list: Array[ProfessionDefinition] = []
static var _action_map: Dictionary = {}
static var _profession_map: Dictionary = {}
static var _profession_id_list: Array[StringName] = []
static var _catalog_errors: Array[String] = []
static var _cache_valid := false
static func _ensure_cache() -> void:
if _cache_valid:
return
_action_list = []
_profession_list = []
_action_map = {}
_profession_map = {}
_profession_id_list = []
_catalog_errors = []
var catalog := ContentCatalog.create_core()
if not catalog.is_valid():
_catalog_errors = catalog.get_errors()
_cache_valid = true
return
_action_list = catalog.get_actions()
_profession_list = catalog.get_professions()
for definition in _action_list:
_action_map[definition.action_id] = definition
for definition in _profession_list:
_profession_map[definition.profession_id] = definition
_profession_id_list.append(definition.profession_id)
_cache_valid = true
static func invalidate_cache() -> void:
_cache_valid = false
static func get_actions() -> Array[ActionDefinition]:
_ensure_cache()
return _action_list
static func get_professions() -> Array[ProfessionDefinition]:
_ensure_cache()
return _profession_list
static func get_action(action_id: StringName) -> ActionDefinition:
_ensure_cache()
return _action_map.get(action_id)
static func get_profession(profession_id: StringName) -> ProfessionDefinition:
_ensure_cache()
return _profession_map.get(profession_id)
static func get_profession_ids() -> Array[StringName]:
_ensure_cache()
return _profession_id_list
static func validate() -> Array[String]:
_ensure_cache()
var errors: Array[String] = _catalog_errors.duplicate()
if _action_list.size() != ACTION_PATHS.size():
errors.append("One or more ActionDefinition resources failed to load")
if _profession_list.size() != PROFESSION_PATHS.size():
errors.append("One or more ProfessionDefinition resources failed to load")
var action_ids := {}
for definition in _action_list:
for error in definition.validate():
errors.append("ActionDefinition: " + error)
if action_ids.has(definition.action_id):
errors.append("Duplicate action_id '%s'" % definition.action_id)
action_ids[definition.action_id] = true
var profession_ids := {}
for definition in _profession_list:
for error in definition.validate():
errors.append("ProfessionDefinition: " + error)
if profession_ids.has(definition.profession_id):
errors.append("Duplicate profession_id '%s'" % definition.profession_id)
profession_ids[definition.profession_id] = true
for definition in _action_list:
if (
not definition.preferred_profession_id.is_empty()
and not profession_ids.has(definition.preferred_profession_id)
):
errors.append(
(
"Action '%s' references unknown profession '%s'"
% [definition.action_id, definition.preferred_profession_id]
)
)
if (
definition.target_type == SimulationIds.TARGET_RESOURCE
and not action_ids.has(definition.resource_action_id)
):
errors.append(
(
"Action '%s' references unknown resource action '%s'"
% [definition.action_id, definition.resource_action_id]
)
)
if (
not definition.completion_cost_resource_id.is_empty()
and (
definition.completion_cost_resource_id
not in [SimulationIds.RESOURCE_FOOD, SimulationIds.RESOURCE_WOOD]
)
):
errors.append(
(
"Action '%s' references unknown completion cost resource '%s'"
% [definition.action_id, definition.completion_cost_resource_id]
)
)
return errors