! La Pietra della Luna ! Avventura Testuale realizzata da Paolo Lucchesi ! da un'idea di Paolo Lucchesi, Andrea Gnesi e Stefano Masi ! 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 pu@`o essere ! ritenuto responsabile per qualsiasi danno dovuto direttamente o indirettamente ! all'uso del prodotto. ! ------------------------------------------ ! Sistema di magia ! ------------------------------------------ Constant MAXMANA 34; Object magic with mana MAXMANA, manatick 0, invis 0, mtorch 0, msightc 0, checkmana [cost; ! Vari controlli e sottrazione energia if (dreaming) { print "Stai sognando. Non riesci a ricostruire l'incantesimo nella tua mente.^"; rfalse; } if (real_location provides antimagic) { cost=cost+real_location.antimagic; if (cost>=5) { print "Un'energia negativa imbriglia il tuo potere. Non riesci a lanciare questo incantesimo.^"; rfalse; } print "Un'energia negativa rende pi@`u difficile il lanciare incantesimi.^"; } if (cost > self.mana || self.mana==0) { print "Non hai sufficienti energie per lanciare l'incantesimo...^"; rfalse; } self.mana = self.mana - cost; if (self.mana == 0) "Raccogliendo le tue ultime energie, riesci a lanciare quest'ultimo incantesimo..."; if (self.mana < 5) "Sei stanco, ed @`e sempre pi@`u faticoso lanciare incantesimi..."; rtrue; ], addmana[val; ! Regalo self.mana=self.mana+val; if (self.mana>MAXMANA) self.mana=MAXMANA; if (self.mana<0) self.mana=0; ], obliterate[; ! Distrugge tutti gli incantesimi self.invis=0; self.mtorch=0; self.msightc=0; give player ~light; give player ~invisible; give player ~msight; ], init [; StartDaemon(self); ], daemon [i j; ! Per la durata degli incantesimi a tempo if (self.invis > 0) { ! Se non c'e' nessuno, mi rendo invisibile... j=1; objectloop (i in location && i has animate && i~=player) j=0; if (j) give player invisible; self.invis--; if (self.invis == 2) print_ret "^Il manto d'ombra sta finendo il suo effetto."; if (self.invis == 0) { print "^Ti rendi conto di essere completamente visibile.^"; give player ~invisible; } } else give player ~invisible; if (self.mtorch > 0) { give player light; self.mtorch--; if (self.mtorch == 2) print_ret "^La luce della torcia invisibile scompare per un attimo."; if (self.mtorch == 0) { print "^La torcia invisibile ha finito il suo effetto.^"; give player ~light; } } else give player ~light; if (self.msightc > 0) { give player msight; self.msightc--; if (self.msightc == 0) { print "^La tua vista dell'occulto si dissolve.^"; give player ~msight; } } else give player ~msight; ! Un po' di ricarica if (self.mana<16) { if (random(11)==1) self.manatick++; if (self.mana<8 && random(5)==1) self.manatick++; if (self.manatick>=(self.mana+2)) { self.mana++; self.manatick=0; } } ]; Book grimorio "tuo grimorio" with pname '.x' 'tuo' '.x' 'mio' 'grimorio' '.or' 'libro' '.x' 'degli' '.x' 'di' '.x' 'incantesimi' '.x' 'magia', article "il", description "Il tuo tesoro pi@`u prezioso, il libro dove sono riportati, in scrittura arcana, i pochi incantesimi che conosci. Nonostante questo libro non ti serva per fare appello alla magia, te ne separi sempre malvolentieri. Gli incantesimi contenuti qui dentro, i soli che conosci e che puoi lanciare, sono soltanto il dardo di forza (~drasel~), il manto d'ombra (~morgat~), la torcia invisibile (~frobez~), la cinta di resistenza (~eborag~) e la vista dell'occulto (~vems~), oltre allo specchio interiore (~nrim~).", aura "Il tuo grimorio - non ti stupisce - emana un'aura di conoscenza.", before [ wd i; Read: grimoriomenu.select(); rtrue; Consult: wn=consult_from; for (i=0: i>; 'manto', 'ombra', 'morgat': <>; 'torcia', 'invisibile', 'frobez': <>; 'cinta', 'resistenza', 'eborag': <>; 'vista', 'occulto', 'vems': <>; 'specchio', 'interiore', 'nrim': <>; } } "Stai sopravvalutando il tuo piccolo, modesto grimorio. Non trovi nulla su questo argomento."; ], test [; if (TestScope(self)) rtrue; print "Senza il tuo grimorio non puoi avere una descrizione precisa dell'incantesmo.^"; rfalse; ], list_together BOOKS_GROUP, has legible; Menu grimoriomenu "Il tuo grimorio"; Option -> "Dardo di forza (~drasel~)" with description [; <>; ]; Option -> "Manto d'ombra (~morgat~)" with description [; <>; ]; Option -> "Torcia invisibile (~frobez~)" with description [; <>; ]; Option -> "Cinta di resistenza (~eborag~)" with description [; <>; ]; Option -> "Vista dell'occulto (~vems~)" with description [; <>; ]; Option -> "Specchio interiore (~nrim~)" with description [; <>; ]; ! Seguono gli incantesimi Object dardospell "incantesimo del dardo di forza" with name 'dardo' 'di' 'forza' 'drasel', description [; if (grimorio.test()) "L'incantesimo del dardo di forza, richiamato dalla parola ~drasel~, evoca una freccia invisibile che va a colpire senza errore il bersaglio designato. Purtroppo non pu@`o essere diretto verso esseri viventi."; ], before [; Cast: if (~~magic.checkmana(2)) rtrue; if (second==0) "Evochi dal nulla il dardo di forza che sfreccia attorno a te per poi dissolversi senza aver colpito niente."; if (second has animate) "Senti il potere fluire mentre cerchi di evocare il dardo di forza, ma questo non appare. Ti ricordi troppo tardi che l'incantesimo non pu@`o essere usato contro esseri viventi."; <>; ], has spell; Object mantospell "incantesimo del manto d'ombra" with name 'manto' 'd^' 'ombra' 'morgat', description [; if (grimorio.test()) "L'incantesimo del manto d'ombra, o ~morgat~, rende l'incantatore praticamente invisibile agli occhi di altri esseri umani. Esso agisce sulle menti altrui, che non possono percepire l'immagine di colui che @`e soggetto a questo incantesimo. L'incantesimo per@`o non ha alcun effetto su persone che siano in quelche modo conscie della presenza dell'incantatore; quindi se qualcuno si accorge con mezzi diversi dalla vista della presenza del mago, quest'ultimo diverr@`a immediatamente visibile ai suoi occhi. L'incantesimo dura solo per poco tempo."; ], before [ i j ; Cast: if (second~=0) "L'incantesimo del manto d'ombra non pu@`o essere lanciato su di un bersaglio."; if (~~magic.checkmana(3)) rtrue; if (magic.invis>0) { magic.invis=magic.invis+11; if (magic.invis>19) magic.invis=19; give player invisible; "L'incantesimo del manto d'ombra viene prolungato..."; } magic.invis=19; give player invisible; j=1; objectloop (i in location && i has animate && i~=player) j=0; if (j) give player invisible; "Hai come l'impressione che i tuoi contorni diventino pi@`u sfumati."; ], has spell; Object torciaspell "incantesimo della torcia invisibile" with name 'torcia' 'invisibile' 'frobez', description [; if (grimorio.test()) "L'incantesimo della torcia invisile, ~frobez~ in lingua arcana, permette all'incantatore di vedere anche nella pi@`u completa oscurit@`a. La sua durata @`e limitata nel tempo."; ], before [; Cast: if (second~=0) "L'incantesimo della torcia invisibile non pu@`o essere lanciato su di un bersaglio."; if (~~magic.checkmana(1)) rtrue; if (magic.mtorch>0) { magic.mtorch=47; give player light; "La torcia invisibile prende nuovo vigore..."; } magic.mtorch=47; give player light; if (location==thedark) "D'improvviso la luce fende l'oscurit@`a che ti avvolgeva."; "Ti pare che tutto attorno a te diventi pi@`u luminoso."; ], has spell; Object cintaspell "incantesimo della cinta di resistenza" with name 'cinta' 'di' 'protezione' 'resistenza' 'solidita' 'solidita^' 'solidit@`a' 'eborag', description [; if (grimorio.test()) "L'incantesimo chiamato dalla parola arcana ~eborag~, detto della cinta di protezione, pu@`o essere lanciato su di un oggetto inanimato e ne aumenta leggermente la solidit@`a e la resistenza, tessendo una fitta rete di energia attorno ad esso. Il suo effetto dipende molto dalla capacit@`a di chi lo lancia: nelle mani di un mago esperto pu@`o essere usato per rinforzare interi palazzi, o anche per dar forma ai liquidi."; ], before [; Cast: if (~~magic.checkmana(2)) rtrue; if (second==0) { "Evochi la cinta di resistenza che, non avendo un oggetto su cui avvolgersi, si stringe su se stessa sparendo nel nulla."; } if (second has animate) "Convogli il tuo potere cercando di evocare la cinta di forza, ma senza risultato. Troppo tardi ti sovviene che l'incantesimo pu@`o essere usato solo con oggetti inanimati."; <>; ], has spell; Object vistaspell "incantesimo della vista dell'occulto" with name 'vista' 'dell^' 'occulto' 'vems', description [; if (grimorio.test()) "L'incantesimo ~vems~, o della vista dell'occulto rende, gli occhi dell'incantatore sensibili a qualsiasi manifestazione sovrannaturale. L'incantesimo ha breve durata e permette di vedere influenze magiche, oggetti e persone invisibili, scritture occulte. In alternativa l'incantesimo pu@`o essere diretto su di un oggetto particolare e permette anche di percepire con precisione l'aura emanata da quest'oggetto."; ], before [k tms ar; Cast: !if (second~=0) "L'incantesimo della vista dell'occulto non pu@`o essere lanciato su di un bersaglio."; if (~~magic.checkmana(1)) rtrue; k=FALSE; tms=FALSE; if (second~=0) { if (player has msight) tms=TRUE; give player msight; second.description(); if (second provides aura) ar=second.aura(); else { if (random(2)==1) k=TRUE; print "Non percepisci nessuna aura particolare.^"; } if (ar==2 && second has legible) <>; if (~~tms) give player ~msight; if (random(2)==1) k=TRUE; if (player has msight && random(3)<=2) k=TRUE; if (k) magic.mana++; rtrue; } if (magic.msightc>0) { magic.msightc=13; give player msight; "L'incantesimo della vista dell'occulto viene rinnovato."; } magic.msightc=13; give player msight; "Ti pare che sui tuoi occhi cali una lievissima patina dorata."; ], has spell; Object specchiospell "incantesimo dello specchio interiore" with name 'specchio' 'interiore' 'nrim', description [; if (grimorio.test()) "L'incantesimo dello specchio interiore, o ~nrim~, ti permette di conoscere in ogni istante la tua immagine arcana, ovvero la tua energia e gli incantesimi intessuti in quel momento su di te. Questo incantesimo attinge alla tua energia mistica in modo trascurabile."; ], before [; Cast: if (second~=0) "L'incantesimo dello specchio interiore non pu@`o essere lanciato su di un bersaglio."; if (~~magic.checkmana(0)) rtrue; print "Ti concentri sul tuo specchio interiore.^"; switch (magic.mana) { 0: print "La tua energia mistica @`e esaurita.^"; 1 to 5: print "La tua energia mistica @`e quasi esaurita.^"; 6 to 11: print "Non ti rimane molta energia mistica.^"; 12 to 22: print "La tua energia mistica @`e sufficiente.^"; default: print "La tua energia mistica @`e abbondante.^"; } if (magic.mtorch) { print "Hai lanciato l'incantesimo della torcia invisibile"; if (magic.mtorch<10) print " (che si sta esaurendo)"; print ".^"; } if (magic.invis) { print "Sei protetto dal manto d'ombra"; if (magic.invis<7) print " (che si sta esaurendo)"; print ".^"; } if (magic.msightc) { print "I tuoi occhi possiedono la vista dell'occulto"; if (magic.msightc<7) print " (che si sta esaurendo)"; print ".^"; } rtrue; ], has spell; [ CastSub; "Non sei in grado di lanciare questo incantesimo..."; ]; ! Per lanciare incantesmi con una sola parola [ AutoCastSub; if (firsttopic=='frobez') <>; if (firsttopic=='morgat') <>; if (firsttopic=='vems') <>; if (firsttopic=='drasel') <>; if (firsttopic=='nrim') <>; if (firsttopic=='eborag') <>; "Non sei in grado di lanciare questo incantesimo..."; ]; [ MissileSub; if (noun == 0 or NULL) "Il dardo manca il bersaglio."; if (noun has solid) { give noun ~solid; "Il dardo colpisce ", (the)noun, ", ma viene assorbito dalla cinta di protezione, mentre i due incantesimi si annullano reciprocamente."; } "Il dardo colpisce ", (the)noun, " senza recargli alcun danno visibile."; ]; [ GirdleSub; if (noun == 0 or NULL) "L'incantesimo non sembra aver effetto."; if (noun has solid) "L'energia dell'incantesimo avvolge ", (the)noun, " senza per@`o alcun ulteriore effetto apprezzabile."; give noun solid; "L'energia dell'incantesimo avvolge ", (the)noun, ", rendendolo ancora pi@`u resistente di quanto fosse prima."; ]; ![ SpellScope i; ! switch (scope_stage) { ! 1: rfalse; ! 2: objectloop (i has spell) PlaceInScope(i); rtrue; !! 3: "Non credi che questo sia un'incantesimo..."; !} !]; ! Mette tutti gli incantesimi in scope [ InScope person i; if (person == player) objectloop (i has spell) PlaceInScope(i); rfalse; ];