Tough_Crowd/godot/scenes/Tim.gd

144 lines
3.9 KiB
GDScript3
Raw Permalink Normal View History

2024-01-27 18:33:33 +00:00
class_name Comedian
2024-01-26 20:01:22 +00:00
extends Node2D
@export var move_speed = 100
@export var boundary: Boundary
@export var tim_sprite: Sprite2D
2024-01-27 12:08:34 +00:00
@export var transmitter_area: Area2D
@export var stamina: int = 100
2024-01-26 20:01:22 +00:00
2024-01-27 19:34:39 +00:00
var default_texture: Texture2D = load("res://sprites/tim_side.png")
var ducking_texture: Texture2D = load("res://sprites/tim_ducking.svg")
var last_joke: Joke
2024-01-27 18:33:33 +00:00
2024-01-28 14:16:29 +00:00
var blabla_sounds = [
2024-01-28 14:33:01 +00:00
preload("res://audio/tim_blabla_1.wav"),
preload("res://audio/tim_blabla_2.wav"),
preload("res://audio/tim_blabla_3.wav"),
preload("res://audio/tim_blabla_4.wav")
2024-01-28 14:16:29 +00:00
]
2024-01-28 14:33:01 +00:00
2024-01-26 20:01:22 +00:00
# Called when the node enters the scene tree for the first time.
func _ready():
Signals.hit_tim.connect(ouch)
2024-01-26 20:01:22 +00:00
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if $AnimationPlayer.is_playing():
return
2024-01-26 20:01:22 +00:00
if Input.is_action_pressed("move_right"):
2024-01-26 20:22:33 +00:00
tim_sprite.flip_h = true
global_position += Vector2.RIGHT * delta * move_speed
if global_position.x > boundary.get_most_right_position():
global_position = Vector2(boundary.get_most_right_position(), global_position.y)
2024-01-26 20:01:22 +00:00
if Input.is_action_pressed("move_left"):
2024-01-26 20:22:33 +00:00
tim_sprite.flip_h = false
global_position += Vector2.LEFT * delta * move_speed
if global_position.x < boundary.get_most_left_position():
global_position = Vector2(boundary.get_most_left_position(), global_position.y)
2024-01-27 11:36:06 +00:00
func _disable_buttons():
$"Joke Buttons".hide()
$"Joke Buttons".process_mode = Node.PROCESS_MODE_DISABLED
func _enable_buttons():
$"Joke Buttons".show()
$"Joke Buttons".process_mode = Node.PROCESS_MODE_INHERIT
2024-01-27 11:36:06 +00:00
2024-01-27 19:25:10 +00:00
func _on_joke_button_button_pressed(joke: Joke):
last_joke = joke
2024-01-27 19:25:10 +00:00
stamina -= joke.required_stamina
_disable_buttons()
_start_joke_for_audience()
$AnimationPlayer.play("talking")
2024-01-28 14:33:01 +00:00
$Speaker.stream = blabla_sounds[randi() % blabla_sounds.size()]
$Speaker.play()
2024-01-28 10:51:33 +00:00
func _get_targeted_audience_members(target_all: bool):
if target_all:
return _get_all_targeted_audience_members()
return _get_targeted_audience_members_in_target_area()
func _get_all_targeted_audience_members() -> Array[AudienceMember]:
var crowd = get_node("/root/IngameScene/Crowd")
return crowd.audience
func _get_targeted_audience_members_in_target_area() -> Array[AudienceMember]:
var arr: Array[AudienceMember]
2024-01-27 12:08:34 +00:00
for body in transmitter_area.get_overlapping_bodies():
var person = body.find_parent("Person")
2024-01-27 12:58:26 +00:00
if not (person is AudienceMember):
2024-01-27 12:08:34 +00:00
continue
arr.append(person)
return arr
func _start_joke_for_audience():
for person in _get_targeted_audience_members(true):
person.on_joke_start()
func _tell_joke_for_audience(joke: Joke, target_all: bool):
2024-01-28 10:51:33 +00:00
for person in _get_targeted_audience_members(target_all):
person.on_hear_joke(joke)
func _finish_joke_for_audience():
for person in _get_targeted_audience_members(true):
person.on_joke_finish()
2024-01-27 11:36:06 +00:00
2024-01-27 19:25:10 +00:00
func _on_stamina_empty():
2024-01-27 20:10:50 +00:00
get_node("../DisplayGUI").visible = false
2024-01-28 14:33:01 +00:00
2024-01-27 20:10:50 +00:00
var fade = get_node("/root/IngameScene/UI/FadeOverlay")
fade.modulate.a = fade.minimum_opacity
fade.visible = true
2024-01-28 09:47:21 +00:00
get_node("/root/IngameScene/UI/Curtain").visible = true
2024-01-28 14:16:29 +00:00
2024-01-27 20:10:50 +00:00
get_viewport().set_input_as_handled()
get_tree().paused = true
2024-01-28 14:16:29 +00:00
2024-01-27 20:10:50 +00:00
var score_overlay = get_node("/root/IngameScene/UI/ScoreOverlay")
2024-01-28 14:33:01 +00:00
score_overlay.get_node("VBoxContainer3/FinalScore").text = str(
int(get_node("/root/IngameScene/Crowd").overall_mood)
)
2024-01-27 20:10:50 +00:00
score_overlay.grab_button_focus()
score_overlay.visible = true
2024-01-27 19:25:10 +00:00
pass
2024-01-28 14:16:29 +00:00
2024-01-27 19:34:39 +00:00
func ouch():
$Sprite2D.texture = ducking_texture
2024-01-28 13:07:54 +00:00
var bottle_joke = Joke.get_bottle_joke()
_start_joke_for_audience()
2024-01-28 13:07:54 +00:00
stamina -= bottle_joke.required_stamina
await get_tree().create_timer(1).timeout
2024-01-28 13:07:54 +00:00
$Sprite2D.texture = default_texture
2024-01-28 13:07:54 +00:00
_tell_joke_for_audience(bottle_joke, true)
_finish_joke_for_audience()
2024-01-28 13:07:54 +00:00
if stamina <= 0:
_on_stamina_empty()
func _on_animation_player_animation_finished(anim_name):
_tell_joke_for_audience(last_joke, false)
_finish_joke_for_audience()
if stamina <= 0:
_on_stamina_empty()
else:
_enable_buttons()