卡①T7(核心数据面结构收敛批): config_db归位+域容器——三容器建件(ConfigDomainCombat 7表/Run 7表/Crossrun 5表,类型化纯持有)/config_db瘦身44→8公开(push_diag/is_fatal/reset_diagnostics/diagnostics/diagnostics_count/load_tables/set_reload_gate/reload)+类变量9(容器3+is_ready+诊断/resolver/validator/reload_gate/fatal_flag)/溶解16+迁移14+委托3访问器归位表类(shop_table 7方法/meta_table 2/forge_table 3[route_rows避routes属性]/variation_table 2/level_table level_count)+resolver装配段注入三表(board_gen.resolve_row/enemy.resolve_rowset/difficulty.resolve_modifiers委托,resolver文件零搬移)/删2(meta_conversion_row/forge_weapon_route_by_type生产零消费)/私1(validate_skill_pool_links→_);全域改址86文件(组①db.<表>→db.<容器>.<表>组②33访问器归位新名+删2消费面直扫同判据+桩件三处适配FakeDB/_BoardRowStub嵌套holder+treasure_items has_method改crossrun探测);首跑清扫漏表名bug已整树回滚重跑修正;gdstyle 168→92键NEW=0;[测试动作移交用户:套件停跑]
This commit is contained in:
1 parent
ced64d9cb3
commit
a9a163f924
97 files changed
+1015
-1072
No files matched your search
@@ -108,3 +108,11 @@ func _validate_shave_params(row: Dictionary) -> Array[Dictionary]:
|
||||
if r0_cap > (w * h) / 2:
|
||||
errs.append({"category": "cross_field", "message": "(%d,%d) r0_max_cap 超板格数一半 %d: %d" % [L, D, (w * h) / 2, r0_cap]})
|
||||
return errs
|
||||
|
||||
|
||||
var _resolver # R1 解析协作件(ConfigDB load_tables 装配段注入——resolver 文件与键零搬移)
|
||||
|
||||
|
||||
## 进度行解析委托(消费面 db.combat.board_gen.resolve_row——R1 ceil/clamp 语义归 ConfigDbResolver)
|
||||
func resolve_row(L: int, D: int) -> Dictionary:
|
||||
return _resolver.combat.board_gen.resolve_row(L, D)
|
||||
@@ -28,3 +28,11 @@ func validate() -> Array:
|
||||
if v < MULT_MIN or v > MULT_MAX:
|
||||
errs.append({"category": "mult_oor_warning", "message": "%s (%s) 越域 [0.1,10] 使用时 clamp: %f" % [key, k, v]})
|
||||
return errs
|
||||
|
||||
|
||||
var _resolver # R1 解析协作件(ConfigDB load_tables 装配段注入——resolver 文件与键零搬移)
|
||||
|
||||
|
||||
## 难度修饰解析委托(消费面 db.run.difficulty.resolve_modifiers——clamp 语义归 ConfigDbResolver)
|
||||
func resolve_modifiers(L: int, D: int) -> Dictionary:
|
||||
return _resolver.run.difficulty.resolve_modifiers(L, D)
|
||||
@@ -207,3 +207,11 @@ static func band_of(band_keys: Array, D: int) -> int:
|
||||
# 进度键解析单点收口(全仓统走
|
||||
# ConfigDbResolver.resolve_enemy_rowset 带寻址行集数组:D 维经本表 band_of 落带(偏难一侧),
|
||||
# 禁双算法并存〔状态记录 312〕;L 维 ceil/clamp 与越顶 clamp 语义归 resolver)。
|
||||
|
||||
|
||||
var _resolver # R1 解析协作件(ConfigDB load_tables 装配段注入——resolver 文件与键零搬移)
|
||||
|
||||
|
||||
## 带寻址行集解析委托(消费面 db.combat.enemy.resolve_rowset——D 维 band_of 落带语义归 ConfigDbResolver)
|
||||
func resolve_rowset(L: int, D: int, row_kind: String) -> Array[Dictionary]:
|
||||
return _resolver.combat.enemy.resolve_rowset(L, D, row_kind)
|
||||
@@ -158,3 +158,27 @@ func _validate_initial_coverage(initial_ids: Dictionary) -> Array[Dictionary]:
|
||||
if String(row.get("kind", "")) == "armor" and String(row.get("type_axis", "")) != default_armor_type:
|
||||
errs.append({"category": "cross_field", "message": "default_armor_type 须=初始甲路线类型轴(裸体态轻甲): %s vs %s" % [default_armor_type, String(row.get("type_axis", ""))]})
|
||||
return errs
|
||||
|
||||
|
||||
# ---- 行族访问器(自 ConfigDB 归位;消费面 db.crossrun.forge.<m> 直连)——
|
||||
# routes 属性在册故行族读取命名 route_rows(避开成员名冲突)----
|
||||
|
||||
## 六路线行族(副本——调用方禁改)
|
||||
func route_rows() -> Array:
|
||||
return routes.duplicate()
|
||||
|
||||
|
||||
## 路线行单点(键 route_id;缺行=空字典)
|
||||
func route(route_id: String) -> Dictionary:
|
||||
for row in routes:
|
||||
if String(row.get("route_id", "")) == route_id:
|
||||
return row
|
||||
return {}
|
||||
|
||||
|
||||
## 按类型轴反查护甲路线(armor_type → 路线行——入战 AC 三层之「甲型基础 AC」取数口)
|
||||
func armor_route_by_type(armor_type: String) -> Dictionary:
|
||||
for row in routes:
|
||||
if String(row.get("kind", "")) == "armor" and String(row.get("type_axis", "")) == armor_type:
|
||||
return row
|
||||
return {}
|
||||
@@ -1,5 +1,5 @@
|
||||
## 关卡节点图参数档 schema(节点图生成器核心批 卡① T1):五旋钮+战斗保底+岔口去路数的行式数据表。
|
||||
## 键 = level_index(关卡行集单点),消费面经 ConfigDB.level_gen_params_row() 读取;生成器只吃参数档、不认关卡号(契约 6)。
|
||||
## 键 = level_index(关卡行集单点),消费面经 ConfigDB.run.level_gen_params.row_by_level_index() 读取;生成器只吃参数档、不认关卡号(契约 6)。
|
||||
## 数值全 provisional(定值批落终值);域校验沿关卡节点图生成.md v1.1 调参表已锁条款——层深 L1≥6 递增增幅变大、
|
||||
## 配比四类合计 1、出口 L1 恒 1/L2-L3 1-3、岔口去路数恒 2/3、战斗保底≥0。
|
||||
class_name LevelGenParams
|
||||
|
||||
@@ -170,3 +170,8 @@ static func _mark_backward(target: int, outs: Dictionary, seen: Dictionary) -> v
|
||||
if (outs[nid] as Array).has(cur) and not seen.has(int(nid)):
|
||||
seen[int(nid)] = true
|
||||
queue.append(int(nid))
|
||||
|
||||
|
||||
## 序列总关数(AdventureRunner levels_total / MetaProgression 关卡完成累加域的取数口径)
|
||||
func level_count() -> int:
|
||||
return rows.size()
|
||||
@@ -90,3 +90,21 @@ func _validate_attune_refresh() -> Array[Dictionary]:
|
||||
errs.append({"category": "structural", "message": "attune_refresh_upgrade level 不连续(须从 1 连续递增): 位 %d = %d" % [i + 1, al_at]})
|
||||
break
|
||||
return errs
|
||||
|
||||
|
||||
# ---- 行族访问器(自 ConfigDB 归位——行集解析单点;消费面 db.crossrun.meta.<m> 直连)----
|
||||
|
||||
## Boss 钥石两档行单点(键 level_index;缺行=空字典)
|
||||
func boss_keystone_row(level_index: int) -> Dictionary:
|
||||
for row in boss_keystone:
|
||||
if int(row.get("level_index", -1)) == level_index:
|
||||
return row
|
||||
return {}
|
||||
|
||||
|
||||
## Y 刷新升级行单点(键 = 等级,缺行返回空字典=未购/已满级合法态)
|
||||
func attune_refresh_row(level: int) -> Dictionary:
|
||||
for row in attune_refresh_upgrade:
|
||||
if int(row.get("level", -1)) == level:
|
||||
return row
|
||||
return {}
|
||||
@@ -133,3 +133,55 @@ func _validate_price_factors(errs: Array[Dictionary]) -> void:
|
||||
errs.append({"category": "domain", "message": "relic_base_price 越域 [1.0,99.0]: %f" % relic_base_price})
|
||||
if spend_discount <= 0.0 or spend_discount > 1.0:
|
||||
errs.append({"category": "domain", "message": "spend_discount 越域 (0.0,1.0]: %f" % spend_discount})
|
||||
|
||||
|
||||
# ---- 行族访问器(自 ConfigDB 归位——行集解析单点;消费面 db.run.shop.<m> 直连)----
|
||||
|
||||
## GP 掉落行单点(键 tier;缺行=空字典——掉落按 0 兑付的兜底在调用方)
|
||||
func gp_drop_row(tier: String) -> Dictionary:
|
||||
for row in gp_drops:
|
||||
if String(row.get("tier", "")) == tier:
|
||||
return row
|
||||
return {}
|
||||
|
||||
|
||||
## 关卡 GP 加成单点(键 level_index;缺行=0)
|
||||
func level_gp_bonus_at(level_index: int) -> int:
|
||||
for row in level_gp_bonus:
|
||||
if int(row.get("level_index", -1)) == level_index:
|
||||
return int(row.get("bonus", 0))
|
||||
return 0
|
||||
|
||||
|
||||
## 价格关卡加成单点(键 level_index;缺行=0)
|
||||
func price_level_bonus_at(level_index: int) -> int:
|
||||
for row in price_level_bonus:
|
||||
if int(row.get("level_index", -1)) == level_index:
|
||||
return int(row.get("bonus", 0))
|
||||
return 0
|
||||
|
||||
|
||||
## 商品行族({product_id, display_name, attr, flat_value, base_price, price_increment})
|
||||
func product_rows() -> Array:
|
||||
return products
|
||||
|
||||
|
||||
## 商品行单点(键 product_id;缺行=空字典)
|
||||
func product_row(product_id: String) -> Dictionary:
|
||||
for row in products:
|
||||
if String(row.get("product_id", "")) == product_id:
|
||||
return row
|
||||
return {}
|
||||
|
||||
|
||||
## 货架行族({kind_id, display_name, base_price}——行序即抽签/呈现稳定序)
|
||||
func pool_rows() -> Array:
|
||||
return pool_shelf
|
||||
|
||||
|
||||
## 货架行单点(键 kind_id;缺行=空字典)
|
||||
func pool_row(kind_id: String) -> Dictionary:
|
||||
for row in pool_shelf:
|
||||
if String(row.get("kind_id", "")) == kind_id:
|
||||
return row
|
||||
return {}
|
||||
@@ -110,3 +110,38 @@ func row_by_id(variant_id: String) -> Dictionary:
|
||||
if row.get("variant_id", "") == variant_id:
|
||||
return row
|
||||
return {}
|
||||
|
||||
|
||||
# ---- 候选池访问器(自 ConfigDB 归位;消费面 db.combat.variation.<m> 直连)----
|
||||
# 门控第三维 = 节点身份(全局作用域变异):scope=global 行仅 boss/elite 节点入池,
|
||||
# 其余节点(battle 等)静默跳过——门控兜底 P0 口径(零报错零警告);elite 系前向词位(首发零表行)。
|
||||
# node_type 缺省 "" = 旧双参调用口径(global 行跳过)——既有测试/冒烟调用零扰动。
|
||||
|
||||
## 候选池门控(∅ board_types = 通配;字段名对齐 board_type 词表,无 biome_tags)
|
||||
func variant_pool(level_index: int, board_type: String, node_type: String = "") -> Array:
|
||||
var pool: Array[Dictionary] = []
|
||||
for row in rows:
|
||||
if String(row.get("scope", "region")) == "global" \
|
||||
and node_type != "boss" and node_type != "elite":
|
||||
continue
|
||||
if int(row.get("unlock_level", 999)) > level_index:
|
||||
continue
|
||||
var tags: Array[Variant] = row.get("board_types", [])
|
||||
if tags.is_empty():
|
||||
pool.append(row)
|
||||
continue
|
||||
if tags.has(board_type):
|
||||
pool.append(row)
|
||||
return pool
|
||||
|
||||
|
||||
## 全局型单行决议(战斗编排装板期消费——访问器纪律:消费面禁直扫表):
|
||||
## boss/elite 节点取候选池内首个 scope=global 行(首发批全局池恒恰一行;多行为配置越界态,
|
||||
## 按表序取首行确定性兜底);空 = 无全局型(调用方回落 region 布置——兜底回落合法态)
|
||||
func global_variant_row(level_index: int, board_type: String, node_type: String) -> Dictionary:
|
||||
if node_type != "boss" and node_type != "elite":
|
||||
return {}
|
||||
for row in variant_pool(level_index, board_type, node_type):
|
||||
if String(row.get("scope", "region")) == "global":
|
||||
return row
|
||||
return {}
|
||||
Reference in new issue
Block a user