From 43129987542485f835def3c92ad9d35267981314 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 24 Sep 2026 03:56:05 +0800 Subject: [PATCH] =?UTF-8?q?docs(battle-settlement):=20=E6=88=98=E6=96=97?= =?UTF-8?q?=E7=BB=93=E7=AE=97=20v0.24=E2=80=94=E2=80=94=E4=BC=A4=E5=AE=B3?= =?UTF-8?q?=E5=8D=95=E6=8D=AE=E4=B8=8E=E4=BC=A4=E5=AE=B3=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=99=A8=E6=88=90=E6=96=87=EF=BC=88=E4=BA=94=E9=85=8D=E6=96=B9?= =?UTF-8?q?=E5=B0=81=E9=97=AD+=E7=BB=93=E8=B4=A6=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=E5=8F=8C=E6=A8=A1=E5=BC=8F+=E6=AD=BB=E4=BA=A1=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=EF=BC=8CREADME=20=E4=BF=AE=E6=94=B9=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=EF=BC=8C2026-09-24=20=E5=8F=B0=E8=B4=A6=2014?= =?UTF-8?q?8=20=E6=89=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/systems/战斗循环/战斗结算.md | 28 ++++++++++++++++++- .../dungeon-sweeper-vertical-slice/README.md | 8 ++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/design/gdd/systems/战斗循环/战斗结算.md b/design/gdd/systems/战斗循环/战斗结算.md index e8fa6872..518c9b84 100644 --- a/design/gdd/systems/战斗循环/战斗结算.md +++ b/design/gdd/systems/战斗循环/战斗结算.md @@ -137,6 +137,8 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × | 旗判定批 | 标中则兑该雷格资源的正向,每颗雷的资格只兑一次;标空则记"标旗未中"归因行,并兑该安全格资源的负向 | | 清图批 | 清图奖励对象恰好发一次;完美排雷追加第二份同身份兑付 | +授予段内的伤害兑付(爆裂、直伤、反噬)以伤害单据入队,攒到授予段尾统一结账;清图批为段内同步结账点——开单前段内排队单先按开单序兑现(见[伤害单据与伤害控制器](#伤害单据与伤害控制器所有伤害走同一道门)一节)。 + **充能已退役(2026-09-19 用户拍板)**:原"挖格/标中旗给充能计数 → 战斗段折算穿刺/魔法分量"的弹药系统整体移除——主角攻击回归单分量,克制策略归冒险前配置(主角 attack_type 表值,营地换型 = 改字段;未来冒险前参数面承接策略位)。攻防两条抽象分离纪律保留:攻击类型是伤害的属性轴,棋盘事实只是奖励触发源。 | 兑付形态 | 覆盖 | 兑付方式 | 拒绝语义 | @@ -159,9 +161,31 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × 举证:兑付数值全部读配置表,本节无新公式;完美乘数的入账换算见收益对照表一节。 +### 伤害单据与伤害控制器:所有伤害走同一道门 + +游戏里的每一份伤害——主角先手、敌方技能、穿刺弹/魔法矢、爆裂粉尘与清障炸药、陷阱反噬、地形变异——都是一张**伤害单据**:它自己声明这是一份什么伤害,然后交由**伤害控制器**按唯一管线兑现。单据九个栏目:兑付配方(唯一分派键)、来源类别 + 来源格 + 轮次(明细行归因三件)、显示名、通道(战斗段 / 棋盘兑付——声明栏)、攻击类型(普通 / 穿刺 / 魔法 / **无类型**——无类型恒不查克制矩阵,是群伤、反噬与地形变异的常态而非缺漏)、威力基数、目标规则、必中附加分量。兑付配方封闭枚举为五种: + +| 兑付配方 | 覆盖来源 | 管线步序 | +|---|---|---| +| 主角先手 | 战斗段主角攻击 | 掷点 → 折扣/暴击 → 克制点数 → 主角输出×敌方防御两池乘区 → 下限 → 交付 | +| 敌方伤害技 | 战斗段敌方技能(含普攻) | 掷点 → 折扣/暴击 → 克制恒中性 → 主角防御×敌方输出两池乘区 → 下限 → +必中附加 → 交付 → 执行上报 | +| 单目标克制直伤 | 穿刺弹 / 魔法矢正向 | 必中全额,克制点数进加法核,下限保底 | +| 群伤 | 爆裂粉尘 / 清障炸药 | 无类型恒定表值,全体存活敌逐个交付 | +| 主角直伤 | 陷阱反噬 / 治疗负向 / 地形变异 | 无类型必中,下限保底 | + +职责分界一句话:**流程决定何时开单、给谁开单;控制器决定一张单经过哪几步。** 战斗结算保留全部开单守卫(主角存活且场上有敌才开先手单、主角倒下停开敌方单),掷点、折扣、暴击、克制点数、池乘区、伤害下限、交付与执行上报的算术和次序全部收口控制器单点——未来新增伤害来源 = 填一张单,新增管线环节 = 控制器一处改动,不再逐调用点各写各的管线。 + +**目标在结账时刻解析**:单据只带目标规则(最前存活敌 / 主角 / 全体存活敌),兑现那一刻照规则看现场——前面兑付打死的敌人不会接住后面的单,开单时也不把目标写死在单上。 + +**死亡事件由单位自行宣布**:单位生命归零的那一刻自己发出死亡事件(不由流程代查、不由控制器推断)。怪死 → 队列中该敌为来源的未结单据作废(死亡即不动手——静默零行、不进冷却、不进保底计数,同既有口径);主角死 → 兑付终止、余单作废,Game Over 仍归判定段的生命读数路径。 + +**结账时机双模式(结构位,非调参项)**:单据开出后何时兑现由控制器政策承载。现行 = **段界结账**:授予段的伤害单攒到授予段尾统一兑现;清图批是段内同步结账点——开单前先按序结清段内排队单、随后即开即结(完美第二份与高光份数的流程依赖需要同步读数);战斗段的单攒到战斗段尾统一兑现。保留位 = **开单即结**:提交当场兑现,逐位等价 2026-09-24 之前的行为,作回切结构位。两模式同种子同操作均逐位复现(兑现次序 = 开单次序);同一输入在两模式下结果可不同(兑现时机的语义差异),历史基线读数以段界结账口径为准。切换 = 改控制器政策常量,走代码修订不走调参。 + +举证:本节为管线编排约定,无新计算;掷点、折扣、克制与池乘区的算术口径见战斗段一节。 + ### 战斗段与胜负判定:谁先动手、怎么扣血、怎么定胜负 -战斗段是兑现的最后一刀。主角的基础攻击恒存在——这是项目拍板:若基线为零,百分比增益乘上去永远是零,增益系统就空转了。攻击力域 [1, 999]、0 于加载期拒绝,行值读主角表。顺序固定:主角先手攻击顺位最前的存活敌人,随后按行序逐个存活敌人按本拍摇定技能还手;每个敌人依次走"按技能行兑现、结算伤害、执行上报(技能进冷却 + 保底计数)"三步且恰行动一次,主角不在其列。主角中途倒下,剩余敌人全部停手,直接进判定段。 +战斗段是兑现的最后一刀。主角的基础攻击恒存在——这是项目拍板:若基线为零,百分比增益乘上去永远是零,增益系统就空转了。攻击力域 [1, 999]、0 于加载期拒绝,行值读主角表。顺序固定:主角先手攻击顺位最前的存活敌人,随后按行序逐个存活敌人按本拍摇定技能还手;每个敌人依次走"按技能行兑现、结算伤害、执行上报(技能进冷却 + 保底计数)"三步且恰行动一次,主角不在其列。主角中途倒下,剩余敌人全部停手,直接进判定段。本段只开单——主角先手单与逐敌伤害技单攒到战斗段尾统一结账(见[伤害单据与伤害控制器](#伤害单据与伤害控制器所有伤害走同一道门)一节);施放技不涉伤害、照旧当场落行。 **开轮摇号与敌方技能兑现**(2026-09-16 敌人技能池批):敌人每拍做什么由开轮摇号决定——每轮轮次开始时,本系统在换算层排除冷却中技能,按行序逐敌从 `behavior_roll` 封闭流的独立子流摇定本拍动作写入实例池(首轮同样摇号;每轮恰摇一次;轮内刷新换图不重摇),随后冷却递减。摇定后、兑现前死亡 → 本拍技能作废、不动手(死亡即不动手)。结算战斗段只按技能行兑现:伤害技走三乘法链(见下),增益技记一行施放行并把状态效果按技能行持续回合挂入[增益状态](增益状态.md)容器——0 伤害动作不掷不折。池模板、技能行、冷却与保底语义归[敌人系统](敌人系统.md)(引用不转述)。 @@ -327,6 +351,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 - 可回放(封闭随机流口径):同种子同输入两遍步骤流逐位复现;随机消费仅限七处封闭随机流——开战掷骰(初始化随机)、技能摇号 `behavior_roll`(回合内、开轮时点、步骤流之外)、护甲等级掷点 `armor_roll`(回合内、步骤流之内)、奖励格摇号 `reward_roll`(初始化、装板期)、变异布置 `variant_place`(初始化、装板与资源预分配之后)、换板棋盘生成 `board_gen`(初始化、清图轮换板时点)、战斗结束掉落掷定 `gp_drop`(出口随机、战斗结束分支),无未登记随机源、零界面等待;单敌出招轨迹可独立复放、互不穿插。 - 无来源即炸:每行明细都能指回一个来源事实(棋盘格、单位、清图或段级结论);找不到来源即断言失败,行型与来源类别两层豁免清单见明细流水一节,豁免行仍受其它契约约束。 - 行型封闭:流水只出现本文登记的 9 类行型;新增或下线行型必须走本文修订并同步呈现层行格式化,未登记行型不得落行。 +- 伤害单据管线(2026-09-24):全部伤害(主角先手、敌方伤害技、棋盘克制直伤、群伤、反噬、地形变异)经伤害控制器单据管线兑现,兑付配方封闭五种;目标在结账时刻照规则解析;死亡事件由单位自行宣布——怪死其未结单据作废(零行、不进冷却不进保底计数)、主角死兑付终止;段界结账为现行口径、开单即结为回切结构位,两模式各自同种子同输入逐位复现。 ## 待办 @@ -359,3 +384,4 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 | v0.20 | 2026-09-20 | **伏击单轮上限删除批(用户拍板——与 敌人系统 / 地图战斗资源 / 难度曲线与Boss / registry / 切片代码同批)**:① 行型协议 10 类→9 类——溢出未生效行下线(唯一发射源 = 伏击上限截流,上限删除后零发射面);② 授予段伏击加层改直授无上限(反灾难护栏退役——一轮踩雷数由行动点预算天然封顶);③ 核验清单伏击守恒条改伏击池共享;④ 切片同批:enemy.tres 12 行字段删除、敌表校验/编排器截流/单位容器 F3 计划函数/日志视图 overflow 格式化删除、冒烟 blast 负向断言改直授累加(330 项 0 失败) | | v0.21 | 2026-09-20 | **格面资源八型批(用户拍板——与 敌人系统 / 地图战斗资源 / 行动经济 / registry / 切片代码同批)**:① 三乘法链与敌方技能攻击公式删伏击附加项及其"后置加法不进乘区"解释短语(rider 保留);② 授予段兑付表 blast 负向换装警觉加层(enemy_alert → alert 行)+ 新增 action 型行动点修正行(queue_ap_delta 排队、下一轮开始兑现、下限 0、明细记 effect_id=ap_delta);③ EV flat 类枚举伏击→行动点;④ 呈现快照两处伏击层数拆除(警觉并入敌方增益 effects 投影);⑤ 棋盘来源必中枚举去伏击(两处);⑥ 核验清单伏击池共享改警觉共享 | | v0.23 | 2026-09-20 | **GP+商店房批(用户拍板——与 关卡节点地图 v1.1 / 冒险结构 v0.5 / 地图战斗资源 v0.15 / 难度曲线与Boss v0.18 / registry / 切片代码同批;版本号注记:v0.22 已被充能退役批占用,表尾顺延)**:① 呈现只读面表 battle_finished 载荷 +gp_dropped(掉落掷定 + 关级加值 + 战斗内缓冲的合计——字段增删走本文修订条款兑现);② 授予段兑付形态表新增 GP 缓冲行:gp 正/负向(金币袋 / 破财——九型批)兑付 = 战斗内 GP 缓冲 ±power,战斗完成统一上抛入钱包账本(账本归冒险结构),战斗域零钱包状态;③ 随机口径六处→七处:战斗结束掉落掷定消费 `gp_drop` 封闭流(出口随机、步骤流之外);九型字典措辞与验收标准可回放条目同步 | +| v0.24 | 2026-09-24 | **伤害管线单据化批(用户三裁决——与切片代码同批,06 台账 148)**:新增「伤害单据与伤害控制器」一节——伤害对象抽象补全:五族伤害来源收口伤害控制器单点管线、兑付配方封闭五种;三裁决落文——①结账时机双模式(现行 = 段界结账:授予段尾 / 清图批同步点 / 战斗段尾;开单即结保留为回切结构位,切换走代码不走调参)②目标结账时刻照规则解析③死亡事件由单位自行宣布(怪死其未结单据作废、主角死兑付终止);授予段兑付与战斗段两节补结账时点句;验收标准 +伤害单据管线条目。切片同批:`core/damage_controller.gd` 新建(单据构造/开单/结账/死亡事件消费/管线算术收口)、battle_orchestrator 六调用点改开单、掷点/折扣/克制/池乘/攻击行文本助手迁出(`_defender_ac`/`_clamped_pool` 留薄委托)、unit_container 增 `unit_died` 信号;冒烟 557 项 0 失败双模式全绿 + A/B 对拍四配置全确定且真实分岔(行数恒等、纯次序位移);历史基线读数自本批起以段界结账口径为准(重测归曲线调参批) | diff --git a/prototypes/dungeon-sweeper-vertical-slice/README.md b/prototypes/dungeon-sweeper-vertical-slice/README.md index 4f5a10ad..0ec0e54b 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/README.md +++ b/prototypes/dungeon-sweeper-vertical-slice/README.md @@ -542,3 +542,11 @@ Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://smoke/s **技术面**:`data/tables/meta.tres` 四行族(forge_products / boss_keystone / workshop_items / conversion)+ `core/meta_progression.gd` 账本服务(Core 层零 UI 零信号);SaveManager.apply_adventure_summary 增第二参 boss_drops(缺省 [] 零行为兼容,摘要元素附副本);AdventureRunner.start_adventure 增 params.hero_override(缺省全零 = 白板)→ LevelRunner base_override。**数值全 provisional 归元进度设计批配读数**(骨架先行先例 = GP+商店房批)。 **验证**:冒烟 522→549 项 0 失败三闸全过(表结构 +4 / 定价与购买 +7 / 注入与白板 +8 / 入账工坊摘要 +8);四探针全 PASS(ui_probe 营地开合/禁用态、click_probe 营地购买合成点击全路径——隔离存档换注保确定性,禁碰真实档);白板成立 = 空参数 = 零强化参数 = 纯表值三轴逐位一致。 + +## 2026-09-24 伤害管线单据化批(伤害对象抽象补全——伤害控制器统一入口) + +**架构面**:伤害此前无对象抽象——五族伤害来源(主角先手 / 敌方伤害技 / 棋盘克制直伤 / 群伤 / 反噬地形)在战斗编排器内各自内联组装管线。本批新建 `core/damage_controller.gd`(伤害单据 + 唯一兑付管线):九栏单据、五种兑付配方封闭枚举;battle_orchestrator 六调用点退化为开单点(流程决定何时开单给谁开单,单据怎么算归控制器),掷点 / 折扣 / 暴击 / 克制 / 池乘区 / 下限 / 攻击行文本算术全部迁入控制器(`_defender_ac` / `_clamped_pool` 留薄委托供快照面与冒烟白盒直呼);unit_container 新增 `unit_died` 死亡事件信号(单位自行宣布死亡——怪死其未结单据作废〔死亡即不动手〕、主角死兑付终止,Game Over 仍归判定段读数)。 + +**结账时机双模式(2026-09-24 用户三裁决之二三)**:目标 = 结账时刻照规则看现场解析(最前存活敌 / 主角 / 全体存活敌),开单不冻结对象;现行 = 段界结账(授予段尾 / 清图批同步点 / 战斗段尾统一兑现),开单即结保留为回切结构位(控制器 policy 常量一行切回=逐位还原迁移前行为)。同一输入两模式结果可不同(兑现时机语义差异),历史基线读数自本批以段界结账口径为准(重测归曲线调参批)。 + +**验证**:冒烟 557 项 0 失败双模式全绿三闸过;A/B 对拍探针四配置(L1/L2 × 双种子)两模式各自同种子逐位确定、四配置全部真实分岔(行数两两恒等、纯次序位移——分岔面 = 伤害行攒批位移与治疗满血判定时机,符合段界结账语义);三场景探针全 PASS。设计权威 = 战斗结算.md v0.24「伤害单据与伤害控制器」节。