shine-runners-test/gameManager.gd
2025-04-21 21:38:38 +10:00

204 lines
5.3 KiB
GDScript

extends Node2D
class_name GM
enum State {
prep,
game,
end
}
@export var shyguy_mode : bool
@export var autoplay_mode : bool = false
@export var max_shinies : int = 9
var player_spawns : Array[Node]
var starting_shine_spawns : Array[Node]
static var shine_spawns : Array[Node]
var players : Array[Player]
var autoplay_timer : float = 20
var autoreset_timer : float = 20
var bets_closed : bool = false
@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
@export var chime_player : AudioStreamPlayer
@export var music_player : AudioStreamPlayer
@export var win_player : AudioStreamPlayer
@export var flyover_player : AudioStreamPlayer
@export var intro_player : AudioStreamPlayer
@export var start_button : Button
@export var user_cards : VBoxContainer
@export var instructions : Label
var state : State = State.prep
var game_timer : float = 0
var elim_timer : float = 60
var shiny_spawn_timer : float = 5
var shiny_count : int = 4
var play_next_chime : float = 5
func _ready() -> void:
Twitch.load_database()
Twitch.game_node = self
player_spawns = player_spawns_nodes.get_children()
starting_shine_spawns = starting_shine_nodes.get_children()
shine_spawns = shine_nodes.get_children()
createPlayers()
spawn_shinies()
load_userboard()
Twitch.start_round()
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()
shiny.position = starting_shine_spawns[i].position
add_child(shiny)
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)
func _process(delta: float) -> void:
if (state == State.prep and autoplay_mode):
autoplay_timer -= delta
if autoplay_timer <= 0 and not bets_closed:
bets_closed = true
autoplay_timer == 0
_on_start_button_pressed()
if (state == State.end and autoplay_mode):
autoreset_timer -= delta
if autoreset_timer <= 0:
_on_reset_button_pressed()
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()
update_ui()
update_userboard()
if elim_timer < play_next_chime:
if play_next_chime > 0:
play_next_chime -= 1
chime_player.play(0.9)
func elim_players():
var lowestScore : int = 99999
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
check_win_con()
func check_win_con():
var gamers : int = 0
var winning_gamer : int = 0
for player in players:
if player.alive:
gamers += 1
winning_gamer = player.id
if gamers == 1:
music_player.stop()
win_player.play()
state = State.end
Twitch.end_round(winning_gamer)
func update_ui():
elim_timer_label.text = format_time(elim_timer, false)
game_timer_label.text = format_time(game_timer, true)
if (state == State.prep and autoplay_mode and not bets_closed):
elim_timer_label.text = "Bets close: " + format_time(autoplay_timer, false)
if (state == State.end and autoplay_mode):
elim_timer_label.text = "New round: " + format_time(autoreset_timer, false)
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)
func _on_intro_player_finished() -> void:
state = State.game
music_player.play()
for player in players:
player.lifetime = 0
player.start_engine()
instructions.text = "Bets closed!"
func _on_start_button_pressed() -> void:
flyover_player.stop()
intro_player.play()
start_button.disabled = true
func _on_reset_button_pressed() -> void:
get_tree().reload_current_scene()
func load_userboard():
for child in user_cards.get_children():
child.queue_free()
for data : PlayerData in Twitch.save.player_database:
if data.playing:
var user = load("res://twitch/user.tscn").instantiate()
user.player_data = data
user_cards.add_child(user)
func update_userboard():
#load_userboard()
pass