ncurses 6.1 - patch 20191214
[ncurses.git] / test / xmas.c
1 /******************************************************************************/
2 /* asciixmas                                                                  */
3 /* December 1989             Larry Bartz           Indianapolis, IN           */
4 /*                                                                            */
5 /*                                                                            */
6 /* I'm dreaming of an ascii character-based monochrome Christmas,             */
7 /* Just like the one's I used to know!                                        */
8 /* Via a full duplex communications channel,                                  */
9 /* At 9600 bits per second,                                                   */
10 /* Even though it's kinda slow.                                               */
11 /*                                                                            */
12 /* I'm dreaming of an ascii character-based monochrome Christmas,             */
13 /* With ev'ry C program I write!                                              */
14 /* May your screen be merry and bright!                                       */
15 /* And may all your Christmases be amber or green,                            */
16 /* (for reduced eyestrain and improved visibility)!                           */
17 /*                                                                            */
18 /*                                                                            */
19 /*                                                                            */
20 /*                                                                            */
21 /*                                                                            */
22 /* IMPLEMENTATION                                                             */
23 /*                                                                            */
24 /* Feel free to modify the defined string FROMWHO to reflect you, your        */
25 /* organization, your site, whatever.                                         */
26 /*                                                                            */
27 /* This really looks a lot better if you can turn off your cursor before      */
28 /* execution. I wanted to do that here but very few termcap entries or        */
29 /* terminfo definitions have the appropriate string defined. If you know      */
30 /* the string(s) for the terminal(s) you use or which your site supports,     */
31 /* you could call asciixmas from within a shell in which you issue the        */
32 /* string to the terminal. The cursor is distracting but it doesn't really    */
33 /* ruin the show.                                                             */
34 /*                                                                            */
35 /* At our site, we invoke this for our users just after login and the         */
36 /* determination of terminal type.                                            */
37 /*                                                                            */
38 /*                                                                            */
39 /* PORTABILITY                                                                */
40 /*                                                                            */
41 /* I wrote this using only the very simplest curses functions so that it      */
42 /* might be the most portable. I was personally able to test on five          */
43 /* different cpu/UNIX combinations.                                           */
44 /*                                                                            */
45 /*                                                                            */
46 /* COMPILE                                                                    */
47 /*                                                                            */
48 /* usually this:                                                              */
49 /*                                                                            */
50 /* cc -O asciixmas.c -lcurses -o asciixmas -s                                 */
51 /*                                                                            */
52 /*                                                                            */
53 /* Zilog S8000 models 11, 21, 31, etc with ZEUS variant of SYSTEM III         */
54 /* maybe other SYSTEM III also:                                               */
55 /*                                                                            */
56 /* cc asciixmas.c -lcurses -ltermlib -o asciixmas -s                          */
57 /*                                                                            */
58 /* as above with optional "peephole optimizer" installed:                     */
59 /*                                                                            */
60 /* cc -O asciixmas.c -lcurses -ltermlib -o asciixmas -s                       */
61 /*                                                                            */
62 /*                                                                            */
63 /* Zilog S8000 models 32, 130 with WE32100 chip and SYS V, REL2               */
64 /* maybe 3B2 also?                                                            */
65 /*                                                                            */
66 /* cc -f -O -K sd asciixmas.c -lcurses -o asciixmas -s                        */
67 /*                                                                            */
68 /*                                                                            */
69 /* Pyramid, Sequent, any other "dual universe" types compile and execute      */
70 /* under either universe. The compile line for the ucb universe (as you       */
71 /* might expect) is the same as for SYS III UNIX:                             */
72 /*                                                                            */
73 /* cc -O asciixmas.c -lcurses -ltermlib -o asciixmas -s                       */
74 /*                                                                            */
75 /* The above compile will also hold true for other BSD systems. (I hope)      */
76 /*                                                                            */
77 /*                                                                            */
78 /*                                                                            */
79 /*                                                                            */
80 /* For the Scrooges out there among you who don't want this thing to loop     */
81 /* forever (or until the user hits a key), insert this into your compile      */
82 /* line just after "cc" :                                                     */
83 /*                                                                            */
84 /* -DNOLOOP                                                                   */
85 /*                                                                            */
86 /* like so:                                                                   */
87 /*                                                                            */
88 /* cc -DNOLOOP -O asciixmas.c -lcurses -o asciixmas -s                        */
89 /*                                                                            */
90 /*                                                                            */
91 /*                                                                            */
92 /******************************************************************************/
93
94 /*
95  * $Id: xmas.c,v 1.34 2019/12/14 23:25:29 tom Exp $
96  */
97 #include <test.priv.h>
98
99 #define FROMWHO "Mark Hessling - (M.Hessling@gu.edu.au)"
100
101 static int my_bg = COLOR_BLACK;
102 static int y_pos, x_pos;
103
104 static WINDOW *treescrn;
105 static WINDOW *treescrn2;
106 static WINDOW *treescrn3;
107 static WINDOW *treescrn4;
108 static WINDOW *treescrn5;
109 static WINDOW *treescrn6;
110 static WINDOW *treescrn7;
111 static WINDOW *treescrn8;
112 static WINDOW *dotdeer0;
113 static WINDOW *stardeer0;
114 static WINDOW *lildeer0;
115 static WINDOW *lildeer1;
116 static WINDOW *lildeer2;
117 static WINDOW *lildeer3;
118 static WINDOW *middeer0;
119 static WINDOW *middeer1;
120 static WINDOW *middeer2;
121 static WINDOW *middeer3;
122 static WINDOW *bigdeer0;
123 static WINDOW *bigdeer1;
124 static WINDOW *bigdeer2;
125 static WINDOW *bigdeer3;
126 static WINDOW *bigdeer4;
127 static WINDOW *lookdeer0;
128 static WINDOW *lookdeer1;
129 static WINDOW *lookdeer2;
130 static WINDOW *lookdeer3;
131 static WINDOW *lookdeer4;
132 static WINDOW *w_holiday;
133 static WINDOW *w_del_msg;
134 static bool *my_pairs;
135
136 static void done(int sig) GCC_NORETURN;
137
138 static void
139 set_color(WINDOW *win, chtype color)
140 {
141     if (has_colors()) {
142         int n = (int) (color + 1);
143         if (my_pairs == 0)
144             my_pairs = typeCalloc(bool, (size_t) (COLORS + 1));
145         if (!my_pairs[n]) {
146             init_pair((short) n, (short) color, (short) my_bg);
147             my_pairs[n] = TRUE;
148         }
149         wattroff(win, A_COLOR);
150         wattron(win, COLOR_PAIR(n));
151     }
152 }
153
154 static void
155 unset_color(WINDOW *win)
156 {
157     if (has_colors())
158         (void) wattrset(win, COLOR_PAIR(0));
159 }
160
161 static void
162 look_out(int msecs)
163 {
164     napms(msecs);
165     if (getch() != ERR) {
166         beep();
167         done(0);
168     }
169 }
170
171 static int
172 boxit(void)
173 {
174     int x = 0;
175
176     while (x < 20) {
177         MvAddCh(x, 7, '|');
178         ++x;
179     }
180
181     x = 8;
182
183     while (x < 80) {
184         MvAddCh(19, x, '_');
185         ++x;
186     }
187
188     x = 0;
189
190     while (x < 80) {
191         MvAddCh(22, x, '_');
192         ++x;
193     }
194
195     return (0);
196 }
197
198 static int
199 seas(void)
200 {
201     MvAddCh(4, 1, 'S');
202     MvAddCh(6, 1, 'E');
203     MvAddCh(8, 1, 'A');
204     MvAddCh(10, 1, 'S');
205     MvAddCh(12, 1, 'O');
206     MvAddCh(14, 1, 'N');
207     MvAddCh(16, 1, '`');
208     MvAddCh(18, 1, 'S');
209
210     return (0);
211 }
212
213 static int
214 greet(void)
215 {
216     MvAddCh(3, 5, 'G');
217     MvAddCh(5, 5, 'R');
218     MvAddCh(7, 5, 'E');
219     MvAddCh(9, 5, 'E');
220     MvAddCh(11, 5, 'T');
221     MvAddCh(13, 5, 'I');
222     MvAddCh(15, 5, 'N');
223     MvAddCh(17, 5, 'G');
224     MvAddCh(19, 5, 'S');
225
226     return (0);
227 }
228
229 static int
230 fromwho(void)
231 {
232     MvAddStr(21, 13, FROMWHO);
233     return (0);
234 }
235
236 static int
237 tree(void)
238 {
239     set_color(treescrn, COLOR_GREEN);
240     MvWAddCh(treescrn, 1, 11, (chtype) '/');
241     MvWAddCh(treescrn, 2, 11, (chtype) '/');
242     MvWAddCh(treescrn, 3, 10, (chtype) '/');
243     MvWAddCh(treescrn, 4, 9, (chtype) '/');
244     MvWAddCh(treescrn, 5, 9, (chtype) '/');
245     MvWAddCh(treescrn, 6, 8, (chtype) '/');
246     MvWAddCh(treescrn, 7, 7, (chtype) '/');
247     MvWAddCh(treescrn, 8, 6, (chtype) '/');
248     MvWAddCh(treescrn, 9, 6, (chtype) '/');
249     MvWAddCh(treescrn, 10, 5, (chtype) '/');
250     MvWAddCh(treescrn, 11, 3, (chtype) '/');
251     MvWAddCh(treescrn, 12, 2, (chtype) '/');
252
253     MvWAddCh(treescrn, 1, 13, (chtype) '\\');
254     MvWAddCh(treescrn, 2, 13, (chtype) '\\');
255     MvWAddCh(treescrn, 3, 14, (chtype) '\\');
256     MvWAddCh(treescrn, 4, 15, (chtype) '\\');
257     MvWAddCh(treescrn, 5, 15, (chtype) '\\');
258     MvWAddCh(treescrn, 6, 16, (chtype) '\\');
259     MvWAddCh(treescrn, 7, 17, (chtype) '\\');
260     MvWAddCh(treescrn, 8, 18, (chtype) '\\');
261     MvWAddCh(treescrn, 9, 18, (chtype) '\\');
262     MvWAddCh(treescrn, 10, 19, (chtype) '\\');
263     MvWAddCh(treescrn, 11, 21, (chtype) '\\');
264     MvWAddCh(treescrn, 12, 22, (chtype) '\\');
265
266     MvWAddCh(treescrn, 4, 10, (chtype) '_');
267     MvWAddCh(treescrn, 4, 14, (chtype) '_');
268     MvWAddCh(treescrn, 8, 7, (chtype) '_');
269     MvWAddCh(treescrn, 8, 17, (chtype) '_');
270
271     MvWAddStr(treescrn, 13, 0, "//////////// \\\\\\\\\\\\\\\\\\\\\\\\");
272
273     MvWAddStr(treescrn, 14, 11, "| |");
274     MvWAddStr(treescrn, 15, 11, "|_|");
275
276     unset_color(treescrn);
277     wrefresh(treescrn);
278     wrefresh(w_del_msg);
279
280     return (0);
281 }
282
283 static int
284 balls(void)
285 {
286     overlay(treescrn, treescrn2);
287
288     set_color(treescrn2, COLOR_BLUE);
289     MvWAddCh(treescrn2, 3, 9, (chtype) '@');
290     MvWAddCh(treescrn2, 3, 15, (chtype) '@');
291     MvWAddCh(treescrn2, 4, 8, (chtype) '@');
292     MvWAddCh(treescrn2, 4, 16, (chtype) '@');
293     MvWAddCh(treescrn2, 5, 7, (chtype) '@');
294     MvWAddCh(treescrn2, 5, 17, (chtype) '@');
295     MvWAddCh(treescrn2, 7, 6, (chtype) '@');
296     MvWAddCh(treescrn2, 7, 18, (chtype) '@');
297     MvWAddCh(treescrn2, 8, 5, (chtype) '@');
298     MvWAddCh(treescrn2, 8, 19, (chtype) '@');
299     MvWAddCh(treescrn2, 10, 4, (chtype) '@');
300     MvWAddCh(treescrn2, 10, 20, (chtype) '@');
301     MvWAddCh(treescrn2, 11, 2, (chtype) '@');
302     MvWAddCh(treescrn2, 11, 22, (chtype) '@');
303     MvWAddCh(treescrn2, 12, 1, (chtype) '@');
304     MvWAddCh(treescrn2, 12, 23, (chtype) '@');
305
306     unset_color(treescrn2);
307     wrefresh(treescrn2);
308     wrefresh(w_del_msg);
309     return (0);
310 }
311
312 static int
313 star(void)
314 {
315     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
316     set_color(treescrn2, COLOR_YELLOW);
317
318     MvWAddCh(treescrn2, 0, 12, (chtype) '*');
319     (void) wstandend(treescrn2);
320
321     unset_color(treescrn2);
322     wrefresh(treescrn2);
323     wrefresh(w_del_msg);
324     return (0);
325 }
326
327 static int
328 strng1(void)
329 {
330     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
331     set_color(treescrn2, COLOR_WHITE);
332
333     MvWAddCh(treescrn2, 3, 13, (chtype) '\'');
334     MvWAddCh(treescrn2, 3, 12, (chtype) ':');
335     MvWAddCh(treescrn2, 3, 11, (chtype) '.');
336
337     wattroff(treescrn2, A_BOLD | A_BLINK);
338     unset_color(treescrn2);
339
340     wrefresh(treescrn2);
341     wrefresh(w_del_msg);
342     return (0);
343 }
344
345 static int
346 strng2(void)
347 {
348     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
349     set_color(treescrn2, COLOR_WHITE);
350
351     MvWAddCh(treescrn2, 5, 14, (chtype) '\'');
352     MvWAddCh(treescrn2, 5, 13, (chtype) ':');
353     MvWAddCh(treescrn2, 5, 12, (chtype) '.');
354     MvWAddCh(treescrn2, 5, 11, (chtype) ',');
355     MvWAddCh(treescrn2, 6, 10, (chtype) '\'');
356     MvWAddCh(treescrn2, 6, 9, (chtype) ':');
357
358     wattroff(treescrn2, A_BOLD | A_BLINK);
359     unset_color(treescrn2);
360
361     wrefresh(treescrn2);
362     wrefresh(w_del_msg);
363     return (0);
364 }
365
366 static int
367 strng3(void)
368 {
369     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
370     set_color(treescrn2, COLOR_WHITE);
371
372     MvWAddCh(treescrn2, 7, 16, (chtype) '\'');
373     MvWAddCh(treescrn2, 7, 15, (chtype) ':');
374     MvWAddCh(treescrn2, 7, 14, (chtype) '.');
375     MvWAddCh(treescrn2, 7, 13, (chtype) ',');
376     MvWAddCh(treescrn2, 8, 12, (chtype) '\'');
377     MvWAddCh(treescrn2, 8, 11, (chtype) ':');
378     MvWAddCh(treescrn2, 8, 10, (chtype) '.');
379     MvWAddCh(treescrn2, 8, 9, (chtype) ',');
380
381     wattroff(treescrn2, A_BOLD | A_BLINK);
382     unset_color(treescrn2);
383
384     wrefresh(treescrn2);
385     wrefresh(w_del_msg);
386     return (0);
387 }
388
389 static int
390 strng4(void)
391 {
392     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
393     set_color(treescrn2, COLOR_WHITE);
394
395     MvWAddCh(treescrn2, 9, 17, (chtype) '\'');
396     MvWAddCh(treescrn2, 9, 16, (chtype) ':');
397     MvWAddCh(treescrn2, 9, 15, (chtype) '.');
398     MvWAddCh(treescrn2, 9, 14, (chtype) ',');
399     MvWAddCh(treescrn2, 10, 13, (chtype) '\'');
400     MvWAddCh(treescrn2, 10, 12, (chtype) ':');
401     MvWAddCh(treescrn2, 10, 11, (chtype) '.');
402     MvWAddCh(treescrn2, 10, 10, (chtype) ',');
403     MvWAddCh(treescrn2, 11, 9, (chtype) '\'');
404     MvWAddCh(treescrn2, 11, 8, (chtype) ':');
405     MvWAddCh(treescrn2, 11, 7, (chtype) '.');
406     MvWAddCh(treescrn2, 11, 6, (chtype) ',');
407     MvWAddCh(treescrn2, 12, 5, (chtype) '\'');
408
409     wattroff(treescrn2, A_BOLD | A_BLINK);
410     unset_color(treescrn2);
411
412     wrefresh(treescrn2);
413     wrefresh(w_del_msg);
414     return (0);
415 }
416
417 static int
418 strng5(void)
419 {
420     (void) wattrset(treescrn2, A_BOLD | A_BLINK);
421     set_color(treescrn2, COLOR_WHITE);
422
423     MvWAddCh(treescrn2, 11, 19, (chtype) '\'');
424     MvWAddCh(treescrn2, 11, 18, (chtype) ':');
425     MvWAddCh(treescrn2, 11, 17, (chtype) '.');
426     MvWAddCh(treescrn2, 11, 16, (chtype) ',');
427     MvWAddCh(treescrn2, 12, 15, (chtype) '\'');
428     MvWAddCh(treescrn2, 12, 14, (chtype) ':');
429     MvWAddCh(treescrn2, 12, 13, (chtype) '.');
430     MvWAddCh(treescrn2, 12, 12, (chtype) ',');
431
432     wattroff(treescrn2, A_BOLD | A_BLINK);
433     unset_color(treescrn2);
434
435     /* save a fully lit tree */
436     overlay(treescrn2, treescrn);
437
438     wrefresh(treescrn2);
439     wrefresh(w_del_msg);
440     return (0);
441 }
442
443 static int
444 blinkit(void)
445 {
446     static int cycle;
447
448     if (cycle > 4) {
449         cycle = 0;
450     }
451
452     touchwin(treescrn8);
453
454     switch (cycle) {
455     case 0:
456         overlay(treescrn3, treescrn8);
457         break;
458     case 1:
459         overlay(treescrn4, treescrn8);
460         break;
461     case 2:
462         overlay(treescrn5, treescrn8);
463         break;
464     case 3:
465         overlay(treescrn6, treescrn8);
466         break;
467     case 4:
468         overlay(treescrn7, treescrn8);
469         break;
470     }
471     touchwin(treescrn8);
472     wrefresh(treescrn8);
473     wrefresh(w_del_msg);
474     look_out(50);
475
476     /*ALL ON************************************************** */
477
478     overlay(treescrn, treescrn8);
479     wrefresh(treescrn8);
480     wrefresh(w_del_msg);
481     look_out(50);
482
483     ++cycle;
484     return (0);
485 }
486
487 static void
488 deer_step(WINDOW *win, int y, int x)
489 {
490     mvwin(win, y, x);
491     wrefresh(win);
492     wrefresh(w_del_msg);
493     look_out(5);
494 }
495
496 static int
497 reindeer(void)
498 {
499     int looper;
500     y_pos = 0;
501
502     for (x_pos = 70; x_pos > 62; x_pos--) {
503         if (x_pos < 62) {
504             y_pos = 1;
505         }
506         for (looper = 0; looper < 4; looper++) {
507             MvWAddCh(dotdeer0, y_pos, x_pos, (chtype) '.');
508             wrefresh(dotdeer0);
509             wrefresh(w_del_msg);
510             werase(dotdeer0);
511             wrefresh(dotdeer0);
512             wrefresh(w_del_msg);
513             look_out(50);
514         }
515     }
516
517     y_pos = 2;
518
519     for (; x_pos > 50; x_pos--) {
520         for (looper = 0; looper < 4; looper++) {
521
522             if (x_pos < 56) {
523                 y_pos = 3;
524
525                 MvWAddCh(stardeer0, y_pos, x_pos, (chtype) '*');
526                 wrefresh(stardeer0);
527                 wrefresh(w_del_msg);
528                 werase(stardeer0);
529                 wrefresh(stardeer0);
530                 wrefresh(w_del_msg);
531             } else {
532                 MvWAddCh(dotdeer0, y_pos, x_pos, (chtype) '*');
533                 wrefresh(dotdeer0);
534                 wrefresh(w_del_msg);
535                 werase(dotdeer0);
536                 wrefresh(dotdeer0);
537                 wrefresh(w_del_msg);
538             }
539         }
540     }
541
542     x_pos = 58;
543
544     for (y_pos = 2; y_pos < 5; y_pos++) {
545
546         touchwin(lildeer0);
547         wrefresh(lildeer0);
548         wrefresh(w_del_msg);
549
550         for (looper = 0; looper < 4; looper++) {
551             deer_step(lildeer3, y_pos, x_pos);
552             deer_step(lildeer2, y_pos, x_pos);
553             deer_step(lildeer1, y_pos, x_pos);
554             deer_step(lildeer2, y_pos, x_pos);
555             deer_step(lildeer3, y_pos, x_pos);
556
557             touchwin(lildeer0);
558             wrefresh(lildeer0);
559             wrefresh(w_del_msg);
560
561             x_pos -= 2;
562         }
563     }
564
565     x_pos = 35;
566
567     for (y_pos = 5; y_pos < 10; y_pos++) {
568
569         touchwin(middeer0);
570         wrefresh(middeer0);
571         wrefresh(w_del_msg);
572
573         for (looper = 0; looper < 2; looper++) {
574             deer_step(middeer3, y_pos, x_pos);
575             deer_step(middeer2, y_pos, x_pos);
576             deer_step(middeer1, y_pos, x_pos);
577             deer_step(middeer2, y_pos, x_pos);
578             deer_step(middeer3, y_pos, x_pos);
579
580             touchwin(middeer0);
581             wrefresh(middeer0);
582             wrefresh(w_del_msg);
583
584             x_pos -= 3;
585         }
586     }
587
588     look_out(300);
589
590     y_pos = 1;
591
592     for (x_pos = 8; x_pos < 16; x_pos++) {
593         deer_step(bigdeer4, y_pos, x_pos);
594         deer_step(bigdeer3, y_pos, x_pos);
595         deer_step(bigdeer2, y_pos, x_pos);
596         deer_step(bigdeer1, y_pos, x_pos);
597         deer_step(bigdeer2, y_pos, x_pos);
598         deer_step(bigdeer3, y_pos, x_pos);
599         deer_step(bigdeer4, y_pos, x_pos);
600         deer_step(bigdeer0, y_pos, x_pos);
601     }
602
603     --x_pos;
604
605     for (looper = 0; looper < 6; looper++) {
606         deer_step(lookdeer4, y_pos, x_pos);
607         deer_step(lookdeer3, y_pos, x_pos);
608         deer_step(lookdeer2, y_pos, x_pos);
609         deer_step(lookdeer1, y_pos, x_pos);
610         deer_step(lookdeer2, y_pos, x_pos);
611         deer_step(lookdeer3, y_pos, x_pos);
612         deer_step(lookdeer4, y_pos, x_pos);
613     }
614
615     deer_step(lookdeer0, y_pos, x_pos);
616
617     for (; y_pos < 10; y_pos++) {
618         for (looper = 0; looper < 2; looper++) {
619             deer_step(bigdeer4, y_pos, x_pos);
620             deer_step(bigdeer3, y_pos, x_pos);
621             deer_step(bigdeer2, y_pos, x_pos);
622             deer_step(bigdeer1, y_pos, x_pos);
623             deer_step(bigdeer2, y_pos, x_pos);
624             deer_step(bigdeer3, y_pos, x_pos);
625             deer_step(bigdeer4, y_pos, x_pos);
626         }
627         deer_step(bigdeer0, y_pos, x_pos);
628     }
629
630     --y_pos;
631
632     deer_step(lookdeer3, y_pos, x_pos);
633     return (0);
634 }
635
636 static void
637 done(int sig GCC_UNUSED)
638 {
639     move(LINES - 1, 0);
640     refresh();
641     stop_curses();
642
643 #if NO_LEAKS
644     if (my_pairs != 0)
645         free(my_pairs);
646 #endif
647
648     ExitProgram(EXIT_SUCCESS);
649 }
650
651 static void
652 usage(void)
653 {
654     static const char *msg[] =
655     {
656         "Usage: xmas [options]"
657         ,""
658         ,"Options:"
659 #if HAVE_USE_DEFAULT_COLORS
660         ," -d       invoke use_default_colors"
661 #endif
662         ," -q       execute once, then quit"
663     };
664     size_t n;
665
666     for (n = 0; n < SIZEOF(msg); n++)
667         fprintf(stderr, "%s\n", msg[n]);
668
669     ExitProgram(EXIT_FAILURE);
670 }
671
672 int
673 main(int argc, char *argv[])
674 {
675     int ch;
676     int loopy;
677 #if HAVE_USE_DEFAULT_COLORS
678     bool opt_d = FALSE;
679 #endif
680     bool opt_q = FALSE;
681
682     while ((ch = getopt(argc, argv, "dq")) != -1) {
683         switch (ch) {
684 #if HAVE_USE_DEFAULT_COLORS
685         case 'd':
686             opt_d = TRUE;
687             break;
688 #endif
689         case 'q':
690             opt_q = TRUE;
691             break;
692         default:
693             usage();
694             /* NOTREACHED */
695         }
696     }
697
698     setlocale(LC_ALL, "");
699
700     InitAndCatch(initscr(), done);
701     noecho();
702     nonl();
703     refresh();
704
705     if (has_colors()) {
706         start_color();
707 #if HAVE_USE_DEFAULT_COLORS
708         if (opt_d && (use_default_colors() == OK))
709             my_bg = -1;
710 #endif
711     }
712     curs_set(0);
713
714     if ((treescrn = newwin(16, 27, 3, 53)) == 0 ||
715         (treescrn2 = newwin(16, 27, 3, 53)) == 0 ||
716         (treescrn3 = newwin(16, 27, 3, 53)) == 0 ||
717         (treescrn4 = newwin(16, 27, 3, 53)) == 0 ||
718         (treescrn5 = newwin(16, 27, 3, 53)) == 0 ||
719         (treescrn6 = newwin(16, 27, 3, 53)) == 0 ||
720         (treescrn7 = newwin(16, 27, 3, 53)) == 0 ||
721         (treescrn8 = newwin(16, 27, 3, 53)) == 0 ||
722
723         (dotdeer0 = newwin(3, 71, 0, 8)) == 0 ||
724
725         (stardeer0 = newwin(4, 56, 0, 8)) == 0 ||
726
727         (lildeer0 = newwin(7, 53, 0, 8)) == 0 ||
728         (lildeer1 = newwin(2, 4, 0, 0)) == 0 ||
729         (lildeer2 = newwin(2, 4, 0, 0)) == 0 ||
730         (lildeer3 = newwin(2, 4, 0, 0)) == 0 ||
731
732         (middeer0 = newwin(15, 42, 0, 8)) == 0 ||
733         (middeer1 = newwin(3, 7, 0, 0)) == 0 ||
734         (middeer2 = newwin(3, 7, 0, 0)) == 0 ||
735         (middeer3 = newwin(3, 7, 0, 0)) == 0 ||
736
737         (bigdeer0 = newwin(10, 23, 0, 0)) == 0 ||
738         (bigdeer1 = newwin(10, 23, 0, 0)) == 0 ||
739         (bigdeer2 = newwin(10, 23, 0, 0)) == 0 ||
740         (bigdeer3 = newwin(10, 23, 0, 0)) == 0 ||
741         (bigdeer4 = newwin(10, 23, 0, 0)) == 0 ||
742
743         (lookdeer0 = newwin(10, 25, 0, 0)) == 0 ||
744         (lookdeer1 = newwin(10, 25, 0, 0)) == 0 ||
745         (lookdeer2 = newwin(10, 25, 0, 0)) == 0 ||
746         (lookdeer3 = newwin(10, 25, 0, 0)) == 0 ||
747         (lookdeer4 = newwin(10, 25, 0, 0)) == 0 ||
748
749         (w_holiday = newwin(1, 26, 3, 27)) == 0 ||
750
751         (w_del_msg = newwin(1, 19, 23, 60)) == 0) {
752         stop_curses();
753         fprintf(stderr, "Cannot create windows - screen too small\n");
754         ExitProgram(EXIT_FAILURE);
755     }
756
757     MvWAddStr(w_del_msg, 0, 0, "Hit any key to quit");
758
759     MvWAddStr(w_holiday, 0, 0, "H A P P Y  H O L I D A Y S");
760
761     /* set up the windows for our various reindeer */
762
763     /* lildeer1 */
764     MvWAddCh(lildeer1, 0, 0, (chtype) 'V');
765     MvWAddCh(lildeer1, 1, 0, (chtype) '@');
766     MvWAddCh(lildeer1, 1, 1, (chtype) '<');
767     MvWAddCh(lildeer1, 1, 2, (chtype) '>');
768     MvWAddCh(lildeer1, 1, 3, (chtype) '~');
769
770     /* lildeer2 */
771     MvWAddCh(lildeer2, 0, 0, (chtype) 'V');
772     MvWAddCh(lildeer2, 1, 0, (chtype) '@');
773     MvWAddCh(lildeer2, 1, 1, (chtype) '|');
774     MvWAddCh(lildeer2, 1, 2, (chtype) '|');
775     MvWAddCh(lildeer2, 1, 3, (chtype) '~');
776
777     /* lildeer3 */
778     MvWAddCh(lildeer3, 0, 0, (chtype) 'V');
779     MvWAddCh(lildeer3, 1, 0, (chtype) '@');
780     MvWAddCh(lildeer3, 1, 1, (chtype) '>');
781     MvWAddCh(lildeer3, 1, 2, (chtype) '<');
782     MvWAddCh(lildeer2, 1, 3, (chtype) '~');
783
784     /* middeer1 */
785     MvWAddCh(middeer1, 0, 2, (chtype) 'y');
786     MvWAddCh(middeer1, 0, 3, (chtype) 'y');
787     MvWAddCh(middeer1, 1, 2, (chtype) '0');
788     MvWAddCh(middeer1, 1, 3, (chtype) '(');
789     MvWAddCh(middeer1, 1, 4, (chtype) '=');
790     MvWAddCh(middeer1, 1, 5, (chtype) ')');
791     MvWAddCh(middeer1, 1, 6, (chtype) '~');
792     MvWAddCh(middeer1, 2, 3, (chtype) '\\');
793     MvWAddCh(middeer1, 2, 4, (chtype) '/');
794
795     /* middeer2 */
796     MvWAddCh(middeer2, 0, 2, (chtype) 'y');
797     MvWAddCh(middeer2, 0, 3, (chtype) 'y');
798     MvWAddCh(middeer2, 1, 2, (chtype) '0');
799     MvWAddCh(middeer2, 1, 3, (chtype) '(');
800     MvWAddCh(middeer2, 1, 4, (chtype) '=');
801     MvWAddCh(middeer2, 1, 5, (chtype) ')');
802     MvWAddCh(middeer2, 1, 6, (chtype) '~');
803     MvWAddCh(middeer2, 2, 3, (chtype) '|');
804     MvWAddCh(middeer2, 2, 5, (chtype) '|');
805
806     /* middeer3 */
807     MvWAddCh(middeer3, 0, 2, (chtype) 'y');
808     MvWAddCh(middeer3, 0, 3, (chtype) 'y');
809     MvWAddCh(middeer3, 1, 2, (chtype) '0');
810     MvWAddCh(middeer3, 1, 3, (chtype) '(');
811     MvWAddCh(middeer3, 1, 4, (chtype) '=');
812     MvWAddCh(middeer3, 1, 5, (chtype) ')');
813     MvWAddCh(middeer3, 1, 6, (chtype) '~');
814     MvWAddCh(middeer3, 2, 2, (chtype) '/');
815     MvWAddCh(middeer3, 2, 6, (chtype) '\\');
816
817     /* bigdeer1 */
818     MvWAddCh(bigdeer1, 0, 17, (chtype) '\\');
819     MvWAddCh(bigdeer1, 0, 18, (chtype) '/');
820     MvWAddCh(bigdeer1, 0, 20, (chtype) '\\');
821     MvWAddCh(bigdeer1, 0, 21, (chtype) '/');
822     MvWAddCh(bigdeer1, 1, 18, (chtype) '\\');
823     MvWAddCh(bigdeer1, 1, 20, (chtype) '/');
824     MvWAddCh(bigdeer1, 2, 19, (chtype) '|');
825     MvWAddCh(bigdeer1, 2, 20, (chtype) '_');
826     MvWAddCh(bigdeer1, 3, 18, (chtype) '/');
827     MvWAddCh(bigdeer1, 3, 19, (chtype) '^');
828     MvWAddCh(bigdeer1, 3, 20, (chtype) '0');
829     MvWAddCh(bigdeer1, 3, 21, (chtype) '\\');
830     MvWAddCh(bigdeer1, 4, 17, (chtype) '/');
831     MvWAddCh(bigdeer1, 4, 18, (chtype) '/');
832     MvWAddCh(bigdeer1, 4, 19, (chtype) '\\');
833     MvWAddCh(bigdeer1, 4, 22, (chtype) '\\');
834     MvWAddStr(bigdeer1, 5, 7, "^~~~~~~~~//  ~~U");
835     MvWAddStr(bigdeer1, 6, 7, "( \\_____( /");
836     MvWAddStr(bigdeer1, 7, 8, "( )    /");
837     MvWAddStr(bigdeer1, 8, 9, "\\\\   /");
838     MvWAddStr(bigdeer1, 9, 11, "\\>/>");
839
840     /* bigdeer2 */
841     MvWAddCh(bigdeer2, 0, 17, (chtype) '\\');
842     MvWAddCh(bigdeer2, 0, 18, (chtype) '/');
843     MvWAddCh(bigdeer2, 0, 20, (chtype) '\\');
844     MvWAddCh(bigdeer2, 0, 21, (chtype) '/');
845     MvWAddCh(bigdeer2, 1, 18, (chtype) '\\');
846     MvWAddCh(bigdeer2, 1, 20, (chtype) '/');
847     MvWAddCh(bigdeer2, 2, 19, (chtype) '|');
848     MvWAddCh(bigdeer2, 2, 20, (chtype) '_');
849     MvWAddCh(bigdeer2, 3, 18, (chtype) '/');
850     MvWAddCh(bigdeer2, 3, 19, (chtype) '^');
851     MvWAddCh(bigdeer2, 3, 20, (chtype) '0');
852     MvWAddCh(bigdeer2, 3, 21, (chtype) '\\');
853     MvWAddCh(bigdeer2, 4, 17, (chtype) '/');
854     MvWAddCh(bigdeer2, 4, 18, (chtype) '/');
855     MvWAddCh(bigdeer2, 4, 19, (chtype) '\\');
856     MvWAddCh(bigdeer2, 4, 22, (chtype) '\\');
857     MvWAddStr(bigdeer2, 5, 7, "^~~~~~~~~//  ~~U");
858     MvWAddStr(bigdeer2, 6, 7, "(( )____( /");
859     MvWAddStr(bigdeer2, 7, 7, "( /      |");
860     MvWAddStr(bigdeer2, 8, 8, "\\/      |");
861     MvWAddStr(bigdeer2, 9, 9, "|>     |>");
862
863     /* bigdeer3 */
864     MvWAddCh(bigdeer3, 0, 17, (chtype) '\\');
865     MvWAddCh(bigdeer3, 0, 18, (chtype) '/');
866     MvWAddCh(bigdeer3, 0, 20, (chtype) '\\');
867     MvWAddCh(bigdeer3, 0, 21, (chtype) '/');
868     MvWAddCh(bigdeer3, 1, 18, (chtype) '\\');
869     MvWAddCh(bigdeer3, 1, 20, (chtype) '/');
870     MvWAddCh(bigdeer3, 2, 19, (chtype) '|');
871     MvWAddCh(bigdeer3, 2, 20, (chtype) '_');
872     MvWAddCh(bigdeer3, 3, 18, (chtype) '/');
873     MvWAddCh(bigdeer3, 3, 19, (chtype) '^');
874     MvWAddCh(bigdeer3, 3, 20, (chtype) '0');
875     MvWAddCh(bigdeer3, 3, 21, (chtype) '\\');
876     MvWAddCh(bigdeer3, 4, 17, (chtype) '/');
877     MvWAddCh(bigdeer3, 4, 18, (chtype) '/');
878     MvWAddCh(bigdeer3, 4, 19, (chtype) '\\');
879     MvWAddCh(bigdeer3, 4, 22, (chtype) '\\');
880     MvWAddStr(bigdeer3, 5, 7, "^~~~~~~~~//  ~~U");
881     MvWAddStr(bigdeer3, 6, 6, "( ()_____( /");
882     MvWAddStr(bigdeer3, 7, 6, "/ /       /");
883     MvWAddStr(bigdeer3, 8, 5, "|/          \\");
884     MvWAddStr(bigdeer3, 9, 5, "/>           \\>");
885
886     /* bigdeer4 */
887     MvWAddCh(bigdeer4, 0, 17, (chtype) '\\');
888     MvWAddCh(bigdeer4, 0, 18, (chtype) '/');
889     MvWAddCh(bigdeer4, 0, 20, (chtype) '\\');
890     MvWAddCh(bigdeer4, 0, 21, (chtype) '/');
891     MvWAddCh(bigdeer4, 1, 18, (chtype) '\\');
892     MvWAddCh(bigdeer4, 1, 20, (chtype) '/');
893     MvWAddCh(bigdeer4, 2, 19, (chtype) '|');
894     MvWAddCh(bigdeer4, 2, 20, (chtype) '_');
895     MvWAddCh(bigdeer4, 3, 18, (chtype) '/');
896     MvWAddCh(bigdeer4, 3, 19, (chtype) '^');
897     MvWAddCh(bigdeer4, 3, 20, (chtype) '0');
898     MvWAddCh(bigdeer4, 3, 21, (chtype) '\\');
899     MvWAddCh(bigdeer4, 4, 17, (chtype) '/');
900     MvWAddCh(bigdeer4, 4, 18, (chtype) '/');
901     MvWAddCh(bigdeer4, 4, 19, (chtype) '\\');
902     MvWAddCh(bigdeer4, 4, 22, (chtype) '\\');
903     MvWAddStr(bigdeer4, 5, 7, "^~~~~~~~~//  ~~U");
904     MvWAddStr(bigdeer4, 6, 6, "( )______( /");
905     MvWAddStr(bigdeer4, 7, 5, "(/          \\");
906     MvWAddStr(bigdeer4, 8, 0, "v___=             ----^");
907
908     /* lookdeer1 */
909     MvWAddStr(lookdeer1, 0, 16, "\\/     \\/");
910     MvWAddStr(lookdeer1, 1, 17, "\\Y/ \\Y/");
911     MvWAddStr(lookdeer1, 2, 19, "\\=/");
912     MvWAddStr(lookdeer1, 3, 17, "^\\o o/^");
913     MvWAddStr(lookdeer1, 4, 17, "//( )");
914     MvWAddStr(lookdeer1, 5, 7, "^~~~~~~~~// \\O/");
915     MvWAddStr(lookdeer1, 6, 7, "( \\_____( /");
916     MvWAddStr(lookdeer1, 7, 8, "( )    /");
917     MvWAddStr(lookdeer1, 8, 9, "\\\\   /");
918     MvWAddStr(lookdeer1, 9, 11, "\\>/>");
919
920     /* lookdeer2 */
921     MvWAddStr(lookdeer2, 0, 16, "\\/     \\/");
922     MvWAddStr(lookdeer2, 1, 17, "\\Y/ \\Y/");
923     MvWAddStr(lookdeer2, 2, 19, "\\=/");
924     MvWAddStr(lookdeer2, 3, 17, "^\\o o/^");
925     MvWAddStr(lookdeer2, 4, 17, "//( )");
926     MvWAddStr(lookdeer2, 5, 7, "^~~~~~~~~// \\O/");
927     MvWAddStr(lookdeer2, 6, 7, "(( )____( /");
928     MvWAddStr(lookdeer2, 7, 7, "( /      |");
929     MvWAddStr(lookdeer2, 8, 8, "\\/      |");
930     MvWAddStr(lookdeer2, 9, 9, "|>     |>");
931
932     /* lookdeer3 */
933     MvWAddStr(lookdeer3, 0, 16, "\\/     \\/");
934     MvWAddStr(lookdeer3, 1, 17, "\\Y/ \\Y/");
935     MvWAddStr(lookdeer3, 2, 19, "\\=/");
936     MvWAddStr(lookdeer3, 3, 17, "^\\o o/^");
937     MvWAddStr(lookdeer3, 4, 17, "//( )");
938     MvWAddStr(lookdeer3, 5, 7, "^~~~~~~~~// \\O/");
939     MvWAddStr(lookdeer3, 6, 6, "( ()_____( /");
940     MvWAddStr(lookdeer3, 7, 6, "/ /       /");
941     MvWAddStr(lookdeer3, 8, 5, "|/          \\");
942     MvWAddStr(lookdeer3, 9, 5, "/>           \\>");
943
944     /* lookdeer4 */
945     MvWAddStr(lookdeer4, 0, 16, "\\/     \\/");
946     MvWAddStr(lookdeer4, 1, 17, "\\Y/ \\Y/");
947     MvWAddStr(lookdeer4, 2, 19, "\\=/");
948     MvWAddStr(lookdeer4, 3, 17, "^\\o o/^");
949     MvWAddStr(lookdeer4, 4, 17, "//( )");
950     MvWAddStr(lookdeer4, 5, 7, "^~~~~~~~~// \\O/");
951     MvWAddStr(lookdeer4, 6, 6, "( )______( /");
952     MvWAddStr(lookdeer4, 7, 5, "(/          \\");
953     MvWAddStr(lookdeer4, 8, 0, "v___=             ----^");
954
955         /***********************************************/
956     cbreak();
957     nodelay(stdscr, TRUE);
958     do {
959         clear();
960         werase(treescrn);
961         touchwin(w_del_msg);
962         touchwin(treescrn);
963         werase(treescrn2);
964         touchwin(treescrn2);
965         werase(treescrn8);
966         touchwin(treescrn8);
967         refresh();
968         look_out(150);
969         boxit();
970         refresh();
971         look_out(150);
972         seas();
973         refresh();
974         look_out(150);
975         greet();
976         refresh();
977         look_out(150);
978         fromwho();
979         refresh();
980         look_out(150);
981         tree();
982         look_out(150);
983         balls();
984         look_out(150);
985         star();
986         look_out(150);
987         strng1();
988         strng2();
989         strng3();
990         strng4();
991         strng5();
992
993         /* set up the windows for our blinking trees */
994         /* **************************************** */
995         /* treescrn3 */
996
997         overlay(treescrn, treescrn3);
998
999         /*balls */
1000         MvWAddCh(treescrn3, 4, 18, ' ');
1001         MvWAddCh(treescrn3, 7, 6, ' ');
1002         MvWAddCh(treescrn3, 8, 19, ' ');
1003         MvWAddCh(treescrn3, 11, 22, ' ');
1004
1005         /*star */
1006         MvWAddCh(treescrn3, 0, 12, '*');
1007
1008         /*strng1 */
1009         MvWAddCh(treescrn3, 3, 11, ' ');
1010
1011         /*strng2 */
1012         MvWAddCh(treescrn3, 5, 13, ' ');
1013         MvWAddCh(treescrn3, 6, 10, ' ');
1014
1015         /*strng3 */
1016         MvWAddCh(treescrn3, 7, 16, ' ');
1017         MvWAddCh(treescrn3, 7, 14, ' ');
1018
1019         /*strng4 */
1020         MvWAddCh(treescrn3, 10, 13, ' ');
1021         MvWAddCh(treescrn3, 10, 10, ' ');
1022         MvWAddCh(treescrn3, 11, 8, ' ');
1023
1024         /*strng5 */
1025         MvWAddCh(treescrn3, 11, 18, ' ');
1026         MvWAddCh(treescrn3, 12, 13, ' ');
1027
1028         /* treescrn4 */
1029
1030         overlay(treescrn, treescrn4);
1031
1032         /*balls */
1033         MvWAddCh(treescrn4, 3, 9, ' ');
1034         MvWAddCh(treescrn4, 4, 16, ' ');
1035         MvWAddCh(treescrn4, 7, 6, ' ');
1036         MvWAddCh(treescrn4, 8, 19, ' ');
1037         MvWAddCh(treescrn4, 11, 2, ' ');
1038         MvWAddCh(treescrn4, 12, 23, ' ');
1039
1040         /*star */
1041         (void) wstandout(treescrn4);
1042         MvWAddCh(treescrn4, 0, 12, '*');
1043         (void) wstandend(treescrn4);
1044
1045         /*strng1 */
1046         MvWAddCh(treescrn4, 3, 13, ' ');
1047
1048         /*strng2 */
1049
1050         /*strng3 */
1051         MvWAddCh(treescrn4, 7, 15, ' ');
1052         MvWAddCh(treescrn4, 8, 11, ' ');
1053
1054         /*strng4 */
1055         MvWAddCh(treescrn4, 9, 16, ' ');
1056         MvWAddCh(treescrn4, 10, 12, ' ');
1057         MvWAddCh(treescrn4, 11, 8, ' ');
1058
1059         /*strng5 */
1060         MvWAddCh(treescrn4, 11, 18, ' ');
1061         MvWAddCh(treescrn4, 12, 14, ' ');
1062
1063         /* treescrn5 */
1064
1065         overlay(treescrn, treescrn5);
1066
1067         /*balls */
1068         MvWAddCh(treescrn5, 3, 15, ' ');
1069         MvWAddCh(treescrn5, 10, 20, ' ');
1070         MvWAddCh(treescrn5, 12, 1, ' ');
1071
1072         /*star */
1073         MvWAddCh(treescrn5, 0, 12, '*');
1074
1075         /*strng1 */
1076         MvWAddCh(treescrn5, 3, 11, ' ');
1077
1078         /*strng2 */
1079         MvWAddCh(treescrn5, 5, 12, ' ');
1080
1081         /*strng3 */
1082         MvWAddCh(treescrn5, 7, 14, ' ');
1083         MvWAddCh(treescrn5, 8, 10, ' ');
1084
1085         /*strng4 */
1086         MvWAddCh(treescrn5, 9, 15, ' ');
1087         MvWAddCh(treescrn5, 10, 11, ' ');
1088         MvWAddCh(treescrn5, 11, 7, ' ');
1089
1090         /*strng5 */
1091         MvWAddCh(treescrn5, 11, 17, ' ');
1092         MvWAddCh(treescrn5, 12, 13, ' ');
1093
1094         /* treescrn6 */
1095
1096         overlay(treescrn, treescrn6);
1097
1098         /*balls */
1099         MvWAddCh(treescrn6, 6, 7, ' ');
1100         MvWAddCh(treescrn6, 7, 18, ' ');
1101         MvWAddCh(treescrn6, 10, 4, ' ');
1102         MvWAddCh(treescrn6, 11, 23, ' ');
1103
1104         /*star */
1105         (void) wstandout(treescrn6);
1106         MvWAddCh(treescrn6, 0, 12, '*');
1107         (void) wstandend(treescrn6);
1108
1109         /*strng1 */
1110
1111         /*strng2 */
1112         MvWAddCh(treescrn6, 5, 11, ' ');
1113
1114         /*strng3 */
1115         MvWAddCh(treescrn6, 7, 13, ' ');
1116         MvWAddCh(treescrn6, 8, 9, ' ');
1117
1118         /*strng4 */
1119         MvWAddCh(treescrn6, 9, 14, ' ');
1120         MvWAddCh(treescrn6, 10, 10, ' ');
1121         MvWAddCh(treescrn6, 11, 6, ' ');
1122
1123         /*strng5 */
1124         MvWAddCh(treescrn6, 11, 16, ' ');
1125         MvWAddCh(treescrn6, 12, 12, ' ');
1126
1127         /* treescrn7 */
1128
1129         overlay(treescrn, treescrn7);
1130
1131         /*balls */
1132         MvWAddCh(treescrn7, 3, 15, ' ');
1133         MvWAddCh(treescrn7, 6, 7, ' ');
1134         MvWAddCh(treescrn7, 7, 18, ' ');
1135         MvWAddCh(treescrn7, 10, 4, ' ');
1136         MvWAddCh(treescrn7, 11, 22, ' ');
1137
1138         /*star */
1139         MvWAddCh(treescrn7, 0, 12, '*');
1140
1141         /*strng1 */
1142         MvWAddCh(treescrn7, 3, 12, ' ');
1143
1144         /*strng2 */
1145         MvWAddCh(treescrn7, 5, 13, ' ');
1146         MvWAddCh(treescrn7, 6, 9, ' ');
1147
1148         /*strng3 */
1149         MvWAddCh(treescrn7, 7, 15, ' ');
1150         MvWAddCh(treescrn7, 8, 11, ' ');
1151
1152         /*strng4 */
1153         MvWAddCh(treescrn7, 9, 16, ' ');
1154         MvWAddCh(treescrn7, 10, 12, ' ');
1155         MvWAddCh(treescrn7, 11, 8, ' ');
1156
1157         /*strng5 */
1158         MvWAddCh(treescrn7, 11, 18, ' ');
1159         MvWAddCh(treescrn7, 12, 14, ' ');
1160
1161         look_out(150);
1162         reindeer();
1163
1164         touchwin(w_holiday);
1165         wrefresh(w_holiday);
1166         wrefresh(w_del_msg);
1167
1168         look_out(500);
1169         for (loopy = 0; loopy < 100; loopy++) {
1170             blinkit();
1171         }
1172     } while (!opt_q);
1173     done(0);
1174 }