本文目标是记录一次以撒模组制作经历,由于本人对于模组制作的不熟悉,可能会对一些技术性的概念产生误导,这些都是正常现象;如果出现了误导现象,接受批评与建议。
本文只涉及道具制作,不涉及人物制作。
(资料图片仅供参考)
以撒的结合中文维基: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隔离开来,缺点是不太方便做道具联动。
X 关闭
Copyright © 2015-2023 非洲纸业网版权所有 备案号:沪ICP备2022005074号-8 联系邮箱:58 55 97 3@qq.com