T6吞噬流+地形转化+商店保底(迭代12——整合定稿S7/B4):relics.tres填4行(地脉采撷common·受地形伤资源补偿——伤害仍发生/荆棘编织者rare·挖开伤害型格双产出/净化工兵rare·标中旗中和相邻伤害型格——🔴R4甲仅限伤害型过滤=variation effect=flat_damage判据信息型永不清除/熔火之躯rarest锚点·受地形伤积层轮末反打——触发键通用不按种类特化);BoardData.clear_variants中和口;orchestrator地形伤兑付点四面(refund/double/counter/轮末blast反打后清零——行格=英雄格修(-1,-1)越界);商店保底=货架零流派件时挤掉最后一张普通卡换devour件(占位制货架恒≤3——首版追加4卡断言红返工;按关变异精细绑定归数值批披露)+relic卡定价15固定锚公式同构+投影display/value走relic行;冒烟断言适配relic卡合法态(词表放行+价格分叉)表换代27件→696/0三闸+run_all全绿——批次一铺量27件收官

This commit is contained in:
DKChan committed 2026-10-04 02:12:04 +08:00
1 parent e216232e05
commit bfbb473375
5 files changed
+149 -11

No files matched your search

+49
View File
@@ -77,6 +77,7 @@ var _attune_safe_seen := 0 # 掘进蓄能 battle 域安全开格
var _relic_first_dig_used := false
var _relic_combo := 0 # 矿脉直觉连击计数(battle 域——safe +1/mine 清零)
var _relic_deep_dug := 0 # 深挖钻头深层产出计数(battle 域——每 cap 格额外 grant 一份)
var _relic_magma_layers := 0 # 熔火之躯积层(battle 域——受地形伤 +1,轮末反打清零)
func _attune_has(item_id: String) -> bool:
@@ -158,6 +159,14 @@ func _relic_flags_for(relic_ids: Array) -> void:
flags["shield_per_layer"] = int(fx.get("shield_per_layer", 0))
"charge_spike":
flags["spike_mult"] = int(fx.get("value", 0))
"terrain_refund":
flags["terrain_refund"] = int(fx.get("value", 0))
"terrain_dig_double":
flags["terrain_dig_double"] = int(fx.get("value", 0))
"flag_neutralize":
flags["flag_neutralize"] = int(fx.get("value", 0))
"variant_counter":
flags["variant_counter_value"] = int(fx.get("value", 0))
var mt := int(tiers.get("magic", 0))
if mt >= 1:
flags["rider_flat"] = int(flags.get("rider_flat", 0)) + 1 # 档一质变(≥2 件):rider +1(provisional)
@@ -243,6 +252,7 @@ func begin_battle(enc: Dictionary) -> bool:
_relic_first_dig_used = false
_relic_combo = 0
_relic_deep_dug = 0
_relic_magma_layers = 0
# 迭代 10 奖励重构批——跨冒险行动点加成轴(统一冒险加算区第四轴):经排队修正通道兑现
# 「每场战斗开始首轮 AP +加成值」(queue_ap_delta = 下轮开轮基线加算、notify_round_start 兑现后
# 清零——首轮即消费,后续轮次不重复兑现;语义锚 = 行动经济 GDD「跨冒险行动点加成轴」节)
@@ -465,6 +475,20 @@ func _settle() -> void:
var vt := _damage.open_ticket(DamageController.KIND_BOARD_FLAT_HERO, "地形变异", String(vrow.get("display_name", vid)), "board", \
int(vrow.get("effect_value", 0)), DamageController.TARGET_HERO, ri, evt.cell, "", 0, "", {"variant_id": String(vid)})
_damage.submit(vt)
# 吞噬流四面(迭代 12 T6——地形从纯税到第三资源带;伤害仍发生=乙稿判据 3 承载):
# ①荆棘编织者=挖开伤害型地形格额外掉落一次格面资源(主动吃地形换资源)
if int(_damage.relic_flags.get("terrain_dig_double", 0)) > 0:
var tw_snap = _reward_economy.grant(evt.cell)
if tw_snap is Dictionary:
_grant_routed(tw_snap, "positive", "safe_cell", evt.cell, ri, "", "(荆棘编织)")
# ②地脉采撷=受地形伤掉落小额资源补偿(薄矿化——每次受伤兑一份)
if int(_damage.relic_flags.get("terrain_refund", 0)) > 0:
var lh_snap = _reward_economy.grant(evt.cell)
if lh_snap is Dictionary:
_grant_routed(lh_snap, "positive", "safe_cell", evt.cell, ri, "", "(地脉补偿)")
# ③熔火之躯=受地形伤积层(触发键=「受地形伤」通用不按种类特化——定稿红线承载)
if int(_damage.relic_flags.get("variant_counter_value", 0)) > 0:
_relic_magma_layers += 1
for evt in _facts_flags:
_judge_flag(evt, ri)
# 战旗军规开单段(迭代 12 T3 标旗流——flag_judged 批后统一开单:轮末每面标中旗对最前存活敌
@@ -491,6 +515,15 @@ func _settle() -> void:
"战旗军规", "board", strike_value, DamageController.TARGET_FRONT_ALIVE, ri,
fevt.cell, "normal")
_damage.submit(st_t)
# 熔火之躯轮末反打(迭代 12 T6 吞噬流——受地形伤积层,轮末每层对全体敌 ~1 必中反伤;
# 触发键=「受地形伤」通用不按地形种类特化——定稿红线承载;反打后清零)
var magma := int(_damage.relic_flags.get("variant_counter_value", 0))
if magma > 0 and _relic_magma_layers > 0:
var mg_t := _damage.open_ticket(DamageController.KIND_BOARD_BLAST, "relic_magma_body",
"熔火反噬 ×%d" % _relic_magma_layers, "board", magma * _relic_magma_layers,
DamageController.TARGET_ALL_ALIVE, ri, minesweeper.hero_pos(), "", 0, "", {})
_damage.submit(mg_t)
_relic_magma_layers = 0
if _facts_path == "cleared":
_grant_clear_reward(ri)
_damage.flush() # 授予段界结账(B 模式——段内开单攒批到此统一兑现;A 模式 no-op;清图批前另有同步结账点)
@@ -729,6 +762,22 @@ func _judge_flag(evt: Dictionary, ri: int) -> void:
var fbt := _damage.open_ticket(DamageController.KIND_BOARD_BLAST, "attune_flag_burst", "标中殉爆", "board",
_attune_mag("flag_burst"), DamageController.TARGET_ALL_ALIVE, ri, cell, "", 0, "highlight", {})
_submit(fbt, false)
# 净化工兵(迭代 12 T6 吞噬流——标中旗中和相邻伤害型地形格):🔴 R4 甲永不对冲边界=
# **仅限伤害型**(thorn/magma/rockfall——variation 表 effect=flat_damage 判据),信息型
# (hide_number 族)永不清除(红线①看门税不可对冲);中和=变普通格(BoardData.clear_variants)。
if int(_damage.relic_flags.get("flag_neutralize", 0)) > 0:
var board: BoardData = minesweeper.current_board()
for n in board.neighbors8(cell):
var vids_n: Array = board.variant_ids(n)
var harmful := false
for vid_n in vids_n:
var vrow_n: Dictionary = db.variation.row_by_id(String(vid_n))
if String(vrow_n.get("effect", "")) == "flat_damage":
harmful = true
break
if harmful:
board.clear_variants(n)
_emit_row("terrain_neutralized", "relic_purge_sapper", n, ri, "净化工兵·地形中和", 0, {}, "")
# 雷区图谱(迭代 12 T3 标旗流——标中雷额外获得一份格面资源:插旗开始产出对标开格;
# 复用 grant 单点,额外兑付走同一 _grant_routed 正向路由)
if int(_damage.relic_flags.get("flag_resource_extra", 0)) > 0:
+5
View File
@@ -50,6 +50,11 @@ func variant_ids(c: Vector2i) -> Array:
return variants.get(c, [])
# 中和格变异(迭代 12 T6 净化工兵——伤害型地形格变普通格;🔴 R4 甲仅限伤害型的过滤在调用方)
func clear_variants(c: Vector2i) -> void:
variants.erase(c)
func neighbors8(c: Vector2i) -> Array:
var out: Array[Vector2i] = []
for dy in range(-1, 2):
+35 -3
View File
@@ -762,6 +762,26 @@ func _shop_draw_shelf() -> void:
_shop_shelf.append(tok)
if _shop_shelf.size() >= 3:
break
# 商店保底(迭代 12 T6——「本关变异交互件必刷」简化口径:货架零流派件时**挤掉最后一张普通卡**
# 换吞噬流件〔地形交互件广义映射——按关变异精细绑定归数值批,台账披露待追认〕;占位制货架恒
# ≤3;池内无 devour 令牌=不保底合法态)
var has_relic := false
for tok in _shop_shelf:
if String((tok as Dictionary).get("kind", "")) == "relic":
has_relic = true
break
if not has_relic and not _shop_shelf.is_empty():
for row in db.relic_rows():
if String(row.get("archetype", "")) != "devour":
continue
var rid := String(row.get("relic_id", ""))
for t in _pool_deck:
var tok2: Dictionary = t as Dictionary
if String(tok2.get("kind", "")) == "relic" and String(tok2.get("relic_id", "")) == rid:
_shop_shelf[_shop_shelf.size() - 1] = {"kind": "relic", "tier": String(tok2.get("tier", "")), "relic_id": rid}
break
if String((_shop_shelf[_shop_shelf.size() - 1] as Dictionary).get("kind", "")) == "relic":
break # 换一张即止
# 库存余量(TP0——令牌库内该 kind 剩余枚数单点读;未注入/防御读 = 0)
@@ -774,9 +794,14 @@ func pool_stock(kind: String) -> int:
# 现价 = ceil(基价 × b^(关序−1) × A^(本次进店已购次数))(P4 甲 ceil 向上单一取整——玩家不利向;
# A/b 表 knob provisional;核心现算,呈现层禁复算——契约 5)
# A/b 表 knob provisional;核心现算,呈现层禁复算——契约 5)。relic 卡(保底占位——shop 词表外)
# 基价 provisional 15 固定锚(台账披露待追认——shop.tres 词表扩列归数值批)。
func pool_price(kind: String) -> int:
var row: Dictionary = db.shop_pool_row(kind)
if row.is_empty():
if kind == "relic":
return int(ceil(15.0 * pow(db.shop_price_b(), float(maxi(0, int(level_row.level_index) - 1))) * pow(db.shop_price_a(), float(_shop_visit_buys))))
return 999999
var base := float(maxi(1, int(row.get("base_price", 1))))
var price_f: float = base * pow(db.shop_price_b(), float(maxi(0, int(level_row.level_index) - 1))) \
* pow(db.shop_price_a(), float(_shop_visit_buys))
@@ -791,11 +816,18 @@ func shop_shelf() -> Array:
var kind := String((tok as Dictionary).get("kind", ""))
var tier := String((tok as Dictionary).get("tier", ""))
var row: Dictionary = db.shop_pool_row(kind)
var display := String(row.get("display_name", kind))
var value := int(db.adventure.bonus_value(kind, tier))
if row.is_empty() and kind == "relic":
var rrow: Dictionary = db.relic_row(String(tok.get("relic_id", "")))
display = String(rrow.get("display_name", "流派件"))
value = 0
out.append({
"kind_id": kind,
"tier": tier,
"display_name": String(row.get("display_name", kind)),
"value": int(db.adventure.bonus_value(kind, tier)),
"relic_id": String(tok.get("relic_id", "")),
"display_name": display,
"value": value,
"price": pool_price(kind),
"stock_left": pool_stock(kind),
})