diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 150b7871..2d9904be 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -143,14 +143,6 @@ ### 增益状态 -#### 叠层不续命的读感 - -**现状**:同种状态叠层只加层数、剩余次数不动("重复拿同款不续命")。旧体系把这条登记为试玩证伪项(配套教学口径"同轮拿满优于跨轮叠"),实测是否读得懂、要不要改成叠层顺带续命,尚未执行、尚未裁决 - -**归属**:增益状态(随批实测裁决) - -**状态**:待办 - #### 削弱档位的最终数值 **现状**:削弱取值域 [60,85] 与投值 −65 来自旧体系裁决;"标中旗必须比随便挖一格更值"的当量终值由[战斗结算](systems/战斗循环/战斗结算.md)与[地图战斗资源](systems/战斗循环/地图战斗资源.md)共裁,尚未闭合。**语义侧已定案(2026-09-18 盘问会话,结构修复批落地)**:削弱叠层改续时——同名重复授予只刷新剩余结算数、层数恒 1(结构性消饱和,×2 叠满池触底 ×0 的免伤轮从根杜绝);现行表值为临时值(provisional),duration 终值与当量锚复算归状态层重设计批 diff --git a/design/gdd/systems/战斗循环/增益状态.md b/design/gdd/systems/战斗循环/增益状态.md index cd6053df..1da0414d 100644 --- a/design/gdd/systems/战斗循环/增益状态.md +++ b/design/gdd/systems/战斗循环/增益状态.md @@ -8,7 +8,7 @@ 战斗里有一类效果不在当场一次性用掉,而要管上几次结算:挖开安全格拿到的主角增益、标中旗带来的怪物削弱、踩雷喂给怪物的增强、标错旗招来的反噬,都是这类。本文把它们统称"状态":发给主角的有益效果叫增益(标错反噬的失衡是个例外——它是发给主角的减益),发给敌人的负面效果叫减益;惊动巢穴或反噬喂给怪物的增强同样是状态——几个方向共用一本账。 -增益状态就是这本账:一个容器收下全部状态,用同一套规矩管理——发入、叠层(同一种效果重复拿到时层数加一)、衰减(每次结算后剩余次数减一,减到零效果消失)、清空(战斗结束全部清除)。没有它,几类效果得各写一套计时逻辑,结算明细也无法逐行指回"这效果是我哪步棋带来的"。容器管机制、不管数值从哪来:某个效果该多大,由各收益系统的表去定,容器只照章入账、按次衰减。 +增益状态就是这本账:一个容器收下全部状态,用同一套规矩管理——发入、合并(同一种效果重复拿到时按表行策略处理:叠层加一,或只刷新剩余次数——读 `status_effects.tres` 逐行 stack_policy)、衰减(每次结算后剩余次数减一,减到零效果消失)、清空(战斗结束全部清除)。没有它,几类效果得各写一套计时逻辑,结算明细也无法逐行指回"这效果是我哪步棋带来的"。容器管机制、不管数值从哪来:某个效果该多大,由各收益系统的表去定,容器只照章入账、按次衰减。 ## 系统范围 @@ -85,7 +85,7 @@ | 合并策略 | 重复授予时发生什么 | 说明 | |---|---|---| | 叠加 | 层数加一;剩余结算次数不动——只有首次授予定钟 | 现行内容行多数用叠加(逐行合并策略读 `status_effects.tres`) | -| 刷新 | 剩余结算次数重置为该实例首次授予时的初始值,层数不变 | 刷新类内容行已就位(增益技行 empower / fortify、削弱行 weaken——2026-09-18 续时定案;逐行读 `status_effects.tres`) | +| 刷新 | 剩余结算次数重置为该实例首次授予时的初始值,层数不变 | 刷新类内容行已就位——削弱行 weaken(2026-09-18 续时定案)、增益技行 empower / fortify、**主角增益行 attack_up / ac_up(2026-09-20 用户拍板「只续时不叠层」,全状态表增益/减益两侧合并语义就此统一为:主角可重复获取的增益与减益一律续时、不叠层)**;逐行读 `status_effects.tres` | | 并存 | 新建一份独立实例,两份各算各的 | 同上 | 并存分支没有满层上限,但容器规模天然有界:实例数的上界就是受理过的授予数——多受理一份就多一份实例,多少份在授予那一刻就完全确定,不会无限膨胀。 @@ -98,7 +98,7 @@ ### 剩余次数怎么倒数:按结算次数衰减 -每个状态实例自带一个倒数计数——剩余结算次数(本文说的"衰减"就是它逐次递减、归零消失)。它不承诺"活几轮",而是数"经历过几次轮末结算":每轮结算先让状态起作用,随后计数减一,减到零状态即被移除。持续 1 的状态就是"一次性":在授予它的那轮结算里生效一次,轮末消失。MVP 时期六行内容均为一次性(削弱后改续时——见版本历史);跨轮持续的状态,寿命由表行初始值表达,给几就活几次结算。 +每个状态实例自带一个倒数计数——剩余结算次数(本文说的"衰减"就是它逐次递减、归零消失)。它不承诺"活几轮",而是数"经历过几次轮末结算":每轮结算先让状态起作用,随后计数减一,减到零状态即被移除。持续 1 的状态就是"一次性":在授予它的那轮结算里生效一次,轮末消失。MVP 时期六行内容均为一次性(削弱后改续时——见版本历史;2026-09-20 起主角增益两行也走续时、duration 表值仍为 1——重复拿等于重新获得一次当轮增益);跨轮持续的状态,寿命由表行初始值表达,给几就活几次结算。 ``` 一轮结算:查询生效清单 → 逐行兑付(层数 × 行值)→ 轮末衰减(全部实例剩余次数 −1)→ 归零实例移除 @@ -116,7 +116,7 @@ ### 幅度与量纲:容器只做加法,换算归结算 -容器对每个状态只记两件数值的事:幅度(一个整数)和量纲(百分比还是固定值)。百分比量纲的叠层是纯加法——两层合计 = 2 × 单行幅度(读 `status_effects.tres` attack_up 行),不是 1.5 的平方;固定值量纲几层就乘几。 +容器对每个状态只记两件数值的事:幅度(一个整数)和量纲(百分比还是固定值)。百分比量纲的叠层是纯加法——两层合计 = 2 × 单行幅度(叠层策略行,读 `status_effects.tres` 暴走 enrage 行),不是 1.5 的平方;固定值量纲几层就乘几。 **结论**:容器输出的有效值 = 层数 × 行值,原样给出、不封顶不保底;把百分比合计换算成乘数、并在 −100 个百分点处设地板,是[战斗结算](战斗结算.md)的消费侧规则——地板保证减益不会把属性打到绝对负值,最低压到"归零"为止。 @@ -129,7 +129,7 @@ | 例子 | 容器输出 | 消费侧读法 | |---|---|---| | 暴走叠两层 | +(2 × enrage 行幅度)(读表;越出单行取值域,原样输出) | 压在天花板 +100% 上:敌方输出乘区封顶 ×2(削弱已改续时——"叠两层压地板 −100% 归零"的读法随 2026-09-18 结构修复批退役,见版本历史) | -| 主角护甲强化叠两层 | 每层 +1 AC(读 ac_up 行)× 2 层 | 不经任何池:掷点判定阈值 = 主角基准(读 hero 表)+ 层数 | +| 主角护甲强化再拿一份 | 层数恒 1、剩余结算次数重置(refresh——2026-09-20 主角增益续时批) | 不经任何池:掷点判定阈值 = 主角基准(读 hero 表)+ 层数(现行 +1——上限 2 层叠读取法退役,局内可达 AC 上限 11) | 容器还有一条快照纪律:实例的幅度、初始次数、量纲在授予那一刻从表行拷贝。战斗中配置表即使被重载,已授予实例不受任何影响,只影响后续授予。 @@ -219,12 +219,12 @@ empower 与 fortify 是敌方技能池增益技在容器侧的数据落点(技 | sapped 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 乏力;雷格负向 weaken 型,进主角输出修正池(2026-09-15 格面资源批补登记) | | empower 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 蓄力;敌方技能池增益技载体,进敌方输出修正池 | | fortify 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 硬化;敌方技能池增益技载体,进**敌方防御池 enemy_defense**(负值 = 减伤方向——2026-09-18 符号纠正) | -| 初始剩余次数 | 整数 [1,99] | duration_settlements | 六行一次性语义;weaken 与 empower/fortify duration 读表(weaken 续时 = 2026-09-18 定案;empower/fortify = 1 个有效增益拍——先兑付后衰减含施放当轮);拉长 = 恢复跨轮延续、规划变简单 | -| 叠层上限 | 整数 [1,16] | max_stack | 仅叠加策略消费;刷新行层数恒 1——weaken 表值上限在续时语义下不消费(2026-09-18),empower/fortify ×1(冷却闸下不可能自叠加) | +| 初始剩余次数 | 整数 [1,99] | duration_settlements | 一次性语义行逐行读表;续时行 = weaken(2026-09-18 定案,duration 2)+ empower/fortify(1 个有效增益拍——先兑付后衰减含施放当轮)+ **attack_up / ac_up(2026-09-20 主角增益续时批,duration 表值 1 维持——续时语义在 dur=1 下表现为重复拿重置当轮倒数;跨轮延续随将来 duration 拉长自然显形,数值归状态层重设计批)**;拉长 = 恢复跨轮延续、规划变简单 | +| 叠层上限 | 整数 [1,16] | max_stack | 仅叠加策略消费;刷新行层数恒 1——weaken / attack_up / ac_up 表值上限在续时语义下不消费(2026-09-18 / 2026-09-20),empower/fortify ×1(冷却闸下不可能自叠加) | 非调参的冻结项:三类合并策略语义、两种量纲语义、来源类别枚举、"先兑付后衰减"时序、拒绝原子性、零随机——改动走本文修订流程,不走调参。 -联动纪律:增伤与削弱是当量锚的两端;护甲强化与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的承伤预期联动(掷点折扣轴——AC 行值变更须复算生存链区间);削弱改续时后"单轮层数上限受[行动经济](../排雷循环/行动经济.md)行动点约束"的联动随之失效(2026-09-18 续时定案——同名重复标中只刷新剩余次数、层数恒 1)。这些联动值禁止独立调参,修订须重跑锚对照并同步 registry。 +联动纪律:增伤与削弱是当量锚的两端;护甲强化与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的承伤预期联动(掷点折扣轴——AC 行值变更须复算生存链区间;2026-09-20 主角增益续时批后 ac_up 层数恒 1、局内可达 AC 上限 11,复算随调参批);削弱改续时后"单轮层数上限受[行动经济](../排雷循环/行动经济.md)行动点约束"的联动随之失效(2026-09-18 续时定案——同名重复标中只刷新剩余次数、层数恒 1;2026-09-20 起主角侧 attack_up / ac_up 同口径)。这些联动值禁止独立调参,修订须重跑锚对照并同步 registry。 ## 验收标准 @@ -232,7 +232,7 @@ empower 与 fortify 是敌方技能池增益技在容器侧的数据落点(技 - 多向同构:主角侧增益与减益、敌方侧增强与削弱共用同一套受理、合并、倒数、清除语义,不存在第二套计时逻辑。 - 授予即生效:状态发入当轮结算即兑付第一次,无"待生效"中间态。 - 只记账不去重:同一事实被转化两次授予,入账两层——去重责任在战斗结算。 -- 叠层不减钟:叠加只加层数,剩余次数保持首次授予定下的轨迹不变。 +- 叠层不减钟:叠加策略行叠加只加层数,剩余次数保持首次授予定下的轨迹不变(刷新策略行则相反——层数不变、只重置剩余次数;两策略逐行读表)。 - 满层拒绝原子且留痕:叠满后再授予返回失败、容器逐字不变;结算明细多一行"溢出未生效"(含来源)。 - 先兑付后衰减:每轮结算恰做一次衰减,归零实例当轮移除;停手轮、弃图刷新轮照常衰减。 - 合成不收口:容器输出的有效值恒等于层数 × 行值,越出百分比域不封顶不保底;地板在战斗结算侧。 @@ -257,3 +257,4 @@ empower 与 fortify 是敌方技能池增益技在容器侧的数据落点(技 | v0.8 | 2026-09-17 | **数值纪律收口批:正文与调参表 knob 现行值改指路存根(事实源 `data/tables/*.tres` 与 registry),8 处失同步值修正**——幅度例"两层 +50% 合计 +100"改"2 × 单行幅度(读表)";削弱例"−130 个百分点"改"−(2 × weaken 行幅度)(读表)";护甲例"AC10 → AC12(期望减免 21.25% → 28.75%)"改"基准 AC(读 hero 表)+ 层数"、派生读数删除;状态行表"时限/合并"列 1 次/×2/×16/×1 字面量改读表措辞;defense_up 退役条目删"−30%"数值;"两行 duration = 2"改"duration 表值(读表)";empower"×2"幅度与调参表"AC10 → 11 → 12"、"2 次 = 1 个有效增益拍"同步指路化 | | v0.9 | 2026-09-18 | **战斗数值结构修复批(2026-09-18 盘问会话用户拍板,与战斗结算 / registry / 切片代码同批)**:三行语义改写(数值全部 provisional 归状态层重设计批)——① off_guard(失衡)换装 AC 轴:unit percent→ac、退出 hero_defense 池(effect_pool_map 删键,池清空结构保留),状态行表与调参表同步,"标错反噬三池"措辞改"三行";② fortify(硬化)符号纠正:旧正值入池实际 ×2 翻倍与"硬化=减伤"语义相反,改负值后主角攻击折半(正负号语义成文:负值 = 减伤方向);③ weaken(削弱)叠层改续时:stack→refresh、duration 表值 2——同名重复授予只刷新剩余次数、层数恒 1,×2 叠满池触底 ×0 的免伤轮结构性根治;消费侧例子表"削弱叠两层压地板"改"暴走叠两层封顶 ×2"(削弱叠层读法退役);"叠层不续命"对削弱不再适用,行动经济联动句随之失效;调参表一次性/叠层上限两行措辞同步 | | v0.10 | 2026-09-19 | **技能池新效应词汇批(用户拍板——设计权威 docs/proposal-status-vocabulary.md v1.0,与 敌人系统 / 战斗结算 / registry / 切片代码同批)**:off_guard(失衡)新增第二来源类别 = 敌方技能施放(妨害技"蛛网束缚"的容器落点——首实装于 L2 Boss 蛛化卓尔精灵池;duration 由技能行 buff_duration=2 覆盖 = 1 个有效结算,empower/fortify 同款口径);容器语义零改动——同构实例、side 路由照常,妨害技零新状态行(乏力 sapped 留作妨害第二词汇,暂无载体) | +| v0.11 | 2026-09-20 | **主角增益只续时不叠层批(用户拍板「主角的其实也一样,都是按照叙事的方式,不要有叠层;只续时不叠层,变相削弱主角性能可接受」;与 status_effects.tres / smoke / registry / 06 清单同批,台账 101)**:① attack_up(增伤)/ ac_up(护甲强化)两行 stack_policy stack→refresh——重复授予层数恒 1、剩余结算次数重置,对齐削弱 2026-09-18 续时定案;至此主角可重复获取的增益与减益合并语义统一(叠层策略仅剩敌侧 ambush / enrage / off_guard / sapped 等行);② duration 表值 1 与 max_stack 2 不动(refresh 下 max_stack 不消费——weaken 先例;dur=1 下续时表现为重复拿重置当轮倒数,跨轮延续随 duration 拉长自然显形,数值归状态层重设计批);③ 影响面:增伤不再 +100%(hero_offense 池单层封顶 +50)、护甲强化不再 +2 AC(局内可达 AC 上限 11,AC12 折扣档采样探针随行降为 AC11)、"溢出未生效"行对这两行不再可达;④ 同名状态合并策略表/幅度量纲例子表/调参表两行/联动纪律句/验收"叠层不减钟"条改述;06 清单「叠层不续命的读感」条目解决移除(45→44 条);冒烟 355 项 0 失败(ac_up 行断言与 AC 探针改形,无净增断言) | diff --git a/design/registry/entities.yaml b/design/registry/entities.yaml index 38835db5..cf5894e8 100644 --- a/design/registry/entities.yaml +++ b/design/registry/entities.yaml @@ -127,8 +127,8 @@ entities: stack_policy: enum {stack, refresh, independent} max_stack: int [1,16](仅 stack 消费——refresh/independent 行内容约定恒 1,非校验项) mvp_content: - attack_up: { display_name: 增伤, target_side: hero, unit: percent, duration_settlements: 1, max_stack: 2, stack_policy: stack, source_class: safe_cell, magnitude_ref: data/tables/status_effects.tres } # 2026-09-17 数值压缩批·文档同步:magnitude 从现行值列改指路存根(数值事实源 = data/tables/status_effects.tres);schema 字段保留以承载元数据 - ac_up: { display_name: 护甲强化, target_side: hero, unit: ac, duration_settlements: 1, max_stack: 2, stack_policy: stack, source_class: safe_cell, magnitude_ref: data/tables/status_effects.tres } # 2026-09-16 护甲等级掷点批换装(原 defense_up 减伤 −30 percent ×2 层整行退役、无双轨——unit=ac 新量纲〔护甲等级阈值轴 [−20,20] 且非 0〕,不入 effect_pool_map 任何池,消费面 = 战斗结算掷点判定);2026-09-17 数值压缩批:magnitude 改指路存根 + attack_up: { display_name: 增伤, target_side: hero, unit: percent, duration_settlements: 1, max_stack: 2, stack_policy: refresh, source_class: safe_cell, magnitude_ref: data/tables/status_effects.tres } # 2026-09-17 数值压缩批·文档同步:magnitude 从现行值列改指路存根(数值事实源 = data/tables/status_effects.tres);**2026-09-20 主角增益续时批:stack→refresh(层数恒 1、重复授予重置剩余结算数——max_stack 不消费)** + ac_up: { display_name: 护甲强化, target_side: hero, unit: ac, duration_settlements: 1, max_stack: 2, stack_policy: refresh, source_class: safe_cell, magnitude_ref: data/tables/status_effects.tres } # 2026-09-16 护甲等级掷点批换装(原 defense_up 减伤 −30 percent ×2 层整行退役、无双轨——unit=ac 新量纲〔护甲等级阈值轴 [−20,20] 且非 0〕,不入 effect_pool_map 任何池,消费面 = 战斗结算掷点判定);2026-09-17 数值压缩批:magnitude 改指路存根;**2026-09-20 主角增益续时批:stack→refresh(层数恒 1——局内可达 AC 上限 11,原 ×2 层叠读取法退役)** ambush: { display_name: 伏击(敌方增益), target_side: enemy, unit: flat, duration_settlements: 1, max_stack: 16, stack_policy: stack, source_class: mine_hit, magnitude_ref: data/tables/status_effects.tres } # 2026-09-17 数值压缩批:magnitude +3 → +1 flat(量纲未变,参见 status_effects.tres ambush_unit_definition) weaken: { display_name: 削弱(标中旗 debuff), target_side: enemy, unit: percent, duration_settlements: 2, max_stack: 16, stack_policy: refresh, source_class: flag_hit, magnitude_ref: data/tables/status_effects.tres } # 2026-09-17 数值压缩批:magnitude 改指路存根;**2026-09-18 结构修复批:叠层改续时——stack→refresh · duration 1→2**〔同名重复授予只刷新剩余结算数、层数恒 1——结构性消饱和,×2 叠满池触底 ×0 免伤轮根治;表值上限 16 在续时语义下不消费;duration 终值 provisional 归 状态层重设计批〕 enrage: { display_name: 暴走(敌方增伤), target_side: enemy, unit: percent, duration_settlements: 1, max_stack: 16, stack_policy: stack, source_class: flag_miss, magnitude_ref: data/tables/status_effects.tres } # 2026-09-12 标错反噬批上线——三池之一(进 enemy_output 池);2026-09-17 数值压缩批:magnitude 改指路存根 diff --git a/production/session-state/active.md b/production/session-state/active.md index fc7dd5bc..c51ef865 100644 --- a/production/session-state/active.md +++ b/production/session-state/active.md @@ -12,6 +12,7 @@ ## 当前状态快照(收口批先更新本节,再追加台账;≤10 行) +- **更新于**:2026-09-20(**主角增益只续时不叠层批**,独立 worktree 分支 buff-refresh-20260920,台账 101):用户拍板「主角的增益也一样,只续时不叠层,变相削弱主角性能可接受」——attack_up(增伤)/ ac_up(护甲强化)两行 stack_policy stack→refresh,对齐削弱 2026-09-18 续时定案;至此主角可重复获取的增益/减益合并语义统一(叠层仅剩敌侧行)。duration=1/max_stack=2 表值不动(refresh 下 max_stack 不消费;dur=1 下续时=重复拿重置当轮倒数,跨轮延续随 duration 拉长显形,数值归状态层重设计批)。影响面:增伤不再 +100%(池单层封顶 +50)、护甲强化不再 +2 AC(局内可达 AC 上限 11——AC12 采样探针随行降 AC11)、两行不再可达"溢出未生效"行。文档:增益状态 v0.11(合并策略表/例子表/调参表/联动纪律/验收条)+registry 两行+06「叠层不续命的读感」解决移除(44→43 条);冒烟 355 项 0 失败三闸全过 - **更新于**:2026-09-20(**伤害下限全来源批**,独立 worktree 分支 damage-floor-20260920,台账 100):用户拍板「任何伤害取值域 [1,+∞),最小值一定是 1——不分敌我全来源」——①下限语义从"任何攻击落地"扩为"任何伤害落地":棋盘克制直伤(counter_component 增 landed_floor 参数,空桶恒 0 边界不变)+爆裂正向+负向反噬(穿刺陷阱/魔法反噬/heal 反噬)+地形变异 flat_damage 收进 damage_floor 闸,攻击双方原有闸不动;②取值域成文 [1,+∞) **不设上限**——06「零伤害/无威胁组合的跨字段护栏」整条解决移除(45→44 条):上界护栏半边随"不设上限"裁决、0 基线退化敌经下限自然消解;③现行表值零行为变更(贴底值 2−1=1 本就 ≥1),纯结构保证+调参防误配;④战斗结算 v0.19(版本号与未合并伏击分支撞号,合并时先落籍者为准顺延避让)+registry ac_roll+settlement_table.gd 注释;冒烟 352→355 项 0 失败三闸全过(+贴底/穿透/空桶三断言) - **更新于**:2026-09-20(**敌人卡形态裁决收口批**,独立 worktree 分支 enemy-form-20260920,台账 99):用户看对照样张拍板**全站桩形态**——B 区主角与敌人均为无框立绘+底座(主角站桩、状态小图标挂血条正下方),英雄卡/敌人卡卡片式整体退役;06 清单「敌人卡形态」解决移除(清单 46→45 条);battle.md 回写(B 区行/组件表两行/线框图 B 区重绘/OQ4)+战斗表现 v0.4(相邻裁定改裁决已下+样张对照项解除)+HUD框架 v0.6(B 区行+敌人呈现义务行载体改立绘)+敌人系统一行+美术清单两处(对照义务解除,正式样张按站桩单版出样);对照样张存档 production/mockups/(双形态对照+定稿形态+HTML 源);纯文档零代码,冒烟不适用;表现层升级批的敌人卡形态前置就此解锁 - **更新于**:2026-09-20(**显影尘待办条目移除批**,独立 worktree 分支 probe-dust-todo-20260920,台账 98):用户拍板「显影尘效果重定」条目删除——辅助道具(魔法道具)统一在 Alpha 阶段重新设计,垂直切片期不需要相关内容;06 清单 47→46 条(解决即移除口径,去向=并入 Alpha 阶段魔法道具整体重设计);连带悬空指认清偿四处——06 反制条目合流从句改写、魔法道具.md 信息维度存根行、03-内容规模.md 待定句、registry aux_items 三处「魔法道具 待办」指针改指 Alpha 重设计(名称保留、六行登记不动;历史修订块豁免);地穴全图卷/探宝罗盘两条目未动(探宝罗盘已排 Alpha 在案)。纯文档零代码,冒烟不适用 @@ -259,3 +260,5 @@ 99. **敌人卡形态裁决收口批(2026-09-20,本会话——用户从 06 清单点名战斗表现决断项,看对照样张后拍板「千万不要用卡片这种形式」;worktree enemy-form-20260920,纯文档零代码)**:**裁决面**——敌人呈现形态定稿**全站桩式**:① B 区主角与敌人均为无框立绘+底座(站桩),卡片式整体退役、不再作为候选;② 主角也站桩(英雄卡退役)——血条悬浮头顶、状态效果小图标一排挂血条正下方;③ 敌人血条+顺位徽标悬浮头顶、状态小图标同款挂血条下(敌方 side 池共享层数各立绘同值等既有语义平移载体不改);④ 攻击值等规划数据仍归 C 区数据框(C 区不动)。样张工具链:production/mockups/enemy-card-vs-standee-mockup.html(双形态对照+定稿形态三屏同源对照,除 B 区敌人/主角呈现外四区完全一致)+三张 PNG 截图,浏览器渲染出图。**文档落地**——06 清单「敌人卡形态」条目解决移除(清单 46→45 条,战斗表现节清空);battle.md Last Updated+B 区行+组件表英雄卡/敌人卡两行+ASCII 线框图 B 区重绘(顺带清掉行为环退役后残留的「意图:爪击/环点」旧示意)+敌人死亡/Boss 变体/逐行兑现/义务对照表四处措辞+OQ4 改裁决收口注记+修订记录一行;战斗表现.md v0.4(相邻裁定句改裁决已下+样张内容清单对照项划线解除〔正式样张按站桩单版出样,owner 修订〕+判定回退第 5 项拆半+不负责表/依赖表两处五区与敌人卡旧措辞顺手清偿);HUD框架.md v0.6(B 区行+敌人呈现义务行载体改立绘〔义务面平移不重述,呈现快照数据面零改动〕+下游战斗表现交付行+就地更新示例);敌人系统.md 摇定动画位归属行一句(敌人卡→敌人侧·站桩载体);art-assets-checklist.md 两处(1.2 样张对照义务解除+流程图裁决节点标已收口)。**边界**——战斗结算.md v0.10 版本历史行「英雄卡与敌人卡 AC 展示」系历史留痕不改写;AC 展示义务在站桩载体上的落位(血条旁/状态图标行)随表现层升级批;设计/art/asset-checklist.md(主区未跟踪新件,并行会话产物)未碰。**验证**——纯文档零代码冒烟不适用;全仓 grep 复核「敌人卡/英雄卡」现行口径残留仅剩改型注记与历史留痕。 100. **伤害下限全来源批(2026-09-20,本会话——用户在 06 清单三决断项呈报中对「零伤害/无威胁组合的跨字段护栏」直接给词表:「攻击伤害算到最后不能够是 0 或负数,取值范围 1 到 +∞,不管是角色对怪兽、怪兽对角色、还是其他所有造成的伤害,最小取值一定是 1」;worktree damage-floor-20260920)**:**盘点**——全伤害落点六类:主角攻击→敌(battle_orchestrator 战斗段)与敌方技能攻击→主角两路径 2026-09-16 掷点批已落 damage_floor 闸;棋盘克制直伤(pierce/magic 正向,DamageMath.counter_component 无下限——现值 2+(−1)=1 恰好贴底无结构保证)、爆裂正向、负向反噬(穿刺陷阱/魔法反噬/heal 反噬→主角)、地形变异 flat_damage 四类为表值直落无闸。**落地**——①counter_component 增第三参 landed_floor(缺省 0 保持旧签名行为;空桶〔点数≤0〕恒 0 边界不变——无伤害落地无下限可言,与"空桶不吃修正"拍板兼容);②battle_orchestrator 四落点全部 maxi(damage_floor, ·) 保底(blast 正向逐敌/穿刺魔法负向/heal 负向/地形变异);③apply_damage n≤0 拒绝语义保留作真 bug 兜底(闸后不可达)。**裁决面**——06 条目两个半边一并收口:上界护栏半边(基线×倍率上界 vs 主角生命上限)随「取值域 [1,+∞)」拍板裁决为**不设上限**;退化态半边(敌种行攻击基线 0 且上限 0 → 无威胁敌)经下限自然消解——0 基线攻击落地仍 ≥1,"无威胁敌"结构性不存在(内容调参禁区约束随之失去对象)。**现行表值零行为变更**(全部落点现值本就 ≥1),本批=结构保证+调参防误配(power 降档/克制修正域扩到 −3 时不再可能打出 0/负伤害)。**文档**——战斗结算 v0.19(判读口径/约束表/调参表/验收四处"任何攻击落地"改"任何来源的伤害落地"+取值域成文;版本号与未合并伏击分支撞号,合并时先落籍者为准顺延避让)+registry settlement_table.ac_roll 行同步+settlement_table.gd 两处注释+06 条目解决移除(45→44 条)。**验证**——冒烟 352→355 项 0 失败三闸全过(+counter_component 贴底/触底穿透/空桶三断言;新检出 worktree 需先 --editor --quit 刷类缓存);gdd_lint 不适用本批文件面。 + +101. **主角增益只续时不叠层批(2026-09-20,本会话——用户对「叠层不续命的读感」条目两轮澄清后拍板「主角的其实也一样,都是按照叙事的方式,不要有叠层。只续时不叠层;虽然变相削弱了主角的性能,但是我觉得是可以接受的」;worktree buff-refresh-20260920)**:**澄清前置**——用户先质疑该条目与记忆中的 buff 整改冲突,经 git/文档/表值三方核查确认:2026-09-16 敌人技能池批(empower/fortify)与 2026-09-18 结构修复批(weaken)的续时改型只覆盖敌方侧三行,主角侧 attack_up / ac_up 从未改过(6a9f590 前现行值 stack + max 2)——条目背景澄清无误后用户直接给语义裁决。**落地**——① status_effects.tres 两行 stack_policy stack→refresh(duration_settlements=1 与 max_stack=2 表值不动:refresh 下层数恒 1、max_stack 不消费——weaken 先例;dur=1 下续时表现为重复拿重置当轮倒数,跨轮延续随将来 duration 拉长自然显形,数值归状态层重设计批);② 容器/消费侧零代码改动(refresh 容器既有,池与 AC 消费面按层数泛化读取)。**行为影响**——增伤不再 +100%(hero_offense 池单层封顶 +50)、护甲强化不再 +2 AC(局内可达 AC 上限 10+1=11)、两行不再可达"溢出未生效"行(满层拒绝路径消失)——用户已知悉接受削弱方向。**文档**——增益状态 v0.11(同名合并策略表刷新行内容行清单+幅度量纲例子表第二例改"护甲强化再拿一份"+调参表初始剩余次数/叠层上限两行+联动纪律句 AC 上限 11 注记+验收"叠层不减钟"条加策略限定+概览与衰减节两处叠层措辞)+registry attack_up/ac_up 两行+06 清单「叠层不续命的读感」解决移除(44→43 条)。**验证**——冒烟 355 项 0 失败三闸全过(ac_up 行断言 stack→refresh 改形、AC12 折扣档采样探针随行降为 AC11 单授——_ac12_tier_samples 更名 _ac11_tier_samples,无净增断言);新检出 worktree --editor --quit 刷类缓存照例。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/status_effects.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/status_effects.tres index aae53291..e0bc713a 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/status_effects.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/status_effects.tres @@ -11,7 +11,7 @@ rows = [{ "magnitude": 50, "unit": "percent", "duration_settlements": 1, -"stack_policy": "stack", +"stack_policy": "refresh", "max_stack": 2 }, { "effect_id": "ac_up", @@ -20,7 +20,7 @@ rows = [{ "magnitude": 1, "unit": "ac", "duration_settlements": 1, -"stack_policy": "stack", +"stack_policy": "refresh", "max_stack": 2 }, { "effect_id": "ambush", @@ -120,3 +120,7 @@ rows = [{ ; weaken(削弱)叠层改续时:stack_policy stack→refresh、duration_settlements 1→2(同名重复授予 ; 只刷新剩余结算数、层数恒 1——结构性消饱和,×2 叠满池触底 ×0 免伤轮从根杜绝;refresh 实现与 ; empower/fortify 同款零代码)。duration 终值、off_guard N 值、当量锚复算全部归 状态层重设计批。 +; 主角增益只续时不叠层批(2026-09-20 用户拍板「主角的其实也一样,都是按照叙事的方式,不要有叠层;只续时不叠层」—— +; 对齐削弱 2026-09-18 续时定案):attack_up / ac_up 两行 stack_policy stack→refresh; +; duration_settlements=1 与 max_stack=2 表值不动(refresh 下层数恒 1、max_stack 不消费——weaken 先例; +; dur=1 下续时表现为重复拿重置当轮倒数,跨轮延续随将来 duration 拉长自然显形——数值归状态层重设计批)。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd index 6a6e5ddc..75418e1d 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd @@ -229,7 +229,7 @@ func _smoke_level() -> void: # ---- 护甲等级掷点批·换装护栏(2026-09-16 用户拍板:百分比减伤行整体退役换装 AC,无双轨)---- -# ① 换装在位:defense_up 状态行/池映射/奖励行三处全无残留,ac_up 三处就位(unit=ac ×2 层); +# ① 换装在位:defense_up 状态行/池映射/奖励行三处全无残留,ac_up 三处就位(unit=ac,2026-09-20 改只续时不叠层); # ② 免伤墙归零护栏泛化保留(BUG-0003 事故类永久免疫):hero_defense 池任何 percent 行 # magnitude × max_stack > pool_clamp_lo——单效果叠满不可触池底(off_guard 已于 2026-09-18 # 结构修复批退离 hero_defense 池换装 AC 轴,池内现无 percent 行——本断言防未来负向行回归时静默造墙); @@ -243,8 +243,8 @@ func _smoke_ac_swap_guard() -> void: var ac_row: Dictionary = _db.status_effect_row("ac_up") check(not ac_row.is_empty() and String(ac_row.get("target_side", "")) == "hero" \ and String(ac_row.get("unit", "")) == "ac" and int(ac_row.get("magnitude", 0)) == 1 \ - and int(ac_row.get("max_stack", 0)) == 2 and String(ac_row.get("stack_policy", "")) == "stack", - "ac_up 行在位(hero · +1 ac · ×2 层 · stack——AC 阈值轴新量纲)") + and String(ac_row.get("stack_policy", "")) == "refresh", + "ac_up 行在位(hero · +1 ac · 只续时不叠层——2026-09-20 主角增益续时批)") var ac_reward := {} for row in _db.reward.rows: if String(row.get("cell_type", "")) == "defense" and String(row.get("polarity", "")) == "positive": @@ -327,16 +327,17 @@ func _smoke_armor_roll() -> void: "削弱重复授予 → 层数保持 1、剩余结算数重置 2(续时语义——结构性消饱和)") check(int(weaken_probe.get("pool", -999)) == int(_db.status_effect_row("weaken").magnitude), "削弱单层池读数 = 行值(enemy_output 池单层贡献——×2 叠满触底 ×0 不可达,免伤轮根治)") - # ④ AC12 折扣档分布(行为面):ac_up ×2 逐轮授给(时效 1)→ Boss 行攻击拍逐拍判定 - var tiers := _ac12_tier_samples() + # ④ AC11 折扣档分布(行为面):ac_up 逐轮授给(时效 1)→ Boss 行攻击拍逐拍判定 + # (2026-09-20 主角增益续时批后 ac_up 层数恒 1——局内可达 AC 上限 10+1=11,探针随行下调) + var tiers := _ac11_tier_samples() var tier_distinct := {} var tiers_valid := true for t in tiers: tier_distinct[int(t)] = true if not [100, 75, 50, 25].has(int(t)): tiers_valid = false - check(tiers_valid and tiers.size() >= 3, "AC12 攻击拍逐拍判定(×%d 拍全部落档域 {100,75,50,25})" % tiers.size()) - check(tier_distinct.size() >= 2, "折扣档实际流动(AC12 实测档位 %s——≥2 档可见)" % str(tier_distinct.keys())) + check(tiers_valid and tiers.size() >= 3, "AC11 攻击拍逐拍判定(×%d 拍全部落档域 {100,75,50,25})" % tiers.size()) + check(tier_distinct.size() >= 2, "折扣档实际流动(AC11 实测档位 %s——≥2 档可见)" % str(tier_distinct.keys())) # ⑤ 棋盘来源必中 + 吃掷点行留档(全战斗流扫描) var run = _run_battle(1, 0) var board_ok := true @@ -399,9 +400,10 @@ func _weaken_refresh_probe() -> Dictionary: return {} -# AC12 折扣档采样:每停手轮前直授 ac_up ×2(时效 1 逐轮衰减)——敌拍逐拍判定留档。 -# 敌人技能池批:拍序改为摇号制,原 AC 批定影种子不再保证档位多样性——扫描种子取首个 ≥2 档样本集。 -func _ac12_tier_samples() -> Array: +# AC11 折扣档采样:每停手轮前直授 ac_up ×1(时效 1 逐轮衰减)——敌拍逐拍判定留档。 +# (2026-09-20 主角增益续时批:ac_up 只续时不叠层、层数恒 1——原 ×2 授给达 AC12 的采样随批降为 AC11; +# 敌人技能池批:拍序改为摇号制,原 AC 批定影种子不再保证档位多样性——扫描种子取首个 ≥2 档样本集。) +func _ac11_tier_samples() -> Array: for seed_offset in range(20): var rng = load("res://core/rng_service.gd").new() rng.set_master_seed(20260917 + seed_offset) @@ -413,8 +415,7 @@ func _ac12_tier_samples() -> Array: var guard := 12 while settlement.battle_result == "" and guard > 0: guard -= 1 - for i in range(2): - settlement._status_effects.apply_effect("ac_up", {"source_class": "safe_cell", "origin_cell": Vector2i(0, 0), "round_index": settlement.round_index}) + settlement._status_effects.apply_effect("ac_up", {"source_class": "safe_cell", "origin_cell": Vector2i(0, 0), "round_index": settlement.round_index}) settlement.minesweeper.settle_batch([{"action": "stop"}]) var tiers: Array = [] for row in rows: