From 5663dedc12f8aa8c16430dce51c494857711efe8 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Thu, 30 Jul 2026 15:24:17 +0800 Subject: [PATCH] =?UTF-8?q?feat(homing):=20CastStats.homing=5Fadd=20+=20?= =?UTF-8?q?=E4=BF=AE=E9=A5=B0=E5=99=A8=E6=8A=98=E5=8F=A0=20+=20=E5=8F=91?= =?UTF-8?q?=E5=B0=84=E5=86=99=E5=BD=92=E8=88=AA=E5=86=B7=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=20+=20=E5=88=86=E6=94=AF=E5=BF=AB=E7=85=A7;=20modifier=5Fhomin?= =?UTF-8?q?g=20=E8=AF=8D=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit homing_add 为 float(角速度,弧度/秒),镜像 bounce_add 的 int 累加路径。 发射时不解析目标,homing_target_id 留 -1 由 bullet_manager 首帧惰性获取, 使 spell_evaluator 不必接触 SpatialGrid。 Co-Authored-By: Claude Opus 5 --- data/spells.json | 1 + scripts/domain/spell_system/cast_stats.gd | 2 ++ scripts/domain/spell_system/spell_evaluator.gd | 11 ++++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/data/spells.json b/data/spells.json index 7306279..448c0b7 100644 --- a/data/spells.json +++ b/data/spells.json @@ -15,6 +15,7 @@ "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_homing": { "type": 1, "display_name": "Homing", "description": "后续法术获得归航(飞行中以受限角速度转向锁定的敌人)。", "element_tags": [], "meta": { "homing": 3.0, "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 } }, diff --git a/scripts/domain/spell_system/cast_stats.gd b/scripts/domain/spell_system/cast_stats.gd index c853626..ece0db5 100644 --- a/scripts/domain/spell_system/cast_stats.gd +++ b/scripts/domain/spell_system/cast_stats.gd @@ -13,6 +13,7 @@ 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) +var homing_add: float = 0.0 # MODIFIER 累加的归航角速度(弧度/秒,叠加到 ACTION 自带 homing) func reset() -> void: damage_add = 0.0 @@ -25,3 +26,4 @@ func reset() -> void: crit_chance = 0.0 pierce_add = 0 bounce_add = 0 + homing_add = 0.0 diff --git a/scripts/domain/spell_system/spell_evaluator.gd b/scripts/domain/spell_system/spell_evaluator.gd index 6a9528a..a4fdd59 100644 --- a/scripts/domain/spell_system/spell_evaluator.gd +++ b/scripts/domain/spell_system/spell_evaluator.gd @@ -436,6 +436,11 @@ func _push_projectile(node: SpellNode, ctx: SpellContext, spawn_pos: Vector2, tr cold["visited_targets"] = [] cold["bounce_decay"] = float(meta.get("bounce_decay", 0.9)) cold["bounce_range"] = float(meta.get("bounce_range", 250.0)) + var homing: float = float(meta.get("homing", 0.0)) + ctx.stats.homing_add + if homing > 0.0: + cold["homing_strength"] = homing + cold["homing_range"] = float(meta.get("homing_range", 400.0)) + cold["homing_target_id"] = -1 # S3: 将 trigger_depth 写入冷数据供子弹命中时使用 if trigger_depth >= 0: cold["trigger_depth"] = trigger_depth @@ -531,6 +536,8 @@ func _apply_modifier(node: SpellNode, ctx: SpellContext) -> void: ctx.stats.pierce_add += int(meta["pierce"]) if meta.has("bounce"): ctx.stats.bounce_add += int(meta["bounce"]) + if meta.has("homing"): + ctx.stats.homing_add += float(meta["homing"]) if meta.has("heavy_cost"): ctx.hp_cost_accum += float(meta["heavy_cost"]) @@ -612,7 +619,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(9 字段,无分配),分支结束后还原 → 分支局部 MODIFIER 不外泄 + # 快照分支前 CastStats(10 字段,无分配),分支结束后还原 → 分支局部 MODIFIER 不外泄 var s: CastStats = ctx.stats var b_dadd: float = s.damage_add var b_dmul: float = s.damage_mult @@ -623,6 +630,7 @@ func _run_branch_payload(payload_id: int, ctx: SpellContext, spawn_pos: Vector2, var b_rad: float = s.radius_mult var b_crit: float = s.crit_chance var b_bnc: int = s.bounce_add + var b_hom: float = s.homing_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): @@ -650,6 +658,7 @@ func _run_branch_payload(payload_id: int, ctx: SpellContext, spawn_pos: Vector2, s.radius_mult = b_rad s.crit_chance = b_crit s.bounce_add = b_bnc + s.homing_add = b_hom func _get_aim_direction(from_pos: Vector2) -> Vector2: var target: Vector2 = EnemyManager.get_nearest_pos(from_pos, 9999.0)