1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-05-27 22:41:56 +08:00

feat(战斗系统): 为爆炸攻击添加内伤效果并重构内伤生成逻辑

- 在InfinitySword.gd中添加爆炸攻击时生成内伤球的功能
- 将内伤生成逻辑提取到InternalDamage.gd中的静态方法generateBall
- 移除Parrier.gd中重复的内伤生成代码,改用新的generateBall方法
- 更新Tree.tscn中的描述文本,添加对爆炸攻击产生内伤的说明
- 调整WeaponCardBase.tscn的UI布局,为描述文本添加滚动容器
This commit is contained in:
2026-05-09 20:09:58 +08:00
parent cf9568bcac
commit 9c1c739deb
5 changed files with 35 additions and 18 deletions
+8 -1
View File
@@ -183,9 +183,16 @@ text = "无灵"
label_settings = SubResource("LabelSettings_b3nsw")
horizontal_alignment = 1
[node name="description" type="RichTextLabel" parent="container" unique_id=566230682]
[node name="scroller" type="ScrollContainer" parent="container" unique_id=543588938]
custom_minimum_size = Vector2(0, 100)
layout_mode = 2
size_flags_vertical = 3
horizontal_scroll_mode = 0
[node name="description" type="RichTextLabel" parent="container/scroller" unique_id=566230682]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
bbcode_enabled = true
text = "[center]造成[color=cyan]10[/color]点伤害。[/center]"
fit_content = true
+5 -1
View File
@@ -60,6 +60,8 @@ descriptionTemplate = "进行[b]格挡[/b],化解敌人的攻击。
[color=red]无法化解伤害[/color]但产生少量击退;
对于[b]魔法或召唤[/b]攻击,
[color=red]无法化解伤害[/color]但可以少量储能;
对于[b]爆炸[/b]攻击,
[color=red]无法化解伤害[/color]且[color=red]自身产生[color=yellow]2[/color]枚内伤[/color]
敌人或自身受到的任意[color=yellow]爆炸类伤害[/color]都会引爆其所有内伤,每枚内伤造成$atk点伤害。
格挡时机越精确,成功率越高。
@@ -83,7 +85,7 @@ typeTopic = 3
[node name="source" parent="container/info/displays" parent_id_path=PackedInt32Array(784441328) index="1" unique_id=365191794]
text = "Nine Sols × Terraria"
[node name="description" parent="container" parent_id_path=PackedInt32Array(575698869) index="2" unique_id=566230682]
[node name="description" parent="container/scroller" parent_id_path=PackedInt32Array(543588938) index="0" unique_id=566230682]
text = "进行[b]格挡[/b],化解敌人的攻击。
每成功格挡一次,获得一点[b]气力[/b]。
@@ -120,6 +122,8 @@ text = "进行[b]格挡[/b],化解敌人的攻击。
[color=red]无法化解伤害[/color]但产生少量击退;
对于[b]魔法或召唤[/b]攻击,
[color=red]无法化解伤害[/color]但可以少量储能;
对于[b]爆炸[/b]攻击,
[color=red]无法化解伤害[/color]且[color=red]自身产生[color=yellow]2[/color]枚内伤[/color]
敌人或自身受到的任意[color=yellow]爆炸类伤害[/color]都会引爆其所有内伤,每枚内伤造成[color=cyan]10[/color]点伤害。
格挡时机越精确,成功率越高。
@@ -20,3 +20,4 @@ func hitBullet(bullet: BulletBase):
if !is_instance_valid(launcher): return
if BulletTool.canDamage(bullet, launcher):
baseDamage *= rate2 ** bullet.getDamage()
InternalDamageBullet.generateBall(launcher, bullet.launcher, sqrt(baseDamage))
@@ -11,3 +11,16 @@ func spawn():
if bullet.motionType == BulletBase.MotionType.EXPLOSION:
hitbox.set_deferred("disabled", false)
)
static func generateBall(by: EntityBase, who: EntityBase, atk: float):
var internalDamages = who.getOrCreateCycleTimer("internalDamages", 3000, 150)
for bullet in BulletBase.generate(
ComponentManager.getBullet("InternalDamage"),
by,
Vector2.ZERO,
0
):
if bullet is InternalDamageBullet:
bullet.baseDamage = atk
bullet.hoster = who
internalDamages.host(bullet)
+8 -16
View File
@@ -33,18 +33,6 @@ func generateParryBall(bDamage: float):
):
if b is ParryBallBullet:
b.atk = atk * bDamage
func generateInternalDamage(by: EntityBase, who: EntityBase):
var internalDamages = who.getOrCreateCycleTimer("internalDamages", 3000, 150)
for bullet in BulletBase.generate(
ComponentManager.getBullet("InternalDamage"),
by,
Vector2.ZERO,
0
):
if bullet is InternalDamageBullet:
bullet.baseDamage = atk
bullet.hoster = who
internalDamages.host(bullet)
func spawn():
var varians = randi_range(0, 1)
@@ -85,7 +73,7 @@ func hitBullet(bullet: BulletBase): # 当前子弹与其他子弹相撞
parryEffect(bullet)
bullet.hitbox.set_deferred("disabled", true)
generateParryBall(bullet.baseDamage)
generateInternalDamage(launcher, bullet.launcher)
InternalDamageBullet.generateBall(launcher, bullet.launcher, atk)
elif bullet.motionType == BulletBase.MotionType.STAB:
parryEffect(bullet)
penerateEffect(bullet.launcher, bullet.launcher.position * 1.01)
@@ -93,21 +81,25 @@ func hitBullet(bullet: BulletBase): # 当前子弹与其他子弹相撞
bullet.launcher.takeDamage(atk * reflectRate * bullet.getDamage())
bullet.launcher.impluse(Vector2.from_angle(bullet.rotation) * -2000)
generateParryBall(bullet.baseDamage)
generateInternalDamage(launcher, bullet.launcher)
InternalDamageBullet.generateBall(launcher, bullet.launcher, atk)
elif bullet.motionType == BulletBase.MotionType.SPRINT:
parryEffect(bullet)
bullet.tryDestroy()
bullet.launcher.velocity *= 0
generateParryBall(bullet.baseDamage)
generateInternalDamage(launcher, bullet.launcher)
InternalDamageBullet.generateBall(launcher, bullet.launcher, atk)
elif bullet.motionType == BulletBase.MotionType.BREATH:
penerateEffect(bullet.launcher, launcher.position)
bullet.launcher.impluse(Vector2.from_angle(bullet.rotation) * -500)
elif bullet.motionType == BulletBase.MotionType.SUMMON || bullet.motionType == BulletBase.MotionType.MAGIC:
penerateEffect(bullet.launcher, launcher.position)
launcher.storeEnergy(sqrt(bullet.baseDamage))
elif bullet.motionType == BulletBase.MotionType.EXPLOSION:
penerateEffect(bullet.launcher, launcher.position)
for i in 2:
InternalDamageBullet.generateBall(bullet.launcher, launcher, atk)
else:
generateInternalDamage(bullet.launcher, launcher)
InternalDamageBullet.generateBall(bullet.launcher, launcher, atk)
func refract(_newBullet: BulletBase, _entity: EntityBase, _index: int, _total: int, _lastBullet: float):
return null