Sviluppo su LZDoom, ovvero di come imparare ad amare le engine altrui


Cos'è LZDoom?

LZDoom è un source port della id Tech 1, ovvero l'engine di Doom del 1993. 


Se volete farvi una cultura sui port di Doom, cliccate qua 

Questo particolare port è focalizzato sul dare funzionalità di modding molto avanzate, in modo da poter letteralmente stravolgere il gameplay di Doom e personalizzarlo fino al più piccolo particolare.

Con dei semplici accorgimenti, è possibile avere una base di sviluppo per creare uno sparatutto in prima persona vecchia scuola. Certo, poi devi progettarlo e svilupparlo per davvero. E soprattutto bisogna avere ben chiaro come funziona Doom dietro le quinte. 


Potete trovare questo meraviglioso librone qui . La id Tech 1 non avrà più segreti.

Si, ma cosa vuoi farci?

Nella pratica, io volevo iniziare ad approcciare LZDoom per capirne i funzionamenti interni nell'ottica di un grosso progetto che mi piacerebbe sviluppare.

Come prima cosa, però, volevo fare un giochino molto semplice per iniziare a impratichirmi con tutto l'ecosistema di software, scripting e tool vari che ci girano intorno. Roba molto commentata e molto basilare in modo da avere un bel caso studio e progetto documentato e commentato

In pratica si gioca in prima persona un tizio che è stato rapito da un culto di satanisti e chiuso nei sotterranei dell'edificio che fa da quartier generale dei fanatici. Dovrà scappare dalla struttura, mentre un demone appena uscito dall'inferno lo inseguirà. Insomma, qualcosa sulla falsariga di 3d Monster Maze  ma sviluppato in LZDoom


Resident Evil spostati proprio

WAD, pk3, ZScript e altri nomignoli

D'ora in poi darò per scontato che conosciate un minimo il motore originale del gioco, il suo funzionamento. Non ho voglia di spiegarvi le basi del funzionamento della id Tech 1, che sono comunque facilmente reperibili online. Pe farla molto breve, LZDoom utilizza un
  • WAD: file di archivio specifico della id Tech 1. Veniva usato per contenere tutti gli asset e i livelli del gioco, rispettando una suddivisione ben precisa tra i byte dei dati in esso contenuti (lump). Noi lo useremo solo per le mappe.
  • .pk3: file di archivio che se non sbaglio è usato in Quake, che la cui engine è la id Tech 2. È semplicemente un archivio .zip ma con estensione diversa. Questo tipo di file è supportato da LZDoom e sarà quello che utilizzerò io.
  • ZScript: un linguaggio simile al C++ che è usato da ZDoom per descrivere e gestire tutti gli aspetti e gli elementi del gioco. Sfruttando l' ereditarietà e le callback messe a disposizione dall' engine è possibile creare mod altamente personalizzate di Doom, o addirittura creare nuovo classi da zero. Ne parlerò più approfonditamente nei prossimi post relativi a ZDoom, dove probabilmente parlerò di questa guida, che sembra molto sugosa.

file ".lmp" e di come amare i censimenti

I file .lmp servono a censire ogni entità, asset o setting di un particolare archivio. Ricoprono la funzione dei lump, citati nel paragrafo precedente come suddivisione interna delle WAD. 

Questi file mi avevano causato alcuni grattacapi inizialmente, ma una volta che ho capito la loro funzionalità, mi sono accorto che non sono nulla di trascendentale. 

Nella mia testa Java-Spring-centrica sono diventati molto simili ai file xml dove vengono censiti i bean.

Nomenclature Sprite meccanizzate

Gli Sprite delle entità devono avere una nomenclatura ben precisa, che ha questo formato:

XXXXFA

Dove XXXX è un nome a piacere, F indica il frame d'animazione (l'engine supporta un numero di frame massimi pari a 29: tutte le lettere dell' alfabeto e i simboli [ , ^ e ] ). Il dato A invece va da 1 a 8 e indica una delle otto direzioni in cui lo Sprite è rivolto. LZDoom supporta 16 direzioni, mappate con il numero 9 e le lettere A e G



16 Sprite nomenclati con il metodo sopraindicato. Notare che non avendo più di un frame, la lettera dopo il nome "SKUL" è sempre "A"


Qui il risultato durante il gioco

Se invece il valore di questo dato è 0, la stessa immagine sarà mostrata indipendentemente dall'angolo in cui è mostrata l'entità. In ogni caso, ogni Sprite deve avere dei metadati che permettono all'engine di posizionarlo correttamente. Questo è fatto tramite SLADE, un tool specifico per gestire i file WAD, i lump e il suddetto offeset di ogni sprite.
 

Se non facessi questa operazione, il cagnolone qui sopra sarebbe renderizzato con coordinate sfalsate rispetto alla posizione reale.

UItimate Doom Builder 


Va che bel level editor!

Una delle cose veramente comode di lavorare con i derivati della id Tech 1 è la possibilità di ragionare in termini di "Settori", "Vertici" e "Linedefs". Qualcosa avevo già accennato qui, quando ho sviluppato un piccolo renderer per livelli basati su questi concetti. Questo è permette un modo di lavorare in un ambiente "3D" molto semplicistico per gli standard odierni. Questo lo rende, però, molto facile da imparare, e grazie alle caratteristiche di LZDoom è anche molto espandibile con feature moderne.

Tutto questo è reso possibile grazie a Ultimate Doom Builder , un potente tool per creare ed editare mappe che usano il formato supportato da Doom e tutti i suoi derivati. Per ora io mi sono limitato a imparare i fondamenti, espandendo il semplice livello template dell'archivio prototipo da cui sono partito a sviluppare. Ho aggiunto un pavimento sopraelevato e una rampa, entrambe feature che non erano supportate da Doom originale, ma lo sono in LZDoom. 

Il risultato

Il risultato è questo piccolo prototipo, la cui pagina itch.io è qua . Qui sotto, invece, trovate un video del prototipo in azione.



E il futuro?

Sicuramente dovrò impegnare del tempo per fare un minimo di design del gioco vero e proprio. Nel frattempo continuerò lo stesso a studiare e sperimentare con LZDoom, per capire come realizzare quello che il gioco prevede. Seguite i prossimi post per sapere come andrà a finire.


Commenti

Post più popolari