! Copyright (C) 2021, 2022 Jason Self ! ! This file is free software: you may copy, redistribute and/or ! modify it under the terms of the GNU Affero General Public License ! as published by the Free Software Foundation, either version 3 of ! the License, or (at your option) any later version. ! ! This file is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Affero General Public License for more details. ! ! You should have received a copy of the GNU Affero General Public ! License along with this file. If not, see https://gnu.org/licenses/ ! ! SPDX-License-Identifier: AGPL-3.0-or-later Array UUID_ARRAY string "UUID://DE9FA2E5-4EC7-4166-9218-E56EFA1DF40F//"; #Ifdef UUID_ARRAY; #Endif; Global lantern_fuel_left = 20; Global body_temperature = 20; Global cabin_has_electricity = 1; Global forest_location = 1; Global snowmobile_location = 0; Constant MAX_SCORE = 7; Constant DEATH_MENTION_UNDO; Constant Story "Snowed In"; Constant Headline "^A work of interactive fiction. ^If you get stuck try typing HELP. ^Ongoing development: https://jxself.org/git/?p=snowed-in.git ^Send bugs and feedback by email to j@@64jxself.org. ^IFID DE9FA2E5-4EC7-4166-9218-E56EFA1DF40F ^Copyright (C) 2021, 2022 Jason Self ^You can change and share this game under the terms of the GNU Affero General Public License as published by the Free Software Foundation (FSF), either version 3 of the License, or (at your option) any later version published by the FSF. See the GNU Affero General Public License for more details.^^You should have received a copy of this game's source code along with a copy of the GNU Affero General Public License so that you can know your rights. If not, contact the place you got it from.^^"; Include "parser"; Include "verblib"; Release 4; Serial "220809"; Object mainroom "Main Room" with description "This room is a total wreck - it looks like a major fight happened in here. There's a ripped up sofa and a broken old coffee table in the middle of the room. A flat-screen TV is mounted against the wall, with the screen dangling out. This cabin has three other rooms. There's an office area to the east, and a bedroom to the north. A kitchenette can be found to the west. There's a doorway in the south wall leading outside.", n_to bedroom, s_to "The weight of the snow against the door is such that it won't budge.", e_to office, w_to kitchenette, has light; Object frontdoor "front door" mainroom with name 'door' 'front', description "The wooden door is made of thick oak wood with the shape of a bear claw engraved in it.", short_name [; if (location == mainroom) print "door to the outside"; else print "door to the cabin"; return true; ], found_in mainroom southofcabin, door_dir [; if (location == mainroom) return s_to; else return n_to; ], door_to [; if (location == mainroom) return southofcabin; else return mainroom; ], before [; Open: print_ret "The weight of the snow against the door is such that it won't budge."; ], has scenery door openable; Object bearclaw "bear claw" mainroom with name 'bear' 'claw', with description "It's in the shape of a thin, sharp claw with three jagged points at the top of it.", has scenery; Object sofa "sofa" mainroom with name 'sofa' 'couch', with description "The sofa is in poor shape. The upholstery is ripped and there are several holes in it.", before_implicit [; Take: if (action_to_be == ##Eat) return 2; ], before [; Take, Pull, Push, PushDir, Turn: print_ret (The) self, " is too heavy for that."; Open: TearSub(); return true; ], has scenery supporter enterable; Object coffeetable "coffee table" mainroom with name 'coffee' 'table', with description "The old coffee table looks as if it's had quite a bit of use. There are burn marks covering it and the paint is worn off in most places.", before_implicit [; Take: if (action_to_be == ##Eat) return 2; ], before [; Take, Pull, Push, PushDir, Turn: print_ret (The) self, " is too heavy for that."; ], has scenery supporter enterable; Object lantern "copper lantern" coffeetable with name 'lantern' 'copper' 'lamp', description "This is an exceptionally beautiful lantern, made of fired copper, and polished until it shines. About eleven inches high, with a base of about 5 inches or so in diameter and a large, brass-closed hook at the top. A rainbow of unique colors run through the copper. The glass in the lamp has a fresnel type of design, which is used to distribute light widely.", time_left, time_out [; if (lantern has on) { lantern_fuel_left = 0; give lantern ~on; give lantern ~light; StopDaemon(lantern); print_ret "Suddenly, the lantern's flame begins to flicker violently within its glass prison and then extinguishes itself."; } ], before [; SwitchOn: if (lantern_fuel_left > 0) { give lantern light; StartTimer(lantern, lantern_fuel_left); } else { print_ret "You snap the switch a few times, but nothing happens."; } SwitchOff: StopTimer(lantern); give lantern ~light; ], daemon [; if (lantern has on) lantern_fuel_left = lantern.time_left; if (lantern has on && lantern_fuel_left <= 5) print_ret "The lantern's fuel runs low."; ], has switchable; Object television "flat-screen TV" mainroom with name 'TV' 'television' 'flat' 'screen' 'flat-screen', with description "The flat-screen TV looks fairly modern but it's been broken in a fight and the screen is dangling out.", before [; Take, Pull, Push, PushDir, Turn, Remove: print_ret "The damaged electronics throw some sparks, and you get a mild shock. Perhaps it's best left where it is."; SwitchOn: if (television hasnt visited) { score = score + 1; print "Despite the significant damage, the television comes to life in one last valiant attempt to be useful. Your favorite news program is on: U.S. News And Grue Report. The news anchor is giving a warning of grue sightings in the area of the forest before the television finally dies.^"; give television visited; } else { print "The flat-screen TV is broken and can't be turned on.^"; } return true; ], has scenery switchable; Object lightsocket "light socket" mainroom with name 'socket' 'lightsocket', before [; Take, Pull, Push, PushDir, Turn: print_ret "You don't have the tools to remove a light socket."; Receive: if (noun ~= lightbulb) { print "Put "; print (a) noun; print_ret " into the light socket? Maybe you should come with a warning label because you contain more than a trace amount of nut."; } if (noun == lightbulb && lightbulb has on) { give mainroom light; give office light; give kitchenette light; give bedroom light; give eastofcabin light; give southofcabin light; } ], has scenery container transparent open; Object lightbulb "light bulb" lightsocket with name 'light' 'bulb' 'lightbulb', before [; SwitchOn: if (lightbulb in lightsocket) { if (cabin_has_electricity == 1) { give mainroom light; give office light; give kitchenette light; give bedroom light; give eastofcabin light; give southofcabin light; } else { print_ret "You flip the switch a few times, but nothing happens."; } } else { print_ret "Turn on a lightbulb when it's not in the socket? What a strange idea."; } ], after [; Take, Pull, Push, PushDir, Turn, SwitchOff: give lightbulb ~on; give mainroom ~light; give office ~light; give kitchenette ~light; give bedroom ~light; give eastofcabin ~light; give southofcabin ~light; ], has switchable on; Object office "Office" with description "There seems to have been quite a fight in here. The room is a wreck. Holes are in the walls and the window is broken, letting in the cold air from outside. Chunks of drywall and insulation cover the floor. The desk has a bullet hole through the middle. The main room is to the west.", before [; Go: if (noun == e_obj) { if (snowshoes has worn) print_ret "You can't fit through the window while wearing the snow shoes."; if (eastofcabin hasnt visited) { score = score + 1; give office visited; } } ], w_to mainroom, e_to window, has light; Object desk "solid oak desk" office with name 'solid' 'oak' 'desk', with description "The desk is old and made of solid oak. The right side of it has been smashed and all of the drawers have been removed. A bullet hole goes straight through the middle of the desk.", before [; Take, Pull, Push, PushDir, Turn: print_ret (The) self, " is too heavy for that."; ], has scenery supporter enterable; Object businesscard "business card" desk with name 'business' 'card', with description "The business card is white and has blacked edges. It bears the name ~Lasting Solutions~, a local data recovery company, in bold letters on the top. The company's website URL is printed in blue at the bottom."; Object salesreceipt "sales receipt" desk with name 'sales' 'receipt', with description "The sales receipt is for $200, dated three years ago. It's printed on old tractor feed printer paper and bears the name ~Lasting Solutions~, a local data recovery company. A handwritten note is scrawled on the bottom: ~Start working on these hard drives soon.~"; Object computer "computer" desk with name 'computer' 'PC', with description "It's a heavy older model that appears to have been seriously damaged in a fight. It's clearly on its last legs but is perhaps still useful.", before [; Take, Pull, Push, PushDir, Turn: print_ret (The) self, " is too heavy for that."; SwitchOn: if (computer hasnt visited) { score = score + 1; print "The computer makes some concerning noises while lights on the front also illuminate. The last file is quickly displayed. ~If anyone else reads this, you're in serious danger. I've been fighting a ferocious grue for the last three days. I'm almost out of supplies and can't last much longer. I'm going to take the last of the supplies and escape through the office window in a last-ditch effort to get away and get back into town. I hope I can make it.~ The computer then makes a sickly sound and finally dies as some smoke comes out of it.^"; give computer visited; } else { print "The display briefly flickers but nothing else happens.^"; } return true; ], has switchable; Object drywall "drywall" office with name 'drywall' 'dry' 'wall', before [; Take, Pull, Push, PushDir, Turn: print_ret "Taking that would achieve little."; ], has scenery; Object insulation "insulation" office with name 'insulation', before [; Take, Pull, Push, PushDir, Turn: print_ret "Taking that would achieve little."; ], has scenery; Object bullethole "bullet hole" desk with name 'bullet' 'hole' 'holes', with description "Looks to have come from something that's capable of doing a lot of damage.", found_in desk bedroom, has scenery; Object window "window" office with name 'window' 'windows', description "The window faces the east side of the cabin. It's broken, letting in the cold air from outside.", short_name [; if (location == office) print "window"; else print "window into the cabin"; return true; ], found_in office eastofcabin, door_dir [; if (location == office) return e_to; else return w_to; ], door_to [; if (location == office) return eastofcabin; else return office; ], before [; Search: print_ret "The window faces the east side of the cabin."; Open, Close: print_ret "The window's broken so it's not clear how you'd do that."; ], has scenery door openable open; Object kitchenette "Kitchenette" with description "The kitchenette is empty. A sink, you think, though it's hard to tell what's a pipe and what's a faucet. A refrigerator, standing open and empty. The door has been ripped off. There's no indication as to where it went. There's no food anywhere in here. The main room is to the east.", e_to mainroom, has light; Object refrigerator "refrigerator" kitchenette with name 'fridge' 'refrigerator', with description "An old rusty refrigerator, standing open and empty. The door has been ripped off. There's no indication as to where it went.", before [; Take, Pull, Push, PushDir, Turn: print_ret (The) self, " is too heavy for that."; Open, Close: print_ret (The) self, " door is missing."; ], has scenery enterable container openable open; Object sink "sink" kitchenette with name 'sink' 'pipe' 'faucet', with description "A sink, you think, though it's hard to tell what's a pipe and what's a faucet.", after [; SwitchOn: print_ret "Pipes from in the walls make a groaning sound, almost like pain and despair. No water comes out."; ], has scenery container switchable; Object bedroom "Bedroom" with description "This bedroom is small and cramped, and looks like a major fight happened as the exterior wall has bullet holes. There's a bare mattress, torn to shreds. The main room is to the south.", s_to mainroom, has light; Object bed "bed" bedroom with name 'bed' 'mattress', with description "The mattress is bare and empty.", before [; Take, Pull, Push, PushDir, Turn: print_ret (The) self, " is too heavy for that."; ], has scenery supporter; Object suitcase "suitcase" bedroom with name 'suitcase' 'case', with description "The suitcase is made of a light metallic material that you can't quite make out. The color of it is somewhere between silver and grey.", has container open openable; Object snowsuit "snowsuit" suitcase with name 'snowsuit' 'snow' 'suit', with description "The snowsuit is blue, decorated with white and purple designs. On the chest are the letters ~CE~ in purple.", before [; Examine: if (snowsuit hasnt visited) { score = score + 1; give snowsuit visited; } Wear: if (snowshoes in player && snowshoes has worn) { print_ret "The snowsuit can't fit over the snowshoes."; } Disrobe, Remove: if (snowshoes in player && snowshoes has worn) { print_ret "The snowsuit can't be taken off over the snowshoes."; } ], daemon [; if (location ~= mainroom && location ~= office && location ~= kitchenette && location ~= bedroom && location ~= thedark && snowsuit hasnt worn) { body_temperature = --body_temperature; } if (location == mainroom || location == office || location == kitchenette || location == bedroom || snowsuit has worn && body_temperature < 20) { body_temperature = ++body_temperature; } if (body_temperature == 0) { deadflag = 4; } if (body_temperature <= 5) print_ret "You're shivering uncontrollably, and it's hard to move. You feel very exhausted and drowsy. It's all you can do to keep from falling over."; if (body_temperature > 5 && location ~= mainroom && location ~= office && location ~= kitchenette && location ~= bedroom && location ~= thedark && snowsuit hasnt worn) { switch (body_temperature) { 19: "The feeling of cold overwhelms you. Surely the cold will get to you before anything else does. Right?"; 18: "You can feel yourself getting colder and colder."; 17: "You can see your own breath freezing in the air, forming little clouds."; 16: "You shiver in the cold."; 15: "You continue to shiver in the cold."; 14: "Your hands grow numb from the cold."; 13: "You continue shivering in order to keep warm."; 12: "Your shivering grows worse as your body becomes colder by the minute."; 11: "Your teeth begin to chatter as you desperately try to warm yourself up."; 10: "Your shivering intensifies as your body begins to freeze over from the cold."; 9: "Your fingers become stiff and you feel sharp pains all over your body."; 8: "The cold has gotten to a point where it is too much for you. You begin to shiver uncontrollably."; 7: "Your eyesight begins to fade and you can't even feel yourself shivering anymore."; 6: "You can feel your body shutting down from the cold as you slowly begin to lose consciousness."; } } ], has clothing; Object snowshoes "snowshoes" bedroom with name 'snowshoe' 'snowshoes' 'snow' 'boot' 'boots' 'shoe' 'shoes' 'metal' 'frame', with description "They're light blue in color and have a thick, hard rubber bottom that's attached to a metal frame that keeps you from sinking into the snow. They look to be warm and comfortable.", after [; Wear: print_ret (The) self, " fit perfectly and go up to your knees."; ], daemon [; if (location ~= mainroom && location ~= office && location ~= kitchenette && location ~= bedroom && location ~= thedark && location ~= eastofcabin && snowshoes hasnt worn) { deadflag = 3; } ], has pluralname clothing; Object southofcabin "South Of Cabin" with description [; print "The wind is howling, and there's snow flying everywhere. The snow buildup seems to get higher to the west. "; if (snowsuit hasnt worn) print "It's really cold and you're not dressed for this weather. "; if (frontdoor has open) { check_for_cabin_lighting(); } if (snowshoes has worn && lantern in player && eastofcabin hasnt visited && lantern_fuel_left > 0) { throw_rock(); } print "^"; ], n_to frontdoor, s_to forest, e_to eastofcabin, w_to westofcabin, has light; Object truckspot "Forest" with description "The blizzard is still going on. You don't think it's letting up any time soon. There is a blue and white pickup truck here. It looks like it got stuck in the snow and is slowly being covered by it. The windows are iced up and you can't see inside.", before [; Go: forest_location = forest_location++; PlayerTo(forest, 1); ]; Object truck "blue and white pickup truck" truckspot with name 'pickup' 'truck' 'door' 'doors', with description "The blue and white pickup truck looks old and battered. The paint has chipped and faded. The windows are iced up and you can't see inside.", before [; Take, Pull, Push, PushDir, Turn: print_ret (The) self, " is too heavy for that."; Search: print_ret "The windows are iced up and you can't see inside."; Enter, Open, GoIn: print_ret (The) self, " is frozen shut."; ], has scenery supporter enterable openable; Object backpacklocation "Forest" with description "You keep walking and walking. The snowfall is still as heavy as ever. As you continue trudging through the snow, you wonder if you're actually moving in the right direction. You can't see anything through the blizzard. You wonder if you might be going in circles and end up wandering around forever, never finding your way out of this white void. You're unsure of which way to go. The snowfall is so thick that you can barely see your hand if you hold it right in front of your face. You have no idea how far you've come or in what direction.", before [; Go: forest_location = forest_location++; PlayerTo(forest, 1); ]; Object backpack "backpack" backpacklocation with name 'backpack' 'back' 'pack' 'blood', with description "The backpack is of medium size, black, with three white stripes running vertically on the back. The middle stripe is broken up by a red line running down the center of it toward the bottom of the backpack. On the side are the letters ~CE~ in purple. The backpack is covered in blood, as if the owner met with an untimely demise.", before [; Examine: if (backpack hasnt visited) { score = score + 1; give backpack visited; } ], has clothing container openable; Object flashlight "flashlight" backpack with name 'flashlight' 'flash' 'light' 'torch', description "It looks like a cheap red plastic model, about eight inches long.", before [; SwitchOn: if (flashlight hasnt visited) { score = score + 1; give flashlight visited; } give flashlight light; SwitchOff: give lantern ~light; ], has switchable; [ print_forest_description; if (location ~= thedark) { switch (forest_location) { 1: print_ret "You push on despite the bitter cold and the heavy snowfall as you come to a fork. There are two ways to go here, one involves a hill to the south. The other way is continuing through the woods to the north."; 2: print_ret "The wind is bitterly cold. You plow through the snowfall, which is still as heavy as ever. You can barely see where you are going, making it hard to tell which direction is which. Out of the corner of your eye, you spot a tall, shadowy figure lingering at the edge of your vision. When you turn to look at it directly, however, it disappears. You continue walking. The wind is howling louder than ever. The endless snowfall makes it difficult to see where you're going. You can't tell where the white sky and white ground begin and end."; 3: PlayerTo(truckspot); 4: print_ret "You trudge through the snow. The wind is really strong and howling like a banshee. You hear a horrible howl in the distance or is it the wind? Looking around you see nothing in this barren landscape but snow. You're not sure what to make of it, but you don't want to stick around to find out. The whole world is white. You can barely see five feet ahead of you. You hope you're going the right way. This place is so desolate and barren."; 5: print_ret "You think you might can see a large figure stepping out of the trees and moving in the distance but the wind is blowing hard and whipping up massive amounts of snow, making it hard to tell for sure. Your breath billows out in huge clouds. If it keeps blowing like this, you're not sure if you'll ever be able to get back. Snow whirls through the air as a gust of wind picks up speed. The howling gets louder and more intense. There's no left, right, backward or forward. There's nothing but endless, unchanging whiteness."; 6: PlayerTo(backpacklocation); 7: print_ret "It feels like you're lost in a maze of snow without a map. You keep trudging through the heavy snowfall, not knowing if you're even going in any particular direction anymore. The wind is really picking up now and the snowfall is getting heavier. You have to keep going. You can't let the snowstorm get the best of you. You can't give up. You must find a way out of this frozen wasteland. The snowstorm has made it impossible to see anything more than a few feet in front of you."; 8: print_ret "The wind is now a shrieking banshee, freezing and relentless, as it throws the snow into your face, blinding you. It's hard to walk against the brutal winds. You can't see anything, but you must keep going. There is no choice. You continue your way through the snowy white void, what with the snow piling up around you. The wind screams in your ears and you can't see anything. Can't go back. Can't go forward. You can't even see where you are. You hope that, as long as you keep moving, you'll eventually find a way out of this frozen wasteland."; 9: print_ret "The blizzard rages, but you continue to press on. There's nothing here but you, the snowfall, and the fierce wind howling through this frozen landscape. This isn't just a place of cold and ice - it's other-worldly. You trudge on and try to keep your spirits up and not let the snowstorm get to you. Every step is an effort. You wish you had the powers of a superhero right now. You can barely see where you are going. The wind knocks you down on your hands and knees. You get back up, but you're slipping and sliding all over the place."; 10: print_ret "You wander around in the impenetrable white void. The wind is howling louder than ever. You try to persevere. You don't know if you're going in circles or what, but you start to feel that this frozen, lifeless landscape is sucking away your very life force. You can't see your hand in front of your face. You can barely keep moving. Every step you take is hard-fought. You just want this awful nightmare to end. You begin to feel sleepy but you're in danger here. You have to keep moving. Sleep is not an option when you're in a place like this."; 11: print_ret "You try to remember the survival tips you've read on the internet, but frankly, you don't remember most of them right now. As you walk you try to keep your mind occupied with anything other than the storm. Nothing makes any sense and you feel like you're starting to go in circles. The wind starts starts to pick up as it begins howling louder than ever. You're determined to live but the blizzard doesn't seem to care whether you live or die. It just keeps howling and shrieking. It's not getting any easier to move in this blizzard."; 12: print_ret "You keep walking. The snow is drifting and piling up around you, making movement almost impossible. You look around the barren landscape, but there's nothing nearby except snow. It's almost as if you're lost in a white, endless void. You start to get disoriented. You don't even know if you're walking in a circle or not. The situation is looking very grim. Your life feels as if it is slowly ebbing away in the relentless grip of the snowstorm. It feels like you've been wandering for hours, but that's probably just your perception of time slipping away."; 13: print_ret "You can barely see anything, and you stumble forward. You could be wandering aimlessly in any direction right now and you wouldn't know the difference. It's as if you're in a sea of white. You're not sure that you're going in the right direction but you can't stop now. There has to be something here besides endless snow. You know that staying here is a death sentence. You have to escape. You're cold, tired, miserable, and desperate to get out of this mess. You have no idea where you are. You keep wandering through endless whiteness. You won't give up."; 14: print_ret "You're so cold that you begin to hallucinate, first seeing the words ~Ventilation Control Room~ and then yourself at a console. The hallucination quickly fades."; 15: deadflag = 2; print_ret "You see something in the distance but can't make it out. You walk toward it to find out that it's the hotel. You collapse in the lobby as the hotel staff rush over to you."; } } ]; Object forest "Forest" with description [; print_forest_description(); ], before [; Go: if (location == thedark) { DarkToDark(); } if (noun == d_obj || noun == u_obj) { print_ret "You can't go that way."; } forest_location = forest_location++; ], cant_go print_forest_description; [ throw_rock; if (television has visited || computer has visited) { print "The grue is waiting behind a snowbank in the distance, away from the light. "; } print "From somewhere off in the dark distance, far away from the light, a rock is hurled in your direction. It hits the lantern, breaking it, and putting it out of commission. "; give lantern ~on; give lantern ~light; lantern_fuel_left = 0; StopDaemon(lantern); score = score - 1; ]; [ check_for_cabin_lighting; if (lightbulb has on) { print "The light from inside the cabin only penetrates a few feet from the building. "; } else if (lantern in player && lantern has on) { print "The lantern provides the only source of light. "; } if (location has light) print "The snow stings your face and you can barely see three feet in front of you. "; if (snowshoes in player && snowshoes has worn) { print "The snowshoes are doing their job by making sure you don't sink into the snow. "; } ]; Object eastofcabin "East Of Cabin" with description [; print "It's dark outside. "; check_for_cabin_lighting(); if (cabin_has_electricity == 1 && lantern in player && lantern_fuel_left > 0) { throw_rock(); } print "^"; ], w_to window, s_to southofcabin, cant_go "The snow buildup is is too great to continue in that direction.", has light; Object roof "Roof" with description [; print "You're on the roof of the cabin, although it's hard to tell where the snow buildup ends and the roof begins. You can make out the trees around the cabin, but you can't see very far out into the snowfield beyond them."; if (roof hasnt visited) print " You hear a snowmobile approaching in the distance. Is it your salvation? The snowmobile quickly zooms by in front of the cabin and disappears into the forest."; StartDaemon(snowmobile); if (roof has visited) print " There seems to be no movement, no sound, no sign of anything."; new_line; ], n_to northofcabin, cant_go "Walking off the edge of a roof seems unwise."; Object northofcabin "North Of Cabin" with description [; print "You're on the north side of the cabin. The wind is howling and the snow is coming down; falling too fast to see well."; if (northofcabin hasnt visited) print " That might be a tree in the distance or a shadowy figure - It's hard to tell in this storm."; print_ret " The snow buildup here is so great that it's almost level with the cabin's roof, which is to the south."; ], n_to westofcabin, s_to roof, w_to westofcabin, cant_go "It's too steep to go in that direction safely.", before [; Go: if (noun == s_obj) { if (roof hasnt visited) { score = score + 1; } } ]; Object westofcabin "West Of Cabin" with description [; print "The snow is falling so fast that you can barely see anything. You can't even be sure you're going in the right direction."; if (westofcabin hasnt visited) print " Then you hear a shuffling noise in the snow. There was something there and now it's gone. Or was it always there and you just never saw it?"; print_ret " The snow buildup gets taller to the north."; ], s_to southofcabin, n_to northofcabin, cant_go "The snow buildup is is too great to continue in that direction."; [ Initialise; Location = mainroom; thedark.description = "It is pitch black. You are likely to be eaten by a grue."; print "You're trapped in a snowstorm while visiting the forest during your vacation to a small rural town. This is the worst snowstorm in more than 40 years. If only you had listened to the news. Well, it's too late for that. The snow has been falling for the past seven hours and shows no signs of stopping any time soon. You need to get back to your hotel in the town. You finally manage to find an old cabin in the woods and get inside but have no idea where you are. You're not dressed for this weather, and it's getting dark outside.^"; StartDaemon(lantern); StartDaemon(snowshoes); StartDaemon(snowsuit); StartDaemon(grue); ]; [ DeathMessage; if (deadflag == 3) print "You sink into the deep snow and are unable to move."; if (deadflag == 4) print "Finally, you succumb to the cold. Your mind goes blank as you slip away into the endless darkness and the deep sleep of death."; ]; ! Don't have 'take all' take the lightbulb in the mainroom of the ! cabin [ ChooseObjects obj code; if (code < 2) { if (obj has scenery) return 2; rfalse; } if (obj == lightbulb) return 0; ]; [ InScope; if (location == thedark && real_location == mainroom) { PlaceInScope(lightsocket); PlaceInScope(lightbulb); } return false; ]; Object cabin "cabin" mainroom with name 'cabin', found_in mainroom bedroom office kitchenette southofcabin eastofcabin northofcabin westofcabin, before [; Enter, Exit: print_ret "You'll have to say which compass direction to go in."; ], has scenery; Object snowmobile "snowmobile" thedark with name 'snowmobile', daemon [; snowmobile_location = random(14); if (location == forest && forest_location == snowmobile_location) { deadflag = 2; print_ret "A snowmobile approaches. The person says they saw your light and came to rescue you."; } return true; ], has scenery; Object grue "grue" thedark with article "the", name 'grue' 'monster', grue_active_around_cabin, grue_active_in_the_dark, daemon [; if (location == thedark) { switch (++(self.grue_active_in_the_dark)) { 1: "^You hear horrible gurgling sounds in the dark."; 2: "^You hear the clink of razor-sharp claws nearby."; 3: deadflag = 1; "^Your last memory is of the slavering fangs of the horrible Grue as it claims you for a meal."; } } if (location == mainroom || location == office || location == kitchenette || location == bedroom) { switch (++(self.grue_active_around_cabin)) { 1: "^You hear the wind howling outside, if it is the wind."; 2: "^You hear horrible gurgling sounds outside."; 3: "^The noise outside gets louder."; 4: "^You hear the sound of shuffling feet outside."; 5: "^You hear something sniffing around the cabin."; 6: "^You hear a deep guttural sound from outside that sends a chill down your spine."; 7: "^You hear something scratching on the cabin walls from outside."; 8: "^You hear something howl outside. It's a chilling, mournful wail that sends a chill down your spine."; 9: "^A thunderous CRACK can be heard coming from outside."; 10: "^There's a sudden crashing sound as something is thrown against the cabin walls."; 11: "^Something begins to beat against the walls of the cabin, as if trying to to break in. It makes a loud, thunderous noise."; 12: "^The wind is howling and the walls are being beaten so hard it feels like the cabin is shaking."; 13: "^Suddenly, there's ominous silence from outside the cabin."; } } if (location == mainroom || location == office || location == kitchenette || location == bedroom && self.grue_active_around_cabin == 15) { print "^The lights flicker and suddenly go out.^"; cabin_has_electricity = 0; give lightbulb ~on; give mainroom ~light; give office ~light; give kitchenette ~light; give bedroom ~light; give eastofcabin ~light; give southofcabin ~light; } return true; ], has scenery; [ DarkToDark; deadflag = 1; "Oh, no! You have walked into the slavering fangs of a lurking grue!"; ]; [ PrintRank; print ", earning you the rank of "; if (score == 0) "Novice."; if (score == 1) "Trained."; if (score == 2) "Skilled."; if (score == 3) "Talented."; if (score == 4) "Capable."; if (score == 5) "Adept."; if (score == 6) "Proficient."; if (score >= 7) print "Versed."; ]; [ URL; print "^If you need help try some of the commands from: ^https://pr-if.org/doc/play-if-card/^"; ]; [ XyzzySub; print "Nothing obvious happens.^"; return true; ]; [ HelpSub; URL(); return true; ]; [ TearSub; print_ret "Doing that would achieve little."; ]; Include "grammar"; Verb 'About' * -> Version; Verb 'Info' * -> Version; Verb 'Help' * -> Help; Verb 'Clue' * -> Help; Verb 'Hint' * -> Help; Verb 'xyzzy' * -> Xyzzy; Verb 'tear' * noun -> Tear; Extend 'tear' * 'up' / 'open' noun -> Tear; Verb 'rip' * noun -> Tear; Extend 'rip' * 'up' / 'open' noun -> Tear; Verb 'crawl' * 'through' / 'out' / 'via' noun -> Enter; Verb 'escape' * 'through' / 'out' / 'via' noun -> Enter; Extend 'jump' * 'through' / 'out' / 'via' noun -> Enter; Extend 'climb' * 'through' / 'out' / 'via' noun -> Climb; Extend 'go' * 'through' / 'out' / 'via' noun -> Enter; Extend 'go' first * 'out' / 'outside' -> VagueGo; Extend 'go' first * 'out' / 'outside' / 'outside' 'of' noun -> VagueGo; Extend 'go' first * 'in' / 'into' / 'inside' -> VagueGo; Extend 'go' first * 'in' / 'into' / 'inside' / 'inside' 'of' noun -> VagueGo; Extend 'exit' first * noun -> VagueGo; Extend 'leave' first * noun -> VagueGo;