init
This commit is contained in:
commit
18efc36800
161 changed files with 5008 additions and 0 deletions
6
scripts/action_data.gd
Normal file
6
scripts/action_data.gd
Normal file
|
@ -0,0 +1,6 @@
|
|||
class_name ActionData
|
||||
extends Resource
|
||||
|
||||
@export var text: String
|
||||
@export var actions: PackedStringArray
|
||||
@export var duration: float
|
39
scripts/arduino_control/Vibration.cs
Normal file
39
scripts/arduino_control/Vibration.cs
Normal 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");
|
||||
}
|
||||
}
|
57
scripts/arduino_control/pulse_generator.gd
Normal file
57
scripts/arduino_control/pulse_generator.gd
Normal 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
34
scripts/crt_controller.gd
Normal 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
|
51
scripts/effects/engines.gd
Normal file
51
scripts/effects/engines.gd
Normal 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)
|
41
scripts/effects/light_face.gd
Normal file
41
scripts/effects/light_face.gd
Normal 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
21
scripts/effects/lights.gd
Normal 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
44
scripts/effects/shadow.gd
Normal 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
26
scripts/effects/shake.gd
Normal 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
14
scripts/effects/smoke.gd
Normal 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
|
39
scripts/effects/speaker.gd
Normal file
39
scripts/effects/speaker.gd
Normal 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()
|
15
scripts/effects/vignette.gd
Normal file
15
scripts/effects/vignette.gd
Normal 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
16
scripts/end_card.gd
Normal 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
16
scripts/event.gd
Normal 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()
|
4
scripts/events/dialog_event_01.gd
Normal file
4
scripts/events/dialog_event_01.gd
Normal file
|
@ -0,0 +1,4 @@
|
|||
extends Node
|
||||
|
||||
var dialogue = "hewwo... hewwo?" # Text to display.
|
||||
var time = 8 # How long it should be on screen.
|
16
scripts/events/event_01.gd
Normal file
16
scripts/events/event_01.gd
Normal 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
|
16
scripts/events/event_02.gd
Normal file
16
scripts/events/event_02.gd
Normal 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
|
15
scripts/events/event_03.gd
Normal file
15
scripts/events/event_03.gd
Normal 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
|
15
scripts/events/event_04.gd
Normal file
15
scripts/events/event_04.gd
Normal 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
|
15
scripts/events/event_05.gd
Normal file
15
scripts/events/event_05.gd
Normal 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
|
16
scripts/events/event_06.gd
Normal file
16
scripts/events/event_06.gd
Normal 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
|
16
scripts/events/event_07.gd
Normal file
16
scripts/events/event_07.gd
Normal 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
|
16
scripts/events/event_08.gd
Normal file
16
scripts/events/event_08.gd
Normal 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
|
16
scripts/events/event_09.gd
Normal file
16
scripts/events/event_09.gd
Normal 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
|
15
scripts/events/event_10.gd
Normal file
15
scripts/events/event_10.gd
Normal 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
|
15
scripts/events/event_11.gd
Normal file
15
scripts/events/event_11.gd
Normal 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
|
13
scripts/explosion_player.gd
Normal file
13
scripts/explosion_player.gd
Normal 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
72
scripts/game_flow.gd
Normal 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
188
scripts/game_manager.gd
Normal 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
24
scripts/input_tester.gd
Normal 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
12
scripts/spinner_tester.gd
Normal 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
|
68
scripts/text_typing/typer.gd
Normal file
68
scripts/text_typing/typer.gd
Normal 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
16
scripts/title.gd
Normal 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")
|
Loading…
Add table
Add a link
Reference in a new issue