hero-mark-2/objects/player/arrow_projectile.gd
Hazel Snider a2974d8dd3 the damage system refactor!
killing is now done based on groups, the same way enemies already killed
the player.

these groups go on the entity's hitbox, not the entity itself.
enemies' hitboxes have all been put in "enemy_hitbox"

the arrow_projectile has a variable for the target group, so it could
easily be simply set to "player" for arrows shot by enemies

blocking is also done with groups. any hitbox with "blocks_arrow"
will block arrows, same with "blocks_sword" and "blocks_squash"
2023-01-20 00:06:34 -05:00

53 lines
1.6 KiB
GDScript

extends Node2D
export var speed = 240.0
# group to kill
var target_group = "enemy_hitbox"
# direction to fly
var direction = 1.0
#Edge to check culling, if this edge is offscreen, delete the arrow
onready var cull_edge = Vector2(5 * direction,0)
onready var player = get_parent().get_node("Player")
onready var initial_sector = Game.get_sector(player.global_position)
func _ready():
#Flip depending on direction
scale.x = direction
func _physics_process(delta):
#Move in right direction
position.x += speed * direction * delta
#Delete when offscreen
if Game.get_sector(global_position + cull_edge) != initial_sector:
queue_free()
func _exit_tree():
# make sure particles node sticks around until particles decay
var particles = $DustParticles
remove_child(particles)
particles.global_position = global_position
particles.emitting = false
get_parent().add_child(particles)
get_tree().create_timer(particles.lifetime, false).connect("timeout", particles, "queue_free")
#Wall Collision
func _on_Hitbox_body_entered(body):
if body is TileMap or body is StaticBody2D:
queue_free()
# kill entity if in target group
func _on_Hitbox_area_entered(area):
# block if collided area is in "blocks_arrow" group
if area.is_in_group(target_group):
var target = area.get_parent()
# create block text and return if blocked
if area.is_in_group("blocks_arrow"):
var pos = target.global_position
Game.instance_node(Game.block_text, pos.x, pos.y, target.get_parent())
else:
# kill targeted node
target.die()
Game.arrows = max(0, Game.arrows - 1) # clamp arrows above 0
queue_free()