奇物批T3+T4:relic_*→feat_*词族全换(feat_table.gd/feats.tres/feats_engine.gd三文件改名+.uid+feat_flags/feat_id/feat_row等全token+config_db注册键feats两端+entities.yaml换代注记——kind值relic/身份前缀relic:/relics存档键/摘要键按数据契约保留);T4渠道白名单过滤(_draw_curio_candidates(channel):通关渠道只出专长/节点渠道零专长——过滤式不拆池,TIER_QUOTAS锚零改动,devour货架保底随渠道定位退役,迁移保feat_id,pick_curio测试feat_id透传;冒烟773/0+run_all 16全绿+断点往返PASS)
This commit is contained in:
1 parent
8e2694de49
commit
6812ebbb73
24 files changed
+385
-384
No files matched your search
@@ -60,10 +60,10 @@ var _outcomes := {} # ticket_id → "redeemed"/"zero"/"voided"(
|
||||
var _seq := 0 # 流水号
|
||||
var _halted := false # 主角倒下终止旗(死亡事件置位——flush 余单作废)
|
||||
var _hero_ac_override := -1 # 主角护甲等级合流入参(begin_battle 显式设定——-1 = 表值兜底,口径同战斗编排器)
|
||||
# 特性求值旗(迭代 12 T2——begin_battle 编排器经 RelicsEngine 求值后注入;空字典=零扰动。
|
||||
# 特性求值旗(迭代 12 T2——begin_battle 编排器经 FeatsEngine 求值后注入;空字典=零扰动。
|
||||
# rider_flat=英雄侧必中附加值〔奥术余烬族〕/rider_crit=档二 rider 可暴击/first_dig_spell=每战首次
|
||||
# 开安全格追加魔法矢〔消费在编排器授予段〕/clamp_magic_light·clamp_magic_heavy=克制点直调)
|
||||
var relic_flags: Dictionary = {}
|
||||
var feat_flags: Dictionary = {}
|
||||
|
||||
|
||||
func _init(db_ref, rng_ref, units_ref, effects_ref) -> void:
|
||||
@@ -200,40 +200,40 @@ func _resolve_hero_attack(t: Dictionary) -> void:
|
||||
var threshold: int = defender_ac(target) + int(db.settlement.attack_bonus)
|
||||
# 矿工重锤·命中交换(迭代 12 T4 普攻流——正负双修原生形态:命中判定减成 trade_hit 点
|
||||
# 〔更易命中〕换攻击增伤 trade_atk%——高 AC 负期望/低 AC 正期望)
|
||||
var trade_hit := int(relic_flags.get("hit_trade_hit", 0))
|
||||
var trade_hit := int(feat_flags.get("hit_trade_hit", 0))
|
||||
if trade_hit > 0:
|
||||
threshold = maxi(1, threshold - trade_hit)
|
||||
var crit: bool = bool(roll_read.crit)
|
||||
var discount: int = _roll_discount(int(roll_read.roll), threshold)
|
||||
# 专注(迭代 12 T4 普攻流——免掷骰恒定折扣:方差买断成期望——稳定器人格;roll 记 0 归因)
|
||||
var rewrite := int(relic_flags.get("armor_roll_rewrite", 0))
|
||||
var rewrite := int(feat_flags.get("armor_roll_rewrite", 0))
|
||||
if rewrite > 0:
|
||||
discount = rewrite
|
||||
crit = false
|
||||
roll_read["roll"] = 0
|
||||
# 厚积薄发满层必中(迭代 12 T5 蓄力流——spike ready 时 discount 恒全额、暴击面走倍乘不加掷)
|
||||
if int(relic_flags.get("spike_mult", 0)) > 0 and int(relic_flags.get("charge_layers", 0)) >= 3:
|
||||
if int(feat_flags.get("spike_mult", 0)) > 0 and int(feat_flags.get("charge_layers", 0)) >= 3:
|
||||
discount = 100
|
||||
# 猎弱本能(迭代 12 T4 穿刺流——对轻甲敌折扣档改善 value 档:对冲 pierce 列 L1 −1 开局罚;
|
||||
# 改善 = 折扣表向全额方向移档,nat 最大面/已全额不重复)
|
||||
var shift := int(relic_flags.get("discount_shift", 0))
|
||||
var shift := int(feat_flags.get("discount_shift", 0))
|
||||
if shift > 0 and armor == "light" and discount < 100:
|
||||
discount = _discount_shift_up(discount, shift)
|
||||
var cdelta: int = _counter_delta(atk_type, armor) + _relic_clamp_bonus(atk_type, armor)
|
||||
var cdelta: int = _counter_delta(atk_type, armor) + _feat_clamp_bonus(atk_type, armor)
|
||||
# 淬毒刃纹(迭代 11 同调批 T5——底稿 §3:对被克制敌人的穿刺/魔法直伤 +N;条件 = 克制成立 ×
|
||||
# 攻击类型限定,主角攻击面专属——棋盘克制直伤走 _resolve_board_typed 不吃本加成)
|
||||
if attune_venom > 0 and (atk_type == "pierce" or atk_type == "magic") and cdelta > 0:
|
||||
cdelta += attune_venom
|
||||
var base_value := float(t.base_value)
|
||||
var trade_atk := int(relic_flags.get("hit_trade_atk", 0))
|
||||
var trade_atk := int(feat_flags.get("hit_trade_atk", 0))
|
||||
if trade_atk > 0:
|
||||
base_value *= 1.0 + float(trade_atk) / 100.0 # 重锤增伤面(交换的正向侧)
|
||||
# 蓄力流(迭代 12 T5):整备军备「每层下轮首段 +1」(层数×value 加算)+厚积薄发满层(≥3)
|
||||
# spike 倍乘+强制必中(discount 100/crit 关闭掷骰面——方差买断的爆发出口)
|
||||
var charge_layers := int(relic_flags.get("charge_layers", 0))
|
||||
var charge_layers := int(feat_flags.get("charge_layers", 0))
|
||||
if charge_layers > 0:
|
||||
base_value += float(charge_layers * int(relic_flags.get("ap_carry_value", 0)))
|
||||
var spike_mult := int(relic_flags.get("spike_mult", 0))
|
||||
base_value += float(charge_layers * int(feat_flags.get("ap_carry_value", 0)))
|
||||
var spike_mult := int(feat_flags.get("spike_mult", 0))
|
||||
var spike_ready := spike_mult > 0 and charge_layers >= 3
|
||||
if spike_ready:
|
||||
base_value *= float(spike_mult)
|
||||
@@ -250,22 +250,22 @@ func _resolve_hero_attack(t: Dictionary) -> void:
|
||||
# 英雄侧 rider(迭代 12 T2 魔法流——enemy_skill rider 对称位补齐):后置必中附加,独立于掷点
|
||||
# 与乘区(奥术余烬「普攻命中后恒定结算」语义);档二(magic 4 件)rider 可暴击=当次 crit 时
|
||||
# rider 值乘暴击倍率。rider 不改变下限语义(landed 含 rider 后不再过 floor)。
|
||||
var hero_rider := int(relic_flags.get("rider_flat", 0))
|
||||
var hero_rider := int(feat_flags.get("rider_flat", 0))
|
||||
# 猎巢人(迭代 12 T3 标旗流——巢穴控制数转伤害光环):控制数 = 敌方 weaken(削弱)实例数
|
||||
# 〔八型批 side-wide 状态行——标中旗控制巢穴的既有承载;原设计「对其中敌伤害」简化为全体
|
||||
# 先手攻击附加值——台账披露待追认〕,每控制 1 巢 rider +Z。
|
||||
var nest_aura := int(relic_flags.get("nest_aura_value", 0))
|
||||
var nest_aura := int(feat_flags.get("nest_aura_value", 0))
|
||||
if nest_aura > 0:
|
||||
for eff in effects.query_active("enemy"):
|
||||
if String(eff.effect_id) == "weaken":
|
||||
hero_rider += nest_aura
|
||||
# 矿工的执拗(迭代 12 T4 普攻流——「排雷排得多好,打得就有多疼」):本轮安全开格 streak
|
||||
# 〔编排器授予段实时写入 relic_flags.dig_streak;踩雷清零〕×value,上限 cap。
|
||||
var rdig := int(relic_flags.get("round_dig_value", 0))
|
||||
# 〔编排器授予段实时写入 feat_flags.dig_streak;踩雷清零〕×value,上限 cap。
|
||||
var rdig := int(feat_flags.get("round_dig_value", 0))
|
||||
if rdig > 0:
|
||||
hero_rider += mini(int(relic_flags.get("round_dig_cap", 5)), int(relic_flags.get("dig_streak", 0)) * rdig)
|
||||
hero_rider += mini(int(feat_flags.get("round_dig_cap", 5)), int(feat_flags.get("dig_streak", 0)) * rdig)
|
||||
if hero_rider > 0:
|
||||
if crit and bool(relic_flags.get("rider_crit", false)):
|
||||
if crit and bool(feat_flags.get("rider_crit", false)):
|
||||
hero_rider = int(round(float(hero_rider) * float(db.settlement.crit_multiplier)))
|
||||
landed += hero_rider
|
||||
payload["hero_rider"] = hero_rider
|
||||
@@ -273,9 +273,9 @@ func _resolve_hero_attack(t: Dictionary) -> void:
|
||||
payload["killed"] = not target.alive # 击杀标记在扣血后取(原语义不变)
|
||||
# 碎甲震击(迭代 12 T4 普攻流——命中重甲附加「护甲裂解」):复用 off_guard(enemy percent
|
||||
# +25 受伤加深——零新状态行);apply_effect 域闭/重复授予由状态容器自行守卫。
|
||||
var crack := int(relic_flags.get("crack_value", 0))
|
||||
var crack := int(feat_flags.get("crack_value", 0))
|
||||
if crack > 0 and armor == "heavy":
|
||||
effects.apply_effect("off_guard", {"source_class": "relic_armor_crack"}, -1)
|
||||
effects.apply_effect("off_guard", {"source_class": "feat_armor_crack"}, -1)
|
||||
payload["cracked"] = true
|
||||
var label := _attack_label(String(t.display), crit, discount)
|
||||
if hero_rider > 0:
|
||||
@@ -284,10 +284,10 @@ func _resolve_hero_attack(t: Dictionary) -> void:
|
||||
# 贯穿射击(迭代 12 T4 穿刺流——击杀溢出弹射):击杀时对下一存活敌以穿刺类型弹射
|
||||
# 本体半额〔原设计「溢出伤害」追踪在单分量模型不可行——半额弹射 provisional 裁定披露待追认;
|
||||
# 无次敌=弹射落空〕。B 模式入队段尾 flush 兑现;A 模式递归 resolve(目标存活守卫内建)。
|
||||
if bool(payload.get("killed", false)) and int(relic_flags.get("kill_overflow", 0)) > 0:
|
||||
if bool(payload.get("killed", false)) and int(feat_flags.get("kill_overflow", 0)) > 0:
|
||||
var next_target = units.default_target()
|
||||
if next_target != null:
|
||||
var of_t := open_ticket(DamageController.KIND_BOARD_TYPED, "relic_pierce_shot",
|
||||
var of_t := open_ticket(DamageController.KIND_BOARD_TYPED, "feat_pierce_shot",
|
||||
"贯穿射击", "board", maxi(int(db.settlement.damage_floor), int(landed / 2)),
|
||||
DamageController.TARGET_FRONT_ALIVE, int(t.round_index), t.origin_cell, "pierce")
|
||||
if policy == POLICY_SEGMENT:
|
||||
@@ -309,9 +309,9 @@ func _resolve_enemy_skill(t: Dictionary) -> void:
|
||||
var pooled: int = DamageMath.pool_damage(rolled, clamped_pool("hero_defense"), clamped_pool("enemy_output"))
|
||||
var total: int = maxi(int(db.settlement.damage_floor), pooled) + int(t.rider) # rider 后置于伤害下限——独立必中加项,不进乘区
|
||||
# 铁壁整备(迭代 12 T5 蓄力流——每层下轮开场 S 点减伤;减后过下限保底)
|
||||
var shield := int(relic_flags.get("shield_per_layer", 0)) * int(relic_flags.get("charge_layers", 0))
|
||||
var shield := int(feat_flags.get("shield_per_layer", 0)) * int(feat_flags.get("charge_layers", 0))
|
||||
# 稳健拓荒(迭代 12 T10——Fork posture B 侧 rule 键:受击减 1;两侧对称弱值=「不同强非强弱」)
|
||||
if int(relic_flags.get("bulwark", 0)) > 0:
|
||||
if int(feat_flags.get("bulwark", 0)) > 0:
|
||||
shield += 1
|
||||
if shield > 0:
|
||||
total = maxi(int(db.settlement.damage_floor), total - shield)
|
||||
@@ -337,7 +337,7 @@ func _resolve_board_typed(t: Dictionary) -> void:
|
||||
_ineffective_row(t, "无存活敌人")
|
||||
_outcomes[int(t.ticket_id)] = "zero"
|
||||
return
|
||||
var delta: int = _counter_delta(String(t.attack_type), String(target.get("armor_type", "light"))) + _relic_clamp_bonus(String(t.attack_type), String(target.get("armor_type", "light")))
|
||||
var delta: int = _counter_delta(String(t.attack_type), String(target.get("armor_type", "light"))) + _feat_clamp_bonus(String(t.attack_type), String(target.get("armor_type", "light")))
|
||||
var dealt: int = DamageMath.counter_component(int(t.base_value), delta, int(db.settlement.damage_floor))
|
||||
units.apply_damage(target, dealt)
|
||||
emit_row_cb.call("damage", String(t.source_class), t.origin_cell, int(t.round_index), "%s → %s" % [String(t.display), String(target.display_name)], dealt,
|
||||
@@ -422,16 +422,16 @@ func _counter_delta(attack_type: String, armor: String) -> int:
|
||||
# 空旗=0 零扰动):魔网织者=magic vs magic(矩阵罚 −1 → 0/正);湛蓝誓约=magic vs heavy(+1 → +2);
|
||||
# 猎手刺剑=pierce vs light(+1——对轻甲敌穿刺提升,对重甲无增益=正负双修)。hero_attack 与
|
||||
# board_typed 两消费面同享。
|
||||
func _relic_clamp_bonus(attack_type: String, armor: String) -> int:
|
||||
func _feat_clamp_bonus(attack_type: String, armor: String) -> int:
|
||||
var bonus := 0
|
||||
if attack_type == "magic":
|
||||
if armor == "magic":
|
||||
bonus += int(relic_flags.get("clamp_magic_magic", 0))
|
||||
bonus += int(feat_flags.get("clamp_magic_magic", 0))
|
||||
elif armor == "heavy":
|
||||
bonus += int(relic_flags.get("clamp_magic_heavy", 0))
|
||||
bonus += int(feat_flags.get("clamp_magic_heavy", 0))
|
||||
elif attack_type == "pierce":
|
||||
if armor == "light":
|
||||
bonus += int(relic_flags.get("clamp_pierce_light", 0))
|
||||
bonus += int(feat_flags.get("clamp_pierce_light", 0))
|
||||
return bonus
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user