Abbaye des Morts 64 - Post mortem

Autore: Raffox - Pubblicato il 03-02-2019.
(© https://ready64.org - Versione Stampabile. Riproduzione Vietata.)

L'Abbaye Des Morts 64 – Post mortem

A poche settimane dalla commercializzazione di L'Abbaye des Morts 64, abbiamo chiesto ad Antonio Savona (che conosciamo già per i precedenti capolavori Planet Golf e P0 Snake) di raccontarci la sua esperienza maturata nel programmare la versione per C64 di questo nuovo platform adventure muli-schermo. Antonio non si è lasciato sfuggire l'occasione... anzi, di informazioni interessanti pare ne abbia davvero molte! Ricordiamo che la versione per C64 di L'Abbaye des Morts può essere acquistata online qui.

 


Come è iniziato

Nel giugno del 2018, mesi dopo la pubblicazione di Planet Golf e dopo una lunga pausa di disintossicazione dal Commodore 64, mi stava lentamente tornando la voglia di lavorare a un nuovo progetto, o di riprendere una delle mille cose interrotte. Il mio primo impulso è stato quello di continuare a programmare "Guy in a vest", un progetto piuttosto ambizioso (per me, almeno), che avevo iniziato molto tempo prima in collaborazione, tra gli altri, con Saul Cross. Tuttavia fu proprio quest'ultimo a consigliarmi di tenere Guy in sospeso ancora per un po', e di lanciarmi invece su qualcosa di completamente nuovo: L'Abbaye des morts 64.

Un nuovo publisher, infatti, Double Sided Games, aveva ottenuto i diritti da Locomalito per portare il gioco su Commodore 64 e Saul aveva già completato il reparto audio/video. Mancava insomma "solamente" l'implementazione del gioco. In passato le conversioni non mi avevamo mai interessato più di tanto, né da giocatore né da programmatore, ma appena ho visto la grafica che Saul aveva prodotto non ho creduto ai miei occhi e mi sono immediatamente offerto per implementare il tutto.

La mia determinazione è cresciuta ulteriormente quando ho avuto modo di giocare l'originale di Locomalito: L'Abbaye des morts, pur nella sua semplicità, è un gioco estremamente equilibrato e presenta un level design da scuola del videogioco. Questa ultima componente, in particolare, rappresenta secondo me l'aspetto più difficile da centrare, ancor più in un format abusato quale quello del platform game. Locomalito non ha commesso alcun errore ed ha creato quella che secondo me è una piccola perla di giocabilità.

Dettagli implementativi

L'Abbaye des morts 64 è un gioco molto semplice dal punto di vista tecnico. L'azione si svolge in stanze statiche, quindi non c'è alcuno scrolling di mezzo a complicare le cose. I nemici si muovono lungo pattern prefissati e gli schermi sono in media poco affollati. Inoltre il protagonista principale non ha attacchi, cosa che semplifica ulteriormente la gestione dell'interazione tra gli elementi di gioco. Per questi motivi durante l'implementazione non ho mai incontrato ostacoli insormontabili. Tuttavia neanche il più semplice dei giochi è veramente semplice da portare a compimento, almeno per me, e prima o poi qualche grattacapo si incontra sempre. Per quanto mi riguarda ci sono almeno tre aspetti interessanti che forse vale la pena citare. 

1. Il Multiplexer e la musica

L'Abbaye des morts 64 usa più di 8 sprite a schermo, e per questo ha richiesto lo sviluppo di un semplice Multiplexer, cioè una pezzo di codice che consente di lavorare con sprite "virtuali" in numero maggiore di 8, che vengono poi velocemente rimappati negli 8 sprite hardware del Commodore 64. I multiplexer sfruttano il fatto che lo schermo viene ridisegnato dal raster dall'alto verso il basso e che uno sprite fisico che è stato già utilizzato nella parte superiore dello schermo può essere spostato in basso, subito dopo essere stato visualizzato e riutilizzato. Un modo quindi per superare le limitazioni del Commodore 64 in termini di numero degli sprite fisici, consiste nel riposizionarli velocemente dando l'illusione di averne di più.

Alla base di ogni sistema di multiplexer c'è un sistema di ordinamento (sort) degli sprite fisici. I multiplexer che danno al programmatore totale libertà di posizionare gli sprite virtuali a schermo, con l'unica limitazione di non averne mai più di 8 sulla stessa linea, vengono chiamati "multiplexer generici". 

L'Abbaye des morts 64 implementa un multiplexer generico che usa un massimo di 16 sprites durante il gioco e 32 durante la schermata introduttiva per visualizzare i fulmini. Vista la semplicità del gioco e la linearità delle situazioni il sistema non ricorre a un sort completo, ma parziale. Lo schermo di gioco è diviso in 5 fasce da 32 pixel di altezza. E ognuna di queste aree può contenere 6 sprites (8 nella schermata di gioco), mentre due sprite fisici sono allocati staticamente al personaggio principale. Il sort utilizzato e un semplice bucket sort parziale, che non completa l'ordinamento vero e proprio, ma semplicemente assegna a ogni area gli sprite virtuali. All'interno di ciascuna area gli sprite fisici non vengono successivamente ordinati, come accadrebbe in un multiplexer generico.  Il bucket sort implementato, cioè, si ferma al primo passo. Una tipica situazione di gioco è visibile in figura:

Come si può vedere, partendo dall'alto verso il basso, l'ordine effettivo degli sprite dovrebbe essere 3,4,5,6,7,8,3,4,5,6,7,8, mentre invece abbiamo 3,4,5,6,8,3,7,5,4,6,7,8. Se lo schermo fosse più affollato ci sarebbero problemi, ma l'ordinamento parziale è più che sufficiente per un gioco così "tranquillo". Il grande vantaggio di questo sistema è che il sort è ultraveloce. Non che il gioco abbia bisogno di particolari ottimizzazioni, essendo molto semplice da gestire, ma essendo la memoria a disposizione poca, come vedremo in seguito, andava risparmiato codice dove possibile.

Un altro vantaggio è che, essendo i raster split fissi ed equidistanti, si possono integrare altri effetti a schermo. L'Abbaye des morts 64 trae vantaggio da questa condizione per… suonare la musica! Ciascuno dei raster split può anche eseguire il codice che riproduce la musica, e il tempo è scandito da un timer azionato da un NMI. Se l'NMI suonasse la musica direttamente ci sarebbero conflitti con il multiplexer, mentre se si suonasse con un IRQ, come accade nella maggiorparte dei giochi, l'esecuzione avverrebbe a velocità diverse su sistemi PAL e NTSC. In questo modo, invece, il multiplexer e il player audio possono convivere, utilizzando lo stesso codice, e la musica suona sempre alla stessa velocità.

 

2. Compressione

La mappa di gioco di L'Abbaye des morts è composta da sole 24 stanze. Tuttavia questo non lo rende un gioco "piccolo" dal punto di vista dei contenuti. Il gioco, nelle intenzioni del publisher, doveva essere rilasciato unicamente su Cartuccia, quindi Saul Cross, potendo contare sul largo spazio di archiviazione offerto da questi dispositivi, si è divertito a inserire tantissimi dettagli senza badare a limitazioni di sorta: Ci sono 6 Charset, circa 500 sprite, 8 musiche e ovviamente tutto il codice di gioco. C'è perfino un piccolo pezzo di audio campionato nella sequenza finale, che ruba un paio di kb. 

Quando ho visto lo stile grafico del gioco e ho letto della volontà di Locomalito di omaggiare i grandi classici Sinclair degli anni 80, ho pensato che questo spirito sarebbe stato tradito se il gioco non fosse stato reso disponibile anche su cassetta. La parte difficile è stata inserire il tutto in un solo caricamento! Il gioco sfrutta tutti i trucchi conosciuti, tipo il flip/mirroring degli sprite a runtime, e l'uso di tiles per ridurre l'occupazione di memoria della mappa. Ma anche con questi accorgimenti, il codice era semplicemente troppo per essere contenuto in memoria. Tuttavia, essendo la mappa divisa in stanze, non tutto il codice è in uso allo stesso tempo, né lo sono gli sprite o i charset, visto che ogni stanza ne utilizza solo un piccolo sottoinsieme.

Tutto questo materiale è pertanto compresso in memoria con codifica lz77 in piccoli microarchivi. Un microarchivio può contenere il codice rilocabile di un livello, uno sprite set di un nemico, un charset e così via. Il codice di inizializzazione di ogni stanza contiene una lista di componenti che vanno decompressi in memoria per eseguire quella specifica sezione di gioco e semplicemente li decomprime lasciando tutto il resto nella forma compressa.

Solo il codice comune a ogni livello, come ad esempio il sistema di controllo del personaggio principale, o la routine che suona la musica, è sempre presente in memoria in forma decompressa.  In tutto, il gioco usa 127 microarchivi su due livelli (alcuni mircoarchivi contengono altri microarchivi!). Per i più curiosi, qui c'è l'output dell'assemblatore con una descrizione sommaria dei microarchivi contenuti nel gioco e la mappa di memoria risultante. Ci sono solo 147 byte liberi!

 

3. Overlay

Come spiegato in precedenza, L'Abbaye des morts 64 usa un multiplexer per avere a disposizione più di 8 Sprites. Il personaggio principale utilizza una tecnica molto comune tra i giochi per Commodore 64 per dare più dettaglio e colore agli elementi grafici principali, chiamata Sprite Overlay. Questa tecnica consiste semplicemente nel sovrapporre ad uno sprite a colori uno monocromatico, prendendo il meglio dei due mondi. 

 Normalmente non si può abusare dello sprite overlay per non sovraccaricare il multiplexer, ma, laddove possibile, lo sprite overaly migliora nettamente la resa grafica del gioco. Vista la semplicità dei pattern dei nemici in L'Abbaye des morts 64 e il sistema di compressione di cui disponevamo, abbiamo pensato di estendere questa tecnica ad alcuni elementi del fondale, per cui normalmente si usano solo caratteri.

Ove possibile, quindi, abbiamo utilizzato una combinazione di sprite e caratteri.  La stanza del drago ne è un esempio ben rappresentativo, molti elementi del fondale, interattivi e non, sono arricchiti da qualche sprite. Svariati dettagli del drago stesso o la leva che apre la prima delle porte del gioco.
 

Alcune Curiosità

1. La scommessa (persa)

Prima di iniziare l'implementazione vera e propria ho cercato non solo di giocare l'originale il più possibile, ma anche di documentarmi su curiosità e retroscena relativi alla sua concezione.

Locomalito ha ideato il gioco durante una vacanza nel sud della Francia, in quella che una volta era la Contea di Linguadoca, uno dei luoghi in cui, nel dodicesimo secolo, si diffuse il Catarismo. Passeggiando lungo le vie dei castelli catari, l'autore ha sviluppato lentamente il concept e ha deciso di implementarlo in forma di omaggio ai vecchi capolavori ZX Spectrum realizzati nei primi anni 80 da Matthew Smith. Il gioco, pertanto, simula le limitazioni grafiche e sonore del computer di casa Sinclair, sebbene si prenda la "licenza poetica" di girare a 60 frame al secondo invece di 50. 

Ancora più interessante per me fu la sfida che Locomalito lanciò a se stesso: implementare il gioco in sole due settimane. Mi chiesi se era possibile fare la stessa cosa nel portarlo su Commodore 64, considerando che sia la grafica che il sonoro erano praticamente ultimati e c'era solo bisogno di programmarlo. La mia speranza era che questo vantaggio fosse sufficiente a bilanciare l'handicap della programmazione su Commodore 64, che è certamente più onerosa dello sviluppo di un gioco con GameMaker, tool utilizzato da Locomalito, così decisi di far mia la sua sfida, con qualche piccolo aggiustamento. Quantificai il tempo totale di sviluppo in 200 ore effettive (due ipotetiche settimane da almeno 14 ore di lavoro al giorno), che avrei spalmato nei mesi a venire, nel mio tempo libero, per venire incontro alle esigenze del mio vero lavoro.

Questa scommessa mi ha costretto a modificare radicalmente il mio approccio alla programmazione. Solitamente scrivo codice per C64 nel caos più assoluto, senza darmi alcuna priorità che non sia quella di divertirmi con quello che sto facendo in quel preciso momento. Il completamento di un gioco è quasi un effetto collaterale di questo processo, e in un certo senso è un risultato che quasi mi sorprende, visto il modo in cui avviene.

Con L'Abbaye des morts 64 ho impostato lo sviluppo secondo canoni più convenzionali, dandomi delle priorità e delle scadenze, affrontando il progetto come un vero e proprio lavoro. Ho anche cercato di pianificare il tutto su 150 ore, comprensive di testing, riservando 50 ore agli imprevisti che sicuramente si sarebbero verificati. 

Dopo circa 50 ore di sviluppo il gioco è arrivato a una versione funzionante end-to-end, con tutta la mappa esplorabile e alcuni nemici statici in posizione.  Dopo 120 ore avevo il gioco completo di intro, sequenze finale, oggetti e nemici in posizione, boss di fine livello, pergamene e altri oggetti interattivi.

Quando ho mandato la prima beta giocabile ai tester, che erano al corrente della scommessa, l'intero team era convinto che ce l'avrei fatta in scioltezza. Ovviamente il diavolo sta nei dettagli e gli ultimi ritocchi, il debugging e il tuning della difficoltà hanno richiesto tantissimo tempo e una riscrittura quasi totale di larghe porzioni di codice. Alla fine il gioco ha richiesto circa 240 ore "documentate" di coding effettivo.
Provaci ancora, Tony…

 

2. La stanza segreta

L'Abbaye des morts 64 contiene un minigioco che non figura nella versione originale di Locomalito. Trattandosi di un porting ufficiale, non mi è stato consentito di aggiungere stanze o di modificare più di tanto il design originale, ma ho chiesto e ottenuto di poter inserire un easter egg, cosa a cui tenevo particolarmente perché cerco sempre di farlo in tutte le mie produzioni.

Visto il pochissimo spazio a disposizione, piuttosto che implementare un arcade totalmente avulso dal gioco principale, come ho fatto in Planet Golf ho pensato di sfruttare gli asset grafici già presenti nel gioco e di creare un endless runner integrato nell'ambiente principale sotto forma di stanza nascosta. Accedendo quest'area il nostro eroe può correre sotto un cielo stellato alla ricerca di vite extra da poter utilizzare nel gioco vero e proprio.

Grazie al "trucco" del riutilizzo di parte delle risorse del gioco vero e proprio, questo Easter Egg ha richiesto solo poco più di un Kb. 

Chi di voi riuscirà a scovarlo per primo?

3. La protezione

Oggi come negli anni 80, tutti i giochi finiscono per essere "crackati". Gli sviluppatori un tempo cercavano di combattere la pirateria, ma oggi questo non ha alcun senso, visto che nessuno programma giochi per un tornaconto economico. La pirateria oggi è una componente "folkloristica" della scena e molti sviluppatori la tollerano mentre altri addirittura la incoraggiano, in una sorta di sublimazione dell'effetto nostalgia! Quest'ultimo, neanche a dirlo, è il mio caso: ogni volta che rilascio qualcosa non vedo l'ora di vedere chi e come finirà con il piratarla per primo. E tipicamente il crack non si fa attendere più di qualche minuto, proprio perché i programmatori di oggi non cercano di ostacolare questa pratica in alcun modo. Molti crack sono, insomma, veramente elementari.

Questa volta, però, proprio per rendere omaggio ai bei tempi che furono, ho cercato di lanciare una piccola sfida ai cracker e cercare di farli divertire un po' di più, inserendo delle piccole protezioni qua e là. Non si tratta di protezioni anti-copia, che non avrebbero alcun senso (il gioco è disponibile in Digital Download quindi DEVE essere copiato), ma di protezioni anti-trainer. Volevo cioè rendere difficile aggiungere i classici trucchi per invincibilità e cose simili. 

Prendiamo ad esempio un trainer per vite infinite: Si tratta tipicamente di individuare il frammento di codice che contiene una istruzione DEC su una locazione di memoria che contiene il numero delle vite. Trovare quale sia quella giusta, tra le tante, è molto facile: basta prendere nota di tutte le istruzioni DEC, controllare quale di queste contiene un valore che è uguale al numero delle vite, verificarlo perdendo una vita e controllando che quella locazione di memoria sia stata effettivamente decrementata e infine, una volta individuata la DEC incriminata, annullarla.

Ecco quello che succede in L'Abbaye des morts

4cef  C6 19       DEC $19

Il classico trucco per annullare una dec consiste nel rimpiazzarla con una istruzione che non altera il contenuto di questo valore, per esempio BIT.

Un cracker quindi cambierà DEC $19 in BIT $19.

Questo, effettivamente, porta a vite infinite anche in L'Abbaye des morts 64. Tuttavia…

Il gioco, più avanti, cerca di capire se il proprio codice è stato alterato in quella parte e… lo rimette a posto! Questo controllo avviene in diversi punti e trovarli tutti richiede un po' di tempo. Assumiamo ora che il nostro amico cracker abbia la lista di tutti questi punti e li abbia disinnescati tutti con un meccanismo simile, cioè annullando la parte che riscrive il codice di decremento delle vite nella sua forma originaria.

La protezione sarà sconfitta, giusto?

Non proprio: il codice che implementa la protezione è contenuto all'interno del codice specifico di alcune stanze, che, come abbiamo visto, risiede in microarchivi. Tale codice è pertanto compresso, e viene decompresso in memoria solo quando serve. La compressione utilizzata per queste componenti è stata (volutamente) molto blanda, e questo significa che la protezione è ben visibile anche con il codice ancora compresso, semplicemente disassemblandolo come si fa di solito, al punto che il nostro amico cracker potrebbe pensare che non ci sia affatto compressione, e iniziare a patchare allegramente il tutto.

Alterando quel codice, pero', si ottengono delle inconsistenze nello schema di compressione dei microarchivi ed errori di CRC che fanno crashare il gioco o portano a galla dei piccoli glitch. artifatti grafici, o instabilità. È un po' come se prendeste un file zip e ne cambiaste dei pezzi a caso, sperando poi di poterlo unzippare senza problemi. L'unico modo per disinnescare completamente questa protezione, quindi, consiste nello scompattare tutte parti di codice compresso, capendo prima dove sono, alterarne il contenuto, e ricomprimerle utilizzando lo stesso schema di compressione che ho usato io, riscostruendo, nel processo, tutti i riferimenti interni del codice. Un lavoro decisamente fattibile, ma di una noia mostruosa e che non augurerei al mio peggior nemico. Sconfiggere la protezione, quindi, non è particolarmente difficile ma richiede molto tempo.

È possibile però aggirarla!

Il primo cracker che ha rilasciato una versione con trainer del gioco ha fatto proprio questo. Accortosi del fatto che l'istruzione DEC $19 veniva riscritta di tanto in tanto, la ha lasciata "in pace". Più in fondo, dopo aver completato l'animazione della morte, in un'area di codice che non viene controllata dalla mia protezione, il gioco chiama una routine che aggiorna il pannello di stato scrivendo il nuovo numero delle vite:

.C:4da2  20 7B 1F    JSR $1F7B

Ebbene, il cracker ha modificato questa istruzione in INC $0019. Quindi il gioco toglie, sì, una vita, ma subito dopo la riaggiunge. e siccome il testo nel pannello di gioco non cambia togliendo e aggiungendo una vita, la chiamata alla routine di aggiornamento diventa superflua, tutto continua come prima e, di fatto, si hanno vite infinite. Geniale!
Si potrebbe pensare di aumentare il numero delle vite invece di renderlo infinito.

Effettivamente inserire il valore 255 nella cella di memoria $19 fa sì che le vite non siano infinite ma comunque più che sufficienti a completare il gioco. L'istruzione DEC $19 rimane al proprio posto, e quindi la protezione non scatta. L'Abbaye des morts 64 ti lascia effettivamente giocare, ma verso gli ultimi livelli una seconda protezione si accorge anche di questo trucco e insulta il giocatore con il messaggio "cheater!", che fa bella mostra di sé nella parte inferiore dello schermo e toglie subito una vita. Il giocatore che volesse continuare a giocare, nonostante l'umiliazione, verrebbe punito comunque con il crash del gioco nell'ultima stanza! 

Una ultima protezione riguarda l'inizio da un livello qualunque. È molto facile ingannare il gioco alterando la locazione di memoria che contiene il numero della stanza in cui ci si trova. Si potrebbe pensare di arrivare così molto facilmente all'incontro con Satana, il boss finale. Tuttavia il gioco, sempre in una porzione di codice compressa, e quindi difficilmente hackerabile, controlla che il giocatore sia effettivamente passato attraverso tutte le stanze precedenti. Se si accorge della "scorciatoia", fa ripartire ancora una volta, implacabilmente, il messaggio "Cheater!".

Tutte queste protezioni sono destinate a cadere miseramente non appena qualcuno avrà voglia di perderci un po' di tempo, e sono state messe in piedi solo per divertimento. Per il momento, però, a parte il primo crack con vite infinite, ottenuto tramite il geniale trucco dell'incremento postumo del contatore, non esistono altri crack di L'Abbaye des morts 64 perfettamente funzionanti. 

Il cracker originale mi ha contattato per ringraziarmi e dirmi che il lavoro su L'Abbaye des morts 64 ha richiesto "addirittura alcune ore" (sic), e che per questo il cracking team si è divertito parecchio. "Alcune ore"… Che dire? Sono soddisfazioni!