【项目复盘】杀戮尖塔mod开发复盘-抢劫商人

杀戮尖塔mod开发复盘 - 抢劫商人

一、成果介绍

本次开发的mod名为“抢劫商人”,已发布至

截止本文撰写时已有近2w浏览量与5k+订阅。在刚发布时也登上过周热门榜,因为本次开发只想体验一下mod开发的工作流,便没有继续维护,后续也没有再获得曝光以及数据增长。

二、开发流程

整个mod的开发流程大抵如下

  • 需求分析
  • 在官方GitHub上查询开发的接口模板
  • 反编译游戏源码和其他mod进行学习
  • 在idea中编写代码
  • 测试并发布

开发过程中使用的是Java语言,如果没有mod开发基础就得加上学习java的环节。不过对java知识的要求并不多,只要看得懂别人的代码以及官方给出的示例就基本能写。


三、需求分析

在我看来,所有的mod开发的需求分析都十分简单。mod开发的需求就两类:

  • 1、增加游戏内容
  • 2、修复游戏痛点

我的出发点是便是第二类,因为在游玩时总会有出现想在商人处购买关键物品却缺钱的情况,无能狂怒后只能含恨离场。

从此萌生了抢劫商人的想法。然后在游戏社区逛时也发现其他人有说这个问题,那既然大家都有需求,这mod做出来的数据肯定不会太差,于是就确定了mod的主题。

再之后便是架构设计,想想这个mod需要什么:

  1. 面对商人的时候需要有一个按钮可以点击就抢劫
  2. 选择抢劫会进入战斗,战斗怎么设计
  3. 战斗赢了可以0元购,怎么改商品的金钱
  4. 在抢劫中途SL能不能正常触发各种情况 (也就是数据的保存)

四、学习教程

需求确定之后就要着手开发,但是此时对整个开发流程还是一头雾水,只能去站在前人的肩膀上。

  1. 知乎上这个大佬的教程:杀戮尖塔MOD制作详解(1)基础环境搭建 - 知乎

    • 里面详细描述了从创建项目到在游戏中测试的流程

    • 以及创建角色,卡牌,遗物 (可惜从前文的需求分析中我们确定了这个mod不需要这些内容

  2. GitHub上的basemod教程:Hooks · daviscook477/BaseMod Wiki · GitHub

    • 这个教程就提供了接口的案例,比如要添加怪物该怎么写之类的:

    • 不过也并不全,有些我的疑问并不能在上面得到解答(可能是我没看懂

1
2
3
4
5
6
7
8
9
10
11
12
13
public void receivePostInitialize()
{
// Add a single monster encounter
BaseMod.addMonster(MyMonster.ID, () -> new MyMonster());
// Add a multi-monster encounter
BaseMod.addMonster("MyMonsters", () -> new MonsterGroup(new AbstractMonster[] {
new MyMonster(),
new MyMonster2()
}));

BaseMod.addMonsterEncounter(TheCity.ID, new MonsterInfo(MyMonster.ID, 5));
BaseMod.addStrongMonsterEncounter(TheBeyond.ID, new MonsterInfo("MyMonsters", 10));
}
  1. GitHub上的ModTheSpire教程SpirePatch2 · kiooeht/ModTheSpire Wiki · GitHub
    • 教了如何将你的代码填补/修改到游戏原本的代码中 (正是我们需要的修改商人)
    • patch的写法(重中之重
  2. 还要尖塔wiki:杀戮尖塔/尖塔奇兵(Slay the Spire)中文维基|攻略百科|考据资料|Steam - 灰机wiki - 北京嘉闻杰诺网络科技有限公司
    • 用于查询游戏的某些卡牌或怪物名字、编号之类的信息
  3. 唯一真神 杀戮尖塔mod制作教程
    • 比前文的教程更加详细了讲解了各个部分
    • 重要的是有高级技巧的写法:patch、保存数据
  4. 反编译其他大佬的mod
    • 最简单的方式是直接扔进idea
    • 上文的教程中也有提供反编译的工具
    • 很多教程没写到的功能可以在其他大佬mod中发现并以借鉴,毕竟教程是稀少的但是mod是海量的,本mod的商人房间的代码就借鉴了著名mod的dowanfall的实现

五、 动手开发

文件目录如下:


上一部分教程中已经涵盖了的大部分内容,这里就不再赘述,简单讲一下这次开发的实际内容。

第一部分,建立类:

  1. 建立注册类RobbingMerchant,实现接口 EditStringsSubscriber, PostDeathSubscriber
    • 用于整个mod的初始化
    • 加载文件
  2. 建立怪物类 MerchantInRob 继承AbstractMonster用于实现与商人战斗时的商人。包括:
    • 商人的各项数据
    • 行动方式
    • 图片渲染方式
  3. 建立抢劫后商人类 MerchantAfterRob 实现Disposable接口,
    • 用于实现抢劫后0元购道具
    • 商人的图片渲染
  4. 商店房间类CustomShopRoom 继承 ShopRoom
    • 实现进入商店时的逻辑
    • 抢劫按钮的显示
    • 商人的显示
    • 战斗的触发

第二部分,patch

patch是本次开发十分关键的一个内容

patch的中文翻译是补丁,它的功能也跟名字一样,为游戏源代码打补丁。

我们前面提到的修改商人等功能,都不是脱离原游戏的新增加内容,而是对游戏原本的商人功能进行魔改。

因此我们需要反编译游戏源代码,找到有关内容的函数,甚至是第几行,然后根据patch的格式对源代码添加函数或修改内容。参考 杀戮尖塔mod制作教程


六、测试并发布

在代码测试阶段时,不需要发布到创意工坊,只要将导出的mod文件塞到对应的文件夹中即可。

测试完毕并通过命令的方式上传后,便可在steam创意工坊的界面查看到mod的状态,可以重新修改标题和描述,不过要是更新上传还是需要通过命令的方式。


至此,抢劫商人mod就完成了。虽然整个架构看起来是十分简单,但是我整个mod的开发到完成也用了一个月的时间,主要是对各个接口的实现不太清晰,patch的写法在此之前从未听闻。

在新手入门时,建议综合多个教程以及源码,用比较的方式便可以知道一些接口和函数“为什么要这么写”。

不过在有了开发mod的经验后,后续要是再开发类似的内容想必就能很快上手了。


【项目复盘】杀戮尖塔mod开发复盘-抢劫商人
http://example.com/2025/02/25/杀戮尖塔mod开发复盘/
作者
Liuliy
发布于
2025年2月25日
许可协议