41 lines
798 B
GDScript
41 lines
798 B
GDScript
class_name Blast
|
|
extends Area2D
|
|
|
|
|
|
@export var damage : AbstractDamage
|
|
@export var shape : CircleShape2D
|
|
|
|
|
|
const FALLOFF_FACTOR = 3
|
|
|
|
|
|
@onready var collision : CollisionShape2D = $CollisionShape2D
|
|
|
|
|
|
func _ready() -> void:
|
|
if collision and shape:
|
|
collision.shape = shape
|
|
|
|
|
|
func get_damage_to(body: Node2D) -> AbstractDamage:
|
|
var distance := _get_distance_to(body)
|
|
var damage_dub := damage.duplicate()
|
|
|
|
var factor := _get_damage_factor(distance)
|
|
damage_dub.value = damage_dub.value * factor
|
|
|
|
return damage_dub
|
|
|
|
|
|
func _get_distance_to(body: Node2D) -> float:
|
|
return global_position.distance_to(body.global_position)
|
|
|
|
|
|
func _get_damage_factor(distance: float) -> float:
|
|
if not shape: return 0.0
|
|
|
|
var coef := distance / shape.radius
|
|
if coef > 1:
|
|
return 0.0
|
|
return 1 - coef * coef * coef
|