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