freebsd-dev/contrib/ncurses/test/rain.c

134 lines
2.3 KiB
C

/*
* $Id: rain.c,v 1.15 2000/09/02 18:41:22 tom Exp $
*/
#include <test.priv.h>
#include <term.h> /* for tparm() */
#include <signal.h>
/* rain 11/3/1980 EPS/CITHEP */
static float ranf(void);
static void onsig(int sig);
static int next_j(int j)
{
if (j==0) j=4; else --j;
if (has_colors()) {
int z = (int)(3*ranf());
chtype color = COLOR_PAIR(z);
if (z)
color |= A_BOLD;
attrset(color);
}
return j;
}
int
main(
int argc GCC_UNUSED,
char *argv[] GCC_UNUSED)
{
int x, y, j;
static int xpos[5], ypos[5];
float r;
float c;
for (j=SIGHUP;j<=SIGTERM;j++)
if (signal(j,SIG_IGN)!=SIG_IGN) signal(j,onsig);
initscr();
if (has_colors()) {
int bg = COLOR_BLACK;
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
bg = -1;
#endif
init_pair(1, COLOR_BLUE, bg);
init_pair(2, COLOR_CYAN, bg);
}
nl();
noecho();
curs_set(0);
timeout(0);
r = (float)(LINES - 4);
c = (float)(COLS - 4);
for (j=5;--j>=0;) {
xpos[j]=(int)(c* ranf())+2;
ypos[j]=(int)(r* ranf())+2;
}
for (j=0;;) {
x=(int)(c*ranf())+2;
y=(int)(r*ranf())+2;
mvaddch(y,x, '.');
mvaddch(ypos[j], xpos[j], 'o');
j = next_j(j);
mvaddch(ypos[j], xpos[j], 'O');
j = next_j(j);
mvaddch( ypos[j]-1, xpos[j], '-');
mvaddstr(ypos[j], xpos[j]-1, "|.|");
mvaddch( ypos[j]+1, xpos[j], '-');
j = next_j(j);
mvaddch( ypos[j]-2, xpos[j], '-');
mvaddstr(ypos[j]-1, xpos[j]-1, "/ \\");
mvaddstr(ypos[j], xpos[j]-2, "| O |");
mvaddstr(ypos[j]+1, xpos[j]-1, "\\ /");
mvaddch( ypos[j]+2, xpos[j], '-');
j = next_j(j);
mvaddch( ypos[j]-2, xpos[j], ' ');
mvaddstr(ypos[j]-1, xpos[j]-1, " ");
mvaddstr(ypos[j], xpos[j]-2, " ");
mvaddstr(ypos[j]+1, xpos[j]-1, " ");
mvaddch( ypos[j]+2, xpos[j], ' ');
xpos[j] = x; ypos[j] = y;
switch(getch())
{
case('q'):
case('Q'):
curs_set(1);
endwin();
return(EXIT_SUCCESS);
case 's':
nodelay(stdscr, FALSE);
break;
case ' ':
nodelay(stdscr, TRUE);
break;
#ifdef KEY_RESIZE
case(KEY_RESIZE):
r = (float)(LINES - 4);
c = (float)(COLS - 4);
break;
#endif
}
napms(50);
}
}
static void
onsig(int n GCC_UNUSED)
{
curs_set(1);
endwin();
exit(EXIT_FAILURE);
}
static float
ranf(void)
{
long r = (rand() & 077777);
return ((float) r / 32768.);
}