自制技能

英文视频教程


时间戳

  • 0:29 | 创造 skill .json 并将信息粘贴进去
  • 1:17 | "id"
  • 1:49 | "skillTier"
  • 2:07 | "skillTargetType"
  • 2:30 | "canTeamKill"
  • 2:45 | "canDuel"
  • 2:58 | "canChangeTarget"
  • 3:09 | "attributeType"
  • 3:32 | "atkType"
  • 3:49 | "defType"
  • 4:16 | "skillMotion"
  • 4:48 | "viewType"
  • 5:13 | "targetNum"
  • 5:23 | "range"
  • 5:37 | "defaultValue"
  • 5:54 | "skillLevelCorrection"
  • 6:20 | "abilityScriptList"
  • 7:03 | "coinList" -> "operatorType"
  • 7:25 | "coinList" -> "scale"
  • 7:37 | "coinList" -> "abilityScriptList"
  • 7:52 | 将脚本植入技能 | 脚本列表位于本指南2.5分区
  • 11:42 | 将多个技能加入 skill .json
  • 12:16 | 给予一个人格多个技能

文字教程

在开始之前哥们得说句公道话:自制技能这B过程可以说是整个084 mod创作最抽象的一部分,没有之一。

哥们会尽量简化这个过程,不过到头来还是令人头疼。

找到正确的数据

人格这块直接抓数据很容易,但抓技能不能用同样的方法搞,因为容纳技能的json文件非常大且非常乱。于是,我们建议直接从下面抓一个技能模板然后一步一步把技能搭起来。直接从json文件里抓只会让自己脑溢血。

技能格式

技能位于 limbus_data/skill/custom_limbus_data/skill/ 。技能的json文件跟自制被动很像,都是一个大型列表加上各个条目栏。(尽量不要使用dumpedData/skills内的技能文件,因为有可能导致某些奇怪的bug,如技能贴图丢失)

如您所见,这是一个一技能。我们会用它来作为教材给您解释一下基础。

{
    "list": [
        {
            "id": 1125001,
            "skillTier": 1,
            "skillData": [
                {
                    "skillTargetType": "FRONT",
                    "canTeamKill": false,
                    "canDuel": true,
                    "canChangeTarget": true,
                    "attributeType": "SHAMROCK",
                    "atkType": "SLASH",
                    "defType": "ATTACK",
                    "skillMotion": "S1",
                    "viewType": "BATTLE",
                    "targetNum": 1,
                    "range": 6.5,
                    "defaultValue": 8,
                    "skillLevelCorrection": 1,
                    "abilityScriptList": [
                        {
                            "scriptName": "GiveBuffOnUse",
                            "buffData": {
                                "buffKeyword": "Breath",
                                "target": "Self",
                                "stack": 1,
                                "turn": 0,
                                "activeRound": 1
                            }
                        }
                    ],
                    "coinList": [
                        {
                            "operatorType": "ADD",
                            "scale": 3,
                            "abilityScriptList": [
                                {
                                    "scriptName": "GiveBuffOnSucceedAttack",
                                    "buffData": {
                                        "buffKeyword": "Breath",
                                        "target": "Self",
                                        "stack": 0,
                                        "turn": 2,
                                        "activeRound": 1
                                    }
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

口也,这又是什么癫佬东西了!?

唏,咱们一个一个来。

  • "id" 是技能的ID。不像人格ID那样有个取名需求,技能ID是你想叫啥就叫啥。
  • "skillType" 决定技能类型(ego觉醒,ego侵蚀还是单纯的只是一个正常技能)
  • "skillTier" 决定技能等级,是一技能二技能还是三技能等等等等。所有EGO技能都算三技能,并且所有守备技能都是一技能。大多数敌人技能都是一技能,不过有不少例外。
  • "attributeType" 是技能的罪孽属性。
  • 若是想要弄清楚罪孽属性的变量,请看 attributeList locale文件(或者看下述的代码)
{
  "dataList": [
    {"id": "CRIMSON", "name": "Wrath"},
    {"id": "SCARLET", "name": "Lust"},
    {"id": "AMBER", "name": "Sloth"},
    {"id": "SHAMROCK", "name": "Glut."},
    {"id": "AZURE", "name": "Gloom"},
    {"id": "INDIGO", "name": "Pride"},
    {"id": "VIOLET", "name": "Envy"},
    {"id": "WHITE", "name": "Mad."},
    {"id": "BLACK", "name": "Angst"}
  ]
}
  • atkType 是物理攻击属性,分为SLASH(斩)HIT(打)PENETRATE(突)。但如果是防御或者闪避技能,直接填 NONE 就好。
  • defType 决定一个技能是普通攻击 (ATTACK),防御 (GUARD),闪避 (EVADE),还是反击 (COUNTER).
  • 注: 反击需要 atkType 来确定是斩打突中的哪一个
  • 注: 给防御与闪避加 atkType 不会有任何效果
  • skillTargetType 决定技能的索敌逻辑
  • FRONT 是所有人格技能所用的索敌逻辑,意味着技能会瞄准我们想要攻击的对象
  • NPC技能通常会使用 RANDOM 索敌逻辑,也就是随机攻击。
  • targetNum 决定攻击容量(也就是AOE),默认是1
  • mpUsage 决定一个技能会消耗多少理智值。
    • 注意:此变量实际上不会消耗魔法值,它仅用于更新用户界面元素。
    • 注: 在游戏代码中,SP (理智) 其实没有被用过哪怕一次,被使用的永远都只有MP
  • skillLevelCorrection 决定一个技能所获取的攻击等级/防御等级
  • defaultValue 代表着技能基值
  • 注: 虽然说理论上这个数值可以调成负数,但由于边狱公司的计算逻辑此举会导致一些非常奇怪的结果。(想要了解一下可以看这里)
  • canTeamKill 根据true还是false决定一个技能可不可以攻击友军(TK王这一块)
  • 注:再用 FRONT 索敌逻辑时用这个能主动TK
  • canDuel 根据true还是false决定一个技能可不可以拼点
    • 注: 代码中拼点永远都被称为Duel
    • 注: 制造可拼点防御跟反击只需要将这玩意改为true 这玩意对闪避没有哪怕一丝一毫的影响。
  • canChangeTarget 根据true还是false决定一个技能可不可以被对方抢手
  • skillMotion 是这个技能使用的动画。正常技能用的 S1, S2, S3, S4 等等, 反击防御闪避基本都用 "Default"
  • viewType 怪东西,没鸟用。填 BATTLE 看起来就是个正常技能,填 ENCOUNTER 会使该技能像三技能一样。
  • range 决定角色要移动多远才会开始拼点。依旧没鸟用。
  • parryingCloseType 跟range差不多。没鸟用。

能力脚本与其运作方式

能力脚本指的是那些不在硬币本身上生效的脚本。条件类硬币威力加成跟拼点胜利等等都属于这种。

脚本制作的大概介绍

绝大多数脚本效果跟名字都差不多。 GiveBuffOnUse(使用时给状态效果)是个很好的例子。

   {
"scriptName": "GiveBuffOnUse",
"buffData": {
    "buffKeyword": "Breath",
    "buffOwner": ""
    "target": "Self",
    "stack": 1,
    "turn": 0,
    "activeRound": 1
 }
}
  • 首先是 buffKeyWord,这玩意决定什么类型的状态效果会被施加。基本啥状态效果都行。
  • 此时上述模板上给这玩意列的是Breath,也就是呼吸。
  • 注:如果您想找到游戏内的所有状态,请移步至https://limbus.kusoge.xyz/keyword 或者 limbus_locale/bufList。用后者时别忘了用VScode的格式化保存。
  • 接下来是 "target",顾名思义决定谁会被影响。 有不少变量可以填,不过最常见的有Self(自己), Target(目标), EveryAlly(所有友军), RandomEnemy1(随机一个敌人), RandomEnemy2(随机两个敌人), RandomEnemy3(随机三个敌人), RandomEnemy5(随机五个敌人) 与 EveryEnemy(所有敌人)。更抽象的有 IfAbnormalityAllPartsOrSelfCustom,不过这些基本没人用。
  • buffOwner 在这里没有用,不过后面会讲。
  • stack 就是强度。不少状态效果只有强度没有层数。
  • turn 是层数。
  • activeRound 决定什么时候状态会被施加。0是这回合,1是下回合。

脚本可以进行一定范围内的编辑

所有名字里含数字的脚本都可以靠更改那些数字进行编辑。罪孽属性也是一个道理。

带状态效果的脚本大都遵循这个逻辑,但不是所有的都是。虽然说编辑脚本的buffData 时基本都是这个道理,但还是得自己试错。

我该从哪找到脚本?

  • 方案1:前往边狱locale中的skillList(别忘了用VScode的格式化保存)然后搜索一个你想要的技能描述。然后去 limbus_data/skill 搜索哪个技能的id,然后将内部的脚本复制过来。您也可以查看该指南的2.5分区。
  • 方案 2:这个方案比较复杂,但可以应对月计抽象的本地化文本 (金智勋吃水果)。 进入 BepInEx/unhollowed 打开 Assembly-CSharp.dll,然后用DnSpy或者Jetbrains Dotpeak这种软件搜索你需要的技能名

编辑硬币

如今您已明白如何编辑 AbilityScript,编辑硬币已经不是什么挑战了。

主要有三个大头得看:

  • operatorType 决定硬币是正面加成 (ADD),反面加成,(SUB),还是乘法加成 (MUL)
  • scale 决定硬币威力,除非你想玩点抽象的(比如说负面硬币乘法)不然都不会出问题
  • abilityScriptList 看起来很眼熟?这玩意跟之前讲过的abilityScript基本坐一桌。(用于植入 “击中时” 这种效果)

添加更多的硬币

没啥难度哥们说真的。直接复制粘贴json里的一个硬币就完事。值得一提的是虽然说一个技能确实可以有十个以上的硬币,一个技能在基础情况下无法显示十个以上的硬币。(中文解释起来很怪但确实是这么回事)

额外信息

这里的信息算过期老货。部分可以作为参考但本质上没啥用,因为目前Lethe已经有了能完美替代它们的插件。(如Modular)

  • "textID" 原本用来关联本地化文本用的。
  • "iconID" 图标id,原版技能没多少有这玩意。图标ID不少都跟技能ID有直接联系。想要自创技能图标可以参考参考。
    • 一个技能的图标ID跟对应的技能ID一直都会是相同的。.
  • "gaksungLevel" 指同步等级。

注意

所有技能都在 limbus_data/skills 里。想要异想体的技能直接在这里搜索就行,复制粘贴后扔进 custom_limbus_data/skills 里就能开始编辑。

如果一个技能没有locale本地化文本,那么技能的描述就会被替换为占位符(2.7分区有讲)