Files
gplan-2/design/research/proposal-skill-pool.md
T

23 KiB
Raw Blame History

敌人技能池出招系统提案

一句话:废除确定性行为环,改用"技能池 + 开轮摇号"决定敌方每次行动——本文收拢全部拍板记录、逐维度设计、登记约束回应与实施批切分。 状态:已定稿(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. 修订面清单(按文档)

跨三个循环 + 两个横切件;排雷循环零触及(挖掘期、行动经济、棋盘、道具、变异全不碰)。跨循环不是范围蔓延——按引用纪律的删除概念流程查"行为环"反向边,其读数本被织入曲线纪律与呈现义务,影响面即下表。

循环 文档 修订面 深度
战斗循环 敌人系统 主 owner:行为环章节退役,技能池/技能行/实例池/冷却/开轮摇号语义成文,蓄力语义改写(清"重击前奏"表述),敌人表 schema(pattern → 池),结构冻结清单与验收标准重写 重
战斗循环 战斗结算 开轮摇号时点与随机口径三处、三乘法链、AC 措辞四处(§6)、行型改型(蓄力行 → 施放行)、敌方防御池、可回放契约扩写 重
战斗循环 战斗表现 敌种姿态数据面(普攻零表示、特殊技攻/防系动画映射)、样张验收联动 中
战斗循环 增益状态 敌方增益状态行挂载、敌方防御池容器语义延伸 轻
冒险循环 难度曲线与Boss 曲线纪律改写、Boss 约定、调参表(池列 + 权重/冷却/保底投值域)、区间模型口径 中
表现与支撑 HUD 框架 敌人卡义务改写(意图徽标语义、环点拆除)、验收条目 中
横切 registry entities.yaml enemy / rng_service / settlement / status_effect 条目 + §10 术语 必
横切 06-待办清单 旧条目收编关闭(如"删行为环取消蓄力拍"、"单拍行为环体验验证"改型)+ §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 措辞、修订面清单、实施批切分