How the stack fits together
- ModularFPS
- Player GAS, weapons, damage, input
- MobileEssentials
- Mobile UX, economy, aim assist, combat HUD, quality presets
- Soulslike Enemy Combat
- Arena boss AI, melee traces, reactions (not horde zombies)
- RevenueCatBridge
- StoreKit IAP, virtual currency, entitlements
- The Last Line (game module)
- Horde batching, encounters, campaign, Endless, barricade flow
RevenueCatBridge
In-house UE plugin (v1.6.0) exposing RevenueCat purchases, restore,
customer info, virtual currencies, and paywalls through
URevenueCatSubsystem.
-
iOS bridge in
RevenueCatIOSBridge.mm with bundled
RevenueCat and RevenueCatUI frameworks; Android via JNI.
-
Game wallet reads RevenueCat virtual currency code
GS through UGoldenScrapWalletSubsystem.
-
UTheLastLineGameInstance applies entitlements on start
and listens for customer-info updates.
Soulslike Enemy Combat
In-house Fab plugin (v2.2.1) for souls-like boss AI: action scoring,
reactions, melee traces, awareness, and combat roles.
-
Core types include
AEnemyControllerBase,
USECBrainComponent, and
USECMeleeTraceComponent.
-
Arena bosses (GraveBreaker, IceWarlord, SawGuy, Tepegoz) use SEC;
horde zombies use separate batch pathing, not SEC brains.
-
Encounters start through
UEncounterManagerSubsystem::StartEncounter.
- Requires GAS, StateTree, and Motion Warping modules.
MobileEssentials
Reusable mobile foundation plugin (v0.1.0, beta) split across Core,
Services, UI, and LoadingScreen modules.
-
Hosts aim assist, combat indicators, graphics quality, haptics,
object pooling, battle pass, analytics, and shared save base classes.
-
Progression and storefront systems live here rather than in the
game module so they can ship in other titles.
-
Combat indicator, aim assist, and quality libraries are consumed
directly by The Last Line player and game instance code.
S_ModularFPS (ModularFPS)
In-house GAS FPS framework (v1.0) that The Last Line extends for
weapons, attributes, and player combat.
-
AFPSCharacter and UFPSAttributeSet chain
into ATheLastLineCharacter and
ATheLastLinePlayerController.
-
UCombatComponent manages two weapon slots, equip/switch,
and preview flow; weapons inherit from ABaseWeapon.
-
Tag-based ability input routes through
UFPSAbilitySystemComponent and
UFPSInputConfig.
Haptics
Cross-platform haptic API in MobileEssentials Core:
UHapticFunctionLibrary with a runtime enable gate synced
to player settings.
-
iOS uses UIKit feedback generators (selection, impact light/medium/heavy,
notification) on the main queue.
-
Android uses amplitude/duration vibration patterns for impacts and
notifications.
-
Hold interactions call
PlayImpactHaptic from
HoldInteractionZone during charged interactions.
Aim assist
Controller-mounted UAimAssistComponent rotates aim toward
actors implementing IAimAssistTargetInterface. Correction
only, not auto-fire.
-
Defaults include weight 0.6, 2° inner dead zone, 8° falloff, and
120°/s max correction speed.
-
Intent detection backs off when the player deliberately aims away;
no input restores full assist strength.
-
States: Idle, Tracking, Suspended. Targets can move their aim point
each tick via the interface.
Combat indicators
Zero-UMG combat HUD renderer:
UCombatIndicatorSubsystem draws pooled damage numbers,
health bars, hit direction cues, and screen flash on the HUD canvas.
-
Callers push events only; the subsystem does not detect damage
itself. Numbers project once, then drift in screen space.
-
Project defaults tune pool sizes and lifetimes; game config extends
draw distance for large arenas.
-
Endless mode suppresses indicators during between-wave prep via
AEndlessGameMode::SetCombatIndicatorSuppressed.
Device quality system
UGraphicsQualityLibrary assigns Low/Medium/High/Epic presets,
render scale, and FPS cap without letting engine defaults clobber the
saved tier.
-
Auto-detect reads declared device-profile scalability, with RAM
fallback buckets (≤3 GB Low, 4–7 GB Medium, ≥8 GB High). Epic is
never auto-assigned.
-
Render scale: Low 0.65, Medium 0.80, High/Epic 1.00 via
r.ScreenPercentage.
-
UTheLastLineGameInstance calls
ApplySavedSettings() on start; a detect-version flag
forces one-time re-detection after preset logic changes.
iOS technical solutions
Platform-specific fixes and integrations for App Store shipping on
iPhone and iPad.
-
Landscape-only runtime settings with 60 FPS lock,
high-refresh support, Game Center, and premade entitlements for
associated domains and StoreKit.
-
CFBundleIconName=AppIcon injected into plist
AdditionalPlistData to fix TestFlight icon delivery on iOS 11+.
-
Firebase iOS init repairs truncated database URLs from config by
reading
DATABASE_URL from GoogleService-Info.plist.
-
Home-screen shortcuts defer cold-launch broadcasts until the engine
tick loop is safe; warm launches guard on
GIsRunning.
-
CI packaging script strips AppleDouble sidecars and extended
attributes before UHT/build steps on network volumes.