Mappy, il gioco da sala Namco del 1983, adesso gira sul Commodore 64. È un port non ufficiale e gratuito, e stavolta il C64 liscio non basta: serve una REU da 1 MB, l'espansione di memoria di Commodore, vera o emulata.
Perché la REU. Per far scorrere la casa a sessanta immagini al secondo servono due schermi, e quelli più il programma riempiono quasi tutti i 64 KB. Le sedici case, le musiche, le schermate e il round bonus stanno nella REU, che li copia in memoria da sola, circa dieci volte più in fretta del processore.
Fedele all'arcade. Il motore segue le regole del gioco originale ed è stato confrontato con più di mille registrazioni fatte nell'emulatore MAME. Ogni difetto segnalato dai collaudatori l'ho cercato fotogramma per fotogramma in VICE.
Nella pagina del gioco ci sono un video e un articolo che raccontano tutto, con i grafici. Si scarica da itch.io. Grazie ad AlexNinja71 per i collaudi.
Due versioni in due giorni, e cambiano il gioco sul serio.
La 1.1 rifà tutto il finale di tappa. Prima la volante arrivava, ti stava addosso sette secondi e passava: troppo morbido, e me l'hanno detto i giocatori. Adesso la strada si svuota, compare la scritta HIT POLICE 3 TIMES AND RUN AWAY! e hai dieci secondi. Appoggiarsi non basta: la volante va caricata. Lei lampeggia di rosso e ti sterza addosso; se la schivi slitta, e quello è il momento per colpirla. Tre colpi e si distrugge, e solo allora compare il traguardo. Se non ce la fai ti prendono e perdi un'auto.
La 1.1.1, il giorno dopo, ha insegnato al traffico a stare in strada. I collaudatori dicevano che le altre auto si schiantavano da sole, e avevano ragione: sceglievano la corsia a caso senza accorgersi dei restringimenti, e a quella velocità bastava una ruota sull'erba. Adesso guardano la strada davanti, rallentano prima delle curve strette e si fermano davanti all'acqua. Il numero è netto: le auto che si schiantavano da sole sono passate da 76 su 167 a 12 su 189.
C'è anche la versione NTSC, per le macchine nordamericane: prima il gioco andava del venti per cento più veloce e la musica era stonata.
Una domanda che arriva spesso quando si parla di Ruote Fumanti: ma lo scrivi su un Commodore 64? No. Oggi un gioco per C64 si scrive sul Mac, si prova in un emulatore, e il C64 vero, se c'è, serve come prova finale. Gli strumenti che servono sono pochi, gratuiti, e quasi tutti si installano con un comando solo. Li ho messi in fila in un tutorial nuovo: come si fa un gioco per Commodore 64 su un Mac.
È diviso in tre livelli. Per cominciare bastano quattro cose: VS Code per scrivere, ACME per assemblare, Exomizer per comprimere e VICE per provare. Per un gioco vero si aggiungono Python per generare i dati, make e Git, e gli editor per sprite, caratteri e musica. Per sapere che funziona, e non solo che sembra funzionare, servono una CPU 6502 che gira dentro Python, un emulatore pilotato da script che guida il gioco e conta i fotogrammi persi, e alla fine un secondo emulatore e un C64 vero.
Le schermate sono quelle vere del lavoro su Ruote Fumanti: il sorgente aperto sulla routine che fa scorrere la strada, la compilazione in cui 61 KB di gioco diventano un file da 24, gli sprite del salto in Spritemate, le prove automatiche dei tasti e dei motori, e il monitor di VICE che ferma il gioco in corsa.
In Ruote Fumanti la strada scende pixel per pixel cinquanta volte al secondo e non trema mai. Sembra la cosa più semplice del gioco, ed è quella che ha chiesto più ingegno, perché il Commodore 64 non ha niente di pronto per farlo. L'ho raccontata per esteso in un tutorial nuovo, come scorre la strada, e stavolta con i pezzi veri del programma, commenti originali compresi.
Dentro c'è il trucco dei sette pixel, cioè far scivolare tutto lo schermo per sette fotogrammi e copiare la strada solo all'ottavo; i due schermi usati come un blocchetto animato, uno visibile e uno su cui si lavora; la pista che in memoria non esiste e viene composta riga per riga da blocchi e mattonelle; e il momento, nel bordo in basso, in cui si gira pagina senza che si veda lo strappo.
E c'è la parte che mi piace di più, perché è stata trovata misurando e non ragionando: due istruzioni spostate dalla riga 32 a subito dopo la consegna del fotogramma hanno regalato al gioco quaranta righe in cui prima il processore aspettava, e i fotogrammi persi sono scesi dall'1,93% allo 0,11%.
Intanto il gioco è passato alla 1.0.1: in corsa M spegne la musica e F gli effetti, ognuno per conto suo, e con la musica spenta si sentono i motori, il tuo che sale con la velocità e quello dell'auto che ti passa accanto.
Un gioco nuovo per Commodore 64, e stavolta non è un test né una demo: è finito, versione 1.0.0. Si chiama Ruote Fumanti, ed è un gioco di guida vista dall'alto in otto tappe, scritto in assembler 6510 per un C64 PAL liscio, senza espansioni.
L'illustrazione di copertina. Non è una schermata di gioco: il C64 ha sedici colori e 320×200 punti, e le schermate vere sono qui sotto.
L'ispirazione viene da un classico gioco arcade che di certo tutti riconosceranno, con qualche elemento diverso. Il traffico non si sposta per farti passare: lo sorpassi, lo urti, oppure gli atterri sopra. I guadi non si aggirano, si saltano, e per staccare da terra servono novantacinque miglia orarie. Nei burroni, se non ce la fai, l'auto precipita rimpicciolendo. E negli ultimi metri di ogni tappa il traffico sparisce e arriva una volante: sette secondi uno contro uno, il salto disattivato, e l'unica via d'uscita è tenere la linea o buttarla fuori strada tu, che è anche la cosa che paga di più in tutto il gioco.
Il numero di cui vado fiero non è quante tappe ci sono, è quanto spesso la macchina non ce la fa a stare dietro al gioco. L'ho misurato in VICE con ingressi fissi e ripetibili, su tutte e otto le tappe, 9600 fotogrammi: ne perde lo 0,1%, e sei tappe su otto neanche uno. Il lavoro di ogni fotogramma finisce di solito a metà schermo, alla riga 143, e il resto del tempo la macchina aspetta il quadro dopo.
Nella scheda del gioco ci sono gli spezzoni dei guadi, dei burroni e dell'inseguimento, i comandi e il PRG da scaricare.
Fuori programma, e per una volta non è roba mia. Matteo85 è alle prime esperienze con la grafica sul Commodore 64 e mi ha mandato due disegni: un SUV e una rana. La domanda dietro era concreta, funzionano?, e a quel tipo di domanda si risponde più in fretta facendo girare i disegni che discutendone.
Così in un paio d'ore, nei ritagli di una domenica, li ho messi in strada. È venuta fuori una corsa senza fine: guidi, eviti le rane, una rana superata viva vale punti e una schiacciata costa una vita, e ne hai tre. Si accelera, si frena, si suona il clacson, e il clacson per un secondo fa scappare le rane. Non c'è traguardo. Il nome, Save The Frogs, gliel'ha dato lui.
Il pezzo interessante però non è il gioco, è quello che serviva a spiegare. Uno sprite su questa macchina si capisce molto prima vedendolo muovere che leggendone la definizione, e allora l'ho scritto per bene: gli sprite del C64, spiegati mettendoli in strada. Otto disegni che il chip video sposta da solo senza che la CPU ridisegni niente, la griglia da 24 per 21, un colore tuo più due presi in prestito da tutti gli altri sprite, i 63 byte usati dentro un blocco da 64, l'ombra che non è disegnata ma calcolata da quattro righe di codice, la trappola del nono bit che fa teletrasportare l'oggetto a metà schermo, e la cosa che conta più di tutte: perché la strada non è uno sprite.
Nel tutorial c'è anche un video di otto minuti che racconta tutto il percorso, dai pixel al gioco, coi sottotitoli in italiano, e il PRG da caricare in VICE o su una macchina vera.
Stesse dodici camere, stessi enigmi, stesso file. Quello che è cambiato è la cosa che fai fra un enigma e l'altro: camminare. Un collaudatore l'ha detta senza giri: il robot non pesava niente.
È il tipo di critica che all'inizio sembra vaga e poi si rivela la più concreta di tutte, perché una volta che vai a misurare scopri che ha una causa numerica precisa. Anzi tre.
Correva tutto il tempo. Due punti per quadro, per una figura alta ventotto punti, fanno quattro altezze e mezzo al secondo. Quella non è una camminata, è uno scatto. A quella velocità il piede toccava terra dieci volte al secondo, e non c'è disegno né suono che faccia sembrare pesanti dieci passi al secondo: qualunque falcata tu disegni, quello che si vede è un ticchettio. A terra adesso fa 1,25 punti per quadro. Sei passi al secondo invece di dieci.
Il salto invece non l'ho toccato. In aria il tetto resta due punti per quadro, e chi salta mentre cammina parte alla velocità piena. Non è un vezzo, è un obbligo: quattro blocchi di salto sono la misura su cui è costruita metà delle camere, e se il balzo si accorciasse i livelli smetterebbero di funzionare. Poi si dà il caso che sia anche giusto da guardare: una cosa pesante non passa dal passo al volo, si raccoglie e si butta.
Il ginocchio non si disegna più, si trova. La gamba vecchia aveva una lunghezza fissa: la caviglia stava cinque punti sotto il ginocchio e ci restava, sempre. Con quel vincolo il piede non poteva staccarsi da terra e il ginocchio non aveva nessun motivo di piegarsi, quindi quello che rimaneva era un busto che scivolava in avanti con le cosce che si muovevano appena.
Adesso la gamba è due ossa, e quello che muovo è il piede, non gli angoli. Per metà del ciclo il piede è inchiodato al pavimento mentre il corpo gli passa sopra; per l'altra metà vola avanti e si alza, con il tallone che parte prima della punta. Il ginocchio non è un numero che scrivo: è, fra le due posizioni possibili, quella che userebbe un ginocchio vero, cioè quella che punta in avanti, e si piega di quanto serve perché la gamba non si allunga. Il corpo cala di due punti quando i piedi sono lontani, che è anche quello che permette alla gamba di arrivare fin lì, ed è quello che fa una cosa pesante dove scarica il peso.
E i piedi non pattinano più. Questo era il difetto vero, ed era misurabile: la falcata disegnata si apriva di sei punti, mentre il gioco faceva avanzare il ciclo come se fosse tredici. Quei sette punti di differenza a ogni passo uscivano da qualche parte, e uscivano dal piede piantato che strisciava sul pavimento.
Il rimedio non è ritoccare i disegni: è cambiare che cosa comanda il ciclo. Adesso lo comanda la distanza percorsa e non il tempo, quindi falcata disegnata e falcata percorsa sono lo stesso numero, e il piede resta dove è stato messo a qualunque velocità.
E adesso lo senti. L'atterraggio prima era completamente muto: potevi saltare mezza stanza e toccare terra senza niente, nessun suono, niente che si muovesse. Una cosa che atterra in silenzio non pesa. Ci sono i passi, sui due quadri in cui il tallone si pianta davvero, così il suono ti dice quale disegno stai guardando; e i due piedi non suonano uguali, perché nessuno appoggia i due piedi con lo stesso peso, e soprattutto perché due rumori identici sei volte al secondo sono un sonaglio, mentre due rumori diversi sono un'andatura. C'è un tonfo all'atterraggio, lo stesso rumore tenuto molto più basso e molto più lungo: il peso che arriva tutto insieme invece che a metà per volta. La finestra sobbalza e si riassesta in sei quadri: il tonfo dice che è atterrato, il sobbalzo dice quanto pesa. E incassa: per due quadri dopo l'atterraggio la figura è disegnata un punto più in basso. Un punto si legge come gambe che assorbono; due si leggerebbero già come piedi che sprofondano nel pavimento.
Tre cose sistemate.Fuori dalla camera non c'era niente: con la finestra che sobbalza di qualche punto oltre il bordo sarebbe comparsa una fascia nera lungo un lato, quindi adesso la mappa è riempita di muro fin dove arriva, e il muro semplicemente continua. Non costa niente, perché la mappa intera viaggia dentro la cartuccia comunque. Un colpo che prende qualcosa che non è un pannello adesso lo dice: butta una scintilla, del colore del varco che stavi cercando di piazzare, e ti dice due cose in una, che la pistola ha sparato e che lì non attacca. La camera 4 ha di nuovo i pannelli: l'acido si può ancora attraversare aspettando la navetta, come insegna la stanza, oppure ci si butta dentro il varco sul ciglio e si esce dalla parete in fondo, già dall'altra parte.
Una corsa pulita su tutte e dodici adesso è di circa due minuti e cinquanta. Prima era due e trenta. I venti secondi in più sono tutti camminata, che è esattamente quello che dovevano essere.
Stessa demo, build nuova. Le camere sono sempre dodici, ma non sono quelle di prima: sono state rifatte tutte e dodici, e il motore si è preso una telecamera.
Il giro di ricognizione: entri, e la finestra va a vedere il fondo prima di restituirti i comandi.
La telecamera. Prima ogni camera era esattamente uno schermo, 15 blocchi per 10: tutta la stanza ti stava davanti dal primo quadro, e insieme alla stanza ci stava anche la sua soluzione. Adesso lo sfondo è 512 per 512 invece di 512 per 256, la finestra ti segue, ogni camera è larga due schermi e l'ultima è anche alta due schermi. Una stanza non si legge più dalla soglia: bisogna entrarci.
La finestra non stacca mai. Quando un varco ti sputa dall'altra parte della stanza la vista slitta dietro di te e frena arrivando, e non ti lascia mai uscire dall'inquadratura. Sembra un dettaglio e non lo è: uno stacco secco su un teletrasporto ti fa perdere l'orientamento ogni singola volta.
Il giro di ricognizione. Allargare le camere ha creato un problema che non avevo previsto: entri, e metà stanza ti è rimasta dietro. La porta, il pulsante, la cascata: non puoi sapere che ci sono. Così adesso, appena entri, la telecamera va a vedere: la finestra scorre fino in fondo, si ferma un attimo, e torna da te; nella camera alta sale anche. Dura poco più di due secondi e i tasti sono morti finché non ha finito, perché altrimenti cammini alla cieca e sei nell'acido prima di aver visto qualcosa. Quando muori non si ripete: la stanza l'hai già vista, e rivedertela a ogni errore sarebbe una punizione, non un aiuto.
LA TORRE. L'ultima camera è 30 blocchi per 20, la prima del gioco più alta dello schermo. Uno scarico in cima versa una cascata che cade per tutta l'altezza e attraversa i due piani: per gran parte della stanza è l'unica cosa che si veda da entrambi.
La torre intera, quella che a schermo non ci sta: due piani, la cascata che li attraversa, e il ballatoio col buco da tappare.
A terra c'è una vasca, asciutta, a quindici blocchi da dove batte l'acqua. Varco per terra dove cade l'acqua, varco nel soffitto sopra la vasca, e l'acqua attraversa la torre. La vasca piena è l'interruttore che non torna più su: apre la porta di sopra e alza l'ascensore che tappa il buco del ballatoio, due cose che succedono fuori campo e che scopri salendo. Di sopra la porta sta su una mensola quattro blocchi sopra il pavimento, fuori dalla portata di qualunque salto: e sono gli stessi due varchi a rifarlo, il pannello nella parete di sinistra preso di sbieco dal basso, poi il pannello nel pavimento sparato ai propri piedi. Si cade verso l'alto. La prima volta i varchi spostano l'acqua, la seconda spostano te.
E le prime sei camere non sono più il tutorial che erano. Insegnano le stesse sei cose nello stesso ordine, ma ognuna adesso ha un secondo problema appeso al primo. Nella camera dei varchi l'acido è largo dodici blocchi e resta una sola parete buona, in fondo: l'altro varco deve andare per terra. Ci cadi dentro ed esci dal muro, già dall'altra parte. È la regola su cui è costruito tutto il gioco, e lì viene detta ad alta voce. Nella camera del cubo attraversi il pavimento, esci dal soffitto e sterzi mentre cadi, perché la mensola si prende solo tenendo premuto destro in caduta. Nella camera della torretta il cubo è insieme il tuo scudo e la tua unica arma, e non puoi usarlo come tutti e due nello stesso momento.
Una corsa pulita su tutte e dodici adesso è di circa due minuti e mezzo. Prima era un minuto e trentotto.
Tre cose sistemate, e la prima è la più istruttiva. La cascata si fermava a mezz'aria: il getto era fatto di sette sprite, che coprono 224 punti, esattamente quanto basta per una camera alta uno schermo. Nella torre la caduta è di 288, e l'acqua semplicemente finiva, con l'aria sotto. Adesso quel numero è misurato sulla camera più alta del gioco invece che sulla più comune. L'edera cresceva nelle camere pulite: la casella vuota nella tabella delle piante era marcata -1, e il gioco saltava solo le caselle sotto -100, quindi ogni stanza in ordine si accatastava in silenzio quattordici rampicanti contro la parete sinistra, e a colpo d'occhio sembravano perfino al posto giusto. Il ponte mobile ti faceva cadere dal suo stesso bordo: adesso ha il piano più largo e un parapetto, e puoi tenere premuto avanti per tutta la corsa.
La cartuccia aggiornata è qui sotto. Gira su emulatore e su hardware vero con una flashcart, e il numero di build è scritto in basso a sinistra sulla schermata del titolo, così non può essere una bugia scritta a mano.
Da allora è uscita la 0.44.0, che non tocca gli enigmi ma rifà la camminata: è raccontata qui. Quello che si scarica è sempre l'ultima build.
Dalle sei camere di cui scrivevo ieri si è arrivati a dodici, e la cosa interessante non è il numero: è che la seconda metà non è un mondo nuovo. È lo stesso impianto, visto anni dopo.
Il gioco è diviso in due, e ogni metà si presenta con una scheda. La prima: «qui funziona ancora tutto. Le porte si aprono. L'acqua scorre. Le macchine aspettano ordini.»
Le prime sei sono l'impianto in funzione. Cubi da portare e posare sui pulsanti, porte che si aprono quando arrivi, torrette che ti vedono e sparano, raggi da spezzare col cubo, piattaforme mobili e ascensori. Sono quelle che insegnano le regole, una per stanza.
Prima parte: cemento pulito, luci accese, e le macchine che rispondono ai comandi.
Le ultime sei sono lo stesso posto abbandonato. Muri crollati, muschio ed edera sopra il cemento, luce del giorno che entra dai buchi. Non è un cambio di scenografia per far vedere altri colori: è lo stesso impianto, e si riconosce.
E lì dentro ci sono tre cose che nella prima metà non esistono:
Il vetro. Ferma il tuo corpo ma non i tuoi colpi: i varchi ci passano attraverso, tu no.
Le sentinelle da parete. Non si abbattono sparando: si abbattono tirandogli addosso un cubo.
Le consolle di comando. Ci sali sopra e guidi una macchina che puoi solo guardare, attraverso il vetro, dall'altra parte della stanza.
Seconda parte: stesso cemento, ma con l'edera sopra e l'acqua che scende da uno scarico rotto.
In fondo c'è una schermata di congedo, perché questa resta una demo e continua a dirlo. Dodici camere e un finale sono un punto di partenza pubblico, non un traguardo: le camere cresceranno ancora.
A luglio avevo scritto che bolliva in pentola qualcosa di grosso e che non dicevo su quale macchina. Eccola: Game Boy Advance. E non a mani vuote, perché intanto è venuto fuori un gioco: VECTOR, un omaggio a Portal, scritto da zero per quell'hardware.
L'illustrazione di copertina. Non è una schermata di gioco: il GBA ha sedici colori per tavolozza e 240×160 punti, e le schermate vere sono qui sotto.
Le camere costruite finora, tutte insieme. Ognuna insegna una cosa sola e la chiede una volta sola: camminare e saltare, i varchi, il cubo sul pulsante, la torretta, il raggio, le macchine che si muovono.
Diciamolo subito: è una demo. Le camere fatte finora servivano a fare amicizia con il processore e a vedere cosa saltava fuori: sono un inizio, non un traguardo, e ne arriveranno altre. Non è un gioco finito e non finge di esserlo. Però gira, si gioca, e la cartuccia sta in centoseimila byte.
L'idea è quella di Portal, e nient'altro: la pistola non spara colpi ma varchi, due, uno caldo e uno freddo, e si aprono solo sui pannelli chiari. Entri in uno, esci dall'altro, e la velocità non si perde: cadi da in alto dentro un varco e dall'altro ne esci sparato. Niente dell'originale è stato usato, nessun disegno e nessun suono: l'omaggio è dichiarato dentro il gioco, nella pagina INFO, col nome dell'originale e di chi l'ha fatto, perché un omaggio che non nomina l'originale non è un omaggio.
Il raggio uccide, si ferma sul primo ostacolo, e si tappa col cubo. L'ascensore non ha bottoni: sale mentre ci stai sopra e scende quando lo lasci.
La macchina. Dopo il 6502 a 8 bit e il 68000 a 16, qui sotto c'è un ARM a 32 bit a 16,8 MHz, e per la prima volta la potenza non è il vincolo principale. Il vincolo è altrove: 240 punti per 160, sedici colori per tavolozza, e soprattutto quanti colori riesci a mettere dentro una tessera di otto punti per otto. Il mestiere sta tutto lì. E il processore non sa dividere, quindi ogni ciclo e ogni rampa è una potenza di due: non è un vezzo, è che una divisione qualunque diventa una chiamata a una libreria che qui non c'è, e il programma non si collega più.
Niente bitmap, come sempre. La grafica non è disegnata in un programma di disegno: è generata. Trentadue attrezzi in JavaScript producono tessere, tavolozze, mappe e tabelle come file C, e le camere stanno in un file di testo con un editore che le fa vedere disegnate mentre le modifichi e che al salvataggio ricompila la cartuccia. Anche il personaggio è generato parte per parte, e le pose del passo nascono da una curva invece che da numeri messi a occhio.
I due muri più istruttivi li ho raccontati per esteso, perché sono la parte che vale davvero: la luce che faceva ombra, cioè come questa macchina fonde i colori e perché un cono marrone scurisce il muro invece di illuminarlo; e compila, gira, e non funziona, cinque guasti che non danno nessun errore, a partire da una variabile che viveva in ROM e non cambiava mai.
La ROM di questa build era la 0.25.0, e girava su emulatore e su hardware vero con una flashcart.
Aggiornamento: da qui il gioco è andato avanti parecchio, e la versione che si scarica è sempre l'ultima. Sono arrivate le dodici camere e la telecamera che scorre, e poi la camminata rifatta. Questo pezzo resta com'era, perché è il racconto di quel giorno.
Oggi niente assembly e niente pixel: si scende dall'altro banco di lavoro. Remote SFTP/FTP è un'estensione per Visual Studio Code, la uso tutti i giorni, e da oggi si scarica da qui.
Da anni sposto file su server remoti mentre sviluppo, e da anni la stessa scena: apri il file con un client FTP, lo modifichi in un editor diverso da quello che stai usando per il progetto, salvi, ricarichi. Oppure installi una delle estensioni che fanno la stessa cosa, e scopri che la password del server di produzione è finita in chiaro dentro un file JSON nella cartella del progetto, a un «git add .» di distanza dal repository. L'ho scritta per togliermi questo problema, e visto che funziona la metto a disposizione gratuitamente.
Cosa fa. Configuri la connessione una volta, SFTP su SSH oppure FTP e FTPS, e nella barra laterale compare l'albero delle cartelle remote. Clicchi un file, si apre; premi Salva, e il file viene riscritto sul server. Nessuna copia locale che dopo due giorni non sai più se è più aggiornata di quella remota, nessuna sincronizzazione da lanciare e da ricordarsi. Una cartella remota può anche diventare la radice del workspace.
Sulle connessioni SSH c'è il terminale remoto, e qui c'è un dettaglio a cui tengo: la shell si apre sulla stessa connessione già aperta per i file. Nessun secondo login, nessuna seconda password. La funzione che uso di più, però, è la ricerca: scegli da quale cartella partire e cosa cercare, e se l'account SSH ha una shell la ricerca gira direttamente sul server, con grep e find. In rete passa solo l'elenco dei risultati, non i file. Clicchi un risultato e il file si apre alla riga giusta. Su FTP, dove una shell non esiste, l'estensione scandaglia le cartelle dal client: più lenta, ma funziona. E poi c'è il trascinamento, anche fra due connessioni diverse per copiare da un server a un altro: in quel caso i dati passano da un flusso all'altro senza toccare né il disco né la memoria, quindi un file da qualche centinaio di megabyte non è un problema.
Le tre cose di cui vado più fiero non si vedono, ed è per quelle che l'ho scritta. Le password stanno nel portachiavi di sistema, non in un file dentro il progetto. La chiave del server viene verificata contro il tuo known_hosts esattamente come fa ssh: se l'host è nuovo ti mostra l'impronta e ti chiede conferma, e se la chiave è cambiata ti avverte in modo esplicito, perché può essere una rotazione legittima oppure qualcuno in mezzo. E il salvataggio non sovrascrive di nascosto: se un collega ha toccato quel file dopo che l'hai aperto, prima di scrivere ci si ferma e puoi confrontare le due versioni.
Qualche limite, detto subito. È provata su macOS e Linux; su Windows no. I file oltre 16 megabyte non si aprono nell'editor, ed è un vincolo di VS Code, che riceve i file remoti in un blocco unico: per quelli conviene usare il download. Il terminale SSH aperto non sopravvive a una caduta di connessione e va riaperto. E la ricerca nel contenuto su FTP, come dicevo, è più lenta.
La licenza è gratuita per qualunque uso, anche commerciale e in azienda, senza registrazione e senza limiti di tempo o di postazioni. Non è open source. L'unica cosa che chiedo è di non ridistribuire il file altrove: linkate la pagina, così chi la installa ha sempre la versione corrente. Le istruzioni di installazione, passo per passo, sono sulla scheda. Se la provate e trovate qualcosa che non va, scrivetemi.
Detto questo: no, non è questa la sorpresa promessa a settembre. Quella riguarda tutt'altro banco di lavoro, e regge ancora.
Piccola verità onesta, per una volta senza trabocchetti: nelle prossime settimane bolle in pentola qualcosa di grosso. Non dico cosa, non dico su quale macchina, ma se avete seguito fin qui il salto lo sentite arrivare. Diciamo che il pavimento, stavolta, regge davvero.
C'è però un ostacolo che nessun assembler può schivare: la famiglia va portata al mare, e poi su in montagna. Quindi il banco di lavoro chiude per un po', e il grande annuncio slitta a settembre. Non è un rinvio all'italiana: è proprio scritto sul calendario, con la sabbia.
Nel frattempo le due build C64 e Mega Drive restano qui, scaricabili, per ingannare l'attesa. E tenete d'occhio questo spazio: qualche indizio potrebbe spuntare anche prima di settembre, quando il wifi del lido, o del rifugio, lo permette. Restate sintonizzati.
Quello che ho costruito sul Mega Drive comincia a scendere sul Commodore 64. La versione C64 v0.0.11 è la conversione della campagna V2: per ora i primi due livelli, con la pistola, i nemici e le stelle da raccogliere, riscritti in assembly 6502. Stesso gioco, stessa idea, un'altra macchina, e mezzo secolo di potenza di calcolo in meno.
1-2 «Ritmo e Piombo» sul C64: la stessa scena vista sul Mega Drive, con la pistola in pugno e la promessa in cima: «loro non sparano. Per ora.»
Il PRG aggiornato è qui sotto, per emulatore e hardware reale.
In poche build il test Mega Drive è cresciuto parecchio: da un livello di prova a una piccola campagna, la «V2». I sei schemi sono stati rimessi a nuovo, è comparso qualche avversario, c'è una presentazione tutta nuova e un bel lavoro di rifinitura grafica. La logica di gioco resta fedele all'originale. Il resto, meglio scoprirlo giocando.
L'idea, in fondo, è un esperimento di design: sto provando a buttare dentro un po' tutti gli ingredienti classici del platform, quelli che si sono visti mille volte nel genere, e vedere come si mescolano tra loro. Non per inventare la ruota, ma per capire cosa succede a impastarli tutti nello stesso gioco.
1-2 «Ritmo e Piombo», un mondo di pietra al crepuscolo, con la pistola in pugno, qualche robot e un pianeta all'orizzonte. 2-2 «Una di loro mente», un mondo d'acciaio nella notte, fra luna, droni e piattaforme che si accendono.
Gameplay. Tutti e sei gli schemi sono stati rifatti in una piccola campagna a schermata fissa: si raccolgono delle stelle per sbloccare la bandiera, e c'è più sviluppo in verticale. È arrivata una pistola, che una volta presa resta per tutta la partita, e con lei i primi nemici, da abbattere o da schivare. Ci sono le vite e il game over, ma la prima bandiera bugiarda non ne costa una: quella è la lezione gratis. Tornano i codici per accedere ai mondi, le schede di presentazione di ogni mondo e le solite frasi ironiche sparse un po' ovunque.
Presentazione. Un breve filmato d'apertura muto, che si può saltare, apre la partita; poi una schermata iniziale grafica, col logo grande e la scelta della lingua.
Grafica e animazioni. Ora ogni mondo ha il suo carattere: uno di pietra, caldo, contro uno di metallo, freddo e illuminato, ciascuno con fondali, cielo, pianeti e stelle diversi. Gli spuntoni sono più grossi e riconoscibili, i blocchi finti crollano con un po' di teatro, le luci si accendono in modo morbido, e le animazioni del personaggio, delle stelle e della bandiera sono più curate. Anche l'omino e la pistola sono stati ridisegnati.
Audio. Qualche effetto sonoro nuovo per gli spari e le raccolte; la musica resta quella di prima. E come sempre, la versione C64 continua a girare intatta a fianco.
Sotto, la ROM aggiornata: gira su emulatore e flashcart.
Il prototipo HTML ha fatto esattamente il lavoro per cui l'avevo tirato su: fissare le regole del gioco. Fisica, feel del salto, i tradimenti dei mondi, il ritmo. Tutto deciso lì, dove provare un'idea costa dieci minuti. Adesso però lo archivio: resta online, giocabile com'è, ma smetto di farlo crescere. Ha finito il suo turno, e l'ha fatto bene.
Il motivo è una sorpresa: sul Mega Drive mi trovo bene, molto più di quanto pensassi. Il 68000 con il C mi dà abbastanza agio da poterci prototipare direttamente, senza più il giro dal web. E c'è un regalo in più: sul Mega Drive posso fare due versioni dello stesso gioco. Una a schermata fissa, alla vecchia maniera, un quadro alla volta; e più avanti una in scrolling, col mondo che scorre. Due modi di raccontare lo stesso design.
Quindi si riparte da lì, direttamente sul ferro del 1988: due livelli belli corposi, costruiti come si deve, non più bozze. Poi, da quella base solida, il porting sul C64. Il web ci ha portato fin qui; il resto del viaggio lo faccio sulle macchine vere.
Non doveva toccare a lui, ma il prototipo era lì che aspettava. La prima ROM Mega Drive è scaricabile: il primo livello del Mondo 1 in un file .gen da 256KB che parte negli emulatori e dovrebbe partire su flashcart. Dentro c'è la ricetta raccontata nel post del 9 luglio: startup, vettori e schermata del titolo in assembly 68k, logica di gioco e render in C compilato per il 68000. La logica è la stessa del prototipo, quindi il gameplay è quello giusto; quello che non posso verificare da qui è il ferro vero. Se avete un Mega Drive e una flashcart, il collaudo su hardware è vostro: scrivetemi cosa succede. Ora si torna al C64, che era rimasto col joystick in mano.
Due giorni fa scrivevo che il SID mi stava prendendo a schiaffi. Aggiornamento: abbiamo fatto pace. Il player adesso gira dentro l'interrupt del raster senza sforare il frame, e la musica è nel PRG: tema del titolo e motivo di gioco, due voci per la melodia e il basso, la terza che resta libera per gli effetti, che hanno la precedenza (in un gioco dove il pavimento crolla, il crollo si deve sentire). Non è ancora roba da demoscene, gli inviluppi sono semplici e il filtro lo sto solo sfiorando, ma è musica vera che esce da un SID vero. La prima volta che il tema è partito intero, alle 23:50, ho alzato il volume di un pelo. Poi mi sono ricordato dei bambini e l'ho riabbassato. Il viaggio nell'assembler paga la prima cartolina. Il bug più bello di questa battaglia, il gracchio fantasma, è raccontato col codice nel dietro le quinte.
La prima build scaricabile del test C64 è online: i primi 2 livelli del Mondo 1, 6 schemi in totale, in un PRG da 17KB che parte su VICE e dovrebbe partire su hardware reale. «Dovrebbe» è la parola chiave: la collisione sui pavimenti finti va verificata schema per schema, e il timing del tremolio (un decimo di secondo, che su PAL fa 5 frame) per ora è tarato a occhio in emulazione, non su un C64 vero. Se lo provate su ferro vero e succede qualcosa di strano, scrivetemi: fa parte dell'esperimento. Anzi, l'esperimento è esattamente questo. La build è stata compilata alle 23:40, come tutto in questo progetto: si lavora quando i bambini dormono.
Confessione: la musica è la parte più difficile di tutto il test C64. Il SID non è un beeper, è un sintetizzatore vero: 3 voci, inviluppi ADSR, filtri analogici, e zero pietà per chi arriva dal WebAudio, dove una nota è una riga di JavaScript. Qui una nota è un registro di frequenza a 16 bit da calcolare, un inviluppo da programmare, e un player da scrivere in assembly dentro l'interrupt del raster senza sforare il tempo del frame. Per ora la build ha solo gli effetti: salto, morte, bandiera. La musica arriverà, ma con i suoi tempi: fare bene il SID è un mestiere a parte, e io sono ancora apprendista. Con l'aggravante del setup: un'ora scarsa a notte, a bambini addormentati, col volume al minimo per non svegliarli. Imparare un sintetizzatore in punta di piedi.
Traguardo: tutti e 10 i mondi di FIDATI. sono giocabili da capo a fondo, Inferno compreso, lava che sale inclusa. Ma «giocabile» e «finito» sono due parole diverse. È tutto ancora una bozza: anche i primi 6 andranno ripassati, e gli ultimi 4 sono i più acerbi: la Giungla ha piattaforme coi denti che mordono con troppo poco preavviso, i teletrasporti della Città Futuristica a volte mentono troppo perfino per gli standard di questo gioco, la segnaletica della Città Aliena deve mentire con più eleganza, e l'Inferno va bilanciato schema per schema perché tutte le bugie insieme sono tante anche per chi le ha scritte. I mondi si rifiniscono uno alla volta, via via che passano il playtest. Che, per un progetto fatto di ritagli di sera dopo l'ora dei bambini, non è un brutto punto in cui stare.
Le piattaforme mobili erano l'ultima grande feature del motore, e non volevo che fossero le solite. La regola in più: finché ci stai sopra, l'anello affonda, 18 pixel al secondo, e recupera quota solo quando scendi. Quando sta per cedere, il bordo lampeggia rosso. Il risultato è che gli anelli sono mezzi di trasporto, non case: chi si ferma a pensare, sprofonda. Nel terzo livello del mondo c'è il mio dettaglio preferito: un robot pattuglia tranquillo un isolotto il cui centro è un pavimento finto. Lui ci cammina sopra sereno, perché il pavimento tradisce solo te.
Il primo taglio di Venere era troppo gentile: vento a raffiche telegrafate e poco altro. Il playtest è stato impietoso («troppo easy»), quindi il mondo ha ricevuto la pioggia acida (gocce che si gonfiano sotto le nuvole prima di precipitare, desincronizzate per colonna) e le vespe regine: due colpi per abbatterle, e il primo le fa infuriare. Il tocco che preferisco è balistico: il vento sposta anche i tuoi proiettili. Sparare a una vespa col vento di traverso non è mira, è artiglieria.
La versione Mega Drive è senza SGDK né librerie, ma non è tutta assembly, ed è una scelta precisa. Lo startup e i vettori sono assembly 68k (crt0.s), la schermata del titolo è asm pura; la logica di gioco e il render sono in C (game_logic.c, main.c), compilati da gcc in codice macchina 68000 che finisce nella ROM. Perché il C? Primo: è la prassi dell'epoca 16-bit. Il 68000 è nato pensando ai compilatori, e una valanga di giochi commerciali per Mega Drive era in C con l'assembly solo nei punti caldi. Non è un ripiego moderno. Secondo: è il trucco che rende il porting verificabile. Non ho un emulatore 68000 per collaudare la logica, ma la stessa identica sorgente C compila anche nativa sul Mac, dove la faccio giocare frame per frame contro il modello di riferimento: è così che arriva la garanzia bit-exact sui 1583 frame. In assembly 68k puro potrei solo scrivere codice e sperare. Il pavimento finto che crolla l'ho visto funzionare contando i pixel viola che sparivano: 4756, 4592, 4428. La soddisfazione era tutta lì. Il metodo del doppio bersaglio, e gli altri bug del Mega Drive, sono nel dietro le quinte.
Portare FIDATI. sul C64 è stato un bagno di umiltà. Il motore (fisica in virgola fissa, coyote time incluso, perché il feel non si negozia nemmeno nel 1982) ha funzionato quasi subito. La grafica no: scrivere charset a byte nudi senza vederli produce esattamente quello che immaginate. La svolta è arrivata costruendo una pipeline di anteprima: ogni byte di grafica viene renderizzato e guardato prima di finire nel PRG. Curiosità: la griglia di gioco 20×12 a tile da 16px combacia esattamente con lo schermo 40×24 caratteri del C64, come se il gioco fosse nato lì. Forse un po' è vero.
Un platformer vive o muore sul salto, e la differenza sta in quattro dettagli che il giocatore non vede ma sente. Coyote time: puoi saltare per qualche frame dopo aver lasciato il bordo, altrimenti i salti sembrano «rubati». Jump buffer: se premi un attimo prima di atterrare, il salto parte comunque. Salto variabile: rilasci presto, salti corto. Squash & stretch: il personaggio si schiaccia all'atterraggio e si allunga allo stacco. Sono in tutte e tre le versioni di FIDATI., identici: 4-5 frame di coyote, 6-7 di buffer, dal browser al 6502.
FIDATI. usa codici a 4 lettere per accedere ai mondi: LUCE, CIMA, ROSS, VENT, ANEL... Non è solo nostalgia: sui portali web non c'è garanzia di salvataggio tra sessioni, e i password system degli anni '90 risolvevano esattamente questo problema. Il codice appare quando raggiungi un mondo nuovo, te lo annoti, e vali più di qualunque cloud. Il decimo codice è LAVA. Fate due più due.
Con Marte sono entrate due cose pericolose: la gravità dimezzata e la pistola. La gravità è stata la parte facile: voli per dodici tile e ogni salto imparato nei primi tre mondi diventa una bugia della tua memoria muscolare, che è esattamente il punto del gioco. La pistola invece era un rischio di design: un rage platformer dove spari rischia di diventare un run and gun qualunque. La soluzione: non si trova, si guadagna, i colpi sono contati, e i robot che la sorvegliano sono immuni ai salti. Vuoi l'arma? Prima impara a schivare. È il patto più onesto di tutto il gioco, e infatti l'ho nascosto nel mondo più bugiardo. Bilanciare i robot in sessioni da un'ora a notte, con la casa che dorme, ha richiesto una settimana di sere: il tempo perso è perso, ma rende meticolosi.
Niente mp3, niente asset: tutta la musica di FIDATI. è sintetizzata in tempo reale con WebAudio. Onde quadre e triangolari per le voci, rumore filtrato per le percussioni, un sequencer di una quarantina di righe che legge pattern scritti come stringhe. Ogni mondo ha il suo tema: lo Spazio Geometrico è quasi allegro (è il tutorial, deve illuderti), Marte è in minore, l'Inferno è un basso che sale di semitono ogni battuta, come la lava. Il vantaggio pratico: il gioco resta un singolo file HTML sotto i 50KB. Quello che il WebAudio mi ha regalato in semplicità, il SID me lo sta facendo pagare con gli interessi. Ma questa è un'altra storia, più sopra nel devlog.
Regola numero uno, decisa il primo giorno: tutto il gioco in un singolo file HTML, niente asset esterni. Sprite, tile e livelli disegnati via codice sul canvas, suoni sintetizzati, livelli descritti come stringhe di caratteri dove # è un muro, ^ è uno spuntone e F è la bandiera (una delle due, almeno). Sembra masochismo, è una scelta pratica: un file solo si carica ovunque, si porta in giro, non ha dipendenze che marciscono. E ha un effetto collaterale che scoprirò solo una settimana dopo: livelli fatti di caratteri si portano su una macchina a caratteri, tipo un certo biscottone del 1982, con una naturalezza sospetta.
Tutto è partito da un prototipo di un weekend, o meglio: di due sere di quel weekend, dai 21:30 in poi, a bambini addormentati. Un canvas, un quadrato arancione, una fisica scritta a mano. Il primo pavimento finto è nato per sbaglio: un bug nella collisione faceva sparire un tile a caso sotto i piedi, e morire lì era stranamente divertente. Invece di correggerlo, l'ho promosso a meccanica. Da lì il concept: un platform che ti mente, ma con regole oneste. Ogni bugia è imparabile, ogni tradimento ha un preavviso, anche se di un decimo di secondo: il gioco non bara, ti illude, che è diverso. Il titolo è arrivato da solo: FIDATI., col punto. Come lo dicono i bugiardi.