extends CanvasLayer const W := 400.0 const H := 300.0 var countdown_value: int = 0 var show_countdown_flag: bool = false var score_data: Dictionary = {} var is_gameover: bool = false var blink_phase: float = 0.0 var gameover_blink: bool = true var gameover_blink_timer: float = 0.0 var is_returning: bool = false var wipe_warning: bool = false var credits: int = 0 var lives: int = 3 var wave_number: int = 1 var wave_cleared: bool = false # References to game_world for live data var game_world: Node = null # Name entry after game over var awaiting_name: bool = false var name_input: String = "" var name_saved: bool = false var _name_saved_timer: float = 0.0 var _pending_score: int = 0 var _pending_wave: int = 0 var _online_lb: Node = null func _ready() -> void: var hud_draw := Node2D.new() hud_draw.set_script(load("res://scripts/hud_draw.gd")) hud_draw.name = "HUDDraw" add_child(hud_draw) hud_draw.hud = self _online_lb = load("res://scripts/online_leaderboard.gd").new() add_child(_online_lb) func show_countdown(val: int) -> void: show_countdown_flag = true countdown_value = val func show_gameover(data: Dictionary) -> void: score_data = data is_gameover = true is_returning = false var total := int(data.get("p1_time", 0.0)) + int(data.get("p1_kills", 0)) * 50 + int(data.get("p1_wipe", 0)) if data.get("multiplayer", false): total += int(data.get("p2_time", 0.0)) + int(data.get("p2_kills", 0)) * 50 + int(data.get("p2_wipe", 0)) _pending_score = total _pending_wave = wave_number if total > 0: awaiting_name = true name_input = "" name_saved = false func _confirm_name() -> void: var n := name_input.strip_edges() if n.length() == 0: return Leaderboard.add_score(n, _pending_score, _pending_wave) if _online_lb: _online_lb.submit_score(n, _pending_score, _pending_wave) name_saved = true _name_saved_timer = 0.0 awaiting_name = false func _unhandled_input(event: InputEvent) -> void: if not awaiting_name: return if not (event is InputEventKey and (event as InputEventKey).pressed): return var phk := (event as InputEventKey).physical_keycode if phk == KEY_BACKSPACE or phk == KEY_DELETE: if name_input.length() > 0: name_input = name_input.left(name_input.length() - 1) elif phk == KEY_ENTER or phk == KEY_KP_ENTER: if name_input.strip_edges().length() > 0: _confirm_name() elif phk == KEY_ESCAPE: awaiting_name = false elif name_input.length() < 12: var uc := (event as InputEventKey).unicode if uc >= 32 and uc < 127: name_input += char(uc) get_viewport().set_input_as_handled() func _process(delta: float) -> void: blink_phase += delta gameover_blink_timer += delta if gameover_blink_timer >= 0.5: gameover_blink_timer = 0.0 gameover_blink = not gameover_blink if name_saved: _name_saved_timer += delta if _name_saved_timer > 1.5: name_saved = false if game_world and game_world.big_wipe: wipe_warning = game_world.big_wipe.is_active() and game_world.big_wipe.phase == BigWipe.Phase.COLLAPSE