This commit is contained in:
Gerard Gascón 2025-04-24 17:06:24 +02:00
commit 18efc36800
161 changed files with 5008 additions and 0 deletions

6
scripts/action_data.gd Normal file
View file

@ -0,0 +1,6 @@
class_name ActionData
extends Resource
@export var text: String
@export var actions: PackedStringArray
@export var duration: float

View file

@ -0,0 +1,39 @@
using System;
using System.IO.Ports;
using Godot;
namespace MalagaJam18;
[GlobalClass]
public partial class Vibration : Node {
private static SerialPort _serialPort;
private static bool _initialized;
public static void Init(string port) {
GD.Print(port);
try {
_serialPort = new SerialPort();
_serialPort.PortName = port;
_serialPort.BaudRate = 9600;
_serialPort.Open();
_initialized = true;
}
catch (Exception e) {
GD.PrintErr(e);
}
}
public static void SendVibration() {
if (!_initialized || !_serialPort.IsOpen)
return;
_serialPort.WriteLine("#LED1ON");
}
public static void UnSendVibration() {
if (!_initialized || !_serialPort.IsOpen)
return;
_serialPort.WriteLine("#LED1OF");
}
}

View file

@ -0,0 +1,57 @@
extends Node
var comPort: String = "COM8"
var time: float
var pulseTime: float
# min ideal setup interval 0.05 and duration 0.03
@export_range(0, 0.5) var pulseInterval: float = 0.2
@export_range(0, 0.1) var pulseDuration: float = 0.03
@export var colorRect: ColorRect
var pendingPulses: float = 0
func _ready():
var arguments = {}
for argument in OS.get_cmdline_args():
if argument.find("=") > -1:
var key_value = argument.split("=")
arguments[key_value[0].lstrip("--")] = key_value[1]
else:
# Options without an argument will be present in the dictionary,
# with the value set to an empty string.
arguments[argument.lstrip("--")] = ""
var hasComPort = arguments.has("port")
if (hasComPort):
comPort = arguments["port"]
Vibration.Init(comPort)
func _process(delta):
if (time > 0):
time -= delta
if (time <= 0):
Vibration.UnSendVibration()
if (pendingPulses > 0 and pulseTime > 0):
pulseTime -= delta
if (pulseTime <= 0):
_sendPulse(pendingPulses - 1)
func shakeController(ammount: int):
_sendPulse(ammount)
var tween = get_tree().create_tween()
tween.tween_property(colorRect, "color", Color(Color.WHITE, 1), 0.05)
tween.tween_property(colorRect, "color", Color(Color.WHITE, 0), 0.05)
func _sendPulse(ammount: int):
pendingPulses = ammount - 1
time = pulseDuration
pulseTime = pulseInterval
Vibration.SendVibration()

34
scripts/crt_controller.gd Normal file
View file

@ -0,0 +1,34 @@
extends Node
class_name CRT
@export var normal_filter: Control
@export var distortion_filter: Control
var clicksNeeded: int
var distortionEnabled: bool
# Called when the node enters the scene tree for the first time.
func _ready():
normal_filter.visible = true
distortion_filter.visible = false
func _process(_delta):
if distortionEnabled and Input.is_action_just_pressed("BTN_6"):
clicksNeeded -= 1
if clicksNeeded <= 0:
disable_distortion()
func enable_distortion(clicks: int):
normal_filter.visible = false
distortion_filter.visible = true
clicksNeeded = clicks
distortionEnabled = true
func disable_distortion():
normal_filter.visible = true
distortion_filter.visible = false
distortionEnabled = false

View file

@ -0,0 +1,51 @@
extends Node
@onready var leftEngine: Sprite2D = $MotorIzquierdo
@onready var rightEngine: Sprite2D = $MotorDerecho
var leftPowerLevel: float
var currentLeftPowerLevel: float
var rightPowerLevel: float
var currentRightPowerLevel: float
@export var leftPowerSprites: Array[Texture2D]
@export var rightPowerSprites: Array[Texture2D]
@export_range(0, 2) var transitionDelta: float
func _transition(curr: float, goal: float, delta: float) -> float:
return curr + (goal - curr) * transitionDelta * delta
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
currentLeftPowerLevel = _transition(currentLeftPowerLevel, leftPowerLevel, delta)
currentRightPowerLevel = _transition(currentRightPowerLevel, rightPowerLevel, delta)
if not leftPowerSprites.is_empty():
var index = roundf(currentLeftPowerLevel * leftPowerSprites.size())
index = clamp(index, 0, leftPowerSprites.size() - 1)
leftEngine.texture = leftPowerSprites[index]
if not rightPowerSprites.is_empty():
var index = roundf(currentRightPowerLevel * rightPowerSprites.size())
index = clamp(index, 0, rightPowerSprites.size() - 1)
rightEngine.texture = rightPowerSprites[index]
func _change_left_power_level(level: float):
leftPowerLevel = level
func _change_right_power_level(level: float):
rightPowerLevel = level
func _on_left_engine_off():
_change_left_power_level(0)
func _on_left_engine_on():
_change_left_power_level(1)
func _on_right_engine_off():
_change_right_power_level(0)
func _on_right_engine_on():
_change_right_power_level(1)

View file

@ -0,0 +1,41 @@
extends Node2D
@onready var on: Sprite2D = $CaraFeliz
@onready var powerless: Sprite2D = $CaraTieso
@onready var off: Sprite2D = $CaraPanico
@export var game_manager: GameManager
var lights_out: bool
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if abs(game_manager.spinner_speed) > 0:
_on_face()
lights_out = false
elif not lights_out:
_powerless_face()
func _on_lights_out():
lights_out = true
_off_face()
func _on_face():
on.visible = true
powerless.visible = false
off.visible = false
func _off_face():
on.visible = false
powerless.visible = false
off.visible = true
func _powerless_face():
on.visible = false
powerless.visible = true
off.visible = false

21
scripts/effects/lights.gd Normal file
View file

@ -0,0 +1,21 @@
extends Node2D
@export var light1: Sprite2D
@export var light2: Sprite2D
@export var light3: Sprite2D
@export var light4: Sprite2D
# Called when the node enters the scene tree for the first time.
func _ready():
light1.visible = false
light2.visible = false
light3.visible = false
light4.visible = false
func _process(_delta):
light1.visible = Input.is_action_pressed("BTN_1")
light2.visible = Input.is_action_pressed("BTN_2")
light3.visible = Input.is_action_pressed("BTN_3")
light4.visible = Input.is_action_pressed("BTN_4")

44
scripts/effects/shadow.gd Normal file
View file

@ -0,0 +1,44 @@
extends Sprite2D
@export var powerOnCurve: Curve
@export var shutDownCurve: Curve
var time: float
@export var duration: float
@export var bubbleMask: Sprite2D
var curve: Curve
var animating: bool = false
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if (not animating):
return
time += delta
var alpha = curve.sample(clamp(time / duration, 0, 1))
modulate = Color(Color.WHITE, alpha)
bubbleMask.modulate = Color(Color.WHITE, alpha)
if (time >= duration):
animating = false
func shut_down():
time = 0
curve = shutDownCurve
animating = true
func power_on():
time = 0
curve = powerOnCurve
animating = true
func _on_lights_out():
shut_down()
func _on_lights_in():
power_on()

26
scripts/effects/shake.gd Normal file
View file

@ -0,0 +1,26 @@
extends Camera2D
@export var randomStrength: float = 30.0
@export var randomRotationStrength: float = 5.0
@export var shakeFade: float = 5.0
@export var intensity: float = 0.0
var rng = RandomNumberGenerator.new()
var shake_strength: float = 0.0
var initialPos: Vector2
func _ready():
initialPos = offset
func _process(delta):
offset = initialPos + randomOffset() * intensity
rotation = randomRotation() * intensity
func randomOffset() -> Vector2:
return Vector2(rng.randf_range(-randomStrength, randomStrength), rng.randf_range(-randomStrength, randomStrength))
func randomRotation() -> float:
return deg_to_rad(randf_range(-randomRotationStrength, randomRotationStrength))

14
scripts/effects/smoke.gd Normal file
View file

@ -0,0 +1,14 @@
extends Node2D
@export var positions: Array[Node2D]
func spawn():
var pos: Node2D = positions.pick_random()
if not pos:
return
positions.erase(pos)
var scene = load("res://scenes/smoke_particles.tscn")
var scene_instance = scene.instantiate()
add_child(scene_instance)
scene_instance.global_position = pos.global_position

View file

@ -0,0 +1,39 @@
extends Node2D
@export var sound_sources: Array[AudioStream]
@export var enabled_speaker: Sprite2D
@export var disabled_speaker: Sprite2D
func _ready():
_disable_speaker()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if (Input.is_action_just_pressed("BTN_5")):
_play_random_sound()
func _play_random_sound():
var stream = sound_sources.pick_random()
var length = stream.get_length()
SoundManager.play_sound(stream)
_enable_speaker()
if ($Timer.time_left < length):
$Timer.start(length)
func _enable_speaker():
enabled_speaker.visible = true
disabled_speaker.visible = false
func _disable_speaker():
enabled_speaker.visible = false
disabled_speaker.visible = true
func _on_timer_timeout():
_disable_speaker()

View file

@ -0,0 +1,15 @@
extends ColorRect
@export var intensity: float
# Called when the node enters the scene tree for the first time.
func _ready():
var tween = get_tree().create_tween()
tween.tween_method(_set_vignette, 0.0, 1.5, 0.5).set_trans(Tween.TRANS_LINEAR)
tween.tween_method(_set_vignette, 1.5, 0.0, 0.5).set_trans(Tween.TRANS_LINEAR).set_delay(0.5)
tween.set_loops()
func _set_vignette(value: float):
var mat: ShaderMaterial = material
mat.set_shader_parameter("vignette_strength", value * intensity)

16
scripts/end_card.gd Normal file
View file

@ -0,0 +1,16 @@
extends Control
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if Input.is_action_just_pressed("BTN_1") or \
Input.is_action_just_pressed("BTN_2") or \
Input.is_action_just_pressed("BTN_3") or \
Input.is_action_just_pressed("BTN_4") or \
Input.is_action_just_pressed("BTN_5") or \
Input.is_action_just_pressed("BTN_6"):
get_tree().change_scene_to_file("res://scenes/titile.tscn")

16
scripts/event.gd Normal file
View file

@ -0,0 +1,16 @@
extends Node
signal event_completed
signal event_failed
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta):
if (Input.is_action_just_pressed("ui_accept")):
event_completed.emit()
if (Input.is_action_just_pressed("ui_cancel")):
event_failed.emit()

View file

@ -0,0 +1,4 @@
extends Node
var dialogue = "hewwo... hewwo?" # Text to display.
var time = 8 # How long it should be on screen.

View file

@ -0,0 +1,16 @@
extends Node
# Inputs
var hold = []
var press = ["BTN_1"]
var shake = [] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [] # For hold and press true is considered a success.
var press_ok = [false]
var shake_ok = [] # For shake any value below zero is considered a success.
#Other
var dialogue = "Pulsa el botón de panico. Y mantén la dinamo girando o te quedaras sin energia."
var time = 10

View file

@ -0,0 +1,16 @@
extends Node
# Inputs
var hold = ["LJ_UP"]
var press = ["BTN_3"]
var shake = [] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [false] # For hold and press true is considered a success.
var press_ok = [false]
var shake_ok = [] # For shake any value below zero is considered a success.
#Other
var dialogue = "Ahora mantén la palanca izquierda subida y pulsa el botón de peligro!"
var time = 10

View file

@ -0,0 +1,15 @@
extends Node
var hold = []
var press = ["BTN_1", "BTN_2", "BTN_3", "BTN_4"]
var shake = ["LJ_UP", "LJ_DOWN", "LJ_LEFT", "LJ_RIGHT"] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [] # For hold and press true is considered a success.
var press_ok = [false, false, false, false]
var shake_ok = [12] # For shake any value below zero is considered a success.
#Other
var dialogue = "Pulsa los cuatro botones y menea el motor izquierdo!"
var time = 12

View file

@ -0,0 +1,15 @@
extends Node
var hold = []
var press = []
var shake = ["RJ_UP", "RJ_DOWN", "RJ_LEFT", "RJ_RIGHT"] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [] # For hold and press true is considered a success.
var press_ok = []
var shake_ok = [20] # For shake any value below zero is considered a success.
#Other
var dialogue = "Menea tambien el motor derecho!"
var time = 10

View file

@ -0,0 +1,15 @@
extends Node
var hold = []
var press = ["BTN_3"]
var shake = [] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [] # For hold and press true is considered a success.
var press_ok = [false]
var shake_ok = [] # For shake any value below zero is considered a success.
#Other
var dialogue = "Vale. Ahora pulsa el boton de crisis... el izquierdo creo. No, perdon, prueba con el derecho."
var time = 10

View file

@ -0,0 +1,16 @@
extends Node
# Inputs
var hold = ["LJ_UP", "RJ_UP"]
var press = ["BTN_2", "BTN_3"]
var shake = [] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [false, false] # For hold and press true is considered a success.
var press_ok = [false, false]
var shake_ok = [] # For shake any value below zero is considered a success.
#Other
var dialogue = "Ahora manten las dos palancas hacia arriba y pulsa los botones de crisis!"
var time = 8

View file

@ -0,0 +1,16 @@
extends Node
# Inputs
var hold = ["LJ_LEFT", "RJ_RIGHT"]
var press = ["BTN_1"]
var shake = [] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [false, false] # For hold and press true is considered a success.
var press_ok = [false]
var shake_ok = [] # For shake any value below zero is considered a success.
#Other
var dialogue = "Mueve las palancas a la izquierda y derecha, y pulsa el botón de panico!"
var time = 10

View file

@ -0,0 +1,16 @@
extends Node
# Inputs
var hold = []
var press = []
var shake = ["RJ_UP", "RJ_DOWN", "RJ_LEFT", "RJ_RIGHT"] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [] # For hold and press true is considered a success.
var press_ok = []
var shake_ok = [999] # For shake any value below zero is considered a success.
#Other
var dialogue = "Menea el motor derecho, RAPIDO!"
var time = 6

View file

@ -0,0 +1,16 @@
extends Node
# Inputs
var hold = ["LJ_UP"]
var press = ["BTN_1"]
var shake = ["RJ_UP", "RJ_DOWN", "RJ_LEFT", "RJ_RIGHT"] # Needs to be all 4 axis of a stick.
var shake_b = [] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [false, false] # For hold and press true is considered a success.
var press_ok = [false]
var shake_ok = [12] # For shake any value below zero is considered a success.
#Other
var dialogue = "Mantén la palanca izquierda arriba, menea la derecha y pulsa el boton de panico!"
var time = 10

View file

@ -0,0 +1,15 @@
extends Node
# Inputs
var hold = []
var press = []
var shake = ["LJ_UP", "LJ_DOWN", "LJ_LEFT", "LJ_RIGHT"] # Needs to be all 4 axis of a stick.
var shake_b = ["RJ_UP", "RJ_DOWN", "RJ_LEFT", "RJ_RIGHT"] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [] # For hold and press true is considered a success.
var press_ok = []
var shake_ok = [999, 999] # For shake any value below zero is considered a success.
#Other
var dialogue = "Dale a los dos motores, se nos estan rompiendo!!"
var time = 8

View file

@ -0,0 +1,15 @@
extends Node
# Inputs
var hold = []
var press = []
var shake = ["LJ_UP", "LJ_DOWN", "LJ_LEFT", "LJ_RIGHT"] # Needs to be all 4 axis of a stick.
var shake_b = ["RJ_UP", "RJ_DOWN", "RJ_LEFT", "RJ_RIGHT"] # Fill if a second stick is necessary, uses second pos in shake_ok array.
# Goals
var hold_ok = [] # For hold and press true is considered a success.
var press_ok = []
var shake_ok = [999, 999] # For shake any value below zero is considered a success.
#Other
var dialogue = "PULSALO TODO MALDITA SEA, TODO!!"
var time = 8

View file

@ -0,0 +1,13 @@
extends Node
@export var explosions: Array[AudioStream]
@export var alarms: Array[AudioStream]
func play_explosion():
var sound = explosions.pick_random()
SoundManager.play_sound(sound)
func play_alarm():
var sound = alarms.pick_random()
SoundManager.play_sound(sound)

72
scripts/game_flow.gd Normal file
View file

@ -0,0 +1,72 @@
extends Node
@onready var manager = $".."
@onready var vfx = $"../VFX"
@onready var end_card = load("res://scenes/end_card.tscn")
@export var crt: CRT
func mishap1():
var inst = manager.res_ev01.instantiate()
manager.insert_event(inst)
print("mishap 1 triggered")
func mishap2():
var inst = manager.res_ev02.instantiate()
manager.insert_event(inst)
print("mishap 2 triggered")
func mishap3():
var inst = manager.res_ev03.instantiate()
manager.insert_event(inst)
print("mishap 3 triggered")
func mishap4():
var inst = manager.res_ev04.instantiate()
manager.insert_event(inst)
print("mishap 4 triggered")
func mishap5():
var inst = manager.res_ev05.instantiate()
manager.insert_event(inst)
print("mishap 5 triggered")
func mishap6():
var inst = manager.res_ev06.instantiate()
manager.insert_event(inst)
print("mishap 6 triggered")
func mishap7():
var inst = manager.res_ev07.instantiate()
manager.insert_event(inst)
print("mishap 7 triggered")
func mishap8():
var inst = manager.res_ev08.instantiate()
manager.insert_event(inst)
print("mishap 8 triggered")
func mishap9():
var inst = manager.res_ev09.instantiate()
manager.insert_event(inst)
print("mishap 9 triggered")
func mishap10():
var inst = manager.res_ev10.instantiate()
manager.insert_event(inst)
print("mishap 10 triggered")
func mishap11():
var inst = manager.res_ev11.instantiate()
manager.insert_event(inst)
print("mishap 11 triggered")
func play_5s_shake():
if manager.event_running:
vfx.play("shake 5s")
func distort(clicks: int):
crt.enable_distortion(clicks)
func end_game():
print("Called end game.")
get_tree().change_scene_to_packed(end_card)

188
scripts/game_manager.gd Normal file
View file

@ -0,0 +1,188 @@
extends Node
class_name GameManager
@onready var grace_period: Timer = $GracePeriod
@onready var event_timer: Timer = $EventTimer
@onready var vfx = $VFX
@onready var res_ev01 = load("res://events/event_01.tscn")
@onready var res_ev02 = load("res://events/event_02.tscn")
@onready var res_ev03 = load("res://events/event_03.tscn")
@onready var res_ev04 = load("res://events/event_04.tscn")
@onready var res_ev05 = load("res://events/event_05.tscn")
@onready var res_ev06 = load("res://events/event_06.tscn")
@onready var res_ev07 = load("res://events/event_07.tscn")
@onready var res_ev08 = load("res://events/event_08.tscn")
@onready var res_ev09 = load("res://events/event_09.tscn")
@onready var res_ev10 = load("res://events/event_10.tscn")
@onready var res_ev11 = load("res://events/event_11.tscn")
@export var spinner_deadzone: float = 15 # Bad placeholder value, PLEASE TEST & FINETUNE!
@export var text_typer: TextTyper
@export var dinamo: AudioStreamPlayer
var current_event: Node = null
var event_running: bool = false
var spinner_mechanic: bool = true
var dead_spinner: bool = false
var no_energy: bool = false
var spinner_speed: float = 0
var time_since_last_motion: float = 0
signal event_complete
signal event_fail
signal lights_out
signal lights_in
signal left_engine_on
signal left_engine_off
signal right_engine_on
signal right_engine_off
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _process(delta):
time_since_last_motion += delta
if (abs(spinner_speed) > 0 and time_since_last_motion >= .2):
spinner_speed = 0
#print(spinner_speed)
if event_running:
event_process()
verify_event()
if (abs(spinner_speed) < spinner_deadzone and !dead_spinner):
grace_period.start()
if dinamo:
dinamo.volume_db = -80
dead_spinner = true
if (abs(spinner_speed) >= spinner_deadzone and dead_spinner):
grace_period.stop()
dead_spinner = false
if dinamo:
dinamo.volume_db = -10
if (no_energy):
lights_in.emit()
no_energy = false
feedbacks()
# DEBUG STUFF - REMOVE FOR RELEASE
if Input.is_action_just_pressed("DEBUG_Lock_Cursor"):
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
if Input.is_action_just_pressed("DEBUG_Unlock_Cursor"):
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
func _input(event):
if event is InputEventMouseMotion:
spinner_speed = event.get_relative().x
#print(spinner_speed)
time_since_last_motion = 0
func feedbacks():
if Input.is_action_just_pressed("LJ_UP") or Input.is_action_just_pressed("LJ_DOWN") \
or Input.is_action_just_pressed("LJ_LEFT") or Input.is_action_just_pressed("LJ_RIGHT"):
left_engine_on.emit()
print("left engine on")
if Input.is_action_just_pressed("RJ_UP") or Input.is_action_just_pressed("RJ_DOWN") \
or Input.is_action_just_pressed("RJ_LEFT") or Input.is_action_just_pressed("RJ_RIGHT"):
right_engine_on.emit()
print("right engine on")
if Input.is_action_just_released("LJ_UP") or Input.is_action_just_released("LJ_DOWN") \
or Input.is_action_just_released("LJ_LEFT") or Input.is_action_just_released("LJ_RIGHT"):
left_engine_off.emit()
print("left engine off")
if Input.is_action_just_released("RJ_UP") or Input.is_action_just_released("RJ_DOWN") \
or Input.is_action_just_released("RJ_LEFT") or Input.is_action_just_released("RJ_RIGHT"):
right_engine_off.emit()
print("right engine off")
# Change the current event to "n_event".
func insert_event(n_event: Node):
current_event = n_event
event_timer.wait_time = current_event.time
event_running = true
event_timer.start()
print("time: " + str(event_timer.time_left))
print(n_event.hold)
print(n_event.press)
print(n_event.shake)
if text_typer:
text_typer.animate_text_in(n_event.dialogue)
func check_if_held():
if current_event.hold.is_empty():
return true
var hold_ok_target = current_event.hold_ok.size()
var hold_ok_current = 0
for check in current_event.hold_ok:
if check == true:
hold_ok_current += 1
if hold_ok_current == hold_ok_target:
return true
else:
return false
func verify_event():
# Goals and progress.
var press_ok_target = current_event.press_ok.size()
var hold_ok_target = current_event.hold_ok.size()
var shake_ok_target = current_event.shake_ok.size()
var press_ok_current = 0
var hold_ok_current = 0
var shake_ok_current = 0
# Verify arrays only if they're used.
if !current_event.press_ok.is_empty():
for check in current_event.press_ok:
if check == true:
press_ok_current += 1
if !current_event.hold_ok.is_empty():
for check in current_event.hold_ok:
if check == true:
hold_ok_current += 1
if !current_event.shake_ok.is_empty():
for check in current_event.shake_ok:
if check <= 0:
shake_ok_current += 1
if press_ok_current == press_ok_target and hold_ok_current == hold_ok_target\
and shake_ok_current == shake_ok_target:
print("Success!")
event_complete.emit()
event_timer.stop()
vfx.stop()
vfx.play("RESET")
event_running = false
func event_process():
if !current_event.press.is_empty() and check_if_held():
var i = 0
for action in current_event.press:
if Input.is_action_just_pressed(action):
print(action + " was pressed")
current_event.press_ok[i] = true
i += 1
if !current_event.hold.is_empty():
var i = 0
for action in current_event.hold:
if Input.is_action_pressed(action):
current_event.hold_ok[i] = true
else:
current_event.hold_ok[i] = false
i += 1
if !current_event.shake.is_empty() and check_if_held():
for action in current_event.shake:
if Input.is_action_just_pressed(action):
current_event.shake_ok[0] -= 1
if !current_event.shake_b.is_empty() and check_if_held():
for action in current_event.shake_b:
if Input.is_action_just_pressed(action):
current_event.shake_ok[1] -= 1
func _on_grace_period_timeout():
print("Lights out!")
lights_out.emit()
no_energy = true
func _on_event_timer_timeout():
print("Failure!")
event_fail.emit()
vfx.stop()
vfx.play("RESET")
event_running = false

24
scripts/input_tester.gd Normal file
View file

@ -0,0 +1,24 @@
extends TextureRect
@onready var manager = $"../GameManager"
@export var press: bool = false
@export var hold: bool = false
@export var shake: bool = false
@export var checkpos: int = 0
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if press:
if manager.current_event.press_ok[checkpos] == true:
visible = false
if hold:
if manager.current_event.hold_ok[checkpos] == true:
visible = false
else:
visible = true
if shake:
if manager.current_event.shake_ok[checkpos] <= 0:
visible = false

12
scripts/spinner_tester.gd Normal file
View file

@ -0,0 +1,12 @@
extends TextureRect
@onready var manager = $"../GameManager"
func _ready():
pass # Replace with function body.
func _process(delta):
if manager.dead_spinner:
visible = true
else:
visible = false

View file

@ -0,0 +1,68 @@
extends Control
class_name TextTyper
signal text_typing_started
signal text_typing_finished
@export var sound: AudioStream
@export_range(0, 0.25) var speed: float = 0.02
var currentAnimTime: float
var animating: bool
@export var imageField: Sprite2D
@export var characterPool: Array[Texture2D]
@onready var text = $RichTextLabel
func _ready():
text.set_text("")
_hide_box()
func animate_text_in(text: String):
text_typing_started.emit()
self.text.visible_characters = 0
self.text.set_text(text)
_show_box()
currentAnimTime = 0
animating = true
imageField.texture = characterPool.pick_random()
func _process(delta):
if (not animating):
return
currentAnimTime += delta
if (currentAnimTime >= speed):
_show_next_character()
currentAnimTime = 0
func _show_next_character():
text.visible_characters += 1
_play_sound()
if text.visible_characters == text.get_total_character_count():
animating = false
text_typing_finished.emit()
func _play_sound():
SoundManager.play_sound_with_pitch(sound, randf_range(0.9, 1.1))
func _hide_box():
visible = false
func _show_box():
visible = true
func _on_event_complete():
_hide_box()
func _on_event_fail():
_hide_box()

16
scripts/title.gd Normal file
View file

@ -0,0 +1,16 @@
extends Node2D
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if Input.is_action_just_pressed("BTN_1") or \
Input.is_action_just_pressed("BTN_2") or \
Input.is_action_just_pressed("BTN_3") or \
Input.is_action_just_pressed("BTN_4") or \
Input.is_action_just_pressed("BTN_5") or \
Input.is_action_just_pressed("BTN_6"):
get_tree().change_scene_to_file("res://scenes/spaceship.tscn")