forked from team-sg/hero-mark-2
84 lines
1.6 KiB
GDScript
84 lines
1.6 KiB
GDScript
extends Node2D
|
|
|
|
|
|
export var decisions: Dictionary = {
|
|
"wait": 2,
|
|
"chase": 3,
|
|
"punch": 3,
|
|
"beam": 1,
|
|
}
|
|
export var wait_time: float = 1.0
|
|
export var chase_speed: float = 50.0
|
|
|
|
|
|
var rng := RandomNumberGenerator.new()
|
|
var current_action: String = "wait"
|
|
|
|
|
|
onready var punch_cast: RayCast2D = $PunchCast
|
|
onready var chase_cast: RayCast2D = $ChaseCast
|
|
|
|
|
|
func _ready() -> void:
|
|
rng.seed = "HEROMARK2".hash()
|
|
_decide_action()
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
match current_action:
|
|
"chase":
|
|
if chase_cast.is_colliding():
|
|
print("huh")
|
|
_decide_action()
|
|
else:
|
|
print("hehe")
|
|
position.x -= chase_speed * delta
|
|
|
|
|
|
func _decide_action() -> void:
|
|
# fill array based on weights
|
|
var weighted_decisions := []
|
|
for k in decisions.keys():
|
|
for i in decisions[k]:
|
|
weighted_decisions.append(k)
|
|
# choose an action
|
|
current_action = weighted_decisions[rng.randi() % weighted_decisions.size()]
|
|
# act based on new action
|
|
match current_action:
|
|
"wait":
|
|
wait()
|
|
"chase":
|
|
chase()
|
|
"punch":
|
|
if punch_cast.is_colliding():
|
|
punch()
|
|
else:
|
|
current_action = "chase"
|
|
chase()
|
|
"beam":
|
|
beam()
|
|
|
|
|
|
func wait() -> void:
|
|
print("waiting")
|
|
yield(get_tree().create_timer(wait_time, false), "timeout")
|
|
_decide_action()
|
|
|
|
|
|
func chase() -> void:
|
|
# TODO: play animation
|
|
print("chasing")
|
|
|
|
|
|
func punch() -> void:
|
|
# TODO: play animation
|
|
print("PUNCH")
|
|
yield(get_tree().create_timer(wait_time, false), "timeout")
|
|
_decide_action()
|
|
|
|
|
|
func beam() -> void:
|
|
# TODO: play animation and stuff
|
|
print("BEAM")
|
|
yield(get_tree().create_timer(wait_time, false), "timeout")
|
|
_decide_action()
|