diff --git a/design/gdd/01-核心循环.md b/design/gdd/01-核心循环.md index 4d8434a3..4fe12f48 100644 --- a/design/gdd/01-核心循环.md +++ b/design/gdd/01-核心循环.md @@ -13,6 +13,12 @@ 所以自动战斗不是过场,是阅卷:每一行结算都能指回你刚才的哪一步棋。 +### 数值语言(2026-09-18 用户拍板) + +- 游戏内伤害与成长数值一律**整数加减**(小整数加法核——模板 C 骨架 + 模板 A 成长语言):克制修正、奖励、商店与永久强化的属性提升都走"+1/−1 点"式整数;数字小而可读是设计价值,不是待放大的占位。 +- **百分比仅保留三处既有粗档修正**(增益池乘区、护甲等级掷点折扣档、暴击倍率)与开发侧测量工具(难度杠杆扫描、通关率带平移);此后新增数值系统默认整数加法,引入百分比须显式修订本条款。 +- 全局向下取整(round_direction = floor)不变;整数刻度下的档位粒度以"1 点"为单位设计,避免名义百分比与实际取整值脱钩。 + ## 一场冒险:关卡串起来的下探 战斗串成关卡,关卡串成冒险: diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index b08397bd..f3a2778b 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -1,36 +1,43 @@ # 06-待办清单 -本清单是全项目待办事项的**唯一登记处**:各系统文档不再自建「待办」条目节,只留一行指路存根;新增待办事项一律直接登记本清单。条目按四个循环分组,组内按系统分节;每条事项一个四级标题,其下用粗体属性名成段——**现状**(现状与失义原因,自各系统文档原样搬运、措辞不改;跨文档重复条目合并为一条,登记在建议归属主责方名下,其余来源在现状中注明出处;相关但不同面的条目各自保留,现状末尾互相指认;搬运时仅将原文中的「本文 / 本系统」替换为对应系统名,并把相对链接改写为本文件位置可用的路径)、**归属**、**状态**。事项解决后**不删除**:把「状态」改为"已解决(<日期>)"并注明去向,留痕。 +本清单是全项目待办事项的**唯一登记处**:各系统文档不再自建「待办」条目节,只留一行指路存根;新增待办事项一律直接登记本清单。条目按四个循环分组,组内按系统分节;每条事项一个四级标题,其下用粗体属性名成段——**现状**(现状与失义原因,自各系统文档原样搬运、措辞不改;跨文档重复条目合并为一条,登记在建议归属主责方名下,其余来源在现状中注明出处;相关但不同面的条目各自保留,现状末尾互相指认;搬运时仅将原文中的「本文 / 本系统」替换为对应系统名,并把相对链接改写为本文件位置可用的路径)、**归属**、**状态**。事项解决后**从本清单移除**(2026-09-18 用户拍板改口径,原"改状态留痕"废止):去向与依据登记当批台账与 active.md 快照,git 历史即留痕。 ## 排雷循环 ### 棋盘生成 -#### board_biome 图类型标签词表未定稿 -**现状**:现行值只有占位 {"dungeon"}(provisional):标签词表尚未定稿,定稿前只校验非空,定稿后补域校验;这组标签是表现侧换色板与[地图战斗资源](systems/战斗循环/地图战斗资源.md)图类型差异化插槽的数据源。来源:正文 provisional 标注 +#### 插旗不可逆提案(禁拔旗 + 挖旗格兑付改判) -**归属**:棋盘生成定稿批 +**现状**:2026-09-18 用户提案,登记在案、未评估未拍板。现行口径旗可逆([排雷玩法](systems/排雷循环/排雷玩法.md)):挖已插旗的格被拒(须先按价拔旗、再按价挖);标旗后当轮又撤旗的经战斗结算抵消过滤不进兑付(零兑付、行动点不返还)——插错旗合计 3 点行动点即全额反悔,且仍拿到挖开安全格的正常格面奖励。提案把旗改为**一次性承诺**:① 插旗后不可再拔旗(拔旗动作退役);② 已插旗的格允许直接按价挖开,但兑付改判。四种枚举情况: +- 插旗落在雷格、无后续操作:标中照常,结算获得插旗奖励(现行不变); +- 插旗落在雷格、后续花行动点挖开:只受挖雷一层惩罚(惊动巢穴照常兑付),标中奖励不发; +- 插旗落在安全格、无后续操作:标空惩罚照常(现行不变); +- 插旗落在安全格、后续花行动点挖开:既无标空惩罚、也无该格资源奖励——插错旗的反悔从「3 点行动点全额反悔且保留奖励」变为「2 点行动点换零惩罚零奖励」,代价结构由「多花一遍拔旗钱」改为「放弃该格收益」。 -**状态**:待办 +**开放问题(评估前须过)**:① 挖开已插旗的格与连锁展开的交互——是否照常触发 0 格连锁;旗保留「遇旗即止」的链阻断器用途,但不可回收后临时阻断从可逆(插旗加拔旗两笔)变一次性(只插一笔),链阻断玩法的成本结构变化是否接受;② 「插过旗的格兑付降级」在战斗结算的统一表达口径——雷格侧标中不发与安全格侧资源奖励不发,是否归并为同一规则(旗格挖开、奖励资格作废);③ 行动经济「标中旗锚」契约量级是否随插旗风险面变大(不可反悔)而重校;④ 连带面清单——排雷玩法动作表与拒绝原因清单(「须先拔旗」原因退役)、行动经济价目表 flag_pull_ap_cost 行与「资格认雷格实例:拔掉重插」约束措辞、HUD 框架旗交互与教学口径。 + +**归属**:[排雷玩法](systems/排雷循环/排雷玩法.md)修订批(主责),[行动经济](systems/排雷循环/行动经济.md)与[战斗结算](systems/战斗循环/战斗结算.md)共裁 + +**状态**:待办(2026-09-18 用户提案登记,未评估) ### 行动经济 #### 拔旗定价复核 -**现状**:拔旗 1 点是否为正确定价,旧体系留了实测义务(原型补丁验证),至今未执行 +**现状**:拔旗 1 点是否为正确定价,旧体系留了实测义务(原型补丁验证),至今未执行。关联条目:见排雷玩法「插旗不可逆提案(禁拔旗 + 挖旗格兑付改判)」(2026-09-18 用户提案——提案落地则拔旗动作整体退役,本条实测义务随之失义收编;提案被否则本条维持) **归属**:行动经济(原型补丁验证) **状态**:待办 -#### 刷新经济性监控 +#### 刷新经济性监控(基线后定阈值) -**现状**:挖掘期当场刷新无结算发生,"弃图率 / 刷新率"预警阈值如何与调参联动复核,未定 +**现状**:纯日志侧监控(不影响玩家体验):弃图率 / 每轮刷新率入试玩日志即可,预警阈值须有基线读数才能定——随验收读数重测批一起出基线,阈值数字届时与调参联动复核 -**归属**:行动经济(与调参联动复核) +**归属**:行动经济(阈值数字归调参批,与验收重测联动) -**状态**:待办 +**状态**:待办(口径已定案 2026-09-18:日志侧先行,阈值等基线) ### 地形变异 @@ -58,16 +65,13 @@ **状态**:待办 -#### 变异对初始展开(开局免费点开区域)的影响语义 +#### 变异格对初始展开的影响语义 -**现状**:2026-09-18 用户拍板:雾格移除后变异体系暂缓,本项挂起随首批变异定稿一并迭代。两件挂账——① 数据层残留一处「带变异的 0 格不参与初始展开传播」分支(board_data.gd,变异表为空从未触发),与排雷玩法规则层的展开实现口径分裂(规则层不看变异);② 变异格该不该影响开局免费展开、影响规则是什么,未定稿。届时二选一:删死分支对齐「零特判」纪律,或在文档登记该行为为正式语义 +**现状**:2026-09-18 用户拍板两件挂账之一已清偿——board_data.gd「带变异的 0 格不参与初始展开传播」死分支已删(与排雷玩法展开实现口径归一,冒烟 300 项全绿;变异定稿批按正式语义重接)。剩余面:变异格该不该影响开局免费展开、影响规则是什么,未定稿,随首批变异定稿批一并裁决(变异体系暂缓中) **归属**:地形变异首批类型定稿批 -**状态**:待办 - -### 魔法道具 - +**状态**:待办(死分支已清偿,语义裁决随变异定稿批) #### 显影尘效果重定 **现状**:原效果"显影"为恢复雾下推理原料(雾格数字显影,时效本图持续);雾格已于 2026-09-14 从设计中移除(见[不做清单](05-不做清单.md)),效果整体失义。名称按登记保留,不另起名 @@ -108,6 +112,14 @@ **状态**:已解决(2026-09-17)——用户拍板切片期道具内容整批后置:切片期道具掉落面不存在(六件均不入掉落池,掉落频率归战斗奖励侧);失义两件的投放去留随魔法道具内容批重开时一并裁决(排垂直切片收尾后) +#### 探宝罗盘效果重定——两方案评估(2026-09-19 立项) + +**现状**:探宝罗盘现行效果 = 预读 3×3 窗口内未开格的奖励身份;未开格微光方案拍板(2026-09-18,见[待办清单](../../06-待办清单.md)「未开格类型徽章呈现时机」)后,其信息价值被常显色光覆盖,效果需重定。用户 2026-09-19 立两方案评估:**方案一(色光永久化路线)**——周围 8 格类型色光作为基础常显能力人人永久享有,预读即常态,罗盘原效果彻底失义、需另找定位或退役;**方案二(可选天赋路线)**——探宝罗盘这类预测型秘宝改造成可选天赋/增强件(黑帝斯塔罗牌式:拿不拿、如何组合构成构筑面),预读从"道具一次性效果"变"天赋增强效果"。两方案不互斥(色光为基础、天赋在其上叠加更强预读),评估时一并考量。 + +**归属**:魔法道具内容重定批(排垂直切片收尾后) + +**状态**:待办(2026-09-19 用户立项,两方案在案) + ## 战斗循环 ### 战斗结算 @@ -128,21 +140,7 @@ **状态**:待办 -#### 连锁批量奖励的溢出处理 -**现状**:一条大连锁给出的奖励超出叠层上限时如何处理未定(现行按显式接受、零补偿执行)——战斗结算原登记。同事项另两处登记合并于此:地图战斗资源「连锁批量兑付的溢出吸收」——一条大连锁一次给出大量正向兑付,超出增益叠层上限时如何处理(折算、顺延或显式接受)未定;排雷玩法「连锁批量奖励的溢出吸收」——一条大连锁一次给出大量奖励资格,超出增益叠层上限时如何处理(折算、顺延或显式接受)未定 - -**归属**:战斗结算与[地图战斗资源](systems/战斗循环/地图战斗资源.md)条目化共裁,[增益状态](systems/战斗循环/增益状态.md)随叠层上限语义共裁(三处建议归属并集) - -**状态**:待办 - -#### 充能奖励的正式归属 - -**现状**:充能(按攻击类型分桶的附加伤害储备)现作为奖励定义暂存结算表 `charge_grants`(触发源 → {attack_type, per_unit, cap});奖励的正式载体([地图战斗资源](systems/战斗循环/地图战斗资源.md) 的奖励类别 / 效果面,或数据配置的独立奖励定义表)未定——定稿前由战斗结算代管 - -**归属**:[地图战斗资源](systems/战斗循环/地图战斗资源.md)与战斗结算共裁,键位随定稿批迁移 - -**状态**:待办 #### 护甲等级掷点形式与数值域 @@ -194,13 +192,6 @@ **状态**:待办 -#### 标错惩罚的数值 - -**现状**:[排雷玩法](systems/排雷循环/排雷玩法.md)已登记:控制失败(标空)的惩罚候选"敌方伏击 +1"未定案;落地前标空只判不中 - -**归属**:数值归敌人系统,兑付归[战斗结算](systems/战斗循环/战斗结算.md) - -**状态**:待办 #### 同深度第二敌种与精英 / Boss 编码位 @@ -210,13 +201,6 @@ **状态**:部分收口(2026-09-17)——同层多遭遇问题已由关卡节点地图 v1.0 的**节点编号升级**消解(`node_depth` 语义 = 关卡内唯一节点编号,同层不同节点各查各行,键结构零改动);**不设精英 / Boss 编码位**(Boss = 最大编号节点,精英 P2 内容承载)。剩余面继续待办并改归属:同场多敌种(同一编号行集多行)的行集校验放开 + 混编遭遇伏击上限取值口径——归属**敌人表行集多行批(战斗侧,排技能池实施批落地后)** -#### 敌方攻击区间的正式侧落文 - -**现状**:registry 已登记攻击基线区间(开战掷定、整战持久),归档文档未含此字段;正式侧文档与 registry 修订批随对应 ADR 同批待落 - -**归属**:数据配置接口漂移通道 - -**状态**:待办 #### 护甲等级(armor_class)行值未定 @@ -266,6 +250,7 @@ **状态**:待办 + #### 第二关技能池与投放 **现状**:第二关生效前提 = 深度轴行值填齐(关联条目:冒险循环「第二关深度轴行值未填充」);池内容(新技能/新敌种池)随投放批定,投放节奏归难度曲线 @@ -282,6 +267,14 @@ **状态**:待办 +#### Alpha:全怪物技能池数值验证与合理性设计 + +**现状**:2026-09-19 用户立项。背景:切片期技能池只保证正常游玩(用户裁示——卓尔池无增益技、文档池构成表缺 L2 行等候选缺漏不做当期修复,后续可能对全怪物技能池整体重设计);本条 = Alpha 版本时对**所有怪物**的技能池做一次完整的数值验证与合理性设计。范围:池构成与权重、技能倍率与冷却、保底 M 与冷却递减、EV 期望与关间台阶、克制的技能面覆盖;**含技能倍率在小整数基线下的取整抖动复核**(×1.5 遇奇数攻击基线出半点、现行 round 处理——与甲效矩阵"假粒度"论证同族,轻量版);含本批两候选缺漏的复核(卓尔池增益技去留、敌人系统文档池构成表补 L2 行)。若技能池届时整体重设计,本验证以重设计后的版本为准。 + +**归属**:难度曲线与Boss(数值验证主责)与[敌人系统](systems/战斗循环/敌人系统.md)(池设计共裁);时点 = Alpha,随验收读数重测批同窗口执行 + +**状态**:待办(2026-09-19 用户立项) + ### 增益状态 #### 叠层不续命的读感 @@ -326,13 +319,7 @@ **状态**:已解决(2026-09-17)——渠道拍板 = **节点奖励**([关卡节点地图](systems/冒险循环/关卡节点地图.md) v1.0):奖励节点兑付 = 获得一件功能道具并进入持有域;道具内容、持有域归属与使用窗口语义归[魔法道具](systems/排雷循环/魔法道具.md)内容重定批(排垂直切片收尾后);切片期道具内容整批后置,奖励节点零兑付直通为合法空态(本系统结构位衔接维持) -#### 资源预读与推理的边界 -**现状**:预读允许到什么深度未定:[不做清单](05-不做清单.md)裁定未开格不显示奖励身份、允许恢复推理原料类道具;现役预读道具探宝罗盘(预读 3×3 窗口内未开格的奖励身份,归[魔法道具](systems/排雷循环/魔法道具.md))为窄域,未开格类型图标常显与推理保护之间的界线待拍板 - -**归属**:[魔法道具](systems/排雷循环/魔法道具.md)定稿批与[HUD 框架](systems/表现与支撑/HUD框架.md) - -**状态**:待办 #### heal 负向直伤的量级锚 @@ -344,7 +331,7 @@ #### 雷格与安全格的资源分布差异化(Alpha 批) -**现状**:现行雷安同池——安全格与雷格从同一类型池、同一权重分布摇定类型身份(结构冻结项,地图战斗资源 v0.4 七项之一)。用户 2026-09-17 拍板要做这件差异化的事,定位 **Alpha 版本**上线;垂直切片期先「把游戏做完整」不动结构(读数基线刚被护甲换装+技能池批与数值压缩批归零,验收重测与真人试玩未跑)。调研底座已交付:[proposal-reward-cell-differentiation-2026-09-17.md](../research/proposal-reward-cell-differentiation-2026-09-17.md)——三条候选路径(双池切分〔旧提案 mine_cell 有成案可翻〕/ 单池双列 weight_mine / 修饰位摇后过滤);差异化必破「雷安同池」冻结项、走 GDD 修订流程(用户已明示冻结约束执行侧不约束 owner,允许下破冻结即合法修订);纯权重调整零破冻结但有 9 处连带同步位(含 2 处 v0.7 漏网过期注释实证);外部无「同池不同权」中间态先例。关联条目:见本节「冒险前资源配比预设(构筑提案)」(2026-09-18 登记的玩家侧分布控制权提案——同为类型分布语义的结构修订,立项时评估合并) +**现状**:现行雷安同池——安全格与雷格从同一类型池、同一权重分布摇定类型身份(结构冻结项,地图战斗资源 v0.4 七项之一)。用户 2026-09-17 拍板要做这件差异化的事,定位 **Alpha 版本**上线;垂直切片期先「把游戏做完整」不动结构(读数基线刚被护甲换装+技能池批与数值压缩批归零,验收重测与真人试玩未跑)。调研底座已交付:[proposal-reward-cell-differentiation-2026-09-17.md](../research/proposal-reward-cell-differentiation-2026-09-17.md)——三条候选路径(双池切分〔旧提案 mine_cell 有成案可翻〕/ 单池双列 weight_mine / 修饰位摇后过滤);差异化必破「雷安同池」冻结项、走 GDD 修订流程(用户已明示冻结约束执行侧不约束 owner,允许下破冻结即合法修订);纯权重调整零破冻结但有 9 处连带同步位(含 2 处 v0.7 漏网过期注释实证);外部无「同池不同权」中间态先例。关联条目:见本节「冒险前资源配比预设(构筑提案)」(2026-09-18 登记的玩家侧分布控制权提案——同为类型分布语义的结构修订,立项时评估合并);另见[关卡节点地图](systems/冒险循环/关卡节点地图.md)「冒险循环内成长提案(临时资源 GP + 商店房节点)」(2026-09-18 登记——GP 格面枚举同为奖励身份词汇的结构修订,立项评估时一并入列) **前置**:① 验收批读数重测与真人试玩先跑——差异化核心未知数(玩家是否利用类型分布先验绕雷/追格)只有真人数据能回答;② 拍掉调研报告第 8 章八个待决项(差异化区分的轴 / 雷·安当量分化后的行动经济条款③⑤与恒等式对账窗口 / heal 权重整数档位 / tier_min_buff 口径 / 同步流程口径扩充等)后出定稿提案 @@ -428,31 +415,16 @@ **状态**:部分清偿(2026-09-17 分支节点图批)——④⑤⑧ 三条已清偿:战斗胜利改进选路态(`choices_presented`,零自动推进);`continue_after_node` 泛化为兑付确认(确认 ≠ 推进,选路动作归 `pick_next_node`);节点图结构 + 图合法性校验已落地(节点带 `next` 出边表,编号 = `node_depth`,编号唯一 / 入口唯一 / Boss 恒唯一终点 / 前进方向无环 / 双向可达六检,违规加载致命,L1 单链经同一套校验)。①②③⑥⑦ 属正式侧冒险结构接口,保持登记。 -#### 图版措辞对齐(分支节点图定稿的跨文档残留) -**现状**:关卡节点地图 v1.0 定稿为分支节点图(2026-09-17 重开 05 清单「路径分支地图后置」裁定),以下现行文档残留旧口径措辞——单链先行期不失义,分支图内容批落地前随各自批次对齐:[冒险结构](systems/冒险循环/冒险结构.md)关卡序列节"路径分支地图已明确后置"一句;[难度曲线与Boss](systems/冒险循环/难度曲线与Boss.md)"关内坡度(节点深度)"与 D0–D4 行值措辞(该文档在飞,随技能池实施批后的文档批);[HUD 框架](systems/表现与支撑/HUD框架.md) A 区"节点链步进"与上游表"节点链"读数;[数据配置](systems/表现与支撑/数据配置.md)与 [battle.md](../ux/battle.md) 的"节点链"字样。 -**归属**:各文档下一批修订随批对齐(清单单点登记于此) - -**状态**:部分对齐(2026-09-17 分支节点图批)——难度曲线与Boss 行值表已随本批改图版口径(第二关 D0–D8 编号行集、节点措辞改"节点图");HUD 框架 A 区视图实现面已随本批改图版渲染(单链保持链状、图形态行进序列 + 候选)。冒险结构"路径分支已后置"句、数据配置与 battle.md 的"节点链"字样本批未触及,保持登记随各自批次对齐。 - -### 冒险结构 - -#### 第二关"解锁新元素"的解锁语义 - -**现状**:原表述绑定已从设计中移除的机制(见[不做清单](05-不做清单.md)),第二关解锁什么待定;第二关的层名未定稿,随第二关内容批重定。关联条目:见难度曲线与Boss「第二关的新内容投放缺口」(同一"第二关投放/解锁什么"缺口在两文档各自的登记面) - -**归属**:难度曲线与Boss第二关内容批(层名随批重定) - -**状态**:待办 #### 两关序列未生效 **现状**:第二关深度轴行值填充批落地前,两关序列未生效,冒险以单关运行(合法态;扩展批已排 P1)。关联条目:见难度曲线与Boss「第二关深度轴行值未填充」(行值填充即本条生效前提)。注记(2026-09-17 分支节点图批):切片首页已加"关卡 2 试玩"直入口(测试模式 `start_level(2)`,与序列推进无关)——行值/图版前提已满足后,正式序列推进(关卡 1 通关接续关卡 2)仍未实现,本条保持登记。 -**归属**:难度曲线与Boss(随第二关内容批) +**归属**:难度曲线与Boss(随第二关内容批);Alpha 验收条件登记 -**状态**:待办 +**状态**:待办(2026-09-19 用户拍板:垂直切片期可接受现状——测试直入口进关 2;**列入 Alpha 版本验收条件**,正式序列推进与切片行进器接口漂移 ①②③⑥⑦ 的对齐随 Alpha / 正式侧冒险结构批执行) #### 大奖励数值随难度曲线联动 @@ -462,6 +434,20 @@ **状态**:待办 +#### 冒险循环内成长提案(临时资源 GP + 商店房节点) + +**现状**:2026-09-18 用户提案,登记在案、未评估未拍板。动机 = 冒险循环内的中途成长缺口:关卡与关卡之间、战斗与战斗之间,怪物数值随进程抬升(节点编号即强度台阶),主角数值也应有对应提升——现行冒险内主角属性开局定死,奖励房只发功能道具、恢复房只回血,属性轴零中途成长。提案引入一类**冒险类临时资源**(暂拟名 **GP**,DND 金币意象):与钥石(跨局持久、换永久强化)相对,GP 局内有效、只提供**一次性的冒险类属性提升**(本冒险内生效)。两个核心问题,用户各给初步方案: +- **资源怎么拿(两途径)**:① 打败怪物后的掉落——战斗胜利奖励临时资源 GP;② 地图战斗资源新增一种格面枚举——某些安全格或雷格的奖励身份 = 金币 GP。 +- **资源怎么转化**:关卡节点图在奖励房、恢复房之外新增**商店房**节点,店内用 GP 购买属性提升;商品**随机三选一** + **刷新机会**(次数与费用未提)保持随机性——拿到金币不必然买到当下想要的属性。 + +**数值语言注记(2026-09-18)**:全项目数值语言已拍板小整数加法核(见[01-核心循环](01-核心循环.md) 数值语言条款)——GP 商店属性提升档位锁定 **flat 整数**(与永久强化三属性同族),开放问题④的档位词汇评估时免议;提案本身维持未评估不设计。 + +**开放问题(评估前须过)**:① GP 格面与七型池的结构关系——进不进「雷安同池」同一摇号池、权重占比几何;雷格侧 GP 的极性语义(负向 = 扣 GP / 并入挖雷惩罚 / GP 面中性无极性);② 战斗掉落的量级与记账——按敌种/节点编号定值还是掷定,入账归冒险结构资源账本还是战斗结算兑付;③ 商店房进图版结构——关卡节点地图 v1.0 节点封闭枚举 +1 的修订面:编排规则(出现频率/必现位/深度约束)、图合法性校验连带、确认选路交互、兑付移交语义;④ 商店内容与定价——属性提升的档位词汇(与永久强化三属性同族还是冒险内独立档)、价格曲线、三选一候选池、刷新次数/费用;⑤ 双币分工与呈现——GP 与钥石记账分离(局内清零不入存档)、GP 余额与商店界面的 HUD 归属;⑥ 成长与验收纪律——商店属性提升是通关率带的新玩家侧杠杆(换算率表强条目纪律同类),验收读数须按商店存在与否分层,GP 供给量级与难度曲线加难杠杆族的关系。 + +**归属**:[关卡节点地图](systems/冒险循环/关卡节点地图.md)修订批(商店房节点与图版结构,主责);GP 格面枚举归[地图战斗资源](systems/战斗循环/地图战斗资源.md);战斗掉落兑付归[战斗结算](systems/战斗循环/战斗结算.md)与[冒险结构](systems/冒险循环/冒险结构.md)共裁;成长节奏与验收带联动归[难度曲线与Boss](systems/冒险循环/难度曲线与Boss.md);GP 与钥石分工知会[元进度](systems/冒险循环/元进度.md)。 + +**状态**:待办(2026-09-18 用户提案登记,未评估) + ### 难度曲线与Boss #### 基线通关率越带,加难杠杆扫描未执行 @@ -512,15 +498,6 @@ **状态**:待办(2026-09-18 注记:接口启用形态已裁决——区间平移换算率启用、换算率表首版三行定稿,本条剩余面 = 首版三行的折算数值随模拟读数标定,护甲行强条目须按解锁后参数重测) -#### 速杀退化预警阈值未定 - -**现状**:高加成档速杀低难度行是成长兑现的合法形态、不做修复,但"战斗结束未开资格格占比"预警的阈值与联动调参未定(登记见[地图战斗资源](systems/战斗循环/地图战斗资源.md)「待办」) - -**归属**:难度曲线与Boss调参批 - -**状态**:待办 - -### 元进度 #### 换算率接口的启用形态 @@ -582,17 +559,10 @@ ### HUD框架 -#### 敌种线索键集差异 -**现状**:切片临时敌名与文档冻结键集(蛆虫 / 伏击兽)不一致,映射表以文档键集为锚 +#### 未开格类型徽章呈现时机(2026-09-18 方向已拍板,待实施批) -**归属**:[敌人系统](systems/战斗循环/敌人系统.md)修订批对齐 - -**状态**:待办 - -#### 未开格类型徽章呈现时机 - -**现状**:[art-bible](../art/art-bible.md) §4.6.3(提案已拍板待实施)要求未开格呈现家族类型徽章;[地图战斗资源](systems/战斗循环/地图战斗资源.md)现行锁定 MVP 只在已开格呈现——两口径未对齐 +**现状**:2026-09-18 用户拍板方向——未开格常显奖励类型微光(周围 8 格泛光:魔法=紫 / 穿刺=蓝 / 群伤=红 / 治疗=绿 / 其他增益=黄),让玩家能针对敌人护甲类型规划优先开哪些格。设计依据:护甲克制轴已落地(穿刺弹/魔法矢),玩家需要类型先验才能兑现克制博弈。连带裁决面:① 本方向修订[不做清单](05-不做清单.md)「未开格不显示奖励身份」裁定(owner 修订,合法);② 与 [art-bible](../art/art-bible.md) §4.6.3 家族类型徽章口径对齐归美术批;③ 探宝罗盘(预读 3×3)价值被清空,效果重定归魔法道具内容批;④ 色板与既有格面徽标/UI 用色冲突检查归样张批;⑤ 原「资源预读与推理的边界」条目并入口径(2026-09-19 用户拍板:预读边界按本条微光方案定——类型级常显;探宝罗盘重定两方案另立条目评估);⑥ 实施窗口 = 表现层升级批(会改推理信息面,切片期默认不开、保护验收读数基线)。 **归属**:[地图战斗资源](systems/战斗循环/地图战斗资源.md)极性提案实施批与HUD框架共裁 @@ -606,13 +576,6 @@ **状态**:已解决(2026-09-16)——五件呈现面(快照 / 谓词 / 身份查询 / 结算快照信号 / 战斗结束信号)登记于[战斗结算](systems/战斗循环/战斗结算.md)「呈现只读面」节 -#### 轮内已用刷新次数读数缺口 - -**现状**:刷新按钮"本轮剩 N 次"文案所需的读数在[行动经济](systems/排雷循环/行动经济.md)无只读口,客户端无法现读 - -**归属**:[行动经济](systems/排雷循环/行动经济.md)补只读观测量 - -**状态**:待办 #### 意图徽标占位期符号小修 @@ -640,14 +603,13 @@ **状态**:待办 -#### 关卡表与冒险表未入表清单 +#### 冒险表未建表(原「关卡表与冒险表未入表清单」关卡表半边已收口) -**现状**:两表已在 registry 登记由数据配置承载、[冒险结构](systems/冒险循环/冒险结构.md)回填,但尚未建结构占位、未纳入加载清单(归档表清单之外的新增表) +**现状**:关卡表半边已收口(2026-09-18 清理批核销:level.tres + LevelTable schema + config_db 加载行齐备,切片加载清单在册);冒险表 `AdventureTable` 仍未建——registry 已登记字段(keystone_per_level,单行全局,Rule 4 豁免)且注记「未建表零代码影响」,切片无消费方(元进度未实现),建账归冒险结构定稿批 -**归属**:表结构类与加载清单登记随冒险结构定稿批建账 - -**状态**:待办 +**归属**:冒险结构定稿批(随批建账) +**状态**:待办(仅剩冒险表半边) #### 元进度表键结构未定 **现状**:占位表只登记了归属,键结构待元进度定稿 @@ -666,23 +628,6 @@ **状态**:待办 -#### 快照域是否进 Alpha 首批 - -**现状**:归档把存档序列化整体排 Alpha,但快照与复盘(主种子与随机流计数器的落盘)是否随首批交付,待元进度批排期时一并裁决 - -**归属**:元进度批排期 - -**状态**:待办 - -### 音频 - -#### 坍塌显形的对位批次 - -**现状**:连锁音效与连锁动画同批配对登记,但合并设计的批次两文均未约定——排期时须与[战斗表现](systems/战斗循环/战斗表现.md)协调 - -**归属**:音频与战斗表现排期协调 - -**状态**:待办 #### 临时音效的覆盖清单 @@ -736,18 +681,3 @@ ### 设置与本地化 -#### 设置的持久化归属 - -**现状**:设置项随存档走还是独立存储,与存档序列化的关系未定;待对方文档定稿后对齐口径 - -**归属**:存档序列化(对方定稿后对齐口径) - -**状态**:待办 - -#### 音量控制的分工口径 - -**现状**:入口归设置与本地化、生效侧归音频只是现行接口位;音频文档并行写作中,最终以其定稿口径为准 - -**归属**:音频(以其定稿口径为准) - -**状态**:待办 diff --git a/design/gdd/07-体验验证清单.md b/design/gdd/07-体验验证清单.md index f7e2acd1..b82e407a 100644 --- a/design/gdd/07-体验验证清单.md +++ b/design/gdd/07-体验验证清单.md @@ -2,7 +2,7 @@ 本文登记**需要真人体验/观测才能下结论**的验证项,与 [06-待办清单](06-待办清单.md) 分工:06 登记"要拍板的事",本文登记"要玩过才知道的事"。每条注明**结论回流**路径——体验感受不满不等于当场改数:数值终值归其登记的归属批,体验反馈是该批的输入。 -当前批次来源:**战斗数值结构修复批**(2026-09-18,乘区接线四件套 + 削弱续时——战斗结算 v0.14 / 增益状态 v0.9 / 地图战斗资源 v0.11)。五项行为变化全部已过机器断言(冒烟 300 全绿),本文只列**机器测不了、要人玩**的部分。 +当前批次来源:**战斗数值四连批**(2026-09-18 ~ 09-19,版本锚 = 战斗结算 v0.16 / 增益状态 v0.9 / 地图战斗资源 v0.11)——① 战斗数值结构修复批(乘区接线四件套 + 削弱续时,v0.14)→ ② 甲效矩阵用户调参批(五格改值,v0.15,同日被③换装收编)→ ③ 甲效矩阵加法核换装批(百分比档 → 三档整数点数,v0.16,数值语言条款见 [01-核心循环](01-核心循环.md))→ ④ 充能退役批(主角攻击三分量模型退役 = 单分量输出,v0.16 追行,2026-09-19)。七项观测项语义全部仍有效(③ 的充能表述已随退役批注记);**观测预期仅作方向参考**——① Boss 战节奏的旧预期基于三分量输出与旧克制量纲,幅度以验收读数重测批为准。各批行为变化均过机器断言(冒烟读数见各批台账),本文只列**机器测不了、要人玩**的部分。 ## 行为变化速览(体验前先读) @@ -10,8 +10,8 @@ |---|---|---|---| | 硬化(敌方技) | 主角打硬化目标**翻倍**(符号 bug) | 主角攻击**折半** | Boss 战显著变长变难(预期内) | | 削弱(标中旗) | 叠层 ×2 可把敌方输出压到归零(免伤轮) | 持续 2 次结算、重复标中只续时不叠层,输出恒 ≥35% | 每轮必有承伤,插旗从"阶段性安全"变"持续减伤" | -| 增伤(安全格) | 只加成普攻段,充能段不吃 | 加成全部三段(普攻+穿刺+魔法) | 边挖边拿增伤时伤害明显变高 | -| 乏力(踩雷负向) | 无感(乘区没接线,死效果) | 输出合计 −25%(含充能段) | 踩雷后攻击真的变弱了 | +| 增伤(安全格) | 只加成普攻段,充能段不吃 | 加成全部输出(乘区接线批;2026-09-19 充能退役后 = 单分量全吃) | 边挖边拿增伤时伤害明显变高 | +| 乏力(踩雷负向) | 无感(乘区没接线,死效果) | 输出合计 −25% | 踩雷后攻击真的变弱了 | | 失衡(标错旗) | 承伤加深 +25% | 护甲等级 −2(更易被命中) | 惩罚变隐性——挨打概率上升而非每刀固定加深 | ## 试玩观测项(按优先级) @@ -32,7 +32,7 @@ ### ③ 增伤全段覆盖的数值手感 -- **观测什么**:持有增伤时边挖边打,伤害是否"明显变高但不爆炸"(充能段现在也吃增伤)。 +- **观测什么**:持有增伤时边挖边打,伤害是否"明显变高但不爆炸"(乘区作用于全部输出;2026-09-19 充能退役后主角输出 = 单分量)。 - **预期**:挖得越顺伤害滚得越快(正反馈增强)。 - **红灯信号**:普通敌一拍秒杀常态化、增益格子变成"无脑必抢"没有决策。 - **结论回流**:增伤幅度是临时值 → 状态层重设计批。 @@ -40,7 +40,7 @@ ### ④ 乏力的可感知性 - **观测什么**:踩雷吃乏力后,接下来一轮的输出下降是否感觉得到。 -- **预期**:可感知但不致命(−25% 输出,含充能段)。 +- **预期**:可感知但不致命(−25% 输出)。 - **红灯信号**:完全无感(等于白踩)或过痛(一轮输出报废后必然崩线)。 - **结论回流**:乏力幅度临时值 → 状态层重设计批;此前"乏力死效果"的格面资源调研结论([格面资源核查](../research/proposal-reward-cell-differentiation-2026-09-17.md) 关联项)随接线失效,该调研中的相关读数作废。 @@ -51,9 +51,17 @@ - **红灯信号**:试玩者完全无法把"挨打变疼"与标错旗关联起来。 - **结论回流**:归因呈现问题 → 战斗表现 / HUD 框架批(状态栏图标与明细行文案),失衡 N 值归状态层重设计批。 +### ⑥ 速杀退化预警(监控口径,2026-09-18 定案) + +纯日志侧预警、不影响玩家体验:读数 = "战斗结束未开资格格占比"(战斗结束时玩家尚未开过的奖励资格格 ÷ 全部资格格)——占比过高说明玩家在跳过棋盘互动直接速杀。预警阈值 provisional = **>40% 报警**(数字随验收读数重测批按基线校准;高加成档速杀低难度行本身是合法形态,预警只进日志不做玩法修复)。 + +### ⑦ 刷新经济监控(日志先行,阈值等基线) + +弃图率 / 每轮刷新率随试玩日志采集;预警阈值须有基线读数才能定(2026-09-18 拍板:现在定是拍脑袋)——随验收读数重测批出基线,数字与调参联动复核。挖掘期当场刷新无结算发生,两读数均不影响对账。 + ## 验收读数重测批义务(给下一批的输入,非手工项) - **Boss 战必须单独出列**(硬化行为变化——旧 Boss 承伤 84.8% 等读数全部作废)。 -- 普通场承伤带、通关率基线全量重测(削弱续时 + 乘区接线双变量)。 -- 旧读数作废清单:池触底免伤轮相关读数、硬化翻倍期全部战斗读数、乏力死效果期格面调研读数。 +- 普通场承伤带、通关率基线全量重测(削弱续时 + 乘区接线 + 甲效量纲换装 + 充能退役 多变量叠加,禁与任何旧读数混算)。 +- 旧读数作废清单:池触底免伤轮相关读数、硬化翻倍期全部战斗读数、乏力死效果期格面调研读数、充能期(三分量输出)全部战斗读数。 - 工具就位:`analyze_playtest.py`(反事实分析,吃新日志)、`level_monte_carlo`(MC 基线重跑)、JSONL 日志含池值与快照。 diff --git a/design/gdd/systems/冒险循环/元进度.md b/design/gdd/systems/冒险循环/元进度.md index 7ce886f6..ecdaeaac 100644 --- a/design/gdd/systems/冒险循环/元进度.md +++ b/design/gdd/systems/冒险循环/元进度.md @@ -62,6 +62,8 @@ | 道具工坊 | 六件辅助道具的解锁(探宝罗盘、工兵令、探巢摆钟、爆破工兵包、显影尘、地穴全图卷) | **首版全走关卡通关次数达标**;钥石直购价随定价批后补,最终双渠道并存 | | 奖励格图鉴 | 特殊奖励格的解锁——更强效果的格面 | 结构位现定;格子内容排 Alpha,随[地图战斗资源](../战斗循环/地图战斗资源.md)差异化批落地 | +**投值语言锁定(2026-09-18 数值语言拍板)**:三柜台属性强化一律 **flat 整数加减**("每级 +1 基础攻击"式,而非"+50% 攻击"式)——避开百分比词条被数值成长稀释的先例陷阱、守住数字可读性锚;具体每级数值仍归元进度设计批投值。 + 三条柜台纪律:**定价曲线一律几何递增**(每级费用按公比上浮——原则已拍板,起步价与公比数字归设计批配读数),与产出逻辑配套:深层关钥石产出多、后级强化贵,逼玩家往深处走。**道具工坊首版只挂通关次数渠道**是排期裁决(定价体系未建时的零定价依赖落地形态),不是终态。**存档义务随柜台产生**:钥石余额、永久强化等级表、每关通关次数表、Boss 首杀标记位——域级契约登记方式见[存档序列化](../表现与支撑/存档序列化.md)「待办」的联合裁决条目。 护甲等级进首版属性柜台是 2026-09-18 拍板(用户选 A),其代价条款见下方换算率节的强条目登记。 @@ -151,3 +153,4 @@ MVP 不要求本系统的闭环([不做清单](../../05-不做清单.md)整体 | v0.2 | 2026-09-17 | 代币→钥石统一拍板随批措辞清偿:资源模型裁决闭合(同一资源,渠道 = 关卡大奖励入账 + Boss 掉落),「代币记账」改名「钥石入账」。机制未动(本文仍为范围草案) | | v0.3 | 2026-09-17 | 数值纪律收口批:正文 knob 现行值改指路存根(事实源 data/tables/*.tres 与 registry),3 处失同步修正(钥石入账 +10/关 三处改「每关固定值,行值读冒险表 keystone_per_level」) | | v1.0 | 2026-09-18 | **元进度定稿批(用户拍板六件收口)**:定名「永久强化」(系统族名元进度保留,「天赋树」退役、「营地」为界面壳);营地三柜台(属性锻造三档含护甲等级 / 道具工坊六件首版通关次数渠道 / 奖励格图鉴结构位);Boss 重复获取 = 首杀全量 + 重复杀固定小额;定价几何递增原则;区间平移换算率启用(换算率表首版三行、护甲行强条目、数值读 data/tables);注入 = 冒险开始参数面 + 覆盖值通道(override 集合操作:追加 / 替换);解锁界面双入口框架。本文自范围草案升定稿 | +| v1.1 | 2026-09-18 | **数值语言拍板批(与 01-核心循环 数值语言条款 / 难度曲线与Boss / registry / 06-待办清单 / 切片代码同批)**:营地三柜台节新增投值语言锁定条款——属性投值语言锁定 flat 整数加减,数值投值仍归设计批 | diff --git a/design/gdd/systems/冒险循环/冒险结构.md b/design/gdd/systems/冒险循环/冒险结构.md index a709c736..9b27fbb6 100644 --- a/design/gdd/systems/冒险循环/冒险结构.md +++ b/design/gdd/systems/冒险循环/冒险结构.md @@ -72,7 +72,7 @@ 一场冒险由关卡串成。关卡(本文含义:地牢一层的完整推进——一条节点链加一个关底 Boss)的序列读关卡表:逐关一行的配置表,本文是它行集内容的责任方,表本体与读取机制归[数据配置](../表现与支撑/数据配置.md)。 -MVP 的序列是两关线性:第一关是地牢基线,第二关在基线上加入新元素并抬高数值台阶("新元素"具体是什么,见「待办」——原表述绑定的机制已从设计中移除)。通关一关(该关关底 Boss 被击杀)自动进下一关;冒险通关 = 最后一关的关底 Boss 被击杀。没有跳关、没有回头路;路径分支地图已明确后置。 +MVP 的序列是两关线性:第一关是地牢基线,第二关在基线上加入新元素并抬高数值台阶("新元素"具体是什么,见「待办」——原表述绑定的机制已从设计中移除)。通关一关(该关关底 Boss 被击杀)自动进下一关;冒险通关 = 最后一关的关底 Boss 被击杀。没有跳关、没有回头路;关卡行进走[关卡节点地图](关卡节点地图.md)的分支节点图(切片第一关为单链特例)。 第二关的生效有前提:要等[难度曲线与Boss](难度曲线与Boss.md)的第二关深度轴行值填充批落地。未落地前,冒险以单关运行——单关冒险是合法状态,不是缺陷。 diff --git a/design/gdd/systems/冒险循环/难度曲线与Boss.md b/design/gdd/systems/冒险循环/难度曲线与Boss.md index 962b319e..5d9781a1 100644 --- a/design/gdd/systems/冒险循环/难度曲线与Boss.md +++ b/design/gdd/systems/冒险循环/难度曲线与Boss.md @@ -142,7 +142,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 三个首发敌种各配一档护甲类型——地精轻甲、熊地精魔法护甲、食人魔酋长重甲——构成"轻甲 → 魔法护甲 → 重甲"的教学梯度:玩家的克制手段随进度逐关解锁。 -攻击类型对护甲类型的克制倍率矩阵(克制 / 中性 / 被克三档倍率读 `settlement.tres` 甲效表,provisional)是[战斗结算](../战斗循环/战斗结算.md)的甲效表,哪个攻击类型克哪档护甲由它定义,本文不重复。本文只锁两件事:敌种的护甲类型行值(见调参表),以及这份矩阵数值的调参所有权在本系统——敌种护甲变更必须复算 Boss 与普通战的击杀区间。 +攻击类型对护甲类型的克制倍率矩阵(克制 / 中性 / 被克三档加法修正(+1 / 0 / −1 点)读 `settlement.tres` 甲效表,provisional——2026-09-18 加法核换装(量纲由百分比改整数点数))是[战斗结算](../战斗循环/战斗结算.md)的甲效表,哪个攻击类型克哪档护甲由它定义,本文不重复。本文只锁两件事:敌种的护甲类型行值(见调参表),以及这份矩阵数值的调参所有权在本系统——敌种护甲变更与矩阵档值变更都必须复算 Boss 与普通战的击杀区间,加法修正点数随攻击成长的重定价义务同类。 ### 调参联动:禁独立调参网络与对账重跑义务 @@ -155,7 +155,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 | 密度 ↔ 可推理率 ↔ 生成尝试上限 | [棋盘生成](../排雷循环/棋盘生成.md) | 三元组联动;禁止为难度牺牲可推理率绝对锚 | | 每轮行动点 ↔ 停手转存规模 | [行动经济](../排雷循环/行动经济.md) | 联动评估记录归本文,调参所有权在行动经济 | | 削弱强度 ↔ 当量锚 | [增益状态](../战斗循环/增益状态.md)、[战斗结算](../战斗循环/战斗结算.md) | 联动值禁独立调参,修订须重跑锚对照 | -| 护甲类型 ↔ 充能奖励(投桶与量) ↔ 克制矩阵 | [战斗结算](../战斗循环/战斗结算.md) | 敌种护甲变更须复算击杀区间;改充能的投桶或量属奖励侧改动,须重跑本表数值 | +| 护甲类型 ↔ 克制矩阵 | [战斗结算](../战斗循环/战斗结算.md) | 敌种护甲变更须复算击杀区间(2026-09-19 充能退役——原"充能投桶与量"联动半边废止) | | 护甲等级 ↔ 攻击基线 ↔ 区间带宽 | [战斗结算](../战斗循环/战斗结算.md) | 敌种与主角的护甲等级行值变更须复算生存链区间(掷点带宽随折扣档位与攻击基线同向放大);掷点形式与档位已定稿(d20 三档——档位读 `settlement.tres`;nat20 暴击形式留档,倍率同表),护甲等级行值变更仍须复算生存链区间并同步 registry——现行行值读 `hero.tres` / `enemy.tres` 的 armor_class 列(均暂定),敌方正式行值随怪物设定批投值、与加难杠杆扫描合并调 | 五条经济契约的对账由[战斗结算](../战斗循环/战斗结算.md)闭合验收,其中挖掘风险不等式与清图支配性两条的现行验算已破线或存在缺口(现状见其「待办」),重跑义务落在本系统的下一次调参批执行——这是本系统当前最优先的调参义务。完美排雷乘数的调参权在本系统。 @@ -172,7 +172,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 | 上游 | [敌人系统](../战斗循环/敌人系统.md) | 敌人表与主角表的字段语义与回填;本文投曲线行值与数量区间、攻击浮动宽度 | | 上游 | [棋盘生成](../排雷循环/棋盘生成.md) | 棋盘参数表的键与字段语义;本文投参数行值;禁反向调用生成 | | 上游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | 奖励表与奖励配置表的机制与回填;本文投权重、威力、档位、注入参数 | -| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 五条经济契约对账结论是本文的调参约束输入;结算侧数值(充能、矩阵、完美乘数、参考敞口)投值归本文 | +| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 五条经济契约对账结论是本文的调参约束输入;结算侧数值(矩阵、完美乘数、参考敞口)投值归本文 | | 上游 | [行动经济](../排雷循环/行动经济.md) | 每轮行动点表值的联动观测;调参所有权在对方 | | 下游 | [冒险结构](冒险结构.md) | 关卡序列的难度排布消费期望值带;通关率带是其大奖励与恢复点强度的标定基准 | | 下游 | [关卡节点地图](关卡节点地图.md) | 节点深度语义与精英节点形态联动(未设计——Boss = 最深深度行约定即预留接口) | @@ -238,8 +238,7 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 | 参数 | 取值域 / 口径 | 说明 | |---|---|---| | 血量锚比率 r_boss | [0.5, 1.1];加难走廊 [1.1, 1.35] 待扫描 | Boss 生命锚 | -| 开格 / 标中充能 | 每格 / 每雷与单轮计数上限读表 | 充能奖励定义归[战斗结算](../战斗循环/战斗结算.md);投哪个桶是奖励内容,可改 | -| 克制矩阵 | 克制 / 中性 / 被克三档,读 `settlement.tres` 甲效表 | 消费归[战斗结算](../战斗循环/战斗结算.md) | +| 克制矩阵 | 克制 / 中性 / 被克三档加法修正(+1/0/−1 点),读 `settlement.tres` 甲效表 | 消费归[战斗结算](../战斗循环/战斗结算.md) | | 完美排雷乘数 | 读表 | 调参权本文 | | 当量参考敞口 | 读表 | 变更触发全量对账重跑 | | 注入概率初值 / 衰减 | 读表 | 注入机制归[地图战斗资源](../战斗循环/地图战斗资源.md) | @@ -277,3 +276,5 @@ Boss 战的棋盘用本关最大板形(板形行值读棋盘参数表),板 | v0.8 | 2026-09-17 | **文档降级为模板批(用户拍板,与敌人系统 / 战斗结算同批)**:数值纪律定稿——本文只定规则、取值域与口径,全部具体行值移除、一律读配置表(切片 `data/tables/` 与 registry);调参表敌人行值十二行整表改行模板(敌种语义注记保留),技能池投值 / 主角表 / 棋盘参数 / 关键投值各表删除"现行值"列改口径登记;Boss Σ 逐数验算(153.5 闭合)移除改"调参日志留档"口径;换装点锚定句去 AC 硬读数;伏击上限、保底 M、教学位区间等散落行值改"读表"。背景:切片 `.tres` 数值压缩批后文档行值已滞后,双写失同步被实证 | | v0.9 | 2026-09-17 | 数值纪律收口批:正文 knob 现行值改指路存根(事实源 data/tables/*.tres 与 registry),8 处失同步修正——曲线结论与换装点句残留读数改读 enemy.tres / settlement.tres;护甲克制 150/100/50 与联动表 d20 ×2 / 主角 10 / 敌 0 改读表(消双写);元进度换算率 +10≈1 轮 / 翻倍≈减半改 registry / 调参日志口径;**normal 模拟档目标带 [30,50]→[10,25] 用户拍板落文,旧读数 60% 删除(压缩批后失效,重测随验收批另批登记)**;通关余量带 p90≤13 / p10≥3 压缩前绝对血量带改相对量口径(含验收标准节同步,清单外顺手修正) | | v0.10 | 2026-09-18 | **元进度定稿批(与 元进度 v1.0 / registry / 06-待办清单 同批)**:元进度接口预留节改定稿口径——区间平移换算率启用(带平移,判读口径不变),换算率表首版三行与护甲行强条目指路 registry `meta_progression_conversion_table`,数值标定归元进度设计批;P2「区间平移换算率定稿」行同步改剩余面口径。曲线规则与行值零改动 | +| v0.11 | 2026-09-18 | **甲效矩阵用户调参批同步(零代码,事实源 settlement.tres 五格改值——详见[战斗结算](../战斗循环/战斗结算.md) v0.15)**:正文克制矩阵节与调参表联动行「克制/中性/被克三档」措辞改五档(克制 / 弱克制 / 中性 / 弱被克 / 被克,档值读表);联动义务面扩写——矩阵档值变更与敌种护甲变更同列,都必须复算 Boss 与普通战的击杀区间。敌种甲类型行值零改动 | +| v0.12 | 2026-09-18 | **数值语言拍板批·甲效矩阵加法核换装同步(零行值改动——与 01-核心循环 数值语言条款 / 元进度 / registry / 06-待办清单 / 切片代码同批)**:正文克制矩阵节与调参表克制矩阵行两处五档措辞改三档加法(克制 / 中性 / 被克三档加法修正 +1 / 0 / −1 点,量纲由百分比改整数点数);重定价义务面扩写——矩阵加法修正点数随攻击成长的重定价与敌种护甲变更同列,均须复算 Boss 与普通战的击杀区间 | diff --git a/design/gdd/systems/战斗循环/地图战斗资源.md b/design/gdd/systems/战斗循环/地图战斗资源.md index a10a6eac..d1e8e51e 100644 --- a/design/gdd/systems/战斗循环/地图战斗资源.md +++ b/design/gdd/systems/战斗循环/地图战斗资源.md @@ -131,7 +131,7 @@ 清图奖励不属于任何一格的格面资源——它是作用域为整张板的独立奖励对象:把一张图的雷全部清完(全部安全格开完)时结算发的那一份。装板摇号时与格子资源同批判尾摇定身份;清图批兑付恰好一次;完美排雷(零误标且至少标中一面旗)追加第二份同身份兑付。 -它是可配置可替换的封装:数据面上是清图池里的一行(现行默认槽 clear_default),换行即换内容,机制零改动。按图类型差异化已留结构位——`clear_<图类型>` 命名空间预留,不同地图类型可以配不同的清图奖励;启用等[棋盘生成](../排雷循环/棋盘生成.md)的图类型词表落定。 +它是可配置可替换的封装:数据面上是清图池里的一行(现行默认槽 clear_default),换行即换内容,机制零改动。按图类型差异化已留结构位——`clear_<图类型>` 命名空间预留,不同地图类型可以配不同的清图奖励;词表已定稿(2026-09-19:{dungeon, underdark},玩家侧「地图类型」),差异化内容启用随内容批。 | 清图奖励规则 | 含义 | |---|---| @@ -178,7 +178,7 @@ | 优先级 | 内容 | 后置原因 | |---|---|---| | P1 | 功能道具渠道(长周期、更强力的功能性道具) | 用户已定方向(2026-09-15):数值型伤害/治疗道具已删除,功能道具经其他渠道加入——渠道候选(关卡节点奖励等)归[关卡节点地图](../冒险循环/关卡节点地图.md)域定稿;本系统只留结构位 | -| P1 | 清图池按图类型差异化 | 默认槽之外的结构位已留;待[棋盘生成](../排雷循环/棋盘生成.md)的图类型词表落定 | +| P1 | 清图池按图类型差异化 | 默认槽之外的结构位已留;词表已定稿(2026-09-19:{dungeon, underdark}),差异化行随内容批配置 | | P1 | 未开格资源类型的呈现深度 | 结构前提已备(身份摇定即可查);与推理的界线未拍板,见待办 | | P1 | 增攻(attack)型行值与权重终调 | 内容决策,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | | P2 | 音频挂钩(拾取音 / 负向兑付音 / 清图奖励音) | 归[音频](../表现与支撑/音频.md),Alpha | diff --git a/design/gdd/systems/战斗循环/战斗结算.md b/design/gdd/systems/战斗循环/战斗结算.md index e71549b0..b541b627 100644 --- a/design/gdd/systems/战斗循环/战斗结算.md +++ b/design/gdd/systems/战斗循环/战斗结算.md @@ -125,11 +125,11 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × | 批 | 兑付 | |---|---| -| 挖格批 | 开到的安全格逐格兑该格资源的正向;开到的雷格逐格兑该格资源的负向;同时按奖励定义累加充能计数(现行:开格 → 穿刺桶) | -| 旗判定批 | 标中则兑该雷格资源的正向,每颗雷的资格只兑一次,并同样按奖励定义累加充能计数(现行:标中旗 → 魔法桶);标空则记"标旗未中"归因行,并兑该安全格资源的负向 | +| 挖格批 | 开到的安全格逐格兑该格资源的正向;开到的雷格逐格兑该格资源的负向 | +| 旗判定批 | 标中则兑该雷格资源的正向,每颗雷的资格只兑一次;标空则记"标旗未中"归因行,并兑该安全格资源的负向 | | 清图批 | 清图奖励对象恰好发一次;完美排雷追加第二份同身份兑付 | -**充能也是奖励,不是攻击类型的一部分**:这两批给的是"充能计数",投进哪个攻击类型桶由奖励定义(`charge_grants`)决定——来源与类型是两条独立抽象,换桶属奖励侧改动,攻击类型与甲效矩阵不参与。 +**充能已退役(2026-09-19 用户拍板)**:原"挖格/标中旗给充能计数 → 战斗段折算穿刺/魔法分量"的弹药系统整体移除——主角攻击回归单分量,克制策略归冒险前配置(主角 attack_type 表值,营地换型 = 改字段;未来冒险前参数面承接策略位)。攻防两条抽象分离纪律保留:攻击类型是伤害的属性轴,棋盘事实只是奖励触发源。 | 兑付形态 | 覆盖 | 兑付方式 | 拒绝语义 | |---|---|---|---| @@ -160,33 +160,24 @@ percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × ``` ① 攻击伤害值 A = 攻击基线 × 技能伤害倍率 (普通攻击倍率恒 1;主角侧恒 1) ② AC 判断值:掷点(骰面读表)vs 防守方护甲等级 → 档位折扣;天然最大面 → 暴击 ×暴击倍率(读表)(量程上下限) -③ 命中伤害 H = (A × a) × 甲效倍率 (克制/中性/被克三档读 settlement.tres 甲效矩阵;敌打主角无甲轴恒中性) +③ 命中伤害 H = (A × a) + 克制修正点数 (克制修正点数读 settlement.tres 甲效矩阵——加法点数非百分比;敌打主角不查矩阵恒中性——矩阵消费面 = 主角侧) ── 以下既有链不动 ── 增益池乘区(含敌方防御池)→ 伏击附加(后置加法、必中全额、不吃 AC)→ 向下取整 → 伤害下限 max(1,·) ``` -主角先手攻击由三个分量逐项取整后相加:基础分量(攻击力经增益修正,可被池封顶压到零;**类型 = 主角 `attack_type` 表值**——2026-09-18 营地扩展前置批:基础攻击量与攻击类型抽象分离,基础分量不再恒属普通,缺省 normal 向后兼容)、穿刺分量、魔法分量。**攻击类型是伤害的属性轴**——它只决定这个分量查甲效表的哪一行,定义里不含任何棋盘来源。分量各自查表后取整相加;甲效表把攻击类型与敌方护甲类型交叉成一张 3×3 克制倍率: +主角先手攻击由三个分量逐项取整后相加:基础分量(攻击力经增益修正,可被池封顶压到零;**类型 = 主角 `attack_type` 表值**——2026-09-18 营地扩展前置批:基础攻击量与攻击类型抽象分离,基础分量不再恒属普通,缺省 normal 向后兼容)、穿刺分量、魔法分量。**攻击类型是伤害的属性轴**——它只决定这个分量查甲效表的哪一行,定义里不含任何棋盘来源。分量各自查表后取整相加;甲效表把攻击类型与敌方护甲类型交叉成一张 3×3 **克制修正矩阵(加法点数)**——2026-09-18 加法核换装:每个分量在掷点/暴击折算取整后 **+ 克制修正点数**(原百分比乘区退役): | 攻击类型 \ 护甲类型 | 轻甲 | 魔法护甲 | 重甲 | 语义 | |---|---|---|---|---| -| 普通 | 中性档 | 中性档 | 中性档 | 基线分量缺省类型:不吃克制倍率(基础分量类型可配——换为穿刺/魔法后即按对应行结算,掷点口径不变;增益修正走三分量合计乘区,不按分量区分) | -| 穿刺 | 中性档 | 克制档 | 被克档 | 穿透附魔护甲,破不开重甲 | -| 魔法 | 中性档 | 被克档 | 克制档 | 绕得过重甲,被魔法护甲吸收 | +| 普通 | 中性 | 克制 | 被克 | 基线分量缺省类型:对轻甲中性、对魔法护甲克制、对重甲被克(基础分量类型可配——换为穿刺/魔法后即按对应行结算,掷点口径不变;增益修正走攻击合计乘区) | +| 穿刺 | 被克 | 克制 | 中性 | 对魔法护甲克制;对轻甲被克;**重甲中性**(挡得住刀刃、不排斥穿刺——2026-09-18 用户拍板;现行无重甲敌种,纯结构位) | +| 魔法 | 中性 | 被克 | 克制 | 绕得过重甲,被魔法护甲吸收 | -倍率只三档:克制 / 中性 / 被克(三档倍率读 `settlement.tres` 甲效矩阵)。攻击类型是分量的固有属性(每个分量恒属普通 / 穿刺 / 魔法 之一),护甲类型是防守单位的固有属性,两者都不随层数、来源与轮次漂移;基础分量的类型归属是主角表的可配置值(营地永久强化的换型落点),充能分量类型仍归充能定义。矩阵键集 3×3 满格、结构冻结,数值 provisional。主角增益与乏力经 hero_offense 池修正三分量合计——两个充能分量同吃百分比修正(2026-09-18 结构修复批:普通分量直乘旁路退役,见池乘区公式行)。 +修正三档:克制 +1 / 中性 0 / 被克 −1(加法点数,九格分布读 `settlement.tres` 甲效矩阵——2026-09-18 加法核换装:量纲由百分比改点数、五档词表退役;三档而非五档的理由 = 攻击基线个位数刻度下 ±2 触伤害下限或翻倍超重,假粒度;攻击成长后可扩弱档)。攻击类型是分量的固有属性(每个分量恒属普通 / 穿刺 / 魔法 之一),护甲类型是防守单位的固有属性,两者都不随层数、来源与轮次漂移;基础分量的类型归属是主角表的可配置值(营地永久强化的换型落点),矩阵键集 3×3 满格、结构冻结,数值 provisional。矩阵消费面 = 主角侧(奖励直伤道具 / 主角攻击基础分量)——敌方攻击现行不查矩阵,主角 armor_type 轴仍休眠、生效待敌方技能攻击类型批。主角增益与乏力经 hero_offense 池修正攻击合计(2026-09-18 结构修复批:普通分量直乘旁路退役;2026-09-19 充能退役后合计 = 单分量,见池乘区公式行)。 -普通分量由攻击力基线直接供给;穿刺与魔法分量由**充能**供给——充能是挖掘期攒下、按攻击类型分桶的附加伤害储备,本结算战斗段一次性消费、轮末清零,跨轮零存量。 +主角攻击 = 单一基础分量(2026-09-19 充能退役批):量 = 攻击力基线(表值),类型 = 主角表 `attack_type`(营地永久强化换型 = 改字段;未来冒险前参数面承接"按关配型"的策略位)。原"普通 + 穿刺/魔法充能三分量"模型整体退役——挖掘期与战斗期之间不再有弹药供给线,克制应对从局内攒桶改为冒险前配型 + 棋盘火力(穿刺弹/魔法矢等直伤奖励道具,消费面不变)。 -谁往桶里放东西属**奖励的定义**,不属攻击类型的定义:棋盘事实(开格、标中旗、踩雷、清图……)只是奖励的**触发源**,奖励内容怎么定是可改的——改的是"这个源给什么",碰不到"穿刺是什么"。现行供给(provisional): - -| 奖励触发源 | 现行奖励内容 | 换算与上限 | -|---|---|---| -| 本轮每挖开一个安全格 | 给穿刺桶充能 | 每格表值,单轮计数上限(per_unit / cap 现行值读 `settlement.tres` charge_grants;per_unit 0 = 该奖励关闭,cap 0 = 不封顶) | -| 每面首次标中的旗(与削弱兑付同批判定、每雷只计一次) | 给魔法桶充能 | 每雷表值,无上限——行动点预算天然限界(per_unit 现行值读 `settlement.tres` charge_grants) | - -两条都是奖励侧现行定义(暂存结算表 `charge_grants`,正式归属见「待办」):换桶、换量、或把开格奖励换成增益与道具,都不触动攻击类型与甲效矩阵。 - -**护甲等级掷点:必中、非归零,只吃基础攻击分量**(2026-09-16 定稿落地,判定式与全部数值已拍板;判定对象措辞随敌人技能池批改述)。防守方由此多了一条数值轴——护甲等级(数据键 `armor_class`):攻击永远命中,没有 miss、没有零收益白回合;只有吃掷点的分量在掷点低于防守方护甲等级时按减伤档位打折,档位再重也不归零。判定式:攻击结算时掷单骰(骰面读表),掷点 ≥ 防守方护甲等级 + 攻击加成 → 全额;掷点 < 护甲等级按缺口(护甲等级 − 掷点)查减伤档位表打折——边界与档值读 `settlement.tres` 减伤档位表,三档皆非零档。暴击:天然最大面(读表)使该次基础攻击分量 ×暴击倍率(读表),双方同规,且天然最大面恒全额(暴击与折扣互斥;天然最大面〔nat20〕暴击是掷点层概念,与技能重击〔池技能〕严格区分——两层不得混述)。伤害下限:任何攻击落地伤害至少 damage_floor(读表,全局 max(damage_floor, ·))——"被减伤归零 v=0"零值伤害行语义随批退役,重档折扣的攻击行在行文本记"被压制"。掷点范围:只有基础攻击分量吃掷点——主角先手攻击的普通分量,敌方技能的基础伤害分量(= 攻击基线 × 技能伤害倍率,普通攻击倍率 1 为特例);无伤害分量的技能(增益类)不掷不折;穿刺与魔法两个充能分量不吃;棋盘来源一律无视护甲等级——伏击附加、爆裂、清障炸药、奖励即时伤害全部必中全额不掷,这是本机制的边界切口,与"奖励/惩罚必中"同构。护甲等级(数值轴,掷点打折)与护甲类型(属性轴,克制乘区)严格分离:护甲类型不做护甲等级映射,克制矩阵档值读表、消费面不变,两概念在文档、表字段与代码键中不得混用。数值载体:主角与敌方护甲等级行值读 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 为特例);无伤害分量的技能(增益类)不掷不折;棋盘来源一律无视护甲等级——伏击附加、爆裂、清障炸药、奖励即时伤害全部必中全额不掷,这是本机制的边界切口,与"奖励/惩罚必中"同构。护甲等级(数值轴,掷点打折)与护甲类型(属性轴,克制修正)严格分离:护甲类型不做护甲等级映射,克制修正点数读表、消费面不变,两概念在文档、表字段与代码键中不得混用。数值载体:主角与敌方护甲等级行值读 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)已登记的加难杠杆扫描合并处理;其生存链区间模型按掷点带宽口径复核(带宽含暴击档与折扣档),"零红档"验收保留。 @@ -194,7 +185,8 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 ``` 敌方一次技能攻击 = max(damage_floor, floor( 掷点档位技能基础分量 + 伏击附加 ) × 主角防御乘数 × 敌方输出乘数 );伏击为后置加法,不进乘区、不掷不折 -主角一次攻击 = max(damage_floor, floor( Σ三分量 × (100 + 主角输出乘数池合成值) ÷ 100 × (100 + 敌方防御乘数池合成值) ÷ 100 ) )——hero_offense(增伤/乏力载体)与 enemy_defense(硬化载体)两池串乘在三分量合计之后 +主角一次攻击 = 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 普通分量直乘旁路退役,旧"切片现状"注记销项) 护甲等级掷点:掷单骰(骰面读表),掷点 ≥ 护甲等级 + 攻击加成 → 全额;低掷按缺口查减伤档位表(边界与档值读表,无零档) 暴击:天然最大面(读表)→ 该次基础攻击分量 ×暴击倍率(读表)且恒全额(双方同规;掷点层概念,与技能重击严格区分) @@ -241,7 +233,7 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 | 方向 | 系统 | 接口要点 | |---|---|---| -| 上游 | [数据配置](../表现与支撑/数据配置.md) | 结算配置表(段序、当量、封顶、充能、甲效与护甲等级掷点参数)的承载与读取,本系统是回填责任方;战斗中热重载被闸门拒绝 | +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 结算配置表(段序、当量、封顶、甲效与护甲等级掷点参数)的承载与读取,本系统是回填责任方;战斗中热重载被闸门拒绝 | | 上游 | [行动经济](../排雷循环/行动经济.md) | 轮末两字段消息的接收方;回发换图指令、结算完成与战斗结束通知;挖掘期刷新经它扣费;五条经济契约的对账责任方 | | 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 订阅其三事件流(挖开格、旗判定、轮次结束);换图时调用装板与退役 | | 上游 | [棋盘生成](../排雷循环/棋盘生成.md) | 换图时调用其生成接口 | @@ -287,14 +279,13 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 ## 调参表 -结算用到的全部数值——当量、封顶、乘数、段序常量、充能、甲效与护甲等级掷点参数——都存结算配置表,代码里零数值字面量;改数值就是改表回填。表值以快照进结算,战斗中途改表不生效。已锁字段与数值以 [registry 的 settlement_table 条目](../../../registry/entities.yaml) 为准。 +结算用到的全部数值——当量、封顶、乘数、段序常量、甲效与护甲等级掷点参数——都存结算配置表,代码里零数值字面量;改数值就是改表回填。表值以快照进结算,战斗中途改表不生效。已锁字段与数值以 [registry 的 settlement_table 条目](../../../registry/entities.yaml) 为准。 | 参数 | 域 | 现行值 | 说明 | |---|---|---|---| | 参考敞口 | int [1, 999] | 读 `settlement.tres` equivalence_ref_damage(provisional) | 当量折算的代表性敞口;变更须重跑全部对账 | | 完美乘数 | percent {100, 200} | 读 `settlement.tres` p_perfect(provisional) | 100 为仅高光、无第二份;域外加载拒绝 | -| 充能奖励定义 `charge_grants` | Dictionary:触发源 → {attack_type, per_unit, cap} | 现行映射读 `settlement.tres` charge_grants:开格 → 穿刺桶 · 标中旗 → 魔法桶(per_unit / cap 读表,provisional) | 奖励侧定义:附加伤害储备按攻击类型分桶,本字典决定哪个源投哪个桶、每单位几点、单轮计数上限;整表替换不改攻击类型与甲效矩阵(正式归属见「待办」) | -| 甲效矩阵 | percent | 克制/中性/被克三档现行值读 `settlement.tres`(provisional) | 键集 = 攻击类型 {普通, 穿刺, 魔法} × 护甲类型 {轻甲, 魔法护甲, 重甲},3×3 满格结构冻结;数值归调参 | +| 甲效矩阵 | 整数点数 {−1, 0, +1} | 三档加法修正(克制 +1 / 中性 0 / 被克 −1)九格现行值读 `settlement.tres`(provisional——2026-09-18 加法核换装,量纲 percent 退役) | 键集 = 攻击类型 {普通, 穿刺, 魔法} × 护甲类型 {轻甲, 魔法护甲, 重甲},3×3 满格结构冻结;数值归调参 | | 护甲等级掷点 | 骰面 int [2,1000] · nat 最大面 [1,骰面] · 暴击倍率 percent [100,999] | 骰面 / nat 最大面 / 暴击倍率读表(2026-09-16 拍板定稿) | 回合内随机:每吃掷点分量逐次掷骰,掷点低于防守方护甲等级 + 攻击加成触发档位折扣;天然最大面暴击 ×暴击倍率(读表)且恒全额(双方同规);消费 `armor_roll` 封闭流(逐次掷逐次取号) | | 减伤档位表 | 边界升序 + 档位值降序 percent [1,99],档数 = 边界数 + 1 | 边界与档值读 `settlement.tres`(roll_tier_bounds / discount 档位,2026-09-16 拍板定稿) | 低掷缺口按边界查档(读表);档位不设零档(非归零);微调旋钮 = 本表,不动护甲等级值 | | 伤害下限 `damage_floor` | int [1, 999] | 读 `settlement.tres` damage_floor(2026-09-16 拍板定稿) | 任何攻击落地伤害全局 max(damage_floor, ·);零值伤害行语义随批退役 | @@ -348,3 +339,6 @@ EV 参考数不入正文(派生读数,需要时按判定式与现行表值 | v0.13 | 2026-09-18 | **营地扩展前置批·主角双轴可配置(用户指令,与敌人系统 / registry / 切片代码同批)**:① hero 表新增 armor_type({light, ward, heavy},缺省 light)——主角护甲类型轴可配置可修改,消费面 = 甲效矩阵(现行敌方攻击恒 normal 档 = 数值中性的结构位,轴生效待敌方技能攻击类型批);② hero 表新增 attack_type({normal, pierce, magic},缺省 normal)——**基础攻击量与攻击类型抽象分离**:基础分量类型不再硬编码普通、改读主角表值,营地永久强化"换成魔法/穿刺攻击"= 改字段,atk 量轴与掷点口径零改动;③ 同桶充能照加语义成文(基础分量与充能同型时,充能分量保持不掷不折);正文三分量表述、甲效矩阵"普通"行注记、分量固有属性措辞三处同步 | | v0.12 | 2026-09-17 | **数值纪律收口批:正文与调参表 knob 现行值改指路存根(事实源 `data/tables/*.tres` 与 registry),20 余处失同步值修正**——收益对照表参考敞口 12 / 完美乘数 200 改指路 settlement.tres(equivalence_ref_damage / p_perfect);伏击加层"+2 层"改"+stacks 层(读 reward.tres ambush_double 行)";充能供给表与 charge_grants 行"每格 1 / 上限 8 / 每雷 2"改 per_unit/cap 读表;三乘法链与甲效矩阵 1.5/1.0/0.5、150/100/50 改三档读表;掷点判定 1d20 / nat20 ×2 / 缺口档 ×0.75/×0.5/×0.25 / 边界 [3,7] / 档位 [75,50,25] / damage_floor=1 / AC 10·0 / ac_up +1×2 层全部改指路 settlement.tres·status_effects.tres·hero/enemy 表;EV 参考数(AC10 21.25% 等)与"旧 defense_up 满层 −60%"删除(派生读数 / 退役值,版本历史可查);调参表与验收标准同步 | | v0.14 | 2026-09-18 | **战斗数值结构修复批(2026-09-18 盘问会话用户拍板,与增益状态 / registry / 切片代码同批)**:① 主角侧乘区接线——hero_offense 池入主角攻击乘区:Σ三分量后 ×(100+hero_offense)/100 ×(100+enemy_defense)/100 两池串乘,增伤/乏力覆盖面 = 普通+穿刺+魔法 合计;attack_up 普通分量直乘旁路退役(正文甲效矩阵"普通"行注记、池乘区公式行、v0.11 切片现状注记三处同步销项);② off_guard(失衡)换装 AC 轴——unit percent→ac(幅度 provisional 归状态层重设计批),effect_pool_map 删 off_guard 键,hero_defense 池清空、结构保留,消费走既有掷点判定读法零改动;③ fortify(硬化)符号纠正——旧 +100 入敌方防御池实际 ×2 翻倍与"硬化=减伤"语义相反,改负值(读表)后主角攻击折半;④ weaken(削弱)叠层改续时——同名重复授予只刷新剩余结算数、层数恒 1,×2 叠满池触底 ×0 的免伤轮结构性根治(消饱和);duration 终值、off_guard 幅度、当量锚复算全部归状态层重设计批。切片同批:battle_orchestrator 池接线与直乘删除、status_effects.tres 三行、settlement.tres 删键、冒烟护栏(削弱续时 / 乘区接线 ×1.5·×0.75 / 硬化折半方向三组新断言,旧"削弱×2 池触底"采样通道随批退役) | +| v0.15 | 2026-09-18 | **甲效矩阵用户调参批(用户逐格给值,事实源 settlement.tres 五格改值、四格不动,零代码)**:普通行 ward 100→120 / heavy 100→50;穿刺行 light 100→80 / ward 150→120 / heavy 50→80;魔法行与普通-轻甲不动——「克制/中性/被克」三档结构与「普通行恒中性」退役,改五档(克制 / 弱克制 / 中性 / 弱被克 / 被克,档值读表)。矩阵消费面成文 = 主角侧(奖励直伤道具 / 主角攻击三分量 / 充能分量),敌方攻击不查矩阵、主角 armor_type 轴仍休眠(v0.13「敌方攻击恒 normal 档故中性」的归因改述——轴休眠是结构性的非数值性的)。语义列两行同步(穿刺「破不开重甲」重压语义弱化为与轻甲同档折损)。切片同批:settlement.tres 批注、冒烟矩阵三行断言改五档读数 + 乘区接线穿刺分量 3→2(3 点 ×80% 取整)随批改形,冒烟 300 项 0 失败 + 四探针 PASS;registry(enemy/hero armor_type 两行注记)与 敌人系统 / 难度曲线与Boss 三档措辞同步 | +| v0.16 | 2026-09-19 | **充能退役批(用户拍板,与切片代码 / registry / 07 清单 / README 同批)**:主角攻击三分量模型(普通 + 穿刺/魔法充能)整体退役,回归单分量——量 = 攻击基线、类型 = 主角表 attack_type;挖格批/旗判定批的充能计数条款删除、充能供给表与 charge_grants 调参行删除、乘区公式与粒度口径改"攻击合计";退役理由 = 克制策略归冒险前配置(营地换型/未来冒险前参数面),局内不再有挖掘攒弹药的第二伤害供给;保留面 = 攻击类型属性轴与棋盘奖励触发源的抽象分离、奖励直伤道具(穿刺弹/魔法矢)的克制直伤消费不变。切片同批:battle_orchestrator 攻击段单分量化 + _charge_points/_charge_counts/round_facts 充能键删除、DamageMath.charge_component → counter_component 改名(奖励直伤唯一消费方)、settlement.tres charge_grants 键与 schema 校验删除、冒烟充能断言组退役改形(乘区接线单分量基线 100、标中正向兑付行断言、恢复点探针换种子 42)、冒烟 293 项 0 失败 | +| 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-核心循环同步 | diff --git a/design/gdd/systems/战斗循环/战斗表现.md b/design/gdd/systems/战斗循环/战斗表现.md index b630f283..471377a6 100644 --- a/design/gdd/systems/战斗循环/战斗表现.md +++ b/design/gdd/systems/战斗循环/战斗表现.md @@ -147,7 +147,7 @@ MVP 不要求本文的闭环:不做清单把战斗动画演出列为 MVP 打 2. 伤害数字画在哪、怎么叠:棋盘格上(预告上格原则的方向)还是战斗画面区,与逐行明细如何对应。 3. 演出速度档位:逐行兑现的加速与跳过交互(约束:信息载体不可整体跳过)。 4. 来源格可读化的形态二选一:缩略图还是格子高亮(登记时两者并列,未裁决)。 -5. 坍塌显形连锁动画与音效的挂点协同,安排在哪个批次合并设计。 +5. 坍塌显形连锁动画与音效的挂点协同,安排在哪个批次合并设计。——已约定:对位批次 = 表现层升级批(P1,随样张锁定的动画方案后;音效侧同口径登记)。 ## 版本历史 diff --git a/design/gdd/systems/战斗循环/敌人系统.md b/design/gdd/systems/战斗循环/敌人系统.md index ad168623..8c79bb11 100644 --- a/design/gdd/systems/战斗循环/敌人系统.md +++ b/design/gdd/systems/战斗循环/敌人系统.md @@ -270,7 +270,7 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 | max_hp | [1, 999] | 主角生命上限 | | atk | [1, 999] | 基础攻击;配 0 加载期拒绝——基础攻击恒在 | | armor_class(护甲等级) | int [0, 999] | 主角作为防守方的护甲等级基准,ac_up(护甲强化)在其上加算;掷点结算归[战斗结算](战斗结算.md) | -| armor_type | {轻甲, 魔法护甲, 重甲},缺省轻甲 | 主角护甲类型轴(2026-09-18 营地扩展前置批:可配置可修改);克制结算归[战斗结算](战斗结算.md),现行敌方攻击恒普通档 = 数值中性的结构位 | +| armor_type | {轻甲, 魔法护甲, 重甲},缺省轻甲 | 主角护甲类型轴(2026-09-18 营地扩展前置批:可配置可修改);克制结算归[战斗结算](战斗结算.md),现行轴休眠——矩阵消费面 = 主角侧,敌方攻击不查克制矩阵(2026-09-18 甲效矩阵调参批归因改述:轴休眠是结构性的非数值性的),轴生效待敌方技能攻击类型批 | | attack_type | {普通, 穿刺, 魔法},缺省普通 | 主角基础攻击类型轴(2026-09-18 营地扩展前置批:基础攻击量与攻击类型抽象分离——营地永久强化换型 = 改此字段,atk 量轴不动);消费面 = 战斗结算·战斗段基础分量 | 各敌种行值、池权重与池 EV 读数(含闸长期速率实测)一律读配置表与调参日志,本文不登记具体数值;EV 重锚与权重投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。 @@ -307,4 +307,5 @@ Boss 专属身份 = 专属池承载:独占技能 + 权重轮廓(现行:酋 | v0.5 | 2026-09-16 | **敌人技能池批(用户拍板,设计权威 docs/proposal-skill-pool.md v1.0;与战斗结算 / 增益状态 / 难度曲线与Boss / 战斗表现 / HUD框架 / registry / 切片代码同批)**:行为环章节整体退役——固定出招剧本、拍枚举(攻击/蓄力/重击)、环指针、同种锁步、heavy_multiplier 字段全部废除;技能池语义成文(三层对象〔技能行/池模板/实例池〕、技能行词汇表、池构成纪律、两道闸〔全技能各自冷却 + 保底〕、开轮摇号时序、死亡作废、独立子流);蓄力语义改写(纯攻击增益技、与重击无组合语义——纠偏二;施放行继承零兑付伏击);Boss 专属身份改专属池承载;意图呈现改三档可见性(普攻零表示 / 特殊技类型级预告 / 暴击掷点层);敌人表 schema pattern → pool;调参表增技能表与池 EV 锚(含闸长期速率实测登记);验收标准按摇号口径重写 | | v0.6 | 2026-09-17 | **文档降级为模板批(用户拍板,与难度曲线与Boss / 战斗结算同批)**:数值纪律定稿——本文只锁字段、取值域与规则,全部具体行值(敌种表池权重 / 护甲等级行值 / 两道闸表值 / 伏击每层附加与上限 / 技能行倍率与冷却 / 主角三字段 / 三敌种行值与池 EV 实测读数)自本文移除、一律读配置表(切片 `data/tables/` 与 registry);调参表三表删除"现行值"列改纯 schema 模板;伏击公式与验算改符号化(a = 每层伏击表值);验收标准同步去数值。背景:切片 `.tres` 数值压缩批后文档行值已滞后,双写失同步被实证 | | v0.8 | 2026-09-18 | **营地扩展前置批 + 护甲类型重配(用户指令,与战斗结算 / registry / 切片代码同批)**:① hero 表新增 armor_type / attack_type 两根可配置轴(缺省 light / normal;主角字段表同步两行)——护甲类型轴入矩阵消费面(敌方技能攻击类型轴未开前数值中性),基础攻击类型轴 = 量与类型抽象分离的营地换型落点;② 敌种护甲类型行值重配(数据面):关卡 1 全部轻甲(食人魔酋长 heavy→light、熊地精两行 ward→light),关卡 2 除 Boss 蛛化卓尔精灵 heavy→ward(魔法甲)外全部轻甲(熊地精四行 ward→light,巨蜘蛛既有 light 不动);现行克制三角读数效果 = L1 克制轴中性化、L2 仅 Boss 战非中性(魔法矢 ×150 / 穿刺弹 ×50 对 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)",两层乘法组合语义保留符号表述 | diff --git a/design/gdd/systems/排雷循环/棋盘生成.md b/design/gdd/systems/排雷循环/棋盘生成.md index fb666d1b..880c435f 100644 --- a/design/gdd/systems/排雷循环/棋盘生成.md +++ b/design/gdd/systems/排雷循环/棋盘生成.md @@ -149,7 +149,7 @@ ### 图类型标签与第三轴预留:主题恒定、Boss 板有座位 -每张图带一组图类型标签(board_biome 字段;biome 即图的主题、题材)。同关卡同深度的所有图,主题静态恒定——不存在逐图重掷主题的接口,"不会上钓鱼的当"是结构保证而非文案。现行占位值见 board_gen.tres(provisional):标签词表尚未定稿,定稿前只校验非空,定稿后补域校验。这组标签是表现侧换色板与[地图战斗资源](../战斗循环/地图战斗资源.md)图类型差异化插槽的数据源。本节为数据约定,无计算。 +每张图带一个图类型标签(board_type 字段;图类型即图的主题、题材,玩家侧显示名「地图类型」)。同关卡的所有图,主题静态恒定——不存在逐图重掷主题的接口,"不会上钓鱼的当"是结构保证而非文案。词表 v1.0 已定稿(2026-09-19 用户拍板):**dungeon(地牢基线)/ underdark(幽暗地域)**,现行值见 board_gen.tres(L1 = dungeon,L2 = underdark);域校验 = 词表成员检查(board_gen_table.gd 词表常量),扩词随内容批走修订。这组标签是表现侧换色板与[地图战斗资源](../战斗循环/地图战斗资源.md)图类型差异化插槽的数据源。本节为数据约定,无计算。 参数表的键是关卡序号 × 节点深度,难度沿这两条轴雕刻;精英与 Boss 修饰是预留的第三条轴。本系统不定任何修饰数值,只锁定落点约定——这也是[关卡节点地图](../冒险循环/关卡节点地图.md)与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)两份文档的输入: @@ -172,7 +172,7 @@ | 下游 | [行动经济](行动经济.md) | 单向事实依赖:P(安全)(挖掘目标格为安全格的概率)是对方挖掘风险不等式的概率锚,锚值由本系统供给——实测可推理率分布的低分位值,不是及格线参数 | | 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 参数数值所有权方;只按表调参,禁反向调用生成 | | 下游 | [关卡节点地图](../冒险循环/关卡节点地图.md) | 第三轴 Boss 板落点约定的共同输入 | -| 下游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | board_biome 作图类型上下文(行参数静态恒定) | +| 下游 | [地图战斗资源](../战斗循环/地图战斗资源.md) | board_type 作图类型上下文(行参数静态恒定) | | 对外接口 | 形态 | |---|---| @@ -213,7 +213,7 @@ | solver_rules | enum {single, single_subset} | single_subset(冻结,非调参) | 推理规则域 | | min_safe_count | int [1, 999] | 现行值见 board_gen.tres | 最小安全格数下限 | | max_gen_attempts | int [1, 32] | 域 [1, 32],现行按行取值见 board_gen.tres | 生成-验证重试上限;受成本闸联合约束 | -| board_biome | StringSet 非空 | 现行值见 board_gen.tres(占位词表,provisional) | 图类型标签;词表定稿前只校验非空 | +| board_type | String,词表 {dungeon, underdark} | 现行值见 board_gen.tres(词表 v1.0,2026-09-19 定稿) | 图类型标签(玩家侧「地图类型」);域校验 = 词表成员检查 | 结构冻结(非调参项):键结构与每关深度 0 锚行、五阶段顺序、solver_rules、可推理率的合法信息源枚举、及格线域下限 0.85、成本闸常数(结构护栏,登记于 registry board_gen_table 条目,调整走文档修订)、先布后删语义。 diff --git a/design/gdd/systems/排雷循环/行动经济.md b/design/gdd/systems/排雷循环/行动经济.md index 52dd95aa..f86707ae 100644 --- a/design/gdd/systems/排雷循环/行动经济.md +++ b/design/gdd/systems/排雷循环/行动经济.md @@ -87,7 +87,7 @@ 储备池唯一的支出是刷新雷图。玩家在挖掘期经界面入口发起,储备值不低于刷新门槛(rap_refresh_cost,见 action_economy.tres)时扣费,当场换一张新图继续挖。注意刷新不终结这一轮:行动点不重置、本轮剩余行动点保留;但换来的新图不发清图奖励(它又不是清图),旧图上的旗随旧图一起失效(插旗花的钱不退)。 -每轮最多刷新 2 次(轮内计数,开轮重置),没有冷却,每次独立检查门槛并扣费。禁止"攒满就自动刷"——刷新永远是玩家的决定。 +每轮最多刷新 2 次(轮内计数,开轮重置),没有冷却,每次独立检查门槛并扣费。已用次数与剩余次数为只读观测量(切片实现在战斗编排器侧计数,HUD 刷新按钮「剩 N 次」文案即其消费方)——客户端可现读,不经可变状态外泄。禁止"攒满就自动刷"——刷新永远是玩家的决定。 停手与刷新合起来构成这本账的基线节拍:满行动点一轮停手,正好攒够一次刷新。 diff --git a/design/gdd/systems/表现与支撑/存档序列化.md b/design/gdd/systems/表现与支撑/存档序列化.md index c039d0c8..0e253ef3 100644 --- a/design/gdd/systems/表现与支撑/存档序列化.md +++ b/design/gdd/systems/表现与支撑/存档序列化.md @@ -31,6 +31,7 @@ | 冒险摘要记哪几件事 | [冒险结构](../冒险循环/冒险结构.md)——本系统只消费其快照域标识 | | 数值配方本体(所有玩家一致的表) | [数据配置](数据配置.md)——表是配方,存档是玩家进度,两者分离(见核心规则) | | 局内数值的持久化 | 无——局内资源全部单局清零,现行没有局内数值需要入档(见核心规则的反面清单) | +| 系统级设置(音量/画面等) | 不入档——设置与存档两分(2026-09-19 用户拍板):设置独立存储、一安装一份,存档只存该存档的生涯数据;设置域归[设置与本地化](设置与本地化.md)所有 | ## 在核心循环中的位置 diff --git a/design/gdd/systems/表现与支撑/数据配置.md b/design/gdd/systems/表现与支撑/数据配置.md index bca09cea..90738513 100644 --- a/design/gdd/systems/表现与支撑/数据配置.md +++ b/design/gdd/systems/表现与支撑/数据配置.md @@ -69,7 +69,7 @@ | 结算表 `SettlementTable` | 结算段序、当量参考敞口、封顶与克制矩阵(单行全局) | [战斗结算](../战斗循环/战斗结算.md) | | 魔法道具表 `AuxItemTable` | 魔法道具定义行 | [魔法道具](../排雷循环/魔法道具.md) | | 难度表 `DifficultyTable` | 难度修饰乘数(占位空表) | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | -| 关卡表 `LevelTable` | 逐关节点链与层名 | [冒险结构](../冒险循环/冒险结构.md) | +| 关卡表 `LevelTable` | 逐关节点图与层名 | [冒险结构](../冒险循环/冒险结构.md) | | 冒险表 `AdventureTable` | 关卡大奖励与钥石入账(单行全局) | [冒险结构](../冒险循环/冒险结构.md) | | 元进度表 `MetaTable` | 元进度字段(占位,键结构未定) | [元进度](../冒险循环/元进度.md) | diff --git a/design/gdd/systems/表现与支撑/设置与本地化.md b/design/gdd/systems/表现与支撑/设置与本地化.md index da267532..3bc82a1f 100644 --- a/design/gdd/systems/表现与支撑/设置与本地化.md +++ b/design/gdd/systems/表现与支撑/设置与本地化.md @@ -31,11 +31,11 @@ | 呈现语义与可访问性基线本体(字号下限、闪烁上限、纯鼠标可玩等) | [HUD 框架](HUD框架.md) | | 逐行结算的呈现规则 | [battle.md](../../../ux/battle.md) 与 [HUD 框架](HUD框架.md),本文只引用 | | 减动效开启后动画怎么演 | [战斗表现](../战斗循环/战斗表现.md)——本文提供开关,动画侧兑现归对方 | -| 音量调节对声音怎么生效 | [音频](音频.md)——接口位,以对方定稿口径为准 | +| 音量调节对声音怎么生效 | [音频](音频.md)——生效侧归对方,口径已对齐(2026-09-18 音频成文) | | 文案内容本体(教学条目、界面用语等写了什么) | 各系统文档——本文只做翻译生产,不改含义 | | 数值调试工具(TunePanel 的另一半去向) | [元进度](../冒险循环/元进度.md) | | 设置界面的布局与呈现 | [HUD 框架](HUD框架.md) | -| 存档的读写与版本迁移 | [存档序列化](存档序列化.md)——设置怎么存见待办 | +| 存档的读写与版本迁移 | [存档序列化](存档序列化.md)——**不随存档走**(2026-09-19 用户拍板):系统级设置独立于存档 | ## 在核心循环中的位置 @@ -62,7 +62,7 @@ | 输入 | 登记处 | 将来要做的 | |---|---|---| | 减动效开关 | [HUD 框架](HUD框架.md)的可访问性基线与 [battle.md](../../../ux/battle.md)的呈现承诺;[战斗表现](../战斗循环/战斗表现.md)已登记承接其动画侧 | 提供开关:开启后全部动画有时长减半或直达终态的通路。呈现侧的约束以 battle.md 与 HUD 框架为权威,本文不复述 | -| 音量控制入口 | 归档对本系统的常规分工登记;[音频](音频.md)并行写作中,尚未登记此分工 | 在设置里提供音量入口,生效口径以音频文档定稿为准 | +| 音量控制入口 | 归档对本系统的常规分工登记;[音频](音频.md)已登记同款分工 | 在设置里提供音量入口;生效侧归音频(口径已对齐) | | 键位映射表 | [HUD 框架](HUD框架.md)定稿登记的交付物输入(全键族) | 如何转化成设置项(比如是否允许改键)待设计 | | 结算风味词 | 归档概念层增补批随巢穴隐喻换轴登记("封印 / 镇 / 反制"一类类型风味词),只登记了存在、各归各的时机 | 内容与形态未定,本文只登记这条输入在 | @@ -80,10 +80,10 @@ TunePanel 是切片期顺手做出的调试面板,正式版要退役。归档 |---|---|---| | 上游 | [HUD 框架](HUD框架.md) | 可访问性基线(减动效选项的出处)与键位映射表等交付物输入;设置界面的呈现契约 | | 上游 | [教学引导](教学引导.md) | 教学文案的多语言生产(对方"不负责"表登记归本文) | -| 上游 | [音频](音频.md) | 音量控制的生效侧——接口位,以对方定稿口径为准 | +| 上游 | [音频](音频.md) | 音量控制的生效侧(口径已对齐:入口归本系统、生效归音频) | | 协作 | [战斗表现](../战斗循环/战斗表现.md) | 减动效的分工:本文提供开关,动画侧的分档兑现归对方 | | 下游 | 各系统文档 | 各系统只对文案本体负责,翻译生产与语言切换统一归本文 | -| 待定 | [存档序列化](存档序列化.md) | 设置的持久化是否走存档——随存档还是独立存储,见待办 | +| 独立存储(2026-09-19 用户拍板) | 无(本系统自有) | 系统级设置(音量/画面控制等)一安装一份、删游戏才消失;**不进存档、与存档生涯数据两分** | ## P0 最小闭环 @@ -118,7 +118,7 @@ MVP 不要求本系统的闭环:[不做清单](../../05-不做清单.md)把设 ## 待设计问题清单 1. 设置项全集:画面、键位、可访问性、语言各类别各收哪些项——目前有来源的只有减动效与音量入口两条。 -2. 设置持久化(对应待办首条):随存档还是独立存储,存成什么。 +2. 设置持久化(已拍板 2026-09-19):独立存储,不随存档——系统级设置一安装一份;具体文件格式与读写时机随存档序列化设计批对齐(设置域归本系统所有)。 3. 语言清单与字体覆盖:做哪些语言,字体对相应字符集的覆盖怎么保证。 4. 文案生产流程:文本键(每条文案在工程里的唯一编号,机器据此找到译文)怎么管理、谁负责校对、翻译在流程的哪一步介入。 5. 设置界面的入口与形态:从哪里打开、什么时刻可以打开——与 HUD 框架协作定。 diff --git a/design/gdd/systems/表现与支撑/音频.md b/design/gdd/systems/表现与支撑/音频.md index 9ab096a0..e4eb66fe 100644 --- a/design/gdd/systems/表现与支撑/音频.md +++ b/design/gdd/systems/表现与支撑/音频.md @@ -29,7 +29,7 @@ | 挂点的呈现机制(toast 提示条、结算明细带等界面设施) | [HUD 框架](HUD框架.md)——本文只消费其登记的事件 | | 结算明细行本身(挂点的事件源数据面) | [战斗结算](../战斗循环/战斗结算.md) | | 坍塌显形的连锁动画(与音效配对的另一半) | [战斗表现](../战斗循环/战斗表现.md) | -| 音量控制入口 | [设置与本地化](设置与本地化.md)——入口归对方,生效侧在本系统(口径以双方定稿为准) | +| 音量控制入口 | [设置与本地化](设置与本地化.md)——入口归对方,生效侧在本系统(口径已对齐,2026-09-18) | | 音频顶层风格的正式定稿 | [美术音频方向](../../04-美术音频方向.md)——本文只引用 | ## 在核心循环中的位置 @@ -73,7 +73,7 @@ | 负反馈聚合单次 | 挂点清单 | 未生效、被拒类负反馈聚合为一次响,不逐行连响——呈现侧已按聚合计数防轰炸,音频侧对齐 | | 开格拾取按奖励类别区分 | 挂点清单 | 呈现侧按奖励类别分色,音频侧对应按类别区分拾取音的听感 | | 清图奖励专属音 | 挂点清单 | 清图奖励行是轮末的仪式峰值,要有专属的音 | -| 坍塌显形连锁音效 | [游戏概念](../../00-游戏概念.md)的概念层拍板 | 与[战斗表现](../战斗循环/战斗表现.md)的连锁动画同批配对登记,本文承接音效半边(见下节) | +| 坍塌显形连锁音效 | [游戏概念](../../00-游戏概念.md)的概念层拍板 | 与[战斗表现](../战斗循环/战斗表现.md)的连锁动画同批配对登记,本文承接音效半边(见下节);对位批次 = 表现层升级批 | | 蓄力拍的音频前摇 | [敌人系统](../战斗循环/敌人系统.md)的后置登记 | 敌人蓄力那拍的声音预告,作为读招的第二通道,登记为垂直切片可选项 | | 道具使用的音频反馈 | [魔法道具](../排雷循环/魔法道具.md)的后置登记 | 道具使用的反馈音,表现打磨项后置,排 Alpha | @@ -99,7 +99,7 @@ ### 坍塌显形:与连锁动画配对的音效半边 -坍塌显形是连锁展开的玩家可见名——挖穿薄壳后,整片松动的地面塌陷露出。概念层拍板时,它的连锁动画(归[战斗表现](../战斗循环/战斗表现.md))与连锁音效方向(归本文)是同批配对登记的:一条连锁塌下去,画面与声音要对得上拍,将来须对位设计。对本文的约束只有一条:连锁音效不单独拍板,设计与批次跟连锁动画绑定(批次未定,见待办)。 +坍塌显形是连锁展开的玩家可见名——挖穿薄壳后,整片松动的地面塌陷露出。概念层拍板时,它的连锁动画(归[战斗表现](../战斗循环/战斗表现.md))与连锁音效方向(归本文)是同批配对登记的:一条连锁塌下去,画面与声音要对得上拍,将来须对位设计。对本文的约束只有一条:连锁音效不单独拍板,设计与批次跟连锁动画绑定——对位批次已约定为表现层升级批(P1,随样张锁定的动画方案后)。 ## 依赖与输出 diff --git a/design/registry/entities.yaml b/design/registry/entities.yaml index 3bbf72d5..c8ac8986 100644 --- a/design/registry/entities.yaml +++ b/design/registry/entities.yaml @@ -102,10 +102,10 @@ entities: type: formula owner: design/gdd/systems/排雷循环/地形变异.md attributes: - variables: [unlock_level, level_index, biome_tag, board_biome] - rule: pool = {v ∈ VariationTable | unlock_level ≤ level_index ∧ (biome_tag=∅ ∨ biome_tag ∩ board_biome ≠ ∅)};直接整数比较(无 数据配置 R1 floor);∅ = 通配语义 + variables: [unlock_level, level_index, biome_tag, board_type] + rule: pool = {v ∈ VariationTable | unlock_level ≤ level_index ∧ (biome_tag=∅ ∨ biome_tag ∋ board_type)};直接整数比较(无 数据配置 R1 floor);∅ = 通配语义 output_range: pool 集合(现行空集——无内容行;空池合法——棋盘生成 静默布置普通图,不报错) - board_biome_type: StringSet(值域与来源归 棋盘生成 BoardGenTable biome 字段;非空为 F1 输入前提——域校验登记 棋盘生成 验收标准,fail-fast 闭合) + board_type: String(值域 = 棋盘生成 BoardGenTable 词表 v1.0 {dungeon, underdark},2026-09-19 定稿;域校验 = 词表成员检查,fail-fast 闭合) downstream: 棋盘生成 布置候选池门控(棋盘生成 依赖与输出节);多变异选取须消费 board_gen 流(回放确定性) referenced_by: [棋盘生成] @@ -151,7 +151,7 @@ entities: owner: design/gdd/systems/排雷循环/棋盘生成.md attributes: table: BoardGenTable(数据配置 承载,键 (level_index, node_depth) + depth-0 锚行——首个进度键表;棋盘生成 回填 owner,2026-09-09 定稿回填;第三轴登记约定〔B7 修订〕——Boss 图 = 各 level Dmax 行、elite_/boss_ 字段命名空间预留、关卡节点地图/难度曲线与Boss 定稿强制重审 OQ6,改键退路 = 数据配置 Rule 4 接口漂移通道;**OQ6 重审兑现〔2026-09-17 关卡节点地图 v1.0〕:键维持二元不动、node_depth 语义 = 关卡内唯一节点编号(单链特例下 = 旧深度)、Boss = 最大编号行〔Dmax 语义平移〕、elite_/boss_ 命名空间预留维持**) - fields: board_width/board_height(int [8,64],knob)/ mine_density(float (0,0.5],knob——雷量参数形态=密度浮点,尺寸解耦;布雷数下限 round(d×(W×H−9)) ≥ 1,R3 修订)/ inferability_target(float **[0.85,1]**,knob——P1 门槛承重参数+绝对锚,战斗结算 修订收窄)/ solver_rules(enum single|single_subset,**冻结 single_subset**——推理定义域非调参)/ min_safe_count(int [1,999],knob——行动经济 EC5 退化板对冲)/ max_gen_attempts(int [1,32],knob)/ board_biome(StringSet **非空**,域校验致命——地形变异;词表 owner 未定稿前只校验非空)+ elite_/boss_ 前缀字段命名空间预留(非 knob,B7——语义归 关卡节点地图/难度曲线与Boss) + fields: board_width/board_height(int [8,64],knob)/ mine_density(float (0,0.5],knob——雷量参数形态=密度浮点,尺寸解耦;布雷数下限 round(d×(W×H−9)) ≥ 1,R3 修订)/ inferability_target(float **[0.85,1]**,knob——P1 门槛承重参数+绝对锚,战斗结算 修订收窄)/ solver_rules(enum single|single_subset,**冻结 single_subset**——推理定义域非调参)/ min_safe_count(int [1,999],knob——行动经济 EC5 退化板对冲)/ max_gen_attempts(int [1,32],knob)/ board_type(String,词表 {dungeon, underdark} 域校验致命——2026-09-19 词表 v1.0 定稿;玩家侧显示名「地图类型」)+ elite_/boss_ 前缀字段命名空间预留(非 knob,B7——语义归 关卡节点地图/难度曲线与Boss) cross_field_validation: min_safe_feasible(F2b——W×H−round(density×(W×H−9))≥min_safe_count,sound 保守〔增益状态 修订补论证:N=round(d×(W×H−9)) 先定数+先布后删只减不增〕,计数可行≠连通可行)+ 布雷数下限(round(d×(W×H−9)) ≥ 1,R3)+ cost_feasible(F2c——max_gen_attempts×W×H ≤ 16384 provisional,正式值归 OQ2 ADR;运行期禁墙钟时间逃生,B8) mechanics: 五阶段确定性管线(参数解析→布雷→变异布置→生成-验证循环→产出上报;顺序冻结,先雷后变异布置;**布雷取整与落位钉死,增益状态 修订——N=round(d×(W×H−9)) 先定数,先布后删〔环内雷移除、只减不增、无迭代〕**)· inferability = **免赌开据占比**(F1:初始展开∪连锁∪推导开据三通道;合法信息源穷举{数字约束}——新增信息源=GDD 修订;次序无关不变式;metric_version=1 防实现漂移)· **达标判据 = inferability ≥ target(单一判据,战斗结算 修订)**· clearable 合法性闸(清图可达性与质量度量两闸分离)· 验收算子三分支(达标即出 k*/接受最优+强告警 k**/**零合法→接受最不坏+非法产物标记 k***——用户 2026-09-09 定稿,玩家永不卡死,F4 断言 A′ 批量守红线;EC5 玩家侧体验债已登记 战斗结算/HUD框架 域**)· 重试不重开 scope(attempt 边界=生成函数完整返回——存档序列化 快照切点契约)· 生成期表值单次读取(防热重载撕裂 attempt) metrics: 生成期指标集四项 = 实际 inferability(metric_version)/实际雷数与实际 |S|(增益状态——先布后删漂移观测,|M|≤N)/attempts_used/降级标记(shortfall+非法产物) @@ -255,7 +255,7 @@ entities: unit_count: int [1,3](knob——**遭遇区间下界**〔2026-09-14 难度曲线与Boss 修订批:unit_count 升级区间语义 [unit_count, unit_count_max],战斗结算.begin_battle 实例化期经 RngService encounter 封闭流均匀骰;新敌种首遇/教学位节点固定不加骰〕;默认 1 provisional,多敌语义默认零消费者复验归 关卡节点地图〔敌人系统 OQ2〕) unit_count_max: int [unit_count, 3] 可省略(2026-09-14 难度曲线与Boss 修订批新增——遭遇区间上界;缺省 = 定值,旧行零迁移) atk_min/atk_max: 可选配对 int [0,999](2026-09-14 敌方攻击区间批——上阶/下阶区间随机;缺省 = 定值行向后兼容;跨字段:必成对 · **atk = floor((min+max)/2) 向下取整中点锚**〔2026-09-18 与切片 schema 校验式对齐——int 截断,奇数和区间(如 1+2)取下半,期望当量微偏下界为现行口径〕;roll 时机 = 遭遇骰同流〔encounter 恰一 scope,数量骰先、atk 骰后〕spawn 期**整战持久**〔每拍抖动否决——数字可读性锚〕,战斗结算.begin_battle roll → 敌人系统.spawn enemy_atk_override 收确定值〔敌人系统 零随机纪律保持〕;MVP 六行 ±3 provisional 归 难度曲线与Boss;验收 = 完美策略档 0 加成通关 ≤40%〔OQ7〕;接口漂移 = 敌人系统.spawn 签名 +1 参数〔正式侧 GDD/registry 修订批随 ADR-0009 同批〕) - armor_type: enum {light, ward, heavy} 缺省 light(2026-09-14 护甲克制批转正登记——攻击类型 × 护甲克制,克制矩阵 = settlement_table.armor_effectiveness〔克制 ×150 / 中性 ×100 / 被克 ×50〕;MVP 映射 goblin=light / bugbear=ward / ogre_chief=heavy;**2026-09-15 命名统一批:原 enum {none, a, b} 为位置键(无语义、且"无甲/甲A/甲B"在文档间已分裂成四种写法),改 {light, ward, heavy} = 轻甲 / 魔法护甲 / 重甲**;数值 provisional 归 难度曲线与Boss) + 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 = 纯伏击伤敌种合法) @@ -278,7 +278,7 @@ entities: max_hp: int [1,999](knob;现行值读 data/tables/hero.tres) atk: int [1,999](**0 = 加载拒绝**——基础攻击恒存在,"0 基线 × 百分比增益恒零"死锁自 schema 层杜绝〔2026-09-11 用户裁决,原"机制开关 MVP=0、激活裁决归 地图战斗资源/战斗结算"作废〕;现行值读 data/tables/hero.tres〔2026-09-17 数值压缩批改型〕;消费面 = 主角战斗段先手攻击——战斗结算 GDD 2026-09-11 增补) armor_class: int [0,999](**2026-09-15 护甲等级批新增,2026-09-16 掷点批定稿落地**——主角作为防守方的护甲等级,敌方攻击拍 / 重击拍基线的掷点折扣判定读数;掷点结算归 settlement_table.ac_roll〔战斗结算〕,与 armor_type〔克制属性轴〕两概念不得混用;现行值读 data/tables/hero.tres〔暂定,调参归 难度曲线与Boss〕) - armor_type: enum {light, ward, heavy}(**2026-09-18 营地扩展前置批新增**——主角护甲类型轴可配置可修改,缺省 light 向后兼容;消费面 = 战斗结算甲效矩阵〔现行敌方攻击恒 normal 档 = 数值中性的结构位,轴生效待敌方技能攻击类型批〕;现行值读 data/tables/hero.tres) + armor_type: enum {light, ward, heavy}(**2026-09-18 营地扩展前置批新增**——主角护甲类型轴可配置可修改,缺省 light 向后兼容;消费面 = 战斗结算甲效矩阵〔敌方攻击现行不查矩阵——轴休眠是结构性的非数值性的〔2026-09-18 甲效矩阵调参批归因改述,原「恒 normal 档故中性」依赖普通行恒 100 已退役〕,轴生效待敌方技能攻击类型批〕;现行值读 data/tables/hero.tres) attack_type: enum {normal, pierce, magic}(**2026-09-18 营地扩展前置批新增**——主角基础攻击量〔atk 量轴〕与攻击类型抽象分离的承载字段:营地永久强化"换成魔法/穿刺攻击" = 改此字段,量轴零改动;消费面 = 战斗结算·战斗段基础分量查甲效矩阵〔原硬编码 normal 退役〕;现行值读 data/tables/hero.tres) rule4_exemption: 单行全局定义表(主角不随关卡自动成长——成长=天赋 元进度/奖励侧;ActionEconomyTable 先例) hp_persistence: 跨战斗 HP 持久性归 关卡节点地图/冒险结构(provisional)——敌人系统 单位接口以初始 hp 入参,不定义冒险内持久性 @@ -344,16 +344,15 @@ entities: p_perfect: int {100,200} percent(knob,默认 200 provisional——完美排雷清图奖励**第二份兑付触发**;2026-09-10 战斗结算 评审批修订:真实双份交付载体〔Core Rule 13#2〕——100 = 仅高光、200 = 双份交付,非整数倍数乘数无运行时载体、域外加载致命;上界受护栏 B 约束〔双读数:D_ref 口径 24 / DPS 严格读数 ≈8,裁决归 难度曲线与Boss〕) segment_order: StringList(结构冻结——段序骨架 [grant, buff_debuff, combat, decay, verdict];加载期恒等拍板序校验违例致命,防实现乱序静默漂移;2026-09-15 格面资源批五段——item_window/item 两段随可选类删除下线,旧七段序见底部修订记录) source_label_map: Dictionary source_class→文案键(结构冻结——P2 归因呈现映射;键集 = 增益状态 source_class ∪ {判定扩展, enemy_action, flag_miss}——2026-09-10 战斗结算 评审批修订;2026-09-15 格面资源批删"道具"扩展键;新增键 = 接口漂移) - effect_pool_map: Dictionary effect_id→pool {hero_offense|hero_defense|enemy_output|enemy_defense|flat_attach}(结构冻结——F2 效果语义映射,增益状态 Rule 7 载体;键 ⊆ StatusEffectTable 活行集、悬空加载期致命;新 effect_id 上线须随批登记——2026-09-15 格面资源批随 sapped 行收编登记:sapped → hero_offense;**2026-09-16 护甲等级掷点批:删 defense_up → hero_defense 键**〔减伤百分比行退役,hero_defense 池现仅 off_guard 正向行〕;ac_up 为 AC 阈值轴效果、不入任何池;**2026-09-16 敌人技能池批:增 empower → enemy_output · fortify → enemy_defense**〔敌方防御池新词汇——硬化载体,消费面 = 主角攻击 Σ三分量后 ×(100+clamp(enemy_defense))/100,四池对称:敌打主角 = hero_defense × enemy_output、主角打敌 = hero_offense × enemy_defense;切片现状注记:hero_offense 现行走普通分量 attack_up 直乘、未并入合计乘区,正式化归 ADR 批〕;**2026-09-18 结构修复批:删 off_guard → hero_defense 键**〔off_guard 换装 AC 轴不入池——hero_defense 池清空、池结构保留;hero_offense 乘区接线同步落地:主角攻击 Σ三分量后 ×(100+clamp(hero_offense))/100 ×(100+clamp(enemy_defense))/100 两池串乘,attack_up 普通分量直乘旁路退役——上方"切片现状注记"销项〕) + effect_pool_map: Dictionary effect_id→pool {hero_offense|hero_defense|enemy_output|enemy_defense|flat_attach}(结构冻结——F2 效果语义映射,增益状态 Rule 7 载体;键 ⊆ StatusEffectTable 活行集、悬空加载期致命;新 effect_id 上线须随批登记——2026-09-15 格面资源批随 sapped 行收编登记:sapped → hero_offense;**2026-09-16 护甲等级掷点批:删 defense_up → hero_defense 键**〔减伤百分比行退役,hero_defense 池现仅 off_guard 正向行〕;ac_up 为 AC 阈值轴效果、不入任何池;**2026-09-16 敌人技能池批:增 empower → enemy_output · fortify → enemy_defense**〔敌方防御池新词汇——硬化载体,消费面 = 主角攻击合计后 ×(100+clamp(enemy_defense))/100,四池对称:敌打主角 = hero_defense × enemy_output、主角打敌 = hero_offense × enemy_defense;切片现状注记:hero_offense 现行走普通分量 attack_up 直乘、未并入合计乘区,正式化归 ADR 批〕;**2026-09-18 结构修复批:删 off_guard → hero_defense 键**〔off_guard 换装 AC 轴不入池——hero_defense 池清空、池结构保留;hero_offense 乘区接线同步落地:主角攻击合计后 ×(100+clamp(hero_offense))/100 ×(100+clamp(enemy_defense))/100 两池串乘,attack_up 普通分量直乘旁路退役——上方"切片现状注记"销项〕) pool_clamp_lo: int pp(结构冻结 −100——percent 池地板域下界,乘数域随之 [0,2];2026-09-10 统一八字段口径) pool_clamp_hi: int pp(结构冻结 +100——percent 池地板域上界;原"七字段 pool_clamp_lo_hi"措辞作废,数据配置 GDD 行按收编先例以本条为准) round_direction: enum {floor}(结构冻结——单一取整规则) - charge_grants: Dictionary 奖励触发源→{attack_type, per_unit, cap}(**2026-09-15 攻击类型/奖励抽象分离批新增**——攻击类型 = 伤害的属性轴(定义不含来源),充能 = 按攻击类型分桶的附加伤害储备;"哪类棋盘事实充哪个桶、每单位多少点"归本字典 = 奖励定义,替换字典即改奖励内容,攻击类型与 armor_effectiveness 不动;现行映射不列值于本 registry——读 data/tables/settlement.tres charge_grants(safe_cell(开格)→ pierce 桶 · flag_hit(标中旗)→ magic 桶;cap 0 = 不封顶;2026-09-18 数值压缩批指路化收口,原"pierce 1/格 cap 8 · magic 2/雷"读数随压缩批作废);**原 pierce_per_cell / pierce_cap / magic_per_flag("类型×来源"焊死命名,更早为 damage_a_per_cell / damage_a_cap / damage_b_per_flag)同批作废**;数值 provisional 归 难度曲线与Boss;正式归属(地图战斗资源 的奖励类别/效果面)见 战斗结算「待办」) - armor_effectiveness: Dictionary 攻击类型×护甲→百分比(键集结构冻结 {normal, pierce, magic} × {light, ward, heavy};默认 normal 全 100 / pierce→ward=150、heavy=50 / magic→heavy=150、ward=50——克制 ×150 / 中性 ×100 / 被克 ×50;**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 敌人技能池批改述,原"敌方攻击拍与重击拍基线伤害"退役;无伤害分量的增益技不掷不折〕,穿刺/魔法充能分量与棋盘来源伤害〔伏击附加 / 爆裂 / 清障炸药 / 奖励即时〕必中全额不掷;回合内随机、消费 armor_roll 封闭流逐次掷逐次取号,可逐位回放) + 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_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 命名统一批)**——挖掘期充能/战斗段消费/单轮生命周期、不吃 percent、逐分量 armor_effectiveness 查表 floor 相加 + 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 查表(奖励直伤道具消费方保留) 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] @@ -662,6 +661,7 @@ entities: # Σ各桶点数 × 当轮目标护甲平均甲效倍率 ÷ 100(与直伤同类 1 伤害 = 1 当量,守 行动经济 条款①单一当量)——补式 / 登记待拍板二选一待回填批裁定。 # ② 两处已知落差:a) charge_grants 触发源可扩展 vs 切片仅 safe_cell/flag_hit 两处计数埋点(新增源须加埋点); # b) safe_cell/flag_hit 来源标识跨命名空间同名(结算明细行 source_class / charge_grants 键;RewardTable.pool_tag 已随格面资源批改 cell)。 +# 2026-09-19 充能退役批:settlement_table.charge_grants 字段删除(主角攻击回归单分量——克制策略归冒险前配置);上方 ①「充能当量覆盖缺口」与 ②a「触发源扩展 vs 计数埋点」两条充能相关注记随批废止;DamageMath.charge_component 改名 counter_component(奖励直伤唯一消费方)。 # 验收读数:冒烟 201 项 0 失败 · 四探针 exit=0 无 FAIL(切片侧仍为 pre-v0.7 实现,代码同步随格面资源批新会话执行)。 # # 2026-09-15 护甲等级批(用户拍板登记,只改 GDD 与 registry、不动代码;owner=战斗结算 v0.8 / 敌人系统 v0.3 / 难度曲线与Boss v0.4 / registry 侧 3 条): @@ -762,3 +762,20 @@ entities: # ④ 切片代码同批:battle_orchestrator.gd 主角攻击段 hero_offense 池接线(pool_damage 首参 0 → # _clamped_pool("hero_offense"))+ attack_up 普通分量直乘旁路退役(增伤/乏力覆盖面 = 三份分量合计); # 冒烟护栏三组新断言(削弱续时 / 乘区接线 ×1.5·×0.75 / 硬化折半方向),旧"削弱×2 池触底"采样通道退役。 +# 2026-09-18 甲效矩阵用户调参批(用户逐格给值;与 战斗结算 v0.15 / 敌人系统 v0.9 / 难度曲线与Boss v0.11 / +# 切片代码同批;零代码——事实源 settlement.tres armor_effectiveness 五格改值、四格不动): +# ① 五格改值:normal ward 100→120 · normal heavy 100→50 · pierce light 100→80 · pierce ward 150→120 · +# pierce heavy 50→80(魔法行与 normal light 不动)——三档结构(克制/中性/被克)与「普通行恒中性」退役, +# 改五档(克制/弱克制/中性/弱被克/被克),键集 3×3 满格结构冻结不动; +# ② enemy.armor_type 与 hero.armor_type 两行注记同步(矩阵档值注记改五档读表;hero 轴休眠归因改述为 +# 结构性——敌方攻击不查矩阵,与数值无关); +# ③ 冒烟随批改形:矩阵三行断言改五档读数 + 乘区接线穿刺分量 3→2(3 点 ×80% 取整)——冒烟 300 项 0 失败 +# + 四探针 PASS;击杀区间复算义务随档值变更触发(难度曲线与Boss 联动表义务面扩写),L2 Boss 战 +# 新读数:基础攻击/穿刺弹 ×120、魔法矢 ×50 不变;重甲档现行无消费敌种(零消费格)。 +# 2026-09-18 数值语言拍板批 + 甲效矩阵加法核换装(用户拍板——与 01-核心循环 数值语言条款 / 元进度 / 难度曲线与Boss / 06-待办清单 / 切片代码同批): +# ① 全项目数值语言 = 小整数加法核(模板 C 骨架+模板 A 成长语言):游戏内伤害与成长整数加减,百分比仅保留 +# 增益池/AC 折扣档/暴击三处既有粗档与开发侧工具,新增系统默认整数加法; +# ② armor_effectiveness 量纲 percent→整数点数(三档 +1/0/−1,域 [−3,+3],缺项回退 0;pierce×heavy=0 中性用户拍板; +# 五档百分比词表退役);enemy/hero armor_type 两行注记同步; +# ③ 切片同批:settlement.tres 九格/settlement_table.gd 域与哨兵/damage_math 两函数改加法/battle_orchestrator +# _counter_delta 改名与回退 0/smoke 矩阵断言改形;元进度投值语言锁 flat;GP 提案档位词汇免议注记落 06 清单。 diff --git a/design/ux/battle.md b/design/ux/battle.md index 20dd3eb6..5dcd90f6 100644 --- a/design/ux/battle.md +++ b/design/ux/battle.md @@ -28,7 +28,7 @@ ## Player Context on Arrival - **首次到达**:从关卡首节点(战×2 的第一战)进入。MVP 无引导流,chord 肌肉记忆提示等非模态提示承担首次教学(见 §States) -- **到达前刚在做**:关卡节点链上点击战斗节点(LevelRunner 推进);或上一场战斗胜利后点下一节点 +- **到达前刚在做**:关卡节点图上点击战斗节点(LevelRunner 推进);或上一场战斗胜利后点下一节点 - **情绪状态**:棋手式清明专注(art-bible §2.1,能量 2/10)——挖掘期画面必须无杂音;结算期转为清算爽感(7/10) - **到达方式**:游戏推进送入(非自愿导航),进入即处于挖掘阶段(棋盘已 install、初始 3×3 已展开、小人出生) @@ -39,15 +39,15 @@ ## Navigation Position ``` -存档 → 冒险 → 关卡(节点链,关卡节点地图 lite) → 【战斗屏】 +存档 → 冒险 → 关卡(节点图,关卡节点地图 lite) → 【战斗屏】 ├─ 胜利 → 节点奖励/恢复覆盖层 → 下一节点(下一场战斗屏) ├─ 胜利(末节点 Boss)→ 关卡结算(level_clear,清库反馈义务载体 = 魔法道具背包,随魔法道具 P0 落地)→ 下关 └─ 失败 → 冒险终结 → 返回存档/营地 ``` -战斗屏是**上下文相关屏**(仅由战斗节点进入),非顶层常驻。关卡内节点进度常驻屏顶(A 区),玩家始终知道自己身处链中第几环。 +战斗屏是**上下文相关屏**(仅由战斗节点进入),非顶层常驻。关卡内节点进度常驻屏顶(A 区),玩家始终知道自己身处图中第几环。 -- 上游屏:关卡节点链(节点地图形态 = 线性,关卡节点地图已裁剪为线性第一关) +- 上游屏:关卡节点图(分支节点图形态,切片第一关为单链特例) - 下游屏:节点奖励/恢复覆盖层(NodeOverlay,已有 demo 组件——建议后续单独出 spec `design/ux/node-reward.md`) - 平行屏:结算明细回看 overlay(本屏内域屏)、图例面板 overlay(本屏内域屏) @@ -93,7 +93,7 @@ | 区 | 位置与尺寸 | 内容 | |---|---|---| -| **A 关卡进度条** | 全宽 × 28px 顶栏 | 节点链步进(战 → 战 → 赏 → 战 → 战 → 疗 → 王——文字签槽,对应 battle/reward/rest/boss 四型节点),当前节点奖励金高亮、已过暗金、Boss 旗朱描边 | +| **A 关卡进度条** | 全宽 × 28px 顶栏 | 节点图步进(战 → 战 → 赏 → 战 → 战 → 疗 → 王——文字签槽,对应 battle/reward/rest/boss 四型节点),当前节点奖励金高亮、已过暗金、Boss 旗朱描边 | | **B 战斗画面** | 全宽 × 252px | 英雄卡(左)+ 兑现演出区(中)+ 敌人卡 ×1–3(右);底部结算明细带(24px 摘要 / 结算期 84px 实时流);顶部中央轮次·阶段指示 | | **C 角色信息** | 左下 240px × 520px | HP 条、攻击值(含修正显示)、RAP 池、状态效果槽(固定 4 槽)、小人立绘占位 | | **D 扫雷图** | 中下 ~1036px × 520px(原右下面板删除后横向加宽,吸收其宽度) | 顶部 AP 条(44px:左——AP 点阵 + 停手按钮;右——图例按钮 + 弃图刷新按钮〔雷图右上角,2026-09-12 拍板〕);棋盘主体(居中,格 36–45px 见方);toast 槽(上缘内侧) | @@ -109,7 +109,7 @@ | 区 | 组件 | 类型 | 内容 | 交互 | 现有 demo 组件 | |---|---|---|---|---|---| -| A | LevelStripView | 步进条 | 节点链 + 当前位置 | 只读(点击节点不可跳) | ✅ level_strip_view.gd 迁移 | +| A | LevelStripView | 步进条 | 节点图 + 当前位置 | 只读(点击节点不可跳) | ✅ level_strip_view.gd 迁移 | | B | 英雄卡 | 卡片 | 小人像、HP 条、攻击值、状态效果槽 ×4 | 只读 | HUDView 拆分 | | B | 敌人卡 ×1–3 | 卡片 | 敌像、血条、顺位徽标、意图徽标、状态槽(含敌方 side 池口径:伏击层数为全体敌人共享单值、各卡同值呈现——数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;2026-09-16 敌人技能池批改型:行为环点拆除〔proposal §2.4〕,意图徽标语义 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,敌方增益〔蓄力/硬化〕入状态行) | 只读 | 新建 | | B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 | @@ -281,7 +281,7 @@ | 敌单位 hp/顺位/摇定动作(pending_skill/type/name)/敌方增益/enemy_id/存活 | 敌人系统 只读面(经战斗结算呈现快照) | Read | 意图线索映射全局恒定(敌人系统×4②,技能池批三档口径);**despawn 前捕获**(旧版台账 entry 17③——缺陷②教训) | | 状态效果投影(含空态/极性/溢出) | 增益状态 投影口径 | Read | 极性映射数据源 = 战斗结算 SettlementTable 效果语义,非 magnitude 符号(增益状态×③) | | 已开格奖励身份(奖励徽章) | 地图战斗资源 `query_identity`(经 board_view 身份解析只读回调,组合根注入) | Read | 已开格身份常读——挖掘期 Active 相位内有效;reward_id 全局恒定、禁止重掷;徽章绘制优先级见 §Component Inventory BoardView 行 | -| 节点链/当前节点/HP 携带 | 关卡节点地图 lite · LevelRunner | Read | A 区进度条 | +| 节点图/当前节点/HP 携带 | 关卡节点地图 lite · LevelRunner | Read | A 区进度条 | | 意图提交 | 排雷玩法 | **Write** | `settle_batch`(stop 亦经此——不直调行动经济) | | 弃图刷新 | 行动经济 | **Write** | `request_refresh`(挖掘期 Active 当场受理——布局决策 4 2026-09-12 上游已落稿;战斗结算 `refresh_board` 编排承载) | | 节点推进 | LevelRunner | **Write** | 胜利 overlay「下一节点」 | diff --git a/production/roadmap.md b/production/roadmap.md index 6dc4e341..4c928326 100644 --- a/production/roadmap.md +++ b/production/roadmap.md @@ -25,6 +25,6 @@ 4. **第二关内容批**(门 = 调参行值):深度轴行值 D1–D4 填充 + 新内容投放(技能池定稿后 = 既有池新技能);填齐后两关序列生效。 5. **并行 / 后置轨道**:关卡节点地图 GDD 定稿批(已解锁,与在飞批零文件冲突);魔法道具内容批(排切片收尾后);真人通关率标定(挂 playtest 批);元进度定稿(排 Alpha 前收口——资源关系已裁统一钥石〔2026-09-17〕,剩解锁清单/定价与钥石产出细则)。 -## 维护纪律(收口批四步) +## 维护纪律(收口批五步) -① 改 active.md 顶部快照节 → ② 追加台账条目 → ③ 里程碑移动才更新本文件时间线 → ④ 阶段变更才改 production/stage.txt。Stop 守卫钩子强制 ①②(拦截 + 提醒,不代笔);快照节 ≤10 行,装不下的细节进台账。 +① 改 active.md 顶部快照节 → ② 追加台账条目 → ③ 里程碑移动才更新本文件时间线 → ④ 阶段变更才改 production/stage.txt → ⑤ 重跑 `python tools/loop_dashboard.py` 刷新迭代闭环仪表盘(看验证失效面 / 待办透视 / 台账健康三个读数,落后项即下一批输入)。Stop 守卫钩子强制 ①②(拦截 + 提醒,不代笔);⑤ 为软纪律不挂钩子(工具失败不挡收口);快照节 ≤10 行,装不下的细节进台账。 diff --git a/production/session-state/active.md b/production/session-state/active.md index 9891594a..cdd4b26a 100644 --- a/production/session-state/active.md +++ b/production/session-state/active.md @@ -12,13 +12,15 @@ ## 当前状态快照(收口批先更新本节,再追加台账;≤10 行) -- **更新于**:2026-09-18(战斗数值四议题收口批——议题二/四登记补全 + 叠层调研报告;结构修复批已提交 b51af08) -- **在飞**:表现层升级批未启动(前置 = 美术清单 P0 样张 + 用户看图拍板敌人卡形态);两份美术清单合并待拍板 -- **已完成**:结构修复批已提交(b51af08——乘区接线四件套+削弱续时,冒烟 300 全绿);本批(讨论场收口)= 06-待办新增「首遇位教学敌可被棋盘火力一轮击杀」(议题二)+「敌方护甲等级正式行值」补方向三裁决(议题四)+ design/research 叠层调研报告(议题三 B 终选依据);此前 0da19a5/b7d1b56 两笔 -- **已解锁可做**:验收读数重测批(修复批数值行为再变——AC 判读基线又一次归零,须重测);敌方技能攻击类型轴(克制双向化,中等批) -- **阻塞等待**:曲线调参批(门 = 验收读数重测);状态层重设计批(临时值终值归属:duration/off_guard N 值/当量锚复算;Round1 四裁决已从 grill 会话收编) +- **更新于**:2026-09-19(第7项用户裁示:技能缺漏不修、Alpha 立全怪物技能池数值验证条目;倍率vs加法体系判断已呈——不违背但须圈边界;06 清单 75 条) +- **在飞**:表现层升级批未启动(前置 = 美术清单 P0 样张 + 用户看图拍板敌人卡形态);两份美术清单合并待拍板;多批工作区未提交 +- **已完成**:06 待办清理批(清单 87→80 条;三裁决落地:变异死分支删/快照域进 Alpha 首批/未开格微光拍板;排雷玩法节新增禁拔旗提案登记)+ 冒险内成长提案登记批(GP 临时资源+商店房提案登记 06 清单关卡节点地图节,未评估;台账 74) +- **已完成**:**数值语言拍板批(加法核,台账 75)**——全项目数值语言=小整数加法核(模板 C 骨架+模板 A 成长语言)成文 01-核心循环;甲效矩阵 percent→三档点数 +1/0/−1(pierce×heavy=0 用户拍板,今晨五档 percent 调参〔台账 71〕随批退役);增益池/AC 折扣档/暴击保留百分比+粒度口径成文;元进度/GP 投值语言锁 flat;冒烟 300 全绿+四探针 PASS+flat vs percent A/B(L1 逐值全同、L2 Boss 战基础攻击 +1 生效 hp+100 档 50→60%) +- **已解锁可做**:验收读数重测批(结构修复批+调参批+换装批三次数值行为变更叠加,基线彻底归零须重测;击杀区间复算义务随批);敌方技能攻击类型轴(敌方攻击入矩阵消费面后主角 armor_type 轴才生效) +- **阻塞等待**:曲线调参批(门 = 验收读数重测);状态层重设计批(临时值终值 + 池百分比量纲复核) - **锚点提交**:b51af08 结构修复批 · b7d1b56 收口杂项 · 0da19a5 场景一三落地 · a2fc39f 伤害道具+护甲重配 · c5c52b5 元进度定稿 - **下一步顺序**:验收读数重测 → 状态层重设计批 → 曲线调参批 → 魔法道具内容批 → 表现层升级批(详见 production/roadmap.md) +- **并行会话标旗**:本会话(数值语言批)改面 = 甲效矩阵 7 切片件+战斗结算 v0.16+难度曲线 v0.12+元进度 v1.1+01+registry+06 GP 注记一行;其余在飞改动(06 清理 143 行/board_data.gd/07/冒险结构/增益状态/战斗表现/行动经济/数据配置/设置与本地化/音频/battle.md/analyze_playtest.py)均非本批未碰;design/ 三未跟踪文件维持标旗 ## 项目当前位置 @@ -182,3 +184,30 @@ 68. **收口杂项批(2026-09-18,本会话)**:① **Stop 守卫强判据升级**:active.md 登记判据由 mtime 改**内容哈希比对**(session-snapshot.sh 存内容哈希、stop-active-md-guard.sh 比内容——touch/意外 mtime 变化不再蒙混过关;三态实测:无改动 exit 0 / 改动+未登记 exit 2 / 改动+已登记 exit 0);② registry `scope_event_binding` 行内 armor_roll 条目重复追加一次,已去重(armor_roll= 恰一处);③ CLAUDE.md「文档写作规范标题不对称」待拍板项核实**已解决**(现行规范导航独立标题+表格,无需再做——memory 过期已清)。**遗留登记**:两份美术清单合并、场景四结论回流回填,均见快照节。 69. **战斗数值结构修复批(2026-09-18,本会话——场景四盘问会话四裁决+削弱续时的执行批,全部经用户拍板直接执行,未提交)**:**六项改动**——①主角侧乘区接线:battle_orchestrator 主角攻击段 pool_damage 首参 0 → _clamped_pool("hero_offense")(增伤/乏力合计修正乘到主角攻击);②attack_up 直乘旁路退役:删普通分量 ×(100+up)/100 直乘(base_val 直接用表值攻击),增伤改经 effect_pool_map 走乘区,覆盖面 = 三份分量合计(普通+穿刺+魔法)——sapped 乏力死效果随接线变活(原 hero_offense 池无乘区消费方);③失衡改挂 AC 轴:off_guard unit percent→ac、magnitude +25→−2(provisional),settlement effect_pool_map 删 off_guard 键(hero_defense 池清空、结构保留),走 _defender_ac 既有读法零代码;④硬化符号纠正:fortify +100→−50(负值入 enemy_defense 池 = 主角攻击折半;旧 +100 实际 ×2 翻倍系符号 bug);⑤削弱改续时:weaken stack→refresh、duration 1→2(同名重复授予只刷新剩余结算数、层数恒 1——结构性消饱和,×2 叠满池触底 ×0 免伤轮根治,refresh 实现 empower/fortify 同款零代码);⑥数值终值全部不在本批(provisional 归 状态层重设计批)。**同步面**:冒烟——fortify 断言改形、旧「削弱×2 池触底→damage_floor」采样通道退役(其触发路径随续时结构性消失)、免伤墙护栏注释同步、新增 _smoke_pool_wiring 节四断言(同种子恒同掷点法:充电基线 103 → 增伤 ×1.5=154 / 乏力 ×0.75=77 / 硬化 ×0.5=51 精确关系)+ _weaken_refresh_probe 两断言(授予→衰减→再授予:层数 1、剩余次数重置 2、单层池读数=行值);GDD——战斗结算 v0.14(普通分量直乘句×2+池乘区公式行+现状注记销项)、增益状态 v0.9(三行语义+例子表「削弱叠两层」改「暴走叠两层」+联动纪律句失效改写+调参表一次性六行/刷新行措辞)、06-待办清单(削弱档位条目补续时定案注记;hero_offense「正式化条目」实为战斗结算正文注记承载、06 无独立条目,销项落在正文注记本身)、地图战斗资源 v0.11 极性矩阵 off_guard 行失同步修正(原残留「hero_defense 池,承伤加深」);registry——status_effect 三行+value_status+effect_pool_map 批注+修订记录,顺手收口 fields 漏登(unit 枚举补 ac——2026-09-16 换装批遗留)。**验证**:冒烟 296→300 项 0 失败;ui/click/layout/tune 四探针 PASS(click 问题=0);残留措辞 grep 清零(承伤加深/直乘,版本历史豁免)。**开工纪律**:git status 归属核对干净(仅 3 个 design/ 未跟踪文件非本批,不碰)。**遗留**:Boss 战读数此前全泡在 fortify 翻倍行为里——验收读数重测批必须含 Boss 战;「叠层不续命的读感」06 条目对 weaken 失效但条目本身仍在(stack 行仍有该语义,随状态层重设计批复核)。 70. **战斗数值四议题收口批(2026-09-18,讨论场会话——四议题全部用户拍板,本批=登记残留补全)**:结构修复批(六项 A–F)已由执行会话提交 **b51af08**(乘区接线四件套+削弱续时,冒烟 300 全绿+四探针 PASS);本批补全讨论残留两处登记+调研报告——① 06-待办 关卡节点图节新增「首遇位教学敌可被棋盘火力一轮击杀」(议题二拍板:接受为合法结局·棋盘即武器库,Boss 58 血无秒杀风险已核数;压道具威力否决;教学位修复归 Alpha 内容批抬血/改双敌,与敌方 AC 关内梯度红利互相成全);② 06-待办「敌方护甲等级(armor_class)正式行值」补方向三裁决(全甲:读数重测后与曲线调参同批·AC 0 基线当参照系;偏松带宽杂鱼 0~5/精英 Boss 8~12——方向非正式值;关卡即台阶+L2 关内深度梯度);③ design/research/research-buff-debuff-stacking-survey-2026-09-18.md 新增(56 出处:同名只刷新时长是回合制主流〔BG3 Stack ID/Persona/杀戮尖塔〕/叠数值必配防护〔宝可梦 ±6/WoW 递减〕/无「叠数值减益+大幅封顶+个位数基伤+固定下限」组合先例=免伤轮尺度错配外部佐证/Brotato 百分比词条被怪血膨胀稀释=中循环失配先例——议题三 B 终选与元进度定价警示依据)。四议题结论全量已写入项目记忆(pool-legacy-findings/survival-pressure/fortify-sign/hit-roll-ac 四条已更新收口态)。并行会话未跟踪文件未碰(美术清单×2/格面差异化提案/config_fatal_probe.gd.uid 标旗)。 +71. **甲效矩阵用户调参批(2026-09-18,本会话——用户逐格给值五格改值,事实源 settlement.tres + 全链同步,未提交)**:**①数值**:armor_effectiveness 五格改值——normal ward 100→120 / normal heavy 100→50 / pierce light 100→80 / pierce ward 150→120 / pierce heavy 50→80(魔法行与 normal light 不动);「克制/中性/被克」三档结构与「普通行恒中性」退役,改五档(克制 ×150 / 弱克制 ×120 / 中性 ×100 / 弱被克 ×80 / 被克 ×50,档值读表);键集 3×3 满格结构冻结不动;矩阵消费面成文 = 主角侧(奖励直伤道具/主角攻击三分量/充能分量),敌方攻击不查矩阵——主角 armor_type 轴休眠归因改述为结构性(非数值性),轴生效仍待敌方技能攻击类型批。**②同步面**:settlement.tres 批注块;enemy.tres/hero.tres 批注同步(enemy.tres 顺手订正重配批笔误——原「魔法矢克 Boss ×150、穿刺弹被克 ×50」与当批矩阵正反互倒,按订正注记留痕);smoke_all 两处改形(矩阵三行断言改五档读数 + 乘区接线穿刺分量 3→2〔3 点 ×80% 取整〕、基线 103→102 注释同步);GDD——战斗结算 v0.15(矩阵表/公式注/三档句/调参表行/修订行)/ 敌人系统 v0.9(hero armor_type 注记归因改述+修订行含 v0.8 笔误留痕)/ 难度曲线与Boss v0.11(两处五档措辞+联动义务面扩写:矩阵档值变更与敌种护甲变更同列须复算击杀区间);registry——enemy/hero armor_type 注记 + settlement armor_effectiveness 字段行指路化收口(原九格读数作废)+ 修订记录块。**③验证**:冒烟 300 项 0 失败;ui/tune/layout/click 四探针 PASS(click 问题=0)。**④新旧矩阵同种子 A/B 读数**(level_monte_carlo N=20 种子 4200+20 双策略十档位,先旧后新 stash 切换):完美档 L1 **100%→95%**(首破满通,死因集中节点 4 战斗——pierce 弱化所致,仍越 [35,65] 上界但首次下压)/ L2 100%→100%(承伤 8.8→10.2 +16%);基线档 L1 0%→0%、L2 0%→0%(均维持带下);hp+100 档 L1 基线 **55%→30%**(-25pp 最大变动)/ L2 基线 50%→50%、atk+50/hp+100 60%→50%、atk+100/hp+100 75%→60%、atk+150 与 +200 档持平。**⑤粒度告警**:80 档在个位数威力下 floor 掉整点——穿刺弹 power 2 vs 轻甲 2→1(floor 1.6)、开格充能 3 点→2(floor 2.4),弱被克实感重于名义 20%;跳战率全线下降(L1 19%→14%、L2 37%→22%)即首轮斩杀线被 1 点差破坏的粒度效应。**⑥并行标旗**:tools/analyze_playtest.py 出现非本批改动(未碰)。 +72. **插旗不可逆提案登记批(2026-09-18,本会话——用户新想法登记,纯文档零代码,未提交)**:用户提案把旗从可逆标记改为**一次性承诺**,登记 06-待办清单排雷玩法名下新节「插旗不可逆提案(禁拔旗 + 挖旗格兑付改判)」(状态=待办·未评估)。**提案两件事**:① 插旗后不可再拔旗(拔旗动作退役);② 已插旗的格允许按价直接挖开但兑付改判——四象限:插雷格不动=标中奖励照常/插雷格再挖开=只受挖雷一层惩罚(惊动巢穴照常兑付)标中不发/插安全格不动=标空惩罚照常/插安全格再挖开=零惩罚零奖励。**对照现行**:挖旗格被拒须先拔再挖、标旗后撤旗走战斗结算抵消过滤不进兑付——插错旗合计 3 AP 全额反悔且保留挖格奖励;提案改为 2 AP 换零惩罚零奖励,反悔代价由「多花一遍拔旗钱」改为「放弃该格收益」。**登记同步**:行动经济「拔旗定价复核」条目现状末尾加互相指认(提案落地则拔旗动作整体退役、该条实测义务失义收编;提案被否则维持)。**开放问题四项随条目在案**(挖旗格与连锁交互+遇旗即止链阻断器从可逆变一次性 / 插过旗的格兑付降级在战斗结算的统一口径 / 标中旗锚契约量级随插旗风险面变大是否重校 / 连带面——动作表与「须先拔旗」拒绝原因退役+flag_pull_ap_cost 行+「资格认雷格实例:拔掉重插」约束措辞+HUD 旗交互+教学口径)。**未动面**:排雷玩法/行动经济/战斗结算三文档正文与 registry 零改动(提案未评估,规范不动)。 + +72. **06 待办清理批(2026-09-18,本会话——用户点名"挑 10 项现在就能做的"清理,未提交)**:**新口径**:清单引言改「解决即移除」(原"改状态留痕"废止,去向归台账+git 历史,用户拍板)。**七项移除**——①图版措辞对齐残留清偿(battle.md"节点链"×6→"节点图"+冒险结构"路径分支已后置"句改分支节点图口径+数据配置表清单行;修订记录历史文本豁免);②轮内刷新次数读数缺口核销(实核查发现已落地:battle_orchestrator._refresh_used_this_round 计数+ap_bar_view「剩 N 次」文案即消费方;行动经济.md 刷新节补只读观测量登记句);③敌种线索键集差异核销(呈现层映射已改 pending_type 类型级、零敌名映射,条目前提随技能池批消失;README 旧敌名"蛆虫/伏击兽"过期标旗另批);④敌方攻击区间正式侧落文核销(敌人系统.md 字段表 atk_min/atk_max 行已在,落文完成);⑥坍塌显形对位批次约定=表现层升级批(音频.md×2 处+战斗表现.md 待办节写入);⑦音量控制分工口径收口(音频成文,入口归设置/生效归音频,两文"待定稿"措辞清偿);⑩快照域进 Alpha 存档首批(用户拍板推荐案)。**两项改写**——关卡表与冒险表条目:关卡表半边核销(level.tres+schema+加载行齐备)、剩余面改写为「冒险表未建表」(registry 注记零代码影响、建账归冒险结构定稿批);变异对初始展开条目:死分支半边执行清偿(board_data.gd compute_r0 泛洪条件删 variants 空判——与排雷玩法展开口径归一,注释留重接义务,冒烟 300 项 0 失败)、剩余面=变异格影响开局展开语义随变异定稿批。**一项拍板登记**——未开格类型徽章条目写入用户微光方案(周围 8 格常显奖励类型色光:魔法紫/穿刺蓝/群伤红/治疗绿/其他增益黄,服务护甲克制规划;连带五面:不做清单"未开格不显示奖励身份"owner 修订合法/art-bible §4.6.3 家族徽章对齐归美术批/探宝罗盘价值清空归魔法道具重定批/色板冲突检查归样张批/实施窗口=表现层升级批且切片默认不开护读数基线)。**数字与标旗**:清单 87→80 条;git status 并行会话在飞 hunks(敌人系统/entities.yaml/三 tres/smoke/analyze_playtest.py 等)未碰;非本批编辑面零重叠已核对。 +73. **冒险内成长提案登记批(2026-09-18,本会话——用户新想法登记,纯文档零代码,未提交)**:用户提案补冒险循环内的中途成长缺口(关卡/战斗之间怪物数值抬升、主角数值零成长),登记 06-待办清单**关卡节点地图**名下新条目「冒险循环内成长提案(临时资源 GP + 商店房节点)」(状态=待办·未评估;主责=关卡节点地图修订批——商店房是其节点封闭枚举的修订面)。**提案骨架**:新增**冒险类临时资源 GP**(暂拟名,DND 金币意象;与钥石分工 = 局内一次性属性提升 vs 跨局永久强化)——获取两途径(①战斗胜利掉落;②地图战斗资源新增格面枚举,某些安全格/雷格奖励身份=GP);转化 = 关卡节点图在奖励房/恢复房之外新增**商店房**节点,GP 购买属性提升,商品随机三选一+刷新机会保持随机性(拿到金币不必然买到想要的属性)。**开放问题六项随条目在案**(GP 格面与七型同池关系+雷格极性语义 / 战斗掉落量级与记账归属 / 商店房进 v1.0 封闭枚举的修订面〔编排/图校验/选路/兑付移交〕 / 商店内容与定价〔属性档位词汇/价格曲线/三选一池/刷新费用〕 / GP-钥石双币分工与 HUD 呈现 / 商店成长=通关率带新杠杆的验收纪律——强条目同类)。**互相指认**:地图战斗资源「雷格与安全格的资源分布差异化(Alpha 批)」现状末尾加指认句(GP 格面枚举同为奖励身份词汇的结构修订,立项评估一并入列)。**顺带**:active.md 台账撞号订正(两条 72 → 72/73)。**未动面**:各系统文档正文与 registry 零改动(提案未评估,规范不动)——同插旗提案登记批纪律。 + +74. **06 待办二轮清理·第1项(2026-09-18,本会话——用户逐项裁决模式,未提交)**:连锁批量奖励溢出条目核销删除(80→79 条)。**裁决依据**(用户确认+实核查):分类成立——①直伤半边本无上限、溢出=过量击杀,语义无问题;②buff 半边现状分两半:削弱/蓄力/硬化已改 refresh 续时结构性不溢出,增伤/护甲强化(格面奖励落点,cap=2)与伏击/暴走/失衡/乏力(cap=16)仍 stack 有上限——但溢出处理**已实现且已成文**:满层原子拒绝(status_container.gd 零写入)+结算明细逐层「溢出未生效」行(battle_orchestrator.gd _emit_row overflow,伏击负向 blast 同协议),增益状态.md 93/95/190/236 四处成文(浪费诚实可规划/两授予入口同协议/容器契约/明细协议)——现行"显式接受、零补偿"即正式语义,无新改动。用户指令:无新修改则直接删条目——执行。用户理解修正记录:buff 全改续时系部分(3/9 refresh、6/9 stack),增伤/护甲强化保留 stack 是刻意设计(挖格叠层数字正反馈),与削弱防饱和改法目的不同,未跟随改续时。 + +75. **数值语言拍板批·甲效矩阵加法核换装(2026-09-18,本会话——plan 模式三子 agent 并行执行,未提交)**:**①拍板链**:用户问"加法修正是否适配我们数值系统"→ 数值体系分析定调(战斗核已是整数加法、修正层是百分比器官——个位数威力下 120 档 +0%/80 档超重,百分比分辨率低于刻度)→ 四模板对比(TRPG 加法系/垂直乘法系/小整数 Roguelike 系/幸存者like 指数系)→ 用户拍板**小整数加法核(模板 C 骨架+模板 A 成长语言)**;GP 兼容性确认(杀戮尖塔商店同构,条件=成长步 flat 整数)后用户指示 GP 不设计、先完成数值系统调整。**②矩阵**:armor_effectiveness 量纲 percent→整数点数,三档 克制+1/中性0/被克−1,九格 normal[0,+1,−1]/pierce[−1,+1,**0**]/magic[0,−1,+1]——pierce×heavy=0 中性为用户本次特别拍板(重甲挡刀刃不排斥穿刺;现行无重甲敌种);三档而非五档理由=攻击基线 2 点刻度下 ±2 触伤害下限或翻倍超重(假粒度),攻击成长后可扩弱档;今晨五档 percent 调参(台账 71)随批短命退役。**③执行**(plan 批准后三子 agent 并行、互斥文件集):批1 切片 7 件——九格改值+批注、schema 域 [0,999]→[−3,+3]+**缺项哨兵 −1→−99**(−1 已合法)、damage_math 两函数改加法、battle_orchestrator _armor_effectiveness→_counter_delta+回退 100→0、smoke 矩阵断言改形(乘区接线基线 102 恰好不变:3 点−1=2)、enemy.tres 批注改写/hero.tres 不动;批2 战斗结算 v0.16(三档加法表/公式③算子 ×甲效倍率→+克制修正点数/量纲句/调参表行/池乘区粒度口径句成文);批3 01-核心循环新增「数值语言」三条款+难度曲线 v0.12+元进度 v1.1(三柜台投值语言锁 flat 整数)+registry armor_effectiveness 行与 L258 注记+修订块+06 GP 条目补语言免议注记。**④子 agent 受控偏离两处(均正确)**:敌方攻击路径 rolled_component 字面量 100(percent 中性)→0(加法中性)——不改则敌方伤害 +100;charge_component 增空桶护栏 points≤0→return 0——零充能桶+被克 −1 会产生负分量(旧量纲 0×80%=0 天然为零),护栏等价旧语义。**⑤验证**:主会话全量冒烟 300 项 0 失败+四探针 PASS(click 问题=0);五档/弱克制活文本 grep 清零(版本历史与"随批退役"描述豁免);monte carlo flat vs 今晨 percent 同种子 A/B——L1 十档位逐值完全一致(轻甲消费方两量纲同值),L2 唯一行为差=基础攻击对 Boss 魔法甲 +1 生效:基线 0→5%、hp+100 50→60%、atk+50/hp+100 50→70%、atk+100/hp+100 60→85%、atk+200 裸 20→35%、完美档承伤 10.2→8.1(Boss 战加速)。**⑥并行窗口**:并行会话同时在飞 06 清理批(台账 72/74)/GP 提案登记(73)/插旗提案登记(72)——本批与其文件交集仅 06-待办清单(我方 1 条注记 L454 与其 143 行清理已核对共存);其快照提及的本会话在飞 hunks(敌人系统/entities.yaml/三 tres/smoke)即本批改动,互标旗机制正常工作。**⑦边界**:增益池/AC 折扣档/暴击量纲换算、敌方技能攻击类型轴、GP 设计、元进度投值、git 提交——均不在本批。 + +76. **试玩日志数据分析批(2026-09-18 深夜,用户指令"功能改完后要试玩验证+冒险日志数据分析,至少 20 遍")**:加法核构建 **80 遍模拟试玩**(两关 × 20 种子 × 普通/完美双画像,种子 4200-4219;全量 JSONL 日志 user://logs/playtest_4200_20260919T000930〔第一关〕/T001343〔第二关〕两份各 400 局含十天赋档——连同天赋档全扫共 800 局)。**基线档三层数据分析**(tools/analyze_playtest.py):第一关普通 0% 通关/造伤 38.0(奖励占 37%)/承伤 19.4/死因分散节点 0-6(前段即死);第一关完美 95%/造伤 139.1(奖励占 27%)/承伤 8.9/唯一死因节点 4;第二关普通 5%/死因 Boss 13/19(68%)+节点 1 五次;第二关完美 100%/承伤 8.1/零死亡。战斗节奏全场均 1.9~2.2 轮、35% 战斗首轮内结束(跳战/速杀)。**四条发现**:①普通画像承伤 19-23/局 vs 生命上限 17——一命打不满一关,普通模拟档画像过弱问题持续(并入曲线调参批);②L2 Boss 占普通画像死因 68%(Boss 战是普通玩家主墙);③完美档双关 95%/100%、承伤 8~9 健康(仍越 [35,65] 上界,方向正确);④奖励占输出 27-37%(旧种子 421 读数 68% 系旧构建不同口径不可直比,新基线随验收重测批定锚)。**边界**:模拟试玩(autoplay 双画像)≠真人试玩——真人试玩批次 2 仍排队(验收批三数据源之一)。 + +75. **06 待办三轮清理批(2026-09-19,本会话——用户逐项裁决模式第二轮 10 条中的 8 条,未提交)**:**board_type 词表定稿改名批(用户拍板:图级单值字段命名 board_type、玩家侧显示名「地图类型」、词表 {dungeon, underdark})**——代码:board_gen_table.gd 域校验升级(非空→词表成员检查,BOARD_TYPE_VOCABULARY 常量)/board_gen.tres 12 行改单值(L1 五行 dungeon、L2 七行 underdark——「第二关=幽暗地域」从文案变数据)/board_generator.gd 取值单值化/board_data.gd biome→board_type/config_db.gd variant_pool 签名 Array→String(休眠无调用方);文档:棋盘生成.md 图类型节+调参表行+下游行、地图战斗资源.md「启用等词表落定」两处改定稿注记、registry 三处(variables/rule/variation board_type/board_gen_table 字段行)、experiment_density.gd 旧键同步;冒烟 298 项 0 失败。**五项核销**——①board_biome 词表条目(本批收口);②标错惩罚条目(用户判过期属实:极性矩阵已取代——标空=该安全格资源负向兑付,排雷玩法 v0.3+地图战斗资源 v0.4+代码三面证据);③④第二关"解锁新元素"+第二关技能池与投放两条(用户判过期属实:巨蜘蛛/卓尔/突刺/撕咬/毒爆已落地、层名幽暗地域在用、池投值表+EV 锚已登记);⑤资源预读与推理的边界(并入未开格类型微光条目,加指认句)。**一项定案落文**——速杀退化预警阈值 provisional 40% + 刷新经济监控日志先行(07-体验验证清单新⑥⑦两节,纯日志侧不影响玩法;06 删速杀条目、刷新条目改写剩基线后半边)。**一项对齐收口**——设置持久化随存档走(设置与本地化.md 三处+存档序列化.md 承载表补行)。**一项排队注记**——两关序列未生效(用户裁决不挡验收重测,随正式侧冒险结构批)。**并行会话标旗**:smoke_all.gd/settlement.tres 23:58 仍有甲效批(加法核换装)未提交 hunks 在工作区,本批未碰其 hunks;冒烟基线 300→298 系甲效批断言合并(4 矩阵断言→3 等),与本批无关已核实。**遗留**:第2项充能奖励去留待用户终裁(用户心智模型修正已交付:充能≠改变攻击类型,是叠加分量;删除=结构批)。 + +77. **迭代闭环仪表盘批(2026-09-19,本会话——gdd-manager 技能受托"按开发流程构建所需之物",纯新增零侵入,未提交)**:**背景**:闭环状态分散六处(快照节/台账/GDD 版本史/06/07/git 在飞),每次「文档→切片→再文档」迭代都要人工拼图。**新增 `tools/loop_dashboard.py`**(标准库零依赖,只读不改被扫文件)——聚合七面:①active.md 快照节直读;②git 在飞分组(GDD/切片代码/数据表/设计侧其他/工具/会话产物+未跟踪清单);③GDD 28 份版本史清单(版本取「版本历史」表最大行+版本日期+文件 mtime+在飞标记,按四循环分组);④06 待办 73 条解析(状态四桶:待办 45/部分收口 5/拍板待执行 2/**解决态残留 20**);⑤07 体验验证 7 项+重测批义务原文;⑥台账健康(台账区=最后一个二级标题之后,撞号检测+下一编号建议——实测撞号 72/75 各两条,建议下一编号 77 即本条);⑦路线图步骤+近期提交。**产物 `production/loop-dashboard.html`**(自包含暗色单文件,`--open` 直开浏览器;Edge 无头截图两轮迭代验证排版——修掉待办全目重复渲染与网格拉伸两处)。**核心检测器 = 验证失效面**:07 头部「当前批次来源」行引用的文档版本 vs GDD 现行版本自动比对,首跑实战命中——07 引战斗结算 v0.14、现行 v0.16(加法核批 v0.15/v0.16 未回填 07 头注),增益状态 v0.9/地图战斗资源 v0.11 一致;检测器只报差异不代改(07 回填归验收重测批或文档批)。**另两项只读发现(不代处置)**:①06 按 2026-09-18「解决即移除」新口径仍有 20 条解决态残留(含旧口径期的留痕条目)——清理债清单已单列成卡,逐条移除归用户裁决;②台账撞号系并行会话追加所致(历史不改写,编号有效)。**解析约定**写在工具头注(快照节标题含纪律后缀按关键词匹配等),六源格式变更须同步。**改面**:新增 3 文件(工具/HTML/qa 截图验证件)+ active.md 快照节「更新于」行改写;并行会话在飞 hunks 与未跟踪文件未碰;冒烟不适用(零切片代码)。 + +76. **充能退役批(2026-09-19,本会话——用户终裁"删除充能",结构批,未提交)**:**裁决链**:用户心智模型"拿充能改变主角攻击类型"经澄清不成立(充能 = 普通攻击外叠加穿刺/魔法分量,与营地 attack_type 换型轴不重叠),但简化方向(克制策略归冒险前配置、局内不堆选项)成立——两案选择用户拍板删除。**代码**:battle_orchestrator 攻击段单分量化(payload 携带实际攻击类型键 + roll/ac/tier)、_charge_points/_charge_counts/_charge_component/round_facts 充能键全删、DamageMath.charge_component → counter_component 改名(唯一消费方 = 奖励直伤道具的克制直伤,保留)、settlement_table schema charge_grants 字段+校验删除、settlement.tres charge_grants 键+供给注释删除;语义保留 = 攻击类型属性轴×棋盘奖励触发源抽象分离纪律、奖励直伤克制结算。**冒烟改形**(298→293,净减 5 = 充能断言组退役):乘区接线探针单分量基线 100(原充电注入 102)、三分量断言改"类型键+掷点读数"、②′充能定义+②″改投桶探针整组退役、标中旗断言改正向兑付行、恢复点探针换种子 4242→42(原种子在新输出模型下恢复点前败北——探针目的=验回复公式,种子仅载体,换种注释在案);冒烟 293 项 0 失败 + 四探针全 PASS(ui/click/layout/tune exit=0)。**文档**:战斗结算 v0.16(挖格/旗判定批充能条款删、充能退役注记替原供给表、乘区公式改攻击合计、调参表 charge_grants 行删)、07 清单速览表+③④观测项措辞、README 三行改退役注记、registry 四处(charge_grants 行删/ac_roll 吃掷点范围/effect_pool_map Σ三分量→攻击合计/mechanics F6 规格句改型+退役注记行);06 删「充能奖励的正式归属」条目(72 条)。**同批前置**:board_type 词表定稿改名批(75 号台账后追加执行——board_gen_table 词表域校验/tres 12 行 L2=underdark/生成器单值化/config_db 门控签名/棋盘生成.md/地图战斗资源.md 两处/registry 三处/experiment_density.gd 旧键;冒烟全绿)。**数值后果登记**:主角输出期望下降(原充能约占输出 1/4~1/3)——验收读数重测批义务再加码;混合甲战斗主角常态输出只吃一种克制(设计代价,用户知情拍板)。 + +77. **普通画像 v2·基础定式换装批(2026-09-19,本会话——用户拍板"乱点普通策略无用,分级扫雷推理")**:**①分级依据**(经典扫雷定式文献):新手级=单数字满足规则(满足即标:数字=邻雷未开数⇒全标;满足即开:数字=已标旗数⇒余邻全开)——教一眼会、正常玩家两局即会的最低门槛;进阶级=联动定式(1-1/1-2/1-2-1/1-2-2-1/子集缩减)与概率——本切片归完美档 subset 推理承载,不入普通画像。**②实现**:auto_player.gd 增 novice_action + _deduce_single(仅 single 规则不动点,无 subset;无处可推时挖边界格兜底、不刷新)——policy="normal" 语义整体升级,旧"无推理最近格"口径退役(其读数留台账 71/76 作历史);level_autoplay._autoplay_battle 改单步决策循环(move/dig/flag,rejects<3 防御)。**③验证**:冒烟 293 项 0 失败(条目数 300→293 系并行充能退役批清单一变动,非本批);同种子回放确定性保持。**④新读数 vs 乱点旧读数(基线档 N=20 种子 4200)**:L1 通关 65%(旧 0%)/L2 90%(旧 5%)——踩雷/战 5.2→0.18/0.10(满足规则几乎排雷)。**⑤判读**:两关基线均越带**上**界(L1 65% vs 带 [10,25]%、L2 90% vs 带 [20,40]%——从越下界翻转为越上界);**L1 65% < L2 90% 关卡台阶倒挂**(L1 相对更难:5 战节点消耗+Boss 50 血墙,L2 行值随充能退役批重调后偏松)——全部读数是曲线调参批新输入,本批不动行值。**⑥口径注记**:本次扫描反映"加法核+充能退役"(并行会话 2026-09-19 批,Boss 50/58 血、charge_grants 删)组合构建。 + +77. **越权更正批(2026-09-19,本会话——用户指出 75 号台账中 6-10 项未经批准即执行,全部回滚)**:用户纪律立规:**决策项必须逐项获得用户明确批准才可执行;推荐/建议不构成批准;严禁把建议写成"用户裁决"落文**。回滚面:06 清单恢复四条目原文(第二关"解锁新元素"/第二关技能池与投放/资源预读与推理的边界/设置的持久化归属——git show HEAD 逐字提取插回原位,76 条);两关序列条目状态行伪注记「用户裁决:排队不做」抹除还原「待办」;未开格徽章条目撤"资源预读边界并入"指认句+编号回退;设置与本地化.md 三处、存档序列化.md 一行还原待办口径。**不受影响面**:充能退役批、board_type 批、1-5 项处理(1/3/4/5 有用户授权,2 有终裁)。05→06 批次后续:6-10 五项已重新呈报等用户逐项拍板。 + +78. **清单卫生微批·A 段(2026-09-19,本会话——三选项用户拍板全按推荐:07 回填现在做/残留出裁决单再执行/仪表盘入收口纪律;B 段=残留清理待裁决单过目后执行,未提交)**:**①07-体验验证清单 头注回填**——「当前批次来源」由结构修复批单批改写为**战斗数值四连批**(结构修复 v0.14→甲效调参 v0.15→加法核换装 v0.16→充能退役 v0.16 追行;版本锚 v0.16/增益状态 v0.9/地图战斗资源 v0.11;充能退役批当日已更新 07 正文观测项③唯漏头注,本批补齐);「验收读数重测批义务」两行改写——重测变量扩为四批叠加(削弱续时+乘区接线+甲效量纲换装+充能退役)禁与旧读数混算、旧读数作废清单补「充能期(三分量输出)全部战斗读数」;观测项①–⑦语义未动。**②roadmap 收口纪律四步扩五步**——新增第⑤步「收口后重跑 tools/loop_dashboard.py 刷新仪表盘」,软纪律不挂钩子(工具失败不挡收口,Stop 守卫两层判据维持现状)。**③仪表盘桶前缀小修**——「已部分收口/已部分清偿」归部分收口桶(原落「其他」桶,heal 负向直伤量级锚条目实测命中)。**④B 段裁决单已交付**——06 二十条解决态残留逐条核对反向引用完毕:裁决本体全在 owner 文档成文,默认全删;连带动作两类——护甲掷点三连条目(掷点形式/随机流归属/行值未定)三角互指随同删自消、docs/acceptance-ap6-ac.md 三处提法改指战斗结算;另五条(精英Boss编码位/第二关深度轴/第二关投放/换算率启用/临时音效覆盖)的清单内指认句执行时定位改指 owner 文档;等用户一次性过目后执行删除。**验证**:仪表盘重跑失效面转绿(07 引用与现行版本一致);07/roadmap/tools 为本批改面,06 未动(B 段才动);并行会话台账 76/77×3 撞号由仪表盘台账健康栏亮出(含本条前邻居),编号按 max+1 取 78。 + +78. **6-10 用户裁决落地批(2026-09-19,本会话——继 77 号回滚后用户逐项真实拍板,未提交)**:**第6项 删除**——第二关"解锁新元素"条目移除("解锁什么"已有事实答案;层名回填冒险结构这半步用户裁示"后续有其他改动再整体做设计");**第8项 并入+新立项**——资源预读与推理的边界条目删除、未开格徽章条目加指认句(预读边界按微光方案定);魔法道具节新立项「探宝罗盘效果重定——两方案评估」:①色光永久化路线(8 格色光人人常显,罗盘退役)②可选天赋路线(预测秘宝改黑帝斯塔罗牌式可选天赋增强件)——两方案不互斥,归魔法道具内容重定批;**第9项 Alpha 验收条件**——两关序列条目状态改写:垂直切片期可接受现状(测试直入口),**列入 Alpha 版本验收条件**,正式推进与接口漂移 ①②③⑥⑦ 对齐随 Alpha/正式侧冒险结构批;**第10项 设置独立于存档(用户两分制)**——系统级设置(音量/画面)一安装一份、删游戏才消失、不进存档;存档只存该档生涯数据。落文:设置与本地化.md 三处(独立存储定案)+存档序列化.md 边界表补行(系统级设置不入档)+06 条目删除。**第7项 待二轮**——用户要求 L1/L2 池对比后再定夺,报告已呈:数据面纪律全满足(每池恰一普攻/增益≤1/保底 M=4 全局)、EV 台阶方向正确(L1 1.00~1.11 → L2 1.11~1.67);两候选缺漏待裁:① L2 Boss 卓尔池无增益技(普6/重2/毒2,硬化未入池——registry"硬化=Boss 池独占载体"语义张力,有意设计还是遗漏待裁)② 敌人系统.md 池构成表只有 L1 三敌种,L2 三敌种(巨蜘蛛/重击手/卓尔)语义模板未成文(曲线 v0.7 有修订记录、正文表缺席)。06 清单 74 条。 + +79. **第7项裁示+Alpha 验证立项批(2026-09-19,本会话,未提交)**:用户裁示技能缺漏不做当期修复(后续可能全怪物技能池整体重设计,切片期只保正常游玩);06 新立项「Alpha:全怪物技能池数值验证与合理性设计」(难度曲线与Boss 主责+敌人系统共裁;范围含池构成/权重/倍率/冷却/保底/EV 台阶/克制覆盖+倍率取整抖动复核+卓尔增益技与文档 L2 行两缺漏复核;时点 Alpha 随验收重测同窗口)。**倍率 vs 加法体系判断**(已呈用户):不违背——加法纪律管修正层(克制/增益/强化走 ±N),技能倍率属基线差异层(伤害公式第一乘"基线×倍率");保留的两点技术理由 = 元进度 flat 攻击成长下倍率自动缩放(flat 附加会被基线成长稀释——Brotato 教训镜像)、个位数基线下倍率结果仍小整数(atk 2~3 × 1.5~2.5 → 3~8);两点须管住 = 数值语言根基批开工时把"技能基线倍率"登记为第四个合法乘法位(现行拍板文字"百分比仅保留三处"未点名它,字面张力)、取整抖动归 Alpha 验证条目。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/README.md b/prototypes/dungeon-sweeper-vertical-slice/README.md index 328182fb..fe46da23 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/README.md +++ b/prototypes/dungeon-sweeper-vertical-slice/README.md @@ -47,6 +47,8 @@ Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://smoke/s **日志合规(2026-09-12 用户要求)**:任何模拟运行与真人试玩均落全量 JSONL(user://logs/)——逐操作(op/cell/accepted/round)、逐结算明细行、轮次状态快照、battle_end、level_end。模拟(level_monte_carlo / 调整板批量模拟 / supply_scan)一文件多局,run 行携带种子/档位切分局次。 +**试玩画像口径(2026-09-19 用户拍板固化——全项目试玩/扫描/面板模拟一律只用以下两档,随机策略口径退役)**:`policy="normal"` = **普通画像·基础定式**(单数字满足规则——满足即标/满足即开,无处可推盲挖边界格、不刷新;教学后正常玩家的下限近似);`policy="perfect"` = **完美画像**(single+subset 全推理零盲挖/卡死刷新——技能上界仪)。实现单一出口 = `smoke/auto_player.gd`(novice_action / perfect_action)经 `smoke/level_autoplay.gd`,调整板批量模拟与 level_monte_carlo 自动同口径;战斗层冒烟夹具与调试转储的 `choose_dig` 直调是机制测试夹具、不承载画像语义。分级依据与新旧读数(乱点 0%/5% → 基础定式 65%/90%)见 auto_player.gd 普通策略档节与台账 77。 + 单关诊断:`--script res://smoke/level_debug.gd -- [seed] [atk%] [hp%]`。 战斗级工具(v1 遗产):`dump_battle.gd`(结算流水)/ `monte_carlo.gd`(战斗期望)/ `experiment_density.gd`(密度调参)。 @@ -243,14 +245,14 @@ Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://smoke/s | 设定 | 实现落点 | |---|---| | 敌人护甲类型:轻甲 / 魔法护甲 / 重甲 | EnemyTable 新字段 `armor_type`({light,ward,heavy},缺省 light 向后兼容)· 映射:goblin=light / bugbear=ward / ogre_chief=heavy(教学梯度候选,provisional)· B2.spawn 行值快照入单位字典 | -| 伤害三段:①普通 ②穿刺 ③魔法(后两者由充能供给) | B1 战斗段主角先手攻击改三分量:普通 = atk×(1+attack_up)(**不吃克制**,attack_up 消费面不变);穿刺/魔法 = 充能点数(按攻击类型分桶)×克制(分量各自 floor 后相加);hero_attack 行携带 normal/pierce/magic 分量(P2 归因)。**攻击类型是伤害的属性轴,与来源无关**(2026-09-15 抽象分离批) | -| 充能供给(奖励侧定义,可改) | SettlementTable 字段 `charge_grants`(触发源 → {attack_type, per_unit, cap}):现行 safe_cell(本轮开格,初始展开格不计 reward_eligible=false)→ 穿刺桶 1/格、单轮计数上限 8;flag_hit(首次标中雷,与 weaken 同键每雷实例一次去重)→ 魔法桶 2/雷。换桶/换量/换成增益或道具都只改本字典——攻击类型与矩阵不动 | +| 伤害单分量(2026-09-19 充能退役) | ~~B1 三分量~~ 主角攻击 = 单一基础分量:量 = atk(表值)、类型 = hero.attack_type(营地换型 = 改字段);hero_attack 行携带实际攻击类型键 + roll/ac/tier 掷点读数(P2 归因)。**攻击类型是伤害的属性轴,与来源无关**(2026-09-15 抽象分离批纪律保留) | +| ~~充能供给~~(2026-09-19 退役) | SettlementTable 字段 `charge_grants` 已删除——挖掘攒弹药的第二伤害供给取消,克制应对 = 冒险前配型(hero.attack_type)+ 棋盘火力(穿刺弹/魔法矢直伤道具) | | 克制矩阵:克制 ×150 / 中性 ×100 / 被克 ×50 | SettlementTable 新字段 `armor_effectiveness`({normal,pierce,magic}×{light,ward,heavy} percent,缺项回退 100)——刀/AOE/清图奖励**恒定表值不吃克制**(道具=万能稳定伤害,暂定待拍板) | | 标错旗 → 随机轻惩罚三选一(时效 1 结算) | `_apply_miss_backlash()`:① `enrage` 暴走(敌 +25% 进 enemy_output 池)② 敌方伏击 +2 层(复用 ambush 行)③ `off_guard` 失衡(我方 +25% 进 hero_defense 池 = 多挨打);新 B3 行 ×2(dur=1 与 weaken/ambush 同款先兑付后衰减);沿用 `_flag_miss_seen` 每雷格实例一次去重 | | 随机载体 | **零新流确定性派生**:(x×7 + y×13 + 板序号×5) mod 3——同种子可回放、不扰动既有三条封闭流取号序;正式侧候选 = RngService 新增封闭流(待拍板) | | 呈现 | 敌人卡环点行常驻护甲标签(轻甲/魔法护甲/重甲——克制对策可读前提)· 结算明细主角攻击行拆"(普通 X + 穿刺 Y + 魔法 Z)" · 反噬效果行入明细流 · settlement_snapshot 增 armor/charge 字段(JSONL 数值分析面) | -**数值全部 provisional 待拍板/调参**(登记于 enemy.tres / settlement.tres 注释):charge_grants(开格→穿刺桶 1/格 · 计数上限 8 · 标中旗→魔法桶 2/雷 · 无上限)· 矩阵 150/100/50 · enrage/off_guard 25% · 伏击 +2 层 · 护甲映射 goblin/bugbear/ogre——C3 调参时按 F6 供给平衡式复算(三段充能是新增伤害供给,裸装败北/基线通关率两条冒烟路径已复验仍成立)。 +**数值全部 provisional 待拍板/调参**(登记于 enemy.tres / settlement.tres 注释):~~charge_grants~~(2026-09-19 退役)· ~~矩阵 150/100/50~~(加法核 +1/0/−1 换装)· enrage/off_guard 25% · 伏击 +2 层 · 护甲映射 goblin/bugbear/ogre——C3 调参时按 F6 供给平衡式复算(三段充能是新增伤害供给,裸装败北/基线通关率两条冒烟路径已复验仍成立)。 **正式侧义务(GDD/registry 修订清单,待文档批)**:B2 GDD(EnemyTable armor_type 字段 + schema)、B1 GDD(F3 主角攻击三分量构成 + flag_miss 反噬编排 + 克制矩阵载体)、B3 GDD(六行 MVP 状态表 + source_class flag_miss 授予)、A2 OQ1(标错惩罚候选升级为三选一随机池 + 重复性口径=每雷格实例一次)、registry(enemy/settlement_table/status_effect 条目 + A3 条款②锚与条款③不等式重推导——标中旗收益从纯 weaken 变"weaken+魔法 充能")、C3(数值 provisional 接管)。lore 侧:`design/research/lore-nest-metaphor-2026-09-12.md`(穿刺=地利/魔法=封印暴露、反噬=封印失败——待新会话拍板后写回 game-concept)。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd b/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd index 272cd5e4..33d998db 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/battle_orchestrator.gd @@ -61,7 +61,6 @@ 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 收口——表值运行期不可变) -var _charge_counts: Dictionary = {} # 本轮充能计数 {奖励触发源: 计数}——投哪个攻击类型桶由 settlement.charge_grants(奖励定义)决定,本类不认识"开格=穿刺"这类绑定 func _init(db_ref, rng_ref) -> void: @@ -209,7 +208,6 @@ func _settle() -> void: if not (snap is Dictionary): continue if evt.kind == "safe": - _charge_counts["safe_cell"] = int(_charge_counts.get("safe_cell", 0)) + 1 # 充能计数(开安全格 = 奖励触发源;只计数,投哪个桶由 charge_grants 决定) _grant_routed(snap, "positive", "safe_cell", evt.cell, ri, "") elif evt.kind == "mine": _grant_routed(snap, "negative", "mine_hit", evt.cell, ri, "") @@ -313,10 +311,10 @@ func _apply_flat_row(row: Dictionary, source_class: String, cell: Vector2i, ri: _emit_row("reward_ineffective", source_class, cell, ri, "%s 未生效(无存活敌人)" % display, 0, {"batch_key": String(row.reward_id)}, highlight) return "zero" var atk_type: String = String(row.get("attack_type", ctype)) - var eff: int = _armor_effectiveness(atk_type, String(target.get("armor_type", "light"))) - var dealt: int = DamageMath.charge_component(power, eff) + var delta: int = _counter_delta(atk_type, String(target.get("armor_type", "light"))) + var dealt: int = DamageMath.counter_component(power, delta) _enemy_system.apply_damage(target, dealt) - _emit_row("damage", source_class, cell, ri, "%s → %s" % [display, String(target.display_name)], dealt, {"target": String(target.display_name), "attack_type": atk_type, "effectiveness": eff}, highlight) + _emit_row("damage", source_class, cell, ri, "%s → %s" % [display, String(target.display_name)], dealt, {"target": String(target.display_name), "attack_type": atk_type, "effectiveness": delta}, highlight) return "redeemed" if ctype == "heal": if String(row.get("polarity", "positive")) == "negative": @@ -361,7 +359,6 @@ func _judge_flag(evt: Dictionary, ri: int) -> void: return # 去重跳过(资格以雷格实例为键——排雷玩法 诚实重复上报的对侧);零明细行 _flag_consumed[cell] = true _perfect_hit_true += 1 - _charge_counts["flag_hit"] = int(_charge_counts.get("flag_hit", 0)) + 1 # 充能计数(标中旗 = 奖励触发源;每雷实例一次——忘拔旗不重复充能) var snap = _reward_economy.grant(cell) if not (snap is Dictionary): return @@ -441,43 +438,32 @@ func _roll_round_actions() -> void: func _combat_segment(ri: int) -> void: var L := _status_effects.pool_layers("ambush") # 授予段后的当轮值;池共享不消耗 # ⓪ 主角先手攻击(基础攻击恒存在——2026-09-11 用户裁决;先于敌方行动;授予段负向直伤致死 → 致电短路不先手)。 - # 三段伤害构成(2026-09-12 用户拍板;2026-09-15 命名统一批 + 攻击类型/奖励抽象分离批):基础分量(atk,吃掷点, - # 类型 = 主角 attack_type 表值——2026-09-18 营地扩展前置批:量与类型抽象分离,原硬编码 normal 退役; - # attack_up 增益不再直乘本分量——2026-09-18 结构修复批改经 hero_offense 池乘三段合计,见池乘区注记) - # + 穿刺/魔法(由充能供给——充能按攻击类型分桶,谁能充/充哪个桶归奖励定义 charge_grants)。攻击类型只管查甲效矩阵哪一行,与来源无关。 - # 护甲等级掷点批(2026-09-16):普通分量吃掷点判定(含暴击);穿刺/魔法充能分量与棋盘来源伤害不掷不折; + # 单分量伤害构成(2026-09-19 充能退役批·用户拍板):主角攻击 = 唯一基础分量(atk,吃掷点含暴击; + # 类型 = 主角 attack_type 表值——2026-09-18 营地扩展前置批:量与类型抽象分离;查甲效矩阵对应行取克制修正)。 + # 原"基础 + 穿刺/魔法充能三分量"模型随充能系统整体退役——克制策略归冒险前配置(营地换型 / 未来冒险前参数面), + # 局内不再有挖掘攒弹药的第二伤害供给。attack_up 增益经 hero_offense 池乘攻击合计(见池乘区注记)。 + # 护甲等级掷点批(2026-09-16):基础分量吃掷点判定(含暴击);棋盘来源伤害不掷不折; # 任何攻击落地伤害 ≥ damage_floor(全局 max(1,·))——"被减伤归零 v=0"零值伤害行分支随批退役。 var hero_alive: bool = int(_enemy_system.hero_unit().get("hp", 0)) > 0 var hero_target = _enemy_system.default_target() if hero_alive and hero_target != null: var armor: String = String(hero_target.get("armor_type", "light")) var base_atk_type: String = String(_enemy_system.hero_unit().get("attack_type", "normal")) # 基础分量类型 = 主角表值(营地扩展前置批 2026-09-18) - var points := _charge_points() # {攻击类型: 充能点数}——奖励定义投递的结果(本段不认识"开格/标雷") var roll_read: Dictionary = _armor_roll() # 基础分量掷点(每吃掷点分量逐次掷——掷点只吃基础分量口径不变) var threshold: int = _defender_ac(hero_target) + int(db.settlement.attack_bonus) var crit: bool = bool(roll_read.crit) var discount: int = _roll_discount(int(roll_read.roll), threshold) var base_val: float = float(_hero_atk) # 基础分量 = 表值攻击裸值(增益直乘旁路已退役——乘区统一走池) - var comp: Dictionary = {} - var d_hero := 0 - for atk_type in SettlementTable.ATTACK_TYPE_KEYS: - var c: int = 0 - if atk_type == base_atk_type: - c = DamageMath.rolled_component(base_val, discount, crit, int(db.settlement.crit_multiplier), _armor_effectiveness(atk_type, armor)) - c += _charge_component(int(points.get(atk_type, 0)), atk_type, armor) # 同桶充能照加(充能分量不掷不折口径不变) - else: - c = _charge_component(int(points.get(atk_type, 0)), atk_type, armor) - comp[atk_type] = c - d_hero += c + var d_hero: int = DamageMath.rolled_component(base_val, discount, crit, int(db.settlement.crit_multiplier), _counter_delta(base_atk_type, armor)) var payload: Dictionary = {"target": hero_target.display_name} - payload.merge(comp) + payload[base_atk_type] = d_hero # 分量键 = 实际攻击类型(归因字段,单分量模型) payload["roll"] = int(roll_read.roll) payload["ac"] = threshold payload["tier"] = discount if crit: payload["crit"] = true # 增益池乘区·主角侧 + 敌方防御池(2026-09-18 结构修复批——hero_offense 乘区接线落地, - # attack_up 普通分量直乘旁路退役:增伤/乏力改乘 Σ三分量合计,覆盖面 = 普通+穿刺+魔法; + # attack_up 普通分量直乘旁路退役:增伤/乏力乘攻击合计〔2026-09-19 充能退役后 = 单分量〕; # 与既有 enemy_defense 池乘区同段串乘)。四池对称:敌打主角 = hero_defense×enemy_output # (_resolve_damage);主角打敌 = hero_offense×enemy_defense。 d_hero = DamageMath.pool_damage(d_hero, _clamped_pool("hero_offense"), _clamped_pool("enemy_defense")) @@ -504,14 +490,14 @@ func _combat_segment(ri: int) -> void: _enemy_system.commit_action(u) continue # 伤害技(含普攻——倍率恒 1):三乘法链 ① A = 攻击基线 × 技能倍率(判定对象 = 技能基础伤害分量) - # → ② d20 vs 主角 AC(nat20 暴击 ≠ 技能重击,两层严格区分)→ ③ ×甲效(敌打主角无甲轴恒中性) + # → ② d20 vs 主角 AC(nat20 暴击 ≠ 技能重击,两层严格区分)→ ③ +克制修正点数(敌打主角无甲轴恒中性 delta 0——加法核 2026-09-18 换装) # → 伏击附加(后置加法、必中全额、不吃 AC)→ 增益池乘区 → 伤害下限 max(1,·)。 var baseline: int = int(round(float(u.atk) * float(srow.get("damage_mult", 1.0)))) var roll_read_e: Dictionary = _armor_roll() var threshold_e: int = _defender_ac(_enemy_system.hero_unit()) + int(db.settlement.attack_bonus) 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), 100) + 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) d_tick = maxi(int(db.settlement.damage_floor), d_tick) _enemy_system.apply_damage(_enemy_system.hero_unit(), d_tick) @@ -566,34 +552,11 @@ func _resolve_damage(d_raw: int) -> int: return DamageMath.pool_damage(d_raw, p_hero, p_enemy) -# 充能点数合成:奖励定义(charge_grants:触发源→{attack_type, per_unit, cap})× 本轮各源计数 → {攻击类型: 点数} -# cap = 单轮计数上限(0 = 不封顶);投桶只读 attack_type 字段——换桶/换量是奖励侧改动,本类不认识"开格=穿刺"这类绑定 -func _charge_points() -> Dictionary: - var pts: Dictionary = {} - for src in db.settlement.charge_grants.keys(): - var g: Dictionary = db.settlement.charge_grants[src] - var attack_type: String = String(g.get("attack_type", "")) - var per: int = int(g.get("per_unit", 0)) - var cap: int = int(g.get("cap", 0)) - var n: int = int(_charge_counts.get(src, 0)) - if cap > 0: - n = mini(n, cap) - if attack_type == "" or per <= 0 or n <= 0: - continue - pts[attack_type] = int(pts.get(attack_type, 0)) + n * per - return pts - - -# 充能分量:点数(已含 per_unit × 计数换算)× 克制 percent → floor -func _charge_component(points: int, attack_type: String, armor: String) -> int: - return DamageMath.charge_component(points, _armor_effectiveness(attack_type, armor)) - - -# 克制矩阵读值(SettlementTable.armor_effectiveness:{攻击类型: {护甲: percent}}——缺项回退 100 中性) -func _armor_effectiveness(attack_type: String, armor: String) -> int: +# 克制修正点数读值(SettlementTable.armor_effectiveness:{攻击类型: {护甲: 点数}}——缺项回退 0 中性;加法核 2026-09-18 换装) +func _counter_delta(attack_type: String, armor: String) -> int: var tbl: Dictionary = db.settlement.armor_effectiveness var row: Dictionary = tbl.get(attack_type, {}) - return int(row.get(armor, 100)) + return int(row.get(armor, 0)) func _clamped_pool(pool: String) -> int: @@ -663,7 +626,7 @@ func _emit_settlement_snapshot(verdict: String) -> void: "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(), "charge_counts": _charge_counts.duplicate(), "charge_points": _charge_points()}, + "round_facts": {"path": _facts_path, "safe": safe_n, "mines": mines_hit, "flag_events": _facts_flags.size(), }, }) @@ -813,7 +776,6 @@ func _reset_round_facts() -> void: _facts_reveals.clear() _facts_flags.clear() _facts_path = "" - _charge_counts.clear() # 充能计数随轮 facts 重置(每轮重新攒——结算段按奖励定义折算当轮点数) # ---- 行协议(Core Rule:公共字段 + 行类型特有字段)---- diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/board_data.gd b/prototypes/dungeon-sweeper-vertical-slice/core/board_data.gd index 59213586..d5cdcdea 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/board_data.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/board_data.gd @@ -12,7 +12,7 @@ var spawn_center := Vector2i.ZERO var mines := {} # Vector2i → true var digits := {} # Vector2i → int(安全格恒有值;数字恒真 = 8 邻雷数) var variants := {} # Vector2i → Array[String](生成期快照,抗表重载) -var biome := "" +var board_type := "" # 图类型标签(词表 v1.0:dungeon/underdark;玩家侧显示名「地图类型」) var level_index: int = 1 var node_depth: int = 0 var metrics := {} # 生成期指标集(键清单单点定义在 board_generator._finalize) @@ -95,7 +95,7 @@ func compute_r0() -> Array: var queue: Array = b3.duplicate() while not queue.is_empty(): var c: Vector2i = queue.pop_front() - if is_safe(c) and digit_of(c) == 0 and variants.get(c, []).is_empty(): + if is_safe(c) and digit_of(c) == 0: # 变异死分支退役(2026-09-18 用户拍板删——与 排雷玩法 展开实现口径归一;变异定稿批按正式语义重接) for n in neighbors8(c): if is_safe(n) and not r0.has(n): r0[n] = true diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/board_generator.gd b/prototypes/dungeon-sweeper-vertical-slice/core/board_generator.gd index 327a9472..b946942c 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/board_generator.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/board_generator.gd @@ -28,7 +28,7 @@ func generate(L: int, D: int, rng_stream: RandomNumberGenerator, db) -> BoardDat "solver_rules": String(row.solver_rules), "min_safe": int(row.min_safe_count), "max_attempts": int(row.max_gen_attempts), - "biomes": Array(row.board_biomes), + "board_type": String(row.board_type), } var best_legal: BoardData = null var best_legal_score := -1.0 @@ -76,7 +76,7 @@ func _attempt(params: Dictionary, rng_stream: RandomNumberGenerator, db) -> Boar b.width = params.w b.height = params.h b.spawn_center = Vector2i(int((params.w - 1) / 2.0), int((params.h - 1) / 2.0)) - b.biome = str(params.biomes[0]) + b.board_type = str(params.board_type) b.level_index = params.L b.node_depth = params.D # ② 布雷:N = round(d×(W×H−9)) 先定数;域 = 全格 − 出生 3×3;均匀布雷后"先布后删" diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/config_db.gd b/prototypes/dungeon-sweeper-vertical-slice/core/config_db.gd index fd82e6d5..85483dba 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/config_db.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/config_db.gd @@ -285,7 +285,7 @@ func _ceil_key(sorted_keys: Array, request: int) -> int: # ---- 地形变异 variant_pool_gate:候选池门控(∅ biome_tag = 通配)---- -func variant_pool(level_index: int, board_biomes: Array) -> Array: +func variant_pool(level_index: int, board_type: String) -> Array: var pool: Array = [] for row in variation.rows: if int(row.get("unlock_level", 999)) > level_index: @@ -294,10 +294,8 @@ func variant_pool(level_index: int, board_biomes: Array) -> Array: if tags.is_empty(): pool.append(row) continue - for t in tags: - if board_biomes.has(t): - pool.append(row) - break + if tags.has(board_type): + pool.append(row) return pool diff --git a/prototypes/dungeon-sweeper-vertical-slice/core/damage_math.gd b/prototypes/dungeon-sweeper-vertical-slice/core/damage_math.gd index ed5d05e8..79e919d5 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/core/damage_math.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/core/damage_math.gd @@ -14,9 +14,13 @@ static func pool_damage(d_raw: int, p_hero: int, p_enemy: int) -> int: return maxi(0, v) -# 充能分量:充能点数(调用方已按奖励定义换算点数、并按源套单轮计数上限)× 克制 percent → floor -static func charge_component(points: int, effectiveness_percent: int) -> int: - return int(floor(float(points) * float(effectiveness_percent) / 100.0)) +# 充能分量:充能点数(调用方已按奖励定义换算)+ 克制修正点数(加法核——2026-09-18 换装,原 percent 乘区退役); +# 空桶(点数 ≤ 0)不吃修正恒 0——零充能分量无伤害可修正,不产生负贡献(等价旧量纲 0×任何 percent = 0) +# 类型化点数分量:点数 + 克制修正(加法核)——2026-09-19 充能退役后唯一消费方 = 奖励直伤道具(棋盘火力) +static func counter_component(points: int, counter_delta: int) -> int: + if points <= 0: + return 0 + return points + counter_delta # ---- 护甲等级掷点批(2026-09-16 用户拍板——判定式与档位参数全在 settlement.tres,本类只做算术)---- @@ -34,10 +38,10 @@ static func roll_discount_percent(roll: int, threshold: int, bounds: Array, disc return int(discounts[tier]) -# 吃掷点分量算术(纯函数):基线值 × 掷点折扣 ×(暴击时)暴击倍率 × 克制 percent → floor(单一取整; -# 乘法交换——折扣/暴击/克制次序无关,取整链保持现登记:每分量恰一次 floor)。暴击恒全额由 discount=100 承载。 -static func rolled_component(base_value: float, discount_percent: int, crit: bool, crit_multiplier: int, effectiveness_percent: int) -> int: +# 吃掷点分量算术(纯函数):基线值 × 掷点折扣 ×(暴击时)暴击倍率 → floor 后 + 克制修正点数(加法核)(单一取整; +# 乘法交换——折扣/暴击次序无关,克制修正为整数点数加在 floor 之后,取整链保持现登记:每分量恰一次 floor)。暴击恒全额由 discount=100 承载。 +static func rolled_component(base_value: float, discount_percent: int, crit: bool, crit_multiplier: int, counter_delta: int) -> int: var v: float = base_value * float(discount_percent) / 100.0 if crit: v *= float(crit_multiplier) / 100.0 - return int(floor(v * float(effectiveness_percent) / 100.0)) + return int(floor(v)) + counter_delta diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/schemas/board_gen_table.gd b/prototypes/dungeon-sweeper-vertical-slice/data/schemas/board_gen_table.gd index 107005fb..d7fd747b 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/schemas/board_gen_table.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/data/schemas/board_gen_table.gd @@ -10,6 +10,7 @@ extends Resource const SOLVER_RULES := ["single", "single_subset"] const COST_BUDGET := 16384 # F2c provisional 量级护栏(禁墙钟逃生) const TARGET_ABS_FLOOR := 0.85 # 战斗结算 修订——target 域下限(P1 绝对锚) +const BOARD_TYPE_VOCABULARY := ["dungeon", "underdark"] # 图类型词表 v1.0(玩家侧显示名「地图类型」) func validate() -> Array: @@ -60,9 +61,10 @@ func validate() -> Array: # F2c 成本可行性 if att * w * h > COST_BUDGET: errs.append({"category": "cross_field", "message": "(%d,%d) cost_feasible 违例 attempts×W×H ≤ %d" % [L, D, COST_BUDGET]}) - var biomes: Array = row.get("board_biomes", []) - if biomes.is_empty(): - errs.append({"category": "cross_field", "message": "(%d,%d) board_biomes 非空域校验违例(地形变异⑮)" % [L, D]}) + # 图类型词表 v1.0(2026-09-19 用户拍板定稿:dungeon=地牢基线 / underdark=幽暗地域;扩词随内容批走修订) + var bt: String = str(row.get("board_type", "")) + if not BOARD_TYPE_VOCABULARY.has(bt): + errs.append({"category": "cross_field", "message": "(%d,%d) board_type 越词表: %s" % [L, D, bt]}) anchor_ok[L] = anchor_ok.get(L, false) or D == 0 for L in anchor_ok.keys(): if not anchor_ok[L]: diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/schemas/settlement_table.gd b/prototypes/dungeon-sweeper-vertical-slice/data/schemas/settlement_table.gd index 43556ec2..0157fcf2 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/schemas/settlement_table.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/data/schemas/settlement_table.gd @@ -18,9 +18,8 @@ extends Resource # 主角攻击 = 普通(atk×(1+attack_up),不吃克制)+ 穿刺 + 魔法(后两者由充能供给),三分量各自 floor 后相加。 # 【两条抽象分离,勿焊死】攻击类型 = 伤害的属性轴,只决定查 armor_effectiveness 哪一行,定义里不含任何棋盘来源; # 充能 = 按攻击类型分桶的附加伤害储备,"谁往桶里放东西"属**奖励的定义**(开格/标雷只是奖励触发源,奖励内容可改)。 -# 原 damage_a_per_cell / damage_a_cap / damage_b_per_flag 三字段即"类型×来源"焊死的产物,已由 charge_grants 取代。 -@export var charge_grants: Dictionary = {} # 奖励侧定义:触发源 → {attack_type(投哪个桶), per_unit(每单位点数), cap(单轮计数上限,0 = 不封顶)} -@export var armor_effectiveness: Dictionary = {} # 克制矩阵 percent:{攻击类型 {normal|pierce|magic}: {护甲 {light|ward|heavy}: percent}} +# 原 damage_a_per_cell / damage_a_cap / damage_b_per_flag 与 charge_grants 充能奖励定义均退役(2026-09-19 充能退役批——攻击模型回归单分量)。 +@export var armor_effectiveness: Dictionary = {} # 克制修正矩阵(加法点数 delta):{攻击类型 {normal|pierce|magic}: {护甲 {light|ward|heavy}: 点数 [-3,+3]}} # ---- 护甲等级掷点批(2026-09-16 用户拍板,数字即规范——registry settlement_table.ac_roll/ac_discount_tiers 同批定稿)---- # 判定式:掷 1d20,掷点 ≥ 防守方 AC + 攻击加成 → 全额;低掷按缺口(AC−掷点)查档打折,无 miss、无零收益档; # nat 最大面(crit_roll)= 暴击:该次基础攻击分量 ×2 且恒全额;任何攻击落地伤害全局下限 damage_floor(≥1)。 @@ -79,22 +78,10 @@ func validate() -> Array: var d: int = int(roll_tier_discounts[i]) if d < 1 or d > 99 or (i > 0 and d >= int(roll_tier_discounts[i - 1])): errs.append({"category": "cross_field", "message": "roll_tier_discounts[%d] 越域/非降序(档位不设零档): %d" % [i, d]}) - # 充能奖励定义域校验(触发源 → {attack_type, per_unit, cap}) - for src in charge_grants.keys(): - var g: Dictionary = charge_grants[src] - var g_at: String = String(g.get("attack_type", "")) - if not ATTACK_TYPE_KEYS.has(g_at): - errs.append({"category": "enum", "message": "charge_grants.%s.attack_type 未知攻击类型: %s(域 %s)" % [src, g_at, str(ATTACK_TYPE_KEYS)]}) - var g_per: int = int(g.get("per_unit", -1)) - if g_per < 0 or g_per > 999: - errs.append({"category": "domain", "message": "charge_grants.%s.per_unit 越域 [0,999]: %d" % [src, g_per]}) - var g_cap: int = int(g.get("cap", -1)) - if g_cap < 0 or g_cap > 999: - errs.append({"category": "domain", "message": "charge_grants.%s.cap 越域 [0,999](0 = 不封顶): %d" % [src, g_cap]}) for atk_type in ATTACK_TYPE_KEYS: var row: Dictionary = armor_effectiveness.get(atk_type, {}) for armor in ARMOR_KEYS: - var pct: int = int(row.get(armor, -1)) - if pct < 0 or pct > 999: - errs.append({"category": "domain", "message": "armor_effectiveness.%s.%s 越域 [0,999]: %d" % [atk_type, armor, pct]}) + var pct: int = int(row.get(armor, -99)) + if pct < -3 or pct > 3: + errs.append({"category": "domain", "message": "armor_effectiveness.%s.%s 越域 [-3,+3]: %d" % [atk_type, armor, pct]}) return errs diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/board_gen.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/board_gen.tres index f746ea1a..e492f0fd 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/board_gen.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/board_gen.tres @@ -14,7 +14,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 50, "max_gen_attempts": 16, -"board_biomes": ["dungeon"] +"board_type": "dungeon" }, { "level_index": 1, "node_depth": 1, @@ -25,7 +25,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 50, "max_gen_attempts": 16, -"board_biomes": ["dungeon"] +"board_type": "dungeon" }, { "level_index": 1, "node_depth": 2, @@ -36,7 +36,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "dungeon" }, { "level_index": 1, "node_depth": 3, @@ -47,7 +47,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "dungeon" }, { "level_index": 1, "node_depth": 4, @@ -58,7 +58,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "dungeon" }, { "level_index": 2, "node_depth": 0, @@ -69,7 +69,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "underdark" }, { "level_index": 2, "node_depth": 1, @@ -80,7 +80,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "underdark" }, { "level_index": 2, "node_depth": 4, @@ -91,7 +91,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "underdark" }, { "level_index": 2, "node_depth": 5, @@ -102,7 +102,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "underdark" }, { "level_index": 2, "node_depth": 6, @@ -113,7 +113,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "underdark" }, { "level_index": 2, "node_depth": 7, @@ -124,7 +124,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "underdark" }, { "level_index": 2, "node_depth": 8, @@ -135,7 +135,7 @@ rows = [{ "solver_rules": "single_subset", "min_safe_count": 60, "max_gen_attempts": 24, -"board_biomes": ["dungeon"] +"board_type": "underdark" }] ; 切片调参登记(SLICE-TUNED provisional,调参所有权仍归 C3): @@ -151,4 +151,4 @@ rows = [{ ; L2 战斗/Boss 节点 (2, 0/1/4/5/6/7/8) 七行精确铺满(跨表校验强制——ConfigDB ④ level_node_dangling); ; 奖励点 (2,2)/恢复点 (2,3) 不开战斗、无板行(跨表校验只查 battle/boss 节点)。 ; 板面参数与 L1 高档同值(12×12 d0.25 t0.88)——密度/推理率轴差异化留给 难度曲线与Boss 调参批; -; board_biomes 维持 ["dungeon"](幽暗地域独立 biome tag 归 地形变异 批,本批零触及排雷循环)。 +; board_type 词表 v1.0(2026-09-19 用户拍板):L1=dungeon 地牢基线 / L2=underdark 幽暗地域(玩家侧显示名「地图类型」);域校验在 board_gen_table.gd 词表常量。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/enemy.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/enemy.tres index ac923763..9af8327f 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/enemy.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/enemy.tres @@ -338,6 +338,10 @@ rows = [{ ; ; 护甲类型重配批(2026-09-18 用户拍板):关卡 1 全部轻甲(食人魔酋长 heavy→light、熊地精两行 ward→light); ; 关卡 2 除 Boss(蛛化卓尔精灵 heavy→ward 魔法甲)外全部轻甲(熊地精四行 ward→light,巨蜘蛛既有 light 不动)。 -; 现行克制三角(pierce 克 ward ×150 / magic 克 heavy ×150 / 被克 ×50 / light 双向中性)下的读数效果: -; L1 克制轴数值中性化(全 light);L2 仅 Boss 战非中性——魔法矢克 Boss ×150、穿刺弹被克 ×50。 ; hero 侧两轴(armor_type/attack_type)同批入列(hero.tres 批注),敌方技能攻击类型轴仍未开(全部 normal 档)。 +; +; 甲效矩阵加法核换装批(2026-09-18 用户拍板——settlement.tres armor_effectiveness 量纲 percent→整数点数, +; 三档 克制 +1 / 中性 0 / 被克 −1,五档百分比词表随批退役)。 +; 现行读数效果:L1/L2 小怪全 light → 穿刺类(开格充能/穿刺弹)被克 −1(穿刺弹 2→1、充能 3 点→2)、普通/魔法中性; +; L2 仅 Boss 战非中性(魔法甲)——基础攻击与穿刺弹克制 +1、魔法矢被克 −1(原威力 + delta 自行核算后落笔)。 +; 原重配批注「魔法矢克 Boss ×150、穿刺弹被克 ×50」与当批矩阵正反互倒(系笔误),随本批订正为上行读数。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/hero.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/hero.tres index 72ee861c..353e73f5 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/hero.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/hero.tres @@ -19,8 +19,9 @@ attack_type = "normal" ; EV 参考数按判定式复算 = 期望减免 21.25%);ac_up 增益 +1 AC/层(×2 层 = AC+2)在其上加算。 ; ; 营地扩展前置批(2026-09-18 用户指令):新增两根可配置轴—— -; armor_type = 主角护甲类型(light/ward/heavy,缺省 light):甲效矩阵消费面已通(敌方攻击现行恒 normal 档 -; = 三甲全 100% 数值中性,类型轴生效待敌方技能攻击类型批); +; armor_type = 主角护甲类型(light/ward/heavy,缺省 light):轴现行休眠——甲效矩阵消费面 = 主角侧, +; 敌方攻击不查矩阵(2026-09-18 甲效矩阵调参批归因改述,原「恒 normal 档故三甲全 100% 中性」随旧三档 +; 结构退役),类型轴生效待敌方技能攻击类型批; ; attack_type = 主角基础攻击类型(normal/pierce/magic,缺省 normal):基础攻击量(atk)与攻击类型抽象分离—— ; 营地永久强化"换成魔法/穿刺攻击"= 改此字段(atk 量轴零改动),战斗段基础分量即按此查甲效矩阵。 ; 两轴全部 provisional,营地建设批(元进度侧)拍板正式投值。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/data/tables/settlement.tres b/prototypes/dungeon-sweeper-vertical-slice/data/tables/settlement.tres index ebb2b93c..3cb2cede 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/data/tables/settlement.tres +++ b/prototypes/dungeon-sweeper-vertical-slice/data/tables/settlement.tres @@ -28,33 +28,21 @@ effect_pool_map = { pool_clamp_lo = -100 pool_clamp_hi = 100 round_direction = "floor" -charge_grants = { -"safe_cell": { -"attack_type": "pierce", -"per_unit": 1, -"cap": 3 -}, -"flag_hit": { -"attack_type": "magic", -"per_unit": 1, -"cap": 0 -} -} armor_effectiveness = { "normal": { -"light": 100, -"ward": 100, -"heavy": 100 +"light": 0, +"ward": 1, +"heavy": -1 }, "pierce": { -"light": 100, -"ward": 150, -"heavy": 50 +"light": -1, +"ward": 1, +"heavy": 0 }, "magic": { -"light": 100, -"ward": 50, -"heavy": 150 +"light": 0, +"ward": -1, +"heavy": 1 } } roll_faces = 20 @@ -67,13 +55,10 @@ damage_floor = 1 armor_roll_stream = "armor_roll" ; 攻击类型 × 护甲克制批(2026-09-12 用户拍板结构;2026-09-15 命名统一批 + 抽象分离批,数值 provisional 待用户/C3 调参): -; 主角攻击 = 普通(atk×(1+attack_up),对全部护甲 100%)+ 穿刺 + 魔法(后两者由充能供给),三分量各自 floor 后相加; -; 克制语义 = 克制 ×150 / 中性 ×100 / 被克 ×50(穿甲弹/高爆弹式对策三角)。 -; 【两条抽象分离,勿焊死】攻击类型 {normal, pierce, magic} = 普通 / 穿刺 / 魔法 = -; 伤害的属性轴,只决定查矩阵哪一行,定义里不含任何棋盘来源;护甲类型 {light, ward, heavy} = 轻甲 / 魔法护甲 / 重甲 -; 是敌单位属性。充能 = 按攻击类型分桶的附加伤害储备:谁能充、充哪个桶 = 奖励定义。 -; charge_grants 现行供给(奖励侧定义,可整体替换):safe_cell(本轮每挖开 1 个安全格)→ 穿刺桶 1/格、 -; 单轮计数上限 8(0 = 不封顶);flag_hit(每颗首次标中雷,每雷实例一次去重)→ 魔法桶 2/雷,无上限。 +; 主角攻击 = 单一基础分量(2026-09-19 充能退役批·用户拍板——原三分量模型退役,克制策略归冒险前配置: +; 类型 = hero 表 attack_type,营地换型 = 改字段;局内无挖掘攒弹药的第二供给)。 +; 【抽象分离纪律保留】攻击类型 {normal, pierce, magic} = 普通 / 穿刺 / 魔法 = 伤害的属性轴, +; 只决定查矩阵哪一行,定义里不含任何棋盘来源;护甲类型 {light, ward, heavy} = 轻甲 / 魔法护甲 / 重甲是敌单位属性。 ; 格面资源批(2026-09-15 用户拍板):段序七段 → 五段(item_window/item 两段随可选类道具删除下线); ; source_label_map 删 item 键;effect_pool_map 增 sapped→hero_offense(weaken 型负向——乏力)。 ; enrage(敌方暴走 +25%,enemy_output 池)/ off_guard(我方失衡 +25%,hero_defense 池)/ @@ -97,9 +82,6 @@ armor_roll_stream = "armor_roll" ; ; 数值压缩批(2026-09-17 用户拍板暂定): ; equivalence_ref_damage 12→4(当量参考敞口,绝对值轴 ÷3 取整); -; charge_grants 按粒度约束压缩——per_unit 是点数粒度(最小 1)不可 ÷3,压上限/单价近似等比: -; 穿刺 cap 8→3(per_unit 1 不变,EV ≈ ÷2.7);魔法 2/雷→1/雷(per_unit ÷3 进 1,EV ≈ ÷2)。 -; 充能期望压缩比 ≈1/2~1/3 之间,粒度限制下的近似,登记为已知偏差。 ; roll_faces/折扣档/暴击/damage_floor/克制矩阵/pool_clamp 全部不动(相对轴)。clamp 域 [-100,+100] 共用。 ; ; 战斗数值结构修复批(2026-09-18 盘问会话用户拍板): @@ -109,3 +91,19 @@ armor_roll_stream = "armor_roll" ; 变的只是池归属)。hero_offense 乘区接线同步落地(battle_orchestrator 主角攻击段):Σ三分量后 ; ×(100+clamp(hero_offense))/100×(100+clamp(enemy_defense))/100——attack_up 普通分量直乘旁路退役, ; 增伤/乏力覆盖面 = 普通+穿刺+魔法 合计;上方"hero_offense 现行走直乘——登记遗留"注记随之销项。 +; +; 甲效矩阵用户调参批(2026-09-18 用户逐格给值,五格改值、四格不动): +; normal ward 100→120 · normal heavy 100→50 · pierce light 100→80 · pierce ward 150→120 · pierce heavy 50→80; +; magic 全行与 normal light 不动。上方「克制语义 = 克制 ×150 / 中性 ×100 / 被克 ×50(对策三角)」三档措辞退役—— +; 现行五档:克制 ×150 / 弱克制 ×120 / 中性 ×100 / 弱被克 ×80 / 被克 ×50,普通行不再恒中性。 +; 键集 3×3 满格结构冻结不动;矩阵消费面 = 主角侧(道具直伤 / 主角攻击三分量 / 充能分量), +; 敌打主角现行不查矩阵——主角 armor_type 轴仍休眠,轴生效待敌方技能攻击类型批。 +; 实战读数(现行敌种甲配置):L1/L2 小怪全轻甲 → 穿刺类(开格充能/穿刺弹)×80 小幅折损、普通/魔法中性; +; L2 Boss 魔法甲 → 基础攻击与穿刺弹 ×120、魔法矢 ×50(不变)。重甲现行无消费敌种(零消费格)。 +; +; 甲效矩阵加法核换装批(2026-09-18 用户拍板数值语言——小整数加法核,与 01-核心循环 数值语言条款同批): +; 量纲 percent→整数点数,三档 克制 +1 / 中性 0 / 被克 −1,九格 normal [0,+1,−1] / pierce [−1,+1,0] / magic [0,−1,+1]; +; pierce×heavy = 0 中性为用户特别拍板(重甲挡刀刃不排斥穿刺;现行无重甲敌种,纯结构位)。 +; 上方 2026-09-18 甲效矩阵用户调参批(五档 ×150/×120/×100/×80/×50)与更早三档三角批注的百分比量纲全部随批退役(历史留痕不删)。 +; 键集 3×3 满格结构冻结不动;缺项回退 = 0 中性(battle_orchestrator._counter_delta);域 [−3,+3](schema 校验)。 +; 奖励直伤行 payload 键 effectiveness 保留键名、值语义改点数(JSONL 契约稳定——analyze_playtest 等分析工具不破坏)。 diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/auto_player.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/auto_player.gd index 665558f0..97934a99 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/auto_player.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/auto_player.gd @@ -28,6 +28,52 @@ static func choose_dig(minesweeper) -> Dictionary: return {} +# ==================== 普通策略档 v2·基础定式画像(2026-09-19 用户拍板——替代旧"无推理最近格"口径) ==================== +# 扫雷推理分级(经典定式文献口径):新手级 = 单数字满足规则——「数字 = 邻雷未开数 ⇒ 全是雷(满足即标)」 +# 「数字 = 已标旗数 ⇒ 余邻全安全(满足即开)」,教学一眼会、正常玩家两局即会的最低门槛判断; +# 进阶级 = 联动定式(1-1 / 1-2 / 1-2-1 / 1-2-2-1 / 子集缩减)与概率分析——本切片归完美档 subset 推理承载, +# 不入普通画像(新手不可靠掌握)。本档语义 = 只做新手级推理 + 无处可推时按既有口径盲挖边界格(新手冲动)+ +# 不主动刷新(新手无刷新策略意识)。测量定位:教会基础规则后的真实玩家下限近似(旧"乱点/最近格"口径测的是 +# 无认知玩家下限,对通关率带判读失真——2026-09-18/19 普通画像 0%/5% 越带下界与真人方向性结论矛盾)。 + +# 普通画像单步决策入口(每动作一查——挖掘揭示新数字后重推理):move/dig/flag/stop 四值(无 refresh)。 +static func novice_action(minesweeper) -> Dictionary: + var ded := _deduce_single(minesweeper) + for c in ded["mines"]: + if not minesweeper.is_revealed(c) and not minesweeper.has_flag(c): + return _plan_on(minesweeper, c, "flag") + for c in ded["safe"]: + if not minesweeper.is_revealed(c) and not minesweeper.has_flag(c): + return _plan_on(minesweeper, c, "dig") + var plan := choose_dig(minesweeper) + if plan.is_empty(): + return {"kind": "stop"} + return _plan_on(minesweeper, plan.dig_cell, "dig") + + +# 新手级推理不动点:仅 single 规则(约束余雷=0⇒未知全安全 / 余雷=未知数⇒全雷),无 subset 联动—— +# 满足规则连锁(标一雷使邻数字余雷清零)由 while-changed 不动点承载。 +static func _deduce_single(minesweeper) -> Dictionary: + var board = minesweeper.current_board() + var safe := {} + var mines := {} + var changed := true + while changed: + changed = false + for con in _constraints(minesweeper, board, mines): + if int(con["mines"]) == 0: + for c in con["unknown"].keys(): + if not safe.has(c): + safe[c] = true + changed = true + elif int(con["mines"]) == (con["unknown"] as Dictionary).size(): + for c in con["unknown"].keys(): + if not mines.has(c): + mines[c] = true + changed = true + return {"safe": _row_major(safe), "mines": _row_major(mines)} + + # ==================== 完美策略档(2026-09-14 用户拍板:OQ7 技能轴上界测量仪——只作测量,非玩法数值) ==================== # 策略语义:零盲挖(只挖已证安全格 ⇒ 构造保证零踩雷)· 已证雷格全标旗(旗先于挖——旗 = 纯收益 # 〔轮末 weaken + 魔法 首次充能〕且雷上旗不阻连锁)· 卡死且刷新资源可用 → 轮内刷新 diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/experiment_density.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/experiment_density.gd index 78005d44..40c2ea6f 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/experiment_density.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/experiment_density.gd @@ -21,7 +21,7 @@ func _initialize() -> void: "level_index": 1, "node_depth": 0, "board_width": w, "board_height": h, "mine_density": d, "inferability_target": t, "solver_rules": "single_subset", "min_safe_count": ms, "max_gen_attempts": 16, - "board_biomes": ["dungeon"], + "board_type": "dungeon", } _patch_row(row, d) var params := _params_from(row) @@ -53,7 +53,7 @@ func _params_from(row: Dictionary) -> Dictionary: "L": 1, "D": 0, "w": int(row.board_width), "h": int(row.board_height), "density": float(row.mine_density), "target": float(row.inferability_target), "solver_rules": "single_subset", "min_safe": int(row.min_safe_count), - "max_attempts": int(row.max_gen_attempts), "biomes": ["dungeon"], + "max_attempts": int(row.max_gen_attempts), "board_type": "dungeon", } class FakeDB: diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/level_autoplay.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/level_autoplay.gd index 5dd0ade0..0b30de48 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/level_autoplay.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/level_autoplay.gd @@ -123,27 +123,34 @@ static func _autoplay_battle(runner, settlement, st: Dictionary, logger) -> void if String(st.get("policy", "normal")) == "perfect": _autoplay_battle_perfect(runner, settlement, st, logger) return + # 普通策略档 v2(2026-09-19 用户拍板):基础定式画像——单步决策循环(move/dig/flag 经 settle_batch 提交, + # 推理分级见 auto_player.gd 普通策略档节:新手级单数字满足规则 + 盲挖边界兜底、无 refresh); + # 旧"无推理挖最近格"口径随批退役。连续拒绝 ≥3 = 编排违约防御(同完美档 fail-fast 语义)。 var round_guard := 60 while st.result == "" and runner.current_battle() == settlement and settlement.battle_result == "" and round_guard > 0: round_guard -= 1 st.rounds += 1 var start_round: int = settlement.round_index var action_guard := 400 + var rejects := 0 while runner.current_battle() == settlement and settlement.battle_result == "" and settlement.action_economy.phase == "Active" \ - and settlement.round_index == start_round and action_guard > 0: + and settlement.round_index == start_round and action_guard > 0 and rejects < 3: action_guard -= 1 - var plan := AutoPlayer.choose_dig(settlement.minesweeper) - if plan.is_empty(): + var act := AutoPlayer.novice_action(settlement.minesweeper) + var kind := String(act.get("kind", "stop")) + if kind == "stop": break - if plan.hero_cell != settlement.minesweeper.hero_pos(): - var out_m: Array = settlement.minesweeper.settle_batch([{"action": "move", "cell": plan.hero_cell}]) - if logger != null: - logger.log_action("move", plan.hero_cell, _accepted(out_m), {"round": start_round}) - if settlement.action_economy.phase != "Active" or settlement.round_index != start_round: - break - var out_d: Array = settlement.minesweeper.settle_batch([{"action": "dig", "cell": plan.dig_cell}]) - if logger != null: - logger.log_action("dig", plan.dig_cell, _accepted(out_d), {"round": start_round}) + var ok := false + if kind == "move": + ok = _submit_intent(settlement, "move", act.get("cell"), logger, start_round) + elif kind == "dig": + ok = _submit_intent(settlement, "dig", act.get("cell"), logger, start_round) + elif kind == "flag": + ok = _submit_intent(settlement, "flag_place", act.get("cell"), logger, start_round) + if ok: + rejects = 0 + else: + rejects += 1 if runner.current_battle() == settlement and settlement.battle_result == "" and settlement.action_economy.phase == "Active" and settlement.round_index == start_round: var out_s: Array = settlement.minesweeper.settle_batch([{"action": "stop"}]) if logger != null: diff --git a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd index 5d15cc53..457fe781 100644 --- a/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd +++ b/prototypes/dungeon-sweeper-vertical-slice/smoke/smoke_all.gd @@ -182,7 +182,8 @@ func _smoke_level() -> void: check(win.boss_depth == 4, "Boss 节点以 Dmax=4 解析(棋盘生成 第三轴登记约定)") check(win.hp_at_boss >= 1 and win.hp_at_boss <= int(_db.hero.max_hp) * 3, "进 Boss HP 携带在域内(%d)" % win.hp_at_boss) # ② 恢复点:回复 = min(floor(生效max_hp×pct/100), 缺口)——hp+100% 档生效 max = 基线×2 - var rest = autoplay.run_level(_db, 4242, 1, 100, 100) + # seed 42(2026-09-19 充能退役批换种:原 4242 因主角输出模型变化在恢复点前败北——探针目的 = 验回复公式,种子仅载体) + var rest = autoplay.run_level(_db, 42, 1, 100, 100) if rest.result != "start_failed" and rest.hp_before_rest >= 0: var eff_max := maxi(1, int(round(float(_db.hero.max_hp) * 2.0))) # hp_pct=100(run_level 已恢复基线) var expect: int = mini(int(floor(float(eff_max) * 0.3)), eff_max - rest.hp_before_rest) @@ -398,27 +399,28 @@ func _ac12_tier_samples() -> Array: # ---- 主角乘区接线 + 硬化折半方向(2026-09-18 结构修复批护栏)---- # 同种子停手轮恒同掷点(效果只改乘区、不动掷点流)→ 落地伤害精确关系: -# 增伤 = 基线 ×1.5、乏力 = ×0.75(hero_offense 池乘 Σ三分量合计——普通+穿刺同乘,直乘旁路退役); +# 增伤 = 基线 ×1.5、乏力 = ×0.75(hero_offense 池乘攻击合计——2026-09-19 充能退役后 = 单分量,直乘旁路退役); # 硬化 = 基线 ×0.5 且 < 基线(enemy_defense 池负值折半——+100 翻倍符号 bug 随批纠正)。 +# 基线构成(加法核 2026-09-18 + 充能退役 2026-09-19):基线 100——hero attack_type=normal 对轻甲中性 0 修正 +# (目标 = L1 地精轻甲;AC 0 恒全额非暴击种子)。 func _smoke_pool_wiring() -> void: print("--- 主角乘区接线 + 硬化折半方向 ---") - var base_row := _hero_attack_row_with({"pierce_charge": 4}, 100, 20260918) - var up_row := _hero_attack_row_with({"pierce_charge": 4, "effects": ["attack_up"]}, 100, 20260918) - var sapped_row := _hero_attack_row_with({"pierce_charge": 4, "effects": ["sapped"]}, 100, 20260918) - var fortify_row := _hero_attack_row_with({"pierce_charge": 4, "effects": ["fortify"]}, 100, 20260918) + var base_row := _hero_attack_row_with({}, 100, 20260918) + var up_row := _hero_attack_row_with({"effects": ["attack_up"]}, 100, 20260918) + var sapped_row := _hero_attack_row_with({"effects": ["sapped"]}, 100, 20260918) + var fortify_row := _hero_attack_row_with({"effects": ["fortify"]}, 100, 20260918) var base_v := int(base_row.get("value", -1)) - check(int(base_row.get("pierce", -1)) == 3 and base_v > 0, "充电注入基线在位(穿刺分量 = cap 3、基线 %d——合计含充电分量前提)" % base_v) + check(int(base_row.get("normal", -1)) == base_v and base_v > 0, "单分量基线在位(normal 分量 = 落地值、基线 %d——充能退役批)" % base_v) check(int(up_row.get("value", -1)) == int(floor(base_v * 1.5)), - "增伤经乘区加成合计(%d → %d = ×1.5——attack_up 直乘旁路退役,覆盖面=普通+穿刺+魔法)" % [base_v, int(up_row.get("value", -1))]) + "增伤经乘区加成合计(%d → %d = ×1.5——attack_up 直乘旁路退役,覆盖面=攻击合计)" % [base_v, int(up_row.get("value", -1))]) check(int(sapped_row.get("value", -1)) == int(floor(base_v * 0.75)), - "乏力经乘区削减合计(%d → %d = ×0.75——充电分量同削)" % [base_v, int(sapped_row.get("value", -1))]) + "乏力经乘区削减合计(%d → %d = ×0.75)" % [base_v, int(sapped_row.get("value", -1))]) check(int(fortify_row.get("value", -1)) == int(floor(base_v * 0.5)) and int(fortify_row.get("value", -1)) < base_v, "硬化折半方向(%d → %d = ×0.5 且 < 基线——敌方防御池负值减伤,翻倍 bug 退役)" % [base_v, int(fortify_row.get("value", -1))]) -# 构造停手轮首行主角攻击行:opts = {pierce_charge: int, effects: Array};hero_atk 覆盖 100 拉开量级 -# (floor 关系可精确断言);效果直授沿 _weaken_refresh_probe 前例;充电计数直注 _charge_counts -# (重置只在轮末出口分发/战斗终——停手轮前注入可存活到战斗段)。 +# 构造停手轮首行主角攻击行:opts = {effects: Array};hero_atk 覆盖 100 拉开量级 +# (floor 关系可精确断言);效果直授沿 _weaken_refresh_probe 前例。 func _hero_attack_row_with(opts: Dictionary, hero_atk_val: int, seed_val: int) -> Dictionary: var rng = load("res://core/rng_service.gd").new() rng.set_master_seed(seed_val) @@ -429,8 +431,6 @@ func _hero_attack_row_with(opts: Dictionary, hero_atk_val: int, seed_val: int) - return {} for eff in opts.get("effects", []): settlement._status_effects.apply_effect(String(eff), {"source_class": "mine_hit", "origin_cell": Vector2i(0, 0), "round_index": settlement.round_index}) - if opts.has("pierce_charge"): - settlement._charge_counts["safe_cell"] = int(opts.pierce_charge) settlement.minesweeper.settle_batch([{"action": "stop"}]) for row in rows: if String(row.get("type", "")) == "damage" and String(row.get("source_class", "")) == "hero_attack": @@ -527,14 +527,15 @@ func _smoke_full_battle(L: int, D: int, label: String) -> void: has_verdict = true if row.get("source_class", "") == "hero_attack": hero_attacks += 1 - # 三段伤害构成行(攻击类型×护甲克制批):hero_attack 行必须携带 normal/pierce/magic 分量(P2 归因) - if not (row.has("normal") and row.has("pierce") and row.has("magic")): + # 单分量伤害构成行(2026-09-19 充能退役批):hero_attack 行必须携带实际攻击类型键 + 掷点读数(P2 归因) + var atk_t: String = String(_db.hero.attack_type) + if not (row.has(atk_t) and row.has("roll") and row.has("ac") and row.has("tier")): hero_breakdown_ok = false check(has_verdict, "%s 步骤流含判定行" % label) # 伤害道具批(2026-09-18):单弱敌遭遇可被挖掘期兑付(穿刺弹/魔法矢/爆裂粉尘)在授予段单独击杀—— # 敌全灭后战斗段整段跳过、零先手行为合法结局;先手规则本身由强敌场景(L1/L2 深节点)继续守护。 check(hero_attacks >= 1 or run1.terminated, "%s 主角先手攻击行存在或授予段终局(2026-09-11 拍板① + 伤害道具批)×%d" % [label, hero_attacks]) - check(hero_breakdown_ok, "%s 主角攻击行携带三分量 normal/pierce/magic(克制批)" % label) + check(hero_breakdown_ok, "%s 主角攻击行携带类型键与掷点读数(单分量——充能退役批)" % label) func _run_battle(L: int, D: int) -> Dictionary: @@ -790,52 +791,26 @@ func _smoke_damage_types() -> void: check(enemy_system_b.spawn(1, 2, int(_db.hero.max_hp)) and String(enemy_system_b.all_enemies()[0].armor_type) == "light", "bugbear 护甲 = light(护甲类型重配批 2026-09-18:关卡 1 全轻甲)") var enemy_system_c = load("res://core/unit_container.gd").new(_db) check(enemy_system_c.spawn(1, 4, int(_db.hero.max_hp)) and String(enemy_system_c.all_enemies()[0].armor_type) == "light", "ogre_chief 护甲 = light(护甲类型重配批 2026-09-18:关卡 1 全轻甲)") - # ② 克制矩阵表值在位(三角:克制 150 / 中性 100 / 被克 50) + # ② 克制矩阵表值在位(2026-09-18 加法核换装:三档点数 克制 +1 / 中性 0 / 被克 −1——percent 量纲退役) var am: Dictionary = _db.settlement.armor_effectiveness - check(int(am.pierce.ward) == 150 and int(am.pierce.heavy) == 50 and int(am.pierce.light) == 100, "穿刺克制行:魔法护甲 150 / 轻甲 100 / 重甲 50") - check(int(am.magic.heavy) == 150 and int(am.magic.ward) == 50 and int(am.magic.light) == 100, "魔法克制行:重甲 150 / 轻甲 100 / 魔法护甲 50") - check(int(am.normal.light) == 100 and int(am.normal.ward) == 100 and int(am.normal.heavy) == 100, "普通攻击全护甲中性 100(不吃克制)") - # ②′ 充能奖励定义在位(抽象分离批:触发源 → 攻击类型桶;攻击类型定义里不含任何来源) - var grants: Dictionary = _db.settlement.charge_grants - var g_safe: Dictionary = grants.get("safe_cell", {}) - var g_flag: Dictionary = grants.get("flag_hit", {}) - check(String(g_safe.get("attack_type", "")) == "pierce" and int(g_safe.get("per_unit", 0)) == 1 and int(g_safe.get("cap", -1)) == 3, "充能奖励定义:开格 → 穿刺桶 1/格(单轮计数上限 3)") - check(String(g_flag.get("attack_type", "")) == "magic" and int(g_flag.get("per_unit", 0)) == 1 and int(g_flag.get("cap", -1)) == 0, "充能奖励定义:标中旗 → 魔法桶 1/雷(无计数上限)") - # ②″ 奖励可改(行为断言):把「标中旗」奖励从魔法桶改投穿刺桶 → 同一战斗魔法分量归零;还原后步骤流逐行相同 - # (证明改道唯一入口 = 奖励定义,攻击类型与甲效矩阵不参与;玩家可见语义见 战斗结算 GDD 战斗段) - var run_base = _run_flag_backlash_round(20260912) - var base_magic := 0 - for row in run_base.rows: - if String(row.get("source_class", "")) == "hero_attack": - base_magic += int(row.get("magic", 0)) - var save_grant: Dictionary = _db.settlement.charge_grants["flag_hit"] - _db.settlement.charge_grants["flag_hit"] = {"attack_type": "pierce", "per_unit": 2, "cap": 0} - var run_swap = _run_flag_backlash_round(20260912) - var swap_magic := 0 - for row in run_swap.rows: - if String(row.get("source_class", "")) == "hero_attack": - swap_magic += int(row.get("magic", 0)) - _db.settlement.charge_grants["flag_hit"] = save_grant - check(base_magic >= 1, "充能落桶基线:标中旗奖励进魔法桶(魔法分量合计 %d)" % base_magic) - check(swap_magic == 0, "改投穿刺桶后:主角攻击行魔法分量归零(×%d——改奖励即改道,攻击类型定义未动)" % swap_magic) - check(JSON.stringify(run_base.rows) == JSON.stringify(_run_flag_backlash_round(20260912).rows), "还原奖励定义后步骤流逐行相同(改道只经奖励定义,矩阵零改动)") - # ③ 标错(类型化负向兑付)+ 标中充能(奖励定义现投魔法桶;Boss 行 150HP 多轮样本;板真相直读保证 hit/miss 确定性) + check(int(am.normal.light) == 0 and int(am.normal.ward) == 1 and int(am.normal.heavy) == -1, "普通行:轻甲 0 / 魔法护甲 +1 / 重甲 −1(加法核)") + check(int(am.pierce.light) == -1 and int(am.pierce.ward) == 1 and int(am.pierce.heavy) == 0, "穿刺行:轻甲 −1 / 魔法护甲 +1 / 重甲 0 中性(用户拍板)") + check(int(am.magic.light) == 0 and int(am.magic.ward) == -1 and int(am.magic.heavy) == 1, "魔法行:轻甲 0 / 魔法护甲 −1 / 重甲 +1(加法核)") + # ③ 标错(类型化负向兑付)+ 标中正向兑付(2026-09-19 充能退役后标中旗只兑格面资源正向;Boss 行多轮样本;板真相直读保证 hit/miss 确定性) var run1 = _run_flag_backlash_round(20260912) var miss_rows := 0 var negative_rows := 0 - var magic_round := -1 - var magic_seen := 0 + var hit_rows := 0 for row in run1.rows: if row.get("type", "") == "flag_miss": miss_rows += 1 if String(row.get("source_class", "")) == "flag_miss" and String(row.get("type", "")) in ["effect", "damage"]: negative_rows += 1 # 标错的负向兑付行(该安全格资源的负向字典行——effect/直伤) - if row.get("source_class", "") == "hero_attack" and int(row.get("magic", 0)) >= 1: - magic_round = int(row.get("round_index", -1)) - magic_seen = int(row.get("magic", 0)) + if String(row.get("source_class", "")) == "flag_hit": + hit_rows += 1 # 标中的正向兑付行(该雷格资源的正向字典行——2026-09-19 充能退役后标中只走格面资源正向) check(miss_rows >= 1, "标错旗产生 flag_miss 归因行(×%d)" % miss_rows) check(negative_rows >= 1, "标错旗兑付该安全格资源的负向字典行(×%d——attack/defense/weaken 效果行或 heal 直伤行)" % negative_rows) - check(magic_round >= 1, "标中雷充能进主角攻击(magic=%d @R%d——每雷实例一次)" % [magic_seen, magic_round]) + check(hit_rows >= 1, "标中旗兑付该雷格资源的正向字典行(×%d——充能退役后无魔法分量,正向=格面资源)" % hit_rows) # ④ 同种子回放(极性路由零随机——同种子逐行相同) var run2 = _run_flag_backlash_round(20260912) check(JSON.stringify(run1.rows) == JSON.stringify(run2.rows), "标错惩罚轮回放断言:同种子步骤流逐行相同(类型化负向兑付确定性)") diff --git a/tools/analyze_playtest.py b/tools/analyze_playtest.py index 287e4aa6..6c79aad7 100644 --- a/tools/analyze_playtest.py +++ b/tools/analyze_playtest.py @@ -597,9 +597,9 @@ def main(): tier = (0, 0) for i, a in enumerate(args): if a == "--tier" and i + 1 < len(args): - atk_s, hp_s = args[i + 1].split(",") + tier = tuple(int(x) for x in args[i + 1].split(",")) elif a.startswith("--tier="): - atk_s, hp_s = a.split("=")[1].split(",") + tier = tuple(int(x) for x in a.split("=")[1].split(",")) analyze_runs(rows, os.path.basename(path), tier) elif "--run" in args: # 抽单局(大日志里按 run 序号或种子挑一局)走三层维度报告