feat(combat): 伤害下限全来源批——任何伤害落地取值域 [1,+∞)(2026-09-20 用户拍板,台账 100)

用户对 06「零伤害/无威胁组合的跨字段护栏」直接给词表:所有伤害(不分敌我)
最终落点不能是 0 或负数,最小取值 1,无上限。

- DamageMath.counter_component 增 landed_floor 参数(空桶恒 0 边界不变)
- battle_orchestrator 四落点保底:棋盘克制直伤/爆裂正向/负向反噬/地形变异
  (攻击双方原有闸不动;apply_damage n≤0 拒绝保留作真 bug 兜底)
- 06 条目整条解决移除:上界护栏随『不设上限』裁决、退化 0 基线敌经下限消解
- 战斗结算 v0.19 四处措辞+取值域成文(与未合并伏击分支撞号注记避让)
- registry ac_roll / settlement_table.gd 注释同步
- 冒烟 352→355 项 0 失败三闸全过(贴底/穿透/空桶三断言)
- 现行表值零行为变更:纯结构保证+调参防误配
This commit is contained in:
DKChan committed 2026-09-20 03:25:09 +08:00
1 parent a20ea38086
commit 6a9f5901c1
8 files changed
+40 -28

No files matched your search

-8
View File
@@ -75,14 +75,6 @@
**状态**:待办(2026-09-17 量级当量重核同步推进)
#### 零伤害 / 无威胁组合的跨字段护栏
**现状**:主角基础攻击为 0 已被域下界杜绝;残余退化 = 敌种行攻击基线 0 且上限 0 → 无威胁敌(内容调参禁区);跨表量级护栏(基线 × 倍率上界对主角生命上限域)的归属未定
**归属**:实现期 ADR 与[数据配置](systems/表现与支撑/数据配置.md)
**状态**:待办
#### 同深度第二敌种与精英 / Boss 编码位
@@ -186,7 +186,7 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 ×
主角攻击 = 单一基础分量(2026-09-19 充能退役批):量 = 攻击力基线(表值),类型 = 主角表 `attack_type`(营地永久强化换型 = 改字段;未来冒险前参数面承接"按关配型"的策略位)。原"普通 + 穿刺/魔法充能三分量"模型整体退役——挖掘期与战斗期之间不再有弹药供给线,克制应对从局内攒桶改为冒险前配型 + 棋盘火力(穿刺弹/魔法矢等直伤奖励道具,消费面不变)。
**护甲等级掷点:必中、非归零,只吃基础攻击分量**(2026-09-16 定稿落地,判定式与全部数值已拍板;判定对象措辞随敌人技能池批改述)。防守方由此多了一条数值轴——护甲等级(数据键 `armor_class`):攻击永远命中,没有 miss、没有零收益白回合;只有吃掷点的分量在掷点低于防守方护甲等级时按减伤档位打折,档位再重也不归零。判定式:攻击结算时掷单骰(骰面读表),掷点 ≥ 防守方护甲等级 + 攻击加成 → 全额;掷点 < 护甲等级按缺口(护甲等级 − 掷点)查减伤档位表打折——边界与档值读 `settlement.tres` 减伤档位表,三档皆非零档。暴击:天然最大面(读表)使该次基础攻击分量 ×暴击倍率(读表),双方同规,且天然最大面恒全额(暴击与折扣互斥;天然最大面〔nat20〕暴击是掷点层概念,与技能重击〔池技能〕严格区分——两层不得混述)。伤害下限:任何攻击落地伤害至少 damage_floor(读表,全局 max(damage_floor, ·))——"被减伤归零 v=0"零值伤害行语义随批退役,重档折扣的攻击行在行文本记"被压制"。掷点范围:只有基础攻击分量吃掷点——主角先手攻击的普通分量,敌方技能的基础伤害分量(= 攻击基线 × 技能伤害倍率,普通攻击倍率 1 为特例);无伤害分量的技能(增益/妨害类)不掷不折;棋盘来源一律无视护甲等级——伏击附加、爆裂、清障炸药、奖励即时伤害、技能必中附加分量(rider,2026-09-19)全部必中全额不掷,这是本机制的边界切口,与"奖励/惩罚必中"同构。护甲等级(数值轴,掷点打折)与护甲类型(属性轴,克制修正)严格分离:护甲类型不做护甲等级映射,克制修正点数读表、消费面不变,两概念在文档、表字段与代码键中不得混用。数值载体:主角与敌方护甲等级行值读 hero / enemy 表的 armor_class 列(正式行值归怪物设定批,登记[待办清单](../../06-待办清单.md)),ac_up(护甲强化)在其上加算(幅度/层数读 `status_effects.tres`)。攻击加成(`attack_bonus`)为结构位预留字段,切片恒 0,未来归元进度 / 武器附魔投值。掷点时机在结算战斗段内、每次基础攻击伤害计算时判定,消费 `armor_roll` 封闭流(逐次掷逐次取号,可逐位回放)。
**护甲等级掷点:必中、非归零,只吃基础攻击分量**(2026-09-16 定稿落地,判定式与全部数值已拍板;判定对象措辞随敌人技能池批改述)。防守方由此多了一条数值轴——护甲等级(数据键 `armor_class`):攻击永远命中,没有 miss、没有零收益白回合;只有吃掷点的分量在掷点低于防守方护甲等级时按减伤档位打折,档位再重也不归零。判定式:攻击结算时掷单骰(骰面读表),掷点 ≥ 防守方护甲等级 + 攻击加成 → 全额;掷点 < 护甲等级按缺口(护甲等级 − 掷点)查减伤档位表打折——边界与档值读 `settlement.tres` 减伤档位表,三档皆非零档。暴击:天然最大面(读表)使该次基础攻击分量 ×暴击倍率(读表),双方同规,且天然最大面恒全额(暴击与折扣互斥;天然最大面〔nat20〕暴击是掷点层概念,与技能重击〔池技能〕严格区分——两层不得混述)。伤害下限:**任何来源的伤害落地**至少 damage_floor(读表,全局 max(damage_floor, ·)——2026-09-20 用户拍板扩全来源:攻击双方、棋盘直伤与爆裂、地形变异、负向反噬;伤害取值域 [1, +∞),**不设上限**)——"被减伤归零 v=0"零值伤害行语义随批退役,重档折扣的攻击行在行文本记"被压制"。掷点范围:只有基础攻击分量吃掷点——主角先手攻击的普通分量,敌方技能的基础伤害分量(= 攻击基线 × 技能伤害倍率,普通攻击倍率 1 为特例);无伤害分量的技能(增益/妨害类)不掷不折;棋盘来源一律无视护甲等级——伏击附加、爆裂、清障炸药、奖励即时伤害、技能必中附加分量(rider,2026-09-19)全部必中全额不掷,这是本机制的边界切口,与"奖励/惩罚必中"同构。护甲等级(数值轴,掷点打折)与护甲类型(属性轴,克制修正)严格分离:护甲类型不做护甲等级映射,克制修正点数读表、消费面不变,两概念在文档、表字段与代码键中不得混用。数值载体:主角与敌方护甲等级行值读 hero / enemy 表的 armor_class 列(正式行值归怪物设定批,登记[待办清单](../../06-待办清单.md)),ac_up(护甲强化)在其上加算(幅度/层数读 `status_effects.tres`)。攻击加成(`attack_bonus`)为结构位预留字段,切片恒 0,未来归元进度 / 武器附魔投值。掷点时机在结算战斗段内、每次基础攻击伤害计算时判定,消费 `armor_roll` 封闭流(逐次掷逐次取号,可逐位回放)。
EV 参考数不入正文(派生读数,需要时按判定式与现行表值自行复算);旧 defense_up 的减伤墙已整体退役换装为 AC(无双轨,见版本历史)。微调旋钮 = 档位边界与档位值,不动护甲等级值。换装点锚定:基准 AC(读 hero 表)自带的方向性偏移与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)已登记的加难杠杆扫描合并处理;其生存链区间模型按掷点带宽口径复核(带宽含暴击档与折扣档),"零红档"验收保留。
@@ -199,7 +199,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
乘数 = 1 + 池合成值 ÷ 100;池内加算、每池独立封顶 ±100 百分点 → 乘数域 [0, 2];四池对称:敌打主角 = hero_defense × enemy_output,主角打敌 = hero_offense × enemy_defense(2026-09-18 结构修复批:hero_offense 乘区接线落地——attack_up 普通分量直乘旁路退役,旧"切片现状"注记销项)
护甲等级掷点:掷单骰(骰面读表),掷点 ≥ 护甲等级 + 攻击加成 → 全额;低掷按缺口查减伤档位表(边界与档值读表,无零档)
暴击:天然最大面(读表)→ 该次基础攻击分量 ×暴击倍率(读表)且恒全额(双方同规;掷点层概念,与技能重击严格区分)
伤害下限:任何攻击落地伤害 ≥ damage_floor(读表,全局 max(damage_floor, ·)——折扣与池归零都不产生 v=0 伤害行)
伤害下限:任何来源的伤害落地 ≥ damage_floor(读表,全局 max(damage_floor, ·)——折扣与池归零都不产生 v=0 伤害行;2026-09-20 扩全来源,取值域 [1, +∞))
吃掷点分量 = 主角普通分量 / 敌方技能基础伤害分量;穿刺、魔法、增益/妨害施放、必中附加分量与棋盘来源伤害不掷不折
治疗量 = min( 当前生命 + 表值, 生命上限 )
```
@@ -207,7 +207,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
| 边界 | 规则 |
|---|---|
| 修正池封顶 | 同侧百分比修正加算后每池独立收口 ±100 百分点;乘数可为 0——输出压制触池底时落地伤害由全局下限保底 damage_floor(读表)(叠满免伤归零的结构面已随护甲等级换装消失) |
| 伤害下限 | 任何攻击落地伤害至少 damage_floor(读表,全局 max(damage_floor, ·));"被减伤归零 v=0"零值伤害行语义退役,重档折扣行文本记"被压制"——免伤与零输出仍逐行可见 |
| 伤害下限 | 任何来源的伤害落地至少 damage_floor(读表,全局 max(damage_floor, ·)——2026-09-20 扩全来源:攻击双方/棋盘直伤/地形变异/负向反噬,取值域 [1, +∞) 不设上限);"被减伤归零 v=0"零值伤害行语义退役,重档折扣行文本记"被压制"——免伤与零输出仍逐行可见 |
| 护甲等级掷点 | 必中非归零:掷单骰(骰面读表)对防守方护甲等级 + 攻击加成(恒 0),低掷按缺口查减伤档位表(读表)三档折扣、档位不设零档;天然最大面暴击 ×暴击倍率(读表)恒全额;只吃基础攻击分量(主角普通分量、敌方技能基础伤害分量),棋盘来源伤害与增益施放不掷不折 |
| 溢杀 | 一刀超出目标剩余生命的部分丢弃:不转移给下一个敌人、不存续、无负生命中间态 |
| 治疗 | 生命不溢出上限;满血正向治疗零兑付,记"奖励未生效"行 |
@@ -297,7 +297,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
| 甲效矩阵 | 整数点数 {−1, 0, +1} | 三档加法修正(克制 +1 / 中性 0 / 被克 −1)九格现行值读 `settlement.tres`(provisional——2026-09-18 加法核换装,量纲 percent 退役) | 键集 = 攻击类型 {普通, 穿刺, 魔法} × 护甲类型 {轻甲, 魔法护甲, 重甲},3×3 满格结构冻结;数值归调参 |
| 护甲等级掷点 | 骰面 int [2,1000] · nat 最大面 [1,骰面] · 暴击倍率 percent [100,999] | 骰面 / nat 最大面 / 暴击倍率读表(2026-09-16 拍板定稿) | 回合内随机:每吃掷点分量逐次掷骰,掷点低于防守方护甲等级 + 攻击加成触发档位折扣;天然最大面暴击 ×暴击倍率(读表)且恒全额(双方同规);消费 `armor_roll` 封闭流(逐次掷逐次取号) |
| 减伤档位表 | 边界升序 + 档位值降序 percent [1,99],档数 = 边界数 + 1 | 边界与档值读 `settlement.tres`(roll_tier_bounds / discount 档位,2026-09-16 拍板定稿) | 低掷缺口按边界查档(读表);档位不设零档(非归零);微调旋钮 = 本表,不动护甲等级值 |
| 伤害下限 `damage_floor` | int [1, 999] | 读 `settlement.tres` damage_floor(2026-09-16 拍板定稿) | 任何攻击落地伤害全局 max(damage_floor, ·);零值伤害行语义随批退役 |
| 伤害下限 `damage_floor` | int [1, 999] | 读 `settlement.tres` damage_floor(2026-09-16 拍板定稿;2026-09-20 扩全来源) | 任何来源的伤害落地全局 max(damage_floor, ·);零值伤害行语义随批退役 |
| 攻击加成 `attack_bonus` | int [0, 999] | 0(结构位) | 掷点阈值 = 防守方护甲等级 + 攻击加成;切片恒 0,未来归元进度 / 武器附魔投值 |
| 护甲等级 `armor_class`(防守方字段) | int [0, 999] | 主角与敌方现行值读 hero / enemy 表 armor_class 列(暂定) | 字段本体在敌人表与主角表(归[敌人系统](敌人系统.md)),行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);敌方正式行值归怪物设定批(见待办清单);与护甲类型(克制属性轴)两概念不得混用 |
| 段序常量 | 固定五段 | 结构冻结 | 加载期恒等校验,违例拒绝启动 |
@@ -319,7 +319,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
- 战斗段次序:主角先手后逐敌"按摇定技能行兑现、结算伤害、执行上报"各恰一次;主角倒下立即短路,剩余敌人不行动。
- 护甲等级掷点:吃掷点分量(主角普通分量、敌方技能基础伤害分量)逐次掷单骰(骰面读表)——掷点 ≥ 防守方护甲等级 + 攻击加成全额兑付;低掷按缺口查减伤档位表(边界与档值读表),档位不设零档;天然最大面暴击该分量 ×暴击倍率(读表)且恒全额;穿刺/魔法分量与棋盘来源伤害(伏击附加、爆裂、清障炸药、奖励即时)、必中附加分量及增益/妨害施放不掷不折。
- 新效应词汇(2026-09-19):伤害技 rider_mult 行的每次攻击,伤害行携带 rider 值且终值 = max(伤害下限, 主分量链结果) + rider(停手轮零池零伏击下逐拍精确复算);rider 键只随带 rider_mult 的技能行出现;妨害技 = 施放行 + 状态按 target_side 落主角(投掷阈值随行可读下调),冷却/保底/死亡作废三闸无一例外。
- 伤害下限与留档:任何攻击落地伤害 ≥ damage_floor(读表),全流水零 v=0 伤害行、零"被减伤归零"行;掷点读数、护甲等级与档位随伤害行留档,天然最大面(nat20)行带暴击标记。
- 伤害下限与留档:任何来源的伤害落地 ≥ damage_floor(读表,2026-09-20 扩全来源),全流水零 v=0 伤害行、零"被减伤归零"行;掷点读数、护甲等级与档位随伤害行留档,天然最大面(nat20)行带暴击标记。
- 数值边界:伤害下限保底后全程无零值/负值伤害;溢杀丢弃不转移;治疗封顶不溢出。
- 出口分发:先判主角倒下(负)再判敌清空(胜);停手与耗尽轮恒同图,清图轮才允许换图。
- 关卡收束:关卡结束清空魔法道具背包恰一次并返回清空前计数;战斗结束不清背包。
@@ -354,3 +354,4 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值
| v0.16 | 2026-09-18 | **甲效矩阵加法核换装批(用户拍板数值语言——小整数加法核,与 01-核心循环 数值语言条款 / registry / 切片代码同批)**:量纲 percent→整数点数,三档(克制 +1/中性 0/被克 −1)九格改值〔normal 0/+1/−1、pierce −1/+1/0、magic 0/−1/+1〕,pierce×heavy = 0 中性为用户特别拍板;五档词表与百分比乘区退役(v0.15 的五档表随批短命退役,理由=个位数刻度假粒度);分量算术改述=折算取整后加修正点数;缺项回退 100→0;奖励直伤行 payload 键 effectiveness 保留、值语义改点数;池乘区/AC 折扣档/暴击保留百分比并成文粒度口径(数值语言条款:百分比仅此三处既有粗档+开发侧工具);切片同批:settlement.tres/settlement_table.gd/damage_math/battle_orchestrator/smoke/registry/01-核心循环同步 |
| v0.17 | 2026-09-19 | **技能池新效应词汇批(用户拍板——设计权威 docs/proposal-status-vocabulary.md v1.0,与 敌人系统 / 增益状态 / registry / 切片代码同批)**:① 三乘法链尾部 +必中附加分量 rider(伤害技 rider_mult 字段:max(伤害下限, floor(攻击基线 × rider_mult))——后置加法、必中全额、不进乘区不出暴击、价位锚 0.75 = AC 折扣档最轻档;"固定值伤害"改形——固定值不随基线缩放与共享技能表前提冲突);② 增益/妨害技 = 同族施放行(0 伤害不掷不折不兑伏击),妨害状态按状态行 target_side 落主角——零新授予通道;③ 必中家族清单 +rider(掷点边界切口);④ 公式行/吃掷点行/验收标准三处同步 + 新效应词汇验收条目(rider 逐拍精确复算 + rider 键封闭 + 妨害落主角端到端);⑤ 实装面 = 仅 L2 Boss 卓尔(毒爆 +rider、新行蛛网束缚妨害→失衡),其余敌种不动;多段命中经用户拍板退役不入词汇表 |
| v0.18 | 2026-09-19 | **插旗不可逆批(用户拍板全套落地,2026-09-18 提案转正;与排雷玩法 v0.5 / 行动经济 v0.4 / 地图战斗资源 v0.12 / registry / 切片代码同批)**:① 授予段「抵消过滤」改述「判定基线」——撤旗动作退役,旗判定以轮末在场旗为基线,被挖开的旗不入基线;② 新增插旗不可逆四情况兑付表:①标中照常 / ②插旗雷格直挖只吃挖雷惩罚标中不发 / ③标空照常 / ④插旗安全格直挖零惩罚零奖励(正向作废 + reward_ineffective 归因行);③ 挖格批兑付表补四情况分支;④ 标中资格措辞改「旗无移除手段」(拔旗重插通道消失);⑤ P0 闭环第 2/4 步与验收标准同步(「抵消过滤」条改「挖旗格兑付改判」)。切片同批:minesweeper_rules 挖旗格放行 + flag_pull 出目录 + dug_under_flag 事件标记、battle_orchestrator 情况④零奖励抑制、action_economy 表 flag_pull_ap_cost 删除、冒烟 317→327 项 0 失败(四情况探针 `_smoke_flag_irreversible_quadrants`) |
| v0.19 | 2026-09-20 | **伤害下限全来源批(用户拍板「任何伤害取值域 [1,+∞),最小值一定是 1」;与 06 清单「零伤害/无威胁组合的跨字段护栏」收口 / registry / 切片代码同批,台账 100)**:① 下限语义从"任何攻击落地伤害"扩为"任何来源的伤害落地"——攻击双方(原有)+棋盘克制直伤(counter_component 增 landed_floor 参数,空桶不吃修正恒 0 边界不变)+爆裂正向+负向反噬(穿刺陷阱/魔法反噬/heal 反噬)+地形变异 flat_damage,全部收进 damage_floor 闸内;② 取值域成文 [1, +∞) **不设上限**——「零伤害/无威胁组合」条目的跨表上界护栏半边随拍板裁决为不设(上不封顶),敌种攻击基线 0 的退化态经下限自然消解(0 基线攻击落地仍 ≥1,"无威胁敌"结构性不存在);③ 现行表值下零行为变更(棋盘直伤贴底值 2−1=1 本就在闸内),本批=结构保证+调参防误配;④ 判读口径/约束表/调参表/验收四处措辞同步;冒烟 352→355 项 0 失败(+贴底/穿透/空桶三断言)。版本号注记:v0.19 在伏击上限删除批(未合并分支)中已被占用,本条与之合并时以先落籍者为准顺延避让 |
+1 -1
View File
@@ -354,7 +354,7 @@ entities:
pool_clamp_hi: int pp(结构冻结 +100——percent 池地板域上界;原"七字段 pool_clamp_lo_hi"措辞作废,数据配置 GDD 行按收编先例以本条为准)
round_direction: enum {floor}(结构冻结——单一取整规则)
armor_effectiveness: Dictionary 攻击类型×护甲→克制修正点数(加法 delta,域 [−3,+3],缺项回退 0 中性;键集结构冻结 {normal, pierce, magic} × {light, ward, heavy};现行九格读数不列于本 registry——读 data/tables/settlement.tres(**2026-09-18 加法核换装批:量纲由百分比改整数点数,三档 克制 +1/中性 0/被克 −1,五档百分比读数随批退役**);**2026-09-15 命名统一批:改为语义键,原 {base, dmg_a, dmg_b} × {none, a, b} 位置键作废**;数值 provisional 归 难度曲线与Boss)
ac_roll: 护甲等级掷点(**2026-09-16 护甲等级掷点批定稿,数字即规范**——骰面 roll_faces=20、nat 最大面 crit_roll=20、暴击倍率 crit_multiplier=200、攻击加成 attack_bonus=0〔结构位,元进度/武器附魔未来投值〕、伤害下限 damage_floor=1、流名 armor_roll_stream="armor_roll";判定式:掷 1d20,掷点 ≥ 防守方护甲等级 + 攻击加成 → 全额、低掷按缺口查档〔见 ac_discount_tiers〕,nat20 暴击该基础攻击分量 ×2 且恒全额〔双方同规〕;任何攻击落地伤害 ≥ damage_floor〔全局 max(1,·)——零值伤害行语义退役,重档折扣行文本记"被压制"〕;吃掷点分量 = 主角先手攻击普通分量 / 敌方技能基础伤害分量〔= 攻击基线 × 技能伤害倍率——2026-09-16 敌人技能池批改述,原"敌方攻击拍与重击拍基线伤害"退役;无伤害分量的增益技不掷不折〕,棋盘来源伤害〔伏击附加 / 爆裂 / 清障炸药 / 奖励即时——2026-09-19 充能退役后无充能分量〕必中全额不掷;回合内随机、消费 armor_roll 封闭流逐次掷逐次取号,可逐位回放)
ac_roll: 护甲等级掷点(**2026-09-16 护甲等级掷点批定稿,数字即规范**——骰面 roll_faces=20、nat 最大面 crit_roll=20、暴击倍率 crit_multiplier=200、攻击加成 attack_bonus=0〔结构位,元进度/武器附魔未来投值〕、伤害下限 damage_floor=1、流名 armor_roll_stream="armor_roll";判定式:掷 1d20,掷点 ≥ 防守方护甲等级 + 攻击加成 → 全额、低掷按缺口查档〔见 ac_discount_tiers〕,nat20 暴击该基础攻击分量 ×2 且恒全额〔双方同规〕;任何攻击落地伤害 ≥ damage_floor〔**2026-09-20 伤害下限全来源批(用户拍板)**:语义扩为任何来源的伤害落地——攻击双方/棋盘克制直伤/爆裂/地形变异/负向反噬全部收进闸内,伤害取值域 [1, +∞) 不设上限;全局 max(1,·)——零值伤害行语义退役,重档折扣行文本记"被压制"〕;吃掷点分量 = 主角先手攻击普通分量 / 敌方技能基础伤害分量〔= 攻击基线 × 技能伤害倍率——2026-09-16 敌人技能池批改述,原"敌方攻击拍与重击拍基线伤害"退役;无伤害分量的增益技不掷不折〕,棋盘来源伤害〔伏击附加 / 爆裂 / 清障炸药 / 奖励即时——2026-09-19 充能退役后无充能分量〕必中全额不掷;回合内随机、消费 armor_roll 封闭流逐次掷逐次取号,可逐位回放)
ac_discount_tiers: Dictionary 缺口档边界→档位值 percent(**2026-09-16 定稿**——roll_tier_bounds=[3,7] · roll_tier_discounts=[75,50,25],档数 = 边界数 + 1;缺口 1-3 → ×0.75 · 4-7 → ×0.5 · 8+ → ×0.25,档位不设零档〔非归零〕,取整沿全局 floor;EV 参考数〔按判定式复算〕= AC10 期望减免 21.25% / AC11 25% / AC12 28.75%;微调旋钮 = 边界与档位值,不动 AC 值;难度曲线与Boss 生存链区间带宽补扫含暴击档与折扣档、"零红档"验收保留)
validation: segment_order 违例致命 · effect_pool_map 悬空致命 · p_perfect 域 {100,200}(2026-09-10 载体域——100 = "完美必须 ≥ 不加倍"机制语义下界,200 = 双份交付)——战斗结算 冒烟三行致命 manifest(segorder_violation / poolmap_dangling / pperfect_oob)
mechanics: 结算段序骨架唯一权威载体(授予→增益/减益→战斗→衰减→判定——2026-09-15 格面资源批五段,item_window/item 两段随可选类删除下线)· **随机口径(2026-09-15 护甲等级批修订)**:结算换算层引入回合内随机(ac_roll 护甲等级掷点——必中非归零、低掷按 ac_discount_tiers 档位折扣),掷点流归属未定〔rng_service 流封闭清单 board_gen/reward_roll/encounter 不含结算内消费——新增流须改代码+P1 支柱评审、复用 encounter 则改"实例化期恰一 scope"绑定,登记 战斗结算「待办」,rng_service 条目随定稿批修订〕· 可回放契约 = **封闭随机流可回放**(同 master_seed 同意图序列 ⇒ 步骤流逐位复现——数据配置 AC-15 落点,原"结算路径零随机 / 步骤流逐行相同"口径随批作废;开战掷区间 / 装板摇号属初始化随机维持不变)· 调用序钉死 按摇定技能行兑现→apply_damage→commit_action(2026-09-16 技能池批改型——原 query_attack→apply_damage→advance 随行为环退役;行型 10 类同批改型:蓄力行 charge → 施放行 cast〔增益技 0 伤害施放、具名技能、不兑伏击〕)· 衰减恒执行含末轮 · 高光双落载体(perfect_sweep P_perfect——2026-09-10 修订为真实双份兑付载体 / 标中旗 highlight 标记)· 流水行协议字段分层(公共 7 字段 + 行类型特有 target/effect_id/pool_value/聚合计数——2026-09-10 评审批修订;行类型封闭枚举 10 类——2026-09-15 格面资源批由 15 类收拢:删道具行 / 已消耗未生效行 / 使用被拒行 / 窗口打开锚行 window_open / 窗口跳过锚行 window_skip 五类随可选类删除下线〔2026-09-15 窗口锚行批曾由 13 扩为 15,同日回撤〕;行来源断言两层豁免集合同批修订 = 行型豁免 {decay, verdict} × 来源类别豁免 {hero_attack, enemy_action, clear_reward},豁免不等于免检——豁免行仍受公共字段与各自语义约束,清单改动须同步 战斗结算 明细流水一节与 battle_log_view 格式化)· **类型化克制结算规格 = 战斗结算 GDD F6(W3 补全,2026-09-14 重算批;2026-09-15 命名统一批;2026-09-19 充能退役批——挖掘期充能/战斗段消费半边废止,加法核点数修正)**——逐分量 armor_effectiveness 查表(奖励直伤道具消费方保留)
+3
View File
@@ -12,6 +12,7 @@
## 当前状态快照(收口批先更新本节,再追加台账;≤10 行)
- **更新于**: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 在案)。纯文档零代码,冒烟不适用
- **更新于**:2026-09-20(**地形变异首批类型定稿批**,独立 worktree 分支 terrain-variation-20260919,台账 96):用户六点裁决落地——①首批四类型两轴×两关(荆棘丛/藤蔓缠绕=第一关 dungeon 平原密林;岩浆/烬覆=第二关 underdark 幽暗地域;岩浆/冰冻旧占位退役);②机制枚举化 effect/trigger/placement 三枚举+跨字段互锁(伤害型只落未开格、信息型打开显数字时触发),新增类型=加行不改代码;③数量=总格数 5%+每关+2、全连通单片≤4;④布置段=战斗初始化第 4 步(生成→打开状态初始化→资源格→变异格,用户拍板顺序),生成器四阶段化;⑤反制道具改排 Alpha(counter_items 字段位预留);⑥biome_tags→board_types 更名对齐 board_type 词表。伤害型=轮末结算扣血(荆棘 1/岩浆 2,插旗格直挖照吃=地形后果)、信息型=呈现层数字遮蔽(模拟读数经查询面不受影响);variant_place 新封闭流(R3 向量 5785725196205023206)。合并 master 4708940 吸收 R3 后暴露并修复布置片粘连 bug(片间 8 邻隔离)。冒烟 352 项 0 失败+四探针全过;R3+unique 读数(基线格 atk+0%):L1 普通 83%→43%/完美 87%→70%、L2 普通/完美 87%→60%,L1 Boss 承伤 26.7%→49.8%(带缘)、L2 完美 Boss 承伤 55.8% 越带(≤50%)——变异为显著难度增量,压力不足方向性缓解、L2 Boss 承伤越带归调参批;文档 v0.3/棋盘生成四阶段化/战斗结算六处随机流/registry 三条目/06 清单(四条目收口、全局作用域+反制改排 Alpha、清单 53→51 条)+00/02/03/05 过期提法清理
@@ -256,3 +257,5 @@
98. **显影尘待办条目移除批(2026-09-20,本会话——用户直接指令「这条待办事项可以删除了:辅助道具(魔法道具)统一在 Alpha 阶段重新设计,垂直切片不需要相关内容」;worktree 铁律批内执行,纯文档零代码)**:**裁决面**——06 清单「显影尘效果重定」(地形变异组名下,原归属魔法道具内容重定批·排垂直切片收尾后)按用户指令删除,去向=并入 **Alpha 阶段魔法道具整体重设计**(解决即移除口径,2026-09-18 拍板;清单 47→46 条)。**连带悬空指认清偿四处**:①06 反制维度承载失义条目归属行——原「与显影尘重定批〔排垂直切片收尾后〕的合流关系随两批同窗化自然解除」改写为「显影尘重定条目已随魔法道具整体重设计并入 Alpha、自本清单移除」(台账 85 错窗登记的历史链条就此闭合);②魔法道具.md 五维度表信息维度存根行——显影尘半边改指 Alpha 重设计拍板,地穴全图卷半边保留见待办;③03-内容规模.md 待定句同口径拆分(显影尘归 Alpha/地穴全图卷待重定在 06);④registry aux_items 三处现行注记(effect_kinds/mvp_content/closures)「魔法道具 待办」指针改指「随魔法道具整体重设计归 Alpha(2026-09-20 用户拍板,原 06 待办条目移除)」——显影尘名称保留、六行登记与字段 schema 不动(重设计的对象载体),历史修订块按「历史不改写」豁免未动。**边界**——地穴全图卷效果重定(重定需拍板:纯全图预读还是另配信息半边)与探宝罗盘两方案评估两条目未动(后者 2026-09-19 已拍板排 Alpha,与本批去向口径一致;两者同属魔法道具族,是否一并并入 Alpha 重设计待用户后续表态);元进度道具工坊/00 概念/03 清单罗列中的显影尘均为登记现状陈述非待办指针,未动。**验证**——纯文档零代码,冒烟不适用;全仓 grep 复核显影尘×待办残留仅剩良性事实句。
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 不适用本批文件面。
@@ -297,7 +297,7 @@ func _settle() -> void:
var vrow: Dictionary = db.variation.row_by_id(String(vid))
if String(vrow.get("effect", "")) != "flat_damage":
continue # 触发词表按 effect 路由:flat_damage=on_open 兑现;hide_number/on_open 外组合 = 数据行新词表未接线(显式忽略面)
var dmg: int = int(vrow.get("effect_value", 0))
var dmg: int = maxi(int(db.settlement.damage_floor), int(vrow.get("effect_value", 0))) # 伤害下限全来源(2026-09-20)
_enemy_system.apply_damage(_enemy_system.hero_unit(), dmg)
_emit_row("damage", "地形变异", evt.cell, ri, "%s → 主角" % String(vrow.get("display_name", vid)), dmg, {"target": "hero", "variant_id": String(vid)}, "")
for evt in _facts_flags:
@@ -372,6 +372,8 @@ func _apply_percent_row(row: Dictionary, source_class: String, cell: Vector2i, r
# blast 正向 = 全体存活敌各 power 点(无敌 → 奖励未生效行);blast 负向 = 敌方伏击 +stacks 层(cap/溢出行协议不变);
# heal 正向 = 主角回复 clamp(满血 → 奖励未生效行);heal 负向 = 主角直伤 power 点(不经增益状态;归零 → 战斗段短路/判定段判负)。
# pierce/magic(伤害道具批 2026-09-18)正向 = 单目标克制直伤(必中全额);负向 = 主角直伤。
# 伤害落地全局下限(2026-09-20 用户拍板「任何伤害取值域 [1,+∞)」):本函数全部伤害兑付点经 damage_floor 保底——
# 克制修正后触底、表值误配 ≤0 都不可能打出 0/负伤害(v=0 伤害行语义早已退役,本批把棋盘侧从"表值碰巧 ≥1"升级为结构保证)。
# 返回 "redeemed" = 实际有效兑付 / "zero" = 零兑付(行已自记)——清图高光只记实际有效兑付。
func _apply_flat_row(row: Dictionary, source_class: String, cell: Vector2i, ri: int, highlight: String = "", label_suffix: String = "") -> String:
var ctype := String(row.cell_type)
@@ -384,16 +386,18 @@ func _apply_flat_row(row: Dictionary, source_class: String, cell: Vector2i, ri:
if alive.is_empty():
_emit_row("reward_ineffective", source_class, cell, ri, "%s 未生效(无存活敌人)" % display, 0, {"batch_key": String(row.reward_id)}, highlight)
return "zero"
var blast_dmg: int = maxi(int(db.settlement.damage_floor), power) # 伤害下限全来源(2026-09-20)
for u in alive:
_enemy_system.apply_damage(u, power) # 恒定表值,逐个;受击即死——死亡即不动手
_emit_row("damage", source_class, cell, ri, "%s → 全体敌人 ×%d" % [display, alive.size()], power, {"target": "all_enemies", "count": alive.size()}, highlight)
_enemy_system.apply_damage(u, blast_dmg) # 恒定表值(下限保底),逐个;受击即死——死亡即不动手
_emit_row("damage", source_class, cell, ri, "%s → 全体敌人 ×%d" % [display, alive.size()], blast_dmg, {"target": "all_enemies", "count": alive.size()}, highlight)
return "redeemed"
if ctype == "pierce" or ctype == "magic":
# 伤害道具批(2026-09-18):穿刺/魔法两型——正向 = 单目标克制直伤(attack_type 字段查克制矩阵,
# 必中全额不掷点——棋盘来源伤害既有口径;目标 = 固定顺位最前存活敌);负向 = 主角直伤(复用反噬通道)。
if String(row.get("polarity", "positive")) == "negative":
_enemy_system.apply_damage(_enemy_system.hero_unit(), power)
_emit_row("damage", source_class, cell, ri, "%s → 主角" % display, power, {"target": "hero"}, highlight)
var backfire: int = maxi(int(db.settlement.damage_floor), power) # 伤害下限全来源(2026-09-20)
_enemy_system.apply_damage(_enemy_system.hero_unit(), backfire)
_emit_row("damage", source_class, cell, ri, "%s → 主角" % display, backfire, {"target": "hero"}, highlight)
return "redeemed"
var target = _enemy_system.default_target()
if target == null:
@@ -401,14 +405,15 @@ func _apply_flat_row(row: Dictionary, source_class: String, cell: Vector2i, ri:
return "zero"
var atk_type: String = String(row.get("attack_type", ctype))
var delta: int = _counter_delta(atk_type, String(target.get("armor_type", "light")))
var dealt: int = DamageMath.counter_component(power, delta)
var dealt: int = DamageMath.counter_component(power, delta, int(db.settlement.damage_floor))
_enemy_system.apply_damage(target, dealt)
_emit_row("damage", source_class, cell, ri, "%s → %s" % [display, String(target.display_name)], dealt, {"target": String(target.display_name), "attack_type": atk_type, "effectiveness": delta}, highlight)
return "redeemed"
if ctype == "heal":
if String(row.get("polarity", "positive")) == "negative":
_enemy_system.apply_damage(_enemy_system.hero_unit(), power)
_emit_row("damage", source_class, cell, ri, "%s → 主角" % display, power, {"target": "hero"}, highlight)
var backlash: int = maxi(int(db.settlement.damage_floor), power) # 伤害下限全来源(2026-09-20)
_enemy_system.apply_damage(_enemy_system.hero_unit(), backlash)
_emit_row("damage", source_class, cell, ri, "%s → 主角" % display, backlash, {"target": "hero"}, highlight)
return "redeemed"
if int(_enemy_system.hero_unit().get("hp", 0)) <= 0:
# 主角已倒下(同轮更早的负向直伤致死)——治疗不再合法作用,按"奖励未生效"留痕
@@ -532,7 +537,8 @@ func _combat_segment(ri: int) -> void:
# 原"基础 + 穿刺/魔法充能三分量"模型随充能系统整体退役——克制策略归冒险前配置(营地换型 / 未来冒险前参数面),
# 局内不再有挖掘攒弹药的第二伤害供给。attack_up 增益经 hero_offense 池乘攻击合计(见池乘区注记)。
# 护甲等级掷点批(2026-09-16):基础分量吃掷点判定(含暴击);棋盘来源伤害不掷不折;
# 任何攻击落地伤害 ≥ damage_floor(全局 max(1,·))——"被减伤归零 v=0"零值伤害行分支随批退役。
# 任何伤害落地 ≥ damage_floor(全局 max(1,·)——2026-09-20 用户拍板扩全来源:攻击双方/棋盘直伤/地形变异/反噬,
# 取值域 [1,+∞) 无上限)——"被减伤归零 v=0"零值伤害行分支随批退役。
var hero_alive: bool = int(_enemy_system.hero_unit().get("hp", 0)) > 0
var hero_target = _enemy_system.default_target()
if hero_alive and hero_target != null:
@@ -15,12 +15,15 @@ static func pool_damage(d_raw: int, p_hero: int, p_enemy: int) -> int:
# 充能分量:充能点数(调用方已按奖励定义换算)+ 克制修正点数(加法核——2026-09-18 换装,原 percent 乘区退役);
# 空桶(点数 ≤ 0)不吃修正恒 0——零充能分量无伤害可修正,不产生负贡献(等价旧量纲 0×任何 percent = 0)
# 空桶(点数 ≤ 0)不吃修正恒 0——零充能分量无伤害可修正,不产生负贡献(等价旧量纲 0×任何 percent = 0;
# 空桶不受 landed_floor 影响——没有伤害落地就没有下限可言)
# 类型化点数分量:点数 + 克制修正(加法核)——2026-09-19 充能退役后唯一消费方 = 奖励直伤道具(棋盘火力)
static func counter_component(points: int, counter_delta: int) -> int:
# landed_floor:落地伤害全局下限(读 settlement.damage_floor,调用方传入)——2026-09-20 用户拍板
# 「任何伤害落地取值域 [1,+∞)」:克制修正后触底也保底 1,调参降档不可能打出 0/负伤害
static func counter_component(points: int, counter_delta: int, landed_floor: int = 0) -> int:
if points <= 0:
return 0
return points + counter_delta
return maxi(landed_floor, points + counter_delta)
# ---- 护甲等级掷点批(2026-09-16 用户拍板——判定式与档位参数全在 settlement.tres,本类只做算术)----
@@ -22,7 +22,8 @@ extends Resource
@export var armor_effectiveness: Dictionary = {} # 克制修正矩阵(加法点数 delta):{攻击类型 {normal|pierce|magic}: {护甲 {light|ward|heavy}: 点数 [-3,+3]}}
# ---- 护甲等级掷点批(2026-09-16 用户拍板,数字即规范——registry settlement_table.ac_roll/ac_discount_tiers 同批定稿)----
# 判定式:掷 1d20,掷点 ≥ 防守方 AC + 攻击加成 → 全额;低掷按缺口(AC−掷点)查档打折,无 miss、无零收益档;
# nat 最大面(crit_roll)= 暴击:该次基础攻击分量 ×2 且恒全额;任何攻击落地伤害全局下限 damage_floor(≥1)。
# nat 最大面(crit_roll)= 暴击:该次基础攻击分量 ×2 且恒全额;任何伤害落地全局下限 damage_floor(≥1)——
# 2026-09-20 用户拍板扩全来源(攻击双方/棋盘直伤/地形变异/反噬,取值域 [1,+∞) 无上限)。
# 掷点只吃基础攻击分量(主角普通分量 / 敌方攻击拍与重击拍基线),穿刺/魔法充能与棋盘来源伤害不掷不折。
# 微调旋钮 = 档位边界(roll_tier_bounds)与档位值(roll_tier_discounts),不动 AC 值(armor_class 归单位表)。
@export var roll_faces: int = 20 # [2,1000] knob——掷点骰面(d20)
@@ -31,7 +32,7 @@ extends Resource
@export var roll_tier_discounts: Array = [] # 档位值 percent 降序(与 bounds 同长;[75,50,25] = ×0.75/×0.5/×0.25)
@export var crit_roll: int = 20 # [1,roll_faces] knob——nat 最大面 = 暴击触发掷点(恒全额)
@export var crit_multiplier: int = 200 # [100,999] percent knob——暴击倍率(200 = ×2,只乘该次基础攻击分量)
@export var damage_floor: int = 1 # [1,999] knob——任何攻击落地伤害全局下限("被减伤归零 v=0"行语义随批退役)
@export var damage_floor: int = 1 # [1,999] knob——任何伤害落地全局下限·全来源("被减伤归零 v=0"行语义随批退役)
@export var armor_roll_stream: String = "armor_roll" # 掷点封闭流名(rng_service STREAM_NAMES 成员;逐次掷逐次取号,可逐位回放)
const ARMOR_KEYS := ["light", "ward", "heavy"]
@@ -356,6 +356,12 @@ func _smoke_armor_roll() -> void:
check(all_positive, "全战斗流零 v=0 伤害行(伤害下限全局生效)")
check(attack_ok, "hero_attack/enemy_action 伤害行掷点读数+档位随行留档(P2 归因)")
check(board_ok, "棋盘来源伤害行零掷点字段(伏击附加/爆裂/直伤/清障炸药必中全额)")
# ⑥ 全来源伤害下限(2026-09-20 用户拍板:任何伤害落地取值域 [1,+∞) 无上限——棋盘克制直伤此前
# 靠表值 2+(−1)=1 贴底无结构保证,反噬/地形变异/爆裂同为表值直落,本批全部收进 damage_floor 闸内)
var df: int = int(_db.settlement.damage_floor)
check(DamageMath.counter_component(2, -1, df) == 1, "棋盘克制直伤贴底 → 下限 1(点数 2 vs 不利修正 −1)")
check(DamageMath.counter_component(1, -3, df) == 1, "克制修正触底穿透 → 下限 1(点数 1 vs 修正 −3)")
check(DamageMath.counter_component(0, 5, df) == 0, "空桶不吃修正恒 0(零点数分量无伤害可落地——边界不变不受下限影响)")
# 定位种子下首场战斗第一行主角攻击伤害行(停手轮——零授予零充能,普通分量 = 攻击基线裸值)