91 lines
2.1 KiB
GDScript
91 lines
2.1 KiB
GDScript
class_name SimulationCommand
|
|
extends RefCounted
|
|
|
|
var command_id := 0
|
|
var issued_tick := 0
|
|
var execute_tick := 0
|
|
var priority := 0
|
|
var command_type: StringName = &""
|
|
var actor_id: StringName = &""
|
|
var target_id: StringName = &""
|
|
var payload: Dictionary = {}
|
|
var idempotency_key: StringName = &""
|
|
|
|
|
|
func _init(
|
|
p_command_id: int = 0,
|
|
p_issued_tick: int = 0,
|
|
p_execute_tick: int = 0,
|
|
p_priority: int = 0,
|
|
p_command_type: StringName = &"",
|
|
p_actor_id: StringName = &"",
|
|
p_target_id: StringName = &"",
|
|
p_payload: Dictionary = {},
|
|
p_idempotency_key: StringName = &""
|
|
) -> void:
|
|
command_id = p_command_id
|
|
issued_tick = p_issued_tick
|
|
execute_tick = p_execute_tick
|
|
priority = p_priority
|
|
command_type = p_command_type
|
|
actor_id = p_actor_id
|
|
target_id = p_target_id
|
|
payload = p_payload.duplicate(true)
|
|
idempotency_key = p_idempotency_key
|
|
|
|
|
|
func validation_error() -> String:
|
|
if command_id <= 0:
|
|
return "command_id must be greater than zero."
|
|
if issued_tick < 0:
|
|
return "issued_tick cannot be negative."
|
|
if execute_tick < issued_tick:
|
|
return "execute_tick cannot be earlier than issued_tick."
|
|
return ""
|
|
|
|
|
|
func is_valid() -> bool:
|
|
return validation_error().is_empty()
|
|
|
|
|
|
func copy() -> SimulationCommand:
|
|
return SimulationCommand.new(
|
|
command_id,
|
|
issued_tick,
|
|
execute_tick,
|
|
priority,
|
|
command_type,
|
|
actor_id,
|
|
target_id,
|
|
payload,
|
|
idempotency_key
|
|
)
|
|
|
|
|
|
func to_dictionary() -> Dictionary:
|
|
return {
|
|
"command_id": command_id,
|
|
"issued_tick": issued_tick,
|
|
"execute_tick": execute_tick,
|
|
"priority": priority,
|
|
"command_type": String(command_type),
|
|
"actor_id": String(actor_id),
|
|
"target_id": String(target_id),
|
|
"payload": payload.duplicate(true),
|
|
"idempotency_key": String(idempotency_key),
|
|
}
|
|
|
|
|
|
static func from_dictionary(data: Dictionary) -> SimulationCommand:
|
|
return SimulationCommand.new(
|
|
int(data.get("command_id", 0)),
|
|
int(data.get("issued_tick", 0)),
|
|
int(data.get("execute_tick", 0)),
|
|
int(data.get("priority", 0)),
|
|
StringName(data.get("command_type", "")),
|
|
StringName(data.get("actor_id", "")),
|
|
StringName(data.get("target_id", "")),
|
|
data.get("payload", {}) as Dictionary,
|
|
StringName(data.get("idempotency_key", ""))
|
|
)
|