首页 > > 内容页

以撒忏悔模组制作学习笔记

2023-05-22 21:51:54 来源:哔哩哔哩

前言

本文目标是记录一次以撒模组制作经历,由于本人对于模组制作的不熟悉,可能会对一些技术性的概念产生误导,这些都是正常现象;如果出现了误导现象,接受批评与建议。


(相关资料图)

本文只涉及道具制作,不涉及人物制作。

工具

以撒的结合中文维基:https://isaac.huijiwiki.com/wiki/%E9%A6%96%E9%A1%B5

模组民间API查询:https://wofsauge.github.io/IsaacDocs/rep/index.html

函数图像查询:https://www.desmos.com/calculator?lang=zh-CN

准备工作

预先学习xml解释文件格式语法,简要学习lua语言语法。

开启计算机文件浏览器的文件扩展名显示。

首先至少得有Afterbirth与Afterbirth+的DLC,有Repentance最好。

开启控制台和鼠标显示:在C:\Users\[你的计算机用户名]\Documents\My Games\里,如果有购买忏悔,进入目录Binding of Isaac Repentance,修改文件options.ini里的参数:将EnableDebugConsole=0改为EnableDebugConsole=1,对于MouseControl同理。

通过Steam进入以撒的本地文件目录,方式如下图:

先在tools/ResourceExtractor中使用ResourceExtractor.exe来解包以撒程序。在解包完成后,以撒的根目录会多几个资源文件夹。

制作模组重点围绕mods、resources和resources-dlc3这三个目录而展开:

所有订阅模组及测试模组根目录在mods中。

resources为忏悔前游戏资源库。

resources-dlc3为忏悔新增游戏资源库。

测试

首先需要新建模组,在mods/目录中新建一个目录,为你的模组取名,为了测试,这里我就叫“Foreverbirth”了。(以下称为“模组根目录”)

然后在此目录下新建main.lua程序入口文件。

运行游戏,在模组列表中就能看到这个模组了。

在模组根目录中自动生成了模组源文件metadata.xml。

在模组根目录里新建目录:

目录content/,此处存放模组中的xml数据解释文件,例如道具信息、道具池信息以及成就信息。此处的xml名称与格式需要与以撒根目录The Binding of Isaac Rebirth\resources\中的xml名称与格式对应。

目录resources/,此处存放模组中的资源素材,例如道具贴图、动画文件等。若此处贴图文件路径与名称和以撒根目录中resources/里的对应,则会替换原版游戏中的资源,这也是更改贴图的方式。如果需要更改忏悔的贴图,则需要在resources-dlc3/里进行修改,在resources/里修改无效。

这里来设计一个道具,然后让它有一定的实际效果:

道具名称:风油精  |  道具描述:三岁以下儿童慎用  |  道具品质:3  |  道具功能:攻击力+1.0,弹速-0.2  |  道具池:首领房  |  标签:攻击性、可召唤  |  Name: Essential Balm  |  Description: Use with caution in children under 3 years  |  Tags: offensive summonable

首先第一步需要在模组根目录的content/中新建一个items.xml,用于存放模组道具的配置信息。根据API网站上提供的xml配置详细信息:https://wofsauge.github.io/IsaacDocs/rep/xml/items.html?h=items,可以很轻松地配置items.xml文件:

其中,<passive/>标签代表定义的是被动道具,除此之外还有其它道具:

<active/>为主动道具

<familiar/>为跟班道具

<trinket/>为饰品道具

gfx属性中的文件路径为\Foreverbirth\resources\gfx\Items\Collectibles\,我预先将名为P_EssentialBalm.png的贴图文件放入此路径。

tags标签为忏悔新增的道具信息,道具标签会影像此道具的成就系统与机制特性,例如里罗只能拿“攻击性offensive”道具、里伯大尼的书能召唤“可召唤summonable”道具、挑战43大量过牌不能抽到“非大量过牌nocantrip”道具等。具体信息请查看维基https://isaac.huijiwiki.com/wiki/%E6%A0%87%E7%AD%BE

如果是主动道具,就需要充能数maxcharges属性,例如:maxcharges="6"

保存文件后,需要在游戏中关闭再开启此模组来刷新一遍资源。在此提一嘴,游戏有两种模组资源刷新的方式:其一为在模组列表中关闭再开启,这种方法用于刷新游戏内素材资源的更新;其二为在控制台中使用luamod指令来刷新,例如我的模组文件夹名称为“Foreverbirth”,则可以执行指令luamod Foreverbirth,如果控制台反馈Success,则刷新成功;这种方法只能刷新模组运行代码,而不能刷新素材与xml文件。

在游戏控制台中使用g Essential Balm来查看此道具的动态ID,使用spawn 5.100.[道具ID]来生成底座道具。

此时道具拾取后没有任何功能,这里需要在先前创建的main.lua中编写脚本。

首先使用RegisterMod方法注册此模组。

使用Isaac类中的方法获取xml资源中定义的道具,名称需要与xml中一致。

然后实现该道具:

最后一行里,使用模组的AddCallback方法将函数注册到模组事件中,也就是当某某事件被调用时,会接着执行此方法。

ModCallbacks.MC_EVALUATE_CACHE是ModCallbacks枚举类型中的一个元素,想查看该枚举类型中的所有元素,可以查看API,或直接在API中搜索ModCallbacks。evaluate cache事件是游戏更新道具堆栈来重计算玩家数值的函数,一般在以撒拾取道具后触发。此函数对于同一个道具会最多调用13次,每次的CacheFlag数值不同。CacheFlag也是一个枚举类型,例如判断当堆栈进程执行到计算攻击力时,角色增加攻击力,就可以判断事件传参中的第二个参数是否等于CacheFlag.CACHE_DAMAGE,然后就在此处修改角色攻击力。

API中对于模组事件列出了表格,可以查看不同事件的参数传递:

道具函数部分为了图方便,也可以写成匿名函数,如下:(空出第一个参数)

较为常用的事件有:

MC_POST_UPDATE:每帧刷新后执行

MC_USE_ITEM:使用主动

MC_USE_CARD:使用卡牌

MC_USE_PILL:使用药丸

MC_ENTITY_TAKE_DMG:游戏实体受到攻击

MC_INPUT_ACTION:玩家输入后

MC_POST_NEW_ROOM:进入新房间

MC_POST_NEW_LEVEL:进入新楼层

道具需要实装的话,就需要将道具添加到道具池中。在模组根目录的content/中新建一个itempools.xml,用于设置模组道具的道具池。

在https://wofsauge.github.io/IsaacDocs/rep/xml/itempools.html?h=itempools里可以查看道具池xml的属性设置,例如Weight权重高的道具可能更容易被遇到。

道具池名称有如下类型:treasure(宝箱房), greedTreasure(贪婪宝箱房), boss(首领房), greedBoss(贪婪白宝箱房), devil(恶魔房), greedDevil(贪婪恶魔房), angel(天使房), greedAngel(贪婪天使房), shop(商店房), greedShop(贪婪商店房), babyShop(领养证明商店), secret(隐藏房), greedSecret(贪婪隐藏房), ultraSecret(红隐房), curse(刺房), greedCurse(贪婪刺房), library(书房), planetarium(星象房), goldenChest(金箱子), redChest(红箱子), oldChest(旧箱子), woodenChest(木箱子), beggar(白乞丐), demonBeggar(黑乞丐), craneGame(赌博乞丐), bombBum(炸弹乞丐), keyMaster(钥匙乞丐), rottenBeggar(腐烂乞丐), batteryBum(电池乞丐)

EID支持

推荐在做模组时顺便添加一下图鉴EID(external item descriptions)的适配。

通过参考了FiendFolio汉化包的代码,可以将EID图鉴代码添加到道具表之下、道具函数之上的位置:(注:此部分不为我的独立创作)

在单个道具的Descriptions介绍里面,可以使用特殊符号形式添加EID关键字:

换行:#

颜色:{{ColorWhite}}{{ColorRed}}{{ColorGray}}{{ColorYellow}}等

属性:{{Damage}}{{Tears}}{{Range}}{{Luck}}{{Shotspeed}}{{Speed}}

转换:{{DevilChance}}{{AngelChance}}

角色:{{Player0}}~{{Player40}}

道具:{{Collectible1}}~{{Collectible732}}

饰品:{{Trinket1}}~{{Trinket189}}

卡牌:{{Card1}}~{{Card97}}

药丸:{{Pill1}}~{{Pill49}}

特殊:!!! ↑ ↓

小结

制作模组中编写代码,主要就是在注册事件。通过注册事件,可以很方便地将道具的功能绑定到游戏周期函数上,做出复杂的效果。

推荐一个模组模版:https://github.com/manaphoenix/IsaacTemplates,优点是将道具代码与代码入口文件main.lua隔离开来,缺点是不太方便做道具联动。

关键词:

Copyright ©  2015-2022 体育日报网版权所有  备案号: 浙ICP备2022016517号-29   联系邮箱:514 676 113@qq.com