xref: /csrg-svn/games/rain/rain.c (revision 8869)
1*8869Smckusick 
2*8869Smckusick static char sccsid[] = "	rain.c	4.1	82/10/24	";
3*8869Smckusick 
4*8869Smckusick #include <stdio.h>
5*8869Smckusick #include <sgtty.h>
6*8869Smckusick #include <signal.h>
7*8869Smckusick /* rain 11/3/1980 EPS/CITHEP */
8*8869Smckusick /* cc rain.c -o rain -O -ltermlib */
9*8869Smckusick #define cursor(col,row) tputs(tgoto(CM,col,row),1,outc)
10*8869Smckusick outc(c)
11*8869Smckusick {
12*8869Smckusick 	putchar(c);
13*8869Smckusick }
14*8869Smckusick extern char *UP;
15*8869Smckusick extern short ospeed;
16*8869Smckusick struct sgttyb old_tty;
17*8869Smckusick char *LL, *TE, *TI;
18*8869Smckusick main(argc,argv)
19*8869Smckusick int argc;
20*8869Smckusick char *argv[];
21*8869Smckusick {
22*8869Smckusick     extern fputchar();
23*8869Smckusick     char *malloc();
24*8869Smckusick     char *getenv();
25*8869Smckusick     char *tgetstr(), *tgoto();
26*8869Smckusick     float ranf();
27*8869Smckusick     int onsig();
28*8869Smckusick     register int x, y, j;
29*8869Smckusick     static int xpos[5], ypos[5];
30*8869Smckusick     register char *CM, *BC, *DN, *ND;
31*8869Smckusick     char *tcp;
32*8869Smckusick     register char *term;
33*8869Smckusick     char tcb[100];
34*8869Smckusick     struct sgttyb sg;
35*8869Smckusick     setbuf(stdout,malloc(BUFSIZ));
36*8869Smckusick     if (!(term=getenv("TERM"))) {
37*8869Smckusick 	fprintf(stderr,"%s: TERM: parameter not set\n",*argv);
38*8869Smckusick 	exit(1);
39*8869Smckusick     }
40*8869Smckusick     if (tgetent(malloc(1024),term)<=0) {
41*8869Smckusick 	fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term);
42*8869Smckusick 	exit(1);
43*8869Smckusick     }
44*8869Smckusick     tcp=tcb;
45*8869Smckusick     if (!(CM=tgetstr("cm",&tcp))) {
46*8869Smckusick 	fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv);
47*8869Smckusick 	exit(1);
48*8869Smckusick     }
49*8869Smckusick     if (!(BC=tgetstr("bc",&tcp))) BC="\b";
50*8869Smckusick     if (!(DN=tgetstr("dn",&tcp))) DN="\n";
51*8869Smckusick     if (!(ND=tgetstr("nd",&tcp))) ND=" ";
52*8869Smckusick     TE=tgetstr("te",&tcp);
53*8869Smckusick     TI=tgetstr("ti",&tcp);
54*8869Smckusick     UP=tgetstr("up",&tcp);
55*8869Smckusick     if (!(LL=tgetstr("ll",&tcp))) strcpy(LL=malloc(10),tgoto(CM,0,23));
56*8869Smckusick     gtty(1, &sg);
57*8869Smckusick     ospeed=sg.sg_ospeed;
58*8869Smckusick     for (j=SIGHUP;j<=SIGTERM;j++)
59*8869Smckusick 	if (signal(j,SIG_IGN)!=SIG_IGN) signal(j,onsig);
60*8869Smckusick     gtty(1, &old_tty);	/* save tty bits for exit */
61*8869Smckusick     gtty(1, &sg);
62*8869Smckusick     sg.sg_flags&=~(CRMOD|ECHO);
63*8869Smckusick     stty(1, &sg);
64*8869Smckusick     if (TI) fputs(TI,stdout);
65*8869Smckusick     tputs(tgetstr("cl",&tcp),1,fputchar);
66*8869Smckusick     fflush(stdout);
67*8869Smckusick     for (j=5;--j>=0;) {
68*8869Smckusick 	xpos[j]=(int)(76.*ranf())+2;
69*8869Smckusick 	ypos[j]=(int)(20.*ranf())+2;
70*8869Smckusick     }
71*8869Smckusick     for (j=0;;) {
72*8869Smckusick 	x=(int)(76.*ranf())+2;
73*8869Smckusick 	y=(int)(20.*ranf())+2;
74*8869Smckusick 	cursor(x,y); fputchar('.');
75*8869Smckusick 	cursor(xpos[j],ypos[j]); fputchar('o');
76*8869Smckusick 	if (j==0) j=4; else --j;
77*8869Smckusick 	cursor(xpos[j],ypos[j]); fputchar('O');
78*8869Smckusick 	if (j==0) j=4; else --j;
79*8869Smckusick 	cursor(xpos[j],ypos[j]-1);
80*8869Smckusick 	fputchar('-');
81*8869Smckusick 	fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
82*8869Smckusick 	fputs("|.|",stdout);
83*8869Smckusick 	fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
84*8869Smckusick 	fputchar('-');
85*8869Smckusick 	if (j==0) j=4; else --j;
86*8869Smckusick 	cursor(xpos[j],ypos[j]-2); fputchar('-');
87*8869Smckusick 	fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
88*8869Smckusick 	fputs("/ \\",stdout);
89*8869Smckusick 	cursor(xpos[j]-2,ypos[j]);
90*8869Smckusick 	fputs("| O |",stdout);
91*8869Smckusick 	cursor(xpos[j]-1,ypos[j]+1);
92*8869Smckusick 	fputs("\\ /",stdout);
93*8869Smckusick 	fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
94*8869Smckusick 	fputchar('-');
95*8869Smckusick 	if (j==0) j=4; else --j;
96*8869Smckusick 	cursor(xpos[j],ypos[j]-2); fputchar(' ');
97*8869Smckusick 	fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
98*8869Smckusick 	fputchar(' '); fputs(ND,stdout); fputchar(' ');
99*8869Smckusick 	cursor(xpos[j]-2,ypos[j]);
100*8869Smckusick 	fputchar(' '); fputs(ND,stdout); fputchar(' ');
101*8869Smckusick 	fputs(ND,stdout); fputchar(' ');
102*8869Smckusick 	cursor(xpos[j]-1,ypos[j]+1);
103*8869Smckusick 	fputchar(' '); fputs(ND,stdout); fputchar(' ');
104*8869Smckusick 	fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
105*8869Smckusick 	fputchar(' ');
106*8869Smckusick 	xpos[j]=x; ypos[j]=y;
107*8869Smckusick 	fflush(stdout);
108*8869Smckusick     }
109*8869Smckusick }
110*8869Smckusick onsig(n)
111*8869Smckusick int n;
112*8869Smckusick {
113*8869Smckusick     struct sgttyb sg;
114*8869Smckusick     fputs(LL, stdout);
115*8869Smckusick     if (TE) fputs(TE, stdout);
116*8869Smckusick     fflush(stdout);
117*8869Smckusick     stty(1, &old_tty);
118*8869Smckusick     kill(getpid(),n);
119*8869Smckusick     _exit(0);
120*8869Smckusick }
121*8869Smckusick fputchar(c)
122*8869Smckusick char c;
123*8869Smckusick {
124*8869Smckusick     putchar(c);
125*8869Smckusick }
126*8869Smckusick float ranf() {
127*8869Smckusick     return((float)rand()/2147483647.);
128*8869Smckusick }
129