Thread View: mod.sources.games
1 messages
1 total messages
Started by games-request
Tue, 21 Apr 1987 20:57
v01i005: rot2 - waterfall terminal display, version 2
Author: games-request
Date: Tue, 21 Apr 1987 20:57
Date: Tue, 21 Apr 1987 20:57
542 lines
13442 bytes
13442 bytes
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
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