采用多策略的随机词条物品

前置知识

示例

属性词条

首先,在本文正式讲解如何制作随机词条物品之前,请读者抛弃原有一切对于随机词条物品的观念,基于AzureFlow对数据把控的视角,重新理解随机词条物品的制作与生成。

我们规定,拥有如下格式的字典,即为一条属性词条数据

{ name, value }

其中,name即为该属性的名称,value即为该属性的值。

例如下述属性词条数据:

data:
  physical_damage: '{ name: "物理攻击", value: 100 }'
  physical_damage_name: 'physical_damage.name' # 使用字典访问值的方式获取属性名称
  physical_damage_value: 'physical_damage.value' # 使用字典访问值的方式获取属性值

随机属性词条

基于上述规定以及定义好的属性词条数据(其实本质上就是一个字典{}),本文接下来将介绍如何制作随机的属性词条。

首先,将一堆属性词条数据放在一个列表[]中,方便后续进行随机,示例如下:

import:
  module:
    random: 'random'

define: # 这里先使用 define
  _attributes: '[
    { name: "物理攻击", value: random.int(1, 100) },
    { name: "物理防御", value: random.int(1, 100) },
    { name: "魔法攻击", value: random.int(1, 100) },
    { name: "魔法防御", value: random.int(1, 100) }
    # ... 可以自行添加更多, 本文不做过多
  ]'

如上述配置所示,我们定义一个属性列表_attributes,里面包含了四个属性词条数据,并且属性值为1~100的随机整数值。

但是_attributes仅在define配置项中,真正的物品还没有属性词条数据,因此,我们将根据列表随机来随机出相关属性词条数据作为后续使用,如下例所示:

import:
  module:
    random: 'random'

define:
  _attributes: '[
    { name: "物理攻击", value: random.int(1, 100) },
    { name: "物理防御", value: random.int(1, 100) },
    { name: "魔法攻击", value: random.int(1, 100) },
    { name: "魔法防御", value: random.int(1, 100) }
    # ... 可以自行添加更多, 本文不做过多
  ]'

data:
  attributes: '_attributes.choice(2)' # 无权重复随机
  weighted_attributes: '_attributes.choice(2, [10, 8, 6, 4])' # 有权(10, 8, 6, 4)重复随机

小提示:

上述的配置中,数据中的attributes实际上是一个包含了两个随机词条数据的列表,其结构大致如下:

[
  {name: "物理攻击", value: 85},
  {name: "物理防御", value: 37}
]

自定义添加条件随机

目前为止,我们已经实现了随机词条数据,但是这里肯定会有读者有疑问,“这里仅仅进行了最简单的数据随机,如果我想根据玩家的等级进行随机,抑或是根据物品的其他数据(例如武器品质等)来进行策略化的随机,这该怎么实现呢?”,诸位稍安勿躁,且听本文继续娓娓道来。

根据上文的配置,我们不难发现,最关键的地方在于_attributes.choice/sample,因此,我们只需要在进行数据随机时进行额外判断即可,本文以when为例,如下例所示:

import:
  module:
    random: 'random'

define:
  _quality: '["普通", "精良", "史诗", "传说"]' # 定义品质数据

data:
  quality: '_quality.sample(1, [1000, 100, 10, 1])' # 权重随机品质数据
  attributes: 'when(
    # 当品质为普通时, 仅随机物理攻击、物理防御、魔法攻击, 权重为 100:50:10
    quality == "普通",
    [ 
      { name: "物理攻击", value: random.int(1, 100) }, # 不同条件下的待随机词条
      { name: "物理防御", value: random.int(1, 100) },
      { name: "魔法攻击", value: random.int(1, 100) },
    ].sample(2, [100, 50, 10]),
    # 当品质为精良时, 仅随机魔法攻击、魔法防御,权重为 40:50
    # 且当随机到魔法攻击时,根据玩家等级进行随机(等级>=100级, 随机100~200, 否则随机1~100)
    quality == "精良", 
    [ 
      { name: "魔法攻击", value: when(player.level >= 100, random.int(100, 200), random.int(1, 100) ) }, # 不同条件下的待随机词条
      { name: "魔法防御", value: random.int(1, 100) },
    ].sample(2, [40, 50]),
    # ... 以此类推  
  )'

展示词条数据

目前为止,我们已经实现了词条数据的定义、获取与随机,接下来我们将得到的随机词条数据展示到物品上去,这里笔者将提供一个函数,可以将属性词条数据转变为Lore,读者无需过分在意实现原理(其原理涉及到javascript代码,如果有能力可以自行修改),使用如下:

首先,在插件文件夹plugins/AzureFlow/global文件夹下,新建文件attribute.utils.js,并复制粘贴如下内容:

function renderAttributeLore(attribute) {
  // 属性名的颜色, 默认为黄色
  var nameColor = attribute.color || "&e";
  // 属性名
  var name = attribute.name;
  // 属性值
  var value = attribute.value;
  // 属性值的颜色, 默认为白色
  var valueColor = attribute.valueColor || "&f";
  return nameColor + name + ": " + valueColor + value + "&r"
}

function renderAttributeLores(attributes) {
  return attributes.map(renderAttributeLore);
}

上述脚本提供了一个将属性词条数据根据一定规则转变为对应的Lore的功能,如果读者有能力,可自行修改部分代码以满足需求。

综上,我们现在已经添加了一个功能性函数,接下来只需要运用在物品配置中即可,如下例所示:

import:
  module:
    random: 'random'

define:
  _quality: '["普通", "精良", "史诗", "传说"]' # 定义品质数据

data:
  quality: '_quality.sample(1, [1000, 100, 10, 1])' # 权重随机品质数据
  attributes: 'when(
    # 当品质为普通时, 仅随机物理攻击、物理防御、魔法攻击, 权重为 100:50:10
    quality == "普通",
    [ 
      { name: "物理攻击", value: random.int(1, 100) }, # 不同条件下的待随机词条
      { name: "物理防御", value: random.int(1, 100) },
      { name: "魔法攻击", value: random.int(1, 100) },
    ].sample(2, [100, 50, 10]),
    # 当品质为精良时, 仅随机魔法攻击、魔法防御,权重为 40:50
    # 且当随机到魔法攻击时,根据玩家等级进行随机(等级>=100级, 随机100~200, 否则随机1~100)
    quality == "精良", 
    [ 
      { name: "魔法攻击", value: when(player.level >= 100, random.int(100, 200), random.int(1, 100) ) }, # 不同条件下的待随机词条
      { name: "魔法防御", value: random.int(1, 100) },
    ].sample(2, [40, 50]),
    # ... 以此类推  
  )'

computed:
  attributes_lore: 'renderAttributeLores(attributes)'

display:
  name: 随机词条属性物品
  lore:
    - '&7随机属性:'
    - '${attributes_lore}' # 使用列表自展开特性一键展开Lore

至此,已完成了随机属性词条物品的制作。

效果展示

待完工。。。

总结

本文实现了多策略下的随机词条物品,读者可自行发挥其他脚本与功能,实现功能更为强大,数据更为健壮的物品。

Last updated