杀戮尖塔(Slay the Spire) mod制作

您所在的位置:网站首页 杀戮尖塔mod整合 杀戮尖塔(Slay the Spire) mod制作

杀戮尖塔(Slay the Spire) mod制作

2024-01-13 21:36| 来源: 网络整理| 查看: 265

偶然间发现了杀戮尖塔是用java写的(震撼我一分钟),然后秉着试一试java准备尝试杀戮尖塔mod制作。

这篇文章主要是靠知乎上的文章和反编译其他现有的mod摸摸索索凑出来的,主要给有一定基础的人大致了解一下流程,不会手把手详细讲每一步该如何操作。

1.mod标识

要mod被识别,需要有一个ModTheSpire.json的文件,详细格式可以看ModInfo · kiooeht/ModTheSpire Wiki · GitHubExternal mod loader for Slay The Spire. Contribute to kiooeht/ModTheSpire development by creating an account on GitHub.https://github.com/kiooeht/ModTheSpire/wiki/ModInfo

{   "modid": "example",   "name": "Example Mod",   "author_list": ["kiooeht"],   "description": "An example mod to be an example.",   "version": "0.1",   "sts_version": "03-29-2018",   "mts_version": "2.6.0",   "dependencies": ["basemod"] }

不过只有modid和name是必须的,其他可以空缺。

顺带一提,ModTheSpire.config是没必要的,可以不加。

2.注册类

第一步做完之后就可以打包被识别出来了,如果不能的话检查一下ModTheSpire.json文件拼写是否正确,例如有没有多写一个e之类的。

然后接下来就是建立一个类了,首先在包里面要有一个带有@SpireInitializer的类,这个类会作为起始被加载读取(可以近似理解成public static void main(String args)的东西),所有卡牌、遗物等注册都会在这里进行。

然后在这里注册自己,大概增加这么一个方法:

public static void initialize(){ new Main(); }

上面的Main换成你自己写的这个类。

3.写你想增加的内容

基本上你想要新增一个东西,就需要新建一个类,然后继承相应的抽象类再注册他来实现,这里就拿一个遗物类举例子。

新建一个类继承CustomRelic这个类,然后会要求你实现抽象方法并且调用super(String,Texture,RelicTier,LandingSound)。从左到右是遗物ID,遗物材质,遗物稀有度和获得遗物声音时的声音。

ID随便写是个string就行,现场编一个,不过后面增添文本的时候会用到。

材质就是一张png图片,大小128*128,然后实际内容应该是64*64的大小,周围的一圈是透明的。我用的是ImageMaster.loadImage()方案来加载的,地址直接写resource下的文件路径就行。

 例如我要导入这个holy_grail.png,那么我会写ImageMaster.loadImage("images/relics/holy_grail.png")

RelicTier可以调用AbstractRelic.RelicTier里面的,有以下几种

DEPRECATED, 废弃的,例如Test6 STARTER, 初始遗物,例如猎人的指环 COMMON, 普通遗物,例如宝箱里能开到的 UNCOMMON, 罕见遗物 RARE, 稀有遗物,例如精英怪遗物 SPECIAL, 特殊遗物,例如恩格斯的馈赠 BOSS, BOSS遗物,打完BOSS开宝箱的,例如金字塔啊 SHOP, 商店遗物,应该是指送货员之类的(?)

例如AbstractRelic.RelicTier.RARE就是一个稀有遗物。

然后遗物声音也是有一下几种

CLINK, FLAT, HEAVY, MAGICAL, SOLID,

具体声音咋样我也不太清楚,反正无脑AbstractRelic.LandingSound.SOLID就行了。

除了这个以外,剩下的基本上都是要重写的方法了,具体内容还挺多的这里放不下就不放了,可以去反编译游戏本体(desktop-1.0.jar)找到AbstractRelic这个类来查看。

杀戮尖塔MOD制作详解(2)基础牌和遗物 - 知乎

这个详解里面大概有给出几种常用的可复写的触发,可以去看看。

写完你想要的功能之后,你这个遗物就实现完成啦!(如果它不复杂的话)

4.注册遗物

写完遗物这个类之后,还需要在之前被注册的类(例如我上面写的Main)里面注册这个遗物。

首先在Main里实现这几种可以(需要)被实现的接口:

 EditCardsSubscriber  EditCharactersSubscriber  EditKeywordsSubscriber  EditRelicsSubscriber  EditStringsSubscriber

每个实现的接口都需要复写一个方法,是用于注册相应的元素的。例如你只打算写一个添加一个遗物的mod,那么只需要实现EditRelicsSubscriber接口即可,然后再重写的方法中用BaseMod.addRelic()方法来注册你写的那个遗物就行了。具体内容就是一个字:抄。看看其他教程,反编译一下其他mod就知道大概内容填充什么了。

话是这么说,但是还是需要实现EditStringsSubscriber接口,然后重写BaseMod.loadCustomStringsFile()方法来加载文本,不然新增的遗物一句描述甚至名字都没有还是挺尴尬的。具体格式还是看隔壁,或者看我下面代码,这里懒得解释了,地址格式大概跟上面加载遗物材质的差不多。

代码展示:

Main.java

package asimplemodforsts; import asimplemodforsts.relics.HolyGrail; import basemod.BaseMod; import basemod.helpers.RelicType; import basemod.interfaces.EditCardsSubscriber; import basemod.interfaces.EditRelicsSubscriber; import basemod.interfaces.EditStringsSubscriber; import basemod.interfaces.ISubscriber; import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; import com.megacrit.cardcrawl.localization.RelicStrings; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; //一个杀戮尖塔注册类 @SpireInitializer public class Main implements EditRelicsSubscriber , EditStringsSubscriber, EditCardsSubscriber { //构造函数 public Main(){ //注册一下自己身上的那些注册方法 BaseMod.subscribe((ISubscriber)this); } //初始化方法,返回自己的实例 public static void initialize(){ new Main(); } //这个方法可以删(因为没有内容),不过记得连着上面实现的EditCardsSubscriber一起删 @Override public void receiveEditCards() {} //这里注册遗物 @Override public void receiveEditRelics(){ //遗物的注册方法,前一个是你写的遗物类,后一个是遗物颜色 //遗物颜色就是角色使用,例如设置为紫色就是只有观者才能用 //卡牌也有类似的设定,不过卡牌你可以拿棱镜不是吗? BaseMod.addRelic(new HolyGrail(), RelicType.SHARED); } //这里注册文本 //如果想要多语言话可以在这里判断游戏语言,然后选择性加载你需要的语言文件 @Override public void receiveEditStrings() { //注册文本文件,前面一个固定"XXXXStrings.class",例如遗物是RelicStrings,卡牌是CardsStrings //后面一项是文件地址,丢resource下面的地址的相对地址就行 BaseMod.loadCustomStringsFile(RelicStrings.class, "lang/relics/HolyGrail_zh.json"); } }

HolyGrail.java

package asimplemodforsts.relics; import basemod.abstracts.CustomRelic; import com.badlogic.gdx.graphics.Texture; import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.actions.common.DrawCardAction; import com.megacrit.cardcrawl.actions.common.GainEnergyAction; import com.megacrit.cardcrawl.actions.common.RelicAboveCreatureAction; import com.megacrit.cardcrawl.core.AbstractCreature; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.helpers.ImageMaster; import com.megacrit.cardcrawl.relics.AbstractRelic; import com.megacrit.cardcrawl.relics.RedSkull; //继承了CustomRelic ,是个遗物类 public class HolyGrail extends CustomRelic { //标识ID,必须要有 public static final String ID="holy_grail"; //构造方法 public HolyGrail() { //文章上面右键就不复述了 super(ID, ImageMaster.loadImage("images/relics/holy_grail.png"), AbstractRelic.RelicTier.RARE, AbstractRelic.LandingSound.SOLID); } //回合开始时会调用的方法,这里实现的是回合开始加三费(无敌好吧) @Override public void atTurnStart(){ flash(); addToBot((AbstractGameAction)new RelicAboveCreatureAction((AbstractCreature) AbstractDungeon.player, this)); addToBot((AbstractGameAction)new GainEnergyAction(3)); } //显示遗物描述,可以不写DESCRIPTIONS这个变量是自动从你加载的文件中读取,如果你没有写或者你没有加载文件那就是空 @Override public String getUpdatedDescription() { return this.DESCRIPTIONS[0]; } //这个必须要有,别问我有啥用,问就是不知道。 @Override public AbstractRelic makeCopy() { return new HolyGrail(); } }

HolyGrail_zh.json 

{ "_comment" : "(这条是注释可删去)下面一行那个就是上面遗物注册时的ID,要保持一致不然会读取失败。剩下几个我就不解释了懂的都懂", "holy_grail": { "NAME": "圣杯", "FLAVOR": "回合开始时加一点能量", "DESCRIPTIONS": [ "光辉的战争的目标,真的有这么大的魅力吗?" ] } }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3