!% +language_name=Swedish
!% -v5
!% -~S~D
!---------------------------------------------------------------------------------------------------
! (c) 1996-97, 2002-08 Johan Berntsson, johan@microheaven.com
!
! ENGLISH:
! This game source has been release in public domain as an example of game written
! in Swedish. Use it for reference and as inspiration for your own game design.
! SWEDISH:
! Denna källkod är fri att sprida, och menad som ett exempel på ett spel skrivet på svenska.
! Använd den som referens och inspiration till ditt eget spel.
!
! This is the first game I wrote in Inform, and it was never meant to be more than a design
! experiment. Later it became the test bench for Glulx and swedish.h, and it demonstrates how
! to add Swedish language support in Inform. The code is rather messy, and there must be some bugs left.
! Among my more ambitious games are "Vacation gone awry" and "The Temple". Both can be
! downloaded from the IF archive.
!
! HISTORY:
! 961014: First lines of code written.
! 961023: The introduction, the dragon problem and the endgame
! have been implemented and a first version sent to Staffan Friberg.
! 961028: The first bugs reported by Staffan have been fixed.
! 970728: Added two stones and related problems. Rewrote some texts.
!
! 020204: rewritten in Swedish
! 020304: two new puzzles, some improvments.
! 020305: Ported to Glulx, some graphics added.
!
! 030227: updated to new version of swedish.h. More help texts. Released in public domain.
! 030617: updated to new version of swedish.h.
! 040315: updated to new version of swedish.h. (v1.2, compiler 6.30, library 6/11). Slight cleanup of code.
! 040615: a few bugs fixed and missing description added. New dragon picture in Glulx mode.
! 050812: implemented new help items suggested by Fredrik Ramsberg (thanks!)
! 070823: added a few synonyms
! 080419: fixed a few small errors (spelling and missing grammar)
!
! BUGS: It's not a bug, it's a feature!
Include "SweAlpha";
Release 6;
Serial "080419";
Constant Story "Drakmagi";
Constant Headline "^(c) 2003-2008 Johan Berntsson. Skriv ~hjälp~ eller ~h~ för instruktioner.^";
Constant MAX_SCORE 50;
Constant SACK_OBJECT backpack;
Constant AMUSING_PROVIDED;
! Drakmagis IFID -- se http://babel.ifarchive.org/
Array UUID_ARRAY string "UUID://E37E67D5-7DAA-47B9-BD23-800CF68800DC//"; #Ifdef UUID_ARRAY; #Endif;
[ Amusing; HelpSub(); ];
Include "Parser";
!
! Support routines for Glulx graphics
!
#ifdef TARGET_GLULX;
Include "Infglk";
Include ">drakmagi.bli";
Global imageok;
Global window_width;
Global window_height;
[ WindowSize w fh;
! Finds the main window's size in pixels. No method seems to exist, so this is a messy solution.
! Open a graphics window on top of the main window, check its size, and close it.
w=glk_window_open(gg_mainwin, (winmethod_Below+winmethod_Proportional), 100, wintype_Graphics, 210);
glk_window_get_size(w, gg_arguments, gg_arguments+4);
window_width=gg_arguments-->0;
window_height=gg_arguments-->1;
glk_window_close(w);
! We need space for the [More] prompt if the window is small. Calculate the text height
glk_window_get_size(gg_mainwin, gg_arguments, gg_arguments+4);
fh=window_height/gg_arguments-->1; ! the height of each text line in pixels
window_height=window_height-2*fh;
];
[ DrawPic pic w h dw dh;
if(imageok) {
! Resize if the picture is too big (I miss floats, but this should work reasonably well)
glk_image_get_info(pic, gg_arguments, gg_arguments+4);
w=gg_arguments-->0;
h=gg_arguments-->1;
dw=w/10;
dh=h/10;
while(w>window_width || h>window_height) {
! make smaller until the picture fits into the window
w=w-dw;
h=h-dh;
}
glk_image_draw_scaled(gg_mainwin, pic, imagealign_InlineUp, 0, w, h);
print "^";
}
];
[ HandleGlkEvent ev context;
switch (ev-->0) {
evtype_Redraw:
WindowSize();
evtype_Arrange:
WindowSize();
}
context=0; ! suppress compiler warnings
];
[ CheckGraphics;
if (glk_gestalt(gestalt_Graphics, 0)) {
WindowSize();
imageok=true;
} else {
imageok=false;
print "[Tyvärr kan inte din interpretator hantera grafik, så inga bilder kan visas]^^";
}
];
#endif;
Include "VerbLib";
Include "SweRout";
Include "SwedishG";
Include ">Magic.inf";
! -------- New grammar -------------------
Verb 'hjälp' 'h//' * -> Help;
Verb 'tid' 'datum' * -> Time;
Verb 'animera' * noun -> MagicAnimate;
Verb 'frys' * noun -> MagicFreeze;
Verb 'hela' * noun -> MagicHeal;
Verb 'återuppväck' 'uppväck' 'återuppstå'
* noun -> MagicResurrect
* noun 'från' 'de' 'döda' -> MagicResurrect;
Verb 'odöda'
* noun -> MagicResurrect;
Extend 'väck' first
* noun 'från' 'de' 'döda' -> MagicResurrect
* 'upp' noun 'från' 'de' 'döda' -> MagicResurrect;
Extend 'ge' first
* noun 'nytt' 'liv' -> MagicResurrect
* noun 'liv' -> MagicResurrect
* 'liv' 'åt' noun -> MagicResurrect
* 'nytt' 'liv' 'åt' noun -> MagicResurrect;
Verb 'teleportera' * -> MagicTeleport;
Verb 'peka' * 'på' noun -> PointAt;
[ PointAtSub; "Du pekar. Inget händer."; ];
Extend only 'döda' first * noun -> MagicKill;
Extend 'rör' last
* noun 'med' noun -> Touch
* 'vid'/'på' noun 'med' noun -> Touch;
Extend 'slå'
* 'till'/'på'/'sönder' noun 'med' held -> AttackWith;
Extend 'bryt' first
* noun 'med' held -> AttackWith;
[ MagicAnimateSub; AnimateSpell.activate(noun); ];
[ MagicFreezeSub; FreezeSpell.activate(noun); ];
[ MagicHealSub; HealSpell.activate(noun); ];
[ MagicResurrectSub; ResurrectSpell.activate(noun); ];
[ MagicTeleportSub; TeleportSpell.activate(); ];
[ MagicKillSub;
if(KillSpell in SpellBook) KillSpell.activate(noun);
else <Attack noun>; ];
[ AttackWithSub;
if(second==Amulet) <<ThrowAt second noun>>;
else <<Attack noun>>; ];
[ TimeSub; switch(the_time/60) {
22, 23, 0, 1, 2, 3: "Det är natt.";
4, 5, 6: "Det är tidig morgon.";
7, 8, 9, 10, 11: "Det är förmiddag.";
12, 13, 14, 15, 16, 17: "Det är eftermiddag.";
18, 19, 20, 21: "Det är kväll.";
} ];
! ------------ Init the game -------------------
[ Initialise;
player=PlayerObject;
print "^^Brevet ifrån din gamle handledare kom oväntat. Du kommer fortfarande väl ihåg hur de
andra lärarna på magikerskolan anklagade honom för att arbeta med svart magi. En
dag var han borta och du har inte hört något ifrån honom sedan dess.^^\
Utan hans tålmodiga förklaringar hade du antagligen inte klarat dina studier, och nu
behöver han din hjälp. Utan tvekan följde du vägbeskrivningen i brevet, och efter en
lång resa står du framför din lärares oansenliga bostad.^^";
#ifdef TARGET_GLULX;
CheckGraphics();
#endif;
score=0;
! SetTime(60*12, 1); ! Start at 12.00, time step is 1 minute
lookmode=2; ! Always show long descriptions (verbose)
location=Glen;
move SpellBook to player;
move BackPack to player;
move DirtyScroll to Glen;
move FreezeSpell to SpellBook;
move HealSpell to SpellBook;
StartDaemon(Dragon);
];
Object EpiloqueRoom "Epilog";
[ Epilogue status pkey;
print "^Tryck mellanslag.";
pkey=KeyCharPrimitive();
ClearScreen(2); ! (2) for mainwin only
print "^^^";
location=EpiloqueRoom;
switch(status) {
1:
print "En ny era av terror och skräck tar sin början. De Gamla Gudarna regerar ännu en gång
jorden, och den förste att slitas i stycken är du.^";
deadflag=1;
2:
print "Jorden är räddad, men minnet av din lärares död smärtar dig.^";
deadflag=2;
3:
print "Jorden är räddad, och din lärares själ är återbördad. Slutet gott, allting gott.^";
deadflag=2;
};
];
Object PlayerObject "dig själv"
with number 0,
before NULL, after NULL, life NULL, each_turn NULL,
time_out NULL, describe NULL, capacity 100,
parse_name 0, orders 0, ! short_name 0
description [;
if(self has general) {
"Du är en korsning mellan människa och fisk.";
}
"Lika snygg som vanligt.";
],
domagic [spell;
switch(spell) {
HealSpell:
"Du känner dig friskare och starkare än tidigare.";
FreezeSpell:
"Plötsligt är du täckt av ett tunnt islager. Det är väldigt kallt och obehagligt,
men isen smälter snabbt.";
IlluminateSpell:
give player light;
"Ett bländande ljus omger dig och du börjar glöda. Ljuset bleknar långsamt bort, men du
är nu en helt adekvat ljuskälla.";
AnimateSpell:
"Märkligt nog känner du ingen större skillnad. Du är lika mycket vid liv som tidigare.";
ResurrectSpell:
"Detta är en besvärjelse för att väcka de döda till liv. Eftersom du inte är död (ännu) händer inget.";
KillSpell:
deadflag=1; "Plötsligt upphör du att finnas till.";
}
],
has concealed animate proper transparent; ! general if fishlike
! ------------ Useful parser extensions -----------
[ IsCarried obj;
! Check if player is carrying obj
return IsObjInContainer(obj, player);
];
[ IsHeld obj;
! Check if player is holding obj in his hands
if(obj in player) rtrue;
rfalse;
];
[ GrabObject obj;
! Silently ready a object for use (hold it).
! false if ok, true if not possible
if(IsHeld(obj)) rfalse;
keep_silent=1;
<Take obj>;
keep_silent=0;
if(IsHeld(obj)) rfalse;
rtrue;
];
[ RemoveObj obj notstop;
! Remove an object
! if notstop not given or zero, stop timers and daemons
if(notstop==0) {
StopDaemon(obj);
StopTimer(obj);
}
remove obj;
];
[ ReplaceObj cur_obj new_obj notstop;
! Remove an cur_obj and insert new_obj
! if notstop not given or zero,
! stop timers and daemons for cur_obj
if(notstop==0) {
StopDaemon(cur_obj);
StopTimer(cur_obj);
}
move new_obj to parent(cur_obj);
remove cur_obj;
];
[ IsObjInContainer obj container;
for(:parent(obj)~=container:obj=parent(obj))
if(parent(obj)==nothing) rfalse;
rtrue;
];
[ NumberOfNewStones i total;
total=0;
for(i=0: i<WantedStones-->0: ++i) {
if((WantedStones-->(i*2+1)==0) &&
TestScope(WantedStones-->(i*2+2), player)) {
WantedStones-->(i*2+1)=1;
++total;
}
}
return total;
];
Object tiny_claws "hasande ljud" thedark
! Creepy effect. Borrowed from the Inform Designer's Manual
with
name 'hasande' 'ljud' 'ljudet' 'djur' 'djuren' 'insekter' 'insekterna',
short_name_def "hasande ljudet",
initial "Någonting hasar mot marken i mörket.",
before [;
Listen: "De hasande ljuden omger dig.";
Touch, Taste: "Det vill du egentligen inte göra. Tro mig.";
Smell: "Fruktan har en egen doft, och du känner den nu.";
Attack: "De undviker lätt dina utfall i mörkret.";
default: "Djuren viker undan i mörkret.";
],
each_turn [; StartDaemon(self); ],
number 0,
daemon [;
if(location~=thedark) {
self.number=0;
StopDaemon(self);
rtrue;
}
self.number=self.number+1;
switch(self.number) {
1:
"^Hasandet kommer lite närmare, och ditt hjärta slår snabbare.";
2:
"^Kallsvetten börjar droppa ifrån din panna. Djuren är nästan här!";
3:
"^Något nuddar vid din fot och du sparkar till. Någonting kastas ut i mörkret.";
4:
deadflag=1;
"^Något landar på din hand och biter dig. Nästan omedelbart börjar din arm skaka.
Smärtan sprider sig, dina knän viker sig, din tunga svullnar upp...";
}
],
has neuter def_article;
! ------------ The rooms ------------------
Object RemoteHut "Stuga"
with
description "Stugan är inte speciellt trevlig. Det enda fönstret är helt täckt av sot, och en eldstad är
den enda ljuskällan. På elden står kärl fyllda med konstiga vätskor. En stor bänk
är fylld av böcker, pergament och ingredienser till trollbrygder. En dörr leder
norrut, mot skogen.",
n_to Glen, out_to Glen,
cant_go "Den enda vägen ut är genom dörren.",
has light;
Object -> hut_pot "kärl" with name 'kärl' 'kärlen' 'vätskor', short_name_def "kärlen" has scenery concealed neuter;
Object -> hut_fp "eldstad" with name 'eldstad' 'eldstaden', short_name_def "eldstaden" has scenery concealed;
Object -> hut_bench "bänk"
with
name 'bänk' 'bänken',
short_name_def "bänken",
description [;
if(hut_doc in self && children(self)==1) "Det ligger böcker och pergament på bänken.";
print "Det finns";
WriteListFrom(child(hut_bench), ENGLISH_BIT+RECURSE_BIT+ISARE_BIT);
print " på bänken.";
],
has scenery supporter;
Object -> -> hut_doc "böcker"
with
name 'böcker' 'böckerna' 'pergament',
short_name_def "böckerna",
description
"Alla böcker handlar om magi. De mest intressanta handlar om drakar och deras magi, men de
är strikt teoretiska och av lite värde för dig.",
before [;
Transfer, Take, Remove: if(TestScope(Master)) "~Rör inte böckerna. Jag behöver dem~, säger Istar.";
],
after [; Take,Remove: give self ~concealed; ],
has concealed pluralname;
Object -> GoldBox "gyllene låda"
with
name 'gyllene' 'lådan' 'låda' 'förgyllt' 'förgylld' 'förgyllda' 'trä' 'trälåda' 'trälådan' 'ask' 'asken' 'magisk' 'magiska',
short_name_def "gyllene lådan",
initial [;
print "En vacker låda av förgyllt trä står i en nisch i väggen";
if(children(self)>0) {
print ". Den innehåller ";
WriteListFrom(child(self), ENGLISH_BIT);
}
print ".^";
],
description [;
print "Professionella trollkarlar använder sådana lådor för att förvara magiska föremål.
Kraftfulla besvärjelser har lästs över den, och enbart dess ägare kan komma åt dess innehåll.^";
if(children(self)>0) {
print "^I lådan finns ";
WriteListFrom(child(self), ENGLISH_BIT);
print ".^";
}
],
before [;
Transfer, Take, Remove, LetGo:
if(TestScope(Master))
"Omöjligt, lådan är skyddad av kraftfulla besvärjelser mot stöld och åverkan.";
Receive:
if((noun ofclass CStone)==false)
print_ret "Trots att lådan är öppen kan du inte lägga ",
(the) noun, " i ", (the) self, ".";
],
after [;
Receive:
if(children(self)==WantedStones-->0 && TestScope(Master)) {
print "Din lärare ser dig lägga den sista stenen i lådan och ropar
~Den sista stenen! Nu kan jag öppna porten~^^\
Han tar upp stenarna ifrån lådan och säger, ~Följ med, stora
uppgifter väntar.~ Allt blir plötsligt gult när han läser en teleporteringsbesvärjelse,
och ni förflyttas till en annan plats.^";
StartDaemon(EvilMaster);
PlayerTo(GateRoom);
rtrue;
}
],
has container open def_article;
Object -> Master "Istar"
with
name 'lärare' 'läraren' 'gammal' 'trollkarl' 'trollkarlen' 'istar' 'min' 'din' 'gamle' 'gamla' 'man' 'mannen',
domagic [spell;
if(spell==KillSpell) rfalse;
print (The) self, " stoppar besvärjelsen med en handviftning.
~Vad håller du på med för dumheter? Ge dig på någon i din egen storlek istället~^";
rtrue;
],
initial [;
if(Introduction in self) {
move Introduction to player;
"Istar, din gamle lärare, sitter vid bänken och läser i en gammal bok. När han ser dig
säger han, ~Min pojke, jag är så glad att se dig igen. Stora uppgifter väntar oss,
men till att börja med vill jag att du läser detta~. Han tar upp ett papper och ger
det till dig. ~Det är en sammanfattning av mitt arbete så här långt.~";
}
print (string) random(
"Din lärare läser ett pergament.",
"Din lärare kontrollerar innehållet i en av bägarna.",
"Din lärare funderar på något."), "^";
],
react_after [;
Go:
switch(NumberOfNewStones()) {
0: rfalse;
1:
print "När du kommer in i stugan säger din gamle lärare,
~Jag ser att du funnit en ny sten. Bra gjort. Lägg den i den förgyllda lådan.~^";
default:
print "När du kommer in i stugan säger din gamle lärare,
~Jag ser att du funnit fler stenar. Mycket bra. Om du håller den här takten
är vi snart klara. Lägg stenarna i den förgyllda lådan.~^";
}
rfalse;
],
description [;
"Din lärare är nu en gammal man. Hans hår har blivit vitt.";
],
life [;
Order:
"Han ignorerar dig.";
Ask:
if(second ofclass CStone) second='sten';
switch(second) {
'sammanfattning', 'papper', 'rapport', Introduction:
"~Det är en lång historia och jag hinner inte berätta den igen. Läs vad
jag skrivit istället.~";
'sten', 'stenar', 'stenarna', 'stenen':
"~Lägg stenarna i lådan~";
'magi', 'besvärjelse', 'besvärjelser':
"~Du borde veta vad magi är vid det här laget. Men kom ihåg att
det finns flera sorters magi. På den senaste tiden har jag försökt
att utforska den mäktiga magi som demoner och drakar använder.
Det är naturligtvis därför som mina kollegor vände sig emot mig. De
är avundsjuka och rädda.~";
'vit', 'port':
"~Det enda sättet jag känner till som vi kan stoppa de gamla gudarnas
återkomst på är att öppna porten till en annan dimension, där vi kan ta
hjälp av vit magi. Jag vet hur man hittar porten, men jag behöver stenarna
för att öppna den. Jag kan inte lämna stugan, så det är upp till dig att
rädda oss alla.~";
'svart', 'gamla', 'gudar':
"~Jag har studerat svart magi under lång tid, och jag kan säga
dig att dess kraft är farlig och mäktig. Den verkar härstamma från
varelser som en gång levde på jorden som vanligvis kallas de gamla
gudarna. Jag är rädd att de snart kommer tillbaka, och att de kommer
att krossa oss som insekter, om vi inte lyckas stoppa dem.~";
'trollbrygder', 'vätskor', 'ingredienser':
"~Rör ingenting. Jag håller på med ett experiment.~";
'demon', 'demoner', 'demonmagi':
"~Jag lyckades aldrig göra några framsteg i demonmagi. Deras tankevärld är
så gott som omöjligt att förstå för människor.~";
'drakar', 'drake', Dragon:
"~Ja, drakar är verkligen intressanta. De är giriga och följer sin egen
moralkod, men jag skulle inte kalla dem onda. Visst sätter de stort
värde på sina ägodelar, och stjäla något ifrån en drake är inte att
rekommendera. Mer intressant för oss är att de har god kännedom om
magi. De kan besvärjelser som är mer avancerade än någon av våra
bästa trollkarlar behärskar. Men de vet värdet av sin kunskap. Ingen drake
har någonsin lärt ut sina konster till en människa. De dör hellre.~";
'mig', SelfObj:
"~Du var alltid min favoritelev, och jag visste att du skulle hjälpa mig.~";
'stuga', 'skog':
"~Jag kanske bor lite långt ute i ödemarken, men ingen stör mig här.~";
'låda', 'förgyllda', 'lådan':
"~Jag tog med den ifrån skolan. Mycket praktisk, eller hur? Jag behöver
aldrig oroa mig för att någon ska stjäla mina mest värdefulla saker.~";
'silver', 'teleportering', SilverScroll, TeleportSpell:
"~Jag har gjort den här besvärjelsen för att underlätta ditt sökande. Den kommer att
föra nära stenarna.~";
'pergamentsrulle', 'smutsig', DirtyScroll, AnimateSpell:
if(TestScope(DirtyScroll)) {
if(parent(AnimateSpell)==DirtyScroll) {
"~Det är en intressant besvärjelse. Att väcka saker till liv är farligt, men kan vara
väldigt användbart ibland.~";
} else {
print "~Hmm, jag tror att pergamentet innehåller mer än vad man kan se med blotta ögat.
Jag såg något liknande för länge sedan. Låt oss prova ett litet trick.~^^Han tar fram ett fat
och blandar en grön och en gul vätska. Rummet fylls av en stickande rök. Obesvärad av
detta håller Istar pergamentsrullen ovanför fatet. Efter någon minut ger han den till dig, och
du ser att en tidigare osynlig text har framträtt. Det är en besvärjelse!^^\
Istar ler. Han verkar odrägligt nöjd med sig själv.";
move AnimateSpell to DirtyScroll;
score=score+10;
rtrue;
}
} else {
"~Pergamentsrulle, vilken pergamentsrulle?~";
}
default: "~Tyvärr vet jag inget om det.~";
}
Answer:
"Han verkar inte bry sig om vad du säger.";
Show, Give:
if(noun ofclass CStone) <<Ask self noun>>;
if(noun==SelfObj || noun==DirtyScroll || noun==Introduction)
<<Ask self noun>>;
],
react_before [;
Go, Exit:
if(noun~=0 && noun~=n_obj) rfalse;
if(BlackStone in self) {
move BlackStone to GoldBox;
move SilverScroll to player;
print "^~Innan du går så borde jag visa dig min sten~ säger Istar.
Han visar dig en svart sten och lägger den i ", (the) GoldBox,
". ~Om du hittar fler stenar så vill jag att du lägger dem i lådan. Ta den
här också~ säger han och ger dig en silverfärgad pergamentsrulle. ~Stenarna ligger
alltför långt bort för att du ska kunna ta dig dit till fots. Kopiera den här
teleporteringsbesvärjelsen till din magibok så kan du resa snabbare.~^";
rtrue;
}
if(IsCarried(Introduction) && TestScope(Introduction)) {
move Introduction to RemoteHut;
print "^~Det är nog säkrast att pappret stannar här~,
säger ", (the) Master, " och tar ",
(the) Introduction, " ifrån dig.^";
}
],
has animate proper;
Object Glen "Äng"
with
description [;
#ifdef TARGET_GLULX;
DrawPic(PicHut);
#endif;
"Detta är en liten äng framför en förfallen stuga.
Den är omgiven av en mörk skog, som är i det närmaste
oigenomtränglig. En stig leder norrut.";
],
in_to RemoteHut, s_to RemoteHut,
n_to [;
if(RemoteHut hasnt visited) "Du har ju just kommit hit. Ska du inte besöka din gamle vän efter att ha vandrat så långt?";
"Det är långt till närmaste by och du har bråttom. Kanske du kan hitta ett bätte transportmedel?";
],
cant_go "Skogen är oigenomtränglig.",
has light;
CScroll -> DirtyScroll "smutsig pergamentsrulle"
with
name 'smutsig' 'smutsiga' 'pergamentsrulle' 'pergamentsrullen' 'rullen' 'rulle',
short_name_def "smutsiga pergamentsrullen",
initial "Nere i gräset ser du något. Det verkar vara en pergamentsrulle.",
has def_article;
Object Hut "stuga"
with
name 'stuga' 'stugan' 'liten' 'förfallen',
short_name_def "stugan",
found_in RemoteHut Glen,
before [;
Enter: if(location==Glen) <<Go s_obj>>;
],
has scenery concealed;
Object f_f "skog"
with
name 'mörk' 'oigenomtränglig' 'skog' 'skogen' 'träd',
short_name_def "skogen",
found_in Glen Forest ForestPath Mountain,
has scenery concealed;
Object Forest "Skog"
with
description "Du står på en stig i en fullvuxen skog. Stigen leder vidare österut mellan träden.",
e_to ForestPath,
has light;
Object ForestPath "Skogsstig"
with
description [;
#ifdef TARGET_GLULX;
DrawPic(PicWood);
#endif;
"Du står på en smal stig i en mörk skog. Den leder österut mot ett högt berg, och västerut djupare in i skogen.";
],
e_to Mountain, w_to Forest,
has light;
Object Mountain "Berget"
with
description "Skogen tunnar ut mot sidan av ett stort berg, som är alltför brant för att bestigas.
I väster kan du se en stig som leder in i skogen. Inte långt härifrån finns en grottöppning
som leder in i berget.",
w_to ForestPath, n_to Cave, in_to Cave,
has light;
Object Cave "Grotta"
with
description "Grottan består av ett stort, oregelbundet, rum. Trots att ljus kommer in från grottmynningen
i den söda väggen så är en stor del av rummet i skugga, och det är svårt att se hur stort det är.
Du kan i varje fall se en tunnel som leder vidare norrut.",
n_to MountainHall,
s_to Mountain, out_to Mountain,
has light;
[ UpSlope normalroom;
if(MountainSlope has general) {
print (string) random(
"Marken är frusen och svårt att gå uppför.",
"Med viss ansträngning lyckas du gå uppför den frusna backen."), "^";
} else {
print (string) random(
"Backen är brant, och du blir anfådd.",
"Med viss ansträning går du uppför den branta backen."), "^";
}
return normalroom;
];
[ DownSlope normalroom otherroom;
if(MountainSlope has general) {
if(otherroom) {
print "Marken är frusen, och du halkar nedför backen.^";
return otherroom;
} else {
print "Backen är frusen, och du hasar ned.^";
}
} else {
print (string) random(
"Backen är så brant att du halvspringer ned.",
"Du går lätt nedför backen.",), "^";
}
return normalroom;
];
Object MountainHall "Klipprummet"
with
description "Detta är ett stort hålrum i berget som ifrån början kan ha skapats av naturen,
men som har vidgats av människor. Det verkar en gång ha varit en ståtlig festhall,
men är sedan länge övergiven. Någon använder den som förråd, och det står rader
av lådor och paket längs väggarna. En stor dörröppning finns i den norra vägen, genom
vilken du ser en backe leda ned i mörkret.",
n_to [; return DownSlope(MountainSlope, DragonHall); ],
d_to [; return DownSlope(MountainSlope, DragonHall); ],
s_to Cave,
;
Object -> mh_box "lådor" with name 'lådor' 'lådorna' 'paket',
short_name_def "lådorna", has scenery concealed pluralname;
Object -> mh_dw "dörröppning" with name 'dörröppning' 'dörröppningen',
short_name_def "dörröppningen" has scenery concealed;
Object MountainSlope "Tunnel"
with
description [;
print "Det här är en tunnel som går brant ned från klipprummet ned i
mörkret. ";
if(self has general)
print "Golvet är täckt med is och frusen lera, vilket gör det svårt att gå^";
else
print "Vatten rinner nedför backen, och golvet är täckt med lera.^";
],
time_left 0,
time_out [;
if(player in self) print "^Isen smälter.^";
give self ~general;
],
each_turn [;
if(self has general) {
if(LeftWarrior in self && RightWarrior in self) {
move LeftWarrior to DragonHall;
move RightWarrior to DragonHall;
if(player in self) {
print "^", (The) LeftWarrior, " och ", (the) RightWarrior,
" halkar på isen. De glider nedför backen. ",
(The) RightWarrior, " griper tag i ditt ben för att få stöd, och
får även dig att falla och glida ned.^";
PlayerTo(DragonHall);
}
}
if(LeftWarrior in self) {
move LeftWarrior to DragonHall;
if(player in self) {
print "^", (The) LeftWarrior, " halkar på isen.
Han griper tag i ditt ben och ni glider båda ned för backen.^";
PlayerTo(DragonHall);
}
}
if(RightWarrior in self) {
move RightWarrior to DragonHall;
if(player in self) {
print "^", (The) RightWarrior, " halkar på isen.
Han griper tag i ditt ben och ni glider båda ned för backen.^";
PlayerTo(DragonHall);
}
}
}
],
u_to [; return UpSlope(MountainHall);],
s_to [; return UpSlope(MountainHall);],
d_to [; return DownSlope(DragonHall);],
n_to [; return DownSlope(DragonHall);],
;
Object -> ms_water "lera"
with
name 'vatten' 'lera' 'leran' 'frusen' 'is' 'mark' 'våt' 'marken'
'vattnet' 'backen' 'frusna' 'backe' 'isen' 'våta',
articles "Den" "den" 0,
short_name_indef [;
if(MountainSlope has general) print "frusen lera";
else print "våt lera";
rtrue;
],
short_name_def [;
if(MountainSlope has general) print "frusna leran";
else print "våta leran";
rtrue;
],
domagic [spell;
if(spell==FreezeSpell) {
if(MountainSlope has general) {
print "Inget händer. Marken är fortfarande frusen.^";
MountainSlope.time_left=10;
} else {
give MountainSlope general;
print "Temperaturen sjunker omedelbart. Vattnet och leran fryser, och du snubblar på isen.
Du faller ett par meter innan du får fotfäste igen.^";
StartTimer(MountainSlope, 10);
}
rtrue;
}
rfalse;
],
has scenery concealed def_article;
Object -> LeftStatue "krigarstaty"
with
name 'krigarstatyn' 'krigarstaty' 'vänstra' 'vänster' 'staty' 'statyn' 'statyerna' 'krigare' 'krigaren',
short_name_def "krigarstatyn",
description "Det är en staty av en storväxt krigare, som bär ett bredsvärd.",
domagic [spell;
if(spell==AnimateSpell) {
print "Statyn vaknar till liv!^";
LeftWarrior.number=10; StartDaemon(LeftWarrior);
ReplaceObj(self, LeftWarrior);
rtrue;
}
rfalse;
],
initial [;
if(TestScope(RightStatue)) {
print "Två statyer vaktar passagen.";
} else {
"En staty står vid vänsterväggen och vaktar passagen.";
}
],
has static;
Object -> RightStatue "barbarstaty"
with
name 'barbarstaty' 'barbarstatyn' 'högra' 'höger' 'staty' 'statyn' 'statyerna' 'barbar' 'barbaren',
short_name_def "barbarstatyn",
description "Det är en staty av en barbar som ser mycket grym ut. Han bär ett svärd i sin högra hand, och
en dolk i den vänstra.",
domagic [spell;
if(spell==AnimateSpell) {
print "Statyn vaknar till liv!^";
RightWarrior.number=10; StartDaemon(RightWarrior);
ReplaceObj(self, RightWarrior);
rtrue;
}
rfalse;
],
initial [;
if(TestScope(LeftStatue)) {
rtrue;
} else {
"En staty står vid högerväggen och vaktar passagen.";
}
],
has static;
[ CommentWarriorAttackingMe warrior;
print "^", (The) warrior, " attackerar dig", (string) random(
" och enbart dina snabba reflexer räddar dig från en tidig död.",
". Svärdet sveper mot dig, men i sista ögonblicket lyckas du hoppa åt sidan.",
" och siktar mot ditt bröst. Du lyckas åla dig förbi honom."
), "^";
];
[ CommentWarriorAttackingWarrior;
print "^", (The) LeftWarrior, " och ", (the) RightWarrior,
" slåss med varandra", (string) random(
". Svärden slår mot varandra, men de är båda fortfarande oskadda.",
", och deras styrka och skicklighet verkar likvärdiga."
), "^";
];
Object LeftWarrior "krigare"
with
number -1,
name 'vänstra' 'vänster' 'staty' 'statyn' 'krigare' 'statyerna' 'krigaren',
short_name_def "krigaren",
description [;
"Statyn är nu levande. En storväxt krigare står nu framför dig och svänger sitt bredsvärd.
Han verkar leta efter ett lämpligt offer.";
],
daemon [;
! ------ Check time out ------
if(self.number>0) --self.number;
if(self.number==0) {
if(TestScope(self))
print (The) self, " förvandlas till en staty igen.^";
ReplaceObj(self, LeftStatue);
return;
}
! ------ Fighting -------
if(parent(self)==parent(RightWarrior)) {
if(TestScope(self)) {
CommentWarriorAttackingWarrior();
}
} else {
if(TestScope(self)) {
CommentWarriorAttackingMe(self);
} else {
move self to Location;
print "^", (The) self, " rusar mot dig med svärdet höjt.^";
}
}
],
has animate;
Object RightWarrior "barbar"
with
name 'högra' 'höger' 'statyn' 'staty' 'barbar' 'statyerna' 'barbaren',
short_name_def "barbaren",
number -1,
description [;
"Statyn är nu levande. En grym barbar står nu framför dig och svänger sitt svärd.
Han verkar leta efter ett lämpligt offer.";
],
daemon [;
! ------ Check time out ------
if(self.number>0) --self.number;
if(self.number==0) {
if(TestScope(self))
print (The) self, " förvandlas till en staty igen.^";
ReplaceObj(self, RightStatue);
return;
}
! ------ Fighting -------
if(parent(self)~=parent(LeftWarrior)) {
if(TestScope(self)) {
CommentWarriorAttackingMe(self);
} else {
move self to Location;
print "^", (The) self, " rusar mot dig med svärdet höjt.^";
}
}
],
has animate;
Object DragonHall "Drakhallen"
with
description [;
#ifdef TARGET_GLULX;
DrawPic(PicDragon);
#endif;
"En stor hall har huggits ut ur berget, men det måste vara länge
sedan några människor vågade sig hit, för hallen är en drakes bostad.
Det stinker svavel överallt, och den enda utgången är uppför backen.";
],
u_to [; return UpSlope(MountainSlope);],
s_to [; return UpSlope(MountainSlope);],
has light;
Object -> Treasure "skatt"
with
name 'hög' 'högen' 'med' 'värdesaker' 'skatten' 'skatt' 'mynt' 'mynten'
'ädelstenar' 'guld' 'guldet',
short_name_def "skatten",
initial "Bakom draken ligger en stor hög med värdesaker.",
description "Det är i sanning en skatt. Mynt, ädelstenar och guld reflekteras i det bleka ljuset.",
before [;
Take, Remove, Transfer:
if(TestScope(Dragon)) {
if(Dragon has general) "Visst har draken ett gott öga till dig, men drakar är inte kända för att frivilligt ge bort av sina skatter.";
"Du vågar inte ens snegla mot skatten så länge draken bevakar den.";
}
"Drakguld för inget gott med sig.";
Examine: rfalse;
default:
if(TestScope(Dragon)) {
if(Dragon has general) "Visst har draken ett gott öga till dig, men drakar är inte kända för att frivilligt ge bort av sina skatter.";
"Du vågar inte ens snegla mot skatten så länge draken bevakar den.";
}
rfalse;
],
has static;
Object -> Dragon "drake"
with
name 'drake' 'draken' 'lindorm' 'orm' 'skadad' 'chockad',
short_name_def "draken",
number -1, ! time out for wounded state
initial [;
if(self.number>0) "Det är en skadad drake här.";
"Det finns en stor drake här, som ser nyfiket på dig.";
],
domagic [spell;
if(self.number<=0)
print_ret (The) self, " stoppar dig med en kort besvärjelse, men ser road ut.";
if(spell==HealSpell && self hasnt general) {
give self general;
print "Blodet slutar rinna och såret i halsen sluter sig igen. Draken är
fortfarande chockad, men du har räddat hennes liv.^";
self.number=6;
score=score+10;
rtrue;
} else {
print_ret (The) self, " stoppar dig med en kort besvärjelse.";
}
],
description [;
if(self.number>0) {
if(self has general)
"Drakens sår är läkta, men hon är fortfarande chockad.";
else
"Drakens blod forsar ut genom såret i halsen, och du ser hur hon blir svagare och svagare.";
}
"Draken är enorm. Till och med en fullt utrustad riddare skulle tänka sig för innan han attackerade.
Hon verkar inte alltför upprörd av din närvaro, utan ser nyfiket på dig.";
],
before [;
Attack: if(self.number>0)
"Även om draken är skadad är hon stark nog att bita av dig huvudet innan du hunnit blinka.";
"Det är en drake vi talar om. Det kanske går med magi, men med våld... glöm det!";
],
life [;
Ask, Answer, Order:
if(self.number>0)
if(self hasnt general)
"~Hjälp mig! Ha förbarmande, jag dör. Jag känner hur mitt liv rinner bort,~
viskar draken.";
else
if(second=='magi' && (KillSpell in SpellBook)==false) {
print "Draken ser förvånad ut. Sedan säger hon ~\
Magi? Ja, jag förstår. Det var din besvärjelse som räddade mig.~ Hon
höjer huvudet och ser dig i ögonen.
~Trollkarl, du räddade mitt liv. Jag ska ge dig den
dyraste kunskap jag äger.~ Din besvärjelsebok svävar
plötsligt framför dig och öppnar sig själv. En ny besvärjelse
skrivs in på ett tomt blad.^";
move KillSpell to SpellBook;
score=score+10;
rtrue;
} else {
"Draken muttrar något i stil med ~En människa som räddar mitt liv...
hjälper en drake... aldrig hört talas om...~. Den verkar fortfarande chockad.";
}
else
"Draken ser på dig men säger inget.";
default: rfalse;
],
daemon [l r p;
! --------- Dragon wounded timer --------------
if(self.number>0) {
--self.number;
if(self.number==0) {
if(self has general) {
if(TestScope(self)) {
print (The) self, " tar sig samman och ser lika stark
och lugn ut som innan attacken.^";
give self ~general;
self.number=-1;
}
} else {
if(TestScope(self))
print "^", (The) self, " lyfter huvudet och ser rasande ut. Hon
försöker bränna dig, men siktar illa och missar. Utmattad
faller hon ned igen och dör.^";
ReplaceObj(self, DeadDragon);
rtrue;
}
} else if(TestScope(self)) {
if(self has general) {
if(KillSpell notin Spellbook) {
print "^", (string) random(
"Draken ser fortfarande chockad ut.",
"Draken verkar repa sig.",
"Draken ser mer samlad ut."), "^";
}
} else {
print "^", (string) random(
"Drakens andedräkt blir alltmer oregelbunden.",
"Draken ser svagare ut.",
"Draken är nästan död."), "^";
}
}
}
! ------- Kill the statues ------------
l=LeftWarrior in parent(self); r=RightWarrior in parent(self);
p=player in parent(self);
if(l) RemoveObj(LeftWarrior);
if(r) RemoveObj(RightWarrior);
if(l==true && r==true) self.number=5; ! The dragon is wounded
if(l==true && r==true && p==true) {
print "^", (The) LeftWarrior, " och ", (the) RightWarrior,
" ser draken och rusar fram med dragna vapen. Draken
bränner snabbt upp ", (the) LeftWarrior, " men hinner inte
döda ", (the) RightWarrior, " förrän han lyckats hugga sitt
svärd djupt in i hennes hals. Utom sig av ilska och smärta
kremerar draken kropparna.^";
} else if((l==true || r==true) && p==true) {
if(l) print "^", (The) LeftWarrior;
else print "^", (The) RightWarrior;
print " ser draken och rusar emot henne med vapnen i högsta hugg. Draken
bränner kvickt ihjäl honom och kremerar kroppen.";
}
if((l==true || r==true) && p==false)
print "^Du hör skrik och vapenskrammel i närheten. Sedan kommer en varm
vindpust och skriken tystnar plötsligt.^";
],
has animate female;
Object DeadDragon "drake"
with
name 'drake' 'draken' 'drakens' 'lindorm' 'orm' 'kropp' 'död' 'döda',
short_name_def "draken",
initial "På golvet ligger drakens döda kropp.",
description "Drakens enorma kropp ligger tyst och kall på hallens golv.",
domagic [spell;
switch(spell) {
ResurrectSpell:
ReplaceObj(self, Dragon);
give Dragon general;
Dragon.number=6;
StartDaemon(Dragon);
"Drakens kropp darrar till. Det gapande såret i hennes hals drar sig samman, och hon börjar
andas igen. Hon sätter sig plötsligt upp men faller tungt tillbaka. Hon verkar fortfarande vara
chockad.";
HealSpell:
"Hon är död. Den helande besvärjelsen är verkningslös.";
default: rfalse;
};
],
has static female;
Object TeleportRoom "På stäppen"
with
description [;
#ifdef TARGET_GLULX;
DrawPic(PicTeleport);
#endif;
"Du står på en grässtäpp som sträcker sig mot horisonten. Av någon obegriplig anledning är du
omgiven av fyra dörröppningar, en i varje väderstreck.";
],
n_to [;
print "Ett gult moln omger dig, och när det lättar befinner du dig i...^";
PlayerTo(Forest);
rtrue;
],
s_to [;
print "Ett gult moln omger dig, och när det lättar befinner du dig på...^";
PlayerTo(Glen);
rtrue;
],
e_to [;
print "Ett gult moln omger dig, och när det lättar befinner du dig på...^";
PlayerTo(VillageRoad);
rtrue;
],
w_to [;
print "Ett gult moln omger dig, och när det lättar befinner du dig...^";
PlayerTo(ChurchYard);
rtrue;
],
has light;
Object -> TeleportDoor "dörrar"
with
name 'dörr' 'dörrar' 'dörrarna' 'dörröppning' 'dörröppningarna',
short_name_def "dörrarna",
description "Dörrarna är identiska.",
has scenery pluralname;
Object ChurchYard "Framför en kyrka"
with
name 'stig' 'havet' 'skogen' 'luften',
description [;
#ifdef TARGET_GLULX;
DrawPic(PicChurch);
#endif;
"Du står på en smal stig, som leder ned mot havet i söder, och in i skogen i norr. Luften är
salt och frisk. Öster om dig står ett stort och mäktigt tempel.";
],
n_to "Vägen slingrar sig vidare in i skogen, dit du inte har något ärende.",
s_to Beach,
e_to Church,
has light;
Object -> DummyChurch