69 lines
1.7 KiB
GDScript3
69 lines
1.7 KiB
GDScript3
|
extends KinematicBody2D
|
||
|
|
||
|
# class member variables go here, for example:
|
||
|
# var a = 2
|
||
|
# var b = "textvar"
|
||
|
|
||
|
const STATE_IDLE = "idle"
|
||
|
const STATE_FLOCKING = "flock"
|
||
|
const STATE_ROAM = "roam"
|
||
|
|
||
|
var destination = Vector2()
|
||
|
var state = STATE_IDLE
|
||
|
var blocked_move = Vector2(0, 0)
|
||
|
var turd_count = 0
|
||
|
var strength = 0
|
||
|
|
||
|
func _ready():
|
||
|
# Called every time the node is added to the scene.
|
||
|
# Initialization here
|
||
|
set_process(true)
|
||
|
|
||
|
func _process(delta):
|
||
|
for i in get_node("Area2D").get_overlapping_areas():
|
||
|
var n = i.get_parent();
|
||
|
if n.has_method('is_eatable'):
|
||
|
n.eat(self)
|
||
|
|
||
|
if state == STATE_IDLE:
|
||
|
if randf() < 0.05:
|
||
|
var d = pick_random_destination()
|
||
|
#print("I want wander to ", d)
|
||
|
destination = d
|
||
|
state = STATE_ROAM
|
||
|
if state == STATE_ROAM:
|
||
|
if destination.distance_to(get_global_pos()) < 50:
|
||
|
#print("I have arrived")
|
||
|
state = STATE_IDLE
|
||
|
if state == STATE_ROAM or state == STATE_FLOCKING:
|
||
|
var dir = (destination - get_global_pos()).normalized()
|
||
|
var motion = dir * rand_range(20, 100) * delta
|
||
|
var blocked = move(motion)
|
||
|
if blocked - blocked_move != Vector2(0, 0):
|
||
|
#print(blocked - blocked_move)
|
||
|
if state == STATE_ROAM:
|
||
|
state = STATE_IDLE
|
||
|
#print("I think I might be stuck")
|
||
|
blocked_move = blocked
|
||
|
|
||
|
if turd_count > 0:
|
||
|
poop()
|
||
|
|
||
|
func flock(d, enable = true):
|
||
|
if not enable:
|
||
|
state = STATE_ROAM
|
||
|
destination = pick_random_destination()
|
||
|
return
|
||
|
destination = d
|
||
|
state = STATE_FLOCKING
|
||
|
|
||
|
func pick_random_destination():
|
||
|
var v = get_viewport_rect()
|
||
|
return Vector2(rand_range(v.pos.x, v.end.x), rand_range(v.pos.y, v.end.y))
|
||
|
|
||
|
func poop():
|
||
|
turd_count -= 1
|
||
|
var t = preload("res://poop.tscn")
|
||
|
var n = t.instance()
|
||
|
n.set_global_pos(get_global_pos())
|
||
|
get_node('/root/game/Level').add_child(n)
|