Docs / Project / Tech Stack
Tech Stack
Unreal Engine 5.7 C++ project, source-controlled in Perforce. Combat and abilities
use TInstancedStruct-based composition rather than the Gameplay Ability
System. Networking is server-authoritative with fog-gated replication.
At a Glance
- Engine
- Unreal Engine 5.7 (C++)
- Language
- C++ for runtime systems; Blueprint for content tuning and prototyping
- Source control
- Perforce, stream depot
//AxonRush/mainline - Networking
- Server-authoritative; fog-gated replication; dedicated vs. host-server TBD
- Ability framework
- Not GAS.
TInstancedStruct<FAbility>,TInstancedStruct<FBuff>, etc. - AI authoring
- Behavior Trees / State Trees / utility AI TBD
- Platform
- PC-first
- Renderer
- UE 5.7 default (Lumen / Nanite — usage TBD per art direction)
Why No GAS?
Unreal's Gameplay Ability System is the standard answer for this kind of game and we're explicitly not using it. Reasons:
- Studio convention. Other in-flight projects use
TInstancedStructfor the same problem space; staying consistent reduces context-switching and shared tooling pays off. - Composition is simpler than GAS's class hierarchy for our actual use case (stat buffs, DoTs, shields, AoE on adjacent tiles). We don't need GAS-specific features like attribute prediction or ability tags.
- Network model is tighter. Server-authoritative with fog-gated replication maps cleanly to plain replicated structs; GAS layers more assumptions on top.
- Smaller learning curve for new engineers — anyone who knows UE C++ can read a struct.
Combat resolution, leader abilities, tile rules, buffs, DoTs, and shields all live
under typed
TInstancedStruct<T> wrappers — never raw
FInstancedStruct. This is a hard rule across the codebase.
Networking Architecture
Server-authoritative state
- The server holds the full match state — every tile, every unit, every path.
- Clients hold only what their fog permits them to see.
- Path-edit RPCs are server-validated for ownership, adjacency, and path budget.
Fog-gated replication
- Per-player visibility mask updated server-side each tick.
- Tile / unit replication is gated by visibility — players never receive hidden tile state, full stop.
- Bandwidth scales with visible board area, not total board area. Critical for 12-player matches.
- Cheating via memory inspection is mostly defanged: the client genuinely doesn't have data on enemy paths or out-of-fog tiles.
Tick rates
| Loop | Cadence | Notes |
|---|---|---|
| Tile spawn | 3-second cycles | 1 unit per tile-level per cycle |
| Unit movement | 2 seconds per hex | Discrete hex steps, not continuous translation |
| Combat resolution | 3 rounds per second | Fixed round granularity for replay determinism |
| Server tick rate | TBD | Likely higher than combat tick to allow client smoothing |
Source Control
- Perforce server:
localhost:1666(development); production setup TBD. - Stream depot:
AxonRush - Mainline:
//AxonRush/mainline(mainline-type stream) - Per-project
p4config.txtat the workspace root — no globalP4CONFIGenvironment variable. .p4ignoreexcludesBinaries/,Intermediate/,Saved/,DerivedDataCache/, IDE files, andp4config.txtitself.
Code Conventions
TInstancedStruct<T>everywhere, never rawFInstancedStruct.::template Make<Derived>(Value)always — never::Make(Derived)(which silently slices).#includepaths are Public-relative:"Folder/Sub/File.h". Don't add module subfolders toPublicIncludePathsinBuild.cs.- New test levels need
DirectionalLight+SkyLightor PIE renders black. - Regenerate UE project files via UBT after structural changes:
"C:\Program Files\Epic Games\UE_5.7\Engine\Binaries\DotNET\ UnrealBuildTool\UnrealBuildTool.exe" -projectfiles -project="C:\Perforce\AxonRush\AxonRush.uproject" -game -rocket -progress
Build
"C:\Program Files\Epic Games\UE_5.7\Engine\Build\BatchFiles\Build.bat"
AxonRushEditor Win64 Development
-Project="C:\Perforce\AxonRush\AxonRush.uproject"
-WaitMutex -FromMsBuild
Future Tech Decisions
| Decision | Locked at |
|---|---|
| AI authoring framework | M15 |
| Dedicated server vs. host-as-server | M12 |
| Reconnect routing protocol | M17 |
| Backend for leaderboards / match history | M18 |
| Cosmetic asset pipeline | M20 |
| Telemetry / analytics | M24 |