杀戮尖塔Mod制作教程(空调pls翻译) 您所在的位置:网站首页 杀戮尖塔如何汉化 杀戮尖塔Mod制作教程(空调pls翻译)

杀戮尖塔Mod制作教程(空调pls翻译)

2023-08-12 06:57| 来源: 网络整理| 查看: 265

杀戮尖塔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 实验室设备网 版权所有