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