Files
gplan-2/docs/proposal-skill-pool.md
T

261 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 敌人技能池出招系统提案
> 一句话:废除确定性行为环,改用"技能池 + 开轮摇号"决定敌方每次行动——本文收拢全部拍板记录、逐维度设计、登记约束回应与实施批切分。
> 状态:已定稿(2026-09-16 全部决策点拍板收口)
> 性质:提案/评审件,不在 GDD 规范树内;本文不改任何既有文件,所登记的修订面随实施批落进各系统文档(见 §7)
> 前置:实施批排在 AC 掷点批落批之后(该批文件集 `core/`、`enemy.tres`、结算文档冻结中)
## 1. 方向复述与拍板记录
已拍板方向:废除现行确定性行为环(地精单拍环、熊地精三拍环、食人魔酋长四拍 Boss 环、全场同种锁步同拍、死亡冻结指针),改为技能池——每个敌种一张技能池,池元素是带出招权重的技能行,每一拍从池中摇一个技能执行,出招序列不再固定;蓄力不再绑死重击前奏;质感目标 = 动作游戏怪物 AI:以普通攻击为基底,随机时机出特殊技。
对话裁决全记录(均为 2026-09-16;"纠偏"= 用户对早期口径的修正,一律以纠偏后为准):
| # | 决策点 | 定稿口径 |
|---|---|---|
| 方向 | 出招系统 | 每敌种一张技能池(带权重技能行),每拍摇号出招;固定出招剧本废除 |
| D1 | 抽取机制 | 权重份额归一 + 双闸;纠偏后闸形态 = 全技能各自冷却 + 保底;条件触发器后置 |
| D2 | 数据结构 | 池模板内嵌敌行 + 技能定义独立技能表(skill_id 引用共享) |
| D3 | 蓄力处置 | 蓄力 = 独立的 0 伤害增益技;原子连招技否决;前摇属性不引入 |
| D4/D5 | 可见性 | 池与权重不公开、不做技能池界面;特殊技开轮类型级技能动画(纯提醒);普通攻击零表示 |
| D6 | 随机流 | behavior_roll 主流 + 每敌按生成序派生独立子流 |
| D7 | 新技扩展 | 每敌种 +1 新技位;敌方防御池进切片(硬化技) |
| D8 | 伤害公式 | 三乘法链落战斗结算(§6) |
| D9 | 实现纪律 | 封装对象、高内聚低耦合、禁一次性脚本(§2.2) |
| 纠偏一 | 冷却模型 | **所有技能各带冷却字段**(普通攻击冷却恒 0);技能冷却与增益持续是两个计时器;保底保留。早期"冷却只锁高伤技"口径作废 |
| 纠偏二 | 蓄力语义 | **蓄力 = 纯"攻击力增加"增益技,与重击无任何组合语义**——旧环"蓄力→猛击"是哥布林弹珠的拷贝,观念与相关文档表述一并清除;增益与倍率同拍只是两层乘法共存 |
| 纠偏三 | 增益纪律 | **每池增益类技能 ≤1**——非 RPG,怪物连出不同增益显得呆 |
| 纠偏四 | 概念区分 | 行动轮概念**完全退役**;nat20 暴击(掷点层)≠ 技能重击(池技能),两层严格区分 |
| A | 同种多敌 | 一份池模板 + 每实例自己的实例池(快照 + 冷却状态),独立摇号;轨迹分歧是涌现,开战分配机制不存在;个体化变体池标 P1 |
| B | 摇号时点 | **开轮摇号**:技能选择前置到轮次开始,数值计算留在结算段 |
## 2. 逐维度设计
### 2.1 抽取机制:权重份额归一 + 全技能各自冷却 + 保底
每个敌实例每一拍做什么,由一次摇号决定:把它实例池里冷却中的技能排除,剩下的技能按权重份额归一摇一个。**中签率 = 该技能权重 ÷ 当前可摇技能权重合计**——权重是份额不是固定百分比,排除谁,谁的份额按比例摊给其余技能。
示例(熊地精池:基础攻击 6 · 蓄力 2 · 重击 2):
| 回合 | 可摇集合 | 基础攻击 | 蓄力 | 重击 |
|---|---|---|---|---|
| 第 1 拍 | 全部(合计 10) | 60% | 20% | 20% |
| 第 2 拍(第 1 拍摇中重击,重击冷却 3 拍) | 普攻+蓄力(合计 8) | 75% | 25% | 0%(冷却中) |
| 第 3 拍(第 2 拍若摇中蓄力) | 仅普攻 | 100% | 0%(冷却中) | 0%(冷却中) |
开轮摇号时序(共识点 B 定稿):
```
开轮(轮次开始):每实例 冷却递减 → 排除冷却中技能 → 按行序逐敌摇定本拍行动(behavior_roll 各敌子流)
挖掘期:按摇定结果播动画(特殊技 = 技能动画,普通攻击 = 零表示)
结算段:按技能行兑现——AC 掷点、三乘法链、增益挂接、明细落行(与现行完全相同)
判定段之后进入下一轮开轮……
```
时点细则:首轮同样开轮摇号;每轮恰摇一次,挖掘期中途刷新换图不重摇;摇定后、兑现前死亡(主角先手 / 授予段直伤)→ 本拍技能作废、不动手(死亡即不动手,与现行同构)。
两道闸:
| 闸 | 语义 | 建议值(provisional,归难度曲线) |
|---|---|---|
| 技能冷却 | 每技能行带冷却拍数;施放后连续 N 拍不可摇中;普通攻击恒 0 | 普攻 0 · 突刺 2 · 蓄力 3 · 重击 3 · 硬化 4 |
| 保底 | 连续 M 拍执行的都是普通攻击 → 下一拍必出特殊技(特殊技内按权重,不受冷却限制) | M = 4 |
结构保证与校验:普通攻击冷却恒 0 → 池恒非空,最坏情况(全部特殊技同时进冷却)怪物平砍等待,那是玩家的反打窗口而非死拍。加载期校验兜底:每池恰一行普通攻击、增益技 ≤1、池条目 skill_id 悬空致命、权重 > 0、冷却 ≥ 0,违规拒绝入表。
连发账:同一技能连发不可能(自身冷却杜绝);异名特殊技背靠背可能但概率低(上例 ≈14%,任意两拍"特殊→特殊" ≈3.6%),是变化不是失控。不建议全局特殊间隔闸——它会把节奏变成可背诵的"特殊→N 平砍→特殊",标 P1 备用旋钮。
摇号只决定"做什么";伤害多少由三乘法链在结算段算(§6)。
### 2.2 数据结构与封装切分
三层对象,模板与实例分离(共识点 A 定稿):
| 层 | 对象 | 载体 | 职责 |
|---|---|---|---|
| 定义层 | 技能行 | 独立技能表(数据配置承载、敌人系统回填) | 技能是什么:类型、倍率、冷却、效果引用——多敌种共享 |
| 定义层 | 池模板 | 内嵌敌行 pool 数组:{skill_id, weight} | 敌种用什么、多常用——难度曲线的调参单点 |
| 实例层 | 实例池 | 单位实例(开战把模板快照一份) | 这一只在什么状态:各技能冷却剩余、活跃增益、摇号轨迹 |
生成流程:开战 → 读敌行池模板 → 每实例快照出自己的实例池(冷却全零)→ 此后各自独立摇号、互不干涉。怪物 1 的猛击在冷却里不影响怪物 2。与现行"生成拿到当时的表值快照、之后改表不影响已生成单位"同一条快照纪律,池纳入快照范围。
技能行字段词汇表:
| 字段 | 适用类型 | 说明 |
|---|---|---|
| skill_id | 全部 | 主键,池条目引用键 |
| display_name | 全部 | 玩家可见名(明细行与动画共用) |
| type | 全部 | 封闭枚举 {普通攻击, 伤害, 增益};新类型走文档修订(同现行行为拍枚举纪律) |
| damage_mult | 仅伤害 | 伤害倍率;域 [1.1, 16] provisional。普通攻击恒 1、不可配 |
| cooldown_beats | 全部 | 施放后连续 N 拍不可摇中;普通攻击恒 0、不可配 |
| buff_ref | 仅增益 | 效果引用,指向既有状态效果行(现有效应词汇) |
| buff_duration | 仅增益 | 增益持续回合数(结算数) |
| P1 字段位 | — | 触发条件、命中段数、目标数、固定值分量——随对应后置批加列 |
普通攻击也是一行技能行(type=普通攻击),两条域校验锁死它的特殊性:倍率恒 1、冷却恒 0——想配倍率或冷却的就不是普攻,是伤害技。
技能伤害存倍率、不存固定值:伤害 = 施放者攻击基线 × 技能倍率(§6 第一乘)。同一行"猛击",地精用是 7×2=14,熊地精用是 9×2=18,深层强化行自动缩放——这是共享技能表成立的前提;固定值分量若将来需要,是加字段的事(P1)。增益技带效果引用与持续回合,百分比天然按施放者生效,无缩放问题。
封装纪律(D9):抽签器是独立服务类(输入实例池与随机子流、输出技能 id,不碰血量不碰表);战斗段只做编排;单位容器保持零随机零事件——摇号的执行方是战斗结算换算层,单位收到的是确定结果(与 armor_roll 先例同构)。禁止一次性强耦合脚本。
### 2.3 蓄力与旧概念清除
蓄力不是重击前奏:它是一行增益技——0 伤害动作,施加"攻击×2"状态,持续 1 结算(provisional)。旧环"蓄力→猛击"的固定配对是哥布林弹珠的拷贝(给玩家输出窗口用的),随行为环一并退役;蓄力与重击之间**没有任何组合语义**——增益与技能倍率恰好同拍只是两层乘法共存(×2 遇 ×2 = ×4),蓄力后摇中普通攻击则是基线×2 的加成平砍,两者同为平常事,不是设计的连招。
两个计时器严格分账:**技能冷却**(几拍内不能再摇中,技能行属性)与**增益持续**(状态挂几回合,状态行属性)互不相干。
增益纪律(纠偏三):每池增益类技能 ≤1。结构红利:增益存续期内下一拍必是伤害技(池里其余全是伤害技、增益自身还在冷却),**增益不可能白白过期**——"连出不同增益显得呆"的场景被池构成纪律结构消除。
敌方增益走既有增益状态容器(新状态行入状态表、新池映射随批登记 registry)。旧蓄力拍"零兑付、不读伏击"的语义由增益技继承:0 伤害技能不兑付伏击——"本轮喂的伏击若逢增益拍不兑现"的读怪奖励保留。
前摇(telegraph)不作为技能属性引入(D3 显式裁决):规划窗口由开轮摇号 + 类型级动画承担(§2.4),旧"蓄力拍 = 规划窗口"的职责由它替代。
Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行建议:酋长池含独占增益技"硬化")。旧"专属四拍环且含蓄力拍"约定随批改写(§7)。
### 2.4 可见性
池与权重不公开、无技能池界面(D4/D5 裁决)。摇号结果的信息面分三档:
| 摇中 | 挖掘期呈现 | 结算揭示 |
|---|---|---|
| 普通攻击 | 普通动画,零特殊表示 | 明细行"普通攻击(暴击/被压制)" |
| 特殊技 | 技能动画(攻击系/防御系不同)——纯动画提醒,无额外语义 | 明细行具名技能 + 数值 |
| nat20 暴击 | 无前置动画(掷点层,与技能重击严格区分) | 明细行"(暴击)"标注 |
即:普攻完全不可预测;特殊技有一次类型级预告,不可撤销,但给"继续挖还是停手"的决策依据。信息量比旧环少(不预告技能名与数值)、比全隐藏多,落在动作游戏怪物 AI 的纹理上。
HUD 替代位(ring_size/ring_index 环点行拆除):敌人卡意图徽标语义改为"本拍摇定结果的动画占位";具体视觉规格归战斗表现与 HUD 框架批。
### 2.5 切片范围与建议池内容
切片做:三敌种池化(EV 中性锚定)+ 敌方防御池新词汇 + behavior_roll 子流 + HUD 替代位 + 开轮摇号编排 + 文档与 registry 修订清单落地(§7/§8)。后置项见 §9。
建议池内容(全部 provisional,投值归难度曲线):
| 敌种 | 池(权重) | 每拍 EV | 相对现行环 |
|---|---|---|---|
| 地精 | 普攻 9 · 突刺 1(新行:伤害 ×1.5,冷却 2) | 1.05 | +5%,显式登记 |
| 熊地精 | 普攻 6 · 蓄力 2 · 重击 2 | 1.00 | 中性 |
| 食人魔酋长 | 普攻 6 · 重击 2 · 硬化 2(新行:自防增益,敌方防御池词汇载体;旧蓄力拍退役、不进 Boss 池——增益 ≤1 纪律) | 1.00 | 中性 |
EV 锚定说明:含 0 伤害技能的池要保 EV=1.0,伤害技权重须抵偿增益权重份额(例:重击权重 = 硬化权重恰好中性);像突刺这种倍率 >1 的新技必然抬 EV(正权重配不平),偏移量显式登记难度曲线、不硬凑。EV 锚按含闸长期速率在实施批复核。熊地精若复用突刺行,即共享技能表的活证明(候选)。
## 3. 现行环 → 技能池对照表
| 面 | 现行行为环 | 技能池(本提案定稿) |
|---|---|---|
| 出招决定 | 环序列 + 指针,步数取模,零随机 | 实例池权重摇号(开轮时点) |
| 同步性 | 同种永远同拍(锁步) | 各实例独立摇号、独立冷却 |
| 蓄力 | 重击前奏空拍(固定配对) | 攻击增益技(1 结算过期),无组合语义 |
| 死亡 | 轮到前被杀,指针冻结 | 摇定技作废、不动手(死亡即不动手不变) |
| 可见性 | 下一拍全程亮出(意图徽标 + 环点) | 特殊技开轮类型级动画、普攻零表示、池与权重不公开 |
| 随机 | 系统零随机 | behavior_roll 封闭流、每敌子流、可回放 |
| 表结构 | pattern 环数组(拍枚举封闭) | 技能表 + 敌行池模板 + 实例池 |
| 调参 | 环读数、倍率 | 池 EV、权重/冷却/保底(难度曲线) |
| 拍结构 | 每结算各行动一次、行序、先作用后推进 | **不变** |
## 4. 七条登记约束的逐条回应
**约束一(随机价值观兑现)**:进回合内的随机共两源——技能身份摇号(离散、具名、开轮时点)与 AC 掷点(数值、结算段)。固定出招剧本废除即本方向的兑现;"每拍数值抖动"的口子不开:每个技能实例的伤害由基线×倍率确定,随机器只决定技能身份与 AC 判断值。摇号时点前置到开轮是动画呈现诉求的代价,可回放契约不破(约束二)。
**约束二(零随机纪律修订面)**:敌人系统自身语义零随机不变(收到确定结果);随机消费在战斗结算换算层新开封闭流 behavior_roll——STREAM_NAMES 增名、计数器、registry salt、derive 向量(armor_roll 先例同构);每敌按生成序派生子流,单敌出招轨迹可独立复放、互不穿插。文档修订面:敌人系统结构冻结清单"零随机"注记随行为环退役改写;战斗结算随机消费清单两处 → 三处(开战掷骰 = 初始化随机;技能摇号 = 回合内、开轮时点、结算步骤流之外;AC 掷点 = 回合内、步骤流之内);可回放契约扩写为"三处皆封闭流,同种子同输入逐位复现"。
**约束三(数字可读性锚)**:技能抽取 ≠ 数值抖动——抽的是离散具名的动作,明细行带技能名与倍率,数字仍由基线×倍率确定。"下一拍出什么"的可见性方案 = §2.4 三档;HUD ring_size/ring_index 显示位拆除,替代 = 摇定结果动画位 + 具名明细行。
**约束四(蓄力拍退役与前摇)**:删行为环时固定蓄力拍自动退役(登记收口);前摇 telegraph 显式裁决为**不引入**——规划窗口职责由开轮预告承担;蓄力改为增益技(§2.3)。
**约束五(AC 掷点批耦合)**:判定对象措辞随池化改述,四处对照见 §6;暴击(nat20 ×2)、折扣档位(下限 ×0.25)、伤害下限 max(1,·) 全部挂在伤害实例上、语义不变;伏击附加必中全额、后置加法不进乘区。落批后随技能池实施批收编,AC 批落批前不动。
**约束六(难度曲线纪律联动改写)**:"每关至少投放一项新内容(新敌种或既有敌种新行为环段)"→"新敌种或既有池新技能";"保持行为环读数不变、数量优先"→"保持技能池 EV 读数不变(权重即旋钮、投值归难度曲线)";Boss 约定"专属四拍环且含蓄力拍"→"专属池(独占技 + 权重轮廓)";调参表 pattern 列改池列,新增权重、冷却、保底投值域;生存链区间模型的受伤峰值/谷值构成按含闸长期速率复核,EV 中性锚定、现行行值不重调。
**约束七(方差预算)**:见 §5。
## 5. 熵预算与方差对照
| 随机源 | 时点 | 每次熵 |
|---|---|---|
| d20 AC 掷点(既有) | 结算段,每伤害实例 | log2(20) ≈ 4.32 bit |
| 技能摇号(新增) | 开轮,每实例 | 0.47–1.37 bit(建议池);四技均分上限 2 bit |
| 开战掷骰(既有) | 初始化 | 不变 |
技能摇号与单次 d20 同量级或更小,且承载的是结构多样性(出哪个动作)而非数值噪声——离散、具名、可归因。
锁步峰值的新形态(旧 D3 三敌同轮重击 12–54 问题的账):
- 旧环:同步轮转定理 → 每 3 拍**必然**全体重击(概率 100% 的结构性峰值,周期可背诵)。
- 池化(建议权重 6/2/2,EV 中性):单敌重击率 20%,三敌同拍全重击 ≈ 0.8%/拍;长期输出速率由 EV 锚定不变;冷却闸削簇(同敌重击后必隔数拍),保底闸削旱季。峰值从"必然周期"变"低概率事故",分布形状(重击频率)是难度曲线的自由调参维度——想要更高频重击就抬权重,EV 随之重锚。
## 6. AC 规格修订措辞建议
**三乘法链**(结论先行:技能倍率乘在最前,AC 判断值与甲效依次乘上去,其后既有链一字不动):
```
① 攻击伤害值 A = 攻击基线 × 技能伤害倍率 (普通攻击倍率恒 1;主角侧恒 1)
② AC 判断值 a:d20 vs 防守方护甲等级
掷点 < AC → 档位折扣(量程下限 ×0.25);nat20 → 暴击 ×2(量程上限)
③ 命中伤害 H = (A × a) × 甲效倍率 (克制 1.5 / 中性 1.0 / 被克 0.5;敌打主角无甲轴恒中性)
── 以下既有链不动 ──
增益池乘区(含新敌方防御池)→ 伏击附加(后置加法、必中全额、不吃 AC)→ 向下取整 → 伤害下限 max(1,·)
```
判定对象措辞修订(落点 = 战斗结算.md,伤害合成链的 owner;敌人系统只供技能行数据):
| 位置 | 现行措辞 | 建议措辞 |
|---|---|---|
| 战斗段正文 | 敌方攻击拍与重击拍的基线伤害(基线 × 重击倍率) | 敌方技能的基础伤害分量(= 攻击基线 × 技能伤害倍率);无伤害分量的技能(增益类)不掷不折 |
| 公式行 | 吃掷点分量 = 主角普通分量 / 敌方攻击拍与重击拍基线 | 吃掷点分量 = 主角普通分量 / 敌方技能基础伤害分量 |
| 调参表边界行 | (主角普通分量、敌方攻击/重击拍基线) | (主角普通分量、敌方技能基础伤害分量) |
| 验收标准 | 敌方攻击/重击拍基线 | 敌方技能基础伤害分量 |
不变项:nat20 ×2、档位折扣、伤害下限、伏击必中后置、逐次掷逐次取号(未来多段命中 = 每段一掷,P1 预留)。
## 7. 修订面清单(按文档)
跨三个循环 + 两个横切件;排雷循环零触及(挖掘期、行动经济、棋盘、道具、变异全不碰)。跨循环不是范围蔓延——按引用纪律的删除概念流程查"行为环"反向边,其读数本被织入曲线纪律与呈现义务,影响面即下表。
| 循环 | 文档 | 修订面 | 深度 |
|---|---|---|---|
| 战斗循环 | [敌人系统](../design/gdd/systems/战斗循环/敌人系统.md) | 主 owner:行为环章节退役,技能池/技能行/实例池/冷却/开轮摇号语义成文,蓄力语义改写(清"重击前奏"表述),敌人表 schema(pattern → 池),结构冻结清单与验收标准重写 | 重 |
| 战斗循环 | [战斗结算](../design/gdd/systems/战斗循环/战斗结算.md) | 开轮摇号时点与随机口径三处、三乘法链、AC 措辞四处(§6)、行型改型(蓄力行 → 施放行)、敌方防御池、可回放契约扩写 | 重 |
| 战斗循环 | [战斗表现](../design/gdd/systems/战斗循环/战斗表现.md) | 敌种姿态数据面(普攻零表示、特殊技攻/防系动画映射)、样张验收联动 | 中 |
| 战斗循环 | [增益状态](../design/gdd/systems/战斗循环/增益状态.md) | 敌方增益状态行挂载、敌方防御池容器语义延伸 | 轻 |
| 冒险循环 | [难度曲线与Boss](../design/gdd/systems/冒险循环/难度曲线与Boss.md) | 曲线纪律改写、Boss 约定、调参表(池列 + 权重/冷却/保底投值域)、区间模型口径 | 中 |
| 表现与支撑 | [HUD 框架](../design/gdd/systems/表现与支撑/HUD框架.md) | 敌人卡义务改写(意图徽标语义、环点拆除)、验收条目 | 中 |
| 横切 | registry entities.yaml | enemy / rng_service / settlement / status_effect 条目 + §10 术语 | 必 |
| 横切 | [06-待办清单](../design/gdd/06-待办清单.md) | 旧条目收编关闭(如"删行为环取消蓄力拍"、"单拍行为环体验验证"改型)+ §9 登记 | 必 |
数据与代码(实施批范围,非文档修订面):`enemy.tres` 与新技能表、schemas、`core/`(unit_container / battle_orchestrator / rng_service)、`presentation/`(enemy_card_view / battle_log_view / status_slot_row)、smoke。
## 8. 实施批切分
前置门:AC 掷点批收编提交(工作区干净、smoke 全绿)后才开工;本提案自身零代码、零表改、不改任何既有文档。
| 批 | 范围 | 交付与验收 |
|---|---|---|
| 批 1 核心机制 | 技能表 schema 与数据、敌表池字段、单位容器实例池与冷却、编排器开轮摇号与战斗段兑现、随机服务 behavior_roll 与每敌子流、建议池行值 | smoke 全绿,含:同种子回放逐位复现、单敌轨迹独立复放、EV 抽样对锚、死亡打断前摇作废、空池不可能、加载校验拒绝 |
| 批 2 呈现替代 | 敌人卡摇定动画位、结算明细技能具名行、状态槽敌方增益显示 | 呈现只读面字段同步、行格式化同步 |
| 批 3 文档与 registry | §7 全表落文、06 待办登记、registry salt 与术语 | 死链检查全绿 |
批间纪律:并行批用互斥文件集、批末跑全量验证(既有批处理纪律)。
## 9. 后置登记位(P1/P2)
| 优先级 | 项 | 说明 |
|---|---|---|
| P1 | 情境条件触发器 | 低血触发防御、玩家停手时的偷袭技等;载体 = 技能行触发条件字段 |
| P1 | 个体化变体池 | A 型好斗/B 型守势、精英专属池(共识点 A 的 A2 案) |
| P1 | 全局特殊间隔旋钮 | 特殊技背靠背实测仍嫌时的备用闸 |
| P1 | 新效应词汇批 | 妨害技(对主角施减益)、固定值分量、多段命中(每段一掷) |
| P1 | 第二关池与投放 | 归难度曲线内容批 |
| P2 | 敌方技能图鉴/学习呈现 | 玩家侧技能知识系统 |
## 10. 术语候选(registry 术语条目登记用,随批定稿)
技能池(池模板)· 实例池 · 技能行 · 开轮摇号 · 保底 · 技能冷却 · 施放行(行型)
## 版本历史
| 版本 | 日期 | 改动 |
|---|---|---|
| v1.0 | 2026-09-16 | 首版定稿:方向复述与拍板记录(D1–D9 + 四点纠偏 + 共识点 A/B)、五维度设计、七条约束回应、对照表、熵预算、AC 措辞、修订面清单、实施批切分 |