Mode configuration, content loading, deterministic play, training control, result settlement, replay publication, and takeover are distinct states with different compatibility and recovery requirements.
This is the player-facing tour of where V2 sends you when you press Start: the arcade ladders and story campaigns, the booker sims and card-collector seasons, the bonus stages and arcade cabinets, the frame-accurate practice lab, and the replay theater that records every match as re-simulatable inputs. V2's pitch is that one fighting game can host fifty-odd distinct experiences without any of them forking the deterministic match loop — a CPU arcade run, a 30-entrant Royal Rumble, and a turn-based hex campaign all bottom out in the same simulation. The seam that makes that work is a registry of mode definitions rather than fifty hand-written game modes, and the companion architecture page, ../architecture/game-modes-training-and-replay.md, explains the registry, the load-plan builder, and the replay codec on the engine side. This page stays on the player's side of the menu: what each surface is, what you actually do in it, and which parts are shipped C++ versus a named target waiting on content. The two largest standalone modes — the Hades-style roguelike, the 100-player Battle Royale, the world boss, karaoke, and the signature live events — get their own page, ./signature-events-and-standalone-modes.md; the moment-to-moment fight these modes all run is in ./combat-systems-defense-and-game-feel.md. For the full feature scope this slots into, start at the hub: ../V2_features.md.
What ships, honestly#
The mode machinery is real, complete, and heavily tested; the content each
mode points at is mostly named-but-unbuilt. UV2ModeRegistrySubsystem
(V2Modes/Public/V2ModeRegistrySubsystem.h) implements registration,
validation, the load-plan builder, activation/deactivation, and a seven-state
lifecycle as ordinary C++ that compiles into the editor and runs headless under
automation. FV2ModeCatalog::BuildDefaultModeDefinitions() builds a fixed
roster of 52 canonical modes (Modes.Reserve(52),
V2ModeCatalog.cpp:6287+), and the per-mode content builders carry real domain
math — the arcade scoring evaluator, Royal Rumble entry scheduling, the MyGM
booking sim. The data behind it is enormous: V2ModeTypes.h is a 347 KB header
declaring 135 enum classes and 286 USTRUCTs. The single spec
V2Tests/Automation/Modes.Module.spec.cpp carries 705
TestTrue/TestEqual/TestNotNull assertions over the registry and catalogue.
Four honest qualifications. First, the per-mode Game Feature plugins and
maps do not exist on disk: MakeMode synthesizes each definition's
GameFeaturePluginURL and PrimaryMapPath by convention, but a scan of
V2/ue/Plugins finds only three real .uplugin files (V2AICommentary,
V2AdaptiveAI, V2AssetLinter) and none named V2Mode_*. The nine tracked
.uassets (eight region-variant data assets under ue/Content/V2/Regions, plus
one editor frame-data inspector) are not mode content — there are no shipped
fighter or stage binaries. These URLs are target artifacts the registry can
plan against today and content production fills in later. Second, activation
records the plan; it does not execute a GameFeature load — it loads required
C++ modules for real through FModuleManager, but never calls
UGameFeaturesSubsystem or opens a level. Third, the training and replay
tooling specs are real, validated C++ data contracts plus a native screen
class; the visual overlays they describe bind on the presentation side of the
sim/present split, which is the engine-integration boundary. Fourth, a
spec/code discrepancy on the replay budget: prose says "≤ 1 MB / 5-min," but the
shipped FV2ReplayFileCompressionProfile pins
TargetMaxBytesPerMinute = 1048576 — 1 MiB per minute. The code is the
authority.
The mode catalog#
Every mode is one FV2ModeDefinition value carrying an id, a category
(EV2ModeCategory, 14 values), a network model (EV2ModeNetworkModel, 7
values), a save model (EV2ModeSaveModel, 8 values), player/spectator bands,
and a set of capability flags (bSupportsReplay,
bSupportsRollbackDeterminism, bAvailableAtLaunch). IsValidDefinition() is
a real gate, not a truthiness check — it rejects a definition with no id, no
design-section reference, an inverted player range, or an invalid dependency.
The catalog the player sees groups out of those 52 entries roughly like this:
- Single-player core — three Arcade variants (
Mode.Arcade.Classic,Mode.Arcade.Survivor,Mode.Arcade.GhostBattle), the 12-chapter branchingMode.Story, and the MK-lineage Tower/Tournament/Survivor family. Arcade is a classic 8-fighter ladder with a mid-ladder rival, a sub-boss, a final boss, and per-fighter ending; each fight is graded by a genuine algorithm —EvaluateArcadeFightScore(V2ModeCatalog.cpp:4778) computes a realTimeBonus = max(0, 6000 − seconds×40), a+500flawless bonus, amin(combo×120, 2400)combo bonus, and a flat1500finisher bonus over a1000base, not a hardcoded grade. - Single-player expansions — the Krypt reward vault, the 100-player Battle
Hub (
Mode.BattleHub,ClientServerHub, 1–100 players), open-worldMode.WorldTour, theTekken Forcebrawler,Devil Within, and the MK-lineage Konquest open-realm campaign. - Sports-entertainment —
Mode.WWE.Universe(a weekly-TV/PPV booker sim with a real auto-book pass), MyCAREER/MyRISE/MyGM, the UFC GOAT career, andMode.MyFaction, a Bronze→Pink Diamond card collector. The MyGM economy carries a realSalaryCapCents = 60000000salary-cap constraint, not a flavor string. - Multi-fighter —
Mode.RoyalRumble(a 30-entrant timed-entry elimination ruleset,BattleRoyalcategory, up to 30 players), tag-team 2v2/3v3, and the three 100-player Battle Royale variants up toMode.BattleRoyale.Hybrid100. - Strategy / street / specialty —
Mode.ChessKombat(LocalTurnBasedhex tactics), the SoulCalibur strategy-RPG suite, Def Jam story and tag battle, and three specialty rulesets (boxing sim, Bushido Blade one-hit, MK one-hit tournament).
Requesting a mode runs it through BuildModeLoadPlan, which refuses online
modes when the request disallows online services — asking for Mode.BattleHub
offline never produces a plan, because its ClientServerHub model trips
RequiresNetworkServices(). That single predicate is the player-visible reason
a mode greys out when you're not signed in. The match-flow variants (Local
Versus, Time/Score Attack, Wager, Handicap, First Blood, Best-of-N, LAN) are
lightweight wrappers around a standard fight, catalogued as design intent rather
than separate plugin directories.
Bonus modes & mini-games#
V2 honors the genre tradition of short, self-contained, non-canonical loops. Each has its own scoring and leaderboard; none are ranked-eligible, and all are reachable as Battle Hub arcade cabinets. The classics are here — SF II car/barrel destruction and the Tekken Force board breaker as fixed-timer object-clearing challenges, Tekken Bowl (ten-frame bowling with per-fighter signature animation), Tekken Ball (charge-a-hit-to-raise-ball-damage volleyball), MK Test Your Luck's random modifier roll, the SC Tower of Lost Souls floor-climb, Boss Rush with an HP-carry-over option, and King-of-the-Hill / Endless Versus winner-stays rotation.
The one bonus surface that lives as shipped external data is the arcade
mini-game suite. V2/balance/modes/arcade-mini-game-suite.json (schema
v2.modes.arcade-mini-game-suite-data.v1, section 133) enumerates eight
cabinets — Pinball, Air Hockey, Mini-Golf, Darts, Pool/Billiards, Cooking,
Photo Tournament, Tekken Bowl — each with its real authored parameters
(Pinball's faction-themed playfields, bumpers/ramps/flippers/jackpot, multiball,
controller tilt; Mini-Golf's 18- and 9-hole counts with authored hazards and a
community course editor). Those eight match EV2ArcadeMiniGameSuiteKind
one-for-one, and BuildDefaultArcadeMiniGameSuiteCatalog() is the validated
runtime mirror. The cabinet economy is data too: coinInputCostFighterCoins: 1,
with free play for ambassadors and pro players, and a per-cabinet leaderboard
granting cosmetic top-N rewards. The playable cabinets themselves — the actual
pinball physics — are the named-but-unbuilt content layer; the suite
definition, economy, and scoring contract are real and tested. Unlocks come via
Krypt chests, Tower clears, or seasonal events, and any un-earned bonus mode can
be made default-available as an accessibility accommodation rather than gated
behind grind.
Training tools — a first-class product surface#
Training is not a separate engine; it is the same deterministic simulation as
a live match, with non-deterministic tooling layered on the presentation side
— overlays attach to FV2PresentWorld, never to the integer-frame
FV2SimWorld, so determinism is preserved by construction (see the combat and
netcode pages). The contract for the whole workspace is one validated struct,
FV2TrainingModeToolingSpec (V2UI/Public/V2UITypes.h:16614), surfaced by the
native UV2TrainingToolsScreen, with BuildDefaultTrainingModeToolingSpec()
(V2UIConfigAsset.cpp:6873) authoring the shipped defaults and IsValidSpec()
gating them. This is real C++: HasRequiredToolCoverage()
(V2UITypes.cpp:21720) fails the spec unless all eight rulesets, all ten
specialized trainers, and all four range visualizers are present, and the
top-level flags bFrameAccurateSimulation, bLosslessOnlineRulesParity,
bReducedMotionSafe, and bGameplayInertUI are each required to pass.
Dummy programming (FV2TrainingDummyProgrammingSpec) is the heart of it: a
state set (Stand / Crouch / Jump), six block modes (Auto / All / FirstHit / None
/ Random / AfterFirstHit), throw-tech toggle, six wakeup actions (None /
Reversal / Random / GetUpAttack / RollForward / RollBack), five behavior presets
(Aggressive / Defensive / ThrowHappy / ReversalOnWake / Random), three
frame-step modes (one frame / N frames / until-next-hit), and an 8-slot action
recorder — each slot clamped to 1–60 seconds, with Loop / Random / Sequential
playback and a trigger on hit / block / whiff / neutral. There are 10 lab save
slots per fighter, an always-counter-hit toggle, shareable lab-setup codes, and
step-simulation-while-paused.
Display tools (FV2TrainingDisplayToolsSpec) give the hitbox/hurtbox viewer
color-coded by the same vulnerability bitmask the combat resolver reads, a
12-frame hit-active region trace, and a frame-data overlay surfacing
startup/active/recovery, on-hit/on-block advantage, and juggle proration. Input
display runs on both sides with frame numbers, negative-edge markers, and
motion-recognition highlights; the readouts add per-hit damage, the running
scaling factor, numeric ruleset meters, hitstun/blockstun countdown bars, a
reset-opportunity flag, and a whiff-punish window flash. Stage/position
offers seven presets (Corner / MidScreen / BehindOpponent / Wallsplat /
Knockdown / JumpArc / Custom), five reset triggers, and
Full/Half/OnePixel/Custom HP and meter resets with reset-on-first-hit auto-loop
for execution drills. Combo tools expose 0.25×/0.5×/0.75× slow-mo replay,
auto-loop on success, length/damage limit indicators, best-combo trackers per
character and per starter, a stored personal best, and a frame-perfect
just-frame marker.
Five tooling sub-systems make training a full product surface. Replay Takeover
from training saves the last match as a lab scenario preserving both fighters'
state, loads your own and cloud replays, pauses at any frame, and lets you take
over either side and continue the match. Practice-during-loading
(Mode.Training.LoadingPractice) hosts an ad-hoc dummy space on match-load
screens that auto-yields when the real match is ready. The multiplayer
training lobby tolerates up to 250 ms RTT, lets a friend join as opponent or
coach, and gives the coach the power to pause both clients, annotate frames,
drive dummy commands, and push notes over a client-server tooling channel. The
ten specialized trainers — Frame Trap Detector, Option Select Detector,
Hit-Confirm, Anti-Air, Wakeup, Cross-Up, Throw Shimmy, Reaction Time, Combo
Damage Optimizer, Defensive Option Chart — are each scenario-driven and
performance-scored, and the four range visualizers (Throw / Move Reach /
Punish / Anti-Air zone) draw from frame-accurate combat geometry. A drag-drop,
profile-saved, shareable-as-code HUD layout and a CSV/JSON match-data export
(every input, hit, and state transition, plus one-click community-lab import)
round out the spec.
Mission & tutorial curriculum is a parallel validated surface,
FV2MissionTrialCurriculumSpec (section 61, asserted by
V2Tests/.../MissionTrialCurriculum.spec.cpp): a 30-minute First-Boot Tutorial
that re-prompts after 3 consecutive losses and covers throw-tech and wakeup
choices, eight ruleset tutorial tracks of eight lessons each whose
completion unlocks that ruleset's Combat Trials, and eight fighter trial
tracks totaling 160 combat trials (GetTotalCombatTrialCount() returns
exactly 160 — 20 per fighter). The spec validates against the navigation graph,
so a trial that points at a non-existent screen fails the build.
Replay theater, takeover & spectator#
A V2 replay is inputs plus determinism hashes, re-simulated rather than
recorded as video. The file model lives in V2Input/Public/V2InputTypes.h:
FV2ReplayFileHeader carries the magic V2RF, format version,
replay/match/ruleset/ stage ids, build and content versions, the
CosmeticManifestHash, the RngSeed, a 60 Hz tick rate, total frames, and
three determinism anchors — InputStreamHash, InitialStateHash,
FinalStateHash. FV2InputReplayEncoder is a real binary serializer that
writes the literal V,2,R,F bytes and bails to an empty buffer on any
malformed field rather than emit a corrupt file. The byte budget is computed:
EstimateCompressedBytesPerMinute() does a real ceiling division against the
compression profile (1 MiB/min, codec non-None), and the CI determinism
gate re-plays each replay and fails on any FinalStateHash mismatch — the
same hashes the anti-cheat replay-drift pipeline reuses
(Netcode/GoldenReplayCorpus.spec.cpp).
On top of the file format sits a real theater. The viewer
(Cinematics/ReplayViewer, ReplayFreeCamera, ReplayEntityTrackingCamera,
ReplayKillCam specs) drives a FV2ReplayViewerSessionRequest with
player-authored camera keyframes, free-cam, and entity-tracking cuts;
highlight detection classifies moments through EV2ReplayHighlightEventKind
(Kill / LowHealth / Survival / RoundEnd) and EV2ReplayHighlightMomentKind
(MultiKill / ClutchPlay / NearDeathSurvival), and clip export builds an MP4 via
in-engine MoviePipeline (ReplayClipExport.spec.cpp). Replay Takeover is
implemented as fail-loud C++ in V2OnlineServices:
UV2OnlineServicesSubsystem::CreateReplayTakeoverPracticeScenario validates the
request, then requires the replay to actually exist — registered in
CloudReplays or queued as a local download — and returns false with a precise
reason otherwise, only then building a new practice scenario while preserving
the original read-only. Sharing (FV2ReplaySharingWorkflowSpec,
Online/ReplaySharing.spec.cpp) uploads to the cloud, mints HTTPS share
links, downloads shared replays, opens them in-game, and requires owner
consent before any upload. Spectator supports an in-match observer cap
with a TO-controlled anti-spoiler delay, director-cam, and lower-thirds. The
scrubber's round-start / big-hit / combo / KO / finisher chapter markers are the
feature-prose intent that the shipped highlight-event vocabulary above begins to
realize.
AI Director & adaptive difficulty#
Above the per-bot Adaptive AI sits a session-level Director that tunes CPU
difficulty and pacing in single-player modes only — never in ranked or
tournament. The engine half is real: V2AdaptiveAI is one of the three
shipped .uplugins, and services/psyche-ai-director-hints is real TypeScript
exporting buildV2AdaptiveAILiveHintPlan,
buildV2AdaptiveAIMatchStartSnapshotPlan, and
queueV2AdaptiveAIMidMatchPsycheUpdateForNextMatch, computing tendency hints
over observed actions through @psyche/behavior-prediction. Its defining
constant is
V2_AI_DIRECTOR_HINT_ROLLBACK_POLICY = 'live-off-rollback-or-match-start-snapshot-only'
— the Director's hints are consumed either off the rollback path or from a
match-start snapshot, so they can never enter the deterministic frame loop.
That, plus the per-skill-bucket MMR-matched CPU model, is the same
rollback-safe, out-of-band discipline the world-boss damage pipeline uses. The
named Calm→Build→Climax→Recovery state machine, the per-mode tuning table
(Arcade, Towers, Tekken Force, Devil Within, Konquest, Def Jam, MyCAREER), the
step-down-after-3-losses / step-up-after-5-perfects adaptive rules, and the EU
AI Act transparency toggle are design spec in the feature monolith, and the
difficulty-analytics service is the telemetry surface feeding them.
How it connects#
The mode registry is the orchestration layer almost every other V2 system hangs
off. The combat, juggle, blockstring, and golden-replay systems that training
and replay are built on are inventoried in
./combat-systems-defense-and-game-feel.md;
the heaviest standalone modes — roguelike, Battle Royale, world boss, karaoke,
specialty combat, and the signature live events that each ship as a removable
UGameFeaturePlugin — are in
./signature-events-and-standalone-modes.md.
For the registry machinery itself — the load-plan builder, the seven-state
lifecycle, HUD injection, the replay codec internals, and the Hathor UGC-world
bridge — read the architecture companion,
../architecture/game-modes-training-and-replay.md.
Related#
- The feature hub: ../V2_features.md
- Combat Systems, Defensive Options & Game Feel — the fight every mode runs, and the lab tools practice
- Signature Events & Standalone Modes — roguelike, Battle Royale, world boss, karaoke, and the live-event plugins
- Architecture companion: ../architecture/game-modes-training-and-replay.md — the mode registry, load plan, replay format, and sim/present split