131 lines
3.6 KiB
GDScript
131 lines
3.6 KiB
GDScript
tool
|
|
extends "res://objects/enemy/enemy.gd"
|
|
|
|
const SlimeParticles = preload("res://objects/enemy/slime_particles.tscn")
|
|
|
|
export var left_boundary: float = 0.0
|
|
export var right_boundary: float = 0.0
|
|
export var direction: float = 1.0
|
|
export var speed: float = 50.0
|
|
export var jump_distance: float = 0.0
|
|
export var jump_speed: float = 50.0
|
|
export (Array, float) var bottom_jumps: Array = [] setget _set_bottom_jumps
|
|
export (Array, float) var top_jumps: Array = [] setget _set_top_jumps
|
|
export var detect_player: bool = false
|
|
|
|
var _jumping: bool = false
|
|
var _jump_direction: float = -1.0
|
|
|
|
onready var hitbox: Area2D = $Hitbox
|
|
onready var sprite: AnimatedSprite = $Hitbox/Sprite
|
|
onready var detect_player_cast: RayCast2D = $"%DetectPlayerCast"
|
|
|
|
|
|
func _ready() -> void:
|
|
if Engine.editor_hint:
|
|
return
|
|
left_boundary *= 8.0
|
|
right_boundary *= 8.0
|
|
jump_distance *= 8.0
|
|
for i in bottom_jumps.size():
|
|
bottom_jumps[i] *= 8.0
|
|
for i in top_jumps.size():
|
|
top_jumps[i] *= 8.0
|
|
detect_player_cast.cast_to = Vector2(0.0, -jump_distance)
|
|
speed *= Game.enemy_speed_factor
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if Engine.editor_hint:
|
|
return
|
|
# check for jump point
|
|
var jump_points = bottom_jumps if sign(_jump_direction) == -1.0 else top_jumps
|
|
for x in jump_points:
|
|
if abs(hitbox.position.x - x) <= 4.0:
|
|
_jumping = true
|
|
break
|
|
# check for player
|
|
if detect_player and detect_player_cast.is_colliding():
|
|
_jumping = true
|
|
# move if not jumping
|
|
if _jumping:
|
|
hitbox.position.y += _jump_direction * jump_speed * delta
|
|
if hitbox.position.y >= 8.0:
|
|
hitbox.position.y = 0.0
|
|
_jump_direction = -1.0
|
|
hitbox.scale.y = 1.0
|
|
_jumping = false
|
|
elif hitbox.position.y <= -jump_distance - 8.0:
|
|
hitbox.position.y = -jump_distance
|
|
_jump_direction = 1.0
|
|
hitbox.scale.y = -1.0
|
|
_jumping = false
|
|
else:
|
|
hitbox.position.x += direction * speed * delta
|
|
if hitbox.position.x >= right_boundary:
|
|
hitbox.position.x = right_boundary
|
|
direction = -1.0
|
|
sprite.flip_h = true
|
|
elif hitbox.position.x <= -left_boundary:
|
|
hitbox.position.x = -left_boundary
|
|
sprite.flip_h = false
|
|
direction = 1.0
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
if Engine.editor_hint and Engine.get_frames_drawn() % 10 == 0:
|
|
update()
|
|
|
|
|
|
func _draw() -> void:
|
|
if Engine.editor_hint:
|
|
# bottom travel zone
|
|
draw_line(
|
|
Vector2(-left_boundary * 8.0, 4.0),
|
|
Vector2(right_boundary * 8.0 + 8.0, 4.0),
|
|
Color(0.4, 0.2, 0.6, 0.75), 1.01, false
|
|
)
|
|
# top travel zone
|
|
draw_line(
|
|
Vector2(-left_boundary * 8.0, -jump_distance * 8.0 - 4.0),
|
|
Vector2(right_boundary * 8.0 + 8.0, -jump_distance * 8.0 - 4.0),
|
|
Color(0.4, 0.2, 0.6, 0.75), 1.01, false
|
|
)
|
|
# jump lines
|
|
for x in bottom_jumps:
|
|
draw_line(
|
|
Vector2(x * 8.0, 4.0),
|
|
Vector2(x * 8.0, -jump_distance * 4.0),
|
|
Color(1.0, 0.0, 0.0, 0.75), 1.01, false
|
|
)
|
|
draw_circle(Vector2(x * 8.0, 4.0), 2.0, Color.red)
|
|
for x in top_jumps:
|
|
draw_line(
|
|
Vector2(x * 8.0, -jump_distance * 8.0 - 4.0),
|
|
Vector2(x * 8.0, -jump_distance * 4.0),
|
|
Color(1.0, 0.0, 0.0, 0.75), 1.01, false
|
|
)
|
|
draw_circle(Vector2(x * 8.0, -jump_distance * 8.0 - 4.0), 2.0, Color.red)
|
|
# draw_line(
|
|
# Vector2(4.0, 4.0),
|
|
# Vector2(4.0, -jump_distance * 8.0 - 4.0),
|
|
# Color(0.4, 0.2, 0.6, 0.75), 1.01, false
|
|
# )
|
|
|
|
|
|
func _set_bottom_jumps(value: Array) -> void:
|
|
bottom_jumps = value
|
|
update()
|
|
|
|
|
|
func _set_top_jumps(value: Array) -> void:
|
|
top_jumps = value
|
|
update()
|
|
|
|
|
|
func die() -> void:
|
|
.die()
|
|
var death_particles = SlimeParticles.instance()
|
|
death_particles.global_position = hitbox.global_position + Vector2(4.0, 4.0)
|
|
death_particles.emitting = true
|
|
get_parent().add_child(death_particles)
|