Commit Graph
25 Commits
Author SHA1 Message Date
Matteo Benedetto b08ac8c6a1 Add Linux ARM64 preset, Raspberry Pi 5 docs and remote zip fetcher
- export_presets.cfg: new "Linux ARM64" preset (arch arm64, embedded PCK,
  ETC2/ASTC textures, S3TC/BPTC off since the Pi 5 V3D driver lacks it).
- tools/zipfetch.py: pull a single member out of the remote export-templates
  tpz with HTTP Range requests instead of downloading the whole 1.28 GB.
- docs/BUILD-RASPBERRY-PI.md: reproducible procedure, Pi 5 renderer
  expectations (GLES3 fallback, Forward+ downgraded to Mobile) and the
  pitfalls verified on the field.

Verified: arm64 export produced (74.094.536 B, PCK embedded at the end of the
official template); the x86_64 export from the same tree runs without missing
resources.
2026-10-24 16:08:32 +02:00
Matteo Benedetto 323a7cdbae Leaderboard attiva di default, senza configurazione
La classifica globale non dipende più da un argomento: sui build desktop il client
usa il servizio pubblico DEFAULT_API_BASE (https://enne2.net/api/zombie-fps).

- scripts/leaderboard.gd: resolve_base() statica con priorità --api=<url> (test)
  → --offline/--no-api (opt-out esplicito per le partite di prova) → origine della
  pagina sul Web → servizio pubblico. Rimosso l'avviso "Classifica disattivata".
- Le suite di test (--script) restano spente a meno di un --api= esplicito, così
  nessun test può scrivere nella classifica pubblica.
- tools/test_start_screen.gd: verifica default attivo, opt-out e override;
  tools/test_rebalance_branding.gd: suite di test senza invii.
- docs/HIGHSCORES.md: nuova regola della base URL e diagnostica aggiornata.

Verifiche: test_start_screen 18/18 PASS con display; test_rebalance_branding
14/14 PASS; test_leaderboard.sh invariato (12 PASS, 2 FAIL preesistenti su questa
macchina anche prima della modifica).
2026-10-24 15:57:42 +02:00
enne2 4af402f8bf Add Alt+F to toggle fullscreen and window mode
New remappable action `toggle_fullscreen` (Alt+F) handled in main.gd::_input(),
so it works in the menu, during a match with the pointer captured and in the boss
sandbox; the event is marked handled so the key does not reach the rest of the game.

toggle_fullscreen() switches between WINDOW_MODE_FULLSCREEN and WINDOW_MODE_WINDOWED;
the state lives in main.fullscreen (initialised from the real window mode) instead of
querying the driver on every press, so the toggle is deterministic and testable. On
Web it is a no-op because fullscreen belongs to the page.

Desktop HUD hint updated. New tools/test_fullscreen_shortcut.gd: 8 checks (action and
key mapping, alternation, bare F inert, works mid-match without freeing the cursor).
Verified on a real display: window_get_mode 0 -> 3 -> 0.
2026-10-24 12:55:15 +02:00
enne2 cb14fd5400 Arcade/kiosk name flow, free cursor in menu and portable Linux export
Every game over unlocks the profile and frees the name, so the menu always asks
for a new player name: the field is empty at every boot, restart or game over and
the game does not start without a name (no anonymous scores). The player identity
is derived from the entered name (deterministic FNV-1a, 16 hex chars valid for the
public API) and the profile keeps the best score per name. Backend untouched.

Mouse: player._ready() captured the pointer before the menu existed, so the start
screen was not clickable. The cursor now always starts visible; the capture happens
only in player.begin_play(), called by start_game(). New `playing` flag gates Esc
and the Web click capture to the actual match.

Linux export preset: single-file x86_64 binary with the PCK embedded, no
libstdc++ dependency, official 4.7.1 template (glibc >= 2.28). Notes and the
export_presets.cfg `#`-is-not-a-comment trap documented in docs/KIOSK-ARCADE.md.

Tests: profile 30/30, start screen 15/15 (cursor free at menu, captured only in
game), boss 50/50, rebalance 14/14, touch 14 PASS, API 42/42, all other suites pass.
2026-10-24 12:50:03 +02:00
enne2 21a1d5bf79 Rename to Work-Death Balance, add mascot favicon and rebalance rifle/grenade damage 2026-10-15 17:15:16 +02:00
enne2 2606fc5cc2 Add scaling Alien Grunt boss waves and native simulation; publish Web release 2026-10-15 15:08:52 +02:00
enne2 5761e160c1 Detonate rifle grenades on impact with original Half-Life fireball 2026-10-15 14:20:07 +02:00
enne2 ae32ad9615 Classifica globale: API dei punteggi, schermata iniziale e nome memorizzato
- services/scores-api: microservizio (solo stdlib) con SQLite WAL, idempotenza per
  submission_id, limiti di frequenza e validazione; immagine Docker non-root.
- nginx: reverse proxy su /api/zombie-fps/ (stessa origine del gioco, niente CORS).
- scripts/leaderboard.gd: client HTTP con retry idempotente; su desktop la classifica
  resta disattivata senza --api=, cosi' i test non sporcano la classifica pubblica.
- scripts/player_profile.gd: nome, id anonimo e miglior punteggio in user:// e in
  window.localStorage; il nome scelto non viene piu' richiesto; riparazione dei
  profili con la stringa "null".
- scripts/start_screen.gd: menu con nome, GIOCA e classifica; la partita parte solo
  dal pulsante (via la rete di sicurezza sull'input, Invio nel campo non avvia).
- scripts/main.gd, player.gd: avvio esplicito, segnale died, nota dell'invio.
- tools: test_scores_api.py (42), test_leaderboard (14), test_player_profile (21),
  test_start_screen (10); suite esistenti adeguate all'avvio manuale.
- docs/HIGHSCORES.md + docs/WEB-DEPLOY.md aggiornati.
2026-10-13 23:26:00 +02:00
enne2 9d1988c48b docs: record the eight-window release 2026-10-13 21:21:46 +02:00
enne2 fcf298c692 Eight windows per room and random zombie entry from different windows 2026-10-13 21:21:17 +02:00
enne2 70c82df450 Noise-driven fire light rig with bounce, core, embers and glow 2026-10-11 02:26:08 +02:00
enne2 e15deef84f Add nerd glasses and the ...because he was bored... subtitle to the loading screen 2026-10-11 02:08:20 +02:00
enne2 db2b57775c Bald mascot and one-word MatGames title on the loading screen 2026-10-11 01:59:38 +02:00
enne2 4a04635f41 Replace the Godot loading screen with the Mat Games mascot on black 2026-10-11 01:51:46 +02:00
enne2 15efd03515 docs: record release retention policy after bastion cleanup 2026-10-11 01:36:18 +02:00
enne2 7893dc9149 docs: cross-check office UV conventions against goldsrc-mapping 2026-10-11 01:34:59 +02:00
enne2 b100a5bc51 Align original Half-Life office walls and ceiling with explicit room UVs 2026-10-11 01:10:39 +02:00
enne2 8a0c441af6 Add classic HUD, auto reload, furniture pathfinding and death flatline 2026-10-11 00:58:28 +02:00
enne2 d6d25fabaa Add office furniture and dim fire-lit horror atmosphere 2026-10-11 00:42:20 +02:00
enne2 d74af7b550 Add one HP per second regeneration and Half-Life starfield sky 2026-10-11 00:29:28 +02:00
enne2 f246ede94f Fix mobile restart and swipe aiming while firing 2026-10-11 00:13:06 +02:00
enne2 dee0b387ba docs: track licence — owner declares full title and authorises use 2026-10-10 23:58:39 +02:00
enne2 73a581d50a docs: record Web release 6de9bbe8915fd82e (touch controls) 2026-10-10 23:57:54 +02:00
enne2 6b2779223f Add on-screen touch controls for mobile browsers
- scripts/touch_controls.gd: full-screen layer routing multi-touch by touch
  index: floating joystick on the left half (analog move_* actions), look area
  on the right half, FIRE/GRENADE/RELOAD/JUMP buttons. Shown automatically on
  web_android/web_ios or a touchscreen; overridable with --touch/--no-touch and
  ?touch=1/?touch=0. The root Control uses MOUSE_FILTER_IGNORE on purpose: a
  STOP control swallows the first click and the Web start gate never fires.
- scripts/player.gd: touch_mode disables mouse look and pointer lock; view
  rotation moved to apply_look() shared by mouse and touch; reload and grenade
  are polled now (is_action_just_pressed) like shoot/jump, because an
  InputEventAction synthesised inside another event's dispatch does not reach
  _unhandled_input; start_reload() extracted; get_vector uses an explicit 0.2
  dead zone so the joystick keeps its full travel.
- scripts/main.gd: creates the layer when needed, accepts a screen touch as the
  start gesture (which also unlocks browser audio) and enables the layer only
  afterwards.
- tools/test_touch_controls.gd: 11 assertions (joystick movement, look
  rotation, simultaneous multi-touch, fire hold/release, reload, grenade, jump,
  detection) runnable headless and on a real display.
- docs/TOUCH-CONTROLS.md: detection rules, input model, verification.
2026-10-10 23:52:27 +02:00
enne2 956a15a525 Add industrial metal soundtrack with seamless loop
- assets/audio/music/zombie_industrial_loop.ogg: 57.60 s Ogg Vorbis loop
  generated locally with YuE2-3B on the Tesla V100 (score written for this
  track; vocals removed with HTDemucs). The loop is spliced at the track's
  structural repeat with a 0.6 s crossfade: measured seam dip <= 1.6 dB.
- scripts/main.gd: "Music" AudioStreamPlayer at -11 dB, started at boot on
  desktop and on the start click on Web (browser autoplay policy). It forces
  stream.loop at runtime because the Web staging step re-imports the OGG with
  loop=false.
- tools/test_music.gd: soundtrack test (loop, length, volume, playback,
  still playing after player death).
- docs/MUSIC.md: source, loop construction, verification, licence.
- docs/WEB-DEPLOY.md: release ab6054111f5919a8 notes.

Initial commit of the project.
2026-10-10 23:11:13 +02:00