class_name ResolvedDiveRules extends RefCounted var battery_capacity_kwh: float var oxygen_capacity_l: float var oxygen_consumption_l_per_min: float var hull_max_integrity: float var certified_depth_m: float var critical_depth_m: float var crush_depth_m: float var certified_pressure_bar: float var critical_pressure_bar: float var crush_pressure_bar: float var longitudinal_power_kw: float var steering_power_kw: float var vertical_power_kw: float var high_thrust_power_kw: float var return_energy_kwh_per_m: float var ascent_energy_kwh_per_m: float var pressure_damage_multiplier: float var collision_damage_multiplier: float var collision_speed_threshold_mps: float var collision_damage_per_excess_mps: float var collision_repeat_delay_seconds: float var crush_grace_seconds: float var attention_ratio: float var return_ratio: float var critical_ratio: float var ejection_hold_seconds: float func _init( p_battery_capacity_kwh: float, p_oxygen_capacity_l: float, p_oxygen_consumption_l_per_min: float, p_hull_max_integrity: float, p_certified_depth_m: float, p_longitudinal_power_kw: float, p_steering_power_kw: float, p_vertical_power_kw: float, p_high_thrust_power_kw: float, p_return_energy_kwh_per_m: float, p_ascent_energy_kwh_per_m: float, p_pressure_damage_multiplier: float, p_collision_damage_multiplier: float, p_collision_speed_threshold_mps: float, p_collision_damage_per_excess_mps: float, p_collision_repeat_delay_seconds: float, p_crush_grace_seconds: float, p_attention_ratio: float, p_return_ratio: float, p_critical_ratio: float, p_ejection_hold_seconds: float ) -> void: battery_capacity_kwh = p_battery_capacity_kwh oxygen_capacity_l = p_oxygen_capacity_l oxygen_consumption_l_per_min = p_oxygen_consumption_l_per_min hull_max_integrity = p_hull_max_integrity certified_depth_m = p_certified_depth_m critical_depth_m = certified_depth_m * 1.15 crush_depth_m = certified_depth_m * 1.25 certified_pressure_bar = _pressure_at_depth(certified_depth_m) critical_pressure_bar = _pressure_at_depth(critical_depth_m) crush_pressure_bar = _pressure_at_depth(crush_depth_m) longitudinal_power_kw = p_longitudinal_power_kw steering_power_kw = p_steering_power_kw vertical_power_kw = p_vertical_power_kw high_thrust_power_kw = p_high_thrust_power_kw return_energy_kwh_per_m = p_return_energy_kwh_per_m ascent_energy_kwh_per_m = p_ascent_energy_kwh_per_m pressure_damage_multiplier = p_pressure_damage_multiplier collision_damage_multiplier = p_collision_damage_multiplier collision_speed_threshold_mps = p_collision_speed_threshold_mps collision_damage_per_excess_mps = p_collision_damage_per_excess_mps collision_repeat_delay_seconds = p_collision_repeat_delay_seconds crush_grace_seconds = p_crush_grace_seconds attention_ratio = p_attention_ratio return_ratio = p_return_ratio critical_ratio = p_critical_ratio ejection_hold_seconds = p_ejection_hold_seconds func validation_error() -> String: for positive_value: float in [ battery_capacity_kwh, oxygen_capacity_l, oxygen_consumption_l_per_min, hull_max_integrity, certified_depth_m, longitudinal_power_kw, return_energy_kwh_per_m, collision_speed_threshold_mps, collision_damage_per_excess_mps, collision_repeat_delay_seconds, crush_grace_seconds, ejection_hold_seconds, ]: if not is_finite(positive_value) or positive_value <= 0.0: return "resolved positive values must be finite and greater than zero" for non_negative_value: float in [ steering_power_kw, vertical_power_kw, high_thrust_power_kw, ascent_energy_kwh_per_m, ]: if not is_finite(non_negative_value) or non_negative_value < 0.0: return "resolved non-negative values must be finite" if not ( critical_ratio > 0.0 and critical_ratio < return_ratio and return_ratio < attention_ratio and attention_ratio < 1.0 ): return "alert ratios must be ordered between zero and one" if pressure_damage_multiplier <= 0.0 or collision_damage_multiplier <= 0.0: return "damage multipliers must be positive" return "" static func _pressure_at_depth(depth_m: float) -> float: return 1.0 + depth_m / 10.0