Files
kicking-high/proto3/godot/scenes/furniture/closet.gd
2020-04-13 12:45:25 +03:00

132 lines
3.9 KiB
GDScript3

extends Spatial
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
enum {DOOR_OPEN, DOOR_CLOSED}
var door_l_state = DOOR_CLOSED
var door_r_state = DOOR_CLOSED
var act_l_delay = 0.0
var act_r_delay = 0.0
var l_act = false
var r_act = false
var hide_delay = 4.0
var hidden = false
func activate_l_door(def):
if def && door_l_state == DOOR_CLOSED:
$closet/closet_door_left/AnimationPlayer.play("openning")
door_l_state = DOOR_OPEN
if !def && door_l_state == DOOR_OPEN:
$closet/closet_door_left/AnimationPlayer.play_backwards("openning")
door_l_state = DOOR_CLOSED
func activate_r_door(def):
if def && door_r_state == DOOR_CLOSED:
$closet/closet_door_right/AnimationPlayer.play("openning_r")
door_r_state = DOOR_OPEN
if !def && door_r_state == DOOR_OPEN:
$closet/closet_door_right/AnimationPlayer.play_backwards("openning_r")
door_r_state = DOOR_CLOSED
func _ready():
add_to_group("closet")
add_to_group("hide_spot")
var ret = $left.connect("body_entered", self, "body_enter")
assert(ret == OK)
ret = $left.connect("body_exited", self, "body_exit")
assert(ret == OK)
ret = $right.connect("body_entered", self, "body_enter")
assert(ret == OK)
ret = $right.connect("body_exited", self, "body_exit")
assert(ret == OK)
ret = $Timer.connect("timeout", self, "free_character")
assert(ret == OK)
func _process(delta):
if l_act:
act_l_delay += delta
if act_l_delay >= 1.5:
if door_l_state == DOOR_CLOSED:
door_l_state = DOOR_OPEN
l_act = false
if r_act:
act_l_delay += delta
if act_l_delay >= 1.5:
if door_l_state == DOOR_CLOSED:
door_l_state = DOOR_OPEN
r_act = false
func free_character():
var c = get_meta("hidden_character")
c.remove_collision_exception_with($closet/closet_door_left/static_collision)
c.remove_collision_exception_with($closet/closet_door_right/static_collision)
c.remove_collision_exception_with($closet/static_collision)
c.global_transform = $exit_spot.global_transform
yield(get_tree().create_timer(0.1), "timeout")
c.global_transform = $exit_spot.global_transform
c.set_meta("smart_object", false)
c.do_walk()
hidden = false
set_meta("hidden_character", null)
func body_enter(body):
if !body.is_in_group("characters"):
return
if body.get_meta("grabbing"):
return
# TODO
if body.get_meta("grabbed"):
return
if !hidden:
if body == global.player:
print("CLOSET")
activate_l_door(true)
activate_r_door(true)
elif body.has_meta("action"):
var action = body.get_meta("action")
if action == "hide":
activate_l_door(true)
activate_r_door(true)
body.set_meta("smart_object", true)
body.do_stop()
set_meta("hidden_character", body)
hidden = true
yield(get_tree().create_timer(hide_delay), "timeout")
body.add_collision_exception_with($closet/closet_door_left/static_collision)
body.add_collision_exception_with($closet/closet_door_right/static_collision)
body.add_collision_exception_with($closet/static_collision)
body.global_transform = $hide_spot.global_transform
yield(get_tree().create_timer(0.1), "timeout")
body.global_transform = $hide_spot.global_transform
yield(get_tree().create_timer(hide_delay), "timeout")
activate_l_door(false)
activate_r_door(false)
else:
return
else:
activate_l_door(true)
activate_r_door(true)
else:
if body == get_meta("hidden_character"):
return
if body == global.player:
activate_l_door(true)
activate_r_door(true)
$Timer.start(4.0)
elif body.has_meta("action"):
var action = body.get_meta("action")
if action == "hide":
return
if action == "patrol":
# var c = get_meta("hidden_character")
activate_l_door(true)
activate_r_door(true)
$Timer.start(4.0)
func body_exit(_body):
pass
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass