2025-04-20 16:15:26 +10:00
|
|
|
extends Node2D
|
2025-04-20 17:31:40 +10:00
|
|
|
class_name GM
|
2025-04-20 16:15:26 +10:00
|
|
|
|
2025-04-20 20:52:48 +10:00
|
|
|
enum State {
|
|
|
|
|
prep,
|
|
|
|
|
game,
|
|
|
|
|
end
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-20 16:15:26 +10:00
|
|
|
@export var shyguy_mode : bool
|
2025-04-20 17:31:40 +10:00
|
|
|
@export var max_shinies : int = 9
|
2025-04-20 16:15:26 +10:00
|
|
|
var player_spawns : Array[Node]
|
|
|
|
|
var starting_shine_spawns : Array[Node]
|
2025-04-20 17:31:40 +10:00
|
|
|
static var shine_spawns : Array[Node]
|
2025-04-20 16:15:26 +10:00
|
|
|
var players : Array[Player]
|
|
|
|
|
|
|
|
|
|
@export_group("Node References")
|
|
|
|
|
@export var player_spawns_nodes : Node2D
|
|
|
|
|
@export var starting_shine_nodes : Node2D
|
|
|
|
|
@export var shine_nodes : Node2D
|
|
|
|
|
@export var scorecard_container : VBoxContainer
|
|
|
|
|
@export var elim_timer_label : Label
|
|
|
|
|
@export var game_timer_label : Label
|
2025-04-20 17:31:40 +10:00
|
|
|
@export var chime_player : AudioStreamPlayer
|
2025-04-20 20:52:48 +10:00
|
|
|
@export var music_player : AudioStreamPlayer
|
2025-04-20 21:24:12 +10:00
|
|
|
@export var win_player : AudioStreamPlayer
|
|
|
|
|
@export var flyover_player : AudioStreamPlayer
|
|
|
|
|
@export var intro_player : AudioStreamPlayer
|
|
|
|
|
@export var start_button : Button
|
2025-04-20 16:15:26 +10:00
|
|
|
|
2025-04-20 20:52:48 +10:00
|
|
|
var state : State = State.prep
|
2025-04-20 16:15:26 +10:00
|
|
|
var game_timer : float = 0
|
|
|
|
|
var elim_timer : float = 60
|
2025-04-20 17:31:40 +10:00
|
|
|
var shiny_spawn_timer : float = 5
|
|
|
|
|
var shiny_count : int = 4
|
|
|
|
|
var play_next_chime : float = 5
|
|
|
|
|
|
2025-04-20 16:15:26 +10:00
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
|
player_spawns = player_spawns_nodes.get_children()
|
|
|
|
|
starting_shine_spawns = starting_shine_nodes.get_children()
|
|
|
|
|
shine_spawns = shine_nodes.get_children()
|
|
|
|
|
createPlayers()
|
|
|
|
|
spawn_shinies()
|
|
|
|
|
|
|
|
|
|
func createPlayers():
|
|
|
|
|
for i in range(8):
|
|
|
|
|
spawnPlayer(i)
|
|
|
|
|
|
|
|
|
|
func spawnPlayer(id : int):
|
|
|
|
|
var player : Player = load("res://player.tscn").instantiate()
|
|
|
|
|
var scorecard : Scorecard = load("res://scorecard.tscn").instantiate()
|
|
|
|
|
|
|
|
|
|
player.id = id
|
|
|
|
|
scorecard.id = id
|
|
|
|
|
if(shyguy_mode):
|
|
|
|
|
player.id += 12
|
|
|
|
|
scorecard.id += 12
|
|
|
|
|
player.position = player_spawns[id].position
|
|
|
|
|
player.scorecard = scorecard
|
|
|
|
|
player.setup()
|
|
|
|
|
players.append(player)
|
|
|
|
|
add_child(player)
|
|
|
|
|
scorecard_container.add_child(scorecard)
|
|
|
|
|
|
|
|
|
|
func spawn_shinies():
|
|
|
|
|
for i in range(4):
|
|
|
|
|
var shiny = load("res://shiny.tscn").instantiate()
|
2025-04-20 17:31:40 +10:00
|
|
|
shiny.position = starting_shine_spawns[i].position
|
2025-04-20 16:15:26 +10:00
|
|
|
add_child(shiny)
|
|
|
|
|
|
2025-04-20 17:31:40 +10:00
|
|
|
func spawn_new_shiny():
|
|
|
|
|
var shiny = load("res://shiny.tscn").instantiate()
|
|
|
|
|
var ranPos = randi_range(0,shine_spawns.size()-1)
|
|
|
|
|
shiny.position = shine_spawns[ranPos].position
|
|
|
|
|
shiny_spawn_timer = 5
|
|
|
|
|
shiny_count += 1
|
|
|
|
|
add_child(shiny)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-20 16:15:26 +10:00
|
|
|
func _process(delta: float) -> void:
|
2025-04-20 20:52:48 +10:00
|
|
|
if(state == State.game):
|
|
|
|
|
elim_timer -= delta
|
|
|
|
|
game_timer += delta
|
|
|
|
|
shiny_spawn_timer -= delta
|
|
|
|
|
if(shiny_spawn_timer<=0 and shiny_count < max_shinies):
|
|
|
|
|
spawn_new_shiny()
|
|
|
|
|
if(elim_timer <= 0):
|
|
|
|
|
elim_players()
|
2025-04-20 16:15:26 +10:00
|
|
|
update_ui()
|
2025-04-20 17:31:40 +10:00
|
|
|
|
|
|
|
|
if elim_timer < play_next_chime:
|
|
|
|
|
if play_next_chime > 0:
|
|
|
|
|
play_next_chime -= 1
|
|
|
|
|
chime_player.play(0.9)
|
|
|
|
|
|
|
|
|
|
func elim_players():
|
2025-04-20 21:24:12 +10:00
|
|
|
var lowestScore : int = 99999
|
2025-04-20 17:31:40 +10:00
|
|
|
var highestScore : int = 0
|
|
|
|
|
for player in players:
|
|
|
|
|
if player.score < lowestScore and player.alive:
|
|
|
|
|
lowestScore = player.score
|
|
|
|
|
if player.score > highestScore and player.alive:
|
|
|
|
|
highestScore = player.score
|
|
|
|
|
for player in players:
|
|
|
|
|
if player.score == lowestScore and player.alive and player.score != highestScore:
|
|
|
|
|
player.alive = false
|
|
|
|
|
elim_timer = 30
|
|
|
|
|
play_next_chime = 5
|
2025-04-20 21:24:12 +10:00
|
|
|
check_win_con()
|
|
|
|
|
|
|
|
|
|
func check_win_con():
|
|
|
|
|
var gamers : int = 0
|
|
|
|
|
for player in players:
|
|
|
|
|
if player.alive:
|
|
|
|
|
gamers += 1
|
|
|
|
|
if gamers == 1:
|
|
|
|
|
music_player.stop()
|
|
|
|
|
win_player.play()
|
2025-04-20 16:15:26 +10:00
|
|
|
|
|
|
|
|
func update_ui():
|
|
|
|
|
elim_timer_label.text = format_time(elim_timer, false)
|
|
|
|
|
game_timer_label.text = format_time(game_timer, true)
|
|
|
|
|
order_scoreboard()
|
|
|
|
|
|
|
|
|
|
func order_scoreboard():
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func format_time(time : float, include_minutes : bool) -> String:
|
|
|
|
|
var minutes : int = floor(time / 60)
|
|
|
|
|
var seconds : int = time - 60*minutes
|
|
|
|
|
var millis : float = time - floor(time)
|
|
|
|
|
var millis_2dp : int = floor(millis*100)
|
|
|
|
|
if(include_minutes):
|
|
|
|
|
return str(minutes).pad_zeros(2) +":"+ str(seconds).pad_zeros(2)+"."+str(millis_2dp).pad_zeros(2)
|
|
|
|
|
else:
|
|
|
|
|
return str(seconds).pad_zeros(2)+"."+str(millis_2dp).pad_zeros(2)
|
2025-04-20 20:52:48 +10:00
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_intro_player_finished() -> void:
|
|
|
|
|
state = State.game
|
|
|
|
|
music_player.play()
|
2025-04-20 20:56:45 +10:00
|
|
|
for player in players:
|
2025-04-20 21:24:12 +10:00
|
|
|
player.lifetime = 0
|
2025-04-20 20:56:45 +10:00
|
|
|
player.start_engine()
|
2025-04-20 20:52:48 +10:00
|
|
|
|
2025-04-20 21:24:12 +10:00
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_start_button_pressed() -> void:
|
|
|
|
|
flyover_player.stop()
|
|
|
|
|
intro_player.play()
|
|
|
|
|
start_button.disabled = true
|