Thread View: mod.sources.games
1 messages
1 total messages
Started by games-request
Fri, 17 Apr 1987 21:25
v01i002: rot - waterfall terminal display
Author: games-request
Date: Fri, 17 Apr 1987 21:25
Date: Fri, 17 Apr 1987 21:25
456 lines
11184 bytes
11184 bytes
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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads