Read me in english! 🇬🇧

Puzzle game Godot engine

Deckfall

Trailer di Deckfall

Descrizione 📢

Deckfall è un puzzle game in prima persona, sviluppato in Godot Engine e ispirato ad un livello di Superliminal. Il giocatore si trova su una astronave sul punto di collassare e dovrà percorrere un corridoio (quasi) infinito in cerca di una via d'uscita.

Il gioco è disponibile sia su itch.io (come build) che su github (progetto completo e build)

Come giocare

Deckfall gira su Windows, macOS e Linux. Per i sistemi Windows è sufficiente scaricare e avviare il file eseguibile deckfall.exe. Per gli altri sistemi si può avviare il gioco all'interno dell'editor di Godot 4.4.1!

Avvia il gioco con l'eseguibile (Windows)

  1. Scarica l'ultima versione di dalla sezione release:
  2. Avvia il file deckfall-v1.0.exe
  3. Gioca!

Avvia il gioco dall'engine (Windows/macOS/linux)

  1. Prima scarica il motore alla versione 4.4.1 dal sito ufficiale di Godot:
  2. Scarica l'ultima versione del gioco dalla sezione release:
  3. Avvia Godot_v4.4.1 e trascina il file deckfall.zip nella finestra
  4. Premi su installa: il motore spacchetterà e caricherà automaticamente il gioco in qualche minuto.
  5. Una volta pronto, per avviare il gioco premi sul bottone play (▶️) in alto a destra, oppure premi F5 se sei su windows o Command + D se sei su macOS
  6. Gioca!

⚙️ Impostazioni

Il gioco è disponibile in italiano e in inglese, questa impostazione si trova solo nel menù iniziale e non sarà modificabile a gioco avviato. Inoltre dal menù di pausa (premi ESC) è possibile aggiustare la sensibilità del mouse e modificare il livello di qualità.

Licenze e Crediti 🏷️

Il progetto è rilasciato con diverse licenze definite nel dettaglio all'interno del file LICENSE📃. Riassumendo, le licenze si dividono in:

  1. Gioco compilato (Build)
    Siccome sono stati utilizzati assets di terze parti con varie licenze tra cui "ShareAlike", il gioco compilato (build) è distribuito con licenza di Attribuzione e ShareALike (CC BY-SA 4.0).
  2. Codice
    Gli script sono sotto Licenza MIT
  3. Asset originali
    Gli asset creati ad hoc per il progetto hanno la sola licenza di Attribuzione (CC BY 4.0).

Tutte le risorse di terze parti sono accreditate nel file CREDITS📃

Modelli 3D

Per gli elementi strutturali (muri, pavimenti, scalini, porte…) e per i dettagli (tubi, barili, monitor…) sono stati utilizzati gli asset della libreria Sci-fi "Space Station Kit" di Kenney (licenza CC0). Mentre i modelli specifici e "dinamici" come i numeri luminosi pixellati e la leva d'emergenza sono stati modellati ad hoc in Blender.

...

Stanze 🏗️

La creazione delle stanze è stata svolta direttamente all'interno dell'engine

vista sul corridoio principale Corridoio principale

finestra del corridoio principale vista corridoio principale, con il monitor degli errori e la finestra in fondo

corridoio di sinistra con porta bloccata dai detriti e indicazione luminosa EXIT che punta in quella direzione Vista sul corridoio che porta verso l'uscita di sinistra

ostacoli e detriti che fuoriescono dalla porta bloccata Ostacoli che bloccano la porta

stanza ad angolo stanza ad angolo con scale che danno verso il corridoio successivo

stanza finale priva di luce Ponte Zero, stanza finale

Musiche 📻

Colonna sonora

Per il sottofondo musicale è stato scelto il brano "A Few Jumps Away" di Arthur Vyncke selezionato attraverso il sito BreakingCopyright (licenza CC BY-SA 3.0).
Il sound elettronico e la leggera melodia al pianoforte riprende l'ambientazione sci-fi, con un ritmo ciclico tipico dei puzzle game.

Loop e musica dinamica

Il brano è stato adattato amplificando i volumi nell'introduzione e riducendoli nel ritornello, per creare un loop omogeneo e costante. Durante il menù di start e per tutto il primo livello, si riproducono in loop solo i primi 20 secondi, caratterizzati da un accompagnamento ritmato senza la melodia. Entrando nel livello successivo la musica continua nella seconda parte, con la melodia al pianoforte e lo sviluppo vero e proprio del brano.

Jingle

Durante la cutscene iniziale si può sentire un Jingle proveniente dal monitor durante il messaggio promozionale della compagnia spaziale. I brano "Crystals" di enviromaniac2 (CC0), selezionato per il suo sound estremamente allegro, completamente in contrasto con la situazione tragica e allarmante.

▶️ Ascolta il jingle! 🔵 premi per fermare

monitor che mostra il messaggio promozionale della compagnia in cui si invitano i clienti a lasciare una recensione positiva

Easter eggs e riferimenti

Graffiti

Sul muro di fronte alle scale la scritta This Way aiuta il giocatore a capire di doversi buttare di sotto per proseguire il gioco. Inoltre questa prima scritta introduce la possibilità che nel gioco esistano dei graffiti che svolgono il ruolo di suggerimento per il giocatore. graffito "this way"

Sul muro sopra la finestra da cui si vede lo spazio, è presente una frase incisa che recita "You're looking in the wrong direction". È un riferimento ad un graffito Torinese scritto su un muro di fronte alla Mole Antonelliana.

graffito nel gioco graffito originale

ATTENZIONE SPOILER! (premi per rivelare) La frase rivela la soluzione del puzzle, infatti il graffito è visibile solo dopo che il giocatore avrà sbagliato per la prima volta

Sui muri delle stanze ad angolo è riportato in tempo reale il conteggio dei tentativi del giocatore, con una incisione nello stile dei tally marks. contatore tentativi

L'omino che corre

Il segnale luminoso che indica l’uscita, mostra un omino di corsa identico a quello usato dal nodo CharacterBody3D del Godot Engine. Lo stesso omino è ripreso anche nel logo del gioco e nel segnale pavimento fragile, in cui però è raffigurato mentre precipita.

monitor che contiene l'indicazione luminosa EXIT con una freccia verso sinistra icona del Character Body 3D
menu di start

Numeri

Durante l'introduzione, il monitor mostra alcuni messaggi di errore e di pericolo e tra questi si nascondo alcuni riferimenti numerici.

monitor con scritti tre messaggi di emergenza iniziali

"…REATTORI 441 E 507"
"…PROTOCOLLO DI EVACUAZIONE 850-M"

Funzionamento

Meccanismo della soluzione

La freccia rossa indica sempre l'uscita corretta per raggiungere le stanze successiva. Tuttavia la prima porta che il giocatore guarda è sempre bloccata, mentre la seconda è sempre libera. Per vincere occorre sempre guardare per prima nella direzione opposta alla freccia.

Il modo più semplice per realizzarlo è posizionare da subito un ostacolo su entrambe le porte, non appena il giocatore ne guarda uno si rimuove immediatamente quello opposto.

Ma come si crea questo meccanismo?

In Godot Engine esiste un Nodo chiamato VisibleOnScreenNotifier3D capace di emettere un segnale quando la sua area entra o esce dal campo visivo della Camera.

Così facile? No, perché non si tratta di un vero campo visivo che tiene conto eventuali ostacoli o muri, ma di una regione tridimensionale proiettata dalla camera, anche detta Frustum View.
Quindi il Nodo VisibleOnScreenNotifier3D si considera "visibile" quando entra nel Frustum, anche se è nascosto da un muro e non può essere visto direttamente dal giocatore.

visualizzazione del Frustum Un chiaro esempio di oggetti che sono all'interno del Frustum View, ma rimangono invisibili al giocatore a causa di un ostacolo

Per risolvere questo problema basterà rilevare quando tra il giocatore ed il Nodo VisibleOnScreenNotifier3D si trova un ostacolo visivo.

Ma in che modo?

Tentativo con un Raycast3D

La scelta più immediata è quella utilizzare un nodo RayCast3D che parte dallo stipite della porta e punta costantemente verso il giocatore.

Se il raycast collide direttamente con il Body del giocatore significa che non ci sono ostacoli nel mezzo e che possiamo "fidarci" del segnale emesso dal VisibleOnScreenNotifier3D.

raycast bloccato dal muro Raycast bloccato dal muro raycast che colpisce il giocatore Raycast che colpisce il giocatore

BUG: il Raycast punta "costantemente" verso il giocatore con la funzione look_at(), e rileva le collisioni attraverso la funzione get_collider(). Questo meccanismo sembra funzionare sulla carta, ma nella pratica non è affidabile: il raycast rischia di non aggiornare la sua direzione in tempo quando il giocatore si muove molto velocemente. In fase di testing è stato provato che è possibile intravedere di sfuggita la porta senza azionare il meccanismo, rompendo di fatto la regola principale del puzzle.

Tentativo con un Area3D

Siccome le pareti della stanza e le porte sono elementi sempre fissi, il raycast idealmente diventa "utile" solo oltrepassata la linea tra porta e l'angolo del muro.
Si può quindi ottenere lo stesso meccanismo con un nodo Area3D che copre proprio questa regione. Quando il giocatore entra nella zona significa che non ci sono ostacoli tra lui e la porta e per tanto possiamo "fidarci" del VisibleOnScreenNotifier3D.

giocatore fuori dall'area giocatore dentro dall'area

Il Corridoio Infinito

Quando si "cade" dalle scale si atterra in un corridoio identico al quello di partenza, simulando una sorta di loop infinito. Tra i gradini e il pavimento c'è un Nodo Area3D che rileva quando il giocatore sta cadendo, emette un segnale e il gioco reimposta la posizione al corridoio iniziale, nello stesso punto "relativo". Si tratta infatti di due scene identiche duplicate, con un Marker3D posto di fronte alle scale. Durante la caduta si prende la posizione del giocatore rispetto questo marker e si calcola quale sarebbe la posizione partendo invece al marker del corridoio principale.

scale che danno sul corridoio successivo Scale che danno sul corridoio successivo

vista dall'alto di tutta la mappa di gioco Vista dall'alto della mappa di gioco

vista prospettica della mappa di gioco Vista prospettica della mappa di gioco

SOLE

Il sole proietta una forte luce all'interno della nave attraverso la finestra del corridoio principale. Roteando ad una velocità lenta e costante ricrea l'effetto del classico movimento di una nave in orbita.

Il sole è in realtà una combinazione di una Mesh luminosa a forma di sfera ed un Nodo SpotLight3D, ossia un nodo che proietta un cono di luce. La rotazione ha come fulcro proprio il centro della finestra. Durante questa animazione anche il cielo stellato si muove nello stesso modo e alla stessa velocità, attraverso la rotazione del parametro sky_rotation del nodo WorldEnvironment.

proiezione della luce sulla finestra mesh del sole