简体中文
权重
权重的用法: 给每个结果标一个数, 抽取时按它占所有结果总和的比例决定概率, 用在随机池, 品质池, 奖励池和保底逻辑里, 不用手写固定百分比
权重是什么
权重就是用数字描述相对概率: 每个结果分配一个数值, 抽取时按数值占总和的比例决定概率
如果一个池中有三个结果:
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
| 结果 | 权重 | 概率 |
|---|---|---|
| common | 700 | 70% |
| uncommon | 200 | 20% |
| rare | 80 | 8% |
| epic | 18 | 1.8% |
| legendary | 2 | 0.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 | 否 | false | true, 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: "无暇"保底工作原理
- 每次抽取结果低于
minimum时, 计数器 +1 - 计数器达到阈值 (全局
threshold, 或单配方attempts) 时, 下一次抽取强制从minimum及以上的结果中选择 - 抽取到
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嵌套池具体怎么支持, 看调用模块的实现
概率验证方法
如果你想验证配置的实际概率分布:
- 在测试服使用模块提供的批量测试命令 (如果有)
- 或者写一个简单脚本模拟抽取:
yaml
# 假设总权重 100
# common=70, rare=25, epic=5
# 抽取 1000 次, 预期:
# common ≈ 700 次
# rare ≈ 250 次
# epic ≈ 50 次- 实际结果会有波动, 这是正常的随机行为. 样本量越大, 越接近理论概率