edc40f9008
- Touch controls: direct InputEventScreenTouch in shop_ui (bypass relay) - ItemDB: static preload list instead of DirAccess scan (export fix) - All 18 items with EN localisation (name_en, desc_en, category_en) - Ship playstyles: NOVA-1 shield, INFERNO ram, AURORA agile/tank - Quasar: SMBH visual, jet boost, merge, push, BH-eating - Atlas & UI text updated EN+DE Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
102 lines
3.0 KiB
GDScript
102 lines
3.0 KiB
GDScript
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
|