!% -~S !% $OMIT_UNUSED_ROUTINES=1 !% $ZCODE_LESS_DICT_DATA=1 ! This source code is provided without restrictions to encourage ! learning and serve as a basis for creating new text adventure games. ! ! Designed and written by Johan Berntsson 18-25 February 2023 ! ! VERSION HISTORY ! RELEASE 1: 25 February 2023 ! RELEASE 2: 13 March 2023 ! - fixed insert bug in the Ravine ! - added pluralname for Magpies and Ruins ! - added update_moved after moving items to player ! - added UUID ! ! The very first lines of the main source code file for a game can ! contain compiler options, like the lines above. -~S disables ! strict error checking. This is otherwise used in z5 and z8 games by ! default. While useful for debugging, it adds ~10 KB to the story file ! size and it makes the game slower. ! $OMIT_UNUSED_ROUTINES=1 makes the compiler remove all routines which ! aren't used. This can save some space. ! $ZCODE_LESS_DICT_DATA=1 removes an empty data byte for every dictionary word. Constant Story "The Fantasy Dimension"; Constant Headline "^A PunyJam 3 game by Johan Berntsson (type ~help~ for more info)^"; Release 2; Serial "230313"; Array UUID_ARRAY string "UUID://7C7BFACE-534B-4D8F-B99D-A035C06F4B1C//"; #Ifdef UUID_ARRAY;#Endif; ! Uncomment ONE of the two following lines, to show either time or score/turns ! Leaving both commented out makes the library bigger. !Constant STATUSLINE_TIME; Statusline time; Constant STATUSLINE_SCORE; Statusline score; ! Comment out to keep track of score ! The value is what will be shown as the score on statusline in z3 Constant NO_SCORE = 0; ! Customize the statusline in z5+ (will have no effect in z3) #IfV5; Constant OPTIONAL_SL_NO_SCORE; Constant OPTIONAL_SL_NO_MOVES; #Endif; Constant CUSTOM_PLAYER_OBJECT = protagonist; Constant OPTIONAL_NO_DARKNESS; Constant OPTIONAL_EXTENDED_METAVERBS; Constant OPTIONAL_EXTENDED_VERBSET; Constant OPTIONAL_FULL_DIRECTIONS; ! Define any library constants you need here, like MAX_SCORE, AMUSING_PROVIDED, ! MAX_CARRIED, SACK_OBJECT, etc. Constant INITIAL_LOCATION_VALUE = Airlock; Include "globals.h"; ! Define your attributes, common properties and global variables here, if any Object protagonist "you" with name 'me' 'myself' 'self', short_name "yourself", description "As you look down at yourself, you realize that you are no longer wearing the clothes you were wearing before. Instead, you find yourself wearing strange and unfamiliar garments that you don't recognize.", react_before [; ClimbNothing: if(location == Hills) <>; if(location == TreeTop) <>; if(location == MountainPass) <>; ClimbUp: if(location == Hills) <>; if(location == TreeTop) "You realize that you are already as high up as you can get. The branches above you are too thin to support your weight."; ClimbDown: if(location == MountainPass) <>; if(location == TreeTop) <>; Smell: switch(location) { LushForest, DenseForest: "The air is filled with the rich scent of earth and vegetation."; River: "The troll emits a rather unpleasant odor."; Village: "The smell of smoke and ash is overpowering, and you can't help but feel a sense of despair as you see the ruins of the once-thriving village."; Dungeon: "The air is thick and heavy, with an acrid scent that makes your nose itch."; } rfalse; Listen: switch(location) { LushForest: "The rustling of leaves and the creaking of branches can be heard as the gentle breeze blows through the trees."; DenseForest: "You hear the distant sound of water, likely a nearby river or stream, and the occasional snap of twigs as small animals scurry across the forest floor."; Village: "The silence is almost palpable, adding to the sense of desolation and loss."; River: "You hear the sound of rushing water as it flows downstream, and the occasional splash or gurgle as the water encounters an obstacle."; Dungeon: "You hear the sound of dripping water echoing throughout the dungeon, and the occasional creaking, as if the stones are shifting slightly"; } rfalse; default: rfalse; ], add_to_scope Garments, has concealed animate proper transparent; Object Garments "garments" with name 'garment' 'garments' 'strange', before [; Examine: "The cut and style of the garments are unfamiliar to you, but they seem practical and functional."; default: "There is no need to worry about your clothing."; ], has scenery; ! Define the entry point routines you need here, like Amusing, DarkToDark etc. [ SceneryReply word1 word2 routine; if(word2 == 'creatures') "Try as you might, you can't seem to get close enough to interact with any of the creatures."; Climb: if(routine == ParseNameTree) "The trunk is too smooth and slippery to get a good grip."; rfalse; default: word1 = word2; ! getting rid of a compiler warning rfalse; ]; [ ParseNameTree; if(NextWord() == 'tree' or 'trees' or 'trunk') return 1; rfalse; ]; [ ParseNameOutside _w _n; ! the outside view as seen from the airlock _w = NextWord(); if(_w == 'rolling' or 'dense' or 'towering') { _n++; _w = NextWord(); } if(_w == 'hills' or 'forests' or 'mountains' or 'flowers' or 'flower' or 'grass') return _n + 1; rfalse; ]; [ ParseNameBushes _w _n; _w = NextWord(); if(_w == 'few') { _n++; _w = NextWord(); } if(_w == 'small') { _n++; _w = NextWord(); } if(_w == 'tree' or 'trees' or 'bush' or 'bushes') return _n + 1; rfalse; ]; [ ParseNameRocksBranches; if(NextWord() == 'branch' or 'branches' or 'rock' or 'rocks') return 1; rfalse; ]; ! Uncomment to add PunyLib extensions Include "ext_menu.h"; !Include "ext_flags.h"; !Include "ext_talk_menu.h"; ! Note: Also include ext_flags.h to allow use of flags !Include "ext_quote_box.h"; Include "ext_cheap_scenery.h"; ! Setup custom library messages Include "puny.h"; ! Uncomment to add PunyLib extensions !Include "ext_waittime.h"; [ HelpItems; print "There is information provided on the following:^^"; print " Instructions^"; print " About this game^"; print " Game credits^"; ]; [ HelpMenu; ! Note that we set item_width to half the length of each name, since we have ! defined EXT_MENU_STDLIB_MODE to make ext_menu fully compatible with the ! standard library DoMenu implementation. switch(menu_item) { 0: item_width=10; item_name="Help and Information"; return 3; 1: item_width=6; item_name="Instructions"; 2: item_width=6; item_name="Game credits"; 3: item_width=5; item_name="Walkthough"; } ]; [ HelpInfo; switch(menu_item) { 1: "Text adventure games are played by typing in commands using natural language that describe the player's actions in the game world. These commands might include movements, such as ~go north~ or ~climb tree,~ as well as interactions with objects and characters, such as ~take sword~ or ~talk to wizard.~ The game responds to these commands with descriptions of the game world, characters, and objects, and presents the player with choices or challenges to overcome.^^ Explore the game world and interact with its inhabitants. It's important to pay attention to the game's responses and descriptions, as these will provide clues and hints for how to progress through the game.^^ Don't forget to examine everything, and to draw a map."; 2: "This game was written by Johan Berntsson in 2023 for PunyJam #3.^^ I would like to thank my test players who have made numerous contributions to the game: Fredrik Ramsberg, Garry Francis, and Fos1."; 3: "It is much more rewarding to solve the game without help, but if you are completely stuck you can refer to the walkthrough below:^^ out, n, n, n, s, e, search debris, w, n, give ring to troll, n, n, e, push tree, e, u, x nest, take key, d, n, n, unlock gate with key, n, d, kill dragon with sword, kill dragon with sword, take treasure, u, s, s, w, s, s, give treasure to troll, x shimmering, enter shimmering"; } ]; [ HelpSub; DoMenu(HelpItems, HelpMenu, HelpInfo); ]; Verb 'help' 'hint' 'info' 'credits' * -> Help; Verb 'xyzzy' * -> Magic; [ MagicSub; "You recall hearing rumors of a powerful magic spell, and with a deep breath, you chant the mystical word ~xyzzy~ with all your might. However, as you finish your incantation, nothing seems to happen, and you feel a little foolish for believing that a simple phrase could hold such power."; ]; Extend 'dig' first * -> DigDefault; [ DigDefaultSub; <>; ]; Extend 'climb' first * -> ClimbNothing * 'up' -> ClimbUp * 'down' -> ClimbDown; [ ClimbNothingSub; "You need to tell me what you want to climb."; ]; [ ClimbUpSub; "There is no obvious way to climb up from here."; ]; [ ClimbDownSub; "There is no obvious way to climb down from here."; ]; Object Airlock "Airlock" with name 'flower' 'flowers' 'grass', description "The airlock is a small, metallic chamber, with smooth walls that seem to be made of some sort of advanced alloy. The only source of light is a small panel on the far side of the room, which is displaying information about the airlock and its purpose.^^ As you look around, you notice that there are two doors leading out of the chamber. The inner door, closest to you, is closed, and appears to lead back to your home dimension. It's made of the same material as the walls. The outer door, which is on the far side of the chamber, is open and reveals a breathtaking view of the world beyond. You can see rolling hills, dense forests, and towering mountains in the distance, and the air around the doorway is filled with the scent of flowers.", out_to [; print "You step through the open doorway, leaving the airlock behind.^^"; return LushForest; ], cheap_scenery CS_PARSE_NAME ParseNameOutside "The lush landscape beckon you forward, but you know that you must first pass through the door to reach it." 'chamber' 'airlock' "It is a large metal structure, resembling a capsule or a pod." 'wall' 'walls' "The walls in the airlock are smooth and metallic, and when you run your hand over it, you feel a cool, almost electric sensation." 'alloy' 'metal' "The walls of the airlock are constructed from an unfamiliar alloy that you are unable to identify." 'screen' 'panel' "The small panel on the wall has a new message written on it. The letters are ancient and worn, but you can just make out the words:^^ ~The door is open to the land of high fantasy. Go forth and enjoy the adventure!~" 'words' 'message' "The message appears on the panel.", before [; Smell: "There is a fresh, invigorating scent of flowers and grass."; ], cant_go "The panel beeps and a message appears:^^ ~The only way out of the airlock is through the open door.~"; Object -> OuterDoor "outer door" with name 'outer' 'door' 'doors', description "The open door in the airlock is rectangular in shape and made of a metallic material, with a slight bluish tint. It appears to be quite heavy, with a thick frame and intricate patterns etched into it. The door is fully open, revealing a bright light shining from the other side, creating a sense of excitement and anticipation.", before [; Close: "You try to push the open door in the airlock, but it doesn't budge. It seems that the door is designed to stay open, and there is no way to manually close it."; Enter: <>; ], has static concealed openable open; Object -> InnerDoor "inner door" with name 'inner' 'door' 'doors', description "The door appears to be firmly shut and sealed, preventing anyone from entering or leaving through it. The surface of the door is smooth and cold to the touch, and it seems to be made of a material that is resistant to damage and wear. A faint humming sound can be heard emanating from the door, indicating that there may be some kind of energy field or force at work here.", before [; Enter, Open: "You try to open the door, but it won't budge. The display on the panel beeps and a message appears on the screen.^^ ~I'm sorry, but you cannot return to your own dimension until you have explored the other dimension. This facility is designed for interdimensional travel, and we cannot allow travelers to return until they have completed their journey.~^^ You feel a twinge of frustration at the idea of being trapped in this new world, but you also can't deny the thrill of adventure that courses through your veins."; ], has static concealed openable ~open; Object LushForest "Lush Forest" with name 'magic', description [; print "You find yourself in a lush forest, with towering trees and a canopy of leaves overhead. The air is thick with the scent of flowers and magic, and the ground beneath your feet is soft and spongy. Strange creatures roam the landscape, and sunlight filters down through the trees in dappled patterns, casting a warm glow on everything it touches. A path leads north.^"; if(self hasnt visited) { print "^You turn around to look back through the door to the airlock, but it is already fading away behind you. You're trapped in this new world, at least for the time being.^"; } ], cant_go "There is a path leading north into the woods.", cheap_scenery 'leaves' 'canopy' "The canopy overhead filters the sunlight, creating dappled patterns on the ground below." 'flower' 'flowers' "Some flowers are small and delicate, with pale white petals that seem almost translucent in the light filtering through the leaves. Others are bright and bold, with vibrant reds, yellows, and oranges that catch your eye from a distance." 'strange' 'creatures' "As you wander through the forest, you catch glimpses of various creatures darting through the underbrush. Despite your curiosity, the creatures seem skittish and shy away from your approach." CS_ADD_LIST LushForest (path_scenery) CS_ADD_LIST LushForest (forest_scenery), forest_scenery 'bird' 'birds' "The birds' chirps and trills fill the air, making you feel as though you're in the heart of nature." CS_NO_ADJ 'forest' "The forest is dense with tall, slender trees that reach up towards the sky." CS_PARSE_NAME ParseNameTree "The trunks of the trees are thick, with smooth bark that's free of knots and gnarls.", path_scenery 'path' 'paths' "The path is narrow and winding, surrounded by tall trees and lush vegetation. It seems to lead deeper into the forest, inviting the curious to explore its mysteries.", n_to DenseForest; Object DenseForest "Dense Forest" with description "You are standing at the edge of a dense forest. The trees around you are tall and ancient, with gnarled roots that stretch out across the forest floor. The air is thick with the scent of damp earth and decaying plant matter, and the sound of rustling leaves and chirping birds fills the air. The main path goes from north to south, but another path branches off to the east.", cheap_scenery CS_PARSE_NAME ParseNameRocksBranches "Rocks and fallen branches litter the ground." 'path' 'paths' "The paths are twisting and turning in various directions." CS_ADD_LIST LushForest (forest_scenery), cant_go "There are paths leading north, south and east.", n_to River, s_to LushForest, e_to Village; Object -> ForestFloor "forest floor" with parse_name [_w _n; _w = NextWord(); if(_w == 'forest') { _n++; _w = NextWord(); } if(_w == 'floor' or 'ground' or 'root' or 'roots') return _n + 1; rfalse; ], before [; Examine: "The ground is uneven, with roots, fallen branches, and rocks creating obstacles in some places."; Search: "You search the forest floor in the dense forest, carefully scanning the ground for anything that might be of interest. You sift through fallen leaves, dirt, and rocks, but nothing catches your eye."; default: "No need to concern yourself with that."; ], has scenery; Object Village "Village" with description "This village lies in ruins, a scene of desolation and destruction. The air is thick with the smell of smoke and the buildings are in ruins, with rubble and debris scattered everywhere. A path leads west into a forest.^^ You take in the scope of the devastation, feeling a sense of awe and horror at the power of the disaster that caused this utter ruination. You can see that some of the buildings have been burned, while others have been crushed and smashed.", cheap_scenery CS_ADD_LIST LushForest (path_scenery), cant_go "The only exit is the path leading westwards.", w_to DenseForest; Object -> Ruins "ruins" with parse_name [_w _n; _w = NextWord(); if(_w == 'crushed' or 'smashed' or 'burned') { _n++; _w = NextWord(); } if(_w == 'ruins' or 'buildings' or 'building' or 'village' or 'destruction' or 'smoke') return _n + 1; rfalse; ], description "You take a closer look at the ruins of the small village, feeling a sense of sadness and loss at the destruction around you. You can see that the buildings have been completely destroyed, with rubble and debris scattered everywhere.", before [; Search: <>; ], has pluralname scenery; Object -> Rubble "rubble" with name 'rubble' 'debris', before [; Search, Examine: if(Ring in self) { move Ring to player; update_moved = true; "You start searching through the rubble, looking for any signs of life or any objects that might be useful to you. It takes some time, but eventually you come across a small ring, lying in the midst of the debris, which you pick up."; } "You keep searching through the rubble, looking for any signs of life or any objects that might be useful to you, but find nothing else of interest."; ], has scenery; Object -> -> Ring "ring" with name 'ring' 'gold' 'gemstone', description "You examine the ring, feeling a sense of wonder and curiosity. It's a small, delicate piece of jewelry, made of gold and set with a glittering gemstone.", before [; Wear: "You find the ring slipping off your finger as it is too big."; ], ; Object River "River" with description "You find yourself standing at the edge of a wide river. The water is clear and cold, and you can see fish swimming just beneath the surface. There is a bridge here, which is made of rough-hewn wood. It leads north over the river. There is also a path leading south into dense forests.", cheap_scenery CS_NO_ADJ 'fish' "You observe some fish swimming gracefully in the water, but you realize that you won't be able to catch them without any equipment." 'dense' 'forest' "As you look towards the south from the riverbank, you notice that there is a dense forest stretching out as far as the eye can see." CS_ADD_LIST LushForest (path_scenery), before [; Swim: <>; ], cant_go "There is a path leading south, and the bridge across the river to the north", n_to [; if(Ring notin Troll) { "As you approach the bridge, you see the troll standing guard, his massive arms crossed over his chest.^^ ~Halt, traveler,~ he growls. ~You shall not pass until you prove that you have found my lost ring.~^^ ~What ring?~ you ask, confused.^^ ~My ring, fool,~ the troll snaps. ~The one I lost when the dragon attacked. I must have dropped it somewhere on this side of the river. Find it and bring it to me, or you shall not pass.~"; } if(Sword in Troll) { move Sword to player; update_moved = true; print "As you cross the bridge, you feel a sense of relief that you were able to find the troll's ring and gain his trust. But just as you reach the other side, a booming voice calls out to you.^^ ~Halt, traveler,~ the troll says. ~You seem brave. Would you be willing to take up my sword and slay the dragon that plagues this land?~^^ ~Why do you want me to kill the dragon?~ you ask, wary of his true motives.^^ ~I may be strong, but I'm no match for a dragon,~ the troll explains. ~But I can see that you are brave and skilled, and I believe that you can defeat him. Take my sword, and use it to strike the killing blow. Bring back the treasure he stole, and I shall be forever in your debt.~^^ The troll hands you a massive sword, its hilt adorned with jewels and its blade glinting in the sun, and wishes you good luck.^^"; } return RiverBank; ], s_to DenseForest; Object -> Troll "troll" with name 'troll', initial [; print "Standing on the bridge is a massive troll, covered in shaggy hair and sporting a pair of large tusks.^"; if(Troll hasnt general) { give troll general; print "^The troll glares at you with beady eyes and speaks in a gravelly voice, stopping you dead in your tracks.^^ ~What are you doing here, human?~ the troll asks.^^ ~I'm just exploring,~ you reply. ~What about you?~^^ The troll grunts. ~I'm waiting for a challenger. Someone to take on the dragon that's been terrorizing our village. But no one's been brave enough yet.~^"; } rtrue; ], description "The troll is a large, menacing creature with greenish-gray skin and bulging muscles. Its eyes are small and yellow, and its nose is broad and flattened. Its teeth are sharp and jagged, and its breath smells of decay. It is carrying a large club, which it swings menacingly as it stands guard on the bridge.", before [; Smell: "You can't help but notice a strong and unpleasant odor emanating from the troll, like a mixture of sweat, dirt, and some unidentifiable musk."; ], react_before [; Go: if(TreasureSack in player) { "As you attempt to pass the troll without giving him the treasure, he blocks your path and protests. ~Hold on there, adventurer,~ he says with a deep growl. ~You can't just waltz past me without offering me some of that treasure you're carrying. It's the toll for crossing this bridge, and I won't let you through without it.~"; } ], react_after [; Go: if(TreasureSack in player && TreasureSack hasnt general) { give TreasureSack general; "With the treasure in hand, you walk up to the troll, who greets you with a nod of respect.^^ ~I see you've returned with the dragon's hoard,~ he says, eyeing the loot with interest.^^ ~It wasn't just me,~ you reply. ~I couldn't have done it without your help.~^^ The troll grins. ~You're a gracious hero, human. I appreciate your humility.~"; } ], life [ c w1 w2; Attack: "The troll may be gruff and stern, but he has been guarding the bridge and ensuring your safety. You realize that attacking the troll would be both dishonorable and unwise, and so you abandon the idea."; ThrowAt: if(noun == Ring) <>; Order: "The troll seems unresponsive to the your request."; Show, Give: if(noun == Sword) { "As you approach the troll, holding out the sword, he shakes his head and says, ~No, that's yours now. Keep it safe, it may come in handy.~"; } if(noun == Ring) { move Ring to Troll; "You approach the troll, holding out the ring. ~Is this what you're looking for?~ you ask.^^ The troll snatches the ring from your hand and examines it closely. ~Yes, this is it,~ he grunts. ~You have proven yourself worthy. You may pass.~"; } if(noun == TreasureSack) { remove TreasureSack; move Shimmering to location; "You hand the treasure over to the troll. His eyes widen in amazement as he sees the piles of gold, jewels, and weapons.^^ ~This is more than enough to rebuild our village and live in comfort for years to come,~ he says. ~I am forever grateful to you, hero.~^^ You feel a sense of satisfaction at having helped the troll land the village, but you also know that it's time to return to your own world. As you turn to leave, a strange shimmering in the air catches your eye."; } "As you approach the troll and offer ", (the) noun, ", he looks at it disinterestedly and shakes his head. ~I have no need for ", (a) noun, ",~ he says gruffly."; Ask, Tell, Answer: w1=0; w2=0; wn=consult_from; c=consult_words; if(c>0) w1=NextWord(); if(w1=='the') { c=c-1; if(c>0) w1=NextWord(); } if(c>1) w2=NextWord(); if(c>2) "What you cannot say in few words, probably isn't worth saying."; if(w1 == 'dragon' or 'village') { "When you ask the troll about the dragon, he becomes angry and tells you that the dragon is a foul beast who destroyed his village. He says he would do anything to get revenge, but he knows that he is no match for the dragon on his own. He warns you to be careful if you encounter the dragon, as it is powerful and cunning."; } if(w1 == 'bridge') { "The troll glares at you with a stern expression, clearly unhappy about the interruption.^^ ~What do you want to know about the bridge?~ he growls. ~I'm here to guard it, not to answer foolish questions.~"; } if(w1=='river' or 'water') { "The troll responds, ~That river is the lifeblood of this land. It's the only way to cross to the other side, and the only way to get to the dragon. But beware, it's not safe to cross alone. There are creatures in those waters that can pull you under and drown you before you even know what's happened."; } if(w1=='ring') { if(Ring in player) "The troll looks at the ring intently, and then turns his gaze to you. ~That's mine,~ he growls, ~give it here.~"; "The troll responds, ~My ring? It is just a trinket I picked up on my travels. It has no value, but it's special to me.~"; } if(w1=='sword') { "The troll explains that he gave you the sword to aid you in your quest to defeat the dragon, and that the sword is a powerful weapon. It has helped many warriors to defeat powerful enemies in the past."; } "The troll looks at you with a scowl and gruffly responds, ~I don't know nothing about that. I'm just here to guard this bridge.~"; ], add_to_scope Club, has animate; Object -> -> Sword "sword" with name 'sword', description "The sword is a long, gleaming weapon with a sharp, pointed blade and a handle wrapped in leather. It appears to be made of a durable metal, possibly steel or another alloy, and is finely crafted with intricate designs etched into the blade and hilt. It has a weighty feel, and the handle fits comfortably in the hand, suggesting that it was designed for a skilled warrior."; Object Club "club" with name 'club', before [; Examine: "The troll's large club is a fearsome weapon. It's made of rough-hewn wood and is covered with deep gouges and scratches, as if it has been used to battle countless foes."; Take: "~No touch club!~ the troll grunts, making it clear that he won't let you take it."; default: "The club belongs to the troll."; ]; Object Shimmering "shimmering" with name 'shimmering' 'light' 'airlock', initial "A shimmering light is floating in the air, just within reach for you.", description "You approach the shimmering, and as you get closer, you see that it's an airlock, just like the one that brought you to this world.", before [; Take: "It is just a shimmering light, floating in the air."; Enter, Go: deadflag = GS_WIN; "You step through the airlock, feeling a sense of sadness at leaving this world and its adventures behind. But you also know that you have other challenges and adventures waiting for you in your own world.^^ As you step through the airlock, you feel a rush of wind and a blinding flash of light. When your vision clears, you find yourself back in your own world, standing in the same spot where you first entered the airlock.^^ You smile, feeling a sense of accomplishment and adventure, as you reflect on your journey to the world of high fantasy. The end of this game may mark the end of this adventure, but you know that there are many more waiting for you in the future.^^ The End"; ], has static; Object Bridge "brige" with name 'bridge' 'wood' 'wooden', description "The bridge is a long and narrow structure made of wooden planks that span across a wide and rushing river. The water below is deep and dark, and the sound of it crashing against the rocks can be heard from afar. On either side of the bridge, the land slopes down steeply to the river banks.", found_in River RiverBank, before [; Receive: "The troll says, ~No dumping allowed on my bridge! Keep it clean or face the consequences!~"; Enter: if(location == River) { <>; } else { <>; } ], has scenery supporter; Object RiverBank "Riverbank" with description "This is a strip of land that runs alongside the river, with pebbles and rocks scattered along the shore. Trees grow on the forested slope that rises up from the riverbank and form a thick and dark forest. The air is cool and fresh, and the trees are tall and imposing. The foliage is so thick that it's difficult to see very far into the forest, but after a few moments of searching, you spot a small path leading north, disappearing into the shadows cast by the canopy above.", cheap_scenery 'pebbles' 'rocks' "The riverbank is littered with pebbles and rocks of various sizes." 'foliage' 'canopy' "The forest is covered in a thick foliage of vibrant green leaves, forming a lush and vibrant canopy that shades the ground below." 'trees' 'tree' "North of the river, a dense forest of towering trees creates a shadowy landscape." 'shore' 'riverbank' "The shore of the riverbank is a narrow strip of land between the water and the forest." 'dense' 'forest' "Just head north if you want to explore the forest." CS_ADD_LIST LushForest (path_scenery), before [; Swim: <>; ], cant_go "There is a path leading north, and the bridge across the river to the south.", n_to [; print "As you journey deeper into the woods, the trees begin to thin out, and you see the mountains rising up ahead of you. The path ahead leads to a steep incline, and you begin to make your way up. As you ascend, you come to a narrow mountain pass that stretches across a deep ravine. The pass looks treacherous, and you're not sure you can cross it safely.^^"; return MountainPass; ], s_to River; Object RiverWater "River" with name 'river' 'water' 'flood', description [; print "The river is a fast-flowing body of water that winds through the landscape, creating a soothing sound that can be heard from a distance. The water is clear and cold, with a rocky bottom visible in some places. The bridge that spans the river is made of wood, and it looks sturdy enough to support a lot of weight"; if(location == River) print ". A troll stands guard on the bridge, making sure that no one tries to cross without permission"; "."; ], found_in River RiverBank, before [; Receive: "As you lift your arm to toss ", (the) noun, " into the flowing river, you hesitate. What if you needed it later? It's better to hold onto it for now, just in case."; Take, Drink: "As you bend down to drink some water from the river, you can feel the coolness of the water as you dip your hand into it. The water is refreshing, and you feel invigorated as you take a few sips, quenching your thirst."; Enter: "As you approach the river, you notice that it's wider and deeper than you originally thought. You keep pushing forward, but as you approach the middle of the river, the water level suddenly rises, and the current becomes even more powerful. You feel your feet being swept out from under you, and before you know it, you're tumbling headlong down the river. You struggle to keep your head above water, but the current drags you along mercilessly. You try to grab onto a nearby branch or rock, but it's no use.^^ Finally, after what feels like an eternity, you manage to grab hold of a tree branch that's jutting out over the water. Gasping for air, you pull yourself up onto the bank and collapse, exhausted and drenched. You realize that trying to swim across the river was a mistake, and you'll need to find another way to get to your destination."; ], has scenery container open; Object MountainPass "Ravine" with name 'cliff' 'cliffs' 'boulders', description [; print "This area is rocky and uneven, with a few boulders scattered here and there. There is a faint trail that leads off to the south, disappearing into the distance, but all other directions are blocked by craggy cliffs that are impossible to scale. However, there seems to be another road leading down to the east, "; if(TreeBridge in self) { "across the makeshift bridge that stretches over the deep ravine."; } "but that is beyond the deep ravine that cuts across your path, blocking your way."; ], cheap_scenery CS_NO_ADJ 'road' "The road leading east abruptly ends at the edge of a deep ravine." 'path' 'trail' "The path descends gradually to the south, and you can see that it stretches out for quite a distance, disappearing into a thick forest in the distance." 'moss' 'vines' "The ravine is filled with lush greenery, with moss and vines covering the walls and boulders.", cant_go "There is a path leading south, and the ravine to the east.", before [; Jump: if(DeadTree in location) <>; ], e_to [; if(DeadTree in location) "You approach the edge of the ravine and take a look across. It's a deep and narrow canyon, with steep walls on both sides. You take a deep breath and try to jump, but you quickly realize that the distance is too great, and you won't be able to make it to the other side. You step back from the edge, feeling frustrated and disappointed."; print "You carefully walk across the makeshift bridge, taking care not to slip or fall. The trunk is thick and sturdy, and you feel confident that it will hold your weight. As you make your way across, you can feel the bark scraping against your shoes and the wind whistling in your ears.^^ On the other side of the ravine, you see that the terrain changes abruptly. The rocky cliffs and boulders give way to a gentle, rolling landscape of hills and grassy meadows. A narrow path leads down from the bridge and into the hilly terrain.^^"; return Hills; ], d_to [; <>; ], s_to [; print "As you retrace your steps from the mountain pass, you follow the path that leads down the sloping terrain. The path twists and turns, occasionally winding through a patch of trees or around a boulder. The air is filled with the sounds of chirping birds and rustling leaves.^^"; return RiverBank; ]; Object -> DeadTree "tree" with name 'tree' 'dead' 'old', initial "Next to the ravine, you see an old dead tree, its branches bare and stripped of leaves. It looks like it's been there for a long time, weathered and worn by the elements.", description "The trunk is thick and gnarled, with deep crevices and cracks running down its surface. The wood is rough to the touch, and you can feel the texture of the bark under your fingers.", before [; Take: "The tree seems to be firmly rooted in the ground, and any attempt to move it is met with resistance."; Climb: "You approach the dead tree, its bark rough and jagged, and attempt to climb it. As you reach for the first branch, you notice how brittle it is, and it snaps in your hand. Undeterred, you continue to try to climb, but each time you grab hold of a branch, it crumbles away, leaving you no foothold to support your weight. After several attempts, you realize that the tree is too decayed to climb, and you step back, disappointed."; Attack: "As you try to break the dead tree, you quickly realize that it is far too sturdy to break with your bare hands or with any tools you have on you. Despite your best efforts, the tree remains firmly in place, a solemn reminder of the passage of time and the harshness of nature. You step back, feeling a twinge of frustration at your lack of progress, and decide to look for another way to proceed."; Push, PushDir: remove DeadTree; move TreeBridge to MountainPass; "With no other option, you push against the tree with all your might, feeling the strain in your muscles as you try to make it budge. After a few tense moments, the tree starts to sway, and then falls over the ravine with a resounding crash."; ], has static; Object -> Ravine "ravine" with name 'ravine', description "The ravine is a deep and narrow gorge, with sides that are covered in a thick layer of moss and vines, making it difficult to climb down or up. The bottom of the ravine is shrouded in shadow and looks to be at least a hundred feet below.", before [; Take: "The ravine is a natural obstacle and cannot be ~taken~ in the traditional sense."; Enter, Climb: "The sides of the ravine are steep and slippery, and there are no handholds or footholds that could be used to climb down."; Receive: "You take a moment to consider throwing something down the ravine to see how deep it is, but ultimately decide against it. You realize that throwing anything down the ravine would be pointless and potentially dangerous."; ], has scenery; Object TreeBridge "tree bridge" with name 'tree' 'bridge', description "With the tree now forming a makeshift bridge over the ravine, you walk up to it and take a closer look. You notice that the tree is quite sturdy, despite its age and decay.", before [; Enter: <>; Push, PushDir, Take, Remove: "You don't want to risk destroying your only means to cross the ravine."; ], has static concealed; Object Hills "Hills" with description "The hilly landscape stretches out before you, green and serene. You can see tall grasses swaying in the breeze and a few wildflowers blooming on the ground. Far up to the north you spy a large building, perched on a rock. From this distance, it's hard to tell exactly what it is, but it looks like a castle or some other grand structure. The mountain pass lies further west.", cant_go "There are paths leading north and west.", cheap_scenery CS_NO_ADJ 'rock' "The rock is far to the north." 'building' 'castle' "The massive structure lies at a great distance towards the north." 'hill' 'hills' "The surrounding area is full of hills.", n_to [; print "You make your way up the winding path that leads from the hilly landscape to the castle in the distance. The path is narrow and rocky, and it gradually becomes steeper. You soon find yourself having to use your hands to climb up the rocks in some places. The air grows colder as you ascend, and you can feel a chill running through your bones. You push on, determined to reach your destination.^^ After what feels like hours of climbing, you finally crest a ridge and catch your first glimpse of the castle. It lies in ruins, but the sight still takes your breath away: the castle is huge, with towering walls that seem to stretch up to the sky.^^"; return CastleGate; ], u_to [; print "You begin to climb up the tall tree, hand over hand, as the magpies chirp and twitter around you. After a few minutes, you reach the top of the tree, and you can see for miles around.^^"; return TreeTop; ], w_to [; print "You begin your descent from the hills and set out on the long walk back to the mountain pass.^^"; return MountainPass; ]; Object -> RemoteNest "nest" with name 'nest' 'twigs' 'moss', before [; Examine: "You crane your neck to get a better look at the nest in the upper branches. It's a small, delicate structure, made of twigs and bits of moss. You can see that it's quite well-constructed, and you imagine that the magpies must be quite skilled at building these nests."; default: "The nest is high up in the tree, far out of reach."; ], has scenery; Object -> TallTree "tree" with name 'tree' 'tall', initial [; if(self hasnt general) { give self general; "Suddenly you hear a rustling sound above you and look up to see a pair of magpies building a nest in a tall tree."; } "A tall tree towers over the surrounding landscape, providing a commanding view of the area. In the topmost branches of the tree, a pair of magpies are perched, chirping and chattering to one another. They seem to be keeping a watchful eye on their surroundings."; ], description "You take a closer look at the tree. It's a magnificent sight, with a thick trunk that's covered in gnarled bark. The branches are thick and sturdy, and you can see that they stretch out in all directions, shading the area around the tree. The leaves are a deep green color, and you can see that they're rustling in the wind. A pair of magpies are flitting about the tree, and you can hear their cheerful chirps and whistles. As you approach, you see that they've built a nest in one of the upper branches.", before [; Take: "The tree seems to be firmly rooted in the ground, and any attempt to move it is met with resistance."; Push, PushDir: "You try to push the tree over with all your might, but it doesn't even budge. The tree stands there tall and sturdy, as if it has been rooted there for centuries. After a few more attempts, you realize that it's futile to try and push it over."; Climb: <>; ], has static; Object TreeTop "Tree top" with description "You take a moment to look out over the hilly landscape, feeling a sense of awe and wonder at the beauty of the world around you. In the distance, you see a range of mountains, their peaks shrouded in mist. They seem almost impossibly tall and imposing, and you can't help but feel a sense of reverence for the natural world. To the north, you see a path snaking its way through the hills, and beyond that, you can see what looks like a large building, possibly a castle.", before [; Jump: "You take a deep breath and prepare yourself to jump, but as you push off from the branch, your foot slips and you lose your balance. You quickly grab onto the branch with both hands, your heart racing as you realize how close you came to falling."; ], cheap_scenery 'hilly' 'landscape' "The view of the landscape below is breathtaking." 'mountain' 'mountains' "The mountains are far away." 'building' 'castle' "The massive structure lies at a great distance towards the north." 'branch' 'branches' "The branches closest to you are sturdy enough to hold your weight, but the higher ones are thinner and sway gently in the breeze." 'hill' 'hills' "The surrounding area is full of hills.", cant_go "The only way out is to climb down again.", d_to [; print "You make your way back down the tree"; if(Key in self) print ", feeling a sense of accomplishment and satisfaction. You can't wait to see what doors the key might open, and what mysteries it might help you solve"; print ".^^"; return Hills; ]; Object -> TallTreeAbove "tree" with name 'tree' 'tall', before [; Examine: "The tree sways gently in the breeze, and the leaves rustle softly. You can see for miles in every direction, and the view is breathtaking."; Climb: <>; default: "You can't do that while climbing the tree."; ], has scenery; Object -> Nest "nest" with name 'nest', initial "There is a nest on one of the nearby branches.", description [; print "The nest is a small, delicate structure, made of twigs and bits of moss."; if(Key in self) { print " You notice that there's something shiny in the nest, and as you get closer, you see that it's a small key. It glitters in the sunlight, and you can see that it's just within your reach."; } print "^"; ], before [; Take: "You hesitate, not wanting to disturb the birds and their home."; ], has container open static; Object -> -> Key "key" with name 'key', description "The key is small and made of bronze, with intricate designs etched into the metal. You wonder what it might unlock.", after [; Drop: if(location == TreeTop) { move Key to Hills; "You fumble with the key in your hand, and before you realize it, the key slips through your fingers and falls. You curse your clumsiness, knowing that you will have to climb down and retrieve it."; } ]; Object Magpies "magpies" with name 'magpie' 'magpies', before [; Examine: "You watch the magpies for a moment, as they flit about the tree, gathering twigs and bits of moss. They seem to be very busy, and you can see that they're building a nest on one of the upper branches. They don't seem to be bothered by your presence, and you can hear their cheerful chirps and whistles as they work. You notice that their feathers are black and white, and they have bright, beady eyes that seem to sparkle in the sunlight."; default: "The magpies are flying far out of reach."; ], react_before [; Listen: "You pause to listen to the magpies, trying to decipher if they are communicating something important or just making noise. Despite your best efforts, their language remains a mystery to you, but you can appreciate the beauty of their song nonetheless."; ], found_in Hills TreeTop, has pluralname scenery; Object CastleGate "Castle Gate" with description "The castle is in a state of disrepair, with crumbled walls and fallen towers, but it still conveys an imposing, eerie grandeur. There is a tall stone wall surrounding the entire structure. To the north, there is a massive gate set in the stone wall, made of thick, black iron with spikes protruding from the top. The gate is closed, and you can see that it is locked with a large padlock. A path leads south and down back into the hills.^^ The area in front of the castle is mostly bare, with a few small trees and bushes scattered here and there.", cheap_scenery CS_PARSE_NAME ParseNameBushes "The few bushes and trees near the castle ruins are scraggly and sparse, with wilted leaves and thin branches. They appear to have struggled to survive in the harsh, rocky soil and exposed position on the castle hill.", cant_go "There is a path leading south, and the gate to the castle to the north.", s_to [; print "As you turn around and begin walking away from the castle, you retrace your steps, making your way back to the hills.^^"; return Hills; ], n_to [; if(Gate hasnt open) "The gates are closed tight and locked securely, preventing you from entering the castle."; return CourtYard; ]; Object -> CastleRuins "castle ruins" with parse_name [; if(NextWord() == 'castle' or 'wall' or 'walls' or 'ruins' or 'ruin') return 1; rfalse; ], description "The castle ruins are a mix of crumbling walls and overgrown foliage, with few signs of recent habitation. The outer wall is made of large stone blocks, some of which are cracked or missing. Vines and other plants have started to grow up the sides of the wall, adding to the overall feeling of decay. There are several towers and turrets, some of which have partially collapsed, and the overall impression is one of an ancient structure slowly being reclaimed by nature.", before [; Take: "Despite your best efforts, the structure refuses to budge even an inch."; Climb: "You attempt to climb the castle outer wall, but find that the stones are slick and difficult to grip. There are no visible handholds or footholds, and the wall seems too high and smooth to climb without proper equipment. Additionally, the wall is topped with a thick layer of jagged, sharp spikes that would make any attempt to climb it extremely dangerous."; Attack: "You swing your sword against the stone walls of the castle, and feel the impact reverberating through your arm, but the wall itself remains unscathed. It's clear that the walls of the castle are too sturdy to be destroyed by brute force alone."; ], has pluralname scenery; Object -> Gate "gate" with parse_name [; if(NextWord() == 'gate' or 'gates' or 'door' or 'lock' or 'padlock') return 1; rfalse; ], description "The castle gate is made of thick, sturdy wood, reinforced with iron bands and bolts. It is several meters high and wide, with a pointed arch at the top. The surface of the gate is worn and weathered, with some areas of peeling paint and signs of past damage. The lock on the gate is a simple padlock with a single keyhole and a thick shackle. It appears that the lock has not been opened in a long time. The gate is flanked by tall stone walls, and there are no visible gaps or weaknesses in the barrier.", before [; Climb: <>; Take: "Despite your best efforts, the gate refuses to budge even an inch."; Attack: "The gate is made of thick, reinforced metal that is too strong to be broken by brute force alone. The metal is pitted and scarred, with signs of battle damage from years of warfare."; Unlock, Open: if(self has open) { "You have a feeling of deja vu. You suddenly remember that you've already unlocked and opened the gate."; } if(second == 0 && Key in player) second = Key; if(second == Key && self hasnt open) { give self open; "You fit the key into the lock and turn it, and with a creak and a groan, the gate swings open. You're surprised that the key actually worked, and you're excited to have access to the rest of the castle ruins."; } if(second == 0) { "As you attempt to unlock the castle gate with your bare hands, you realize how futile it is to attempt such a task without proper tools."; } if(second ~= Key) "You try to insert ", (the) second, " into the keyhole of the castle gate, hoping to use it as a makeshift key, but it won't fit properly."; ], has scenery; Object CourtYard "Courtyard" with description "You stand in the middle of a once grand courtyard, now in ruins and disarray. The stone walls that once stood tall and proud now crumble and lean, vines and weeds growing in the cracks. You can see the remains of several buildings around you, their roofs and walls caved in or missing entirely, and you hesitate to explore too deeply into the unstable ruins. The castle gate is to the south, perhaps leading to safer ground.^^ Despite the decay, there is a sense of ancient grandeur that still lingers in the air. You notice a set of stone stairs that lead down into what appears to be the castle dungeons.", cheap_scenery 'castle' 'gate' "As you survey the courtyard, your eyes settle on the south wall where the castle gate stands as the only exit." 'vines' 'weeds' "The vines cling to the walls and crevices of the ruined castle, their green tendrils snaking along the crumbling stonework." 'buildings' 'remains' "The once-grand buildings are now nothing more than piles of rubble and broken masonry.", cant_go "The buildings are crumbling and unstable and it's clear that entering them would be dangerous. The only viable exits from the castle are the stairs leading down to the dungeons and the gate to the south.", s_to CastleGate, d_to [; print "You make your way down the stairs, which become increasingly narrow and cramped as you go. Eventually, you reach a large, dimly lit chamber, which seems to be some kind of dungeon.^^"; return Dungeon; ]; Object Dungeon "Dungeon" with description "The dungeon is a large, cavernous space, with rough, jagged walls made of blackened rock. The walls are covered with a layer of soot, and you can see that the air is thick with smoke and ash. The air in the dungeon is hot and stifling, and you can feel sweat pouring down your forehead as you look around. You notice that there are several other passages leading off from the main chamber, but they are shrouded in darkness, and you can't see where they lead. The only safe passage seems to be up the stairs, back to the castle courtyard", cheap_scenery CS_NO_ADJ 'dungeon' "You can see that the dungeon stretches out in all directions, disappearing into the darkness." 'soot' 'ash' "The walls and ceiling are coated in the blackened residue, making it hard to see any details in the dim light." CS_NO_ADJ 'smoke' "Thick, acrid smoke that hangs heavily in the air." 'stair' 'stairs' "The stairs are narrow, and you have to watch your step to avoid tripping." 'passage' 'passages' "The passages appear to be rough and uneven tunnels, twisting and turning in various directions. They are dark and appear to continue on indefinitely. However, without entering them, it's difficult to determine their length or where they lead.", cant_go "There are several other passages leading off from the main chamber, but they are shrouded in darkness, and look too dangerous to explore.", u_to [; if(Dragon in Dungeon && Dragon has general) { "You turn to run away from the dragon, hoping to put some distance between yourself and the fierce beast, but as you start to move, you realize that the dragon is blocking your path.^^ It's as if the creature has anticipated your move and is now standing directly in front of you, preventing you from escaping. You can see the gleam in its eye and the way its powerful muscles are tensing, as if it's ready to pounce at any moment."; } if(DeadDragon in Dungeon) { print "You make your way back through the winding passages of the dungeon, your mind racing with thoughts of the dragon you just defeated. As you climb the stairs back up to the castle courtyard, you can't help but feel a sense of relief that you made it out alive.^^"; } return CourtYard; ]; Object -> Dragon "dragon" with name 'dragon', initial "In the center of the dungeon, you see a dragon, curled up on a pile of gold and treasure. Its scales gleam in the dim light, and you can see its yellow eyes watching your every move. You steel yourself for what's to come and take a deep breath, preparing to face the dragon and complete your quest.", description "The dragon's mouth is full of razor-sharp teeth, and smoke billows from its nostrils with every breath. Its talons are the size of your forearm, and you can see that they are coated with razor-sharp claws. Despite its intimidating appearance, however, the dragon doesn't seem to be particularly interested in attacking you at the moment; it merely watches you with a cool, detached gaze, as if weighing your worthiness to stand before it.", life [; Order: "The dragon remains silent and doesn't respond. It continues to stare at you, its eyes glowing with an intense and fiery light."; Show, Give: "The dragon simply stares at you with its cold, unfeeling eyes. It seems uninterested in your gift, and continues to regard you silently, as if waiting for you to do something else."; Ask, Tell, Answer: "You approach the dragon, hoping to engage it in conversation, but it simply regards you with a cool, unblinking gaze. Despite your attempts to speak to it, the dragon remains silent, as if it has no interest in communicating with you."; ], before [; Attack: if(second == 0 && Sword in player) second = Sword; if(second ~= Sword) "You need a better weapon."; if(self hasnt general) { give self general; "You swing your sword at the dragon, striking its scaly hide. The dragon retaliates by swiping its massive claws at you, but you manage to dodge out of the way just in time."; } remove self; move DeadDragon to Dungeon; "You keep fighting, driving your sword into the dragon's flesh and evading its attacks. Eventually, after a long and grueling battle, you land a fatal blow, and the dragon falls to the ground, dead.^^ You stand there for a moment, panting and covered in dragon blood, feeling both exhausted and triumphant. You've accomplished what the troll asked of you, and you've emerged victorious from the most challenging battle of your life."; ], has animate neuter; Object -> TreasurePile "treasure" with parse_name [_w _n; _w = NextWord(); if(_w == 'precious') { _w = NextWord(); ++_n; } if(_w == 'pile') { _w = NextWord(); ++_n; } if(_w == 'of') { _w = NextWord(); ++_n; } if(_w == 'treasure' or 'gold' or 'gems' or 'artifacts') return _n + 1; rfalse; ], description "The dragon's pile of treasure is a sight to behold. It's a massive heap of glittering gold, sparkling gems, and precious artifacts, all collected by the dragon over the years.^^ The pile of treasure is so large that it's impossible to estimate its value. It's clear that the dragon has been hoarding these riches for a long time and that many adventurers have likely tried and failed to take them away.", before [; Take, Search: if(Dragon in Dungeon) "I'm sorry, but attempting to take treasure from a live dragon would be extremely dangerous and ill-advised. Dragons are known to be fiercely protective of their hoards and are highly intelligent creatures that can quickly turn aggressive if they feel threatened. It's best to avoid provoking or stealing from a live dragon and instead seek out other means of obtaining treasure in a safer manner."; if(self hasnt general) { give self general; move TreasureSack to player; update_moved = true; "As you step towards the dragon's pile of treasure, you can feel the weight of your excitement and anticipation. The glittering mound of gold and jewels is mesmerizing, and you feel a rush of greed wash over you. You begin to pick up the coins and gems one by one, carefully inspecting each piece for its value and beauty.^^ You find an old sack and stuff as much as you can into it, taking care not to overburden yourself, but still managing to amass a considerable amount of treasure. The gold coins are heavy and clink together as you add them to your sack, while the emeralds and rubies sparkle in the light."; } "You have already taken as much as you can carry."; ], has scenery; Object TreasureSack "treasure sack" with name 'treasure' 'sack' 'of', description "The sack is quite heavy and filled with a variety of treasures, such as gold coins, silver trinkets, and gemstones of all colors and sizes. The treasures clink and jingle as the sack is moved, making it clear that there is a substantial amount of wealth inside.", before [; Empty: "You'd better keep the treasure in the sack."; ], has openable open; Object DeadDragon "dragon" with name 'dragon', initial "The dragon lies dead in the center of the dungeon, near a pile of gold and treasure.", description "You stand over the corpse of the dragon, feeling a mix of elation and exhaustion. The great beast lies motionless on the floor, its scales blackened and cracked. Despite its size and power, the dragon looks strangely vulnerable now that it's dead, and you can't help but feel a twinge of pity for the creature. It was a fierce opponent, to be sure, but it was also a magnificent specimen of its kind, and you can't help but wonder what might have become of it if things had been different.", before [; Take: "The corpse is far too heavy to move."; ], has static; [Initialise; print "You find yourself standing in a small airlock, the sound of rushing air filling your ears. The walls around you are smooth and metallic, and the only light comes from a small panel on the far side of the room. As you approach it, the panel beeps and a message appears on the screen.^^ ~Welcome to the Airlock,~ it reads. ~This facility is designed to protect against the harmful effects of interdimensional travel. Please wait for the pressure to equalize before proceeding.~^^ As you stand there, you realize that you have no idea how you got here. The last thing you remember was sitting at your desk, working hard on a project. But now, you're in some sort of high-tech airlock, and you can feel the pressure slowly equalizing around you.^^ After a few moments, the panel beeps again, and you hear a voice through a speaker above the screen. ~Please state your intended destination.~^^ You pause for a moment, trying to think of what to say. You're not even sure where you are, let alone where you want to go.^^ ~Umm, home, I guess?~ you say tentatively.^^ There's a brief pause, and then the voice speaks again. ~I'm sorry, but we are unable to comply with that request. This facility is for interdimensional travel only. Please state your desired dimension.~^^ You frown, feeling a bit frustrated. What the hell is going on? But then, an idea occurs to you.^^ ~Fantasy world,~ you say decisively.^^ There's a moment of silence, and then the voice speaks again. ~Very well. Initiating interdimensional travel sequence. Please stand by.~^^ You feel a sudden jolt, and the airlock begins to vibrate around you. Then, with a hiss of escaping air, the door on the other side of the room slides open.^"; ];