Tutti i progetti
v1.1.1 / 2026Giochi

GECOWAVE: The Flux of Coscience

Un action-platformer 2D con mondo generato e co-op online.

La storia

Un action-platformer 2D sulla scia di Hollow Knight, che ho realizzato per un gruppo musicale. La storia, i personaggi e la colonna sonora sono loro. Il codice è mio da cima a fondo, dal generatore del mondo agli installer, ed è open source. Volevo capire fin dove può arrivare una persona sola con un gioco vero su uno stack web: Phaser e TypeScript nel browser, Electron attorno, e un harness che può rigiocare l'intero gioco fotogramma per fotogramma.

stanze generate, ognuna controllata da un geco simulato
1000
boss, tutti disegnati dal codice
30
ricordi che il motore gira come film
13
scenari che rigiocano il gioco fotogramma per fotogramma
200

Un mondo generato, poi giocato

Non volevo piazzare mille stanze a mano, e non volevo un generatore che sembra soltanto giusto. Ogni capitolo è scritto come una sequenza: dove succede la storia, dove vanno i boss e i segreti. Un generatore offline dispone quella sequenza in una regione di stanze, con un suo modello di quanto lontano salta il geco.

Un modello può sbagliare, quindi non ha l'ultima parola. Ce l'ha un geco simulato, con la stessa fisica del gioco, le stesse collisioni con le tile e gli stessi comandi del giocatore. Dallo spawn prova ogni camminata, caduta e salto da ogni punto in cui può stare in piedi. Una regione esce solo se l'uscita e ogni pezzo di storia sono raggiungibili e nessuna conca ti intrappola. I cancelli d'abilità si controllano due volte: una ricompensa che vedi in anticipo deve essere irraggiungibile con le abilità di quel capitolo, e raggiungibile con quelle che arrivano dopo.

spawnuscita
Il primo capitolo, 57 stanze. Dallo spawn a sinistra, ogni punto in cui il geco simulato può stare in piedi si accende nell'ordine in cui ci arriva.

Lo stesso gioco su ogni schermo

La logica va a passi fissi di 1/60 di secondo, qualunque cosa faccia il monitor. A 60, 120 o 144 Hz i salti arrivano alla stessa altezza e i combattimenti hanno gli stessi tempi, e un fotogramma lento non diventa mai un geco più veloce. Sopra c'è il movimento che il genere si aspetta: un po' di margine dopo che sei uscito da un bordo, un salto premuto leggermente in anticipo che vale lo stesso, una scivolata in cui niente ti colpisce e un colpo verso il basso che ti fa rimbalzare sui nemici.

per saltare ancora dopo aver lasciato un bordo
110 ms
in anticipo, e il salto vale lo stesso
130 ms
di scivolata in cui niente ti colpisce
170 ms

Un cast disegnato dal codice

Gli sfondi sono dipinti. Tutto quello che si muove è disegnato dal codice. Nemici, boss, personaggi e passanti escono da un piccolo kit a inchiostro: contorni tremolanti, tratteggio incrociato sul lato lontano dalla luce, puntinato. È tutto con seed, quindi una creatura viene disegnata sempre allo stesso modo. Ogni foglio ha una normal map ricavata dalla sua sagoma, così le luci del livello la modellano davvero, e uno strato emissivo che tiene gli occhi accesi al buio. Le texture sono disegnate al doppio e scalate a metà, così un boss resta nitido anche ingrandito.

Ricordi girati come film

I flashback non sono video registrati altrove. Sono piccoli film che il motore gira dal vivo partendo da un copione: un set, un'ora del giorno, un cast ai suoi segni, oggetti di scena e una lista di inquadrature. Ogni inquadratura ha una durata, una camera con la sua inquadratura e un movimento facoltativo, la profondità di campo nei primi piani e gesti al millisecondo: camminare, girarsi, annuire, passarsi un oggetto, dire una battuta, accendere uno schermo, abbassare una luce. Il film gira in una scena sua, in seppia, con le bande nere, la grana e le ombre degli attori sul muro, mentre il gioco aspetta sotto.

Un ricordo come lo gira il motore, registrato fotogramma per fotogramma.

Due giocatori, un mondo

Il co-op va su internet, peer to peer. Ho diviso l'autorità secondo quello che ogni giocatore sente di più. Il tuo geco lo decidi tu, così il tuo movimento non aspetta mai la rete. Il mondo lo decide l'host: nemici, boss, proiettili, drop, la storia e il salvataggio. Quando l'ospite colpisce qualcosa manda una richiesta, e l'host la risolve.

  1. 1

    Stretta di mano

    Le due build confrontano prima la versione del protocollo. Due build diverse non si parlano mai.

  2. 2

    Due corsie

    Storia, scelte e salvataggi viaggiano come messaggi tipati affidabili. Le posizioni viaggiano come piccoli pacchetti binari, 30 volte al secondo per ogni geco.

  3. 3

    Un po' nel passato

    L'altro giocatore è disegnato un po' nel passato, tra due stati veri, così si muove fluido anche quando i pacchetti arrivano a scatti o se ne perde qualcuno.

  4. 4

    Regole per due

    In due i nemici sono più duri. Chi cade guarda finché l'altro non accende un checkpoint, e chiunque può rientrare in una partita in corso con lo stesso codice.

Un gioco che si rigioca da solo

Un gioco così grande si rompe dove nessuno guarda. Per questo ho costruito un harness che fa girare la build vera in un browser headless, con un orologio finto e la casualità con seed: lo stesso input produce sempre la stessa partita, al bit. A ogni fotogramma una sonda registra un'impronta di tutto quello che si può osservare, dal geco e dai boss alle luci, ai suoni, all'interfaccia e al salvataggio.

Sopra ci sono 200 scenari: ogni capitolo dal suo ingresso e dal suo salvataggio, ogni finale, i combattimenti, i sistemi, nastri di tasti registrati, e un bot che gioca la campagna intera dall'inizio alla fine. Una modifica che non deve cambiare il gioco deve dare tracce identiche. Quando due tracce divergono, l'harness indica il primo fotogramma in cui si separano e la riga di codice che l'ha causato.

  • capitoli31
  • combattimento28
  • sistemi25
  • esplorazione22
  • ingressi21
  • nastri di tasti20
  • altri sistemi19
  • personaggi16
  • finali9
  • altri 4 tipi9
scenari
200
delle righe di codice eseguite da loro
95,6%
fotogrammi nel giro del bot sulla campagna
92.311
Tutto il corpus, diviso per quello che ogni scenario gioca.

Fuori su tre sistemi

Il gioco è impacchettato con Electron e compilato in modo nativo su ogni sistema operativo. Un tag di versione fa compilare in CI l'installer per Windows, l'immagine disco per macOS e l'AppImage per Linux, e li pubblica come release. È lì che porta il link di download qui sopra.

Galleria

GECOWAVE: The Flux of Coscience · 1
GECOWAVE: The Flux of Coscience · 2
GECOWAVE: The Flux of Coscience · 3
GECOWAVE: The Flux of Coscience · 4
GECOWAVE: The Flux of Coscience · 5
GECOWAVE: The Flux of Coscience · 6

Vuoi qualcosa del genere?

Posso costruire la stessa cosa per il tuo prodotto.

Raccontami cosa hai in mente. Ricevi una risposta in giornata, con uno scope e dei tempi realistici, non una proposta di vendita.