STS2.RitsuLib.ModTemplate
1.0.6
dotnet new install STS2.RitsuLib.ModTemplate::1.0.6
RitsuLibModTemplate
语言 / Languages:中文 | English
一个可复制、可构建的 RitsuLib Mod 模板,提供通用的 Godot/C# 工程结构、示例内容和静态占位资源。
模板包含:
- 一个
[ModInitializer]入口,外加最小自定义角色(含角色卡池、遗物池、药水池)。 - 4 张初始打击、4 张初始防御和 1 个初始遗物示例。
- 最小 Godot 静态占位场景:战斗模型、能量表盘、角色选择背景、商店和火堆。
- 从原版资源复制并按模板命名的占位 PNG,复制模板后可直接替换。
- 中英文基础本地化文件。
- 完整的 Godot 项目、导出配置、Mod manifest 和 MSBuild 构建脚本。
学习资源
- STS2-RitsuLib:Slay the Spire 2 Mod 的共享框架库,本模板基于它提供内容注册、角色脚手架和 Godot 资源接入能力。
- RitsuLib 文档地址:按文件阅读教程和示例。
- Slay the Spire 2 Modding Tutorials 网页版:完整教程站点。
- 模板 Wiki(以 Rider 为主线):中文首页 | English Home。
安装与使用
这个项目可以通过两种方式获得:使用 NuGet 模板自动生成,或者手动复制目录。
方式 A:使用 NuGet 模板(推荐)
# 安装模板
dotnet new install STS2.RitsuLib.ModTemplate
# 创建新 Mod
dotnet new ritsulibmod -n MyMod
# 卸载模板
dotnet new uninstall STS2.RitsuLib.ModTemplate
dotnet new ritsulibmod -n MyMod 会生成名为 MyMod 的工程,并把模板中的 RitsuLibModTemplate、示例类名、资源文件名、资源目录、manifest 名称、namespace 和本地化 id 同步替换成新名称。
方式 B:手动复制模板
- 复制整个目录并改名为你的 Mod 名称。
- 修改
RitsuLibModTemplate.json里的id、name、author、description。 - 修改
RitsuLibModTemplateCode/Entry.cs里的ModId。 - 如需彻底改名,同时修改
.csproj、.sln、project.godot的项目名和命名空间。 - 把资源目录
RitsuLibModTemplate/改成你的ModId,并同步更新代码中的Entry.ResPath相关路径。
配置本机路径
Copy-Item .\local.props.template .\local.props
在 local.props 中设置以下值(文件已在 .gitignore,不要提交):
| 字段 | 说明 |
|---|---|
Sts2Dir |
Slay the Spire 2 安装目录 |
Sts2DataDir |
游戏 dll 目录,通常是 $(Sts2Dir)/data_sts2_windows_x86_64 |
GodotExe |
用于导出 pck 的 MegaDot/Godot 可执行文件 |
RitsuLibDeployDir |
RitsuLib 本机部署目录,默认 $(Sts2Dir)/mods/STS2-RitsuLib。这是 RitsuLib 包/构建逻辑把 RitsuLib 复制到游戏 mods 目录的位置,不是当前 Mod 自身的输出目录 |
RitsuLib 版本兼容性
⚠️ 重要:发布前请校对 manifest 与 csproj 版本对齐
RitsuLibModTemplate.json中dependencies[STS2-RitsuLib].version必须与.csproj里STS2.RitsuLib包实际编译使用的版本一致。模板构建时会自动同步该依赖版本;min_game_version和有意声明较低运行时下限的场景仍需人工确认。详细步骤见下方 发布前 checklist:版本对齐。
当前版本快照(截至 2026-05-22)
| 项 | 值 |
|---|---|
| STS2 游戏当前版本 | 0.106.0 |
| RitsuLib 当前版本 | 0.3.0 |
| 模板 manifest 状态 | min_game_version 与 dependencies[STS2-RitsuLib].version 已对齐 |
版本对应表
下表汇总主要边界版本对应的 STS2 主要目标版本,整理自 STS2-RitsuLib Releases 的公告。未在表中显式列出的小版本沿用所在区间;遇到边界版本时以对应 release notes 为准。
| RitsuLib 版本 | 主要目标 STS2 版本 | 兼容(Compat)包 |
|---|---|---|
v0.3.0+(2026-05-22 起) |
0.106.0 |
0.103.2;删除了 0.104.0 兼容支持 |
v0.2.29 ~ v0.2.40 |
0.105.1 |
0.104.0、0.103.2 |
v0.2.27 ~ v0.2.28 |
0.105.0 |
0.104.0、0.103.2 |
v0.2.0 ~ v0.2.26 |
0.104.0 |
自 v0.2.6 起实验性提供 0.103.2;同步移除 0.99.1 兼容 |
v0.0.x / v0.1.x |
0.99.1 及更早 |
— |
包选择:主线与兼容包
模板默认引用主线 STS2.RitsuLib,跟踪 NuGet 最新版本:
<PackageReference Include="STS2.RitsuLib" Version="*" GeneratePathProperty="true" />
三个 RitsuLib 包一次只能启用一个。 仍针对老分支的代码,注释主线包并启用对应兼容包:
<PackageReference Include="STS2.RitsuLib.Compat.0.104.0" Version="*" />
<PackageReference Include="STS2.RitsuLib.Compat.0.103.2" Version="*" />
兼容包只是选择对应游戏分支,并不会恢复所有旧 API;部分老 Mod 仍然需要修改并重新编译。
项目还引用 Nothing.STS2RitsuLib.ModAnalyzers —— 一个 AI 编写的辅助分析器,开发期会提示 RitsuLib Mod 模板中常见的 manifest 和资源配置问题。
发布前 checklist:版本对齐
.csproj里的PackageReference只控制编译时拉取;RitsuLibModTemplate.json的dependencies是游戏加载器在运行时校验的。模板会在构建时把STS2-RitsuLib依赖版本同步为实际解析到的 NuGet 版本,但min_game_version仍需人工确认。
如果发布时 manifest 没有同步到编译使用的新版 RitsuLib,玩家装了旧版 RitsuLib 仍能通过 manifest 校验、运行时却会因 API 缺失或签名变化崩掉;反过来 manifest 写得过新,会让本来能跑的玩家被错误拒绝。
每次发布前请:
- 构建后确认
RitsuLibModTemplate.json的dependencies[STS2-RitsuLib].version已同步为实际解析到的STS2.RitsuLib版本。 - 切换到兼容包(
Compat.0.104.0/Compat.0.103.2)时,把min_game_version同步调到对应分支;dependencies[].id保持STS2-RitsuLib(兼容包对外暴露的 mod id 不变)。 - 如果 manifest 版本是作为"运行时下限"而不是编译版本(例如声明
0.3.0+都可用),在发布说明里明确,并自己测过下限能跑通。
升级注意事项
升级到 RitsuLib v0.3.0 / STS2 0.106.0
主要变化(来自 v0.3.0 release notes):
- 破坏性变更:移除
RunSidecar相关设计,完全被RunSavedData取代。 - 新增
TargetType注册能力,支持自定义TargetType。 - 加强 Loader 的加载目标检测:分支版本文件使用哈希校验,未匹配的版本被丢弃。
- 移除
0.104.0兼容支持。
升级到 RitsuLib v0.2.27 / STS2 0.105.0(历史)
仍从更早分支(v0.2.0 ~ v0.2.26 / STS2 0.104.0)迁移时请检查:
- 版本条件编译改为累积区间宏
STS2_AT_LEAST_<ver>;旧的STS2_V_<ver>不再推荐。 - AnyPlayer / AnyAny 目标逻辑调整;旧卡牌目标、基础构造函数签名和注册逻辑要按新 API 检查。
- 卡牌右下角支持额外图标数量标签,并处理与原版 UI 的冲突;自定义 UI 或图标补丁需确认显示层级和位置。
- 保留/flush 相关 hook 和 event 有替换、移除或
[Obsolete]标记;旧代码使用CardRetainedEvent、CardsFlushedEvent或旧Hook.*入口需迁移。 Badge、BadgeRuntimeTemplate、BadgePool.CreateAll和ModBadgeTemplate构造签名调整;旧代码可能需更新以避免MissingMethodException。
构建
| 命令 | 行为 |
|---|---|
dotnet build .\RitsuLibModTemplate.csproj |
完整构建:编译 + CopyMod + ExportPCK |
... /p:RunPckExport=false |
跳过 PCK 导出(不需要 GodotExe) |
... /p:CopyModOnBuild=false |
跳过复制到游戏 mods 目录(产物只留在 bin/) |
... /p:RunPckExport=false /p:CopyModOnBuild=false |
仅验证 C# 编译 |
完整构建会在 Build 之后运行两个 MSBuild target:
CopyMod:复制 dll 和 manifest 到游戏的mods/RitsuLibModTemplate目录。ExportPCK:调用GodotExe导出 pck 到同一个 Mod 目录。
RitsuLibDeployDir只控制 RitsuLib 框架自身的部署位置;当前 Mod 的 dll、manifest 和 pck 由ModOutputDir控制(默认$(Sts2Dir)/mods/$(MSBuildProjectName))。
目录结构
RitsuLibModTemplate/
├── RitsuLibModTemplateCode/ # C# 源码
├── RitsuLibModTemplate/ # Godot 资源、本地化和占位场景
├── RitsuLibModTemplate.csproj
├── RitsuLibModTemplate.json # Mod manifest
├── project.godot
└── local.props.template
res://RitsuLibModTemplate/... 是 Godot/PCK 内的资源路径,对应仓库里的 RitsuLibModTemplate/ 资源目录,不是 C# namespace。通过 NuGet 模板创建项目时,这些目录名、文件名和 namespace 会按新 Mod 名同步替换。
模板内容
示例角色
| 项 | 值 |
|---|---|
| 类型 | RitsuLibModTemplateCharacter |
| 预期 id | RITSU_LIB_MOD_TEMPLATE_CHARACTER_RITSU_LIB_MOD_TEMPLATE_CHARACTER |
| starter 牌组 | 4 × RitsuLibModTemplateStrike、4 × RitsuLibModTemplateDefend、1 × RitsuLibModTemplateRelic |
| 资源配置 | CharacterAssetProfile;模板只指定静态占位资源,未指定的音频/拖尾/转场等字段从 PlaceholderCharacterId 回退 |
示例卡牌与遗物
| 类型 | 池 | 预期 id |
|---|---|---|
RitsuLibModTemplateStrike(攻击) |
角色卡池 | RITSU_LIB_MOD_TEMPLATE_CARD_RITSU_LIB_MOD_TEMPLATE_STRIKE |
RitsuLibModTemplateDefend(技能) |
角色卡池 | RITSU_LIB_MOD_TEMPLATE_CARD_RITSU_LIB_MOD_TEMPLATE_DEFEND |
RitsuLibModTemplateRelic |
RitsuLibModTemplateRelicPool |
RITSU_LIB_MOD_TEMPLATE_RELIC_RITSU_LIB_MOD_TEMPLATE_RELIC |
静态占位资源
图片(res://RitsuLibModTemplate/images/...):
cards/RitsuLibModTemplateStrike.png、cards/RitsuLibModTemplateDefend.png:示例卡图。relics/RitsuLibModTemplateRelic.png:示例遗物图标。characters/RitsuLibModTemplate_character_*.png:角色头像、角色选择图、地图标记和能量图标。
场景(res://RitsuLibModTemplate/scenes/characters/...):
| 场景文件 | 用途 | 占位结构 |
|---|---|---|
RitsuLibModTemplate_character.tscn |
战斗人物 | %Visuals、%Bounds、%IntentPos、%CenterPos、%TalkPos |
RitsuLibModTemplate_energy_counter.tscn |
能量表盘 | %EnergyVfxBack、%Layers、%RotationLayers、%EnergyVfxFront、Label |
RitsuLibModTemplate_merchant.tscn |
商店人物 | — |
RitsuLibModTemplate_rest_site.tscn |
火堆人物 | %ControlRoot、%SelectionReticle、%Hitbox、%ThoughtBubbleRight、%ThoughtBubbleLeft |
RitsuLibModTemplate_character_select_bg.tscn |
角色选择背景 | — |
这些资源只用于保证模板可见、可替换,不追求原版动画效果。复制模板后替换为自己的素材即可;如果改了路径,同步更新对应 AssetProfile。
Manifest 格式
RitsuLibModTemplate.json 是 Mod 的清单文件,游戏加载器在启动时读取它来识别 Mod、检查依赖、决定是否加载。完整示例:
{
"id": "RitsuLibModTemplate",
"name": "RitsuLibModTemplate",
"pck_name": "RitsuLibModTemplate",
"author": "Author",
"description": "A starter Slay the Spire 2 mod template built on RitsuLib.",
"version": "0.0.0",
"has_pck": true,
"has_dll": true,
"affects_gameplay": true,
"min_game_version": "0.106.0",
"dependencies": [
{ "id": "STS2-RitsuLib", "version": "0.3.0" }
]
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string | Mod 唯一标识。必须与 Entry.ModId 完全一致,也建议与 mods/<id> 目录名一致。游戏内依赖、本地化前缀和资源路径都依赖这个值 |
name |
string | Mod 列表中的显示名,可包含空格和中文 |
pck_name |
string | .pck 文件名(不含扩展名)。必须与 .csproj 实际导出的 PCK 文件名一致,否则即使 has_pck=true 也加载不到资源 |
author |
string | 作者名,显示用 |
description |
string | Mod 简介,显示在 Mod 列表 |
version |
string | 此 Mod 自身的版本号,建议 SemVer(主.次.修),每次发布前更新 |
has_pck |
bool | 是否分发 .pck。纯代码 Mod 可置 false 并跳过 ExportPCK |
has_dll |
bool | 是否分发 .dll。纯资源 Mod 可置 false |
affects_gameplay |
bool | 是否影响游戏玩法。开启后游戏会在存档/成就等处做相应标记;仅纯视觉/本地化可设 false |
min_game_version |
string | 兼容的最低 STS2 版本,低于该版本拒绝加载。应与 .csproj 选用的 RitsuLib 包面向的游戏分支匹配(见上文 RitsuLib 版本兼容性) |
dependencies |
array | 依赖列表。每项使用 id + version。旧版单对象 min_version 写法已不支持 |
dependencies[].id |
string | 被依赖 Mod 的 id。RitsuLib 框架的 id 是 STS2-RitsuLib |
dependencies[].version |
string | 被依赖 Mod 的最低版本。STS2-RitsuLib 的版本必须与 .csproj 编译时的 NuGet 版本严格一致,详见上文 发布前 checklist:版本对齐 |
开发提示
- 新内容优先写
AssetProfile;个别历史兼容字段才考虑覆写Custom...Path。 - 角色资源字段没写时,RitsuLib 会从
PlaceholderCharacterId对应的原版角色配置补齐。 - 资源路径要以
res://开头,并确认 PCK 内目录名和大小写正确。 .tscn场景需要确认已打包进 Mod 资源;需绑定脚本时,写本地包装类并在Entry.Initialize()调用EnsureGodotScriptsRegistered(...)。
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.