Skills

Define your game's skills, their icons, categories and level caps, and learn how XP and levels are computed and shown in the client.

7 min read

What the Skills Editor does#

A skill is a named progression track with its own XP total and level: Melee, Fishing, Alchemy and so on. The Skills Editor in the Tools hub is where you decide which skills your game has, what they look like in the client's Skills tab, and how high they go. Everything else about a skill (what grants XP, what a level unlocks) is wired elsewhere: crafting recipes grant XP and gate on levels, the bundled combat module awards combat XP, and server scripts can add XP or check levels directly.

Use the Skills Editor whenever you want to:

  • Add a new skill so recipes, tasks and scripts can reference it.
  • Change a skill's icon, display name or level cap.
  • Rearrange which skills exist in a template before you build content on top of them.

The starter templates ship with twelve skills. Melee, Health, Archery and Magic (ids 1, 2, 3 and 5) are referenced by name in the bundled combat-experience module and by id for the client's hit-splat icons, so treat those as fixed unless you are prepared to update that code too.

Opening the tool#

  1. Click Tools in the top bar.
  2. Click Skills Editor on the hub.

The tool has two panels:

  • Skills (left) — a list of every skill, shown as ordinal: name with its icon. Below the list are + Add Skill and Reset.
  • Skill Properties (center) — the fields for the selected skill, plus an Export Config button in the header. Until you select a skill it reads "Select a skill to edit".

Add a skill#

  1. Click + Add Skill. A skill named "New Skill" appears at the bottom of the list with the next free id, the 1.png icon, max level 99 and the Combat category, and is selected.
  2. Type the Name. The list updates as you type.
  3. Choose an Icon. The 48x48 box shows the current icon; the picker beside it (Select asset) lists the project's sprite assets, and its popup has an Import button for pulling a new image in from disk. X clears the icon. The icon must be a sprite under the project's assets/sprites/ folder, which is where imported sprites land.
  4. Pick a Category: Combat, Gathering, Artisan or Support. This is an organizational tag; neither the server nor the client changes behavior based on it.
  5. Set Max Level (1–999, default 99). XP stops accumulating once the player reaches this level.
  6. Optionally click Create on the Script row to generate a C# stub at server/scripts/skills/<Name>.cs (spaces removed from the name). The row shows the file name once it exists, or "(none)" — a skill whose name still contains a space keeps reading "(none)", because the row looks for the unstripped name.

Remove Skill at the bottom of the properties panel deletes the selected skill and renumbers the remaining ordinals; the surviving skills keep their ids. A new skill takes the highest existing id plus one, so deleting the last skill frees its id for the next one you add. Reset in the left panel throws away every skill and restores the three built-in defaults (Melee, Ranged, Magic); it cannot be undone from the Reset button itself, although Ctrl+Z restores the previous snapshot.

Files written#

Each change writes three things.

FileSideContents
assets/data/skills_config.jsonClientskill_id, name, icon, ordinal, max_level, category
server/data/skills_config.jsonServerskill_id, name, max_level, category, script_path
assets/interface/screens/tabs/skills.tscnEditor previewA regenerated Skills tab scene used by the GUI editor's preview

Both JSON files have the same outer shape:

JSON
{
	"version": 1,
	"skills": [
		{
			"skill_id": 7,
			"name": "Fishing",
			"icon": "01KJ2HB54DJKBCGYMR390K5BWH.png",
			"ordinal": 6,
			"max_level": 99,
			"category": "gathering"
		}
	]
}
FieldTypeMeaning
skill_idintIdentity of the skill. Allocated as the highest existing id plus one; referenced by recipes (skill_requirements, skill_rewards), tasks and scripts.
namestringDisplay name. Scripts and the bundled combat module look skills up by this name, case-insensitively.
iconstringClient only. File name under assets/sprites/. An empty string means no icon.
ordinalintClient only. The position the editor shows in its own list. The client builds the Skills tab in file order and never reads this field.
max_levelintLevel cap, 1–999.
categorystringcombat, gathering, artisan or support. Informational.
script_pathstringServer only. The absolute path to server/scripts/skills/<Name>.cs on the authoring machine when that file exists, otherwise empty. Not read by the server.

How the client shows skills#

When the game client opens the Skills tab it reads assets/data/skills_config.json from the content pack and creates one button per entry, in file order, with the icon from assets/sprites/<icon>, the current level over the max level, and a "Total Level" label beneath the grid. If the file is missing or unreadable it falls back to three placeholder skills (Melee, Ranged, Magic). The same icon registrations are reused by the XP-drop overlay and by combat hit splats, which map melee, ranged and magic hits to skill ids 1, 3 and 5.

Levels and XP themselves come from the server, which sends the player's skill data on login and whenever it changes; the client only displays what it is sent.

XP curve and levels#

The server reads server/data/skills_config.json when it loads scripts and registers every skill with a positive id and a non-empty name. Each one uses the same XP formula: the classic RuneScape curve, where the XP needed to reach a level is the running sum of floor(level + 300 * 2^(level / 7)) over the previous levels, divided by four. There is no per-skill curve setting in the config; the engine also contains linear, exponential and custom-table formulas, but they are only reachable by registering a skill from code rather than from the config file.

LevelTotal XP required
283
101,154
204,470
50101,333
70737,627
9913,034,431
120104,273,167

Every player starts each skill at level 1 with 0 XP. XP is added as a double and is clamped at the XP of the skill's max level. Before XP is applied the server publishes a PlayerExperienceGainEvent that modules can scale or cancel (an XP-boost weekend, for instance), and crossing a level boundary publishes a PlayerLevelUpEvent that quest objectives and the dashboard activity feed can react to.

Granting XP and gating content#

The Skills Editor does not decide when XP is earned. These are the places that do:

  • Crafting recipes — the Experience Rewards list on a recipe grants XP on a successful craft, and Requirements block the craft below a level. See Recipes.
  • Tasks and quests — a tick-based task (mining, woodcutting) runs a server script, which grants XP through the script API; quest rewards can include skill XP, granted by the bundled quest module when the quest completes. See Tasks and quests.
  • Combat — the bundled combat-experience module awards xp_per_damage (default 4) times the damage dealt to Melee, Archery or Magic depending on the attack style, plus a third of that to Health, with multipliers editable in server/schemas/Skills/combat_experience/experience_rates.json.
  • Scriptsplayer.Skills.AddXp("Fishing", 25) returns true when the player levels up; player.Skills.GetLevel("Fishing"), HasLevel("Fishing", 40), SetLevel, SetXp, GetXpToNext, GetProgress, TotalLevel and TotalXp are all available. AddXp, GetLevel, GetXp and HasLevel also accept a skill id in place of the name; the rest take the name. See Script API reference.

The Skills & Experience gameplay system also ships test commands: ::skills (aliases ::stats, ::levels) lists your levels or details one skill, ::addxp <skill> <amount>, ::setlevel <skill> <level>, ::xptable <skill> [start] [end] prints the XP thresholds, and ::skilllist lists every registered skill with its id and cap.

With AI (MCP)#

  • define_skill — upserts one skill by skill_id with name, category, max_level, icon, ordinal and script_path, writing both skills_config.json files and regenerating the preview tab scene exactly as the editor does. An icon that is not present under assets/sprites/ leaves that button blank and is reported in missing_icons. Pass dryRun: true to preview the changes without writing.
  • define_recipe references skills by skill_id in its requirements and rewards and refuses ids that are not in skills_config.json, so define the skill first.

See the tools reference for full argument lists.

Spotted a mistake or something missing?Tell us on Discord