76 lines
2.2 KiB
GDScript
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
|