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¶
- Add a party member: you need a character with their own Stats Effect.
- Glossary: Curve table, Gameplay effect.
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.
- In the Content Browser, right-click
Battle/Attributes/CT_XenoCore_PartyStatlinesand choose Export as CSV. Save it into your own project folder. - Open the CSV. The first row is
---,1,2,3,...,99: the levels. Each further row is a name then 99 values. - 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 (sayKael.*) and scale them. - Duplicate
CT_XenoCore_PartyStatlinesintoMyGame/PartyasCT_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.
- Open your character's stats effect, for example
GE_BaseStats_Rook. - Expand Modifiers. For the Strength modifier, under Scalable Float Magnitude, set
Value
1.0, Curve TableCT_MyGame_BaseStatsand Row NameRook.Strength. - Do the same for Ether, Agility and MaxHealth.
- 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.Healthrow, so the samples do the same.) - Leave TalentChargePerHit and CharacterLevel as they are. Talent charge is a flat
percentage of the gauge per landed auto-attack;
0means this character charges some other way. See Make a Talent Art. - Check that every Modifier Op reads Override.
- 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¶
- Open
Maps/L_XenoCore_Gymand press Play with the character in the active party. - Open the menu and go to the Party screen. Check the character's HP and stats against your rows at their level.
- Close the menu, open the console (~) and type
XenoAwardExp 5000. The party levels up. - 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¶
- Stats and damage: what each stat does in the damage formula.
- Tune levelling: experience curve and level cap.
- Curve tables reference