Marine Vs. Cacodemone
Venerdì 10 Dicembre 1993 fu un giorno storico. I ragazzi della ID Software pubblicarono su un server dell’Università del Wisconsin (USA) la versione shareware di Doom, il più grande successo di tutti i tempi ed il capostipite di un nuovo genere, quello degli sparatutto in soggettiva, sul quale si basarono molti videogame degli anni successivi. Il concept era semplice: un marine in una base spaziale su Marte invasa da mostri e demoni usciti direttamente dall’inferno doveva cavarsela facendo affidamento esclusivamente sul proprio arsenale. Decine e decine di livelli originali. Migliaia e migliaia di livelli distribuiti grazie ad Internet.
Questo breve racconto è dedicato a quel gioco.
Il byte array del cacodemone era stato istanziato nel momento in cui il file E2M8 (episode 2, mission 8) era stato caricato in memoria. I bytes avrebbero permesso alla creatura infernale di assolvere al proprio dovere senza dubbi e senza rimpianti: distruggere l’umano che si aggirava nella base. Il byte[0] di quell’array sapeva benissimo quello che avrebbe significato per lui: la deallocazione dalla memoria. Portare a 0x00 il contenuto della cella di memoria che conteneva i punti-ferita (PF) dell’umano avrebbe comportato la conclusione della partita e la conseguente pulizia della memoria relativa. Se ci fosse stato un modo, l’avrebbe evitato, ma non era possibile. Al momento giusto, il cacodemone avrebbero attaccato e dell’umano non sarebbe rimasta traccia. Ma non ancora.
L’engine chiamava continuamente il metodo Walk() sull’istanza di classe Marine. Ciò consentiva all’oggetto di mantenersi costantemente in movimento, per non diventare un bersaglio facile. Teneva ben puntata davanti a sè la doppietta che aveva recuperato qualche stanza prima. Si trovava a ridosso dei collettori di energia. Se il software l’avesse previsto, si sarebbe sentita puzza di bruciato ovunque – evidentemente i cavi elettrici fusi dall’estremo calore non avevano resistito. Le textures delle pareti metalliche riportavano chiazze di sangue, segno della battaglia che gli occupanti della base avevano tentato di lottare inutilmente. Il marine era rimasto solo nella base e doveva riuscire a trovare una via di uscita in mezzo a quella follia. Follia fatta da demoni, passaggi segreti, ascensori e…morte.
L’algoritmo impediva al cacodemone di muoversi. Per ottimizzare la velocità e l’occupazione di memoria, le istanze dei mostri erano state programmate per agire solo quando il loro obiettivo – il marine – si fosse sufficientemente avvicinato a loro. Il cacodemone era l’ultimo avversario prima della porta di sicurezza che conduceva al livello successivo: era questione di qualche ciclo di clock – prima o poi, il marine sarebbe passato di lì. E allora sì che se ne sarebbero viste delle belle. La IA della creatura in quel momento era bloccata in un ciclo do…while: il demone non stava facendo nulla, non pensava, non respirava, non faceva niente di niente. Solo l’engine poteva sbloccare la situazione.
Il marine girò l’angolo e chiamò il metodo Fire() senza esitare, uccidendo sull’istante un imp giusto un attimo prima che questi lanciasse la sua palla di fuoco. Lo sparo della doppietta fu così violento che il demone di basso livello volò indietro di qualche metro, prima che il garbage collector decidesse di rimuoverlo dall’ambiente, simulando un dissolvimento della creatura nell’aria fredda e puzzolente della base militare. Il marine si mosse subito a destra, riparandosi dietro una colonna. Sentì lì vicino il respiro di un altro imp che vagava nella base – e lui rimase immobile e silenzioso per non farsi scoprire. Quando l’imp gli passò accanto non potè non vederlo. Il marine lo sentì come soffiare dalla sua bocca ed alzò il braccio peloso per lanciare il fuoco infernale dalla mano. L’algoritmo produsse un colpo impreciso, perchè la palla di fuoco colpì la colonna dietro la quale si nascondeva il marine. L’esplosione ferì l’umano in modo superficiale. Prima che le cose degenerassero, il marine sbucò fuori dal suo nascondiglio ed esplose un altro colpo che fece secco l’imp allo stesso modo del primo.
Se il marine fosse stato un marine vero, avrebbe tirato un respiro di sollievo. Ma era un marine virtuale, simulato all’interno di un software. Ciò nonostante, non gli sarebbe piaciuto morire – a nessuno piace morire. Il marine sapeva perfettamente che sotto sotto era solo un mucchio di bytes istanziati chissà dove. Sapeva perfettamente che tecnicamente parlando non sarebbe mai davvero morto. Sapeva perfettamente che la sua vita dipendeva al 100% dal sistema all’interno del quale stava girando: algoritmi, calcoli, niente di più. Il suo mondo era solo un mucchio di textures. Lui stesso era un’istanza di classe. E allora? E allora non gli sarebbe piaciuto morire, indipendentemente da tutto. Il marine pensò che finchè avrebbe avuto un colpo in canna, avrebbe lottato per rimanere lì doveva. Diede un’occhiata intorno: davanti a lui si apriva un lungo corridoio, senza aperture laterali. In fondo al corridoio c’era una porta. Nno vedeva pericoli, perciò raggiunse la porta velocemente.
Mentre il marine camminava verso la porta, il cacodemone si attivò, emanando un suono gutturale. Cominciò a muoversi lentamente verso la porta per tendere un agguato al marine. La struttura 3D nella quale si trovava il demone costruiva una stanza quadrata, le cui textures riportavano anche 4 umani crocifissi: quando il marine sarebbe entrato, gli sarebbero venuti i brividi vedendo 4 suoi compagni ridotti in quello stato. O perlomeno…sarebbero venuti i brividi all’Umano che stava al di là del monitor.
Il marine utilizzò il pass rosso per aprire la porta. L’engine fece alzare lentamente la porta attraverso un semplice shifting dei bytes della texture. L’urlo del cacodemone fu così forte ed imprevisto che investì il marine in tutta la sua essenza. Spaventato, il marine chiuse gli occhi…e quel gesto gli fu fatale. Il cacodemone era a meno di un metro dal soldato. Emise una scarica elettrica ad alto voltaggio che penetrò nelle ossa e fece diminuire velocemente i punti-ferita del marine. L’uomo si rese conto si essere perduto – se il giocatore non si fosse dato una mossa, sarebbe stato deallocato. “Fa qualcosa!” – pensò il marine, sapendo benissimo che il suo messaggio non sarebbe mai arrivato all’Aldilà.
Fu così che morì. Ox245A4 cicli di clock più tardi, il byte che conteneva i punti-ferita del marine conteneva 0. Lo stream di byte arrivò alla scheda audio, facendo urlare di dolore l’uomo. Lo schermo divenne rosso sangue. Ed il gioco finì così.
Il giocatore premette Invio sulla tastiera, e dopo qualche attimo di caricamento un nuovo marine era pronto per combattere contro un nuovo cacodemone in una nuova base spaziale su Marte.