SoulCalibur VI Internals¶
Reverse-engineering reference for SoulCalibur VI (Steam, monolithic
SoulcaliburVI.exe, Unreal Engine 4.17.2).
Binary identity¶
| Field | Value |
|---|---|
| Image base | 0x140000000 |
| Module | SoulcaliburVI.exe (monolithic — no separate LuxorGame.dll) |
| Source-path prefix in strings | D:\dev\sc6\UE4_Steam\LuxorProto\Source\LuxorGame\... |
| Internal codename | Luxor (first-party classes are ALux* / ULux* / FLux*) |
| Engine version | Unreal Engine 4.17.2 |
Pages¶
| Page | Covers |
|---|---|
| Game Structures | Class layouts, field offsets, struct index. Start here for "where is X?". |
| Battle Manager | ALuxBattleManager slot map, UFunctions, DataTable config tree, SetBattlePause. |
| Hitbox System | KHit linked lists — the live hit-detection pipeline (strikes, kicks, hurtboxes, pushboxes, grabs). |
| Reaction System | Post-hit state machine — yarare dispatch, 80-id reaction table, gate-family taxonomy, knockdown camera, throw-react. |
| Trace System | FLuxCapsule + ALuxTraceManager — the visual weapon-trail / sword-swoosh VFX (not hit detection). |
| Stage System | Master enum table, stage-code routing, DLC gating, LuxBattleStageInfoTableRow, collision storage, custom-stage mod pipeline. |
| Character and Stage Selection Menus | Character-select roster builders, selected/decided setup keys, stage picker inputs, arcade/mission stage resolvers, and custom-character submenu feasibility. |
| Movement System | Per-character step / 8WR table, conditions that modify step performance (hitstop, Soul Charge, face flip, state index). |
| Battle Message System | ELuxBattleMessage enum, FLuxBattleMessageParam struct, ULuxBattleMessageReceiverInterface, broadcast dispatchers, modder-feasibility notes. |
| Replay System | Per-frame replay tick chain, master clock at FrameInputLog+0x3A4, Site 9 plus seven Actor::Tick gates for replay freeze, TimeDilation fall-through that bypasses VMFreezeByte. |
| Leaderboards & Online | Steam leaderboards (Characterboard, RankmatchWorld/Asia/...), BNED Cosmos Channel telemetry, building an external API client. |
| Online Matchmaking | ULuxorSessionHub create/find helpers, player-room and ranked-match session metadata, repeated-result filtering, rematch-data caveats. |
| Move System | Command-script bytecode VM, opcode dispatch, IF predicates. |
| Audio System | CRI ADX2 middleware + UAtomComponent, MoveVM-to-cue routing via g_pLuxVfxDispatcher, DramaticVoice triggers, weapon-SE bank routing, DLC ACB folder map, PartsSE / costume-part SE. |
| CPU / AI System | Per-frame AI tick chain, frame-input output target, HgCpuDirect* SubVM framework, personality / difficulty data, training-mode UFunction API. |
| Character Data | Style ids, DataTable asset paths, move-list display schema. |
| Drawing 3D Debug Lines | ULineBatchComponent recipe — the one live debug-draw path. |
| Dev / Debug Hooks | Inventory of developer-facing hooks: what works, what's stripped. |
Quick-find: where do I look for X?¶
| Question | Page |
|---|---|
"Where is chara+0xNNN?" |
Game Structures: ALuxBattleChara |
| "How do hitboxes / hit detection work?" | Hitbox System |
| "What happens AFTER a hit lands — stun, launch, knockdown, ringout?" | Reaction System — yarare dispatch + per-id Tick handler family. |
| "What's the yarare-id taxonomy (0x1F = launcher, 0x1E = knockdown, etc.)?" | Reaction System: EYarareReactionId |
| "How does the knockdown camera work?" | Reaction System: Knockdown camera |
| "How do weapon trails / sword swooshes work?" | Trace System |
| "How far does each character step?" | Movement System |
| "What changes how well a character moves?" | Movement System: verified levers |
| "How do I add / replace a stage?" | Stage System |
| "How do character select and map select menus work?" | Character and Stage Selection Menus |
| "Can the custom-character submenu select modded stages?" | Character and Stage Selection Menus: Custom-character submenu as a stage selector |
| "Where does match setup copy stage/rules/player tables into the BattleManager?" | Battle Manager: Battle launcher startup path |
| "Why do some stages roll more often in random?" | Stage System: Random-pool bias |
| "How do I read character usage / ranked-match data outside the game?" | Leaderboards & Online |
| "What's the difference between rank id, rank point, and style id?" | Leaderboards & Online: ranking internals |
| "How does matchmaking search rooms or handle repeated ranked results?" | Online Matchmaking |
| "How do I tell if my mod is running in an online match?" | Leaderboards & Online: detection — call ALuxBattleManager_CheckOnlineSessionActive @ 0x1403F2590 or read FrameInputLog+0x4400 |
| "How does opponent input get into the game during online play?" | Leaderboards & Online: per-frame input chain — Steam P2P → push deque → drain → per-slot cache at FrameInputLog+0x3C0 |
| "How does the on-screen Counter Hit / Punish Attack / Throw Escape banner work?" | Battle Message System |
| "Can I show a custom HUD banner from a mod?" | Battle Message System: Modder feasibility |
| "Where's the move VM?" | Move System |
| "How does the game play sounds? Wwise / FMOD / CRI?" | Audio System — CRI ADX2 / ATOMCRAFT. |
"Where do weapon SE / character voice .acb files live?" |
Audio System: weapon SE bank routing and per-character voice ACB maps. |
| "How do DramaticVoice / story-mode voice triggers work?" | Audio System: DramaticVoice. |
| "Why are my custom-costume footsteps / cloth silent?" | Audio System: PartsSE — costume parts have their own cue trigger family. |
| "Why does my fast-forward UX flood the player with overlapping voices?" | Audio System: thread model — burst-playback warning + mitigations. |
| "How does the CPU opponent decide what to do?" | CPU / AI System — AI emits frame inputs, not MoveVM commands; selected by personality + condition vector. |
| "How do I drive the training-mode dummy from a mod?" | CPU / AI System: Training-mode UFunctions — 11 live UFunctions with native bodies. |
| "Does AI tick during replay viewing?" | CPU / AI System: Replay behavior — yes, but the AI's output is silently discarded by the replay decoder. |
| "How do I draw a debug line?" | Drawing 3D Debug Lines |
| "How do I pause the game?" | Battle Manager: SetBattlePause |
| "How do I freeze a replay (not just a training match)?" | Replay System — SetBattlePause and VMFreezeByte both leak in replay viewing; needs Site 9 plus the seven Actor::Tick gate stack. |
| "Why does my freeze release as a fast-forward burst in replay viewing?" | Replay System: SimulationLoop catch-up — master clock keeps advancing during freeze, delta accumulates, drains in one tick on release. |
| "How do I scrub / seek inside a match replay?" | Replay System: seeking status — Lux replay round navigation is verified; DemoNetDriver seek exists but is not the default SC6 replay scrub path. |
| "What's the format of SC6's replay input stream?" | Replay System: Lux input replay opcodes — 3-byte opcode records expanded into 8-byte {frame,cursor,p1,p2} records. |
| "What's the relationship between Lux replays and DemoNetDriver?" | Replay System: replay backends — SC6 replay-menu evidence points to Lux replay/player/input-log code; DemoNetDriver is present UE engine code but not validated as the SC6 replay authority. |
"What does ULuxDevBattleHUDSetting do?" |
Dev / Debug Hooks |
| "What's the move-data DataTable schema?" | Character Data |
Conventions used on these pages¶
- All addresses are absolute with image base
0x140000000unless explicitly RVA. chara+0xNNNalways means relative toALuxBattleChara*.vmCtx+0xNNNalways means relative toFLuxMoveCommandPlayer*(the per-chara VM slot).BM+0xNNNalways means relative toALuxBattleManager*.InputLog+0xNNNalways means relative toALuxBattleFrameInputLog*.- Struct sizes given as both decimal and
0xhex where useful. - Status markers applied consistently:
- verified — read directly from Ghidra decompile or live runtime memory/introspection probes. Trust.
- unverified — plausible but not directly confirmed. Don't build on without checking.
- stale on this build — present in the binary but not on the live codepath. Don't use.
> source:blockquote — points at the authoritative Ghidra address/function.!!! warningadmonition — known landmine, layout error, or correction.
For cross-cutting lookups across all SC6 pages, see Reference: Symbol Index.
Reflected-call caveat¶
Some live UFunctions were registered with the short UE4_RegisterClass variant
(no Ex), so their parameter UProperty metadata is missing. Notable cases:
ALuxBattleChara::Active / Inactive / GetTracePosition. Treat those as
native _Impl call or lower-level data-hook targets instead of reflected-call
APIs.