// Idra - esempio di impiego degli oggetti - (C) 2000 Enrico Colombini

// Questo file utilizza o estende Idra: le parti di programmazione HTML 
// e JavaScript qui contenute sono soggette alla medesima licenza GNU GPL
// di Idra stesso, vedi i file idra.js e Licenza.html per i dettagli.


// *** Esempio di impiego delle estensioni per gli oggetti; i commenti che
// *** iniziano con tre asterischi (come questo) indicano i punti significativi


// ===== Informazioni =======================================================


// Mostra informazioni sul gioco

function Informazioni() {
  apriPagina('bgcolor="#ccccff"')
  testo("&nbsp;<p>")
  titolo("Informazioni su \"La porta della Torre\"")
  testo("<center>")
  testo("&nbsp;<br>Esempio di impiego delle estensioni per oggetti di Idra<br>&copy; 2000 Enrico Colombini")
  testo('<p>Ringraziamenti a Tommaso Percivale (<a href="mailto:percy@iperlibri.com">percy@iperlibri.com</a>)<p>&nbsp;<br>')
  rinvio("Continua", "ridisegna()")
  testo("</center>")
  chiudiPagina()
}


// ===== Funzioni chiamate dall'interprete ==================================


// Inizia una nuova lettura: azzera le variabili di gioco e va alla prima pagina

function Inizia() {

// *** Le normali variabili di gioco, inclusi gli oggetti e attori

  v.flag1 = 0 //questa non sara' un oggetto
  v.astolfo = 1
  v.spada = 1
  v.flag2 = 1 //e nemmeno questa
  v.coppa = 0 
  v.chiave = 1
  v.chiave2 = 0

// *** Variabili (v. sottinteso) da trattare come oggetti, e relativa scritta da mostrare

  definisciOggetti(new Array(
    "astolfo", "Il prode Astolfo", 
    "spada", "Una spada nera", 
    "coppa", "La Coppa dei Lamenti", 
    "chiave", "La chiave della Torre", //oggetto che cambia sostanza
    "chiave2", "La chiave della Torre"))
  
// *** opzioni riguardanti la presentazione degli oggetti e quella dei rinvii speciali

  opzioniOggetti('bgcolor="#cccccc"', "<br>", "&nbsp;&nbsp;&nbsp;&nbsp;", "")
  opzioniRinvioOgg('<font color="#cc0099">', '</font>')

  vai(Torre) //prima pagina
}


// All'inizio di ogni pagina: fa una riga di stacco 

function Intestazione(pag) {
  testo("<br>")
}


function PiePagina(pag) {

  // *** Aggiorna l'elenco degli oggetti ogni volta che mostra una pagina
  // *** deselezionando un eventuale oggetto selezionato in precedenza

  mostraOggetti("")  //Deseleziona eventuale oggetto
}


// *** Funzione opzionale per scrivere o disegnare la descrizione di un oggetto
// *** nell'inventario; viene chiamata dopo avere aperto un tag <a>; "ogg" puo'
// *** essere utile per descrivere un certo oggetto in modo particolare

function DescriviOggetto(ogg, desc, selez) {
  if (selez) {
    testoOggetti('<font color="#cc0000"><b>', desc, "</b></font>")
  } else {
    testoOggetti('<font color="#006600">', desc, "</font>")
  }
}



// === Funzioni ausiliarie ==================================================

// *** Funzione aggiunta per comodita':
// *** mostra una risposta in una pagina apposita, terminata con "Continua"
// *** cui e' associata l'azione o pagina act ("aggiorna()" se non indicata);
// *** ricordarsi di non fare azioni cumulative (es. v.soldi++) nelle pagine

function Risp(t, act) {
  apriPagina('bgcolor="#ffccff"')
  testo("<br>&nbsp<br>", t) 
  if (act) { continua(act) } else { continua("aggiorna()") }
  chiudiPagina()
}


// === Pagine del racconto ==================================================

// *** Esempi di messaggi definiti separatamente, per semplicita' di scrittura;
// *** devono stare al di fuori delle funzioni, per chiarezza si possono mettere
// *** subito prima della funzione a cui si riferiscono, la "M_" e' una convenzione
// *** per evitare interferenze con altri nomi di variabili o funzioni

  var M_torre1 = "La porta è chiusa a chiave."
  var M_torre2 = "Non mi sembra la scelta adatta per agire su una porta."
  var M_torre3 = "La chiave non entra nemmeno nella serratura: i suoi intagli sono piegati dalla parte sbagliata.<p>Eppure il Barone pareva sicuro che si trattasse della chiave di questa torre."
  var M_torre4 = "Assali ferocemente la porta a colpi di spada, ben deciso ad averne ragione.<p>La porta, imperterrita, non si scalfisce nemmeno.<p>In compenso, dopo una decina di colpi la spada si spezza di netto con un secco rumore metallico. Getti il moncone ormai inutilizzabile."


// *** Esempio di pagina con un rinvio dipendente dagli oggetti; 
// *** usa i messaggi definiti separatamente piu' sopra

function Torre() {
  titolo("Fuori dalla torre")
  testo("La torre si erge imponente; l'unica via di accesso sembra essere una pesante ")

  // *** Rinvio dipendente dagli oggetti, usa la funzione Risp per presentare le risposte

  rinvioOgg("porta", "Risp(M_torre1)", 
            "+", 'Risp(M_torre2)', //se si usa un oggetto non elencato tra questi
            "chiave", "Risp(M_torre3)",
            "spada", "Risp(M_torre4); v.spada = 0",
            "chiave2", Fine) //non presenta pagine di risposta, va direttamente a Fine()
  testo(" in legno massiccio, dall'aria estremamente solida.<p>Un viottolo scarsamente battuto conduce nel folto della ")
  rinvio("foresta", Foresta)
  testo(", ma non sembrano esservi tracce in quella direzione.")
}


// *** Esempio di pagina con i messaggi di risposta scritti direttamente
// *** nella chiamata alla rinvioOgg(), per evitare l'uso di variabili
// *** separate (come M_torre1 nell'esempio precedente); e' piu' compatta
// *** ed efficiente, ma meno leggibile

function Foresta() {
  titolo("Nella radura")
  testo("Dopo una mezz'ora di cammino giungi in una radura, al centro della quale si erge solitaria una maestosa quercia, che ha l'aria di essere qui da centinaia di anni.<p>Nel legno stesso del grande albero è solidamente incastrato un piccolo ")

  // *** Rinvio dipendente dagli oggetti, usa la funzione Risp per presentare le risposte

  rinvioOgg("specchio ovale", 'Risp("Ti sembrerà strano, ma lo specchio riflette fedelmente ciò che gli poni davanti. Cosa credevi, che fosse uno specchio magico?")',
            "chiave", 'v.chiave = 0; v.chiave2 = 1; Risp("Tieni la chiave di fronte allo specchio, in modo da vederne il riflesso; tutt&#39;a un tratto senti una forza irresistibile che attira la chiave verso il suo riflesso, finché le due sembrano incrociarsi sulla superficie argentata.<p>Passa qualche istante senza che nulla accada.<p>Infine lo specchio rilascia lentamente la chiave, che sembra in qualche modo cambiata, ma non sapresti dire esattamente perché.")')
  testo("; forse la corteccia gli &egrave; cresciuta attorno, incorporandolo nel tronco col passare degli anni.<p>Qui la strada finisce, non puoi fare altro che tornare alla ")
  rinvio(" torre", Torre)
  testo(".")
}


function Fine() {
  titolo("Buio pesto")
  testo("Sei entrato nella torre!<p>Purtroppo l'interno è labirintico e la visibilità è troppo scarsa per riuscire ad avanzare più di qualche passo, quindi non resta che rimandare a quando ti sarai procurato una fonte luminosa.<p>Nel frattempo, ahimé, la dimostrazione è", '<font color="#cc0000"><b> finita.<b></font>')
}



