0c4ce1a35fa647c6511c8595fe40f37b7b4033ac
[snowed-in.git] / src / snowed-in.inf
1 ! Copyright (C) 2021, 2022 Jason Self <j@jxself.org>
2 !
3 ! This file is free software: you may copy, redistribute and/or
4 ! modify it under the terms of the GNU Affero General Public License
5 ! as published by the Free Software Foundation, either version 3 of
6 ! the License, or (at your option) any later version.
7 !
8 ! This file is distributed in the hope that it will be useful, but
9 ! WITHOUT ANY WARRANTY; without even the implied warranty of
10 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 ! Affero General Public License for more details.
12 !
13 ! You should have received a copy of the GNU Affero General Public
14 ! License along with this file. If not, see https://gnu.org/licenses/
15 Global lantern_fuel_left = 10;
16 Global body_temperature = 20;
17 Global cabin_has_electricity = 1;
18 Global forest_location = 1;
19 Constant NO_SCORE;
20 Constant DEATH_MENTION_UNDO;
21 Constant Story "Snowed In";
22 Constant Headline 
23     "^A work of interactive fiction.
24     ^If you get stuck try typing HELP.
25     ^Ongoing development: https://jxself.org/git/?p=snowed-in.git
26     ^Send bugs and feedback by email to j@@64jxself.org.
27     ^IFID DE9FA2E5-4EC7-4166-9218-E56EFA1DF40F
28     ^Copyright (C) 2021, 2022 Jason Self <j@@64jxself.org>
29     ^You can change and share this game under the terms of the GNU 
30     Affero General Public License as published by the Free Software 
31     Foundation (FSF), either version 3 of the License, or (at your 
32     option) any later version published by the FSF. See the GNU Affero 
33     General Public License for more details.^^You should have received 
34     a copy of this game's source code along with a copy of the GNU 
35     Affero General Public License so that you can know your rights. 
36     If not, contact the place you got it from.^^";
37 Include "parser";
38 Include "verblib";
39 Release 1;
40 Serial "220529";
41
42 Object  mainroom "Main Room"
43   with  description 
44             "This room is a total wreck - it looks like a major fight 
45             happened in here. There's a ripped up sofa and a broken 
46             old coffee table in the middle of the room. A flat-screen 
47             TV is mounted against the wall, with the screen dangling 
48             out. This cabin has three other rooms. There's an office 
49             area to the east, and a bedroom to the north. A 
50             kitchenette can be found to the west. There's a doorway 
51             in the south wall leading outside.",
52         n_to bedroom,
53         s_to frontdoor,
54         e_to office,
55         w_to kitchenette,
56   has   light;
57
58 Object  frontdoor "front door" mainroom
59   with  name 'door' 'front',
60         description 
61             "The wooden door is made of thick oak wood with the shape 
62             of a bear claw engraved in it.",
63         short_name [;
64             if (location == mainroom)
65                 print "door to the outside";
66             else
67                 print "door to the cabin";
68             return true;
69         ],
70         found_in mainroom southofcabin,
71         door_dir [;
72             if (location == mainroom)
73                 return s_to;
74             else
75                 return n_to;
76         ],
77         door_to [;
78             if (location == mainroom)
79                 return southofcabin;
80             else
81                 return mainroom;
82         ],
83   has   scenery door openable;
84
85 Object  bearclaw "bear claw" mainroom
86   with  name 'bear' 'claw',
87   with  description 
88             "It's in the shape of a thin, sharp claw with three jagged 
89             points at the top of it.",
90   has   scenery;
91
92 Object  sofa "sofa" mainroom
93   with  name 'sofa' 'couch',
94   with  description 
95             "The sofa is in poor shape. The upholstery is ripped and 
96             there are several holes in it.",
97         before [;
98           Take, Pull, Push, PushDir, Turn:
99             print_ret (The) self, " is too heavy for that.";
100         ],
101   has   scenery supporter enterable;
102
103 Object  coffeetable "coffee table" mainroom
104   with  name 'coffee' 'table',
105   with  description 
106             "The old coffee table looks as if it's had quite a bit of 
107             use. There are burn marks covering it and the paint is 
108             worn off in most places.",
109         before [;
110           Take, Pull, Push, PushDir, Turn:
111             print_ret (The) self, " is too heavy for that.";
112         ],
113   has   scenery supporter enterable;
114
115 Object  lantern "copper lantern" coffeetable
116   with  name 'lantern' 'copper' 'lamp',
117         description 
118             "This is an exceptionally beautiful lantern, made of 
119             fired copper, and polished until it shines. About eleven 
120             inches high, with a base of about 5 inches or so in 
121             diameter and a large, brass-closed hook at the top. A 
122             rainbow of unique colors run through the copper. The 
123             glass in the lamp has a fresnel type of design, which is 
124             used to distribute light widely.",
125         time_left,
126         time_out [;
127             if (lantern has on) {
128                 lantern_fuel_left = 0;
129                 give lantern ~on;
130                 give lantern ~light;
131                 StopDaemon(lantern);
132                 print_ret 
133                     "Suddenly, the lantern's flame begins to flicker 
134                     violently within its glass prison and then 
135                     extinguishes itself.";
136             }
137         ],
138         before [;
139           SwitchOn:
140             if (lantern_fuel_left > 0) {
141                 give lantern light;
142                 StartTimer(lantern, lantern_fuel_left);
143             }
144             else {
145                 print_ret 
146                     "You snap the switch a few times, but nothing 
147                     happens.";
148             }
149           SwitchOff:
150             StopTimer(lantern);
151             give lantern ~light;
152         ],
153         daemon [;
154             if (lantern has on)
155                 lantern_fuel_left = lantern.time_left;
156             if (lantern has on && lantern_fuel_left <= 5)
157                 print_ret "The lantern's fuel runs low.";
158         ],
159   has   switchable;
160
161 Object  television "flat-screen TV" mainroom
162   with  name 'TV' 'television' 'flat' 'screen' 'flat-screen',
163   with  description 
164             "The flat-screen TV looks fairly modern but it's been 
165             broken in a fight and the screen is dangling out.",
166         before [;
167           Take, Pull, Push, PushDir, Turn:
168             print_ret (The) self, " is firmly mounted to the wall.";
169           SwitchOn:
170             if (television hasnt visited) {
171                 print 
172                     "Despite the significant damage, the television 
173                     comes to life in one last valiant attempt to be 
174                     useful. Your favorite news program is on: U.S. 
175                     News And Grue Report. The news anchor is giving a 
176                     warning of grue sightings in the area of the 
177                     forest before the television finally dies.^";
178                 give television visited;
179             }
180             else {
181                 print 
182                     "The flat-screen TV is broken and can't be 
183                     turned on.^";
184             }
185             return true;
186         ],
187   has   scenery switchable;
188
189 Object  lightsocket "light socket" mainroom
190   with  name 'socket' 'lightsocket',
191         before [;
192           Take, Pull, Push, PushDir, Turn:
193             print_ret 
194                 "You don't have the tools to remove a light 
195                 socket.";
196           Receive:
197             if (noun ~= lightbulb) {
198                 print "Put ";
199                 print (a) noun;
200                 print_ret 
201                     " into the light socket? Maybe you should come 
202                     with a warning label because you contain more than 
203                     a trace amount of nut.";
204             }
205             if (noun == lightbulb && lightbulb has on) {
206                 give mainroom light;
207                 give office light;
208                 give kitchenette light;
209                 give bedroom light;
210                 give eastofcabin light;
211                 give southofcabin light;
212             }
213         ],
214   has   scenery container transparent open;
215
216 Object  lightbulb "light bulb" lightsocket
217   with  name 'light' 'bulb' 'lightbulb',
218         before [;
219           SwitchOn:
220             if (lightbulb in lightsocket) {
221                 if (cabin_has_electricity == 1) {
222                     give mainroom light;
223                     give office light;
224                     give kitchenette light;
225                     give bedroom light;
226                     give eastofcabin light;
227                     give southofcabin light;
228                 }
229                 else {
230                     print_ret 
231                         "You flip the switch a few times, but nothing 
232                         happens.";
233                 }
234             }
235             else {
236                 print_ret 
237                     "Turn on a lightbulb when it's not in the 
238                     socket? What a strange idea.";
239             }
240         ],
241         after [;
242           Take, Pull, Push, PushDir, Turn, SwitchOff:
243             give lightbulb ~on;
244             give mainroom ~light;
245             give office ~light;
246             give kitchenette ~light;
247             give bedroom ~light;
248             give eastofcabin ~light;
249             give southofcabin ~light;
250         ],
251   has   switchable on;
252
253 Object  office "Office"
254   with  description 
255             "There seems to have been quite a fight in here. The room 
256             is a wreck. Holes are in the walls and the windows are 
257             broken, letting in the cold air from outside. Chunks of 
258             drywall and insulation cover the floor. The desk has a 
259             bullet hole through the middle.",
260         before [;
261           Go:
262             if (noun == e_obj) {
263                 if (snowshoes has worn)
264                     print_ret 
265                         "You can't fit through the window while 
266                         wearing the snow shoes.";
267             }
268         ],
269         w_to mainroom,
270         e_to window,
271   has   light;
272
273 Object  desk "solid oak desk" office
274   with  name 'solid' 'oak' 'desk',
275   with  description 
276             "The desk is old and made of solid oak. The right side of 
277             it has been smashed and all of the drawers have been 
278             removed. A bullet hole goes straight through the middle of 
279             the desk.",
280         before [;
281           Take, Pull, Push, PushDir, Turn:
282             print_ret (The) self, " is too heavy for that.";
283         ],
284   has   scenery supporter enterable;
285
286 Object  businesscard "business card" desk
287   with  name 'business' 'card',
288   with  description 
289             "The business card is white and has blacked edges. It 
290             bears the name ~Lasting Solutions~, a local data recovery 
291             company, in bold letters on the top. The company's 
292             website URL is printed in blue at the bottom.";
293
294 Object  salesreceipt "sales receipt" desk
295   with  name 'sales' 'receipt',
296   with  description 
297             "The sales receipt is for $200, dated three years ago. 
298             It's printed on old tractor feed printer paper and bears 
299             the name ~Lasting Solutions~, a local data recovery 
300             company. A handwritten note is scrawled on the bottom: 
301             ~Start working on these hard drives soon.~";
302
303 Object  computer "computer" desk
304   with  name 'computer' 'PC',
305   with  description 
306             "It's a heavy older model that appears to have been 
307             seriously damaged in a fight. It's clearly on its last 
308             legs but is perhaps still useful.",
309         before [;
310           Take, Pull, Push, PushDir, Turn:
311             print_ret (The) self, " is too heavy for that.";
312           SwitchOn:
313             if (computer hasnt visited) {
314                 print 
315                     "The computer makes some concerning noises while 
316                     lights on the front also illuminate. The last 
317                     file is quickly displayed. ~If anyone else reads 
318                     this, you're in serious danger. I've been fighting 
319                     a ferocious grue for the last three days. I'm 
320                     almost out of supplies and can't last much 
321                     longer. I'm going to take the last of the supplies 
322                     and escape through the office window in a 
323                     last-ditch effort to get away and get back into 
324                     town. I hope I can make it.~ The computer then 
325                     makes a sickly sound and finally dies as some 
326                     smoke comes out of it.^";
327                 give computer visited;
328             }
329             else {
330                 print 
331                     "The display briefly flickers but nothing 
332                     else happens.^";
333             }
334             return true;
335         ],
336   has   switchable;
337
338 Object  drywall "drywall" office
339   with  name 'drywall' 'dry' 'wall',
340         before [;
341           Take, Pull, Push, PushDir, Turn:
342             print_ret "Taking that would achieve little.";
343         ],
344   has   scenery;
345
346 Object  insulation "insulation" office
347   with  name 'insulation',
348         before [;
349           Take, Pull, Push, PushDir, Turn:
350             print_ret "Taking that would achieve little.";
351         ],
352   has   scenery;
353
354 Object  bullethole "bullet hole" desk
355   with  name 'bullet' 'hole' 'holes',
356   with  description 
357             "Looks to have come from something that's capable of 
358             doing a lot of damage.",
359         found_in desk bedroom,
360   has   scenery;
361
362 Object  window "window" office
363   with  name 'window' 'windows',
364         description 
365             "The window faces the east side of the cabin. It's broken, 
366             letting in the cold air from outside.",
367         short_name [;
368             if (location == office)
369                 print "window";
370             else
371                 print "window into the cabin";
372             return true;
373         ],
374         found_in office eastofcabin,
375         door_dir [;
376             if (location == office)
377                 return e_to;
378             else
379                 return w_to;
380         ],
381         door_to [;
382             if (location == office)
383                 return eastofcabin;
384             else
385                 return office;
386         ],
387         before [;
388           Search:
389             print_ret "The window faces the east side of the cabin.";
390           Open, Close:
391             print_ret 
392                 "The window's broken so it's not clear how 
393                 you'd do that.";
394         ],
395   has   scenery door openable open;
396
397 Object  kitchenette "Kitchenette"
398   with  description 
399             "The kitchenette is empty. A sink, you think, though it's 
400             hard to tell what's a pipe and what's a faucet. A 
401             refrigerator, standing open and empty. The door has been 
402             ripped off. There's no indication as to where it 
403             went. There's no food anywhere in here.",
404         e_to mainroom,
405   has   light;
406
407 Object  refrigerator "refrigerator" kitchenette
408   with  name 'fridge' 'refrigerator',
409   with  description 
410             "An old rusty refrigerator, standing open and empty. The 
411             door has been ripped off. There's no indication as to 
412             where it went.",
413         before [;
414           Take, Pull, Push, PushDir, Turn:
415             print_ret (The) self, " is too heavy for that.";
416           Open, Close:
417             print_ret (The) self, " door is missing.";
418         ],
419   has   scenery enterable container openable open;
420
421 Object  sink "sink" kitchenette
422   with  name 'sink' 'pipe' 'faucet',
423   with  description 
424             "A sink, you think, though it's hard to tell what's a 
425             pipe and what's a faucet.",
426         after [;
427           SwitchOn:
428             print_ret 
429                 "Pipes from in the walls make a groaning sound, 
430                 almost like pain and despair. No water comes out.";
431         ],
432   has   scenery container switchable;
433
434 Object  bedroom "Bedroom"
435   with  description 
436             "This bedroom is small and cramped, and looks like a 
437             major fight happened as the exterior wall has bullet 
438             holes. The bed is lying on the floor, torn to shreds. It 
439             has no sheets, just a bare mattress.",
440         s_to mainroom,
441   has   light;
442
443 Object  bed "bed" bedroom
444   with  name 'bed' 'mattress',
445   with  description "The mattress is bare and empty.",
446         before [;
447           Take, Pull, Push, PushDir, Turn:
448             print_ret (The) self, " is too heavy for that.";
449         ],
450   has   scenery supporter;
451
452 Object  suitcase "suitcase" bedroom
453   with  name 'suitcase' 'case',
454   with  description 
455             "The suitcase is made of a light metallic material that 
456             you can't quite make out. The color of it is somewhere 
457             between silver and grey.",
458   has   container open openable;
459
460 Object  snowsuit "snowsuit" suitcase
461   with  name 'snowsuit' 'snow' 'suit',
462   with  description 
463             "The snowsuit is blue, decorated with white and purple 
464             designs. On the chest are the letters ~CE~ in purple.",
465         before [;
466           Wear:
467             if (snowshoes in player && snowshoes has worn) {
468                 print_ret "The snowsuit can't fit over the snowshoes.";
469             }
470           Disrobe, Remove:
471             if (snowshoes in player && snowshoes has worn) {
472                 print_ret "The snowsuit can't be taken off over the snowshoes.";
473             }
474         ],
475         daemon [;
476             if (location ~= mainroom && location ~= office && location ~=
477             kitchenette && location ~= bedroom && location ~= thedark &&
478             snowsuit hasnt worn) {
479                 body_temperature = --body_temperature;
480             }
481             if (location == mainroom || location == office || location ==
482             kitchenette || location == bedroom || snowsuit has worn && body_temperature
483             < 20) {
484                 body_temperature = ++body_temperature;
485             }
486             if (body_temperature == 0) {
487                 deadflag = 4;
488             }
489             if (body_temperature <= 5)
490                 print_ret 
491                     "You're shivering uncontrollably, and it's hard 
492                     to move. You feel very exhausted and drowsy. It's 
493                     all you can do to keep from falling over.";
494             if (body_temperature > 5 && location ~= mainroom && location
495             ~= office && location ~= kitchenette && location ~= bedroom
496             && location ~= thedark && snowsuit hasnt worn) {
497                 switch (body_temperature) {
498                   19:
499                     "The feeling of cold overwhelms you. Surely the cold will get to 
500                     you before anything else does. Right?";
501                   18:
502                     "You can feel yourself getting colder and colder.";
503                   17:
504                     "You can see your own breath freezing in the air, forming little 
505                     clouds.";
506                   16:
507                     "You shiver in the cold.";
508                   15:
509                     "You continue to shiver in the cold.";
510                   14:
511                     "Your hands grow numb from the cold.";
512                   13:
513                     "You continue shivering in order to keep warm.";
514                   12:
515                     "Your shivering grows worse as your body becomes colder by the
516                     minute.";
517                   11:
518                     "Your teeth begin to chatter as you desperately try to warm 
519                     yourself up.";
520                   10:
521                     "Your shivering intensifies as your body begins to freeze over 
522                     from the cold.";
523                   9:
524                     "Your fingers become stiff and you feel sharp pains all over your
525                     body.";
526                   8:
527                     "The cold has gotten to a point where it is too much for you. You 
528                     begin to shiver uncontrollably.";
529                   7:
530                     "Your eyesight begins to fade and you can't even feel yourself 
531                     shivering anymore.";
532                   6:
533                     "You can feel your body shutting down from the cold as you slowly 
534                     begin to lose consciousness.";
535                 }
536             }
537         ],
538   has   clothing;
539
540 Object  snowshoes "snowshoes" bedroom
541   with  name 'snowshoe' 'snowshoes' 'snow' 'boot' 'boots' 'shoe' 'shoes'
542         'metal' 'frame',
543   with  description 
544             "They're light blue in color and have a thick, hard 
545             rubber bottom that's attached to a metal frame that keeps 
546             you from sinking into the snow. They look to be warm and 
547             comfortable.",
548         after [;
549           Wear:
550             print_ret (The) self, 
551                 " fit perfectly and go up to your 
552                 knees.";
553         ],
554         daemon [;
555             if (location ~= mainroom && location ~= office && location ~=
556             kitchenette && location ~= bedroom && location ~= thedark &&
557             location ~= eastofcabin && snowshoes hasnt worn) {
558                 deadflag = 3;
559             }
560         ],
561   has   pluralname clothing;
562
563 Object  southofcabin "South Of Cabin"
564   with  description [;
565             print 
566                 "The wind is howling, and there's snow flying 
567                 everywhere. ";
568             if (snowsuit hasnt worn)
569                 print 
570                     "It's really cold and you're not dressed for 
571                     this weather. ";
572             ! if (frontdoor has open) {
573             check_for_cabin_lighting();
574             ! }
575             if (snowshoes has worn && lantern in player && eastofcabin hasnt
576             visited && lantern_fuel_left > 0) {
577                 throw_rock();
578                 print "^";
579             }
580         ],
581         n_to frontdoor,
582         s_to forest,
583         e_to eastofcabin,
584         w_to westofcabin,
585   has   light;
586
587 Object  truckspot "Forest"
588   with  description 
589             "The blizzard is still going on. You don't think it's 
590             letting up anytime soon. There is a blue and white 
591             pickup truck here. It looks like it got stuck in the snow 
592             and is slowly being covered by it. The windows are iced 
593             up and you can't see inside.",
594         before [;
595           Go:
596             forest_location = forest_location++;
597             PlayerTo(forest, 1);
598         ];
599
600 Object  truck "blue and white pickup truck" truckspot
601   with  name 'pickup' 'truck' 'door' 'doors',
602   with  description 
603             "The blue and white pickup truck looks old and battered. 
604             The paint has chipped and faded. The windows are iced up 
605             and you can't see inside.",
606         before [;
607           Take, Pull, Push, PushDir, Turn:
608             print_ret (The) self, " is too heavy for that.";
609           Search:
610             print_ret 
611                 "The windows are iced up and you can't see 
612                 inside.";
613           Enter, Open, GoIn:
614             print_ret (The) self, " is frozen shut.";
615         ],
616   has   scenery supporter enterable openable;
617
618 Object  backpacklocation "Forest"
619   with  description 
620             "You keep walking and walking. The snowfall is still as 
621             heavy as ever. As you continue trudging through the snow, 
622             you wonder if you're actually moving in the right 
623             direction. You can't see anything through the blizzard. 
624             You wonder if you might be going in circles and end up 
625             wandering around forever, never finding your way out of 
626             this white void. You're unsure of which way to go. The 
627             snowfall is so thick that you can barely see your hand if 
628             you hold it right in front of your face. You have no idea 
629             how far you've come or in what direction.",
630         before [;
631           Go:
632             forest_location = forest_location++;
633             PlayerTo(forest, 1);
634         ];
635
636 Object  backpack "backpack" backpacklocation
637   with  name 'backpack' 'back' 'pack' 'blood',
638   with  description 
639             "The backpack is of medium size, black, with three white 
640             stripes running vertically on the back. The middle stripe 
641             is broken up by a red line running down the center of it 
642             toward the bottom of the backpack. On the side are the 
643             letters ~CE~ in purple. The backpack is covered in blood, 
644             as if the owner met with an untimely demise.",
645   has   clothing container openable;
646
647 Object  flashlight "flashlight" backpack
648   with  name 'flashlight' 'flash' 'light' 'torch',
649         description 
650             "It looks like a cheap red plastic model, about eight 
651             inches long.",
652         before [;
653           SwitchOn:
654             give flashlight light;
655           SwitchOff:
656             give lantern ~light;
657         ],
658   has   switchable;
659
660 [ print_forest_description;
661     if (location ~= thedark) {
662         switch (forest_location) {
663           1:
664             print_ret 
665                 "You push on despite the bitter cold and the heavy 
666                 snowfall as you come to a fork. There are two ways to 
667                 go here, one involves a hill to the south. The 
668                 other way is continuing through the woods to the 
669                 north.";
670           2:
671             print_ret 
672                 "The wind is bitterly cold. You plow through the 
673                 snowfall, which is still as heavy as ever. You can 
674                 barely see where you are going, making it hard to 
675                 tell which direction is which. Out of the corner of 
676                 your eye, you spot a tall, shadowy figure lingering 
677                 at the edge of your vision. When you turn to look at 
678                 it directly, however, it disappears. You continue 
679                 walking. The wind is howling louder than ever. The 
680                 endless snowfall makes it difficult to see where 
681                 you're going. You can't tell where the white sky and 
682                 white ground begin and end.";
683           3:
684             PlayerTo(truckspot);
685           4:
686             print_ret 
687                 "You trudge through the snow. The wind is really 
688                 strong and howling like a banshee. You hear a horrible 
689                 howl in the distance or is it the wind? Looking 
690                 around you see nothing in this barren landscape but 
691                 snow. You're not sure what to make of it, but you 
692                 don't want to stick around to find out. The whole 
693                 world is white. You can barely see five feet ahead of 
694                 you. You hope you're going the right way. This place 
695                 is so desolate and barren.";
696           5:
697             print_ret 
698                 "You think you might can see a large figure stepping 
699                 out of the trees and moving in the distance but the 
700                 wind is blowing hard and whipping up massive amounts 
701                 of snow, making it hard to tell for sure. Your breath 
702                 billows out in huge clouds. If it keeps blowing like 
703                 this, you're not sure if you'll ever be able to get 
704                 back. Snow whirls through the air as a gust of wind 
705                 picks up speed. The howling gets louder and more 
706                 intense. There's no left, right, backward or forward. 
707                 There's nothing but endless, unchanging whiteness.";
708           6:
709             PlayerTo(backpacklocation);
710           7:
711             print_ret 
712                 "It feels like you're lost in a maze of snow without 
713                 a map. You keep trudging through the heavy snowfall, 
714                 not knowing if you're even going in any particular 
715                 direction anymore. The wind is really picking up now 
716                 and the snowfall is getting heavier. You have to keep 
717                 going. You can't let the snowstorm get the best of 
718                 you. You can't give up. You must find a way out of 
719                 this frozen wasteland. The snowstorm has made it 
720                 impossible to see anything more than a few feet in 
721                 front of you.";
722           8:
723             print_ret 
724                 "The wind is now a shrieking banshee, freezing and 
725                 relentless, as it throws the snow into your face, 
726                 blinding you. It's hard to walk against the brutal 
727                 winds. You can't see anything, but you must keep 
728                 going. There is no choice. You continue your way 
729                 through the snowy white void, what with the snow 
730                 piling up around you. The wind screams in your ears 
731                 and you can't see anything. Can't go back. Can't go 
732                 forward. You can't even see where you are. You hope 
733                 that, as long as you keep moving, you'll eventually 
734                 find a way out of this frozen wasteland.";
735           9:
736             print_ret 
737                 "The blizzard rages, but you continue to press on. 
738                 There's nothing here but you, the snowfall, and the 
739                 fierce wind howling through this frozen landscape. 
740                 This isn't just a place of cold and ice - it's 
741                 other-worldly. You trudge on and try to keep your 
742                 spirits up and not let the snowstorm get to you. Every 
743                 step is an effort. You wish you had the powers of a 
744                 superhero right now. You can barely see where you are 
745                 going. The wind knocks you down on your hands and 
746                 knees. You get back up, but you're slipping and 
747                 sliding all over the place.";
748           10:
749             print_ret 
750                 "You wander around in the impenetrable white void. 
751                 The wind is howling louder than ever. You try to 
752                 persevere. You don't know if you're going in circles 
753                 or what, but you start to feel that this frozen, 
754                 lifeless landscape is sucking away your very life 
755                 force. You can't see your hand in front of your face. 
756                 You can barely keep moving. Every step you take is 
757                 hard-fought. You just want this awful nightmare to 
758                 end. You begin to feel sleepy but you're in danger 
759                 here. You have to keep moving. Sleep is not an option 
760                 when you're in a place like this.";
761           11:
762             print_ret 
763                 "You try to remember the survival tips you've read 
764                 on the internet, but frankly, you don't remember most 
765                 of them right now. As you walk you try to keep your 
766                 mind occupied with anything other than the storm. 
767                 Nothing makes any sense and you feel like you're 
768                 starting to go in circles. The wind starts starts to 
769                 pick up as it begins howling louder than ever. You're 
770                 determined to live but the blizzard doesn't seem to 
771                 care whether you live or die. It just keeps howling 
772                 and shrieking. It's not getting any easier to move in 
773                 this blizzard.";
774           12:
775             print_ret 
776                 "You keep walking. The snow is drifting and piling 
777                 up around you, making movement almost impossible. You 
778                 look around the barren landscape, but there's nothing 
779                 nearby except snow. It's almost as if you're lost in 
780                 a white, endless void. You start to get disoriented. 
781                 You don't even know if you're walking in a circle or 
782                 not. The situation is looking very grim. Your life 
783                 feels as if it is slowly ebbing away in the 
784                 relentless grip of the snowstorm. It feels like 
785                 you've been wandering for hours, but that's probably 
786                 just your perception of time slipping away.";
787           13:
788             print_ret 
789                 "You can barely see anything, and you stumble 
790                 forward. You could be wandering aimlessly in any 
791                 direction right now and you wouldn't know the 
792                 difference. It's as if you're in a sea of white. 
793                 You're not sure that you're going in the right 
794                 direction but you can't stop now. There has to be 
795                 something here besides endless snow. You know that 
796                 staying here is a death sentence. You have to escape. 
797                 You're cold, tired, miserable, and desperate to get 
798                 out of this mess. You have no idea where you are. You 
799                 keep wandering through endless whiteness. You won't 
800                 give up.";
801           14:
802             deadflag = 2;
803             print_ret 
804                 "You see something in the distance but can't make it 
805                 out. You walk toward it to find out that it's the 
806                 hotel. You collapse in the lobby as the hotel staff 
807                 rush over to you.";
808         }
809     }
810 ];
811
812 Object  forest "Forest"
813   with  description [;
814             print_forest_description();
815         ],
816         before [;
817           Go:
818             if (location == thedark) {
819                 DarkToDark();
820             }
821             if (noun == d_obj || noun == u_obj) {
822                 print_ret "You can't go that way.";
823             }
824             forest_location = forest_location++;
825         ],
826         cant_go print_forest_description;
827
828 [ throw_rock;
829     if (television has visited || computer has visited) {
830         print 
831             "The grue is waiting behind a snowbank in
832             the distance, away from the light. ";
833     }
834     print 
835         "From somewhere off in the dark distance, far away from the 
836         light, a rock is hurled in your direction. It hits the 
837         lantern, breaking it, and putting it out of commission. ";
838     give lantern ~on;
839     give lantern ~light;
840     lantern_fuel_left = 0;
841     StopDaemon(lantern);
842 ];
843
844 [ check_for_cabin_lighting;
845     if (lightbulb has on) {
846         print 
847             "The light from inside the cabin only penetrates a few 
848             feet from the building. ";
849     }
850     else
851         if (lantern in player && lantern has on) {
852             print 
853                 "The lantern provides the only source of 
854                 light. ";
855         }
856     if (location has light)
857         print 
858             "The snow stings your face and you can barely see three feet in 
859             front of you. ";
860     if (snowshoes in player && snowshoes has worn) {
861         print 
862             "The snowshoes are doing their job by making sure 
863             you don't sink into the snow. ";
864     }
865     print "^";
866 ];
867
868 Object  eastofcabin "East Of Cabin"
869   with  description [;
870             print "It's dark outside. ";
871             check_for_cabin_lighting();
872             if (cabin_has_electricity == 1 && lantern in player && lantern_fuel_left
873             > 0) {
874                 throw_rock();
875                 print "^";
876             }
877         ],
878         w_to window,
879         s_to southofcabin,
880   has   light;
881
882 Object  westofcabin "West Of Cabin"
883   with  description 
884             "The snow is falling so fast that you can barely see 
885             anything. You can't even be sure you're going in the right 
886             direction.",
887         s_to southofcabin,
888   has   light;
889
890 [ Initialise;
891     Location = mainroom;
892     thedark.description = 
893         "It is pitch black. You are likely to be eaten 
894         by a grue.";
895     print 
896         "You're trapped in a snowstorm while visiting the forest 
897         during your vacation to a small rural town. This is the worst 
898         snowstorm in more than 40 years. If only you had listened to 
899         the news. Well, it's too late for that. The snow has been 
900         falling for the past seven hours and shows no signs of 
901         stopping anytime soon. You need to get back to your hotel in 
902         the town. You finally manage to find an old cabin in the 
903         woods and get inside but have no idea where you are. You're 
904         not dressed for this weather, and it's getting dark outside.^";
905     StartDaemon(lantern);
906     StartDaemon(snowshoes);
907     StartDaemon(snowsuit);
908     StartDaemon(grue);
909 ];
910
911 [ DeathMessage;
912     if (deadflag == 3)
913         print "You sink into the deep snow and are unable to move.";
914     if (deadflag == 4)
915         print 
916             "Finally, you succumb to the cold. Your mind goes blank as 
917             you slip away into the endless darkness and the deep sleep 
918             of death.";
919 ];
920
921 ! Don't have 'take all' take the lightbulb in the mainroom of the 
922 ! cabin
923
924 [ ChooseObjects obj code;
925     if (code < 2) {
926         if (obj has scenery)
927             return 2;
928         rfalse;
929     }
930     if (obj == lightbulb)
931         return 0;
932 ];
933
934 [ InScope;
935     if (location == thedark && real_location == mainroom) {
936         PlaceInScope(lightsocket);
937         PlaceInScope(lightbulb);
938     }
939     return false;
940 ];
941
942 Object  grue "grue" thedark
943   with  article "the",
944         name 'grue' 'monster',
945         grue_active_around_cabin,
946         grue_active_in_the_dark,
947         daemon [;
948             if (location == thedark) {
949                 switch (++(self.grue_active_in_the_dark)) {
950                   1:
951                     "^You hear horrible gurgling sounds in the dark.";
952                   2:
953                     "^You hear the clink of razor-sharp claws nearby.";
954                   3:
955                     deadflag = 1;
956                     "^Your last memory is of the slavering fangs of the 
957                     horrible Grue as it claims you for a meal.";
958                 }
959             }
960             if (location == mainroom || location == office || location ==
961             kitchenette || location == bedroom) {
962                 switch (++(self.grue_active_around_cabin)) {
963                   1:
964                     "^You hear the wind howling outside, if it is the wind.";
965                   2:
966                     "^You hear horrible gurgling sounds outside.";
967                   3:
968                     "^The noise outside gets louder.";
969                   4:
970                     "^You hear the sound of shuffling feet outside.";
971                   5:
972                     "^You hear something sniffing around the cabin.";
973                   6:
974                     "^You hear a deep guttural sound from outside that sends a chill down your spine.";
975                   7:
976                     "^You hear something scratching on the cabin walls from outside.";
977                   8:
978                     "^You hear something howl outside. It's a chilling, mournful wail that sends a chill down your spine.";
979                   9:
980                     "^A thunderous CRACK can be heard coming from outside.";
981                   10:
982                     "^There's a sudden crashing sound as something is thrown against the cabin walls.";
983                   11:
984                     "^Something begins to beat against the walls of the cabin, as if trying to to break in. It makes a loud, thunderous noise.";
985                   12:
986                     "^The wind is howling and the walls are being beaten so hard it feels like the cabin is shaking.";
987                   13:
988                     "^Suddenly, there's ominous silence from outside the cabin.";
989                 }
990             }
991             if (location == mainroom || location == office || location ==
992             kitchenette || location == bedroom && self.grue_active_around_cabin
993             == 15) {
994                 print "^The lights flicker and suddenly go out.^";
995                 cabin_has_electricity = 0;
996                 give lightbulb ~on;
997                 give mainroom ~light;
998                 give office ~light;
999                 give kitchenette ~light;
1000                 give bedroom ~light;
1001                 give eastofcabin ~light;
1002                 give southofcabin ~light;
1003             }
1004             return true;
1005         ],
1006   has   scenery;
1007
1008 [ DarkToDark;
1009     deadflag = 1;
1010     "Oh, no! You have walked into the slavering fangs of a lurking 
1011     grue!";
1012 ];
1013
1014 [ URL;
1015     print 
1016         "^If you need help try some of the commands from: 
1017         ^http://pr-if.org/doc/play-if-card/^";
1018 ];
1019
1020 [ XyzzySub;
1021     print "Nothing obvious happens.^";
1022     return true;
1023 ];
1024
1025 [ HelpSub;
1026     URL();
1027     return true;
1028 ];
1029
1030 Include "grammar";
1031
1032 Verb 'About'
1033     * -> Version;
1034
1035 Verb 'Info'
1036     * -> Version;
1037
1038 Verb 'Help'
1039     * -> Help;
1040
1041 Verb 'Clue'
1042     * -> Help;
1043
1044 Verb 'Hint'
1045     * -> Help;
1046
1047 Verb 'xyzzy'
1048     * -> Xyzzy;
1049
1050 Verb 'crawl'
1051     * 'through' / 'out' / 'via' noun -> Go;
1052
1053 Verb 'escape'
1054     * 'through' / 'out' / 'via' noun -> Go;
1055
1056 Extend 'jump'
1057     * 'through' / 'out' / 'via' noun -> Go;
1058
1059 Extend 'climb'
1060     * 'through' / 'out' / 'via' noun -> Go;
1061
1062 Extend 'go'
1063     * 'through' / 'out' / 'via' noun -> Go;