channel-switcher/game_logic.gd
2025-05-23 21:36:52 +10:00

134 lines
4.1 KiB
GDScript

extends Control
enum Gamemode{
Story,
Endless
}
#mode settings
signal game_over(score : int)
@export var max_lives = 3
@export var lives = 3 #debug
@export var platformer_game : PackedScene
@export var games : Array[PackedScene]
@export var zoom_speed : float = 0.5
@export_group("Channel Rules")
@export var target_channels : float = 1
@export var channel_growth_per_min : float = 0.8
@export_group("Node References")
@export var main_camera : Camera2D
@export var outer_channels : Array[Channel]
@export var main_channel : Channel
@export var game_over_screen : CanvasLayer
@export var game_over_score : Label
var gamemode : Gamemode = Gamemode.Story #will be set by manager/menu option
var zooming_out : bool = false
var gameplay : bool = false # becomes true when the game starts
var score : int = 0
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
GameManager.zoom_out_signal.connect(zoom_out)
GameManager.prepare.connect(get_ready)
GameManager.gaming.connect(start_game)
GameManager.channel_win.connect(rec_channel_win)
GameManager.channel_lose.connect(rec_channel_lose)
if(gamemode == Gamemode.Story):
main_camera.zoom = Vector2(3.1,3.1)
main_channel.start_specific_channel(platformer_game)
if(GameManager.are_we_skipping_intro):
zooming_out = true
main_camera.zoom = Vector2(1,1)
GameManager.skip_intro.emit()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
#if(Input.is_action_just_pressed("ui_down")):
#main_channel.start_channel() #so this works
if(zooming_out):
var zoom_amount : float = clampf(main_camera.zoom.x - delta * zoom_speed,1, 3.1 ) #was 4?
main_camera.zoom = Vector2(zoom_amount,zoom_amount)
else:
var zoom_amount : float = clampf(main_camera.zoom.x + delta * zoom_speed,1, 3.1 ) #was 4?
main_camera.zoom = Vector2(zoom_amount,zoom_amount)
if(gameplay):
game_loop(delta)
func zoom_out():
zooming_out = true
func zoom_in():
zooming_out = false
func get_ready():
for channel in outer_channels:
channel.channel_mode = channel.Mode.Static
func start_game():
gameplay = true
main_channel.start_channel()
func game_loop(delta : float):
target_channels += channel_growth_per_min * (delta/60)
var online_channels : Array[Channel]
var offline_channels : Array[Channel]
# sort all the channels into online and offline
#if main_channel.channel_mode == Channel.Mode.Online:
if main_channel.platformer_online:
online_channels.append(main_channel)
else:
offline_channels.append(main_channel)
for channel in outer_channels:
if(channel.channel_mode == Channel.Mode.Online):
online_channels.append(channel)
elif(!channel.dead_channel):
offline_channels.append(channel)
# if i need to switch a channel online, then pick one and run tis start channel method
#print("Online Channels: " + str(online_channels.size()))
if(online_channels.size() < target_channels and offline_channels.size() > 0):
var random_channel_number = randi_range(0, offline_channels.size()-1)
var random_game = randi_range(0, games.size()-1)
offline_channels[random_channel_number].start_channel()
#if(offline_channels[random_channel_number] != main_channel):
#offline_channels[random_channel_number].start_channel()
#picking a random game is cool but we cant have two of the same!
#offline_channels[random_channel_number].start_specific_channel(games[random_game])
#else:
#main_channel.start_channel()
func rec_channel_win():
score += 1
GameManager.send_update_data(score, lives)
func rec_channel_lose():
lives -= 1
GameManager.send_update_data(score, lives)
if(lives <= 0):
game_over_gg()
func game_over_gg():
zoom_in()
GameManager.send_game_over()
if gameplay:
game_over_score.text = str(score)
gameplay = false
main_channel.end_channel()
for channel in outer_channels:
channel.make_offline()
game_over_screen.show()
func _on_play_again_button_pressed() -> void:
GameManager.are_we_skipping_intro = true
get_tree().change_scene_to_file("res://game_scene.tscn")
func _on_return_to_menu_pressed() -> void:
get_tree().change_scene_to_file("res://menu/menu.tscn")