MythicMobsSkill系统拆解

本文不强调如何使用,而是从一个开发者的视角去尝试分析。

神话暴徒 MythicMobs 中,有一个较为重要的子系统为 Skill,本文将尝试拆解 Skill 系统。


技能由几个不同的部分组成:

  • Mechanics 机制
    • Effects 效果
  • Triggers 触发器
  • Targeters 目标选择器
  • Health Modifiers 生命值修饰符
  • Chance 几率

官方在 wiki 中首先就给出了一个例子:

1
2
Skills
- ignite{ticks=100} @target ~onAttack <50% 0.5

由此引入了第一部分:

Mechanics —— 机制

同时也给出了标准语法:

1
2
Skills
- mechanic{argument=value} @[targeter] ~on[trigger] [health_modifier] [chance]

这里可以查到所有官方提供的 Mechanics

参数(argument)部分简单直接,{key1=value1;key2=value2},机制部分就像是在调用一个函数,而参数等同于函数的参数。

在 MythicMobs 4.12 后加入了技能参数功能,现在你自定义的函数可以加参数了(奇怪的说法),标准定义为在本该是 value 的位置替换为占位符 <skill.paramsName>

占位符的定义可以在这里找到。

举个例子,如果我有一个 Skill:

1
2
3
SomeSkill:
Skills:
- ignite{ticks=<skill.tickParams>} @target ~onAttack

那么调用它时就可以用 skill:SomeSkill{tickParams=50} 这样的方式,如果起了相同的参数名,则后面的会取代前面的。

类似的,替换了技能的名称的部分为占位符的,被称为 VariableSkill


Effcts —— 效果

效果像是特殊的机制,可以在这里找到官方提供的内容。

用法与机制一致,但专为特殊效果设计。


Targeters —— 目标选择器

目标选择器是另一个实现技能的核心,当然了,没有目标的技能放来何用呢?

可以看到,MythicMobs 原版的 Targets 相当的多,足以覆盖大部分使用场景。

目标选择器则以 @ 开头。

类似的,目标选择器也有参数,不再赘述。


Triggers —— 触发器

触发器代表着技能触发的时机,也就是说,没有这个放不了。

这里可以找到原版触发器。

触发器以 ~ 开头,通常是类似 ~onAttack 的形式出现。

这里有一个比较有意思的部分,目标选择器和触发器能够协同工作,比如 @Trigger ~onInteract 就代表着右键单击生物(与生物互动)的玩家将被点燃,因为他们是 @Trigger


Health Modifiers —— 生命值修饰符

这部分是可选的。

><= 三个符号开头(竟然不支持 >= ?),后跟一个数字或区间,例如 >500 就是在生物生命值大于五百情况下才触发,同理 <20% 就是小于 20%,另外还有一个特殊的情况,=30%-50%,这意味着会在 30% 到 50% 之间触发。


Chance —— 几率

这部分也是可选的。

这部分也是技能定义中最后一部分了,这意味着技能释放成功的几率。

1.0 对应着 100%,0.5 对应 50%。


至此,单个技能的使用的部分结束。


MetaSkill —— 元技能

语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
internal_skillname:
Cooldown: [seconds]
OnCooldownSkill: [the metaskill to execute if this one is on cooldown]
CancelIfNoTargets: [true/false]
Conditions:
- condition1
- condition2
TargetConditions:
- condition3
- condition4
TriggerConditions:
- condition5
- condition6
Skills:
- mechanic1
- mechanic2

internal_skillname 部分是元技能的标识符,唯一且不含空格,用于调用时的定位。

Cooldown 就是冷却时间,可以使用占位符。

技能通常从列表中的第一个执行到最后一个。如果使用元机制,其机制将在原始元技能的机制恢复执行之前执行。如果被调用的元技能中存在延迟,则原始元技能的机制将恢复执行,而被调用元技能中存在的机制将在延迟后执行。

直接说起来有些抽象,官网的例子非常合适。

而 Skills 部分不能有触发器,允许有目标选择器,当 MetaSkill 中一条 skill 未指定目标时,会继承来自于调用者的目标。


Conditions —— 条件

条件可以分为三种类型:

  • 实体条件(Entity Conditions):这些条件检查实体的条件。
  • 位置条件(Location Conditions):这些条件检查某个位置的条件。如果在定位实体时使用位置条件,它将检查实体位置的条件。
  • 比较条件(Compare conditions):这些检查两个不同“事物”之间的某些条件。例如,如果目标位于角为两个坐标的立方体内,则“Cuboid”将返回true,而“StringEquals”将根据两个字符串是否匹配返回true或false。

条件也可以在元技能中的三个不同位置使用:

  • 条件(Conditions):此部分中的条件检查脚轮的条件或脚轮的位置。
  • 目标条件(TargetConditions):此部分中的条件检查从技能的目标者继承的目标或目标位置的条件。
  • 触发条件(TriggerConditions):此部分中的条件检查触发技能的实体的条件。

格式:

1
2
3
4
5
6
7
8
SkillName:
Conditions:
- condition [variable]
TargetConditions:
- condition [variable] [action]
TriggerConditions:
- condition [variable] [action] [action_variable]
- condition{variable1=value;variable2=value} [action] [action_variable]

条件中可以使用范围数字,#to# 或是 #-#,## 的位置为数字。

条件可以用或(||)或者与(&&)运算符合并。

action 部分指定了条件的行为:

  • required (or true) :符合条件运行
  • cancel (or false) :符合条件不运行
  • power [multiplier] :修改技能的功率
  • cast [skill] :符合条件则额外释放技能
  • castinstead [skill] :符合条件则改为释放其他技能
  • orElseCast [skill] :MM 4.12 新增,不符合条件则改为释放其他技能

Premium 版中,给出了一种方式可以实现内联的条件,以实现更精细的条件管理,尽管普通版也可以使用 Skill 嵌套的方式实现,不过该种方式确实减少了一些需要书写的内容。


变量与数学运算

https://git.mythiccraft.io/mythiccraft/MythicMobs/-/wikis/Skills/Variables

https://git.mythiccraft.io/mythiccraft/MythicMobs/-/wikis/Skills/Math


在我看来,MM Skill 的定义绝对算得上 DSL 的一种,像是这种 DSL,完全可以使用 Antlr 来构建。


MythicMobsSkill系统拆解
http://tt432.github.io/MythicMobsSkill系统拆解/
作者
秦千久
发布于
2023年6月29日
许可协议