| 1 | /* | 
|---|
| 2 | * $Id: rain.c,v 1.20 2002/06/29 23:32:18 tom Exp $ | 
|---|
| 3 | */ | 
|---|
| 4 | #include <test.priv.h> | 
|---|
| 5 |  | 
|---|
| 6 | /* rain 11/3/1980 EPS/CITHEP */ | 
|---|
| 7 |  | 
|---|
| 8 | static float ranf(void); | 
|---|
| 9 | static void onsig(int sig); | 
|---|
| 10 |  | 
|---|
| 11 | static int | 
|---|
| 12 | next_j(int j) | 
|---|
| 13 | { | 
|---|
| 14 | if (j == 0) | 
|---|
| 15 | j = 4; | 
|---|
| 16 | else | 
|---|
| 17 | --j; | 
|---|
| 18 | if (has_colors()) { | 
|---|
| 19 | int z = (int) (3 * ranf()); | 
|---|
| 20 | chtype color = COLOR_PAIR(z); | 
|---|
| 21 | if (z) | 
|---|
| 22 | color |= A_BOLD; | 
|---|
| 23 | attrset(color); | 
|---|
| 24 | } | 
|---|
| 25 | return j; | 
|---|
| 26 | } | 
|---|
| 27 |  | 
|---|
| 28 | int | 
|---|
| 29 | main( | 
|---|
| 30 | int argc GCC_UNUSED, | 
|---|
| 31 | char *argv[]GCC_UNUSED) | 
|---|
| 32 | { | 
|---|
| 33 | int x, y, j; | 
|---|
| 34 | static int xpos[5], ypos[5]; | 
|---|
| 35 | float r; | 
|---|
| 36 | float c; | 
|---|
| 37 |  | 
|---|
| 38 | setlocale(LC_ALL, ""); | 
|---|
| 39 |  | 
|---|
| 40 | for (j = SIGHUP; j <= SIGTERM; j++) | 
|---|
| 41 | if (signal(j, SIG_IGN) != SIG_IGN) | 
|---|
| 42 | signal(j, onsig); | 
|---|
| 43 |  | 
|---|
| 44 | initscr(); | 
|---|
| 45 | if (has_colors()) { | 
|---|
| 46 | int bg = COLOR_BLACK; | 
|---|
| 47 | start_color(); | 
|---|
| 48 | #if HAVE_USE_DEFAULT_COLORS | 
|---|
| 49 | if (use_default_colors() == OK) | 
|---|
| 50 | bg = -1; | 
|---|
| 51 | #endif | 
|---|
| 52 | init_pair(1, COLOR_BLUE, bg); | 
|---|
| 53 | init_pair(2, COLOR_CYAN, bg); | 
|---|
| 54 | } | 
|---|
| 55 | nl(); | 
|---|
| 56 | noecho(); | 
|---|
| 57 | curs_set(0); | 
|---|
| 58 | timeout(0); | 
|---|
| 59 |  | 
|---|
| 60 | r = (float) (LINES - 4); | 
|---|
| 61 | c = (float) (COLS - 4); | 
|---|
| 62 | for (j = 5; --j >= 0;) { | 
|---|
| 63 | xpos[j] = (int) (c * ranf()) + 2; | 
|---|
| 64 | ypos[j] = (int) (r * ranf()) + 2; | 
|---|
| 65 | } | 
|---|
| 66 |  | 
|---|
| 67 | for (j = 0;;) { | 
|---|
| 68 | x = (int) (c * ranf()) + 2; | 
|---|
| 69 | y = (int) (r * ranf()) + 2; | 
|---|
| 70 |  | 
|---|
| 71 | mvaddch(y, x, '.'); | 
|---|
| 72 |  | 
|---|
| 73 | mvaddch(ypos[j], xpos[j], 'o'); | 
|---|
| 74 |  | 
|---|
| 75 | j = next_j(j); | 
|---|
| 76 | mvaddch(ypos[j], xpos[j], 'O'); | 
|---|
| 77 |  | 
|---|
| 78 | j = next_j(j); | 
|---|
| 79 | mvaddch(ypos[j] - 1, xpos[j], '-'); | 
|---|
| 80 | mvaddstr(ypos[j], xpos[j] - 1, "|.|"); | 
|---|
| 81 | mvaddch(ypos[j] + 1, xpos[j], '-'); | 
|---|
| 82 |  | 
|---|
| 83 | j = next_j(j); | 
|---|
| 84 | mvaddch(ypos[j] - 2, xpos[j], '-'); | 
|---|
| 85 | mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\"); | 
|---|
| 86 | mvaddstr(ypos[j], xpos[j] - 2, "| O |"); | 
|---|
| 87 | mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /"); | 
|---|
| 88 | mvaddch(ypos[j] + 2, xpos[j], '-'); | 
|---|
| 89 |  | 
|---|
| 90 | j = next_j(j); | 
|---|
| 91 | mvaddch(ypos[j] - 2, xpos[j], ' '); | 
|---|
| 92 | mvaddstr(ypos[j] - 1, xpos[j] - 1, "   "); | 
|---|
| 93 | mvaddstr(ypos[j], xpos[j] - 2, "     "); | 
|---|
| 94 | mvaddstr(ypos[j] + 1, xpos[j] - 1, "   "); | 
|---|
| 95 | mvaddch(ypos[j] + 2, xpos[j], ' '); | 
|---|
| 96 |  | 
|---|
| 97 | xpos[j] = x; | 
|---|
| 98 | ypos[j] = y; | 
|---|
| 99 |  | 
|---|
| 100 | switch (getch()) { | 
|---|
| 101 | case ('q'): | 
|---|
| 102 | case ('Q'): | 
|---|
| 103 | curs_set(1); | 
|---|
| 104 | endwin(); | 
|---|
| 105 | ExitProgram(EXIT_SUCCESS); | 
|---|
| 106 | case 's': | 
|---|
| 107 | nodelay(stdscr, FALSE); | 
|---|
| 108 | break; | 
|---|
| 109 | case ' ': | 
|---|
| 110 | nodelay(stdscr, TRUE); | 
|---|
| 111 | break; | 
|---|
| 112 | #ifdef KEY_RESIZE | 
|---|
| 113 | case (KEY_RESIZE): | 
|---|
| 114 | r = (float) (LINES - 4); | 
|---|
| 115 | c = (float) (COLS - 4); | 
|---|
| 116 | break; | 
|---|
| 117 | #endif | 
|---|
| 118 | } | 
|---|
| 119 | napms(50); | 
|---|
| 120 | } | 
|---|
| 121 | } | 
|---|
| 122 |  | 
|---|
| 123 | static void | 
|---|
| 124 | onsig(int n GCC_UNUSED) | 
|---|
| 125 | { | 
|---|
| 126 | curs_set(1); | 
|---|
| 127 | endwin(); | 
|---|
| 128 | ExitProgram(EXIT_FAILURE); | 
|---|
| 129 | } | 
|---|
| 130 |  | 
|---|
| 131 | static float | 
|---|
| 132 | ranf(void) | 
|---|
| 133 | { | 
|---|
| 134 | long r = (rand() & 077777); | 
|---|
| 135 | return ((float) r / 32768.); | 
|---|
| 136 | } | 
|---|