杀戮尖塔Mod制作教程(空调pls翻译) | 您所在的位置:网站首页 › 杀戮尖塔如何汉化 › 杀戮尖塔Mod制作教程(空调pls翻译) |
杀戮尖塔Mod制作教程(空调pls翻译) 前言:这篇文章只是在学做mod的过程中随手翻译,译者是c++入门,现在主要用的语言是CocosCreator引擎上的JavaScript语言,所以对Java的理解相当有限,但求与各位初学者共勉。另外译文力求准确,语言若有不流畅之处,大家可以参照GitHub上的英文原版。 一、准备为Slay The Spire制作Mod 注意,这个是为Windows用户准备的教程。对于OS X或者Linux上的开发者,大多数教程都是通用的,不过具体的未见位置等等可能有所不同。 Slay The Spire使用Java语言制作的游戏。所以你最好有一些Java程序开发的经验和知识,当然你也可以在这个过程中不断学习。
1. Mod开发工具 为了开发Slay The Spire的Mod,你一定会用到ModTheSpire(https://github.com/kiooeht/ModTheSpire/releases)。另外,下载BaseMod可以允许你获得更加便捷API(https://github.com/daviscook477/BaseMod/releases)。你可以从Steam Workshop或GitHub上下载这些工具,但后者不能及时更新,所以推荐你选用Steam Workshop
2. 建立项目文件夹 在本次教程中,我们将会使用一个建立在你的Documents(文档)文件夹下的my_mods文件夹,你可以在这个文件夹下存放你所有的mod。在这个示例mod项目中,我们会在my_mods文件夹下建立一个example_mod文件夹来存放代码。 之后,在my_mods文件夹下,我们继续建立一个lib(libraries的简称)文件夹。我们将在这个文件夹中存放你mod的依赖项。将上一步下载的ModTheSpire.jar 和 BaseMod.jar(译者:如果是从steam工坊下载的话,文件的位置应该在.\steam\steamapps\workshop\content\646570下)拷贝到lib文件夹中。
3. 配置开发环境 Slay The Spire的mod开发可能用到两个流行的IDE:IntelliJ比较易于使用,但如果你想的话也可以使用Eclipse(译者用的是IntelliJ)
l IntelliJ配置教程:https://github.com/daviscook477/BaseMod/wiki/IntelliJ-Environment-Setup l Eclipse配置教程:https://github.com/daviscook477/BaseMod/wiki/Eclipse-Environment-Setup
如果你已经配置好了你的IDE,你可以直接开始Mod的开发了: l 开始你的第一个Mod:https://github.com/daviscook477/BaseMod/wiki/Starting-Your-Mod
4. 反编译你的游戏 这篇教程(https://github.com/daviscook477/BaseMod/wiki/Decompiling-Your-Game)可以帮你反编译你的游戏以获得源代码(译者:这个步骤是非必要的,只是为了帮你更好地理解游戏的运行方式)。
5. 故障解决 如果你遇到什么问题,可以试着参考这篇故障解决教程(https://github.com/daviscook477/BaseMod/wiki/Troubleshooting)
二、开始制作第一个Mod 祝贺你!到这里,你已经完成了开发环境的配置,也准备好正式开始开发你的Mod了。在此之前,我们需要了解一下ModTheSpire和BaseMod运行的一些基本原理,以便于你能够顺利地使用它们。 ModTheSpire是一个Slay The Spire的mod加载器(modloader),它允许你直接地改变游戏的代码。在每次Slay The Spire有所调整时都进行这个过程可能显得枯燥而繁琐,但对于Mod试图调价的某些特定的复杂特性来说却是十分必要的(译者:这句话的英文表述就挺繁琐的⊙﹏⊙)。 BaseMod提供了更加简便的API,以便Mod中的大部分可以不必直接改变游戏的代码。因此在一个mod项目中你可能需要同时使用这两者。BaseMod主要是围绕“发射事件&使mod监听事件”这一核心思想来运行的(译者:原文这里发射用了fire,没见过这种用法,应该类似于emit吧……)。例如,如果你想要制作一个在每次一张卡片被消耗时恢复玩家5hp的mod,你可以使用BaseMod来建立PostExhaust事件监听(译者:这里subscribe和listen我分别翻译成了“建立监听”和“监听”,其实没什么区别),之后你就可以使用一个事件句柄来监听这个事件(译者:关于handler这个词的翻译有很多吐槽,不过反正大家都叫句柄我也跟着叫了……)。在这个示例中,我们会建立一个简单mod来展示如何使用BaseMod的事件监听系统。将来,也许会有关于如何使用客制角色系统和图形界面的教程,但现在,如果你想使用这些系统的话,可以参考这里的文档和其他更加成熟的mod(译者:这句话意思有点别扭,反正就是这一章会先从简单的功能开始的意思)。
1. 添加Mod信息 在你开始mod的制作之前,确保你已经添加了ModeTheSpire可以读取的mod信息。这个文件应该被建立在在你的resources文件的根目录下,你可以在这篇教程(https://github.com/kiooeht/ModTheSpire/wiki/ModInfo)学习如何编写这个文件(译者:额,作者似乎没有写如何建立这个resources文件夹,指的应该就是IDEA会自动建立的那个src文件夹,截图给你们看下魔理沙mod的结构吧。其中核心代码是放在ThMod文件夹里的
其中*.config文件是旧架构,教程里不推荐使用。这个ModTheSpire.json文件是给MTS看的,所以你调试的时候放到相应的位置就可以了。)
2. @SpireInitializer 如果你想使用BaseMod制作mod的话,可能会用到一些格式化的代码(译者:这里是检查你的java环境有没有配置好的第一步,为了获得代码提示你可能会花上几天的时间,别着急,慢慢来。): package example_mod; import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; @SpireInitializer public class ExampleMod { public ExampleMod() { // 在这里创造一个优秀的mod吧! } public static void initialize() { new ExampleMod(); } }
注意:如果Eclipse找不到@SpireInitializer,你可能要重新检查依赖项(Dependecies),因为Eclipse可能在你改变源文件夹时重置了相关设定。 上述代码的工作是告诉ModTheSpire,我们有一个名为ExampleMod的类,这个类具有一个在mod被加载时、游戏正式开始之前唤起的initialize方法。在initialize方法中,我们创建了我们mod的一个实例,我们将在这个实例中告诉BaseMod我们想要监听的种种事件。
3. ISubscriber 在这个示例mod中,我们要计数每场战斗中卡牌被消耗的次数,并将数值传递给日志(log)。我们还要追踪在每个行动中被消耗的卡牌数量,并在同样每场战斗之后记录这个数值。比如这个mod会记录玩家在第一场战斗中消耗了两张、第二场战斗中消耗了三张,所以总计消耗了五张,诸如此类。为了完成这个工作我们需要BaseMod已经提供了的三个事件:PostExhaust,PostBattle,PostDungeonInitialize。 我们会这样使用这些钩子(译者:这里用了hook这个说法,初学者看的话可能有点蒙,其实就是之前所说的发射和监听事件这个机制):在PostDungeonInitialize中,我们会将本次行动中消耗的卡牌数量设置成0。在PostBattle中,我们输出消耗的卡牌总数和在这场战斗中消耗的卡牌数。在PostExhaust中,我们计数被消耗卡牌的数量。 为了建立对这三个事件的监听,需要让我们的ExampleMod类实现相应的接口,包括PostExhaustSubscriber, PostBattleSubscriber,PostDungeonInitializeSubscriber(译者:接口这个概念对于初学者可能有点陌生,初学者可以把它想成声明一个不包含任何具体实现、也不能直接实例化的类,当你的类实现这个接口时,就需要重新实现这个接口所包涵的所有方法)。你可以在Hook介绍页面(https://github.com/daviscook477/BaseMod/wiki/Hooks)上找到接口的完整列表。接下来,我们通过BaseMod.subscribe(this)来告诉BaseMod我们想要监听这些事件。 package example_mod;
import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.rooms.AbstractRoom;
import basemod.BaseMod; import basemod.interfaces.PostBattleSubscriber; import basemod.interfaces.PostDungeonInitializeSubscriber; import basemod.interfaces.PostExhaustSubscriber;
@SpireInitializer public class ExampleMod implements PostExhaustSubscriber, PostBattleSubscriber, PostDungeonInitializeSubscriber {
public ExampleMod() { BaseMod.subscribe(this); }
public static void initialize() { new ExampleMod(); }
@Override public void receivePostExhaust(AbstractCard c) {
}
@Override public void receivePostBattle(AbstractRoom r) {
}
@Override public void receivePostDungeonInitialize() {
} } (译者:这里如果你直接复制代码的话会发现com.megacrit.cardcrawl.cards.AbstractCar和 rooms.AbstractRoom这两项会报错,译者的解决方案是把原游戏根目录下的那个desktop-1.0.jar也添加到依赖项里,不知道有没有其他方案)
4. Mod 逻辑 package example_mod;
import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.rooms.AbstractRoom;
import basemod.BaseMod; import basemod.interfaces.PostBattleSubscriber; import basemod.interfaces.PostDungeonInitializeSubscriber; import basemod.interfaces.PostExhaustSubscriber;
@SpireInitializer public class ExampleMod implements PostExhaustSubscriber, PostBattleSubscriber, PostDungeonInitializeSubscriber {
private int count, totalCount;
private void resetCounts() { totalCount = count = 0; }
public ExampleMod() { BaseMod.subscribe(this); resetCounts(); }
public static void initialize() { new ExampleMod(); }
@Override public void receivePostExhaust(AbstractCard c) { count++; totalCount++; }
@Override public void receivePostBattle(AbstractRoom r) { System.out.println(count + " cards were exhausted this battle, " + totalCount + " cards have been exhausted so far this act."); count = 0; }
@Override public void receivePostDungeonInitialize() { resetCounts(); }
}
三、如何编写Mod信息文件
1. ModTheSpire.json文件 通过在mod的.jar文件根目录下创建ModTheSpire.json文件,mod会告诉ModTheSpire一些关于自己的信息。(译者:参考上一章的我放的图片)
属性名-类型-默认值-描述 modid-string-需要赋值-这个mod独特的ID name-string-需要赋值-这个mod对用户更加友好的名称 description-String-“”-对这个mod的描述 version-String-“”-这个mod的版本 sts_version-string-“”-这个mod支持的确切游戏版本 mts_version-String-“”-这个mod支持的最低ModTheSpire版本 author_list-[string]-[]-这个mod的作者列表 credits-string-“”-任何你想要鸣谢的人或物 denpendencies-[string]-[]-一个modid列表。这些mod会在加载本mod之前被加载。如果缺失,游戏将会崩溃 optional_dependencies-[string]-[]-一个modid列表。这些mod会在加载本mod之前被加载。缺失将不会导致游戏崩溃。 update_json-string-“”-在Steam工坊的支持下已经不再需要。 示例: { "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"] } 如何标注版本? mod的版本标注使用语义版本号。在https://semver.org/了解他以正确标注版本。 如果你的语义化版本号标注有误,自动升级将无法正常运作。
2. 老格式,不要使用! 这个老的信息格式因为代码遗留和兼容性的考虑还没有被废弃。 通过在mod的.jar文件根目录下包含ModTheSpire.config文件来完成类似的工作:
l name 指出在游戏中展示的mod名称(包括在mod列表中和鸣谢列表中) l author游戏启动器和游戏内鸣谢栏展示的mod作者,用英文逗号(,)来分隔多个作者 l description 在启动器中展示的mod描述 l mts_version 这个mod支持的最低ModTheSpire版本 示例: name=Example Modauthor=kiooehtdescription=An example mod to be an example.mts_version=2.3.0
|
CopyRight 2018-2019 实验室设备网 版权所有 |