mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-05-28 06:51:54 +08:00
feat(武器系统): 为BigLaser武器添加执行伤害和升华选项
- 在ObstacleBase和EntityBase中添加getHealthPercent方法用于获取生命值百分比 - 修改bulletHit方法支持伤害覆盖参数 - 为BigLaser武器添加5个升华选项,包括临界斩杀效果 - 实现damageOverride方法根据目标生命值动态调整伤害 - 修复store数值可能为负数的问题
This commit is contained in:
@@ -2,6 +2,7 @@ extends BulletBase
|
|||||||
class_name BigLaser
|
class_name BigLaser
|
||||||
|
|
||||||
var dotTime: float = 100
|
var dotTime: float = 100
|
||||||
|
var executeAtk: float = 0.25
|
||||||
|
|
||||||
func spawn():
|
func spawn():
|
||||||
CameraManager.shake(5000, 100) # 激光会运行5秒(5000毫秒),期间震屏超高强度
|
CameraManager.shake(5000, 100) # 激光会运行5秒(5000毫秒),期间震屏超高强度
|
||||||
@@ -17,3 +18,10 @@ func applyDot():
|
|||||||
await TickTool.millseconds(dotTime / launcher.fields[FieldStore.Entity.ATTACK_SPEED])
|
await TickTool.millseconds(dotTime / launcher.fields[FieldStore.Entity.ATTACK_SPEED])
|
||||||
await TickTool.frame() # 等至少一帧,防止跳帧导致没检测到伤害
|
await TickTool.frame() # 等至少一帧,防止跳帧导致没检测到伤害
|
||||||
return true
|
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
|
||||||
|
|||||||
@@ -2,6 +2,51 @@
|
|||||||
extends Weapon
|
extends Weapon
|
||||||
class_name BigLaserWeapon
|
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):
|
func update(to: int, origin: Dictionary, _entity: EntityBase):
|
||||||
origin["atk"] += 5 * to * soulLevel
|
origin["atk"] += 5 * to * soulLevel
|
||||||
origin["time"] /= 1 + 0.05 * to * soulLevel
|
origin["time"] /= 1 + 0.05 * to * soulLevel
|
||||||
@@ -12,4 +57,7 @@ func attack(entity: EntityBase):
|
|||||||
var bigLaser: BigLaser = bullet
|
var bigLaser: BigLaser = bullet
|
||||||
bigLaser.dotTime = readStore("time") * 1000
|
bigLaser.dotTime = readStore("time") * 1000
|
||||||
bigLaser.baseDamage = readStore("atk")
|
bigLaser.baseDamage = readStore("atk")
|
||||||
|
bigLaser.executeAtk = readStoreExtra("executeAtk")
|
||||||
|
await TickTool.frame()
|
||||||
|
bigLaser.animator.speed_scale = 5 / (5 + readStoreExtra("duration"))
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -141,10 +141,10 @@ func setupCuttable(cutSpeed: float):
|
|||||||
)
|
)
|
||||||
func getDamage():
|
func getDamage():
|
||||||
return baseDamage * damageMultipliers[usingDamageMultiplier]
|
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 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)
|
var damage = baseDmg + baseDmg * int(crit) * launcher.fields.get(FieldStore.Entity.CRIT_DAMAGE)
|
||||||
return damage
|
return damageOverride(damage, entity)
|
||||||
func determineCrit():
|
func determineCrit():
|
||||||
return MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE) + GameRule.critRateInfluenceByLuckValue * launcher.fields[FieldStore.Entity.LUCK_VALUE])
|
return MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE) + GameRule.critRateInfluenceByLuckValue * launcher.fields[FieldStore.Entity.LUCK_VALUE])
|
||||||
func hitEntity(target: Node):
|
func hitEntity(target: Node):
|
||||||
@@ -161,7 +161,7 @@ func hitObstacle(target: Node):
|
|||||||
var obstacle = target as ObstacleBase
|
var obstacle = target as ObstacleBase
|
||||||
if is_instance_valid(obstacle.launcher):
|
if is_instance_valid(obstacle.launcher):
|
||||||
if not BulletTool.canDamage(self , obstacle.launcher): return
|
if not BulletTool.canDamage(self , obstacle.launcher): return
|
||||||
obstacle.takeDamage(calculateDamage(determineCrit()))
|
obstacle.takeDamage(calculateDamage(determineCrit(), target))
|
||||||
if MathTool.rate(fullPenerate() - obstacle.penerateResistance):
|
if MathTool.rate(fullPenerate() - obstacle.penerateResistance):
|
||||||
baseDamage *= 1.0 - penerateDamageReduction
|
baseDamage *= 1.0 - penerateDamageReduction
|
||||||
else:
|
else:
|
||||||
@@ -257,6 +257,8 @@ func refract(newBullet: BulletBase, _entity: EntityBase, _index: int, _total: in
|
|||||||
return newBullet
|
return newBullet
|
||||||
func hitBullet(_bullet: BulletBase):
|
func hitBullet(_bullet: BulletBase):
|
||||||
pass
|
pass
|
||||||
|
func damageOverride(origin: float, _something: Variant):
|
||||||
|
return origin
|
||||||
|
|
||||||
static func generate(
|
static func generate(
|
||||||
bullet: PackedScene,
|
bullet: PackedScene,
|
||||||
|
|||||||
@@ -282,10 +282,10 @@ func takeDamage(baseDamage: float, crit: bool = false, perfectMiss: bool = false
|
|||||||
if health <= 0:
|
if health <= 0:
|
||||||
tryDie(null)
|
tryDie(null)
|
||||||
return resultDamage
|
return resultDamage
|
||||||
func bulletHit(bullet: BulletBase, crit: bool):
|
func bulletHit(bullet: BulletBase, crit: bool, damageOverride = "none"):
|
||||||
# 当受伤时
|
# 当受伤时
|
||||||
hurtAnimator.play("hurt")
|
hurtAnimator.play("hurt")
|
||||||
var damage = bullet.calculateDamage(crit)
|
var damage = bullet.calculateDamage(crit) if damageOverride == "none" else damageOverride
|
||||||
var perfectMiss = false
|
var perfectMiss = false
|
||||||
if sprinting:
|
if sprinting:
|
||||||
playSound("miss")
|
playSound("miss")
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ func takeDamage(damage: float):
|
|||||||
func tryDie():
|
func tryDie():
|
||||||
die()
|
die()
|
||||||
queue_free()
|
queue_free()
|
||||||
|
func getHealthPercent():
|
||||||
|
return health / healthMax
|
||||||
|
|
||||||
func die():
|
func die():
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ func rebuildSublimateOptions(showNext: bool):
|
|||||||
sublimateOptionsBox.add_child(instance)
|
sublimateOptionsBox.add_child(instance)
|
||||||
disruptSublimateOptions()
|
disruptSublimateOptions()
|
||||||
func readStore(key: String):
|
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):
|
func playSound(sound: String):
|
||||||
var body = sounds.get_node_or_null(sound)
|
var body = sounds.get_node_or_null(sound)
|
||||||
if body is AudioStreamPlayer2D:
|
if body is AudioStreamPlayer2D:
|
||||||
@@ -284,7 +284,6 @@ func addStoreExtra(key: String, value: float):
|
|||||||
if !storeExtra.has(key):
|
if !storeExtra.has(key):
|
||||||
storeExtra[key] = 0
|
storeExtra[key] = 0
|
||||||
storeExtra[key] += value
|
storeExtra[key] += value
|
||||||
storeExtra[key] = clamp(storeExtra[key], 0, INF)
|
|
||||||
func readStoreExtra(key: String):
|
func readStoreExtra(key: String):
|
||||||
return storeExtra.get(key, 0)
|
return storeExtra.get(key, 0)
|
||||||
func getSublimateOptions() -> Array[SublimateOption]:
|
func getSublimateOptions() -> Array[SublimateOption]:
|
||||||
|
|||||||
Reference in New Issue
Block a user