Six original garage silhouettes — source and device QA¶
Six fictional offline garage configurations now have distinct cosmetic engine-primitive profiles in the Unreal starter pawn. New IDs are appended, not renumbered. They share the existing physically simulated chassis and collision primitive: this is not six independently modeled production cars.
| Saved ID | Garage profile | Engine-primitive outline |
|---|---|---|
| 0 | Arrow | Balanced hood/deck, wingless body |
| 1 | Kestrel | Longer hood, shorter deck, low wide rear wing |
| 2 | Phantom | Short nose, long deck, higher narrow wing |
| 3 | Tempest | Extra-long nose, shallow cockpit, low spoiler |
| 4 | Glider | Very short front, longest tail, broad tall cockpit |
| 5 | Nova | Extended rear, broadest rear wing, balanced canopy |
These are original source-defined dimensions. No third-party car model, manufacturing mark or car audio is embedded. Wings, hood, deck and supports must remain collision-free and unsimulated. Existing first three IDs keep their original tuning values and persistent ownership bits.
Offline progression and save migration¶
- Profiles 3–5 cost 1,800 / 2,500 / 3,400 earned credits.
- The garage loops only among owned vehicles. The next purchase is the first locked saved ID; no free unlocking when loading a three-car save.
- Saved
OwnedVehicleMaskandSelectedVehicleIdkeep existing Unrealint32schema, with known vehicle bits masked to six. The starter bit is always restored, negative masks are rejected, and invalid/future IDs fall back to Arrow. The game still requires two identical purchase inputs within eight seconds to debit a car. - Garage UI displays chosen profile number, base acceleration/grip/speed coefficients, next unlock cost and upgrades. These are not performance measurements from a packaged game.
- Career race garage locks and rollback-on-failed-profile-write still apply.
Source verification¶
Run these from the repository root:
cmake -S Tests/Standalone -B build/garage-tests -DCMAKE_BUILD_TYPE=Release
cmake --build build/garage-tests --parallel
ctest --test-dir build/garage-tests -R 'GarageState|VehicleVisualRecipe|CareerGaragePolicy|CareerLaunchSelection|GaragePurchaseConfirmation' --output-on-failure
python -m unittest discover -s Tests/Editor -p '*Tests.py'
Source policies and binding tests are not Unreal/Chaos integration tests.
Required licensed engine and installed game checks¶
- On an authorized Unreal 5.8 Editor/Win64 install, load existing SaveGame containing only bits 0–2 and confirm the old car, bank and upgrades are preserved with IDs 3–5 still locked.
- Purchase Tempest, Glider, and Nova through two-key confirmations, restart the game, and verify prices, bitmask, selection, persisted bank and no duplicate debit on further confirmation presses.
- At 720p, 1080p, high-DPI and Android landscape safe areas, verify the garage page's lines remain legible and pagination accessible.
- Compare actual chase/hood/side views for six distinct silhouettes. Check spoiler supports, wheel/body clipping, shadows, materials, and missing primitive assets. Verify garage selection never changes collision extents or unverified car-handling physics.
- Exercise a career race and a failed SaveGame write: tuning must remain locked while the career attempt runs; a failed purchase/selection must restore the original car, garage mask and credits.
The original cooked circuit, physically tested vehicle handling, Win64/Android package identity and installed graphical QA gates remain open in issue #148.