Skip to content

Add a skill or a skill tree

Designer · 45 min · No code

Result: your character has their own skill tree. Its first branch, Guardian, raises Physical Defence as its trait and holds five skills: one that raises max HP, one that strengthens their healing, and one that gives a Strength buff when they land a killing blow. In Play, SP from kills (or the XenoGiveSP cheat) fills the branch, "Skill Learnt" floats over the character, and the stats change.

Before you start

  • Add a party member: you need your own character Blueprint to point at the tree. The shipped characters already have trees.
  • Read Skills for how branches, SP, traits and the three kinds of skill effect fit together. The glossary defines skill, skill tree, branch, SP and trait.
  • Know which skill fields exist: the tables on the concept page list every field of a branch and of a skill.

New table, not a copy

Build your own tree from a blank table rather than duplicating a shipped one. The shipped trees carry sample names and 63 stand-in skills, and a duplicate inherits all of them.

Steps

1. Create the tree

  1. In the Content Browser, create the folder Content/MyGame/Skills.
  2. Right-click in it and choose Data › Data Table. For the row structure pick XenoCoreSkillBranchRow. Name it DT_MyGame_SkillTree_Guardian.
  3. Open it and click Add to add a row. Rename the row Guardian.

Choose the row name now and keep it

The row name is what every save stores for this branch. Renaming it after players have saves silently resets their progress on that branch. Change Display Name instead.

2. Fill in the branch

With the Guardian row selected, set:

  1. Display Name to Guardian.
  2. Trait Description to Prioritising this trait will improve physical defence.
  3. Trait Stat to XenoCore.Stat.PhysicalDefence, and Trait Operation to Add.
  4. Trait Ladder: Data Table DT_XenoCore_SkillTraitLadders, Row Name StatMedium (5, 10, 20, 30, 40, 50 as the branch fills).
  5. Cost Curve: Data Table DT_XenoCore_SkillCostCurves, Row Name Starting (300, 700, 1,000, 2,000, 3,500 SP).
  6. Tick Unlocked At Start. Leave First Skill Prelearned off, so you can watch skill 1 being learnt.

Your own ladder or cost curve

Ladders and cost curves are shared tables, so several branches can point at one row. To make your own, open Battle/Skills/DT_XenoCore_SkillTraitLadders (or DT_XenoCore_SkillCostCurves), click Add, name the row (for example GuardianDefence), and fill its array: - A ladder row's Values needs exactly six numbers: the trait at 0, 1, 2, 3, 4 and 5 skills learnt. - A cost row's Costs needs exactly five numbers: the SP for skills 1 to 5.

Then pick that row name in the branch. Validation flags a row with the wrong count. Adding a row edits a shipped table, so note it for template updates; the six shipped ladder rows and two cost rows are XC1's numbers, so add rows rather than changing theirs.

3. Add a stat skill

  1. Add five entries to Skills. Every branch must have exactly five; the order is the order they are learnt.
  2. Expand entry 0 and set Display Name Sturdy Frame and Description Max HP +{Value} %. ({Value} is filled in from Value).
  3. Set Shape Circle, Timing Always, Scope Self.
  4. Set Value to 5.
  5. Add one entry to Stats: Stat XenoCore.Stat.MaxHealth, Operation Scale.

Scale adds a percentage of the stat; Add adds points. The stats a skill can raise are the channels of GE_XenoCore_SkillStats: Strength, Ether, Agility, Physical Defence, Ether Defence, Critical Rate, Block Rate, Weight, Weapon Attack Min and Max, Max Health and Move Speed.

4. Add a bonus skill

  1. Expand entry 1: Display Name Mender, Description Healing arts restore {Value} more.
  2. Shape Hexagon, Timing In Battle Party, Scope Self.
  3. Value 15.
  4. Bonus XenoCore.SkillBonus.HealingPower. Leave Stats empty.

A bonus skill changes nothing by itself: the healing art asks for the caster's total HealingPower bonus when it heals. The concept page lists every bonus tag and who asks for it.

5. Make the behaviour for a reacting skill

A skill that reacts to something needs a small ability Blueprint. This one gives a Strength buff on a kill.

  1. In Content/MyGame/Skills, right-click and choose Blueprint Class. Under All Classes, pick XenoCoreSkillAbility_TimedBuff. Name it GA_MyGame_Skill_OnKill_StrengthUp.
  2. Open it, click Class Defaults, and under XenoCore › Skills set:
    • Trigger to On Kill.
    • Buff to GE_XenoCore_Status_StrengthUp (in Battle/Status).
  3. Compile and Save. There is no graph to write.

The shipped examples are in Battle/Skills/Abilities; GA_XenoCore_Skill_OnKill_Haste is the same shape with a different buff.

6. Add the reacting skill

  1. Back in the tree, expand entry 2: Display Name Rallying Blow, Description Strength Up for {Value} % on a kill.
  2. Shape Square, Timing In Battle Party, Scope Self.
  3. Value 20 (the buff's strength), Duration 20 (seconds), Chance 50 (percent).
  4. Ability to GA_MyGame_Skill_OnKill_StrengthUp.

7. Fill the last two skills

Give entries 3 and 4 a name and an effect of your choice, using the patterns above. Two quick ones:

  • Weight −5: Stats XenoCore.Stat.Weight, Operation Add, Value -5.
  • Last Stand: Stats XenoCore.Stat.Agility, Operation Scale, Value 15, Condition Health At Or Below, Condition Threshold 50. It holds only while HP is at or below half.

Scale needs something to scale

A party member's defences come only from equipment, so a Scale defence skill on a character wearing no armour adds nothing. Scale Strength, Ether, Agility or Max HP, or use Add for defence.

A skill with no effect is still sold to the player

A skill with no Stats, Bonus or Ability can be learnt and does nothing. The table only warns about it in the Data Validation log. Never ship one.

8. Validate and save

  1. Save the table.
  2. Right-click it in the Content Browser and choose Asset Actions › Validate Assets. Fix every error; read every warning.

Add more branches the same way. XC1 gives every character five, and five is what the Skills screen is laid out for; nothing stops a sixth, but each extra column makes the card wider. Row order is the order the columns are drawn and the first unlocked row is the branch selected at the start.

9. Give the tree to your character

  1. Open your character Blueprint (for example MyGame/Characters/B_MyGame_Party_Guardian) and click Class Defaults.
  2. Under XenoCore › Skills, set Skill Tree to DT_MyGame_SkillTree_Guardian.
  3. Compile and Save.

10. Optional: a branch a quest unlocks

  1. Add a second row, untick Unlocked At Start, and set its Cost Curve row to Quest (the cheaper curve).
  2. Open your quest definition. Under Reward, add an entry to Skill Branches: Member is your character's member definition, Branch is the row name, exactly.

When the quest is turned in, the branch opens, a notice floats over the character, and the offer screen and turn-in banner name the branch as a reward.

Branch is typed by hand, so it is checked for you: validating or saving the quest reports an error if the member has no Skill Tree, or if their tree has no row with that exact name. It must be the row name, not the Display Name.

11. Optional: unlock a branch or give SP from a Blueprint

For anything that is not a quest (a cutscene, a landmark, a story beat), use the party's progression component. In any Blueprint graph:

  1. Place Get Party Progression.
  2. From its output, call:
    • Unlock Skill Branch with Member (your member definition) and Branch (the row name). Safe to call twice.
    • Award Skill Points with Member and Amount. The SP goes into that character's selected branch, exactly like kill SP. Tick Apply Reserve Rate if a benched character should get the reserve share.
    • Select Skill Branch to change a character's selected branch from script. It returns false for a locked or unknown branch.

A wrong row name passed to these at runtime is not checked in advance; it is refused with a warning in LogXenoSkills.

12. Optional: a skill with its own logic

XenoCoreSkillAbility_TimedBuff (step 5) covers the triggers it lists. For anything else, make a Blueprint child of XenoCoreGameplayAbility_Skill instead, and point a skill's Ability at it. The ability is granted while the skill reaches the body and removed when it stops. This example grants Strength Up whenever the character is below a third of their HP, checked twice a second.

  1. Right-click in Content/MyGame/Skills, Blueprint Class, All Classes, XenoCoreGameplayAbility_Skill. Name it GA_MyGame_Skill_LowHealthStrength.
  2. Class Defaults › XenoCore › Skills: set Evaluate Interval to 0.5. With 0 the ability never polls; use 0 when your logic waits for events instead.
  3. In the Event Graph, override On Evaluate. Get the avatar (Get Avatar Actor From Actor Info), call Find Health Component on it, then Get Health Normalized; when that is below 0.33, call Apply Buff To Self with GE_XenoCore_Status_StrengthUp. Get Skill Value and Get Skill Duration read the skill entry's Value and Duration, so one ability can serve several skills with different numbers.
  4. For event-driven logic, override Activate Ability (call the parent first) and wait on gameplay events there instead of polling.
  5. Compile and Save, then set it as a skill's Ability.

Keep the ability self-contained: no tags or effects on it that it does not need, and never give the base class anything.

Changing a shipped tree instead

To replace a stand-in skill with the original effect, or with your own, edit that skill's entry in their Battle/Skills/DT_XenoCore_SkillTree_* table exactly as in steps 3 to 6. This edits a shipped asset: note the change so you can reapply it after a template update. Keep each branch at five skills, and do not rename rows (see the warning above).

Test it

  1. Make your character the leader (Party menu), or add them to the starting party. Start a new game so their record is seeded from the new table.
  2. Open the console (the key left of 1) and run XenoSkills. The Output Log lists Guardian as open, 0/5 learnt, and selected.
  3. Run XenoGiveSP 300. LogXenoSkills reports learnt 'Sturdy Frame', and "Skill Learnt" floats over the character. Their max HP is 5 % higher: the second HP figure on their Party screen row.
  4. Run XenoGiveSP 1700. Skills 2 and 3 are learnt (700 + 1,000 SP).
  5. Open the main menu and choose Skills. The Guardian column shows three lit icons and the fourth dark. Focus the header: the trait reads Physical Defence Up 30 (the StatMedium ladder at three skills), Selected, and SP 0 / 2,000.
  6. Fight an enemy in L_XenoCore_Gym and land the killing blow with your character. About half the time a Strength Up status appears over them, and LogXenoSkillAbility logs a line naming the OnKill trigger and GE_XenoCore_Status_StrengthUp.

If it doesn't work

Fails silently

The Skills screen says "No skill tree". Skill Tree is empty on the Blueprint the character actually spawns as. Check the member definition's Member Class, and set the tree on that class. If the table has the wrong row structure, LogXenoSkills logs an error naming it.

Fails silently

A skill is learnt but nothing changes. Check, in order: it has an effect at all (a skill with no Stats, Bonus or Ability does nothing); its Timing is In Battle Party and the character is benched; its Condition is not met; its Scope is Self and you are looking at another character. A stat the skill effect has no channel for is logged, as a warning naming the skill. See Troubleshooting.

Fails silently

XenoGiveSP or kills stop filling anything. The selected branch is complete, and SP beyond that is thrown away. Select another branch on the Skills screen. XenoGiveSP always pays the leader, into the leader's selected branch.

Fails silently

You changed Unlocked At Start or First Skill Prelearned and nothing moved. A character's record is seeded once. Branches already in a save keep their saved state; only branches new to the table are seeded. Start a new game to see the change.

Fails silently

The on-kill buff never appears. The trigger fires on the body that dealt the last damage; if another party member finished the enemy, it is theirs. With Chance below 100 it is also a roll; set it to 100 while testing. On-miss and on-critical triggers only fire for attacks that go through XenoCore's damage formula.

Going further