Files

76 lines
2.2 KiB
GDScript

class_name DiveTickRunner
extends RefCounted
const VehicleTelemetry = preload("res://game/application/dive/vehicle_telemetry.gd")
const DiveSession = preload("res://game/domain/dive/dive_session.gd")
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")
const DiveStep = preload("res://game/domain/dive/dive_step.gd")
const DiveUpdate = preload("res://game/domain/dive/dive_update.gd")
var _session: DiveSession
var _next_sequence := 0
func _init(session: DiveSession) -> void:
_session = session
func next_sequence() -> int:
return _next_sequence
func initial_update() -> DiveUpdate:
return DiveUpdate.initial(_session.current_snapshot())
func advance(
telemetry: VehicleTelemetry,
elapsed_seconds: float,
collisions: Array[CollisionObservation] = [],
tool_power_demands: Array[ToolPowerDemand] = [],
ejection_intent: EjectionIntent = null,
return_route: ReturnRouteSample = null
) -> DiveUpdate:
if telemetry == null:
return DiveUpdate.rejected(
_next_sequence,
"vehicle telemetry is missing",
_session.current_snapshot()
)
var telemetry_error: String = telemetry.validation_error(
_session.session_id,
_next_sequence
)
if not telemetry_error.is_empty():
return DiveUpdate.rejected(
_next_sequence,
telemetry_error,
_session.current_snapshot()
)
var tick := DiveTick.new(_session.session_id, _next_sequence, elapsed_seconds)
var sample := DiveTelemetrySample.new(
telemetry.depth_m,
telemetry.longitudinal_effort,
telemetry.steering_effort,
telemetry.vertical_effort,
telemetry.high_thrust_active
)
var step := DiveStep.new(
tick,
sample,
collisions,
tool_power_demands,
ejection_intent,
return_route
)
var update: DiveUpdate = _session.advance(step)
if update.accepted:
_next_sequence += 1
return update