#include "UI/DescentUiDemo.h" #include "UI/NeuStyle.h" namespace { FDescentUiCost DemoCost(const TCHAR* Item, const TCHAR* Name, int32 Need, int32 Have) { FDescentUiCost C; C.ItemId = Item; C.Name = Name; C.Need = Need; C.Have = Have; return C; } FDescentRecipeRow DemoRecipe(const TCHAR* Id, const TCHAR* Icon, const TCHAR* Name, const TCHAR* Desc, TArray Costs, bool bLocked = false, const TCHAR* Reason = TEXT("")) { FDescentRecipeRow R; R.Id = Id; R.IconItem = Icon; R.Name = Name; R.Desc = Desc; R.Costs = MoveTemp(Costs); R.bLocked = bLocked; R.LockedReason = Reason; return R; } FDescentPdaItem DemoItem(const TCHAR* Id, const TCHAR* Name, int32 Count) { FDescentPdaItem I; I.ItemId = Id; I.Name = Name; I.Count = Count; return I; } FDescentStatusLine DemoLine(const TCHAR* Label, const FString& Value, float Fraction, const FLinearColor& Color) { FDescentStatusLine L; L.Label = Label; L.Value = Value; L.Fraction = Fraction; L.Color = Color; return L; } } namespace Descent::Ui { void FillDemoHud(FDescentHudModel& H, EHudDemoMode Mode) { H.Reset(); const bool bFoot = Mode == EHudDemoMode::Foot; const bool bSwim = Mode == EHudDemoMode::Swim; const bool bSub = Mode == EHudDemoMode::Sub; const bool bHelm = Mode == EHudDemoMode::HelmChase || Mode == EHudDemoMode::HelmBridge; static const TCHAR* ModeNames[] = { TEXT("Foot"), TEXT("Swim"), TEXT("Sub"), TEXT("Helm"), TEXT("Helm") }; H.Mode = ModeNames[static_cast(Mode)]; H.DepthM = bFoot ? 1810.0 : (bSub ? 2061.0 : 1934.0); H.DepthText = FDescentHudModel::FormatDepth(H.DepthM); H.Band = bSub ? TEXT("THE SIEVE") : TEXT("THE THROAT"); H.RatingM = bSub ? 2300.0 : (bHelm ? 3250.0 : 0.0); H.RatingText = H.RatingM > 0.0 ? FString::Printf(TEXT("RATING %s"), *FDescentHudModel::FormatThousands(H.RatingM)) + TEXT(" m") : FString(); H.CompassHeadingDeg = 62.f; H.Objective = TEXT("Reach the Great Void and bring back cobalt glass for the depth module. Tethys is watching the debt clock."); H.PushToast(TEXT("Ferrite ingot x2 refined"), EDescentHudToastKind::Good, 3600.f); H.PushToast(TEXT("Hull stress rising"), EDescentHudToastKind::Warn, 3600.f); H.PushToast(TEXT("Log recovered: Kilo-7"), EDescentHudToastKind::Info, 3600.f); H.Vitals.Health = 86.f; H.Vitals.Nutrition = 42.f; H.Vitals.O2Seconds = 38.f; H.Vitals.O2MaxSeconds = 90.f; H.Vitals.bShowO2 = bSwim || bFoot; // the worst case on foot too, so the layout test sees three gauges H.Vitals.BioReserveFu = 6.f; H.Vitals.BioCapFu = 20.f; H.Vitals.bShowBio = true; H.TemperatureC = bFoot ? 26.0 : 4.6; H.TemperatureLabel = bFoot ? TEXT("CABIN") : TEXT("WATER"); H.TemperatureText = FDescentHudModel::FormatTemperature(H.TemperatureC, H.TemperatureLabel); H.Vehicle.bVisible = bHelm || bSub || bFoot; // shown with everything else in the foot demo: the layout must hold in the worst case H.Vehicle.Title = bHelm ? TEXT("CANTICLE") : TEXT("KAZAH-1"); H.Vehicle.HullPct = bHelm ? 91.f : 74.f; H.Vehicle.PowerPct = 58.f; H.Vehicle.HoldUsed = 5.f; H.Vehicle.HoldCap = bHelm ? 0.f : 8.f; H.Vehicle.SpeedMps = bHelm ? 1.2f : 1.4f; H.Vehicle.ThrottlePct = bHelm ? 60.f : 0.f; H.bShowHotbar = bFoot || bSwim; FDescentHudHotbarSlot Slots[5]; Slots[0].ItemId = TEXT("flashlight"); Slots[1].ItemId = TEXT("scanner"); Slots[2].ItemId = TEXT("flare"); Slots[2].Count = 3; Slots[4].ItemId = TEXT("beacon"); Slots[4].Count = 2; for (const FDescentHudHotbarSlot& S : Slots) { H.Hotbar.Add(S); } H.HotbarSelected = 2; H.SetRadio(TEXT("CANTICLE, bridge. The Shear is building above the rim, contractor."), 0.f); H.bCrosshair = !bHelm; H.Prompt = TEXT("E Take the helm"); H.bHelmReticle = bHelm; H.HelmAimNormalized = FVector2D(0.28, -0.12); H.BuildReason = bFoot ? TEXT("Blocked: too close to a door") : TEXT(""); H.bShowProximity = bHelm || bFoot; H.Proximity = { { TEXT("BOW"), 12.4f, false }, { TEXT("KEEL"), 6.2f, true }, { TEXT("PORT"), 21.0f, false }, { TEXT("STBD"), 18.5f, false } }; H.Warnings.bShear = true; H.Warnings.Text = TEXT("SHEAR CURRENT ABOVE THE RIM"); } void FillDemo(FDescentUiModels& M, FDescentHudModel& Hud) { M = FDescentUiModels(); FillDemoHud(Hud, EHudDemoMode::Foot); // ---- PDA: inventory ---- FDescentPdaViewModel& P = M.Pda; P.Slots.SetNum(24); P.Slots[0] = DemoItem(TEXT("flashlight"), TEXT("Flashlight"), 1); P.Slots[1] = DemoItem(TEXT("scanner"), TEXT("Handheld Sonar"), 1); P.Slots[2] = DemoItem(TEXT("flare"), TEXT("Flare"), 3); P.Slots[3] = DemoItem(TEXT("beacon"), TEXT("Marker Beacon"), 2); P.Slots[4] = DemoItem(TEXT("propulsor"), TEXT("Sea-Glide Propulsor"), 1); P.Slots[6] = DemoItem(TEXT("ferrite"), TEXT("Basalt Ferrite"), 4); P.Slots[7] = DemoItem(TEXT("cobalt"), TEXT("Cobalt Glass"), 2); P.Slots[8] = DemoItem(TEXT("silverfin"), TEXT("Silverfin"), 7); P.Slots[9] = DemoItem(TEXT("lanternfish"), TEXT("Lanternfish"), 3); P.Slots[12] = DemoItem(TEXT("jelly"), TEXT("Jelly"), 1); P.Slots[13] = DemoItem(TEXT("polyp"), TEXT("Lantern Polyp"), 2); P.Selected = 2; P.O2Tank = DemoItem(TEXT("tank1"), TEXT("High-Capacity O2 Tank"), 1); P.SelectedName = TEXT("Flare"); P.SelectedDesc = TEXT("Thrown while swimming. Burns 120 s as a light. At most 6 alive at once."); // ---- PDA: map ---- FDescentMapViewModel& Map = M.Map; Map.GridW = 30; Map.GridH = 18; Map.Cells.Init(-1.f, Map.GridW * Map.GridH); auto Blob = [&](int32 Cx, int32 Cy, int32 Rx, int32 Ry, float T) { for (int32 Y = 0; Y < Map.GridH; ++Y) { for (int32 X = 0; X < Map.GridW; ++X) { const float Dx = (X - Cx) / static_cast(Rx); const float Dy = (Y - Cy) / static_cast(Ry); if (Dx * Dx + Dy * Dy <= 1.f) { Map.Cells[Y * Map.GridW + X] = FMath::Clamp(T + 0.03f * (X % 3), 0.f, 1.f); } } } }; Blob(6, 9, 6, 3, 0.05f); Blob(13, 8, 3, 6, 0.30f); Blob(19, 11, 5, 4, 0.55f); Blob(25, 7, 3, 3, 0.80f); Map.Cells[9 * Map.GridW + 2] = 2.f; Map.Cells[9 * Map.GridW + 3] = 2.f; Map.Markers = { { TEXT("START"), 0.20f, 0.50f, Neu::Cyan(), false }, { TEXT("WELL A"), 0.44f, 0.30f, Neu::Txt(), false }, { TEXT("GREAT VOID"), 0.63f, 0.60f, Neu::Txt(), false }, { TEXT("CHOKE"), 0.50f, 0.52f, Neu::Amber(), false }, { TEXT("BEACON B1"), 0.82f, 0.38f, Neu::Red(), false }, { TEXT("UNKNOWN"), 0.74f, 0.74f, Neu::Red(), true }, }; Map.Carrier = FVector2f(0.22f, 0.50f); Map.You = FVector2f(0.45f, 0.45f); Map.SliceText = TEXT("SLICE AUTO 1,810 m +/- 60"); Map.TargetText = TEXT("TARGET STRATUM 3,105 m (Tethys survey)"); // ---- PDA: logs ---- FDescentLogsViewModel& Logs = M.Logs; Logs.Entries = { { TEXT("KILO-7 SURVEY TENDER"), TEXT("Kilo-7 to CANTICLE. We are at the lip of the void and the sonar keeps drawing a floor that is not there. Cobalt glass in every wall. If you read this, do not trust the depth gauge below"), true }, { TEXT("BEACON B2"), TEXT("Day nine. Nutrient reserve at four percent. The sea is full of protein and we still starve. Tethys will have its debt either way."), false }, { TEXT("BEACON B3"), TEXT("Something large crossed the canyon at nine hundred. It did not make a sound. The water did."), false }, }; Logs.Total = 8; // ---- PDA: status ---- FDescentStatusViewModel& St = M.Status; St.Lines = { DemoLine(TEXT("HEALTH"), TEXT("86 / 100"), 0.86f, Neu::Cyan()), DemoLine(TEXT("NUTRITION"), TEXT("42 % (about 17 min)"), 0.42f, Neu::Green()), DemoLine(TEXT("BIOMASS RESERVE"), TEXT("6.0 / 20 FU"), 0.30f, Neu::Green()), DemoLine(TEXT("CARRIER HULL"), TEXT("91 %"), 0.91f, Neu::Cyan()), DemoLine(TEXT("TENDER KAZAH-1"), TEXT("hull 74 % power 58 %"), 0.66f, Neu::Amber()), DemoLine(TEXT("DEPTH RATING"), TEXT("2,300 m (Tender)"), 0.0f, Neu::Dim()), DemoLine(TEXT("DEBT TO TETHYS"), TEXT("184,220 cr"), -1.f, Neu::Red()), DemoLine(TEXT("LOGS FOUND"), TEXT("3 / 8"), 0.375f, Neu::Violet()), }; St.Lines[5].Fraction = -1.f; St.Footer = TEXT("Day 2 14:32 Contract clock running"); // ---- Fabricator (recipes of DESIGN 6.7) ---- FDescentFabricatorViewModel& Fab = M.Fabricator; auto Cat = [&](const TCHAR* Id, const TCHAR* Label, TArray Rows) { FDescentFabricatorCategory C; C.Id = Id; C.Label = Label; C.Rows = MoveTemp(Rows); Fab.Categories.Add(MoveTemp(C)); }; Cat(TEXT("submersible"), TEXT("SUBMERSIBLE"), { DemoRecipe(TEXT("hull_plus"), TEXT("kit_hull"), TEXT("Hull Reinforcement"), TEXT("Tender hull x1.5"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 3, 5) }), DemoRecipe(TEXT("depth1"), TEXT("kit_depth"), TEXT("Depth Module Mk I"), TEXT("Rating 2,300 to 2,700 m"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 3, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 2, 1) }), DemoRecipe(TEXT("depth2"), TEXT("kit_depth"), TEXT("Depth Module Mk II"), TEXT("Rating to 3,150 m"), { DemoCost(TEXT("wafer"), TEXT("Wafer"), 3, 1), DemoCost(TEXT("lattice"), TEXT("Lattice"), 2, 0) }, true, TEXT("Needs Depth Module Mk I")), DemoRecipe(TEXT("cell2"), TEXT("kit_cell"), TEXT("Power Cell II"), TEXT("Capacity x1.7"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 2, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 2, 1) }), DemoRecipe(TEXT("thruster"), TEXT("kit_thruster"), TEXT("Thruster Upgrade"), TEXT("Speed +25%"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 3, 5), DemoCost(TEXT("cobalt"), TEXT("Cobalt"), 1, 2) }), DemoRecipe(TEXT("sonar2"), TEXT("scanner"), TEXT("Sonar Module"), TEXT("Ping 260 m, flags honest voids"), { DemoCost(TEXT("wafer"), TEXT("Wafer"), 2, 1) }), }); Cat(TEXT("mining"), TEXT("MINING"), { DemoRecipe(TEXT("drill2"), TEXT("kit_drill"), TEXT("Drill Head Mk II"), TEXT("Radius +0.7 m, rate +50%"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 3, 5) }), DemoRecipe(TEXT("drill3"), TEXT("kit_drill"), TEXT("Drill Head Mk III"), TEXT("Again"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 2, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 2, 1), DemoCost(TEXT("lattice"), TEXT("Lattice"), 1, 0) }, true, TEXT("Needs Drill Head Mk II")), DemoRecipe(TEXT("laser"), TEXT("kit_laser"), TEXT("Laser Cutter"), TEXT("Alternative tool head (T)"), { DemoCost(TEXT("wafer"), TEXT("Wafer"), 2, 1), DemoCost(TEXT("lattice"), TEXT("Lattice"), 1, 0) }), DemoRecipe(TEXT("suction2"), TEXT("kit_suction"), TEXT("Suction Mk II"), TEXT("Range 22 m, pull 16"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 2, 5), DemoCost(TEXT("cobalt"), TEXT("Cobalt"), 1, 2) }), DemoRecipe(TEXT("hold"), TEXT("kit_hold"), TEXT("Hold Expansion"), TEXT("Every hold +8"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 3, 5) }), }); Cat(TEXT("carrier"), TEXT("CARRIER"), { DemoRecipe(TEXT("patch"), TEXT("kit_patch"), TEXT("Carrier Hull Patch"), TEXT("Carrier hull +25 (below 99.5%)"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 4, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 1, 1) }), }); Cat(TEXT("explore"), TEXT("EXPLORATION"), { DemoRecipe(TEXT("scanner"), TEXT("scanner"), TEXT("Handheld Sonar"), TEXT("Tool"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 1, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 1, 1) }), DemoRecipe(TEXT("flares"), TEXT("flare"), TEXT("Flares x5"), TEXT("Consumable"), { DemoCost(TEXT("ferrite"), TEXT("Ferrite"), 2, 4) }), DemoRecipe(TEXT("beacons"), TEXT("beacon"), TEXT("Marker Beacons x2"), TEXT("Consumable"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 1, 5), DemoCost(TEXT("cobalt"), TEXT("Cobalt"), 1, 2) }), DemoRecipe(TEXT("tank1"), TEXT("tank1"), TEXT("High-Capacity O2 Tank"), TEXT("90 s of air"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 2, 5) }), DemoRecipe(TEXT("tank2"), TEXT("tank2"), TEXT("Ultra O2 Tank"), TEXT("150 s of air"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 1, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 1, 1), DemoCost(TEXT("lattice"), TEXT("Lattice"), 1, 0) }), DemoRecipe(TEXT("propulsor"), TEXT("propulsor"), TEXT("Sea-Glide Propulsor"), TEXT("Hold LMB: 7.5 m/s"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 2, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 1, 1) }), }); Cat(TEXT("build"), TEXT("BUILD"), { DemoRecipe(TEXT("locker"), TEXT("kit_locker"), TEXT("Storage Locker"), TEXT("+40 storage while placed"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 4, 5) }), DemoRecipe(TEXT("rack"), TEXT("kit_rack"), TEXT("Box Rack"), TEXT("4 box slots"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 2, 5) }), DemoRecipe(TEXT("arm1"), TEXT("kit_arm"), TEXT("Handling Arm Mk I"), TEXT("Reach 3.2 m, a box every 4 s"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 4, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 2, 1) }), DemoRecipe(TEXT("light"), TEXT("kit_light"), TEXT("Work Light"), TEXT("Wall or ceiling lamp"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 1, 5) }), DemoRecipe(TEXT("fab"), TEXT("kit_fabricator"), TEXT("Fabricator"), TEXT("A second fabricator"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 6, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 2, 1) }), DemoRecipe(TEXT("ref"), TEXT("kit_refinery"), TEXT("Refinery"), TEXT("A second refinery"), { DemoCost(TEXT("ingot"), TEXT("Ingot"), 8, 5), DemoCost(TEXT("wafer"), TEXT("Wafer"), 3, 1) }), }); Cat(TEXT("weapons"), TEXT("WEAPONS"), { DemoRecipe(TEXT("harpoon"), TEXT("weapon"), TEXT("Harpoon Sidearm"), TEXT("Tethys has not licensed weapons"), {}, true, TEXT("Tethys has not licensed weapons")), }); Fab.BuildProgress = 0.4f; Fab.StatusText = TEXT("Building Thruster Upgrade ..."); // ---- Refinery ---- FDescentRefineryViewModel& Ref = M.Refinery; Ref.Queue = { { TEXT("ferrite"), 6 }, { TEXT("cobalt"), 3 } }; Ref.CurrentOre = TEXT("ferrite"); Ref.Progress = 0.55f; Ref.SecondsLeft = 6.3f; Ref.Ingots = 12; Ref.Wafers = 4; Ref.Lattices = 1; // ---- Packer ---- FDescentPackerViewModel& Pk = M.Packer; Pk.Buffer = 9; Pk.Partial[0] = 4; Pk.Partial[1] = 2; Pk.Partial[2] = 0; Pk.Slots[0] = { TEXT("ferrite"), 6 }; Pk.Slots[1] = { TEXT("cobalt"), 6 }; Pk.StatusText = TEXT("Packing ferrite ..."); // ---- Storage ---- FDescentStorageViewModel& Sto = M.Storage; Sto.Goods = { { TEXT("ingot"), TEXT("Ferrite Ingot"), 12 }, { TEXT("wafer"), TEXT("Cobalt Wafer"), 4 }, { TEXT("lattice"), TEXT("Pearl Lattice"), 1 } }; Sto.Kits = { { TEXT("kit_locker"), TEXT("Storage Locker kit"), 1 }, { TEXT("kit_rack"), TEXT("Box Rack kit"), 2 }, { TEXT("kit_light"), TEXT("Work Light kit"), 3 } }; Sto.Used = 17; Sto.Cap = 100; // ---- Terminal ---- FDescentTerminalViewModel& Term = M.Terminal; Term.Refined = { { TEXT("ingot"), TEXT("Ferrite Ingot"), 12, 115, nullptr, nullptr }, { TEXT("wafer"), TEXT("Cobalt Wafer"), 4, 230, nullptr, nullptr }, { TEXT("lattice"), TEXT("Pearl Lattice"), 1, 500, nullptr, nullptr } }; Term.Boxes = { { TEXT("orebox"), TEXT("FERRITE x6"), 6, 360, nullptr, nullptr }, { TEXT("orebox"), TEXT("COBALT x6"), 6, 720, nullptr, nullptr }, { TEXT("orebox"), TEXT("PEARL x2"), 2, 520, nullptr, nullptr } }; Term.Debt = 184220; Term.Earned = 3620; Term.Sold = 7; // ---- Vat ---- FDescentVatViewModel& Vat = M.Vat; Vat.ReserveFu = 6.f; Vat.CapFu = 20.f; Vat.Feed = { { TEXT("silverfin"), TEXT("Silverfin"), 7, 0.10f }, { TEXT("lanternfish"), TEXT("Lanternfish"), 3, 0.15f }, { TEXT("jelly"), TEXT("Jelly"), 1, 0.60f }, { TEXT("polyp"), TEXT("Lantern Polyp"), 2, 0.40f } }; // ---- Build menu ---- FDescentBuildMenuViewModel& Bld = M.Build; Bld.Kits = { { TEXT("kit_fabricator"), TEXT("Fabricator"), TEXT("2.2 x 1.6 x 1.8 m"), TEXT("floor"), 1, nullptr }, { TEXT("kit_locker"), TEXT("Storage Locker"), TEXT("0.8 x 1.2 x 2.3 m"), TEXT("floor"), 1, nullptr }, { TEXT("kit_rack"), TEXT("Box Rack"), TEXT("1.4 x 0.5 x 1.0 m"), TEXT("floor"), 2, nullptr }, { TEXT("kit_arm"), TEXT("Handling Arm Mk I"), TEXT("0.6 x 0.6 x 1.2 m"), TEXT("floor or ceiling"), 0, nullptr }, { TEXT("kit_light"), TEXT("Work Light"), TEXT("0.3 x 0.3 x 0.15 m"), TEXT("wall or ceiling"), 3, nullptr }, { TEXT("kit_table"), TEXT("Table"), TEXT("1.4 x 0.9 x 0.78 m"), TEXT("floor"), 1, nullptr }, }; Bld.Placed = 14; // ---- Pause: the key list of 5.7 ---- FDescentPauseViewModel& Ps = M.Pause; Ps.Keys = { { TEXT("W A S D"), TEXT("Move") }, { TEXT("Mouse"), TEXT("Look / steer") }, { TEXT("Space C"), TEXT("Up / down") }, { TEXT("Shift"), TEXT("Sprint / boost") }, { TEXT("E"), TEXT("Use") }, { TEXT("LMB"), TEXT("Tool / drill / place") }, { TEXT("RMB"), TEXT("Suction / cancel") }, { TEXT("F"), TEXT("Light") }, { TEXT("R"), TEXT("Sonar") }, { TEXT("T"), TEXT("Swap drill / laser") }, { TEXT("V"), TEXT("Helm camera") }, { TEXT("X"), TEXT("All stop") }, { TEXT("1 - 5"), TEXT("Hotbar") }, { TEXT("B"), TEXT("Build") }, { TEXT("Tab M"), TEXT("PDA / map") }, { TEXT("J"), TEXT("Objective") }, { TEXT("Esc P H"), TEXT("Pause") }, }; // ---- Title, end card ---- M.Title.Progress = 0.72f; M.Title.ProgressText = TEXT("Streaming the canyon ..."); M.Title.bCanContinue = true; M.EndCard.HullPct = 88.f; M.EndCard.Balance = -151240; M.EndCard.LogsFound = 6; M.EndCard.TimeText = TEXT("3 h 12 min"); M.EndCard.Line = TEXT("Depth gauge reads 66.666 km. Disregard."); // ---- Dashboards ---- FTenderDashModel& D = M.Dash; D.ToolText = TEXT("DRILL"); D.DepthM = 2061.0; D.RatingM = 2300.0; D.HullPct = 82.f; D.PowerPct = 64.f; D.TempC = 5.1; D.SpeedMps = 1.8f; D.HoldUsed = 5.f; D.HoldCap = 8.f; D.BioFu = 1.2f; D.BioCapFu = 4.f; FCargoDisplayModel& C = M.Cargo; C.Cap = 8; C.Order = { TEXT("ferrite"), TEXT("ferrite"), TEXT("cobalt"), TEXT("ferrite"), TEXT("pearl") }; C.BioFu = 1.2f; C.BioCapFu = 4.f; } }