106 lines
3.1 KiB
GDScript
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 {}
|