Update to serial 220529
[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 && light 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) {
577                 throw_rock();
578             }
579         ],
580         n_to frontdoor,
581         s_to forest,
582         e_to eastofcabin,
583         w_to westofcabin,
584   has   light;
585
586 Object  truckspot "Forest"
587   with  description 
588             "The blizzard is still going on. You don't think it's 
589             letting up anytime soon. There is a blue and white 
590             pickup truck here. It looks like it got stuck in the snow 
591             and is slowly being covered by it. The windows are iced 
592             up and you can't see inside.",
593         before [;
594           Go:
595             forest_location = forest_location++;
596             PlayerTo(forest, 1);
597         ];
598
599 Object  truck "blue and white pickup truck" truckspot
600   with  name 'pickup' 'truck' 'door' 'doors',
601   with  description 
602             "The blue and white pickup truck looks old and battered. 
603             The paint has chipped and faded. The windows are iced up 
604             and you can't see inside.",
605         before [;
606           Take, Pull, Push, PushDir, Turn:
607             print_ret (The) self, " is too heavy for that.";
608           Search:
609             print_ret 
610                 "The windows are iced up and you can't see 
611                 inside.";
612           Enter, Open, GoIn:
613             print_ret (The) self, " is frozen shut.";
614         ],
615   has   scenery supporter enterable openable;
616
617 Object  backpacklocation "Forest"
618   with  description 
619             "You keep walking and walking. The snowfall is still as 
620             heavy as ever. As you continue trudging through the snow, 
621             you wonder if you're actually moving in the right 
622             direction. You can't see anything through the blizzard. 
623             You wonder if you might be going in circles and end up 
624             wandering around forever, never finding your way out of 
625             this white void. You're unsure of which way to go. The 
626             snowfall is so thick that you can barely see your hand if 
627             you hold it right in front of your face. You have no idea 
628             how far you've come or in what direction.",
629         before [;
630           Go:
631             forest_location = forest_location++;
632             PlayerTo(forest, 1);
633         ];
634
635 Object  backpack "backpack" backpacklocation
636   with  name 'backpack' 'back' 'pack' 'blood',
637   with  description 
638             "The backpack is of medium size, black, with three white 
639             stripes running vertically on the back. The middle stripe 
640             is broken up by a red line running down the center of it 
641             toward the bottom of the backpack. On the side are the 
642             letters ~CE~ in purple. The backpack is covered in blood, 
643             as if the owner met with an untimely demise.",
644   has   clothing container openable;
645
646 Object  flashlight "flashlight" backpack
647   with  name 'flashlight' 'flash' 'light' 'torch',
648         description 
649             "It looks like a cheap red plastic model, about eight 
650             inches long.",
651         before [;
652           SwitchOn:
653             give flashlight light;
654           SwitchOff:
655             give lantern ~light;
656         ],
657   has   switchable;
658
659 [ print_forest_description;
660     if (location ~= thedark) {
661         switch (forest_location) {
662           1:
663             print_ret 
664                 "You push on despite the bitter cold and the heavy 
665                 snowfall as you come to a fork. There are two ways to 
666                 go here, one involves a hill to the south. The 
667                 other way is continuing through the woods to the 
668                 north.";
669           2:
670             print_ret 
671                 "The wind is bitterly cold. You plow through the 
672                 snowfall, which is still as heavy as ever. You can 
673                 barely see where you are going, making it hard to 
674                 tell which direction is which. Out of the corner of 
675                 your eye, you spot a tall, shadowy figure lingering 
676                 at the edge of your vision. When you turn to look at 
677                 it directly, however, it disappears. You continue 
678                 walking. The wind is howling louder than ever. The 
679                 endless snowfall makes it difficult to see where 
680                 you're going. You can't tell where the white sky and 
681                 white ground begin and end.";
682           3:
683             PlayerTo(truckspot);
684           4:
685             print_ret 
686                 "You trudge through the snow. The wind is really 
687                 strong and howling like a banshee. You hear a horrible 
688                 howl in the distance or is it the wind? Looking 
689                 around you see nothing in this barren landscape but 
690                 snow. You're not sure what to make of it, but you 
691                 don't want to stick around to find out. The whole 
692                 world is white. You can barely see five feet ahead of 
693                 you. You hope you're going the right way. This place 
694                 is so desolate and barren.";
695           5:
696             print_ret 
697                 "You think you might can see a large figure stepping 
698                 out of the trees and moving in the distance but the 
699                 wind is blowing hard and whipping up massive amounts 
700                 of snow, making it hard to tell for sure. Your breath 
701                 billows out in huge clouds. If it keeps blowing like 
702                 this, you're not sure if you'll ever be able to get 
703                 back. Snow whirls through the air as a gust of wind 
704                 picks up speed. The howling gets louder and more 
705                 intense. There's no left, right, backward or forward. 
706                 There's nothing but endless, unchanging whiteness.";
707           6:
708             PlayerTo(backpacklocation);
709           7:
710             print_ret 
711                 "It feels like you're lost in a maze of snow without 
712                 a map. You keep trudging through the heavy snowfall, 
713                 not knowing if you're even going in any particular 
714                 direction anymore. The wind is really picking up now 
715                 and the snowfall is getting heavier. You have to keep 
716                 going. You can't let the snowstorm get the best of 
717                 you. You can't give up. You must find a way out of 
718                 this frozen wasteland. The snowstorm has made it 
719                 impossible to see anything more than a few feet in 
720                 front of you.";
721           8:
722             print_ret 
723                 "The wind is now a shrieking banshee, freezing and 
724                 relentless, as it throws the snow into your face, 
725                 blinding you. It's hard to walk against the brutal 
726                 winds. You can't see anything, but you must keep 
727                 going. There is no choice. You continue your way 
728                 through the snowy white void, what with the snow 
729                 piling up around you. The wind screams in your ears 
730                 and you can't see anything. Can't go back. Can't go 
731                 forward. You can't even see where you are. You hope 
732                 that, as long as you keep moving, you'll eventually 
733                 find a way out of this frozen wasteland.";
734           9:
735             print_ret 
736                 "The blizzard rages, but you continue to press on. 
737                 There's nothing here but you, the snowfall, and the 
738                 fierce wind howling through this frozen landscape. 
739                 This isn't just a place of cold and ice - it's 
740                 other-worldly. You trudge on and try to keep your 
741                 spirits up and not let the snowstorm get to you. Every 
742                 step is an effort. You wish you had the powers of a 
743                 superhero right now. You can barely see where you are 
744                 going. The wind knocks you down on your hands and 
745                 knees. You get back up, but you're slipping and 
746                 sliding all over the place.";
747           10:
748             print_ret 
749                 "You wander around in the impenetrable white void. 
750                 The wind is howling louder than ever. You try to 
751                 persevere. You don't know if you're going in circles 
752                 or what, but you start to feel that this frozen, 
753                 lifeless landscape is sucking away your very life 
754                 force. You can't see your hand in front of your face. 
755                 You can barely keep moving. Every step you take is 
756                 hard-fought. You just want this awful nightmare to 
757                 end. You begin to feel sleepy but you're in danger 
758                 here. You have to keep moving. Sleep is not an option 
759                 when you're in a place like this.";
760           11:
761             print_ret 
762                 "You try to remember the survival tips you've read 
763                 on the internet, but frankly, you don't remember most 
764                 of them right now. As you walk you try to keep your 
765                 mind occupied with anything other than the storm. 
766                 Nothing makes any sense and you feel like you're 
767                 starting to go in circles. The wind starts starts to 
768                 pick up as it begins howling louder than ever. You're 
769                 determined to live but the blizzard doesn't seem to 
770                 care whether you live or die. It just keeps howling 
771                 and shrieking. It's not getting any easier to move in 
772                 this blizzard.";
773           12:
774             print_ret 
775                 "You keep walking. The snow is drifting and piling 
776                 up around you, making movement almost impossible. You 
777                 look around the barren landscape, but there's nothing 
778                 nearby except snow. It's almost as if you're lost in 
779                 a white, endless void. You start to get disoriented. 
780                 You don't even know if you're walking in a circle or 
781                 not. The situation is looking very grim. Your life 
782                 feels as if it is slowly ebbing away in the 
783                 relentless grip of the snowstorm. It feels like 
784                 you've been wandering for hours, but that's probably 
785                 just your perception of time slipping away.";
786           13:
787             print_ret 
788                 "You can barely see anything, and you stumble 
789                 forward. You could be wandering aimlessly in any 
790                 direction right now and you wouldn't know the 
791                 difference. It's as if you're in a sea of white. 
792                 You're not sure that you're going in the right 
793                 direction but you can't stop now. There has to be 
794                 something here besides endless snow. You know that 
795                 staying here is a death sentence. You have to escape. 
796                 You're cold, tired, miserable, and desperate to get 
797                 out of this mess. You have no idea where you are. You 
798                 keep wandering through endless whiteness. You won't 
799                 give up.";
800           14:
801             deadflag = 2;
802             print_ret 
803                 "You see something in the distance but can't make it 
804                 out. You walk toward it to find out that it's the 
805                 hotel. You collapse in the lobby as the hotel staff 
806                 rush over to you.";
807         }
808     }
809 ];
810
811 Object  forest "Forest"
812   with  description [;
813             print_forest_description();
814         ],
815         before [;
816           Go:
817             if (location == thedark) {
818                 DarkToDark();
819             }
820             if (noun == d_obj || noun == u_obj) {
821                 print_ret "You can't go that way.";
822             }
823             forest_location = forest_location++;
824         ],
825         cant_go print_forest_description;
826
827 [ throw_rock;
828     if (television has visited || computer has visited) {
829         print 
830             "The grue is waiting behind a snowbank in
831             the distance, away from the light. ";
832     }
833     print 
834         "From somewhere off in the dark distance, far away from the 
835         light, a rock is hurled in your direction. It hits the 
836         lantern, breaking it, and putting it out of commission. ";
837     give lantern ~on;
838     give lantern ~light;
839     lantern_fuel_left = 0;
840     StopDaemon(lantern);
841 ];
842
843 [ check_for_cabin_lighting;
844     if (lightbulb has on) {
845         print 
846             "The light from inside the cabin only penetrates a few 
847             feet from the building. ";
848     }
849     else
850         if (lantern in player && lantern has on) {
851             print 
852                 "The lantern provides the only source of 
853                 light. ";
854         }
855     if (location has light)
856         print 
857             "The snow stings your face and you can barely see three feet in 
858             front of you. ";
859     if (snowshoes in player && snowshoes has worn) {
860         print 
861             "The snowshoes are doing their job by making sure 
862             you don't sink into the snow. ";
863     }
864     print "^";
865 ];
866
867 Object  eastofcabin "East Of Cabin"
868   with  description [;
869             print "It's dark outside. ";
870             check_for_cabin_lighting();
871             if (cabin_has_electricity == 1 && lantern in player) {
872                 throw_rock();
873             }
874         ],
875         w_to window,
876         s_to southofcabin,
877   has   light;
878
879 Object  westofcabin "West Of Cabin"
880   with  description 
881             "The snow is falling so fast that you can barely see 
882             anything. You can't even be sure you're going in the right 
883             direction.",
884         s_to southofcabin,
885   has   light;
886
887 [ Initialise;
888     Location = mainroom;
889     thedark.description = 
890         "It is pitch black. You are likely to be eaten 
891         by a grue.";
892     print 
893         "You're trapped in a snowstorm while visiting the forest 
894         during your vacation to a small rural town. This is the worst 
895         snowstorm in more than 40 years. If only you had listened to 
896         the news. Well, it's too late for that. The snow has been 
897         falling for the past seven hours and shows no signs of 
898         stopping anytime soon. You need to get back to your hotel in 
899         the town. You finally manage to find an old cabin in the 
900         woods and get inside but have no idea where you are. You're 
901         not dressed for this weather, and it's getting dark outside.^";
902     StartDaemon(lantern);
903     StartDaemon(snowshoes);
904     StartDaemon(snowsuit);
905     StartDaemon(grue);
906 ];
907
908 [ DeathMessage;
909     if (deadflag == 3)
910         print "You sink into the deep snow and are unable to move.";
911     if (deadflag == 4)
912         print 
913             "Finally, you succumb to the cold. Your mind goes blank as 
914             you slip away into the endless darkness and the deep sleep 
915             of death.";
916 ];
917
918 ! Don't have 'take all' take the lightbulb in the mainroom of the 
919 ! cabin
920
921 [ ChooseObjects obj code;
922     if (code < 2) {
923         if (obj has scenery)
924             return 2;
925         rfalse;
926     }
927     if (obj == lightbulb)
928         return 0;
929 ];
930
931 [ InScope;
932     if (location == thedark && real_location == mainroom) {
933         PlaceInScope(lightsocket);
934         PlaceInScope(lightbulb);
935     }
936     return false;
937 ];
938
939 Object  grue "grue" thedark
940   with  article "the",
941         name 'grue' 'monster',
942         grue_active_around_cabin,
943         grue_active_in_the_dark,
944         daemon [;
945             if (location == thedark) {
946                 switch (++(self.grue_active_in_the_dark)) {
947                   1:
948                     "^You hear horrible gurgling sounds in the dark.";
949                   2:
950                     "^You hear the clink of razor-sharp claws nearby.";
951                   3:
952                     deadflag = 1;
953                     "^Your last memory is of the slavering fangs of the 
954                     horrible Grue as it claims you for a meal.";
955                 }
956             }
957             if (location == mainroom || location == office || location ==
958             kitchenette || location == bedroom) {
959                 switch (++(self.grue_active_around_cabin)) {
960                   1:
961                     "^You hear the wind howling outside, if it is the wind.";
962                   2:
963                     "^You hear horrible gurgling sounds outside.";
964                   3:
965                     "^The noise outside gets louder.";
966                   4:
967                     "^You hear the sound of shuffling feet outside.";
968                   5:
969                     "^You hear something sniffing around the cabin.";
970                   6:
971                     "^You hear a deep guttural sound from outside that sends a chill down your spine.";
972                   7:
973                     "^You hear something scratching on the cabin walls from outside.";
974                   8:
975                     "^You hear something howl outside. It's a chilling, mournful wail that sends a chill down your spine.";
976                   9:
977                     "^A thunderous CRACK can be heard coming from outside.";
978                   10:
979                     "^There's a sudden crashing sound as something is thrown against the cabin walls.";
980                   11:
981                     "^Something begins to beat against the walls of the cabin, as if trying to to break in. It makes a loud, thunderous noise.";
982                   12:
983                     "^The wind is howling and the walls are being beaten so hard it feels like the cabin is shaking.";
984                   13:
985                     "^Suddenly, there's ominous silence from outside the cabin.";
986                 }
987             }
988             if (location == mainroom || location == office || location ==
989             kitchenette || location == bedroom && self.grue_active_around_cabin
990             == 15) {
991                 print "^The lights flicker and suddenly go out.^";
992                 cabin_has_electricity = 0;
993                 give lightbulb ~on;
994                 give mainroom ~light;
995                 give office ~light;
996                 give kitchenette ~light;
997                 give bedroom ~light;
998                 give eastofcabin ~light;
999                 give southofcabin ~light;
1000             }
1001             return true;
1002         ],
1003   has   scenery;
1004
1005 [ DarkToDark;
1006     deadflag = 1;
1007     "Oh, no! You have walked into the slavering fangs of a lurking 
1008     grue!";
1009 ];
1010
1011 [ URL;
1012     print 
1013         "^If you need help try some of the commands from: 
1014         ^http://pr-if.org/doc/play-if-card/^";
1015 ];
1016
1017 [ XyzzySub;
1018     print "Nothing obvious happens.^";
1019     return true;
1020 ];
1021
1022 [ HelpSub;
1023     URL();
1024     return true;
1025 ];
1026
1027 Include "grammar";
1028
1029 Verb 'About'
1030     * -> Version;
1031
1032 Verb 'Info'
1033     * -> Version;
1034
1035 Verb 'Help'
1036     * -> Help;
1037
1038 Verb 'Clue'
1039     * -> Help;
1040
1041 Verb 'Hint'
1042     * -> Help;
1043
1044 Verb 'xyzzy'
1045     * -> Xyzzy;
1046
1047 Verb 'crawl'
1048     * 'through' / 'out' / 'via' noun -> Go;
1049
1050 Verb 'escape'
1051     * 'through' / 'out' / 'via' noun -> Go;
1052
1053 Extend 'jump'
1054     * 'through' / 'out' / 'via' noun -> Go;
1055
1056 Extend 'climb'
1057     * 'through' / 'out' / 'via' noun -> Go;
1058
1059 Extend 'go'
1060     * 'through' / 'out' / 'via' noun -> Go;