🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#4
Author: games-request
Date: Tue, 21 Apr 1987 20:57
542 lines
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