Files
TheTree_mock/scripts/events/event_choice.gd
T

106 lines
3.1 KiB
GDScript

class_name EventChoice
extends RefCounted
const EventConditionType = preload("res://scripts/events/event_condition.gd")
const EventActionType = preload("res://scripts/events/event_action.gd")
var choice_id: StringName = &""
var text_key: StringName = &""
var conditions: Array[EventCondition] = []
var cost: Dictionary = {}
var effect_preview: Dictionary = {}
var actions: Array[EventAction] = []
func configure(
p_choice_id: StringName,
p_text_key: StringName,
p_conditions: Array = [],
p_cost: Dictionary = {},
p_effect_preview: Dictionary = {},
p_actions: Array = []
) -> EventChoice:
choice_id = p_choice_id
text_key = p_text_key
conditions.clear()
for raw_condition: Variant in p_conditions:
var condition := EventConditionType.from_variant(raw_condition)
if condition != null:
conditions.append(condition)
cost = p_cost.duplicate(true)
effect_preview = p_effect_preview.duplicate(true)
actions.clear()
for raw_action: Variant in p_actions:
var action := EventActionType.from_variant(raw_action)
if action != null:
actions.append(action)
return self
func is_valid() -> bool:
if choice_id.is_empty() or text_key.is_empty():
return false
for condition: EventCondition in conditions:
if condition == null or not condition.is_valid():
return false
for action: EventAction in actions:
if action == null or not action.is_valid():
return false
for raw_key: Variant in cost:
if StringName(raw_key).is_empty() or int(cost[raw_key]) < 0:
return false
return true
func conditions_match(context: Dictionary, callbacks: Dictionary = {}) -> bool:
for condition: EventCondition in conditions:
if not condition.evaluate(context, callbacks):
return false
return true
func create_snapshot() -> Dictionary:
var condition_snapshots: Array[Dictionary] = []
var action_snapshots: Array[Dictionary] = []
for condition: EventCondition in conditions:
condition_snapshots.append(condition.create_snapshot())
for action: EventAction in actions:
action_snapshots.append(action.create_snapshot())
return {
&"choice_id": String(choice_id),
&"text_key": String(text_key),
&"conditions": condition_snapshots,
&"cost": cost.duplicate(true),
&"effect_preview": effect_preview.duplicate(true),
&"actions": action_snapshots,
}
static func from_variant(raw_value: Variant) -> EventChoice:
if raw_value is EventChoice:
return raw_value
if not raw_value is Dictionary:
return null
return EventChoice.new().configure(
StringName(_value(raw_value, &"choice_id", &"")),
StringName(_value(raw_value, &"text_key", &"")),
_array(_value(raw_value, &"conditions", [])),
_dictionary(_value(raw_value, &"cost", {})),
_dictionary(_value(raw_value, &"effect_preview", {})),
_array(_value(raw_value, &"actions", []))
)
static func _value(source: Dictionary, key: StringName, fallback: Variant) -> Variant:
if source.has(key):
return source[key]
return source.get(String(key), fallback)
static func _array(value: Variant) -> Array:
return value if value is Array else []
static func _dictionary(value: Variant) -> Dictionary:
return value if value is Dictionary else {}