Import of Release 1
[rfk-inform.git] / kitten.inf
1 ! Robot Finds Kitten
2 ! A Zen Simulation
3 ! Release 1 / Serial number 021123 / Inform v6.21
4 !
5 !     [-]       |\_/|        http://www.robotfindskitten.org
6 !     (+)={     |o o|__      Leonard Richardson (C) 1997, 2000
7 !     | |       --*--__\     David Griffith (C) 2002  (Inform Edition)
8 !     OOO       C_C(___)
9 !
10 !
11 ! This Zen simulation is based on the C version v1600003.248b
12 ! by Leonard Richardson (C) 1997, 2000.
13 ! Written originally for the Nerth Pork robotfindskitten contest.
14 ! Reimplemented in Inform by David Griffith (C) 2002.
15 !
16 ! Lots more information on Robot Finds Kitten is available at
17 ! http://www.robotfindskitten.org.
18 !
19 !
20 ! In this game, you are Robot (#).  Your job is to find Kitten.  This
21 ! task is complicated by the existance of various things which are not
22 ! kitten.  Robot must touch items to determine if they are Kitten or
23 ! not.  Move Robot with the cursor keys, the numeric keypad, or
24 ! using the vi/rogue movement keys. The game ends when Robot finds
25 ! Kitten.  Alternatively, you may end the game by hitting the Esc or Q
26 ! keys.
27 !
28 ! Developed with Inform 6.21 as installed from NetBSD's pkgsrc tree.
29 !
30 ! Compile it with:
31 !       inform "-~S" kitten.inf  <-- Assuming Unix
32 !
33 ! Notes:
34 !       1) More than half of the code is taken up by non-kitten
35 !       messages.  When I compiled the code with just five messages and  
36 !       no debugging code, the resulting binary was only 9728 bytes.
37 !       With all 280+ messages, it's 20992 bytes.
38 !
39 !       2) If it wasn't already abundantly obvious, this program won't
40 !       compile to Glulx because of copious use of Z-machine assembly
41 !       instructions.
42 !
43 !
44 ! Still to do:
45 !
46 ! Implement colors (is it really necessary?)
47 !
48 ! Is there some way I can hide the cursor completely?
49 ! I want to do this and manually set Robot to be in reverse type rather
50 ! than relying on the cursor to look like that.  Ahah!  "@set_cursor -1
51 ! turns the cursor off, "@set_cursor -2" turns it back on.  Hmm.  This
52 ! doesn't seem to work.
53 !
54 ! It seems every now and then the kitten doesn't gets placed somewhere
55 ! where the robot can't get to it.  Under a non-kitten?
56 !
57 ! already_seen_msg in get_random_msg() still doesn't work correctly!
58 ! Probably the already_seen_xy() thing doesn't work either.
59
60
61 !Switches xv5s;
62
63 Switches v5;
64
65 ! Maxmimum possible number of non-kitten items on the playfield at once.
66 !
67 Constant Nonkitten_Max  256;
68
69 Constant Nonkitten_Default 20;
70
71 ! Number of messages
72 !
73 Constant MESSAGE_NUM    283;
74
75
76 Release 1;
77 !Serial "021129";
78
79
80 ! Not currently implemented
81 ! Global palm_mode = false;
82
83
84 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
85
86 Constant Story "Robot Finds Kitten";
87 Constant Headline "^A Zen Simulation^";
88
89 Constant Anim_Meet      10;
90
91 Global Height = 0;
92 Global Width = 0;
93
94 Global Color = false;
95
96 Global TopBar = 5;
97
98 Global player_x = 0;
99 Global player_y = 0;
100
101 Global kitten_x = 0;
102 Global kitten_y = 0;
103 Global kitten_char = 0;
104 !Global kitten_color = 0;
105
106 Global last_message = "";
107
108 Global nonkitten_count = Nonkitten_Default;
109
110 Array nonkitten_x --> Nonkitten_Max;
111 Array nonkitten_y --> Nonkitten_Max;
112 Array nonkitten_char --> Nonkitten_Max;
113 Array nonkitten_msg --> Nonkitten_Max;
114 !Array nonkitten_color --> Nonkitten_Max;
115
116 Global already_msg_count = 0;
117 Global already_count = 0;
118 Array already_x --> Nonkitten_Max + 2;
119 Array already_y --> Nonkitten_Max + 2;
120 Array already_msg --> Nonkitten_Max;
121
122
123 [ Main key;
124         if ((1->0)&1 == 0)
125                 Color = true;
126         else
127                 Color = false;
128
129         main_menu();    
130         while (true) {
131                 key = getkey();
132                 switch (key) {
133                 'F':    already_count = 0;
134                         init_kitten();
135                         init_robot();
136                         init_nonkittens();
137                         while (findkitten())
138                                 ;
139                 'D':    nonkitten_count = set_nonkitten_count();
140                 'I':    print_instructions();
141                 'A':    print_about();
142                 'T':    print_thoughts();
143                 }
144                 if (key == 'Q' || key == $1b)
145                         break;
146                 main_menu();
147         }
148         quit;
149 ];
150         
151
152 [ main_menu;
153         Width = $22-->0;
154         Height = $24-->0;
155
156         @erase_window $ffff;
157         @split_window 11;
158         @set_window 1;
159
160         Banner();
161         draw_horiz(TopBar);
162
163         draw_big_robot(3, 7);
164         draw_big_kitten(15, 7);
165
166
167         @set_cursor 7 30;
168         print "robotfindskitten";
169         @set_cursor 8 30;
170         print "http://www.robotfindskitten.org";
171         @set_cursor 9 30;
172         print "Leonard Richardson (C) 1997, 2000";
173         @set_cursor 10 30;
174         print "David Griffith (C) 2002  (Inform Edition)";
175
176         @set_window 0;
177
178         print "  F) Find Kitten^";
179         print "  D) Difficulty  (", nonkitten_count, ")^";
180         print "  I) Instructions^";
181         print "  T) Thoughts^";
182         print "  A) About^";
183         print "  Q) Quit^";
184         print "^> ";
185 ];
186
187
188 [ Banner i;
189         if (Story ~= 0) {
190 #IFV5;
191                 style bold; 
192 #ENDIF;
193                 print (string) Story;
194 #IFV5;
195                 style roman;
196 #ENDIF;
197         }
198         if (Headline ~= 0) {
199                 print (string) Headline;
200         }
201         print "Release ", (0-->1) & $03ff, " / Serial number ";
202         for (i=18:i<24:i++) print (char) 0->i;
203         print " / Inform v"; inversion; print " ";
204 #ifdef STRICT_MODE;
205         print "S";
206 #endif;
207 #ifdef INFIX;
208         print "X";
209 #ifnot;
210 #ifdef DEBUG;
211         print "D";
212 #endif;
213 #endif;
214         new_line;
215 ];
216
217 Constant INBUFSIZE 80;
218 Array inbuf -> INBUFSIZE;
219 [ set_nonkitten_count inbufvar ix cx len val;
220
221         while (true) {
222                 @erase_window $ffff;
223                 @split_window 5;
224                 @set_window 1;
225                 Banner();
226                 draw_horiz(TopBar);
227                 @set_window 0;
228
229                 print "^Please enter the number of nonkittens you
230                   wish to search through.^(1 to 255 only)^^> ";
231
232                 inbuf->0 = (INBUFSIZE-3);
233                 inbuf->1 = 0;
234                 inbufvar = inbuf;
235                 ix = 0;
236                 @aread inbufvar ix;
237                 new_line;
238                 len = inbuf->1;
239                 cx = 0;
240                 while (cx < len && inbuf->(2+cx) == ' ')
241                         cx++;
242                 if (cx < len && inbuf->(2+cx) == '.')
243                         break;
244
245                 if (cx == len || inbuf->(2+cx) < '0' || inbuf->(2+cx) > '9') {
246                         continue;
247                 }
248
249                 val = 0;
250                 while (cx < len && inbuf->(2+cx) >= '0' && inbuf->(2+cx) <= '9') {
251                         val = val * 10 + (inbuf->(2+cx) - '0');
252                         cx++;
253                 }
254
255                 if (val < 1 || val > Nonkitten_Max) {
256                         print "Please enter a value from 1 to ",
257                           Nonkitten_Max, ", or Enter by itself to exit.^";
258                         continue;
259                 } else break;
260         }
261         return val;
262 ];
263
264 [ print_about;
265         @erase_window $ffff;
266         @split_window TopBar;
267         @set_window 1;
268         Banner();
269         draw_horiz(TopBar);
270         @set_window 0;
271
272 print "^
273 This Zen simulation is based on the C version v1600003.248b^
274 by Leonard Richardson (C) 1997, 2000.^
275 Written originally for the Nerth Pork robotfindskitten contest.^
276 Reimplemented in Inform by David Griffith (C) 2002.^
277 ^
278 Lots more information on Robot Finds Kitten is available at
279 http://www.robotfindskitten.org.^
280 ^
281 Known bugs:^
282 ^
283 1) In get_random_msg(), already_seen_msg isn't being checked correctly
284 leading to occasional duplicate messages.  It looks like it should work.
285 Not sure why not.^
286 ^
287 2) already_seen_xy() probably has problems similar to item 1 above which
288 might explain why the kitten occasionally gets placed somewhere where
289 the robot can't get to it.
290 ^
291 3) Under Windows Frotz, the Robot appears as a solid block.  This is a
292 bug in Windows Frotz which incorrectly makes the cursor opaque.^
293 ^
294 4) Under Windows Frotz, an annoying [MORE] prompt appears when the game
295 is started.  This is another bug in Windows Frotz which believes
296 Windows' suggestion to use 20 lines rather than 24 or 25.^
297 ^
298 ^
299 [Press any key to continue.]  "; 
300
301         getkey();
302 ];
303
304
305 [ print_instructions;
306         @erase_window $ffff;
307         @split_window TopBar;
308         @set_window 1;
309         Banner();
310         draw_horiz(TopBar);
311         @set_window 0;
312
313 print "^
314 In this game, you are Robot (#).  Your job is to find Kitten.  This task
315 is complicated by the existance of various things which are not
316 kitten.  Robot must touch items to determine if they are Kitten or
317 not.  Move Robot with the cursor keys, the numeric keypad, or using the
318 vi/rogue movement keys.  The game ends when Robot finds
319 Kitten.  Alternatively, you may end the game by hitting the Esc or Q
320 keys.^^
321 [Press any key to continue.]  "; 
322
323         getkey();
324 ];
325
326
327 [ print_thoughts;
328         @erase_window $ffff;
329         @split_window TopBar;
330         @set_window 1;
331         Banner();
332         draw_horiz(TopBar);
333         @set_window 0;
334
335 print "^
336 A Final Thought.^
337 ^
338 Day and night I feverishly worked upon the machine, creating both a soul
339 which could desire its goal, and a body with which it could realize it.
340 Many who saw my creation called it an abomination, and denied me grant
341 money. But they could not dissuade me from my impossible task. It was a
342 spectre that tormented me always, a ghost I had to give a form and a
343 life, lest it consume me from the inside. And when at last my task was
344 done, when the grey box on wheels was complete and when it, as well as
345 I, knew what had to be done, I felt deep sympathy for the machine. For I
346 had not destroyed the phantom, but merely exorcized it into another
347 body. The robot knew not why this task had to be performed, for I could
348 not imbue it with knowledge I did not myself posess. And at the same
349 time, I felt a sweeping sense of relief sweep over me, that somehow, the
350 dream that had driven me for my entire life had come one step closer to
351 fruition.^
352 ^
353 ~Gort, Klaatu Verada Nikto~^
354 ^
355 As I vocally activated the robot, I realized that it was following my
356 instructions, but not out of any desire to obey me. Had I remained
357 silent, it would have performed exactly the same operations. We were two
358 beings controlled by the same force now. And yet, seeking vainly to hold
359 some illusion of control over the machine I thought I had created, I
360 gave my final command.^
361 ^
362 ~GO!~  I told the box as it began to roll out of my workshop into the
363 frozen desert beyond. ~FIND KITTEN!~^
364 ^
365 -- The Book of Found Kittens, pages 43-4, author unknown.^^
366
367
368 [Press any key to continue.]  "; 
369
370         getkey();
371 ];
372
373 [ draw_big_robot x y; 
374         if (x == 0)
375                 x = 1;
376         if (y == 0)
377                 y = 1;
378         @set_cursor y x;
379         print "[-]";
380         y = y+1;
381         @set_cursor y x;
382         print "(+)=C";
383
384         y = y+1;
385         @set_cursor y x;
386                 print "| |";
387
388         y = y+1;
389         @set_cursor y x;
390         print "OOO";
391 ];
392
393 [ draw_big_kitten x y;
394         if (x == 0)
395                 x = 1;
396         if (y == 0)
397                 y = 1;
398         @set_cursor y x;
399         print "|", (char) 92, "_/|";
400         y++;
401         @set_cursor y x;
402         print "|o o|__";
403         y++;
404         @set_cursor y x;
405         print "--*--__", (char) 92;
406         y++;
407         @set_cursor y x;
408         print "C_C(___)";       
409 ];
410
411
412 [ findkitten key i kitten_found;
413         @erase_window $ffff;
414         @split_window TopBar;
415         @set_window 1;
416         @set_cursor 1 1;
417
418         kitten_found = false;
419
420         Banner();
421         print (string) last_message;
422         draw_horiz(TopBar);
423
424         draw_object(kitten_x, kitten_y, kitten_char);
425         draw_nonkittens();
426         draw_object(player_x, player_y, '#');
427
428         @set_cursor player_y player_x;
429
430
431         key = getkey();
432         switch (key) {
433         'Q', $1b:       rfalse;                 ! exit game ($1b == Esc)
434         '8', 'J', 129:  player_y--;             ! up
435         '2', 'K', 130:  player_y++;             ! down
436         '4', 'H', 131:  player_x--;             ! left
437         '6', 'L', 132:  player_x++;             ! right
438         '7', 'Y':       player_y--; player_x--; ! up-left
439         '9', 'U':       player_y--; player_x++; ! up-right
440         '1', 'B':       player_y++; player_x--; ! down-left
441         '3', 'N':       player_y++; player_x++; ! down-right
442         }
443         if (player_y <= TopBar+1)
444                 player_y = TopBar + 1;
445         if (player_y > Height)
446                 player_y = Height;
447         if (player_x < 1)
448                 player_x = 1;
449         if (player_x > Width)
450                 player_x = Width;
451
452         ! detect and handle collisions
453         !
454         if (player_x == kitten_x && player_y == kitten_y) {
455                 found_kitten(key);
456                 getkey();
457                 rfalse;
458         }
459         for (i = 0: i < nonkitten_count: i++) {
460                 if (player_x == nonkitten_x --> i
461                 && player_y == nonkitten_y --> i) {
462                         @set_cursor 1 1;
463                         last_message = lookup_msg(nonkitten_msg --> i);
464
465                         ! prevent Robot from walking through the object.
466                         switch (key) {
467                         '8', 'J', 129:  player_y++;
468                         '2', 'K', 130:  player_y--;
469                         '4', 'H', 131:  player_x++;
470                         '6', 'L', 132:  player_x--;
471                         '7', 'Y':       player_y++; player_x++;
472                         '9', 'U':       player_y++; player_x--;
473                         '1', 'B':       player_y--; player_x++;
474                         '3', 'N':       player_y--; player_x--;
475                         }
476                 }
477         }
478         rtrue;
479 ];
480
481
482 [ found_kitten key i j junk go_right robot_x anim_finished;
483
484         go_right = false;
485         anim_finished = false;
486
487         switch (key) {
488         '8', 'J', 129:  player_y++;
489         '2', 'K', 130:  player_y--; go_right = true;
490         '4', 'H', 131:  player_x++; 
491         '6', 'L', 132:  player_x--; go_right = true;
492         '7', 'Y':       player_y++; player_x++; 
493         '9', 'U':       player_y++; player_x--; go_right = true;
494         '1', 'B':       player_y--; player_x++;
495         '3', 'N':       player_y--; player_x--; go_right = true;
496         default: go_right = true;
497         }
498
499         for (i = 4: i >= 0: i--) {
500                 @erase_window $ffff;
501                 @split_window TopBar;
502                 @set_window 1;
503                 @set_cursor 1 1;
504
505                 Banner();
506                 draw_horiz(TopBar);
507
508                 if (i > 0) {
509                         if (go_right) {
510                                 robot_x = Anim_Meet - i;
511                                 draw_object(robot_x, TopBar - 1, '#');
512                                 draw_object(Anim_Meet - 1 + i, TopBar - 1, kitten_char);
513                         } else {
514                                 robot_x = Anim_Meet - 1 + i;
515                                 draw_object(robot_x, TopBar - 1, '#');
516                                 draw_object(Anim_Meet - i, TopBar - 1, kitten_char);
517                         }
518                 } else {
519                         j = TopBar - 1;
520                         @set_cursor j 1;
521                         print "You found Kitten!  Way to go, Robot!";
522                         anim_finished = true;
523                 }
524
525                 draw_object(kitten_x, kitten_y, kitten_char);
526
527                 draw_object(player_x, player_y, '#');
528
529                 draw_nonkittens();
530
531                 if (anim_finished == false) {
532                         j = TopBar - 1;
533                         @set_cursor j robot_x;
534                         @aread junk 0 10 pause junk;
535                 } else {
536                         draw_object(player_x, player_y, '#');
537                         @set_cursor player_y player_x;
538                 }
539         }
540
541 ];
542
543
544 [ already_seen_xy x y i;
545
546         for (i = 0: i < already_count: i++) {
547                 if (already_x --> i == x && already_y --> i == y) {
548                         return false;
549                 } 
550         }
551         already_x --> already_count = x;
552         already_y --> already_count = y;
553         already_count++;
554
555         if (already_count > nonkitten_count + 2) {
556                 print "Overflow in already_seen_xy()^";
557                 quit;
558         }
559
560         return true;
561 ];
562
563
564 [ pause;
565         rtrue;
566 ];
567
568
569 [ init_kitten;
570         kitten_x = get_random_x();
571         kitten_y = get_random_y();
572
573         while (already_seen_xy(kitten_x, kitten_y) == false) {
574                 kitten_x = get_random_x();
575                 kitten_y = get_random_y();
576         }
577         kitten_char = get_random_char();
578 ];
579
580
581 [ init_robot;
582         player_x = get_random_x();
583         player_y = get_random_y();
584
585         while (already_seen_xy(player_x, player_y) == false) {
586                 player_x = get_random_x();
587                 player_y = get_random_y();
588         }
589 ];      
590
591
592 [ init_nonkittens i;
593         already_msg_count = 0;
594         last_message = "";
595
596         for (i = 0: i < nonkitten_count: i++) {
597                 nonkitten_x --> i = get_random_x();
598                 nonkitten_y --> i = get_random_y();
599
600                 while (already_seen_xy(nonkitten_x --> i, nonkitten_y --> i) == false) {
601                         nonkitten_x --> i = get_random_x();
602                         nonkitten_y --> i = get_random_y();
603                 }
604                 nonkitten_char --> i = get_random_char();
605                 nonkitten_msg --> i = get_random_msg();
606         }
607 ];
608
609
610 [ draw_nonkittens i;
611         for (i = 0: i < nonkitten_count: i++) {
612                 draw_object(nonkitten_x --> i,
613                                 nonkitten_y --> i,
614                                 nonkitten_char --> i);
615         }
616 ];
617
618
619 [ draw_object x y c;
620         @set_cursor y x;
621         if (c)
622                 print (char) c;
623 ];
624
625
626 [ draw_horiz row i;
627         @set_cursor row 1;
628
629         for (i = 0 : i < Width : i++)
630                 print (char) '-';
631 ];
632
633
634 [ getkey x;
635         @read_char 1 -> x;
636         if (x >= 'a' && x <= 'z')
637                 x = x - ('a' - 'A');
638         return x;
639 ];
640
641
642 ![ get_random_color num;
643 !       num = random(7);
644 !       num = num + 2;
645 !       return num;
646 !];
647
648
649 [ get_random_char num;
650         num = random(93);
651         num = num + 33;
652
653         ! avoid choosing '#' for a random character.
654         while (num == 35) {
655                 num = random(93);
656                 num = num + 33;
657         }
658         return num;
659 ];
660
661
662 [ get_random_msg num i found_dup;
663         found_dup = false;
664         num = random(MESSAGE_NUM);
665         for (i = 0: i < already_msg_count: i++) {
666                 while (already_msg --> i == num) {
667                         num = random(MESSAGE_NUM);
668                         found_dup = true;
669                 }
670         }
671
672         if (found_dup)  already_msg_count++;
673
674         if (already_msg_count > nonkitten_count) {
675                 print "Overflow in get_random_msg()^";
676                 quit;
677         }
678         return num;
679 ];
680
681
682 [ get_random_x;
683         return random(Width);
684 ];
685
686
687 [ get_random_y num ok;
688         ok = false;
689         while (ok == false) {
690                 num = random(Height);
691                 if (num > TopBar)
692                         ok = true;
693         }
694         return num;
695 ];
696
697
698 [ lookup_msg num;
699         switch(num) {
700 1:      return "~I pity the fool who mistakes me for kitten!~, sez Mr. T.";
701 2:      return "That's just an old tin can.";
702 3:      return "It's an altar to the horse god.";
703 4:      return "A box of dancing mechanical pencils.  They dance!  They sing!";
704 5:      return "It's an old Duke Ellington record.";
705 6:      return "A box of fumigation pellets.";
706 7:      return "A digital clock. It's stuck at 2:17 PM.";
707 8:      return "That's just a charred human corpse.";
708 9:      return "I don't know what that is, but it's not kitten.";
709 10:     return "An empty shopping bag.  Paper or plastic?";
710 11:     return "Could it be... a big ugly bowling trophy?";
711 12:     return "A coat hanger hovers in thin air.  Odd.";
712 13:     return "Not kitten, just a packet of Kool-Aid(tm).";
713 14:     return "A freshly-baked pumpkin pie.";
714 15:     return "A lone, forgotten comma, sits here, sobbing.";
715 16:     return "ONE HUNDRED THOUSAND CARPET FIBERS!!!!!";
716 17:     return "It's Richard Nixon's nose!";
717 18:     return "It's Lucy Ricardo. ~Aaaah, Ricky!~, she says.";
718 19:     return "You stumble upon Bill Gates' stand-up act.";
719 20:     return "Just an autographed copy of the Kama Sutra.";
720 21:     return "It's the Will Rogers Highway. Who was Will Rogers, anyway?";
721 22:     return "It's another robot, more advanced in design than you but strangely immobile.";
722 23:     return "Leonard Richardson is here, asking people to lick him.";
723 24:     return "It's a stupid mask, fashioned after a beagle.";
724 25:     return "Your State Farm Insurance(tm) representative!";
725 26:     return "It's the local draft board.";
726 27:     return "Seven 1/4~ screws and a piece of plastic.";
727 28:     return "An 80286 machine.";
728 29:     return "One of those stupid ~Homes of the Stars~ maps.";
729 30:     return "A signpost saying ~TO KITTEN~.  It points in no particular direction.";
730 31:     return "A hammock stretched between a tree and a volleyball pole.";
731 32:     return "A Texas Instruments of Destruction calculator.";
732 33:     return "It's a dark, amphorous blob of matter.";
733 34:     return "Just a pincushion.";
734 35:     return "It's a mighty zombie talking about some love and prosperity.";
735 36:     return "~Dear robot, you may have already won our 10 MILLION DOLLAR prize...~";
736 37:     return "It's just an object.";
737 38:     return "A mere collection of pixels.";
738 39:     return "A badly dented high-hat cymbal lies on its side here.";
739 40:     return "A marijuana brownie.";
740 41:     return "A plush Chewbacca.";
741 42:     return "Daily hunger conditioner from Australasia";
742 43:     return "Just some stuff.";
743 44:     return "Why are you touching this when you should be finding kitten?";
744 45:     return "A glorious fan of peacock feathers.";
745 46:     return "It's some compromising photos of Babar the Elephant.";
746 47:     return "A copy of the Weekly World News. Watch out for the chambered nautilus!";
747 48:     return "It's the proverbial wet blanket.";
748 49:     return "A ~Get Out of Jail Free~ card.";
749 50:     return "An incredibly expensive ~Mad About You~ collector plate.";
750 51:     return "Paul Moyer's necktie.";
751 52:     return "A haircut and a real job.  Now you know where to get one!";
752 53:     return "An automated robot-hater.  It frowns disapprovingly at you.";
753 54:     return "An automated robot-liker.  It smiles at you.";
754 55:     return "It's a black hole.  Don't fall in!";
755 56:     return "Just a big brick wall.";
756 57:     return "You found kitten!  No, just kidding.";
757 58:     return "Heart of Darkness brand pistachio nuts.";
758 59:     return "A smoking branding iron shaped like a 24-pin connector.";
759 60:     return "It's a Java applet.";
760 61:     return "An abandoned used-car lot.";
761 62:     return "A shameless plug for Crummy: http://www.crummy.com/";
762 63:     return "A shameless plug for the UCLA Linux Users Group: http://linux.ucla.edu/";
763 64:     return "A can of Spam Lite.";
764 65:     return "This is another fine mess you've gotten us into, Stanley.";
765 66:     return "It's scenery for ~Waiting for Godot~.";
766 67:     return "This grain elevator towers high above you.";
767 68:     return "A Mentos wrapper.";
768 69:     return "It's the constellation Pisces.";
769 70:     return "It's a fly on the wall.  Hi, fly!";
770 71:     return "This kind of looks like kitten, but it's not.";
771 72:     return "It's a banana!  Oh, joy!";
772 73:     return "A helicopter has crashed here.";
773 74:     return "Carlos Tarango stands here, doing his best impression of Pat Smear.";
774 75:     return "A patch of mushrooms grows here.";
775 76:     return "A patch of grape jelly grows here.";
776 77:     return "A spindle, and a grindle, and a bucka-wacka-woom!";
777 78:     return "A geyser sprays water high into the air.";
778 79:     return "A toenail?  What good is a toenail?";
779 80:     return "You've found the fish!  Not that it does you much good in this game.";
780 81:     return "A Buttertonsils bar.";
781 82:     return "One of the few remaining discoes.";
782 83:     return "Ah, the uniform of a Revolutionary-era minuteman.";
783 84:     return "A punch bowl, filled with punch and lemon slices.";
784 85:     return "It's nothing but a G-thang, baby.";
785 86:     return "IT'S ALIVE! AH HA HA HA HA!";
786 87:     return "This was no boating accident!";
787 88:     return "Wait!  This isn't the poker chip!  You've been tricked!  DAMN YOU, MENDEZ!";
788 89:     return "A livery stable!  Get your livery!";
789 90:     return "It's a perpetual immobility machine.";
790 91:     return "~On this spot in 1962, Henry Winkler was sick.~";
791 92:     return "There's nothing here; it's just an optical illusion.";
792 93:     return "The World's Biggest Motzah Ball!";
793 94:     return "A tribe of cannibals lives here.  They eat Malt-O-Meal for breakfast, you know.";
794 95:     return "This appears to be a rather large stack of trashy romance novels.";
795 96:     return "Look out!  Exclamation points!";
796 97:     return "A herd of wild coffee mugs slumbers here.";
797 98:     return "It's a limbo bar!  How low can you go?";
798 99:     return "It's the horizon.  Now THAT'S weird.";
799 100:    return "A vase full of artificial flowers is stuck to the floor here.";
800 101:    return "A large snake bars your way.";
801 102:    return "A pair of saloon-style doors swing slowly back and forth here.";
802 103:    return "It's an ordinary bust of Beethoven... but why is it painted green?";
803 104:    return "It's TV's lovable wisecracking Crow! ~Bite me!~, he says.";
804 105:    return "Hey, look, it's war.  What is it good for?  Absolutely nothing.  Say it again.";
805 106:    return "It's the amazing self-referential thing that's not kitten.";
806 107:    return "A flamboyant feather boa.  Now you can dress up like Carol Channing!";
807 108:    return "~Sure hope we get some rain soon,~ says Farmer Joe.";
808 109:    return "~How in heck can I wash my neck if it ain't gonna rain no more?~ asks Farmer Al.";
809 110:    return "~Topsoil's all gone, ma,~ weeps Lil' Greg.";
810 111:    return "This is a large brown bear.  Oddly enough, it's currently peeing in the woods.";
811 112:    return "A team of arctic explorers is camped here.";
812 113:    return "This object here appears to be Louis Farrakhan's bow tie.";
813 114:    return "This is the world-famous Chain of Jockstraps.";
814 115:    return "A trash compactor, compacting away.";
815 116:    return "This toaster strudel is riddled with bullet holes!";
816 117:    return "It's a hologram of a crashed helicopter.";
817 118:    return "This is a television.  On screen you see a robot strangely similar to yourself.";
818 119:    return "This balogna has a first name, it's R-A-N-C-I-D.";
819 120:    return "A salmon hatchery?  Look again.  It's merely a single salmon.";
820 121:    return "It's a rim shot.  Ba-da-boom!";
821 122:    return "It's creepy and it's kooky, mysterious and spooky.  It's also somewhat ooky.";
822 123:    return "This is an anagram.";
823 124:    return "This object is like an analogy.";
824 125:    return "It's a symbol.  You see in it a model for all symbols everywhere.";
825 126:    return "The object pushes back at you.";
826 127:    return "A traffic signal.  It appears to have been recently vandalized.";
827 128:    return "~There is no kitten!~ cackles the old crone.  You are shocked by her blasphemy.";
828 129:    return "This is a Lagrange point.  Don't come too close now.";
829 130:    return "The dirty old tramp bemoans the loss of his harmonica.";
830 131:    return "Look, it's Fanny the Irishman!";
831 132:    return "What in blazes is this?";
832 133:    return "It's the instruction manual for a previous version of this game.";
833 134:    return "A brain cell.  Oddly enough, it seems to be functioning.";
834 135:    return "Tea and/or crumpets.";
835 136:    return "This jukebox has nothing but Cliff Richards albums in it.";
836 137:    return "It's a Quaker Oatmeal tube, converted into a drum.";
837 138:    return "This is a remote control.  Being a robot, you keep a wide berth.";
838 139:    return "It's a roll of industrial-strength copper wire.";
839 140:    return "Oh boy!  Grub!  Er, grubs.";
840 141:    return "A puddle of mud, where the mudskippers play.";
841 142:    return "Plenty of nothing.";
842 143:    return "Look at that, it's the Crudmobile.";
843 144:    return "Just Walter Mattheau and Jack Lemmon.";
844 145:    return "Two crepes, two crepes in a box.";
845 146:    return "An autographed copy of ~Primary Colors~, by Anonymous.";
846 147:    return "Another rabbit?  That's three today!";
847 148:    return "It's a segmentation fault.  Core dumped, by the way.";
848 149:    return "A historical marker showing the actual location of /dev/null.";
849 150:    return "Thar's Mobius Dick, the convoluted whale.  Arrr!";
850 151:    return "It's a charcoal briquette, smoking away.";
851 151:    return "A pizza, melting in the sun.";
852 152:    return "It's a ~HOME ALONE 2: Lost in New York~ novelty cup.";
853 153:    return "A stack of 7 inch floppies wobbles precariously.";
854 153:    return "It's nothing but a corrupted floppy.  Coaster anyone?";
855 154:    return "A section of glowing phosphor cells sings a song of radiation to you.";
856 155:    return "This TRS-80 III is eerily silent.";
857 156:    return "A toilet bowl occupies this space.";
858 157:    return "This peg-leg is stuck in a knothole!";
859 158:    return "It's a solitary vaccuum tube.";
860 159:    return "This corroded robot is clutching a mitten.";
861 160:    return "~Hi, I'm Anson Williams, TV's 'Potsy'.~";
862 161:    return "This subwoofer was blown out in 1974.";
863 162:    return "Three half-pennies and a wooden nickel.";
864 163:    return "It's the missing chapter to ~A Clockwork Orange~.";
865 164:    return "It's a burrito stand flyer.  ~Taqueria El Ranchito~.";
866 165:    return "This smiling family is happy because they eat LARD.";
867 166:    return "Roger Avery, persona un famoso de los Estados Unidos.";
868 167:    return "Ne'er but a potted plant.";
869 168:    return "A parrot, kipping on its back.";
870 169:    return "A forgotten telephone switchboard.";
871 170:    return "A forgotten telephone switchboard operator.";
872 171:    return "It's an automated robot-disdainer. It pretends you're not there.";
873 172:    return "It's a portable hole.  A sign reads: ~Closed for the winter~.";
874 173:    return "Just a moldy loaf of bread.";
875 174:    return "A little glass tub of Carmex. ($.89)  Too bad you have no lips.";
876 175:    return "A Swiss-Army knife.  All of its appendages are out.  (toothpick lost)";
877 176:    return "It's a zen simulation, trapped within an ASCII character.";
878 177:    return "It's a copy of ~The Rubaiyat of Spike Schudy~.";
879 178:    return "It's ~War and Peace~ (unabridged, very small print).";
880 179:    return "A willing, ripe tomato bemoans your inability to digest fruit.";
881 180:    return "A robot comedian.  You feel amused.";
882 181:    return "It's KITT, the talking car.";
883 182:    return "Here's Pete Peterson.  His batteries seem to have long gone dead.";
884 183:    return "~Blup, blup, blup~, says the mud pot.";
885 184:    return "More grist for the mill.";
886 185:    return "Grind 'em up, spit 'em out, they're twigs.";
887 186:    return "The boom box cranks out an old Ethel Merman tune.";
888 187:    return "It's ~Finding kitten~, published by O'Reilly and Associates.";
889 188:    return "Pumpkin pie spice.";
890 189:    return "It's the Bass-Matic '76!  Mmm, that's good bass!";
891 190:    return "~Lend us a fiver 'til Thursday~, pleas Andy Capp.";
892 191:    return "It's a tape of '70s rock.  All original hits!  All original artists!";
893 192:    return "You've found the fabled America Online disk graveyard!";
894 193:    return "Empty jewelboxes litter the landscape.";
895 194:    return "It's the astounding meta-object.";
896 195:    return "Ed McMahon stands here, lost in thought.  Seeing you, he bellows, ~YES SIR!~";
897 196:    return "...thingy???";
898 197:    return "It's 1000 secrets the government doesn't want you to know!";
899 198:    return "The letters O and R.";
900 199:    return "A magical... magic thing.";
901 200:    return "It's a moment of silence.";
902 201:    return "It's Sirhan-Sirhan, looking guilty.";
903 202:    return "It's ~Chicken Soup for the Kitten-seeking Soulless Robot.~";
904 203:    return "It is a set of wind-up chatter teeth.";
905 204:    return "It is a cloud shaped like an ox.";
906 205:    return "You see a snowflake here, melting slowly.";
907 206:    return "It's a big block of ice.  Something seems to be frozen inside it.";
908 207:    return "Vladimir Lenin's casket rests here.";
909 208:    return "It's a copy of ~Zen and The Art of Robot Maintenance~.";
910 209:    return "This invisible box contains a pantomime horse.";
911 210:    return "A mason jar lies here open. It's label reads: ~do not open!~.";
912 211:    return "A train of thought chugs through here.";
913 212:    return "This jar of pickles expired in 1957.";
914 213:    return "Someone's identity disk lies here.";
915 214:    return "~Yes!~ says the bit.";
916 215:    return "~No!~ says the bit.";
917 216:    return "A dodecahedron bars your way.";
918 217:    return "Mr. Hooper is here, surfing.";
919 218:    return "It's a big smoking fish.";
920 219:    return "You have new mail in /var/spool/robot";
921 220:    return "Just a monitor with the blue element burnt out.";
922 221:    return "A pile of coaxial plumbing lies here.";
923 222:    return "It's a rotten old shoe.";
924 223:    return "It's a hundred-dollar bill.";
925 224:    return "It's a Dvorak keyboard.";
926 225:    return "It's a cardboard box full of 8-tracks.";
927 226:    return "Just a broken hard drive containg the archives of Nerth Pork.";
928 227:    return "A broken metronome sits here, it's needle off to one side.";
929 228:    return "A sign reads: ~Go home!~";
930 229:    return "A sign reads: ~No robots allowed!~";
931 230:    return "It's the handheld robotfindskitten game, by Tiger.";
932 231:    return "This particular monstrosity appears to be ENIAC.";
933 232:    return "This is a tasty-looking banana creme pie.";
934 233:    return "A wireframe model of a hot dog rotates in space here.";
935 234:    return "Just the empty husk of a locust.";
936 235:    return "You disturb a murder of crows.";
937 236:    return "It's a copy of the RobotFindsKitten EULA.";
938 237:    return "It's Death.";
939 238:    return "It's an autographed copy of ~Secondary Colors~, by Bob Ross.";
940 239:    return "It is a marzipan dreadnought that appears to have melted and stuck.";
941 240:    return "It's a DVD of ~Crouching Monkey, Hidden Kitten~, region encoded for the moon.";
942 241:    return "It's Kieran Hervold.  Damn dyslexia!";
943 242:    return "A non-descript box of crackers.";
944 243:    return "Carbonated Water, High Fructose Corn Syrup, Color, Phosphoric Acid, Flavors, Caffeine.";
945 244:    return "~Move along! Nothing to see here!~";
946 245:    return "It's the embalmed corpse of Vladimir Lenin.";
947 246:    return "A coupon for one free steak-fish at your local family diner.";
948 247:    return "A set of keys to a 2001 Rolls Royce.  Worthless.";
949
950 ! The following messages were added by David Griffith
951 !
952 248:    return "It's the Golden Banana of Discord!";
953 249:    return "The Inform Designer's Manual (4th edition)";
954 250:    return "A packet of pipe cleaners.";
955 251:    return "It's Andrew Plotkin plotting something.";
956 252:    return "A half-eaten cheese sandwich.";
957 253:    return "Clang, clang, clang goes the tranny!";
958 254:    return "A family of integrals are here integrating.";
959 255:    return "A tuft of kitten fur, but no kitten.";
960 256:    return "A bottle of oil!  Refreshing!";
961 257:    return "A shameless plug for Frotz: http://www.cs.csubak.edu/~dgriffi/proj/frotz/";
962 258:    return "Clifford Stoll is here selling Klein bottles.";
963 259:    return "You found the marble in the oatmeal!";
964 260:    return "An empty Altoids tin.";
965 261:    return "An empty Penguin Mints tin.";
966 262:    return "So, THAT's what an invisible barrier looks like!";
967 263:    return "A cluster of cattails are growing here.";
968 264:    return "A discarded bagpipe chanter reed.";
969 265:    return "Big Bird is here looking for Mr. Looper.";
970 266:    return "It's a Linux install CD.";
971 267:    return "You found Puppy!  Too bad this isn't ~Robot Finds Puppy~.";
972 268:    return "Several meters of cat5 cable.";
973 269:    return "A scrap of parchment bears the single word, ~meow~.";
974 270:    return "A puddle of chocolate sauce.";
975 271:    return "Your robot pal Floyd is here and wants to play Hucka-Bucka-Beanstalk.";
976 272:    return "Someone is talking to Ralph on the big white phone here.";
977 273:    return "'Twas brillig in the slivey-toves...";
978 274:    return "Darth Vader is here looking for his Teddywookie.";
979 275:    return "A bassoon is hooting angrily at you.";
980 276:    return "Catsup and Mustard all over the place!  It's the Human Hamburger!";
981 277:    return "Gibble, Gobble, we ACCEPT YOU ...";
982 278:    return "A rancid corn dog.";
983 279:    return "It's a tribute to fishnet stockings.";
984 280:    return "A jar of Vegemite is running down the hill here.";
985 281:    return "Nipples, dimples, knuckles, NICKLES, wrinkles, pimples!!";
986 282:    return "A bottle of hair tonic.";
987 283:    return "A packet of catnip.";
988         }
989 ];