games-request@tekred.UUCP (04/17/87)
Submitted by: seismo!ut-sally!shell!neuro1!hyd-ptd!peter Mod.sources.games: Volume 1, Issue 2 Archive-name: rot [This was originally posted to net.bizarre back in July 1985. I have compiled and run this sucessfully on our 4.3bsd Vax and don't see any particular machine/os dependencies, other than requiring term{lib|cap}. -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: README Makefile rot.c # Wrapped by billr@tekred on Fri Apr 17 14:20:46 1987 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f README -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"README\" else echo shar: Extracting \"README\" \(455 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. There was a note in the Xoriginal posting about this program not working on terminals that Xrequire padding (PC is read but not used). Also, this will be Xpretty slow at lower baudrates. X X-- XOriginal source from: X X Peter da Silva (ihnp4!shell!neuro1!{hyd-ptd,datafact,baylor}!peter) X XMakefile and README from: X X Bill Randle (billr@tekred.TEK.COM) END_OF_README if test 455 -ne `wc -c <README`; then echo shar: \"README\" unpacked with wrong size! fi # end of overwriting check fi if test -f Makefile -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"Makefile\" else echo shar: Extracting \"Makefile\" \(99 characters\) sed "s/^X//" >Makefile <<'END_OF_Makefile' X# Simple makefile for rot program X Xrot: rot.c X cc -O -o rot rot.c -ltermlib X Xtest: rot X rot <rot.c END_OF_Makefile if test 99 -ne `wc -c <Makefile`; then echo shar: \"Makefile\" 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\" \(7528 characters\) sed "s/^X//" >rot.c <<'END_OF_rot.c' X#include <stdio.h> X X/* -- Miscellaneous defines -- */ X#define FALSE 0 X#define TRUE 1 X#define MAXCOL 80 X#define MAXLI 24 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 */ Xchar *PC; /* Pad character */ Xchar *UP, *BC; /* Upline, backsapce character */ Xshort 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 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 outs(tgoto(cm, x, y)); X lastx = x; X lasty = y; 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 PC = tgetstr("pc", &junkptr); X UP = tgetstr("up", &junkptr); X BC = tgetstr("bc", &junkptr); X cm = tgetstr("cm", &junkptr); X cl = tgetstr("cl", &junkptr); X ti = tgetstr("ti", &junkptr); X te = tgetstr("te", &junkptr); X li = min(tgetnum("li"), MAXLI); X co = min(tgetnum("co"), MAXCOL); X tglen = strlen(tgoto(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 7528 -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