加载中...

「RO 笔记」添加自定义魔物


0x00 前言

最近在 hercules 入手了一个二次元的魔物图档包,里面有口袋妖怪、火影忍者、进击巨人、合金弹头、洛克人、拳皇等一堆乱七八糟的次元魔物:

现在就这个图档包讲解下怎么往 RO 中添加自定义魔物。

0x10 在服务端添加魔物设定

0x11 添加魔物设定

例如我希望添加口袋妖怪中的「皮卡丘」,首先要在魔物库 db/re/mob_db.yml 添加其设定:

  - Id: 20172
    AegisName: PIKACHU
    Name: 皮卡丘
    JapaneseName: 皮卡丘
    Level: 5
    Hp: 1000
    Sp: 1000
    BaseExp: 100
    JobExp: 100
    Attack: 10
    Attack2: 30
    Defense: 20
    MagicDefense: 20
    Str: 10
    Agi: 20
    Vit: 10
    Int: 10
    Dex: 10
    Luk: 10
    AttackRange: 2
    SkillRange: 10
    ChaseRange: 10
    Size: Small
    Race: Brute
    Element: Neutral
    ElementLevel: 1
    WalkSpeed: 200
    AttackDelay: 1564
    AttackMotion: 864
    DamageMotion: 576
    Ai: 19
    Modes:
      Detector: true
    Drops:
      - Item: Glass_Bead
        Rate: 5000

魔物的设定比较复杂,建议通过 SDE 去配置魔物参数会更有效率:

关于魔物的属性、掉落物等,根据自己喜好设定即可;唯独需要注意的只有两个地方:

  1. AegisName: 必须和魔物的图档名一致
  2. Id: 必须在某个范围内,否则加载魔物数据时会报错:
    • 复兴前范围: (1000, 3999) (不包括两端)
    • 复兴后范围: (20020, 31999) (不包括两端)

这两个范围在 src/map/mob.cpp 中定义了:

#define MIN_MOB_DB 1000
#define MAX_MOB_DB 3999
#define MIN_MOB_DB2 20020
#define MAX_MOB_DB2 31999

官方都没有用完这两个范围,挑一些保留 ID 出来分配给自定义魔物就可以了。

当然如果你要加的魔物数量特别多,也可以扩展出一个范围,但是需要重新编译服务端:

0x12 添加魔物技能(可选)

在添加魔物基本设定后,可以在 db/re/mob_skill_db.txt 技能库为其添加技能:

20172,皮卡丘@十万伏特,chase,20,10,2000,0,0,yes,target,always,0,,,,,,,
20172,皮卡丘@电球,chase,84,10,2000,0,0,no,target,always,0,,,,,,,
20172,皮卡丘@百万伏特,angry,85,10,3000,0,0,no,target,always,0,,,,,,,

魔物技能库 mob_skill_db.txt 是目前少有的几个尚未 yml 格式化的数据库,因此配置起来比较晦涩,上述配置具体的含义在 mob_skill_db.txt 里面能查到,这里就不解读了。

为了高效配置魔物技能,建议使用 SDE

0x13 在地图召唤自定义魔物

召唤魔物需要写 NPC 脚本,具体语法查 doc/script_commands.txt 即可。

这里提供一个最简单的 NPC 脚本,它表示在首都南门外任意坐标召唤我们添加的「皮卡丘」,这张地图最多召唤 50 只:

prt_fild08,0,0    monster    皮卡丘    20172,50

这样当我们进入游戏时,就能去首都南门外去找「皮卡丘」了。

0x20 在客户端添加魔物设定

参考《客户端目录结构及功能说明(2024 修订)》,魔物图档目录为 data/sprite/阁胶磐,在其中找到服务端 AegisName 设置的图档名 PIKACHU,确认是「皮卡丘」:

0x21 添加到魔物外观池

和《防具外观 ID 解读 - 头饰篇》类似,魔物也有外观池:

  • 定义「魔物唯一代码」和「魔物 ID」的关系: data/luafiles514/lua files/datainfo/npcidentity.lub
  • 定义「魔物唯一代码」和「魔物图档名称」的关系: data/luafiles514/lua files/datainfo/jobname.lub

现在在 npcidentity.lub 添加一行 JT_POKEMON_PIKACHU = 20172,其中:

  • JT_POKEMON_PIKACHU: 就是「魔物唯一代码」,唯一的任意字符串
  • 20172: 就是前面服务端为魔物分配的 ID

然后在 jobname.lub 添加一行 [jobtbl.JT_POKEMON_PIKACHU] = "PIKACHU",其中:

  • JT_POKEMON_PIKACHU: 和 npcidentity.lub 定义的字符串保持一致
  • PIKACHU: 就是在 GRF 中魔物的图档名称

注意,NPC 人物和 魔物 是共用一套外观池的。早期的时候, npcidentity.lub 把小于 1000 的图档 ID 预留给 NPC,大于 1000 的都是魔物。现在已经没有这个限制了。

0x22 为魔物某些动作添加效果音(可选)

例如我们希望「皮卡丘」被攻击时,会发出像老鼠一样的「吱」一声,应该怎么做呢?

首先,音效文件你需要自己准备,或者到 GRF 里面的 data/wav 下挑选也可以。

其次需要把「皮卡丘」的图档文件 PIKACHU.actPIKACHU.spr 提取出来:

然后使用 Act Editor 等工具编辑 PIKACHU.act,选择状态 3 - Receiving Damage(受到伤害时):

接着选择这个状态中间的某一帧,譬如 2/4 frames,为这一帧添加声音: Frame sound -> Add new ...

输入的音效名称 pikachuscream.wav ,确保这个文件在 data/wav 下存在即可:

0x30 验证效果

此时进入游戏,去首都南门外,就能遇见我们添加的「皮卡丘」了:

备用视频源:youtube

0x40 魔物图档映射

有时候我们没有魔物图档,但是又想添加自定义魔物,应该怎么做呢?

譬如我想添加「雷丘」,但是没有「雷丘」的图档。

首先还是要在魔物库 db/re/mob_db.yml 添加其设定:

  - Id: 20173
    AegisName: RAICHU
    Name: 雷丘
    JapaneseName: 雷丘
    ... ...

对魔物 ID 的范围要求还是一样的,但是因为不存在图档,AegisName 可以随意使用一个任意的唯一字符串。

随后直接编辑魔物外观的映射表 db/import/mob_avail.yml (如果文件不存在,新建即可),内容如下:

Header:
  Type: MOB_AVAIL_DB
  Version: 1

Body:
  - Mob: RAICHU
    Sprite: BONE_DETALE
  - Mob: ...
    Sprite: ...

其中 RAICHU 是「雷丘」的 AegisNameBONE_DETALE 是官方存在的图档的一只魔物,意为把 RAICHU 映射到 BONE_DETALE 图档:

此时配置就完成了,进入游戏使用命令 @monster 20173 召唤「雷丘」看一下效果:

魔物掉落、魔物技能等和正常魔物一样配置即可,客户端不用做任何配置

0xF0 参考文档

最后提醒一下,如果检查任何地方的设定都没问题,但就是无法用 @monster 等命令把魔物召唤出来,有可能就是 ID 范围不对,换个 ID 可能就没问题了。


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
  目录