xref: /csrg-svn/games/rain/rain.c (revision 23869)
121200Sdist /*
221200Sdist  * Copyright (c) 1980 Regents of the University of California.
321200Sdist  * All rights reserved.  The Berkeley software License Agreement
421200Sdist  * specifies the terms and conditions for redistribution.
521200Sdist  */
68869Smckusick 
721200Sdist #ifndef lint
821200Sdist char copyright[] =
921200Sdist "@(#) Copyright (c) 1980 Regents of the University of California.\n\
1021200Sdist  All rights reserved.\n";
1121200Sdist #endif not lint
128869Smckusick 
1321200Sdist #ifndef lint
14*23869Smckusick static char sccsid[] = "@(#)rain.c	5.2 (Berkeley) 07/15/85";
1521200Sdist #endif not lint
1621200Sdist 
17*23869Smckusick #define BSD
18*23869Smckusick 
198869Smckusick #include <stdio.h>
20*23869Smckusick #ifdef USG
21*23869Smckusick #include <termio.h>
22*23869Smckusick #else
238869Smckusick #include <sgtty.h>
24*23869Smckusick #endif
258869Smckusick #include <signal.h>
268869Smckusick /* rain 11/3/1980 EPS/CITHEP */
278869Smckusick /* cc rain.c -o rain -O -ltermlib */
28*23869Smckusick #define cursor(col,row) tputs(tgoto(CM,col,row),1,fputchar)
298869Smckusick extern char *UP;
308869Smckusick extern short ospeed;
31*23869Smckusick #ifdef USG
32*23869Smckusick struct termio old_tty;
33*23869Smckusick #else
348869Smckusick struct sgttyb old_tty;
35*23869Smckusick #endif
368869Smckusick char *LL, *TE, *TI;
378869Smckusick main(argc,argv)
388869Smckusick int argc;
398869Smckusick char *argv[];
408869Smckusick {
418869Smckusick     extern fputchar();
428869Smckusick     char *malloc();
438869Smckusick     char *getenv();
448869Smckusick     char *tgetstr(), *tgoto();
458869Smckusick     float ranf();
468869Smckusick     int onsig();
478869Smckusick     register int x, y, j;
488869Smckusick     static int xpos[5], ypos[5];
498869Smckusick     register char *CM, *BC, *DN, *ND;
50*23869Smckusick     int CO, LI;
518869Smckusick     char *tcp;
528869Smckusick     register char *term;
538869Smckusick     char tcb[100];
54*23869Smckusick #ifdef USG
55*23869Smckusick     struct termio sg;
56*23869Smckusick #else
578869Smckusick     struct sgttyb sg;
58*23869Smckusick #endif
59*23869Smckusick     float cols, lines;
60*23869Smckusick 
618869Smckusick     setbuf(stdout,malloc(BUFSIZ));
628869Smckusick     if (!(term=getenv("TERM"))) {
638869Smckusick 	fprintf(stderr,"%s: TERM: parameter not set\n",*argv);
648869Smckusick 	exit(1);
658869Smckusick     }
668869Smckusick     if (tgetent(malloc(1024),term)<=0) {
678869Smckusick 	fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term);
688869Smckusick 	exit(1);
698869Smckusick     }
708869Smckusick     tcp=tcb;
718869Smckusick     if (!(CM=tgetstr("cm",&tcp))) {
728869Smckusick 	fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv);
738869Smckusick 	exit(1);
748869Smckusick     }
758869Smckusick     if (!(BC=tgetstr("bc",&tcp))) BC="\b";
768869Smckusick     if (!(DN=tgetstr("dn",&tcp))) DN="\n";
778869Smckusick     if (!(ND=tgetstr("nd",&tcp))) ND=" ";
78*23869Smckusick     if ((CO = tgetnum("co")) == -1)
79*23869Smckusick 	CO = 80;
80*23869Smckusick     if ((LI = tgetnum("li")) == -1)
81*23869Smckusick 	LI = 24;
82*23869Smckusick     cols = CO - 4;
83*23869Smckusick     lines = LI - 4;
848869Smckusick     TE=tgetstr("te",&tcp);
858869Smckusick     TI=tgetstr("ti",&tcp);
868869Smckusick     UP=tgetstr("up",&tcp);
878869Smckusick     if (!(LL=tgetstr("ll",&tcp))) strcpy(LL=malloc(10),tgoto(CM,0,23));
88*23869Smckusick #ifdef USG
89*23869Smckusick     ioctl(1, TCGETA, &sg);
90*23869Smckusick     ospeed=sg.c_cflag&CBAUD;
91*23869Smckusick #else
928869Smckusick     gtty(1, &sg);
938869Smckusick     ospeed=sg.sg_ospeed;
94*23869Smckusick #endif
958869Smckusick     for (j=SIGHUP;j<=SIGTERM;j++)
968869Smckusick 	if (signal(j,SIG_IGN)!=SIG_IGN) signal(j,onsig);
97*23869Smckusick #ifdef USG
98*23869Smckusick     ioctl(1, TCGETA, &old_tty);	/* save tty bits for exit */
99*23869Smckusick     ioctl(1, TCGETA, &sg);
100*23869Smckusick     sg.c_iflag&=~ICRNL;
101*23869Smckusick     sg.c_oflag&=~ONLCR;
102*23869Smckusick     sg.c_lflag&=~ECHO;
103*23869Smckusick     ioctl(1, TCSETAW, &sg);
104*23869Smckusick #else
1058869Smckusick     gtty(1, &old_tty);	/* save tty bits for exit */
1068869Smckusick     gtty(1, &sg);
1078869Smckusick     sg.sg_flags&=~(CRMOD|ECHO);
1088869Smckusick     stty(1, &sg);
109*23869Smckusick #endif
110*23869Smckusick     if (TI) tputs(TI,1,fputchar);
1118869Smckusick     tputs(tgetstr("cl",&tcp),1,fputchar);
1128869Smckusick     fflush(stdout);
1138869Smckusick     for (j=5;--j>=0;) {
114*23869Smckusick 	xpos[j]=(int)(cols*ranf())+2;
115*23869Smckusick 	ypos[j]=(int)(lines*ranf())+2;
1168869Smckusick     }
1178869Smckusick     for (j=0;;) {
118*23869Smckusick 	x=(int)(cols*ranf())+2;
119*23869Smckusick 	y=(int)(lines*ranf())+2;
1208869Smckusick 	cursor(x,y); fputchar('.');
1218869Smckusick 	cursor(xpos[j],ypos[j]); fputchar('o');
1228869Smckusick 	if (j==0) j=4; else --j;
1238869Smckusick 	cursor(xpos[j],ypos[j]); fputchar('O');
1248869Smckusick 	if (j==0) j=4; else --j;
1258869Smckusick 	cursor(xpos[j],ypos[j]-1);
1268869Smckusick 	fputchar('-');
127*23869Smckusick 	tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar);
1288869Smckusick 	fputs("|.|",stdout);
129*23869Smckusick 	tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar);
1308869Smckusick 	fputchar('-');
1318869Smckusick 	if (j==0) j=4; else --j;
1328869Smckusick 	cursor(xpos[j],ypos[j]-2); fputchar('-');
133*23869Smckusick 	tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar);
1348869Smckusick 	fputs("/ \\",stdout);
1358869Smckusick 	cursor(xpos[j]-2,ypos[j]);
1368869Smckusick 	fputs("| O |",stdout);
1378869Smckusick 	cursor(xpos[j]-1,ypos[j]+1);
1388869Smckusick 	fputs("\\ /",stdout);
139*23869Smckusick 	tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar);
1408869Smckusick 	fputchar('-');
1418869Smckusick 	if (j==0) j=4; else --j;
1428869Smckusick 	cursor(xpos[j],ypos[j]-2); fputchar(' ');
143*23869Smckusick 	tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar);
144*23869Smckusick 	fputchar(' '); tputs(ND,1,fputchar); fputchar(' ');
1458869Smckusick 	cursor(xpos[j]-2,ypos[j]);
146*23869Smckusick 	fputchar(' '); tputs(ND,1,fputchar); fputchar(' ');
147*23869Smckusick 	tputs(ND,1,fputchar); fputchar(' ');
1488869Smckusick 	cursor(xpos[j]-1,ypos[j]+1);
149*23869Smckusick 	fputchar(' '); tputs(ND,1,fputchar); fputchar(' ');
150*23869Smckusick 	tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar);
1518869Smckusick 	fputchar(' ');
1528869Smckusick 	xpos[j]=x; ypos[j]=y;
1538869Smckusick 	fflush(stdout);
1548869Smckusick     }
1558869Smckusick }
1568869Smckusick onsig(n)
1578869Smckusick int n;
1588869Smckusick {
159*23869Smckusick #ifdef USG
160*23869Smckusick     struct termio sg;
161*23869Smckusick #else
1628869Smckusick     struct sgttyb sg;
163*23869Smckusick #endif
164*23869Smckusick     tputs(LL, 1, fputchar);
165*23869Smckusick     if (TE) tputs(TE, 1, fputchar);
1668869Smckusick     fflush(stdout);
167*23869Smckusick #ifdef USG
168*23869Smckusick     ioctl(1, TCSETAW, &old_tty);
169*23869Smckusick #else
1708869Smckusick     stty(1, &old_tty);
171*23869Smckusick #endif
1728869Smckusick     kill(getpid(),n);
1738869Smckusick     _exit(0);
1748869Smckusick }
1758869Smckusick fputchar(c)
1768869Smckusick char c;
1778869Smckusick {
1788869Smckusick     putchar(c);
1798869Smckusick }
1808869Smckusick float ranf() {
181*23869Smckusick #ifdef BSD
1828869Smckusick     return((float)rand()/2147483647.);
183*23869Smckusick #else
184*23869Smckusick     return((float)rand()/32767.);
185*23869Smckusick #endif
1868869Smckusick }
187