Skip to content

Technical Design

Architecture overview

flowchart TB
    GI[URiftbloomGameInstance] --> SaveSub[USaveSubsystem]
    GI --> MoonSub[UMoonClockSubsystem<br/>time, moon phase, weather]
    GI --> QuestSub[UQuestSubsystem]
    GI --> EventSub[UWorldEventSubsystem]
    PC[ARiftPlayerController] --> HUD[CommonUI HUD]
    PChar[ARiftPlayerCharacter] --> ASC[AbilitySystemComponent]
    ASC --> Attr[URiftAttributeSet]
    PChar --> EchoComp[UEchoLoadoutComponent]
    PChar --> Inv[UInventoryComponent]
    PChar --> Combat[UCombatComponent<br/>combo, lock-on, hit detection]
    RiftGen[ARiftGenerator] --> RoomKits[Room kit DataAssets]

Gameplay Ability System

Concept Implementation
Attributes URiftAttributeSet: Health, MaxHealth, Stamina, Resonance, Break, MaxBreak, ATK, DEF, CritRate, CritDmg, AspectMastery, plus per-Aspect DMG% and RES%
Abilities GA_LightAttack, GA_HeavyAttack, GA_Dodge, GA_Parry, GA_WeaponArt_<Weapon>, GA_Echo_<Name>_Skill, GA_Echo_<Name>_Burst, GA_Finisher
Effects GE_Damage (an ExecutionCalculation implementing the damage formula), GE_Mark_<Aspect>, GE_Status_<Name>, GE_Cooldown_*
Tags State.Dodging, State.PerfectStepWindow, State.Broken, Aspect.Flame, Mark.Tide, Attack.Unparryable, Echo.Role.Striker…
Cues GC_Hit_<Aspect>, GC_Reaction_<Name>, GC_PerfectStep

Perfect Step detection

  1. Enemy attacks add the tag Incoming.Attack to their target via an AnimNotifyState that runs from about 0.15 s before the active frames until the hit.
  2. When GA_Dodge activates, it checks whether the owner has Incoming.Attack. If so, it applies GE_MoonlitTime (global time dilation 0.25 for enemies through custom time dilation on the enemy actors, so the player is not slowed) and grants Resonance.

Aspect Reactions

UReactionSubsystem listens for GE_Mark_* applications. If the target already has a different Mark, it looks up the pair in DT_Reactions and applies the reaction effect and cue.

Combat

  • Hit detection uses weapon socket traces (multi-sphere sweep between Socket_Base and Socket_Tip every frame during the ANS_HitWindow notify).
  • Hit-stop is a per-hit custom time dilation of 0.05 for 0.06–0.12 s on the attacker and the victim.
  • Combos use montage sections plus an input buffer (0.25 s) in UCombatComponent.
  • Lock-on uses the target-scoring cone. The camera is a spring arm with blending per CameraProfile DataAsset.

Echo system

  • UEchoDataAsset: name, Aspect, Role, skill ability class, passive GE, burst ability class, Bond unlock table, cosmetic aura (Niagara system), voice lines.
  • UEchoLoadoutComponent: Lead + 2 Support slots. It grants and removes abilities when the loadout changes and evaluates DT_ResonanceLinks.

Rift generation

  • Room kits are Level Instances with tagged door sockets (N/E/S/W, size class).
  • ARiftGenerator uses a seeded graph grammar: Start → [Combat|Puzzle|Treasure]×(3–5) → Elite → Heart. It places rooms by matching door sockets and rejects overlaps (with bounds checks).
  • Spawns come from a DT_RiftSpawnTable filtered by region, Bloom stage and moon phase.
  • The seed is stored in the save, so a Rift stays the same until it is cleared.

Moon clock

UMoonClockSubsystem advances in-game time (48 real minutes per day), computes the moon phase (4-day cycle) and rolls weather per region. It broadcasts OnPhaseChanged and OnWeatherChanged. Region skies read Material Parameter Collections.

Quests

  • UQuestDataAsset: steps, each with objectives (Kill, Collect, ReachLocation, Talk, ClearRift, Custom), prerequisites and rewards.
  • UQuestSubsystem tracks active quests and listens to gameplay message events (GameplayMessageSubsystem).
  • Dialogue is a simple node graph DataAsset (or a plugin, if preferred).

Save system

  • USaveGame subclass holding: player stats and attributes, inventory, Echo loadout and Bonds, quest states, Rift states (seed, Bloom start time), world flags, moon clock time and settings.
  • Autosave on Rift exit, Waystone use and quest completion. 3 manual slots.

Co-op (stretch)

Design systems to be server-authoritative from the start: GAS replication mode Mixed, and keep the Moon Clock on the server. Co-op is limited to Rifts and Descent.