Project2/test_levels/Bingus/Bingus.gd
2023-04-11 22:40:16 +02:00

68 lines
1.6 KiB
GDScript

extends CharacterBody2D
@onready var stm := $StateMachine
@onready var detect_box := $DetectBox
@onready var run := $StateMachine/Run
@onready var air := $StateMachine/Air
@onready var idle := $StateMachine/Idle
@onready var follow := $StateMachine/Follow
@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)
current_state().update(delta)
func _on_hurt_box_hurt(_data):
print("ouch")