extends Node @onready var countdown: Label = $MenuDisplay/countdown @onready var btn_fullscreen = $MenuDisplay/btn_fullscreen @onready var btn_save_whitelist= $MenuDisplay/btn_save_whitelist var keywhitelist var keyHolddownQueue = {} const KEY_HOLDDOWN_TO_ENTER_TIME=500 #in milliseconds func _ready(): removeAssignedKeys() Gamestate.removeAllPlayers() $Timer.stop() btn_fullscreen.button_pressed=DisplayServer.window_get_mode(0)==DisplayServer.WINDOW_MODE_FULLSCREEN #toogle fullscreen switch to correct init state btn_fullscreen.button_pressed=ConfigFileHandler.get_video_setting("fullscreen") keywhitelist=ConfigFileHandler.get_keywhitelist_setting() #empty list if disabled btn_save_whitelist.disabled=keywhitelist.size()>0 #whitelist enabled, then disable save whitelist button btn_save_whitelist.visible=!keywhitelist.size()>0 print("Loaded Keywhitelist="+str(keywhitelist)) Gamestate.setColorwheelstepByPlayernum(keywhitelist.size()) #Preload players to set colors if keywhitelist.size()>0: #add whitelisted players if whitelist enabled and remove them afterwards for k in keywhitelist: Gamestate.addPlayer(k) Gamestate.removeAllPlayers() func assignKeys(): var i=0 for playerkey in Gamestate.getPlayerkeys(): InputMap.add_action(Gamestate.userinput_prefix+str(i)) var ev = InputEventKey.new() ev.keycode=playerkey InputMap.action_add_event(Gamestate.userinput_prefix+str(i), ev) i+=1 func removeAssignedKeys(): for action in InputMap.get_actions(): if action.get_basename().begins_with(Gamestate.userinput_prefix): print("Removed Action "+str(action.get_basename())) InputMap.erase_action(action) func _unhandled_key_input(event: InputEvent) -> void: var currentmsecs=Time.get_ticks_msec() if event is InputEventKey: if keywhitelist.has(event.keycode) or keywhitelist.size()<1: #is key whitelisted? if event.is_pressed() and not keyHolddownQueue.has(event.keycode) and not Gamestate.getPlayerkeys().has(event.keycode): #key just pressed and not already added keyHolddownQueue[event.keycode]=currentmsecs if event.is_released() and keyHolddownQueue.has(event.keycode): keyHolddownQueue.erase(event.keycode) if event.is_pressed() and Gamestate.getPlayerkeys().has(event.keycode): #key pressed and player already added $MenuDisplay.update_playerlist(Gamestate.players,event.keycode,"blink") func _on_timer_timeout() -> void: #Start Game print("Game starting") get_tree().change_scene_to_file("res://scenes/game.tscn") $Timer.stop() assignKeys() func _process(delta: float) -> void: var currentmsecs=Time.get_ticks_msec() for queuedKey in keyHolddownQueue: if currentmsecs-keyHolddownQueue[queuedKey]>KEY_HOLDDOWN_TO_ENTER_TIME: #and pressed long enough keyHolddownQueue.erase(queuedKey) #if keywhitelist.has(event.keycode) or keywhitelist.size()<1: #is key whitelisted? print("Key added. keycode:"+str(queuedKey)) var addedID=Gamestate.addPlayer(queuedKey) $MenuDisplay.update_playerlist(Gamestate.players,queuedKey,"explode") if addedID!=-1: #player was added if len(Gamestate.getPlayerkeys())>=1: $Timer.start() else: $Timer.stop() if $Timer.is_stopped() or $Timer.time_left>3.5: $MenuDisplay.updateCountdown(-1) #do not display countdown else: $MenuDisplay.updateCountdown(round($Timer.time_left)) #update countdown time func _input(ev): #if ev is InputEventKey and if Input.is_action_just_pressed("ui_cancel"): get_tree().quit() func _on_btn_fullscreen_toggled(toggled_on: bool) -> void: if toggled_on: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) else: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) ConfigFileHandler.save_video_setting("fullscreen", toggled_on) func _on_rounds_selection_item_selected(index: int) -> void: if not $Timer.is_stopped(): #only restart $Timer.start() func _on_map_container_map_changed() -> void: if not $Timer.is_stopped(): #only restart $Timer.start() func _on_button_pressed() -> void: if len(Gamestate.getPlayerkeys())>=1: var _playerkeys=Gamestate.getPlayerkeys() print("Keys ="+str(_playerkeys)) ConfigFileHandler.save_keywhitelist_setting(_playerkeys)