127 lines
3.0 KiB
GDScript
127 lines
3.0 KiB
GDScript
extends RigidBody2D
|
|
|
|
onready var pickUpArea = $PickUpArea
|
|
onready var collision = $PhysicsCollision
|
|
export var guestName = "Dieter"
|
|
export var PICKUPTRESHOLD = 100
|
|
export var destinationColor = Color.white
|
|
var pickup_time
|
|
|
|
signal picked_up(color,name)
|
|
signal dropped_off_success
|
|
signal dropped_off_idle
|
|
signal dropped_off_fail
|
|
|
|
var rng = RandomNumberGenerator.new()
|
|
onready var exclusionZoneShape = $ExclusionZone/CollisionShape2D
|
|
var sprite
|
|
|
|
var delivered
|
|
|
|
enum states {
|
|
waiting,
|
|
tethered,
|
|
delivered
|
|
}
|
|
var colorList = [
|
|
Color.yellow,
|
|
Color.violet,
|
|
Color.red,
|
|
Color.blue
|
|
]
|
|
var names = [
|
|
'Dieter',
|
|
'Peter',
|
|
'Gabi',
|
|
'Ursula',
|
|
'Manni',
|
|
'Karl',
|
|
'Christa',
|
|
'Britta'
|
|
]
|
|
var currentState = states.waiting
|
|
|
|
var follow_node = null
|
|
var follow_guest = null
|
|
var follow_pos = global_position
|
|
|
|
func set_state(state):
|
|
if state == states.delivered:
|
|
pickUpArea.monitorable = false
|
|
pickUpArea.monitoring = false
|
|
collision.disabled = true
|
|
if state == states.waiting:
|
|
collision.disabled = false
|
|
mode = RigidBody2D.MODE_KINEMATIC
|
|
if state == states.tethered:
|
|
collision.disabled = false
|
|
mode = RigidBody2D.MODE_STATIC
|
|
|
|
func _physics_process(delta):
|
|
if currentState == states.waiting:
|
|
linear_velocity.move_toward(Vector2.ZERO,5.0)
|
|
collision.disabled = false
|
|
elif currentState == states.tethered:
|
|
var rot_dir = get_angle_to(follow_pos)
|
|
rotation += (rot_dir + deg2rad(90))*0.2
|
|
var distance = follow_pos.distance_to(global_position)
|
|
global_position = follow_pos
|
|
pass
|
|
|
|
|
|
func _process(delta):
|
|
if delivered != null and OS.get_system_time_msecs() - delivered > 1000:
|
|
queue_free()
|
|
if visible == false:
|
|
follow_node = self
|
|
if delivered == null:
|
|
delivered = OS.get_system_time_msecs()
|
|
currentState = states.delivered
|
|
if follow_node != null and follow_node != self:
|
|
currentState = follow_node.currentState
|
|
if follow_node.visible == false:
|
|
follow_node = self
|
|
if follow_node == self:
|
|
currentState = states.waiting
|
|
else:
|
|
currentState = states.tethered
|
|
follow_pos = follow_node.get_node("Anchor/Joint/Rope/Anchor").global_position
|
|
else:
|
|
currentState = states.waiting
|
|
follow_pos = global_position
|
|
|
|
func _ready():
|
|
rng.randomize()
|
|
choose_random_sprite()
|
|
assign_color()
|
|
assign_name()
|
|
|
|
func assign_name():
|
|
guestName = names[rng.randi_range(0,names.size()-1)]
|
|
|
|
func assign_color():
|
|
destinationColor = colorList[rng.randi_range(0,colorList.size()-1)]
|
|
sprite.modulate = destinationColor
|
|
|
|
func _on_PickUpArea_body_entered(body):
|
|
print(body.name)
|
|
if body.name == "Playa":
|
|
pickup_time = OS.get_system_time_msecs()
|
|
emit_signal("picked_up",destinationColor,guestName)
|
|
|
|
func _on_PickUpArea_area_entered(area):
|
|
if area.name == "DROPOFF":
|
|
if area.destinationColor == destinationColor:
|
|
emit_signal("dropped_off_success")
|
|
else:
|
|
emit_signal("dropped_off_fail")
|
|
|
|
|
|
func choose_random_sprite():
|
|
var spriteNum = rng.randi_range(0,100)
|
|
if spriteNum % 2 == 0:
|
|
$SpriteMarkus.visible = true
|
|
sprite = $SpriteMarkus
|
|
if spriteNum % 2 != 0:
|
|
$SpriteSam.visible = true
|
|
sprite = $SpriteSam |