77 lines
2 KiB
GDScript
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)
|