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

偶然间发现了杀戮尖塔是用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": [
      "光辉的战争的目标,真的有这么大的魅力吗?"
    ]
  }
}

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值