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