!% +language_name=Italian !% -~D !% -S !% $MAX_OBJECTS=1280 !% $MAX_PROP_TABLE_SIZE=120000 !!% -z ! 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. ! ------------------------------------------ ! File principale ! ------------------------------------------ Release 5; Constant Story "La Pietra della Luna"; Constant Headline "^^Un Mistero Interattivo Fantasy di Paolo Lucchesi^ da un'idea di Andrea Gnesi, Stefano Masi e Paolo Lucchesi^^ (scrivi AIUTO per istruzioni e informazioni)^ (scrivi FACILE per passare alla modalit@`a semplificata)^ (Il gioco potrebbe non essere adatto ai bambini)^^"; ! Constant MANUAL_PRONOUNS; Constant MAX_SCORE 100; Constant NUMBER_TASKS 41; Constant TASKS_PROVIDED; Array task_scores -> 2 3 1 2 1 2 1 3 2 2 3 3 4 2 3 1 3 2 3 3 1 2 3 2 3 3 3 1 2 2 2 2 5 3 2 2 4 5 5 1 1; Constant DEATH_MENTION_UNDO; Constant NOSOUND; #IfDef DEBUG; Constant DGAME; #EndIf; !Default DGAME 0; Constant BOOKS_GROUP "libri"; Replace MakeMatch; Replace Identical; Replace NounDomain; Replace TryGivenObject; Replace LMode3Sub; Include "Parser"; Include "pname"; ! ------------------------------------------ ! Globali ! ------------------------------------------ Global easy=FALSE; Global firsttopic=0; Global lastremark=0; !Global xconversor=NULL; Global iarintalkingwith=FALSE; Global phase=0; ! Fase dell'avventura Global subphase=0; ! Solo per hints !Global darkwarning=0; Global night=FALSE; Global sunset=FALSE; Global darksky=FALSE; Global drunk_level=0; Global knowcult=FALSE; Global inwater=FALSE; Global dreaming=FALSE; Global win=FALSE; ! ------------------------------------------ ! Messaggi di libreria ! ------------------------------------------ Object LibraryMessages with before [; !Prompt: ImageBreak(); print "^> "; rtrue; Prompt: print "^"; ImageBreak(); print "> "; rtrue; Burn: "Bruciare oggetti in questo modo non ti servir@`a a niente."; Climb: "Non credi che riusciresti a salire pi@`u in alto."; Dig: "Tempo perso."; Examine: if (lm_n == 1) "Nell'oscurit@`a non riesci a vedere nulla."; Jump: "Mettendoti a saltare ti renderesti soltanto ridicolo."; Miscellany: switch(lm_n) { 10: rtrue; 37: "Puoi farlo solo con esseri viventi."; 39: "@`E solo il luogo in cui ti trovi."; } Pray: "Elevi una silenziosa preghiera a Irdil."; Push, Pull, Turn: if (lm_n == 4) "Non ti sembra il caso. Sarebbe un comportamento estremamente rude."; Sing: "Intoni per qualche attimo, per rincuorarti, una vecchia melodia rimasta sepolta da tempo in qualche angolo della tua mente."; Sleep: if (dreaming) "Stai gi@`a dormendo."; "Hai altro da fare. Non puoi metterti a dormire."; Wake: if (dreaming) "Nonostante i tuoi sforzi, non riesci a destarti."; "Non stai dormendo."; Strong, Mild: "Non hai bisogno di essere offensivo."; Swim: "Possiedi molti talenti ma - quasi ti vergogni ad ammetterlo - non sei assolutamente un abile nuotatore."; Think: "Ti fermi a riflettere, cercando di decidere cosa fare."; Touch: if (lm_n == 1) "Non sarebbe un gesto molto cortese."; Greet: "Non hai nessuno da salutare."; ]; Constant LOCKEDANSWER "Non puoi parlare di ci@`o che non conosci."; Constant LOCKEDANSWERPRE "^Non puoi parlare di ci@`o che non conosci."; Include "Verblib"; #IfDef TARGET_GLULX; Include "Infglk"; #Endif; Include "Dmenus_it"; Include "replace"; Include "wtellask_it"; ! ------------------------------------------ ! Attributi e proprieta' ! ------------------------------------------ Attribute legible; ! supporto cartaceo !Attribute antimagic; ! loc. dove e' difficile lanciare incantesimi Attribute waterhere; ! loc. dove c'e' acqua Attribute spell; ! incantesimi Attribute invisible; ! applicabile a player Attribute msight; ! applicabile a player Attribute woods; ! locazione boscosa Attribute solid; ! soggetto all'incantesimo della cinta Property count; Property antimagic; Property aura; Property vegdesc; !Property easytalk; ! ------------------------------------------ ! Classi ! ------------------------------------------ Class ORoom ! Locazione esterna con luna has light proper; Class IRoom ! Locazione interna illuminata has light proper; Class Droom ! Locazione interna non illuminata has proper; Class ERoom ! Locazione esterna senza luna has light proper; !Global skipdefault; Class Prop with before [; Examine, AutoCast, Missile, Girdle: rfalse; Search: <>; !Push, Pull, Turn, Take: print (The) self, " ", (isorare) self, "troppo "; ! if (self has pluralname) "pesanti"; else "pesante"; default: !if (skipdefault) rfalse; if (self provides cant_go) { self.cant_go(); rtrue; } ], has scenery; Class Distance with before [; Examine, AutoCast: rfalse; Search: <>; !Push, Pull, Turn, Take: print (The) self, " ", (isorare) self, "troppo "; ! if (self has pluralname) "pesanti"; else "pesante"; default: if (self provides cant_go) { self.cant_go(); rtrue; } print_ret (The) self, " ", (isorare)self, " troppo lontan", (genderandnumber)self, "."; ], has scenery; Class Direction !class Prop with before [x; Search: <>; AutoCast, Missile, Girdle: rfalse; Examine: if (self provides dir_to && (~~(self provides description))) if (self has pluralname) print_ret (The) self, " si trovano verso ", (name) self.dir_to, "."; else print_ret (The) self, " si trova verso ", (name) self.dir_to, "."; Go, Enter: if (self provides dir_to) { if (metaclass(self.dir_to) == Object) <>; if (metaclass(self.dir_to) == Routine) { x=self.dir_to(); <>; } if (metaclass(self.dir_to) == String) print_ret self.dir_to; } location.cant_go(); default: if (self provides cant_go) { self.cant_go(); rtrue; } ! if (self provides dir_to) ! if (self has pluralname) print_ret (The) self, " si trovano verso ", (name) self.dir_to, "."; ! else print_ret (The) self, " si trova verso ", (name) self.dir_to, "."; ], react_before [; Examine: if (location provides compass_look || noun~=(self.dir_to)) rfalse; "Da quella parte vedi ", (the) self, "."; ], has scenery; Class MyDoor with description [; self.printstatus(); ], printstatus [; if (self has open) print (The)self, " @`e apert"; else print (The)self, " @`e chius"; if (self has female) "a."; else "o."; ], before [ks; Open: if (~~(self provides with_key)) rfalse; if (self hasnt locked || self.with_key notin player) rfalse; ks = keep_silent; keep_silent = true; ; keep_silent = ks; if (keep_silent) rtrue; print_ret "Apri la porta con " , (the) self.with_key, "."; Enter: if (self hasnt open) { if (self hasnt locked) { print "Prima apri ", (the)self, ".^"; give self open; rfalse; } self.printstatus(); rtrue; } Lock: if (self hasnt open) rfalse; give self ~open; print "(Chiudendo ", (the) self, ", prima)^"; rfalse; Knock: if (self has open) print_ret "Non c'@`e bisogno di bussare, @`e aperta."; "Nessuna risposta."; ], after [ks; Unlock: if (self has locked) return false; if (~~keep_silent) { print "Apri ", (the) self, " e la spalanchi.^"; } ks = keep_silent; keep_silent = true; ; keep_silent = ks; return true; ], react_before [x; Knock: if (noun == 0 or NULL) <>; Go: if (noun notin compass) rfalse; if (noun provides door_dir) x = location.(noun.door_dir); if (x == self) { <>; } rfalse; ], has scenery door openable female lockable; Class Book with ! pname '.p' 'libri//p', plural "libri", list_together BOOKS_GROUP, has legible; ! ------------------------------------------ ! Demone e funzioni ! ------------------------------------------ ! Qui definisco un demone che fa un sacco di cose Object mpdaemon with c1 0, c3 0, c6 0, c7 0, c7a 0, cw 0, fsnd 0, nofsnd 0, daemon [; if (talkingwith==iarin) iarintalkingwith=TRUE; else iarintalkingwith=FALSE; if (iarin.daemonrun) iarin.daemon(); ! if (xconversor) ! if (~~TestScope(xconversor)) xconversor=NULL; ! Si avvicina il tramonto del primo giorno (e il rito) if (phase==1 && RaduraPietra has visited) { self.c1++; if (self.c1>=4 && real_location~=Radura) { phase=2; seguaci.movein(); addhint(h_radura); "^Il sole sta scendendo, il giorno volge al tramonto..."; } } ! Fuori dal tempio druidico, tramonto if (phase==2 && real_location==Radura && dlibro in player) { nightfall(); phase=3; subphase=0; move iarin to Radura; move pendente to iarin; move creature to RaduraPietra; move dippin to AppartamentoTempio; AbovePicture(MoonF_img, -1, -1); print "^Il sole @`e tramontato, e adesso la luna, ora quasi piena, illumina questa notte.^"; if (iarin.daemonrun) iarin.daemon(); } ! Vai a letto if (phase==3 && creature has general) switch(++self.c3) { 2: if (easy) print "^Per oggi non c'@`e molto che tu possa fare. Conviene tornare al palazzo e farsi una buona dormita.^"; 5: print "^Ti sembra di udire un cupo tuono venire da nord.^"; 12: print "^La stanchezza di questa giornata inizia a pesare sulle tue spalle.^"; 27: print "^Sei esausto. Devi assolutamente andare a dormire.^"; 44: print "^Sei talmente stanco che ti si inizia ad annebbiare la vista.^"; 54: self.c3=15; print "^Sei stremato. Non credi di riuscire a resistere ancora a lungo senza dormire.^"; } ! Si avvicina il tramonto del secondo giorno if (phase==5 && real_location == UscitaMiniera) { phase=6; sunset=TRUE; move nilis to SalaPranzo; addhint(h_vulcano); if (Iarin.follower) print "^Dovete"; else print "^Devi"; print " aver passato nelle miniere pi@`u tempo di quanto "; if (Iarin.follower) print "pensavate"; else print "pensavi"; print ". Il sole @`e gi@`a basso, vicino al tramonto. Tra poco sar@`a notte.^"; if (easy) { print "^Forse dovrest"; if (Iarin.follower) print "e"; else print "i"; print " ritornare al villaggio.^"; } } ! Eventi alla fine del secondo giorno if (phase==6) { self.c6++; if (self.c6==4) { addhint(h_vulcano); iarin.talk = 7; "^Ad un tratto un rumore profondo, proveniente da nord, si diffonde nell'aria, mentre la terra inizia a vibrare sotto i piedi."; } if (self.c6==6) { darksky = 1; print "^Una serie di esplosioni echeggia nella valle. Il monte Kalnam pare essersi risvegliato dal suo sonno.^"; if (real_location ofclass ERoom or ORoom) print "Dal vulcano pietre e lapilli scaturiscono lanciati contro il cielo, per piombare poi sulla foresta.^"; if (location==Radura) { give Radura general; print "^Una pietra infuocata precipita sulla quercia, dandola alle fiamme.^"; } remove quercia; move alberofiamme to Radura; } if (self.c6==8) { darksky = 2; if (real_location ofclass ERoom or ORoom) print "^Il cielo si fa pi@`u scuro, e d'"; else "^D'"; print "improvviso, quasi da un momento all'altro, l'aria si fa fredda, e un gelo invernale, gi@`a innaturale per questa stagione, si diffonde nella valle.^"; remove alberofiamme; move alberomorto to Radura; if (location==Radura && Radura has general) print "^L'alta quercia @`e bruciata in pochi istanti. Le fiamme hanno lasciato soltanto una carcassa morta e inutile.^"; } if (self.c6==9) { phase=7; give neve general; move nilis to SalaPranzo; move corpovade to parent(vade); remove vade; iarin.talk=4; if (corpovade in real_location) { addhint(h_sparizioni); print "^Di colpo l'alchimista vacilla e crolla a terra.^"; } solved(h_vulcano); print "^Ad un tratto, d'improvviso, il vulcano torna ad essere silente, come se nulla fosse successo.^"; } } ! Prima visione della quercia distrutta if (location==Radura && Radura hasnt general && quercia notin Radura) { give Radura general; print "^Un terribile e tristissimo spettacolo si para davanti ai tuoi occhi: uno dei bolidi infuocati lanciati nel cielo da vulcano ha colpito la quercia che dominava la radura, e che ora "; if (alberofiamme in Radura) print "sta ardendo, presa dalle fiamme.^"; if (alberomorto in Radura) print "@`e ridotta ad una carcassa arsa dalle fiamme.^"; } if (quercia notin real_location && quercia.status>=2) quercia.status=1; if (fusto2 notin real_location) give fusto2 ~general; if (nilis notin real_location) nilis.count=0; if (cerdil notin real_location) cerdil.count=0; ! Sparisce Naradas if (phase==7 && nilis.vanished && naradas in AnticameraBarone) { self.c7++; if (self.c7>=3 && naradas notin real_location) { remove naradas; print "^D'improvviso senti una voce gridare @<> La voce pare venire dai piani alti del palazzo.^"; } } ! Il barone passa e sparisce if (real_location==AnticameraBarone && naradas notin AnticameraBarone) { self.c7a++; if (self.c7a==2) { remove barone; StopDaemon(barone); give AppartamentiBarone general; print "^Vedi arrivare di passo affrettato il barone Inderus che si rivolge a te in tono irato: @<>. Poi rientra nei suoi appartamenti gridando alla guardia: @<>.^"; } if (self.c7a==3) { move hila to Tempio; remove rabam; print "^Senti vociare al piano di sotto. La scomparsa della ragazza deve essere stata scoperta e ti par di capire che diverse altre persone sono scomparse, al villaggio.^"; } } ! Se sono spariti tutti, il libro e' stato trovato e siamo all'aperto, cala la notte if (nilis.vanished && naradas notin AnticameraBarone && devermismisteriis has general && phase==7 && real_location ofclass ORoom) { solved(h_sparizioni); addhint(h_notte); phase=8; subphase=0; cerdil.vanished=TRUE; remove cerdil; nightfall(); AbovePicture(MoonM_img, -1, -1); print "^Il sole @`e sceso dietro le montagne da quasi un'ora, e ormai @`e notte, anche se la luna piena rischiara tutta la valle.^"; if (easy) print "^Forse @`e il momento giusto per andare alla pietra, sperando di avere tutto il necessario.^"; } ! Ultime mosse if (win) { switch(++self.cw) { 1: print "^La caverna inizia a tremare.^"; 3: print "^Tutto attorno a te trema sempre pi@`u forte, come se il vulcano stesse preparandosi ad una nuova eruzione.^"; 5: print "^La caverna st@`a per crollare, devi cercare scampo nella fuga.^"; endscene(FALSE); } } ! Eventi nel bosco if (real_location has woods && random(3)==1 && (~~night)) { switch(++self.fsnd) { 4: print "^Ad un tratto l'improvviso gracchiare di un corvo ti fa trasalire.^"; 24: print "^La foresta sembra piena di vita.^"; 44: print "^In lontananza vedi un cinghiale sparire tra la vegetazione.^"; 64: print "^Il cinguettare di un uccello riempie l'aria.^"; } } ! Altro eventino verso la fine if (real_location has woods && random(2)==1 && phase>=8) { if (++self.nofsnd==3) print "^Ad un tratto ti rendi conto che la foresta @`e incredibilmente silenziosa, e nessun rumore disturba una quiete innaturale.^"; } ]; ! Routine del tramonto [ nightfall k; objectloop(k ofclass ERoom) give k ~light; night=TRUE; if (phase<6) give portonepalazzo ~open; remove guardie; ]; ! Routine dell'alba [ sunrise k; objectloop(k ofclass ERoom) give k light; night=FALSE; sunset=FALSE; darksky=TRUE; give portonepalazzo open; move guardie to DavantiPalazzo; ]; ! Inizio del secondo giorno [ nextday; print "Respiri a pieni polmoni, cercando di scacciare la paura dal tuo animo. Il sole @`e gi@`a alto. Hai dormito, e sognato, a lungo. Deve essere passata anche l'ora di pranzo.^^"; phase=5; magic.addmana(23); drunk_level=0; sunrise(); move iarin to Radura; move barone to Salone; StartDaemon(barone); remove creature; move dippin to AppartamentoTempio; remove letteradippin; PlayerTo(TuaStanza,2); rtrue; ]; ! Aspetta la pressione di un tasto [ WaitKey; #IfDef TARGET_GLULX; glk_set_style(style_User1); print " [ . . . ] ^"; glk_set_style(style_Normal); #IfNot; print " [ . . . ] ^"; #EndIf; KeyCharPrimitive(); ]; ! Cerca la location di un oggetto ![ locationof x; ! while (parent(x) ~= 0 or NULL) x = parent(x); ! return x; !]; ! Controlla se un oggetto e' presente [ ishere x; while (parent(x) ~= 0 or NULL) x = parent(x); if (x == real_location) rtrue; rfalse; ]; [ owned x y; while (x) { x = parent(x); if (x == y) rtrue; } rfalse; ]; ! Spostamenti degli NPC Array appstr->255; [ npcmove who dir where leave arrive siltur; if (siltur == 0) siltur = 3; if (talkingwith == who && silenceturns <= siltur) rfalse; if (who in real_location) { Follow.create(who,dir); if (leave == 0 or NULL) print "^", (The)who, " si allontana.^"; else { print "^"; #IfDef TARGET_GLULX; leave.print_to_array(appstr, 250); #IfNot; ! TARGET_ZCODE leave.print_to_array(appstr); #EndIf; if (appstr->WORDSIZE == ' ') print (The)who; print (string)leave, "^"; } } move who to where; if (who in real_location) { if (arrive == 0 or NULL) print "^Vedi arrivare ", (the)who, ".^"; else { print "^"; #IfDef TARGET_GLULX; arrive.print_to_array(appstr, 250); #IfNot; ! TARGET_ZCODE arrive.print_to_array(appstr); #EndIf; if (appstr->WORDSIZE == ' ') print (The)who; print (string) arrive, "^"; } } ]; [ exitlist except where x y t8 t4 k; if (where == 0) where = location; if (where == TheDark) "@`E troppo buio. Non riesci a vedere dove andare."; t8 = 0; t4 = 0; objectloop(x in compass) { y = x.door_dir; if (where provides y) !if ((x ~= except) && (~~(where.x ofclass string)) && (where.x ~= except)) { if ((x ~= except) && (~~(where.y ofclass string)) && (where.y ~= except)) { if (x == u_obj or d_obj or in_obj or out_obj) t4++; else t8++; } } if ((t8+t4) == 0) "Non sembra ci siano uscite da qui."; if (t8) { print "Puoi andare verso "; k = 0; objectloop(x in compass) { if (x == u_obj or d_obj or in_obj or out_obj) continue; y = x.door_dir; if (where provides y) if ((x ~= except) && (~~(where.y ofclass string)) && (where.y ~= except)) { k++; if (k > 1 && k ~= t8) print ", "; if (k > 1 && k == t8) print " e "; print (name) x; } } print ". "; } else { print "Non ci sono direzioni ovvie in cui muoversi."; } ""; ]; ! ------------------------------------------ ! Oggetti 'strani' ! ------------------------------------------ Prop terreno "terreno" with name 'terreno' 'suolo' 'terra', short_name [; if (location ofclass DRoom or IRoom) { print "pavimento"; rtrue; } rfalse; ], before [; Examine: if (ishere(sottobosco)) <>; if (ishere(paglia)) <>; rfalse; ], react_before [; if (ishere(precipizio) || ishere(SSabbia)) rfalse; Examine, Search: if (noun==d_obj) <>; rfalse; ], found_in [; rtrue; ], ; Prop cielo "cielo" with name 'cielo' 'sole' 'luna' 'stelle' 'nuvola' 'nuvole', description [; if (night) { if (phase==0) "Il cielo @`e coperto e la luce della luna rischiara appena i tuoi passi."; if (real_location ofclass ORoom) "La notte @`e rischiarata dalla luna, che brilla nel nero del cielo."; "Qui, dove la luce della luna non riesce ad arrivare, le tenebre sono fittissime."; } if (darksky >= 2) "Il cielo - carico della polvere nera proveniente dalle viscere del vulcano - @`e scuro in modo innaturale, da dietro le montagne giungano gli ultimi raggi del sole."; if (darksky == 1) "Il sole @`e quasi tramontato mentre le nuvole di polvere si levano dal vulcano."; if (sunset) "Il cielo @`e limpido, e il sole sta tramontando dietro le montagne."; if (Iarin.follower) "Un bel sole splende sopra di voi."; "Un bel sole splende sopra di te."; ], found_in [; ! Solo all'aperto return (location ofclass ORoom or ERoom); ], react_before [; ! Se guardi in alto, vedi il cielo examine: if (noun==u_obj) <>; ], cant_go "Il cielo @`e veramente troppo lontano."; Prop neve "neve" with name 'neve', seen FALSE, description "Una neve sottile continua a cadere incessante, mentre il gelo penetra nelle ossa.", found_in [; ! Solo all'aperto e da un certo punto in poi return (location ofclass Oroom or Eroom && self has general); ], each_turn [; if (~~self.seen) { self.seen=TRUE; "Lievi fiocchi di neve stanno cadendo dal cielo."; } ], has female; Object pareti "pareti" with name 'parete' 'pareti' 'muro' 'muri' 'mura', found_in [; return(location ofclass IRoom or DRoom); ], before [; ! Esamina parete nord -> esamina nord ExamineDir: <>; ], has scenery static female pluralname concealed; Prop soffitto "soffitto" with name 'soffitto' 'volta', before [; Examine: if (location == DTempio) "Le quattro colonne sostengono la volta del soffitto."; rfalse; ], react_before [; Examine, Search: if (noun==u_obj) <>; rfalse; ], found_in [; return(location ofclass IRoom or DRoom); ], ; Distance kalnam "monte kalnam" with name 'monte' 'kalnam' 'montagna' 'vulcano', article "il", description [; print "Il monte Kalnam"; if (darksky==0) print ", un vulcano spento,"; print " domina tutta la valle. Perfino da lontano "; if (darksky) print "- specialmente dopo che si @`e risvegliato - "; "la sua vista incute un certo timore."; ], cant_go "@`E decisamente troppo lontano...", found_in SentieroForesta3 SentieroMiniere ForestaL2 ForestaR3 DavantiMiniere UscitaMiniera RaduraPietra Radura DavantiPalazzo NordPalazzo Giardini SentieroPalazzo PianuraOvest PianuraNord DavantiAlchimista PonteNord PonteSud VersoForesta, has scenery concealed; Object magazzino; #IfDef TARGET_GLULX; Object inthedark "" TheDark with each_turn [; NoPicture(true); ], has scenery; #EndIf; ! ------------------------------------------ ! Oggetti di partenza ! ------------------------------------------ Object abiti "tuoi abiti" with name 'abiti' 'vestiti' 'abito' 'vestito' 'giacca' 'pantaloni' 'scarpe' 'scarpa', article "i", description "I tuoi abiti, confortevoli ma non privi - nei loro colori scuri - di una certa eleganza.", before [; Disrobe: "Non ti sembra proprio il caso."; ], each_turn [; if (self has worn or dmensole) give self concealed; else give self ~concealed; ], has pluralname clothing worn concealed; Object stiletto "stiletto" with name 'pugnale' 'coltello' 'stiletto', description [; print "Il tuo sottile e affilatissimo pugnale, una delle migliori lame prodotte da Asdurin il fabbro.^"; if (self has general) "La lama @`e ancora bagnata del sangue di Iarin."; rtrue; ], before [; Take: if (self in player) "Stringi la mano sull'impugnatura del tuo fedele stiletto, pronto ad usarlo."; ]; Object soldi "soldi" with name 'soldi' 'monete' 'denaro' 'borsa' 'borsello', article "dei", description "Ah... la cosa pi@`u utile ad una spia... un borsello pieno di soldi...", before [; Count: "Abbastanza soldi per ogni evenienza..."; ], has pluralname; Object spada "spada" with name 'spada' 'sciabola' 'fioretto', description [; print "La tua spada, leggera, flessibile e veloce, capace di sfruttare l'agilit@`a di chi la impugna pi@`u che la sua forza.^"; if (self has general) "La lama @`e ancora bagnata del sangue di Iarin."; rtrue; ], before [; Take: if (self in player) "Impugni la tua spada, leggera e ben bilanciata."; ], has female; Object mandato "tuo mandato" with pname 'tuo' 'mandato' '.or' 'lettera' 'di' 'd^' 'incarico', article "il", description "Sulla tua lettera di incarico, recante il sigillo dell'imperatore e firmata dal patriarca del culto di Irdil, si legge come la tua missione sia verificare che nella valle di Nigat non siano praticati in alcun modo culti o rituali diversi da quelli ufficialmente riconosciuti. Questo mandato ti garantisce una vasta libert@`a d'azione nel corso delle tue indagini, anche se sai bene che dovrai portare rispetto al signore del feudo e ai rappresentanti dei quattro culti. Inoltre, come pi@`u di una volta hai imparato a tue spese, spesso l'anonimato potrebbe essere un'arma migliore nelle tue mani, visto che gli inquisitori - e le loro spie - non sono mai visti di buon occhio nemmeno dalle persone pi@`u pie."; ! ------------------------------------------ ! Include e Procedure ! ------------------------------------------ Include ">lunaglk.inf"; ! Glk/glulx stuff Include ">luna.bli"; ! Blorb constants Include ">lunamag.inf"; ! Il sistema di magia Include ">lunatlk.inf"; ! Conversazionali Include ">lunaint.inf"; ! Introduzione Include ">lunapal.inf"; ! Il Palazzo del barone Include ">lunavil.inf"; ! Il villaggio di Har Plenais Include ">lunafor.inf"; ! La foresta Include ">lunamin.inf"; ! Le miniere Include ">lunadru.inf"; ! Il tempio druidico Include ">lunadrm.inf"; ! Sequenza onirica Include ">lunaend.inf"; ! Conclusione Include ">lunalib.inf"; ! Libri Include ">lunashe.inf"; ! Iarin (png) Include ">lunamen.inf"; ! Menu di Aiuto ! Routine dei verbi [ LMode3Sub; "La modalità ~breve~ non è accessibile in questo gioco."; ]; [ EasyOnSub; easy = true; print_ret (string)Story, " @`e ora in modalit@`a ~facile~ (il gioco fornir@`a qualche suggerimento nei momenti pi@`u delicati, alcuni comandi verranno accettati anche in forma pi@`u semplice, il comando ~parla con ~ sar@`a sufficiente per gestire tutte le conversazioni). Usare il comando DIFFICILE per tornare alla difficolt@`a normale."; ]; [ EasyOffSub; easy = false; print_ret (string)Story, " @`e ora in modalit@`a ~difficile~ (ovvero il normale livello di difficolt@`a). Usare il comando FACILE per selezionare la modalit@`a ~facile~."; ]; [ ExitsSub; !if (location provides exits) { location.exits(true); rtrue; } if (location provides cant_go) { location.cant_go(); rtrue; } if (location == TheDark) "@`E troppo buio. Non riesci a vedere dove andare."; "Non sembrano esserci uscite da qua."; ]; [ RideSub; "Che cosa vuoi cavalcare?"; ]; [ CountSub; "Che cosa vuoi contare?"; ]; [ KnockSub; "Su cosa vuoi bussare?"; ]; [ PushWithSub; "Cosa vuoi spingere?"; ]; [ ReadSub; <>; ]; [ SaySub; "Nessuno ti risponde..."; ]; [ AutosaySub; "Non comprendi neanche tu il senso di ci@`o che dici..."; ]; [ LieDownSub; "Non hai tempo per sdraiarti..."; ]; [ FixSub; "Non sembra sia da riparare."; ]; [ NailSub; "Non ti sembra si possa inchiodare."; ]; [ NailToSub; "Non credi si possa inchiodare."; ]; [ PutUnderSub; "Non vedo come..."; ]; [ ExamineDirSub; <>; ]; ! [ BugSub; "Tutto ci@`o @`e veramente spiacevole..."; ]; ! DA RIMUOVERE ! Routine per sali e scendi [ GoUpSub; <>; ]; [ GoDownSub x; x=parent(player); if (x has supporter) <>; <>; ]; [ StabSub; if (stiletto in player) <>; "Non hai con te il tuo stiletto."; ]; #Ifdef DGAME; [ WarpSub; if (phase == 0) return(endintro()); !move mazzuolo to player; Playerto(DIngresso); rtrue; !move iarin to DavantiBaratro; Playerto(DavantiBaratro); rtrue; if (phase < 4) return(dreambegin()); if (phase < 5) return(dreamend()); move iarin to GalleriaSecondaria; move fiala to Player; iarin.known=1; iarin.meet=1; iarin.follower=1; iarin.errand=1; iarin.showdlibro=1; iarin.showdiario=1; iarin.showfiala=1; iarin.kissed=1; iarin.tellstone=1; iarin.tellstone2=1; iarin.trust=8; iarin.seenstone=1; give iarin proper; iarin.daemonrun=true; iarin.knowlian=true; give m_pietra ~locked; give m_iscrizioni ~locked; give m_donna ~locked; give m_sodnigguerth ~locked; Playerto(GalleriaSecondaria); rtrue; ! dreambegin(); ! "Warp non abilitato in questa fase."; ]; ![ WhereSub; ! print "location: ", (the)location, ".^"; ! print "real_location: ", (the)real_location, ".^"; ! print "parent(player): ", (the)parent(player), ".^"; ! rtrue; !]; #Ifndef DEBUG; [ PredictableSub i; #Ifdef TARGET_ZCODE; i = random(-100); #Ifnot; ! TARGET_GLULX @setrandom 100; i = i; #EndIf; ! TARGET "[Generatore di numeri casuali prevedibile.]"; ]; #EndIf; ! ~DEBUG #EndIf; ! DGAME ! Impianto per il verbo 'segui' Object followstore; Class Follow(4) with id 0, op 0, create [x y; self.id = x; self.op = y; move self to followstore; ]; !objectloop(x in followstore && x ofclass Follow) print "F:", (the) x.id, "^"; [ FollowSub x; objectloop (x in followstore && x ofclass Follow) { if (noun == x.id) { if (metaclass(x.op) == Routine) { x.op(); rtrue; } if (metaclass(x.op) == String) print_ret (string) x.op; if (parent(x.op) == Compass) <>; } } if (parent(noun) == location or player) { if (noun has animate) print_ret (The) noun, " ", (isorare) noun, " gi@`a qui."; "Non @`e qualcosa che tu possa seguire."; } "Non sai dove sia."; ]; [ FollowScope x; if (scope_stage==1) rfalse; if (scope_stage==2) { objectloop (x in followstore && x ofclass Follow) PlaceInScope(x.id); rtrue; } L__M(##Miscellany,30); ]; [ NewRoom x; NoPicture(true); objectloop (x in followstore && x ofclass Follow) Follow.destroy(x); ! if (iarin.follower && (~~ishere(iarin)) && iarin notin pietre) { ! ! Iarin ti segue ! if (real_location ~= DSacro || iarin.todruid == 0 || iarin.todruid >= 12) { ! move iarin to real_location; ! if (iarintalkingwith) iarin.talkto(true); ! } ! } !DrawImages(); rfalse; ]; ! Routine per topic ! [KeepTalkSub; ! if (xconversor==NULL) "Non stai parlando con nessuno, adesso."; ! <>; ! ]; ! ! [KeepAskSub; ! if (xconversor==NULL) "Non stai parlando con nessuno, adesso."; ! <>; ! ]; ![ GamePreRoutine; skipdefault = false; rfalse; ]; [ DarkToDark; "E' pericoloso procedere nell'oscurit@`a completa...^"; ]; ! Un minimo di disambiguazione [ ChooseObjects obj code r; if (code < 2) if (obj has scenery or static or animate or concealed) return 2; if (code == 0) { if (parent(obj) && parent(obj) has supporter) return 1; if (parent(obj) && parent(obj) has container && player in parent(obj)) return 1; } if (code < 2) return 0; ! code == 2 r = 6; if (obj has pluralname) r=5; if (obj has scenery or concealed) r=3; if (obj in compass) r=1; !if (obj==spiaggia or martello or pareti) return 3; if (obj==spiaggia) r = 6; if (obj==barra) r = 7; if (obj==sodnigguerth) r = 8; if (obj==diariotriven && location==CapannaTriven) r = 7; if (obj==dlibro && location==DSacro) r = 7; if (obj==storia or leggende or eibon && location==Biblioteca) r = 7; if (obj==devermismisteriis && location==CameraNaradas) r = 7; ! if (obj==librisugliscaffali) r = 7; if (action_to_be == ##Take && (~~owned(obj, player))) r = r + 3; ! print "]", (the) obj, " : ", r, "^"; return r; ]; ! Per gestire incantesimi e formule [ UnknownVerb word; if (word == 'saregin' or 'alamdia' or 'carnissar' or 'rinoeld' or 'ia') { firsttopic=word; return 's,say'; } if (word == 'frobez' or 'morgat' or 'vems' or 'drasel' or 'nrim' or 'eborag') { firsttopic=word; return 'c,cast'; } rfalse; ]; [ BeforeParsing mw sw; #IfDef TARGET_ZCODE; mw = 2; sw = 3; #IfNot; ! TARGET_GLULX; mw = 3; sw = 5; #EndIf; for (wn = 2 ::) switch(NextWordStopped()) { 'abete', 'larice': if (real_location == Radura) parse-->(wn*mw-sw) = 'alberi'; else parse-->(wn*mw-sw) = 'albero'; 'sempreverdi', 'abeti', 'larici': parse-->(wn*mw-sw) = 'alberi'; 'bosco': parse-->(wn*mw-sw) = 'foresta'; 'grotta': parse-->(wn*mw-sw) = 'caverna'; 'roccia': parse-->(wn*mw-sw) = 'pietra'; 'tunnel': parse-->(wn*mw-sw) = 'galleria'; -1: return; } ]; ![ BeforeParsing; ! thanks to Roger Firth !#IfDef TARGET_ZCODE; ! .rescan; ! for (wn=2 : wn1 : wn++) ! if (parse->(4*wn) == 1 && ! buffer->(parse->(4*wn + 1)) == '.' && ! parse-->(2*wn - 3) == 'dr' or 'mr' or 'mrs' or 'prof' or 'st') { !&& !! parse-->(2*wn + 1) == 'jekyll' or 'hyde') { ! buffer->(parse->(4*wn + 1)) = ' '; ! tokenise__(buffer,parse); ! jump rescan; ! } !#IfNot; ! TARGET_GLULX ! .rescan; ! for (wn=2 : wn < parse-->0: wn++) ! if (parse-->(3*wn-1) == 1 && ! buffer->(parse-->(3*wn)) == '.' && ! parse-->(3*wn - 5) == 'dr' or 'mr' or 'mrs' or 'prof' or 'st') { ! buffer->(parse-->(3*wn)) = ' '; ! tokenise__(buffer,parse); ! jump rescan; ! } !#EndIf; !]; [ Handle_SCENERY_PE; ! Per un errore di SCENERY (usare una parola della proprieta' NAME ! della stanza) dovuto ad un'operazione di tipo EXAMINE o simili, ! mostra la descrizione della stanza. if (action_to_be == ##Examine or ##Search or ##Consult or ##ExamineDir) { if (location.describe ~= NULL) RunRoutines(location, describe); else { if (location.description == 0) RunTimeError(11, location); else PrintOrRun(location, description); } InformLibrary.end_turn_sequence(); rtrue; } !"@`E solo il luogo in cui ti trovi."; rfalse; ! Gli errori non sono gestiti. ]; [ ParserError eType; ! Entry point standard, chiamato dopo un errore di parsing. if (eType == SCENERY_PE) return Handle_SCENERY_PE(); rfalse; ! Error was NOT handled by this routine. ]; ![ LookRoutine; ! ImageBreak(); !]; ![ ParseNoun obj w f k; ! k = wn; ! if (obj has door) { ! print "ParseNoun on door ", (the) obj, " with wn = ", wn, ".^"; ! if (NextWord() ~= 'porta') { wn = k; return -1; } ! f = 1; ! w = NextWord(); ! if (w == 'verso' or 'a//') { f++; w =NextWord(); } ! if (obj == portanaradas && WordInProperty(w, n_obj, name)) { wn = k; return f++; } ! if (obj == portasud && WordInProperty(w, s_obj, name)) { wn = k; return f++; } ! wn = k; return -1; ! } ! wn = k; return -1; !]; [ Initialise; #ifdef DEBUG; pname_verify(); #endif; TestGlkCapabilities(); MakeScreen(); print "Sono diversi giorni che cavalchi, e finalmente sei giunto esausto alla valle di Nigat, uno dei pi@`u piccoli feudi dell'impero. Davanti a te, mentre passi lungo un piccolo sentiero che serpeggia tra la fitta vegetazione tipica della zona, vedi un piccolo villaggio e, poco pi@`u avanti, il palazzo del barone Inderus. In lontananza, tra le sagome della catena montuosa che segna il confine settentrionale della valle, vedi troneggiare il monte Kalnam, un vulcano spento che sembra dominare questa piccola valle boscosa come se ne fosse il signore assoluto.^^ Il sole @`e tramontato, la luce del giorno @`e scomparsa e il cielo coperto rende oscura questa notte nonostante la luna sia quasi piena, ma finalmente il lungo viaggio @`e finito, e adesso brami soltanto una buona notte di sonno per scacciare la stanchezza del viaggio. Manca ormai poco al palazzo. Sicuramente il barone sar@`a stato avvertito del tuo arrivo e avr@`a provveduto ad assegnarti una stanza. Dopotutto, anche se sei soltanto poco pi@`u che una spia, hai pur sempre il mandato ufficiale dell'imperatore e dei patriarchi dei quattro culti.^^^"; player.description=describeplayer; player.parse_name=parseplayername; lookmode=2; !waitkey(); !objectloop(x has legible) move x to player; remove necronomicon; banner(); !#Ifndef DGAME; print "Vuoi caricare una partita salvata? > "; if (yesorno()) ; !#Endif; move abiti to player; move stiletto to player; move soldi to player; move spada to player; move mandato to player; move grimorio to player; move GuilnernIn to PonteIn; location = GuilnernIn; move player to GuilnernIn; phase=0; turns=0; night=TRUE; addhint(h_begin); StartDaemon(mpdaemon); StartDaemon(magic); !!TalkInit(); return 2; ]; [describeplayer k; print "Tu sei Lian Caeras, investigatore e spia al servizio dei quattro culti. Non troppo alto, di corporatura asciutta, "; if (~~(player in dvasca && dvasca has general)) print "vestito - come a tuo solito - di confortevoli abiti dai colori scuri, "; print "sei abile con spada e pugnale quanto lo sei con le parole, ti diletti nelle arti arcane, e sei agile, silenzioso, veloce e fin troppo sicuro di te stesso...^^"; k = inventory_style; ; inventory_style = k; rtrue; ]; [parseplayername n; while (NextWord() == 'lian' or 'caeras') n++; return n; ]; !Global ScenicFlag=4; !Constant ScenicError "@`E il luogo dove ti trovi."; Replace ADirection; [ ADirection; if (noun ofclass Direction) rtrue; if (noun in compass) rtrue; rfalse; ]; !Include ">scenicl.h"; Include "ItalianG"; Include "wtellask_it"; ! ------------------------------------------ ! Estensioni ! ------------------------------------------ Verb meta 'help' 'info' 'informazioni' 'aiuto' 'menu' * -> Help; !Verb meta 'hint' 'suggerimento' * -> Hint; Verb meta 'uscite' * -> Exits; Verb meta 'facile' 'easy' 'semplice' 'simple' * -> EasyOn; Verb meta 'difficile' 'difficult' 'fair' * -> EasyOff; Verb 'monta' 'cavalca' * 'su'/'sullo'/'sull^'/'sulla'/'sul'/ 'sugli'/'sulle'/'sopra' noun -> Ride * noun -> Ride; Verb 'smonta' * 'da'/'dal'/'dallo'/'dalla'/'dall^'/'dai'/ 'dagli'/'dalle' noun -> Exit * noun -> Exit; Verb 'bussa' * -> Knock * 'a'/'all^'/'allo'/'alla'/'al'/'agli'/'ai'/ 'alle' noun -> Knock; Verb 'solleva' 'alza' * noun -> Take * noun 'con' held -> PushWith; Verb 'conta' * noun -> Count; Verb 'ordina' * noun -> Buy * 'a'/'all^'/'allo'/'alla'/'al'/'agli'/'ai'/ 'alle' creature noun -> AskFor * noun 'a'/'all^'/'allo'/'alla'/'al'/'agli'/'ai'/ 'alle' creature -> AskFor reverse; ! Per lanciare incantesimi Extend only 'lancia' first * spell -> Cast * spell 'a'/'all^'/'allo'/'alla'/'al'/'agli'/'ai'/ 'alle'/'su'/'sul'/'sullo'/'sull^'/'sulla'/'sui'/ 'sugli'/'sulle'/'sopra'/'contro'/'verso' noun -> Cast; ! Per lanciare incantesimi con una parola sola Verb 'c,cast' * -> AutoCast * noun -> AutoCast * 'a'/'all^'/'allo'/'alla'/'al'/'agli'/'ai'/ 'alle'/'su'/'sul'/'sullo'/'sull^'/'sulla'/'sui'/ 'sugli'/'sulle'/'sopra'/'contro'/'verso' noun -> AutoCast; Extend 'leggi' first * legible -> Read; Verb 'pronuncia' 'recita' * topic -> Say; Extend 'di' first * topic -> Say; ! Per recitare formule Verb 's,say' * topic -> Autosay * -> Autosay; Extend 'premi' * noun 'con' held -> PushWith; Extend 'sposta' * noun 'con' held -> PushWith; Extend 'sdraiati' first * -> LieDown; Extend 'esamina' * noun noun=ADirection -> ExamineDir * noun 'a'/'ad'/'verso' noun=ADirection -> ExamineDir; Extend 'guarda' * noun noun=ADirection -> ExamineDir * noun 'a'/'ad'/'verso' noun=ADirection -> ExamineDir; Extend 'cerca' ! * 'dentro'/'in'/'nel'/'nello'/'nell^'/'nella'/ ! 'negli'/'nelle'/'nei'/'fra'/'tra' ! noun noun=ADirection -> ExamineDir ! * 'dentro'/'in'/'nel'/'nello'/'nell^'/'nella'/ ! 'negli'/'nelle'/'nei'/'fra'/'tra' ! noun 'a'/'ad'/'verso' noun=ADirection -> ExamineDir * 'a'/'ad'/'verso' noun=ADirection -> Examine; Verb 'ripara' 'aggiusta' 'sistema' * noun -> Fix * noun 'con' noun -> Fix; Verb 'inchioda' * noun -> Nail * noun 'con' noun -> Nail * noun 'a'/'ad'/'all^'/'allo'/'alla'/ 'al'/'agli'/'ai'/'alle' noun -> NailTo; Extend 'sali' first * -> GoUp; Extend 'scendi' first * -> GoDown; Extend 'metti' * noun 'sotto' noun -> PutUnder; Extend 'inserisci' * noun 'sotto' noun -> PutUnder; Extend 'versa' * noun 'dentro'/'in'/'nel'/'nello'/'nell^'/ 'nella'/'negli'/'nelle'/'nei' noun -> EmptyT * noun 'dentro' 'a'/'ad'/'all^'/'allo'/'alla'/ 'al'/'agli'/'ai'/'alle' noun -> EmptyT; Extend 'sblocca' first * noun -> Open; Extend 'blocca' first * noun -> Close; Verb 'ferma' = 'blocca'; Verb 'alzati' = 'esci'; Verb 'pugnala' 'accoltella' * noun -> Stab; Verb 'segui' 'insegui' * scope=FollowScope -> Follow * noun -> Follow; Verb 'impugna' = 'prendi'; #Ifdef DGAME; Verb meta 'warp' * -> Warp; !Verb meta 'where' * -> Where; #Ifndef DEBUG; Verb meta 'random' * -> Predictable; #Endif; ! ~DEBUG #Endif; ! DGAME