pjc@ptsfa.UUCP (Paul Condie) (07/28/86)
This is a robot game for Unix system V using curses. Man page included. {ihnp4,lll-crg,qantel,pyramid}!ptsfa!pjc ------------------------- CUT HERE ----------------------- : This is a shar archive. Extract with sh, not csh. : The rest of this file will extract: : AppendNode.c ClrBoard.c DeleteNode.c GameBoard.c InsertNode.c Main.c TopTen.c define.h deleterbts.c dmpscore.c dress.c dumpstats.c getargs.c getdate.c gettops.c loadtops.c makefile modifylog.h moverbts.c moveyou.c printprg.sh robots.1 showrbts.c showscore.c showyou.c writetop.c echo x - AppendNode.c sed 's/^X//' >AppendNode.c <<'*-*-END-of-AppendNode.c-*-*' X#include "define.h" X X#define NULL 0 X XAppendNode (head, tail, size) X X ToptenNode *head, *tail; X int size; X{ X ToptenNode newnode; X ToptenNode malloc(); X X if ((newnode = malloc (size)) == NULL) return (-1); X if (*tail == NULL) X { X *head = newnode; X *tail = newnode; X newnode->prev = NULL; X newnode->next = NULL; X } X else X { X (*tail)->next = newnode; X newnode->prev = *tail; X newnode->next = NULL; X *tail = newnode; X } X return (0); X} *-*-END-of-AppendNode.c-*-* echo x - ClrBoard.c sed 's/^X//' >ClrBoard.c <<'*-*-END-of-ClrBoard.c-*-*' X#include <curses.h> X#include "define.h" X XClrBoard () X{ X int row, col; X X for (row = 1; row <= MAXrows; row++) X for (col = 1; col <= MAXcols; col++) X { X move (row, col); X addch (' '); X } X refresh (); X} *-*-END-of-ClrBoard.c-*-* echo x - DeleteNode.c sed 's/^X//' >DeleteNode.c <<'*-*-END-of-DeleteNode.c-*-*' X#include "define.h" X X#define NULL 0 X XDeleteNode (node, head, tail) X X ToptenNode *head, *tail, node; X{ X if (node == *head) X *head = node->next; X else X node->prev->next = node->next; X if (node == *tail) X *tail = node->prev; X else X node->next->prev = node->prev; X free (node); X} *-*-END-of-DeleteNode.c-*-* echo x - GameBoard.c sed 's/^X//' >GameBoard.c <<'*-*-END-of-GameBoard.c-*-*' X#include <curses.h> X#include "define.h" X XGameBoard (Manual) X X int Manual; X{ X int row, col; X X attrset (A_REVERSE); X for (row = 0; row <= MAXrows + 1; row++) X { X if (row == 0 || row == MAXrows + 1) X for (col = 0; col <= MAXcols + 1; col++) X { X move (row, col); X addch (BORDERCHAR); X } X else X { X move (row, 0); X addch (BORDERCHAR); X move (row, MAXcols + 1); X addch (BORDERCHAR); X } X } X move (0, (MAXcols+1)/2-2); addstr ("ROBOTS"); X move (23, (MAXcols+1)/2-1); addstr ("PJC"); X attrset (A_NORMAL); X move (0, 66); addstr ("MOVE"); X move (2, 64); addstr (" 8 "); X move (3, 64); addstr (" 7 9 "); X move (4, 64); addstr (" 4 6"); X move (5, 64); addstr (" 1 3 "); X move (6, 66); addstr (" 2 "); X X if (Manual) X { X move (10, 65); addstr ("COMMANDS"); X move (11, 63); addstr ("s - last stand"); X move (12, 63); addstr ("t - teleport"); X } X X move (14, 70); addstr ("KEY"); X move (15, 67); addch (YOU); X move (15, 69); addstr ("-you"); X move (16, 67); addch (ROBOT); X move (16, 69); addstr ("-robot"); X move (17, 67); addch (JUNKHEEP); X move (17, 69); addstr ("-junk heep"); X move (20, 67); addstr ("SCREEN"); X move (21, 67); addstr ("ROBOTS"); X move (23, 63); addstr ("SCORE"); X move (0, 76); addstr (VERSION); X refresh (); X} *-*-END-of-GameBoard.c-*-* echo x - InsertNode.c sed 's/^X//' >InsertNode.c <<'*-*-END-of-InsertNode.c-*-*' X#include "define.h" X X#define NULL 0 X X XInsertNode (here, head, tail, size) X X ToptenNode *head, *tail, *here; X int size; X{ X ToptenNode newnode; X ToptenNode malloc(); X X X if ((newnode = malloc (size)) == NULL) return (-1); X newnode->prev = (*here)->prev; X newnode->next = *here; X (*here)->prev = newnode; X if (*here == *head) X *head = newnode; X else X newnode->prev->next = newnode; X *here = newnode; X return (0); X} *-*-END-of-InsertNode.c-*-* echo x - Main.c sed 's/^X//' >Main.c <<'*-*-END-of-Main.c-*-*' X/* PROGRAM: Robots X** AUTHOR: Paul J. Condie X** DATE: 02/04/86 X*/ X#include "modifylog.h" X X#include <curses.h> X#include "define.h" X X#define ENDSCREEN Rcount == 0 X Xmain (argc, argv) X X int argc; X char *argv[]; X{ X long time(); X void srand48(); X char *getlogin(); X long seed; X char Todaysdate[9], player[10], TopTenFile[50]; X int Rbts[1000], Junks[1000], You; X long score, TopScore, LastTop; X int i, screens, rbtvalue, key, Rindex, row, col; X int MUNCH, QUIT, DEBUG, DmpScore = FALSE, Manual = FALSE, LASTSTAND; X X initscr (); X if (argc >= 2) getargs (argc, argv, &DmpScore, &Manual); X if (Manual) X strcpy (TopTenFile, TOPMANUAL); X else X strcpy (TopTenFile, TOPAUTO); X if (DmpScore) X { X dmpscore (TopTenFile); X endwin (); X exit (0); X } X nonl (); X cbreak (); X noecho (); X leaveok (stdscr, TRUE); X typeahead (-1); X getdate (Todaysdate); X strcpy (player, getlogin()); X QUIT = FALSE; X gettops (&TopScore, &LastTop, TopTenFile); X seed = time ((long *) 0); X srand48 (seed); X X/* X** A NEW GAME X*/ X X do X { X MUNCH = FALSE; X DEBUG = FALSE; X screens = 0; X score = 0; X GameBoard (Manual); X showscore (score, TopScore, LastTop, 0); X X/* X** A NEW SCREEN X*/ X X do X { X LASTSTAND = FALSE; X screens++; X Rcount = Jcount = 0; X Rindex = 0; X showrbts (screens, &rbtvalue, Rbts); X showyou (&You, Rbts); X key = getch (); X if ((key >= '1' && key <= '9' && key != '5') || X (Manual && (key == 's' || key == 't'))) X MUNCH = moveyou (key, &You, Rbts, Junks, &LASTSTAND); X if (!Manual) nodelay (stdscr, TRUE); X X/* X** GO MAN GO X*/ X X while (!MUNCH && !ENDSCREEN) X { X if (Manual) X for (Rindex = 0; Rindex < Rcount;) X { X MUNCH = moverbts (&Rindex, Rbts, Junks, You, &score, rbtvalue, X TopScore, LastTop); X if (MUNCH) break; X } X else X MUNCH = moverbts (&Rindex, Rbts, Junks, You, &score, rbtvalue, X TopScore, LastTop); X refresh (); X if (MUNCH || ENDSCREEN || LASTSTAND) continue; Xdebug: X key = getch (); X if ((key >= '1' && key <= '9' && key != '5') || X (Manual && (key == 's' || key == 't'))) X MUNCH = moveyou (key, &You, Rbts, Junks, &LASTSTAND); X }; X if (!Manual) nodelay (stdscr, FALSE); X flushinp (); X } while (!MUNCH); X X getxy (You, row, col); X if (col > MAXcols - 4) col = MAXcols - 4; X move (row, col); X addstr ("MUNCH"); X refresh (); X sleep (4); X QUIT = TopTen (player, Todaysdate, score, screens, &TopScore, &LastTop, X &DEBUG, TopTenFile); X if (DEBUG) X { X char command[80]; X X QUIT = dumpstats (You, Rbts, Junks, score, screens, rbtvalue, X TopScore, LastTop); X sprintf (command, "lp -s %s", DEBUGFILE); X system (command); X MUNCH = FALSE; X ClrBoard (); X for (i = 1; i <= Rcount; i++) X { X getxy (Rbts[i], row, col); X move (row, col); X addch (ROBOT); X } X for (i = 1; i <= Jcount; i++) X { X getxy (Junks[i], row, col); X move (row, col); X addch (JUNKHEEP); X } X getxy (You, row, col); X move (row, col); X addch (YOU); X refresh (); X goto debug; X } X } while (!QUIT); X X endwin (); X} *-*-END-of-Main.c-*-* echo x - TopTen.c sed 's/^X//' >TopTen.c <<'*-*-END-of-TopTen.c-*-*' X#include <curses.h> X#include "define.h" X X XTopTen (player, Tdate, score, screens, TopScore, LastTop, DEBUG, TopTenFile) X X char player[], Tdate[], TopTenFile[]; X long score, *TopScore, *LastTop; X int screens, *DEBUG; X{ X FILE *fopen(); X FILE *fp; X ToptenNode head, tail, here, YourNode; X int i, key, rc, you, rank; X char tmpstr[10], fmtscore[10]; X X ClrBoard (); X head = tail = NULL; X X/* X** First load top ten file if there is one. X*/ X X if ((fp = fopen (TopTenFile, "r")) != NULL) X if ((rc = loadtops (fp, &head, &tail)) != 0) X { X move (5, 4); X addstr ("ERROR: Ran out of memory loading Top Ten list."); X goto EXIT; X } X X/* X** Now find the right spot to put your score. X*/ X X for (here = head, you = 1; here != NULL && score <= here->tdata.score; X here = here->next, you++); X if (here == NULL) X { X if (AppendNode (&head, &tail, sizeof (struct topten)) != 0) X { X move (5, 4); X addstr ("ERROR: Ran out of memory loading Top Ten list."); X goto EXIT; X } X YourNode = tail; X } X else X { X if (InsertNode (&here, &head, &tail, sizeof (struct topten)) != 0) X { X move (5, 4); X addstr ("ERROR: Ran out of memory loading Top Ten list."); X goto EXIT; X } X YourNode = here; X } X strcpy (YourNode->tdata.name, player); X YourNode->tdata.score = score; X strcpy (YourNode->tdata.date, Tdate); X YourNode->tdata.screen = screens; X X/* X** Now write the top ten file out if there was a change. X*/ X X fclose (fp); X if (you <= ENTRYMAX && *DEBUG == FALSE) X if ((fp = fopen (TopTenFile, "w")) != NULL) X { X writetop (fp, head, tail); X fclose (fp); X } X else X { X move (5,10); X addstr ("ERROR: Unable to open top file for writing."); X refresh (); X } X X/* X** Now display top ten. X*/ X X move (2, (MAXcols+1)/2-4); X attrset (A_BOLD); X addstr ("TOP TEN"); X attrset (A_NORMAL); X if (strcmp (TopTenFile, TOPMANUAL) == 0) X { X move (1, 1); addstr ("Manual"); X move (2, 1); addstr ("Mode"); X } X else X { X move (1, MAXcols-8); addstr ("Automatic"); X move (2, MAXcols-3); addstr ("Fire"); X } X for (here = head, i = 1; here != NULL && i <= 10; here = here->next, i++) X { X if (YourNode == here) attrset (A_REVERSE); X sprintf (tmpstr, "%7ld", here->tdata.score); X if (here->tdata.score < 1000) X strcpy (fmtscore, tmpstr); X else X if (here->tdata.score >= 1000 && here->tdata.score < 1000000) X dress (fmtscore, tmpstr, "9999,999"); X else X dress (fmtscore, tmpstr, "9,999,999"); X move (i+3, (MAXcols+1)/2-23); X printw (" %3d. %-8s %9s %8s %3d ", i, here->tdata.name, fmtscore, X here->tdata.date, here->tdata.screen); X if (YourNode == here) attrset (A_NORMAL); X *LastTop = here->tdata.score; X } X X if (you > 10 && you <= ENTRYMAX) X { X for (here = YourNode->prev, i = 1, rank = you - 1; X here != NULL && i <= 3; here = here->next, i++, rank++) X { X if (YourNode == here) attrset (A_REVERSE); X sprintf (tmpstr, "%7ld", here->tdata.score); X if (here->tdata.score < 1000) X strcpy (fmtscore, tmpstr); X else X if (here->tdata.score >= 1000 && here->tdata.score < 1000000) X dress (fmtscore, tmpstr, "9999,999"); X else X dress (fmtscore, tmpstr, "9,999,999"); X move (i+15, (MAXcols+1)/2-23); X printw (" %3d. %-8s %9s %8s %3d ", rank, here->tdata.name, X fmtscore, here->tdata.date, here->tdata.screen); X if (YourNode == here) attrset (A_NORMAL); X } X } X refresh (); X X X *TopScore = head->tdata.score; X for (here = head; here != NULL; here = here->next) X DeleteNode (here, &head, &tail); X X XEXIT: X move (21, (MAXcols+1)/2-4); addstr ("QUIT ? "); X refresh (); X sleep (1); X flushinp (); X key = getch (); X if (key == 'y' || key == 'Y') return (TRUE); X if (key == 'D' && strcmp (player, THEMAN) == 0) *DEBUG = TRUE; X return (FALSE); X} *-*-END-of-TopTen.c-*-* echo x - define.h sed 's/^X//' >define.h <<'*-*-END-of-define.h-*-*' X#define VERSION "V3.0" X X#define THEMAN "pjc" X#define BORDERCHAR ' ' X#define YOU 'I' X#define ROBOT '#' X#define JUNKHEEP '@' X X#define MAXrows 22 X#define MAXcols 58 X X#define Rcount Rbts[0] X#define Jcount Junks[0] X X#define DEBUGFILE "/usr/games/lib/robots.debug" X#define TOPAUTO "/usr/games/lib/robots.log" X#define TOPMANUAL "/usr/games/lib/robot.log" X#define ENTRYMAX 100 X#define INCREMENT 20 /* robots per screen */ X X#define getloc(r, c, l) l = ((r - 1) * MAXcols) + c; X#define getxy(l, r, c) r = l / MAXcols; \ X if (l % MAXcols != 0) (r)++; \ X c = l - ((r - 1) * MAXcols); X X X struct TopInfo X { X char name [10]; X char date [9]; X int screen; X long score; X }; X X typedef struct topten X { X struct topten *prev; X struct topten *next; X struct TopInfo tdata; X } *ToptenNode; *-*-END-of-define.h-*-* echo x - deleterbts.c sed 's/^X//' >deleterbts.c <<'*-*-END-of-deleterbts.c-*-*' X#include "define.h" X Xdeleterbts (Rbts, argone, argtwo) X X int Rbts[], argone, argtwo; X{ X register int i; X int tmpint; X X if (argone > argtwo && argtwo > 0) X { X tmpint = argtwo; X argtwo = argone; X argone = tmpint; X } X if (argtwo > 0) X { X for (i = argtwo; i < Rcount; i++) X Rbts[i] = Rbts[i+1]; X Rcount--; X } X if (argone > 0) X { X for (i = argone; i < Rcount; i++) X Rbts[i] = Rbts[i+1]; X Rcount--; X } X} *-*-END-of-deleterbts.c-*-* echo x - dmpscore.c sed 's/^X//' >dmpscore.c <<'*-*-END-of-dmpscore.c-*-*' X#include <stdio.h> X#include "define.h" X Xdmpscore (TopTenFile) X X char TopTenFile[]; X{ X FILE *fopen(), *fp; X ToptenNode head, tail, here; X char fmtscore[10], tmpstr[10]; X int i, rc; X X head = tail = NULL; X if ((fp = fopen (TopTenFile, "r")) != NULL) X { X if ((rc = loadtops (fp, &head, &tail)) != 0) X { X fprintf (stderr, "ERROR: Ran out of memory loading Top Ten list."); X return; X } X } X else X { X fprintf (stderr, "ERROR: Unable to open Top Ten file."); X return; X } X fclose (fp); X X printf ("\n **** ROBOTS **** %s\n", VERSION); X if (strcmp (TopTenFile, TOPMANUAL) == 0) X printf ("\n Manual Mode\n"); X else X printf ("\n Repeating Rifle Mode\n"); X for (here = head, i = 1; here != NULL; here = here->next, i++) X { X sprintf (tmpstr, "%7ld", here->tdata.score); X if (here->tdata.score < 1000) X strcpy (fmtscore, tmpstr); X else X if (here->tdata.score >= 1000 && here->tdata.score < 1000000) X dress (fmtscore, tmpstr, "9999,999"); X else X dress (fmtscore, tmpstr, "9,999,999"); X printf ("\n%3d. %s %s %2d %9s", i, here->tdata.name, here->tdata.date, X here->tdata.screen, fmtscore); X } X printf ("\n"); X} *-*-END-of-dmpscore.c-*-* echo x - dress.c sed 's/^X//' >dress.c <<'*-*-END-of-dress.c-*-*' Xdress (destination, source, mask) X X char *destination, *source, *mask; X{ X for (;*mask != '\0'; mask++, destination++) X { X if (*mask == '9') X { X if (*source != '\0') X { X *destination = *source; X source++; X } X else X *destination = ' '; X } X else X { X *destination = *mask; X } X } X *destination = '\0'; X} *-*-END-of-dress.c-*-* echo x - dumpstats.c sed 's/^X//' >dumpstats.c <<'*-*-END-of-dumpstats.c-*-*' X#include <curses.h> X#include "define.h" X Xdumpstats (You, Rbts, Junks, score, screens, rbtvalue, TopScore, LastTop) X X int You, Rbts[], Junks[], screens, rbtvalue; X long score, TopScore, LastTop; X{ X FILE *fopen(); X FILE *fp; X int i, row, col; X X if ((fp = fopen (DEBUGFILE, "w")) == NULL) return (TRUE); X X fprintf (fp, "\nscore = %ld", score); X fprintf (fp, "\nscreens = %d", screens); X fprintf (fp, "\nrbtvalue = %d", rbtvalue); X fprintf (fp, "\nTopScore = %ld", TopScore); X fprintf (fp, "\nLastTop = %ld", LastTop); X X getxy (You, row, col); X fprintf (fp, "\n\nYOU\t%d\t%d\t%d", You, row, col); X X fprintf (fp, "\n\n*** ROBOTS ***"); X for (i = 1; i <= Rcount; i++) X { X getxy (Rbts[i], row, col); X fprintf (fp, "\n%d\t%d\t%d\t%d", i, Rbts[i], row, col); X } X X fprintf (fp, "\n\n*** JUNK HEEPS ***"); X for (i = 1; i <= Jcount; i++) X { X getxy (Junks[i], row, col); X fprintf (fp, "\n%d\t%d\t%d\t%d", i, Junks[i], row, col); X } X fclose (fp); X return (FALSE); X} *-*-END-of-dumpstats.c-*-* echo x - getargs.c sed 's/^X//' >getargs.c <<'*-*-END-of-getargs.c-*-*' X#include <curses.h> X Xgetargs (argc, argv, DmpScore, Manual) X X int argc, *DmpScore, *Manual; X char *argv[]; X{ X char *Program, *s; X X Program = argv[0]; X while (--argc > 0 && (*++argv)[0] == '-') X for (s = argv[0]+1; *s != '\0'; s++) X switch (*s) X { X case 'm': X *Manual = TRUE; X break; X case 's': X *DmpScore = TRUE; X break; X X default: X fprintf (stderr, "\nUsage: %s [ -m ] [ -s ]", Program); X exit (1); X } X} *-*-END-of-getargs.c-*-* echo x - getdate.c sed 's/^X//' >getdate.c <<'*-*-END-of-getdate.c-*-*' X#include <sys/types.h> X#include <time.h> X X Xgetdate (DATE) X X char DATE[]; X{ X long secs; X register struct tm *tp; X struct tm *localtime(); X X time (&secs); X tp = localtime(&secs); X sprintf (DATE,"%.2d/%.2d/%.2d", tp->tm_mon+1, tp->tm_mday, tp->tm_year); X} *-*-END-of-getdate.c-*-* echo x - gettops.c sed 's/^X//' >gettops.c <<'*-*-END-of-gettops.c-*-*' X#include <stdio.h> X#include "define.h" X X Xgettops (TopScore, LastTop, TopTenFile) X X long *TopScore, *LastTop; X char TopTenFile[]; X{ X FILE *fopen(); X FILE *fp; X struct TopInfo tbuf; X int count; X X *TopScore = *LastTop = 0; X if ((fp = fopen (TopTenFile, "r")) == NULL) return; X count = 0; X while (fread ((char *) &tbuf, sizeof (struct TopInfo), 1, fp)) X { X count++; X if (count == 1) *TopScore = tbuf.score; X if (count == 10) X { X *LastTop = tbuf.score; X break; X } X } X fclose (fp); X} *-*-END-of-gettops.c-*-* echo x - loadtops.c sed 's/^X//' >loadtops.c <<'*-*-END-of-loadtops.c-*-*' X#include <stdio.h> X#include "define.h" X X#define NEWNODE (*tail)->tdata X Xloadtops (fp, head, tail) X X FILE *fp; X ToptenNode *head, *tail; X{ X struct TopInfo tbuf; X ToptenNode here, node; X int rc; X X rc = fread ((char *) &tbuf, sizeof (struct TopInfo), 1, fp); X while (rc) X { X for (here = *head; here != NULL && tbuf.score <= here->tdata.score; X here = here->next); X if (here == NULL) X { X if (AppendNode (head, tail, sizeof (struct topten)) != 0) X return (-1); X node = *tail; X } X else X { X if (InsertNode (&here, head, tail, sizeof (struct topten)) != 0) X return (-1); X node = here; X } X strcpy (node->tdata.name, tbuf.name); X node->tdata.score = tbuf.score; X strcpy (node->tdata.date, tbuf.date); X node->tdata.screen = tbuf.screen; X rc = fread ((char *) &tbuf, sizeof (struct TopInfo), 1, fp); X } X return (0); X} *-*-END-of-loadtops.c-*-* echo x - makefile sed 's/^X//' >makefile <<'*-*-END-of-makefile-*-*' XFILES = makefile Main.c GameBoard.c showrbts.c showyou.c ClrBoard.c \ X showscore.c moveyou.c moverbts.c deleterbts.c \ X getdate.c TopTen.c dress.c loadtops.c AppendNode.c \ X InsertNode.c DeleteNode.c writetop.c gettops.c dumpstats.c \ X getargs.c dmpscore.c XOBJECTS = Main.o GameBoard.o showrbts.o showyou.o ClrBoard.o \ X showscore.o moveyou.o moverbts.o deleterbts.o \ X getdate.o TopTen.o dress.o loadtops.o AppendNode.o \ X InsertNode.o DeleteNode.o writetop.o gettops.o dumpstats.o \ X getargs.o dmpscore.o XLIBS = -lcurses -lc -lm XCFLAGS = -f -ns -O XCOPIES = 1 XTITLE = "ROBOTS" X Xrobots: $(OBJECTS) X cc $(CFLAGS) $(OBJECTS) $(LIBS) -o robots X size robots X @echo X Xprint: $(FILES) X pr -f $? | lp -n$(COPIES) -t$(TITLE) X touch print X Xcleanup: X -rm *.o X -du X XMain.o: Main.c define.h modifylog.h XGameBoard.o: GameBoard.c define.h Xshowrbts.o: showrbts.c define.h Xshowyou.o: showyou.c define.h XClrBoard.o: ClrBoard.c define.h Xmoveyou.o: moveyou.c define.h Xmoverbts.o: moverbts.c define.h Xdeleterbts.o: deleterbts.c define.h XTopTen.o: TopTen.c define.h Xloadtops.o: loadtops.c define.h Xwritetop.o: writetop.c define.h Xgettops.o: gettops.c define.h XAppendNode.o: AppendNode.c define.h XInsertNode.o: InsertNode.c define.h XDeleteNode.o: DeleteNode.c define.h Xdumpstats.o: dumpstats.c define.h Xdmpscore.o: dmpscore.c define.h *-*-END-of-makefile-*-* echo x - modifylog.h sed 's/^X//' >modifylog.h <<'*-*-END-of-modifylog.h-*-*' X/* X** ***** M O D I F I C A T I O N L O G ***** X** X** X** Version 2.0 - Features X** X** 1. Robots will be incremented by 20 instead of 10 for each X** new screen. X** 2. If your score is in topten score will blink. X** 3. If your score is the new top high score will be in reverse X** video. X** 4. Robot count will reflect the # of robots currently on the screen. X X X** Version 2.1 pjc 7/10/86 X** X** 1. Dump robots log file scores with $ robots -s X X X** Version 3.0 pjc 7/25/86 X** X** 1. Manual Mode robot game. robots -m X*/ *-*-END-of-modifylog.h-*-* echo x - moverbts.c sed 's/^X//' >moverbts.c <<'*-*-END-of-moverbts.c-*-*' X#include <curses.h> X#include "define.h" X Xmoverbts(Rindex, Rbts, Junks, You, score, rbtvalue, TopScore, LastTop) X X int *Rindex; X int Rbts[], Junks[], You; X long *score, TopScore, LastTop; X int rbtvalue; X{ X register int i; X int Rrow, Rcol, Yrow, Ycol, newloc; X X (*Rindex)++; X if (*Rindex > Rcount) *Rindex = 1; X getxy (Rbts[*Rindex], Rrow, Rcol); X move (Rrow, Rcol); addch (' '); /* blank old location */ X getxy (You, Yrow, Ycol); X if (Rrow > Yrow) Rrow--; X if (Rrow < Yrow) Rrow++; X if (Rcol > Ycol) Rcol--; X if (Rcol < Ycol) Rcol++; X getloc (Rrow, Rcol, newloc); X move (Rrow, Rcol); X switch (winch (stdscr)) X { X default: X/* X** ok nothing is sitting in X** new location X*/ X Rbts[*Rindex] = newloc; X addch (ROBOT); X return (FALSE); X X case ROBOT: X/* X Now check for a robot X sitting in new location */ X X for (i = 1; i <= Rcount; i++) X if (newloc == Rbts[i]) X { X *score += rbtvalue * 2; X deleterbts (Rbts, i, *Rindex); /* delete both rbts from pile */ X (*Rindex)--; X if (i < *Rindex) (*Rindex)--; X Junks[++Jcount] = newloc; /* add new loc to junk pile */ X addch (JUNKHEEP); /* new junk heep */ X showscore (*score, TopScore, LastTop, Rcount); X return (FALSE); X } X X case JUNKHEEP: X *score += rbtvalue; X deleterbts (Rbts, *Rindex, NULL); /* delete robot from pile */ X (*Rindex)--; X showscore (*score, TopScore, LastTop, Rcount); X return (FALSE); X X case YOU: X return (TRUE); /* MUNCHED */ X X } X} *-*-END-of-moverbts.c-*-* echo x - moveyou.c sed 's/^X//' >moveyou.c <<'*-*-END-of-moveyou.c-*-*' X#include <curses.h> X#include "define.h" X Xmoveyou (key, You, Rbts, Junks, LASTSTAND) X X int key, *You, Rbts[], Junks[], *LASTSTAND; X{ X int row, col, newrow, newcol, oldlocation; X char MUNCH; X register int i; X X X oldlocation = *You; X getxy (*You, row, col); X newrow = row; X newcol = col; X switch (key) X { X case '8': X case KEY_UP: X if (newrow > 1) newrow--; X break; X X case '9': X case KEY_A3: X if (newrow > 1) newrow--; X if (newcol < MAXcols) newcol++; X break; X X case '6': X case KEY_RIGHT: X if (newcol < MAXcols) newcol++; X break; X X case '3': X case KEY_C3: X if (newrow < MAXrows) newrow++; X if (newcol < MAXcols) newcol++; X break; X X case '2': X case KEY_DOWN: X if (newrow < MAXrows) newrow++; X break; X X case '1': X case KEY_C1: X if (newrow < MAXrows) newrow++; X if (newcol > 1) newcol--; X break; X X case '4': X case KEY_LEFT: X if (newcol > 1) newcol--; X break; X X case '7': X case KEY_A1: X if (newrow > 1) newrow--; X if (newcol > 1) newcol--; X break; X X case 's': X *LASTSTAND = TRUE; X break; X X case 't': X showyou (You, Rbts); X getxy (*You, newrow, newcol); X break; X X default: X break; X } X X move (row, col); addch (' '); X move (newrow, newcol); X i = winch (stdscr); X if (i == ROBOT || i == JUNKHEEP) return (TRUE); X getloc (newrow, newcol, *You); X addch (YOU); X refresh (); X return (FALSE); X} *-*-END-of-moveyou.c-*-* echo x - printprg.sh sed 's/^X//' >printprg.sh <<'*-*-END-of-printprg.sh-*-*' Xpr makefile > junk.listing;echo "\f\c" >> junk.listing Xcb Main.c >> junk.listing;echo "\f\c" >> junk.listing Xcb moveyou.c >> junk.listing;echo "\f\c" >> junk.listing Xcb moverbts.c >> junk.listing;echo "\f\c" >> junk.listing Xcb showrbts.c >> junk.listing;echo "\f\c" >> junk.listing Xcb showyou.c >> junk.listing;echo "\f\c" >> junk.listing Xcb GameBoard.c >> junk.listing;echo "\f\c" >> junk.listing Xcb ClrBoard.c >> junk.listing;echo "\f\c" >> junk.listing Xcb showscore.c >> junk.listing;echo "\f\c" >> junk.listing Xcb deleterbts.c >> junk.listing;echo "\f\c" >> junk.listing Xcb TopTen.c >> junk.listing;echo "\f\c" >> junk.listing Xcb loadtops.c >> junk.listing;echo "\f\c" >> junk.listing Xcb writetop.c >> junk.listing;echo "\f\c" >> junk.listing Xcb gettops.c >> junk.listing;echo "\f\c" >> junk.listing Xcb AppendNode.c >> junk.listing;echo "\f\c" >> junk.listing Xcb InsertNode.c >> junk.listing;echo "\f\c" >> junk.listing Xcb DeleteNode.c >> junk.listing;echo "\f\c" >> junk.listing Xcb dress.c >> junk.listing;echo "\f\c" >> junk.listing Xcb getdate.c >> junk.listing;echo "\f\c" >> junk.listing Xcb dumpstats.c >> junk.listing;echo "\f\c" >> junk.listing Xcb dmpscore.c >> junk.listing;echo "\f\c" >> junk.listing Xcb getargs.c >> junk.listing;echo "\f\c" >> junk.listing Xcat define.h >> junk.listing;echo "\f\c" >> junk.listing Xcat modifylog.h >> junk.listing;echo "\f\c" >> junk.listing Xcat junk.listing | lp *-*-END-of-printprg.sh-*-* echo x - robots.1 sed 's/^X//' >robots.1 <<'*-*-END-of-robots.1-*-*' X.TH ROBOTS public X.SH NAME Xrobots \- an action packed (edge of your toilet seat) game X.SH SYNOPSIS Xrobots [ -m ] [ -s ] X.SH DESCRIPTION XRobots is a display oriented game that requires hand, feet Xand eye coordination ?? This is a game I used to play on a dual Xunix-like machine until they took it away. So out of addiction, Xrobots system V was born. The curses(3x) screen management Xlibrary is used to handle the display so you must set your TERM Xenvironment variable. X XThe idea is to avoid the moving robots by either running away Xfrom the little buggers or by hiding behind the junk heeps that Xare created when two or more robots run into each other. X XThere are two modes of operation (Automatic and Manual mode). XThe automatic mode (which is the default) is for those who have Xthe need ... for speed (recommended only at 9600 baud). X.SS OPTIONS X.P X-m manual mode. This is more of a strategy game. X Recommended operation for bods lower than 9600. X.P X-s will print to stdout the log file containing the X top one hundred scores. X.SH SCORING XYou get points when a robot gets turned into a junk heep. XScreen one starts out with twenty robots and each screen Xafter that is incremented by twenty robots. Also the value Xof each robot is incremented with each screen. Your score Xwill start blinking when you have made the Top Ten list and Xturn to reverse video when you make top gun. X.SH FILES X/usr/games/lib/robots.log automatic mode score sheet X/usr/games/lib/robot.log manual mode score sheet X/usr/games/lib/robots.debug debug stats X.SH AUTHOR XPaul J. Condie X.SH COMPLAINT/SUGGESTION BOX X{ihnp4,lll-crg,qantel,pyramid}!ptsfa!pjc X.SH BUGS XNone known. *-*-END-of-robots.1-*-* echo x - showrbts.c sed 's/^X//' >showrbts.c <<'*-*-END-of-showrbts.c-*-*' X#include <curses.h> X#include "define.h" X Xshowrbts (screens, rbtvalue, Rbts) X X int screens, *rbtvalue; X int Rbts[]; X{ X double drand48(); X int i, ii, row, col, randomnum; X int UNIQUE; X char tmpstr[10]; X X ClrBoard (); X Rcount = *rbtvalue = screens * INCREMENT; X for (i = 1; i <= Rcount + 1; i++) X Rbts[i] = 0; X sprintf (tmpstr, "%4d", screens); X move (20, 74); X addstr (tmpstr); X sprintf (tmpstr, "%4d", Rcount); X move (21, 74); X addstr (tmpstr); X for (i = 1; i <= Rcount; i++) X { X do X { X UNIQUE = FALSE; X randomnum = (int)(drand48() * 10000) % (MAXrows * MAXcols + 1); X if (randomnum < 1 || randomnum > MAXrows * MAXcols) continue; X UNIQUE = TRUE; X for (ii = 1; ii < i; ii++) X if (randomnum == Rbts[ii]) X { X UNIQUE = FALSE; X break; X } X } while (!UNIQUE); X Rbts[i] = randomnum; X getxy (randomnum, row, col); X move (row, col); X addch (ROBOT); X refresh (); X } X} *-*-END-of-showrbts.c-*-* echo x - showscore.c sed 's/^X//' >showscore.c <<'*-*-END-of-showscore.c-*-*' X#include <curses.h> X Xshowscore (score, TopScore, LastTop, robots) X X long score, TopScore, LastTop; X int robots; X{ X char tmpstr[10], fmtscore[10]; X X X sprintf (tmpstr, "%4d", robots); X move (21, 74); addstr (tmpstr); X sprintf (tmpstr, "%7ld", score); X if (score < 1000) X strcpy (fmtscore, tmpstr); X else X if (score >= 1000 && score < 1000000) X dress (fmtscore, tmpstr, "9999,999"); X else X dress (fmtscore, tmpstr, "9,999,999"); X move (23, 69); X if (score <= LastTop) attrset (A_BOLD); X else X if (score > TopScore) attrset (A_REVERSE); X else X attrset (A_BLINK); X printw ("%9s", fmtscore); X attrset (A_NORMAL); X} *-*-END-of-showscore.c-*-* echo x - showyou.c sed 's/^X//' >showyou.c <<'*-*-END-of-showyou.c-*-*' X#include <curses.h> X#include "define.h" X Xshowyou (You, Rbts) X X int *You; X int Rbts[]; X{ X double drand48(); X int i, rnum, row, col; X int UNIQUE; X X X do X { X UNIQUE = FALSE; X rnum = (int)(drand48() * 10000) % (MAXrows * MAXcols + 1); X if (rnum < 1 || rnum > MAXrows * MAXcols) continue; X UNIQUE = TRUE; X getxy (rnum, row, col); X move (row, col); X i = winch (stdscr); X if (i == ROBOT || i == JUNKHEEP) UNIQUE = FALSE; X } while (!UNIQUE); X *You = rnum; X addch (YOU); X refresh (); X} *-*-END-of-showyou.c-*-* echo x - writetop.c sed 's/^X//' >writetop.c <<'*-*-END-of-writetop.c-*-*' X#include <stdio.h> X#include "define.h" X Xwritetop (fp, head, tail) X X FILE *fp; X ToptenNode head, tail; X{ X ToptenNode here; X register int i; X int rc; X X for (here = head, i = 1; here != NULL && i <= ENTRYMAX; X here = here->next, i++) X { X rc = fwrite ((char *) &here->tdata, sizeof (struct TopInfo), 1, fp); X } X} *-*-END-of-writetop.c-*-* exit