Project2/enemies/Bingus/Bingus.gd
2025-01-14 15:37:17 +01:00

77 lines
2 KiB
GDScript

extends CharacterBody2D
@onready var stm := $StateMachine
@onready var detect_box := $DetectBox
@onready var attack_rage := $AttackRange
@onready var sword := $Skamtebord
@onready var run := $StateMachine/Run
@onready var air := $StateMachine/Air
@onready var idle := $StateMachine/Idle
@onready var follow := $StateMachine/Follow
@onready var attack := $StateMachine/Attack
@export var wait_low: float
@export var wait_high: float
var wait_tmp: float
@export var walk_range: float
var random := RandomNumberGenerator.new()
var original_pos: Vector2
func current_state():
return stm.state
func _ready():
original_pos = position
if random.randi_range(0, 1) == 0:
run.direction = -1
original_pos.x += walk_range/2
else:
run.direction = 1
original_pos.x -= walk_range/2
func start_wait():
wait_tmp = random.randf_range(wait_low, wait_high)
stm.transition(idle)
func _physics_process(delta):
if current_state() in [run] && !is_on_floor():
stm.transition(air)
if current_state() in [air] && is_on_floor():
stm.transition(run)
if current_state() in [run]:
if position.x < original_pos.x - walk_range:
run.direction = 1
start_wait()
return
if position.x > original_pos.x + walk_range:
run.direction = -1
start_wait()
return
if current_state() in [idle]:
if wait_tmp <= 0:
original_pos = position
stm.transition(run)
return
else:
wait_tmp -= delta
if current_state() in [run, idle]:
if detect_box.tracked != null:
stm.transition(follow, detect_box.tracked)
if current_state() in [follow] && !is_on_floor():
stm.transition(air)
if current_state() in [follow] && detect_box.tracked == null:
stm.transition(air)
if current_state() in [follow] && attack_rage.tracked != null:
var diff = attack_rage.tracked.global_position.x - global_position.x
if diff > 0:
sword.scale.x = 1
if diff < 0:
sword.scale.x = -1
stm.transition(attack, "SwordAttack")
if current_state() in [attack] && current_state().done:
stm.transition(air)
current_state().update(delta)