Resources
10Install
npx skillscat add nicksanft/sennenrpg Install via the SkillsCat registry.
SKILL.md
SKILL.md — SennenRpg
Operational recipes for common development tasks. Each skill is a step-by-step checklist.
Reference these when creating new game content to ensure consistency.
Skill: create-enemy
Creates a new enemy with battle sprite, stats, attack pattern, and Perform dialog.
Steps
- Create
EnemyDataresource:- File:
res://resources/enemies/{id}.tres(type:EnemyData) - Set:
EnemyId(unique string, snake_case),DisplayName,Stats(nestedCharacterStatsresource) - Set:
BattleSprite(Texture2D),BardicActOptions(string array e.g.["Check", "Serenade"]) - Set:
FlavorText,GoldDrop,ExpDrop
- File:
- Create enemy scene:
- New Inherited Scene from
res://scenes/battle/enemies/EnemyBase.tscn - Save to
res://scenes/battle/enemies/specific/{Name}Enemy.tscn - Attach
{Name}Enemy.csextendingEnemyBaseif custom behavior is needed - Set
Dataexport on root node to the.tresresource
- New Inherited Scene from
- Create attack pattern (rhythm arena):
- New scene:
res://scenes/battle/rhythm/patterns/{Name}Pattern.tscn - Root
Node2Dwith{Name}Pattern.csextendingRhythmPatternBase - Implement the pattern using the lane obstacle system
- New scene:
- Link pattern to enemy:
- Set
EnemyData.AttackPatternSceneto the rhythm pattern.tscnPackedScene
- Set
- Create Perform dialog timelines (one per Bard skill option):
res://dialog/timelines/act_{id}_check.dtl— always create a Check timelineres://dialog/timelines/act_{id}_{option}.dtlfor each other skill option
- Register encounter:
- Create
res://resources/encounters/{id}_encounter.tres(type:EncounterData) - Set
Enemiesarray to include the newEnemyData, setBackgroundId
- Create
Skill: create-map
Creates a new overworld map scene.
Steps
- In Godot editor: Scene > New Inherited Scene → select
res://scenes/overworld/OverworldBase.tscn - Save to
res://scenes/overworld/maps/{MapName}.tscn - Create script
res://scenes/overworld/maps/{MapName}.csextendingOverworldBase - In the scene, select root node → set
MapIdexport to a unique string (e.g.,"ruins_entrance") - Set
BgmPathexport to the BGM file for this map (e.g.,"res://assets/audio/bgm/ruins.ogg") - Paint tiles in the inherited
TileMapLayer (Ground)andTileMapLayer (Walls)layers - Place objects in the YSort node (for correct draw order):
- Instance
Npc.tscnfor NPCs, setTimelinePathexport - Instance
EncounterTrigger.tscn, setEncounterDataexport - Instance
SavePoint.tscn, setSavePointIdandTimelinePathexports
- Instance
- Add exit areas:
Area2Dnodes at map edges with{MapName}Exit.csthat callsSceneTransition.GoToAsync(targetScene)
Skill: create-dialog
Creates a new Dialogic 2 dialog timeline.
Steps
- Open Dialogic editor from the Godot editor top bar (appears after plugin is enabled)
- Create character (if new person speaking):
- Dialogic editor → Characters tab → click +
- Set name, display name, color
- Add portrait textures (sprites from
res://assets/sprites/) - Save to
res://dialog/characters/{Name}.dch
- Create timeline:
- Dialogic editor → Timelines tab → click +
- Save to
res://dialog/timelines/{descriptive_name}.dtl - Use snake_case. Prefix convention:
npc_{name}_{context}.dtl— NPC conversationsact_{enemy_id}_{option}.dtl— Battle Act resultssave_{location}.dtl— Save point flavor textcutscene_{name}.dtl— Story cutscenes
- Build dialog using Dialogic events:
- Character + Text events for dialog lines
- Choice event for player choices
- Set Variable event to communicate results back to C# (e.g.,
choice_result = "a") - Condition event to branch on variables set from C#
- Call from C#:
// Set variables the timeline can read DialogicBridge.Instance.SetVariable("player_name", GameManager.Instance.PlayerName); // Connect end callback DialogicBridge.Instance.ConnectTimelineEnded(new Callable(this, MethodName.OnDialogDone)); // Start DialogicBridge.Instance.StartTimeline("res://dialog/timelines/name.dtl"); - Read results back in callback:
private void OnDialogDone() { var result = DialogicBridge.Instance.GetVariable("choice_result").AsString(); // React to result GameManager.Instance.SetState(GameState.Overworld); }
Skill: add-item
Adds a new usable item.
Steps
- Create
res://resources/items/{id}.tres(type:ItemData):- Set
ItemId(snake_case),DisplayName,Description,Icon(Texture2D) - Set
HealAmountfor healing items, orEffectType+EffectValuefor other effects
- Set
- Add sprite to
res://assets/sprites/ui/items/ - To give the player this item at game start, add the path to
InventoryData.Reset()(called fromGameManager.ResetForNewGame()):InventoryItemPaths.Add("res://resources/items/{id}.tres"); - Item appears automatically in battle Item submenu and the pause-menu inventory — no additional wiring needed
Skill: add-flag
Adds a story progress flag to track game state.
Steps
- Flags are untyped booleans. No registration or enum needed.
- Set a flag (e.g., after a story moment):
GameManager.Instance.SetFlag("met_toriel", true); - Check a flag (e.g., in NPC logic):
if (GameManager.Instance.GetFlag("met_toriel")) { ... } - Use in Dialogic dialog — pass as variable before starting timeline:
Then use a Condition event in theDialogicBridge.Instance.SetVariable("met_toriel", GameManager.Instance.GetFlag("met_toriel"));.dtltimeline to branch. - Flags are automatically persisted to
user://save.jsonviaSaveManager.
Skill: wire-battle-transition
Connects a map trigger to launch a random battle encounter.
Steps
- In the map scene, instance
res://scenes/overworld/objects/EncounterTrigger.tscninto the YSort node - Select the trigger node → set
EncounterDataexport to the desired.tresencounter resource - (Optional) Set
EncounterChance(0.0–1.0) if random encounter; leave default for forced encounter - The trigger script automatically calls
SceneTransition.ToBattleAsync(encounterData)onbody_entered BattleRegistrystores the pending encounter;BattleScene._Ready()retrieves it viaBattleRegistry.GetPendingEncounter()- After battle ends,
BattleScenecallsSceneTransition.GoToAsync(GameManager.Instance.LastMapPath)to return
Skill: place-save-point
Places a save point in a map.
Steps
- Instance
res://scenes/overworld/objects/SavePoint.tscninto the map's YSort node - Select the save point node:
- Set
SavePointIdexport to a unique string (e.g.,"ruins_entrance_01") - Set
TimelinePathexport to the save point flavor dialog (e.g.,"res://dialog/timelines/save_ruins_entrance.dtl")
- Set
- Create the flavor dialog timeline (see create-dialog skill) — this is the flavor text shown at the save point
- No other wiring needed —
SavePoint.cscallsSaveManager.SaveGame()and heals player automatically
Skill: add-npc
Places a talking NPC in a map.
Steps
- Instance
res://scenes/overworld/objects/Npc.tscninto the map's YSort node - Select the NPC node:
- Set
TimelinePathexport to the NPC's dialog timeline - Set
SpriteFramesexport to the NPC'sSpriteFramesresource - Set
DisplayNameexport (shown in Dialogic dialog box)
- Set
- Create or select a dialog timeline for this NPC (see create-dialog skill)
- The NPC automatically implements
IInteractable— player interaction triggers dialog - For conditional dialog (different lines after story events), use Dialogic Condition events
and pass game flags viaDialogicBridge.SetVariable()inNpc.cs
Key Paths Quick Reference
| What | Path |
|---|---|
| Enemy resources | res://resources/enemies/*.tres |
| Encounter resources | res://resources/encounters/*.tres |
| Item resources | res://resources/items/*.tres |
| Map scenes | res://scenes/overworld/maps/*.tscn |
| Enemy battle scenes | res://scenes/battle/enemies/specific/*.tscn |
| Rhythm patterns | res://scenes/battle/rhythm/patterns/*.tscn |
| Dialog timelines | res://dialog/timelines/*.dtl |
| Dialog characters | res://dialog/characters/*.dch |
| BGM audio | res://assets/audio/bgm/*.ogg |
| SFX audio | res://assets/audio/sfx/*.ogg |
| Sprites | res://assets/sprites/{player,enemies,overworld,ui}/ |