Import of Release 5
[rfk-inform.git] / kitten.inf
1 ! robotfindskitten
2 ! A Zen Simulation
3 ! Release 5 / Serial number 030524 / 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 robotfindskitten 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 robotfindskitten.
25 ! Alternatively, you may end the game by hitting the Esc or Q keys.
26 !
27 ! Developed with Inform 6.21.2 as installed from NetBSD's pkgsrc tree
28 ! and Frotz 2.42.
29
30 !
31 ! Compile it with:
32 !       inform "-~S" kitten.inf  <-- Assuming Unix
33 !                ^
34 !                | 
35 !               Gets rid of debugging code which doesn't really do
36 !               this sort of program any good in the first place.
37 !
38 ! Notes:
39 !       1) More than half of the code is taken up by non kitten items
40 !       (NKIs).  When I compiled the code with just five messages and
41 !       no debugging code, the resulting binary was less than 10k bytes.
42 !
43 !       2) If it wasn't already abundantly obvious, this program won't
44 !       compile to Glulx because of copious use of Z-machine assembly
45 !       instructions.
46
47 !Switches xv5s;
48
49 Switches v5;
50
51
52 ! Number of messages
53 ! This must be updated when adding new messages.
54 !
55 Constant MESSAGE_NUM    602;
56
57 Constant Nonkitten_Default 20;
58
59 ! Maxmimum possible number of non-kitten items on the playfield at once.
60 ! I don't know if there's a hard maximum for arrays built into the
61 ! Z-machine.  It's just that Inform won't let me set an array's 
62 ! dimensions at runtime.
63 !
64 Constant Nonkitten_Max  256;
65
66
67 Release 5;
68 Serial "030524";
69
70 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
71
72 Constant Story "robotfindskitten";
73
74 Constant Headline "^A Zen Simulation^";
75
76 ! Number of spaces from the left where Robot and Kitten meet during the
77 ! animation.
78 !
79 Constant Anim_Meet      10;
80
81 ! These are set at runtime.
82 !
83 Global Height = 0;
84 Global Width = 0;
85
86 Global Back_def = 2;
87 Global Fore_def = 9;
88
89 Global TopBar = 5;
90
91 Global player_x = 0;
92 Global player_y = 0;
93 Global player_x_last = 0;
94 Global player_y_last = 0;
95
96 Global kitten_x = 0;
97 Global kitten_y = 0;
98 Global kitten_char = 0;
99 Global kitten_color = 0;
100
101 Global last_message = "";
102
103 Global nonkitten_count = Nonkitten_Default;
104
105 Array nonkitten_x --> Nonkitten_Max;
106 Array nonkitten_y --> Nonkitten_Max;
107 Array nonkitten_color --> Nonkitten_Max;
108 Array nonkitten_char --> Nonkitten_Max;
109 Array nonkitten_msg --> Nonkitten_Max;
110
111 Global already_msg_count = 0;
112 Global already_count = 0;
113 Array already_x --> Nonkitten_Max + 2;
114 Array already_y --> Nonkitten_Max + 2;
115 Array already_msg --> Nonkitten_Max;
116
117
118 Global Real_Release = 0;
119
120 [ Main key;
121
122         @set_colour Fore_def Back_def;
123
124         if (MESSAGE_NUM < Nonkitten_Max) {
125                 nonkitten_count = MESSAGE_NUM;
126         } else {
127                 nonkitten_count = Nonkitten_Default;
128         }
129
130         ! If a key is held down while the found_kitten animation is playing,
131         ! (0-->1) & $03ff gets corrupted.  Seems like it might be a bug
132         ! somewhere in Unix Frotz.
133         !
134         Real_Release = (0-->1)&$03ff;
135
136         Width = $22-->0;
137         Height = $24-->0;
138
139         main_menu();    
140         while (true) {
141                 key = getkey();
142                 switch (key) {
143                 'F':    already_count = 0;
144                         init_nonkittens();
145                         init_kitten();
146                         init_robot();
147                         while (findkitten())
148                                 ;
149                 'D':    set_nonkitten_count();
150                 'I':    print_instructions();
151                 'A':    print_about();
152                 'T':    print_thoughts();
153 !               'P':    print_all_nki();
154                 }
155                 if (key == 'Q' || key == $1b)   ! $1b == ESC
156                         break;
157                 main_menu();
158         }
159         quit;
160 ];
161
162
163 [ main_menu psycho;
164
165         psycho = random(50);
166         if (psycho == 1)
167                 psycho = true;
168         else
169                 psycho = false;
170
171         @erase_window $ffff;
172         @split_window 11;
173         @set_window 1;
174
175         Banner();
176         draw_horiz(TopBar);
177
178         draw_big_robot(3, 7);
179
180         if (psycho)
181                 draw_big_kitten_psycho(14, 7);
182         else
183                 draw_big_kitten(15, 7);
184
185         @set_cursor 7 30;
186         print "http://www.robotfindskitten.org";
187         @set_cursor 8 30;
188         print "Leonard Richardson (C) 1997, 2000";
189         @set_cursor 9 30;
190         print "David Griffith (C) 2002  (Inform Edition)";
191
192         @set_cursor 10 30;
193         print "    ", MESSAGE_NUM, " different nonkittens!";
194
195         @set_window 0;
196
197         print "  F) Find Kitten^";
198         print "  D) Difficulty  (", nonkitten_count, ")^";
199         print "  I) Instructions^";
200         print "  T) Thoughts^";
201         print "  A) About^";
202         print "  Q) Quit^";
203         print "^> ";
204 ];
205
206 ! Copied from module/verblibm.h
207 !
208 [ Banner i;
209         if (Story ~= 0) {
210 #IFV5;
211                 style bold; 
212 #ENDIF;
213                 print (string) Story;
214 #IFV5;
215                 style roman;
216 #ENDIF;
217         }
218         if (Headline ~= 0) {
219                 print (string) Headline;
220         }
221         print "Release ", Real_Release, " / Serial number ";
222         for (i=18:i<24:i++) print (char) 0->i;
223         print " / Inform v"; inversion; print " ";
224 #ifdef STRICT_MODE;
225         print "S";
226 #endif;
227 #ifdef INFIX;
228         print "X";
229 #ifnot;
230 #ifdef DEBUG;
231         print "D";
232 #endif;
233 #endif;
234         new_line;
235 ];
236
237
238 Constant INBUFSIZE 80;
239 Array inbuf -> INBUFSIZE;
240
241 [ set_nonkitten_count maxnum val;
242
243         while (true) {
244                 @erase_window $ffff;
245                 @split_window 5;
246                 @set_window 1;
247                 Banner();
248                 draw_horiz(TopBar);
249                 @set_window 0;
250
251                 if (MESSAGE_NUM < Nonkitten_Max) {
252                         maxnum = MESSAGE_NUM;
253                 } else {
254                         maxnum = Nonkitten_Max;
255                 } 
256
257                 print "^Please enter the number of nonkittens you
258                         wish to search through.^(1 to ", maxnum, " only)^^> ";
259
260                 while (true) {
261                         val = get_number(1, maxnum, nonkitten_count);
262                         if (val == -1) {
263                                 break;
264                         } else {
265                                 nonkitten_count = val;
266                                 return;
267                         }
268                 }
269         }
270 ];
271
272
273 [ get_number min max init inbufvar ix cx len val;
274
275         while (true) {
276                 inbuf->0 = (INBUFSIZE-3);
277                 inbuf->1 = 0;
278                 inbufvar = inbuf;
279                 ix = 0;
280                 @aread inbufvar ix;
281                 new_line;
282                 len = inbuf->1;
283                 cx = 0;
284                 while (cx < len && inbuf->(2+cx) == ' ')
285                         cx++;
286                 if (cx < len && inbuf->(2+cx) == '.')
287                         break;
288
289                 ! If user just hit return, use what we have already. 
290                 if (len == 0)
291                         return init;
292                 if (cx == len || inbuf->(2+cx) < '0' || inbuf->(2+cx) > '9') {
293                         print "Please enter a value from ", min, " to ", max,
294                                 ", or Enter by itself to exit.^
295                                 [Press any key to continue.] ";
296                         getkey();
297                         return -1;
298                 }
299                 val = 0;
300                 while (cx < len && inbuf->(2+cx) >= '0' && inbuf->(2+cx) <= '9') {
301                         val = val * 10 + (inbuf->(2+cx) - '0');
302                         cx++;
303                 }
304                 if (val < min || val > max) {
305                         print "Please enter a value from ", min, " to ", max,
306                                 ", or Enter by itself to exit.^
307                                 [Press any key to continue.] ";
308                         getkey();
309                         return -1;
310                 } else break;
311         }
312         return val;
313 ];
314
315
316 [ print_about;
317
318         @erase_window $ffff;
319         @split_window TopBar;
320         @set_window 1;
321         Banner();
322         draw_horiz(TopBar);
323         @set_window 0;
324
325 print "^
326 This Zen simulation is based on the C version v1600003.248b^
327 by Leonard Richardson (C) 1997, 2000.^
328 Written originally for the Nerth Pork robotfindskitten contest.^
329 Reimplemented in Inform by David Griffith (C) 2002.^
330 ^
331 This code is freely redistributable.  Do with it what you will, but
332 don't go about claiming you wrote it.  I, David Griffith, retain
333 copyright on this program except for the NKIs imported from the master
334 (aka POSIX) port.^
335 ^
336 Lots more information on robotfindskitten is available at
337 http://www.robotfindskitten.org.^
338 ^
339 To submit new NKI's, please go to the above URL.^
340 ^
341 ^
342 Release History:^
343 ^
344 Release 1 / Serial number 0211xx to 021214 or so^
345 Initial private release.  Limited distribution for beta testing and
346 debugging purposes.^
347 ^
348 Release 2 / Serial Number 021216^
349 First public release.^
350 ^
351 Release 3 / Serial Number 021221^
352 Bugfix release.^
353 - Movement keys 'J' and 'K' were swapped by mistake.  Fixed.^
354 - Special PalmOS movement key support added.^
355 - More NKIs added (401 total).^
356 ^
357 Release 4 / Serial Number 030131^
358 Light overhaul release.^
359 - Now an official port of robotfindskitten.^
360 - Typos in NKIs fixed.^
361 - Fixed diagonal collision-detection strangeness.^
362 - Added color support.^
363 - Added an easter egg.  Can you find it?^
364 - Removed PalmOS movement key support (superfluous and ugly).^
365 - Removed playfield resizing code (superfluous and ugly).^
366 - It's ~robotfindskitten~, not ~Robot Finds Kitten~.^
367 - Merged in new NKIs from the new POSIX release of robotfindskitten.^
368 - More NKIs added (561 total).^
369 ^
370 Release 5 / Serial Number 030524^
371 Even more NKIs release.^
372 - Idiotic typos fixed.^
373 - More NKIs added (602 total).^
374 ^
375 ^
376 Known Bugs:^
377 ^
378 1) I still don't know why already_seen_xy() occasionally causes Robot to
379 get placed on top of another object when a game is started.  Fortunately
380 this seems to happen only very rarely and typically only if the
381 difficulty is set to more than 200.  This bug also seems to very
382 occasionally put Kitten underneath an NKI.^
383 ^
384 2) Under earlier versions of Windows Frotz, Robot used to appear as a
385 solid block. This was because of a bug in Windows Frotz which
386 incorrectly makes the cursor opaque.  The cursor is now moved off to
387 the upper-right corner so that the game looks okay on terminals that use
388 something other than reverse for the cursor.  I still can't figure out
389 how to make Inform hide the cursor completely.  At least on xterm and
390 NetBSD's console, @@64set_cursor -1 doesn't work.^
391 ^
392 3) Under Windows Frotz, an annoying [MORE] prompt might appear at the
393 main menu.  This is another bug in Windows Frotz which causes the
394 interpreter to follow Windows' suggestion that something less than 24 or
395 25 lines is okay.^
396 ^
397 ^
398 Other Stuff:^
399 ^
400 1) PalmOS mode and screen-resizing was removed because PalmOS mode stunk
401 and screen-resizing was a failed attempt to make PalmOS mode work.  The
402 native PalmOS port of robotfindskitten looks much better than the Inform
403 version running on a PalmOS Z-machine interpreter.^
404 ^
405 [Press any key to continue.] "; 
406         getkey();
407 ];
408
409
410 [ print_instructions;
411
412         @erase_window $ffff;
413         @split_window TopBar;
414         @set_window 1;
415         Banner();
416         draw_horiz(TopBar);
417         @set_window 0;
418 print "^
419 In this game, you are Robot ( ";
420 #IFV5; style reverse; #ENDIF;
421 print "#";
422 #IFV5; style roman; #ENDIF;
423 print " ).  Your job is to find Kitten.  This task
424 is complicated by the existance of various things which are not 
425 Kitten.  Robot must touch items to determine if they are Kitten or
426 not.  Move Robot with the cursor keys, the numeric keypad (make sure
427 numlock is on), or using the vi/rogue/nethack movement keys.  The game
428 ends when robotfindskitten.  Alternatively, you may end the game by
429 hitting the Esc or Q keys.^
430 ^
431 [Press any key to continue.] "; 
432         getkey();
433 ];
434
435
436 [ print_thoughts;
437         @erase_window $ffff;
438         @split_window TopBar;
439         @set_window 1;
440         Banner();
441         draw_horiz(TopBar);
442         @set_window 0;
443 print "^
444 A Final Thought.^
445 ^
446 Day and night I feverishly worked upon the machine, creating both a soul
447 which could desire its goal, and a body with which it could realize 
448 it. Many who saw my creation called it an abomination, and denied me
449 grant money.  But they could not dissuade me from my impossible 
450 task.  It was a spectre that tormented me always, a ghost I had to give
451 a form and a life, lest it consume me from the inside.  And when at last
452 my task was done, when the grey box on wheels was complete and when it,
453 as well as I, knew what had to be done, I felt deep sympathy for the
454 machine.  For I had not destroyed the phantom, but merely exorcized it
455 into another body.  The robot knew not why this task had to be
456 performed, for I could not imbue it with knowledge I did not myself
457 posess.  And at the same time, I felt a sweeping sense of relief sweep
458 over me, that somehow, the dream that had driven me for my entire life
459 had come one step closer to fruition.^
460 ^
461 ~Gort, Klaatu Verada Nikto~^
462 ^
463 As I vocally activated the robot, I realized that it was following my
464 instructions, but not out of any desire to obey me.  Had I remained
465 silent, it would have performed exactly the same operations.  We were
466 two beings controlled by the same force now.  And yet, seeking vainly to
467 hold some illusion of control over the machine I thought I had created,
468 I gave my final command.^
469 ^
470 ~GO!~  I told the box as it began to roll out of my workshop into the
471 frozen desert beyond. ~FIND KITTEN!~^
472 ^
473 -- The Book of Found Kittens, pages 43-4, author unknown.^
474 ^
475 [Press any key to continue.] "; 
476         getkey();
477 ];
478
479
480 [ draw_big_robot x y; 
481
482         if (x == 0)
483                 x = 1;
484         if (y == 0)
485                 y = 1;
486         @set_cursor y x;
487         @set_colour 6 Back_def;
488         print "[";
489         @set_colour 4 Back_def;
490         print "-";
491         @set_colour 6 Back_def;
492         print "]";
493
494         y = y+1;
495         @set_cursor y x;
496         @set_colour 6 Back_def;
497         print "(";
498         @set_colour 3 Back_def;
499         print "+";
500         @set_colour 6 Back_def;
501         print ")";
502         @set_colour 8 Back_def;
503         print "=C";
504
505         y = y+1;
506         @set_cursor y x;
507         @set_colour 6 Back_def;
508         print "| |";
509
510         y = y+1;
511         @set_cursor y x;
512         @set_colour 8 Back_def;
513         print "OOO";
514
515         @set_colour Fore_def Back_def;
516 ];
517
518
519 [ draw_big_kitten x y;
520
521         if (x == 0)
522                 x = 1;
523         if (y == 0)
524                 y = 1;
525         @set_cursor y x;
526
527         @set_colour 5 Back_def;
528         print "|", (char) 92, "_/|";
529         y++;
530         @set_cursor y x;
531         print "|";
532         @set_colour 4 Back_def;
533         print "o o";
534         @set_colour 5 Back_def;
535         print "|__";
536         y++;
537         @set_cursor y x;
538         @set_colour 9 Back_def;
539         print "--";
540         @set_colour 3 Back_def;
541         print "*";
542         @set_colour 9 Back_def;
543         print "--";
544         @set_colour 5 Back_def;
545         print "__", (char) 92;
546         y++;
547         @set_cursor y x;
548         print "C_C(____)";      
549
550         @set_colour Fore_def Back_def;
551 ];
552
553
554 [ draw_big_kitten_psycho x y;
555
556         if (x == 0)
557                 x = 1;
558         if (y == 0)
559                 y = 1;
560         @set_cursor y x;
561
562         @set_colour 5 Back_def;
563         print " |", (char) 92, "_/|";
564         y++;
565         @set_cursor y x;
566         @set_colour 4 Back_def;
567         print "(|) (|)";
568         @set_colour 5 Back_def;
569         print "_";
570         y++;
571         @set_cursor y x;
572         @set_colour 9 Back_def;
573         print " --";
574         @set_colour 3 Back_def;
575         print "O";
576         @set_colour 9 Back_def;
577         print "--";
578         @set_colour 5 Back_def;
579         print "__", (char) 92;
580         y++;
581         @set_cursor y x;
582         print " 3_3(____)";     
583
584         @set_colour Fore_def Back_def;
585 ];
586
587 ! Something gets messed up if I make this local to findkitten()
588 ! When going right or left, then up or down to hit the Kitten, the
589 ! animation gets reversed.
590
591 Global last_right = false;
592
593 [ findkitten key i;
594
595         @erase_window $ffff;
596         @split_window TopBar;
597         @set_window 1;
598         @set_cursor 1 1;
599
600         Banner();
601         print (string) last_message;
602         draw_horiz(TopBar);
603
604         draw_object(kitten_x, kitten_y, kitten_char, kitten_color);
605         draw_nonkittens();
606
607         #IFV5; style reverse; #ENDIF;
608         draw_object(player_x, player_y, '#');
609         #IFV5; style roman; #ENDIF;
610
611         @set_cursor 1 Width;
612
613         ! Get movement key
614         !
615         key = getkey();
616
617         ! Move Robot
618         !
619         player_x_last = player_x;
620         player_y_last = player_y;
621         switch (key) {
622         'Q', $1b:       rfalse;                 ! exit game ($1b == Esc)
623         '8', 'K', 129:  player_y--;             ! up
624         '2', 'J', 130:  player_y++;             ! down
625         '4', 'H', 131:  player_x--;             ! left
626                         last_right = false;
627         '6', 'L', 132:  player_x++;             ! right
628                         last_right = true;
629
630         '7', 'Y':       player_y--; player_x--; ! up-left
631                         last_right = false;
632         '9', 'U':       player_y--; player_x++; ! up-right
633                         last_right = true;
634         '1', 'B':       player_y++; player_x--; ! down-left
635                         last_right = false;
636         '3', 'N':       player_y++; player_x++; ! down-right
637                         last_right = true;
638         }
639
640         ! Keep Robot from falling off edges of playfield.
641         !
642         if (player_y == TopBar || player_y > Height) {
643                 player_y = player_y_last;
644         }
645         if (player_x < 1 || player_x > Width) {
646                 player_x = player_x_last;
647         }
648
649         ! Detect and handle collisions.
650         !
651         if (player_x == kitten_x && player_y == kitten_y) {
652                 animate_kitten(key, last_right);
653                 getkey();
654                 rfalse;
655         }
656         for (i = 0: i < nonkitten_count: i++) {
657                 if (player_x == nonkitten_x-->i
658                 && player_y == nonkitten_y-->i) {
659                         @set_cursor 1 1;
660                         last_message = lookup_msg(nonkitten_msg-->i);
661                         player_x = player_x_last;
662                         player_y = player_y_last;
663                 }
664         }
665         rtrue;
666 ];
667
668
669 [ animate_kitten key my_last_right i j junk robot_x anim_finished;
670
671         switch (key) {
672         '8', 'J', 129:  player_y++;
673         '2', 'K', 130:  player_y--;
674         '4', 'H', 131:  player_x++;
675         '6', 'L', 132:  player_x--;
676         '7', 'Y':       player_y++; player_x++; 
677         '9', 'U':       player_y++; player_x--;
678         '1', 'B':       player_y--; player_x++;
679         '3', 'N':       player_y--; player_x--;
680         }
681
682         anim_finished = false;
683         for (i = 4: i >= 0: i--) {
684                 @erase_window $ffff;
685                 @split_window TopBar;
686                 @set_window 1;
687                 @set_cursor 1 1;
688
689                 Banner();
690                 draw_horiz(TopBar);
691
692                 if (i > 0) {
693                         if (my_last_right) {
694                                 robot_x = Anim_Meet - i;
695                                 #IFV5; style reverse; #ENDIF;
696                                 draw_object(robot_x, TopBar - 1, '#');
697                                 #IFV5; style roman; #ENDIF;
698                                 draw_object(Anim_Meet - 1 + i, TopBar - 1, 
699                                         kitten_char, kitten_color);
700                         } else {
701                                 robot_x = Anim_Meet - 1 + i;
702                                 #IFV5; style reverse; #ENDIF;
703                                 draw_object(robot_x, TopBar - 1, '#');
704                                 #IFV5; style roman; #ENDIF;
705                                 draw_object(Anim_Meet - i, TopBar - 1,
706                                         kitten_char, kitten_color);
707                         }
708                 } else {
709                         j = TopBar - 1;
710                         @set_cursor j 1;
711                         print "You found Kitten!  Way to go, Robot!";
712                         anim_finished = true;
713                 }
714
715                 draw_object(kitten_x, kitten_y, kitten_char, kitten_color);
716
717                 #IFV5; style reverse; #ENDIF;
718                 draw_object(player_x, player_y, '#');
719                 #IFV5; style roman; #ENDIF;
720                 draw_nonkittens();
721
722                 if (anim_finished == false) {
723                         j = TopBar - 1;
724                         @set_cursor 1 Width;
725                         @aread junk 0 10 pause -> junk;
726                 } else {
727                         #IFV5; style reverse; #ENDIF;
728                         draw_object(player_x, player_y, '#');
729                         #IFV5; style roman; #ENDIF;
730                         @set_cursor 1 Width;
731                 }
732         }
733 ];
734
735 [ already_seen_xy x y i;
736         for (i = 0: i < already_count: i++) {
737                 if (already_x-->already_count == x &&
738                 already_y-->already_count ==y) {
739                         rtrue;
740                 }
741         }
742         already_x-->already_count = x;
743         already_y-->already_count = y;
744         already_count++;
745         rfalse;
746 ];
747
748
749 [ pause;
750         rtrue;
751 ];
752
753
754 [ init_kitten;
755         kitten_x = get_random_x();
756         kitten_y = get_random_y();
757         kitten_color = get_random_color();
758
759         while (already_seen_xy(kitten_x, kitten_y) == true) {
760                 kitten_x = get_random_x();
761                 kitten_y = get_random_y();
762         }
763         kitten_char = get_random_char();
764 ];
765
766
767 [ init_robot;
768         player_x = get_random_x();
769         player_y = get_random_y();
770
771         while (already_seen_xy(player_x, player_y) == true) {
772                 player_x = get_random_x();
773                 player_y = get_random_y();
774         }
775 ];      
776
777
778 [ init_nonkittens i;
779         already_msg_count = 0;
780         last_message = "";
781
782         for (i = 0: i < nonkitten_count: i++) {
783                 nonkitten_x-->i = get_random_x();
784                 nonkitten_y-->i = get_random_y();
785                 nonkitten_color-->i = get_random_color();
786
787                 while (already_seen_xy(nonkitten_x-->i, 
788                         nonkitten_y-->i) == true) {
789                         nonkitten_x-->i = get_random_x();
790                         nonkitten_y-->i = get_random_y();
791                 }
792                 nonkitten_char-->i = get_random_char();
793                 nonkitten_msg-->i = get_random_msg();
794         }
795 ];
796
797
798 [ draw_nonkittens i;
799         for (i = 0: i < nonkitten_count: i++) {
800                 draw_object(nonkitten_x-->i,
801                                 nonkitten_y-->i,
802                                 nonkitten_char-->i,
803                                 nonkitten_color-->i);
804         }
805 ];
806
807
808 [ draw_object x y character fore back;
809         @set_cursor y x;
810
811         if (fore == "")
812                 fore = Back_def;
813         if (back == "")
814                 back = Back_def;
815         
816
817         @set_colour fore Back_def;
818         if (character)
819                 print (char) character;
820
821         @set_colour Fore_def Back_def;
822
823 ];
824
825
826 [ draw_horiz row i;
827         @set_cursor row 1;
828         for (i = 0 : i < Width : i++)
829                 print (char) '-';
830 ];
831
832
833 [ getkey x;
834         @read_char 1 -> x;
835         if (x >= 'a' && x <= 'z')
836                 x = x - ('a' - 'A');
837         return x;
838 ];
839
840
841 [ get_random_char num;
842         num = random(93);
843         num = num + 33;
844         while (num == 35) {             ! avoid choosing '#'
845                 num = random(93);
846                 num = num + 33;
847         }
848         return num;
849 ];
850
851
852 [ get_random_msg num;
853         num = random(MESSAGE_NUM);
854         while (is_duplicate_msg(num) == true) {
855                 num = random(MESSAGE_NUM);
856         }
857         return num;
858 ];
859
860 [ get_random_color num;
861         num = random(7) + 2;
862         ! 0 and 1 are default color and current color
863         ! and we want to avoid picking the default color explicitly
864         while (num == $2c-->0) {
865                 num = random(7) + 2;
866         }
867         return num;
868 ];
869
870
871 [ is_duplicate_msg num i;
872         for (i = 0: i < already_msg_count: i++) {
873                 if (already_msg-->i==num) {
874                         rtrue;
875                 }
876         }
877         already_msg-->already_msg_count = num;
878         already_msg_count++;
879         rfalse;
880 ];
881
882
883 [ get_random_x;
884         return random(Width);
885 ];
886
887
888 [ get_random_y num ok;
889         ok = false;
890         ! Make sure we don't draw in the status bar.
891         while (ok == false) {
892                 num = random(Height);
893                 if (num > TopBar)
894                         ok = true;
895         }
896         return num;
897 ];
898
899
900 ! This function is mainly of use to members of the robotfindskitten
901 ! development team.
902 !
903 ! When this function is uncommented and enabled in
904 ! the menu, this will cause a script file to be emitted which contains
905 ! all NKIs properly formatted.
906
907 ![ print_all_nki num mystring;
908 !       @output_stream 2; @output_stream -1;
909 !       for (num = 1: num <= MESSAGE_NUM: num++) {
910 !               mystring = lookup_msg(num);
911 !               print (string)lookup_msg(num), "^";
912 !       }
913 !       @output_stream -2; @output_stream 1;
914 !];
915
916
917 ! Note:
918 ! @@126 == '~'
919 ! @@64 == '@'
920
921 [ lookup_msg num;
922         switch(num) {
923 1:      return "~I pity the fool who mistakes me for kitten!~, sez Mr. T.";
924 2:      return "That's just an old tin can.";
925 3:      return "It's an altar to the horse god.";
926 4:      return "A box of dancing mechanical pencils.  They dance!  They sing!";
927 5:      return "It's an old Duke Ellington record.";
928 6:      return "A box of fumigation pellets.";
929 7:      return "A digital clock. It's stuck at 2:17 PM.";
930 8:      return "That's just a charred human corpse.";
931 9:      return "I don't know what that is, but it's not kitten.";
932 10:     return "An empty shopping bag.  Paper or plastic?";
933 11:     return "Could it be... a big ugly bowling trophy?";
934 12:     return "A coat hanger hovers in thin air.  Odd.";
935 13:     return "Not kitten, just a packet of Kool-Aid(tm).";
936 14:     return "A freshly-baked pumpkin pie.";
937 15:     return "A lone, forgotten comma, sits here, sobbing.";
938 16:     return "ONE HUNDRED THOUSAND CARPET FIBERS!!!!!";
939 17:     return "It's Richard Nixon's nose!";
940 18:     return "It's Lucy Ricardo. ~Aaaah, Ricky!~, she says.";
941 19:     return "You stumble upon Bill Gates' stand-up act.";
942 20:     return "Just an autographed copy of the Kama Sutra.";
943 21:     return "It's the Will Rogers Highway.  Who was Will Rogers, anyway?";
944 22:     return "It's another robot, more advanced in design than you but strangely immobile.";
945 23:     return "Leonard Richardson is here, asking people to lick him.";
946 24:     return "It's a stupid mask, fashioned after a beagle.";
947 25:     return "Your State Farm Insurance(tm) representative!";
948 26:     return "It's the local draft board.";
949 27:     return "Seven 1/4~ screws and a piece of plastic.";
950 28:     return "An 80286 machine.";
951 29:     return "One of those stupid ~Homes of the Stars~ maps.";
952 30:     return "A signpost saying ~TO KITTEN~.  It points in no particular direction.";
953 31:     return "A hammock stretched between a tree and a volleyball pole.";
954 32:     return "A Texas Instruments of Destruction calculator.";
955 33:     return "It's a dark, amphorous blob of matter.";
956 34:     return "Just a pincushion.";
957 35:     return "It's a mighty zombie talking about some love and prosperity.";
958 36:     return "~Dear robot, you may have already won our 10 MILLION DOLLAR prize...~";
959 37:     return "It's just an object.";
960 38:     return "A mere collection of pixels.";
961 39:     return "A badly dented high-hat cymbal lies on its side here.";
962 40:     return "A marijuana brownie.";
963 41:     return "A plush Chewbacca.";
964 42:     return "Daily hunger conditioner from Australasia";
965 43:     return "Just some stuff.";
966 44:     return "Why are you touching this when you should be finding kitten?";
967 45:     return "A glorious fan of peacock feathers.";
968 46:     return "It's some compromising photos of Babar the Elephant.";
969 47:     return "A copy of the Weekly World News. Watch out for the chambered nautilus!";
970 48:     return "It's the proverbial wet blanket.";
971 49:     return "A ~Get Out of Jail Free~ card.";
972 50:     return "An incredibly expensive ~Mad About You~ collector plate.";
973 51:     return "Paul Moyer's necktie.";
974 52:     return "A haircut and a real job.  Now you know where to get one!";
975 53:     return "An automated robot-hater.  It frowns disapprovingly at you.";
976 54:     return "An automated robot-liker.  It smiles at you.";
977 55:     return "It's a black hole.  Don't fall in!";
978 56:     return "Just a big brick wall.";
979 57:     return "You found kitten!  No, just kidding.";
980 58:     return "Heart of Darkness brand pistachio nuts.";
981 59:     return "A smoking branding iron shaped like a 24-pin connector.";
982 60:     return "It's a Java applet.";
983 61:     return "An abandoned used-car lot.";
984 62:     return "A shameless plug for Crummy: http://www.crummy.com/";
985 63:     return "A shameless plug for the UCLA Linux Users Group: http://linux.ucla.edu/";
986 64:     return "A can of Spam Lite.";
987 65:     return "This is another fine mess you've gotten us into, Stanley.";
988 66:     return "It's scenery for ~Waiting for Godot~.";
989 67:     return "This grain elevator towers high above you.";
990 68:     return "A Mentos wrapper.";
991 69:     return "It's the constellation Pisces.";
992 70:     return "It's a fly on the wall.  Hi, fly!";
993 71:     return "This kind of looks like kitten, but it's not.";
994 72:     return "It's a banana!  Oh, joy!";
995 73:     return "A helicopter has crashed here.";
996 74:     return "Carlos Tarango stands here, doing his best impression of Pat Smear.";
997 75:     return "A patch of mushrooms grows here.";
998 76:     return "A patch of grape jelly grows here.";
999 77:     return "A spindle, and a grindle, and a bucka-wacka-woom!";
1000 78:     return "A geyser sprays water high into the air.";
1001 79:     return "A toenail?  What good is a toenail?";
1002 80:     return "You've found the fish!  Not that it does you much good in this game.";
1003 81:     return "A Buttertonsils bar.";
1004 82:     return "One of the few remaining discoes.";
1005 83:     return "Ah, the uniform of a Revolutionary-era minuteman.";
1006 84:     return "A punch bowl, filled with punch and lemon slices.";
1007 85:     return "It's nothing but a G-thang, baby.";
1008 86:     return "IT'S ALIVE! AH HA HA HA HA!";
1009 87:     return "This was no boating accident!";
1010 88:     return "Wait!  This isn't the poker chip!  You've been tricked!  DAMN YOU, MENDEZ!";
1011 89:     return "A livery stable!  Get your livery!";
1012 90:     return "It's a perpetual immobility machine.";
1013 91:     return "~On this spot in 1962, Henry Winkler was sick.~";
1014 92:     return "There's nothing here; it's just an optical illusion.";
1015 93:     return "The World's Biggest Motzah Ball!";
1016 94:     return "A tribe of cannibals lives here.  They eat Malt-O-Meal for breakfast, you know.";
1017 95:     return "This appears to be a rather large stack of trashy romance novels.";
1018 96:     return "Look out!  Exclamation points!";
1019 97:     return "A herd of wild coffee mugs slumber here.";
1020 98:     return "It's a limbo bar!  How low can you go?";
1021 99:     return "It's the horizon.  Now THAT'S weird.";
1022 100:    return "A vase full of artificial flowers is stuck to the floor here.";
1023 101:    return "A large snake bars your way.";
1024 102:    return "A pair of saloon-style doors swing slowly back and forth here.";
1025 103:    return "It's an ordinary bust of Beethoven... but why is it painted green?";
1026 104:    return "It's TV's lovable wisecracking Crow! ~Bite me!~, he says.";
1027 105:    return "Hey, look, it's war.  What is it good for?  Absolutely nothing.  Say it again.";
1028 106:    return "It's the amazing self-referential thing that's not kitten.";
1029 107:    return "A flamboyant feather boa.  Now you can dress up like Carol Channing!";
1030 108:    return "~Sure hope we get some rain soon,~ says Farmer Joe.";
1031 109:    return "~How in heck can I wash my neck if it ain't gonna rain no more?~ asks Farmer Al.";
1032 110:    return "~Topsoil's all gone, ma,~ weeps Lil' Greg.";
1033 111:    return "This is a large brown bear.  Oddly enough, it's currently peeing in the woods.";
1034 112:    return "A team of arctic explorers is camped here.";
1035 113:    return "This object here appears to be Louis Farrakhan's bow tie.";
1036 114:    return "This is the world-famous Chain of Jockstraps.";
1037 115:    return "A trash compactor, compacting away.";
1038 116:    return "This toaster strudel is riddled with bullet holes!";
1039 117:    return "It's a hologram of a crashed helicopter.";
1040 118:    return "This is a television.  On screen you see a robot strangely similar to yourself.";
1041 119:    return "This balogna has a first name, it's R-A-N-C-I-D.";
1042 120:    return "A salmon hatchery?  Look again.  It's merely a single salmon.";
1043 121:    return "It's a rim shot.  Ba-da-boom!";
1044 122:    return "It's creepy and it's kooky, mysterious and spooky.  It's also somewhat ooky.";
1045 123:    return "This is an anagram.";
1046 124:    return "This object is like an analogy.";
1047 125:    return "It's a symbol.  You see in it a model for all symbols everywhere.";
1048 126:    return "The object pushes back at you.";
1049 127:    return "A traffic signal.  It appears to have been recently vandalized.";
1050 128:    return "~There is no kitten!~ cackles the old crone.  You are shocked by her blasphemy.";
1051 129:    return "This is a Lagrange point.  Don't come too close now.";
1052 130:    return "The dirty old tramp bemoans the loss of his harmonica.";
1053 131:    return "Look, it's Fanny the Irishman!";
1054 132:    return "What in blazes is this?";
1055 133:    return "It's the instruction manual for a previous version of this game.";
1056 134:    return "A brain cell.  Oddly enough, it seems to be functioning.";
1057 135:    return "Tea and/or crumpets.";
1058 136:    return "This jukebox has nothing but Cliff Richards albums in it.";
1059 137:    return "It's a Quaker Oatmeal tube, converted into a drum.";
1060 138:    return "This is a remote control.  Being a robot, you keep a wide berth.";
1061 139:    return "It's a roll of industrial-strength copper wire.";
1062 140:    return "Oh boy!  Grub!  Er, grubs.";
1063 141:    return "A puddle of mud, where the mudskippers play.";
1064 142:    return "Plenty of nothing.";
1065 143:    return "Look at that, it's the Crudmobile.";
1066 144:    return "Just Walter Mattheau and Jack Lemmon.";
1067 145:    return "Two crepes, two crepes in a box.";
1068 146:    return "An autographed copy of ~Primary Colors~, by Anonymous.";
1069 147:    return "Another rabbit?  That's three today!";
1070 148:    return "It's a segmentation fault.  Core dumped, by the way.";
1071 149:    return "A historical marker showing the actual location of /dev/null.";
1072 150:    return "Thar's Mobius Dick, the convoluted whale.  Arrr!";
1073 151:    return "It's a charcoal briquette, smoking away.";
1074 151:    return "A pizza, melting in the sun.";
1075 152:    return "It's a ~HOME ALONE 2: Lost in New York~ novelty cup.";
1076 153:    return "A stack of 7 inch floppies wobbles precariously.";
1077 153:    return "It's nothing but a corrupted floppy.  Coaster anyone?";
1078 154:    return "A section of glowing phosphor cells sings a song of radiation to you.";
1079 155:    return "This TRS-80 III is eerily silent.";
1080 156:    return "A toilet bowl occupies this space.";
1081 157:    return "This peg-leg is stuck in a knothole!";
1082 158:    return "It's a solitary vaccuum tube.";
1083 159:    return "This corroded robot is clutching a mitten.";
1084 160:    return "~Hi, I'm Anson Williams, TV's 'Potsy'.~";
1085 161:    return "This subwoofer was blown out in 1974.";
1086 162:    return "Three half-pennies and a wooden nickel.";
1087 163:    return "It's the missing chapter to ~A Clockwork Orange~.";
1088 164:    return "It's a burrito stand flyer.  ~Taqueria El Ranchito~.";
1089 165:    return "This smiling family is happy because they eat LARD.";
1090 166:    return "Roger Avery, persona un famoso de los Estados Unidos.";
1091 167:    return "Ne'er but a potted plant.";
1092 168:    return "A parrot, kipping on its back.";
1093 169:    return "A forgotten telephone switchboard.";
1094 170:    return "A forgotten telephone switchboard operator.";
1095 171:    return "It's an automated robot-disdainer.  It pretends you're not there.";
1096 172:    return "It's a portable hole.  A sign reads: ~Closed for the winter~.";
1097 173:    return "Just a moldy loaf of bread.";
1098 174:    return "A little glass tub of Carmex. ($.89)  Too bad you have no lips.";
1099 175:    return "A Swiss-Army knife.  All of its appendages are out.  (toothpick lost)";
1100 176:    return "It's a zen simulation, trapped within an ASCII character.";
1101 177:    return "It's a copy of ~The Rubaiyat of Spike Schudy~.";
1102 178:    return "It's ~War and Peace~ (unabridged, very small print).";
1103 179:    return "A willing, ripe tomato bemoans your inability to digest fruit.";
1104 180:    return "A robot comedian.  You feel amused.";
1105 181:    return "It's KITT, the talking car.";
1106 182:    return "Here's Pete Peterson.  His batteries seem to have long gone dead.";
1107 183:    return "~Blup, blup, blup~, says the mud pot.";
1108 184:    return "More grist for the mill.";
1109 185:    return "Grind 'em up, spit 'em out, they're twigs.";
1110 186:    return "The boom box cranks out an old Ethel Merman tune.";
1111 187:    return "It's ~Finding kitten~, published by O'Reilly and Associates.";
1112 188:    return "Pumpkin pie spice.";
1113 189:    return "It's the Bass-Matic '76!  Mmm, that's good bass!";
1114 190:    return "~Lend us a fiver 'til Thursday~, pleas Andy Capp.";
1115 191:    return "It's a tape of '70s rock.  All original hits!  All original artists!";
1116 192:    return "You've found the fabled America Online disk graveyard!";
1117 193:    return "Empty jewelboxes litter the landscape.";
1118 194:    return "It's the astounding meta-object.";
1119 195:    return "Ed McMahon stands here, lost in thought.  Seeing you, he bellows, ~YES SIR!~";
1120 196:    return "...thingy???";
1121 197:    return "It's 1000 secrets the government doesn't want you to know!";
1122 198:    return "The letters O and R.";
1123 199:    return "A magical... magic thing.";
1124 200:    return "It's a moment of silence.";
1125 201:    return "It's Sirhan-Sirhan, looking guilty.";
1126 202:    return "It's ~Chicken Soup for the Kitten-seeking Soulless Robot.~";
1127 203:    return "It is a set of wind-up chatter teeth.";
1128 204:    return "It is a cloud shaped like an ox.";
1129 205:    return "You see a snowflake here, melting slowly.";
1130 206:    return "It's a big block of ice.  Something seems to be frozen inside it.";
1131 207:    return "Vladimir Lenin's casket rests here.";
1132 208:    return "It's a copy of ~Zen and The Art of Robot Maintenance~.";
1133 209:    return "This invisible box contains a pantomime horse.";
1134 210:    return "A mason jar lies here open.  It's label reads: ~do not open!~.";
1135 211:    return "A train of thought chugs through here.";
1136 212:    return "This jar of pickles expired in 1957.";
1137 213:    return "Someone's identity disk lies here.";
1138 214:    return "~Yes!~ says the bit.";
1139 215:    return "~No!~ says the bit.";
1140 216:    return "A dodecahedron bars your way.";
1141 217:    return "Mr. Hooper is here, surfing.";
1142 218:    return "It's a big smoking fish.";
1143 219:    return "You have new mail in /var/spool/robot";
1144 220:    return "Just a monitor with the blue element burnt out.";
1145 221:    return "A pile of coaxial plumbing lies here.";
1146 222:    return "It's a rotten old shoe.";
1147 223:    return "It's a hundred-dollar bill.";
1148 224:    return "It's a Dvorak keyboard.";
1149 225:    return "It's a cardboard box full of 8-tracks.";
1150 226:    return "Just a broken hard drive containg the archives of Nerth Pork.";
1151 227:    return "A broken metronome sits here, it's needle off to one side.";
1152 228:    return "A sign reads: ~Go home!~";
1153 229:    return "A sign reads: ~No robots allowed!~";
1154 230:    return "It's the handheld robotfindskitten game, by Tiger.";
1155 231:    return "This particular monstrosity appears to be ENIAC.";
1156 232:    return "This is a tasty-looking banana creme pie.";
1157 233:    return "A wireframe model of a hot dog rotates in space here.";
1158 234:    return "Just the empty husk of a locust.";
1159 235:    return "You disturb a murder of crows.";
1160 236:    return "It's a copy of the robotfindskitten EULA.";
1161 237:    return "It's Death.";
1162 238:    return "It's an autographed copy of ~Secondary Colors~, by Bob Ross.";
1163 239:    return "It is a marzipan dreadnought that appears to have melted and stuck.";
1164 240:    return "It's a DVD of ~Crouching Monkey, Hidden Kitten~, region encoded for the moon.";
1165 241:    return "It's Kieran Hervold.  Damn dyslexia!";
1166 242:    return "A non-descript box of crackers.";
1167 243:    return "Carbonated Water, High Fructose Corn Syrup, Color, Phosphoric Acid, Flavors, Caffeine.";
1168 244:    return "~Move along! Nothing to see here!~";
1169 245:    return "It's the embalmed corpse of Vladimir Lenin.";
1170 246:    return "A coupon for one free steak-fish at your local family diner.";
1171 247:    return "A set of keys to a 2001 Rolls Royce.  Worthless.";
1172
1173 ! The following Non Kitten Items were added by David Griffith
1174 !
1175 248:    return "It's the Golden Banana of Discord!";
1176 249:    return "The Inform Designer's Manual (4th edition)";
1177 250:    return "A packet of pipe cleaners.";
1178 251:    return "It's Andrew Plotkin plotting something.";
1179 252:    return "A half-eaten cheese sandwich.";
1180 253:    return "Clang, clang, clang goes the tranny!";
1181 254:    return "A family of integrals are here integrating.";
1182 255:    return "A tuft of kitten fur, but no kitten.";
1183 256:    return "A bottle of oil!  Refreshing!";
1184 257:    return "A shameless plug for Frotz: http://www.cs.csubak.edu/@@126dgriffi/proj/frotz/";
1185 258:    return "Clifford Stoll is here selling Klein bottles.";
1186 259:    return "You found the marble in the oatmeal!";
1187 260:    return "An empty Altoids tin.";
1188 261:    return "An empty Penguin Mints tin.";
1189 262:    return "So, THAT's what an invisible barrier looks like!";
1190 263:    return "A cluster of cattails are growing here.";
1191 264:    return "A discarded bagpipe chanter reed.";
1192 265:    return "Big Bird is here looking for Mr. Looper.";
1193 266:    return "It's a Linux install CD.";
1194 267:    return "You found Puppy!  Too bad this isn't ~Robot Finds Puppy~.";
1195 268:    return "Several meters of cat5 cable.";
1196 269:    return "A scrap of parchment bears the single word, ~meow~.";
1197 270:    return "A puddle of chocolate sauce.";
1198 271:    return "Your pal Floyd is here and wants to play Hucka-Bucka-Beanstalk.";
1199 272:    return "Someone is talking to Ralph on the big white phone here.";
1200 273:    return "'Twas brillig in the slivey-toves...";
1201 274:    return "Darth Vader is here looking for his Teddywookie.";
1202 275:    return "A baboon with a bassoon hoots angrily at you.";
1203 276:    return "Catsup and Mustard all over the place!  It's the Human Hamburger!";
1204 277:    return "Gibble, Gobble, we ACCEPT YOU ...";
1205 278:    return "A rancid corn dog.";
1206 279:    return "It's a tribute to fishnet stockings.";
1207 280:    return "A jar of Vegemite is playing hopscotch here.";
1208 281:    return "Nipples, dimples, knuckles, NICKLES, wrinkles, pimples!!";
1209 282:    return "A bottle of hair tonic.";
1210 283:    return "A packet of catnip.";
1211 284:    return "Here's Cal Worthington and his dog ~Spot~!";
1212 285:    return "It's Uncle Doctor Hurkamur!";
1213 286:    return "YEEEEEEEEEEEHAAAAAAAA!!!!!";
1214 287:    return "Thunder, Thunder, Thunder, Thunder Cats!!!";
1215 288:    return "An overturned bottle of ink and lots of kitten pawprints.";
1216 289:    return "A flyer advertising a sale at Spatula City.";
1217 290:    return "A 540Hz tuning fork.";
1218 291:    return "A 3-inch floppy disk.";
1219 292:    return "Seargent Duffy is here.";
1220 293:    return "A ball of pocket fluff.";
1221 294:    return "A 3-sided Monty Python record.";
1222 295:    return "A Sanrio catalog.";
1223 296:    return "A scratching-post.";
1224 297:    return "Butane!!!";
1225 298:    return "An ice cube.";
1226 299:    return "Just a cage of white mice.";
1227 300:    return "You've found Harvey, the Wonder Hamster!";
1228 301:    return "A jar of dehydrated water.";
1229 302:    return "Just some swamp gas.";
1230 303:    return "A bowl of cherries.";
1231 304:    return "Spoon!!!";
1232 305:    return "A sign reads ~Don't step on the Mome Raths~.";
1233 306:    return "Dirty socks.";
1234 307:    return "~Dogbert's tech support, how may I abuse you?~";
1235 308:    return "A radio hisses away.  Kitten must have been here.";
1236 309:    return "~Kilroy was here~";
1237 310:    return "~Plexar was here~";
1238 311:    return "~Kibo was here~";
1239 312:    return "It's the cork to someone's lunch.";
1240 313:    return "A piping-hot pizza.  Useless.";
1241 314:    return "Diogenes is here demanding whisky.";
1242 315:    return "The Monolith of Spam towers above you.";
1243 316:    return "~Meow meow meow meow...~  How discouraging!  It's only a recording.";
1244 317:    return "Marvin is complaining about the pain in the diodes down his left side.";
1245 318:    return "Mr. Kamikaze and Mr. DNA are here drinking tea.";
1246 319:    return "Rene Descarte is whistling a happy tune here.";
1247 320:    return "Ooh, shiny!";
1248 321:    return "It's a giant slorr!";
1249 322:    return "A ketchup bottle (nearly empty).";
1250 323:    return "A large pile of rubber bands.";
1251 324:    return "A ton of feathers.";
1252 325:    return "This nonkitten may contain peanuts.";
1253 326:    return "A tree with some jelly nailed to it.";
1254 327:    return "Ah, the skirl of the pipes and the rustle of the silicon...";
1255 328:    return "You found Parakeet.  Too bad this isn't ~Robot Finds Parakeet~.";
1256 329:    return "A ball of yarn.";
1257 330:    return "A big chunk of frozen chocolate pudding.";
1258 331:    return "There is no tea here.";
1259 332:    return "An automated robot-doubter.  It doesn't believe in you.";
1260 333:    return "A plastic model of Kitten.";
1261 334:    return "It's Yorgle, the Yellow Dragon.";
1262 335:    return "It's Grundle, the Green Dragon.";
1263 336:    return "It's Rhindle, the Red Dragon.";
1264 337:    return "An old pattern is here going on and on.";
1265 338:    return "TV says donuts are high in fat.";
1266 339:    return "It's a pool with a straw in it.";
1267 340:    return "A singing frog.  Useless.";
1268 341:    return "It's a funky beat!";
1269 342:    return "A tiny ceramic Kitten.  It's probably not the Kitten you're looking for.";
1270 343:    return "An oven mitt with kittens on it.";
1271 344:    return "An empty coaxial cable spool.";
1272 345:    return "Billions and billions of things that aren't Kitten.";
1273 346:    return "Snarf?";
1274 347:    return "Faboo!";
1275 348:    return "99 bottles of beer are on a wall here.";
1276 349:    return "Hydraulic fluid and jagged metal bits.  You recoil from the scene of carnage.";
1277 350:    return "A bobolink is twittering a happy tune here.";
1278 351:    return "Biscuits.";
1279 352:    return "A blank deposit slip.";
1280 353:    return "What's that blue thing doing here?";
1281 354:    return "A travel-sized cyclotron.";
1282 355:    return "A largish bath towel.";
1283 356:    return "You found Chinchilla!  Too bad this isn't ~Robot Finds Chinchilla~.";
1284 357:    return "A meerkat... not even close.";
1285 358:    return "A green yo-yo.";
1286 359:    return "A hairless rat.";
1287 360:    return "Bright copper kettles.";
1288
1289 ! The following Non Kitten Items were added by David Griffith for
1290 ! Release 3
1291 !
1292 361:    return "Ten yards of avocado-green shag carpet.";
1293 362:    return "A zorkmid coin.";
1294 363:    return "It's Babe Flathead's favorite bat.";
1295 364:    return "It's cute like a kitten, but isn't a kitten.";
1296 365:    return "A cyclops glowers angrily at you.";
1297 366:    return "A discarded pop bottle.";
1298 367:    return "Definitely not Kitten.";
1299 368:    return "A mouse.";
1300 369:    return "Slack!";
1301 370:    return "A troll.  Ewww!!!";
1302 371:    return "A tube of white lithium grease.  Perfect for your robotic joints.";
1303 372:    return "Talcum powder.";
1304 373:    return "A breadbox.  Nope, Kitten isn't in the breadbox.";
1305 374:    return "An unlicensed nuclear accelerator.";
1306 375:    return "A sub-atomic particle languishes here all alone.";
1307 376:    return "A bowling ball with the name ~Bob~ inscribed on it.";
1308 377:    return "A briefcase filled with spy stuff.";
1309 378:    return "Is that an elephant's head or a winged sandal?";
1310 379:    return "Bibbidy bibbidy bibbidy bibbidy bibbidy bibbidy...";
1311 380:    return "A tube of toothpaste.  Too bad you have no teeth.";
1312 381:    return "This isn't the item you're looking for.";
1313 382:    return "A discarded refrigerator box.  Nope, Kitten isn't in the box.";
1314 383:    return "A paper shopping bag.  Nope, Kitten isn't in the bag.";
1315 384:    return "A flyer reads, ~Please donate hydraulic fluid~";
1316 385:    return "A dangly thing mangled by Kitten.";
1317 386:    return "A crouton.";
1318 387:    return "A patch from the Mammoth Caves.";
1319 388:    return "A leather pouch filled with multisided dice.";
1320 389:    return "A pair of combat boots.";
1321 390:    return "A pile of coconuts.";
1322 391:    return "A big bass drum bearing a hole and suspicious clawmarks.";
1323 392:    return "It's a clue!";
1324 393:    return "Long lost needle nose pliers.";
1325 394:    return "A vase of roses.";
1326 395:    return "A crystal ball.  It doesn't seem to know where Kitten is.";
1327 396:    return "It's Princess Leia, the yodel of life.";
1328 397:    return "Sigmund Freud is here asking about your mother.";
1329 398:    return "BURRRRP!!!!  Flavorful and full of protein!";
1330 399:    return "A jar of library paste.";
1331 400:    return "These aren't ordinary beans.  They're magic beans!";
1332 401:    return "Some sort of electronic handheld game from the 1970s.";
1333
1334 ! The following Non Kitten Items were added by David Griffith for
1335 ! Release 4
1336 !
1337 402:    return "Just some glop of some sort.";
1338 403:    return "A bottle of distilled water.";
1339 404:    return "A rusty slinky.  It was such a wonderful toy!";
1340 405:    return "Some coconut crabs are milling about here.";
1341 406:    return "Dancing cold water pipes.  Mikey must have been here.";
1342 407:    return "Ash is mumbling ~KLAATU BARATA NI<coughcough>~ here.";
1343 408:    return "It's a blob of white goo.";
1344
1345 ! The following Non Kitten Items were added by David Griffith from the
1346 ! official list of NKIs.
1347 !
1348 409:    return "A gravestone stands here.  ~Izchak Miller, ascended.~";
1349 410:    return "Someone has written ~ad aerarium~ on the ground here.";
1350 410:    return "A large blue eye floats in midair.";
1351 411:    return "This appears to be a statue of Perseus.";
1352 412:    return "There is an opulent throne here.";
1353 413:    return "It's a squad of Keystone Kops.";
1354 414:    return "This seems to be junk mail addressed to the finder of the Eye of Larn.";
1355 415:    return "A wondrous and intricate golden amulet.  Too bad you have no neck.";
1356 416:    return "The swampy ground around you seems to stink with disease.";
1357 417:    return "An animate blob of acid.  Being metallic, you keep well away.";
1358 418:    return "It's a copy of Knuth with the chapter on kitten-search algorithms torn out.";
1359 419:    return "A crowd of people, and at the center, a popular misconception.";
1360 420:    return "It's a blind man.  When you touch, he exclaims ~It's a kitten prospecting robot!~";
1361 421:    return "It's a lost wallet.  It's owner didn't have pets, so you discard it.";
1362 422:    return "This place is called Antarctica.  There is no kitten here.";
1363 423:    return "It's a mousetrap, baited with soap.";
1364 424:    return "A book with ~Don't Panic~ in large friendly letters across the cover.";
1365 425:    return "A compendium of haiku about metals.";
1366 426:    return "A discredited cosmology, relic of a bygone era.";
1367 427:    return "A hollow voice says ~Plugh~.";
1368 428:    return "A knight who says ~Either I am an insane knave, or you will find kitten.~";
1369 429:    return "A neural net -- maybe it's trying to recognize kitten.";
1370 430:    return "A screwdriver.";
1371 431:    return "A statue of a girl holding a goose like the one in Gottingen, Germany.";
1372 432:    return "A tetradrachm dated ~42 B.C.~";
1373 433:    return "A voice booms out ~Onward, kitten soldiers...~";
1374 434:    return "An eminently forgettable zahir.";
1375 435:    return "Apparently, it's Edmund Burke.";
1376 436:    return "For a moment, you feel something in your hands, but it disappears!";
1377 437:    return "Here is a book about Robert Kennedy.";
1378 438:    return "Hey, robot, leave those lists alone.";
1379 439:    return "Ho hum.  Another synthetic a posteriori.";
1380 440:    return "It's Asimov's Laws of Robotics.  You feel a strange affinity for them.";
1381 441:    return "It's Bach's Mass in B-minor!";
1382 442:    return "It's a bug.";
1383 443:    return "It's a synthetic a priori truth!  Immanuel would be so pleased!";
1384 444:    return "It's the Tiki Room.";
1385 445:    return "Just some old play by a Czech playwright, and you can't read Czech.";
1386 446:    return "Kitten is the letter 'Q'.  Oh, wait, maybe not.";
1387 447:    return "Quidquid Latine dictum sit, kitten non est.";
1388 448:    return "Sutro Tower is visible at some distance through the fog.";
1389 449:    return "The Digital Millennium Copyright Act of 1998.";
1390 450:    return "The United States Court of Appeals for the Federal Circuit.";
1391 451:    return "The non-kitten item like this but with ~false~ and ~true~ switched is true.";
1392 452:    return "This is the chapter called ~A Map of the Cat?~ from Feynman's autobiography.";
1393 453:    return "This is the forest primeval.";
1394 454:    return "Werner's ~Pocket Field Guide to Things That Are Not Kitten~.";
1395 455:    return "You found nettik, but that's backwards.";
1396 456:    return "You have found some zinc, but you must not stop here, for you must find kitten.";
1397 457:    return "~50 Years Among the Non-Kitten Items~, by Ann Droyd.";
1398 458:    return "~Robot may not injure kitten, or, through inaction, ...~";
1399 459:    return "~Address Allocation for Private Internets~ by Yakov Rekhter et al.";
1400 460:    return "~Mail Routing and the Domain System~ by Craig Partridge.";
1401 461:    return "~The Theory and Practice of Oligarchical Collectivism~ by Emmanuel Goldstein.";
1402 462:    return "~201 Kitten Verbs, Fully Conjugated~.  You look for ~find~.";
1403 463:    return "A card shark sits here, practicing his Faro shuffle.  He ignores you.";
1404 463:    return "A copy of DeCSS.  They're a dime a dozen these days.";
1405 464:    return "A demonic voice proclaims ~There is no kitten, only Zuul~.  You flee.";
1406 465:    return "A lotus.  You make an interesting pair.";
1407 466:    return "A milk carton, with a black and white picture of kitten on the side.";
1408 467:    return "Any ordinary robot could see from a mile away that this wasn't kitten.";
1409 468:    return "A stegosaurus, escaped from the stegosaurusfindsrobot game.  It finds you.";
1410 469:    return "Baling wire and chewing gum.";
1411 470:    return "Chewing gum and baling wire.";
1412 471:    return "Here is no kitten but only rock, rock and no kitten and the sandy road.";
1413 472:    return "Hey, I bet you thought this was kitten.";
1414 473:    return "It is an ancient mariner, and he stoppeth one of three.";
1415 474:    return "It pleases you to be kind to what appears to be kitten -- but it's not!";
1416 475:    return "It's a blatant plug for Ogg Vorbis, http://www.vorbis.com/";
1417 476:    return "It's a business plan for a new startup, kitten.net.";
1418 477:    return "It's a revised business plan for a new startup, my.kitten.net.";
1419 478:    return "It's a square.";
1420 479:    return "It seems to be a copy of ~A Tail of Two Kitties~.";
1421 480:    return "It's the Donation of Constantine!";
1422 481:    return "It's this message, nothing more.";
1423 482:    return "Lysine, an essential amino acid.  Well, maybe not for robots.";
1424 483:    return "No kitten here.";
1425 484:    return "The score for a Czech composer's ~Kitten-Finding Symphony in C~.";
1426 485:    return "This looks like Bradley's ~Appearance and Reality~, but it's really not.";
1427 486:    return "This non-kitten item no verb.";
1428 487:    return "You feel strangely unfulfilled.";
1429 488:    return "You hit the non-kitten item.  The non-kitten item fails to yowl.";
1430 489:    return "You suddenly yearn for your distant homeland.";
1431 490:    return "You've found the snows of yesteryear!  So that's where they all went to.";
1432 491:    return "Approaching.  One car.  J.  Followed by.  Two car.  M, M.  In five. Minutes.";
1433 491:    return "Free Jon Johansen!";
1434 492:    return "Free Dmitry Sklyarov!";
1435 493:    return "One person shouts ~What do we want?~ The crowd answers ~Free Dmitry!~";
1436 494:    return "Judith Platt insults librarians.";
1437 495:    return "This map is not the territory.";
1438 496:    return "~Go back to Libraria!~, says Pat Schroeder.";
1439 497:    return "This is a porcelain kitten-counter.  0, 0, 0, 0, 0...";
1440 498:    return "An old bootable business card, unfortunately cracked down the middle.";
1441 499:    return "A kitten sink, for washing kitten (if only kitten liked water).";
1442 500:    return "A kitten source (to match the kitten sink).";
1443 501:    return "If it's one thing, it's not another.";
1444 502:    return "If it's not one thing, it's another.";
1445 503:    return "A caboodle.";
1446 504:    return "A grin.";
1447 505:    return "A hedgehog.  It looks like it knows something important.";
1448 506:    return "You've found... Oh wait, that's just a cat.";
1449 507:    return "Robot should not be touching that.";
1450 508:    return "Air Guitar!!!  NA na NA na!!";
1451 509:    return "An aromatherapy candle burns with healing light.";
1452 510:    return "You find a bright shiny penny.";
1453 511:    return "It's a free Jon Johansen!";
1454 512:    return "It's a free Dmitry Sklyarov!";
1455 513:    return "The rothe hits!  The rothe hits!";
1456 514:    return "It's an Internet chain letter about sodium laureth sulfate.";
1457 515:    return "Ed Witten sits here, pondering string theory.";
1458 516:    return "Something is written here in the dust.  You read: ~rJbotfndQkttten~.";
1459 517:    return "We wish you a merry kitten, and a happy New Year!";
1460 518:    return "Run away!  Run away!";
1461 519:    return "You can see right through this copy of Brin's ~Transparent Society~.";
1462 520:    return "This copy of ~Steal This Book~ has been stolen from a bookstore.";
1463 521:    return "It's Roya Naini.";
1464 522:    return "This kit is the fourteenth in a series of kits named with Roman letters.";
1465 523:    return "This is the tenth key you've found so far.";
1466 524:    return "You find a fraud scheme in which loans are used as security for other loans.";
1467 525:    return "It's the phrase ~and her~, written in ancient Greek.";
1468 526:    return "It's the author of ~Randomness and Mathematical Proof~.";
1469 527:    return "It's the crusty exoskeleton of an arthropod!";
1470 528:    return "It's Emporer Shaddam the 4th's planet!";
1471 529:    return "It's the triangle leg adjacent to an angle divided by the leg opposite it.";
1472 530:    return "It's a bottle of nail polish remover.";
1473 531:    return "You found netkit!  Way to go, robot!";
1474 532:    return "It's the ASCII Floating Head of Seth David Schoen!";
1475 533:    return "A frosted pink party-cake, half eaten.";
1476 534:    return "A bitchin' homemade tesla coil.";
1477 535:    return "Conan O'Brian, sans jawbone.";
1478 536:    return "It's either a mirror, or another soulless kitten-seeking robot.";
1479 537:    return "Preoccupation with finding kitten prevents you from investigating further.";
1480 538:    return "Fonzie sits here, mumbling incoherently about a shark and a pair of waterskis.";
1481 539:    return "The ghost of your dance instructor, his face a paper-white mask of evil.";
1482 540:    return "A bag of groceries taken off the shelf before the expiration date.";
1483 541:    return "A book: Feng Shui, Zen: the art of randomly arranging items that are not kitten.";
1484 542:    return "This might be the fountain of youth, but you'll never know.";
1485 543:    return "Tigerbot Hesh.";
1486 544:    return "Stimutacs.";
1487 545:    return "A canister of pressurized whipped cream, sans whipped cream.";
1488 546:    return "The non-kitten item bites!";
1489 547:    return "A chain hanging from two posts reminds you of the Gateway Arch.";
1490 548:    return "A mathematician calculates the halting probability of a Turing machine.";
1491 549:    return "A number of short theatrical productions are indexed 1, 2, 3, ... n.";
1492 550:    return "A technical university in Australia.";
1493 551:    return "It is -- I just feel something wonderful is about to happen.";
1494 552:    return "It's a Cat 5 cable.";
1495 553:    return "It's a U.S. president.";
1496 554:    return "It's a piece of cloth used to cover a stage in between performances.";
1497 555:    return "The ionosphere seems charged with meaning.";
1498 556:    return "This tomography is like, hella axial, man!";
1499 557:    return "It's your favorite game -- robotfindscatan!";
1500 558:    return "Just a man selling an albatross.";
1501 559:    return "The intermission from a 1930s silent movie.";
1502 560:    return "It's an inverted billiard ball!";
1503 561:    return "The spectre of Sherlock Holmes wills you onwards.";
1504
1505 ! The following Non Kitten Items were added by David Griffith for
1506 ! Release 5
1507 !
1508 562:    return "It's a cookie shaped like a kitten.";
1509 563:    return "It's Professor Feedlebom.";
1510 564:    return "A bottle of smelling salts.";
1511 565:    return "Dinsdale!";
1512 566:    return "An Enfield Mk3 rifle.";
1513 567:    return "An M16 rifle.";
1514 568:    return "An M1911A1 pistol.";
1515 569:    return "An M9 pistol.";
1516 570:    return "It's a gun of some sort.";
1517 571:    return "An FN-FAL rifle.";
1518 572:    return "An old rusty revolver.";
1519 573:    return "An AK-47 rifle.";
1520 574:    return "An AK-97 rifle.";
1521 575:    return "A Remington 870 shotgun.";
1522 576:    return "It's a NetBSD install CD.";
1523 577:    return "It's a recursive recursive recursive recursive recursive...";
1524 578:    return "It's Brian Kernigan.";
1525 579:    return "It's Dennis Ritchie.";
1526 580:    return "It's nothing in particular.";
1527 581:    return "Just a box of backscratchers.";
1528 582:    return "An expired transistor.";
1529 583:    return "Air.";
1530 584:    return "A steam-powered bunnytron.";
1531 585:    return "Heeeeeeeeeeeeres Johnny!";
1532 586:    return "It's a catalog from some company called Infocom.";
1533 587:    return "A dark-emitting diode.";
1534 588:    return "A 256 kilobyte write-only memory chip.";
1535 589:    return "A box of brand-new nixie tubes.";
1536 590:    return "Alien underwear.";
1537 591:    return "A sack of hammers.";
1538 592:    return "A sack of wet mice.";
1539 593:    return "A sack of doorknobs.";
1540 594:    return "A rusty melon-baller.";
1541 595:    return "An atomic vector plotter.";
1542 596:    return "You really don't want to know what this is.";
1543 597:    return "A 100 meter long chain of jumbo paper clips.";
1544 598:    return "A cockatoo shrieks at you.";
1545 599:    return "It's Mary Poppins!";
1546 600:    return "A slightly-used smellovision set.";
1547 601:    return "Doodles Weaver is here looking over a horse race schedule.";
1548 602:    return "An overflowing bit bucket.";
1549 default: return "Unknown NKI";
1550         }
1551 ];