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]: