From 6b7801e1ce0db6e6b1d46de0530328b994822a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Sun, 10 May 2026 14:58:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=AD=A6=E5=99=A8=E7=B3=BB=E7=BB=9F):=20?= =?UTF-8?q?=E4=B8=BABigLaser=E6=AD=A6=E5=99=A8=E6=B7=BB=E5=8A=A0=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E4=BC=A4=E5=AE=B3=E5=92=8C=E5=8D=87=E5=8D=8E=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在ObstacleBase和EntityBase中添加getHealthPercent方法用于获取生命值百分比 - 修改bulletHit方法支持伤害覆盖参数 - 为BigLaser武器添加5个升华选项,包括临界斩杀效果 - 实现damageOverride方法根据目标生命值动态调整伤害 - 修复store数值可能为负数的问题 --- scripts/Contents/Bullets/BigLaser.gd | 8 +++++ scripts/Contents/Weapons/BigLaser.gd | 48 ++++++++++++++++++++++++++++ scripts/Statemachine/BulletBase.gd | 8 +++-- scripts/Statemachine/EntityBase.gd | 4 +-- scripts/Statemachine/ObstacleBase.gd | 2 ++ scripts/Structs/Weapon.gd | 3 +- 6 files changed, 66 insertions(+), 7 deletions(-) diff --git a/scripts/Contents/Bullets/BigLaser.gd b/scripts/Contents/Bullets/BigLaser.gd index 259fe1d..e2de8b7 100644 --- a/scripts/Contents/Bullets/BigLaser.gd +++ b/scripts/Contents/Bullets/BigLaser.gd @@ -2,6 +2,7 @@ extends BulletBase class_name BigLaser var dotTime: float = 100 +var executeAtk: float = 0.25 func spawn(): CameraManager.shake(5000, 100) # 激光会运行5秒(5000毫秒),期间震屏超高强度 @@ -17,3 +18,10 @@ func applyDot(): await TickTool.millseconds(dotTime / launcher.fields[FieldStore.Entity.ATTACK_SPEED]) await TickTool.frame() # 等至少一帧,防止跳帧导致没检测到伤害 return true +func damageOverride(origin: float, something: Variant): + if something is EntityBase: + return origin * (1 + (executeAtk if something.getHealthPercent() < 0.3 else 0.0)) + elif something is ObstacleBase: + return origin * (1 + (executeAtk if something.getHealthPercent() < 0.3 else 0.0)) + else: + return origin diff --git a/scripts/Contents/Weapons/BigLaser.gd b/scripts/Contents/Weapons/BigLaser.gd index d43fa9a..7421485 100644 --- a/scripts/Contents/Weapons/BigLaser.gd +++ b/scripts/Contents/Weapons/BigLaser.gd @@ -2,6 +2,51 @@ extends Weapon class_name BigLaserWeapon +func sublimateOptions() -> Array[SublimateOption]: + return [ + SublimateOption.new( + "湮灭强化", + "伤害+15", + func(w: Weapon, _e): + w.addStoreExtra("atk", 15), + 1, + CategoryStore.Quality.COMMON + ), + SublimateOption.new( + "高频激荡", + "间隔-0.01秒", + func(w: Weapon, _e): + w.addStoreExtra("time", -0.01), + 1, + CategoryStore.Quality.RARE + ), + SublimateOption.new( + "临界斩杀", + "对生命值低于30%的敌人,伤害+25%", + func(w: Weapon, _e): + w.addStoreExtra("executeAtk", 0.25), + 1, + CategoryStore.Quality.EPIC + ), + SublimateOption.new( + "蓄能聚焦", + "射线伤害+30,但伤害间隔+0.03秒", + func(w: Weapon, _e): + w.addStoreExtra("atk", 30) + w.addStoreExtra("time", 0.03), + 1, + CategoryStore.Quality.LEGENDARY + ), + SublimateOption.new( + "空间撕裂", + "射线持续时间+0.3秒", + func(w: Weapon, _e): + w.addStoreExtra("duration", 0.3), + 2, + CategoryStore.Quality.COMMON + ), + ] + func update(to: int, origin: Dictionary, _entity: EntityBase): origin["atk"] += 5 * to * soulLevel origin["time"] /= 1 + 0.05 * to * soulLevel @@ -12,4 +57,7 @@ func attack(entity: EntityBase): var bigLaser: BigLaser = bullet bigLaser.dotTime = readStore("time") * 1000 bigLaser.baseDamage = readStore("atk") + bigLaser.executeAtk = readStoreExtra("executeAtk") + await TickTool.frame() + bigLaser.animator.speed_scale = 5 / (5 + readStoreExtra("duration")) return true diff --git a/scripts/Statemachine/BulletBase.gd b/scripts/Statemachine/BulletBase.gd index 97601f2..cb04c9b 100644 --- a/scripts/Statemachine/BulletBase.gd +++ b/scripts/Statemachine/BulletBase.gd @@ -141,10 +141,10 @@ func setupCuttable(cutSpeed: float): ) func getDamage(): return baseDamage * damageMultipliers[usingDamageMultiplier] -func calculateDamage(crit: bool): +func calculateDamage(crit: bool, entity: Variant): var baseDmg = getDamage() * launcher.fields.get(FieldStore.Entity.DAMAGE_MULTIPILER) * randf_range(1 - GameRule.damageOffset, 1 + GameRule.damageOffset) var damage = baseDmg + baseDmg * int(crit) * launcher.fields.get(FieldStore.Entity.CRIT_DAMAGE) - return damage + return damageOverride(damage, entity) func determineCrit(): return MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE) + GameRule.critRateInfluenceByLuckValue * launcher.fields[FieldStore.Entity.LUCK_VALUE]) func hitEntity(target: Node): @@ -161,7 +161,7 @@ func hitObstacle(target: Node): var obstacle = target as ObstacleBase if is_instance_valid(obstacle.launcher): if not BulletTool.canDamage(self , obstacle.launcher): return - obstacle.takeDamage(calculateDamage(determineCrit())) + obstacle.takeDamage(calculateDamage(determineCrit(), target)) if MathTool.rate(fullPenerate() - obstacle.penerateResistance): baseDamage *= 1.0 - penerateDamageReduction else: @@ -257,6 +257,8 @@ func refract(newBullet: BulletBase, _entity: EntityBase, _index: int, _total: in return newBullet func hitBullet(_bullet: BulletBase): pass +func damageOverride(origin: float, _something: Variant): + return origin static func generate( bullet: PackedScene, diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index a9c509c..57b03da 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -282,10 +282,10 @@ func takeDamage(baseDamage: float, crit: bool = false, perfectMiss: bool = false if health <= 0: tryDie(null) return resultDamage -func bulletHit(bullet: BulletBase, crit: bool): +func bulletHit(bullet: BulletBase, crit: bool, damageOverride = "none"): # 当受伤时 hurtAnimator.play("hurt") - var damage = bullet.calculateDamage(crit) + var damage = bullet.calculateDamage(crit) if damageOverride == "none" else damageOverride var perfectMiss = false if sprinting: playSound("miss") diff --git a/scripts/Statemachine/ObstacleBase.gd b/scripts/Statemachine/ObstacleBase.gd index dc78f94..2f3a9e3 100644 --- a/scripts/Statemachine/ObstacleBase.gd +++ b/scripts/Statemachine/ObstacleBase.gd @@ -44,6 +44,8 @@ func takeDamage(damage: float): func tryDie(): die() queue_free() +func getHealthPercent(): + return health / healthMax func die(): pass diff --git a/scripts/Structs/Weapon.gd b/scripts/Structs/Weapon.gd index f872936..779e941 100644 --- a/scripts/Structs/Weapon.gd +++ b/scripts/Structs/Weapon.gd @@ -241,7 +241,7 @@ func rebuildSublimateOptions(showNext: bool): sublimateOptionsBox.add_child(instance) disruptSublimateOptions() func readStore(key: String): - return store.get(key, 0) + readStoreExtra(key) + return clamp(store.get(key, 0) + readStoreExtra(key), 0, INF) func playSound(sound: String): var body = sounds.get_node_or_null(sound) if body is AudioStreamPlayer2D: @@ -284,7 +284,6 @@ func addStoreExtra(key: String, value: float): if !storeExtra.has(key): storeExtra[key] = 0 storeExtra[key] += value - storeExtra[key] = clamp(storeExtra[key], 0, INF) func readStoreExtra(key: String): return storeExtra.get(key, 0) func getSublimateOptions() -> Array[SublimateOption]: