Initial commit — Godot space roguelite source

- 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>
This commit is contained in:
2026-04-21 14:38:09 +02:00
commit edc40f9008
108 changed files with 10068 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
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