#pragma once #include "CoreMinimal.h" /** * Constants of the Tender (the Kazah "subtub"), DESIGN_UE.md section 4 (v2 updateSub / subStats), and of the carousel, hoist, * launch and dock of section 3.5. Tender-local METRES (+X nose, +Y starboard, +Z up) or carrier-local metres where the name says so. */ namespace Descent::Tune::Tender { // ---- fleet (4.1) -------------------------------------------------------------------------------------------- constexpr int32 FleetCount = 3; // ---- derived stats (4.2) ------------------------------------------------------------------------------------ constexpr double HullBaseHP = 100.0; // HullMax = 100 * (1 + 0.5 HullMk) constexpr double HullPerMk = 0.5; constexpr double RatingBaseM = 2300.0, RatingMk1M = 2700.0, RatingMk2M = 3150.0; constexpr double CapacityBase = 100.0, CapacityCell2 = 170.0; constexpr double SpeedBaseMps = 9.0; // Speed = 9 * spec.Speed * (1 + 0.25 ThrustMk) constexpr double SpeedPerThrustMk = 0.25; constexpr int32 HoldPerMk = 8; constexpr double BioCapFu = 4.0; constexpr double DrillRBase = 3.0, DrillRPerMk = 0.7; constexpr double DrillRateBase = 9.0, DrillRatePerMk = 0.5; constexpr double SonarRangeM = 160.0, SonarRangeModuleM = 260.0; constexpr double SuctionRangeM = 13.0, SuctionPull = 9.0, SuctionRangeMk2M = 22.0, SuctionPullMk2 = 16.0; // ---- flight (4.3) ------------------------------------------------------------------------------------------- constexpr double SteerScale = 0.85; // 0.102 deg per pixel = the foot sensitivity (0.12) x 0.85 constexpr double PitchLimitDeg = 77.0; constexpr double RollPerStrafeRad = 0.2; // cosmetic bank into a strafe constexpr double RollPerLookPx = 0.004; // and into a turn (per pixel of mouse per 1/60 s, as v2 measured it) constexpr double RollLookLimitRad = 0.3; constexpr double RollDampK = 3.0; constexpr double VelocityK = 1.8; // vel = lerp(vel, wish * MaxS, 1 - exp(-1.8 dt)) constexpr double BoostFactor = 1.7; constexpr double UnpoweredFactor = 0.3; constexpr double TerrainPushFactor = 0.9; // pos -= Gradient * 0.9 * pen constexpr double TerrainBounce = 1.2; // remove the into-rock velocity x 1.2 constexpr int32 TerrainIterations = 2; constexpr double CarrierRadiusM = 2.0; // carrier hull push-out sphere around the Tender origin constexpr double ImpactSpeedMps = 4.5; // damage above this normal speed constexpr double ImpactHPPerMps = 5.0; constexpr double RotorRpmPerThrust = 305.0; // v2: spin += 32 thrust dt (rad) = 305 rpm at thrust 1 // ---- the one drill-plus-suction tool (4.5) and loose ore (2.12) ------------------------------------------------ constexpr double DrillReachM = 16.0, DrillAheadM = 0.8, LaserReachM = 28.0, LaserAheadM = 0.5; constexpr double DrillCleanupEverySec = 0.5; constexpr double DrainDrill = 1.3, DrainLaser = 1.9, DrainSuction = 0.35; constexpr double SuctionConeCos = 0.55, SuctionNearM = 3.0, SuctionCaptureM = 1.6, SuctionFalloff = 1.2; constexpr double HoldFullToastEverySec = 2.0; constexpr double ToolTipX = 2.46, ToolTipZ = -0.775; // the front face of the housing; y = ToolSide * 0.69 constexpr int32 LooseMax = 160; constexpr double LooseSizeM = 0.34, LooseRadiusM = 0.35, LooseGravity = 0.5, LooseDragK = 1.2, LooseBounce = 1.4, LooseDamp = 0.8; constexpr double DrillGlowRadiusM = 9.0; // ---- energy (units per second; power is stored as percent of the capacity) ---------------------------------- constexpr double DrainIdle = 0.1, DrainBoost = 0.7, DrainHeadlight = 0.06; constexpr double PowerWarnPct = 20.0; constexpr double DockedPowerPctPerSec = 6.0, DockedHullHPPerSec = 4.0; // ---- crush and honest voids --------------------------------------------------------------------------------- constexpr double CrushBaseHPPerSec = 0.6; // (0.6 + over / 25) HP/s below the rating constexpr double CrushOverDivisor = 25.0; constexpr double CrushWarnAboveM = 50.0; // dash warning from 50 m above the rating constexpr double CrushAlarmEverySec = 1.6; constexpr double HonestVoidHPPerSec = 14.0; constexpr double HullRedPct = 30.0; // ---- lights (4.4) ------------------------------------------------------------------------------------------- constexpr double HeadlampX = 3.74, HeadlampDownDeg = 3.0; constexpr float LensGlowOn = 6.0f, LensGlowOff = 0.1f; constexpr double CockpitGlowRadiusM = 1.5; constexpr float CockpitGlowIntensity = 0.15f; constexpr double BeaconOnSec = 0.25, BeaconPeriodSec = 1.6; constexpr double BeaconX = -0.9, BeaconZ = 1.58; // on the roof behind the hatch (blockout, guess) // ---- cockpit and dashboards (4.6) --------------------------------------------------------------------------- constexpr double EyeX = 1.95, EyeY = 0.0, EyeZ = 0.72; /** * The design's "FOV 72" is v2's three.js camera, whose field of view is VERTICAL; Unreal's is horizontal. 72 degrees vertical is * 104.5 degrees horizontal at 16:9. With 72 horizontal the dash (24 degrees below the horizon) is below the bottom of the picture. */ constexpr float CockpitFovDeg = 104.5f; constexpr double DockedLookYawDeg = 75.0, DockedLookPitchDownDeg = 52.0, DockedLookPitchUpDeg = 40.0; /** * The dashboards keep the design's place and attitude relative to the eye, but not its sizes: 1.10 m and 0.30 m were v2's own * cockpit. The Kazah's console is 0.62 m wide (model: x 2.54..2.80, y +-0.31) and its canopy about 1.2 m at that station, so the * main dash is 0.62 m wide above the console and the cargo display 0.26 m, moved 6 cm outboard so the two do not overlap in view. */ constexpr double DashMainDX = 0.75, DashMainDZ = -0.34, DashMainPitchBackDeg = 14.0, DashMainWidthM = 0.62; constexpr double DashCargoDX = 0.60, DashCargoDY = 0.42, DashCargoDZ = -0.25, /* -0.30 put its lower edge and the BIO value below the bottom of the picture (fix list after M3, U11) */ DashCargoYawDeg = 35.0, DashCargoWidthM = 0.26; // ---- lids (4.1) --------------------------------------------------------------------------------------------- constexpr double CanopyOpenDeg = 55.0, CanopyOpenSec = 0.5; /** * The canopy turns about the TOP of its rear hoop, not about the exported pivot at the hoop's bottom (1.207, 0, -0.035): about the * bottom, the 1.27 m tall hoop swings a metre back through the hull roof and the hoist clamp. The top of the hoop is at z 1.24 (model). */ constexpr double CanopyHingeX = 1.207, CanopyHingeZ = 1.24; constexpr double HatchOpenDeg = 70.0, HatchOpenSec = 0.4; constexpr double ToolSide = 1.0; // +1 = starboard (the user's decision, BRIEF section 3): the left side stays free // ---- boarding, leaving, abandoned Tenders (3.5, 4.7, 5.3) --------------------------------------------------- constexpr double BoardRangeM = 4.5; constexpr double BoardCameraSec = 0.9; // Board = canopy 0.5 s + camera 0.9 s = 1.4 s constexpr double EnterRangeM = 4.5; constexpr double SwimmerExitX = 1.2, SwimmerExitY = -2.2, SwimmerExitZ = 0.2; constexpr double SwimmerKeepOutM = 2.2; // a swimmer is pushed out to this distance from an undocked Tender's origin constexpr double ReplacementPowerPct = 60.0; // the hull printed after an implosion // ---- carousel and hoist (3.5), carrier-local ---------------------------------------------------------------- constexpr double HubX = -29.0, HubY = 0.0, HubZ = 0.0; constexpr double ArmRadiusM = 6.0; constexpr double LaunchArmYawDeg = 90.0; // the arm that points to +y is over the pool constexpr double StowedZ = -1.0, BoardZ = -6.3, DockBelowZ = -16.0; constexpr double RotateStepDeg = 120.0; constexpr double RotateRateRadPerSec = 0.35; constexpr double HoistSpeedMps = 2.0; constexpr double LaunchSec = 3.2; constexpr double LaunchExitDownMps = 1.0; // handed over with carrier velocity + (0, 0, -1) constexpr double DockBlendSec = 1.6, DockRiseSec = 2.6; constexpr double DockZoneX = 9.0, DockZoneY = 7.0, DockZoneZ0 = -34.0, DockZoneZ1 = -11.0; constexpr double MinTenderGapM = 2.0; // clearance test: between any two Tender boxes through 360 degrees constexpr double MinLiveClearanceM = 0.3; // m3_launch_dock: carrier.carousel.min_clearance_m stays above this constexpr double ArmBeamZ = 0.85; // blockout: the arm beams run under the bay ceiling, above the stowed Tenders constexpr double ClampAboveOriginM = 1.56; // the clamp plate sits on the hatch collar (model top 1.545) constexpr double HubRadiusM = 0.6; /** * Not in the design: a Tender that rises into the pool mouth (inside the pool rectangle, above this carrier-local z, still pushing up) * is docked by the hoist without E. Without it the mouth, which is closed to a free Tender, would be a place where an upward flight * stops against nothing visible (requirement U7). The hull line under the pool is at about z -12.1 for the Tender's origin. */ constexpr double AutoDockAboveZ = -13.4; constexpr double HudPanelLookYawDeg = 35.0; // docked and looking this far aside, the dash is out of view: the HUD vehicle panel shows }