Skip to content

权重 ​

权重的用法: 给每个结果标一个数, 抽取时按它占所有结果总和的比例决定概率, 用在随机池, 品质池, 奖励池和保底逻辑里, 不用手写固定百分比

权重是什么 ​

权重就是用数字描述相对概率: 每个结果分配一个数值, 抽取时按数值占总和的比例决定概率

如果一个池中有三个结果:

yaml
pool:
  common: 80
  rare: 15
  epic: 5

总权重是 100, 抽取时:

  • common 约 80%
  • rare 约 15%
  • epic 约 5%

换成下面这样写:

yaml
pool:
  common: 8
  rare: 1.5
  epic: 0.5

比例还是一样 (总权重 10, common 80%, rare 15%, epic 5%). 权重只看相对关系, 不要求总和必须是 100

概率计算公式 ​

单个结果的实际概率这么算:

text
概率 = 该结果权重 / 所有结果权重之和

举个例:

yaml
pool:
  common: 700
  uncommon: 200
  rare: 80
  epic: 18
  legendary: 2

总权重 = 1000

结果权重概率
common70070%
uncommon20020%
rare808%
epic181.8%
legendary20.2%

权重为 0 或负数的条目会被丢弃, 不参与抽取; 若所有条目权重之和不为正数, 抽取不返回任何结果

使用场景 ​

场景示例
锻造品质普通, 优秀, 稀有, 史诗, 传说
奖励池完成烹饪后随机给副产物
宝石升级成功, 失败, 降级, 保护
强化结果成功, 失败, 破裂, 保底成功
技能奖励随机解锁某一类技能
材料贡献不同材料对品质的贡献权重
掉落表怪物击杀后的随机掉落

权重池配置 ​

基础格式 ​

最简单的权重池写法, 就是每行一个结果名加一个数值:

yaml
quality:
  enabled: true
  custom_pool:
    common: 70
    rare: 25
    epic: 5

带条件的权重池 ​

有些模块能根据条件动态调整权重:

yaml
quality:
  enabled: true
  custom_pool:
    common: 70
    rare: 25
    epic: 5
  material_bonus:
    rare_material:
      rare: 10
      epic: 5

也就是: 用稀有材料时, rare 权重从 25 提升到 35, epic 从 5 提升到 10

权重表达式 ​

有些模块允许权重值直接写表达式:

yaml
quality:
  custom_pool:
    common: '100 - %material_score%'
    rare: '%material_score% * 0.5'
    epic: '%material_score% * 0.2'

这样品质概率就能随材料分数动态变化. 具体支不支持表达式, 看调用模块的实现

保底逻辑 ​

保底就是防这个的: 连续失败或连续低品质达到阈值后, 系统会把下一次结果抬升到最低结果

保底不是 CoreLib 的能力: CoreLib 自带的加权池 (WeightedPool) 只做加权抽取, 不带保底和计数器这类逻辑. 保底由消费模块各自实现, 键名与默认值以该模块为准. EmakiForge 是当前实现保底的模块, 它在全局与配方两级使用不同的键名:

字段类型必填默认值取值范围说明
quality.guarantee.enabled (全局 config.yml)boolean否插件自带的配置是 true (代码里的默认是 false)true, false是否启用最低品质保底
quality.guarantee.threshold (全局)integer否10正整数连续多少次未达到 minimum 后应用保底
quality.guarantee.minimum (全局)string否普通 (找不到品质时回退 default_tier)已定义的品质名保底触发后应用的最低品质名
quality.guarantee.enabled (单配方)boolean否falsetrue, false同上, 但按配方生效
quality.guarantee.attempts (单配方)integer否10正整数单配方版的 threshold
quality.guarantee.minimum (单配方)string否普通已定义的品质名该配方的最低品质名

全局配置里写 attempts, 或单配方里写 threshold, 都不会报错, 而是直接按默认值 10 处理

保底配置示例 ​

yaml
# 单配方形态: 连续 60 次未达品质后抬升到"无暇"
quality:
  enabled: true
  custom_pool: []
  guarantee:
    enabled: true
    attempts: 60
    minimum: "无暇"

保底工作原理 ​

  1. 每次抽取结果低于 minimum 时, 计数器 +1
  2. 计数器达到阈值 (全局 threshold, 或单配方 attempts) 时, 下一次抽取强制从 minimum 及以上的结果中选择
  3. 抽取到 minimum 或更高结果时, 计数器重置为 0

保底不是通用能力: 只有实现了它的模块才会读取 guarantee, 其他模块的权重池不受影响. 具体键名, 默认值与作用域以 EmakiForge 品质 为准

多池与嵌套 ​

有些模块支持多个权重池嵌套或分层:

yaml
# 先抽大类, 再在大类内抽具体结果
reward:
  category_pool:
    equipment: 30
    material: 50
    currency: 20
  equipment_pool:
    sword: 40
    armor: 35
    accessory: 25
  material_pool:
    common_ore: 60
    rare_ore: 30
    gem_fragment: 10

嵌套池具体怎么支持, 看调用模块的实现

概率验证方法 ​

如果你想验证配置的实际概率分布:

  1. 在测试服使用模块提供的批量测试命令 (如果有)
  2. 或者写一个简单脚本模拟抽取:
yaml
# 假设总权重 100
# common=70, rare=25, epic=5
# 抽取 1000 次, 预期:
#   common ≈ 700 次
#   rare ≈ 250 次
#   epic ≈ 50 次
  1. 实际结果会有波动, 这是正常的随机行为. 样本量越大, 越接近理论概率