Characters¶
All · 15 min read · No code
Every character that fights carries its own ability system on its pawn: its own attributes, its
own arts, its own active effects. Party members and the player's pawn share one C++ base,
AXenoCoreCombatantCharacter, whose only job is to wire that ability system up without a player
state. Enemies do the same wiring on a separate class, and NPCs deliberately have none of it. The one
idea: a character's identity is its Blueprint (mesh, pawn data, statline, starting level), and
anything that must outlive the body, such as its level, is stored elsewhere and read back when the body
spawns.
At a glance
In play: every fighter has its own body, stats, level and Arts; a party member at 0 HP kneels (downed) instead of dying.
What you can change, no code:
- A character's starting level, name and portrait: Your first change
- Their stats at each level: Give a character its own statline
- Body shape and movement style: Choose an animation style
- A whole new member: Add a VRoid party member
- Every setting on this page: What you can change
How it fits together¶
The class tree, from C++ to the Blueprints you open:
ALyraCharacterWithAbilities(Lyra: a character that owns its ability system)AXenoCoreCombatantCharacter: party-playable pawnsGame/B_XenoCore_PlayableCharacter_Base(Blueprint)Game/B_XenoCore_Player: the bootstrap pawn, used only when the party has no starting roster. Not in the shipped roster
AXenoCorePartyCharacter: adds equipment, AI perception and footstep components in C++Characters/Party/B_XenoCore_PartyMember_Base(Blueprint)Characters/VRoid/B_XenoCore_Party_VRoid_Base: the base for VRoid membersCharacters/VRoid/<Name>/B_XenoCore_Party_VRoid_*: the sample party, seven members (Kael, Mira, Nia, Dorran, Isolde, Sabine, Tamsin), one folder each
B_XenoCore_Party_Quinn,B_XenoCore_Party_Mannyand the other colour variants: Mannequin-bodied examples kept on disk, not in the shipped roster
AXenoCoreEnemyCharacter: enemies (see Enemies and AI)
ACharacterAXenoCoreNpcCharacter: townspeople,Characters/NPC/B_XenoCore_Npc
Two names for the same idea on enemies
Enemies are not on the combatant base, so their settings have their own names: Enemy Pawn Data and Enemy Level instead of Combatant Pawn Data and Combatant Level. They mean the same thing.
Who is in the party
The sample cast is the seven VRoid members. A new game starts with two, Kael and Mira; the
other five (Tamsin, Dorran, Sabine, Nia and Isolde) are recruited from NPCs on Gaur Plain,
and every member who joins fights (Max Active Members is 7). The colour variants
(PartyMember_Quinn, PartyMember_Blue and the rest) stay on disk as working examples of a
Mannequin-bodied member; they are not in the cast. See
Set the starting party and
Recruit a party member from an NPC.
Each sample member has its own statline and its own experience curve: a stats effect per
character (Battle/Attributes/GE_XenoCore_BaseStats_<Name>, reading the <Name>.* rows of
Battle/Attributes/CT_XenoCore_PartyStatlines), and a row in Game/DT_XenoCore_ExperienceCurves
picked by the member definition's Experience Curve. See
Give a character its own statline and
Tune levelling.
Pawn data (ULyraPawnData) is the list of ability sets and input config a character gets. Each
party Blueprint points at one, for example Characters/Party/PawnData_XenoCore_Party_Quinn (the
seven sample VRoid members share Characters/VRoid/PawnData_XenoCore_Party_VRoid), which grants AbilitySet_XenoCore_PartyMember and uses the tag relationships in
Game/TagRelationships_XenoCore. The player's pawn uses Game/PawnData_XenoCore_Player, which grants
AbilitySet_XenoCore_Hero.
Lifecycle¶
Spawn. When the party spawns a body, the body sets itself up as it spawns, in this order:
- Sets its Combatant Pawn Data on the pawn extension component.
- Initialises its ability system. Only now can it take damage and die.
- Grants every ability set in the pawn data.
- Applies its Stats Effect at its level. A party member's level comes from the progression component; anything without a roster entry uses Combatant Level.
- Grants the art palette stored for this character (see Arts).
The player's bootstrap pawn, spawned by Lyra's game mode before the party exists, does the same steps
through its hero component instead, because Self Initialise Ability System is off on
B_XenoCore_Player.
Statline. A statline is a Gameplay Effect whose modifiers read curve tables at the effect's level. Applying it again at a new level is what a level-up is. See Stats and damage.
Possession. Every party body is born under AI control. When the player takes one over, its hero component binds input and the camera. When the player hands a body back to the AI and later takes it again, input is re-bound explicitly, because Lyra only binds on the first possession.
A body with AI Steering on moves more softly while the AI drives it: a lower turn rate, a slower start and a longer stop, so a companion has weight instead of snapping and spinning like a player-driven body. When the player takes it over, the Blueprint's own movement values (the Character Movement component's Rotation Rate, Max Acceleration and Braking Deceleration Walking) are put back from the class defaults, so the player's feel is never changed by it.
Down, not dead. Health reaching zero on a party member does not kill it. The party's ability
sets grant Battle/GA_XenoCore_Downed in place of Lyra's GA_Hero_Death: the member kneels
(Characters/Core/Animations/Downed/AS_XenoCore_DownedKneel_*), cannot act, and waits for a revive
or the end of the battle. See Party Gauge, downed and revive.
| Who | What happens at 0 HP |
|---|---|
| Party member (sample party and colour variants) | Goes downed: kneels in place with its weapon, greys out on the HUD, gets up on a revive. When every active member is down the party is wiped. |
A party pawn (AXenoCorePartyCharacter) whose ability sets grant GA_Hero_Death instead |
The death performance: one of Death Montages at random, a wait between Ragdoll Delay Min and Ragdoll Delay Max, a ragdoll with an impulse on Ragdoll Impulse Bone, and its weapons hidden. |
| Enemy | Its own sequence, then EXP, a chest and a vanish. See Enemies and AI. |
Keep Body On Death keeps the body, and its ability system, after a real death so it can be
brought back with Revive. It is on for the party bases and B_XenoCore_Player, and off (Lyra's
behaviour) for anything else.
Fails silently: a pawn with no pawn data cannot die
Death and damage come from abilities that the pawn data grants. A character Blueprint with
Combatant Pawn Data empty spawns with no abilities, no stats, and cannot be killed. An error
naming the pawn is logged, and UXenoCorePartyMemberDefinition also flags it in the Content
Browser when you validate the member asset.
Fails silently: no Stats Effect
With Stats Effect empty the character runs on attribute defaults (mostly zero) and an error is logged on every spawn. It still moves and animates, so it looks fine until it fights.
A destroyed body takes its ability system with it
The ability system lives on the body. When the body is destroyed, its attributes, arts and active effects go with it. Level, EXP and the art palette survive because they are stored on the progression component and re-applied to the next body. Anything else you keep only on a character's ability system (a buff, a custom attribute) is lost on death unless Keep Body On Death is on. A downed member keeps its body, so nothing is lost while it waits for a revive.
Appearance: cosmetic parts and body meshes¶
XenoCore uses Lyra's cosmetic system. Each playable Blueprint has a Cosmetic Part variable. On begin play, if it is set, the Blueprint adds that part through Lyra's character-parts component.
Characters/Core/Cosmetics/B_XenoCore_Cosmetic_Masculineand_Feminineare parts with no mesh. They exist only to carry a tag,Cosmetic.AnimationStyle.Masculineor.Feminine.- The character-parts component's Body Meshes rules read that tag and set the body mesh:
masculine to
SKM_Manny, feminine toSKM_Quinn. - The same tag picks the animation layer when the weapon is drawn or stowed, so a feminine character uses Lyra's feminine clips. See Animation.
So the colour variants differ only by material, and body shape plus movement style come from one tag.
VRoid members use the same pattern the other way round: Body Meshes point at the invisible
SKM_Manny_Invis / SKM_Quinn_Invis, and a VRoid cosmetic part (B_XenoCore_Cosmetic_VRoid_*)
carries the visible mesh, retargeted from the invisible Mannequin. Gameplay, montages and sockets
all stay on the Mannequin skeleton. See Add a VRoid party member.
No invisible pawns. Lyra's character-parts component sets the body mesh from Body Meshes every time a part is added or removed, and when no rule matches the parts' tags it uses Body Meshes › Default Mesh. With no default, the body is set to nothing and the character turns invisible. XenoCore closes this three ways:
- Every shipped pawn has a Default Mesh:
SKM_MannyonB_XenoCore_PartyMember_BaseandB_XenoCore_PlayableCharacter_Base, the invisible Mannequin on the VRoid pawns. - At Begin Play, before the Blueprint adds its part, a combatant character with no Default Mesh
uses the mesh it spawned with for this session, and logs a
LogXenoCosmeticswarning once per class. - Saving a pawn Blueprint runs an editor check: a missing Default Mesh or a rule with no mesh is a warning; a Cosmetic Part whose tags match no rule is a warning, or an error on a pawn that is not a XenoCore combatant and so has no runtime guard.
An unmatched style tag gives the default body
A part whose tags match no Body Meshes rule no longer hides the pawn, but it silently gives it the Default Mesh instead of the body you meant. Give every style tag a rule, and leave Cosmetic Part empty rather than pointing it at a class with no tag.
What you can change¶
| Setting | Where it lives | What it does |
|---|---|---|
| Combatant Pawn Data | Character Blueprint › XenoCore › Combatant | Ability sets and input config. Required. |
| Combatant Level | Character Blueprint (also per placed instance) › XenoCore › Combatant | Starting level. For a party member it only seeds the saved level the first time. |
| Stats Effect | Character Blueprint › XenoCore › Combatant | The statline effect applied at the character's level. |
| Self Initialise Ability System | Character Blueprint › XenoCore › Combatant | Off only on the bootstrap player pawn. The party component forces it on for bodies it spawns. |
| Keep Body On Death | Character Blueprint › XenoCore › Combatant | Keep the body (and its ability system) after a real death so it can be revived. On for the party. |
| Art Learn Table | Character Blueprint › XenoCore › Arts | The character's learnset: a Data Table of XenoCoreArtUnlock saying which arts they learn, at what level, in which starting slot. Empty means keep whatever the ability sets grant. See Arts. |
| Skill Tree | Character Blueprint › XenoCore › Skills | The character's skill branches: a Data Table of XenoCoreSkillBranchRow. Empty means no skills. See Skills and Add a skill or a skill tree. |
| Death Montages, Ragdoll Delay Min/Max, Ragdoll Impulse Bone, Ragdoll Impulse Strength | Party Blueprint › XenoCore › Death | The death performance, for a member that really dies rather than going downed. |
| Cosmetic Part | Character Blueprint variables | The tag-carrying part that decides body mesh and animation style. |
| AI Steering | Character Blueprint › XenoCore › Movement | Softer turning, acceleration and braking while an AI drives the body. Enabled is on for party bodies and B_XenoCore_Player, off otherwise; defaults 420°/s, 1500 and 1100. See Companion AI. |
| Body Meshes | Character Blueprint › character-parts component | Which mesh each cosmetic tag selects, and the Default Mesh used when none matches. |
| Starting equipment | Character Blueprint › equipment component | The gear a character is first dressed in. See Equipment. |
Extending it¶
- A new party member: make a child Blueprint of
Characters/VRoid/B_XenoCore_Party_VRoid_Base(a VRoid body, like the sample party) or ofCharacters/Party/B_XenoCore_PartyMember_Base(a Mannequin body), inContent/MyGame/. Give it its own pawn data and stats effect, then make a member definition for it. See Add a VRoid party member and Add a party member. - A new statline: duplicate a party stats effect and change its curve rows. See Give a character its own statline.
- A townsperson: place
B_XenoCore_Npc, or make a child Blueprint of it for a reusable type. It has no ability system and cannot fight. - To add a component to every party member, open
B_XenoCore_PartyMember_Base, click Add in the Components panel, then Compile and Save: every child gets it.
For programmers: components on the party base
Never add components to B_XenoCore_PartyMember_Base from an editor script: a scripted
component crashed play twice on a null owner. Add them in the editor or in a C++ subclass. The
equipment component is created in C++ on AXenoCorePartyCharacter for this reason.
The player's pawn is on a different branch
B_XenoCore_Player derives from B_XenoCore_PlayableCharacter_Base, not from the party base, and
has its own editor-added equipment component. Changes you make to
B_XenoCore_PartyMember_Base do not reach it. Its death graph was removed when the party moved
to downed. Its arts also come from
AbilitySet_XenoCore_Hero; it has no Art Learn Table.
Why it's built this way¶
For programmers: the design reasons
Lyra's hero component only knows how to find an ability system on a player state. A party of
characters that each keep their own stats would need a player state each. Instead XenoCore uses
Lyra's ALyraCharacterWithAbilities, the same shape as Epic's damageable test dummy, and performs the
one initialisation call Blueprint cannot make (InitializeAbilitySystem) in C++. The base does
nothing else: no drop table, no ragdoll, no follow logic, so a subclass never inherits behaviour it
did not ask for.
The statline is applied from C++ rather than granted by an ability set because an ability set applies its effects at one fixed level for every character that uses it.