eric@snark.UUCP (Eric S. Raymond) (10/07/88)
This is a patch for the 'robots' game. It adds the following features: 1. Support for System V file locking on the score file (so you don't get bogus 'bad file number' messages at game end). 2. A new option 'beepbad' that rejects suicidal moves. This helps against typographical errors. I also have Oleg Kiselev's already-posted fix to good.c to prevent core dumps on some out-of-bounds array checks, available by email to interested parted. Is anyone still maintaining this creature? *** main.c-orig Wed Sep 21 18:24:29 1988 --- main.c Thu Oct 6 22:25:29 1988 *************** *** 21,27 **** bool dead = FALSE; bool last_stand; ! bool show_highscore = TRUE; bool running, adjacent, first_move, bad_move, waiting; bool moveable_heaps = TRUE; --- 21,28 ---- bool dead = FALSE; bool last_stand; ! bool show_highscore = FALSE; ! bool beep_badmoves = TRUE; bool running, adjacent, first_move, bad_move, waiting; bool moveable_heaps = TRUE; *************** *** 88,94 **** seed = time((time_t *)0)+getuid(); (void) signal(SIGQUIT,interrupt); (void) signal(SIGINT,interrupt); ! if( initscr() == ERR) { fprintf(stderr, "Curses won't initialise - seek a guru\n"); quit(FALSE); } --- 89,95 ---- seed = time((time_t *)0)+getuid(); (void) signal(SIGQUIT,interrupt); (void) signal(SIGINT,interrupt); ! if( (int)initscr() == ERR) { fprintf(stderr, "Curses won't initialise - seek a guru\n"); quit(FALSE); } *************** *** 325,331 **** --- 326,361 ---- return close(fd); } # else + #include <unistd.h> + # ifdef F_LOCK + lk_open(file, mode) /* open and lock a file using the lockf(3) sys call */ + char *file; + int mode; + { + int fd; + + if( (fd = open(file, mode)) < 0) + return -1; + if(lockf(fd, F_LOCK, 0) < 0) + { + (void) close(fd); + return -1; + } + return fd; + } + + lk_close( fd, file) + int fd; + char *file; + { + # ifdef lint + file = file; /* now will you shut up lint???? */ + # endif + return close(fd); + } + # else + # define LOCKTIME (60) /* 1 minute */ # include <sys/stat.h> *************** *** 372,376 **** perror(lfile); return close(fd); } ! # endif --- 402,407 ---- perror(lfile); return close(fd); } ! # endif /* !LOCKF */ + # endif /* !BSD42 */ *** opt.c-orig Wed Sep 21 18:54:34 1988 --- opt.c Thu Oct 6 22:28:00 1988 *************** *** 20,25 **** --- 20,29 ---- "showhscore", OPT_SHOW_HSCORE, # define OPT_NOSHOW_HSCORE 5 "noshowhscore", OPT_NOSHOW_HSCORE, + # define OPT_BEEP_BAD 6 + "beepbad", OPT_BEEP_BAD, + # define OPT_NOBEEP_BAD 7 + "nobeepbad", OPT_NOBEEP_BAD, 0, 0 }; *************** *** 72,77 **** --- 76,87 ---- break; case OPT_NOSHOW_HSCORE: show_highscore = FALSE; + break; + case OPT_BEEP_BAD: + beep_badmoves = TRUE; + break; + case OPT_NOBEEP_BAD: + beep_badmoves = FALSE; break; } } *** robots.6-orig Thu Oct 6 22:28:26 1988 --- robots.6 Thu Oct 6 22:34:50 1988 *************** *** 90,95 **** --- 90,99 ---- This option shows the highscore table after every game. The negated version will only print out the highscore only if you appear on it. + .IP beepbad + If this option is on, the program will emit a beep instead of executing + moves that would inevitably get you killed (it can't check this for teleports + of course). Useful if you mis-type a lot. .SH NOTE The first time the `t' command is used on a new level you are guaranteed not to land next to a robot, a count of *************** *** 111,113 **** --- 115,120 ---- Allan Black, Strathclyde University, Glasgow. .br Enhancements by Graeme Lunt & Julian Onions, Nottingham University. + .br + Further enhancements (including beepbad and System V file-locking support) + by Eric S. Raymond (eric@snark.UUCP). *** robots.h-orig Wed Sep 21 19:05:52 1988 --- robots.h Thu Oct 6 22:25:35 1988 *************** *** 65,70 **** --- 65,71 ---- extern bool moveable_heaps; extern bool show_highscore; + extern bool beep_badmoves; extern bool last_stand; extern bool bad_move; extern bool running; *** score.c-orig Fri Jul 10 02:46:09 1987 --- score.c Thu Oct 6 22:08:45 1988 *************** *** 87,93 **** sfile = (struct scorefile *)(malloc(FILE_SIZE)); if( sfile == NULL) { ! fprintf( stderr, "Out of memmory so no scoring"); return FALSE; } eof = &sfile[NUMSCORES]; --- 87,93 ---- sfile = (struct scorefile *)(malloc(FILE_SIZE)); if( sfile == NULL) { ! fprintf( stderr, "Out of memory so no scoring"); return FALSE; } eof = &sfile[NUMSCORES]; *** user.c-orig Wed Sep 21 18:54:51 1988 --- user.c Thu Oct 6 22:25:39 1988 *************** *** 197,202 **** --- 197,207 ---- } } } + if (beep_badmoves && !isgood(new_y, new_x)) + { + bad_move = TRUE; + return; + } move(new_y,new_x); switch(inch()) { case SCRAP: -- Eric S. Raymond (the mad mastermind of TMN-Netnews) UUCP: ...!{uunet,att,rutgers}!snark!eric = eric@snark.UUCP Post: 22 S. Warren Avenue, Malvern, PA 19355 Phone: (215)-296-5718