game: add weapon active ability
This commit is contained in:
@@ -7,6 +7,7 @@ extends Node2D
|
||||
@export var attack_duration: float
|
||||
@export var attack_range: float
|
||||
|
||||
@onready var active_cd_timer: Timer = $ActiveCDTimer
|
||||
|
||||
func _on_attack_cd_timer_timeout() -> void:
|
||||
do_attack()
|
||||
@@ -15,6 +16,15 @@ func _on_attack_cd_timer_timeout() -> void:
|
||||
func do_attack() -> void:
|
||||
push_error("%s does not implement do_attack" % self)
|
||||
|
||||
func do_active() -> void:
|
||||
if not active_cd_timer.is_stopped():
|
||||
return
|
||||
active_cd_timer.start()
|
||||
_do_active()
|
||||
|
||||
|
||||
func _do_active() -> void:
|
||||
push_error("%s does not implement do_active" % self)
|
||||
|
||||
func find_target_in_radius() -> EnemyBase:
|
||||
var space_state: PhysicsDirectSpaceState2D = get_world_2d().direct_space_state
|
||||
|
@@ -8,4 +8,7 @@ script = ExtResource("1_v4xn6")
|
||||
[node name="AttackCDTimer" type="Timer" parent="."]
|
||||
autostart = true
|
||||
|
||||
[node name="ActiveCDTimer" type="Timer" parent="."]
|
||||
one_shot = true
|
||||
|
||||
[connection signal="timeout" from="AttackCDTimer" to="." method="_on_attack_cd_timer_timeout"]
|
||||
|
@@ -23,20 +23,32 @@ func do_attack() -> void:
|
||||
return
|
||||
|
||||
var projectile = WEAPON_SWORD_PROJECTILE.instantiate()
|
||||
projectile.damage = attack_damage
|
||||
projectile.target = target
|
||||
projectile.on_hit_sig = projectile_hit
|
||||
add_child(projectile)
|
||||
|
||||
func _do_active() -> void:
|
||||
var radius = targeting_range_shape.shape.radius
|
||||
var count = 15
|
||||
for i in count:
|
||||
var angle = TAU * float(i) / float(count)
|
||||
var target_pos = Vector2(cos(angle), sin(angle)) * radius
|
||||
var new_target := Marker2D.new()
|
||||
new_target.global_position = global_position + target_pos
|
||||
var projectile = WEAPON_SWORD_PROJECTILE.instantiate()
|
||||
projectile.damage_mult = 3.0
|
||||
projectile.target = new_target
|
||||
projectile.on_hit_sig = projectile_hit
|
||||
add_child(projectile)
|
||||
|
||||
func deal_damage(enemy: EnemyBase):
|
||||
func deal_damage(enemy: EnemyBase, damage_mult: float):
|
||||
var crit_chance = _player.player_stats.get_final("crit_chance", _player.modifiers)
|
||||
var damage_dealt = attack_damage
|
||||
var damage_dealt = attack_damage * damage_mult
|
||||
var is_crit = randf() >= 1 - crit_chance
|
||||
if is_crit:
|
||||
damage_dealt *= _player.player_stats.get_final("crit_multiplier", _player.modifiers)
|
||||
enemy.take_damage(damage_dealt, is_crit)
|
||||
|
||||
|
||||
func _on_projectile_hit(projectile: WeaponSwordProjectile, enemy: EnemyBase):
|
||||
deal_damage(enemy)
|
||||
func _on_projectile_hit(projectile: WeaponSwordProjectile, enemy: EnemyBase, damage_mult: float):
|
||||
deal_damage(enemy, damage_mult)
|
||||
|
@@ -4,7 +4,7 @@ extends Node2D
|
||||
@export var speed: float = 500.0
|
||||
@export var range: float = 200.0
|
||||
@export var target: Node2D
|
||||
@export var damage: float
|
||||
@export var damage_mult: float = 1.0
|
||||
@export var on_hit_sig: Signal
|
||||
|
||||
var _direction: Vector2
|
||||
@@ -36,5 +36,5 @@ func _physics_process(delta: float) -> void:
|
||||
func _on_area_2d_body_entered(body: Node2D) -> void:
|
||||
if body in _already_hit:
|
||||
return
|
||||
on_hit_sig.emit(self, body)
|
||||
on_hit_sig.emit(self, body, damage_mult)
|
||||
_already_hit.append(body)
|
||||
|
Reference in New Issue
Block a user