Skip to content

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:

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 pawns
      • Game/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 members
            • Characters/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_Manny and the other colour variants: Mannequin-bodied examples kept on disk, not in the shipped roster
    • AXenoCoreEnemyCharacter: enemies (see Enemies and AI)
  • ACharacter
    • AXenoCoreNpcCharacter: 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:

  1. Sets its Combatant Pawn Data on the pawn extension component.
  2. Initialises its ability system. Only now can it take damage and die.
  3. Grants every ability set in the pawn data.
  4. 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.
  5. 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_Masculine and _Feminine are parts with no mesh. They exist only to carry a tag, Cosmetic.AnimationStyle.Masculine or .Feminine.
  • The character-parts component's Body Meshes rules read that tag and set the body mesh: masculine to SKM_Manny, feminine to SKM_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_Manny on B_XenoCore_PartyMember_Base and B_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 LogXenoCosmetics warning 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 of Characters/Party/B_XenoCore_PartyMember_Base (a Mannequin body), in Content/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.