前置知识
注意:本章的学习压力较大与综合运用能力较强,请在确保学习甚至熟悉完前置知识的前提下再阅读本章节,否则一切“后果自负”。
示例
属性词条
首先,在本文正式讲解如何制作随机词条物品之前,请读者抛弃原有一切对于随机词条物品的观念,基于AzureFlow对数据把控的视角,重新理解随机词条物品的制作与生成。
我们规定,拥有如下格式的字典,即为一条属性词条数据:
其中,name
即为该属性的名称,value
即为该属性的值。
例如下述属性词条数据:
data:
physical_damage: '{ name: "物理攻击", value: 100 }'
physical_damage_name: 'physical_damage.name' # 使用字典访问值的方式获取属性名称
physical_damage_value: 'physical_damage.value' # 使用字典访问值的方式获取属性值
import:
module:
random: 'random'
data:
magic_defence: '{ name: "魔法防御", value: random.double(100) }' # 使用随机模块进行随机值
magic_defence_name: 'physical_damage.name' # 使用字典访问值的方式获取属性名称
magic_defence_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)重复随机
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.sample(3)' # 无权不重复随机
weighted_attributes: '_attributes.sample(3, [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]),
# ... 以此类推
)'
import:
module:
random: 'random'
define:
_quality: '["普通", "精良", "史诗", "传说"]' # 定义品质数据
_attributes: '{
# 当品质为普通时, 仅随机物理攻击、物理防御、魔法攻击, 权重为 100:50:10
普通: [
{ name: "物理攻击", value: random.int(1, 100) }, # 不同条件下的待随机词条
{ name: "物理防御", value: random.int(1, 100) },
{ name: "魔法攻击", value: random.int(1, 100) },
],
# 当品质为精良时, 仅随机魔法攻击、魔法防御,权重为 40:50
# 且当随机到魔法攻击时,根据玩家等级进行随机(等级>=100级, 随机100~200, 否则随机1~100)
精良: [
{ name: "魔法攻击", value: when(player.level >= 100, random.int(100, 200), random.int(1, 100) ) }, # 不同条件下的待随机词条
{ name: "魔法防御", value: random.int(1, 100) },
],
史诗: [
# 略...
],
传说: [
# 略...
],
}'
data:
quality: '_quality.sample(1, [1000, 100, 10, 1])' # 权重随机品质数据
attributes: '_attributes[quality].sample(2)' # 这个地方进行权重随机可能会比较麻烦, 留给读者自行思考
展示词条数据
目前为止,我们已经实现了词条数据的定义、获取与随机,接下来我们将得到的随机词条数据展示到物品上去,这里笔者将提供一个函数,可以将属性词条数据转变为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
至此,已完成了随机属性词条物品的制作。
效果展示
待完工。。。
总结
本文实现了多策略下的随机词条物品,读者可自行发挥其他脚本与功能,实现功能更为强大,数据更为健壮的物品。
如果你有耐心与勇气看到这里,说明你对于AzureFlow的理解与认识进一步提升了,欢迎你继续使用AzureFlow为服务器增添更多精彩的内容!
Good Luck :)