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", "")) )