From 656f00055f9abd10dc912b7a915a5b655c461a91 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 20 Sep 2026 02:15:46 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(combat):=20=E4=BC=8F=E5=87=BB=E5=8D=95?= =?UTF-8?q?=E8=BD=AE=E4=B8=8A=E9=99=90=E5=88=A0=E9=99=A4=E6=89=B9=E2=80=94?= =?UTF-8?q?=E2=80=94=E5=8F=8D=E7=81=BE=E9=9A=BE=E6=8A=A4=E6=A0=8F=E9=80=80?= =?UTF-8?q?=E5=BD=B9=EF=BC=882026-09-20=20=E7=94=A8=E6=88=B7=E6=8B=8D?= =?UTF-8?q?=E6=9D=BF=EF=BC=89=E2=80=94=E2=80=94=E2=91=A0=E5=8A=A8=E6=9C=BA?= =?UTF-8?q?=3D=E7=94=A8=E6=88=B7=E8=A3=81=E5=86=B3=EF=BC=9A=E6=91=86?= =?UTF-8?q?=E7=83=82=E8=BF=9E=E8=B8=A9=E9=9B=B7=E5=8F=97=E7=BD=9A=E6=98=AF?= =?UTF-8?q?=E5=BA=94=E5=BE=97=E5=8F=8D=E9=A6=88=EF=BC=8C=E8=A1=8C=E5=8A=A8?= =?UTF-8?q?=E7=82=B9=E9=A2=84=E7=AE=97=E5=A4=A9=E7=84=B6=E5=B0=81=E9=A1=B6?= =?UTF-8?q?=EF=BC=88AP=206/=E8=BD=AE=EF=BC=89=E6=97=A0=E9=9C=80=E5=86=8D?= =?UTF-8?q?=E8=AE=BE=E6=88=AA=E6=96=AD=EF=BC=9B=E5=8E=9F=E4=B8=8A=E9=99=90?= =?UTF-8?q?=204=20<=20AP=206=20=E7=A0=8D=E6=8E=89=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=A4=E5=B1=82=E7=9A=84=E4=BF=9D=E6=8A=A4=E6=81=B0=E6=98=AF?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=8D=E8=A6=81=E7=9A=84=E4=BF=9D=E6=8A=A4?= =?UTF-8?q?=EF=BC=9B=E2=91=A1=E4=BB=A3=E7=A0=81=E5=88=A0=E9=99=A4=E9=9D=A2?= =?UTF-8?q?=3Denemy.tres=20=E5=8D=81=E4=BA=8C=E8=A1=8C=20advantage=5Fper?= =?UTF-8?q?=5Fround=5Fcap=20=E5=AD=97=E6=AE=B5+=E6=95=8C=E8=A1=A8=E5=9F=9F?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C+=E6=88=98=E6=96=97=E7=BC=96=E6=8E=92?= =?UTF-8?q?=E5=99=A8=20=5Fenemy=5Fcap=20=E6=88=AA=E6=B5=81=E4=B8=8E?= =?UTF-8?q?=E6=BA=A2=E5=87=BA=E8=A1=8C=E5=8F=91=E5=B0=84+=E5=8D=95?= =?UTF-8?q?=E4=BD=8D=E5=AE=B9=E5=99=A8=20F3=20=E4=BC=8F=E5=87=BB=E6=8E=88?= =?UTF-8?q?=E4=BA=88=E8=AE=A1=E5=88=92=E5=87=BD=E6=95=B0=E4=B8=8E=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E5=AD=97=E6=AE=B5+=E6=97=A5=E5=BF=97=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=20overflow=20=E8=A1=8C=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E4=B8=8E=E8=81=9A=E5=90=88=E7=B1=BB=E5=9E=8B=EF=BC=88=E6=AE=8B?= =?UTF-8?q?=E7=95=99=E6=B6=88=E8=B4=B9=E9=9D=A2=E9=9B=B6=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E2=91=A2=E8=A1=8C=E5=8D=8F=E8=AE=AE=2010=20=E7=B1=BB=E2=86=929?= =?UTF-8?q?=20=E7=B1=BB=3D=E6=BA=A2=E5=87=BA=E6=9C=AA=E7=94=9F=E6=95=88?= =?UTF-8?q?=E8=A1=8C=E5=94=AF=E4=B8=80=E5=8F=91=E5=B0=84=E6=BA=90=E5=8D=B3?= =?UTF-8?q?=E4=BC=8F=E5=87=BB=E4=B8=8A=E9=99=90=E6=88=AA=E6=B5=81=EF=BC=8C?= =?UTF-8?q?=E4=B8=8A=E9=99=90=E5=88=A0=E9=99=A4=E5=90=8E=E9=9B=B6=E5=8F=91?= =?UTF-8?q?=E5=B0=84=E9=9D=A2=E6=95=B4=E7=B1=BB=E4=B8=8B=E7=BA=BF=EF=BC=9B?= =?UTF-8?q?=E6=BB=A1=E5=B1=82=E6=8B=92=E6=94=B6=E8=B5=B0=E5=A5=96=E5=8A=B1?= =?UTF-8?q?=E6=9C=AA=E7=94=9F=E6=95=88=E8=A1=8C=EF=BC=88=E5=A2=9E=E7=9B=8A?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=96=87=E6=A1=A3=E4=B8=89=E5=A4=84=E8=A1=8C?= =?UTF-8?q?=E5=90=8D=E9=9A=8F=E4=BB=A3=E7=A0=81=E5=AE=9E=E5=8F=91=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=EF=BC=89=EF=BC=9B=E2=91=A3GDD=20=E5=90=8C=E6=AD=A5=3D?= =?UTF-8?q?=E6=95=8C=E4=BA=BA=E7=B3=BB=E7=BB=9F=20v0.11=EF=BC=88=E4=BC=8F?= =?UTF-8?q?=E5=87=BB=E8=8A=82=E9=87=8D=E8=BF=B0/=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=A1=A8=E5=88=A0=E8=A1=8C/=E7=BB=93=E6=9E=84=E5=86=BB?= =?UTF-8?q?=E7=BB=93=E8=81=94=E5=8A=A8=E7=BA=AA=E5=BE=8B=E5=8E=BB=E4=B8=A4?= =?UTF-8?q?=E6=9D=A1/=E9=AA=8C=E6=94=B6=E6=A0=87=E5=87=86=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=EF=BC=89+=E6=88=98=E6=96=97=E7=BB=93=E7=AE=97=20v0.19?= =?UTF-8?q?=EF=BC=88=E8=A1=8C=E5=8D=8F=E8=AE=AE=209=20=E7=B1=BB/=E6=8E=88?= =?UTF-8?q?=E4=BA=88=E6=AE=B5=E7=9B=B4=E6=8E=88=E6=97=A0=E4=B8=8A=E9=99=90?= =?UTF-8?q?/=E5=AE=88=E6=81=92=E6=9D=A1=E6=94=B9=E6=B1=A0=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=EF=BC=89+=E5=9C=B0=E5=9B=BE=E6=88=98=E6=96=97?= =?UTF-8?q?=E8=B5=84=E6=BA=90=20v0.13+=E9=9A=BE=E5=BA=A6=E6=9B=B2=E7=BA=BF?= =?UTF-8?q?=E4=B8=8EBoss=20v0.14+UX=20=E4=B8=89=E6=96=87=E6=A1=A3/HUD/?= =?UTF-8?q?=E9=9F=B3=E9=A2=91/=E6=88=98=E6=96=97=E8=A1=A8=E7=8E=B0?= =?UTF-8?q?=E8=A1=8C=E5=8D=8F=E8=AE=AE=E8=AE=A1=E6=95=B0=E4=B8=8E=E6=9C=AA?= =?UTF-8?q?=E7=94=9F=E6=95=88=E7=B1=BB=E8=A1=8C=E6=9E=9A=E4=B8=BE=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=EF=BC=9B=E2=91=A5registry=3D=E4=BC=8F=E5=87=BB?= =?UTF-8?q?=E6=BA=A2=E5=87=BA=E8=AF=8D=E6=9D=A1=E4=B8=8E=20cap=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=A1=8C=E5=88=A0=E9=99=A4+=E6=95=8C=E8=A1=A8=20claus?= =?UTF-8?q?e3=5Fsupply=20=E4=B8=8A=E7=95=8C=E5=BC=8F=E6=94=B9=20unit=5Fcou?= =?UTF-8?q?nt=20=C3=97=20AP=20=E4=B8=8A=E7=95=8C=20=C3=97=20m=5Famb+?= =?UTF-8?q?=E4=B8=A4=E5=A4=84=E4=B9=89=E5=8A=A1=E5=B1=A5=E8=A1=8C=E5=9B=9E?= =?UTF-8?q?=E6=89=A7=E8=BF=BD=E5=8A=A0=202026-09-20=20=E4=BF=AE=E8=AE=A2?= =?UTF-8?q?=E6=B3=A8=E8=AE=B0+=E8=A1=8C=E5=9E=8B=E5=B0=81=E9=97=AD?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=209=20=E7=B1=BB=EF=BC=9B=E2=91=A606=20?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=3D=E4=BC=8F=E5=87=BB=E9=87=8F=E7=BA=B2?= =?UTF-8?q?=E4=B8=8E=E4=B8=8A=E9=99=90=E8=81=94=E5=8A=A8=E5=A4=8D=E6=A0=B8?= =?UTF-8?q?=E6=94=B9=E5=86=99=E4=B8=BA=E9=87=8F=E7=BA=A7=E5=BD=93=E9=87=8F?= =?UTF-8?q?=E5=A4=8D=E6=A0=B8=EF=BC=88=E4=B8=8A=E9=99=90=E9=9D=A2=E6=94=B6?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E9=87=8F=E7=BA=A7=E9=87=8D=E6=A0=B8=E5=BD=92?= =?UTF-8?q?=E6=9B=B2=E7=BA=BF=E8=B0=83=E5=8F=82=E6=89=B9=EF=BC=89+?= =?UTF-8?q?=E5=90=8C=E6=B7=B1=E5=BA=A6=E7=AC=AC=E4=BA=8C=E6=95=8C=E7=A7=8D?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=E6=B7=B7=E7=BC=96=E4=B8=8A=E9=99=90=E5=8F=96?= =?UTF-8?q?=E5=80=BC=E9=9D=A2=E6=B6=88=E8=A7=A3=E6=B3=A8=E8=AE=B0=EF=BC=9B?= =?UTF-8?q?=E2=91=A7=E9=AA=8C=E8=AF=81=3D=E5=86=92=E7=83=9F=20330=20?= =?UTF-8?q?=E9=A1=B9=200=20=E5=A4=B1=E8=B4=A5=E4=B8=89=E9=97=B8=E5=85=A8?= =?UTF-8?q?=E8=BF=87=EF=BC=88blast=20=E8=B4=9F=E5=90=91=E6=96=AD=E8=A8=80?= =?UTF-8?q?=E6=94=B9=20stacks=20=E8=AF=BB=E6=9E=81=E6=80=A7=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E8=A1=8C=E7=9A=84=E7=9B=B4=E6=8E=88=E7=B4=AF=E5=8A=A0?= =?UTF-8?q?=EF=BC=89+gdd=5Flint=20=E4=B8=8E=20master=20=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E4=B8=80=E8=87=B4=EF=BC=888=20=E6=96=87=E4=BB=B6=E5=AD=98?= =?UTF-8?q?=E9=87=8F=E4=B8=8D=E9=80=9A=E8=BF=87=E9=9D=9E=E6=9C=AC=E6=89=B9?= =?UTF-8?q?=E5=BC=95=E5=85=A5=EF=BC=89=EF=BC=9B=E2=91=A8=E9=81=97=E7=95=99?= =?UTF-8?q?=3Ddocs/lean-gdd-sample-b1.md=20=E6=A0=B7=E4=BE=8B=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=B8=A4=E5=A4=84=E6=97=A7=E5=8F=A3=E5=BE=84=E6=9C=AA?= =?UTF-8?q?=E5=8A=A8=EF=BC=88=E9=9D=9E=E8=A7=84=E8=8C=83=E4=BB=B6=EF=BC=89?= =?UTF-8?q?=EF=BC=9B=E9=9A=8F=E6=89=B9=E6=96=B0=E5=A2=9E=20rhythm=5Fbatch.?= =?UTF-8?q?gd.uid=EF=BC=88=E7=BC=96=E8=BE=91=E5=99=A8=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E4=BA=A7=E7=89=A9=EF=BC=8CGodot=204.7=20uid?= =?UTF-8?q?=20=E4=BE=A7=E8=BD=A6=E5=85=A5=E7=B1=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/06-待办清单.md | 12 ++++----- design/gdd/systems/冒险循环/难度曲线与Boss.md | 3 ++- design/gdd/systems/战斗循环/地图战斗资源.md | 3 ++- design/gdd/systems/战斗循环/增益状态.md | 6 ++--- design/gdd/systems/战斗循环/战斗结算.md | 12 ++++----- design/gdd/systems/战斗循环/战斗表现.md | 2 +- design/gdd/systems/战斗循环/敌人系统.md | 19 +++++++------- design/gdd/systems/表现与支撑/HUD框架.md | 4 +-- design/gdd/systems/表现与支撑/音频.md | 4 +-- design/registry/entities.yaml | 16 ++++++------ design/ux/battle.md | 12 ++++----- design/ux/interaction-patterns.md | 2 +- .../core/battle_orchestrator.gd | 25 +++++++------------ .../core/status_container.gd | 2 +- .../core/unit_container.gd | 7 ------ .../data/schemas/enemy_table.gd | 3 --- .../data/tables/enemy.tres | 12 --------- .../data/tables/reward.tres | 2 +- .../presentation/views/battle_log_view.gd | 6 ++--- .../smoke/rhythm_batch.gd.uid | 1 + .../smoke/smoke_all.gd | 16 +++++------- 21 files changed, 68 insertions(+), 101 deletions(-) create mode 100644 prototypes/dungeon-sweeper-vertical-slice/smoke/rhythm_batch.gd.uid diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 908bb662..07d10794 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -98,13 +98,13 @@ ### 敌人系统 -#### 伏击量纲与上限的联动复核 +#### 伏击量纲的量级当量复核 -**现状**:附加值 3 为 provisional(量纲已定稿);上限与量纲、攻击基线存在联动,联调前须重跑方向性预检并同步 registry。**2026-09-17 数值压缩批注记**:magnitude +3 → +1(量纲未变,参见 `data/tables/status_effects.tres` ambush 行);压缩批后 magnitude=1 状态下,方向性预检须按新值重跑(cap=4 下右臂 m_amb × min(AP,cap) 量级同步压缩——量级当量重核随数值压缩批同步推进) +**现状**:附加值 +1 为 provisional(量纲已定稿,参见 `data/tables/status_effects.tres` ambush 行)。原登记的上限与量纲联动面已消解:**单轮授予上限(advantage_per_round_cap)随 2026-09-20 用户拍板删除**——反灾难护栏退役,一轮踩雷数由行动点预算天然封顶,连踩雷受罚是应得反馈;溢出未生效行类型(行协议 10→9 类)与混编遭遇上限取值歧义随之消失。 -**归属**:战斗结算对账闭合时裁决 +**归属**:战斗结算对账闭合时裁决(量级当量随难度曲线调参批对账) -**状态**:待办(2026-09-17 量级当量重核同步推进) +**状态**:上限面已收口(2026-09-20 删除批,冒烟 330 项全绿);量级重核归曲线调参批 #### 零伤害 / 无威胁组合的跨字段护栏 @@ -117,11 +117,11 @@ #### 同深度第二敌种与精英 / Boss 编码位 -**现状**:现键结构(关卡序号 × 节点深度 × 敌种)无编码位;混编遭遇下伏击上限取哪行值未定义——现行结构恒单行值。 +**现状**:现键结构(关卡序号 × 节点深度 × 敌种)无编码位。 **归属**:随[关卡节点地图](systems/冒险循环/关卡节点地图.md)定稿改键一并裁决 -**状态**:部分收口(2026-09-17)——同层多遭遇问题已由关卡节点地图 v1.0 的**节点编号升级**消解(`node_depth` 语义 = 关卡内唯一节点编号,同层不同节点各查各行,键结构零改动);**不设精英 / Boss 编码位**(Boss = 最大编号节点,精英 P2 内容承载)。剩余面继续待办并改归属:同场多敌种(同一编号行集多行)的行集校验放开 + 混编遭遇伏击上限取值口径——归属**敌人表行集多行批(战斗侧,排技能池实施批落地后)** +**状态**:部分收口(2026-09-17)——同层多遭遇问题已由关卡节点地图 v1.0 的**节点编号升级**消解(`node_depth` 语义 = 关卡内唯一节点编号,同层不同节点各查各行,键结构零改动);**不设精英 / Boss 编码位**(Boss = 最大编号节点,精英 P2 内容承载)。剩余面继续待办并改归属:同场多敌种(同一编号行集多行)的行集校验放开 ——归属**敌人表行集多行批(战斗侧,排技能池实施批落地后)**(混编伏击上限取值口径面已随 2026-09-20 单轮上限删除消解) #### 敌方护甲等级(armor_class)正式行值 diff --git a/design/gdd/systems/冒险循环/难度曲线与Boss.md b/design/gdd/systems/冒险循环/难度曲线与Boss.md index 9c48d67b..e4bef358 100644 --- a/design/gdd/systems/冒险循环/难度曲线与Boss.md +++ b/design/gdd/systems/冒险循环/难度曲线与Boss.md @@ -215,7 +215,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 第二关图版注记(分支节点图批):兄弟精 = bugbear 复用(幽暗地域部族设定——display_name 与第一关"熊地精"错开;池差异化改造 = 蓄力拍退役换突刺,复用共享技能行);巨蜘蛛 = 新敌种(群行倾向、首遇位固定数量不加骰——首遇教学位纪律);蛛化卓尔精灵 = Boss 专属池(独占技毒爆 + 权重轮廓,血量为 r_boss 口径 provisional 锚——定位本关最大单场消耗);护甲面:轻甲(蜘蛛)与魔法护甲(兄弟精)同关错开克制面,Boss 重甲。「兄弟精」称呼经用户 2026-09-17 确认 = 熊地精 bugbear;Boss 定名蛛化卓尔精灵(用户同日拍板)。节点编号 2 = 奖励点(直通空态)、3 = 恢复点(rest_heal_pct 行字段兑付)——不开战斗、无敌人/棋盘行。 -单轮伏击授予上限已定稿(行值读敌人表 advantage_per_round_cap)。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定,教学位与首遇位都不豁免——没有区间上界的行自然取定值,那不是豁免,是区间宽度为零。 +伏击不设单轮授予上限(原 advantage_per_round_cap 行值已随 2026-09-20 用户拍板删除——一轮踩雷数由行动点预算天然封顶)。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定,教学位与首遇位都不豁免——没有区间上界的行自然取定值,那不是豁免,是区间宽度为零。 技能池投值(池权重/冷却/保底的所有权本文,机制归[敌人系统](../战斗循环/敌人系统.md);行值读 `skills.tres` 与 `enemy.tres` 的 pool,全部 provisional): @@ -279,3 +279,4 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 | v0.11 | 2026-09-18 | **甲效矩阵用户调参批同步(零代码,事实源 settlement.tres 五格改值——详见[战斗结算](../战斗循环/战斗结算.md) v0.15)**:正文克制矩阵节与调参表联动行「克制/中性/被克三档」措辞改五档(克制 / 弱克制 / 中性 / 弱被克 / 被克,档值读表);联动义务面扩写——矩阵档值变更与敌种护甲变更同列,都必须复算 Boss 与普通战的击杀区间。敌种甲类型行值零改动 | | v0.12 | 2026-09-18 | **数值语言拍板批·甲效矩阵加法核换装同步(零行值改动——与 01-核心循环 数值语言条款 / 元进度 / registry / 06-待办清单 / 切片代码同批)**:正文克制矩阵节与调参表克制矩阵行两处五档措辞改三档加法(克制 / 中性 / 被克三档加法修正 +1 / 0 / −1 点,量纲由百分比改整数点数);重定价义务面扩写——矩阵加法修正点数随攻击成长的重定价与敌种护甲变更同列,均须复算 Boss 与普通战的击杀区间 | | v0.13 | 2026-09-19 | **技能池节奏体验验证批(与 06-待办清单 / tools/skill_rhythm_audit.py / smoke/rhythm_batch.gd 同批,零行值改动)**:06 待办「单拍行为环的体验验证(改型:技能池节奏体验验证)」解决移除——判读带用户拍板(过旱 = 战斗整体全敌人零特殊技;过涝 = 连续特殊技无普攻基底);调参表「池 EV 锚」行登记 60 种子正式读数(份额对表 / 保底零越界 / 过涝无信号 / 过旱归短命杂鱼生存时长);**方法论规则成文:节奏/EV 类日志读数须 ≥50 distinct seeds**(4200 系 10 种子×网格重复曾产生地精一伙 0/484 突刺假象,4300 系复跑证伪——与 armor_roll 种子偏置发现同族,见 registry rng_service 关联面) | +| v0.14 | 2026-09-20 | **伏击单轮上限删除批同步(零行值改动——上限行值整体退役)**:关键投值节单轮伏击授予上限改述不设上限;原 advantage_per_round_cap 对账供给面随批作废 | diff --git a/design/gdd/systems/战斗循环/地图战斗资源.md b/design/gdd/systems/战斗循环/地图战斗资源.md index 9f2b14c7..11a41ba3 100644 --- a/design/gdd/systems/战斗循环/地图战斗资源.md +++ b/design/gdd/systems/战斗循环/地图战斗资源.md @@ -123,7 +123,7 @@ ### 负向恒即时:惩罚没有库存语义 -负向兑付全部在授予段当场执行,不入库、不出窗口——惩罚不设库存、不留存量。正向里的 percent 类(增益行)进[增益状态](增益状态.md)的容器;flat 类(群伤、治疗、直伤)当场结算。叠层饱和由战斗结算既有池 clamp 承载;blast 负向(伏击)额外受[敌人系统](敌人系统.md)的伏击上限护栏约束,溢出照既有"溢出未生效"行协议。负向直伤使主角生命归零时,结算按战斗结算的致死短路规则处理。 +负向兑付全部在授予段当场执行,不入库、不出窗口——惩罚不设库存、不留存量。正向里的 percent 类(增益行)进[增益状态](增益状态.md)的容器;flat 类(群伤、治疗、直伤)当场结算。叠层饱和由战斗结算既有池 clamp 承载;blast 负向(伏击)直授无上限(原伏击单轮上限已随 2026-09-20 用户拍板退役)。负向直伤使主角生命归零时,结算按战斗结算的致死短路规则处理。 举证:本节为兑付语义,无计算。 @@ -238,3 +238,4 @@ | v0.9 | 2026-09-17 | **数值纪律收口批:正文与调参表 knob 现行值改指路存根(事实源 `data/tables/*.tres` 与 registry),3 处失同步值修正**——候选集合节"合计 = 67"字面量改指路 reward.tres cell 池正向行 weight 之和(现行值读表);候选集合表"类型频次合计"列两处 67 改"见 reward.tres";代码事实源清单五型 weight 明细(attack_up 20 · ac_up 16 · spark_aoe 16 · heal_minor 3 · weaken 12)改"5 行正向行 weight 现行值读 reward.tres" | | v0.11 | 2026-09-18 | **战斗数值结构修复批·极性矩阵同步(2026-09-18 盘问会话用户拍板,与战斗结算 v0.14 / 增益状态 v0.9 / registry / 切片代码同批)**:① defense 型负向 off_guard 行失同步修正——原残留"hero_defense 池,承伤加深"改"AC 掷点阈值轴负向、不入池"(off_guard 换装 AC 轴随结构修复批落地,effect_pool_map 删键);② weaken 型正向行补续时定案注记(同名重复授予只刷新剩余次数——2026-09-18,叠层措辞随批退役) | | v0.12 | 2026-09-19 | **插旗不可逆批·极性矩阵同步(用户拍板全套落地,与战斗结算 v0.18 / 排雷玩法 v0.5 / registry / 切片代码同批)**:矩阵「标旗后当轮撤旗」行删除(撤旗动作退役)、「插旗格直接挖开」行新增——安全格零兑付(四情况④零惩罚零奖励)、雷格负向照常(四情况②只受挖雷一层惩罚、标中不发);路由描述「抵消过滤」随战斗结算改「判定基线」 | +| v0.13 | 2026-09-20 | **伏击单轮上限删除批同步(与战斗结算 v0.19 / 敌人系统 v0.11 等同批)**:负向即时节 blast 负向的伏击上限护栏与溢出行协议措辞删除,改直授无上限 | diff --git a/design/gdd/systems/战斗循环/增益状态.md b/design/gdd/systems/战斗循环/增益状态.md index cd6053df..c821b80f 100644 --- a/design/gdd/systems/战斗循环/增益状态.md +++ b/design/gdd/systems/战斗循环/增益状态.md @@ -90,7 +90,7 @@ 并存分支没有满层上限,但容器规模天然有界:实例数的上界就是受理过的授予数——多受理一份就多一份实例,多少份在授予那一刻就完全确定,不会无限膨胀。 -叠加是纯加法:几层就是几倍的行值。叠到行上限后再授予同款会被拒绝,容器一个字不变;但这份奖励不会被无声吞掉——结算明细多一行"溢出未生效"(满层后白拿的那份,如实留痕),连来源一起写明,玩家看得到"这层白拿了"。浪费诚实、可规划。 +叠加是纯加法:几层就是几倍的行值。叠到行上限后再授予同款会被拒绝,容器一个字不变;但这份奖励不会被无声吞掉——结算明细多一行"奖励未生效"(满层后白拿的那份,如实留痕),连来源一起写明,玩家看得到"这层白拿了"。浪费诚实、可规划。 无论重复来自玩家直接踩出的格子,还是连锁展开自动开出的奖励格,都走同一个授予入口、同样产生溢出行、同样留痕。 @@ -187,7 +187,7 @@ empower 与 fortify 是敌方技能池增益技在容器侧的数据落点(技 3. 容器按表行合并策略受理(新建 / 叠一层 / 刷新),实例立即生效并携带归因记录。 4. 战斗结算查询生效清单,逐行兑付进结算公式(有效值 = 层数 × 行值)。 5. 兑付完做轮末衰减:全部实例剩余次数减一,归零移除——先兑付、后衰减。 -6. 战斗外授予、未知状态、满层授予一律被拒且容器不变;满层的"溢出未生效"行归战斗结算的结算明细。 +6. 战斗外授予、未知状态、满层授予一律被拒且容器不变;满层的"奖励未生效"行归战斗结算的结算明细。 7. 战斗结束通知到达:全实例清空、容器回空,不跨到下一场战斗。 ## P1 / P2 后置 @@ -233,7 +233,7 @@ empower 与 fortify 是敌方技能池增益技在容器侧的数据落点(技 - 授予即生效:状态发入当轮结算即兑付第一次,无"待生效"中间态。 - 只记账不去重:同一事实被转化两次授予,入账两层——去重责任在战斗结算。 - 叠层不减钟:叠加只加层数,剩余次数保持首次授予定下的轨迹不变。 -- 满层拒绝原子且留痕:叠满后再授予返回失败、容器逐字不变;结算明细多一行"溢出未生效"(含来源)。 +- 满层拒绝原子且留痕:叠满后再授予返回失败、容器逐字不变;结算明细多一行"奖励未生效"(含来源)。 - 先兑付后衰减:每轮结算恰做一次衰减,归零实例当轮移除;停手轮、弃图刷新轮照常衰减。 - 合成不收口:容器输出的有效值恒等于层数 × 行值,越出百分比域不封顶不保底;地板在战斗结算侧。 - 快照抗重载:已授予实例的数值在战斗中不受配置表重载影响,只影响后续授予。 diff --git a/design/gdd/systems/战斗循环/战斗结算.md b/design/gdd/systems/战斗循环/战斗结算.md index a0f70aa0..f47429b2 100644 --- a/design/gdd/systems/战斗循环/战斗结算.md +++ b/design/gdd/systems/战斗循环/战斗结算.md @@ -71,14 +71,13 @@ ### 明细流水:每一行都能指回你刚才的哪一步棋 -结算过程中每一件事都写一行明细,每行标注来源——哪个安全格、哪面旗、哪颗雷、清图奖励。这份流水是结算明细屏(玩家逐行查看决策兑现结果的界面)的数据源,也是回放对账与数据导出共读的唯一契约。行型封闭为 10 类,不允许私自增加;新增或下线行型属于行协议变更,必须走本文修订,并同步呈现层的行格式化。 +结算过程中每一件事都写一行明细,每行标注来源——哪个安全格、哪面旗、哪颗雷、清图奖励。这份流水是结算明细屏(玩家逐行查看决策兑现结果的界面)的数据源,也是回放对账与数据导出共读的唯一契约。行型封闭为 9 类(2026-09-20 伏击上限删除批下线溢出未生效行),不允许私自增加;新增或下线行型属于行协议变更,必须走本文修订,并同步呈现层的行格式化。 | 行型 | 什么时候写 | |---|---| | 效果行 | 增益/减益段每条效果一行:本次授予贡献值与池合成值分列,防误读 | | 伤害行 | 每次伤害一行:目标、伤害分量、修正终值、击杀标记;吃护甲等级掷点的分量,掷点读数与折扣档位随行留档,nat20 暴击随行标记并金框高亮(行型封闭清单不变) | | 治疗行 | 治疗生效一行:封顶后的真实回复量 | -| 溢出未生效行 | 踩雷超出伏击上限,超出的每颗一行 | | 奖励未生效行 | 满层拒收、满血治疗等合法例外一行 | | 标旗未中行 | 旗插空的零值归因行,每颗雷只记一次;标错的负向兑付另记效果行 | | 蓄力行 | 敌人本拍蓄力不动手(攒下一击)时记一行 **(2026-09-16 敌人技能池批改型为施放行 `cast`:敌人本拍施放增益技——0 伤害动作、具名技能、不兑付伏击;蓄力语义改写为纯攻击增益技,见[敌人系统](敌人系统.md))** | @@ -146,9 +145,9 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × | 即时全体伤害(flat) | blast 正向 | 当场对全体存活敌各扣表值生命 | 场上无敌可打时零兑付,记"奖励未生效"行 | | 即时治疗(flat) | heal 正向 | 主角按表值回复并封顶上限 | 满血时零兑付,记"奖励未生效"行 | | 直伤(flat) | heal 负向 | 主角当场扣表值生命,不经增益状态 | 生命归零即走致死短路 | -| 伏击加层 | blast 负向 | 敌方还手附加伤害 +stacks 层(读 `reward.tres` ambush_double 行),入伏击池 | 超上限部分记"溢出未生效"行 | +| 伏击加层 | blast 负向 | 敌方还手附加伤害 +stacks 层(读 `reward.tres` ambush_double 行),入伏击池 | 直授无上限(2026-09-20 上限退役) | -伏击有上限([敌人系统](敌人系统.md)的反灾难护栏):blast 负向兑付超出上限时只有上限内生效,超出的逐颗记"溢出未生效"行。伏击聚成一个池,本结算里多个敌人共享同一池值、互不消耗,且只活一轮、轮末清零。其余四型的负向不受伏击上限约束,各自受池 clamp 与叠层上限承载。 +伏击无上限(原[敌人系统](敌人系统.md)反灾难护栏随 2026-09-20 用户拍板退役——一轮踩雷数由行动点预算天然封顶)。伏击聚成一个池,本结算里多个敌人共享同一池值、互不消耗,且只活一轮、轮末清零。其余各型负向受池 clamp 与叠层上限承载。 标中资格认雷不认旗:兑付资格以雷格实例为键——旗无任何移除手段(拔旗退役,重复插旗被"已有旗"拒绝)、同一颗雷跨轮不重复兑付;换图后新雷是新实例,资格自然重置。同一面旗一直插在雷上,每轮都会重新上报标中,去重是本系统的职责。 @@ -313,7 +312,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 - 挖旗格兑付改判(插旗不可逆批 2026-09-19):有旗格直接挖开被受理——插旗安全格直挖零奖励(作废归因行恰一次)、插旗雷格直挖只吃挖雷惩罚;被挖开的旗不入轮末判定(零标中 / 标空兑付);开格事实不可撤。 - 每事实恰一次:每格受理、每旗判定恰好一次;重复投递不改变结果。 - 极性路由正确:开安全格 / 标中旗只兑正向、开雷格 / 标错旗只兑负向;兑付效果与该格资源类型的字典行一一对应。 -- 伏击守恒:blast 负向兑付超出上限时兑付数等于上限,超出部分逐颗记"溢出未生效"行;多敌共享同一伏击池值。 +- 伏击池共享:多敌共享同一伏击池值;blast 负向逐层直授无上限(原单轮上限 2026-09-20 退役)。 - 完美排雷:零误标且至少一面标中时第二份兑付恰一次并发高光行;出现误标或零标中则无高光;计数换图重置。 - 开轮摇号:每轮恰摇一次(首轮同样;轮内刷新换图不重摇);摇定后兑现前死亡 → 本拍技能作废(零敌方行动行)、不进冷却不进保底计数;已兑现技能进冷却、保底计数按执行结果更新。 - 战斗段次序:主角先手后逐敌"按摇定技能行兑现、结算伤害、执行上报"各恰一次;主角倒下立即短路,剩余敌人不行动。 @@ -325,7 +324,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 - 关卡收束:关卡结束清空魔法道具背包恰一次并返回清空前计数;战斗结束不清背包。 - 可回放(封闭随机流口径):同种子同输入两遍步骤流逐位复现;随机消费仅限五处封闭随机流——开战掷骰(初始化随机)、技能摇号 `behavior_roll`(回合内、开轮时点、步骤流之外)、护甲等级掷点 `armor_roll`(回合内、步骤流之内)、奖励格摇号 `reward_roll`(初始化、装板期)、换板棋盘生成 `board_gen`(初始化、清图轮换板时点),无未登记随机源、零界面等待;单敌出招轨迹可独立复放、互不穿插。 - 无来源即炸:每行明细都能指回一个来源事实(棋盘格、单位、清图或段级结论);找不到来源即断言失败,行型与来源类别两层豁免清单见明细流水一节,豁免行仍受其它契约约束。 -- 行型封闭:流水只出现本文登记的 10 类行型;新增或下线行型必须走本文修订并同步呈现层行格式化,未登记行型不得落行。 +- 行型封闭:流水只出现本文登记的 9 类行型;新增或下线行型必须走本文修订并同步呈现层行格式化,未登记行型不得落行。 ## 待办 @@ -354,3 +353,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 | **伏击单轮上限删除批(用户拍板——与 敌人系统 / 地图战斗资源 / 难度曲线与Boss / registry / 切片代码同批)**:① 行型协议 10 类→9 类——溢出未生效行下线(唯一发射源 = 伏击上限截流,上限删除后零发射面);② 授予段伏击加层改直授无上限(反灾难护栏退役——一轮踩雷数由行动点预算天然封顶);③ 核验清单伏击守恒条改伏击池共享;④ 切片同批:enemy.tres 12 行字段删除、敌表校验/编排器截流/单位容器 F3 计划函数/日志视图 overflow 格式化删除、冒烟 blast 负向断言改直授累加(330 项 0 失败) | diff --git a/design/gdd/systems/战斗循环/战斗表现.md b/design/gdd/systems/战斗循环/战斗表现.md index 471377a6..a687e8b6 100644 --- a/design/gdd/systems/战斗循环/战斗表现.md +++ b/design/gdd/systems/战斗循环/战斗表现.md @@ -63,7 +63,7 @@ |---|---|---| | 受击反馈 / 死亡表现 / 顺位标记 | [敌人系统](敌人系统.md)的资产需求下限三类(终稿归样张批,呈现语义已归 battle.md) | 终稿资产与动画兑现;死亡不得瞬消 | | 特殊技技能动画定稿 | [敌人系统](敌人系统.md)三档可见性规格(2026-09-16 敌人技能池批改型:行为环姿态预告〔一态与三态〕退役——现行数据面 = 普通攻击零表示、特殊技攻/防系两型动画〔攻击系/增益系〕,暴击为掷点层无前置表示;battle.md 意图线索映射目录已同步改型注记) | 把摇定动画映射(两型)做成终稿资产 | -| 溢出未生效行的呈现 | [增益状态](增益状态.md)定稿时登记(数据源是[战斗结算](战斗结算.md)的明细协议) | 让这类行在演出中可读、不被吞掉 | +| 奖励未生效行的呈现 | [增益状态](增益状态.md)定稿时登记(数据源是[战斗结算](战斗结算.md)的明细协议) | 让这类行在演出中可读、不被吞掉 | | 效果来源格的可读化 | 同上(候选形态:缩略图或格子高亮,坐标不直接呈现) | 把"效果来自哪一格"翻译成玩家可读的演出 | | 坍塌显形的连锁动画 | [游戏概念](../../00-游戏概念.md)的概念层拍板——坍塌显形是[连锁展开](../排雷循环/排雷玩法.md)的玩家可见名,与音频方向同批配对登记 | 连锁展开触发时的连锁演出 | | 高光兑现的演出强化 | 完美排雷与标中旗强调的机制及呈现位已由战斗结算与 battle.md 定稿 | 在既有高光行呈现之上加强演出密度 | diff --git a/design/gdd/systems/战斗循环/敌人系统.md b/design/gdd/systems/战斗循环/敌人系统.md index eb4151b8..e4880796 100644 --- a/design/gdd/systems/战斗循环/敌人系统.md +++ b/design/gdd/systems/战斗循环/敌人系统.md @@ -24,7 +24,7 @@ | 两张单位表与技能表的定义与回填 | 敌人表(含池模板)、主角表、技能表的字段、取值域、表值回填(表本体的承载与读取归数据配置) | | 技能池语义 | 池构成纪律、技能行词汇表、实例池与冷却状态、死亡作废规则 | | 目标顺位规则 | 敌方打谁、玩家与道具默认打谁的固定顺位 | -| 伏击词条量纲 | 每层伏击附加多少伤害、单轮授予上限的表值 | +| 伏击词条量纲 | 每层伏击附加多少伤害 | 不负责: @@ -147,9 +147,9 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 ### 伏击:每踩一颗雷,敌方全体多叠一层附加伤害 -玩家挖开惩罚格(雷格在玩家侧的叫法,首发类型是怪物巢穴)就是惊动巢穴:敌方全体获得一层"伏击"——敌方侧的增益词条。一层伏击 = 敌人每次伤害类技能(普通攻击或伤害技)额外附加固定点数伤害(每层表值,量纲已定稿——按主角血量点数计)。伏击只活一轮:轮末结算清零,没有跨轮存量。单轮授予有上限(表值):上限内逐颗叠加,达到上限后多踩的雷不生效,但逐颗记一行"溢出未生效"结算明细——惩罚不静默蒸发。 +玩家挖开惩罚格(雷格在玩家侧的叫法,首发类型是怪物巢穴)就是惊动巢穴:敌方全体获得一层"伏击"——敌方侧的增益词条。一层伏击 = 敌人每次伤害类技能(普通攻击或伤害技)额外附加固定点数伤害(每层表值,量纲已定稿——按主角血量点数计)。伏击只活一轮:轮末结算清零,没有跨轮存量。 -单轮上限是对"连踩多颗雷"灾难轮的反灾难护栏;单轮踩雷数天然受每轮行动点预算约束(行动点表值归[行动经济](../排雷循环/行动经济.md)),这是上限默认值的结构背景。上限配 0 表示该敌种免疫伏击:每颗雷都记明细、都可见、都无效。 +一轮内的踩雷数天然受每轮行动点预算约束(行动点表值归[行动经济](../排雷循环/行动经济.md))——这就是惩罚的自然封顶。原单轮授予上限护栏已随 2026-09-20 用户拍板退役:摆烂连踩雷受罚是应得反馈,不再截断(原上限 0 = 免疫伏击语义随之作废,未来敌种差异化免疫如需要另行立项)。 | 细则 | 含义 | |---|---| @@ -157,7 +157,6 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 | 施放行零兑付 | 增益技不出手、不读伏击层——本轮喂的伏击若逢敌人全是施放拍,一点不兑现(读怪的奖励) | | 层池共享不消耗 | 同一次结算多个敌人读同一层数,不均分、不先到先得 | | 当轮授予当轮兑付 | 授予发生在兑付之前:本轮踩的雷,若该轮有伤害拍,当轮就生效 | -| 溢出可见 | 生效层数 = min(当轮新踩雷数, 上限),其余逐颗记"溢出未生效"明细 | 举证:**伤害拍伤害 = 攻击基线 × 技能倍率 + 层数 × 每层伏击表值;施放拍恒为 0。** @@ -165,7 +164,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 伤害拍:伤害 = atk × 倍率 + a × L L = 当轮伏击层数;a = 每层伏击附加表值(provisional,量纲已定稿) 普攻拍:伤害 = atk + a × L 倍率恒 1 的特例 施放拍:伤害 = 0 不读伏击层 -生效层数 L = min(当轮新踩雷数, 单轮上限) 溢出 = 雷数 − L,逐颗记明细 +生效层数 L = 当轮新踩雷数(无上限,行动点预算天然封顶) ``` 验算(表值 provisional,行值读配置表):设熊地精攻击基线 A、重击倍率 M、L 层伏击的重击拍 = A × M + L × a;若把伏击塞进倍乘会算出 (A + L × a) × M——后置加法由此判别。 @@ -216,7 +215,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 1. 战斗开始:战斗结算按遭遇坐标调本系统生成单位——读表快照实例化本战数量的敌人(池模板快照成实例池、冷却全零),主角以血量入参生成。 2. 开轮摇号:战斗结算换算层排除冷却中技能、按行序逐敌摇定本拍动作写入实例池,随后冷却递减(首轮同样摇;轮内刷新换图不重摇)。 -3. 挖掘期踩雷:事实经战斗结算转化为伏击施加——每颗雷恰一次、上限截流、溢出逐颗记账。 +3. 挖掘期踩雷:事实经战斗结算转化为伏击施加——每颗雷恰一次、逐层记账(无上限)。 4. 每轮结算:主角先手攻击顺位最前的存活敌人;每个存活敌人按摇定技能行兑付(伤害技 = 基线 × 倍率 + 伏击附加,增益技 = 施放行 + 状态授予)。 5. 受击上报、血量递减;归 0 即移出顺位(摇定后兑现前死亡 → 本拍作废不进账)。 6. 执行上报:已兑现的技能进冷却、保底计数更新(普攻 +1 / 特殊技归零)。 @@ -252,7 +251,6 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 | hp | [1, 999] | 单位生命基线(难度修饰前) | | atk | [0, 999] | 攻击基线;0 合法 = 纯伏击伤敌种 | | pool(池模板) | {skill_id, weight} 数组,weight ∈ (0, 9999] | 技能行引用在技能表;池构成纪律与悬空引用加载期拒绝(校验在数据配置跨表通道) | -| advantage_per_round_cap | [0, 16] | 单轮伏击授予上限(行值读表,已定稿);0 = 免疫伏击;也是扫雷经济侧对账的惩罚上限供给值 | 技能表(全局单表,技能行主键 skill_id): @@ -276,7 +274,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 各敌种行值、池权重与池 EV 读数(含闸长期速率实测)一律读配置表与调参日志,本文不登记具体数值;EV 重锚与权重投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。 -结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、伏击层池共享读法、附加后置加法、伏击按主角血量点计量纲、固定顺位、每坐标恰一敌种、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在[战斗结算](战斗结算.md)结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:单轮上限 × 攻击基线(支配边界联动)、数量 × 上限(单结算上界双线性)、技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底(池节奏三联动)禁止独立调参,联调须重跑方向性预检并同步 registry(见待办)。 +结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、伏击层池共享读法、附加后置加法、伏击按主角血量点计量纲、固定顺位、每坐标恰一敌种、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在[战斗结算](战斗结算.md)结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底(池节奏三联动)禁止独立调参,联调须重跑方向性预检并同步 registry(见待办)。 ## 验收标准 @@ -286,10 +284,10 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 - 死亡即不动手:摇定后、兑现前被杀——本拍技能作废(零行动明细行),不进冷却、不进保底计数;行动完成后才死——已兑付已进账;对已死亡单位上报受击被拒绝且状态不变。 - 空池不可能:每池恰一行普通攻击(域校验),普攻冷却恒 0 → 任意实例任意拍可摇集合恒非空。 - 伏击读值:伤害拍读值 = 基线 × 倍率 + 层数 × 每层伏击表值(与"伏击进倍乘"的错算可判别);普攻 = 倍率 1 特例;施放拍恒为 0;同层数多敌读值一致、读值前后单位状态零变化。 -- 伏击授予与溢出:生效层数 = min(雷数, 上限),且生效 + 溢出 = 雷数(零静默蒸发);上限 c 时踩 N 颗雷生效 min(N, c)、溢出 N − c;上限配 0 时全部记溢出且全部无效。 +- 伏击授予:踩 N 颗雷生效 N 层、逐层直授无上限(原单轮上限 2026-09-20 退役);多敌共享同一伏击池值。 - 目标顺位:多敌时单体目标恒为生成序最前存活者,杀最前后顺延;杀至空返回空;单敌时顺位与范围效果重合。 - 快照抗改表:实例化后修改敌人表,已生成单位的数值投影与实例池逐字不变;新实例才用新表值。 -- 表校验:越域值、池权重 ≤ 0、空池、普攻配倍率/冷却、池增益 > 1、skill_id 悬空、同坐标第二敌种均在加载期报错止动;域内合法极端(攻击基线 0、上限 0)不拒;主角表恰一行、攻击配 0 拒绝。 +- 表校验:越域值、池权重 ≤ 0、空池、普攻配倍率/冷却、池增益 > 1、skill_id 悬空、同坐标第二敌种均在加载期报错止动;域内合法极端(攻击基线 0)不拒;主角表恰一行、攻击配 0 拒绝。 - 零随机回放:同一动作与受击序列驱动两个独立实例,存活投影、逐实例摇定轨迹、顺位返回序列逐项相同。 - 表实一致:三张配置表字段与 registry 的 enemy / hero / skill 条目逐字段一致。 @@ -311,3 +309,4 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 | v0.9 | 2026-09-18 | **甲效矩阵用户调参批同步(零代码,事实源 settlement.tres 五格改值——详见[战斗结算](战斗结算.md) v0.15)**:主角字段表 armor_type 行注记归因改述——轴休眠的理由由「敌方攻击恒 normal 档故中性」(依赖普通行恒 100 的旧数值结构)改为「矩阵消费面 = 主角侧、敌方攻击不查克制矩阵」(结构性,与数值无关),轴生效仍待敌方技能攻击类型批。历史注记:v0.8 行「魔法矢 ×150 / 穿刺弹 ×50 对 Boss」与当时矩阵(穿刺×魔法甲=150 / 魔法×魔法甲=50)正反互倒,系当批笔误,按历史不改写留档,正确读数见战斗结算 | | v0.7 | 2026-09-17 | **数值纪律收口批:正文与调参表 knob 现行值改指路存根(事实源 `data/tables/*.tres` 与 registry),2 处失同步值修正**——共享技能表示例"熊地精 9×2=18"改符号化"基线 A × 技能倍率 M(行值读 enemy.tres / skills.tres)";蓄力语义"施加'攻击×2'状态""×2 遇 ×2 = ×4"改"施加 empower 状态(幅度读 status_effects.tres)",两层乘法组合语义保留符号表述 | | v0.10 | 2026-09-19 | **技能池新效应词汇批(用户拍板——设计权威 docs/proposal-status-vocabulary.md v1.0,与 战斗结算 / 增益状态 / registry / 切片代码同批)**:① 技能类型枚举三→四(+妨害 debuff——对主角施减益的 0 伤害施放动作,字段复用 buff_ref/buff_duration,落点由状态行 target_side 路由〔增益 → 敌方侧 / 妨害 → 主角侧,施放类 side 守卫加载拒绝〕,执行与增益技同族施放行语义——不掷不折不兑付伏击);② 伤害技新字段 rider_mult(必中附加分量——"固定值伤害"改形:固定值不随基线缩放与共享技能表前提冲突,必中小倍率承载"躲不掉的稳定伤害");③ 池构成纪律 +每池妨害 ≤1;④ 意图三档特殊技预告扩三族(攻击系 ⚔ / 增益系 ✦ / 妨害系 ☠);⑤ 三词收敛两词——多段命中经用户拍板退役(无防御磨损体系,无对照机制),P1 字段位「命中段数」保留;⑥ 实装面 = 仅 L2 Boss 蛛化卓尔精灵(venom_burst + rider_mult 0.75;新行 web_snare 蛛网束缚 debuff→off_guard,首发载荷 = 失衡〔用户拍板〕,乏力 sapped 留作第二词汇),其余敌种不动 | +| v0.11 | 2026-09-20 | **伏击单轮上限删除批(用户拍板——与 战斗结算 / 地图战斗资源 / 难度曲线与Boss / registry / 切片代码同批)**:① 伏击节上限段与溢出可见行删除,一轮踩雷数由行动点预算天然封顶成文;② 字段表 advantage_per_round_cap 行删除(原 0 = 免疫伏击语义作废);③ 结构冻结联动纪律去单轮上限 × 攻击基线、数量 × 上限两条;④ 验收标准伏击授予与表校验条同步 | diff --git a/design/gdd/systems/表现与支撑/HUD框架.md b/design/gdd/systems/表现与支撑/HUD框架.md index f85936a4..bac990fb 100644 --- a/design/gdd/systems/表现与支撑/HUD框架.md +++ b/design/gdd/systems/表现与支撑/HUD框架.md @@ -153,7 +153,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 |---|---|---| | 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 棋盘只读投影(格态、数字、旗、小人)与移动路径查询;玩家意图批次经组合根提交 | | 上游 | [行动经济](../排雷循环/行动经济.md) | 行动点 / 储备 / 相位只读值;刷新入口可用性预判加返回值兜底 | -| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 明细流水是结算明细带的统一数据源(现行 10 类行封闭协议);段序编排信号经组合根接线 | +| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 明细流水是结算明细带的统一数据源(现行 9 类行封闭协议);段序编排信号经组合根接线 | | 上游 | [敌人系统](../战斗循环/敌人系统.md) | 英雄与敌人的只读投影(血量、顺位、摇定动作〔pending_skill/type/name〕、敌方增益 effects、存活——经战斗结算呈现快照;敌人技能池批批 2 定稿:当前拍/行动环进度字段拆除,池与权重不公开) | | 上游 | [增益状态](../战斗循环/增益状态.md) | 状态投影经战斗结算呈现面取得,零直读 | | 上游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格奖励身份投影(`query_identity` 只读回调,组合根注入)零直读 | @@ -169,7 +169,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻 |---|---| | [排雷玩法](../排雷循环/排雷玩法.md) | 已开 / 未开格态一眼可辨;悬停预承诺与可挖域常驻指示;移动路径预览即合法性指示;每次拒绝可感知且棋盘面细因可区分;停手被改判可感知 | | [行动经济](../排雷循环/行动经济.md) | 行动点与储备常显;储备清零反馈;棋盘面与资源面拒绝可区分;刷新入口与代价可读 | -| [战斗结算](../战斗循环/战斗结算.md) | 未生效类明细行(溢出未生效 / 奖励未生效)的呈现;高光行强调 | +| [战斗结算](../战斗循环/战斗结算.md) | 未生效类明细行(奖励未生效)的呈现;高光行强调 | | [敌人系统](../战斗循环/敌人系统.md) | 意图线索映射成文且全局恒定;单位顺位与血条可读;敌方共享层数各卡同值 | | [增益状态](../战斗循环/增益状态.md) | 状态栏常显;无状态时整排槽隐藏;有利 / 有害极性呈现不看数值符号 | | [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格的奖励身份常读 | diff --git a/design/gdd/systems/表现与支撑/音频.md b/design/gdd/systems/表现与支撑/音频.md index e4eb66fe..7c1b3fb9 100644 --- a/design/gdd/systems/表现与支撑/音频.md +++ b/design/gdd/systems/表现与支撑/音频.md @@ -68,7 +68,7 @@ | 挂点输入 | 来源登记 | 说明 | |---|---|---| -| 明细行类型流 | 挂点清单;数据面是[战斗结算](../战斗循环/战斗结算.md)的明细流水协议 | 结算中每件事逐行留档,行型封闭为 10 类——每种行型天然是一个音效挂点候选(伤害、治疗、衰减、判定、高光等) | +| 明细行类型流 | 挂点清单;数据面是[战斗结算](../战斗循环/战斗结算.md)的明细流水协议 | 结算中每件事逐行留档,行型封闭为 9 类——每种行型天然是一个音效挂点候选(伤害、治疗、衰减、判定、高光等) | | toast 提示触发 | 挂点清单(toast 提示条本体归 [HUD 框架](HUD框架.md)) | toast(棋盘区上缘浮出、自动消退的非模态提示)弹出时的拒绝、提示类短音候选 | | 负反馈聚合单次 | 挂点清单 | 未生效、被拒类负反馈聚合为一次响,不逐行连响——呈现侧已按聚合计数防轰炸,音频侧对齐 | | 开格拾取按奖励类别区分 | 挂点清单 | 呈现侧按奖励类别分色,音频侧对应按类别区分拾取音的听感 | @@ -108,7 +108,7 @@ | 方向 | 系统 / 文档 | 接口要点 | |---|---|---| | 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 棋盘事件——挖掘与踩雷两个反馈位的触发源 | -| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 明细流水(10 类行型)——结算、胜利反馈与全部明细挂点的事件源 | +| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 明细流水(9 类行型)——结算、胜利反馈与全部明细挂点的事件源 | | 上游 | [HUD 框架](HUD框架.md) | toast 提示触发;挂点先留的登记处(MVP 不出声) | | 协作 | [战斗表现](../战斗循环/战斗表现.md) | 坍塌显形连锁动画与音效同批配对登记,将来对位设计(挂点未定) | | 输出 | 无 | 叶子系统:纯反馈层,无对外接口 | diff --git a/design/registry/entities.yaml b/design/registry/entities.yaml index 387fcc0b..816bacd2 100644 --- a/design/registry/entities.yaml +++ b/design/registry/entities.yaml @@ -135,13 +135,13 @@ entities: empower: { display_name: 蓄力(敌方输出 ×2), target_side: enemy, unit: percent, duration_settlements: 2, max_stack: 1, stack_policy: refresh, source_class: enemy_action, magnitude_ref: data/tables/status_effects.tres } # 2026-09-16 敌人技能池批新增——蓄力技载体,进 enemy_output 池;duration 2 = 1 个有效增益拍;2026-09-17 数值压缩批:magnitude 改指路存根 fortify: { display_name: 硬化(敌方防御 −50), target_side: enemy, unit: percent, duration_settlements: 2, max_stack: 1, stack_policy: refresh, source_class: enemy_action, magnitude_ref: data/tables/status_effects.tres } # 2026-09-16 敌人技能池批新增——硬化技载体(Boss 池独占),进 enemy_defense 新池;2026-09-17 数值压缩批:magnitude 改指路存根;**2026-09-18 结构修复批:符号纠正 +100→−50**〔负值入池 = 主角攻击 ×0.5 折半;旧 +100 实际 ×2 翻倍与"硬化=减伤"语义相反,用户确认系符号 bug〕 value_status: 九行值全部 provisional;**2026-09-17 数值压缩批·文档同步——mvp_content 数值列改指路存根(magnitude_ref 指向 data/tables/status_effects.tres)**,schema 字段(unit / duration_settlements / max_stack / stack_policy / source_class)保留以承载元数据;行值历史轨迹:六行→七行(格面资源批 sapped 收编为 weaken 型负向;2026-09-16 护甲等级掷点批:defense_up 行退役换装 ac_up〔行数不变、一行换装〕);七行→九行(2026-09-16 敌人技能池批:empower + fortify 收编);**2026-09-17 数值压缩批:ambush magnitude +3 → +1 flat(量纲未变——见 ambush_unit_definition)**;**2026-09-18 结构修复批:三行结构值改写(数值仍 provisional 归 状态层重设计批)**——off_guard unit percent→ac · fortify magnitude +100→−50 · weaken stack→refresh × duration 1→2(语义与批注见各行)。验收锚:weaken→行动经济 F1 条款 2(地图战斗资源/战斗结算)· ambush 量纲→敌人系统(条款 3,量纲已定稿见 ambush_unit_definition)· 对照表→战斗结算(条款 1)· weaken 已按 战斗结算 F0 裁决修订 −25→−65(2026-09-10,值域 [60,85]、终值共裁 战斗结算 OQ2——见 anchor_warning 回执) - ambush_unit_definition: **量纲已定稿(2026-09-09 敌人系统 GDD Rule 6/F2——registry OQ2 关闭条件兑现)**:每层伏击 = 每次攻击类行为(attack/heavy)附加 magnitude 主角 HP 伤害(后置加法、不进倍乘);charge 拍零兑付(空拍蒸发);**2026-09-17 数值压缩批——magnitude +3 → +1,量纲未变**;值仍 provisional(锚验收归 地图战斗资源/战斗结算——行动经济 F1 条款 3;敌人系统 供给 cap 表值与单结算自然边界口径见 clause3_supply 条目) + ambush_unit_definition: **量纲已定稿(2026-09-09 敌人系统 GDD Rule 6/F2——registry OQ2 关闭条件兑现)**:每层伏击 = 每次攻击类行为(attack/heavy)附加 magnitude 主角 HP 伤害(后置加法、不进倍乘);charge 拍零兑付(空拍蒸发);**2026-09-17 数值压缩批——magnitude +3 → +1,量纲未变**;值仍 provisional(锚验收归 地图战斗资源/战斗结算——行动经济 F1 条款 3;敌人系统 供给 cap 表值与单结算自然边界口径见 clause3_supply 条目);**2026-09-20 修订**:cap 表值供给面随单轮上限删除退役(clause3_supply 随批修订) anchor_warning: weaken 行 vs 行动经济 F1 条款 2 锚两独立线性代理同向预检不过(百分点·结算暴露 25 vs 100;原型战斗量级 ≈1 vs ≈4 当量)——战斗结算 对照验收优先裁决,登记 战斗结算 强制检查点输入。**修复空间不对称(2026-09-09 增补)**:每结算瞬时当量归一 m_w≥51 可行(F2 越域界随移 AP 界 −408%/表界 −816%);每 AP 总暴露归一 m_w>100 被 percent ∈ [-100,100] 域禁止(该分支不可行)——OQ1 前置步骤:战斗结算 先钉死归一口径,口径落定前禁止数值修订;落总暴露则现实解 = 地图战斗资源 重定最低档参照。**参照对象迁移注记(2026-09-09 地图战斗资源 评审;2026-09-11 回迁)**:最低档安全格 buff 当量的参照对象曾迁 defense_up 当量(attack_up 时为死行——地图战斗资源 F4 迁移)——**2026-09-11 用户裁决"基础攻击恒存在"(HeroTable.atk 域 [1,999]、0 加载拒绝、MVP=6)后 attack_up 复活,参照对象回迁 attack_up 当量**(消费面 = 主角战斗段先手攻击——战斗结算 GDD 同批;defense_up 迁移退役为历史记录,attack_up 入池时 tier_min_buff 重算);本条与 clause3_supply.direction_precheck 的 25 vs 100 预检算术系 attack_up 口径历史登记——defense_up |−50|×dur2 与 attack_up 数值巧合全等(100pp),今日结论不变;**迁移后预检未按新参照重跑**的义务已于 2026-09-14 战斗结算 重算批兑现(F0/F1 按 attack_up 当量重跑 + F1 锚对照实物改 attack_up 行——本迁移注记关闭)。**F0 裁决回执(2026-09-10 战斗结算 GDD——红警关闭)**:归一口径 = **每结算瞬时当量**(总暴露分支被 percent schema 域禁止 + 与"单结算自然边界"已锁事实冲突,排除);m_w 修订 −25 → **值域 [60,85]/默认 −65**(mvp_content.weaken 已同批改写——锚两腿 @D_ref=12:7.8 > 6.0 严格大于 ✓ / 7.8 ≥ E_dig 4.5 ✓〔E_dig 读数 2026-09-14 战斗结算 重算批按 难度曲线与Boss v3 曲线重推——原 7.2 随口径退役〕);地板 = 乘数零点 −100pp、交叉层数 = ⌈100/m_w⌉ = 2(原"7 层触地板"预读按 −400% 合成带估读,更正);defense_up 参照保持(总暴露分支的"重定参照"现实解未采纳);终值 = 地图战斗资源/战斗结算 共裁(战斗结算 OQ2);增益状态 GDD 正文不改以本条为准(收编先例) rule4_exemption: 定义表非进度成长表,键 = effect_id(数据配置 Rule 4 豁免,schema 注释承载) single_enemy_assumption: **回验结果 = 不成立——敌人系统 定多敌(用户 2026-09-09 拍板;同日 敌人系统 GDD 兑现 增益状态 预授权接口漂移条款)**:MVP 战斗 = 1–3 个同敌种敌单位(EnemyTable.unit_count);效果 side-wide 语义改"全体存活敌单位"(层数 = side 共享池,**增益状态 现接口零变更兼容**);target_ref(单体寻址)= 扩展位义务——首个单体效果上线时 增益状态 补列(随批:战斗结算 归集语义/HUD框架 呈现裁决);增益状态 GDD 正文不改,以本条为准(行动经济 OQ5 收编先例) mechanics: 战斗域统一状态容器(三向效果同构实例)· 单一时限量纲 remaining_settlements(先兑付后衰减,每轮结算 −1,dur=1=一次性;跨轮跨图延续、battle_over 全清不跨战斗)· 按行叠层(stack 授予不触碰 R;refresh 重置取实例授予时快照 D;合并在授予时、结算作用顺序归 战斗结算——两序分离)· 满层授予拒绝原子(false+容器零写)· 合成 = L×m 加算、percent 越域不 clamp(地板/换算归 战斗结算 SettlementTable)· 授予集中在 战斗结算 结算编排(排雷玩法/地图战斗资源 零直接接口)· 零随机(无 RNG 流消费)· 零信号外发(纯被动容器) api: notify_battle_start / apply_effect(effect_id, source) -> bool / query_active(side) -> Array(插入序;六归因字段+display_name+授予时快照投影)/ decay_round() -> int / notify_battle_end() -> bool——战斗结算 消费契约,provisional 登记 - settlement_obligations: 八项(战斗结算 GDD 门禁评审缺项即 blocking)——① 同轮多授予按确定次序调用 ② 事实→授予恰一次转化(增益状态 不去重)③ percent→乘数换算方向与合成值地板成文 ④ 最后一轮 decay 判定 ⑤ F1 条款 1 效果档位对照表以 增益状态 实例为对照实物 ⑥ 每结算编排恰一次 decay_round(2026-09-09 增——decay 基数=1 先决条件)⑦ 结算明细按授予流水逐条标注来源(合并坍缩归因补偿,2026-09-09 增)⑧ “溢出未生效”行进结算明细协议(Rule 5 后半承载,2026-09-09 增)。**履行回执(2026-09-10)**:八项已全数落位 战斗结算 GDD(Core Rules 3/5/8/10/11 + Formulas F0–F2——落位映射 = 战斗结算 AC 覆盖矩阵"上游义务 23 条"行;③的 AP/表界数值随 F0 修订更新为 −520%/−1040%) + settlement_obligations: 八项(战斗结算 GDD 门禁评审缺项即 blocking)——① 同轮多授予按确定次序调用 ② 事实→授予恰一次转化(增益状态 不去重)③ percent→乘数换算方向与合成值地板成文 ④ 最后一轮 decay 判定 ⑤ F1 条款 1 效果档位对照表以 增益状态 实例为对照实物 ⑥ 每结算编排恰一次 decay_round(2026-09-09 增——decay 基数=1 先决条件)⑦ 结算明细按授予流水逐条标注来源(合并坍缩归因补偿,2026-09-09 增)⑧ “溢出未生效”行进结算明细协议(Rule 5 后半承载,2026-09-09 增)。**履行回执(2026-09-10)**:八项已全数落位 战斗结算 GDD(Core Rules 3/5/8/10/11 + Formulas F0–F2——落位映射 = 战斗结算 AC 覆盖矩阵"上游义务 23 条"行;③的 AP/表界数值随 F0 修订更新为 −520%/−1040%)。**2026-09-20 修订**:⑧ 随伏击单轮上限删除(用户拍板)退役——溢出未生效行类型下线(行协议 10→9 类),满层拒收走奖励未生效行 presentation_obligations: (2026-09-09 登记 systems-index,缺项即 blocking)HUD框架×4——HUD 常显+EC12 空态规格定稿 / effect_id→icon 映射键契约(形状+色相双通道)/ 有利有害极性呈现映射(数据源 = 战斗结算 SettlementTable 效果语义,非 magnitude 符号)/ 全清状态栏去留;战斗表现×2——溢出行呈现 / origin_cell→玩家可读形态(缩略图/格子高亮);教学引导——“同轮拿满优于跨轮叠”教学(OQ7 配套);地图战斗资源——奖励身份预读(创意风险 #1 切面) ownership_note: 行动经济 OQ5“标中旗 debuff 档位归 地图战斗资源 表设计”经用户 2026-09-08 拍板收编——初值定稿权归 增益状态(2026-09-15 起为七行:标错反噬批两行 + 格面资源批 sapped 一行随批收编),锚验收权仍归 地图战斗资源/战斗结算,修订走接口漂移回写本条 dangling_ref_policy: effect_id 悬空校验**已激活**(2026-09-09 地图战斗资源 RewardTable 首个 effect_id 引用行〔defense_up〕回填——dangling_ref_policy"首个引用字段 owner 补"条款兑现;条件性夹具 = 地图战斗资源 reward_dangling_effect〔AC-17〕) @@ -215,7 +215,6 @@ entities: 技能冷却: 施放后连续 N 拍不可摇中的技能行属性——与增益持续(状态行属性)是两个计时器互不相干(敌人系统 首次定义,2026-09-16 敌人技能池批) 施放行: 增益技的结算明细行型(cast)——0 伤害动作、具名技能、不兑付伏击;由蓄力行(charge)改型(敌人系统/战斗结算 首次定义,2026-09-16 敌人技能池批) 伏击池: 敌方侧共享的伏击层数——本轮踩几颗雷就几层,轮末清零(side-wide 语义,敌人系统 首次定义) - 溢出(伏击): 单轮踩雷超过上限(cap)的部分——转为"溢出未生效"明细行可见、不生效(敌人系统 首次定义) 死亡即不动手: 轮到某敌人行动时它已死 → 这一下不打、招式轮转停格(2026-09-09 用户拍板,敌人系统 首次定义) 封锁格: 初始展开白送的那批已开格——恒无格面资源、不再有任何加成,但计入清图进度(排雷玩法 首次定义;install 期可精确枚举为 R₀——格面资源摇号清单的排除项;取代旧术语"资格格",2026-09-15 格面资源批) 格面资源(CellResource): 关联到格子上的资源对象——装板期摇定七型类型身份(attack/defense/heal/blast/weaken/pierce/magic——2026-09-18 伤害道具批五→七),安全格与雷格一视同仁、同池同分布;极性不在资源内,由「动作 × 格型」矩阵在结算期决定正向(奖励)或负向(惩罚)(地图战斗资源 首次定义;取代"安全格奖励"旧名) @@ -261,11 +260,10 @@ entities: hp: int [1,999](knob——难度修饰前基线;MVP 18 provisional 出处待查) atk: int [0,999](knob——attack 行为伤害基值;MVP 4 provisional 出处待查;0 = 纯伏击伤敌种合法) pool: Array of {skill_id, weight}(**2026-09-16 敌人技能池批——池模板**,定义层;weight ∈ (0,9999] knob、池内 skill_id 不重复;每池恰一行普通攻击 + 增益技 ≤1 + skill_id 悬空致命〔加载校验在 config_db.validate_skill_pool_links 跨表通道〕;实例池〔快照+冷却状态〕在 单位容器 spawn——三敌种建议池构成与权重不列于本 registry,读 data/tables/enemy.tres(provisional 归 难度曲线与Boss;EV 锚与含闸长期速率实测读数随验收批另测登记〔2026-09-18 指路化收口〕))。**历史(2026-09-16 退役)**:heavy_multiplier int [1,16](重击倍率归技能行 damage_mult)与 pattern StringList(行为环环数组)两字段随行为环整体退役——固定出招剧本废除 - advantage_per_round_cap: int [0,16](knob;**MVP 默认 4 定稿**〔2026-09-09——反灾难护栏定位,旧默认 8 溢出协议死码已废弃〕;0 = 免疫伏击合法极端;行动经济 F1 条款 3 供给表值来源字段) - rowset_rule: 每行集恰一敌种(行集内 enemy_id 唯一 = 表结构校验,违规加载期致命)——同层多遭遇已由节点编号消解(2026-09-17 关卡节点地图 v1.0:node_depth 语义 = 关卡内唯一节点编号,同层不同节点各查各行、键结构零改动);同场多敌种(同一编号行集多行)行集校验放开 + 混编遭遇伏击上限取值口径归 敌人表行集多行批(战斗侧,排技能池实施批落地后;06-待办清单 敌人系统节同名条目单点登记);精英/Boss 不设编码位——Boss = 最大编号节点(图唯一终点)、精英 P2 内容承载(强敌行集) + rowset_rule: 每行集恰一敌种(行集内 enemy_id 唯一 = 表结构校验,违规加载期致命)——同层多遭遇已由节点编号消解(2026-09-17 关卡节点地图 v1.0:node_depth 语义 = 关卡内唯一节点编号,同层不同节点各查各行、键结构零改动);同场多敌种(同一编号行集多行)行集校验放开归 敌人表行集多行批(混编伏击上限取值口径随 2026-09-20 上限删除消解)(战斗侧,排技能池实施批落地后;06-待办清单 敌人系统节同名条目单点登记);精英/Boss 不设编码位——Boss = 最大编号节点(图唯一终点)、精英 P2 内容承载(强敌行集) mvp_content: **五敌种(2026-09-14 难度曲线与Boss 修订批转正 goblin / bugbear / ogre_chief 三敌种〔DND 更名批用户指令:grub→goblin / ambusher→bugbear / boss_guardian→ogre_chief〕;2026-09-17 分支节点图批新增 giant_spider / drider,本条 2026-09-18 补收编;敌人系统 物种集断言随批更新为 {goblin, bugbear, ogre_chief, giant_spider, drider})**:goblin(地精,armor=light)/ bugbear(熊地精,armor=ward)/ ogre_chief(食人魔酋长,armor=heavy)/ giant_spider(巨蜘蛛)/ drider(蛛化卓尔精灵,Boss = 最大编号节点图唯一终点)。技能池构成与权重、armor_type 行映射**不列于本 registry**——读 data/tables/enemy.tres。**2026-09-17 数值压缩批·文档同步——hp/atk 等数值列改指路存根**:L1/L2 节点编号行集(D0–D8)共 12 行的 hp · atk · atk_min · atk_max · unit_count · unit_count_max · advantage_per_round_cap · armor_class 等现行值**不列于本 registry**——读 `data/tables/enemy.tres`(数值压缩批注释登记:`L1 D0 24/7 → 8/2`、`L1 D1 13/5 → 4/2`、`L1 D2 40/9 → 13/3`、`L1 D3 18/6 → 6/2`、`L1 D4 150/9 → 50/3` Boss、`L2 D0 30/7 → 10/2`、`L2 D1 15/5 → 5/2`、`L2 D4 14/5 → 5/2`、`L2 D5 38/8 → 13/3`、`L2 D6 12/4 → 4/1`、`L2 D7 13/5 → 4/2`、`L2 D8 175/8 → 58/3` drider);armor_type / armor_class / unit_count 区间 / 技能池权重 / advantage_per_round_cap 不压缩(相对轴与概率轴)。**2026-09-16 敌人技能池批**:行为环拍序列([attack] 单拍环 / [attack,charge,heavy] 三拍环 / [attack,attack,charge,heavy] 四拍环)与 heavy_multiplier=2 退役,改池模板 + 技能表共享技能行(重击倍率 2 = 技能行 damage_mult);出处 = 切片 enemy.tres(技能池批改型),曲线数值与池权重归 难度曲线与Boss load_bearing_rules: 多敌模型(1–3 同敌种单位,增益状态 单敌假设回验不成立——见 status_effect.single_enemy_assumption)· 行为环确定性轮转(零随机;先作用后推进;死亡即不动手——轮到前被杀本拍不打指针冻结;同步轮转定理)· 效果 side-wide(伏击池 = side 共享,增益状态 零接口变更)· 行值快照抗热重载(增益状态 EC9 同款——池模板同在快照范围,实例池冷却全零起步)· **技能池摇号出招(2026-09-16 敌人技能池批改写——原"行为环确定性轮转/同步轮转定理"退役)**:每拍做什么 = 实例池权重摇号〔开轮时点,随机消费在 战斗结算 换算层 behavior_roll 封闭流;本系统语义零随机不变、单位容器收确定值〕;两道闸 = 全技能各自冷却 + 保底 M;死亡即不动手(摇定后兑现前死亡 → 本拍作废不进账);拍结构保留(每结算每存活敌恰行动一次/行序/先作用后推进)· 零随机零 UI 零事件订阅(排雷玩法 事件面不含 敌人系统——事实经 战斗结算 转化) - settlement_obligations: 六项(敌人系统 GDD 门禁评审缺项即 blocking)——① 行动每结算恰一次(敌单位专属——主角无环)+ 结算内调用序成文 按摇定技能行兑现→apply_damage→commit_action〔2026-09-16 技能池批改型——原 query_attack→apply_damage→advance 随行为环退役〕 ② 雷→伏击恰一次转化 ③ clamp/负值/溢杀与死亡判定时机成文 ④ F1 条款 3 闭合对账(cap 表值 + 量纲 + 棋盘生成 actuals p10 非 target 参数)⑤ 默认目标消费与单体/AOE 分流 ⑥ 伏击 cap 溢出"溢出未生效"明细行协议。**履行回执(2026-09-10)**:六项已全数落位 战斗结算 GDD(Core Rules 5/6/9/10/12 + Formulas F3/F4——落位映射 = 战斗结算 AC 覆盖矩阵) + settlement_obligations: 六项(敌人系统 GDD 门禁评审缺项即 blocking)——① 行动每结算恰一次(敌单位专属——主角无环)+ 结算内调用序成文 按摇定技能行兑现→apply_damage→commit_action〔2026-09-16 技能池批改型——原 query_attack→apply_damage→advance 随行为环退役〕 ② 雷→伏击恰一次转化 ③ clamp/负值/溢杀与死亡判定时机成文 ④ F1 条款 3 闭合对账(cap 表值 + 量纲 + 棋盘生成 actuals p10 非 target 参数)⑤ 默认目标消费与单体/AOE 分流 ⑥ 伏击 cap 溢出"溢出未生效"明细行协议。**履行回执(2026-09-10)**:六项已全数落位 战斗结算 GDD(Core Rules 5/6/9/10/12 + Formulas F3/F4——落位映射 = 战斗结算 AC 覆盖矩阵)。**2026-09-20 修订**:④⑥ 随伏击单轮上限删除(用户拍板)退役——对账面去 cap 表值、溢出行协议作废 hud_obligations: 四项(视觉推测型呈现,缺项即 blocking)——① enemy_id→图像线索映射清单成文(预告时序=下一拍预告、挖掘期全程可见;含强度档位/环长直觉编码说明;形状+色相双通道)② 映射全局恒定(enemy_id 键——跨 run 禁重掷)③ 顺位与存活可读 ④ 敌方 side 池呈现口径 rule4_status: 本表是进度成长表(棋盘生成 BoardGenTable 同型,无 Rule 4 豁免) referenced_by: [战斗结算, 地图战斗资源, 关卡节点地图, 难度曲线与Boss, HUD框架, 战斗表现, 教学引导] @@ -355,7 +353,7 @@ entities: 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_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 查表(奖励直伤道具消费方保留) + 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 评审批修订;行类型封闭枚举 9 类(2026-09-20 伏击上限删除批下线溢出未生效行 overflow)——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 查表(奖励直伤道具消费方保留) closure_receipt: 行动经济 F1 条款①②③⑤闭合 owner = 战斗结算(2026-09-10 F0–F5 首版验算完成——F0 瞬时当量口径 + m_w 值域裁决见 status_effect.anchor_warning;条款③ clause3_supply 闭合回执;条款⑤ clause5_dominance 条目;actuals p10 交付后强制重跑) referenced_by: [HUD框架, 战斗表现, 音频, 教学引导, 难度曲线与Boss] @@ -363,7 +361,7 @@ entities: type: formula owner: design/gdd/systems/战斗循环/敌人系统.md attributes: - rule: 敌人系统→战斗结算 挖掘风险不等式(行动经济 F1 条款 3)供给口径——每结算敌方伏击暴露精确式 = k × L × m_amb(k = 本结算存活敌中攻击/重击拍单位数,确定性可算);每结算结构上界 = unit_count × min(AP 上界, cap) × m_amb(cap > AP 界时 cap 腿松弛——2026-09-09 敌人系统 full 评审收紧);跨结算累计 = 轨迹量非表值 + rule: 敌人系统→战斗结算 挖掘风险不等式(行动经济 F1 条款 3)供给口径——每结算敌方伏击暴露精确式 = k × L × m_amb(k = 本结算存活敌中攻击/重击拍单位数,确定性可算);每结算结构上界 = unit_count × AP 上界 × m_amb(原 min(AP 上界, cap) 的 cap 腿随 2026-09-20 单轮上限删除退役);跨结算累计 = 轨迹量非表值 boundary: **单结算自然边界(用户 2026-09-09 定稿)**——"不设(每战)上界:踩雷 debuff 只在一次结算中有效,之后没有 debuff"(dur=1 每结算清零无存量) variables: [cap, m_amb, unit_count, k_r, L_r] output_range: 单结算结构上界 ∈ [0, unit_count×min(AP, cap)×m_amb](满配语境 3×min(8,4)×3=36;cap≥8 时真可达上界 72 而非 144;默认行值 unit_count=1 下 12) @@ -721,7 +719,7 @@ entities: # ③ 术语「节点」图形态与分类学展开定稿(四类封闭枚举)、「节点奖励」机制定稿(功能道具正式渠道——内容/ # 持有/使用归 魔法道具 内容重定批,切片期直通合法空态;覆盖层 = 兑付反馈覆盖层)、「关卡收束点」图版措辞; # ④ enemy_table.rowset_rule:同层多遭遇由节点编号消解;不设精英/Boss 编码位(Boss=最大编号节点、精英 P2 -# 内容承载);同场多敌种行集多行 + 混编伏击上限取值 → 敌人表行集多行批(战斗侧,排技能池实施批后, +# 内容承载);同场多敌种行集多行 → 敌人表行集多行批(战斗侧,排技能池实施批后, # 06 清单单点登记);board_gen_table 第三轴约定 OQ6 重审兑现注记;difficulty_table OQ5/OQ6 兑现注记; # ⑤ 06-待办清单:「精英与 Boss 编码位」「多敌数量的消费面」(地图战斗资源节「功能道具的正式渠道」同日) # 三条已解决留痕;敌人系统「同深度第二敌种与精英 / Boss 编码位」部分收口改归属;新增「切片行进代码与 diff --git a/design/ux/battle.md b/design/ux/battle.md index 5dcd90f6..e86ecc4f 100644 --- a/design/ux/battle.md +++ b/design/ux/battle.md @@ -113,8 +113,8 @@ | B | 英雄卡 | 卡片 | 小人像、HP 条、攻击值、状态效果槽 ×4 | 只读 | HUDView 拆分 | | B | 敌人卡 ×1–3 | 卡片 | 敌像、血条、顺位徽标、意图徽标、状态槽(含敌方 side 池口径:伏击层数为全体敌人共享单值、各卡同值呈现——数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;2026-09-16 敌人技能池批改型:行为环点拆除〔proposal §2.4〕,意图徽标语义 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,敌方增益〔蓄力/硬化〕入状态行) | 只读 | 新建 | | B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 | -| B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 10 类行协议);挖掘期收起为上轮摘要 1 行 | 点击展开明细回看 overlay | battle_log_view.gd 改造 | -| B | 结算明细回看 | 模态 overlay | 完整流水逐行(现行 10 类行协议;未生效类行聚合计数) | 关闭 | battle_log_view.gd 改造 | +| B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 点击展开明细回看 overlay | battle_log_view.gd 改造 | +| B | 结算明细回看 | 模态 overlay | 完整流水逐行(现行 9 类行协议;未生效类行聚合计数) | 关闭 | battle_log_view.gd 改造 | | C | HP/攻击/RAP 显示 | 直角细线数据框 | 当前值/上限、修正来源角标 | 只读;RAP 清零有可见反馈 | HUDView 拆分 | | C | 状态效果槽 ×4 | 图标槽 | effect_id→icon(形状+色相双通道)、层数角标、剩余结算次数点 | 悬停 tooltip(来源+语义) | 新建(增益状态×①) | | D | AP 条 | 点阵 + 按钮组 | 本轮 AP 点阵、停手按钮(左)、弃图刷新按钮(右端·雷图右上角;RAP−8 · 本轮剩 N 次——上限 2 次已随行动经济 2026-09-12 修订生效) | 点击提交意图 | HUDView 拆分 | @@ -244,7 +244,7 @@ | 弃图刷新(挖掘期,非轮出口) | `ux_refresh_attempt` | {result: accepted/rejected_rap/rejected_cap, round_refresh_index: 1..2}——刷新使用(难度曲线与Boss OQ6)与行动经济 OQ3 预警阈值观测;每轮 0–2 次(布局决策 4 cap=2) | | 拒绝/voided | `ux_reject` | {source: board/resource/phase, sub_reason} | | 提示触发/关闭 | `ux_hint_shown` | {hint_id: chord/no_adjacent} | -| 呈现订阅(不改核心) | 排雷玩法三事件 / [战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(10 类行协议,含终局判定行) / battle_over / level_clear | 载荷 schema 成文义务见 §Data Requirements——旧版台账 entry 17①(HUD框架硬性要求) | +| 呈现订阅(不改核心) | 排雷玩法三事件 / [战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行协议,含终局判定行) / battle_over / level_clear | 载荷 schema 成文义务见 §Data Requirements——旧版台账 entry 17①(HUD框架硬性要求) | **持久状态写入**全部经组合根唯一路径(settle_batch / request_refresh / runner 推进)——UI 层禁直调核心写(架构七原则"依赖单向组合根")。 @@ -276,7 +276,7 @@ | BFS 移动路径 | 排雷玩法 `compute_move_path` | Read | 布局决策 3 合法性指示消费 | | 拒绝原因 | 排雷玩法 `sub_reason` 封闭枚举 + 行动经济 资源面 | Read | 三源(board/resource/phase)映射文案——呈现层契约成文;资源面原因无上游载荷(行动经济 仅 bool + debug 诊断),客户端按动作上下文推断 | | AP / RAP / 本轮刷新计数 | 行动经济 | Read | 常显;刷新入口可用性 = RAP 读数客户端预判(RAP≥8)+ `request_refresh` 返回值(行动经济 无 `can_request_refresh` API——仅 bool 返回 + 只读观测量;行动经济 EC13 拒绝合法可见) | -| 结算流水行(10 类封闭协议) | [战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 流水协议 | Read | 逐行来源标注(P2);未生效类行(溢出未生效/奖励未生效)聚合计数呈现 | +| 结算流水行(9 类封闭协议) | [战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 流水协议 | Read | 逐行来源标注(P2);未生效类行(奖励未生效)聚合计数呈现 | | 判定 verdict | 战斗结算 判定段 | Read | 终局画面数据锚 | | 敌单位 hp/顺位/摇定动作(pending_skill/type/name)/敌方增益/enemy_id/存活 | 敌人系统 只读面(经战斗结算呈现快照) | Read | 意图线索映射全局恒定(敌人系统×4②,技能池批三档口径);**despawn 前捕获**(旧版台账 entry 17③——缺陷②教训) | | 状态效果投影(含空态/极性/溢出) | 增益状态 投影口径 | Read | 极性映射数据源 = 战斗结算 SettlementTable 效果语义,非 magnitude 符号(增益状态×③) | @@ -339,13 +339,13 @@ **信息与归因** -- [ ] 结算逐行明细实时可见、战斗后可回看完整流水(P2 逐行归因);未生效类行(溢出未生效/奖励未生效)聚合计数呈现(战斗结算 现行 10 类行协议) +- [ ] 结算逐行明细实时可见、战斗后可回看完整流水(P2 逐行归因);未生效类行(奖励未生效)聚合计数呈现(战斗结算 现行 9 类行协议) - [ ] 敌人意图徽标挖掘期全程可见、映射全局恒定、含顺位与环长直觉编码(敌人系统×4①②③) - [ ] 状态效果:极性呈现映射成文且非 magnitude 符号;空态渲染成文(裁决:槽隐藏);满层溢出经明细行可见(增益状态×①③④) - [ ] 图例面板条目恒在可随时回看、非模态提示不劫持输入 - [ ] 零合法板(棋盘生成 EC5 降级)出现时玩家侧诚实提示(toast,非静默) - [ ] 效果行 value 为单次贡献值,不得与 pool_value(池合成值)相加呈现;零值伤害行可见不被吞;衰减行按聚合计数呈现(战斗结算 呈现细则) -- [ ] 未生效类行(溢出未生效/奖励未生效)携带形状冗余(icon/划线),非色相独载 +- [ ] 未生效类行(奖励未生效)携带形状冗余(icon/划线),非色相独载 - [ ] 奖励徽章绘制优先级:旗之下、变异纹带之上、不进数字区;拾取瞬间 tier 档位可读(地图战斗资源 H1) **场景级测试**(旧版台账 entry 17②③,缺项即 blocking) diff --git a/design/ux/interaction-patterns.md b/design/ux/interaction-patterns.md index 26534b1c..5574becf 100644 --- a/design/ux/interaction-patterns.md +++ b/design/ux/interaction-patterns.md @@ -100,7 +100,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab **Specification**: - 数据源:[战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(15 类行封闭协议;公共字段 `type/source_class/origin_cell/round_index/display_name/value/highlight?`);**无来源行 = 断言失败** - 行模板:「{行为} {值} → {目标}(来源)」——来源标注(第 N 轮 · 安全格式);行文案最长 token = 道具名(4 汉字),模板预留 40% 膨胀宽度 -- 聚合纪律:未生效类行(奖励未生效/已消耗未生效/使用被拒/溢出未生效)按聚合计数呈现(防逐行惩罚轰炸);衰减行聚合计数;效果行 value=单次贡献值、禁与 pool_value(池合成值)相加呈现;零值行可见不吞(免伤轮归因不断点) +- 聚合纪律:未生效类行(奖励未生效/已消耗未生效/使用被拒)按聚合计数呈现(防逐行惩罚轰炸);衰减行聚合计数;效果行 value=单次贡献值、禁与 pool_value(池合成值)相加呈现;零值行可见不吞(免伤轮归因不断点) - 高亮:highlight 字段 {flag_hit, clear_reward_h2, perfect_broken} → 金框强调;完美排雷 = 独立高光行 + 全屏喝彩级反馈 - 布局:固定槽高 + clip_contents;正文 ≥14px;数值暗底高对比;未生效类行带 icon/划线形状冗余 - 击杀标记呈现(H3 数据源 = 战斗结算流水击杀结果字段) diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd b/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd index 60909d30..84cacc18 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd @@ -20,9 +20,9 @@ signal round_started(round_index: int) signal board_changed() signal settlement_snapshot(snap: Dictionary) # 每结算末尾的全量状态快照(playtest_logger 消费——JSONL 数值分析) -# 明细流水行型协议(战斗结算 Core Rule;10 类——2026-09-15 格面资源批由 15 类收拢, -# 清单改动须同步 battle_log_view 的 _format_row 与本文档头注): -# 效果行 effect · 伤害行 damage · 治疗行 heal · 溢出未生效行 overflow · +# 明细流水行型协议(战斗结算 Core Rule;9 类——2026-09-20 伏击单轮上限退役,溢出未生效行 overflow 随之下线; +# 2026-09-15 格面资源批由 15 类收拢,清单改动须同步 battle_log_view 的 _format_row 与本文档头注): +# 效果行 effect · 伤害行 damage · 治疗行 heal · # 奖励未生效行 reward_ineffective · 标旗未中行 flag_miss · 施放行 cast(敌人技能池批由蓄力行 charge 改型)· 衰减行 decay · # 判定行 verdict · 高光行 highlight # 行来源断言豁免集合(行型层)——判定段 / 衰减段本就无棋盘来源,勿一刀切误炸 @@ -58,7 +58,6 @@ var _flag_consumed := {} # 兑付资格以雷格实例为键 var _flag_miss_seen := {} # 标旗未中行去重(每安全格实例一次) var _perfect_hit_true := 0 # 板级完美排雷计数(install 重置) var _perfect_hit_false := 0 -var _enemy_cap := 0 # EnemyTable 行值快照(伏击 cap) var _m_amb := 0 # StatusEffectTable.ambush.magnitude 快照 var _hero_atk := 0 # 主角攻击基值快照(encounter.hero_atk;E4 收口——表值运行期不可变) @@ -113,7 +112,6 @@ func begin_battle(enc: Dictionary) -> bool: _fatal("敌人系统 spawn 被拒") return false var erow: Dictionary = db.resolve_enemy_rowset(int(enc.level_index), int(enc.node_depth)) - _enemy_cap = int(erow.get("advantage_per_round_cap", 0)) _m_amb = int(db.status_effect_row("ambush").get("magnitude", 0)) if not _install_new_board(): return false @@ -288,7 +286,7 @@ func _apply_percent_row(row: Dictionary, source_class: String, cell: Vector2i, r # flat 行兑付(负向恒即时,无库存语义): -# blast 正向 = 全体存活敌各 power 点(无敌 → 奖励未生效行);blast 负向 = 敌方伏击 +stacks 层(cap/溢出行协议不变); +# blast 正向 = 全体存活敌各 power 点(无敌 → 奖励未生效行);blast 负向 = 敌方伏击 +stacks 层(直授无上限); # heal 正向 = 主角回复 clamp(满血 → 奖励未生效行);heal 负向 = 主角直伤 power 点(不经增益状态;归零 → 战斗段短路/判定段判负)。 # pierce/magic(伤害道具批 2026-09-18)正向 = 单目标克制直伤(必中全额);负向 = 主角直伤。 # 返回 "redeemed" = 实际有效兑付 / "zero" = 零兑付(行已自记)——清图高光只记实际有效兑付。 @@ -343,19 +341,14 @@ func _apply_flat_row(row: Dictionary, source_class: String, cell: Vector2i, ri: return "zero" -# blast 负向:敌方伏击 +stacks 层(伏击池 cap 与"溢出未生效"行协议不变——敌人系统 F3 逐层守恒, -# 多源共享同一池值;单结算内先到先占 cap,超出部分逐层记溢出行) +# blast 负向:敌方伏击 +stacks 层(直授无上限——单轮授予上限已随 2026-09-20 用户拍板退役, +# 一轮踩雷数由行动点预算天然封顶;多源共享同一池值) func _apply_ambush_grant(row: Dictionary, source_class: String, cell: Vector2i, ri: int, highlight: String = "", label_suffix: String = "") -> String: var requested: int = maxi(1, int(row.get("stacks", 1))) - var remaining_cap: int = maxi(0, _enemy_cap - _status_effects.pool_layers("ambush")) - var plan: Dictionary = _enemy_system.ambush_grant_plan(requested, remaining_cap) - for i in range(int(plan.granted)): + for i in range(requested): _status_effects.apply_effect("ambush", {"source_class": source_class, "origin_cell": cell, "round_index": ri}) - if int(plan.granted) > 0: - _emit_row("effect", source_class, cell, ri, "敌方伏击 +%d 层%s" % [int(plan.granted), label_suffix], int(plan.granted), {"effect_id": "ambush", "pool_value": _status_effects.pool_layers("ambush") * _m_amb}, highlight) - for i in range(int(plan.overflow)): - _emit_row("overflow", source_class, cell, ri, "伏击溢出未生效", 0, {"batch_key": "ambush_overflow"}) - return "redeemed" if int(plan.granted) > 0 else "zero" + _emit_row("effect", source_class, cell, ri, "敌方伏击 +%d 层%s" % [requested, label_suffix], requested, {"effect_id": "ambush", "pool_value": _status_effects.pool_layers("ambush") * _m_amb}, highlight) + return "redeemed" # 旗判定批:标中 = 该雷格资源的正向兑付(每雷实例一次;高光 = 强制检查点); diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/status_container.gd b/prototypes/dungeon-sweeper-vertical-slice/core/status_container.gd index c33a49a0..eb4c210c 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/status_container.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/status_container.gd @@ -59,7 +59,7 @@ func apply_effect(effect_id: String, source: Dictionary, duration_override: int for inst in _instances: if inst.effect_id == effect_id: if inst.layers >= max_stack: - return false # 满层拒绝原子——容器零写入(溢出行归 战斗结算) + return false # 满层拒绝原子——容器零写入(拒收由战斗结算记"奖励未生效"行) inst.layers += 1 # stack 授予不触碰 R(spec 决议) return true _instances.append(_new_instance(effect_id, 1, dur, source, snap_m, snap_unit, snap_display)) diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/unit_container.gd b/prototypes/dungeon-sweeper-vertical-slice/core/unit_container.gd index 3ec6562a..02963f60 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/unit_container.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/unit_container.gd @@ -82,7 +82,6 @@ func spawn(level_index: int, node_depth: int, hero_hp: int, unit_count_override: "pending_skill": "", # 本拍摇定动作(开轮摇号写入;兑现前死亡 = 作废不 commit) "roll_seq": 0, # 单敌摇号序(behavior_roll 子流 scope 派生向量——registry 登记) "basic_streak": 0, # 保底计数:连续执行普攻的拍数(执行上报驱动) - "advantage_per_round_cap": int(row.advantage_per_round_cap), "armor_type": String(row.get("armor_type", "light")), # 护甲类型快照(克制矩阵消费面——战斗结算·战斗段;2026-09-15 命名统一批:light/ward/heavy) "armor_class": int(row.get("armor_class", 0)), # 护甲等级快照(掷点判定阈值基数——战斗结算·战斗段;2026-09-16 护甲等级掷点批) "alive": true, @@ -238,12 +237,6 @@ func all_enemies() -> Array: return _enemies.duplicate() -# F3 机制算术纯函数(战斗结算 预截流消费面):cap 判定在授予前;守恒 granted + overflow = mines_r -func ambush_grant_plan(mines_r: int, cap: int) -> Dictionary: - var granted: int = mini(mines_r, cap) - return {"granted": granted, "overflow": mines_r - granted} - - func despawn_all() -> bool: if _despawned or not _spawned: _diag("重复/无效 despawn_all") diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/schemas/enemy_table.gd b/prototypes/dungeon-sweeper-vertical-slice/data/schemas/enemy_table.gd index fe9988f7..be9b2ba9 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/schemas/enemy_table.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/data/schemas/enemy_table.gd @@ -86,9 +86,6 @@ func validate() -> Array: var w: int = int(entry.get("weight", 0)) if w <= 0 or w > 9999: errs.append({"category": "domain", "message": "%s pool 权重越域 (0,9999]: %d" % [eid, w]}) - var cap: int = int(row.get("advantage_per_round_cap", -1)) - if cap < 0 or cap > 16: - errs.append({"category": "domain", "message": "%s advantage_per_round_cap 越域 [0,16]" % eid}) # armor_type(可省略——缺省 light 向后兼容) var at: String = String(row.get("armor_type", "light")) if not ARMOR_TYPES.has(at): diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/enemy.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/enemy.tres index d00fe237..b9cc58b5 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/enemy.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/enemy.tres @@ -22,7 +22,6 @@ rows = [{ "skill_id": "lunge", "weight": 1 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -43,7 +42,6 @@ rows = [{ "skill_id": "lunge", "weight": 1 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -66,7 +64,6 @@ rows = [{ "skill_id": "heavy", "weight": 2 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -90,7 +87,6 @@ rows = [{ "skill_id": "heavy", "weight": 2 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -113,7 +109,6 @@ rows = [{ "skill_id": "harden", "weight": 2 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -136,7 +131,6 @@ rows = [{ "skill_id": "heavy", "weight": 2 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -160,7 +154,6 @@ rows = [{ "skill_id": "heavy", "weight": 2 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -183,7 +176,6 @@ rows = [{ "skill_id": "charge", "weight": 1 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -206,7 +198,6 @@ rows = [{ "skill_id": "heavy", "weight": 2 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -230,7 +221,6 @@ rows = [{ "skill_id": "charge", "weight": 1 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -254,7 +244,6 @@ rows = [{ "skill_id": "charge", "weight": 1 }], -"advantage_per_round_cap": 4, "armor_type": "light", "armor_class": 0 }, { @@ -280,7 +269,6 @@ rows = [{ "skill_id": "web_snare", "weight": 2 }], -"advantage_per_round_cap": 4, "armor_type": "ward", "armor_class": 0 }] diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres index 08f67d60..b0992900 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres @@ -168,7 +168,7 @@ rows = [{ ; 装板期一次摇定;摇号只消费正向行权重(类型频次 = attack 20 / defense 16 / blast 16 / heal 3 / weaken 12,合计 67; ; 头段"heal 15 / weaken 12,合计 79"为历史注记——数值压缩批后 heal 3、合计 67,见本文件尾部 2026-09-17 批注); ; 负向行 weight=0 不参与摇号,纯(类型, 极性)兑付字典——heal 负向 = 主角直伤 4(不经增益状态), -; blast 负向 = ambush +2 层(stacks=2,伏击池 cap 与"溢出未生效"行协议不变)。 +; blast 负向 = ambush +2 层(stacks=2,直授无上限——伏击单轮上限 2026-09-20 退役)。 ; 可选类三行(knife_t1/knife_adv/heal_pack)与注入池 active_inject 随可选类道具整体删除(供给控制器/保底/窗口同步下线)。 ; 区间行(伤害量值区间批 2026-09-14):heal_minor [2,6] · clear_blast [25,55]——中点锚 power 恒等期望当量, ; roll 时机 = 身份预分配批内追加取号(既有取号序零扰动);spark_aoe 定值行无区间字段。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/presentation/views/battle_log_view.gd b/prototypes/dungeon-sweeper-vertical-slice/presentation/views/battle_log_view.gd index 0062aca8..74f08b07 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/presentation/views/battle_log_view.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/presentation/views/battle_log_view.gd @@ -15,7 +15,7 @@ signal review_requested const BAND_H_DIG := 24 const BAND_H_SETTLE := 84 -const AGG_TYPES := ["reward_ineffective", "overflow"] +const AGG_TYPES := ["reward_ineffective"] const COL_GOLD := "#f0a828" const COL_INK := "#33261b" @@ -194,8 +194,8 @@ func _format_row(row: Dictionary, agg_count := -1) -> String: return prefix + "[color=%s]%s[/color]" % [body_col, body] "heal": return prefix + "[color=#7cc47c]%s +%d%s%s[/color]" % [name_, v, tail, suffix] - "reward_ineffective", "overflow": - # 未生效两类行:⚠ icon + 划线形状冗余(非色相独载)+ 聚合计数 + "reward_ineffective": + # 未生效类行:⚠ icon + 划线形状冗余(非色相独载)+ 聚合计数 var n := (" ×%d" % agg_count) if agg_count > 1 else "" return prefix + "[s][color=#b08060]⚠ %s%s[/color][/s]%s" % [name_, n, suffix] "flag_miss": diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/rhythm_batch.gd.uid b/prototypes/dungeon-sweeper-vertical-slice/smoke/rhythm_batch.gd.uid new file mode 100644 index 00000000..320afea6 --- /dev/null +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/rhythm_batch.gd.uid @@ -0,0 +1 @@ +uid://cc2yhv5d20gfk diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd index b2821e94..a637f546 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd @@ -1391,9 +1391,9 @@ func _rows_at(rows: Array, source_class: String, cell) -> Array: # 负向字典逐型直验(类型化兑付行协议):找真实板上各型非封锁格,直调 _grant_routed 负向路由, -# 断言每型的兑付形态(enrage/off_guard/sapped 效果行、heal 直伤行、blast ambush+cap 溢出协议)。 +# 断言每型的兑付形态(enrage/off_guard/sapped 效果行、heal 直伤行、blast ambush 直授)。 func _smoke_negative_dictionary() -> void: - print("--- 负向字典逐型直验(sapped 在位 / heal 直伤 / blast 伏击+2 与 cap 溢出)---") + print("--- 负向字典逐型直验(sapped 在位 / heal 直伤 / blast 伏击直授)---") # 数据面:sapped 行在位(状态表七行 + effect_pool_map 收编) var sapped: Dictionary = _db.status_effect_row("sapped") check(not sapped.is_empty() and String(sapped.get("target_side", "")) == "hero" \ @@ -1456,20 +1456,16 @@ func _smoke_negative_dictionary() -> void: if String(row.get("reward_id", "")) == "heal_backlash": backlash_power = int(row.power) check(hp_after == hp_before - backlash_power, "heal 型负向 → 主角直伤 %d(%d → %d,不经增益状态)" % [backlash_power, hp_before, hp_after]) - # blast:负向 = 伏击 +2 层;cap 内生效、超 cap 逐层溢出(cap 读敌行值——零字面量) + # blast:负向 = 伏击 +stacks 层直授(无上限——单轮授予上限 2026-09-20 退役;stacks 读表零字面量) if by_type.has("blast"): - var cap: int = int(_db.resolve_enemy_rowset(1, 0).get("advantage_per_round_cap", 0)) rows.clear() var snap_b: Dictionary = settlement._reward_economy.query_full_snapshot(by_type["blast"]) + var stacks: int = maxi(1, int(settlement._reward_economy.polarity_row("blast", "negative").get("stacks", 1))) settlement._grant_routed(snap_b, "negative", "mine_hit", by_type["blast"], 1) var layers_after_first: int = settlement._status_effects.pool_layers("ambush") - check(layers_after_first == mini(2, cap), "blast 型负向 → 伏击 +%d 层(cap=%d)" % [layers_after_first, cap]) - while settlement._status_effects.pool_layers("ambush") < cap: - settlement._grant_routed(snap_b, "negative", "mine_hit", by_type["blast"], 1) - rows.clear() + check(layers_after_first == stacks, "blast 型负向 → 伏击 +%d 层(stacks=%d)" % [layers_after_first, stacks]) settlement._grant_routed(snap_b, "negative", "mine_hit", by_type["blast"], 1) - check(_rows_of_type(rows, "overflow").size() >= 1 and settlement._status_effects.pool_layers("ambush") == cap, - "blast 型负向超 cap → 溢出未生效行(伏击池守恒在 cap=%d)" % cap) + check(settlement._status_effects.pool_layers("ambush") == 2 * stacks, "blast 型负向连发两次 → 伏击池逐层累加至 %d(无上限截断)" % (2 * stacks)) # 资源面断言:chain/dig 事件恒携带 resource=true(雷格同权);initial 恒 false(封锁格); From 787664212259c409e7b729531bee66a488007700 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 20 Sep 2026 03:49:39 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(resource):=20=E6=A0=BC=E9=9D=A2?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=85=AB=E5=9E=8B=E6=89=B9=E2=80=94=E2=80=94?= =?UTF-8?q?=E4=BC=8F=E5=87=BB=E9=80=80=E5=BD=B9=E6=8D=A2=E8=A3=85=E8=AD=A6?= =?UTF-8?q?=E8=A7=89+=E6=96=B0=E5=A2=9E=E8=A1=8C=E5=8A=A8=E7=82=B9?= =?UTF-8?q?=E7=AC=AC8=E5=9E=8B+=E6=8A=A4=E7=94=B2=E5=9E=8B=E6=95=B0?= =?UTF-8?q?=E5=80=BC=E5=AF=B9=E9=BD=90=EF=BC=882026-09-20=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=8B=8D=E6=9D=BF=EF=BC=89=E2=80=94=E2=80=94=E2=91=A0?= =?UTF-8?q?=E5=8A=A8=E6=9C=BA=3D=E5=85=A8=E5=AD=97=E5=85=B8=E9=95=9C?= =?UTF-8?q?=E5=83=8F=E5=AF=B9=E8=B4=A6=EF=BC=88=E7=B3=BB=E7=BB=9F=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=88=86=E6=9E=90=EF=BC=89=EF=BC=9A=E4=BC=8F=E5=87=BB?= =?UTF-8?q?=E7=9A=84=E5=B1=82=E6=95=B0=C3=97=E5=87=BA=E6=89=8B=E6=95=8C?= =?UTF-8?q?=E6=95=B0=E5=A4=8D=E5=88=A9=E9=9B=86=E4=B8=AD=E5=9C=A8=E4=B8=BB?= =?UTF-8?q?=E8=A7=92=E5=8D=95=E8=A1=80=E6=9D=A1=E3=80=81=E4=B8=8E=E7=88=86?= =?UTF-8?q?=E8=A3=82=E7=B2=89=E5=B0=98=E6=91=8A=20N=20=E6=9D=A1=E6=95=8C?= =?UTF-8?q?=E6=96=B9=E8=A1=80=E6=9D=A1=E5=8F=8C=E9=87=8D=E4=B8=8D=E5=AF=B9?= =?UTF-8?q?=E7=A7=B0=EF=BC=9B=E6=8A=A4=E7=94=B2=E5=9E=8B=E6=83=A9=E7=BD=9A?= =?UTF-8?q?=20=E2=88=922=20=E6=AF=94=E5=A5=96=E5=8A=B1=20+1=20=E5=8F=8D?= =?UTF-8?q?=E5=90=91=E5=81=8F=E9=87=8D=EF=BC=9B=E6=95=8C=E6=96=B9=E6=8A=A4?= =?UTF-8?q?=E7=94=B2=E7=AD=89=E7=BA=A7=E8=BD=B4=E5=85=A8=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=A9=BA=E7=BC=BA=EF=BC=9B=E2=91=A1=E4=BC=8F=E5=87=BB=E9=80=80?= =?UTF-8?q?=E5=BD=B9=3D=E4=BC=A4=E5=AE=B3=E5=85=AC=E5=BC=8F=E6=8B=86?= =?UTF-8?q?=E9=99=A4=E4=BC=8F=E5=87=BB=E9=99=84=E5=8A=A0=E9=A1=B9=EF=BC=88?= =?UTF-8?q?=E6=95=8C=E6=96=B9=E6=8A=80=E8=83=BD=E6=94=BB=E5=87=BB=3Dmax(da?= =?UTF-8?q?mage=5Ffloor,=20floor(=E6=8E=B7=E7=82=B9=E6=A1=A3=E4=BD=8D?= =?UTF-8?q?=E6=8A=80=E8=83=BD=E5=9F=BA=E7=A1=80=E5=88=86=E9=87=8F)=C3=97?= =?UTF-8?q?=E4=B9=98=E5=8C=BA)+rider=EF=BC=89=E3=80=81=E5=BF=AB=E7=85=A7?= =?UTF-8?q?=20ambush=5Flayers=20=E5=AD=97=E6=AE=B5=E6=8B=86=E9=99=A4?= =?UTF-8?q?=E3=80=81=E6=95=88=E6=9E=9C=E8=A1=8C/=E6=AF=92=E7=88=86?= =?UTF-8?q?=E5=A4=8D=E7=AE=97=E6=96=AD=E8=A8=80=E5=90=8C=E6=AD=A5=EF=BC=9B?= =?UTF-8?q?=E2=91=A2blast=20=E8=B4=9F=E5=90=91=E6=8D=A2=E8=A3=85=3Denemy?= =?UTF-8?q?=5Falert=20=E8=AD=A6=E8=A7=89=EF=BC=88=E6=95=8C=E6=96=B9?= =?UTF-8?q?=E5=85=A8=E4=BD=93=E6=8A=A4=E7=94=B2=E7=AD=89=E7=BA=A7=20+1/?= =?UTF-8?q?=E5=B1=82=EF=BC=8C1=20=E7=BB=93=E7=AE=97=EF=BC=8Cside-wide=20?= =?UTF-8?q?=E9=80=90=E9=A2=97=E5=8F=A0=E5=8A=A0=E6=97=A0=E4=B8=8A=E9=99=90?= =?UTF-8?q?=EF=BC=89=E2=80=94=E2=80=94=E6=B6=88=E8=B4=B9=3D=5Fdefender=5Fa?= =?UTF-8?q?c=20=E6=95=8C=E6=96=B9=E4=BE=A7=20ac=20=E5=9E=8B=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E8=AF=BB=E6=B3=95=E6=9C=AC=E6=89=B9=E6=8E=A5=E7=BA=BF?= =?UTF-8?q?=EF=BC=88=E9=98=B2=E5=AE=88=E6=96=B9=20AC=3D=E8=A1=A8=E5=80=BC+?= =?UTF-8?q?=CE=A3ac=20=E5=9E=8B=E6=95=88=E6=9E=9C=EF=BC=8C=E6=95=8C?= =?UTF-8?q?=E6=96=B9=E8=B7=AF=E5=BE=84=E4=BB=8E=E7=BA=AF=E8=A1=A8=E5=80=BC?= =?UTF-8?q?=E6=89=A9=E5=B1=95=EF=BC=89=EF=BC=9B=E2=91=A3=E7=AC=AC=208=20?= =?UTF-8?q?=E5=9E=8B=20action=3Dap=5Fup=20=E8=A1=8C=E5=8A=A8=E7=82=B9?= =?UTF-8?q?=EF=BC=88=E6=AD=A3=E5=90=91=EF=BC=8C=E4=B8=8B=E8=BD=AE=20AP+1?= =?UTF-8?q?=EF=BC=8Cweight=206=EF=BC=89/ap=5Fdrain=20=E8=BF=9F=E6=BB=9E?= =?UTF-8?q?=EF=BC=88=E8=B4=9F=E5=90=91=EF=BC=8C=E4=B8=8B=E8=BD=AE=20AP?= =?UTF-8?q?=E2=88=921=EF=BC=89=E2=80=94=E2=80=94action=5Feconomy=20?= =?UTF-8?q?=E6=8E=92=E9=98=9F=E9=9D=A2=20queue=5Fap=5Fdelta/pending=5Fap?= =?UTF-8?q?=5Fdelta=20=E6=96=B0=E5=A2=9E=EF=BC=8Cnotify=5Fround=5Fstart=20?= =?UTF-8?q?=E5=85=91=E7=8E=B0=EF=BC=88=E5=9F=BA=E7=BA=BF=206+=E5=87=80?= =?UTF-8?q?=E5=80=BC=EF=BC=8C=E4=B8=8B=E9=99=90=200=EF=BC=8C=E5=85=91?= =?UTF-8?q?=E7=8E=B0=E6=B8=85=E9=9B=B6=EF=BC=89=EF=BC=8C=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E8=AE=B0=20effect=20=E8=A1=8C=EF=BC=9B=E2=91=A4=E6=8A=A4?= =?UTF-8?q?=E7=94=B2=E5=9E=8B=E5=AF=B9=E9=BD=90=3Doff=5Fguard=20=E2=88=922?= =?UTF-8?q?=E2=86=92=E2=88=921=EF=BC=9B=E2=91=A5schema=3D=E5=85=AB?= =?UTF-8?q?=E5=9E=8B=E5=B0=81=E9=97=AD=E6=9E=9A=E4=B8=BE=E5=8D=81=E5=85=AD?= =?UTF-8?q?=E6=A0=BC=E3=80=81=E4=BC=8F=E5=87=BB=E5=8A=A0=E5=B1=82=E8=A1=8C?= =?UTF-8?q?=E7=89=B9=E4=BE=8B=E6=A0=A1=E9=AA=8C=E9=80=80=E5=BD=B9=E3=80=81?= =?UTF-8?q?effect=5Fpool=5Fmap=20=E5=88=A0=20ambush/flat=5Fattach=20?= =?UTF-8?q?=E9=94=AE=EF=BC=9B=E2=91=A6=E8=A1=A8=E7=8E=B0=E5=B1=82=3D?= =?UTF-8?q?=E6=95=8C=E5=8D=A1=E4=BC=8F=E5=87=BB=E6=B1=A0=E8=A1=8C=E6=8B=86?= =?UTF-8?q?=E9=99=A4=EF=BC=88=E8=AD=A6=E8=A7=89=E5=85=A5=E6=95=8C=E6=96=B9?= =?UTF-8?q?=E5=A2=9E=E7=9B=8A=E6=8A=95=E5=BD=B1=EF=BC=8Cpercent|ac=20?= =?UTF-8?q?=E5=8F=8C=E9=87=8F=E7=BA=B2=EF=BC=89=E3=80=81=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A7=BD=E5=9B=BE=E6=A0=87=20ambush=E2=86=92alert=EF=BC=9B?= =?UTF-8?q?=E2=91=A7=E6=96=87=E6=A1=A3=3D=E6=95=8C=E4=BA=BA=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=20v0.12=EF=BC=88=E4=BC=8F=E5=87=BB=E8=8A=82=E9=80=80?= =?UTF-8?q?=E5=BD=B9=E6=94=B9=E5=86=99=EF=BC=89/=E6=88=98=E6=96=97?= =?UTF-8?q?=E7=BB=93=E7=AE=97=20v0.20=EF=BC=88=E5=85=AC=E5=BC=8F=E4=B8=8E?= =?UTF-8?q?=E6=8E=88=E4=BA=88=E6=AE=B5=EF=BC=89/=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E6=88=98=E6=96=97=E8=B5=84=E6=BA=90=20v0.14=EF=BC=88=E5=85=AB?= =?UTF-8?q?=E5=9E=8B=E5=AD=97=E5=85=B8=EF=BC=89/=E8=A1=8C=E5=8A=A8?= =?UTF-8?q?=E7=BB=8F=E6=B5=8E=20v0.5=EF=BC=88=E4=B8=8B=E8=BD=AE=E8=A1=8C?= =?UTF-8?q?=E5=8A=A8=E7=82=B9=E4=BF=AE=E6=AD=A3=E8=8A=82+F1=20=E6=9D=A1?= =?UTF-8?q?=E6=AC=BE3=20=E6=94=B9=E5=86=99=EF=BC=89/=E9=9A=BE=E5=BA=A6?= =?UTF-8?q?=E6=9B=B2=E7=BA=BF=20v0.15/=E5=A2=9E=E7=9B=8A=E7=8A=B6=E6=80=81?= =?UTF-8?q?=20v0.8/06=20=E6=B8=85=E5=8D=95=EF=BC=88=E4=BC=8F=E5=87=BB?= =?UTF-8?q?=E9=87=8F=E7=BA=B2=E6=9D=A1=E7=9B=AE=E9=9A=8F=E6=89=B9=E8=A7=A3?= =?UTF-8?q?=E5=86=B3+=E8=B0=83=E5=8F=82=E6=89=B9=E6=95=B0=E5=80=BC?= =?UTF-8?q?=E7=82=B9=E8=AF=84=E7=99=BB=E8=AE=B0=EF=BC=89/registry=2022=20?= =?UTF-8?q?=E5=A4=84=EF=BC=88ambush=5Funit=5Fdefinition=20=E9=80=80?= =?UTF-8?q?=E5=BD=B9+=E7=BB=A7=E4=BB=BB=20alert=E3=80=81clause3=5Fsupply?= =?UTF-8?q?=20=E4=BC=8F=E5=87=BB=E6=9A=B4=E9=9C=B2=E5=8F=A3=E5=BE=84?= =?UTF-8?q?=E4=BD=9C=E5=BA=9F=E3=80=81reward=5Ftable=20=E5=85=AB=E5=9E=8B?= =?UTF-8?q?=2074=20=E6=9D=83=E9=87=8D=E3=80=81=E8=A1=8C=E5=8A=A8=E7=BB=8F?= =?UTF-8?q?=E6=B5=8E=E6=8E=92=E9=98=9F=E9=9D=A2=EF=BC=89/ux=20battle/?= =?UTF-8?q?=E5=85=B3=E5=8D=A1=E8=8A=82=E7=82=B9=E5=9C=B0=E5=9B=BE=EF=BC=9B?= =?UTF-8?q?=E2=91=A8=E5=B7=A5=E5=85=B7=3Danalyze=5Fplaytest=20M=5FAMB=20?= =?UTF-8?q?=E5=BD=92=E9=9B=B6=E4=BF=9D=E6=97=A7=E6=97=A5=E5=BF=97=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E3=80=81clear=5Fdominance=20=E4=BC=8F=E5=87=BB?= =?UTF-8?q?=E6=9A=B4=E9=9C=B2=E6=A8=A1=E5=9E=8B=E8=BD=AC=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E6=B3=A8=E8=AE=B0=EF=BC=88=E6=96=B0=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=E5=BD=92=E8=B0=83=E5=8F=82=E6=89=B9=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E2=91=A9=E9=AA=8C=E8=AF=81=3D=E5=86=92=E7=83=9F=20330=20?= =?UTF-8?q?=E9=A1=B9=200=20=E5=A4=B1=E8=B4=A5=E4=B8=89=E9=97=B8=E5=85=A8?= =?UTF-8?q?=E8=BF=87=EF=BC=88=E6=96=B0=E5=A2=9E=E8=AD=A6=E8=A7=89=E5=9C=A8?= =?UTF-8?q?=E4=BD=8D+action=20=E6=AD=A3=E8=B4=9F=E6=8A=B5=E6=B6=88?= =?UTF-8?q?=E6=8E=92=E9=98=9F=E6=96=AD=E8=A8=80=EF=BC=89+gdd=5Flint=20?= =?UTF-8?q?=E4=B8=8E=20master=20=E5=9F=BA=E7=BA=BF=E4=B8=80=E8=87=B4?= =?UTF-8?q?=EF=BC=888=20=E6=96=87=E4=BB=B6=E5=AD=98=E9=87=8F=EF=BC=89?= =?UTF-8?q?=EF=BC=9B=E9=81=97=E7=95=99=3D=E8=AD=A6=E8=A7=89/=E8=A1=8C?= =?UTF-8?q?=E5=8A=A8=E7=82=B9=E6=95=B0=E5=80=BC=20provisional=20=E5=BD=92?= =?UTF-8?q?=E6=9B=B2=E7=BA=BF=E8=B0=83=E5=8F=82=E6=89=B9=EF=BC=8806=20?= =?UTF-8?q?=E5=B7=B2=E7=99=BB=E8=AE=B0=EF=BC=89=EF=BC=8C=E7=9C=9F=E4=BA=BA?= =?UTF-8?q?=E6=89=B9=E8=AF=95=E7=8E=A9=E5=BB=BA=E8=AE=AE=E5=9C=A8=E7=BB=88?= =?UTF-8?q?=E7=89=88=E8=A7=84=E5=88=99=E4=B8=8A=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/06-待办清单.md | 16 +++--- design/gdd/systems/冒险循环/关卡节点地图.md | 6 +-- design/gdd/systems/冒险循环/难度曲线与Boss.md | 5 +- design/gdd/systems/战斗循环/地图战斗资源.md | 32 ++++++----- design/gdd/systems/战斗循环/增益状态.md | 13 +++-- design/gdd/systems/战斗循环/战斗结算.md | 30 ++++++----- design/gdd/systems/战斗循环/敌人系统.md | 50 ++++++----------- design/gdd/systems/排雷循环/行动经济.md | 21 +++++--- design/registry/entities.yaml | 39 +++++++------- design/ux/battle.md | 4 +- .../core/action_economy.gd | 14 ++++- .../core/battle_orchestrator.gd | 53 ++++++++----------- .../core/reward_economy.gd | 2 +- .../data/schemas/reward_table.gd | 13 ++--- .../data/tables/reward.tres | 32 +++++++++-- .../data/tables/settlement.tres | 3 +- .../data/tables/status_effects.tres | 25 +++++---- .../presentation/views/enemy_card_view.gd | 7 +-- .../presentation/views/status_slot_row.gd | 8 +-- .../smoke/damage_probe.gd | 4 +- .../smoke/smoke_all.gd | 45 +++++++++------- tools/analyze_playtest.py | 10 ++-- tools/clear_dominance_audit.py | 5 +- 23 files changed, 234 insertions(+), 203 deletions(-) diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 07d10794..32c8edb1 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -98,14 +98,6 @@ ### 敌人系统 -#### 伏击量纲的量级当量复核 - -**现状**:附加值 +1 为 provisional(量纲已定稿,参见 `data/tables/status_effects.tres` ambush 行)。原登记的上限与量纲联动面已消解:**单轮授予上限(advantage_per_round_cap)随 2026-09-20 用户拍板删除**——反灾难护栏退役,一轮踩雷数由行动点预算天然封顶,连踩雷受罚是应得反馈;溢出未生效行类型(行协议 10→9 类)与混编遭遇上限取值歧义随之消失。 - -**归属**:战斗结算对账闭合时裁决(量级当量随难度曲线调参批对账) - -**状态**:上限面已收口(2026-09-20 删除批,冒烟 330 项全绿);量级重核归曲线调参批 - #### 零伤害 / 无威胁组合的跨字段护栏 **现状**:主角基础攻击为 0 已被域下界杜绝;残余退化 = 敌种行攻击基线 0 且上限 0 → 无威胁敌(内容调参禁区);跨表量级护栏(基线 × 倍率上界对主角生命上限域)的归属未定 @@ -321,6 +313,14 @@ ### 难度曲线与Boss +#### 调参批数值点评登记(八型批随批登记) + +**现状**:格面资源八型批后随批登记的数值点评——① 增伤型奖励/惩罚幅度 50/25 不对称是否有意;② 削弱型 65/25 同问(且 percent 套个位数取整偏粗——主角攻击 2 点时 ±25% 常取整无感);③ 回血奖励过薄(值 1、权重全池最低 2);④ 警觉/行动点修正两新词数值全部 provisional;⑤ 行动经济"满停一轮 = 一刷"节拍在 AP±1 修正下的对账。 + +**归属**:[难度曲线与Boss](systems/冒险循环/难度曲线与Boss.md)难度曲线调参批 + +**状态**:待办(随调参批一并裁决) + #### 基线通关率越带,加难杠杆扫描未执行 **现状**:现行扫描读数 60%,越 [30%, 50%] 上界(2026-09-18 注:目标带已随 2026-09-17 数值纪律收口批改为 [10%, 25%]〔用户拍板〕,旧读数 60% 系压缩批前口径、已失效——本条现状文本按新带校正:新带下加难紧迫性待验收批重测后重判)。三类杠杆候选已登记:血量锚走廊 r_boss [1.1, 1.35](Boss 生命 180–207)(2026-09-17 注:数值压缩批后 Boss 生命已 ÷3 缩水,180–207 为压缩前基线锚,复算随调参批)、群战上探、注入衰减 0.5 → 0.6;扫描步未执行。落带前全部现行行值维持 provisional-pending-scan diff --git a/design/gdd/systems/冒险循环/关卡节点地图.md b/design/gdd/systems/冒险循环/关卡节点地图.md index 4f6648aa..a2e948fb 100644 --- a/design/gdd/systems/冒险循环/关卡节点地图.md +++ b/design/gdd/systems/冒险循环/关卡节点地图.md @@ -12,7 +12,7 @@ ## 系统范围 -边界这样划:图上**有哪些节点**(具体摆什么、摆几个)是关卡表的内容,归冒险结构;本文管图**怎么走、走到每步发生什么**,以及一张关卡表行集要满足什么结构规则才算合法的图。战斗内部的一切(敌人怎么配、几只、什么技能池、伏击怎么叠)归战斗循环文档;本文只负责把"第几关、哪个节点"递过去。 +边界这样划:图上**有哪些节点**(具体摆什么、摆几个)是关卡表的内容,归冒险结构;本文管图**怎么走、走到每步发生什么**,以及一张关卡表行集要满足什么结构规则才算合法的图。战斗内部的一切(敌人怎么配、几只、什么技能池、踩雷负向怎么兑)归战斗循环文档(原"伏击怎么叠"随 2026-09-20 八型批伏击退役改述);本文只负责把"第几关、哪个节点"递过去。 负责: @@ -30,7 +30,7 @@ |---|---| | 关卡序列与图上摆哪些节点(行集内容、关数) | [冒险结构](冒险结构.md) | | 关卡大奖励、跨战斗生命账本、失败重开 | [冒险结构](冒险结构.md) | -| 战斗内部的一切:敌人配置、数量、技能池、伏击 | [敌人系统](../战斗循环/敌人系统.md)与[战斗结算](../战斗循环/战斗结算.md) | +| 战斗内部的一切:敌人配置、数量、技能池、踩雷负向 | [敌人系统](../战斗循环/敌人系统.md)与[战斗结算](../战斗循环/战斗结算.md) | | 同场多敌种(同一节点配多种敌人)的表结构与取值口径 | 敌人系统(战斗侧改键批) | | 节点奖励的道具内容、持有与使用语义 | [魔法道具](../排雷循环/魔法道具.md)(内容重定批) | | 敌我数值曲线与遭遇投放节奏 | [难度曲线与Boss](难度曲线与Boss.md) | @@ -97,7 +97,7 @@ **遭遇构成的编排面**——本文对"放什么敌人"的全部职责只有三条: 1. 行进到战斗或 Boss 节点,兑付动作就是开战:本文递出定位信息,移交战斗结算。 -2. 定位信息只有两样:**关卡序号 + 节点编号**。战斗侧拿编号查表、配敌、掷数量、跑技能池、叠伏击——一切战斗内部初始化归战斗循环文档,图的初始化不为战斗初始化做任何决定。 +2. 定位信息只有两样:**关卡序号 + 节点编号**。战斗侧拿编号查表、配敌、掷数量、跑技能池、兑踩雷负向——一切战斗内部初始化归战斗循环文档(原"叠伏击"随 2026-09-20 八型批伏击退役改述),图的初始化不为战斗初始化做任何决定。 3. 本文不预掷任何战斗数值、不读敌人数量;教学位节点同样掷骰、没有结构豁免("任何掷骰结果下都稳过"的保证是[难度曲线与Boss](难度曲线与Boss.md)的数值责任)。 第二关的"新内容 = 既有池新技能"([技能池提案](../../../../docs/proposal-skill-pool.md)已定)投放时,改的是战斗侧行里引用的技能池内容——节点图结构原样不动,本文无需为投放留任何新结构位。 diff --git a/design/gdd/systems/冒险循环/难度曲线与Boss.md b/design/gdd/systems/冒险循环/难度曲线与Boss.md index e4bef358..3a6f5b3a 100644 --- a/design/gdd/systems/冒险循环/难度曲线与Boss.md +++ b/design/gdd/systems/冒险循环/难度曲线与Boss.md @@ -91,7 +91,7 @@ MVP 行值并不逐式现算,而是按此式量级直填经切片验证过的 | 变量 | 含义 | |---|---| | 进场生命 | 主角进入本战时的生命;跨战斗持久,归[冒险结构](冒险结构.md)的 HP 账本 | -| 受伤峰值 / 谷值 | 敌方最坏 / 最好一轮的输出(攻击、技能倍率、池闸长期速率、伏击附加、减伤、削弱的合计构成见[战斗结算](../战斗循环/战斗结算.md)战斗段;技能池批口径——出招构成为摇号分布,峰值/谷值构成按含闸长期速率复核而非固定剧本拍) | +| 受伤峰值 / 谷值 | 敌方最坏 / 最好一轮的输出(攻击、技能倍率、池闸长期速率、减伤、削弱的合计构成见[战斗结算](../战斗循环/战斗结算.md)战斗段;技能池批口径——出招构成为摇号分布,峰值/谷值构成按含闸长期速率复核而非固定剧本拍) | | 输出峰值 / 谷值 | 玩家最好 / 最坏一轮的总输出(分量构成同上) | | 一次性伤害 | 清障炸药一类当场引爆的大额伤害 | @@ -215,7 +215,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 第二关图版注记(分支节点图批):兄弟精 = bugbear 复用(幽暗地域部族设定——display_name 与第一关"熊地精"错开;池差异化改造 = 蓄力拍退役换突刺,复用共享技能行);巨蜘蛛 = 新敌种(群行倾向、首遇位固定数量不加骰——首遇教学位纪律);蛛化卓尔精灵 = Boss 专属池(独占技毒爆 + 权重轮廓,血量为 r_boss 口径 provisional 锚——定位本关最大单场消耗);护甲面:轻甲(蜘蛛)与魔法护甲(兄弟精)同关错开克制面,Boss 重甲。「兄弟精」称呼经用户 2026-09-17 确认 = 熊地精 bugbear;Boss 定名蛛化卓尔精灵(用户同日拍板)。节点编号 2 = 奖励点(直通空态)、3 = 恢复点(rest_heal_pct 行字段兑付)——不开战斗、无敌人/棋盘行。 -伏击不设单轮授予上限(原 advantage_per_round_cap 行值已随 2026-09-20 用户拍板删除——一轮踩雷数由行动点预算天然封顶)。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定,教学位与首遇位都不豁免——没有区间上界的行自然取定值,那不是豁免,是区间宽度为零。 +群伤负向 = 警觉(敌方护甲等级 +1——2026-09-20 八型批伏击退役换装);一轮踩雷数由行动点预算天然封顶(原 advantage_per_round_cap 行值同日先行删除)。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定,教学位与首遇位都不豁免——没有区间上界的行自然取定值,那不是豁免,是区间宽度为零。 技能池投值(池权重/冷却/保底的所有权本文,机制归[敌人系统](../战斗循环/敌人系统.md);行值读 `skills.tres` 与 `enemy.tres` 的 pool,全部 provisional): @@ -280,3 +280,4 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 | v0.12 | 2026-09-18 | **数值语言拍板批·甲效矩阵加法核换装同步(零行值改动——与 01-核心循环 数值语言条款 / 元进度 / registry / 06-待办清单 / 切片代码同批)**:正文克制矩阵节与调参表克制矩阵行两处五档措辞改三档加法(克制 / 中性 / 被克三档加法修正 +1 / 0 / −1 点,量纲由百分比改整数点数);重定价义务面扩写——矩阵加法修正点数随攻击成长的重定价与敌种护甲变更同列,均须复算 Boss 与普通战的击杀区间 | | v0.13 | 2026-09-19 | **技能池节奏体验验证批(与 06-待办清单 / tools/skill_rhythm_audit.py / smoke/rhythm_batch.gd 同批,零行值改动)**:06 待办「单拍行为环的体验验证(改型:技能池节奏体验验证)」解决移除——判读带用户拍板(过旱 = 战斗整体全敌人零特殊技;过涝 = 连续特殊技无普攻基底);调参表「池 EV 锚」行登记 60 种子正式读数(份额对表 / 保底零越界 / 过涝无信号 / 过旱归短命杂鱼生存时长);**方法论规则成文:节奏/EV 类日志读数须 ≥50 distinct seeds**(4200 系 10 种子×网格重复曾产生地精一伙 0/484 突刺假象,4300 系复跑证伪——与 armor_roll 种子偏置发现同族,见 registry rng_service 关联面) | | v0.14 | 2026-09-20 | **伏击单轮上限删除批同步(零行值改动——上限行值整体退役)**:关键投值节单轮伏击授予上限改述不设上限;原 advantage_per_round_cap 对账供给面随批作废 | +| v0.15 | 2026-09-20 | **格面资源八型批同步(零行值改动——与敌人系统 / 战斗结算 / 地图战斗资源 / 行动经济 / registry / 切片代码同批)**:① 受伤峰值构成去"伏击附加"项(伏击随八型批退役);② 关键投值节伏击上限措辞改述为群伤负向 = 警觉(敌方护甲等级 +1),原 advantage_per_round_cap 对账供给面维持同日先行作废;③ 警觉与行动点修正两新词的当量对账义务归本系统调参批(随 06 清单「调参批数值点评登记」条执行) | diff --git a/design/gdd/systems/战斗循环/地图战斗资源.md b/design/gdd/systems/战斗循环/地图战斗资源.md index 11a41ba3..186d701b 100644 --- a/design/gdd/systems/战斗循环/地图战斗资源.md +++ b/design/gdd/systems/战斗循环/地图战斗资源.md @@ -18,9 +18,9 @@ | 负责 | 说明 | |---|---| -| 格面资源类型封闭枚举 | 七型(attack / defense / heal / blast / weaken / pierce / magic——2026-09-18 伤害道具批五→七);表里出现清单外的类型,数据加载直接拒绝 | +| 格面资源类型封闭枚举 | 八型(attack / defense / heal / blast / weaken / pierce / magic / action——2026-09-18 伤害道具批五→七、2026-09-20 格面资源八型批七→八);表里出现清单外的类型,数据加载直接拒绝 | | 装板期身份预分配 | 每张图装上时一次摇定全部非封锁格的资源类型身份与清图奖励对象身份;只读、无重摇 | -| 极性矩阵与七型字典 | 「动作 × 格型 → 正负号」的定义,以及每型正向 / 负向各兑付成什么效果 | +| 极性矩阵与八型字典 | 「动作 × 格型 → 正负号」的定义,以及每型正向 / 负向各兑付成什么效果 | | 清图奖励对象 | 板级作用域的独立奖励封装,可配置可替换,按图类型差异化 | | 未来功能道具的预留结构位 | 长周期、更强力的功能性道具经其他渠道加入;渠道设计未定,本系统只留结构位不预写 | @@ -73,17 +73,17 @@ | 格型 | 候选集合(cell 池正向行,weight>0) | 类型频次合计 | |---|---|---| -| 安全格 | attack_up(attack)· ac_up(defense)· spark_aoe(blast)· heal_minor(heal)· weaken(weaken)· pierce_strike(pierce)· magic_bolt(magic) | 见 `data/tables/reward.tres` | -| 雷格 | 同上(雷安同池——七行正向行全集,权重分布相同) | 见 `data/tables/reward.tres` | +| 安全格 | attack_up(attack)· ac_up(defense)· spark_aoe(blast)· heal_minor(heal)· weaken(weaken)· pierce_strike(pierce)· magic_bolt(magic)· ap_up(action) | 见 `data/tables/reward.tres` | +| 雷格 | 同上(雷安同池——八行正向行全集,权重分布相同) | 见 `data/tables/reward.tres` | 清图槽(clear_default 池,clear_blast)独立于格面资源——作用域为整张板,不挂任何一格。 引用(代码事实源): - `prototypes/dungeon-sweeper-vertical-slice/core/reward_economy.gd#roll_board`:`_rollable_rows()` 第 207-213 行收 `pool_tag=cell & polarity=positive & weight>0` 全集;循环第 65-67 行对 `eligible` 清单(全部非封锁格)一视同仁。 - `prototypes/dungeon-sweeper-vertical-slice/core/minesweeper_rules.gd#_do_dig` 第 256-264 行:chain/dig 通道 `cell_revealed` 事件 `resource=true` 字段对安全格与雷格一致——注释明确"安全格与雷格一视同仁(雷格亦携带,负向兑付归 战斗结算 极性路由)"。 -- `prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres`:7 行正向行 weight 现行值读 `data/tables/reward.tres`。 +- `prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres`:8 行正向行 weight 现行值读 `data/tables/reward.tres`。 -候选集合具体行值(power / power_min / power_max / stacks / effect_id)随行更新——以 `data/tables/reward.tres` 为现行值源;GDD 表格只锁行集与权重分布语义。负向 7 行(enrage / off_guard / heal_backlash / ambush_double / sapped / pierce_snare / magic_recoil——2026-09-18 伤害道具批五→七)weight=0 不参与摇号,按(类型, 极性)查表取用,不在候选集合内。 +候选集合具体行值(power / power_min / power_max / stacks / effect_id)随行更新——以 `data/tables/reward.tres` 为现行值源;GDD 表格只锁行集与权重分布语义。负向 8 行(enrage / off_guard / heal_backlash / enemy_alert / ap_drain / sapped / pierce_snare / magic_recoil——2026-09-20 八型批 ambush_double→enemy_alert 换装 + ap_drain 新增)weight=0 不参与摇号,按(类型, 极性)查表取用,不在候选集合内。 举证:本节为候选集合枚举,无计算。 @@ -97,21 +97,22 @@ | 标旗且留到轮末判定 | **−类型**:标错,该格资源的负向兑付(惩罚) | **+类型**:标中,该格资源的正向兑付(奖励) | | 插旗格直接挖开(插旗不可逆批 2026-09-19) | 零兑付(四情况④:零惩罚零奖励——标空不判、正向作废) | **−类型**照常(四情况②:只受挖雷一层惩罚——标中不发) | -矩阵的定义归本文;把矩阵跑起来的路由(结算队列、判定基线、逐行兑付)归[战斗结算](战斗结算.md)的授予段。旧"踩雷→伏击"是本矩阵的退化特例(所有雷同一类型的世界);伏击保留为 blast 型的负向一行。撤旗动作已随插旗不可逆批退役(2026-09-19)——旗无移除手段,矩阵删「撤旗」行、增「插旗格直接挖开」行。 +矩阵的定义归本文;把矩阵跑起来的路由(结算队列、判定基线、逐行兑付)归[战斗结算](战斗结算.md)的授予段。旧"踩雷→伏击"是本矩阵的退化特例(所有雷同一类型的世界);blast 型负向 = 警觉(2026-09-20 八型批伏击退役换装)。撤旗动作已随插旗不可逆批退役(2026-09-19)——旗无移除手段,矩阵删「撤旗」行、增「插旗格直接挖开」行。 举证:本节为枚举与路由定义,无计算。 -### 七型字典:每型一行正向一行负向 +### 八型字典:每型一行正向一行负向 -格面资源的一切兑付从七个类型里出,每个类型恰好一行正向、一行负向(五型 + 2026-09-18 伤害道具批增补的 pierce / magic 两型)——正向是玩家操作正确时拿到的东西,负向是操作失误或踩雷时吃到的东西: +格面资源的一切兑付从八个类型里出,每个类型恰好一行正向、一行负向(五型 + 2026-09-18 伤害道具批增补 pierce / magic 两型 + 2026-09-20 格面资源八型批增补 action 一型)——正向是玩家操作正确时拿到的东西,负向是操作失误或踩雷时吃到的东西: | 类型 | 正向(奖励) | 负向(惩罚) | |---|---|---| | attack 增伤 | attack_up(hero_offense 池)——幅度/上限/权重见 `reward.tres` | enrage(enemy_output 池)——幅度/上限见 `status_effects.tres` enrage 行 | | defense 护甲 | ac_up 护甲强化(AC 掷点阈值轴——2026-09-16 换装,不入池)——幅度/上限/权重见 `reward.tres` | off_guard 失衡(AC 掷点阈值轴负向——2026-09-18 换装,不入池、退出 hero_defense 池)——幅度/上限见 `status_effects.tres` off_guard 行 | | heal 回血 | heal_minor(满血零兑付照旧)——威力/权重见 `reward.tres` | heal_backlash 直伤:战斗结算直接扣血,不经增益状态——威力见 `reward.tres` | -| blast 群伤 | spark_aoe 全体存活敌各吃一笔——威力/权重见 `reward.tres` | ambush_double 敌方伏击 +N 层(进伏击池,N=stacks)——见 `reward.tres` | +| blast 群伤 | spark_aoe 全体存活敌各吃一笔——威力/权重见 `reward.tres` | enemy_alert 警觉:敌方全体护甲等级 +1/层(`status_effects.tres` alert 行)——见 `reward.tres` | | weaken 削弱 | weaken(enemy_output 池;同名重复授予只刷新剩余次数——2026-09-18 续时定案)——幅度见 `status_effects.tres` weaken 行 | sapped(hero_offense 池)——幅度见 `status_effects.tres` sapped 行 | +| action 行动点 | ap_up:下轮行动点 +1——见 `reward.tres` | ap_drain 迟滞:下轮行动点 −1——见 `reward.tres` | | pierce 穿刺 | pierce_strike 穿刺弹:单目标克制直伤(attack_type=pierce 查克制矩阵,必中全额不掷点;目标 = 固定顺位最前存活敌)——威力/权重见 `reward.tres` | pierce_snare 穿刺陷阱:主角直伤,不经增益状态——威力见 `reward.tres` | | magic 魔法 | magic_bolt 魔法矢:单目标克制直伤(attack_type=magic,同上)——威力/权重见 `reward.tres` | magic_recoil 魔法反噬:主角直伤,不经增益状态——威力见 `reward.tres` | @@ -123,7 +124,7 @@ ### 负向恒即时:惩罚没有库存语义 -负向兑付全部在授予段当场执行,不入库、不出窗口——惩罚不设库存、不留存量。正向里的 percent 类(增益行)进[增益状态](增益状态.md)的容器;flat 类(群伤、治疗、直伤)当场结算。叠层饱和由战斗结算既有池 clamp 承载;blast 负向(伏击)直授无上限(原伏击单轮上限已随 2026-09-20 用户拍板退役)。负向直伤使主角生命归零时,结算按战斗结算的致死短路规则处理。 +负向兑付全部在授予段当场执行,不入库、不出窗口——惩罚不设库存、不留存量。正向里的 percent 类(增益行)进[增益状态](增益状态.md)的容器;flat 类(群伤、治疗、直伤)当场结算。叠层饱和由战斗结算既有池 clamp 承载;blast 负向(警觉)与 action 负向(迟滞)直授无上限。负向直伤使主角生命归零时,结算按战斗结算的致死短路规则处理。 举证:本节为兑付语义,无计算。 @@ -200,20 +201,22 @@ | enrage | attack | 负向 | weight=0 不参与摇号·power 不消费(percent 行 effect_id → StatusEffectTable enrage 引用) | 同上 | 同上 | | off_guard | defense | 负向 | weight=0 不参与摇号·power 不消费(percent 行 effect_id → StatusEffectTable off_guard 引用) | 同上 | 同上 | | heal_backlash | heal | 负向 | weight=0 不参与摇号·power [0,999](flat 行 effect_id 恒空) | 同上 | 同上 | -| ambush_double | blast | 负向 | weight=0 不参与摇号·stacks [1,16]·effect_id 恒空(伏击非增益态) | 同上 | 同上 | +| enemy_alert | blast | 负向 | weight=0 不参与摇号·effect_id=alert(敌方护甲等级 +1——effect 引用行,unit=ac) | 同上 | 同上 | +| ap_up | action | 正向 | weight=6 参与摇号 | 同上 | 同上 | +| ap_drain | action | 负向 | weight=0 不参与摇号 | 同上 | 同上 | | sapped | weaken | 负向 | weight=0 不参与摇号·power 不消费(percent 行 effect_id → StatusEffectTable sapped 引用) | 同上 | 同上 | | clear_blast | blast | 正向 | clear_default 池·power [0,999]·power_min/power_max 可选区间·weight [0,999] | 同上 | 清图槽 | 摇号只消费正向格面池的权重(类型频次由此涌现——具体权重读 `reward.tres`);负向行是纯兑付字典,按(类型,极性)查表取用,不消费权重。clear_blast 对全体存活敌各吃一笔当场兑付的 flat 伤害。RewardConfigTable 已随可选类删除下线——注入概率、按板保底等参数全部失义。 -结构冻结(改动走本文修订流程,不走调参):七型封闭枚举(伤害道具批 2026-09-18 修订五→七)、雷安同池、极性矩阵、装板期预分配且无重摇、负向恒即时无库存、清图恒非空、除摇号外零随机。 +结构冻结(改动走本文修订流程,不走调参):八型封闭枚举(伤害道具批 2026-09-18 修订五→七、格面资源八型批 2026-09-20 修订七→八)、雷安同池、极性矩阵、装板期预分配且无重摇、负向恒即时无库存、清图恒非空、除摇号外零随机。 ## 验收标准 - 每格必有货:装板摇号后,每个非封锁格恰有一个资源类型、清图槽恰有一个对象身份;封锁格恒无资源;同图跨轮查询结果逐字相同。 - 雷安同池:安全格与雷格从同一类型池、同一权重分布摇定;任何"按格型差异化分配"的分支不存在。 - 恰一次与确定性:摇号对每张新图恰发生一次,重复调用被拒绝且映射不变;同一条随机流轨迹驱动两套实例,映射与兑付回执逐位相同。 -- 类型封闭与字典完整:表里出现七型之外的类型、或任一型缺正向/负向行,加载拒绝。 +- 类型封闭与字典完整:表里出现八型之外的类型、或任一型缺正向/负向行,加载拒绝。 - 未生效可见:满层增益、满血正向治疗、无存活敌的群伤,各自在结算明细记"奖励未生效"行,零折算、零补偿。 - 加载护栏:池空、清图池无正当量、增益引用悬空——任一命中即加载报错中止;默认内容加载通过。 - 表实一致:数据表字段与 registry 的 reward_table 条目逐字段一致。 @@ -239,3 +242,4 @@ | v0.11 | 2026-09-18 | **战斗数值结构修复批·极性矩阵同步(2026-09-18 盘问会话用户拍板,与战斗结算 v0.14 / 增益状态 v0.9 / registry / 切片代码同批)**:① defense 型负向 off_guard 行失同步修正——原残留"hero_defense 池,承伤加深"改"AC 掷点阈值轴负向、不入池"(off_guard 换装 AC 轴随结构修复批落地,effect_pool_map 删键);② weaken 型正向行补续时定案注记(同名重复授予只刷新剩余次数——2026-09-18,叠层措辞随批退役) | | v0.12 | 2026-09-19 | **插旗不可逆批·极性矩阵同步(用户拍板全套落地,与战斗结算 v0.18 / 排雷玩法 v0.5 / registry / 切片代码同批)**:矩阵「标旗后当轮撤旗」行删除(撤旗动作退役)、「插旗格直接挖开」行新增——安全格零兑付(四情况④零惩罚零奖励)、雷格负向照常(四情况②只受挖雷一层惩罚、标中不发);路由描述「抵消过滤」随战斗结算改「判定基线」 | | v0.13 | 2026-09-20 | **伏击单轮上限删除批同步(与战斗结算 v0.19 / 敌人系统 v0.11 等同批)**:负向即时节 blast 负向的伏击上限护栏与溢出行协议措辞删除,改直授无上限 | +| v0.14 | 2026-09-20 | **格面资源八型批(用户拍板——与敌人系统 / 战斗结算 / 行动经济 / registry / 切片代码同批)**:① 七型→八型(+action 行动点——正向 ap_up 下轮行动点 +1、负向 ap_drain 迟滞 −1,经 action_economy 排队、下一轮兑现);② blast 负向 ambush_double 退役换装 enemy_alert 警觉(敌方全体护甲等级 +1/层,`status_effects.tres` alert 行,side-wide);③ 极性矩阵/八型字典/负向即时节/候选集合/调参表/结构冻结/验收标准同步;正向权重合计 67→74(attack 14 / defense 11 / blast 16 / heal 2 / weaken 8 / pierce 8 / magic 8 / 清障炸药 1 / action 6) | diff --git a/design/gdd/systems/战斗循环/增益状态.md b/design/gdd/systems/战斗循环/增益状态.md index c821b80f..75e5eaa7 100644 --- a/design/gdd/systems/战斗循环/增益状态.md +++ b/design/gdd/systems/战斗循环/增益状态.md @@ -30,7 +30,6 @@ | 事实产生与授予裁决(去重、恰好一次) | [战斗结算](战斗结算.md) | | 效果在结算公式里的用法(乘除侧读法、地板、作用顺序) | [战斗结算](战斗结算.md) | | 增益与削弱档位的当量对照验收 | [地图战斗资源](地图战斗资源.md)与[战斗结算](战斗结算.md) | -| 固定值量纲(伏击)的定义与惩罚上限 | [敌人系统](敌人系统.md) | | 状态栏、图标、明细行的呈现 | [HUD 框架](../表现与支撑/HUD框架.md) | ## 在核心循环中的位置 @@ -70,7 +69,7 @@ | 标中旗 | 轮末旗判定标中(巢穴被控制) | 敌方,削弱 | | 踩雷 | 挖开惩罚格、惊动巢穴 | 敌方,增强 | | 清图奖励 | 清图奖励槽含增益时 | 随行定,路径归[地图战斗资源](地图战斗资源.md)定稿 | -| 标空旗 | 轮末旗判定标空(标了但格不是雷) | 反噬三选一:敌方暴走、敌方伏击或主角失衡;载体裁决归[战斗结算](战斗结算.md)的标错反噬机制 | +| 标空旗 | 轮末旗判定标空(标了但格不是雷) | 该安全格格面资源的负向兑付(极性矩阵"标错"分支——2026-09-15 起不再三选一);载体裁决归[战斗结算](战斗结算.md) | 容器是只记账、不裁决的仓库:上游叫它施加几次,它就入账几次。同一笔事实被重复转化两次,就入两层——它不去重、不合并事实,"事实到授予恰好一次"由战斗结算保证。同轮多笔授予按调用方给定的次序先后入列,容器保证入账顺序稳定可读。 @@ -135,7 +134,7 @@ ### 现在有哪些状态:现行九行内容 -现行状态表恰有九行:两个主角增益(挖安全格拿)、一个主角减益(标空旗反噬的失衡)、一个主角削弱(乏力——雷格负向的 weaken 型)、四个敌方效果(踩雷的伏击增强、标中旗的削弱、标空旗反噬的暴走、敌方技能池的蓄力/硬化增益)、一个敌方防御增益(硬化)。全部用同构实例承载;数值全部 provisional(临时值,过锚验收后才定稿)。 +现行状态表恰有九行:主角侧四行(增伤/护甲强化两增益 + 失衡/乏力两减益)、敌方侧五行(削弱/暴走/警觉/蓄力/硬化——警觉为 blast 型负向踩雷载体,2026-09-20 伏击退役后进表)。全部用同构实例承载;数值全部 provisional(临时值,过锚验收后才定稿)。 | 字段 | 取值 | 说明 | |---|---|---| @@ -152,7 +151,7 @@ |---|---|---|---|---|---| | attack_up 增伤 | 主角攻击提升 | 主角 | 见 `data/tables/status_effects.tres` attack_up 行 | 时限/上限读表 / 叠加 | 安全格 | | ac_up 护甲强化 | 主角护甲等级提升(掷点折扣判定阈值——AC 轴,不入池) | 主角 | 见 `status_effects.tres` ac_up 行(2026-09-16 换装,原 defense_up 行已退役,见版本历史) | 时限/上限读表 / 叠加 | 安全格 | -| ambush 伏击 | 敌方攻击附带额外伤害 | 敌方 | 见 `status_effects.tres` ambush 行 | 时限/上限读表 / 叠加 | 踩雷 / 标空旗反噬 | +| alert 警觉 | 敌方护甲等级 +1/层 | 敌方 | 见 `status_effects.tres` alert 行 | 1 结算 / 叠加读表 | 踩雷(blast 型负向) | | weaken 削弱 | 敌方攻击被削弱(同名重复标中只刷新剩余次数、层数恒 1) | 敌方 | 见 `status_effects.tres` weaken 行(取值域 [60,85],取负生效) | 时限读表 / 刷新(2026-09-18 续时定案) | 标中旗 | | enrage 暴走 | 敌方攻击提升 | 敌方 | 见 `status_effects.tres` enrage 行 | 时限/上限读表 / 叠加 | 标空旗反噬 | | off_guard 失衡 | 主角护甲等级降低(AC 轴——掷点判定阈值下调、更易被命中;2026-09-18 换装,原百分比承伤池已退) | 主角 | 见 `status_effects.tres` off_guard 行 | 时限/上限读表 / 叠加 | 标空旗反噬 / 敌方妨害技(2026-09-19 新效应词汇批——蛛网束缚载体,duration 由技能行覆盖) | @@ -162,7 +161,7 @@ empower 与 fortify 是敌方技能池增益技在容器侧的数据落点(技能行 buff_ref 引用,施放时长由技能行覆盖——技能冷却与增益持续是两个计时器):两行 duration 表值(读表)的口径是"先兑付后衰减含施放当轮"——施放发生在第 N 结算战斗段,存活到第 N+1 结算战斗段才兑付"下一拍",即"持续 1 个有效结算"(proposal 语义的容器落地)。敌方防御池(enemy_defense)是第四个乘区池:敌方作为防守方的百分比修正池,消费面 = [战斗结算](战斗结算.md)主角攻击的池乘区——四池对称(敌打主角 = hero_defense × enemy_output,主角打敌 = hero_offense × enemy_defense),容器语义零延伸:仍是同构实例、side-wide 加算、不封顶不保底。 -削弱行是当量锚在容器侧的数据落点:标中旗的收益折算成统一价值后,必须严格高于最低档主角增益——"标中旗必须比随便挖一格更值",否则没人愿意插旗。这条锚的契约归[行动经济](../排雷循环/行动经济.md),对照验收归[战斗结算](战斗结算.md);伏击行的固定值量纲定义与惩罚上限锚归[敌人系统](敌人系统.md)。暴走与失衡两行是[战斗结算](战斗结算.md)标错反噬机制(标空旗的三选一确定性惩罚)在容器侧的数据落点:三行内容与载体裁决归它,本表只承载行值(失衡已换装 AC 轴不入池——2026-09-18 结构修复批)。**失衡另有第二来源**:敌方妨害技(2026-09-19 新效应词汇批——蛛化卓尔精灵"蛛网束缚",敌方技能施放来源、duration 由技能行 buff_duration 覆盖)——容器零新语义,同构实例照常受理;乏力 sapped 留作妨害第二词汇(暂无载体)。 +削弱行是当量锚在容器侧的数据落点:标中旗的收益折算成统一价值后,必须严格高于最低档主角增益——"标中旗必须比随便挖一格更值",否则没人愿意插旗。这条锚的契约归[行动经济](../排雷循环/行动经济.md),对照验收归[战斗结算](战斗结算.md);暴走与失衡两行分别是 attack/defense 型负向(极性矩阵"标错/踩雷"分支兑付)在容器侧的数据落点:行内容与载体裁决归它,本表只承载行值(失衡已换装 AC 轴不入池——2026-09-18 结构修复批)。**失衡另有第二来源**:敌方妨害技(2026-09-19 新效应词汇批——蛛化卓尔精灵"蛛网束缚",敌方技能施放来源、duration 由技能行 buff_duration 覆盖)——容器零新语义,同构实例照常受理;乏力 sapped 留作妨害第二词汇(暂无载体)。 ## 依赖与输出 @@ -174,7 +173,6 @@ empower 与 fortify 是敌方技能池增益技在容器侧的数据落点(技 | 上游 | [数据配置](../表现与支撑/数据配置.md) | 状态表的字段定义承载与统一读取;本系统是该表的回填责任方 | | 相邻 | [排雷玩法](../排雷循环/排雷玩法.md) | 棋盘事实的事件源头;与本容器零直接接口——事实一律经战斗结算转化 | | 相邻 | [行动经济](../排雷循环/行动经济.md) | 契约相邻、无运行时接口:五条经济契约在本侧的数据落点就是状态表行值 | -| 下游 | [敌人系统](敌人系统.md) | 伏击行固定值量纲的定义方与惩罚上限锚的验收方 | | 下游 | [地图战斗资源](地图战斗资源.md) | 清图奖励含增益时经授予入口进入;增益与削弱档位的锚验收方之一 | | 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 状态栏数据源;有利/有害极性呈现、无状态时空槽隐藏、状态到图标的映射,三义务归口 | @@ -212,7 +210,7 @@ empower 与 fortify 是敌方技能池增益技在容器侧的数据落点(技 |---|---|---|---| | attack_up 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 增伤;当量锚的参照对象(最低档主角增益) | | ac_up 幅度 | 护甲等级 [−20,20] 且非 0 | ac 行 magnitude | 护甲强化;掷点折扣判定阈值 = 基准 AC(读 hero 表)逐层 +1,不入任何池、消费归[战斗结算](战斗结算.md)掷点判定 | -| ambush 幅度 | 固定值 ≥ 1 | flat 行 magnitude | 伏击;量纲定义见[敌人系统](敌人系统.md) | +| alert 幅度 | [0, 4] | ac 行 magnitude | 警觉(敌方护甲等级 +1/层 provisional);消费 = 战斗结算护甲等级掷点判定 | | weaken 幅度 | 百分比取值域 [60,85],取负生效 | percent 行 magnitude | 削弱;须过"标中旗锚"对照 | | enrage 幅度 | 百分比 [−100,100] 且非 0 | percent 行 magnitude | 暴走;标错反噬三池之一,进敌方输出修正池 | | off_guard 幅度 | 护甲等级 [−20,20] 且非 0 | ac 行 magnitude | 失衡;标空旗反噬载体,掷点判定阈值逐层下调(2026-09-18 换装 AC 轴,不入池、退出 hero_defense 池) | @@ -257,3 +255,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.8 | 2026-09-20 | **格面资源八型批(用户拍板——与敌人系统 / 战斗结算 / registry / 切片代码同批)**:① 状态行表 ambush 行 → alert 警觉行(敌方护甲等级 +1,ac 量纲,side-wide);② 标空旗路由措辞纠正(2026-09-15 极性矩阵后已无三选一反噬,本批顺手收口);③ 敌人系统的伏击量纲定义/上限锚义务面随伏击退役移除 | diff --git a/design/gdd/systems/战斗循环/战斗结算.md b/design/gdd/systems/战斗循环/战斗结算.md index f47429b2..a215e13d 100644 --- a/design/gdd/systems/战斗循环/战斗结算.md +++ b/design/gdd/systems/战斗循环/战斗结算.md @@ -80,7 +80,7 @@ | 治疗行 | 治疗生效一行:封顶后的真实回复量 | | 奖励未生效行 | 满层拒收、满血治疗等合法例外一行 | | 标旗未中行 | 旗插空的零值归因行,每颗雷只记一次;标错的负向兑付另记效果行 | -| 蓄力行 | 敌人本拍蓄力不动手(攒下一击)时记一行 **(2026-09-16 敌人技能池批改型为施放行 `cast`:敌人本拍施放增益技——0 伤害动作、具名技能、不兑付伏击;蓄力语义改写为纯攻击增益技,见[敌人系统](敌人系统.md))** | +| 蓄力行 | 敌人本拍蓄力不动手(攒下一击)时记一行 **(2026-09-16 敌人技能池批改型为施放行 `cast`:敌人本拍施放增益技——0 伤害动作、具名技能、不掷不折〔原"不兑付伏击"读怪奖励语义随 2026-09-20 八型批伏击退役作废〕;蓄力语义改写为纯攻击增益技,见[敌人系统](敌人系统.md))** | | 衰减行 | 到期临时效果移除一行 | | 判定行 | 胜 / 负 / 继续各一行;终局判定行同时是胜负画面的数据锚 | | 高光行 | 完美排雷成立时一行,只记实际有效兑付 | @@ -104,7 +104,7 @@ **结论**:单一线性换算全源共用,禁止分源改率;百分比效果按"每个结算的瞬时当量"口径折算。 ``` -flat 类(直伤、治疗、伏击): E = 表值本身 +flat 类(直伤、治疗、行动点): E = 表值本身 percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × 参考敞口 完美排雷的清图奖励: E = 奖励表值 × 完美乘数 ÷ 100 ``` @@ -120,7 +120,7 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × 授予段消费结算队列。**队列与判定基线**:挖掘期玩家对格子的动作——开格、标旗——都进入结算队列;结算逐批兑付,不走逐动作出栈直算。旗判定以轮末在场旗位为基线:被直接挖开的旗已随挖掘消失、不在基线(零兑付——标中 / 标空让位于挖掘本体结局,见下文插旗不可逆四情况);开格事实不可撤(已开格无法回退)。过滤后按触发源分三批兑换,每格受理、每旗判定恰好一次。 -兑付走**极性矩阵**(定义归[地图战斗资源](地图战斗资源.md)):开安全格 → 该格格面资源的正向;开雷格 → 负向;标中旗 → 该雷格资源的正向;标错旗 → 该安全格资源的负向。五型字典里每型各有一行正向、一行负向——伏击不再是踩雷的固定产物,只保留为 blast 型的负向一行。 +兑付走**极性矩阵**(定义归[地图战斗资源](地图战斗资源.md)):开安全格 → 该格格面资源的正向;开雷格 → 负向;标中旗 → 该雷格资源的正向;标错旗 → 该安全格资源的负向。八型字典里每型各有一行正向、一行负向——伏击随 2026-09-20 八型批退役,blast 型负向现况 = 警觉(敌方护甲等级 +1)。 **插旗不可逆四情况(2026-09-19 用户拍板全套落地,2026-09-18 提案转正)**:旗是一次性承诺、拔旗动作退役、挖旗格放行——兑付按四情况改判: @@ -145,9 +145,10 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × | 即时全体伤害(flat) | blast 正向 | 当场对全体存活敌各扣表值生命 | 场上无敌可打时零兑付,记"奖励未生效"行 | | 即时治疗(flat) | heal 正向 | 主角按表值回复并封顶上限 | 满血时零兑付,记"奖励未生效"行 | | 直伤(flat) | heal 负向 | 主角当场扣表值生命,不经增益状态 | 生命归零即走致死短路 | -| 伏击加层 | blast 负向 | 敌方还手附加伤害 +stacks 层(读 `reward.tres` ambush_double 行),入伏击池 | 直授无上限(2026-09-20 上限退役) | +| 警觉加层 | blast 负向 | 敌方全体护甲等级 +1/层(读 `reward.tres` enemy_alert 行 → `status_effects.tres` alert 行),入增益状态容器 | 直授无上限;战斗段由防守方护甲等级读数消费 | +| 行动点修正 | action 正/负向 | 下轮行动点 ±power(action_economy 排队,下一轮开始兑现后清零;下限 0) | 排队净值不跨轮保留;明细记效果行(effect_id=ap_delta) | -伏击无上限(原[敌人系统](敌人系统.md)反灾难护栏随 2026-09-20 用户拍板退役——一轮踩雷数由行动点预算天然封顶)。伏击聚成一个池,本结算里多个敌人共享同一池值、互不消耗,且只活一轮、轮末清零。其余各型负向受池 clamp 与叠层上限承载。 +警觉(blast 负向——2026-09-20 八型批伏击退役换装)为敌方 side-wide 状态:多个敌人共享同一状态值、互不消耗,只活一轮、轮末清零;战斗段由防守方护甲等级读数消费(我打敌 = 敌方 armor_class + Σ敌方侧 ac 型状态)。其余各型负向受池 clamp 与叠层上限承载。 标中资格认雷不认旗:兑付资格以雷格实例为键——旗无任何移除手段(拔旗退役,重复插旗被"已有旗"拒绝)、同一颗雷跨轮不重复兑付;换图后新雷是新实例,资格自然重置。同一面旗一直插在雷上,每轮都会重新上报标中,去重是本系统的职责。 @@ -161,7 +162,7 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × 战斗段是兑现的最后一刀。主角的基础攻击恒存在——这是项目拍板:若基线为零,百分比增益乘上去永远是零,增益系统就空转了。攻击力域 [1, 999]、0 于加载期拒绝,行值读主角表。顺序固定:主角先手攻击顺位最前的存活敌人,随后按行序逐个存活敌人按本拍摇定技能还手;每个敌人依次走"按技能行兑现、结算伤害、执行上报(技能进冷却 + 保底计数)"三步且恰行动一次,主角不在其列。主角中途倒下,剩余敌人全部停手,直接进判定段。 -**开轮摇号与敌方技能兑现**(2026-09-16 敌人技能池批):敌人每拍做什么由开轮摇号决定——每轮轮次开始时,本系统在换算层排除冷却中技能,按行序逐敌从 `behavior_roll` 封闭流的独立子流摇定本拍动作写入实例池(首轮同样摇号;每轮恰摇一次;轮内刷新换图不重摇),随后冷却递减。摇定后、兑现前死亡 → 本拍技能作废、不动手(死亡即不动手)。结算战斗段只按技能行兑现:伤害技走三乘法链(见下),增益技记一行施放行并把状态效果按技能行持续回合挂入[增益状态](增益状态.md)容器——0 伤害动作不掷不折、不兑付伏击。池模板、技能行、冷却与保底语义归[敌人系统](敌人系统.md)(引用不转述)。 +**开轮摇号与敌方技能兑现**(2026-09-16 敌人技能池批):敌人每拍做什么由开轮摇号决定——每轮轮次开始时,本系统在换算层排除冷却中技能,按行序逐敌从 `behavior_roll` 封闭流的独立子流摇定本拍动作写入实例池(首轮同样摇号;每轮恰摇一次;轮内刷新换图不重摇),随后冷却递减。摇定后、兑现前死亡 → 本拍技能作废、不动手(死亡即不动手)。结算战斗段只按技能行兑现:伤害技走三乘法链(见下),增益技记一行施放行并把状态效果按技能行持续回合挂入[增益状态](增益状态.md)容器——0 伤害动作不掷不折。池模板、技能行、冷却与保底语义归[敌人系统](敌人系统.md)(引用不转述)。 **三乘法链**(技能伤害的合成顺序,技能倍率乘在最前,其后既有链一字不动): @@ -170,7 +171,7 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × ② AC 判断值:掷点(骰面读表)vs 防守方护甲等级 → 档位折扣;天然最大面 → 暴击 ×暴击倍率(读表)(量程上下限) ③ 命中伤害 H = (A × a) + 克制修正点数 (克制修正点数读 settlement.tres 甲效矩阵——加法点数非百分比;敌打主角不查矩阵恒中性——矩阵消费面 = 主角侧) ── 以下既有链不动 ── -增益池乘区(含敌方防御池)→ 伏击附加(后置加法、必中全额、不吃 AC)→ 向下取整 → 伤害下限 max(1,·) → 必中附加分量 rider(2026-09-19 新效应词汇批——伤害技 rider_mult 字段:max(伤害下限, floor(攻击基线 × rider_mult)),独立必中加项、不进乘区、不出暴击;无字段 = 无此步) +增益池乘区(含敌方防御池)→ 向下取整 → 伤害下限 max(1,·) → 必中附加分量 rider(2026-09-19 新效应词汇批——伤害技 rider_mult 字段:max(伤害下限, floor(攻击基线 × rider_mult)),独立必中加项、不进乘区、不出暴击;无字段 = 无此步) ``` 主角先手攻击由三个分量逐项取整后相加:基础分量(攻击力经增益修正,可被池封顶压到零;**类型 = 主角 `attack_type` 表值**——2026-09-18 营地扩展前置批:基础攻击量与攻击类型抽象分离,基础分量不再恒属普通,缺省 normal 向后兼容)、穿刺分量、魔法分量。**攻击类型是伤害的属性轴**——它只决定这个分量查甲效表的哪一行,定义里不含任何棋盘来源。分量各自查表后取整相加;甲效表把攻击类型与敌方护甲类型交叉成一张 3×3 **克制修正矩阵(加法点数)**——2026-09-18 加法核换装:每个分量在掷点/暴击折算取整后 **+ 克制修正点数**(原百分比乘区退役): @@ -185,14 +186,14 @@ 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, ·))——"被减伤归零 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)已登记的加难杠杆扫描合并处理;其生存链区间模型按掷点带宽口径复核(带宽含暴击档与折扣档),"零红档"验收保留。 **结论**:先合成、再取整、全程非负;吃掷点分量必中非归零、低掷按档位折扣、天然最大面暴击恒全额(倍率读表)、落地伤害保底 ≥ damage_floor(读表);溢杀丢弃、治疗封顶、死亡即时判定。 ``` -敌方一次技能攻击 = max(damage_floor, floor( 掷点档位技能基础分量 + 伏击附加 ) × 主角防御乘数 × 敌方输出乘数 ) + 必中附加分量 rider(若有——2026-09-19 新效应词汇批:max(damage_floor, floor(攻击基线 × rider_mult)),伏击为后置加法不进乘区不掷不折,rider 同族且更后置);增益/妨害技 = 0 伤害施放行(不掷不折、不兑付伏击),妨害状态按状态行 target_side 落主角 +敌方一次技能攻击 = max(damage_floor, floor( 掷点档位技能基础分量 ) × 主角防御乘数 × 敌方输出乘数 ) + 必中附加分量 rider(若有——2026-09-19 新效应词汇批:max(damage_floor, floor(攻击基线 × rider_mult)),rider 为后置加法不进乘区不掷不折);增益/妨害技 = 0 伤害施放行(不掷不折),妨害状态按状态行 target_side 落主角 主角一次攻击 = max(damage_floor, floor( 攻击合计 × (100 + 主角输出乘数池合成值) ÷ 100 × (100 + 敌方防御乘数池合成值) ÷ 100 ) )——hero_offense(增伤/乏力载体)与 enemy_defense(硬化载体)两池串乘在攻击合计之后(2026-09-19 充能退役后合计 = 单分量) 粒度口径:增益池乘区作用在攻击合计层——合计为个位数时百分比档存在粒度取整(如合计 2 点 ×0.75 → 1,实际约 −33% 大于名义 −25%),为已知行为、接受现状;2026-09-18 数值语言拍板后百分比仅保留增益池 / AC 折扣档 / 暴击三处既有粗档,终值与量纲复核归状态层重设计批 乘数 = 1 + 池合成值 ÷ 100;池内加算、每池独立封顶 ±100 百分点 → 乘数域 [0, 2];四池对称:敌打主角 = hero_defense × enemy_output,主角打敌 = hero_offense × enemy_defense(2026-09-18 结构修复批:hero_offense 乘区接线落地——attack_up 普通分量直乘旁路退役,旧"切片现状"注记销项) @@ -245,7 +246,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 | 上游 | [行动经济](../排雷循环/行动经济.md) | 轮末两字段消息的接收方;回发换图指令、结算完成与战斗结束通知;挖掘期刷新经它扣费;五条经济契约的对账责任方 | | 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 订阅其三事件流(挖开格、旗判定、轮次结束);换图时调用装板与退役 | | 上游 | [棋盘生成](../排雷循环/棋盘生成.md) | 换图时调用其生成接口 | -| 上游 | [敌人系统](敌人系统.md) | 单位接口全调用面:生成、查询、扣血、摇定写入、执行上报、默认目标、伏击授予、清场;护甲等级(防守方掷点判定读数)随单位数据供给;池模板与技能行数据归它 | +| 上游 | [敌人系统](敌人系统.md) | 单位接口全调用面:生成、查询、扣血、摇定写入、执行上报、默认目标、警觉授予、清场;护甲等级(防守方掷点判定读数)随单位数据供给;池模板与技能行数据归它 | | 上游 | [增益状态](增益状态.md) | 状态容器接口全调用面:开域、授予、读值、衰减、闭域 | | 上游 | [地图战斗资源](地图战斗资源.md) | 格面资源接口:预分配、身份查询、受理、清图对象、当量供给投影、映射退役 | | 上游 | [冒险结构](../冒险循环/冒险结构.md) | 战斗触发、遭遇上下文与主角入参覆盖值(provisional,MVP 冒烟直供) | @@ -259,7 +260,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 | 呈现面 | 形态 | 载荷与语义 | |---|---|---| -| 呈现状态快照 `presentation_snapshot` | 只读函数,全量 | 轮次、战斗结果、相位、行动点与储备、刷新可用性、主角(生命/上限/攻击/存活)、敌人数组(顺位/显示名/生命/敌种/护甲类型/护甲等级/摇定动作〔pending_skill/type/name〕/敌方增益 effects/伏击层数/存活)、伏击层数、主角活跃效果投影——呈现层唯一的状态读取出口(敌人技能池批批 2 定稿:行为环当前拍/环进度字段拆除,池与权重不公开) | +| 呈现状态快照 `presentation_snapshot` | 只读函数,全量 | 轮次、战斗结果、相位、行动点与储备、刷新可用性、主角(生命/上限/攻击/存活)、敌人数组(顺位/显示名/生命/敌种/护甲类型/护甲等级/摇定动作〔pending_skill/type/name〕/敌方增益 effects/存活)、主角活跃效果投影——呈现层唯一的状态读取出口(敌人技能池批批 2 定稿:行为环当前拍/环进度字段拆除,池与权重不公开) | | 战斗进行中谓词 `is_battle_live` | 只读函数,布尔 | 战斗未出结果且主角在场——组合根高频相位判断的低成本面 | | 奖励身份查询 `query_reward_identity` | 只读函数,单格 | 已开格奖励身份解析的代理,转[地图战斗资源](地图战斗资源.md)的身份查询(就绪相位守卫归对方)——组合根注入棋盘徽章回调 | | 结算快照信号 `settlement_snapshot` | 信号,每次结算末 | 对象销毁前组装的全量状态快照(终局含胜负结果)——测试记录与数值分析消费 | @@ -312,12 +313,12 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 - 挖旗格兑付改判(插旗不可逆批 2026-09-19):有旗格直接挖开被受理——插旗安全格直挖零奖励(作废归因行恰一次)、插旗雷格直挖只吃挖雷惩罚;被挖开的旗不入轮末判定(零标中 / 标空兑付);开格事实不可撤。 - 每事实恰一次:每格受理、每旗判定恰好一次;重复投递不改变结果。 - 极性路由正确:开安全格 / 标中旗只兑正向、开雷格 / 标错旗只兑负向;兑付效果与该格资源类型的字典行一一对应。 -- 伏击池共享:多敌共享同一伏击池值;blast 负向逐层直授无上限(原单轮上限 2026-09-20 退役)。 +- 警觉共享:敌方全体共享同一警觉状态值;blast 负向逐层直授无上限(伏击退役换装——2026-09-20 八型批)。 - 完美排雷:零误标且至少一面标中时第二份兑付恰一次并发高光行;出现误标或零标中则无高光;计数换图重置。 - 开轮摇号:每轮恰摇一次(首轮同样;轮内刷新换图不重摇);摇定后兑现前死亡 → 本拍技能作废(零敌方行动行)、不进冷却不进保底计数;已兑现技能进冷却、保底计数按执行结果更新。 - 战斗段次序:主角先手后逐敌"按摇定技能行兑现、结算伤害、执行上报"各恰一次;主角倒下立即短路,剩余敌人不行动。 -- 护甲等级掷点:吃掷点分量(主角普通分量、敌方技能基础伤害分量)逐次掷单骰(骰面读表)——掷点 ≥ 防守方护甲等级 + 攻击加成全额兑付;低掷按缺口查减伤档位表(边界与档值读表),档位不设零档;天然最大面暴击该分量 ×暴击倍率(读表)且恒全额;穿刺/魔法分量与棋盘来源伤害(伏击附加、爆裂、清障炸药、奖励即时)、必中附加分量及增益/妨害施放不掷不折。 -- 新效应词汇(2026-09-19):伤害技 rider_mult 行的每次攻击,伤害行携带 rider 值且终值 = max(伤害下限, 主分量链结果) + rider(停手轮零池零伏击下逐拍精确复算);rider 键只随带 rider_mult 的技能行出现;妨害技 = 施放行 + 状态按 target_side 落主角(投掷阈值随行可读下调),冷却/保底/死亡作废三闸无一例外。 +- 护甲等级掷点:吃掷点分量(主角普通分量、敌方技能基础伤害分量)逐次掷单骰(骰面读表)——掷点 ≥ 防守方护甲等级 + 攻击加成全额兑付;低掷按缺口查减伤档位表(边界与档值读表),档位不设零档;天然最大面暴击该分量 ×暴击倍率(读表)且恒全额;穿刺/魔法分量与棋盘来源伤害(爆裂、清障炸药、奖励即时)、必中附加分量及增益/妨害施放不掷不折。 +- 新效应词汇(2026-09-19):伤害技 rider_mult 行的每次攻击,伤害行携带 rider 值且终值 = max(伤害下限, 主分量链结果) + rider(停手轮零池下逐拍精确复算);rider 键只随带 rider_mult 的技能行出现;妨害技 = 施放行 + 状态按 target_side 落主角(投掷阈值随行可读下调),冷却/保底/死亡作废三闸无一例外。 - 伤害下限与留档:任何攻击落地伤害 ≥ damage_floor(读表),全流水零 v=0 伤害行、零"被减伤归零"行;掷点读数、护甲等级与档位随伤害行留档,天然最大面(nat20)行带暴击标记。 - 数值边界:伤害下限保底后全程无零值/负值伤害;溢杀丢弃不转移;治疗封顶不溢出。 - 出口分发:先判主角倒下(负)再判敌清空(胜);停手与耗尽轮恒同图,清图轮才允许换图。 @@ -354,3 +355,4 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 | 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 | **伏击单轮上限删除批(用户拍板——与 敌人系统 / 地图战斗资源 / 难度曲线与Boss / registry / 切片代码同批)**:① 行型协议 10 类→9 类——溢出未生效行下线(唯一发射源 = 伏击上限截流,上限删除后零发射面);② 授予段伏击加层改直授无上限(反灾难护栏退役——一轮踩雷数由行动点预算天然封顶);③ 核验清单伏击守恒条改伏击池共享;④ 切片同批:enemy.tres 12 行字段删除、敌表校验/编排器截流/单位容器 F3 计划函数/日志视图 overflow 格式化删除、冒烟 blast 负向断言改直授累加(330 项 0 失败) | +| v0.20 | 2026-09-20 | **格面资源八型批(用户拍板——与 敌人系统 / 地图战斗资源 / 行动经济 / registry / 切片代码同批)**:① 三乘法链与敌方技能攻击公式删伏击附加项及其"后置加法不进乘区"解释短语(rider 保留);② 授予段兑付表 blast 负向换装警觉加层(enemy_alert → alert 行)+ 新增 action 型行动点修正行(queue_ap_delta 排队、下一轮开始兑现、下限 0、明细记 effect_id=ap_delta);③ EV flat 类枚举伏击→行动点;④ 呈现快照两处伏击层数拆除(警觉并入敌方增益 effects 投影);⑤ 棋盘来源必中枚举去伏击(两处);⑥ 核验清单伏击池共享改警觉共享 | diff --git a/design/gdd/systems/战斗循环/敌人系统.md b/design/gdd/systems/战斗循环/敌人系统.md index e4880796..52adbcef 100644 --- a/design/gdd/systems/战斗循环/敌人系统.md +++ b/design/gdd/systems/战斗循环/敌人系统.md @@ -24,14 +24,13 @@ | 两张单位表与技能表的定义与回填 | 敌人表(含池模板)、主角表、技能表的字段、取值域、表值回填(表本体的承载与读取归数据配置) | | 技能池语义 | 池构成纪律、技能行词汇表、实例池与冷却状态、死亡作废规则 | | 目标顺位规则 | 敌方打谁、玩家与道具默认打谁的固定顺位 | -| 伏击词条量纲 | 每层伏击附加多少伤害 | 不负责: | 不负责 | 归谁 | |---|---| | 摇号执行与结算编排(何时摇、伤害合成、死亡判定时机、护甲克制矩阵) | [战斗结算](战斗结算.md) | -| 状态层数的存放与衰减(伏击层池、削弱层池、蓄力/硬化增益) | [增益状态](增益状态.md) | +| 状态层数的存放与衰减(削弱层池、蓄力/硬化/警觉增益) | [增益状态](增益状态.md) | | 奖励内容与掉落 | [地图战斗资源](地图战斗资源.md) | | 棋盘规则(挖格、插旗、惊动巢穴等事实的发生) | [排雷玩法](../排雷循环/排雷玩法.md) | | 遭遇构成(何时开战、坐标与数量怎么定)与跨战斗血量保留 | [关卡节点地图](../冒险循环/关卡节点地图.md) | @@ -108,7 +107,7 @@ | display_name | 全部 | 玩家可见名(明细行与动画共用) | | type | 全部 | 封闭枚举 {普通攻击, 伤害, 增益, 妨害}——**新效应词汇批 2026-09-19 由三扩四**(设计权威 docs/proposal-status-vocabulary.md v1.0;多段命中经用户拍板退役不入枚举);新类型走本文修订 | | damage_mult | 仅伤害 | 伤害倍率;域 [1.1, 16] provisional。普通攻击恒 1、不可配 | -| rider_mult | 仅伤害、可省 | **必中附加分量(2026-09-19 新增)**:域 (0, 1],缺省无字段 = 无附加;分量值 = max(伤害下限, floor(攻击基线 × rider_mult))——随施放者攻击基线缩放,后置加法、必中全额、不进乘区、不出暴击(伏击附加同族);价位锚 0.75 = AC 折扣档最轻档"不掉档的稳定伤害" | +| rider_mult | 仅伤害、可省 | **必中附加分量(2026-09-19 新增)**:域 (0, 1],缺省无字段 = 无附加;分量值 = max(伤害下限, floor(攻击基线 × rider_mult))——随施放者攻击基线缩放,后置加法、必中全额、不进乘区、不出暴击(后置加法同族);价位锚 0.75 = AC 折扣档最轻档"不掉档的稳定伤害" | | cooldown_beats | 全部 | 施放后连续 N 拍不可摇中;普通攻击恒 0、不可配 | | buff_ref / buff_duration | 仅增益与妨害 | 效果引用(指向状态效果行)与持续回合数;**落点由状态行 target_side 路由**(增益 → 敌方侧 / 妨害 → 主角侧,施放类 side 守卫加载拒绝)——妨害技零新授予通道 | | P1 字段位 | — | 触发条件、命中段数、目标数——随对应后置批加列(原"固定值分量"位已由 rider_mult 实装收编——2026-09-19;多段命中「命中段数」保留以防复活) | @@ -139,35 +138,15 @@ 死亡即不动手(保留):摇定后、兑现前死亡(主角先手 / 授予段直伤),本拍技能作废——不动手、不进冷却、不进保底计数;其余存活敌人照常。拍结构保留:**每结算每存活敌恰行动一次、按行序、先作用后推进**——变的只是"轮到什么",由固定剧本改为摇号。同种敌人不再锁步:各自实例池独立摇号、独立冷却,怪物 1 的重击在冷却里不影响怪物 2,轨迹分歧是涌现,不设开战分配机制。 -蓄力语义(2026-09-16 纠偏定稿):蓄力不是重击前奏——它是一行增益技:0 伤害动作,施加 empower 状态(幅度读 `status_effects.tres`),持续 1 个有效结算(provisional)。旧环"蓄力→猛击"的固定配对是哥布林弹珠的拷贝(给玩家输出窗口用的),随行为环一并退役;蓄力与重击之间**没有任何组合语义**——增益与技能倍率恰好同拍只是增益倍率 × 技能倍率的两层乘法共存(增益幅度 × 增益幅度 = 两层乘法读表可得),蓄力后摇中普通攻击则是增益倍率的加成平砍,两者同为平常事,不是设计的连招。技能冷却(几拍内不能再摇中,技能行属性)与增益持续(状态挂几回合,状态行属性)是两个计时器,互不相干。旧蓄力拍"零兑付、不读伏击"的语义由施放行继承:0 伤害技能不兑付伏击——"本轮喂的伏击若逢施放拍不兑现"的读怪奖励保留。 +蓄力语义(2026-09-16 纠偏定稿):蓄力不是重击前奏——它是一行增益技:0 伤害动作,施加 empower 状态(幅度读 `status_effects.tres`),持续 1 个有效结算(provisional)。旧环"蓄力→猛击"的固定配对是哥布林弹珠的拷贝(给玩家输出窗口用的),随行为环一并退役;蓄力与重击之间**没有任何组合语义**——增益与技能倍率恰好同拍只是增益倍率 × 技能倍率的两层乘法共存(增益幅度 × 增益幅度 = 两层乘法读表可得),蓄力后摇中普通攻击则是增益倍率的加成平砍,两者同为平常事,不是设计的连招。技能冷却(几拍内不能再摇中,技能行属性)与增益持续(状态挂几回合,状态行属性)是两个计时器,互不相干。施放行 = 0 伤害动作,不掷不折(原"零兑付、不读伏击"的读怪奖励语义随伏击退役作废——2026-09-20 八型批)。 Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋长池含独占增益技"硬化"——敌方防御池词汇载体;旧"专属四拍环且含蓄力拍"约定随批退役,增益 ≤1 纪律下旧蓄力拍不进 Boss 池)。 举证:**摇定结果 = 可摇集合按权重份额归一的一次抽签;当前可摇集合 = 实例池排除冷却中技能(保底命中时 = 全部特殊技)。**连带可判别:把权重当固定百分比、把冷却当只锁高伤技、把蓄力当重击前奏,都是与本规约相悖的旧口径。 -### 伏击:每踩一颗雷,敌方全体多叠一层附加伤害 +### 伏击(已退役)与群伤负向现况 -玩家挖开惩罚格(雷格在玩家侧的叫法,首发类型是怪物巢穴)就是惊动巢穴:敌方全体获得一层"伏击"——敌方侧的增益词条。一层伏击 = 敌人每次伤害类技能(普通攻击或伤害技)额外附加固定点数伤害(每层表值,量纲已定稿——按主角血量点数计)。伏击只活一轮:轮末结算清零,没有跨轮存量。 - -一轮内的踩雷数天然受每轮行动点预算约束(行动点表值归[行动经济](../排雷循环/行动经济.md))——这就是惩罚的自然封顶。原单轮授予上限护栏已随 2026-09-20 用户拍板退役:摆烂连踩雷受罚是应得反馈,不再截断(原上限 0 = 免疫伏击语义随之作废,未来敌种差异化免疫如需要另行立项)。 - -| 细则 | 含义 | -|---|---| -| 附加是后置加法 | 伏击不进技能倍率乘区,倍率只乘基线伤害 | -| 施放行零兑付 | 增益技不出手、不读伏击层——本轮喂的伏击若逢敌人全是施放拍,一点不兑现(读怪的奖励) | -| 层池共享不消耗 | 同一次结算多个敌人读同一层数,不均分、不先到先得 | -| 当轮授予当轮兑付 | 授予发生在兑付之前:本轮踩的雷,若该轮有伤害拍,当轮就生效 | - -举证:**伤害拍伤害 = 攻击基线 × 技能倍率 + 层数 × 每层伏击表值;施放拍恒为 0。** - -``` -伤害拍:伤害 = atk × 倍率 + a × L L = 当轮伏击层数;a = 每层伏击附加表值(provisional,量纲已定稿) -普攻拍:伤害 = atk + a × L 倍率恒 1 的特例 -施放拍:伤害 = 0 不读伏击层 -生效层数 L = 当轮新踩雷数(无上限,行动点预算天然封顶) -``` - -验算(表值 provisional,行值读配置表):设熊地精攻击基线 A、重击倍率 M、L 层伏击的重击拍 = A × M + L × a;若把伏击塞进倍乘会算出 (A + L × a) × M——后置加法由此判别。 +伏击词条(敌方每刀附加固定点数伤害)已随 2026-09-20 格面资源八型批整体退役:奖励/惩罚镜像对账发现其"层数 × 出手敌数"的复利全部集中在主角单血条,与群伤奖励"摊到 N 条敌方血条"构成双重不对称;单轮授予上限护栏已先行退役(同日删除批)。blast 型负向现况 = **警觉**(敌方全体护甲等级 +1/层,持续 1 结算,逐颗叠加无上限)——状态行定义与承载归[增益状态](增益状态.md),掷点消费归[战斗结算](战斗结算.md)的护甲等级判定;本系统不再承载敌方侧受击语义。 ### 目标顺位与意图线索:打谁不用选,特殊技开轮有一次类型级预告 @@ -199,10 +178,10 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 | 方向 | 系统 | 接口要点 | |---|---|---| -| 上游 | [战斗结算](战斗结算.md) | 唯一编排调用方:开战生成、开轮摇号(随机消费)、结算内兑现/受击/执行上报的次序由它钉死;踩雷到伏击施加的转化(每颗雷恰一次)也由它编排 | +| 上游 | [战斗结算](战斗结算.md) | 唯一编排调用方:开战生成、开轮摇号(随机消费)、结算内兑现/受击/执行上报的次序由它钉死;踩雷到警觉施加的转化(每颗雷恰一次)也由它编排 | | 上游 | [数据配置](../表现与支撑/数据配置.md) | 敌人表、主角表、技能表的 schema 承载与类型化读取;本系统是三表的回填责任方 | -| 相邻 | [增益状态](增益状态.md) | 伏击词条的量纲与作用域由本系统定稿并登记;层数容器与轮末衰减归它,层数由战斗结算读出后作参数传入——运行时零直接调用 | -| 下游 | [战斗结算](战斗结算.md) | 胜负判定素材(敌全灭 / 主角归零)与伤害分量(基线 × 技能倍率 + 伏击附加)的供给方;护甲克制矩阵归它 | +| 相邻 | [增益状态](增益状态.md) | 敌方侧增益状态(警觉)随八型批改由它承载与登记;层数容器与轮末衰减归它,层数由战斗结算读出后作参数传入——运行时零直接调用 | +| 下游 | [战斗结算](战斗结算.md) | 胜负判定素材(敌全灭 / 主角归零)与伤害分量(基线 × 技能倍率)的供给方;护甲克制矩阵归它 | | 下游 | [地图战斗资源](地图战斗资源.md) | 固定顺位是道具伤害的默认目标规则;基础攻击恒在,奖励侧是基础攻击之外的规划面伤害 | | 下游 | [关卡节点地图](../冒险循环/关卡节点地图.md) | 遭遇构成(何时开战、坐标与数量怎么定)归它;跨战斗血量是否保留归冒险循环裁决 | | 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 曲线数值与池权重/冷却/保底投值的调参所有权归它;难度修饰施加点在行值快照之前(MVP 零修饰) | @@ -215,8 +194,8 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 1. 战斗开始:战斗结算按遭遇坐标调本系统生成单位——读表快照实例化本战数量的敌人(池模板快照成实例池、冷却全零),主角以血量入参生成。 2. 开轮摇号:战斗结算换算层排除冷却中技能、按行序逐敌摇定本拍动作写入实例池,随后冷却递减(首轮同样摇;轮内刷新换图不重摇)。 -3. 挖掘期踩雷:事实经战斗结算转化为伏击施加——每颗雷恰一次、逐层记账(无上限)。 -4. 每轮结算:主角先手攻击顺位最前的存活敌人;每个存活敌人按摇定技能行兑付(伤害技 = 基线 × 倍率 + 伏击附加,增益技 = 施放行 + 状态授予)。 +3. 挖掘期踩雷:事实经战斗结算转化为警觉施加——每颗雷恰一次、逐层记账(无上限)。 +4. 每轮结算:主角先手攻击顺位最前的存活敌人;每个存活敌人按摇定技能行兑付(伤害技 = 基线 × 倍率,增益技 = 施放行 + 状态授予)。 5. 受击上报、血量递减;归 0 即移出顺位(摇定后兑现前死亡 → 本拍作废不进账)。 6. 执行上报:已兑现的技能进冷却、保底计数更新(普攻 +1 / 特殊技归零)。 7. 敌全灭或主角归零,回流战斗结算作胜负判定素材。 @@ -249,7 +228,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 | armor_type | {轻甲, 魔法护甲, 重甲},缺省轻甲 | 克制结算归[战斗结算](战斗结算.md) | | armor_class(护甲等级) | int [0, 999],缺省 0 | 防守方护甲等级——基础攻击掷点的折扣判定读数,掷点结算归[战斗结算](战斗结算.md);与 armor_type(克制属性轴)两概念不得混用;行值投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | | hp | [1, 999] | 单位生命基线(难度修饰前) | -| atk | [0, 999] | 攻击基线;0 合法 = 纯伏击伤敌种 | +| atk | [0, 999] | 攻击基线 | | pool(池模板) | {skill_id, weight} 数组,weight ∈ (0, 9999] | 技能行引用在技能表;池构成纪律与悬空引用加载期拒绝(校验在数据配置跨表通道) | 技能表(全局单表,技能行主键 skill_id): @@ -274,7 +253,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 各敌种行值、池权重与池 EV 读数(含闸长期速率实测)一律读配置表与调参日志,本文不登记具体数值;EV 重锚与权重投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。 -结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、伏击层池共享读法、附加后置加法、伏击按主角血量点计量纲、固定顺位、每坐标恰一敌种、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在[战斗结算](战斗结算.md)结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底(池节奏三联动)禁止独立调参,联调须重跑方向性预检并同步 registry(见待办)。 +结构冻结(非调参项,修订走本文流程):技能类型枚举封闭、每池恰一普攻、每池增益 ≤1、死亡即不动手(摇定后兑现前死亡作废不进账)、每结算每存活敌恰行动一次、行序、先作用后推进、固定顺位、每坐标恰一敌种、零随机(本系统自身语义零随机不变——摇号与掷点随机一律在[战斗结算](战斗结算.md)结算换算层按封闭随机流掷定,可回放契约 = 同种子同输入逐位复现,单敌出招轨迹可独立复放)。联动纪律:技能倍率 × 攻击(伤害拍支配)、权重 × 冷却 × 保底(池节奏三联动)禁止独立调参,联调须重跑方向性预检并同步 registry(见待办)。 ## 验收标准 @@ -283,8 +262,8 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 - 池节奏:中签率 = 权重 ÷ 可摇权重合计(排除冷却中技能后归一);施放后连续 N 拍不可摇中;连续 M 拍执行普攻 → 下拍必出特殊技(特殊技内按权重、不受冷却限制);同技能连发不可能;首轮摇号、每轮恰摇一次、轮内刷新不重摇。 - 死亡即不动手:摇定后、兑现前被杀——本拍技能作废(零行动明细行),不进冷却、不进保底计数;行动完成后才死——已兑付已进账;对已死亡单位上报受击被拒绝且状态不变。 - 空池不可能:每池恰一行普通攻击(域校验),普攻冷却恒 0 → 任意实例任意拍可摇集合恒非空。 -- 伏击读值:伤害拍读值 = 基线 × 倍率 + 层数 × 每层伏击表值(与"伏击进倍乘"的错算可判别);普攻 = 倍率 1 特例;施放拍恒为 0;同层数多敌读值一致、读值前后单位状态零变化。 -- 伏击授予:踩 N 颗雷生效 N 层、逐层直授无上限(原单轮上限 2026-09-20 退役);多敌共享同一伏击池值。 +- 伤害拍读值:读值 = 基线 × 倍率;普攻 = 倍率 1 特例;施放拍恒为 0(原伏击读值条随伏击退役作废——2026-09-20 八型批)。 +- 警觉授予:踩 N 颗雷叠 N 层、逐层直授无上限;敌方全体共享同一状态值(side-wide)。 - 目标顺位:多敌时单体目标恒为生成序最前存活者,杀最前后顺延;杀至空返回空;单敌时顺位与范围效果重合。 - 快照抗改表:实例化后修改敌人表,已生成单位的数值投影与实例池逐字不变;新实例才用新表值。 - 表校验:越域值、池权重 ≤ 0、空池、普攻配倍率/冷却、池增益 > 1、skill_id 悬空、同坐标第二敌种均在加载期报错止动;域内合法极端(攻击基线 0)不拒;主角表恰一行、攻击配 0 拒绝。 @@ -310,3 +289,4 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 | v0.7 | 2026-09-17 | **数值纪律收口批:正文与调参表 knob 现行值改指路存根(事实源 `data/tables/*.tres` 与 registry),2 处失同步值修正**——共享技能表示例"熊地精 9×2=18"改符号化"基线 A × 技能倍率 M(行值读 enemy.tres / skills.tres)";蓄力语义"施加'攻击×2'状态""×2 遇 ×2 = ×4"改"施加 empower 状态(幅度读 status_effects.tres)",两层乘法组合语义保留符号表述 | | v0.10 | 2026-09-19 | **技能池新效应词汇批(用户拍板——设计权威 docs/proposal-status-vocabulary.md v1.0,与 战斗结算 / 增益状态 / registry / 切片代码同批)**:① 技能类型枚举三→四(+妨害 debuff——对主角施减益的 0 伤害施放动作,字段复用 buff_ref/buff_duration,落点由状态行 target_side 路由〔增益 → 敌方侧 / 妨害 → 主角侧,施放类 side 守卫加载拒绝〕,执行与增益技同族施放行语义——不掷不折不兑付伏击);② 伤害技新字段 rider_mult(必中附加分量——"固定值伤害"改形:固定值不随基线缩放与共享技能表前提冲突,必中小倍率承载"躲不掉的稳定伤害");③ 池构成纪律 +每池妨害 ≤1;④ 意图三档特殊技预告扩三族(攻击系 ⚔ / 增益系 ✦ / 妨害系 ☠);⑤ 三词收敛两词——多段命中经用户拍板退役(无防御磨损体系,无对照机制),P1 字段位「命中段数」保留;⑥ 实装面 = 仅 L2 Boss 蛛化卓尔精灵(venom_burst + rider_mult 0.75;新行 web_snare 蛛网束缚 debuff→off_guard,首发载荷 = 失衡〔用户拍板〕,乏力 sapped 留作第二词汇),其余敌种不动 | | v0.11 | 2026-09-20 | **伏击单轮上限删除批(用户拍板——与 战斗结算 / 地图战斗资源 / 难度曲线与Boss / registry / 切片代码同批)**:① 伏击节上限段与溢出可见行删除,一轮踩雷数由行动点预算天然封顶成文;② 字段表 advantage_per_round_cap 行删除(原 0 = 免疫伏击语义作废);③ 结构冻结联动纪律去单轮上限 × 攻击基线、数量 × 上限两条;④ 验收标准伏击授予与表校验条同步 | +| v0.12 | 2026-09-20 | **格面资源八型批(用户拍板——与战斗结算 / 地图战斗资源 / 行动经济 / registry / 切片代码同批)**:① 伏击节整体退役改写(复利集中单血条与群伤奖励双重不对称,用户裁决);② 责任表/结构冻结/验收标准的伏击词条目拆除;③ 群伤负向现况 = 警觉(敌方护甲等级 +1),定义与承载移交增益状态 | diff --git a/design/gdd/systems/排雷循环/行动经济.md b/design/gdd/systems/排雷循环/行动经济.md index d47175ed..a4411f13 100644 --- a/design/gdd/systems/排雷循环/行动经济.md +++ b/design/gdd/systems/排雷循环/行动经济.md @@ -88,7 +88,13 @@ 每轮最多刷新 2 次(轮内计数,开轮重置),没有冷却,每次独立检查门槛并扣费。已用次数与剩余次数为只读观测量(切片实现在战斗编排器侧计数,HUD 刷新按钮「剩 N 次」文案即其消费方)——客户端可现读,不经可变状态外泄。禁止"攒满就自动刷"——刷新永远是玩家的决定。 -停手与刷新合起来构成这本账的基线节拍:满行动点一轮停手,正好攒够一次刷新。 +停手与刷新合起来构成这本账的基线节拍:满行动点一轮停手,正好攒够一次刷新。行动点修正队列会扰动该节拍的实际兑现(+1 轮可多挖一格),不变式本身不动;对账归曲线调参批。 + +### 下轮行动点修正(格面资源八型批 2026-09-20) + +格面资源八型批(2026-09-20)新增 action 型格面资源:正向行 ap_up = 下轮行动点 +1,负向行 ap_drain(迟滞)= 下轮行动点 −1。修正不在授予当轮生效:结算期经 `action_economy.queue_ap_delta` 排队(同轮多笔按净值累加),下一轮开始时(notify_round_start)一次性兑现——兑现值 = 基线 ap_per_round + 排队净值,下限 0,兑现后队列清零;排队净值不跨轮保留。明细在结算流水记效果行(effect_id=ap_delta)。 + +跨轮携带量口径随之改写:RAP 仍是唯一显式携带资源(停手转存、玩家可见可花),行动点修正队列是第二携带量——一次性、自动清零、不可主动消费。 ### 标中旗的兑付约束 @@ -110,17 +116,19 @@ 1. **单一当量**:所有收益来源用同一张效果对照表归一换算,不允许分源改率。 2. **标中旗锚**:标中旗的减益档位必须严格高于最低档安全格增益——否则没人愿意插旗。 -3. **挖掘风险不等式**:挖一格的期望收益必须大于期望代价。 +3. **挖掘风险不等式**(2026-09-20 八型批改写):原"敌方伏击暴露不等式"随伏击机制退役作废——blast 负向现况 = 警觉(敌方护甲等级 +1,掷点折扣分布型惩罚),惩罚当量对账模型归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)调参批重立。 4. **清图奖励大于零**,并预留按图类型差异化分支的结构位。 5. **清图支配性**:推到底清图的期望收益,不低于"确定格挖完就弃图刷新"的期望收益——否则清图玩法会被刷新策略淘汰。 -**结论**:五条契约由战斗结算作为唯一对账责任方闭合验收;概率侧由棋盘生成的可推理率参数锚定,惩罚侧由敌人系统的惩罚上限表锚定。 +**结论**:五条契约由战斗结算作为唯一对账责任方闭合验收;概率侧由棋盘生成的可推理率参数锚定,惩罚侧现由 blast 型负向警觉承载(2026-09-20 八型批伏击退役换装),当量对账模型归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)调参批重立。 推导: ``` -条款 3(挖掘决策健康不等式): - P(安全) × 增益当量下界 > P(雷) × 敌方增益当量上界 +条款 3(2026-09-20 八型批改写): + 原"敌方伏击暴露不等式"随伏击机制退役作废—— + blast 负向现况 = 警觉(敌方护甲等级 +1,掷点折扣分布型惩罚), + 惩罚当量对账模型归 难度曲线与Boss 调参批重立 条款 5(清图支配性): 清图奖励当量 ≥ 弃图节省的期望雷险当量 + 轮数差 × 敌方结算强度当量 @@ -130,7 +138,7 @@ |---|---|---| | P(安全) / P(雷) | 挖掘目标格为安全格 / 为雷的概率 | [棋盘生成](棋盘生成.md)的可推理率参数 | | 增益当量下界 | 最低档安全格增益换算值 | 战斗结算的效果对照表 | -| 敌方增益当量上界 | 踩雷惩罚的换算上限 | [敌人系统](../战斗循环/敌人系统.md)的惩罚上限表 | +| 敌方增益当量上界 | 踩雷惩罚的换算上限(原伏击惩罚上限表随 2026-09-20 八型批伏击退役,对账模型归 难度曲线与Boss 调参批重立) | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | | 清图奖励当量 | 清图奖励的换算值 | [地图战斗资源](../战斗循环/地图战斗资源.md) | ### 配置纪律 @@ -211,3 +219,4 @@ | v0.3 | 2026-09-17 | 数值纪律收口批:正文与调参表 knob 现行值改指路存根(事实源 data/tables/*.tres 与 registry),0 处失同步修正——价目改「统一价目 / 标准价(见 action_economy.tres)」口径,每轮点数与刷新门槛改表值指路;调参表「现行值」列整列指路化;注记 refresh_cap_per_round 与表字段 refresh_max_per_round 命名不一致(字段名对齐待批)。顺带:P0 闭环「扣 1 点」改「按价扣费」;终扫补两处漏网——巢穴约束例句「每轮花 2 点重插」改「重复计费重插」、P0 闭环「每轮至多 2 次」改刷新上限读表 | | v0.2 | 2026-09-16 | AP 压速批文档面值同步(用户拍板 8→6,削标旗 rush 单轮兑付吞吐为无伤通关根因的主阀门):ap_per_round 与 rap_refresh_cost 现行值 8→6,随动保持"满预算停手 = 恰好一刷"耦合;数据表与 registry 已同批改,本批补文档面正文两处与调参表两行 | | v0.4 | 2026-09-19 | 插旗不可逆批(用户拍板全套落地):拔旗动作退役——设计目的/统一价目/价目表/布尔入口清单/P0 闭环/调参表六处删"拔旗",flag_pull_ap_cost 字段随 schema 与 data 表同批删除;插旗行补"旗 = 一次性承诺、纠错 = 直接挖开"口径 | +| v0.5 | 2026-09-20 | **格面资源八型批同步(用户拍板——与敌人系统 / 战斗结算 / 地图战斗资源 / registry / 切片代码同批)**:① F1 条款 3 改写——原"敌方伏击暴露不等式"随伏击机制退役作废,惩罚当量对账模型归难度曲线与Boss 调参批重立;② 新增「下轮行动点修正」节——action 型格面资源经 queue_ap_delta 排队、下一轮开始兑现(基线 ap_per_round + 净值、下限 0、兑现后清零),跨轮携带量口径改写(RAP 唯一显式携带资源 + 一次性修正队列);③ 节拍不变式(满停一轮 = 恰好一刷)补扰动注记 | diff --git a/design/registry/entities.yaml b/design/registry/entities.yaml index 816bacd2..99b5d726 100644 --- a/design/registry/entities.yaml +++ b/design/registry/entities.yaml @@ -84,6 +84,7 @@ entities: arbitration_priority: cleared > stopped > ap_exhausted(同帧/同批次结束路径总仲裁;stop-first 批次腿 deferral 至 排雷玩法 集成测试,义务清单见 systems-index 门禁记录) downstream_contract: 行动经济 F1 五条款(① 效果当量对照单一线性换算 · ② 标中旗锚严格 > 最低档 + 连锁放大边际基准 + 总吞吐对账 · ③ 挖掘风险不等式 P(安全)×buff > P(雷)×敌方增益,战斗结算 单一闭合 owner · ④ 清图奖励 > 0 且 地图战斗资源 差异化插槽(图类型战斗域恒定) · ⑤ 清图 vs 弃图刷新支配性,战斗结算 闭合强制检查点)——2026-09-07 三轮评审定稿 cross_field_validation: 任一动作成本(dig/flag_place;flag_pull 随拔旗退役 2026-09-19 移出)≤ ap_per_round——ActionEconomyTable schema validate() 跨字段类别,违规加载期致命(2026-09-07 三轮评审增补;条件性夹具登记 数据配置 校验双通道) + ap_delta_queue: (**2026-09-20 格面资源八型批新增**)action 型格面资源的下轮行动点修正排队面——queue_ap_delta/pending_ap_delta:结算期 ±power 同轮累加,下一轮开始(notify_round_start)兑现 = 基线 ap_per_round + 排队净值(下限 0、兑现后清零);排队净值不跨轮保留;跨轮携带量口径 = RAP(唯一显式携带资源)+ 一次性修正队列 referenced_by: [棋盘生成, 排雷玩法, 地形变异, 战斗结算, 增益状态, 地图战斗资源, HUD框架, 教学引导] - name: variation_table @@ -127,15 +128,15 @@ entities: 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 改指路存根 - 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) + alert: { display_name: 警觉(敌方护甲等级 +1), target_side: enemy, unit: ac, duration_settlements: 1, max_stack: 16, stack_policy: stack, source_class: mine_hit, magnitude_ref: data/tables/status_effects.tres } # 2026-09-20 格面资源八型批:ambush 行(flat 伏击)退役换装 alert 行——敌方护甲等级 +1/层(unit ac、target_side enemy、duration 1 结算、stack 16,side-wide 入增益状态容器),消费 = 战斗结算 _defender_ac 敌方侧 ac 型读法(本批接线);数值 provisional 归 难度曲线与Boss;原 ambush 行 2026-09-17 数值压缩批注记随行退役(留痕归 git) 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 改指路存根 off_guard: { display_name: 失衡(我方护甲等级降低), target_side: hero, unit: ac, duration_settlements: 1, max_stack: 16, stack_policy: stack, source_class: flag_miss / enemy_skill_cast, magnitude_ref: data/tables/status_effects.tres } # 2026-09-12 标错反噬批上线——三池之一(原进 hero_defense 池);2026-09-15 格面资源批起 = defense 型负向;2026-09-17 数值压缩批:magnitude 改指路存根;**2026-09-18 结构修复批:换装 AC 轴——unit percent→ac · magnitude +25→−2**〔掷点判定阈值逐层下调、不入池,effect_pool_map 删 off_guard 键同批;幅度 provisional 归 状态层重设计批〕;**2026-09-19 新效应词汇批:来源类别 +敌方技能施放**(妨害技 web_snare 蛛网束缚的容器落点——duration 由技能行 buff_duration=2 覆盖) sapped: { display_name: 乏力(我方输出降低), target_side: hero, unit: percent, duration_settlements: 1, max_stack: 16, stack_policy: stack, source_class: flag_miss, magnitude_ref: data/tables/status_effects.tres } # 2026-09-15 格面资源批新增——weaken 型负向,进 hero_offense 池;2026-09-17 数值压缩批:magnitude 改指路存根 empower: { display_name: 蓄力(敌方输出 ×2), target_side: enemy, unit: percent, duration_settlements: 2, max_stack: 1, stack_policy: refresh, source_class: enemy_action, magnitude_ref: data/tables/status_effects.tres } # 2026-09-16 敌人技能池批新增——蓄力技载体,进 enemy_output 池;duration 2 = 1 个有效增益拍;2026-09-17 数值压缩批:magnitude 改指路存根 fortify: { display_name: 硬化(敌方防御 −50), target_side: enemy, unit: percent, duration_settlements: 2, max_stack: 1, stack_policy: refresh, source_class: enemy_action, magnitude_ref: data/tables/status_effects.tres } # 2026-09-16 敌人技能池批新增——硬化技载体(Boss 池独占),进 enemy_defense 新池;2026-09-17 数值压缩批:magnitude 改指路存根;**2026-09-18 结构修复批:符号纠正 +100→−50**〔负值入池 = 主角攻击 ×0.5 折半;旧 +100 实际 ×2 翻倍与"硬化=减伤"语义相反,用户确认系符号 bug〕 - value_status: 九行值全部 provisional;**2026-09-17 数值压缩批·文档同步——mvp_content 数值列改指路存根(magnitude_ref 指向 data/tables/status_effects.tres)**,schema 字段(unit / duration_settlements / max_stack / stack_policy / source_class)保留以承载元数据;行值历史轨迹:六行→七行(格面资源批 sapped 收编为 weaken 型负向;2026-09-16 护甲等级掷点批:defense_up 行退役换装 ac_up〔行数不变、一行换装〕);七行→九行(2026-09-16 敌人技能池批:empower + fortify 收编);**2026-09-17 数值压缩批:ambush magnitude +3 → +1 flat(量纲未变——见 ambush_unit_definition)**;**2026-09-18 结构修复批:三行结构值改写(数值仍 provisional 归 状态层重设计批)**——off_guard unit percent→ac · fortify magnitude +100→−50 · weaken stack→refresh × duration 1→2(语义与批注见各行)。验收锚:weaken→行动经济 F1 条款 2(地图战斗资源/战斗结算)· ambush 量纲→敌人系统(条款 3,量纲已定稿见 ambush_unit_definition)· 对照表→战斗结算(条款 1)· weaken 已按 战斗结算 F0 裁决修订 −25→−65(2026-09-10,值域 [60,85]、终值共裁 战斗结算 OQ2——见 anchor_warning 回执) - ambush_unit_definition: **量纲已定稿(2026-09-09 敌人系统 GDD Rule 6/F2——registry OQ2 关闭条件兑现)**:每层伏击 = 每次攻击类行为(attack/heavy)附加 magnitude 主角 HP 伤害(后置加法、不进倍乘);charge 拍零兑付(空拍蒸发);**2026-09-17 数值压缩批——magnitude +3 → +1,量纲未变**;值仍 provisional(锚验收归 地图战斗资源/战斗结算——行动经济 F1 条款 3;敌人系统 供给 cap 表值与单结算自然边界口径见 clause3_supply 条目);**2026-09-20 修订**:cap 表值供给面随单轮上限删除退役(clause3_supply 随批修订) + value_status: 九行值全部 provisional;**2026-09-17 数值压缩批·文档同步——mvp_content 数值列改指路存根(magnitude_ref 指向 data/tables/status_effects.tres)**,schema 字段(unit / duration_settlements / max_stack / stack_policy / source_class)保留以承载元数据;行值历史轨迹:六行→七行(格面资源批 sapped 收编为 weaken 型负向;2026-09-16 护甲等级掷点批:defense_up 行退役换装 ac_up〔行数不变、一行换装〕);七行→九行(2026-09-16 敌人技能池批:empower + fortify 收编);**2026-09-17 数值压缩批:ambush magnitude +3 → +1 flat(量纲未变——见 ambush_unit_definition)**;**2026-09-18 结构修复批:三行结构值改写(数值仍 provisional 归 状态层重设计批)**——off_guard unit percent→ac · fortify magnitude +100→−50 · weaken stack→refresh × duration 1→2(语义与批注见各行)。验收锚:weaken→行动经济 F1 条款 2(地图战斗资源/战斗结算)· alert 消费→战斗结算(护甲等级掷点判定——2026-09-20 八型批;原 ambush 量纲→敌人系统锚随伏击退役移除)· 对照表→战斗结算(条款 1)· weaken 已按 战斗结算 F0 裁决修订 −25→−65(2026-09-10,值域 [60,85]、终值共裁 战斗结算 OQ2——见 anchor_warning 回执);**2026-09-20 格面资源八型批:mvp_content ambush 行 → alert 行换装(display 警觉、unit ac、target_side enemy——side-wide,行数九不变)** + ambush_unit_definition: **伏击量纲(已退役——2026-09-20 格面资源八型批)**:原每层伏击 = 每次攻击类行为附加 magnitude 主角 HP 伤害(后置加法不进倍乘),charge 拍零兑付;**继任 = alert 警觉**(敌方护甲等级 +1/层,unit ac、target_side enemy、1 结算、stack 16——blast 负向 enemy_alert 行载体,消费 = 战斗结算 _defender_ac 敌方侧 ac 型读法本批接线);数值 provisional 归 难度曲线与Boss anchor_warning: weaken 行 vs 行动经济 F1 条款 2 锚两独立线性代理同向预检不过(百分点·结算暴露 25 vs 100;原型战斗量级 ≈1 vs ≈4 当量)——战斗结算 对照验收优先裁决,登记 战斗结算 强制检查点输入。**修复空间不对称(2026-09-09 增补)**:每结算瞬时当量归一 m_w≥51 可行(F2 越域界随移 AP 界 −408%/表界 −816%);每 AP 总暴露归一 m_w>100 被 percent ∈ [-100,100] 域禁止(该分支不可行)——OQ1 前置步骤:战斗结算 先钉死归一口径,口径落定前禁止数值修订;落总暴露则现实解 = 地图战斗资源 重定最低档参照。**参照对象迁移注记(2026-09-09 地图战斗资源 评审;2026-09-11 回迁)**:最低档安全格 buff 当量的参照对象曾迁 defense_up 当量(attack_up 时为死行——地图战斗资源 F4 迁移)——**2026-09-11 用户裁决"基础攻击恒存在"(HeroTable.atk 域 [1,999]、0 加载拒绝、MVP=6)后 attack_up 复活,参照对象回迁 attack_up 当量**(消费面 = 主角战斗段先手攻击——战斗结算 GDD 同批;defense_up 迁移退役为历史记录,attack_up 入池时 tier_min_buff 重算);本条与 clause3_supply.direction_precheck 的 25 vs 100 预检算术系 attack_up 口径历史登记——defense_up |−50|×dur2 与 attack_up 数值巧合全等(100pp),今日结论不变;**迁移后预检未按新参照重跑**的义务已于 2026-09-14 战斗结算 重算批兑现(F0/F1 按 attack_up 当量重跑 + F1 锚对照实物改 attack_up 行——本迁移注记关闭)。**F0 裁决回执(2026-09-10 战斗结算 GDD——红警关闭)**:归一口径 = **每结算瞬时当量**(总暴露分支被 percent schema 域禁止 + 与"单结算自然边界"已锁事实冲突,排除);m_w 修订 −25 → **值域 [60,85]/默认 −65**(mvp_content.weaken 已同批改写——锚两腿 @D_ref=12:7.8 > 6.0 严格大于 ✓ / 7.8 ≥ E_dig 4.5 ✓〔E_dig 读数 2026-09-14 战斗结算 重算批按 难度曲线与Boss v3 曲线重推——原 7.2 随口径退役〕);地板 = 乘数零点 −100pp、交叉层数 = ⌈100/m_w⌉ = 2(原"7 层触地板"预读按 −400% 合成带估读,更正);defense_up 参照保持(总暴露分支的"重定参照"现实解未采纳);终值 = 地图战斗资源/战斗结算 共裁(战斗结算 OQ2);增益状态 GDD 正文不改以本条为准(收编先例) rule4_exemption: 定义表非进度成长表,键 = effect_id(数据配置 Rule 4 豁免,schema 注释承载) single_enemy_assumption: **回验结果 = 不成立——敌人系统 定多敌(用户 2026-09-09 拍板;同日 敌人系统 GDD 兑现 增益状态 预授权接口漂移条款)**:MVP 战斗 = 1–3 个同敌种敌单位(EnemyTable.unit_count);效果 side-wide 语义改"全体存活敌单位"(层数 = side 共享池,**增益状态 现接口零变更兼容**);target_ref(单体寻址)= 扩展位义务——首个单体效果上线时 增益状态 补列(随批:战斗结算 归集语义/HUD框架 呈现裁决);增益状态 GDD 正文不改,以本条为准(行动经济 OQ5 收编先例) @@ -213,11 +214,11 @@ entities: 开轮摇号: 每轮轮次开始时为每个存活敌摇定本拍动作——排除冷却中技能后按权重份额归一抽签,中签率 = 权重 ÷ 可摇权重合计;随机消费在 战斗结算 换算层 behavior_roll 封闭流(敌人系统 首次定义,2026-09-16 敌人技能池批) 保底: 连续 M 拍执行的都是普通攻击 → 下拍必出特殊技(特殊技内按权重、不受冷却限制)——反旱季闸(敌人系统 首次定义,2026-09-16 敌人技能池批) 技能冷却: 施放后连续 N 拍不可摇中的技能行属性——与增益持续(状态行属性)是两个计时器互不相干(敌人系统 首次定义,2026-09-16 敌人技能池批) - 施放行: 增益技的结算明细行型(cast)——0 伤害动作、具名技能、不兑付伏击;由蓄力行(charge)改型(敌人系统/战斗结算 首次定义,2026-09-16 敌人技能池批) - 伏击池: 敌方侧共享的伏击层数——本轮踩几颗雷就几层,轮末清零(side-wide 语义,敌人系统 首次定义) + 施放行: 增益技的结算明细行型(cast)——0 伤害动作、具名技能、不掷不折(原"不兑付伏击"的读怪奖励语义随 2026-09-20 八型批伏击退役作废);由蓄力行(charge)改型(敌人系统/战斗结算 首次定义,2026-09-16 敌人技能池批) + 伏击池: 【2026-09-20 格面资源八型批退役——本词条留档】敌方侧共享的伏击层数——本轮踩几颗雷就几层,轮末清零(side-wide 语义,敌人系统 首次定义;继任 = alert 警觉 side-wide 状态,由增益状态容器承载) 死亡即不动手: 轮到某敌人行动时它已死 → 这一下不打、招式轮转停格(2026-09-09 用户拍板,敌人系统 首次定义) 封锁格: 初始展开白送的那批已开格——恒无格面资源、不再有任何加成,但计入清图进度(排雷玩法 首次定义;install 期可精确枚举为 R₀——格面资源摇号清单的排除项;取代旧术语"资格格",2026-09-15 格面资源批) - 格面资源(CellResource): 关联到格子上的资源对象——装板期摇定七型类型身份(attack/defense/heal/blast/weaken/pierce/magic——2026-09-18 伤害道具批五→七),安全格与雷格一视同仁、同池同分布;极性不在资源内,由「动作 × 格型」矩阵在结算期决定正向(奖励)或负向(惩罚)(地图战斗资源 首次定义;取代"安全格奖励"旧名) + 格面资源(CellResource): 关联到格子上的资源对象——装板期摇定八型类型身份(attack/defense/heal/blast/weaken/pierce/magic/action——2026-09-18 伤害道具批五→七、2026-09-20 格面资源八型批七→八),安全格与雷格一视同仁、同池同分布;极性不在资源内,由「动作 × 格型」矩阵在结算期决定正向(奖励)或负向(惩罚)(地图战斗资源 首次定义;取代"安全格奖励"旧名) 批尾: 同一批取号中最后消费的一个号——地图战斗资源 清图奖励身份 = install 批的批尾取号(地图战斗资源 F1 首次定义) 死行: 被当前内容态判定为零消费的表行——加载不致命、不入参考池,复活走 GDD 修订连锁(地图战斗资源 F4 首次定义;历史首例 attack_up〔hero atk=0 时代〕已于 2026-09-11 随"基础攻击恒存在"用户裁决复活,当前内容态暂无在册死行) 预推进: 测试中为到达 scope=σ 而先行丢弃式消费 σ 个 scope 的构造——RngService 全新实例首个 open_stream 恒为 scope 0,derive_at 不推计数器(地图战斗资源 AC 前言首次定义) @@ -258,12 +259,12 @@ entities: armor_type: enum {light, ward, heavy} 缺省 light(2026-09-14 护甲克制批转正登记——攻击类型 × 护甲克制,克制矩阵 = settlement_table.armor_effectiveness〔三档加法修正 克制 +1/中性 0/被克 −1,点数读表——2026-09-18 加法核换装批:百分比量纲退役,消费面 = 主角侧〕;MVP 映射 goblin=light / bugbear=ward / ogre_chief=heavy;**2026-09-15 命名统一批:原 enum {none, a, b} 为位置键(无语义、且"无甲/甲A/甲B"在文档间已分裂成四种写法),改 {light, ward, heavy} = 轻甲 / 魔法护甲 / 重甲**;数值 provisional 归 难度曲线与Boss) armor_class: int [0,999] 缺省 0(**2026-09-15 护甲等级批新增,2026-09-16 定稿落地**——防守方护甲等级,主角普通分量 / 敌方技能基础伤害分量的掷点折扣判定读数,掷点与折扣结算归 settlement_table.ac_roll / ac_discount_tiers〔战斗结算〕;**与 armor_type〔克制属性轴 light/ward/heavy〕是两个概念、字段与文档口径不得混用**;三敌种首关行值 0 暂定,正式行值归怪物设定批〔06 清单登记〕) hp: int [1,999](knob——难度修饰前基线;MVP 18 provisional 出处待查) - atk: int [0,999](knob——attack 行为伤害基值;MVP 4 provisional 出处待查;0 = 纯伏击伤敌种合法) + atk: int [0,999](knob——attack 行为伤害基值;MVP 4 provisional 出处待查;0 合法不拒——2026-09-20 八型批去"纯伏击伤敌种"旧注) pool: Array of {skill_id, weight}(**2026-09-16 敌人技能池批——池模板**,定义层;weight ∈ (0,9999] knob、池内 skill_id 不重复;每池恰一行普通攻击 + 增益技 ≤1 + skill_id 悬空致命〔加载校验在 config_db.validate_skill_pool_links 跨表通道〕;实例池〔快照+冷却状态〕在 单位容器 spawn——三敌种建议池构成与权重不列于本 registry,读 data/tables/enemy.tres(provisional 归 难度曲线与Boss;EV 锚与含闸长期速率实测读数随验收批另测登记〔2026-09-18 指路化收口〕))。**历史(2026-09-16 退役)**:heavy_multiplier int [1,16](重击倍率归技能行 damage_mult)与 pattern StringList(行为环环数组)两字段随行为环整体退役——固定出招剧本废除 rowset_rule: 每行集恰一敌种(行集内 enemy_id 唯一 = 表结构校验,违规加载期致命)——同层多遭遇已由节点编号消解(2026-09-17 关卡节点地图 v1.0:node_depth 语义 = 关卡内唯一节点编号,同层不同节点各查各行、键结构零改动);同场多敌种(同一编号行集多行)行集校验放开归 敌人表行集多行批(混编伏击上限取值口径随 2026-09-20 上限删除消解)(战斗侧,排技能池实施批落地后;06-待办清单 敌人系统节同名条目单点登记);精英/Boss 不设编码位——Boss = 最大编号节点(图唯一终点)、精英 P2 内容承载(强敌行集) mvp_content: **五敌种(2026-09-14 难度曲线与Boss 修订批转正 goblin / bugbear / ogre_chief 三敌种〔DND 更名批用户指令:grub→goblin / ambusher→bugbear / boss_guardian→ogre_chief〕;2026-09-17 分支节点图批新增 giant_spider / drider,本条 2026-09-18 补收编;敌人系统 物种集断言随批更新为 {goblin, bugbear, ogre_chief, giant_spider, drider})**:goblin(地精,armor=light)/ bugbear(熊地精,armor=ward)/ ogre_chief(食人魔酋长,armor=heavy)/ giant_spider(巨蜘蛛)/ drider(蛛化卓尔精灵,Boss = 最大编号节点图唯一终点)。技能池构成与权重、armor_type 行映射**不列于本 registry**——读 data/tables/enemy.tres。**2026-09-17 数值压缩批·文档同步——hp/atk 等数值列改指路存根**:L1/L2 节点编号行集(D0–D8)共 12 行的 hp · atk · atk_min · atk_max · unit_count · unit_count_max · advantage_per_round_cap · armor_class 等现行值**不列于本 registry**——读 `data/tables/enemy.tres`(数值压缩批注释登记:`L1 D0 24/7 → 8/2`、`L1 D1 13/5 → 4/2`、`L1 D2 40/9 → 13/3`、`L1 D3 18/6 → 6/2`、`L1 D4 150/9 → 50/3` Boss、`L2 D0 30/7 → 10/2`、`L2 D1 15/5 → 5/2`、`L2 D4 14/5 → 5/2`、`L2 D5 38/8 → 13/3`、`L2 D6 12/4 → 4/1`、`L2 D7 13/5 → 4/2`、`L2 D8 175/8 → 58/3` drider);armor_type / armor_class / unit_count 区间 / 技能池权重 / advantage_per_round_cap 不压缩(相对轴与概率轴)。**2026-09-16 敌人技能池批**:行为环拍序列([attack] 单拍环 / [attack,charge,heavy] 三拍环 / [attack,attack,charge,heavy] 四拍环)与 heavy_multiplier=2 退役,改池模板 + 技能表共享技能行(重击倍率 2 = 技能行 damage_mult);出处 = 切片 enemy.tres(技能池批改型),曲线数值与池权重归 难度曲线与Boss - load_bearing_rules: 多敌模型(1–3 同敌种单位,增益状态 单敌假设回验不成立——见 status_effect.single_enemy_assumption)· 行为环确定性轮转(零随机;先作用后推进;死亡即不动手——轮到前被杀本拍不打指针冻结;同步轮转定理)· 效果 side-wide(伏击池 = side 共享,增益状态 零接口变更)· 行值快照抗热重载(增益状态 EC9 同款——池模板同在快照范围,实例池冷却全零起步)· **技能池摇号出招(2026-09-16 敌人技能池批改写——原"行为环确定性轮转/同步轮转定理"退役)**:每拍做什么 = 实例池权重摇号〔开轮时点,随机消费在 战斗结算 换算层 behavior_roll 封闭流;本系统语义零随机不变、单位容器收确定值〕;两道闸 = 全技能各自冷却 + 保底 M;死亡即不动手(摇定后兑现前死亡 → 本拍作废不进账);拍结构保留(每结算每存活敌恰行动一次/行序/先作用后推进)· 零随机零 UI 零事件订阅(排雷玩法 事件面不含 敌人系统——事实经 战斗结算 转化) - settlement_obligations: 六项(敌人系统 GDD 门禁评审缺项即 blocking)——① 行动每结算恰一次(敌单位专属——主角无环)+ 结算内调用序成文 按摇定技能行兑现→apply_damage→commit_action〔2026-09-16 技能池批改型——原 query_attack→apply_damage→advance 随行为环退役〕 ② 雷→伏击恰一次转化 ③ clamp/负值/溢杀与死亡判定时机成文 ④ F1 条款 3 闭合对账(cap 表值 + 量纲 + 棋盘生成 actuals p10 非 target 参数)⑤ 默认目标消费与单体/AOE 分流 ⑥ 伏击 cap 溢出"溢出未生效"明细行协议。**履行回执(2026-09-10)**:六项已全数落位 战斗结算 GDD(Core Rules 5/6/9/10/12 + Formulas F3/F4——落位映射 = 战斗结算 AC 覆盖矩阵)。**2026-09-20 修订**:④⑥ 随伏击单轮上限删除(用户拍板)退役——对账面去 cap 表值、溢出行协议作废 + load_bearing_rules: 多敌模型(1–3 同敌种单位,增益状态 单敌假设回验不成立——见 status_effect.single_enemy_assumption)· 行为环确定性轮转(零随机;先作用后推进;死亡即不动手——轮到前被杀本拍不打指针冻结;同步轮转定理)· 效果 side-wide(原伏击池 = side 共享、增益状态 零接口变更——伏击池随 2026-09-20 八型批退役,side-wide 承载改由增益状态 alert 行承接)· 行值快照抗热重载(增益状态 EC9 同款——池模板同在快照范围,实例池冷却全零起步)· **技能池摇号出招(2026-09-16 敌人技能池批改写——原"行为环确定性轮转/同步轮转定理"退役)**:每拍做什么 = 实例池权重摇号〔开轮时点,随机消费在 战斗结算 换算层 behavior_roll 封闭流;本系统语义零随机不变、单位容器收确定值〕;两道闸 = 全技能各自冷却 + 保底 M;死亡即不动手(摇定后兑现前死亡 → 本拍作废不进账);拍结构保留(每结算每存活敌恰行动一次/行序/先作用后推进)· 零随机零 UI 零事件订阅(排雷玩法 事件面不含 敌人系统——事实经 战斗结算 转化) + settlement_obligations: 六项(敌人系统 GDD 门禁评审缺项即 blocking)——① 行动每结算恰一次(敌单位专属——主角无环)+ 结算内调用序成文 按摇定技能行兑现→apply_damage→commit_action〔2026-09-16 技能池批改型——原 query_attack→apply_damage→advance 随行为环退役〕 ② 雷→伏击恰一次转化 ③ clamp/负值/溢杀与死亡判定时机成文 ④ F1 条款 3 闭合对账(cap 表值 + 量纲 + 棋盘生成 actuals p10 非 target 参数)⑤ 默认目标消费与单体/AOE 分流 ⑥ 伏击 cap 溢出"溢出未生效"明细行协议。**履行回执(2026-09-10)**:六项已全数落位 战斗结算 GDD(Core Rules 5/6/9/10/12 + Formulas F3/F4——落位映射 = 战斗结算 AC 覆盖矩阵)。**2026-09-20 修订**:④⑥ 随伏击单轮上限删除(用户拍板)退役——对账面去 cap 表值、溢出行协议作废;八型批再修订(2026-09-20 格面资源八型批):② 雷→伏击恰一次转化改 雷→警觉恰一次转化 hud_obligations: 四项(视觉推测型呈现,缺项即 blocking)——① enemy_id→图像线索映射清单成文(预告时序=下一拍预告、挖掘期全程可见;含强度档位/环长直觉编码说明;形状+色相双通道)② 映射全局恒定(enemy_id 键——跨 run 禁重掷)③ 顺位与存活可读 ④ 敌方 side 池呈现口径 rule4_status: 本表是进度成长表(棋盘生成 BoardGenTable 同型,无 Rule 4 豁免) referenced_by: [战斗结算, 地图战斗资源, 关卡节点地图, 难度曲线与Boss, HUD框架, 战斗表现, 教学引导] @@ -293,7 +294,7 @@ entities: display_name: String 非空(玩家可见名——明细行与动画共用,本地化归 设置与本地化) type: enum {basic, damage, buff, debuff}(封闭枚举 = 普通攻击/伤害/增益/妨害——**新效应词汇批 2026-09-19 由三扩四**〔设计权威 docs/proposal-status-vocabulary.md v1.0〕;多段命中经用户拍板退役不入枚举;新类型走 敌人系统 修订) damage_mult: float [1.1,16] 仅伤害技(provisional——**存倍率不存固定值**:伤害 = 施放者攻击基线 × 倍率,三乘法链第一乘〔战斗结算〕;普通攻击恒 1 不可配——域校验锁死) - rider_mult: float (0,1] 仅伤害技可配、缺省无(**2026-09-19 新效应词汇批新增**——必中附加分量:分量值 = max(damage_floor, floor(攻击基线 × rider_mult)),后置加法、必中全额、不进乘区不出暴击〔伏击附加同族〕;价位锚 0.75 = AC 折扣档最轻档"不掉档的稳定伤害"——可掷分量期望 AC10≈0.80/AC12≈0.76 对表;现行 venom_burst=0.75) + rider_mult: float (0,1] 仅伤害技可配、缺省无(**2026-09-19 新效应词汇批新增**——必中附加分量:分量值 = max(damage_floor, floor(攻击基线 × rider_mult)),后置加法、必中全额、不进乘区不出暴击〔后置加法同族——原注"伏击附加同族"随 2026-09-20 八型批伏击退役改述〕;价位锚 0.75 = AC 折扣档最轻档"不掉档的稳定伤害"——可掷分量期望 AC10≈0.80/AC12≈0.76 对表;现行 venom_burst=0.75) cooldown_beats: int [0,99](现行值读 data/tables/skills.tres;普攻恒 0 不可配——域校验锁死,空池不可能的结构前提;施放后连续 N 拍不可摇中,技能冷却与增益持续两计时器分账) buff_ref / buff_duration: 仅增益/妨害技(效果引用 → StatusEffectTable 活行 + 持续回合;悬空引用加载致命;**落点由状态行 target_side 路由**——buff 必须 enemy 侧 / debuff 必须 hero 侧〔施放类 side 守卫 2026-09-19,装载序以 loaded 表显式入参〕;现行 charge→empower / harden→fortify / web_snare→off_guard〔妨害首发,用户拍板〕,buff_duration=2 = 1 个有效增益拍〔先兑付后衰减含施放当轮〕;施放时长由技能行覆盖状态行时长——战斗结算 apply_effect duration_override) pity_threshold: int [1,99] 全局单旋钮(现行值读 data/tables/skills.tres——保底 M:连续 M 拍执行普攻 → 下拍必出特殊技〔特殊技内按权重、不受冷却限制〕;地精类单特殊技低权重池受保底支配) @@ -308,20 +309,20 @@ entities: table: RewardTable(数据配置 承载,键 = reward_id;地图战斗资源 回填 owner;**2026-09-15 格面资源批结构性重写**——旧 category / use_timing / 库存 / 供给轴随可选类删除整批下线,五型 × 极性字典取代〔历史结构见底部修订记录〕) fields: reward_id: String(表内主键) - cell_type: enum {attack, defense, heal, blast, weaken, pierce, magic}——七型封闭(2026-09-18 伤害道具批五→七;格面资源类型身份;表里出现清单外值加载拒绝 fail-fast) # 2026-09-15 新增,取代 category;2026-09-18 扩七型 + cell_type: enum {attack, defense, heal, blast, weaken, pierce, magic, action}——八型封闭(2026-09-18 伤害道具批五→七、2026-09-20 格面资源八型批七→八 +action;格面资源类型身份;表里出现清单外值加载拒绝 fail-fast) # 2026-09-15 新增,取代 category;2026-09-18 扩七型;2026-09-20 八型批扩八型 polarity: enum {positive, negative}——同型两行:正向行参与摇号(权重 = 类型频次),负向行纯兑付字典、不消费权重 # 2026-09-15 新增 effect_id: String 可空——percent 类行(attack/defense/weaken 正负两向)必填(StatusEffectTable 精确引用,悬空校验已激活);flat 直付行(直伤/群伤/治疗)恒空 - stacks: int [1,16] 可省——多层授予行(blast 负向 ambush ×2 层);缺省 1 + stacks: int [1,16] 可省——多层授予行(原 blast 负向 ambush_double ×2 层——该行随 2026-09-20 八型批退役,现行表无 stacks 行、字段保留 schema 位);缺省 1 display_name: String 非空——玩家可读名(HUD框架 呈现数据源,本地化归 设置与本地化) power: int [0, 999](knob)——flat 类加载校验 ≥ 1;percent 类不消费非校验(敌人系统 heavy_multiplier 先例) power_min/power_max: 可选配对 int [1,999](区间随机;缺省 = 定值行向后兼容;跨字段:必成对 · percent 行禁止 · power = floor((min+max)/2) 向下取整中点锚〔与敌人表 atk 同口径,2026-09-18 对齐切片校验式〕〔行动经济 条款①期望当量不漂移〕;roll 时机 = 身份预分配批内追加取号) weight: int [0, 999](knob)——正向行 = 类型频次;0 = 该型不出(合法极端,取号前剔除);负向行不消费 pool_tag: enum {cell, clear_default}(cell = 格面资源单一池——安全格与雷格一视同仁同池同分布;clear_ 命名空间预留、校验拒绝——棋盘生成 elite_ 同款) # 2026-09-15 safe_cell→cell 更名 + active_inject 删除 tier: int [1, 8](knob)——强度档位序数(与当量零耦合) - cross_field_validation: 加载期致命族——池空(cell 池 ≥1 正向行 weight>0)· 七型正向行齐备 · 七型负向行齐备(字典完整性——缺任一极性行致命)· clear_default 恒正当量(≥1 活行 ∧ power≥1 ∨ effect_id 非空——行动经济 条款④"清图奖励>0"的行级兑现口径)· percent 行 effect_id 必填/flat 行恒空 · flat 行 power≥1 # 2026-09-15 重写——旧 floor_supply_missing / no_damage_row 随可选类删除失义退役 + cross_field_validation: 加载期致命族——池空(cell 池 ≥1 正向行 weight>0)· 八型正向行齐备 · 八型负向行齐备(字典完整性——缺任一极性行致命——2026-09-20 八型批)· clear_default 恒正当量(≥1 活行 ∧ power≥1 ∨ effect_id 非空——行动经济 条款④"清图奖励>0"的行级兑现口径)· percent 行 effect_id 必填/flat 行恒空 · flat 行 power≥1 # 2026-09-15 重写——旧 floor_supply_missing / no_damage_row 随可选类删除失义退役 mechanics: 格面资源身份 install 期预分配(roll_board 恰一次、行主序、消费 reward_roll 封闭流恰一 scope 批〔格批 + 清图批尾一号〕;全部非封锁格逐一摇定类型——安全格与雷格同池同分布、封锁格不入摇号清单;Ready 后只读、无重掷 API)· **极性不在资源内**——「动作 × 格型」矩阵(开安全格/标中雷 = 正向、开雷格/标错安全格 = 负向、插旗安全格直挖 = 零兑付〔四情况④〕;撤旗动作随插旗不可逆批 2026-09-19 退役)字典定义归 地图战斗资源、路由执行归 战斗结算 授予段(结算队列 + 轮末在场旗判定基线——被挖开的旗不入基线)· 授予期零随机(身份恒定跨轮;换图映射消亡)· 负向恒即时(不入库、无库存语义——库存已随可选类删除下线)· 满层零兑付 = 合法例外 + "奖励未生效"行 · 重复受理幂等(同格重复 grant / 同批次重复 grant_clear → 同一快照/身份 + 诊断;受理/兑付恰一次归 战斗结算×②③) api: 封闭枚举入口(provisional,实现期 ADR 定名)——roll_board / query_identity(返回 {reward_id, cell_type, tier} 引用级投影;未开格恒可查——魔法道具 桥接结构前提;清单外坐标 → null + 诊断)/ grant(同格重复受理幂等 + 诊断)/ grant_clear(同批次重调幂等 + 诊断)/ retire_mapping / equivalence_supply(全活行投影 + tier_min_buff)+ weighted_pick 纯函数面;新增入口 = 接口漂移,新增入口须随附全输入域语义表 # 2026-09-15 删 stock/use/query_inventory/clear_inventory(库存轴下线) - mvp_content: 十四行(2026-09-15 格面资源批十行;2026-09-18 伤害道具批增补四行)——格面池正向七行(attack_up / ac_up〔2026-09-16 护甲等级掷点批换装,原 defense_up 减伤 −30% 退役;cell_type defense/权重/档位零改动〕/ spark_aoe / heal_minor / weaken / pierce_strike / magic_bolt〔attack_type 字段载攻击类型轴,查战斗结算克制矩阵、单目标必中全额〕)+ 负向七行纯字典(enrage / off_guard / heal_backlash 直伤〔不经增益状态〕/ ambush_double blast〔stacks=2〕/ sapped / pierce_snare / magic_recoil〔均主角直伤,不经增益状态〕)+ clear_blast(clear_default);类型频次 = 正向行权重合计;tier_min_buff = 2。**2026-09-17 数值压缩批·文档同步——具体数值列(power/weight/power_min/power_max)改指路存根**:现行行值读 `data/tables/reward.tres`(压缩后锚行:spark_aoe power=1 / heal_minor power=[1,1] 定值(原 [2,6] 区间压缩)/ heal_backlash power=1 / clear_blast power_min=8 power_max=18 power=13 中点 / ambush_double stacks=2;类型频次合计 79→67〔heal 权重 15→3〕) + mvp_content: 十六行(2026-09-15 格面资源批十行;2026-09-18 伤害道具批增补四行;2026-09-20 格面资源八型批 ambush_double→enemy_alert 换装 + ap_up/ap_drain 两行新增)——格面池正向八行(attack_up / ac_up〔2026-09-16 护甲等级掷点批换装,原 defense_up 减伤 −30% 退役;cell_type defense/权重/档位零改动〕/ spark_aoe / heal_minor / weaken / pierce_strike / magic_bolt〔attack_type 字段载攻击类型轴,查战斗结算克制矩阵、单目标必中全额〕/ ap_up action〔下轮行动点 +1——2026-09-20 八型批新增〕)+ 负向八行纯字典(enrage / off_guard / heal_backlash 直伤〔不经增益状态〕/ enemy_alert blast〔effect_id=alert,敌方护甲等级 +1——2026-09-20 八型批 ambush_double 退役换装〕/ ap_drain action〔下轮行动点 −1〕/ sapped / pierce_snare / magic_recoil〔均主角直伤,不经增益状态〕)+ clear_blast(clear_default);类型频次 = 正向行权重合计;tier_min_buff = 2。**2026-09-17 数值压缩批·文档同步——具体数值列(power/weight/power_min/power_max)改指路存根**:现行行值读 `data/tables/reward.tres`(压缩后锚行:spark_aoe power=1 / heal_minor power=[1,1] 定值(原 [2,6] 区间压缩)/ heal_backlash power=1 / clear_blast power_min=8 power_max=18 power=13 中点 / ambush_double stacks=2;类型频次合计 79→67〔heal 权重 15→3〕;2026-09-20 八型批后 67→74——attack 14 / defense 11 / blast 16 / heal 2 / weaken 8 / pierce 8 / magic 8 / 清障炸药 1 / action 6) direction_precheck: **刀供给方向预检随可选类删除失义退役(2026-09-15)**——历史读数见底部修订记录;新对账锚 = 行动经济 条款②③ 左臂(正向格面资源当量供给)随格面资源批重推,义务归 难度曲线与Boss 调参批 settlement_obligations: 四项(战斗结算 GDD 门禁评审缺项即 blocking,清单全文见 地图战斗资源 GDD Dependencies)——① 结算段序骨架(授予→增益/减益→战斗→衰减→判定)② 极性路由受理 + 每格恰一次 + 满层零兑付"奖励未生效"行(含聚合计数字段)③ clear_reward 授予路径(增益状态 OQ4 关闭条件)④ 生命周期编排(battle_over retire 映射消亡)+ roll_board 恰一次 # 2026-09-15 由六项收拢(窗口/道具段与库存编排随可选类删除失义) hud_obligations: 三项(缺项即 blocking)——① 已开格资源身份恒定可读(挖掘期规划面)+ 未开格类型可查面的呈现深度(预读边界待办)② 结算明细行(效果行/"奖励未生效"〔聚合计数〕/标旗未中行/直伤行)③ H2 清图奖励行强调呈现 # 2026-09-15 由五项收拢(库存常读条/道具窗口随可选类删除失义) @@ -350,10 +351,10 @@ 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〔全局 max(1,·)——零值伤害行语义退役,重档折扣行文本记"被压制"〕;吃掷点分量 = 主角先手攻击普通分量 / 敌方技能基础伤害分量〔= 攻击基线 × 技能伤害倍率——2026-09-16 敌人技能池批改述,原"敌方攻击拍与重击拍基线伤害"退役;无伤害分量的增益技不掷不折〕,棋盘来源伤害〔爆裂 / 清障炸药 / 奖励即时——2026-09-19 充能退役后无充能分量;伏击附加项随 2026-09-20 八型批伏击退役移除〕必中全额不掷;回合内随机、消费 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 评审批修订;行类型封闭枚举 9 类(2026-09-20 伏击上限删除批下线溢出未生效行 overflow)——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 查表(奖励直伤道具消费方保留) + 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 伤害施放、具名技能、不掷不折——原"不兑伏击"语义随 2026-09-20 八型批伏击退役改述〕)· 衰减恒执行含末轮 · 高光双落载体(perfect_sweep P_perfect——2026-09-10 修订为真实双份兑付载体 / 标中旗 highlight 标记)· 流水行协议字段分层(公共 7 字段 + 行类型特有 target/effect_id/pool_value/聚合计数——2026-09-10 评审批修订;行类型封闭枚举 9 类(2026-09-20 伏击上限删除批下线溢出未生效行 overflow)——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 查表(奖励直伤道具消费方保留) closure_receipt: 行动经济 F1 条款①②③⑤闭合 owner = 战斗结算(2026-09-10 F0–F5 首版验算完成——F0 瞬时当量口径 + m_w 值域裁决见 status_effect.anchor_warning;条款③ clause3_supply 闭合回执;条款⑤ clause5_dominance 条目;actuals p10 交付后强制重跑) referenced_by: [HUD框架, 战斗表现, 音频, 教学引导, 难度曲线与Boss] @@ -361,10 +362,10 @@ entities: type: formula owner: design/gdd/systems/战斗循环/敌人系统.md attributes: - rule: 敌人系统→战斗结算 挖掘风险不等式(行动经济 F1 条款 3)供给口径——每结算敌方伏击暴露精确式 = k × L × m_amb(k = 本结算存活敌中攻击/重击拍单位数,确定性可算);每结算结构上界 = unit_count × AP 上界 × m_amb(原 min(AP 上界, cap) 的 cap 腿随 2026-09-20 单轮上限删除退役);跨结算累计 = 轨迹量非表值 + rule: (2026-09-20 八型批再修订)原挖掘风险不等式的伏击暴露口径(k × L × m_amb / unit_count × AP 上界 × m_amb)随伏击退役整体作废——blast 负向现况 = 警觉(敌方 AC +1,掷点折扣分布型惩罚,期望当量建模归 曲线调参批重立);行动经济 F1 条款 3 对账义务同步改写 boundary: **单结算自然边界(用户 2026-09-09 定稿)**——"不设(每战)上界:踩雷 debuff 只在一次结算中有效,之后没有 debuff"(dur=1 每结算清零无存量) - variables: [cap, m_amb, unit_count, k_r, L_r] - output_range: 单结算结构上界 ∈ [0, unit_count×min(AP, cap)×m_amb](满配语境 3×min(8,4)×3=36;cap≥8 时真可达上界 72 而非 144;默认行值 unit_count=1 下 12) + variables: [cap, m_amb, unit_count, k_r, L_r](2026-09-20 八型批:m_amb/k_r/L_r 随伏击退役悬空,条目待曲线调参批重立后重登记) + output_range: 单结算结构上界 ∈ [0, unit_count×min(AP, cap)×m_amb](式随 2026-09-20 八型批伏击退役作废、留档历史)(满配语境 3×min(8,4)×3=36;cap≥8 时真可达上界 72 而非 144;默认行值 unit_count=1 下 12) account_input: 对账输入 = 棋盘生成 actuals p10(F4 报告 C)非 target 参数(棋盘生成 登记口径);闭合 owner = 战斗结算 单一签字人;左臂(安全格 buff 当量)载体 = **地图战斗资源 F6 当量供给**(2026-09-09 地图战斗资源 定稿——部分缓解非闭合:窗口使用次数是战斗轨迹量,敌人系统 OQ3 扩项保持;2026-09-11 起基础攻击恒在为左臂提供恒定伤害基底,原"当前内容态结构性不可通关"事实退役——敌人系统 Overview 2026-09-11 改写) direction_precheck: cap=4 下右臂 ≈7.7;左臂按条款 2 最低档锚(+50pp)计 = 0.36×50 = 18——裕度 ≈2.3×(1:1 百分点代理,provisional;2026-09-09 敌人系统 full 评审更正原 4.7×——该值按 +100 两层叠满取值、与"最低档下界"语言矛盾);量级注记:atk=4 时 attack 拍 L≥2 伏击分量过半(heavy 拍过半点后移、按拍别读取;常态支配修正入口 = 难度曲线与Boss atk 曲线 / 地图战斗资源·战斗结算 m_amb 锚,敌人系统 权限外)。**参照迁移注记(2026-09-09 地图战斗资源 评审;2026-09-11 回迁)**:左臂参照对象曾迁 defense_up 当量(地图战斗资源 F4)——**2026-09-11 用户裁决"基础攻击恒存在"后 attack_up 复活,参照对象回迁 attack_up 当量**(上式 +50pp 系 attack_up 口径,迁移期结束;复算义务随 战斗结算 对照表落定,见 status_effect.anchor_warning 回迁注记)。**闭合回执(2026-09-10 战斗结算 GDD F4——条款③闭合完成;同日评审批双口径更正)**:统一 HP 当量 + 边际配对重算 → 默认 unit_count=1 下 L1 裕度 ≈2.0× / L2 ≈2.6× **通过**(锚行口径;**跨行期望口径 ≈1.2×/1.5× 同向通过——双口径登记,难度曲线与Boss 不得以锚行读数放行 unit_count=2**);**满配语境(unit_count=3)最坏盲点破线 → 难度曲线与Boss 调参约束登记**(unit_count 轴 + 密度×可推理率轴——unit_count>1 行须降密度或降 m_amb);本条 pp 代理预检(2.3×)退役为历史记录(量纲混用 + 右臂聚合上界与单格决策单位错配)。**重算回执(2026-09-14 战斗结算 重算批——按现行三输入重推:duration=1 × m_d=−30 × 难度曲线与Boss v3 曲线 d0.25/t0.88)**:L1 裕度 ≈0.48× / L2 ≈0.47× **破线**(锚行口径;跨行期望口径 E_dig=4.5 → ≈0.60×/0.58× 同向破线——双口径登记);满配语境(unit_count=3)≈0.16× 深度破线;**破线升格为默认曲线级约束——V_safe 侧杠杆(m_d/duration/D_ref)× 板形侧杠杆(密度×ι 联动对)× m_amb 全处"禁独立调参"联动网络(m_w↔D_ref↔m_d↔duration_d),修正方向须 难度曲线与Boss 提案 + 战斗结算 闭合对账共裁**;上段 ≈2.0×/2.6× 读数系 duration=2 × m_d=−50 × v1 曲线旧值链产物,退役为历史记录;actuals p10 交付后强制重跑(战斗结算 AC-39;ι 判式面保守代理 = 行 target 代,总暴露面无效) referenced_by: [战斗结算] diff --git a/design/ux/battle.md b/design/ux/battle.md index e86ecc4f..2acd8dc0 100644 --- a/design/ux/battle.md +++ b/design/ux/battle.md @@ -111,7 +111,7 @@ |---|---|---|---|---|---| | A | LevelStripView | 步进条 | 节点图 + 当前位置 | 只读(点击节点不可跳) | ✅ level_strip_view.gd 迁移 | | B | 英雄卡 | 卡片 | 小人像、HP 条、攻击值、状态效果槽 ×4 | 只读 | HUDView 拆分 | -| B | 敌人卡 ×1–3 | 卡片 | 敌像、血条、顺位徽标、意图徽标、状态槽(含敌方 side 池口径:伏击层数为全体敌人共享单值、各卡同值呈现——数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;2026-09-16 敌人技能池批改型:行为环点拆除〔proposal §2.4〕,意图徽标语义 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,敌方增益〔蓄力/硬化〕入状态行) | 只读 | 新建 | +| B | 敌人卡 ×1–3 | 卡片 | 敌像、血条、顺位徽标、意图徽标、状态槽(敌方 side-wide 增益各卡同值呈现——蓄力/硬化/削弱/暴走/警觉;伏击层数通道随 2026-09-20 八型批退役——数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;2026-09-16 敌人技能池批改型:行为环点拆除〔proposal §2.4〕,意图徽标语义 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,敌方增益〔蓄力/硬化〕入状态行) | 只读 | 新建 | | B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 | | B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 点击展开明细回看 overlay | battle_log_view.gd 改造 | | B | 结算明细回看 | 模态 overlay | 完整流水逐行(现行 9 类行协议;未生效类行聚合计数) | 关闭 | battle_log_view.gd 改造 | @@ -162,7 +162,7 @@ │ │ 状态 ⬆2 ·🛡1 │ │ 状态 ⚡2 │ │ 状态 🛡1 │ │ │ └────────────┘ └──────────┘ └──────────┘ │ │ ├─ 结算明细带 ────────────────────────────────────────────────────────────┤ │ -│ │ ▸上轮: 主角攻击3→蛆虫-3 | 攻击+50%(1结算) | 伏击+1×2 … [展开明细▾] │ │ # 2026-09-17 数值压缩批:UI 示意文本同步(atk 7→3〔地精格数÷3 + L1 锚行;UX 示意按当前地精行值读〕、伏击 +3 → +1/层,幅度参考 data/tables/) +│ │ ▸上轮: 主角攻击3→蛆虫-3 | 攻击+50%(1结算) | 警觉+1×2 … [展开明细▾] │ │ # 2026-09-17 数值压缩批:UI 示意文本同步(atk 7→3〔地精格数÷3 + L1 锚行;UX 示意按当前地精行值读〕、伏击 +3 → +1/层,幅度参考 data/tables/) │ └────────────────────────────────────────────────────────────────────────┘ │ ├─[C] 角色信息 240px ───┬─[D] 扫雷图 ~1036px ──────────────────────────────────┤ │ 520px │ 520px │ diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/action_economy.gd b/prototypes/dungeon-sweeper-vertical-slice/core/action_economy.gd index c8b5e0f8..9912d707 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/action_economy.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/action_economy.gd @@ -30,6 +30,7 @@ var last_round_end: Dictionary: get: return _last_round_end var _settlement_consumed := false # AC-14 门:notify_settlement_done 消费后才受理 round_start var _next_round_mode := "" # 调试观测量(同板续轮 / 换新图) +var _pending_ap_delta := 0 # 下轮行动点修正排队(格面资源八型批 2026-09-20——action 型 ±1 排队,轮开始兑现后清零) func _init(db_ref) -> void: @@ -118,6 +119,16 @@ func notify_settlement_done(next_round_mode: String) -> bool: return true +# 下轮行动点修正排队(格面资源八型批 2026-09-20):action 型正负行结算期调用,同轮多次授予累加; +# 相位无关(授予发生在结算段,此时本类可能处于 ACTIVE/WAITING 任一相位) +func queue_ap_delta(delta: int) -> void: + _pending_ap_delta += delta + + +func pending_ap_delta() -> int: + return _pending_ap_delta + + func notify_round_start() -> bool: if phase == PHASE_IDLE: pass # 战斗首轮唯一出口 @@ -126,7 +137,8 @@ func notify_round_start() -> bool: else: _reject("phase") return false - _ap = db.action_economy.ap_per_round # 每轮硬重置(RAP 不动——唯一跨轮携带量) + _ap = maxi(0, db.action_economy.ap_per_round + _pending_ap_delta) # 每轮基线 + 排队修正(下限 0) + _pending_ap_delta = 0 _phase = PHASE_ACTIVE _settlement_consumed = false return true diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd b/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd index 84cacc18..b1d44fb2 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd @@ -58,7 +58,6 @@ var _flag_consumed := {} # 兑付资格以雷格实例为键 var _flag_miss_seen := {} # 标旗未中行去重(每安全格实例一次) var _perfect_hit_true := 0 # 板级完美排雷计数(install 重置) var _perfect_hit_false := 0 -var _m_amb := 0 # StatusEffectTable.ambush.magnitude 快照 var _hero_atk := 0 # 主角攻击基值快照(encounter.hero_atk;E4 收口——表值运行期不可变) @@ -112,7 +111,6 @@ func begin_battle(enc: Dictionary) -> bool: _fatal("敌人系统 spawn 被拒") return false var erow: Dictionary = db.resolve_enemy_rowset(int(enc.level_index), int(enc.node_depth)) - _m_amb = int(db.status_effect_row("ambush").get("magnitude", 0)) if not _install_new_board(): return false _reset_round_facts() # 首板 install 的初始展开事件不入轮 facts(resource 恒 false 的双保险) @@ -286,7 +284,7 @@ func _apply_percent_row(row: Dictionary, source_class: String, cell: Vector2i, r # flat 行兑付(负向恒即时,无库存语义): -# blast 正向 = 全体存活敌各 power 点(无敌 → 奖励未生效行);blast 负向 = 敌方伏击 +stacks 层(直授无上限); +# blast 正向 = 全体存活敌各 power 点(无敌 → 奖励未生效行);blast 负向 = 警觉 percent 行(effect_id=alert,走 _apply_percent_row 不入本函数); # heal 正向 = 主角回复 clamp(满血 → 奖励未生效行);heal 负向 = 主角直伤 power 点(不经增益状态;归零 → 战斗段短路/判定段判负)。 # pierce/magic(伤害道具批 2026-09-18)正向 = 单目标克制直伤(必中全额);负向 = 主角直伤。 # 返回 "redeemed" = 实际有效兑付 / "zero" = 零兑付(行已自记)——清图高光只记实际有效兑付。 @@ -294,9 +292,12 @@ func _apply_flat_row(row: Dictionary, source_class: String, cell: Vector2i, ri: var ctype := String(row.cell_type) var power := int(row.power) var display := String(row.display_name) + label_suffix + if ctype == "action": + var delta: int = power if String(row.get("polarity", "positive")) == "positive" else -power + action_economy.queue_ap_delta(delta) + _emit_row("effect", source_class, cell, ri, "%s(下轮行动点 %+d)" % [display, delta], delta, {"effect_id": "ap_delta", "pool_value": action_economy.pending_ap_delta()}, highlight) + return "redeemed" if ctype == "blast": - if String(row.get("polarity", "positive")) == "negative": - return _apply_ambush_grant(row, source_class, cell, ri, highlight, label_suffix) var alive: Array = _enemy_system.query_alive("enemy") if alive.is_empty(): _emit_row("reward_ineffective", source_class, cell, ri, "%s 未生效(无存活敌人)" % display, 0, {"batch_key": String(row.reward_id)}, highlight) @@ -341,16 +342,6 @@ func _apply_flat_row(row: Dictionary, source_class: String, cell: Vector2i, ri: return "zero" -# blast 负向:敌方伏击 +stacks 层(直授无上限——单轮授予上限已随 2026-09-20 用户拍板退役, -# 一轮踩雷数由行动点预算天然封顶;多源共享同一池值) -func _apply_ambush_grant(row: Dictionary, source_class: String, cell: Vector2i, ri: int, highlight: String = "", label_suffix: String = "") -> String: - var requested: int = maxi(1, int(row.get("stacks", 1))) - for i in range(requested): - _status_effects.apply_effect("ambush", {"source_class": source_class, "origin_cell": cell, "round_index": ri}) - _emit_row("effect", source_class, cell, ri, "敌方伏击 +%d 层%s" % [requested, label_suffix], requested, {"effect_id": "ambush", "pool_value": _status_effects.pool_layers("ambush") * _m_amb}, highlight) - return "redeemed" - - # 旗判定批:标中 = 该雷格资源的正向兑付(每雷实例一次;高光 = 强制检查点); # 标空 = "标旗未中"归因行 + 该安全格资源的负向兑付(同键去重——每格实例一次)。 func _judge_flag(evt: Dictionary, ri: int) -> void: @@ -437,7 +428,6 @@ func _roll_round_actions() -> void: # ---- 战斗段 ---- func _combat_segment(ri: int) -> void: - var L := _status_effects.pool_layers("ambush") # 授予段后的当轮值;池共享不消耗 # ⓪ 主角先手攻击(基础攻击恒存在——2026-09-11 用户裁决;先于敌方行动;授予段负向直伤致死 → 致电短路不先手)。 # 单分量伤害构成(2026-09-19 充能退役批·用户拍板):主角攻击 = 唯一基础分量(atk,吃掷点含暴击; # 类型 = 主角 attack_type 表值——2026-09-18 营地扩展前置批:量与类型抽象分离;查甲效矩阵对应行取克制修正)。 @@ -483,8 +473,8 @@ func _combat_segment(ri: int) -> void: _fatal("敌实例待发动作悬空: %s" % skill_id) continue if String(srow.type) == "buff" or String(srow.type) == "debuff": - # 增益/妨害技(新效应词汇批 2026-09-19)= 0 伤害施放行:不兑付伏击(旧蓄力拍"零兑付"语义由施放行 - # 继承——本轮喂的伏击逢施放拍不兑现的读怪奖励保留);状态授予即数值兑现,技能冷却与增益持续两计时器分账。 + # 增益/妨害技(新效应词汇批 2026-09-19)= 0 伤害施放行:不掷不折;状态授予即数值兑现,技能冷却与增益持续两计时器分账。 + # (原"本轮喂的伏击逢施放拍不兑现"读怪奖励随伏击退役一并作废——2026-09-20 八型批) # 落点由状态行 target_side 路由(buff → 敌方侧 / debuff → 主角侧——容器零改动,proposal-status-vocabulary §1)。 var dur: int = int(srow.get("buff_duration", 1)) _status_effects.apply_effect(String(srow.buff_ref), {"source_class": "enemy_action", "origin_cell": Vector2i(-1, -1), "round_index": ri}, dur) @@ -493,7 +483,7 @@ func _combat_segment(ri: int) -> void: continue # 伤害技(含普攻——倍率恒 1):三乘法链 ① A = 攻击基线 × 技能倍率(判定对象 = 技能基础伤害分量) # → ② d20 vs 主角 AC(nat20 暴击 ≠ 技能重击,两层严格区分)→ ③ +克制修正点数(敌打主角无甲轴恒中性 delta 0——加法核 2026-09-18 换装) - # → 伏击附加(后置加法、必中全额、不吃 AC)→ 增益池乘区 → 伤害下限 max(1,·) + # → 增益池乘区 → 伤害下限 max(1,·) # → 必中附加分量 rider(新效应词汇批 2026-09-19:后置加法、必中全额、不进乘区不出暴击—— # proposal-status-vocabulary §2;价位锚 rider_mult=0.75 = AC 折扣档最轻档"不掉档的稳定伤害")。 var baseline: int = int(round(float(u.atk) * float(srow.get("damage_mult", 1.0)))) @@ -505,10 +495,10 @@ func _combat_segment(ri: int) -> void: var crit_e: bool = bool(roll_read_e.crit) var discount_e: int = _roll_discount(int(roll_read_e.roll), threshold_e) var rolled_base: int = DamageMath.rolled_component(float(baseline), discount_e, crit_e, int(db.settlement.crit_multiplier), 0) # 敌打主角无甲轴恒中性——加法核中性 delta = 0(原 percent 100 退役) - var d_tick := _resolve_damage(rolled_base + L * _m_amb) + var d_tick := _resolve_damage(rolled_base) d_tick = maxi(int(db.settlement.damage_floor), d_tick) + rider # rider 后置于伤害下限——独立必中加项,不进乘区 _enemy_system.apply_damage(_enemy_system.hero_unit(), d_tick) - var payload_e: Dictionary = {"target": "hero", "skill_id": skill_id, "baseline": baseline, "attach": L * _m_amb, + var payload_e: Dictionary = {"target": "hero", "skill_id": skill_id, "baseline": baseline, "roll": int(roll_read_e.roll), "ac": threshold_e, "tier": discount_e} if crit_e: payload_e["crit"] = true @@ -554,7 +544,12 @@ func _defender_ac(unit: Dictionary) -> int: if not row.is_empty() and String(row.unit) == "ac": total += int(eff.effective_value) return total - return int(unit.get("armor_class", 0)) + var total: int = int(unit.get("armor_class", 0)) + for eff_e in _status_effects.query_active("enemy"): + var erow_ac: Dictionary = db.status_effect_row(eff_e.effect_id) + if not erow_ac.is_empty() and String(erow_ac.unit) == "ac": + total += int(eff_e.effective_value) + return total # F2 乘区:池内加算 → clamp [-100,+100] → 池间乘算 → floor(单一取整规则)——算术归 DamageMath(O3) @@ -637,7 +632,6 @@ func _emit_settlement_snapshot(verdict: String) -> void: "board": board_stats, "enemies": enemies, "buffs": buffs, - "ambush_layers": _status_effects.pool_layers("ambush"), "round_facts": {"path": _facts_path, "safe": safe_n, "mines": mines_hit, "flag_events": _facts_flags.size(), }, }) @@ -702,18 +696,17 @@ func _battle_over(result: String) -> void: # 协作对象(_enemy_system/_status_effects/_reward_economy)私有化后,跨层读取一律经本快照或下列命名面(diagnostic_snapshot 同款模式, # 禁再链式穿透 settlement.enemy_system.hero 一类路径)。载荷 schema 成文(code-conventions 2.1): # round / battle_result / phase / ap / rap / can_refresh / hero{hp,max_hp,atk,alive,armor_class} / -# enemies[{order,display_name,hp,max_hp,enemy_id,armor_type,armor_class,pending_skill,pending_type,pending_name,effects[],ambush_layers,alive}] / -# (敌人技能池批批 2 定稿:beat/ring_size/ring_index 拆除 → pending_* 三字段 + 敌方增益 effects 投影;池与权重不公开) -# ambush_layers / hero_effects[](增益状态 query_active 投影) +# enemies[{order,display_name,hp,max_hp,enemy_id,armor_type,armor_class,pending_skill,pending_type,pending_name,effects[],alive}] / +# (敌人技能池批批 2 定稿:beat/ring_size/ring_index 拆除 → pending_* 三字段 + 敌方增益 effects 投影;池与权重不公开; +# 八型批 2026-09-20:ambush_layers 拆除——伏击退役,警觉并入 effects 投影)hero_effects[](增益状态 query_active 投影) func presentation_snapshot() -> Dictionary: var enemies: Array = [] var all: Array = _enemy_system.all_enemies() - var ambush: int = _status_effects.pool_layers("ambush") - # 敌方增益投影(side-wide 状态——蓄力/硬化/削弱/暴走等 percent 行;伏击单独走 ambush_layers) + # 敌方增益投影(side-wide 状态——蓄力/硬化/削弱/暴走 percent 行 + 警觉 ac 行,八型批 2026-09-20) var enemy_effects: Array = [] for eff in _status_effects.query_active("enemy"): var erow: Dictionary = db.status_effect_row(eff.effect_id) - if not erow.is_empty() and String(erow.unit) == "percent" and String(eff.effect_id) != "ambush": + if not erow.is_empty() and String(erow.unit) in ["percent", "ac"]: enemy_effects.append({"effect_id": eff.effect_id, "display_name": String(eff.display_name), "layers": int(eff.layers)}) for i in all.size(): var u: Dictionary = all[i] @@ -733,7 +726,6 @@ func presentation_snapshot() -> Dictionary: "pending_type": String(pending_row.get("type", "")) if not pending_row.is_empty() else "", "pending_name": String(pending_row.get("display_name", "")) if not pending_row.is_empty() else "", "effects": enemy_effects, - "ambush_layers": ambush, "alive": alive, }) var hero := {} @@ -748,7 +740,6 @@ func presentation_snapshot() -> Dictionary: "can_refresh": can_refresh(), "hero": hero, "enemies": enemies, - "ambush_layers": ambush, "hero_effects": _status_effects.query_active("hero"), } diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/reward_economy.gd b/prototypes/dungeon-sweeper-vertical-slice/core/reward_economy.gd index 6d965b28..990b2b92 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/reward_economy.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/reward_economy.gd @@ -168,7 +168,7 @@ func polarity_row(cell_type: String, polarity: String) -> Dictionary: and String(row.get("cell_type", "")) == cell_type \ and String(row.get("polarity", "")) == polarity: return row.duplicate() # E6:表行值拷贝出口——消费方禁改配置源 - _fatal("极性字典缺行(五型×正负齐备为加载前提): %s %s" % [cell_type, polarity]) + _fatal("极性字典缺行(八型×正负齐备为加载前提): %s %s" % [cell_type, polarity]) return {} diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/schemas/reward_table.gd b/prototypes/dungeon-sweeper-vertical-slice/data/schemas/reward_table.gd index 954e8655..43098d51 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/schemas/reward_table.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/data/schemas/reward_table.gd @@ -3,17 +3,17 @@ # Date: 2026-09-10(2026-09-15 格面资源批结构性重写:category/use_timing/库存/供给轴下线,五型 × 极性字典取代) # 数据配置 RewardTable schema(地图战斗资源 回填值)。 # 行 = Dictionary,键 reward_id(Rule 4 豁免:定义表);跨字段校验族 + 池护栏。 -# 五型封闭枚举(attack/defense/heal/blast/weaken)× 极性(positive/negative): +# 八型封闭枚举(attack/defense/heal/blast/weaken/pierce/magic/action)× 极性(positive/negative): # 正向行 = 摇号池(权重 = 类型频次);负向行 = 纯兑付字典(不消费权重)。 class_name RewardTable extends Resource @export var rows: Array = [] # Array[Dictionary] -const CELL_TYPES := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic"] # 七型封闭(伤害道具批 2026-09-18 五→七)——清单外加载拒绝 +const CELL_TYPES := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic", "action"] # 八型封闭(格面资源八型批 2026-09-20 七→八)——清单外加载拒绝 const POLARITIES := ["positive", "negative"] const POOL_TAGS := ["cell", "clear_default"] # cell = 格面资源单一池;clear_ 命名空间预留拒绝 -const CELL_TYPE_KEYS := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic"] # 字典完整性校验轴(类型 × 极性 = 十四格) +const CELL_TYPE_KEYS := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic", "action"] # 字典完整性校验轴(类型 × 极性 = 十六格) func validate() -> Array: @@ -61,15 +61,12 @@ func validate() -> Array: if stacks < 1 or stacks > 16: errs.append({"category": "domain", "message": "%s stacks 越域 [1,16]: %d" % [rid, stacks]}) # 跨字段:effect_id 非空 = percent 行(引用悬空校验归 ConfigDB 跨表通道);空 = flat 行。 - # flat 行 power ≥ 1(直付行:治疗/群伤/直伤)——例外 = blast 负向(伏击加层行,消费 stacks 不消费 power)。 + # flat 行 power ≥ 1(直付/直兑行:治疗/群伤/直伤/行动点)——action 型 = 排队点数行(power = ±点数量级)。 var eff: String = row.get("effect_id", "") - var is_layer_row: bool = eff == "" and ctype == "blast" and pol == "negative" if power < 0 or power > 999: errs.append({"category": "domain", "message": "%s power 越域 [0,999]: %d" % [rid, power]}) - if eff == "" and power < 1 and not is_layer_row: + if eff == "" and power < 1: errs.append({"category": "cross_field", "message": "%s flat 行 power ≥ 1" % rid}) - if is_layer_row and int(row.get("stacks", 1)) < 1: - errs.append({"category": "cross_field", "message": "%s 加层行 stacks ≥ 1" % rid}) # 区间配对(缺省 = 定值行向后兼容):必成对 · percent 行禁止 · power = 中点锚 var has_min: bool = row.has("power_min") var has_max: bool = row.has("power_max") diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres index b0992900..ce3173d3 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/reward.tres @@ -87,13 +87,12 @@ rows = [{ "pool_tag": "cell", "tier": 1 }, { -"reward_id": "ambush_double", +"reward_id": "enemy_alert", "cell_type": "blast", "polarity": "negative", -"effect_id": "", -"display_name": "敌方伏击", +"effect_id": "alert", +"display_name": "警觉", "power": 0, -"stacks": 2, "weight": 0, "pool_tag": "cell", "tier": 1 @@ -161,6 +160,26 @@ rows = [{ "weight": 0, "pool_tag": "cell", "tier": 1 +}, { +"reward_id": "ap_up", +"cell_type": "action", +"polarity": "positive", +"effect_id": "", +"display_name": "行动点", +"power": 1, +"weight": 6, +"pool_tag": "cell", +"tier": 1 +}, { +"reward_id": "ap_drain", +"cell_type": "action", +"polarity": "negative", +"effect_id": "", +"display_name": "迟滞", +"power": 1, +"weight": 0, +"pool_tag": "cell", +"tier": 1 }] ; 格面资源批(2026-09-15 用户拍板——registry reward_table 条目为现行 schema 事实源): @@ -168,8 +187,11 @@ rows = [{ ; 装板期一次摇定;摇号只消费正向行权重(类型频次 = attack 20 / defense 16 / blast 16 / heal 3 / weaken 12,合计 67; ; 头段"heal 15 / weaken 12,合计 79"为历史注记——数值压缩批后 heal 3、合计 67,见本文件尾部 2026-09-17 批注); ; 负向行 weight=0 不参与摇号,纯(类型, 极性)兑付字典——heal 负向 = 主角直伤 4(不经增益状态), -; blast 负向 = ambush +2 层(stacks=2,直授无上限——伏击单轮上限 2026-09-20 退役)。 +; blast 负向 = 警觉(敌方 AC +1,2026-09-20 伏击退役换装)。 ; 可选类三行(knife_t1/knife_adv/heal_pack)与注入池 active_inject 随可选类道具整体删除(供给控制器/保底/窗口同步下线)。 +; 格面资源八型批(2026-09-20 用户拍板):① blast 负向 ambush_double 退役 → enemy_alert(警觉,effect_id=alert +; 敌方 AC +1 percent 行);② 新增第 8 型 action 两行——ap_up(正向,下轮行动点 +1)/ ap_drain(负向,下轮 +; 行动点 −1),排队兑现于下一轮开始(action_economy.queue_ap_delta);③ off_guard 数值 −2→−1 归 status_effects.tres。 ; 区间行(伤害量值区间批 2026-09-14):heal_minor [2,6] · clear_blast [25,55]——中点锚 power 恒等期望当量, ; roll 时机 = 身份预分配批内追加取号(既有取号序零扰动);spark_aoe 定值行无区间字段。 ; 减伤墙调参批(2026-09-13):defense_up 权重 24→16——攻击成为池内最高行(历史注记)。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/settlement.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/settlement.tres index 3cb2cede..2c793289 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/settlement.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/settlement.tres @@ -19,7 +19,6 @@ source_label_map = { effect_pool_map = { "attack_up": "hero_offense", "weaken": "enemy_output", -"ambush": "flat_attach", "enrage": "enemy_output", "sapped": "hero_offense", "empower": "enemy_output", @@ -63,7 +62,7 @@ armor_roll_stream = "armor_roll" ; source_label_map 删 item 键;effect_pool_map 增 sapped→hero_offense(weaken 型负向——乏力)。 ; enrage(敌方暴走 +25%,enemy_output 池)/ off_guard(我方失衡 +25%,hero_defense 池)/ ; sapped(我方乏力 -25%,hero_offense 池)= attack/defense/weaken 三型负向字典行 -; (极性路由兑付:挖雷格 / 标错安全格按该格 cell_type 取负向行;heal 负向 = 主角直伤不经状态、blast 负向 = ambush+2 层)。 +; (极性路由兑付:挖雷格 / 标错安全格按该格 cell_type 取负向行;heal 负向 = 主角直伤不经状态、blast 负向 = 警觉(敌方 AC +1,2026-09-20 八型批换装))。 ; 减伤墙调参批(2026-09-13):pool_clamp 域 [-100,+100] 结构冻结不动;减伤杠杆走 status_effects.tres(批注在该表)。 ; 护甲等级掷点批(2026-09-16 用户拍板,数字即规范——战斗结算 GDD 护甲等级掷点节定稿同批): ; roll_faces=20 / roll_tier_bounds=[3,7] / roll_tier_discounts=[75,50,25] / crit_roll=20 / crit_multiplier=200 / 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..88b0cb92 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/status_effects.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/status_effects.tres @@ -23,15 +23,6 @@ rows = [{ "stack_policy": "stack", "max_stack": 2 }, { -"effect_id": "ambush", -"display_name": "伏击", -"target_side": "enemy", -"magnitude": 1, -"unit": "flat", -"duration_settlements": 1, -"stack_policy": "stack", -"max_stack": 16 -}, { "effect_id": "weaken", "display_name": "削弱", "target_side": "enemy", @@ -53,7 +44,7 @@ rows = [{ "effect_id": "off_guard", "display_name": "失衡", "target_side": "hero", -"magnitude": -2, +"magnitude": -1, "unit": "ac", "duration_settlements": 1, "stack_policy": "stack", @@ -85,6 +76,15 @@ rows = [{ "duration_settlements": 2, "stack_policy": "refresh", "max_stack": 1 +}, { +"effect_id": "alert", +"display_name": "警觉", +"target_side": "enemy", +"magnitude": 1, +"unit": "ac", +"duration_settlements": 1, +"stack_policy": "stack", +"max_stack": 16 }] ; 减伤墙调参批(2026-09-13,playtest-2026-09-12 报告 Q1 触发——defense_scan 实测墙轮 39%、 @@ -120,3 +120,8 @@ rows = [{ ; weaken(削弱)叠层改续时:stack_policy stack→refresh、duration_settlements 1→2(同名重复授予 ; 只刷新剩余结算数、层数恒 1——结构性消饱和,×2 叠满池触底 ×0 免伤轮从根杜绝;refresh 实现与 ; empower/fortify 同款零代码)。duration 终值、off_guard N 值、当量锚复算全部归 状态层重设计批。 +; +; 格面资源八型批(2026-09-20 用户拍板):① off_guard magnitude −2→−1(护甲型奖励/惩罚数值对齐 = ±1); +; ② ambush(伏击)行整体退役——群伤负向不再放大敌方伤害;③ 新增 alert(警觉:敌方护甲等级 +1, +; target_side enemy、unit ac、1 结算、stack 上限 16)——blast 型负向新载体,消费 = _defender_ac 敌方侧 +; ac 型读法(本批新接线)。状态表九行→九行(伏击出、警觉进)。数值全部 provisional 归 难度曲线与Boss。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/presentation/views/enemy_card_view.gd b/prototypes/dungeon-sweeper-vertical-slice/presentation/views/enemy_card_view.gd index f32a4f38..cab4365c 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/presentation/views/enemy_card_view.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/presentation/views/enemy_card_view.gd @@ -78,7 +78,7 @@ func _init() -> void: # data = 战斗结算 presentation_snapshot 投影:{order, display_name, hp, max_hp, enemy_id, -# pending_skill/pending_type/pending_name(摇定动作三字段), effects[](敌方增益), ambush_layers} +# pending_skill/pending_type/pending_name(摇定动作三字段), effects[](敌方增益,含警觉 ac 行)} func set_data(d: Dictionary) -> void: _name_label.text = "%s" % String(d.get("display_name", "敌人")) _hp_bar.max_value = maxi(1, int(d.get("max_hp", 1))) @@ -87,11 +87,8 @@ func set_data(d: Dictionary) -> void: _armor = String(d.get("armor_type", "light")) _armor_class = int(d.get("armor_class", 0)) set_pending(String(d.get("pending_type", "")), String(d.get("pending_skill", ""))) - # 状态行:伏击池(flat 共享池,单独通道)+ 敌方增益 percent 状态(蓄力/硬化/削弱/暴走——side-wide) + # 状态行:敌方增益状态(蓄力/硬化/削弱/暴走 percent + 警觉 ac——side-wide,八型批 2026-09-20) var parts: Array = [] - var ambush: int = int(d.get("ambush_layers", 0)) - if ambush > 0: - parts.append("伏击池 ×%d(全体共享)" % ambush) for eff in d.get("effects", []): parts.append("%s ×%d" % [String(eff.get("display_name", "")), int(eff.get("layers", 1))]) _status_label.text = " · ".join(parts) diff --git a/prototypes/dungeon-sweeper-vertical-slice/presentation/views/status_slot_row.gd b/prototypes/dungeon-sweeper-vertical-slice/presentation/views/status_slot_row.gd index f8f40061..88c92943 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/presentation/views/status_slot_row.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/presentation/views/status_slot_row.gd @@ -11,7 +11,7 @@ extends HBoxContainer const MAX_SLOTS := 4 # 极性/语义映射(数据源 = SettlementTable.effect_pool_map 效果语义 + StatusEffectTable display_name): # 益 = ▲/◆/▼/◇(金/蓝族);害 = ⚡/⚔/✕/☾/⇧/▣(旗朱族;⇧/▣ = 敌方增益威胁纹样)——形状+色相双通道, -# 文字名常驻第三通道。状态表九行全映射(attack_up/ac_up/weaken/ambush/enrage/off_guard/sapped/empower/fortify) +# 文字名常驻第三通道。状态表九行全映射(attack_up/ac_up/weaken/alert/enrage/off_guard/sapped/empower/fortify) # ——HUD框架 图标键契约"一键一枚专属纹样,查不到的键立即断言 + ? 占位 + 诊断" # (2026-09-15 格面资源批补 sapped;2026-09-16 护甲等级掷点批 defense_up → ac_up 换装; # 同日 敌人技能池批补 empower/fortify 敌方增益两键——敌方增益显示 = 敌卡状态行文本 + 本图标键词汇)。 @@ -19,7 +19,7 @@ const EFFECT_ICON := { "attack_up": ["▲", Color8(176, 122, 20), "益"], "ac_up": ["◇", Color8(46, 110, 142), "益"], "weaken": ["▼", Color8(46, 110, 142), "益"], - "ambush": ["⚡", Color8(198, 61, 34), "害"], + "alert": ["◎", Color8(198, 61, 34), "害"], "enrage": ["⚔", Color8(198, 61, 34), "害"], "off_guard": ["✕", Color8(198, 61, 34), "害"], "sapped": ["☾", Color8(198, 61, 34), "害"], @@ -30,12 +30,12 @@ const EFFECT_SEMANTIC := { "attack_up": "主角攻击加成(hero_offense 池加算)", "ac_up": "护甲等级 +1/层(掷点折扣判定阈值——AC 数值轴,受击低掷按档位打折)", "weaken": "敌方输出削弱(enemy_output 池乘算)", - "ambush": "敌方全体攻击附加(flat_attach——blast 型负向,战斗段共享不消耗)", + "alert": "敌方护甲等级 +1/层(blast 型负向——我方普通攻击掷点更易落入折扣档)", "enrage": "敌方输出加成(enemy_output 池加算——attack 型负向)", "off_guard": "主角承伤加深(hero_defense 池加算——defense 型负向)", "sapped": "主角输出降低(hero_offense 池加算——weaken 型负向)", "empower": "敌方输出 ×2(enemy_output 池加算——蓄力技施放;持续 1 个有效结算)", - "fortify": "敌方防御 +100(enemy_defense 池——硬化技施放,主角攻击折半;持续 1 个有效结算)", + "fortify": "敌方防御 −50(enemy_defense 池——硬化技施放,主角攻击 ×0.5;持续 1 个有效结算)", } const SOURCE_NAMES := {"safe_cell": "安全格", "flag_hit": "标中旗", "mine_hit": "踩雷", "clear_reward": "清图奖励"} # 未知图标键的占位纹样(HUD框架:占位也要可见,禁静默空图标) diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/damage_probe.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/damage_probe.gd index e6acc6ec..9fc6a737 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/damage_probe.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/damage_probe.gd @@ -2,7 +2,7 @@ # Date: 2026-09-13(playtest-2026-09-12 报告 Top1——零承伤根因分割探针) # 2026-09-16 改掷点口径(护甲等级掷点批):defense_up 墙已随 AC 换装退役—— # H1 旧 defense_up 叠满墙失义(hero_defense 池现仅 off_guard 正向行,×0 墙结构面消失) -# H2 Boss/敌攻击链健康:fresh 池下非蓄力拍 d_tick = max(下限, 池乘区(掷点档位基线 + 伏击附加)) +# H2 Boss/敌攻击链健康:fresh 池下非蓄力拍 d_tick = max(下限, 池乘区(掷点档位基线))(伏击附加随八型批 2026-09-20 退役) # 快照盲区说明:settlement_snapshot 取在衰减段之后,时效 1 的 ac_up 当轮授予当轮衰减—— # 真人局 JSONL buffs[] 恒空 ≠ 状态为空,本探针改从结算行(授予/续存 effect 行的 pool_value)重建战斗段时点池值。 # 观测面:全部读战斗结算步骤行 / 表值 / 呈现快照(零核心穿透);池归属/档位/下限全读表(数据配置 Rule 1——零数值字面量)。 @@ -214,7 +214,7 @@ func _analyze_round(db, math, rows: Array, beats: Dictionary) -> Dictionary: var expected: int = maxi(int(db.settlement.damage_floor), math.pool_damage(raw, pd, pe)) var roll_txt := "掷%s" % str(int(row.get("roll", -1))) var zeroed := "✓" if tick == expected else "✗ 算术不符!" - lines.append("拍=%s %s/档%d%s 基线%d→掷后%d +伏击%d hero_def=%d enemy_out=%d d_tick=%d 期望=%d %s" % [ + lines.append("拍=%s %s/档%d%s 基线%d→掷后%d 附加%d hero_def=%d enemy_out=%d d_tick=%d 期望=%d %s" % [ String(beats.get(int(row.get("round_index", 0)), "?")), roll_txt, tier, "暴击" if crit else "", baseline, rolled_base, attach, pd, pe, tick, expected, zeroed]) ticks.append({"raw": raw, "tick": tick, "expected": expected, "ok": tick == expected}) diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd index a637f546..25180d3f 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd @@ -353,7 +353,7 @@ func _smoke_armor_roll() -> void: board_ok = false # 棋盘来源(爆裂/直伤/清障炸药)必中全额——不掷不留档 check(all_positive, "全战斗流零 v=0 伤害行(伤害下限全局生效)") check(attack_ok, "hero_attack/enemy_action 伤害行掷点读数+档位随行留档(P2 归因)") - check(board_ok, "棋盘来源伤害行零掷点字段(伏击附加/爆裂/直伤/清障炸药必中全额)") + check(board_ok, "棋盘来源伤害行零掷点字段(爆裂/直伤/清障炸药/奖励即时必中全额)") # 定位种子下首场战斗第一行主角攻击伤害行(停手轮——零授予零充能,普通分量 = 攻击基线裸值) @@ -1016,7 +1016,7 @@ func _smoke_playtest_logger() -> void: minesweeper.settle_batch([{"action": "stop"}]) check(snaps.size() == 2, "每结算一快照(%d 次结算 → %d 快照)" % [2, snaps.size()]) var s1: Dictionary = snaps[0] - var required := ["kind", "level", "depth", "round", "verdict", "hero", "economy", "board", "enemies", "buffs", "ambush_layers", "round_facts", "spawn_count"] + var required := ["kind", "level", "depth", "round", "verdict", "hero", "economy", "board", "enemies", "buffs", "round_facts", "spawn_count"] var missing := [] for k in required: if not s1.has(k): @@ -1131,7 +1131,7 @@ func _smoke_attack_chain_fresh_pool() -> void: var ticks: Array = [] # {baseline, attach, roll, tier, crit, tick}——敌行动伤害行重建 settlement.step_row.connect(func(row): if row.type == "damage" and row.source_class == "enemy_action": - ticks.append({"baseline": int(row.baseline), "attach": int(row.attach), "roll": int(row.roll), + ticks.append({"baseline": int(row.baseline), "attach": int(row.get("attach", 0)), "roll": int(row.roll), "tier": int(row.tier), "crit": bool(row.get("crit", false)), "tick": int(row.value)})) check(settlement.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(_db.hero.max_hp)}), "fresh 池回归战斗启动(Boss 行)") # 停手轮:零挖掘零旗 → 零授予 → 池恒空;Boss 拍 = 开轮摇号结果(伤害技/普攻兑付伤害行、硬化施放行不计) @@ -1144,10 +1144,10 @@ func _smoke_attack_chain_fresh_pool() -> void: for t in ticks: var base_factor: float = float(t.tier) * (float(_db.settlement.crit_multiplier) / 100.0 if t.crit else 1.0) var rolled_base := int(floor(float(t.baseline) * base_factor / 100.0)) - var expected: int = maxi(int(_db.settlement.damage_floor), rolled_base + int(t.attach)) + var expected: int = maxi(int(_db.settlement.damage_floor), rolled_base + int(t.get("attach", 0))) if int(t.tick) != expected or int(t.tick) <= 0: all_full = false - check(all_full, "fresh 池非蓄力拍 d_tick = max(1, 掷点档位基线 + 伏击附加)(Boss 攻击链健康——Bug#2 回归断言)") + check(all_full, "fresh 池非蓄力拍 d_tick = max(1, 掷点档位基线)(Boss 攻击链健康——Bug#2 回归断言)") func _encounter_replay(seed_val: int) -> Array: var out: Array = [] @@ -1273,9 +1273,9 @@ func _smoke_refresh_provenance_guard() -> void: # 极性路由断言(战斗结算 验收):挖安全格/标中旗只出正向、挖雷格/标错旗只出负向、兑付行指回来源格。 # 正向字典效果集 = {attack_up, ac_up, weaken}(ac_up = 2026-09-16 护甲等级掷点批换装,原 defense_up) # + spark_aoe/heal_minor(flat); -# 负向字典效果集 = {enrage, off_guard, sapped}(percent)+ 直伤(heal flat)/ ambush(blast flat)。 +# 负向字典效果集 = {enrage, off_guard, sapped}(percent)+ 直伤(heal flat)/ alert 警觉(blast percent——2026-09-20 换装)。 const POSITIVE_EFFECTS := ["attack_up", "ac_up", "weaken"] -const NEGATIVE_EFFECTS := ["enrage", "off_guard", "sapped", "ambush"] +const NEGATIVE_EFFECTS := ["enrage", "off_guard", "sapped", "alert"] func _smoke_polarity_routing() -> void: @@ -1296,7 +1296,7 @@ func _smoke_polarity_routing() -> void: if eff != "" and not POSITIVE_EFFECTS.has(eff): safe_all_pos = false check(safe_all_pos, "挖安全格 → 只出正向兑付(效果行 ∈ 正向字典 + 每格 ≥1 行——%d 格)" % probe["safe_cells"].size()) - # 挖到的雷格:只出负向——来源行必存在且 effect 行 ∈ 负向集(ambush = blast 负向;heal 负向 = damage 行) + # 挖到的雷格:只出负向——来源行必存在且 effect 行 ∈ 负向集(alert = blast 负向;heal 负向 = damage 行) var mine_all_neg := true for e in probe["mine_cells"].keys(): var cell_arr: Array = [e.x, e.y] @@ -1391,9 +1391,9 @@ func _rows_at(rows: Array, source_class: String, cell) -> Array: # 负向字典逐型直验(类型化兑付行协议):找真实板上各型非封锁格,直调 _grant_routed 负向路由, -# 断言每型的兑付形态(enrage/off_guard/sapped 效果行、heal 直伤行、blast ambush 直授)。 +# 断言每型的兑付形态(enrage/off_guard/sapped 效果行、heal 直伤行、blast 警觉行、action 行动点排队)。 func _smoke_negative_dictionary() -> void: - print("--- 负向字典逐型直验(sapped 在位 / heal 直伤 / blast 伏击直授)---") + print("--- 负向字典逐型直验(sapped 在位 / heal 直伤 / blast 警觉 / action 行动点)---") # 数据面:sapped 行在位(状态表七行 + effect_pool_map 收编) var sapped: Dictionary = _db.status_effect_row("sapped") check(not sapped.is_empty() and String(sapped.get("target_side", "")) == "hero" \ @@ -1456,16 +1456,23 @@ func _smoke_negative_dictionary() -> void: if String(row.get("reward_id", "")) == "heal_backlash": backlash_power = int(row.power) check(hp_after == hp_before - backlash_power, "heal 型负向 → 主角直伤 %d(%d → %d,不经增益状态)" % [backlash_power, hp_before, hp_after]) - # blast:负向 = 伏击 +stacks 层直授(无上限——单轮授予上限 2026-09-20 退役;stacks 读表零字面量) + # blast:负向 = 警觉(敌方护甲等级 +1 percent 行——2026-09-20 伏击退役换装) if by_type.has("blast"): rows.clear() var snap_b: Dictionary = settlement._reward_economy.query_full_snapshot(by_type["blast"]) - var stacks: int = maxi(1, int(settlement._reward_economy.polarity_row("blast", "negative").get("stacks", 1))) settlement._grant_routed(snap_b, "negative", "mine_hit", by_type["blast"], 1) - var layers_after_first: int = settlement._status_effects.pool_layers("ambush") - check(layers_after_first == stacks, "blast 型负向 → 伏击 +%d 层(stacks=%d)" % [layers_after_first, stacks]) - settlement._grant_routed(snap_b, "negative", "mine_hit", by_type["blast"], 1) - check(settlement._status_effects.pool_layers("ambush") == 2 * stacks, "blast 型负向连发两次 → 伏击池逐层累加至 %d(无上限截断)" % (2 * stacks)) + var alert_ok: bool = false + for eff_a in settlement._status_effects.query_active("enemy"): + if String(eff_a.effect_id) == "alert": + alert_ok = true + check(alert_ok, "blast 型负向 → 警觉(敌方护甲等级 +1 状态在位)") + # action:负向 = 下轮行动点 −1 / 正向 = +1(排队,轮开始兑现——八型批 2026-09-20;确定性直验不依赖板面摇号) + rows.clear() + var d0: int = settlement.action_economy.pending_ap_delta() + settlement._grant_routed({"reward_id": "ap_drain", "cell_type": "action", "polarity": "negative", "display_name": "迟滞", "power": 1}, "negative", "mine_hit", Vector2i(0, 0), 1) + check(settlement.action_economy.pending_ap_delta() == d0 - 1, "action 型负向 → 下轮行动点 −1(排队)") + settlement._grant_routed({"reward_id": "ap_up", "cell_type": "action", "polarity": "positive", "display_name": "行动点", "power": 1}, "positive", "safe_open", Vector2i(0, 0), 1) + check(settlement.action_economy.pending_ap_delta() == d0, "action 型正负抵消 → 排队净值归零") # 资源面断言:chain/dig 事件恒携带 resource=true(雷格同权);initial 恒 false(封锁格); @@ -2007,7 +2014,7 @@ func _has_err_category(errs: Array, category: String) -> bool: # ⑦ 新效应词汇批实装探针(2026-09-19——妨害技蛛网束缚 + 毒爆必中附加分量,实装面 = L2 Boss 卓尔): -# 停手轮驱动 (2,8)——零挖掘零旗 → 零池零伏击,伤害行可逐拍精确复算;种子 hunt 至少各命一粒毒爆伤害行 +# 停手轮驱动 (2,8)——零挖掘零旗 → 零池,伤害行可逐拍精确复算;种子 hunt 至少各命一粒毒爆伤害行 # 与蛛网束缚施放行;毒分量随开战掷定的攻击基线缩放(atk 区间 2–4 → rider 1–3)。 func _smoke_debuff_rider() -> void: var venom_seed := -1 @@ -2050,7 +2057,7 @@ func _smoke_debuff_rider() -> void: # 终值精确复算(停手轮池恒空):主分量链结果 + 必中附加后置 var base_factor: float = float(int(row.tier)) * (float(_db.settlement.crit_multiplier) / 100.0 if bool(row.get("crit", false)) else 1.0) var rolled_main: int = int(floor(float(int(row.baseline)) * base_factor / 100.0)) - var expected: int = maxi(floor_v, rolled_main + int(row.attach)) + rider_v + var expected: int = maxi(floor_v, rolled_main + int(row.get("attach", 0))) + rider_v if int(row.value) != expected: venom_check_ok = false elif row.has("rider"): @@ -2070,7 +2077,7 @@ func _smoke_debuff_rider() -> void: if has_venom and venom_seed < 0: venom_seed = s check(venom_seed > 0 and venom_rows_seen >= 1, "毒爆必中附加分量种子可达(seed=%d,毒爆伤害行 ×%d)" % [venom_seed, venom_rows_seen]) - check(venom_check_ok, "毒爆伤害行逐拍精确复算:终值 = max(1, 掷点档位主分量 + 伏击附加) + 必中附加(rider 只随 rider_mult 行出现)") + check(venom_check_ok, "毒爆伤害行逐拍精确复算:终值 = max(1, 掷点档位主分量) + 必中附加(rider 只随 rider_mult 行出现)") check(snare_seed > 0, "蛛网束缚落主角:施放后掷点阈值 = 基准 AC + 失衡幅度(off_guard ac 轴端到端,seed=%d)" % snare_seed) diff --git a/tools/analyze_playtest.py b/tools/analyze_playtest.py index 8f444f38..a19e293b 100644 --- a/tools/analyze_playtest.py +++ b/tools/analyze_playtest.py @@ -20,7 +20,9 @@ 表值硬编码溯源(表值变更须同步——单一事实源仍在 .tres): · status_effects.tres:attack_up 50 / weaken −65 / enrage 25 / off_guard 25 / sapped −25(percent) - · settlement.tres:pool_clamp [-100,100] · crit_multiplier 200 · 伏击附加 = ambush 层数×3(magnitude) + · settlement.tres:pool_clamp [-100,100] · crit_multiplier 200 + · 【2026-09-20 八型批】伏击机制退役(blast 负向换装警觉=敌方 AC+1,掷点分布型,不再有 flat 附加项)—— + M_AMB 置 0 保持反事实管道兼容旧日志;新日志不再携带 ambush 效果行 · skills.tres:突刺/撕咬 1.5 · 重击 2.0 · 毒爆 2.5 · 普攻 1.0 · armor_effectiveness:pierce 克 ward 150 / heavy 50;magic 克 heavy 150 / ward 50;normal 恒 100 """ @@ -32,16 +34,16 @@ import sys # ---- 表值区(溯源见文件头) ---- POOL_CLAMP = (-100, 100) CRIT_MULT = 200 -M_AMB = 3 # ambush.magnitude:每层伏击附加伤害 +M_AMB = 0 # 伏击已退役(2026-09-20 八型批)——反事实剥除项归零,旧日志兼容读 SKILL_MULT = {"普通攻击": 1.0, "突刺": 1.5, "重击": 2.0, "撕咬": 1.5, "毒爆": 2.5} EFFECT_TEXT_MAP = { # 旧日志无 effect_id——按明细行文本反查 "增伤": "attack_up", "护甲强化": "ac_up", "削弱": "weaken", "暴走": "enrage", - "失衡": "off_guard", "乏力": "sapped", "伏击": "ambush", "蓄力": "empower", "硬化": "fortify", + "失衡": "off_guard", "乏力": "sapped", "警觉": "alert", "伏击": "ambush", "蓄力": "empower", "硬化": "fortify", } EFFECT_CN = {v: k for k, v in EFFECT_TEXT_MAP.items()} # effect_id → 中文显示名 # 正负分类(奖励件 / 惩罚件的口径——数据分析的三维度共用) POS_NAMES = {"增伤", "护甲强化", "削弱", "群伤", "回复", "清障炸药"} -NEG_NAMES = {"暴走", "失衡", "乏力", "伏击", "踩雷直伤"} +NEG_NAMES = {"暴走", "失衡", "乏力", "伏击", "警觉", "踩雷直伤"} POOL_OF = {"attack_up": "hero_offense", "sapped": "hero_offense", "off_guard": "hero_defense", "weaken": "enemy_output", "enrage": "enemy_output", "empower": "enemy_output", diff --git a/tools/clear_dominance_audit.py b/tools/clear_dominance_audit.py index 3fed0765..876714bc 100644 --- a/tools/clear_dominance_audit.py +++ b/tools/clear_dominance_audit.py @@ -40,7 +40,10 @@ AC_UP_POINT = 1 # 护甲强化 +1 AC,duration 1 WEAKEN_PCT = 65 # 削弱 −65%(有效拍 1:duration 2 先兑付后衰减) ENRAGE_PCT = 25 # 暴走 +25%,enemy 侧 side-wide SAPPED_PCT = 25 # 乏力 −25%,hero 侧 -AMBUSH_MAG = 1 # 伏击 +1 flat/层(2026-09-17 压缩批 3→1) +# 【2026-09-20 八型批口径注记】伏击机制退役,blast 负向现况 = 警觉(敌方 AC +1,掷点折扣分布型惩罚)—— +# 本脚本的伏击暴露当量模型(AMBUSH_MAG/AMBUSH_STACKS)转为历史口径,仅用于旧读数复算; +# 新口径(掷点折扣期望建模)归曲线调参批重立后再改模型。 +AMBUSH_MAG = 1 # 历史口径:伏击 +1 flat/层(2026-09-17 压缩批 3→1) AMBUSH_STACKS = 2 # reward.tres ambush_double stacks(每雷伏击层数) OFF_GUARD_AC = 2 # 失衡 AC −2(2026-09-18 换装)