The validated roster and presentation catalogues pin versions into a match; they do not prove the corresponding art, animation, voice, stage geometry, or platform cook until those assets and build evidence exist.
A fighting game is its cast. Everything the combat core proves about determinism and the rulesets layer proves about per-family feel only matters if there are sixty distinct people to apply it to, each with their own walk-in, their own trash-talk, their own home stage and their own reason to hate the fighter across the screen. This page covers the three features that turn V2's one engine into a populated universe: the launch roster and its content inventory, the character-presentation layer (intros, matchup banter, win/loss quotes, and the per-fighter signature library), and the stages they fight on. The honest through-line — stated up front so nothing below misleads — is that this layer is logic-and-data shipped, art-and-VO pending: the catalogs, validators, and on-disk data that describe sixty fighters are real and tested; the animations, recorded voice lines, and authored stage geometry they point at are the work that remains. This is the feature-side companion to the "Roster, Story & Creator Suite" group; the section hub is ../V2_features.md.
What ships, honestly#
Each piece below sits at a different point on the implemented-versus-spec spectrum, and this page labels each where it actually is.
- The launch roster is a real, validated C++ catalog. Sixty fighters —
forty-two original, eighteen partner-IP — are enumerated in
UV2LaunchRosterLibrary::BuildDefaultLaunchRosterCatalog()(V2/ue/Source/V2Combat/Private/V2LaunchRosterData.cpp:559), with a strict validator that enforces the count, archetype diversity, and a fail-closed rights-clearance gate on every licensed character. - Character presentation is a validated catalog over a representative slice.
The
FV2CharacterPresentationCatalogresolution logic is real and spec-tested, but the default catalog populates eight fighters and a full 8×8 banter matrix, not all sixty — a vertical slice that matches the eight authored dialogue CSVs. Quote counts, bark triggers, entrance styles, and mirror dialogue are all checked spec. - The signature library is sixty per-fighter checklists behind an honest attestation. A checked box attests that the catalog requirement is defined and validated, explicitly not that any asset is authored.
- Stages are data plus a contract, no authored geometry. A 60-row signature-
stage registry and a Section-81 contract JSON describe lore, day/night, crowd,
particles and destruction; the stage logic (ring-out, destruction, weather,
crowd) lives in
V2Combat/V2VFX/V2Audio, but there are zero authored stage.uassetbinaries. - The narrative data is real CSV. Rivals, the relationship matrix, factions, the timeline, and the codex all ship as populated, cross-linked data files.
The whole-repo reality check: V2/ue/Content/ carries exactly eight
gameplay .uasset (the DA_RegionVariant_* region data), and the rest of this
layer is Unreal C++ catalogs plus V2/balance/** data and *_Contract.json
manifests. The deterministic internals this layer hangs off are documented in
../architecture/combat-system-gas-frame-data-and-determinism.md;
the audio/VFX/cinematic pipelines that render it are in
../architecture/presentation-av-and-signature-content.md.
The launch roster: a validated 60-fighter catalog#
The data model#
A roster fighter is FV2LaunchRosterFighterEntry
(V2/ue/Source/V2Combat/Public/V2LaunchRosterData.h:58): a FighterId, a
display name, an origin (EV2LaunchRosterFighterOrigin — Original or
PartnerIP), an archetype (EV2LaunchRosterArchetype, a twelve-value enum:
Striker, Grappler, Zoner, Rushdown, Powerhouse, Technical, WeaponMaster, SubmissionSpecialist, Aerial, CounterFighter, StanceSwitcher, Hybrid),
a soft path to a DA_Fighter_ data asset, a default moveset and its
FV2LaunchRosterMovesetCoverage (special/super/finisher move-id arrays), and
two rights fields: bRightsClearedForLaunch and PartnerIPLicenseId. The
rights flag is deliberately fail-closed — the header comment is explicit
that it "may only be set true once the entry is either original IP … or covered
by an executed third-party license for launch," and MakeLaunchRosterFighter
sets it to Origin == Original and stamps the license id only when one is
passed (V2LaunchRosterData.cpp:136).
Sixty fighters the validator will not let you fake#
BuildDefaultLaunchRosterCatalog() constructs the canonical roster: 42
original fighters (Asha Storm the striker, Mara Voss the grappler, Cassia Vale
the zoner, on through Lyra Saint) and 18 partner-IP fighters drawn from four
license families — Capcom (Ryu, Ken, Chun-Li, Cammy), SNK (Terry, Mai, Kyo,
Iori), WB/NetherRealm (Scorpion, Sub-Zero, Raiden, Liu Kang, Kitana), and Bandai
Namco (Jin, Kazuya, King, Nina, Mitsurugi). Crucially, the count is not
decorative — FV2LaunchRosterCatalog::IsValidCatalog
(V2LaunchRosterData.cpp:241) rejects any catalog that:
- carries fewer than 60 fighters or sets
MinimumFighterCount < 60; - carries fewer than 12 partner-IP fighters, or zero original fighters;
- fails
HasRequiredArchetypeDiversity()— which demands all twelve archetype families be present with at least three fighters each (V2LaunchRosterData.cpp:332); - contains a partner-IP entry without both
bRightsClearedForLaunchand aPartnerIPLicenseId(:231); - has duplicate fighter IDs or duplicate default moveset IDs, or any entry whose
data-asset path is not a
DA_Fighter_, whose style tag is missing, or whose default moveset id does not match its coverage struct.
That validator is what makes the "≥ 60 fighters, archetype diversity, licensed
individually" promise from the source a checked invariant rather than a
marketing line. The Combat.Module automation spec drives the builder and the
validator directly, so a regression that dropped the roster below sixty, lost an
archetype, or shipped an uncleared licensed character would fail CI.
Per-fighter content and the inventory targets#
Each roster entry's FV2LaunchRosterMovesetCoverage carries the special/super/
finisher move-id arrays and a bFinishersApplicable flag (false for rulesets
without finishers), validated by IsValidCoverage. The broader content-
inventory numbers from the source — ≥ 4 specials, ≥ 2 supers, ≥ 2 finishers, ≥
4 alt costumes, ≥ 3 taunts per fighter; a ≥ 200-move universal CAW/CAM
pool with style-locked sub-pools (Wrestling ≥ 80, Martial Arts ≥ 80, …); a ≥
500-item wardrobe library — are authoring targets, not all enumerated in
this catalog. Where they are enforced today is the per-fighter signature library
and the Creator Suite move pools (the latter covered in the Creator Suite page);
where they are not yet, the numbers describe the content budget the cook must
hit, not data that exists. This page does not present those counts as shipped.
Character presentation: intros, banter, win quotes#
V2 targets the Injustice / MK11 standard of presentation depth, and the
data-contract for it is FV2CharacterPresentationCatalog
(V2/ue/Source/V2Cinematics/Public/V2CinematicsTypes.h:7090), registered on the
cinematics subsystem via RegisterCharacterPresentationCatalog. It is exercised
by CharacterPresentation.spec.cpp — one of 37 dedicated cinematics spec
suites under V2/ue/Source/V2Tests/Private/Cinematics/.
The presentation vocabulary#
The catalog's enums map one-to-one onto the source's feature list. Bark triggers
(EV2CharacterPresentationBarkTrigger) are the eight gameplay events
CounterHitLanded, ThrowLanded, ParryLanded, LowHP, ComboN, FinisherArmed, FinisherMissed, KO
— the same events the audio bark router consumes, so the presentation layer
and the foley layer fire off one shared signal. Entrance styles
(EV2CharacterPresentationEntranceStyle) are the five family walk-ins
WWEWalkout, TekkenStageArrival, MKPitSummon, SFHubArrival, DefJamClubStrut;
post-fight cutscenes (EV2CharacterPresentationPostFightCutscene) are
VictoryPose, UFCPresser, UFCMicInterview, WWEMicMoment; lore unlocks
(EV2CharacterPresentationUnlockSource) are
MatchPlay, CombatTrialCompletion, MissionCompletion, TowerClear; and Arcade
endings carry one of nine distinct art styles
(OilPainting, ComicBookPanel, AnimeCelShade, GothicWoodcut, HipHopGraffiti, PhotorealPortrait, UkiyoE, ArtNouveau, MangaInkWash),
with the catalog's HasDistinctEndingArtStyles() asserting the slice actually
varies them rather than stamping every fighter the same.
Quote banks and matchup banter#
The quote bank (FV2CharacterPresentationQuoteBankSpec,
V2CinematicsTypes.h:6832) defaults to 30 win quotes and 15 loss quotes per
fighter, plus draw and double-KO quotes, plus a per-matchup win quote, and a
fan-out of context selectors: by opponent, by ruleset, and by finisher /
perfect-round / comeback / timeout / ring-out, and by pinfall / submission / KO
/ double-KO. Matchup banter is its own struct
(FV2CharacterPresentationMatchupBanterSpec): fighter A and B each trade two
authored lines, bAuthoredPerOpponent is set, and mirror matches carry the
bMirrorSpecific flag so a fighter facing themselves gets uniquely-authored
mirror dialogue rather than the cross-matchup pool. The spec asserts the slice
exactly: the default catalog has 8 fighters and 64 matchup-banter
entries (the full 8×8 matrix including the eight mirrors), Asha's quote bank
is exactly 30/15, her bark triggers cover the gameplay events, and her entrance
carries WWE arena, DJ club and MK pit intro variants. The runtime snapshot
exposes
bCharacterPresentationRosterReady / …MatchupsReady / …LoreReady / …EntrancesReady
so a cert pass can check coverage per area.
The honest scope note: this is a validated eight-fighter vertical slice, not
sixty. HasRequiredRosterCoverage() is satisfied at eight, and the eight match
the eight authored dialogue files below. The catalog shape scales to the full
roster; the authored content is a representative slice today.
The dialogue database on disk#
Behind the catalog sits real, per-fighter CSV under V2/balance/dialogue/ —
eight files (asha_storm, bishop_crowe, kai_voltage, lian_noor,
mina_kade, nyx_river, rook_vale, sol_vega) with the columns
situation, opponent, ruleset, line_id, english_text, locale_x_text, vo_file_path, emotion, length_cap.
The situations span prefight (per-opponent, e.g. Asha vs. Kai under the Street
Fighter ruleset), mirror (a dedicated bank — Line.AshaStorm.Mirror.001,
never the cross-matchup pool), final_round, comeback_round, win, loss,
and audio_diary; each line carries an English string, an emotion tag, and a
length_cap. Alongside the CSVs are an importers/ folder (Ink and Yarn
dialogue sources), a barks/ folder (a .v2barks.json priority/cooldown bank),
and a localization/ folder. The honest caveat, the same one the architecture
companion makes: every locale_x_text cell reads TODO and every
vo_file_path points at a /Game/V2/Audio/Voice/… asset that does not exist
yet — the text and routing ship; the localized, recorded VO does not. (The
dialogue tokens — AshaStorm, KaiVoltage — also use full-name forms distinct
from the roster's short Fighter.Asha ids, reflecting that this DB was authored
as an early sample bank.)
The per-fighter signature library#
What makes a fighter feel theirs is a contract spanning animation, audio, VFX,
stage and HUD, modeled as FV2FighterSignatureLibraryCatalog
(V2LaunchRosterData.h:357) and built one entry per roster fighter by
BuildDefaultFighterSignatureLibraryCatalog() — so all sixty fighters are
covered, and the validator rejects any catalog that misses one. Each entry nests
five real sub-libraries with domain-specific minimums: animation (a unique 8–12
s signature idle, ≥ 3 taunts, 3 victory poses, a non-generic KO defeat,
slip/dodge/air-recover/pursue variations), audio (8 unique impact stings, 3
dynamic theme variants, stamina-driven breath, per-costume micro-foley), VFX
(low-HP comeback aura, weapon glow/trail, finisher VFX kit, X-Ray bone pattern,
blood spatter), stage reactions (cinematic close-up shader, throw-receiver and
hit-by-specific-move recoils), and HUD theme (faction palette, mastery-unlock
levels). Each also carries an authoring checklist at
V2/balance/fighters/<Fighter>/signature-checklist.md (sixty of them). Those
checklists are scrupulously honest: their legend states a checked item "attests
that the launch-roster signature catalog … defines and validates the requirement
— it does not attest that any game asset has been authored," and every
file's "Asset authoring (pending — no assets exist in this repository)" section
stays unchecked "until real assets land and pass the QA cert signature-library
audit." This is the single clearest statement of where this whole layer sits.
Stages: signature homes, lore, atmosphere and crowd#
The per-fighter signature stage registry#
Every fighter has a canonical home stage, mapped in
V2/balance/stages/per-fighter-signature-stages.csv — 60 rows of
fighter_id, signature_stage_id, lore_page_id spanning all the families
(Fighter.Asha → Stage.MK.PitNetherrealm, Fighter.Mara →
Stage.WWE.RawArena, Fighter.Cassia → Stage.SF.MetroCity, Fighter.Juno →
Stage.DJ.NYCClub). The contract that consumes it,
V2/ue/Content/V2/Stages/StageLoreAtmosphereCrowd_V2_Contract.json (Section
81), pins requiredRosterCoverage: 60, a Preview.<fighter>.<stage>
character-select preview pattern, and
climaxAutoSelectModes: [Story, Arcade, SideStory] — so a Story or Side-Story
climax auto-selects the relevant fighter's signature stage.
Lore, day/night, atmosphere and crowd#
The same contract enumerates the stage-presentation surface the source
describes: a per-stage lore schema
(history, faction, ambient-creatures, cinematic-camera-presets, easter-eggs);
a five-step day/night cycle (Dawn, Day, Dusk, Night, Midnight) that combines
with weather and survives multi-floor transitions; eleven atmospheric particle
profiles
(SnowFlurry, DustMote, AshDrift, Ember, FogWisp, Mist, Pollen, Fireflies, FallingPetals, FlyingPaper, DriftingSmoke);
and per-ruleset crowd density profiles that match the design intent exactly
— WWE at 10,000 instanced crowd actors, UFC at 2,000 octagon-side, Def Jam at
300 with individual actor reactions, Mortal Kombat "none-or-monster-crowd,"
Street Fighter avatar-driven Battle Hub, Soul Calibur medieval. Individual
reactions (throw-the-rock, stand-up-applause, phone-up-record), a stage-out
gasp/cheer reaction, a destruction lifecycle with persistent elements
(BrokenPanes, ScorchedWalls, TornRopes) and per-ruleset reset rules, a hazard
library that tournament mode disables, and per-stage commentary intro lines
round it out. The contract is CI-checked by
V2/ue/Tools/check-v2-stage-lore-atmosphere-crowd.py.
Where the stage logic actually lives#
No stage geometry is authored — there is no Content/Stages/*.uasset. What is
real is the logic stages need, and it lives in the combat and presentation
modules rather than here: the ring-out condition is a combat-ruleset layer
(RingOut, active for Soul Calibur and Def Jam — see
./rulesets-tag-and-kameo.md), stage
destruction, weather and atmospheric particles are V2VFX resolve/queue
pairs (EV2StageDestructionResetRule, EV2StageWeatherKind), and per-stage
crowd noise and chants are a V2Audio catalog — all detailed in
../architecture/presentation-av-and-signature-content.md.
So a stage today is a data contract plus the runtime systems that will dress it,
awaiting the authored environment art.
Lore, relationships and the codex#
The narrative scaffolding the roster hangs in is populated CSV under
V2/balance/lore/ and V2/balance/codex/. rivals.csv gives every one of the
60 fighters a reciprocal primary_rival plus a pipe-list of secondary rivals
(Fighter.Asha ↔ Fighter.Mara, secondaries Cassia | Scorpion).
relationship-matrix.csv types 78 directed pairs across the full vocabulary —
Ally, Friend, Rival, Enemy, Mentor, Student, Mentor-Betrayed, Family, Romantic, Cordial, Indifferent
— each with a drives list, an asymmetric flag, and a canon_scope.
faction-relationships.csv carries faction-to-faction status (Lin Kuei vs.
Black Dragon At-War, Special Forces vs. Brotherhood Enemy) with the modes
each feud drives; timeline.csv and timeline.md lay down the master
cross-character timeline; and convergent-endings.md defines the post-credits
cinematics that unlock only when an Arcade ending, a Story branch, and a Side
Story set all resolve on the same profile. The codex is codex-categories.csv
plus a 60-row codex-fighter-entries.csv (each a 255–260-word entry with
optional art, an audio diary, an unlock condition, and a replay/cinematic link).
The progression tracks that gate these unlocks (per-fighter mastery, account
level and prestige, the unified quest log) live as their own CSV set and are
covered alongside the Creator Suite in
./relationships-progression-and-creator-suite.md.
How it connects#
The roster catalog is the cast every other system parameterizes over: the ruleset layer re-skins each fighter per family (./rulesets-tag-and-kameo.md), the combat core gives them frame data and supers (../architecture/combat-system-gas-frame-data-and-determinism.md), and the presentation pipelines dress them in audio, VFX and cinematics (../architecture/presentation-av-and-signature-content.md). The bark triggers this page lists are the same gameplay events the audio router consumes; the entrance and finisher data assets are authored in the cinematics module; the lore and progression data feed the relationships, codex and Creator Suite features. The consistent honest line across all of it: the contracts, validators and data are real and tested; the authored art, audio and VO they describe are the production work that remains. The section hub is ../V2_features.md.
Related#
- Rulesets, Tag-Team & Kameo Assists — the per-ruleset HUD overlay, ring-out rules, and team theme music that dress the roster per family
- Combat Systems, Defense & Game Feel — the moves, supers, and finishers each roster fighter carries
- Relationships, Progression & Creator Suite — the rival/relationship-driven narrative, mastery/account progression, codex, and the create-a-fighter authoring surface (forthcoming sibling page)
- Audio, VFX, Cinematic & Signature Content Pipelines — the C++ subsystems that resolve and render intros, banter, entrances, finishers, and stage atmosphere
- Combat System: GAS, Frame Data & Determinism — the deterministic match state the presentation layer reacts to but never perturbs
- The section hub: ../V2_features.md