Skip to content

Author a character's statline

Designer · 30 min · No code

Result: a party member has their own HP, Strength, Ether and Agility curve from level 1 to 99, read from rows you wrote. Levelling them up moves every number along your curve.

Before you start

How a statline works

A character's base stats are one gameplay effect, set as Stats Effect on their pawn Blueprint (open it, click Class Defaults, then XenoCore › Combatant). It is applied at the character's level when their body spawns, and again on every level-up.

Each stat is one modifier on that effect:

Field on the modifier Value in the samples Why
Attribute XenoCoreStatSet.Strength, .Ether, .Agility, LyraHealthSet.MaxHealth, LyraHealthSet.Health, XenoCoreStatSet.TalentChargePerHit, XenoCoreStatSet.CharacterLevel One modifier per stat
Modifier Op Override Re-applying at a new level replaces the old number
Magnitude Calculation Type Scalable Float A value times a curve
Scalable Float Magnitude A Value, a curve table and a Row Name The stat at level N is Value × row(N)

The seven VRoid characters each have rows of their own in Battle/Attributes/CT_XenoCore_PartyStatlines (Kael.MaxHealth, Mira.Strength and so on, levels 1 to 99), read by their own effect (GE_XenoCore_BaseStats_Kael, ...) with every Value at 1.0, so the number in the table is the number the game uses. The curves are XC1's own: each character follows the XC1 party member their skill tree comes from (Kael Shulk, Mira Reyn, Nia Dunban, Dorran Fiora, Isolde Melia, Sabine Riki, Tamsin Sharla). The older stock members read CT_XenoCore_BaseStats's shared rows with a different Value multiplier each. Give your character rows of their own, which is what this recipe does.

How much EXP each level costs is separate from the statline: it is the member definition's Experience Curve, a row of Game/DT_XenoCore_ExperienceCurves. Each VRoid character has a row of its own. See Tune levelling.

CharacterLevel is the exception: it uses the custom calculation XenoCoreMMC_EffectLevel, which simply reports the level the effect was applied at. Leave it alone.

Defence, block and critical rate are not on the statline

A party member's Physical Defence, Ether Defence, block and critical rate start at zero and come entirely from equipment. That is intended. See Equipment.

Steps

1. Write the rows

The simplest route is a spreadsheet.

  1. In the Content Browser, right-click Battle/Attributes/CT_XenoCore_PartyStatlines and choose Export as CSV. Save it into your own project folder.
  2. Open the CSV. The first row is ---,1,2,3,...,99: the levels. Each further row is a name then 99 values.
  3. Add four rows for your character, named with your own prefix: Rook.MaxHealth, Rook.Strength, Rook.Ether, Rook.Agility. Fill in a value for every level. A good start is to copy one character's rows (say Kael.*) and scale them.
  4. Duplicate CT_XenoCore_PartyStatlines into MyGame/Party as CT_MyGame_BaseStats, right-click the duplicate and choose Reimport With New File, and pick your CSV.

Reimport points at a file on the template author's machine

The shipped curve tables remember the CSV they were imported from, on a path that does not exist on your machine. A plain Reimport of a shipped table fails. Always use Reimport With New File, on your own duplicate.

You can also edit rows directly: open the table, switch to the table view, and edit a cell. The editor can add a row too (the + Curve button) and rename one (double-click its name), but for 99 levels the CSV is quicker.

2. Point the stats effect at your rows

If your character does not yet have a stats effect of their own, duplicate Battle/Attributes/GE_XenoCore_BaseStats_Kael into MyGame/Party (for example as GE_BaseStats_Rook) and set it as Stats Effect on your pawn Blueprint.

  1. Open your character's stats effect, for example GE_BaseStats_Rook.
  2. Expand Modifiers. For the Strength modifier, under Scalable Float Magnitude, set Value 1.0, Curve Table CT_MyGame_BaseStats and Row Name Rook.Strength.
  3. Do the same for Ether, Agility and MaxHealth.
  4. Point the Health modifier at the MaxHealth row too. That is what makes a level-up heal the character to full. (The sample table has no Kael.Health row, so the samples do the same.)
  5. Leave TalentChargePerHit and CharacterLevel as they are. Talent charge is a flat percentage of the gauge per landed auto-attack; 0 means this character charges some other way. See Make a Talent Art.
  6. Check that every Modifier Op reads Override.
  7. Click Save.

Fails silently: keep Health on the statline, as Override

Every level-up full-heals the character only because the statline overrides Health as well as MaxHealth. Removing that modifier, or switching it to Add, silently removes the level-up heal.

3. Raise the level cap (optional)

The cap is 99. It is a config value, not an asset field, so there is nothing to set in the Details panel. To raise it, open your project's Config/DefaultGame.ini in a text editor and add:

[/Script/XenoCoreRuntime.XenoCoreStatSet]
MaxCharacterLevel=120

Then extend your curve rows, and the rows of DT_XenoCore_ExperienceCurves, to the new cap. A curve past its last key repeats its last value, so without new keys levels 100 to 120 would all have level 99's stats.

Test it

  1. Open Maps/L_XenoCore_Gym and press Play with the character in the active party.
  2. Open the menu and go to the Party screen. Check the character's HP and stats against your rows at their level.
  3. Close the menu, open the console (~) and type XenoAwardExp 5000. The party levels up.
  4. Open the Party screen again. The numbers match your rows at the new level, and the character is at full HP.

If it doesn't work

Fails silently: a stat reads 0

The modifier's Value is 0. A scalable float is Value × curve, so a zero Value gives zero whatever the table says. Set it to 1.0.

Fails silently: stats double on every level-up

A modifier uses Add instead of Override. Every re-application then stacks on the last.

Symptom Fix
A stat reads the modifier's bare Value (1), and the Output Log has UCurveTable::FindCurve : Row '<name>' not found in CurveTable '<table>' The Row Name does not match a row in the table. Check spelling and prefix.
The level changes but the stats do not The pawn's Stats Effect is empty, so the character runs on default attributes. An error naming the pawn is logged on every Play. Set Stats Effect.
Continue shows old numbers Stats are recomputed from the curve at load, but the level comes from the save. Test with Play in the editor or New Game.
Levels past 99 all have level 99's stats You raised the cap but not the curve rows. Add keys up to the new cap.

Going further