Inform e Glulx/RUINS, l'avventura comincia/La fine di RUINS è giunta (ma con Inform siete solo all'inizio)
Vi dirigete verso l’alto e vi ritrovate dentro la gabbia di ferro (questa volta senza scheletri). Dal pavimento della gabbia, un pozzo di terracotta scende nella cripta, ma voi non ne volete assolutamente sapere di tornare là sotto; c’è troppa umidità, che fa solo male alle vostre povere ossa. Uscite dalla gabbia e spingete la lampada al sodio verso nordovest. Dovete fare presto, perché la luce da essa emessa diventa sempre più debole: procedete allora verso nord più velocemente che potete, fino poi a ritrovarvi nella Sala Quadrata. Qui, la lampada al sodio si affievolisce e improvvisamente si spegne. Siete letteralmente disperati: la vostra cara lampada è morta e non potete neanche farle un funerale. La raccogliete con le lacrime agli occhi e salite finalmente verso la superficie. Vi dirigete verso la vostra cassa da imballaggio, depositate tutti i tesori che avete trovato e vi lasciate infine cadere, esausti come non mai, per terra. Un macao dalla coda rossa fluttua giù dalle cime degli alberi, con le piume appesantite dalla pioggia recente. Il battito delle sue ali è quasi assordante, e delle pietre crollano una sull'altra. Come il cielo si schiarisce, una luna crescente sorge sopra una tranquilla giungla. È la fine di marzo del 1938, ed è l'ora di tornare a casa...
La fine di RUINS è giunta (ma con Inform siete solo all'inizio)
[modifica | modifica sorgente]Spesso, non basta assegnare una semplice direzione a una stanza. È quello che accade in questa "nuova" versione della Cripta
:
Object Burial_Shaft "La Cripta" with description "Sui tuoi appunti di lavoro puoi leggere..."; n_to Wormcast, u_to [; cage.floor_open = true; self.u_to = self.opened_u_to; move selfobj to self; print "Con un balzo poderoso, cozzi sopra il sigillo di terracotta posto…”; ChangePlayer(selfobj); give warthog ~light ~proper; <<Look>>; ], cant_go "Gli architetti di questa sala sono stati avari nel fornirla di uscite. Alcuni facoceri, comunque, sembrano aver scavato dei cunicoli da nord.", before [; Jump: <<Go u_obj>>; ], opened_u_to [; PlayerTo(cage); rtrue; ], has female light;
Quando il giocatore si dirige verso l’alto (quando tenta, cioè, di uscire dalla cripta), accadono diverse cose:
- la variabile locale
floor_open
(vedremo fra poco a cosa serve) appartenente all’oggettocage
(la gabbia di ferro) valetrue
; - l’istruzione
u_to
punta alla funzioneopened_u_to
; - il giocatore viene, come abbiamo già visto nel paragrafo precedente, trasformato da facocero in archeologo.
La funzione opened_u_to
, a sua volta, "teletrasporta" il giocatore nella gabbia di ferro[1]:
Object -> cage "gabbia di ferro" with name 'ferro' 'gabbia' 'sbarre' 'struttura' 'simboli', description "Puoi leggere i seguenti simboli: Uccello Freccia Facocero.", inside_description [; if (self.floor_open) "Dal pavimento della gabbia, un pozzo di terracotta scende nella cripta."; "Sei circondato dalle sbarre della gabbia."; ], when_open "Una gabbia di ferro, di aspetto alquanto sinistro, ha la porta aperta. @`E abbastanza larga da poterci entrare dall'alto e ci sono alcuni simboli sulla struttura.", when_closed "La gabbia di ferro @`e chiusa.", after [; Enter: print "Gli scheletri che popolano la gabbia ritornano in vita, bloccandoti con le loro mani ossute, schiacciandoti e prendendoti a pugni. Perdi conoscenza e quando ti risvegli, ti rendi conto che @`e accaduto qualcosa di impossibile e grottesco...^"; move warthog to Antechamber; remove skeletons; give self ~open; give warthog light; self.after = 0; ChangePlayer(warthog, 1); <<Look>>; ], react_before [; Go: if (noun == d_obj && self.floor_open) { PlayerTo(Burial_Shaft); rtrue; } ], floor_open false, has female enterable transparent container openable open static;
Per quanto riguarda la proprietà inside_description
, se la variabile locale floor_open
vale true
, allora Inform stampa a video il messaggio "Dal pavimento della gabbia, un pozzo di terracotta scende nella cripta.
". Altrimenti (se, cioè, floor_open
vale false
), stampa a video il messaggio alternativo ("Sei circondato dalle sbarre della gabbia.
"):
Anticamera (dentro la gabbia di ferro) I cornicioni formano, a sudest del Tempio, una curiosa anticamera. La lampada al sodio, posata a terra, si sta lentamente consumando. Dal pavimento della gabbia, un pozzo di terracotta scende nella cripta. ></code> |} Dal momento che la proprietà <code>after</code> vale <code>zero</code> gli scheletri non appaiono più, mentre la proprietà <code>react_before</code> fa sì che, quando il giocatore si dirige verso il basso con la variabile <code>locale floor_open = true</code>, sia possibile accedere alla <code>Cripta</code><ref>Cliccate [http://www.vincenzoscarpa.it/inform/manuale/Capitolo4_esercizi.zip qui] per scaricare il listato di questo esercizio (il file '''4.15.inf''').</ref>. Una volta raccolti e depositati tutti i tesori nella <code>cassa da imballaggio</code>, viene assegnato il valore <code>2</code> alla variabile di libreria <code>deadflag</code> nella classe <code>Treasure</code>: Class Treasure with before [; . . . if (score == MAX_SCORE) { deadflag = 2; print_ret "Come depositi con attenzione ", (the) noun, " un macao dalla coda rossa fluttua gi@`u dalle cime degli alberi, con le piume appesantite dalla pioggia recente. Il battito delle sue ali @`e quasi assordante, e delle pietre crollano una sull'altra.^ Come il cielo si schiarisce, una luna crescente sorge sopra una tranquilla giungla. @'E la fine di marzo del 1938, ed @`e l'ora di tornare a casa."; } . . . cultural_value 5, photographed_in_situ false; e l’avventura termina con una bella vittoria: <pre>Il Grande Altopiano La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà. >posa il favo nella cassa Come depositi con attenzione il favo un macao dalla coda rossa fluttua giù dalle cime degli alberi, con le piume appesantite dalla pioggia recente. Il battito delle sue ali è quasi assordante e delle pietre crollano una sull'altra. Non appena il cielo si schiarisce, una luna crescente sorge sopra una tranquilla giungla. È la fine di marzo del 1938, ed è l'ora di tornare a casa. *** Hai vinto *** In questa partita hai totalizzato 30 punti su 30 possibili, in 117 turni, guadagnando il rango di Direttore della Fondazione Carneige. Vuoi RICOMINCIARE, CARICARE una partita salvata o USCIRE ? >uscire
Un altro esercizio che può essere utile a scopo didattico, è la creazione di un trono su cui potersi sedere sopra:
Object Square_Chamber "La Sala Quadrata"... Object -> "iscrizioni scolpite"... Object -> sunlight "raggio di sole"... Object -> throne "trono di pietra" with name 'trono' 'pietra', initial "Alcuni gradini di pietra, bassi e squadrati, portano verso un trono maestoso, anch'esso di pietra.", after [; Enter: print_ret "Ti sei seduto sul trono."; Exit: print_ret "Ora sei di nuovo in piedi."; ], has supporter enterable;
Questo oggetto, come potete facilmente vedere, si trova nella Sala Quadrata
. Ecco come funziona:
La Sala Quadrata Sei in una sala di pietra oscura e profonda, larga circa dieci metri. Un raggio di sole, proveniente dalla cima della scalinata, la illumina diffusamente, ma le ombre del livello più basso rivelano dei passaggi verso est e sud, che conducono verso la più profonda oscurità del Tempio. Delle iscrizioni scolpite riempiono le pareti, il pavimento e il soffitto. Alcuni gradini di pietra, bassi e squadrati, portano verso un trono maestoso, anch'esso di pietra. >siediti sul trono Ti sei seduto sul trono. >g La Sala Quadrata (sopra il trono di pietra) Sei in una sala di pietra oscura e profonda, larga circa dieci metri. Un raggio di sole, proveniente dalla cima della scalinata, la illumina diffusamente, ma le ombre del livello più basso rivelano dei passaggi verso est e sud, che conducono verso la più profonda oscurità del Tempio. Delle iscrizioni scolpite riempiono le pareti, il pavimento e il soffitto. >s Dovresti toglierti da sopra il trono di pietra prima. >alzati dal trono Questo è un verbo che non conosco. >
Il primo problema da risolvere è che in Infit (v2.5) manca di fatto la definizione del verbo alzati
, ma, come dice un vecchio detto, a tutto c’è rimedio:
Verb 'alzati' = 'esci';
Grazie a questa riga di codice (da posizionare alla fine del listato di Ruins, subito sotto la riga di codice Verb 'fotografa' * noun...
, abbiamo il nostro verbo funzionante e pronto per essere usato:
La Sala Quadrata (sopra il trono di pietra) Sei in una sala di pietra oscura e profonda, larga circa dieci metri. Un raggio di sole, proveniente dalla cima della scalinata, la illumina diffusamente, ma le ombre del livello più basso rivelano dei passaggi verso est e sud, che conducono verso la più profonda oscurità del Tempio. Delle iscrizioni scolpite riempiono le pareti, il pavimento e il soffitto. >s Dovresti toglierti da sopra il trono di pietra prima. >alzati dal trono Ora sei di nuovo in piedi. >g La Sala Quadrata Sei in una sala di pietra oscura e profonda, larga circa dieci metri. Un raggio di sole, proveniente dalla cima della scalinata, la illumina diffusamente, ma le ombre del livello più basso rivelano dei passaggi verso est e sud, che conducono verso la più profonda oscurità del Tempio. Delle iscrizioni scolpite riempiono le pareti, il pavimento e il soffitto. Alcuni gradini di pietra, bassi e squadrati, portano verso un trono maestoso, anch'esso di pietra. >
Volendo, è possibile fare in modo che il giocatore non sia costretto a digitare tutte le volte i comandi "siediti sul trono
" e "alzati dal trono
" ma, più semplicemente, "siediti
" e "alzati
". Ecco allora le modifiche da apportare all’oggetto throne
:
Object -> throne "trono di pietra" with name 'trono' 'pietra', initial "Alcuni gradini di pietra, bassi e squadrati, portano verso un trono maestoso, anch'esso di pietra.", after [; Enter: print_ret "Ti sei seduto sul trono."; Exit: print_ret "Ora sei di nuovo in piedi."; ], react_before [; Enter: if (noun == nothing) <<Enter self>>; Exit: if (noun == nothing && player in self) <<Exit self>>; ], has supporter enterable;
L’uso più comune della proprietà react_before
, come abbiamo già visto nel quarto paragrafo di questo capitolo, è quello di evitare le azioni senza oggetto. Per quanto riguarda l’azione Enter
, se noun == nothing
(se cioè il giocatore digita solo "siediti
"), Inform fa sedere l’archeologo sul trono; per quanto riguarda invece l’azione Exit
, se noun == nothing
(se cioè il giocatore digita solo "alzati
"), Inform fa alzare l’archeologo dal trono, solo però se è seduto su di esso (&& player in self
). Ma c’è ancora un piccolo problema:
La Sala Quadrata Sei in una sala di pietra oscura e profonda, larga circa dieci metri. Un raggio di sole, proveniente dalla cima della scalinata, la illumina diffusamente, ma le ombre del livello più basso rivelano dei passaggi verso est e sud, che conducono verso la più profonda oscurità del Tempio. Delle iscrizioni scolpite riempiono le pareti, il pavimento e il soffitto. Alcuni gradini di pietra, bassi e squadrati, portano verso un trono maestoso, anch'esso di pietra. >siediti Su cosa vuoi sederti? >siediti sul trono Ti sei seduto sul trono. >alzati Ora sei di nuovo in piedi. >
Come potete vedere, il comando "siediti
" non funziona ancora da solo. Il problema è relativo alla definizione del verbo siediti
in Infit:
Verb 'siedi' 'siediti' 'sdraiati' * 'su'/'sul'/'sullo'/'sull^'/'sulla'/'sui'/ 'sugli'/'sulle'/'sopra' noun -> Enter * 'a'/'ad'/'all^'/'allo'/'alla'/'al'/'agli'/'ai'/ 'alle' noun -> Enter * 'dentro'/'in'/'nel'/'nello'/'nell^'/'nella'/ 'negli'/'nelle'/'nei' noun -> Enter;
Manca, in poche parole, la seguente riga di codice:
Extend 'siediti' first * -> Enter;
che va inserita alla fine del listato di Ruins subito sotto la riga di codice Verb 'alzati' = 'esci';
Provare per credere...
L’ultima parte di codice da esaminare in Ruins, è la funzione TitlePage
:
[ TitlePage i; ClearScreen(); print "^^^^^^^^^^^^^"; i = ScreenWidth(); if (i > 30) i = (i-30)/2; style bold; font off; spaces(i); print " RUINS^"; style roman; print "^^"; spaces(i); print "[Premi SPAZIO per iniziare.]^"; font on; box "Ma l'alligatore non stava scavando il fondo della buca" "Che avrebbe dovuto essere la sua tomba" "Piuttosto era lui che stava scavando la propria buca" "Come riparo per se stesso" "" "-- dal Popol Vuh"; KeyCharPrimitive(); ClearScreen(); ];
con la quale si ottiene il seguente risultato:
Siamo quindi di fronte a una sorta di "presentazione" dell’avventura. L’istruzione ClearScreen
, come abbiamo già visto, pulisce lo schermo. Per quanto riguarda invece gli stili[2], Inform ne mette a disposizione cinque:
che corrispondono alle seguenti istruzioni:
style roman; ! (normale)
style bold; ! (grassetto)
style underline; ! (corsivo)
style reverse; ! (reverse)
style fixed; ! (preformattato) – equivalente a font off
L’istruzione font off
attiva il font a spaziatura fissa, dove i singoli caratteri hanno la stessa distanza fra di loro (il Times New Roman, uno dei font che ho utilizzato per scrivere questo manuale, è ad esempio uno di quelli che non ha questa caratteristica). Detto questo, occorre capire che in inform, azioni come la centratura del testo rispetto allo schermo sono possibili solo con un font a spaziatura fissa, e quindi solo in modalità font off
[3].
L’istruzione spaces(i)
sposta il testo alla destra dello schermo di n
posizioni. L’istruzione if
relativa alla variabile i
è un sistema piuttosto contorto per far sì che il testo appaia sempre in una specifica posizione tenendo però conto della larghezza dello schermo (che è di fatto il valore restituito alla variabile locale i
dall’istruzione ScreenWidth
), che varia al variare della dimensione della finestra di Windows Frotz 2002 (o di qualsiasi altro interprete Z-code). La larghezza della mia finestra di Windows Frotz 2002 è, tanto per fare un esempio, 70: questo significa che il numero massimo di posizioni consentite per un singolo carattere è 69, mentre per quanto riguarda una parola o addirittura un’intera frase, il numero massimo di posizioni consentite cambia a seconda del numero di caratteri che compongono queste ultime. A ogni modo, se il numero di posizioni supera il "limite" consentito, Inform continua la visualizzazione del testo alla riga successiva, come accade nel seguente esempio:
Per questa frase il limite massimo di posizioni onde evitare che una parte del testo possa andare a capo, è 43. Comunque, vi consiglio di posizionare il vostro testo nella posizione in cui vi piace, mantenendo però l’istruzione if
come riferimento:
[ TitlePage i; ClearScreen(); print "^^^^^^^^^^^^^"; i = ScreenWidth(); if (i > 30) i = (i-30)/2; style bold; font off; spaces(i+10); print " RUINS^"; style roman; print "^^"; spaces(i); print "[Premi SPAZIO per iniziare.]^"; font on; . . .
aggiungendo ad esempio il valore 10 alla variabile locale i
nella prima istruzione spaces, la scritta "RUINS
" risulterà spostata un po’ più a destra, ma verrà sempre presa in considerazione la larghezza dello schermo. Se la si vuole invece centrare si deve allora ricorrere all’istruzione Centre
:
[ TitlePage; ClearScreen(); print "^^^^^^^^^^^^^"; style bold; font off; Centre("RUINS"); style roman; print "^^"; Centre("[Premi SPAZIO per iniziare.]"); print "^"; font on; . . .
ottenendo così il seguente risultato:
Quando invece non si vuole più usare il font a spaziatura fissa previsto da Inform, l’istruzione font on
ripristina il font precedentemente usato da Windows Frotz 2002 per visualizzare il testo del gioco. L’istruzione box "..."
apre un riquadro al cui interno viene visualizzato il testo racchiuso tra le virgolette[4], mentre l’istruzione KeyCharPrimitive
, come abbiamo già visto, aspetta la pressione di un tasto qualsiasi da parte dell’utente (o meglio, del giocatore).
Se vogliamo fare in modo che il giocatore, anziché premere un tasto qualsiasi, debba aspettare un certo periodo di tempo prima di procedere con l’avventura, si deve ricorrere all’utilizzo dell’istruzione KeyDelay
. Sostituendo quindi l’istruzione KeyCharPrimitive
con KeyDelay(40)
il giocatore aspetterà 40 decimi di secondo; a ogni modo, se è "impaziente", potrà comunque premere un tasto qualsiasi per andare avanti.
È anche possibile fare in modo che Inform stampi a video il numero di versione e il numero di serie da noi voluto:
Constant Story "RUINS"; Constant Headline "^Un esempio di lavoro interattivo.^ Copyright (c) 1999 di Graham Nelson.^ Traduzione e adattamenti di Vincenzo Scarpa e Raffaello Valesio (c) 2002-2003 su permesso dell'autore.^^"; Constant MAX_CARRIED = 7; Constant MAX_SCORE = 30; Release 2; Serial "025207"; Include "Parser"; . . .
così come di prevedere, ad esempio, il comando "aiuto
"[5]:
[ PhotographSub... [ AiutoSub; print "Sei proprio sicuro di volere un aiuto sul gioco? (s/n)^^>"; if (yesorno()) { if (player in Forest && steps.rubble_filled == true) "Non riesci a rimuovere le macerie? Prova a mangiare il fungo..."; "Spiacente... nessun aiuto qui."; } ]; Verb 'fotografa'... Verb 'aiuto' 'help' * -> Aiuto;
Se il giocatore digita questo comando quando si trova nel Grande Altopiano
e l’entrata della piramide è bloccata dalle macerie, Inform stampa a video il relativo consiglio, altrimenti lo informa che nessun aiuto è disponibile in quel punto del gioco:
Il Grande Altopiano I tuoi appunti menzionano qualcosa circa questa bassa scarpata di calcare, ma la foresta pluviale ne ha rivendicato il possesso. Cupi ulivi crescono ovunque, e una pioggia appena smessa riempie l'aria con una calda nebbia bagnata. La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità. Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo. La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà. >aiuto Sei proprio sicuro di volere un aiuto sul gioco? (s/n) >s Non riesci a rimuovere le macerie? Prova a mangiare il fungo... >
Volendo essere estremamente pignoli, possiamo addirittura prevedere l’inserimento di una password:
[ AiutoSub password; print "Sei proprio sicuro di volere un aiuto sul gioco? (s/n)^^>"; if (yesorno()) { print "Inserisci la password: "; keyboardPrimitive(buffer, parse); password = parse-->1; if (password == 'fungo') { if (player in Forest && steps.rubble_filled == true) "Non riesci a rimuovere le macerie? Prova a mangiare il fungo..."; "Spiacente... nessun aiuto qui."; } else "^Non sembra essere quella giusta..."; } ];
Alla richiesta di aiuto, se il giocatore non digita la password corretta il suggerimento non viene visualizzato. Naturalmente, oltre alla password corretta, il giocatore si deve trovare nel Grande Altopiano
e l’entrata della piramide deve essere bloccata dalle macerie:
Il Grande Altopiano I tuoi appunti menzionano qualcosa circa questa bassa scarpata di calcare, ma la foresta pluviale ne ha rivendicato il possesso. Cupi ulivi crescono ovunque, e una pioggia appena smessa riempie l'aria con una calda nebbia bagnata. La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità. Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo. La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà. >aiuto Sei proprio sicuro di volere un aiuto sul gioco? (s/n) >s Inserisci la password: funghi Non sembra essere quella giusta... >aiuto Sei proprio sicuro di volere un aiuto sul gioco? (s/n) >s Inserisci la password: fungo Non riesci a rimuovere le macerie? Prova a mangiare il fungo... >prendi il fungo Hai raccolto abilmente il fungo, senza staccarlo dal suo gambo sottile. >mangia il fungo Lo sgranocchi ad un angolo, incapace di capire l'origine di un gusto così acre, distratto dal volo di un macao sopra la tua testa che sembra quasi un'esplosione nel sole. Il battito delle sue ali è quasi assordante, e delle pietre crollano una sull'altra. >aiuto Sei proprio sicuro di volere un aiuto sul gioco? (s/n) >s Inserisci la password: fungo Spiacente... nessun aiuto qui. >
Il comando "informazioni
":
[ PhotographSub... [ AiutoSub... [InformazioniSub; "Ruins è un esempio interattivo scritto da Graham Nelson per l’Inform Designer’s Manual.^ Traduzione in italiano a cura di Vincenzo Scarpa e Raffaello Valesio.^ Per segnalazioni e contatti scrivete all’indirizzo e-mail scarvin@@64libero.it. "; ]; Verb 'fotografa'... Verb 'aiuto' 'help'... Verb 'informazioni' 'info' 'crediti' 'credits' * -> Informazioni;
può essere utile al giocatore per sapere come contattare l’autore nel caso in cui gli voglia chiedere, ad esempio, qual è la soluzione del gioco, se è possibile reperire il listato, o altro ancora:
Dopo giorni di inutili ricerche, passati senz'acqua attraversando i rovi della foresta, alla fine la tua pazienza è stata ricompensata: hai fatto una scoperta! RUINS Un esempio di lavoro interattivo. Copyright (c) 1999 di Graham Nelson. Traduzione e adattamenti di Vincenzo Scarpa e Raffaello Valesio (c) 2002-2003 su permesso dell'autore. Versione 1 -- Numero di serie 041109 Inform v6.30 -- Libreria 6/11 -- Infit v2.5 S Il Grande Altopiano I tuoi appunti menzionano qualcosa circa questa bassa scarpata di calcare, ma la foresta pluviale ne ha rivendicato il possesso. Cupi ulivi crescono ovunque, e una pioggia appena smessa riempie l'aria con una calda nebbia bagnata. La "Struttura 10" è un cumulo di materiali da costruzione, che una volta avrebbero potuto costituire una piramide sepolcrale, ma della quale ora nulla rimane, eccetto alcuni gradini scolpiti nella nuda roccia che portano giù, nell'oscurità. Un fungo macchiato cresce dalla terra fradicia, su un gambo lungo. La tua cassa d'imballaggio giace qui, pronta per contenere eventuali scoperte di alto valore culturale da riportare alla civiltà. >informazioni Ruins è un esempio interattivo scritto da Graham Nelson per l'Inform Designer's Manual. Traduzione in italiano a cura di Vincenzo Scarpa e Raffaello Valesio. Per segnalazioni e contatti scrivete all'indirizzo e-mail scarvin@libero.it. >
Un altro comando piuttosto importante da implementare è "istruzioni
", con lo scopo di spiegare ai non esperti come giocare a un’avventura testuale, argomento che non deve mai essere dato per scontato. Il codice è praticamente identico al comando precedente tranne, ovviamente, che per il nome.
Note
[modifica | modifica sorgente]- ↑ Quest’azione è possibile perché l’oggetto
cage
ha l’attributoenterable
. - ↑ Gli stili del testo possono essere gestiti più comodamente con la libreria
style.h
. Ulteriori informazioni sul suo utilizzo potete trovarle nel prossimo capitolo. - ↑ In realtà queste azioni sono teoricamente possibili anche con i font a spaziatura variabile ma, poiché i valori delle coordinate di riferimento cambiano di volta in volta a seconda del font utilizzato, non sono fattibili da un punto di vista "pratico" perché in Inform non si può stabilire uno specifico font da utilizzare di default.
- ↑ La libreria
boxclever.h
permette di creare dei riquadri con, oltre al testo normale, anche il grassetto e il corsivo. Ulteriori informazioni sul suo utilizzo potete trovarle nel prossimo capitolo. - ↑ I suggerimenti possono essere gestiti anche attraverso le librerie
flags_it.h
etutor.h
. Ulteriori informazioni sul loro utilizzo potete trovarle nel prossimo capitolo.