偶然间发现了杀戮尖塔是用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这个类来查看。
这个详解里面大概有给出几种常用的可复写的触发,可以去看看。
写完你想要的功能之后,你这个遗物就实现完成啦!(如果它不复杂的话)
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": [
"光辉的战争的目标,真的有这么大的魅力吗?"
]
}
}