! Villa Morgana ! Avventura Testuale dimostrativa realizzata da Paolo Lucchesi ! Questo prodotto e' libero, rilasciato sotto licenza GPL (Gnu Public License), ! riportata nel file allegato gpl.txt. ! Questo prodotto e' distribuito senza alcuna garanzia. L'autore non puo' essere ! ritenuto responsabile per qualsiasi danno dovuto direttamente o indirettamente ! all'uso del prodotto. ! ------------------------------------------ ! Sotterranei ! ------------------------------------------ Room galleria1 "Sotterranei" with name 'galleria' 'sotterranei' 'caverna', description [; "La poca luce illumina una galleria scavata nella roccia, sotto la villa, che procede tortuosamente in direzione nord-est. Una scala a chiocciola risale lungo il passaggio verticale."; ], initial [; viewPicture(Tunnel_img); if (self hasnt general) self.each_turn(); ], ne_to [; if (~~OffersLight(self)) "Non puoi muoverti nell'oscurit@`a completa."; return bivio; ], u_to passaggio, cant_go [; if (~~OffersLight(self)) "Non puoi muoverti nell'oscurit@`a completa."; "Puoi solo andare verso nord-est o risalire."; ], each_turn [; if (self has general) rfalse; give self general; #IfnDef NOSOUND; fadetomusic(Dungeon_snd); #EndIf; ], has ~light; Object -> scalapassgiu "scala" with name 'scalinata' 'scala' 'scale' 'scalini' 'gradini' 'chiocciola', description [; <>; ], before [; Climb: <>; Exit: "Le scale salgono soltanto."; ], has scenery; DarkRoom bivio "Ad un bivio (nei sotterranei)" with name 'bivio' 'galleria' 'sotterranei' 'caverna', description "La galleria qui si biforca in due. La diramazione principale curva da sud-ovest verso nord, mentre una galleria secondaria porta verso sud-est.", initial [; viewPicture(Bivio_img); ], sw_to galleria1, se_to davanticella, n_to anticamera, cant_go "Puoi andare a nord, a sud-ovest e a sud-est."; DarkRoom davanticella "Di fronte ad una cella (nei sotterranei)" with name 'galleria' 'caverna' 'sotterranei', description "Il tunnel che proviene da nord-ovest, scavato nella dura roccia si ferma davanti ad una porta di metallo, verso sud.", each_turn [; if (OffersLight(real_location)) if (portacella hasnt open) viewPicture(Davanti1_img); else viewPicture(Davanti2_img); ], nw_to bivio, s_to portacella, cant_go "Il tunnel porta a nord-ovest, la cella @`e a sud."; Porta portacella "porta" with name 'porta' 'paletto' 'metallo', description [; print "La porta, che sembra molto robusta, non ha serrature ma solo un paletto che permette di aprirla e chiuderla dall'esterno.^"; self.printstatus(); rtrue; ], before [; Enter: if (self hasnt open) { self.printstatus(); rtrue; } Lock: give self ~open; Lift: <>; ], found_in davanticella cella, door_dir [; if (self in davanticella) return s_to; else return n_to; ], door_to [; if (self in davanticella) return cella; else return davanticella; ], has female; DarkRoom cella "Una cella (nei sotterranei)" with name 'cella' 'prigione' 'galleria' 'caverna' 'sotterranei', description [; "Piccola, angusta e priva di qualsiasi suppellettile, questa cella scavata nella roccia non @`e assolutamente una prigione confortevole. La porta si trova verso nord."; ], initial [; viewPicture(Cella_img); ], n_to portacella, cant_go "La porta @`e a nord."; Object -> catena "catena" with name 'catena' 'catene' 'gancio' 'manette' 'bracciali', description "Una robusta catena, chiusa da un lucchetto altrettanto robusto, va da un gancio piantato nella solida roccia fino ad un paio di bracciali di metallo chiusi attorno ai polsi di Valeria.", before [; Attack: "Catena, bracciali, gancio e lucchetto sono troppo robusti."; Open, Unlock: "Se tu avessi la chiave giusta..."; ], has scenery female; Object -> lucchetto "lucchetto" with name 'lucchetto', description "Un lucchetto solido e massiccio tiene chiusa la catena che imprigiona Valeria.", before [; Attack: <>; Open, Unlock: <>; ], has scenery; Object -> valeria "Valeria" with name 'valeria' 'amica' 'donna' 'ragazza', initial "Puoi vedere Valeria, incatenata ad una parete.", description [; print "La ragazza @`e prigioniera, legata con una catena alla parete, i suoi abiti laceri e strappati. @`E sempre bella come te la ricordavi, ma adesso il suo volto @`e provato e su di esso @`e dipinta un'espressione che @`e un misto di terrore per la situazione in cui si trova e di felicit@`a per l'averti visto.^"; DoTutor(self, "Hai incontrato per la prima volta un ~personaggio non giocatore~, un altro essere umano con cui puoi interagire in molti modi. Puoi ad esempio provare a mostrarle cosa hai trovato (MOSTRA LA COLLANA A VALERIA), o parlarle (PARLA A VALERIA)."); rtrue; ], tflag false, seen false, knowring false, wcount 0, exited false, before [; Untie: "La catena che la tiene prigioniera @`e troppo robusta."; Search: <>; ], react_before [; Enter: if (noun == portacella && ~~self.exited) { self.exited = true; print "^Mentre esci dalla cella Valeria grida: @<>^"; } ], life [ wd i; Answer: "Non credi che Valeria possa esserti d'aiuto."; Tell,Ask: give self tutored; conversor=self; if (consult_words==0 && action==##Tell) { if (~~self.tflag) { self.tflag=true; print "@<>^ @<>^"; DoTutor(tutorfake_pat1,"Puoi approfondire la conversazione portandola su argomenti specifici, chiedendo in pratica informazioni, usando i comandi PARLA A ... DI ..., o CHIEDI A ... DI ...; ad esempio prova a chiedere informazioni sulla villa (CHIEDI A VALERIA DELLA VILLA) o della strega (PARLA A VALERIA DELLA STREGA)."); rtrue; } "@<>^ @<>"; } wn=consult_from; for (i=0: i>^ @<>"; 'villa', 'palazzo', 'casa', 'abitazione', 'edificio': give tutorfake_pat1 tutored; print "@<>^ @<>^"; if (~~self.knowring) move anello to self; self.knowring=true; DoTutor(tutorfake_pat2, "Hai scoperto qualcosa d'interessante. Chiedi informazioni su questo anello (CHIEDI A VALERIA DELL'ANELLO)."); rtrue; 'strega', 'morgana', 'donna', 'albina': "@<>^ @<>"; 'libro', 'volume': "@<>^ @<>"; 'lettera', 'sgualcita', 'foglio', 'carta': "@<>^ @<>"; 'cappotto', 'soprabito', 'giaccone', 'loden': "@<>^ @<>"; 'accendino': "@<>^ @<>"; 'collana', 'pendente', 'amuleto', 'stella': if (self.knowring) "@<>^ @<>"; if (~~self.knowring) move anello to self; self.knowring=true; print "@<>^ @<>^"; DoTutor(tutorfake_pat2, "Hai scoperto qualcosa d'interessante. Chiedi informazioni su questo anello (CHIEDI A VALERIA DELL'ANELLO)."); rtrue; 'anello': if (~~self.knowring) "Quale anello?"; give tutorfake_pat2 tutored; if (anello notin self) "@<>^ @<>"; if (anello.known) "@<>^ @<>"; print "@<>^ @<>^"; DoTutor(tutorfake_pat3, "A questo punto prova a chiedere a Valeria se ti pu@`o prestare l'anello (CHIEDI L'ANELLO A VALERIA)."); rtrue; } } "@<>"; Show: give self tutored; switch(noun) { collana: if (~~self.knowring) move anello to self; self.knowring=true; print "Valeria osserva la collana e ti dice: @<>^"; DoTutor(tutorfake_pat2, "Hai scoperto qualcosa d'interessante. Chiedi informazioni su questo anello (CHIEDI A VALERIA DELL'ANELLO)."); rtrue; anello: "@<> dice lei, @<>"; cappotto: "@<<@`E il mio cappotto.@>>"; accendino: "@<>"; lettera: "@<>"; libro: "@<>"; } print_ret "Valeria osserva ", (the)noun, ", ma non pare troppo colpita."; Give: give self tutored; if (noun == ciotolapiena) "@<> risponde Valeria dopo aver osservato il contenuto della ciotola."; print_ret "@<>, risponde lei."; Kiss: "Dai un bacio a Valeria. Lei risponde al bacio ma poi dice: @<>"; ThrowAt, Attack: "Ti ha forse fatto qualcosa di male?"; default: "Valeria ti guarda con occhi imploranti."; ], Orders [; Give: if (noun == anello) { if (anello notin self) "@<>^ @<>"; if (~~self.knowring) "Quale anello?"; anello.known=true; move anello to valeria; give tutorfake_pat3 tutored; "@<>^ Valeria cerca inutilmente di districarsi fino a raggiungere una tasca, poi dice: @<>"; } ], each_turn [; if (~~self.seen) { self.seen=true; Achieved(4); "Appena ti vede Valeria ti dice, quasi urlando, @<>"; } switch(self.wcount++) { 6: "^Valeria strattona le catene, cercando inutilmente di liberarsi."; 12: "^@<>, dice Valeria guardandoti implorante."; 17: "^@<>, chiede Valeria."; 25: "^Ancora una volta Valeria prova la resistenza delle catene con uno strattone, ma senza risultato."; 34: "^@<>, chiedie Valeria."; } ], has female animate proper transparent; Object tutorfake_pat1; Object tutorfake_pat2; Object tutorfake_pat3; Object -> -> abitivaleria "abiti" with name 'abito' 'abiti' 'vestito' 'vestiti' 'tasca', description "Gli abiti di Valeria sono sporchi, laceri e stracciati.", before [; Search: if (anello in Valeria && anello.known) <>; "Non ti sembra il caso."; ], has scenery pluralname; Object -> -> "volto" with name 'volto' 'faccia' 'viso', description "Teso e spaventato." has scenery; Object -> -> "polsi" with name 'polso' 'polsi', description "I polsi di Valeria sono chiusi da un paio di bracciali di metallo." has scenery pluralname; Object anello "anello" with name 'anello' 'argento', description "Un anello d'argento, liscio e senza pietre.", known false, before [; Take: if (self in Valeria) { if (~~self.known) "Non vedi nulla del genere."; move anello to player; Achieved(5); print "Metti una mano nella tasca del vestito di Valeria, e ne estrai un anello d'argento. Valeria chiede: @<>^"; DoTutor(self, "Questo piccolo oggetto potrebbe avere pi@`u di un utilizzo. Certo, puoi indossarlo. Ma controlla attentamente anche tutto quello che hai gi@`a trovato fino ad ora."); rtrue; } default: if (self in Valeria) "Non vedi nulla del genere."; ], has clothing; DarkRoom anticamera "Una caverna (nei sotterranei)" with name 'anticamera' 'galleria' 'caverna' 'sotterranei', description "Questa caverna sembra una specie di anticamera. Forse per le grottesche formazioni di roccia che, pur naturali, sembrano avere la forma di bizzarre creature o di scene perverse. Hai l'impressione che l'origine di tutto si trovi oltre il passaggio verso nord. La galleria da cui provieni conduce verso sud.", initial [; viewPicture(Anticamera_img); ], s_to bivio, n_to [; if (anello in player && anello has worn) { print "Ti spingi un passo dopo l'altro verso il passaggio, e senti una strana sensazione di calore attorno al dito che porta l'anello datoti da Valeria, mentre riesci a superare una forza maligna che cercava di respingerti.^"; move lasthelp to helpmenu; return antro; } print "Provi ad andare verso nord, ma i tuoi passi si fanno sempre pi@`u pesanti, e percepisci una forza maligna che ri respinge indietro, lasciandoti malfermo sulle gambe.^"; if (anello in player) DoTutor(self, "Controlla gli oggetti che possiedi (I), e forse troverai il modo per superare questo ostacolo."); DoTutor(self, "Forse hai bisogno di un certo oggetto per oltrepassare questo ostacolo. Esplora prima tutti i sotterranei."); rtrue; ], cant_go "Puoi andare solo a nord e a sud."; Object -> formazioni "formazioni rocciose" with name 'formazioni' 'rocciose' 'roccia' 'pietra' 'scena' 'scene' 'grottesche' 'bizzarre' 'perverse' 'rocce', description [; switch(random(4)) { 1: "Una roccia pare un essere mostruoso che, speri, non ha mai vissuto su questa terra."; 2: "Una formazione in un angolo pare rappresentare il sacrificio di una giovane."; 3: "Vista da quest'angolazione una delle rocce sembra il volto di un demone che guarda verso di te."; 4: "Il riflesso della luce sulle rocce crea per un attimo la scena di un gruppo di persone attorno ad una creatura abominevole."; } ], has scenery female pluralname; Object -> essere "essere mostruoso" with name 'essere' 'mostruoso' 'mostro' 'creatura' 'creature', description "Non sai spiegarti come, ma la roccia suggerisce la forma di un essere orribile, forse parte uomo e parte animale." has scenery; Object -> sacrificio "sacrificio umano" with name 'sacrificio' 'giovane' 'ragazza' 'figura' 'lama', description "Incredibilmente le rocce formano chiaramente la scena di una ragazza distesa sulla roccia e di una figura ammantata che affonda una lama nel suo petto." has scenery; Object -> demone "demone" with name 'volto' 'faccia' 'demone' 'demonio' 'diavolo', description "Sta proprio guardando verso di te." has scenery; Object -> gruppo "gruppo di persone" with name 'gruppo' 'persone', description "Se questa scena fosse vera, sarebbero folli ad adorare un tale orrore.", has scenery; DarkRoom antro "L'antro della strega (nei sotterranei)" with name 'antro' 'galleria' 'caverna' 'sotterranei', description [; "Dunque @`e qui che tutto ha inizio. Una vasta caverna quasi circolare, scavata nella roccia, con solo un passaggio che conduce verso sud. E praticamente niente altro, se non un pentacolo tracciato sul suolo. Eppure il terrore @`e cos@`i palpabile, in questo luogo."; ], initial [; viewPicture(Antro_img); ], each_turn [; DoTutor(self, "Sei arrivato alla fine, e adesso sei da solo. C'@`e ancora poco da fare, ma adesso puoi contare solo sulle tue forze. Spero soltanto che tu abbia con te tutto il necessario.^Buona fortuna.^(Anche se forse potrebbe essere utile consultare il men@`u di aiuto.)"); ], s_to "Provi a tornare sui tuoi passi, ma ancora una volta una forza malevola ti vince, impedendoti di lasciare questo luogo.", cant_go "Puoi andare solo a sud."; Object -> pentacolo "pentacolo" with name 'pentacolo' 'pentagono' 'stella', description "Una stella a cinque punte circondata da un cerchio, tracciata sul terreno.", before [; Examine: rfalse; default: "Preferisci non avvicinarti."; ], has scenery; Object -> luce "luce" with name 'luce' 'ombre' 'ombra' 'luci', description "La luce proveniente dal braciere si proietta tremula sulle pareti, creando inquietanti giochi di ombre.", before [; Examine: rfalse; default: "Sono solo intangibili luci ed ombre."; ], has scenery female; Object -> braciere "braciere" with name 'braciere' 'incensiere' 'tripode' 'treppiede' 'fuoco' 'fiamma' 'fiamme', description "Un largo braciere di bronzo, sorretto da un treppiede, in cui brucia una bella fiamma viva.", initial "Un braciere, al centro della stanza, proietta la sua luce sulle pareti.", before [; Touch, Take, Push, Pull, Turn: "@`E troppo caldo, oppure qualcosa ti tiene lontano. Non riesci a toccarlo."; SwitchOff: "Con cosa?"; SwitchOffWith: if (second == ciotolapiena) { if (anello in collana && collana in player && collana has worn) { fadeoutmusic(); deadflag=2; print "Come ti avvicini, lo spettro della donna si mette tra te e il braciere, ma @`e come se i suoi poteri non potessero farti nulla. Sorretto da un'energia che non credevi di avere, passi attraverso la donna, e rovesci l'acqua contenuta nella ciotola sul braciere, che inizia a spegnersi. La donna albina inizia a gridare, quasi assordandoti; un grido di dolore, frustrazione e disperazione. E quando la luce del braciere scompare, anch'ella e il suo urlo scompaiono.^Per un attimo tutto pare girare vorticosamente attorno a te, finch@`e non cadi a terra perdendo i sensi.^"; WaitKey(); viewPicture(Fine_img); print "Ti ridesta la luce del giorno. Tu e Valeria siete sdraiati sul pavimento di uno stupendo salone ottagonale.^Valeria si volta verso di te dicendo @<<@`E stato terribile... Ho creduto che sarei morta in quella cella... Meno male che sei arrivato...@>>^^ L'incubo di Villa Morgana @`e finito.^^"; Achieved(6); DoTutor(self, "Hai risolto quella che @`e probabilmente la tua prima avventura testuale. Buon divertimento con le prossime."); rtrue; } "Come fai per avvicinarti, lo spettro della donna si mette tra te e il braciere, e senti come un'onda di malvagit@`a che ti respinge violentemente indietro."; } ], has static light; Object -> strega "Morgana" with name 'morgana' 'strega' 'donna' 'megera' 'albina' 'fantasma' 'spettro', describe [; if (self.act>=7) "La donna albina sta portando a termine il rituale."; if (self.act>=2) "La donna albina sta recitando le formule di un complesso rituale."; "Una donna albina ti osserva, un'espressione divertita e beffarda sul suo volto."; ], description "Non @`e priva di una certa terribile bellezza. Osservandola ti rendi conto che puoi vederle attraverso. In un certo senso pare proiettata dal braciere, quasi fosse solo un'ombra sulla parete.", before [; Touch, Take, Push, Pull, Turn: "Provi ad avvicinarti e a toccarla, solo per renderti conto che @`e incorporea."; ], act 0, life [; Answer: "La strega sembra non aver notato le tue parole."; Tell,Ask: "La donna non ti risponde, anzi, non sembra nemmeno pi@`u far caso a te."; Show, Give: if (noun == collana or anello) if (action == ##Show) print_ret "La donna osserva per un istante ", (the) noun, ", indietreggiando, poi esplode in una risata nervosa dicendo: @<>"; else "Pessima idea."; "Non credi che sia interessata."; Kiss: fadeoutmusic(); deadflag=1; viewPicture(Buio_img); print "Ti avvicini alla donna e la baci. Un velo di tenebra cade sui tuoi occhi, mentre rimani prigioniero dell'oblio.^"; DoTutor(self, "Questa te la potevi risparmiare. Era scontato che non andava a finir bene."); rtrue; ThrowAt: if (noun == ciotolapiena) "Non siamo nel regno di Oz."; move noun to real_location; print_ret (The) noun, " attraversa la donna senza recarle danno."; Attack: "Come puoi attaccare qualcuno che @`e immateriale?"; default: "La donna ti ignora."; ], each_turn [; switch(++self.act) { 1: "^Non appena la donna si accorge della tua presenza, si volge verso di te. In quel momento ti rendi conto che puoi vedere attraverso il suo corpo immateriale, che stai in realt@`a vedendo uno spettro, e senti la sua voce, come un vento gelido, dire: @<>"; 2: "^@<>, e la donna inizia a recitare una strana, incomprensibile litania."; 3: "^La litania della donna continua, ipnotica. Ti senti confuso, mentre il fuoco del braciere sembra crescere d'intensit@`a."; 5: "^La donna passa di fronte a te, nei lenti movimenti di una strana danza che si accompagna al suo cantilenare. Sembra che altre voci si siano unite alla sua mentre lei ti sorride beffarda."; 7: "^Lo sguardo dello spettro si posa su di te per un attimo. Un brivido corre lungo la tua schiena, mentre ti rendi conto che il suo rituale sta giungendo a termine."; 10: "^Ad un tratto la litania cresce di volume per le ultime frasi. La donna albina si ferma immobile, la sua figura sempre pi@`u luminosa. Una risata di trionfo dipinta sul suo volto."; 11: fadeoutmusic(); deadflag=1; viewPicture(Buio_img); print "^Di colpo la donna scompare in un boato di luce che ti travolge stordendoti e gettandoti a terra tramortito. Ad un tratto vedi una figura avvicinarsi; @`e Valeria, ma i suoi capelli sono completamente bianchi, ed il suo sguardo @`e lo stesso della strega. Colei che era Valeria si china su di te e bacia la tua bocca. @`E l'ultima cosa che vedi, prima che un velo di tenebra scenda sui tuoi occhi.^^"; DoTutor(self,"Come si suol dire, non sempre si vince. A questo punto ti conviene ripartire da un vecchio salvataggio e tentare di nuovo."); rtrue; } ], has female animate proper transparent;