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¶
- Enemy attacks add the tag
Incoming.Attackto their target via an AnimNotifyState that runs from about 0.15 s before the active frames until the hit. - When
GA_Dodgeactivates, it checks whether the owner hasIncoming.Attack. If so, it appliesGE_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_BaseandSocket_Tipevery frame during theANS_HitWindownotify). - 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
CameraProfileDataAsset.
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 evaluatesDT_ResonanceLinks.
Rift generation¶
- Room kits are Level Instances with tagged door sockets (N/E/S/W, size class).
ARiftGeneratoruses 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_RiftSpawnTablefiltered 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.UQuestSubsystemtracks active quests and listens to gameplay message events (GameplayMessageSubsystem).- Dialogue is a simple node graph DataAsset (or a plugin, if preferred).
Save system¶
USaveGamesubclass 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.