Fare screencast di videogiochi in Linux


In Unix si combinano, nel caso di attività complesse, strumenti più piccoli allo scopo di raggiungere un risultato in modo efficiente. Se volessi creare un filmato (detto in gergo tecnico screencast) che mostrasse un gioco, dovrei utilizzare diversi programmi, ciascuno avente un compito specifico nel montaggio di una parte audio o video. Mi piacerebbe innanzitutto anteporre nel mio videoclip un testo introduttivo con una voce che spiegasse di cosa si tratta. Ho in mente due applicazioni che sono presenti su quasi tutte le distribuzioni del sistema operativo Linux: Gimp, programma di grafica e fotoritocco; espeak, sintetizzatore vocale. Con Gimp ho creato un’immagine PNG contenente un testo bianco su sfondo nero; ho usato espeak per far leggere quel testo da una voce maschile in lingua italiana. Per farvi un’idea di cosa è capace espeak, provate questo comando nel terminale di Linux:

bc | wc | espeak

Ci sono due “pipe” (è una parola inglese) che collegano tre progammi: bc è la calcolatrice UNIX, fate qualche operazione aritmetica poi terminate con il comando quit; l’output viene passato al programma wc che conta il numero di caratteri utilizzati; infine questo numero diventa l’input di espeak che lo legge con una voce sintetizzata (in questo caso inglese).

Guarda “Espeak: italian language” su Youtube

Ho salvato l’audio prodotto da espeak in un file WAV; il programma è molto potente, legge il file di testo (opzione -f), sceglie la voce (italiana, maschile -vit+m4) e crea l’audio (opzione -w). Queste operazioni vengono fatte contemporaneamente nell’ambiente dei comandi di Linux:

espeak -f input.txt -vit+m4 -w output.wav

Infine ho assemblato l’audio e l’immagine per mezzo di dvd-slideshow: è risultato un videoclip di circa trenta secondi con un effetto grafico molto carino e la voce “fuoricampo”.

A questo punto occorre mettere da parte gli strumenti visti finora. Il mio scopo è mostrare come si installa il programma glc che cattura sequenze video dai giochi. Potete paragonare glc a fraps di Windows: la differenza è che glc registra l’output delle applicazioni OpenGL. C’è un’ampia gamma di software che fa la stessa cosa, vado a memoria: recordMyDesktop, Gnome video recorder, Xvidcap, Vokoscreen, ma questi programmi creano anche lag durante la partita perché non accedono direttamente al frame buffer della scheda grafica; invece glc (o SimpleScreenRecorder) è l’ideale, registra sia l’audio che il video dei giochi e il lag generato è minimo.

Ho “ripreso” l’installazione di glc con la funzione di videoregistrazione interna di Gnome shell (si attiva premendo i tasti CTRL+ALT+SHIFT+F8 e si disattiva allo stesso modo): tutto ciò che compare sullo schermo è stato salvato in un file webm (il formato video sponsorizzato da Google). Poi ho aggiunto una musica free, tra quelle suggerite da Youtube, con il programma mkvmerge che gestisce anche il formato webm. Lo screencast prodotto è di qualità amatoriale, ma è sufficiente per mostrare ciò che volevo.

Guarda “Install glc video recorder” su Youtube

Con glc vovevo creare un video di ShadowRun Returns che mostrasse la console di debug (si attiva con F1) e il comando deathray. Siccome il gioco fa solo salvataggi della partita nei checkpoint (posti all’inizio del livello), il raggio della morte è, contrariamente al nome, un vero salvavita per il protagonista di quest’avventura: personalmente, mi ha fatto risparmiare ore di tempo. 

Ora che glc è installato, faccio una rapida esposizione dei comandi:

glc-capture APP_OPENGL

l’applicazione parte come sempre, ma occorre premere i tasti SHIFT+F8 quando si vuole “catturarne” l’output; aggiungendo l’opzione -s al comando precedente, la registrazione inizia automaticamente non appena è disponibile il contesto OpenGL. Se ci piace, c’è l’opzione -i che inserisce l’indicatore di registrazione in corso nell’angolo superiore sinistro dello schermo. Inoltre, è molto utile specificare un nome di file al nostro video con l’opzione -o che accetta anche le seguenti macro

  • %app%, il nome dell’applicazione
  • %pid%, la ID del processo del gioco
  • %capture%, contatore dei video
  • %year%, anno a quattro cifre
  • %month%, mese a 2 cifre
  • %day%, giorno a 2 cifre
  • %hour%, ora a 2 cifre
  • %min%, minuto a due cifre
  • %sec%, secondo a 2 cifre

Catturare l’output di una applicazione OpenGL è dunque semplice, ma quando veniamo a ShadowRun Returns dobbiamo fare i conti col fatto che si tratta di un gioco gestito da Steam la cui interfaccia non usa OpenGL. Provate il comando:

glc-capture -i -o "%app%-%pid%-%day%-%hour%-%min%.glc" -v 4 -b back -e bgr steam -console -applaunch 234650

avvierà il gioco ma senza registrazione. Per dribblare il problema, possiamo impostare la modalità Big Picture di Steam perché usa OpenGL: l’opzione che ci serve è -bigpicture .

Adesso abbiamo il nostro file glc, possiamo riprodurlo direttamente con glc-play e accontentarci, ma siccome è un file di notevoli dimensioni (un videoclip di pochi minuti può occupare centinaia di MByte), forse è più utile elaborarlo con un software di compressione video.

glc-play Shadowrun-6460-18-22-34.glc -a 1 -o srr_audio.wav

Con questo comando l’audio viene estratto dal dump di glc e salvato in formato wav nel file srr_audio.wav che dobbiamo usare nel passaggio successivo quando l’output di glc-play viene dato a mencoder per la compressione in MPEG-4

glc-play Shadowrun-6460-18-22-34.glc -y 1 -o - | mencoder -demuxer y4m - -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=3000 -vf scale=1280:720 -audiofile srr_deathray.wav -oac mp3lame -o srr_deathray.avi

Ci sono programmi di editing video (cinerelle, kdenlive) molto sofisticati che vanno ben oltre gli scopi di questo articolo, ma con i quali è possibile realizzare video di ottima qualità. Inoltre, con i mezzi opportuni: computer di adeguata potenza, webcam, microcamera, microfono, una bella voce! si raggiungono risultati certamente migliori, lo screencast si fa più interessante e presenta i contenuti in maniera professionale.

Fonti:

  1. Glc homepage
  2. libelfhacks0
  3. libpacketstream0
  4. glc package
  5. glc tutorial
  6. github glc: Steam problem

Un IDE per Enemy Territory


Nell’articolo “Un IDE per avventure testuali in Linux” avevo mostrato la procedura per abilitare Inform7 in Eclipse. Oggi presento un metodo simile per fare modifiche al codice sorgente di Wolfenstein: Enemy Territory che Id Software mise online con la licenza GPL v3 un paio di anni fa. Sorvolo sui vari progetti che sono stati iniziati in Rete con il codice di W:E.T. perché sono davvero tanti, magari tornerò su questo argomento in futuro, alcuni sono molto interessanti. L’articolo si conclude con un esempio pratico, tratto da una serie di tutorial dedicati alla programmazione di Quake 3: chi è già ben informato sulla struttura interna dell’Id Tech 3, troverà delle similitudini fra i codici dei due giochi. La modifica è elementare, consiste nel ridurre la velocità del missile sparato con il panzerfaust di modo che si possa superarlo a piedi e vederlo viaggiare nell’aria.

Ho scelto Eclipse per due ragioni: il codice sorgente originale del gioco è stato configurato con SCons, uno strumento di sviluppo che automatizza l’assemblaggio dei programmi; esiste un plugin che si interfaccia fra Eclipse e SCons.

Installazione di Sconsolidator per Eclipse

Installazione di Sconsolidator per Eclipse

In questo esercizio è fondamentale un sistema Linux configurato come ambiente di sviluppo, quindi avrete bisogno del compilatore gcc e delle librerie di supporto. In Ubuntu questo ambiente viene messo a punto con un comando del tipo apt-get build-essential scons. Non cambia molto con le altre distribuzioni, dovrete consultare la guida di riferimento. Al mio primo tentativo sono inciampato in una difficoltà: siccome lo standard FHS non prescrive una posizione per Xorg all’interno della gerarchia del file system, può capitare che l’assembler non trovi le librerie, come è successo a me. Una volta era prassi installare X Window System in /usr/X11R6, ma con l’adozione di Xorg questa directory ha perso importanza. Per esempio a Sun si continua a installare Xorg in /usr/X11; nella distribuzione Ubuntu lo si trova invece in /usr/lib; a Id Software usavano /usr/X11R6. Nella mia distribuzione Xorg non si trova in /usr/X11R6, ho dovuto porvi rimedio correggendo il contenuto di un file del codice sorgente di W:ET, altrimenti la compilazione sarebbe terminata con errori. Al momento opportuno spiegherò anche come fare questa correzione.

Installazione scons con Synaptic

Installazione scons con Synaptic

L’elenco degli strumenti indispensabili è il seguente:

  • Il codice sorgente di Enemy Territory. In Rete si trovano diversi pacchetti, ma la procedura descritta qui è basata sulla versione distribuita da Splash Damage che è già predisposta per SCons.

  • SCons: sostituisce make e l’infrastruttura GNU autoconf. È il nocciolo del nostro sistema di compilazione di W:ET.

  • Strumenti di sviluppo: gcc, nasm e librerie. Le distribuzioni hanno il “pregio” di separare i file di libreria da quelli d’intestazione (header) del C, ma entrambi sono necessari per la compilazione! Quindi un pacchetto che fa parte di Xorg potrebbe risultare installato ma senza gli header. W:ET è un gioco per ambiente grafico e fa uso di numerose librerie di Xorg. L’unico modo per scoprire cosa manca è procedere con la compilazione per tentativi e procurarvi ciò che è indispensabile con il gestore dei pacchetti.

  • Eclipse è uno dei migliori IDE disponibili in Linux. Supporta diversi linguaggi: Java, C/C++, UML, Javascript, ecc. e altri se ne possono aggiungere con i plugin. Il mio consiglio è scaricare il pacchetto di Eclipse per sviluppatori C/C++ e mantenerlo separato dal resto dell’infrastruttura (Java, ecc.), per esempio nella directory /opt/eclipse-cc. Installate Eclipse con il comando install -v -m755 -d /opt/eclipse-cc && tar xvfz eclipse-cpp-kepler-SR1-linux-gtk.tar.gz. In alternativa, potete cercare l’IDE con il gestore dei pacchetti della vostra distribuzione Linux.

  • Sconsolidator è il plugin per Eclipse che interpone fra SCons e l’IDE una interfaccia utente e un wizard per gestire i progetti C/C++. Senza questo strumento, dovremmo svolgere un lavoro dispendioso.

  • Java: Eclipse è basato su Java e il plugin Sconsolidator è distribuito con archivi jar. Dovrete installare un JDK, per esempio Oracle Java 7; gli utenti di Ubuntu o di altre distro “debian like” daranno per esempio il comando sudo apt-get install oracle-java7-installer ( vd. Java 7 o 6 in Ubuntu 13.04 – 12.10 – 12.04).

Sconsolidator: importazione di un progetto

Sconsolidator: importazione di un progetto

L’installazione di Sconsolidator in Eclipse è una procedura quasi automatica, è sufficiente selezionare “Install new software” presente nel menu Help; poi nella finestra di dialogo cliccare il pulsante “Add” e specificare nel campo “location” l’indirizzo web del plugin (http://www.sconsolidator.com/update). Se la ricerca va a buon fine, Eclipse troverà due componenti: selezionatele entrambe e confermate l’installazione. Al termine dell’operazione dovrete riavviare Eclipse. Controllate nel menu delle preferenze di Eclipse, alla voce SCons, il percorso completo dell’eseguibile di SCons. Potete verificare la posizione con il comando which scons.

A questo punto scaricate il sorgente di ET dal sito di Splash Damage, è un archivio zip, decomprimetelo nella directory Workspace di Eclipse, quella che avete scelto all’avvio dell’IDE, per esempio con il comando unzip ET-GPL.zip.  Bisogna importare il codice di W:ET in Eclipse selezionando la voce “Import” del menu File, cliccare su “New SCons project…”: poi occorre specificare la posizione del codice sorgente del gioco, è la directory src creata con unzip. Immettete un nome a piacere per il vostro progetto, se non vi viene nulla in mente usate pure MY-et-gpl.

La modifica al file SConscript.core

La modifica al file SConscript.core

Tutto il codice deve essere rianalizzato da SCons: cliccate con il tasto destro del mouse (oppure premete ALT+ENTER) sul nome del progetto nel Project Manager di Eclipse, e scegliete l’opzione “Build All” nel menu “Build Configurations”. Poi procedete con la compilazione. Questo è il momento per scoprire quale software manca nel sistema Linux. Io per esempio ho dovuto installare il pacchetto libxxf86dga-dev. Ciò non è comunque bastato, infatti al secondo tentativo la compilazione è terminata con il seguente messaggio di errore:

scons: *** [build/debug/core/et] Source `/usr/X11R6/lib/libXxf86dga.a' not found,
 needed by target `build/debug/core/et'.

libXxf86dga-dev è una libreria statica che normalmente in un sistema Ubuntu si trova in /usr/lib/i386-gnu-linux, ma SCons la cerca da un’altra parte. Ho dovuto correggere questa incongruenza aprendo nell’editor di Eclipse il file SConscript.core (vd. immagine precedente): la stringa staticx11_libs conteneva /usr/X11R6/lib che non andava bene.

Modifica al file g_missile.c

Modifica al file g_missile.c

La modifica del gioco è molto semplice e interessa il file g_missile.c nella directory game. La funzione fire_rocket è predisposta per creare il proiettile del panzerfaust, ne imposta anche le caratteristiche. Cercatela all’interno del file con la funzione “find” di Eclipse. Nel suo blocco di codice c’è una chiamata a un’altra funzione, la VectorScale, dovete cambiare il valore del suo secondo argomento da 2500 a 100. Più si è bassi di valore e più il proiettile rallenta. Potete verificare cosa succede con 0.

VectorScale( dir,100,bolt->s.pos.trDelta );  /* from 2500 to 100 */

Per testare i cambiamenti al codice di W:ET vi occorre non solo un’installazione completa del gioco, ma anche risorse per eseguire in locale un server. C’è un ottimo tutorial scritto in inglese che ho seguito per mettere a punto il sistema client/server sul mio computer, si intitola “Setting Up etded on Linux”.

Wolfenstein: Enemy Territory è stato per una decade un gioco seguito da un discreto numero di fan, venivano organizzati campionati europei e internazionali, i clan erano competitivi e c’erano ottimi “shooter”. Ma a poco è servito mettere il codice sorgente online, lo sviluppo di molte mod è stato interrotto e i giocatori hanno lasciato le arene per altri lidi. Tutto questo prima o poi doveva accadere. L’engine però è open source, a disposizione di chi volesse realizzare una modifica divertente e originale.

Il missile del panzerfaust che ho sparato dalla baracca

Il missile del panzerfaust che ho sparato dalla baracca

Fonti:

  1. Tutorial2
  2. How to install Oracle Java 7
  3. Sconsolidator
  4. A short introduction to the current status quo of this Wolfenstein: Enemy Territory thing

Un IDE per avventure testuali in Linux


La prima avventura testuale per computer si chiamava Colossal Cave, la scrisse Will Crowther per i suoi nipoti e non immaginava che sarebbe diventata l’archetipo dei giochi interattivi per computer. Era senza immagini, senza suono, eppure fece fortuna fra gli anni Settanta e Ottanta del Novecento; infatti ai primordi della computer science la grafica era un’esclusiva dei sistemi mainframe militari e industriali per cui bastava scrivere storie suggestive per conseguire il massimo effetto sul lettore. Inoltre, Crowther programmò il gioco in modo tale che potesse capire e analizzare frasi del tipo “unlock grate“, “get key” e “go north” che il giocatore inseriva nella riga dei comandi, questa caratteristica fece notevole impressione su chi si accostava per la prima volta a un computer.

Plico di schede perforate per computer mainframe

Plico di schede perforate per computer mainframe

Nonostante i progressi tecnologici abbiano reso possibile oggi la realizzazione di giochi per computer con i suoni  e le immagini – la grafica 3D per giunta è diventata sempre più realistica e ricca di dettagli – la produzione di questo genere di avventure è continuata fino ai giorni nostri: giovani e meno giovani rimangono affascinati da una I.F. (acronimo inglese che sta per Interactive Fiction)  scritta bene, i vecchi autori sono stati affiancati dalle nuove leve e i moderni linguaggi di programmazione hanno portato gli interpreti dei comandi fino al World Wide Web. Basandosi sul lavoro di Crowther alcuni ragazzi al MIT scrissero un parser per la loro avventura intitolata “Zork”. In seguito a quell’esperienza nacque la compagnia Infocom che divenne un riferimento fra gli aspiranti scrittori di avventure interattive. Però i manfraime non potevano rimanere nel canale di distribuzione principale dei videogiochi testuali, la piazza era troppo ridotta e il pubblico era composto per lo più da tecnici al lavoro sulle schede perforate; Infocom cercò un modo per far arrivare Zork sui personal computer che iniziavano a diffondersi nelle case agli inizi degli anni Ottanta. La soluzione consisteva di una macchina virtuale che potesse “girare” sui vari modelli di home computer senza dover riscrivere per ogni avventura un interprete compatibile. Chiamarono questo software Zork machine o Z-machine. Il successo fu enorme.

Lo scrittore di storie d’avventure interattive è, prima di tutto, un appassionato di computer con conoscenze di programmazione o un professionista dell’IT, poi è un autore di libri o ha l’hobby della scrittura. Gli strumenti a sua disposizione sono molto sofisticati, dal compilatore all’interfaccia grafica di sviluppo (IDE). In genere questi programmi sono multipiattaforma o open source, ma su Linux il processo di sviluppo è complicato dal fatto che mancano alcune funzionalità. Se l’autore volesse creare una storia con il linguaggio Inform, ideato da Graham Nelson per generare codice compatibile con la Z-machine, potrebbe scegliere fra due IDE: il primo è Gnome Inform7 che dipende molto, in questo caso, dal sistema operativo (e dal Desktop Environment); il secondo è Inform 7 Feature per Eclipse che permette di tenere tutti i progetti Java, C, Php, ecc. assieme a quelli scritti nel linguaggio Inform. Quest’ultima soluzione è l’oggetto di questo articolo. La documentazione ufficiale di Inform 7 fa riferimento invece a un IDE per Windows e OS X che non è disponibile per Linux.

Inform 7 Feature for Eclipse è un insieme di plug-in open source che supporterà lo sviluppo multi-piattaforma dei progetti di I.F., ma che allo stato attuale è sottoposto a test solo su Linux. Nell’ambiente di sviluppo Eclipse la programmazione è facilitata dal controllo della sintassi e da un insieme di caratteristiche tipiche di questo IDE, per esempio il Project Manager, il sistema di controllo versione e l’integrazione con gli altri strumenti di sviluppo e condivisione online. Inform 7 Feature è potenzialmente superiore all’IDE che accompagna il compilatore Inform 7, tuttavia alcune caratteristiche importanti di quest’ultimo non sono state implementate in Inform per Eclipse.

Volendo scrivere una I.F. sotto Linux, la prima cosa da fare è installare Eclipse (*), per esempio quello fornito nell’archivo per gli sviluppatori Java, denominato Eclipse IDE for Java EE Developers, dopodiché si avvia il programma e dal Workbench si seleziona la voce “Installa nuovo software” del menu Aiuto. È indispensabile la connessione online, perché in questo modo viene automatizzato il processo di installazione del plug-in in Eclipse e sono risolte al volo le dipendenze dai pacchetti supplementari.

Installa il plug-in Inform 7 per Eclipse

Installa il plug-in Inform 7 per Eclipse

Nella finestra di dialogo occorre premere il pulsante “Aggiungi” e inserire nei due campi un nome (a piacere) per il plugin e il suo indirizzo web che in questo caso specifico è http://inform-eclipse.sf.net/updates (vd. immagine seguente). L’avvertimento che compare durante il download segnala il fatto che il plugin è privo di firma, ma può essere tranquillamente ignorato. A questo punto è necessario un riavvio di Eclipse e procedere con la configurazione di Inform 7 Feature.

Selezione del plugin Inform 7 per Eclipse

Selezione del plugin Inform 7 per Eclipse

La configurazione riguarda alcune aggiunte alla prospettiva nel workbench e altre che attivano le funzioni per la scrittura delle avventure in linguaggio Inform 7. Nel menu “Finestra” (o Window) c’è la voce “Mostra vista” (o Show view in inglese) e la sottovoce “Altro”. La dialog box presenta un elenco di componenti elencate in ordine alfabetico, a noi interessa quella etichettata con “Inform 7 Skein” che aggiunge il riguadro Transcript alla vista inferiore della prospettiva di Eclipse. Il passo successivo prevede l’inserimento di alcuni comandi al menu “Run” nella barra degli strumenti principale e l’individuazione dell’interprete nel sistema. Procediamo nel seguente modo:

  1. Nel menu Finestra selezionare “Prospettiva personalizzata” (o Custom perspective).

  2. Nella scheda dei gruppi di comandi cercare l’opzione “Inform 7 presentation” e attivarla.

  3. Nelle preferenze di Eclipse, alla voce Inform 7, inserire il percorso verso la directory di installazione dell’interprete del linguaggio.

  4. Salvare la prospettiva (Windows, Save perspective as…)
Configurazione interprete Inform 7

Configurazione interprete Inform 7

Ogni storia interattiva è gestita separatamente dai progetti scritti in altri linguaggi di programmazione, inoltre il singolo progetto è presentato nel Project manager con una cartella collegata a un albero di directory e file. Per crearne uno in linguaggio Inform 7:

  1. Selezionare il menu File, la voce New e quindi scegliere “Altro” dall’elenco presentato nella tendina.

  2. Cercare “Inform 7 Project” nella dialog box del wizard di Eclipse, premere il pulsante Next (o Successivo).

  3. Scegliere un nome per il progetto e una directory di lavoro oppure lasciare quella suggerita da Eclipse.

  4. Premere il pulsante “Finish”

Si noterà un’icona rossa a fianco del nome del progetto, ma non c’è da preoccuparsi perché segnala che il file sorgente è vuoto e pertanto l’avventura non può essere costruita. Aprite il file story.ni nella cartella Source, spostatevi poi nell’’editor e aggiungete sotto alla riga con il titolo dell’avventura la seguente frase:  “The Office is a room”, quindi salvatelo premendo la combinazione di tasti CTRL+S, l’icona sparirà. Infine, create il file di skein nella directory source: è sufficiente selezionare la cartella Source e nel menu File la voce “New file”, poi specificare un nome di file con estensione skein.

Editing di un'avventura

Editing di un’avventura

Per compilare la storia ed eseguirla, cliccare sul nome del progetto con il tasto destro del mouse, quindi selezionare la voce “Run as” e “Run configurations…”. Nella finestra di dialogo, alla voce Inform 7, aggiungere una nuova configurazione di esecuzione, specificando il nome del progetto, il tipo di file generato (per esempio z8) e avendo cura di attivare l’opzione “Run” nella scheda “Common”.

Ogni anno viene indetta una competizione internazionale organizzata da un gruppo di fan di Interactive Fiction; questa comunità si chiama Interactive Fiction Community, ha un sito web e un portale dedicato alla gara dove chiunque può leggere le avventure testuali presentate dai candidati e votarle (previa registrazione). Questa cosa va avanti da diciotto anni, è l’occasione per giocare alcune delle migliori I.F. in circolazione scrite in lingua inglese (purtroppo vengono accettati solo lavori scritti in questa lingua). Le votazioni terminano il 15 novembre. Inform7 Feature è lo strumento adatto per prendere confidenza con il linguaggio Inform7, scrivere la propria storia interattiva con Linux e presentarla in tempo per la competizione dell’anno prossimo venturo.

(*) Eclipse dipende dall’interprete Java, se non fosse già installato bisogna scaricarlo da Internet con un gestore di pacchetti della distribuzione Linux in uso oppure prelevarlo direttamente dal sito di Oracle. Analagomente Eclipse può essere fornito dalla distribuzione o installato nella versione “all-in-one” specificata in precedenza. In questo caso il comando d’installazione per il terminale Linux è tar xvfz ./eclipse-jee-kepler-SR1-linux-gtk.tar.gz, preferibilmente da eseguire nella directory /opt.

Fonti dell’articolo: An Introduction to Gnome Inform7, Part 1 § http://inform-eclipse.sourceforge.net/