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
Author one
Section titled “Author one”skill is a confirmed kind, so no experimental opt-in is needed.
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:
[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 | — |
Bind behaviour
Section titled “Bind behaviour”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:
R.talent.on_pick("rsmm_lightning_dash", function(ctx) -- runs when this talent card is pickedend)
-- 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.
Net-new skills
Section titled “Net-new skills”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.
How a skill is wired
Section titled “How a skill is wired”| 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.
