Skip to content

Custom skills (talents)

A hero’s skills are the talents on the level-up cards and in the Skill Menu. The skill kind makes a custom talent visible by overriding the per-hero text bank. Confirmed

skill is a confirmed kind, so no experimental opt-in is needed.

build.py
from rsmm import sdk
with sdk.Mod("MySkills") as mod:
mod.skill(
"rsmm_lightning_dash",
hero="Aladdin",
source="Attack Dive", # an existing skill to repurpose
name="Lightning Dash", # shown on the card / menu
description="A dash that crackles with lightning.",
# mode="relabel" is the default
)

Equivalent declarative form:

mods/MySkills/manifest.toml
[mod]
id = "MySkills"
[[content]]
kind = "skill"
id = "rsmm_lightning_dash"
hero = "Aladdin"
source = "Attack Dive"
name = "Lightning Dash"
description = "A dash that crackles with lightning."
mode = "relabel"

Run ./rsmm apply to write the text override into the live install. The display name resolves against the hero’s text bank, so apply must see a Ravenswatch install — emit errors out if no install is reachable.

mode What it edits Status Use it for
relabel (default) Hero text bank values only (Skill_<src>_Name / _Desc) Works — visible & count-neutral Repurposing an existing talent’s name/description
repoint Would rename the herodef row + remint its GUID Refused — playtested, changes nothing visible —
clone Would add a NET-NEW herodef row Refused — crashed the game twice —

Relabelling changes only the text. To make the talent do something custom, bind logic in a loader Lua script keyed on the talent’s identity:

mods/MySkills/scripts/lightning_dash.lua
R.talent.on_pick("rsmm_lightning_dash", function(ctx)
-- runs when this talent card is picked
end)
-- or define on a hero:
R.talent.define{ hero = "Aladdin", pickable = true, on_pick = function(ctx) ... end }

Behaviour binds on POWER_UP_COLLECT_REQUEST via the gameplay event bus — it does not require any herodef edit. See Mod hooks for the identity-offset details.

Not supported, by decision: a hero’s talent count is fixed. An added herodef row crashed the game, and a talent injected at runtime drew on top of its source in the Book grid, because the grid places a talent by its identity rather than by list position. For something genuinely additive, ship a pickable magical-object card, whose pool does grow.

Layer Where Purpose
Display name / desc Text/Hero_<Hero>_Common~GAM.xls.LocalText.gen, keys Skill_<Suffix>_Name / _Desc What the player reads on the card / menu
Skill row (identity) Definitions/Heroes/<Hero>.herodef.ot.DtHeroDefinition.gen The list of skills the hero owns + each row’s GUID
Behaviour gameplay event bus (POWER_UP_COLLECT_REQUEST) Custom code on pick

The name a player sees comes from the hero ENTITY’s controller text key, not from the herodef row, which is why relabel works and renaming the row does not.