class_name EventAction extends RefCounted enum Type { SET_FLAG, ADD_RELATIONSHIP_VALUE, DAMAGE_SHIELD, ADD_LEDGER_ENTRY, ADD_OR_REMOVE_ITEM, CREATE_TASK, CREATE_INCIDENT, SET_FACILITY_STATE, TELEPORT_ENTITY_FOR_RECOVERY, SCHEDULE_EVENT, SET_ROUTE_LOCK, } var action_id: StringName = &"" var type: Type = Type.SET_FLAG var payload: Dictionary = {} func configure( p_action_id: StringName, p_type: Variant, p_payload: Dictionary = {} ) -> EventAction: action_id = p_action_id type = _type_from_variant(p_type) payload = p_payload.duplicate(true) return self func is_valid() -> bool: return not action_id.is_empty() and type >= Type.SET_FLAG and type <= Type.SET_ROUTE_LOCK func create_snapshot() -> Dictionary: return { &"action_id": String(action_id), &"type": Type.keys()[type], &"payload": payload.duplicate(true), } static func from_variant(raw_value: Variant) -> EventAction: if raw_value is EventAction: return raw_value if not raw_value is Dictionary: return null return EventAction.new().configure( StringName(_value(raw_value, &"action_id", &"")), _value(raw_value, &"type", "SET_FLAG"), _value(raw_value, &"payload", {}) if _value(raw_value, &"payload", {}) is Dictionary else {} ) static func _type_from_variant(raw_value: Variant) -> Type: if raw_value is int: return clampi(int(raw_value), Type.SET_FLAG, Type.SET_ROUTE_LOCK) as Type var index := Type.keys().find(String(raw_value).to_upper()) return (index if index >= 0 else Type.SET_FLAG) as Type static func _value(source: Dictionary, key: StringName, fallback: Variant) -> Variant: if source.has(key): return source[key] return source.get(String(key), fallback)