games-request@tekred.UUCP (04/21/87)
Submitted by: Bill Randle <games-request@tekred.TEK.COM> Mod.sources.games: Volume 1, Issue 5 Archive-name: rot2 [Thanks to those of you who sent in bug fixes for the original rot program. This issue has the new improved version. The source is short enough that I decided to repost the whole thing rather than just a patch, so delete the original one (v01i002, Archive-name: rot).] ---------- [You are not missing v01i004. That issue was originally a patch to rot that was subsequently canceled after more patches came in. -br] #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: Makefile README patchlvl.h rot.c # Wrapped by billr@tekred on Tue Apr 21 13:44:09 1987 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f Makefile -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"Makefile\" else echo shar: Extracting \"Makefile\" \(129 characters\) sed "s/^X//" >Makefile <<'END_OF_Makefile' X# Simple makefile for rot program X XCFLAGS = -O #-DSYSV X Xrot: rot.c X cc $(CFLAGS) -o rot rot.c -ltermlib X Xtest: rot X ./rot <rot.c END_OF_Makefile if test 129 -ne `wc -c <Makefile`; then echo shar: \"Makefile\" unpacked with wrong size! fi # end of overwriting check fi if test -f README -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"README\" else echo shar: Extracting \"README\" \(648 characters\) sed "s/^X//" >README <<'END_OF_README' XThis program cascades letters from the top of the terminal screen Xto the bottom in a waterfall effect. The original program has had Xa few bugs fixed and added capability to properly handle padding. XAlso, this will be pretty slow at lower baudrates. X X 4/21/87 BR X X-- XOriginal source from: X Peter da Silva (ihnp4!shell!neuro1!{hyd-ptd,datafact,baylor}!peter) X XMakefile and README from: X Bill Randle (billr@tekred.TEK.COM) X XBug fixes from: X James Buster (bitbug@ucscb.ucsc.edu) X Ed Falk (ed@sun -?) X Andrew Klossner (andrew@lemming.gwd.tek.com) X Andrew Scott Beals (bandy@amdcad.amd.com) X Bill Randle (billr@tekred.tek.com) END_OF_README if test 648 -ne `wc -c <README`; then echo shar: \"README\" unpacked with wrong size! fi # end of overwriting check fi if test -f patchlvl.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"patchlvl.h\" else echo shar: Extracting \"patchlvl.h\" \(76 characters\) sed "s/^X//" >patchlvl.h <<'END_OF_patchlvl.h' X#define PATCHLEVEL 0 X X#define ROT_VERSION "2.0 patchlevel 0, 21 April 1987" END_OF_patchlvl.h if test 76 -ne `wc -c <patchlvl.h`; then echo shar: \"patchlvl.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f rot.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"rot.c\" else echo shar: Extracting \"rot.c\" \(8725 characters\) sed "s/^X//" >rot.c <<'END_OF_rot.c' X/* X * Revision History: X * X * Original source from: X * Peter da Silva (ihnp4!shell!neuro1!{hyd-ptd,datafact,baylor}!peter) X * X * Changes for padding added by: X * Andrew Scott Beals ({ucbvax,decwrl}!amdcad!bandy or bandy@amdcad.amd.com) X * 20 April 1987 X * X * Additional changes for padding, fix for computation of tglen, X * increase max lines, improve termlib handling, add System V #ifdefs. X * Bill Randle (billr@tekred.TEK.COM) X * 21 April 1987 X */ X X#include <stdio.h> X#include "patchlvl.h" X X#ifdef SYSV X# include <termio.h> X#else X# include <sgtty.h> X#endif X X/* -- Miscellaneous defines -- */ X#define FALSE 0 X#define TRUE 1 X#define MAXCOL 80 X#define MAXLI 34 X Xextern char *tgetstr(); X Xint lastx, lasty; Xstruct _c { X struct _c *c_next; X int c_line, c_column; X char c_mark; X} *clist; X X/* -- Global variables -- */ Xchar *tent; /* Pointer to tbuf */ Xextern char PC; /* Pad character */ Xextern char *UP, *BC; /* Upline, backsapce character */ Xextern short ospeed; /* Terminal output speed */ Xint tglen; X Xchar *cm, /* Cursor motion */ X *cl, /* Clear screen */ X *ti, /* Init terminal */ X *te; /* Reset terminal */ Xint li, /* lines on screen */ X co; /* columns ditto */ Xchar screen[MAXLI+1][MAXCOL]; Xchar newscreen[MAXLI+1][MAXCOL]; X Xmain(ac, av) Xint ac; Xchar **av; X{ X /* set ospeed so padding works correctly */ X#ifdef SYSV X struct termio p; X X if(ioctl(1, TCGETA, &p) != -1) X ospeed=p.c_cflag & CBAUD; X#else X struct sgttyb p; X X if(ioctl(1, TIOCGETP, &p) != -1) X ospeed=p.sg_ospeed; X#endif X X srand(getpid()); X tinit(getenv("TERM")); X if(av[1]) X while(*++av) X dropf(*av); X else X fdropf(stdin); X tend(); X} X Xat(x, y, c) Xint x, y; Xchar c; X{ X#ifdef DEBUG X _at(x, y); X#else X if(y==lasty) { X if(x!=lastx) { X if(x<lastx && lastx-x<tglen) X while(x<lastx) { X putchar('\b'); X lastx--; X } X else if(x>lastx && x-lastx<tglen) X while(x>lastx) { X putchar(newscreen[lasty][lastx]); X lastx++; X } X else X _at(x, y); X } X } else X _at(x, y); X#endif X c &= ~0200; X putchar(c); X if(c >= ' ' && c != '\177') X lastx++; X if(lastx>=co) { X lastx -= co; X lasty++; X } X} X X_at(x, y) Xint x, y; X{ X extern void outc(); X X tputs(tgoto(cm, x, y), 1, outc); /* handle padding */ X lastx = x; X lasty = y; X} X Xvoid Xoutc(c) Xregister c; X{ X putc(c, stdout); X} X Xtinit(name) Xchar *name; X{ X static char junkbuf[1024], *junkptr; X char tbuf[1024]; X int intr(); X X junkptr = junkbuf; X X tgetent(tbuf, name); X X if (!tgetflag("bs")) /* is backspace not used? */ X BC = tgetstr("bc",&junkptr); /* find out what is */ X else X BC = "\b"; /* make a backspace handy */ X if (tgetstr("pc", &junkptr) != NULL) X PC = *junkptr; /* set pad character */ X else X PC = '\0'; X UP = tgetstr("up", &junkptr); X cm = tgetstr("cm", &junkptr); X if (cm == NULL) { X printf("Can't rot on dumb terminals.\n"); X exit(1); X } X cl = tgetstr("cl", &junkptr); X ti = tgetstr("ti", &junkptr); X te = tgetstr("te", &junkptr); X li = min(tgetnum("li"), MAXLI); X if (li == -1) X li = 24; X co = min(tgetnum("co"), MAXCOL); X if (co == -1) X co = 80; X tglen = strlen(tgoto(cm, co-1, li-1)); X} X Xtend() X{ X outs(te); X _at(0, li-1); X putchar('\n'); X fflush(stdout); X} X Xreadscreen(fp) XFILE *fp; X{ X int line, column, p; X char tmp[256]; X X for(line=0; line<li; line++) X for(column=0; column<co; column++) X newscreen[line][column] = screen[line][column] = ' '; X for(column=0; column<co; column++) X newscreen[li][column] = screen[li][column] = '*'; X line=0; X while(line<li) { X if(!fgets(tmp, 256, fp)) X return; X X for(column=0, p=0; tmp[p]; p++) { X tmp[p] &= ~0200; X if(tmp[p] < ' ' || tmp[p] == 127) X switch(tmp[p]) { X case '\t': X while(++column % 8) X continue; X break; X case '\n': X column = 0; X line++; X break; X default: X newscreen[line][column] = '^'; X column++; X if(column>=co) { X column -= co; X line++; X } X newscreen[line][column] = X (tmp[p]+'@') & 127; X column++; X break; X } X else { X newscreen[line][column] = tmp[p]; X column++; X } X if(column >= co) { X column -= co; X line++; X } X if(line >= li) X break; X } X } X for(column=0; column<co; column++) X newscreen[line][column] = screen[li][column] = '*'; X} X Xdrawscreen() X{ X lastx = lasty = 0; X outs(cl); X update(); X} X Xupdate() /* copy new screen back to old screen */ X{ X int l, c; X X for(l=0; l<li; l++) X for(c=0; c<co; c++) X if(screen[l][c] != newscreen[l][c]) { X if((screen[l][c] & ~0200) != X (newscreen[l][c] & ~0200)) X at(c, l, newscreen[l][c]); X screen[l][c] = newscreen[l][c]; X } X} X Xdrop(line, column) Xint line, column; X{ X struct _c *hold; X X if(line<0 || line>=li || column<0 || column>=co || X (line>=li-2 && column >= co-1) || /* scroll potential */ X screen[line][column]==' ' || /* empty */ X screen[line][column] & 0200) /* already in list */ X return; X if(screen[line+1][column]!=' ' && X (column==co-1 ||screen[line+1][column+1]!=' ') && X (column==0 ||screen[line+1][column-1]!=' ')) X return; X X hold = (struct _c *) malloc(sizeof(struct _c)); X hold -> c_next = clist; X hold -> c_column = column; X hold -> c_line = line; X hold -> c_mark = 0; X screen[line][column] |= 0200; X clist = hold; X} X Xdrops() X{ X int l, c; X struct _c *hold; X for(hold = clist; hold; hold=hold->c_next) { X int line = hold->c_line, column=hold->c_column; X if(line>= li-2 && column>=co-1) { X newscreen[line][column] &= ~0200; X screen[line][column] &= ~0200; X hold->c_mark = 1; X continue; X } X drop(line+1, column); X drop(line, column+1); X drop(line-1, column); X drop(line, column-1); X if(newscreen[line+1][column]==' ') { X newscreen[line+1][column] = screen[line][column]; X newscreen[line][column] = ' '; X line++; X } else if(rand()&01000) { X if(column>0 && newscreen[line][column-1] == ' ' && X newscreen[line+1][column-1]==' ') { X newscreen[line][column-1] = X screen[line][column]; X newscreen[line][column] = ' '; X column--; X } X else if(column<co-1 && X newscreen[line][column+1] == ' ' && X newscreen[line+1][column+1]==' ') { X newscreen[line][column+1] = X screen[line][column]; X newscreen[line][column] = ' '; X column++; X } X else { X screen[line][column] &= ~0200; X newscreen[line][column] &= ~0200; X hold -> c_mark = 1; X } X } else { X if(column<co-1 && newscreen[line][column+1] == ' ' && X newscreen[line+1][column+1]==' ') { X newscreen[line][column+1] = X screen[line][column]; X newscreen[line][column] = ' '; X column++; X } X else if(column>0 && newscreen[line][column-1] == ' ' && X newscreen[line+1][column-1]==' ') { X newscreen[line][column-1] = X screen[line][column]; X newscreen[line][column] = ' '; X column--; X } X else { X newscreen[line][column] &= ~0200; X screen[line][column] &= ~0200; X hold -> c_mark = 1; X } X } X hold -> c_column = column; X hold -> c_line = line; X fflush(stdout); X } X X while(clist && clist->c_mark) { X struct _c *p = clist; X clist = clist -> c_next; X free(p); X } X hold = clist; X while(hold && hold->c_next) X if(hold->c_next->c_mark) { X struct _c *p = hold->c_next; X hold->c_next = p->c_next; X free(p); X } else X hold=hold->c_next; X} X Xdroplet(line, column) Xint line, column; X{ X int ret; X while(column>=0 && screen[line][column]!=' ') X column--; X column++; X while(column<co && screen[line][column]!=' ') X drop(line, column++); X ret = clist != 0; X while(clist) { X drops(); X update(); X } X return ret; X} X Xdropscreen() X{ X int column, line; X int rubbish = 0, count = 0; X X do { X int start, limit, incr; X count++; X rubbish = 0; X if(count&1) { start=li-2; limit=0; incr = -1; } X else { start=0; limit=li-2; incr=1; } X for(line=start; line!=limit && !rubbish; line+=incr) { X if(line&1) X for(column=0; column<co && !rubbish; column++) X rubbish += droplet(line, column); X else X for(column=co-1; column>=0 && !rubbish; column--) X rubbish += droplet(line, column); X } X } while(rubbish); X} X Xdropf(file) Xchar *file; X{ X FILE *fp; X X if(!(fp = fopen(file, "r"))) { X perror(file); X return -1; X } X fdropf(fp); X} X Xfdropf(fp) XFILE *fp; X{ X int i; X X while(!feof(fp)) { X readscreen(fp); X drawscreen(); X for(i=0; i<20; i++) X droplet((rand()>>4) % li, (rand()>>4) % co); X dropscreen(); X } X} X Xouts(s) Xchar *s; X{ X fputs(s, stdout); X} X Xmin(a, b) Xint a, b; X{ X if(a<b) return a; X return b; X} END_OF_rot.c if test 8725 -ne `wc -c <rot.c`; then echo shar: \"rot.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of shell archive. exit 0