71 lines
2.5 KiB
GDScript
71 lines
2.5 KiB
GDScript
class_name DiveStep
|
|
extends RefCounted
|
|
|
|
const DiveTick = preload("res://game/domain/dive/dive_tick.gd")
|
|
const DiveTelemetrySample = preload("res://game/domain/dive/dive_telemetry_sample.gd")
|
|
const CollisionObservation = preload("res://game/domain/dive/collision_observation.gd")
|
|
const ToolPowerDemand = preload("res://game/domain/dive/tool_power_demand.gd")
|
|
const EjectionIntent = preload("res://game/domain/dive/ejection_intent.gd")
|
|
const ReturnRouteSample = preload("res://game/domain/dive/return_route_sample.gd")
|
|
|
|
var tick: DiveTick
|
|
var telemetry: DiveTelemetrySample
|
|
var collisions: Array[CollisionObservation]
|
|
var tool_power_demands: Array[ToolPowerDemand]
|
|
var ejection_intent: EjectionIntent
|
|
var return_route: ReturnRouteSample
|
|
|
|
|
|
func _init(
|
|
p_tick: DiveTick,
|
|
p_telemetry: DiveTelemetrySample,
|
|
p_collisions: Array[CollisionObservation] = [],
|
|
p_tool_power_demands: Array[ToolPowerDemand] = [],
|
|
p_ejection_intent: EjectionIntent = null,
|
|
p_return_route: ReturnRouteSample = null
|
|
) -> void:
|
|
tick = p_tick
|
|
telemetry = p_telemetry
|
|
collisions = p_collisions.duplicate()
|
|
tool_power_demands = p_tool_power_demands.duplicate()
|
|
ejection_intent = p_ejection_intent if p_ejection_intent != null else EjectionIntent.new()
|
|
return_route = p_return_route if p_return_route != null else ReturnRouteSample.new()
|
|
|
|
|
|
func validation_error() -> String:
|
|
if tick == null:
|
|
return "DiveStep has no tick"
|
|
var error: String = tick.validation_error()
|
|
if not error.is_empty():
|
|
return error
|
|
if telemetry == null:
|
|
return "DiveStep has no telemetry"
|
|
error = telemetry.validation_error()
|
|
if not error.is_empty():
|
|
return error
|
|
if ejection_intent == null:
|
|
return "DiveStep has no ejection intent"
|
|
if return_route == null:
|
|
return "DiveStep has no return route sample"
|
|
error = return_route.validation_error()
|
|
if not error.is_empty():
|
|
return error
|
|
for collision: CollisionObservation in collisions:
|
|
if collision == null:
|
|
return "DiveStep contains a null collision"
|
|
error = collision.validation_error(tick.sequence)
|
|
if not error.is_empty():
|
|
return error
|
|
for demand: ToolPowerDemand in tool_power_demands:
|
|
if demand == null:
|
|
return "DiveStep contains a null tool power demand"
|
|
error = demand.validation_error()
|
|
if not error.is_empty():
|
|
return error
|
|
var tool_ids: Dictionary[StringName, bool] = {}
|
|
for demand: ToolPowerDemand in tool_power_demands:
|
|
if tool_ids.has(demand.tool_id):
|
|
return "DiveStep contains duplicate tool power demands"
|
|
tool_ids[demand.tool_id] = true
|
|
return ""
|