下载客户端

《魔物巢穴:神陨》模组制作入门(含剧透)

2026-04-04 04:00:15
转载

AI智能总结导读

这是一份《魔物巢穴:神陨》的模组制作入门指南,含剧透。指南先列出制作前的注意事项与所需工具,再分步讲解添加新装备的操作,还介绍了解锁调试商店、启用商店补货、增加物品库存的方法,以及自定义效果、技能的制作示例,助力玩家完成游戏模组创作。

本指南将探讨如何为《魔物巢穴:神陨》进行模组制作,以添加新装备、技能、效果、敌人等内容。 简介 开始之前,有几点声明需要注意: 1. 开始前请备份你的游戏,并在制作过程中经常备份。这样如果出现问题,你就不必重新下载游戏并从头开始。 2. 任何游戏更新都会导致你所有的模组工作失效。这也是需要经常保存并制作多个副本的另一个原因。最坏的情况下,你可以将旧文件中的代码复制到新文件中,从而节省一些时间。 3. 建议在尝试模组制作前完成游戏战役。你可能会在代码中以及本指南中看到剧透内容。 4. 在对游戏进行模组制作时,你需要对所发生的一切负全部责任。本指南仍在制作中。如果你有任何建议,请告诉我! 你需要准备:《魔物巢穴:神陨》的.swf文件、文本编辑器(我推荐Notepad++,它是免费的)、Flash反编译器(我推荐JPEXS,它也是免费的) 首先,在JPEXS中找到《魔物巢穴:神陨》的.swf文件,然后将“所有部分导出”到一个新文件夹。将该文件夹放在你容易找到的地方,因为你会在那里进行大量操作。 关于JPEXS的注意事项:JPEXS是我能找到的唯一免费且无限制的Flash反编译器。如果有人发现了其他的,请告诉我,因为我们现在使用的这个肯定不是完美的。其一,该产品已不再更新。其二,标有(实验性)的“编辑ActionScript”选项对我们来说根本不起作用。power:获得的力量值(正数为增加,负数为减少)。该数值不随装备等级变化。 remove:移除目标身上的一定数量的减益效果(若目标为己方队伍)或增益效果(若目标为敌人)。 trigger:效果的触发方式。参考EquipmentSpecialEffect.as文件。例如,数值6对应TRIGGER_WHEN_HEALING(治疗时触发)。 effectId:若数值不为0,则会施加一种效果。查看Effect.as文件,找到与数值对应的常量。例如,116对应EF_RANGER_THORNS(游侠荆棘效果)。 Stat Tag <stat>:装备的一项属性。 id:所施加的属性种类。参考Stat.as文件获取可能的选项。 value:属性数值。 type:有三种选择。"fixed"表示固定数值,不会变化;"tier"表示每提升1级装备等级,数值增加对应数值(或每级增加该数值的1/3);"relic"表示为遗物效果。特殊属性ID:属性ID="80":为物品添加技能。可使用MonsterSkill.as、PassiveSkill.as和Skill.as。 属性ID="1000+":若ID数值超过1000,则该属性代表抗性。用ID减去1000,在Tag.as中查找余数对应的抗性类型。 第一个示例:装备 向游戏中添加装备其实相当简单: 1. 用文本编辑器打开你从首帖中选择的.bin文件。 2. 对文件进行所需的任何修改并保存。 3. 在JPEXS的swf树(位于binaryData中)内右键点击同名文件,选择用你刚编辑好的文件替换它。 4. 树中的文件会变为粗体,表明已被修改。 5. 保存。 6. 打开《地牢怪物:神陨》查看效果!以下是我过去使用这些确切步骤制作的一些示例:使用该选项编辑代码会导致《魔物巢穴:神陨》启动时崩溃。在这种情况下,我们唯一的选择是使用“编辑P代码”功能。 此外,我原以为JPEXS的支持已经停止,但事实证明他们最近进行了一些更新。我还没有使用过它,但会在制作本指南的过程中尝试。 第一个示例:文件 不过,首先我们不会深入探讨P代码,因为它稍微复杂一些。好消息是,我们可以轻松地向游戏中添加新装备,而无需触及P代码。我们将从查找一些文件开始。我的注释会像这样。 binaryData:binaryData中的所有文件在文件名前都有一个4位代码。该代码不如文件名其余部分的字符串重要。为避免不同游戏版本之间产生混淆,我不会写出代码数字。md2.items.ItemXML_artifactsFile.bin 存放所有神器的文件 md2.items.ItemXML_armorFile1.bin 紫色品质护甲套装 md2.items.ItemXML_armorFile2.bin 青色品质护甲套装 md2.items.ItemXML_epicsFile.bin 紫色品质武器和护甲 md2.items.EquipmentSet_setsXMLClass.bin 装备套装加成 md2.items.ItemXML_factionRewardsFile.bin 阵营奖励护甲套装 脚本:Stat.as 所有物品属性 Tag.as 所有可能的标签 脚本->md2->物品:EquipmentSpecialEffect.as 装备特效触发(被攻击时、暴击时、治疗时等) Item.as 物品稀有度和基础伤害 ItemTypes.as 装备类型 脚本->md2->技能:Effect.as 游戏中所有的增益和减益效果 MonsterSkill.as 怪物技能请注意,怪物遵循不同的伤害算法,因此若要充分发挥任何怪物伤害技能的潜力,你需要编辑P-Code。技能可能会产生意外的副作用。 PassiveSkill.as 对应玩家的被动技能 Skill.as 对应玩家的技能 SkillTree.as 对应玩家的技能树 第一个示例:代码 让我们从一个示例装备开始,这也是我个人最喜欢的装备之一:自然的交易。 <equipment name="Nature's Bargain" type="15" id="4950" rarity="9" baseMultiplier="2.2" setId="0" backer="Alex" slots="2"> <appearance icon="12" model="19" glowAlpha="0" glowColor="0"/> <usableBy default="false"> <requires tree="14"/> </usableBy> <lore text="生离不开死,而万物终将通过死亡走向终结让我们逐点分析:装备标签<equipment>:起始和结束标签告知游戏这是一件装备名称:游戏中显示的装备名称类型:物品基础类型:使用ItemTypes.as文件,找到与数字对应的常量。例如,数字15对应【法杖】。 id:物品的唯一ID。确保添加的每个物品都有唯一ID,否则它们会相互覆盖。 稀有度:物品的稀有程度。使用Item.as文件查询数字对应的稀有度,例如数字9对应【神器级】。 基础倍率:基础伤害/护甲的倍率。武器基础伤害可参考Item.as文件。 套装ID:如果武器属于某套装,此值不为0。套装效果可查看md2.items.EquipmentSet_setsXMLClass.bin文件。 支持者名称:制作该武器所纪念的支持者名称,会使游戏内物品卡片上显示绿点。 插槽:可用的附魔插槽数量。外观标签<appearance>:控制物品外观的开始和结束标签 图标:物品图标 模型:角色装备该物品时的模型 还有更多标签,包括发光效果、色调变化等。我还没弄清楚所有这些标签的来源,所以大多是复制粘贴其他物品的外观设置。对我来说这主要是反复尝试的过程。 可用标签<usableBy>:处理哪些职业可以使用该物品的开始和结束标签 默认值:可以是“true”或“false”。如果为“true”,则能够装备该基础类型物品的标准职业可以使用它。如果为“false”,则任何职业都可以使用它。 需要技能树:允许特定技能树使用该物品。参考SkillTree.as文件查看数字对应的含义。在这种情况下,我们使用14,代表【游侠-自然】技能树。限制树:限制某棵树使用该物品。在我们的示例中未展示此内容。 背景故事标签<背景故事>:背景故事文本! 效果标签<效果>:效果标签。该标签将决定物品拥有的特殊属性。 触发几率:效果触发的百分比几率。 目标自身:若为“true”,效果作用于装备穿戴者;若为“false”,效果作用于目标。 瓦解:若效果会造成瓦解效果,则为“true”或“false”。 瓦解标签:查看Tag.as以获取可用标签。此处的任何标签都将瓦解带有该标签的敌人。若为“0”,则不使用任何标签。 行动值:获得的行动值(正数)或失去的行动值(负数)。3000=1个完整行动条。 生命值:获得的生命值(正数)或失去的生命值(负数)。此数值会随物品等级提升而变化。

第四个商场标签页:调试商店 在解锁第四个商场标签页之前,我强烈建议备份.swf文件。我们需要进入P-Code,如果P-Code出现问题,可能会导致游戏崩溃。不过,我所做的操作目前非常稳定。 在JPEXS中,导航至: scripts -> md2 -> shop -> Shop 找到以下代码块并点击其中某处: case EMPORIUM: this.name = "The Emporium"; this.bagIds.push(ShopInventoryBags.EMPORIUM_SPECIAL); this.bagIds.push(ShopInventoryBags.EMPORIUM_ACCESSORIES); this.bagIds.push(ShopInventoryBags.EMPORIUM_CONSUMABLES); if(Main.isDebugVersion) { this.bagIds.push(ShopInventoryBags.无法识别内容,已删除点击编辑P-Code并删除以下行:获取命名空间为PackageNamespace("")的"Main"类,获取其"isDebugVersion"属性,若为假则跳转到ofs00f1。在接下来的行中,删除ofs00f1:ofs00f1:getlocal_0。保存P-Code,然后保存文件。下次在游戏中时访问商场!这里有一个包含我制作的一些自定义神器的示例。

启用补货功能 要启用商店补货功能,我们需要查看scripts > md2 > shop > Shop文件。以下是示例代码: case KEEP_QUARTERMASTER: this.name = "Quartermaster"; this.bagIds = [ShopInventoryBags.QUARTERMASTER_SPECIAL]; this.allowsBribeForRestock = false; break; 我们的目标是将其中的'false'改为'true'。让我们输入等效的P-Code来了解操作方法: ofs006a:label getlocal_0 pushstring "Quartermaster" initproperty Qname(PackageNamespace(""),"name") getlocal_0 getlex Qname(PackageNamespace("md2.查看底部写着“pushfalse”的那一行?你只需将其改为“pushtrue”即可!相反,如果你想禁用补货选项,就需要将“pushtrue”改为“pushfalse”。 增加物品库存 增加商店中的物品库存需要具体情况具体分析。如果你有特定的例子,我很乐意详细说明,但在那之前,我会提供一些提示。我们将在scripts > md2 > shop > ShopInventoryBags中进行编码操作。若物品处于循环中:让我们从物品存在于循环内的示例开始: 情形 EMPORIUM_SPECIAL: 物品生成器设置稀有度表(稀有度表.商店通用,1,真,假); _loc4_ = 0; 当 _loc4_ < 3 时 { _loc2_.添加(物品生成器.获取随机技能手册(_loc10_)); _loc4_++; } _loc4_ = 0; 当 _loc4_ < 1 时 { _loc2_.添加(物品.获取物品(物品.神器知识碎片,1)); _loc4_++; } _loc4_ = 0; 当 _loc4_ < 5 时 { _loc2_.添加(物品生成器.获取随机声望物品(1,派系.假设我们想要更多的【神器知识碎片】。进入循环时_loc4_为0,只要_loc4_小于1,循环就会执行。在这种情况下,它只运行一次,生成一个碎片。我们来修改一下。 首先点击这段代码中数字1的前面: while(_loc4_ < 1) 这会高亮显示以下P代码: pushbyte 1 这些1是同一个!如果你将“pushbyte 1”修改为“pushbyte 2”,那么每月会生成2个碎片。不过,如果你想输入更大的数字,则需要使用“pushshort”。JPEXS应该会对此发出警告信息。以下是将其修改为60左右后在游戏中产生的效果示例:

如果物品不在循环中:这种修改比较麻烦,但并不困难。你可以像我上面展示的那样,创建自己的while循环来加入物品,但除非我打算频繁更改那个数值,否则我倾向于避免这种做法。让我们看另一个例子: if(_loc6_ >= Reputation.REPUTATION_LEVEL_REQUIRED_FOR_CONSUMABLE_UNLOCK) { _loc14_ = Reputation.getConsumableIdUnlockedByFaction(_loc13_); addItemToVectorById(_loc2_,_loc14_,1); if(_loc14_ != Items.LEGENDARY_LAIR_MAP) { addItemToVectorById(_loc2_,_loc14_,1); } if(_loc14_ == Items.SHRINE_CLEANSING_OIL || _loc14_ == Items.这段代码用于为各阵营商店添加消耗品。具体来说,addItemToVectorById(_loc2_,_loc14_,1); 这行代码负责添加物品。如果想让商店里有更多物品,只需简单复制粘贴即可!我们来看看对应的伪代码: findpropstrict Qname(PrivateNamespace(null,"294"),"addItemToVectorById") getlocal_2 getlocal 14 pushbyte 1 callpropvoid Qname(PrivateNamespace(null,"294"),"addItemToVectorById") 3 你要做的就是复制粘贴这段代码!如果我们想以两个物品为基础开始,我们的P代码会如下所示: findpropstrict Qname(PrivateNamespace(null,"294"),"addItemToVectorById") getlocal_2 getlocal 14 pushbyte 1 callpropvoid Qname(PrivateNamespace(null,"294"),"addItemToVectorById") 3 findpropstrict Qname(PrivateNamespace(null,"294"),"addItemToVectorById") getlocal_2 getlocal 14 pushbyte 1 callpropvoid Qname(PrivateNamespace(null,"294"),"addItemToVectorById") 3 而ActionScript会变成: addItemToVectorById(_loc2_,_loc14_,1); addItemToVectorById(_loc2_,_loc14_,1); 你可以多次重复此操作,其形式如下:

自定义效果示例:静电场 本示例中,我们将基于该装备创建以下效果:

虽然游戏中存在与此类似的效果,但并没有完全相同的效果。因此,我们需要自行制作。这涉及几个步骤。我们将在scripts -> md2 -> skills -> Effect路径下进行操作。 步骤1:效果代码 这个技能的代码看起来还不算太复杂: ofs5e6c:label getlocal_0 pushstring "Static Field" initproperty Qname(PackageNamespace(""),"effectName") getlocal_0 getlex Qname(PackageNamespace(""),"Tag") getproperty Qname(PackageNamespace(""),"LIGHTNING") getlex Qname(PackageNamespace(""),"Tag") getproperty Qname(PackageNamespace(""),"MAGIC") getlex Qname(PackageNamespace(""),"Tag") getproperty Qname(PackageNamespace(""),"TOOL") newarray 3 initproperty Qname(ProtectedNamespace("md2.无法识别内容,已删除确保下拉菜单保持公开且为常量。将常量命名为(本例中为EF_ITEM_STATIC_FIELD),然后点击ActionScript进入P-Code:特征常量Qname(PackageNamespace(""),"EF_ITEM_STATIC_FIELD")槽位ID 312类型Qname(PackageNamespace(""),"int")值Integer(811)结束;特征这里只更改了两项:槽位ID需要是唯一的。原版游戏中最高的数字是311,所以我们从312开始。整数值需要与效果ID相对应。811是原版游戏中未使用的ID,因此我们可以使用它。自定义技能示例:震颤这是我制作的一个自定义技能示例。我会讲述我的思考过程以及如何达成最终效果。基本上,我想要一些可以施展的土系魔法。在与元素生物战斗的任务中,存在火、闪电、冰、土四种元素类型,但我们却可以施展除土元素外所有元素的法术。自然地,看到涉及地面的技能时,我就想到了用该技能施加地形效果。而游戏中目前缺少的,正是无需先移除现有地形就能施加新地形的技能或效果,这正是我想要的。以下是最终技能的设定: SK_TREMOR: 技能名称:震颤 技能描述:通过地面发送一道震颤,扰乱敌人下方的地形。造成|dmg|伤害,移除所有地形状态,并施加立足不稳。 可瞄准任意敌人 命中所有敌人摧毁地形 = true; 应用松散地面 = true; 缩放类型 = 随智力缩放; 缩放伤害 = 0.4; 非战斗外不可用 = true; 行动类型 = 完整行动; 能量消耗 = 70; 冷却总回合数 = 4; 用户动画 = 动画.地面脉冲外放黄色; 初始音效 = 音效.神圣冲击; 命中前帧数 = 20; 图标类别 = ico_ef_crystals; AI施法限制 = 0; 基础伤害类型 = 伤害.物理; 技能标签 = [标签.法术,标签.区域效果,标签.地形,标签.【物理】;该代码本质上是【平衡 odds】与【闪电风暴】的混合体,并做了一些数值调整。有一行代码我想特别说明:this.applyLooseFooting = true;这个变量原本不存在,是我新增的,这部分相对简单。public var applyLooseFooting:Boolean;接下来需要让游戏知道如何处理这个变量。这部分代码来自脚本【SkillExecutor】。我首先回溯并参考了“this.destroysTerrain”的写法来编写代码,最终得到了如下片段:if(this.skill.destroysTerrain && _loc25_) { this.{ if(param1 && param1.terrainTypeId) { param1.setTerrainModifier(Terrain.NONE); if(param1.charRef) { param1.charRef.TERRAIN,true,true); } CombatLog.addLogMessage("地形效果已移除!"); param1.showEffects(); return true; } return false; } 据我理解,这段代码触发需要两个条件:一是战斗场地的位置(param1),二是该位置是否已有地形(param1.terrainTypeId)。因此,当我们基于新代码进行开发时,必须对其进行修改,以避免检查该位置是否已存在地形: { if(param1) { param1.setTerrainModifier(地形.松散立足); 战斗日志添加消息("地面变得不稳定!"); param1.showEffects(); return true; } return false; } 最后是与"destroysTerrain"条件语句类似的代码: if(this.skill.applyLooseFooting && _loc25_) { this.最终结果是该技能功能正常:它会对每个对手造成伤害,移除这些对手所在格子的地形,然后无论是否移除了地形,都会施加【不稳定地形】。不过,虽然该技能会显示“-【地形】”的浮动文本,但不会显示添加【不稳定地形】的浮动文本。我猜测这一差异与“param1.charRef.因此,我没有查找其他函数,直接略过了这部分。虽然不够完美,但能正常使用。无法识别内容,已删除技能:效果 获取本地变量0 获取词法单元 Qname(包命名空间(""),"DURATION_LONG") 初始化属性 Qname(包命名空间(""),"maxDuration") 获取本地变量0 获取词法单元 Qname(包命名空间(""),"ico_ef_lightning") 初始化属性 Qname(私有命名空间(null,"61"),"_iconClass") 跳转到 ofs75d0 请注意,对我有效的 ofs 十六进制数字可能对你无效。它们在保存时似乎会发生变化。更重要的是,你输入的数字必须与其他任何数字都不同。 ofs 用作查找值。因此,如果另一段 P 代码正在查找 ofs5e36,它将找到静态字段效果。否则,它将忽略它。我提到这一点是因为,当你希望一段代码找到另一段代码时,始终使用完全相同的 ofs 标签非常重要。但那对ofs必须与代码中所有其他ofs不同,否则它们也会一同生效。希望这能讲得通。 效果本身的P代码相当简单,是从文件中已有的其他效果拼凑而成的。持续时间(DURATION_LONG)在效果文件顶部定义为四回合。步骤2:查找表接下来,我们需要将效果附加到查找表中,该表位于P代码的末尾附近:ofs7247:getlex Qname(PackageNamespace(""),"EF_EXECUTOR_ASPECT_THYSION") getlocal 9 ifstrictne ofs7257 pushshort 316 jump ofs7276 ofs7257:getlex Qname(PackageNamespace(""),"EF_ITEM_STATIC_FIELD") getlocal 9 ifstrictne ofs7268 pushshort 317 jump ofs7276 ofs7268:jump ofs7273 pushshort 318 jump ofs7273 ofs7273:pushshort 318 ofs7276:kill 9 lookupswitch ofs5ec3 318 ofs0075 ofs00aa ofs00e6 ofs0132 ofs017e ofs01d2 ofs0211 ofs027a ofs02c6 ofs0304 ofs035b ofs03a6 ofs03dd ofs042e ofs0485 ofs04c7 ofs04f6 ofs0538 ofs0572 ofs05cc ofs069b ofs06dc ofs0709 ofs0751 ofs07b3 ofs0805 ofs084e ofs087e ofs08d9 ofs0908 ofs093d ofs0978 ofs09c7 ofs0a0e ofs0a55 ofs0aac ofs0b13 ofs0b46 ofs0bbf ofs0c29无法识别内容,已删除我本想展开细说,但受限于该部分的文本长度。大致情况如下:原版游戏包含317种效果,我们将再添加一种。在代码的这个区域中,凡是看到317的地方,都加1使其变为318。在最后一个技能效果【Aspect of Thysion】之后添加一个新部分。新效果的跳转偏移量应与【Aspect of Thysion】的相同。将【Aspect of Thysion】的跳转偏移量更改为与新效果的偏移量相同。将步骤1中的偏移量标签作为查找表中倒数第二个值。步骤3:公共静态常量最后,我们需要向代码中添加一个公共静态常量。操作方法如下:点击ActionScript窗口正上方的【添加特性】按钮。勾选【静态】框。

评论

共0条评论
face
inputImg
相关阅读

进入Dredmod——《地城英雄志》模组制作入门

想要制作《地城英雄志》有史以来最棒的模组,却不知从何下手?别再犹豫了,本指南将为你展示《地城英雄志》模组制作的基础知识,助你开启艺术创作之旅。 开始之前:编辑工…

2026-03-21 10:000赞 · 0评论

# 模组制作 模组名:河马

2024-05-31 11:5357赞 · 2评论

《战区:战斗指挥官》模组制作入门指南

本指南旨在教任何人如何开始使用《战区:战斗指挥官》进行模组制作。内容涵盖入门的基础知识,并会包含其他有助于入门的指南链接。 推荐工具 在本指南中,我将沿用《战区…

2026-03-19 04:000赞 · 0评论

《木架》- 模组与自定义地图

了解如何使用和制作《木架世界》的地图与模组,以及我们公司的模组制作指南。如果您计划在《木架世界》创意工坊发布内容,请先阅读本文。 简介 您好, 欢迎来到《木架世…

2026-02-20 04:000赞 · 0评论

《洛克人 Zero/ZX 遗产合集》模组制作指南

本指南将向玩家展示如何为《洛克人Zero/ZX遗产合集》添加音乐、翻译等模组,旨在为洛克人Zero和ZX系列带来真正的重制版体验。 简介 欢迎阅读本指南,它将向…

2026-03-31 04:000赞 · 0评论

《100%鲜橙汁》模组制作文档

《100%鲜橙汁》模组使用、安装与创建指南 欢迎!

2026-02-16 01:000赞 · 0评论

《100%鲜橙汁》模组制作文档

《100%鲜橙汁》模组使用、安装与创建指南 来自译者 本指南是对《100%鲜橙汁 | 模组制作文档》的翻译,原作者为Sora [Fruitbat Factory…

2026-02-16 01:000赞 · 0评论

蛋仔派对 新手地图教程(627)|免疫伤害(上)

新手地图教程(627)|自定义技能-免疫伤害(上) 伤不到我! 大家有好的想法或者想学习的内容可以在评论区告诉我哦(●'◡'●) ❗视频禁止搬运,侵权必究❗ #…

2025-11-24 07:440赞 · 0评论

实用漏洞

绕过无形墙体,避开软锁定,进行序列断裂,将一个怪物的技能复制到另一个怪物身上,从而创建属于你自己的包含最强攻击的自定义技能列表。 简介 这是关于什么的? 漏洞,…

2026-03-19 10:000赞 · 0评论

蛋仔派对 新手地图教程(628)|免疫伤害(下)

新手地图教程(627)|免疫伤害(下) 安全! 大家有好的想法或者想学习的内容可以在评论区告诉我哦(●'◡'●) ❗视频禁止搬运,侵权必究❗ #蛋仔派对 #蛋仔…

2025-11-28 23:210赞 · 0评论
暂无更多