108 lines
3.3 KiB
GDScript
108 lines
3.3 KiB
GDScript
extends Reference
|
|
|
|
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
|
|
const NAME = "sleeping"
|
|
|
|
var ctx: KinematicBody = null
|
|
var hop_position: Spatial
|
|
var made_it_to_bed: bool
|
|
var model_transform: Spatial
|
|
var anim_player: AnimationPlayer
|
|
var old_model_origin: Vector3
|
|
|
|
var waiting := false
|
|
|
|
func _init(p_made_it_to_bed: bool, p_hop_position: Spatial = null):
|
|
hop_position = p_hop_position
|
|
made_it_to_bed = p_made_it_to_bed
|
|
|
|
func enter_from(state):
|
|
ctx.get_tree().call_group("on_player_sleep_listener", "on_player_sleep")
|
|
hop_position = hop_position if hop_position else ctx.get_tree().get_nodes_in_group("bed_hop_position")[0]
|
|
model_transform = ctx.get_node("model_transform")
|
|
anim_player = ctx.get_node("model_transform/node_animations")
|
|
|
|
# Pause everything but the player
|
|
ctx.get_tree().paused = true
|
|
ctx.get_node("hunger_timer").pause_mode = ctx.PAUSE_MODE_STOP
|
|
ctx.pause_mode = ctx.PAUSE_MODE_PROCESS
|
|
|
|
# Drop any carried item
|
|
if ctx.has_item():
|
|
ctx.drop_item_in_hand()
|
|
|
|
# Prepare to play animation
|
|
|
|
if made_it_to_bed:
|
|
# Slide the player to the front of the bed
|
|
old_model_origin = model_transform.global_transform.origin
|
|
var tween = model_transform.create_tween()
|
|
tween.tween_property(model_transform, "global_transform:origin", hop_position.global_transform.origin, .1)
|
|
yield(tween, "finished")
|
|
# Warp the player to the right position & orientation
|
|
model_transform.global_transform = hop_position.global_transform
|
|
else:
|
|
# Harm the player and show message
|
|
ctx.set_health(ctx.health - 1)
|
|
var node = Dialogic.start("day_end")
|
|
node.pause_mode = ctx.PAUSE_MODE_PROCESS
|
|
ctx.add_child(node)
|
|
yield(node, "timeline_end")
|
|
# Warp the player to the right position & orientation
|
|
ctx.global_transform.origin = hop_position.global_transform.origin
|
|
model_transform.global_transform = hop_position.global_transform
|
|
old_model_origin = model_transform.global_transform.origin
|
|
|
|
|
|
# Play hop animation
|
|
ctx.get_node("model_transform/DungMan/AnimationTree")["parameters/Move/playback"].travel("idle")
|
|
anim_player.call_deferred("play", "hop_into_bed")
|
|
yield(anim_player, "animation_finished")
|
|
waiting = true
|
|
|
|
# Reset the day timer
|
|
for game_manager in ctx.get_tree().get_nodes_in_group("game_manager"):
|
|
game_manager.reset_day_timer()
|
|
|
|
func exit_to(state):
|
|
ctx.pause_mode = ctx.PAUSE_MODE_INHERIT
|
|
ctx.get_node("hunger_timer").pause_mode = ctx.PAUSE_MODE_INHERIT
|
|
ctx.get_tree().paused = false
|
|
|
|
func physics_process(delta):
|
|
pass
|
|
|
|
func unhandled_input(event: InputEvent):
|
|
if not waiting:
|
|
return
|
|
if not event.is_action_pressed("action"):
|
|
return
|
|
|
|
ctx.get_tree().set_input_as_handled()
|
|
|
|
# Play hop out animation
|
|
anim_player.call_deferred("play", "hop_out_of_bed")
|
|
yield(anim_player, "animation_finished")
|
|
|
|
# Slide the player back to the front of the bed
|
|
var tween = model_transform.create_tween()
|
|
tween.tween_property(model_transform, "global_transform:origin", old_model_origin, .1)
|
|
yield(tween, "finished")
|
|
|
|
# Show message
|
|
var node = Dialogic.start("wake_up")
|
|
node.pause_mode = ctx.PAUSE_MODE_PROCESS
|
|
ctx.add_child(node)
|
|
yield(node, "timeline_end")
|
|
|
|
ctx.change_state(ctx.StateDefault.new())
|
|
|
|
func on_sleep(made_it_to_bed: bool, hop_position: Spatial):
|
|
assert(false, "shouldn't be able to sleep while sleeping")
|
|
|
|
func on_start_playing_rover_game():
|
|
assert(false, "invalid state")
|
|
|
|
func on_stop_playing_rover_game():
|
|
pass
|