feat(feats): 迭代20 T3 专长 27+2 件换代(专长实装批 B段一)

feats.tres 整表换代:旧 27 件删除(素材库表二退役面),重设计 29 行重建(基础 27+迁入
淬毒刃纹/封印爆裂——卡文 §10.4 推荐案件数口径);订阅行 on/when/do=效果引擎封闭词表;
rarity 四级直映射令牌档(普通 12/优秀 9/稀有 8/传说 0);cap 已拿上限字段(案②解耦);
desc 禁「雷/插旗」字面(契约 6——封印/陷阱风味系);dispatch 预评估口径「每第 N 次」按
N-1 落值(mod_eq ref/eq 阈值-1——effect_words_t1_test 钉住)。

feat_table schema 换代:RARITIES 四级;ROW_KEYS 摘 archetype 增 cap;流派扫雷铁律校验
随流派框架退役摘除(奇物.md v1「不设流派标签、不设档位机制」)。

battle_orchestrator:FeatsEngine 档位求值与 rider_tier 注入摘除(V14 旧实现删除覆盖——
散件单体效果=唯一形态);FACTS 补 pct(处刑台血量阈值沿)。

smoke 特性段整段换代:牌库构成 29 件四级断言(V2)/契约静态钉扎(V18 牌库 kind 全集/
V19 零棋盘改写订阅/V21 禁字初筛/V22 结构锚形态机检半)/临时表新 schema 注入/门票与
relic 兑付断点主语换代/V3 附表 A 逐件三列断言 29 件(命中面 dispatch 直测+counter 落账
施加面同构 helper);同调测试两处主语 venom_edge/flag_burst→nest_counter/dawn_order
(V14 换桩——T9 迁出 treasure_items 前置)。冒烟 863/0+run_all 20 套全绿。
This commit is contained in:
DKChan committed 2026-10-11 23:58:48 +08:00
1 parent 0640b0c06d
commit 54ab330beb
6 files changed
+1151 -830

No files matched your search

+23 -40
View File
@@ -1,8 +1,9 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 七核心流派各 ≥3 件入局内随机渠道后,标签+档位激活引擎能否机械判「成型」、
# 专长带能否挂进令牌池稀有/罕见档随机投放(P0——迭代 12 双层 BD 实施批 T1)
# Date: 2026-10-06(内容数据驱动扩展批 T3——行换代:hook/effects 挂点形态退役,triggers 事件订阅形态
# 唯一合法行形——旧 23 挂点枚举消亡:事件名+效果类型取代,需求卡片 R4 裁决)
# Validation Question: 专长 27 件订阅行能否经效果引擎统一解释执行、逐件行为与声明一致(P0——
# 迭代 20 专长实装批 T3;前史:迭代 12 双层 BD 实施批 T1 建表/迭代 17 内容数据驱动扩展批 T3 行换代)
# Date: 2026-10-11(迭代 20 专长实装批 T3——重设计换代:流派标签/档位激活机制退役〔奇物.md v1
# 设计原则「不设流派标签、不设档位机制」〕;rarity 四级〔跨层框架〕;cap 已拿上限字段〔池结构案D
# 概率与上限解耦——每件标注两个独立属性:概率位=档+rarity、上限=cap(拿了才计、刷出不计)〕)
# 概念指路:本表的专长,与 adventure.tres 的属性值提升、资源,同属一个对象——
# 「奇物」(一次冒险内各渠道给予玩家的增益总称)。定义见 design/gdd/systems/冒险循环/奇物.md。
# 它们是它分类轴上的枚举(专长 / 属性值提升 / 资源),不是三套系统;本表承载「专长」(专长 Feat)的逐项定义。
@@ -11,29 +12,25 @@
# 目标渠道:专长走关底 Boss 击败后专属三选一(不新增节点类型),见奇物文档 2.1 节。)
# 数据配置 FeatTable schema(奇物·专长定义表;行 = Dictionary 键 feat_id,Rule 4 豁免
# 定义表——TreasureItemTable 先例)。
# 行字段:feat_id 主键 / display_name / rarity ∈ {common, rare, rarest}(对齐令牌池三档命名——
# 投放档映射:common/rare→稀有令牌档、rarest→罕见令牌档;relic 令牌永不入普通档)/
# archetype ∈ ARCHETYPES 七流派标签 / desc 效果说明(文案表值化——呈现层读行,零硬编码)/
# triggers 订阅行数组(订阅哪个事件 on / 什么条件 when / 什么效果 do——效果引擎 EffectEngine
# 统一解释执行;四词表封闭校验=EffectEngine.validate_trigger_row 单一事实源)。
# 档位激活(整合定稿 设计工具 1——以撒套装/小骨铭文):同标签计数 ≥2→档一(流派核心规则)/≥4→档二
# (完全体);散件单体保底=每件效果独立生效,档位只做质变(反例 B-2)——引擎纯函数 FeatsEngine。
# 🔴 层级纪律(需求卡片红线 2):专长只走局内随机渠道(三选一/商店/格面)——本表行永不入同调位
# (treasure_items 表)/局外树(T8 节点表);扫雷触发点铁律:每流派 ≥1 行订阅扫雷侧事件
# (EffectEngine.MINE_EVENTS——加载校验,违反=红线①触碰面)。
# 行字段:feat_id 主键 / display_name / rarity ∈ {common, excellent, rare, legendary}(四级稀有度,
# 与令牌池档位词表同名词族——令牌档 = rarity 直映射)/ cap 已拿上限(正整数,缺省 1——「同一件
# 最多拿 N 次」;概率位与上限解耦见奇物.md 池结构节)/ desc 效果说明(文案表值化——呈现层读行,
# 零硬编码)/ triggers 订阅行数组(订阅哪个事件 on / 什么条件 when / 什么效果 do——效果引擎
# EffectEngine 统一解释执行;四词表封闭校验=EffectEngine.validate_trigger_row 单一事实源)。
# 🔴 层级纪律(需求卡片红线 2):专长只走局内随机渠道(Boss 三选一/凭证开启)——本表行永不入同调位
# (treasure_items 表)/局外树(T8 节点表)。
# 退役注记(V14 旧实现摘除):ARCHETYPES 流派标签/档位激活(FeatsEngine 档位质变)随重设计退役——
# 事件族(开格/插旗/踩雷/节奏/战斗系)仅系设计侧分组工具不上数据行不上卡面(命名铁律)。
class_name FeatTable
extends Resource
@export var rows: Array = [] # Array[Dictionary] 键 feat_id
## 流派标签词表(七核心——喂雷/淘金不在本批,R5 甲/缓议)
const ARCHETYPES := ["magic", "pierce", "normal", "dig", "flag", "charge", "devour"]
## 稀有度词表(四级——与令牌池 TIERS 同名词族;令牌档 = rarity 直映射)
const RARITIES := ["common", "excellent", "rare", "legendary"]
## 稀有度词表(对齐令牌池三档;投放档映射 relic→rare / rarest→rarest)
const RARITIES := ["common", "rare", "rarest"]
## 行键白名单(🔴 零裸 flat 同族护栏——键出域=加载致命;triggers/desc=T3 换代新形态)
const ROW_KEYS := ["feat_id", "display_name", "rarity", "archetype", "triggers", "desc", "note"]
## 行键白名单(🔴 零裸 flat 同族护栏——键出域=加载致命)
const ROW_KEYS := ["feat_id", "display_name", "rarity", "cap", "triggers", "desc", "note"]
## trigger 行键(订阅行三字段:on/when?/do)
const TRIGGER_KEYS := ["on", "when", "do"]
@@ -42,10 +39,8 @@ const TRIGGER_KEYS := ["on", "when", "do"]
func validate() -> Array:
var errs: Array = []
if rows.is_empty():
return errs # 空表合法态(T1 基建先行——逐流派填行)
return errs # 空表合法态(T1 基建先行——逐件填行)
var seen := {}
# 流派扫雷覆盖聚合(🔴 红线①铁律——每流派 ≥1 行订阅扫雷侧事件)
var arch_mine := {} # archetype → bool
for row in rows:
var rid: String = row.get("feat_id", "")
if rid == "":
@@ -59,30 +54,18 @@ func validate() -> Array:
errs.append({"category": "domain", "message": "%s display_name 空" % rid})
if not RARITIES.has(String(row.get("rarity", ""))):
errs.append({"category": "enum", "message": "%s rarity 出域 %s" % [rid, str(RARITIES)]})
var arch := String(row.get("archetype", ""))
if not ARCHETYPES.has(arch):
errs.append({"category": "enum", "message": "%s archetype 出域 %s" % [rid, str(ARCHETYPES)]})
if row.has("cap") and int(row.get("cap", 1)) < 1:
errs.append({"category": "domain", "message": "%s cap 出域 [1,∞): %d" % [rid, int(row.get("cap", 1))]})
if not row.has("triggers"):
errs.append({"category": "domain", "message": "%s 缺 triggers(订阅形态唯一合法行形)" % rid})
elif EffectEngine.validate_trigger_row(rid, row, row.get("triggers", []) as Array, errs):
arch_mine[arch] = true
else:
EffectEngine.validate_trigger_row(rid, row, row.get("triggers", []) as Array, errs)
for k in row.keys():
if not ROW_KEYS.has(String(k)):
errs.append({"category": "zero_flat", "message": "%s 行键出白名单: %s" % [rid, String(k)]})
# 🔴 红线① 扫雷触发点铁律:**有行的流派**各 ≥1 行订阅扫雷侧事件(MINE_EVENTS 同义校验)
for arch in archs_with_rows():
if not bool(arch_mine.get(arch, false)):
errs.append({"category": "load_bearing", "message": "流派 %s 无扫雷结算触发点行(🔴 红线①铁律——每流派 ≥1 件订阅扫雷侧事件)" % String(arch)})
return errs
func archs_with_rows() -> Array:
var out := {}
for row in rows:
out[String(row.get("archetype", ""))] = true
return out.keys()
func row_by_id(feat_id: String) -> Dictionary:
for row in rows:
if String(row.get("feat_id", "")) == feat_id:
File diff suppressed because it is too large. Load diff