拆件批v1.3-B3伴随(私有助手抽取与用语统一): unit_container 抽 _pool_snapshot(开战实例池快照循环体逐字迁移)与 _pct_fact_blocked(self/hero 百分比事实阈值判定——分支逐字承原,六算子统一在阈值上)、skill_table validate 抽 _validate_trigger/_validate_trigger_domain/_validate_trigger_value/_validate_basic_row 四私有段(报错顺序=报告顺序逐字承原,行缺 trigger 早退等价)、config_db_cross_validator 抽 _pool_cast_side_errs 并修复拆分稿缺陷——append_array 误落逐行循环内会按技能行数重复追加守卫报错,移回全表恰一次恢复单份报错序;curio_deck/effect_context/level_autoplay 注释与 enemy.tres/status_effects.tres 调参登记注用语统一(通关→冒险成功/关卡完成率——零数值零行为改动)。验收:全量套件 63 绿+round_flow EV 锚 goblin 已知预期红 1;bp 对拍 292dumps×28 键 mismatch=0(双基线);冒烟 17 项 0 失败;gdstyle 基线外新违规 0/恶化恰 2(存量债)〔领域拆分批 V1〕

This commit is contained in:
DKChan committed 2026-10-27 17:00:47 +08:00
1 parent 012883f301
commit 45faa92bc5
8 files changed
+115 -76

No files matched your search

+60 -38
View File
@@ -44,36 +44,7 @@ func validate() -> Array:
if not SKILL_TYPES.has(type):
errs.append({"category": "enum", "message": "%s type 未知枚举: %s(域 %s)" % [sid, type, str(SKILL_TYPES)]})
continue
# trigger(触发条件,可省略——敌人系统 v1.2:四键白名单/词表出域/类型分派/普攻禁配;加载期报错止动)
if row.has("trigger"):
var trig: Variant = row.get("trigger", null)
if not (trig is Dictionary):
errs.append({"category": "domain", "message": "%s trigger 须为 {fact,op,value,latch} 字典" % sid})
else:
var t: Dictionary = trig
for tk in t.keys():
if not TRIGGER_KEYS.has(String(tk)):
errs.append({"category": "domain", "message": "%s trigger 键白名单外: %s" % [sid, str(tk)]})
var tf := String(t.get("fact", ""))
var top := String(t.get("op", ""))
if not TRIGGER_FACTS.has(tf):
errs.append({"category": "enum", "message": "%s trigger fact 出域: %s" % [sid, tf]})
if not TRIGGER_OPS.has(top):
errs.append({"category": "enum", "message": "%s trigger op 出域: %s" % [sid, top]})
if TRIGGER_ENUM_FACTS.has(tf) and not (top == "eq" or top == "neq"):
errs.append({"category": "domain", "message": "%s trigger 枚举事实 %s 算子限域 eq/neq: %s" % [sid, tf, top]})
if tf != "" and TRIGGER_ENUM_FACTS.has(tf):
var ev = t.get("value", "")
if not (ev is String) or not TRIGGER_ENUM_VALUES.has(String(ev)):
errs.append({"category": "domain", "message": "%s trigger 枚举事实 value 越域: %s(域 %s)" % [sid, str(ev), str(TRIGGER_ENUM_VALUES)]})
elif TRIGGER_PCT_FACTS.has(tf):
var pv := int(t.get("value", 0))
if pv < 1 or pv > 99:
errs.append({"category": "domain", "message": "%s trigger 百分比事实 value 越域 [1,99]: %d" % [sid, pv]})
elif tf != "" and not (t.get("value", 0) is int):
errs.append({"category": "domain", "message": "%s trigger 数值事实 value 须整数: %s" % [sid, str(t.get("value", 0))]})
if t.has("latch") and not (t.get("latch", false) is bool):
errs.append({"category": "domain", "message": "%s trigger latch 须布尔: %s" % [sid, str(t.get("latch", false))]})
_validate_trigger(sid, row, errs) # trigger(触发条件,可省略——四键白名单/词表出域/类型分派/普攻禁配;加载期报错止动)
if type == "basic" and row.has("trigger"):
errs.append({"category": "cross_field", "message": "%s 普攻行禁配 trigger(普攻恒可摇的结构前提)" % sid})
# 冷却域(全类型):施放后连续 N 拍不可摇中
@@ -83,14 +54,7 @@ func validate() -> Array:
# 普通攻击两条域校验锁死特殊性:倍率恒 1、冷却恒 0——想配的就是伤害技(proposal §2.2)
if type == "basic":
has_basic = true
if row.has("damage_mult") and not is_equal_approx(float(row.damage_mult), 1.0):
errs.append({"category": "cross_field", "message": "%s 普攻 damage_mult ≠ 1(禁配——要配就是伤害技): %s" % [sid, str(row.damage_mult)]})
if row.has("cooldown_beats") and cd != 0:
errs.append({"category": "cross_field", "message": "%s 普攻 cooldown_beats ≠ 0(禁配——池恒非空的结构前提): %d" % [sid, cd]})
if row.has("buff_ref") or row.has("buff_duration"):
errs.append({"category": "cross_field", "message": "%s 普攻不带增益字段" % sid})
if row.has("rider_mult"):
errs.append({"category": "cross_field", "message": "%s 普攻不带必中附加分量(rider_mult 仅伤害技)" % sid})
_validate_basic_row(sid, row, cd, errs)
# 伤害技:存倍率不存固定值——伤害 = 施放者攻击基线 × 技能倍率(三乘法链第一乘);
# 可选 rider_mult = 必中附加分量(后置加法、不吃骰不出暴击——proposal-status-vocabulary §2)
if type == "damage":
@@ -136,6 +100,64 @@ func validate() -> Array:
return errs
# trigger 域校验(敌人系统 v1.2 触发条件:四键白名单/词表出域/类型分派——枚举事实算子限域 eq/neq
# 且 value 限枚举串、百分比事实 value 域 [1,99]、数值事实 value 须整数、latch 须布尔。行缺 trigger
# 直返——可省略字段)
func _validate_trigger(sid: String, row: Dictionary, errs: Array[Dictionary]) -> void:
if not row.has("trigger"):
return
var trig: Variant = row.get("trigger", null)
if not (trig is Dictionary):
errs.append({"category": "domain", "message": "%s trigger 须为 {fact,op,value,latch} 字典" % sid})
return
var t: Dictionary[Variant, Variant] = trig
for tk in t.keys():
if not TRIGGER_KEYS.has(String(tk)):
errs.append({"category": "domain", "message": "%s trigger 键白名单外: %s" % [sid, str(tk)]})
_validate_trigger_domain(t, sid, errs)
# trigger fact/op/value/latch 域校验(词表出域与类型分派——报错顺序=报告顺序,分派段单列)
func _validate_trigger_domain(t: Dictionary[Variant, Variant], sid: String, errs: Array[Dictionary]) -> void:
var tf := String(t.get("fact", ""))
var top := String(t.get("op", ""))
if not TRIGGER_FACTS.has(tf):
errs.append({"category": "enum", "message": "%s trigger fact 出域: %s" % [sid, tf]})
if not TRIGGER_OPS.has(top):
errs.append({"category": "enum", "message": "%s trigger op 出域: %s" % [sid, top]})
if TRIGGER_ENUM_FACTS.has(tf) and not (top == "eq" or top == "neq"):
errs.append({"category": "domain", "message": "%s trigger 枚举事实 %s 算子限域 eq/neq: %s" % [sid, tf, top]})
_validate_trigger_value(sid, t, tf, errs)
if t.has("latch") and not (t.get("latch", false) is bool):
errs.append({"category": "domain", "message": "%s trigger latch 须布尔: %s" % [sid, str(t.get("latch", false))]})
# trigger value 类型分派校验(枚举事实 value 限枚举串/百分比事实 value 域 [1,99]/数值事实 value 须整数)
func _validate_trigger_value(sid: String, t: Dictionary[Variant, Variant], tf: String, errs: Array[Dictionary]) -> void:
if tf != "" and TRIGGER_ENUM_FACTS.has(tf):
var ev = t.get("value", "")
if not (ev is String) or not TRIGGER_ENUM_VALUES.has(String(ev)):
errs.append({"category": "domain", "message": "%s trigger 枚举事实 value 越域: %s(域 %s)" % [sid, str(ev), str(TRIGGER_ENUM_VALUES)]})
elif TRIGGER_PCT_FACTS.has(tf):
var pv := int(t.get("value", 0))
if pv < 1 or pv > 99:
errs.append({"category": "domain", "message": "%s trigger 百分比事实 value 越域 [1,99]: %d" % [sid, pv]})
elif tf != "" and not (t.get("value", 0) is int):
errs.append({"category": "domain", "message": "%s trigger 数值事实 value 须整数: %s" % [sid, str(t.get("value", 0))]})
# 普攻行禁配校验(倍率恒 1、冷却恒 0、不带增益/rider 字段——「池恒非空」的结构前提)
func _validate_basic_row(sid: String, row: Dictionary, cd: int, errs: Array[Dictionary]) -> void:
if row.has("damage_mult") and not is_equal_approx(float(row.damage_mult), 1.0):
errs.append({"category": "cross_field", "message": "%s 普攻 damage_mult ≠ 1(禁配——要配就是伤害技): %s" % [sid, str(row.damage_mult)]})
if row.has("cooldown_beats") and cd != 0:
errs.append({"category": "cross_field", "message": "%s 普攻 cooldown_beats ≠ 0(禁配——池恒非空的结构前提): %d" % [sid, cd]})
if row.has("buff_ref") or row.has("buff_duration"):
errs.append({"category": "cross_field", "message": "%s 普攻不带增益字段" % sid})
if row.has("rider_mult"):
errs.append({"category": "cross_field", "message": "%s 普攻不带必中附加分量(rider_mult 仅伤害技)" % sid})
func row_by_id(skill_id: String) -> Dictionary:
for row in rows:
if row.get("skill_id", "") == skill_id:
+2 -2
View File
@@ -755,7 +755,7 @@ rows = [{
}]
; 切片调参登记 v3(2026-09-12 试玩批次 1 触发——F7 流程;C3 GDD F5 对照):
; 试玩反馈 = 基线满血全通关(模拟 80%/真人 100%)——难度严重不足,主杠杆 = atk 曲线上调(承伤侧):
; 试玩反馈 = 基线满血全冒险成功(模拟 80%/真人 100%)——难度严重不足,主杠杆 = atk 曲线上调(承伤侧):
; 4/4/6/4/7 → 7/5/9/6/9(约 +50%);HP 结构调整(D0 24→20 缩短战斗、Boss 130→150 用户拍板可上调)。
; D0 注:20 HP 会被首轮盲挖粉尘秒杀(12+9)——回 24(4 轮战斗/承伤 42%,有过程有痛感)。
; DND 命名(用户指令):goblin 地精(单拍杂鱼)→ bugbear 熊地精(三拍伏击环——DND 原型即伏击手)→
@@ -895,7 +895,7 @@ rows = [{
;
; 数值修复批·调参二(2026-10-01 新尺 MC 驱动):L1 系八行 atk 2→1(行 15/35/54/77/99/121/144/166;
; 行 234 巨蜘蛛巢群主体=L2 域维持)——新尺读数:普通档 v3.4 死因=L1 四连战无治疗夹缝(雷伤 6/8/8
; + 杂兵垫刀双压,L1 条件通关 1-2%,0/100 出第一关);完美档战役 50%(L1 93%)。刀位语义=
; + 杂兵垫刀双压,L1 条件关卡完成率 1-2%,0/100 出第一关);完美档战役 50%(L1 93%)。刀位语义=
; 「危险来自雷,不来自杂兵」:杂兵垫刀减半,雷直伤 6/8/8 维持痛感;L2/L3(atk 3 系)本刀不动。
; 全旧带读数随新尺作废重测归本批。
; 调参二补充:上述八行 atk 区间 1-3→0-2(中点恒等期望当量锚不变式——atk=1 需区间中点同步 1;0=掷点空刀,保随机手感)。
+1 -1
View File
@@ -97,7 +97,7 @@ rows = [{
}]
; 减伤墙调参批(2026-09-13,playtest-2026-09-12 报告 Q1 触发——defense_scan 实测墙轮 39%、
; 真人局 12/12 轮零承伤满血通关):defense_up magnitude -50 → -30——叠满两层 = -60 减伤帽
; 真人局 12/12 轮零承伤满血冒险成功):defense_up magnitude -50 → -30——叠满两层 = -60 减伤帽
; (原拟 pool_clamp_lo=-60 被 schema 冻结域拦截,杠杆移至本表);石肤权重 24→16 随批(reward.tres)。
; 承伤带对 C3 F4(≤20%/普通场、≤50%/Boss 场)复验责任随批;B3 GDD "-50" 文字同步随下次 B3 修订批。
; 格面资源批(2026-09-15):新增 sapped(乏力——weaken 型负向,hero_offense 池,attack_up 镜像;