feat(bounce): CastStats.bounce_add + 修饰器折叠 + 发射写弹跳冷数据 + 分支快照; modifier_bounce 词条
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
"modifier_spread_mod": { "type": 1, "display_name": "Spread", "description": "后续法术多发一颗子弹。", "element_tags": [], "meta": { "spread_add": 1, "mana_cost": 0, "shop_cost": 18 } },
|
||||
"modifier_double_cast": { "type": 1, "display_name": "Double Cast", "description": "本次施法额外执行 1 个 ACTION。", "element_tags": [], "meta": { "multicast": 1, "mana_cost": 2, "shop_cost": 25 } },
|
||||
"modifier_pierce_plus": { "type": 1, "display_name": "Pierce +2", "description": "后续法术穿透 +2。", "element_tags": [], "meta": { "pierce": 2, "mana_cost": 8, "shop_cost": 18 } },
|
||||
"modifier_bounce": { "type": 1, "display_name": "Bounce +2", "description": "后续法术弹跳 +2(命中后弹向最近未命中敌人,伤害递减)。", "element_tags": [], "meta": { "bounce": 2, "mana_cost": 8, "shop_cost": 18 } },
|
||||
"modifier_heavy_cost": { "type": 1, "display_name": "Blood Sacrifice", "description": "鲜血献祭:伤害+50,但每次施法扣 10 HP。", "element_tags": [], "meta": { "damage_add": 50.0, "heavy_cost": 10, "mana_cost": 0, "shop_cost": 26 } },
|
||||
"modifier_mana_leech": { "type": 1, "display_name": "Mana Leech", "description": "魔力虹吸:击杀回复 2 魔力(放入卡组即生效)。", "element_tags": [], "meta": { "mana_leech": 2, "mana_cost": 0, "shop_cost": 22 } },
|
||||
"trigger_on_hit": { "type": 2, "display_name": "Trigger: On Hit","description": "命中时在命中点执行后续法术(子母弹)。", "element_tags": [], "meta": { "base_damage": 3.0, "speed": 250.0, "lifetime": 4.0, "radius": 6.0, "damage_type": 0, "mana_cost": 10, "shop_cost": 30 } },
|
||||
|
||||
@@ -12,6 +12,7 @@ var speed_mult: float = 1.0 # 弹速倍率
|
||||
var radius_mult: float = 1.0 # 弹体半径倍率
|
||||
var crit_chance: float = 0.0 # 暴击概率
|
||||
var pierce_add: int = 0 # MODIFIER 累加的穿透次数(叠加到 ACTION 自带 pierce)
|
||||
var bounce_add: int = 0 # MODIFIER 累加的弹跳次数(叠加到 ACTION 自带 bounce)
|
||||
|
||||
func reset() -> void:
|
||||
damage_add = 0.0
|
||||
@@ -23,3 +24,4 @@ func reset() -> void:
|
||||
radius_mult = 1.0
|
||||
crit_chance = 0.0
|
||||
pierce_add = 0
|
||||
bounce_add = 0
|
||||
|
||||
@@ -430,6 +430,12 @@ func _push_projectile(node: SpellNode, ctx: SpellContext, spawn_pos: Vector2, tr
|
||||
var cold: Dictionary = {}
|
||||
if pierce > 0:
|
||||
cold["pierce_remaining"] = pierce
|
||||
var bounce: int = int(meta.get("bounce", 0)) + ctx.stats.bounce_add
|
||||
if bounce > 0:
|
||||
cold["bounce_remaining"] = bounce
|
||||
cold["visited_targets"] = []
|
||||
cold["bounce_decay"] = float(meta.get("bounce_decay", 0.9))
|
||||
cold["bounce_range"] = float(meta.get("bounce_range", 250.0))
|
||||
# S3: 将 trigger_depth 写入冷数据供子弹命中时使用
|
||||
if trigger_depth >= 0:
|
||||
cold["trigger_depth"] = trigger_depth
|
||||
@@ -523,6 +529,8 @@ func _apply_modifier(node: SpellNode, ctx: SpellContext) -> void:
|
||||
ctx.stats.multicast_count += int(meta["multicast"])
|
||||
if meta.has("pierce"):
|
||||
ctx.stats.pierce_add += int(meta["pierce"])
|
||||
if meta.has("bounce"):
|
||||
ctx.stats.bounce_add += int(meta["bounce"])
|
||||
if meta.has("heavy_cost"):
|
||||
ctx.hp_cost_accum += float(meta["heavy_cost"])
|
||||
|
||||
@@ -604,7 +612,7 @@ func _run_branch_payload(payload_id: int, ctx: SpellContext, spawn_pos: Vector2,
|
||||
var nodes: Array = SubPayloadRegistry.get_nodes(payload_id)
|
||||
if nodes.is_empty():
|
||||
return
|
||||
# 快照分支前 CastStats(8 字段,无分配),分支结束后还原 → 分支局部 MODIFIER 不外泄
|
||||
# 快照分支前 CastStats(9 字段,无分配),分支结束后还原 → 分支局部 MODIFIER 不外泄
|
||||
var s: CastStats = ctx.stats
|
||||
var b_dadd: float = s.damage_add
|
||||
var b_dmul: float = s.damage_mult
|
||||
@@ -614,6 +622,7 @@ func _run_branch_payload(payload_id: int, ctx: SpellContext, spawn_pos: Vector2,
|
||||
var b_spd: float = s.speed_mult
|
||||
var b_rad: float = s.radius_mult
|
||||
var b_crit: float = s.crit_chance
|
||||
var b_bnc: int = s.bounce_add
|
||||
for node in nodes:
|
||||
var node_cost: float = float(node.meta.get("mana_cost", 0.0))
|
||||
if not _charge_mana(node_cost, ctx, infinite, heat_mult):
|
||||
@@ -640,6 +649,7 @@ func _run_branch_payload(payload_id: int, ctx: SpellContext, spawn_pos: Vector2,
|
||||
s.speed_mult = b_spd
|
||||
s.radius_mult = b_rad
|
||||
s.crit_chance = b_crit
|
||||
s.bounce_add = b_bnc
|
||||
|
||||
func _get_aim_direction(from_pos: Vector2) -> Vector2:
|
||||
var target: Vector2 = EnemyManager.get_nearest_pos(from_pos, 9999.0)
|
||||
|
||||
Reference in New Issue
Block a user