UE5 flying-action game project centered on the SaveThemAll loop: fly the ship, shepherd flyers through the goal, earn an end-of-run point payout, then reallocate or convert ship capability on the power-up screen.
- Large binary assets stay on an approved local LFS endpoint and are not served from the public remote.
- This repository keeps its committed
.lfsconfigso internal contributors resolve large assets against the approved local endpoint. - Public clones should expect code and metadata first; asset hydration still depends on local internal access.
- Input and gamepad analysis
- Point system and convert flow
- Donut flyer spawn analysis
- Donut flyer aggro design
- Donut flyer goal-lock analysis
- Gate clean-save design
- Reticle principles
- Level-1 media playback
- SaveThemAll music playback
- EAB + qcoin integration plan
- Game design concepts
Source/Zhoenus/SaveThemAllGameMode.cppSource/Zhoenus/SaveThemAllGameInstance.hSource/Zhoenus/SaveThemAllGameInstance.cppSource/Zhoenus/SpaceshipPawn.cppSource/Zhoenus/SaveThemAllPlayerController.cpp
- The Gate of Oblivion still needs a "clean save" collision pass. The art mesh can stay twisted and strange, but the gameplay collision should either reject or save, never trap. See
Docs/gate-clean-save-design.md. ShipEngineFlareshould eventually return to its original role as an attached aft-engine afterburner effect on the ship, with hue tied to thrust, rather than serving as a generic spawned flare fallback.- The standalone
ShipFlareEmitterasset inContent/Effects/ShipFlareEmitter.uassetis a Niagara emitter asset, not a Niagara system. Runtime code that wants to callSpawnSystemAtLocationmust target a Niagara system wrapper instead. PowerUpRoot,PowerUpScreenWidget,AdjustShip, andConvertSpeednow rely on native CommonUI wrappers for focus and controller navigation. The root focus handoff lives inPowerUpRootUI, andPowerUpRootis nowauto_activate=truebecause thePowerUpmap adds that widget to the viewport but does not explicitly callActivateWidget().ZhoenusButtonnow depends onZhoenusRepeatButtonStylefor visible selected/focused state, and that style asset now carries explicit rounded-box normal and selected brushes. If controller highlight regresses again, check the style asset before chasing navigation code.PowerUpStatWidgetis now safely reparented toUPowerUpStatWidgetUI. The native row wrapper handles explicit left/right focus inside a stat row, whileAdjustShipUIlinks those rows vertically and seeds them from the loadedSaveThemAllGameInstance.AdjustShipandPowerUpStatWidgetare now stripped back to layout assets. Their old event-graph stat init and stat-value helper graphs were removed, soUPowerUpStatWidgetUIandUAdjustShipUIare the only active source of stat-row behavior and values.UPowerUpStatWidgetUInow owns the visible stat-row value directly instead of relying on blueprint click graphs. It also restores the row label from the blueprintDisplayLabelproperty so the layout asset still defines the human-readable stat name.AdjustShipandConvertare separate systems again.AdjustShipedits persistent handling stats such asForwardAcceleration,ReverseAcceleration,PitchAcceleration,YawAcceleration, andRollAcceleration.Convertstill operates onMaxSpeedandMinSpeed.AdjustShipnative point accounting now also supportsMaxBatteryEnergyandBatteryRechargeRate, but the currentAdjustShipwidget asset still needs matching row widgets before those battery adjustments become visible in-menu.- The current default ship thrust baselines are
ForwardAcceleration = 500andReverseAcceleration = 200. AdjustShipnow owns its point accounting in native code throughUSaveThemAllGameInstance. The current rule is intentionally symmetric relative to the saved build you opened the screen with, and it uses fractional per-unit cost ratios rather than a flat1:1spend. The current temporary ratio table is:ForwardAcceleration = 0.32,ReverseAcceleration = 0.18,PitchAcceleration = 0.07,YawAcceleration = 0.10, andRollAcceleration = 0.08.- The
PowerUp,Convert, andAdjustShipmenu color scheme still needs a contrast/accessibility pass. Current contrast is weaker than it should be for some players; this matters, but reticle readability remains the higher-priority visual issue. - The battery HUD now auto-resolves by form factor: desktop / console keeps the right-side vertical meter, while
iOS/Androiduse a horizontal top-center battery in landscape. The rest of the gameplay HUD still needs the same profile-aware treatment. - Longer-term HUD direction should include player customization and optional cosmetic HUD themes / visual flare. That is a plausible monetization lane, but the rule should be strict: monetize expression, never utility. All HUD utility remains available to all players, and monetization stays cosmetic rather than gameplay-advantaging.
USaveThemAllGameInstance::LoadGamenow repairs legacy saves that predateReverseAcceleration. Those older saves deserialize that field as zero, so the loader normalizes it back to the baseline reverse thrust value instead of presenting a broken stat row on fresh launch.- Debug point grants are now available through the shared player-controller console command
GrantPowerPoints <amount>in non-shipping builds only. It adds directly toUSaveThemAllGameInstance::points, mirrors the grant intoAcquiredPoints, and saves immediately so thePowerUpscreens can be tested without playing a full round. - Project source control is intentionally disabled.
Config/DefaultSourceControlSettings.inisetsProvider=None, and the local Mac editor cache mirrors that inSaved/Config/MacEditor/SourceControlSettings.inito avoid Perforce startup noise on this machine. Level-1can now randomize in-world movie playback fromContent/Moviesat runtime throughALevelVideoSurfaceManager, which is spawned byASaveThemAllGameMode. It swaps tagged or named static-mesh surfaces over to a media-backed material and chooses a random clip on start and after each clip ends.SaveThemAllmusic no longer depends on editing theLevelSongMetaSound graph to change the playable set.ASaveThemAllGameModenow builds a runtime playlist from configured/Game/Soundasset paths plus optional directory scanning, then plays one track for the run and still advances toPowerUpwhen that track ends.
For Linux or Raspberry Pi work, use Script/sync_portable_project.sh <destination> instead of a raw rsync -aE.
The helper keeps the rebuildable project tree and excludes generated/editor plus Apple-platform residue:
Intermediate/Saved/DerivedDataCache/Binaries/Build/Mac/Build/IOS/IOS/Zhoenus (Mac).xcworkspace/Zhoenus (IOS).xcworkspace/Zhoenus (TVOS).xcworkspace/Zhoenus (VisionOS).xcworkspace/.DS_Storeand._*
It uses plain rsync -a rather than -aE, so copies to ExFAT or Linux targets do not accumulate AppleDouble sidecar files. If the destination is deployment-only rather than a working clone, add --exclude='.git/'.