docs: 任务书-内容数据驱动扩展批v1.0(迭代17卡0头卡——用户盘问八裁决全落R1-R8/事件词汇定稿17实施+3登记/效果类型16/组合规则5/23挂点逐行移植映射表/T0-T7≈4.5d零待裁点/契约5红线含MC对拍逐位等价)+roadmap插队行(四卡顺延原样保留)+06提案条目换代已立项(四拍板点全裁实录)

This commit is contained in:
DKChan committed 2026-10-06 16:17:18 +08:00
1 parent ac61b3445e
commit 6f9e01080e
3 files changed
+172 -5

No files matched your search

+5 -5
View File
@@ -10,15 +10,15 @@
**状态**:待数值批触发时重采;重锚前一切 MC 旧读数只作历史存档,不得与新行为对拍。
#### 内容数据驱动扩展架构提案——四拍板点待裁(2026-10-06 登记)
#### 内容数据驱动扩展批——已立项迭代 17 头卡(2026-10-06 登记,同日全裁)
**现状**:调研报告落籍 master(=[研究-内容数据驱动扩展架构-2026-10-06](../research/研究-内容数据驱动扩展架构-2026-10-06.md))——用户两问结论:①改已有物品数值/名字/稀有度/投放渠道=**纯配置成立**(全内容族 `.tres` 数据表+schema 加载校验+悬空引用致命);②换全新效果行为/加带新效果的新物品/加机制类新专长=**现状必改代码**(专长 23 挂点封闭枚举 `feat_table.gd:36-67`+求值段逐个 match 展开 `battle_orchestrator.gd:101-179`+消费点约 24 处散布;秘宝被动件按 id 硬编码六件;效果文案硬编码三处)。项目内已有完全数据驱动范本=技能池(`skills.tres` 加行+`enemy.tres` pool 引用零代码)。mod 成熟游戏四共性(Minecraft 数据包/Factorio 原型/RimWorld Defs,前两者官方文档核对):内容=数据+机制=通用解释器、语义事件时机+内容订阅、条件通用词汇复用、加载期注册校验闸。备选案三列:案甲=只清秘宝 id 硬编码+文案入表(≈1 天);**案乙=专长/秘宝/令牌统一「触发时机+条件+效果类型+参数」数据形态+结算段语义事件埋点(≈3-4 天分期①专长②秘宝③令牌,MC 模拟器零改动自动受益;推荐)**;案丙=外挂 GDScript 效果脚本层真 mod 支持(≈5 天+,Alpha 前挂账)。
**现状**:调研报告落籍 master(=[研究-内容数据驱动扩展架构-2026-10-06](../research/研究-内容数据驱动扩展架构-2026-10-06.md))——用户两问结论:①改已有物品数值/名字/稀有度/投放渠道=**纯配置成立**(全内容族 `.tres` 数据表+schema 加载校验+悬空引用致命);②换全新效果行为/加带新效果的新物品/加机制类新专长=**现状必改代码**(专长 23 挂点封闭枚举 `feat_table.gd:36-67`+求值段逐个 match 展开 `battle_orchestrator.gd:101-179`+消费点约 24 处散布;秘宝被动件按 id 硬编码六件;效果文案硬编码三处)。项目内已有完全数据驱动范本=技能池(`skills.tres` 加行+`enemy.tres` pool 引用零代码)。mod 成熟游戏四共性(Minecraft 数据包/Factorio 原型/RimWorld Defs,前两者官方文档核对):内容=数据+机制=通用解释器、语义事件时机+内容订阅、条件通用词汇复用、加载期注册校验闸。
**拍板点(全归用户)**:①立项选择(甲/乙/丙)②排期位置(迭代 17 候选序列或插队)③案乙首批词汇表范围(23 hook+12 kind 全收敛 vs 专长族先行试点)④物品效果文案表值化是否随批(牵 battle_narrator/curio_interact_controller 两处)。
**裁决实录(2026-10-06 用户盘问轮逐条裁定,全落任务书 §二)**:案乙当选;架构=发布订阅同步 emit(事件=`.on("xxx")` 的 topic;订阅后逻辑=效果类型;叠加=组合规则,禁自造词);仅一个改写窗口不做拦截器链;一事件多订阅常态、冲突由 5 条组合规则封死;旧 23 挂点枚举删除(2 个退化条件行);**范围判据=现有实现全改造(含 luck_coin 经 reward_roll 迁移+文案表值化),06 在册待办只登记不实施**(curio_roll/shop_purchase/gp_settle 三事件登记暂不做);框架先行发射点全埋;一个迭代四模块垂直切一次合并;词汇表定稿=实施 17 事件+效果类型 16+组合规则 5。
**归属**:内容管线架构专项;开工 = 用户发令
**归属**:迭代 17 卡⓪(头卡,用户令插队——①-④卡顺延);任务书=[任务书-内容数据驱动扩展批-2026-10-06](../research/任务书-内容数据驱动扩展批-2026-10-06.md)(T0-T7≈4.5d,零待裁点)
**状态**:待办(四拍板点未裁;报告零代码修改)
**状态**:已立项(任务书已成文待 U0 用户发令开工)
#### 菜单开局未传同调装配与局外树规则——疑似缺陷待复验(2026-10-06 登记)
@@ -0,0 +1,166 @@
# 任务书-内容数据驱动扩展批(迭代 17 卡⓪)-2026-10-06
状态:任务书 v1.0(**全部裁决已落、零待裁点**,开工门=U0 用户发令)。设计权威=调研报告 [研究-内容数据驱动扩展架构-2026-10-06](研究-内容数据驱动扩展架构-2026-10-06.md)+本会话盘问裁决实录(台账 370)。
排期:**迭代 17 头卡(2026-10-06 用户令插队)**,迭代 17 原①-④卡顺延(任务书与裁点状态原样保留)。
---
## 一、迭代目标与完成定义
把「内容的效果行为」从散布在结算代码里的硬编码分支,搬进内容数据行的三个字段——**订阅哪个事件(on)/ 什么条件(when)/ 什么效果(do)**——由一个通用解释器(EffectEngine)统一执行。完成后:加一件「已有效果类型」的新专长/新秘宝=只改 `.tres` 数据行,零代码。
**完成定义**:①旧 23 挂点枚举删除,27 行专长数据全部迁为事件订阅形态且行为等价(MC 对拍锚逐位一致);②六件按 id 硬编码的被动秘宝迁毕、按 id 特判清零;③文案表值化(效果说明进数据行);④一个迭代内完成、一次合并登记。
## 二、裁决实录(2026-10-06 用户逐条裁定,全数有效)
| # | 裁决 | 内容 |
|---|---|---|
| R1 | 架构模型 | 发布订阅:结算管线同步 emit 事件(无队列无异步,确定性优先)→ EffectEngine 遍历持有集匹配订阅 → 执行数据行里声明的效果。**不是**代码级插件/监听器类——订阅关系本身是配置 |
| R2 | 拦截能力 | 不做通用拦截器链;只保留**一个改写窗口**(伤害单据 open_ticket 后、submit 前,modify 类效果收集后单点按声明序施加)。断链/否决能力不建,将来需要时加 veto 位 |
| R3 | 多订阅与冲突 | 一事件多订阅=常态(持有集即订阅集);冲突在**效果类型层用组合规则封死**(见 §四),内容行只能选类型不能自定义合并行为。遍历顺序=数据表声明序,写死保种子复放 |
| R4 | 旧挂点处置 | 23 个 hook 枚举**删除**(概念消亡:事件名+效果类型取代);其中 first_dig_spell、terrain_dig_double 退化为纯条件行;dig_count_segments 与 round_dig_bonus 保留为**两件独立内容**(效果类型不同:攻击分段 vs 攻击加值),订阅同事件 |
| R5 | 范围判据 | **现有实现全部改造**(含 luck_coin 偏运硬币→reward_roll 事件、文案硬编码、令牌 match、树规则键);**06 在册待办只登记不实施**(curio_roll/shop_purchase/gp_settle/level_clear 四事件只登记事件名与发射点设计,哪个 06 内容开工时随批加) |
| R6 | 框架先行 | round_start / boss_hp_threshold / treasure_used 等发射点一律埋进本批,不论当前有无订阅者 |
| R7 | 交付形态 | **一个迭代完成**,按模块垂直切需求卡(框架/专长/秘宝/令牌树),不分批不分迭代、批末一次合并 |
| R8 | 术语纪律 | 事件=`.on("xxx")` 的 "xxx";订阅后逻辑=效果类型;多订阅叠加规则=组合规则。禁用「挂点/hook/合并律/挂账」等自造词(存量文档随 T7 换代) |
## 三、事件词汇表(定稿:实施 17,登记暂不做 4)
### 3.1 本批实施(17 个发射点)
| 事件名 | 发布时机(发射点,现有代码位置) | 载荷要点 |
|---|---|---|
| `dig_reveal` | 安全开格结算完成(battle_orchestrator 挖格段) | cell、round、is_first_dig_of_level、terrain_kind |
| `dig_paid` | 付费开掘发起、动作经济闸收对价前 | cell、ap_cost |
| `flag_hit` | 标中雷兑付时 | cell、round、adjacent_terrain |
| `mine_hit` | 踩雷时(含计数清零语义面) | cell、round、damage |
| `level_clear` | 一张图清空兑付时 | round |
| `attack_commit` | 我方伤害单据开立(damage_controller.open_ticket 入口) | atk、target、matchup、feats_ctx |
| `clamp_check` | 克制关系判定修正点 | matchup(magic_vs_magic/magic_vs_heavy/pierce_vs_light/…) |
| `armor_roll` | 敌护甲掷骰判定 | target_ac、roll |
| `kill` | 敌人死亡确认 | target、overflow余量 |
| `damage_taken` | 我方受到伤害(kind ∈ {enemy_skill, terrain};雷伤走 mine_hit 不重复发) | kind、amount、source |
| `boss_hp_threshold` | Boss 血量跌破阈值(unit_container.check_skill_unlocks 同点) | unit、pct |
| `round_start` | 每轮开始 | round |
| `flag_settle` | 轮末旗伤结算(轮末序:旗伤开单→AP结转→积层反打,顺序显式在发射代码) | flags_hit_all、flags_count |
| `round_end` | 每轮结算收口 | round |
| `reward_roll` | 格面资源掷定(摇号前权重合成层,luck_coin 迁移落点) | cell、polarity、weights |
| `treasure_used` | 使用主动秘宝(use_treasure 受理面) | item_id、target |
| (`curio_roll` 邻位)三选一候选生成现有钩位仅供**对拍观测**,不改发布面 | —— | —— |
### 3.2 登记暂不做(3 个,发射点设计一行,随对应 06 内容批实施;R5 裁决)
`curio_roll`(三选一候选生成时发布→服务「战利品鉴定」)/ `shop_purchase`(商店成交时发布→服务「符文重铸」)/ `gp_settle`(金币结算入账时发布→服务「贪婪契约」)。三者均系 06 在册二期件的前置,本批只在本文登记,不写发射代码。
### 3.3 效果类型词汇表(16 个,解释器 switch 闭集)
| 效果类型 | 语义 | 收编的现状 |
|---|---|---|
| `add_ticket_rider` | 单据追加固定伤 | hero_attack_rider、venom_edge |
| `modify_ticket` | 改写单据数值(改写窗口,按序施加) | clamp_modifier×3、roll_discount、nest_aura、hit_trade、armor_roll_rewrite |
| `attack_bonus` | 攻击力加值 | round_dig_bonus |
| `attack_segments` | 攻击拆多段 | dig_count_segments(连珠矢) |
| `yield_mult` | 开格产出乘区(正负分桶) | dig_yield_mult×3、terrain_dig_double(条件行) |
| `spawn_spell` | 生成一次必中魔法矢 | first_dig_spell(条件行) |
| `overflow` | 击杀溢出弹射 | kill_overflow |
| `grant_material` | 掉落格面资源 | flag_resource、terrain_refund |
| `grant_ap` | 给行动点 | ap_carry |
| `grant_gp` / `bias_wallet` | 金币面 | luck_coin(经 reward_roll) |
| `shield` | 减伤层 | charge_shield |
| `spike` | 满层反打 | charge_spike |
| `apply_status` | 授予状态(复用 status_effects.tres 词汇) | heavy_debuff |
| `counter_add` / `counter_spend` | 计数器增减(重置点数据声明:round_start/round_end/level) | round_dig 计数、variant_counter、dig_charge 积点、nest_counter |
| `rewrite_board` | 改写棋盘格状态 | flag_neutralize |
| `reveal_tiles` / `remove_mines` | 显影/移除(主动件既有通道合流) | mine_reveal、cell_removal |
| `bias_rewards` / `refresh_pick` / `preview` | 抽取面 | reward_weight_bias、bonus_refresh、pick_refresh |
### 3.4 组合规则(5 条,效果类型的必填属性,解释器内置)
| 规则 | 语义 | 适用 |
|---|---|---|
| 加法族 | 数值相加(可交换,顺序无关) | add_ticket_rider、attack_bonus、grant_*、counter_add、shield |
| 乘法族 | 收集后一次施加(正负分桶) | yield_mult |
| 任意真族 | 任一命中即生效 | spawn_spell、overflow、spike |
| 按序改写族 | 收集→单点按声明序施加 | modify_ticket 及一切改写窗口效果 |
| 按序消耗族 | 按订阅序消耗共享资源,耗尽即止、拒绝走 reason 通道 | counter_spend |
## 四、数据行目标形态与 schema
```
# feats.tres 一行(示例:奥术余烬 + 魔网织者)
{feat_id:"arcane_ember", rarity:"common", archetype:"magic",
desc:"普攻命中后追加 1 点必中魔法伤",
triggers:[
{on:"attack_commit", do:{kind:"add_ticket_rider", value:1, dtype:"magic"}} ]}
{feat_id:"mana_weaver", rarity:"rare", archetype:"magic",
triggers:[
{on:"clamp_check", when:[{fact:"matchup", op:"eq", value:"magic_vs_magic"}],
do:{kind:"modify_ticket", delta:-1}} ]}
```
- schema 校验照旧封闭且保留全部现有护栏:`on` ∈ 事件词汇、`do.kind` ∈ 效果词汇、`when.fact` ∈ fact 表、行键白名单、悬空引用加载致命、零裸 flat 禁令、流派扫雷触发点铁律(MINE_HOOKS 改为「每流派 ≥1 行订阅扫雷侧事件」同义校验)。
- **存档零改动**:持有集/装备存 id 不变,换的只是解释方式——纯重构可对拍的前提。
- fact 表(条件词汇,闭集 ~15):matchup、is_first_dig_of_level、terrain_kind、target_armor_class、flags_count、charge_layers、nest_count、round_index、counter 值等只读查询。
## 五、23 挂点逐行移植映射表(等价性对拍底单)
| 旧 hook | 持有内容(feats.tres 实据) | 新形态 |
|---|---|---|
| hero_attack_rider | arcane_ember | on:attack_commit → add_ticket_rider |
| clamp_modifier | mana_weaver / azure_oath / hunter_rapier(穿刺) | on:clamp_check + when(matchup) → modify_ticket |
| first_dig_spell | mana_resonance | on:dig_reveal + when(is_first_dig_of_level) → spawn_spell |
| kill_overflow | pierce_shot | on:kill → overflow |
| dig_count_segments | chain_arrows | on:dig_reveal→counter_add;on:attack_commit→attack_segments |
| roll_discount | weak_instinct | on:clamp_check → modify_ticket(档位移) |
| round_dig_bonus | miner_stubborn | on:dig_reveal→counter_add;on:mine_hit→counter 清零;on:attack_commit→attack_bonus |
| hit_trade | miner_hammer | on:attack_commit → modify_ticket(攻受交换) |
| armor_roll_rewrite | focus_mind | on:armor_roll → modify_ticket(免掷恒折扣) |
| heavy_debuff | armor_crack | on:attack_commit + when(重甲) → apply_status |
| dig_yield_mult | greedy_lantern / vein_intuition / gambler_pact | on:dig_reveal → yield_mult(乘法族) |
| deep_dig | deep_drill | on:dig_paid → counter_spend(ap 对价) |
| flag_resource | mine_atlas | on:flag_hit → grant_material |
| nest_aura | nest_hunter | on:attack_commit + fact(nest_count) → modify_ticket |
| flag_all_hit | perfect_defense | on:flag_settle + when(全中) → yield_mult(旗伤乘区) |
| flag_strike | war_banner | on:flag_settle → 开单(attack 通道) |
| ap_carry | armory_prep | on:round_end → grant_ap |
| charge_shield | iron_wall | on:damage_taken + fact(charge_layers) → shield |
| charge_spike | patient_burst | on:charge 满层沿 → spike |
| terrain_refund | ley_harvest | on:damage_taken(kind=terrain) → grant_material |
| terrain_dig_double | thorn_weaver | on:dig_reveal + when(伤害型地形) → yield_mult(×2) |
| flag_neutralize | purge_sapper | on:flag_hit + when(邻伤害地形) → rewrite_board |
| variant_counter | magma_body | on:damage_taken→counter_add;on:round_end→counter_spend 反打 |
秘宝侧六件:venom_edge(attack_commit→add_ticket_rider)、luck_coin(reward_roll→bias_wallet)、dawn_order(round_start→grant_ap 队列)、dig_charge(dig_reveal→counter_add + dig_paid→counter_spend)、nest_counter(damage_taken→counter_add + 反打)、flag_burst(flag_hit→burst);pick_refresh(curio_pick 面→refresh_pick)。
## 六、任务卡(T0-T7 ≈4.5d,软时间盒超限 L3 呈报切点)
| 卡 | 内容 | 估时 |
|---|---|---|
| T0 | 开工三查:worktree+基线复读(冒烟/探针/run_all/MC 对拍锚)+git status 归属核对(在飞 mapdmg/standee/uialign 只标旗不碰) | 0.25d |
| T1 | EffectEngine 框架:事件枚举+发射点 17 处埋点+订阅装载(开局从持有集/装备集构建 trigger 列表)+组合规则+改写窗口+计数器账本+确定性声明序 | 1.0d |
| T2 | 词汇表落码:schema 换代(feats/treasure 两表 trigger 形态+校验规则换代+fact 表)+护栏迁移(MINE_HOOKS 同义校验等) | 0.5d |
| T3 | 专长迁移:27 行数据改写(§五映射表逐行)+旧枚举删除+_feat_flags_for 退役+消费点 24 处拆除+文案入表(battle_narrator 两处) | 1.25d |
| T4 | 秘宝迁移:六件被动+dig_charge 特判+主动件 kind 分发合流+luck_coin 经 reward_roll+curio_interact_controller 文案入表 | 0.75d |
| T5 | 令牌/树收尾:_apply_curio_pick match 收敛进效果类型+meta_tree 规则键走同面 | 0.5d |
| T6 | 回归闸:MC 对拍现行锚逐位一致+七流派成型画像重锚同带+冒烟+run_all+探针+确定性复放 | 0.5d |
| T7 | 文档正主换代+出口报告:奇物.md/秘宝.md/敌人系统.md 词汇换代+registry 条目+06 状态收口+退出人闸材料包 | 0.25d |
## 七、契约红线(🔴 违反即停机呈报)
1. **存档零破坏**:存档键/存档格式/断点结构一字不改;换的只是运行时解释方式。
2. **数值等价**:迁移前后行为逐位等价——MC 对拍锚逐位一致是硬闸;发现必要偏差(如旧实现 bug 被顺带修正)必须停机呈报,禁静默吸收。
3. **确定性**:全同步调用、无队列无异步无 signal 时序依赖;遍历序=数据声明序。
4. **护栏保留**:封闭枚举校验/键白名单/悬空引用致命/零裸 flat 禁令/流派扫雷触发铁律全部以新形态延续,禁以「数据驱动」名义放开任何护栏。
5. **battle_orchestrator 历史脏件**:全程 worktree 批、主区禁直改;并行在飞三线(mapdmg/standee/uialign)只标旗不碰,T0 重取基线。
## 八、停机点与验证闸
- **S1**(T3 段末):首个流派(魔法流)迁移完跑 MC 对拍——若逐位不一致且定位超出映射表误差,停机呈报。
- **S2**(T6):对拍锚不一致/成型画像越带/冒烟红——任一命中停机,禁带病合并。
- 验证闸:冒烟全量+run_all 全套+五探针+MC 对拍+确定性复放(同种子两次逐位一致)。
- 代拍板白名单:事件载荷字段命名、fact 表个别查询面落法、smoke 断言数漂移追认、发射点微调(±1 处)。
- 呈报不停机级:文案措辞、注释层、台账撞号顺延。
## 九、范围边界(明确不做)
- 4 个登记事件不实施(§3.2);外挂脚本层(调研案丙)不做;luck_coin 之外的数值重调不做(归 M4 数值批);relic/feat 存档键更名不做(06 在册命名统一条,存档键铁律);main.gd:475 疑似缺陷不随批(06 在册独立 mini-loop 待令)。