]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/python/contrib/Demo/curses/xmas.py
Inital import
[l4.git] / l4 / pkg / python / contrib / Demo / curses / xmas.py
1 # asciixmas
2 # December 1989             Larry Bartz           Indianapolis, IN
3 #
4 # $Id: xmas.py 46623 2006-06-03 22:59:23Z andrew.kuchling $
5 #
6 # I'm dreaming of an ascii character-based monochrome Christmas,
7 # Just like the ones 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 # Notes on the Python version:
20 # I used a couple of `try...except curses.error' to get around some functions
21 # returning ERR. The errors come from using wrapping functions to fill
22 # windows to the last character cell. The C version doesn't have this problem,
23 # it simply ignores any return values.
24 #
25
26 import curses
27 import sys
28
29 FROMWHO = "Thomas Gellekum <tg@FreeBSD.org>"
30
31 def set_color(win, color):
32     if curses.has_colors():
33         n = color + 1
34         curses.init_pair(n, color, my_bg)
35         win.attroff(curses.A_COLOR)
36         win.attron(curses.color_pair(n))
37
38 def unset_color(win):
39     if curses.has_colors():
40         win.attrset(curses.color_pair(0))
41
42 def look_out(msecs):
43     curses.napms(msecs)
44     if stdscr.getch() != -1:
45         curses.beep()
46         sys.exit(0)
47
48 def boxit():
49     for y in range(0, 20):
50         stdscr.addch(y, 7, ord('|'))
51
52     for x in range(8, 80):
53         stdscr.addch(19, x, ord('_'))
54
55     for x in range(0, 80):
56         stdscr.addch(22, x, ord('_'))
57
58     return
59
60 def seas():
61     stdscr.addch(4, 1, ord('S'))
62     stdscr.addch(6, 1, ord('E'))
63     stdscr.addch(8, 1, ord('A'))
64     stdscr.addch(10, 1, ord('S'))
65     stdscr.addch(12, 1, ord('O'))
66     stdscr.addch(14, 1, ord('N'))
67     stdscr.addch(16, 1, ord("'"))
68     stdscr.addch(18, 1, ord('S'))
69
70     return
71
72 def greet():
73     stdscr.addch(3, 5, ord('G'))
74     stdscr.addch(5, 5, ord('R'))
75     stdscr.addch(7, 5, ord('E'))
76     stdscr.addch(9, 5, ord('E'))
77     stdscr.addch(11, 5, ord('T'))
78     stdscr.addch(13, 5, ord('I'))
79     stdscr.addch(15, 5, ord('N'))
80     stdscr.addch(17, 5, ord('G'))
81     stdscr.addch(19, 5, ord('S'))
82
83     return
84
85 def fromwho():
86     stdscr.addstr(21, 13, FROMWHO)
87     return
88
89 def tree():
90     set_color(treescrn, curses.COLOR_GREEN)
91     treescrn.addch(1, 11, ord('/'))
92     treescrn.addch(2, 11, ord('/'))
93     treescrn.addch(3, 10, ord('/'))
94     treescrn.addch(4, 9, ord('/'))
95     treescrn.addch(5, 9, ord('/'))
96     treescrn.addch(6, 8, ord('/'))
97     treescrn.addch(7, 7, ord('/'))
98     treescrn.addch(8, 6, ord('/'))
99     treescrn.addch(9, 6, ord('/'))
100     treescrn.addch(10, 5, ord('/'))
101     treescrn.addch(11, 3, ord('/'))
102     treescrn.addch(12, 2, ord('/'))
103
104     treescrn.addch(1, 13, ord('\\'))
105     treescrn.addch(2, 13, ord('\\'))
106     treescrn.addch(3, 14, ord('\\'))
107     treescrn.addch(4, 15, ord('\\'))
108     treescrn.addch(5, 15, ord('\\'))
109     treescrn.addch(6, 16, ord('\\'))
110     treescrn.addch(7, 17, ord('\\'))
111     treescrn.addch(8, 18, ord('\\'))
112     treescrn.addch(9, 18, ord('\\'))
113     treescrn.addch(10, 19, ord('\\'))
114     treescrn.addch(11, 21, ord('\\'))
115     treescrn.addch(12, 22, ord('\\'))
116
117     treescrn.addch(4, 10, ord('_'))
118     treescrn.addch(4, 14, ord('_'))
119     treescrn.addch(8, 7, ord('_'))
120     treescrn.addch(8, 17, ord('_'))
121
122     treescrn.addstr(13, 0, "//////////// \\\\\\\\\\\\\\\\\\\\\\\\")
123
124     treescrn.addstr(14, 11, "| |")
125     treescrn.addstr(15, 11, "|_|")
126
127     unset_color(treescrn)
128     treescrn.refresh()
129     w_del_msg.refresh()
130
131     return
132
133 def balls():
134     treescrn.overlay(treescrn2)
135
136     set_color(treescrn2, curses.COLOR_BLUE)
137     treescrn2.addch(3, 9, ord('@'))
138     treescrn2.addch(3, 15, ord('@'))
139     treescrn2.addch(4, 8, ord('@'))
140     treescrn2.addch(4, 16, ord('@'))
141     treescrn2.addch(5, 7, ord('@'))
142     treescrn2.addch(5, 17, ord('@'))
143     treescrn2.addch(7, 6, ord('@'))
144     treescrn2.addch(7, 18, ord('@'))
145     treescrn2.addch(8, 5, ord('@'))
146     treescrn2.addch(8, 19, ord('@'))
147     treescrn2.addch(10, 4, ord('@'))
148     treescrn2.addch(10, 20, ord('@'))
149     treescrn2.addch(11, 2, ord('@'))
150     treescrn2.addch(11, 22, ord('@'))
151     treescrn2.addch(12, 1, ord('@'))
152     treescrn2.addch(12, 23, ord('@'))
153
154     unset_color(treescrn2)
155     treescrn2.refresh()
156     w_del_msg.refresh()
157     return
158
159 def star():
160     treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
161     set_color(treescrn2, curses.COLOR_YELLOW)
162
163     treescrn2.addch(0, 12, ord('*'))
164     treescrn2.standend()
165
166     unset_color(treescrn2)
167     treescrn2.refresh()
168     w_del_msg.refresh()
169     return
170
171 def strng1():
172     treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
173     set_color(treescrn2, curses.COLOR_WHITE)
174
175     treescrn2.addch(3, 13, ord('\''))
176     treescrn2.addch(3, 12, ord(':'))
177     treescrn2.addch(3, 11, ord('.'))
178
179     treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
180     unset_color(treescrn2)
181
182     treescrn2.refresh()
183     w_del_msg.refresh()
184     return
185
186 def strng2():
187     treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
188     set_color(treescrn2, curses.COLOR_WHITE)
189
190     treescrn2.addch(5, 14, ord('\''))
191     treescrn2.addch(5, 13, ord(':'))
192     treescrn2.addch(5, 12, ord('.'))
193     treescrn2.addch(5, 11, ord(','))
194     treescrn2.addch(6, 10, ord('\''))
195     treescrn2.addch(6, 9, ord(':'))
196
197     treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
198     unset_color(treescrn2)
199
200     treescrn2.refresh()
201     w_del_msg.refresh()
202     return
203
204 def strng3():
205     treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
206     set_color(treescrn2, curses.COLOR_WHITE)
207
208     treescrn2.addch(7, 16, ord('\''))
209     treescrn2.addch(7, 15, ord(':'))
210     treescrn2.addch(7, 14, ord('.'))
211     treescrn2.addch(7, 13, ord(','))
212     treescrn2.addch(8, 12, ord('\''))
213     treescrn2.addch(8, 11, ord(':'))
214     treescrn2.addch(8, 10, ord('.'))
215     treescrn2.addch(8, 9, ord(','))
216
217     treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
218     unset_color(treescrn2)
219
220     treescrn2.refresh()
221     w_del_msg.refresh()
222     return
223
224 def strng4():
225     treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
226     set_color(treescrn2, curses.COLOR_WHITE)
227
228     treescrn2.addch(9, 17, ord('\''))
229     treescrn2.addch(9, 16, ord(':'))
230     treescrn2.addch(9, 15, ord('.'))
231     treescrn2.addch(9, 14, ord(','))
232     treescrn2.addch(10, 13, ord('\''))
233     treescrn2.addch(10, 12, ord(':'))
234     treescrn2.addch(10, 11, ord('.'))
235     treescrn2.addch(10, 10, ord(','))
236     treescrn2.addch(11, 9, ord('\''))
237     treescrn2.addch(11, 8, ord(':'))
238     treescrn2.addch(11, 7, ord('.'))
239     treescrn2.addch(11, 6, ord(','))
240     treescrn2.addch(12, 5, ord('\''))
241
242     treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
243     unset_color(treescrn2)
244
245     treescrn2.refresh()
246     w_del_msg.refresh()
247     return
248
249 def strng5():
250     treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
251     set_color(treescrn2, curses.COLOR_WHITE)
252
253     treescrn2.addch(11, 19, ord('\''))
254     treescrn2.addch(11, 18, ord(':'))
255     treescrn2.addch(11, 17, ord('.'))
256     treescrn2.addch(11, 16, ord(','))
257     treescrn2.addch(12, 15, ord('\''))
258     treescrn2.addch(12, 14, ord(':'))
259     treescrn2.addch(12, 13, ord('.'))
260     treescrn2.addch(12, 12, ord(','))
261
262     treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
263     unset_color(treescrn2)
264
265     # save a fully lit tree
266     treescrn2.overlay(treescrn)
267
268     treescrn2.refresh()
269     w_del_msg.refresh()
270     return
271
272 def blinkit():
273     treescrn8.touchwin()
274
275     for cycle in range(5):
276         if cycle == 0:
277             treescrn3.overlay(treescrn8)
278             treescrn8.refresh()
279             w_del_msg.refresh()
280             break
281         elif cycle == 1:
282             treescrn4.overlay(treescrn8)
283             treescrn8.refresh()
284             w_del_msg.refresh()
285             break
286         elif cycle == 2:
287             treescrn5.overlay(treescrn8)
288             treescrn8.refresh()
289             w_del_msg.refresh()
290             break
291         elif cycle == 3:
292             treescrn6.overlay(treescrn8)
293             treescrn8.refresh()
294             w_del_msg.refresh()
295             break
296         elif cycle == 4:
297             treescrn7.overlay(treescrn8)
298             treescrn8.refresh()
299             w_del_msg.refresh()
300             break
301
302         treescrn8.touchwin()
303
304     # ALL ON
305     treescrn.overlay(treescrn8)
306     treescrn8.refresh()
307     w_del_msg.refresh()
308
309     return
310
311 def deer_step(win, y, x):
312     win.mvwin(y, x)
313     win.refresh()
314     w_del_msg.refresh()
315     look_out(5)
316
317 def reindeer():
318     y_pos = 0
319
320     for x_pos in range(70, 62, -1):
321         if x_pos < 66: y_pos = 1
322         for looper in range(0, 4):
323             dotdeer0.addch(y_pos, x_pos, ord('.'))
324             dotdeer0.refresh()
325             w_del_msg.refresh()
326             dotdeer0.erase()
327             dotdeer0.refresh()
328             w_del_msg.refresh()
329             look_out(50)
330
331     y_pos = 2
332
333     for x_pos in range(x_pos - 1, 50, -1):
334         for looper in range(0, 4):
335             if x_pos < 56:
336                 y_pos = 3
337
338                 try:
339                     stardeer0.addch(y_pos, x_pos, ord('*'))
340                 except curses.error:
341                     pass
342                 stardeer0.refresh()
343                 w_del_msg.refresh()
344                 stardeer0.erase()
345                 stardeer0.refresh()
346                 w_del_msg.refresh()
347             else:
348                 dotdeer0.addch(y_pos, x_pos, ord('*'))
349                 dotdeer0.refresh()
350                 w_del_msg.refresh()
351                 dotdeer0.erase()
352                 dotdeer0.refresh()
353                 w_del_msg.refresh()
354
355     x_pos = 58
356
357     for y_pos in range(2, 5):
358         lildeer0.touchwin()
359         lildeer0.refresh()
360         w_del_msg.refresh()
361
362         for looper in range(0, 4):
363             deer_step(lildeer3, y_pos, x_pos)
364             deer_step(lildeer2, y_pos, x_pos)
365             deer_step(lildeer1, y_pos, x_pos)
366             deer_step(lildeer2, y_pos, x_pos)
367             deer_step(lildeer3, y_pos, x_pos)
368
369             lildeer0.touchwin()
370             lildeer0.refresh()
371             w_del_msg.refresh()
372
373             x_pos -= 2
374
375     x_pos = 35
376
377     for y_pos in range(5, 10):
378
379         middeer0.touchwin()
380         middeer0.refresh()
381         w_del_msg.refresh()
382
383         for looper in range(2):
384             deer_step(middeer3, y_pos, x_pos)
385             deer_step(middeer2, y_pos, x_pos)
386             deer_step(middeer1, y_pos, x_pos)
387             deer_step(middeer2, y_pos, x_pos)
388             deer_step(middeer3, y_pos, x_pos)
389
390             middeer0.touchwin()
391             middeer0.refresh()
392             w_del_msg.refresh()
393
394             x_pos -= 3
395
396     look_out(300)
397
398     y_pos = 1
399
400     for x_pos in range(8, 16):
401         deer_step(bigdeer4, y_pos, x_pos)
402         deer_step(bigdeer3, y_pos, x_pos)
403         deer_step(bigdeer2, y_pos, x_pos)
404         deer_step(bigdeer1, y_pos, x_pos)
405         deer_step(bigdeer2, y_pos, x_pos)
406         deer_step(bigdeer3, y_pos, x_pos)
407         deer_step(bigdeer4, y_pos, x_pos)
408         deer_step(bigdeer0, y_pos, x_pos)
409
410     x_pos -= 1
411
412     for looper in range(0, 6):
413         deer_step(lookdeer4, y_pos, x_pos)
414         deer_step(lookdeer3, y_pos, x_pos)
415         deer_step(lookdeer2, y_pos, x_pos)
416         deer_step(lookdeer1, y_pos, x_pos)
417         deer_step(lookdeer2, y_pos, x_pos)
418         deer_step(lookdeer3, y_pos, x_pos)
419         deer_step(lookdeer4, y_pos, x_pos)
420
421     deer_step(lookdeer0, y_pos, x_pos)
422
423     for y_pos in range(y_pos, 10):
424         for looper in range(0, 2):
425             deer_step(bigdeer4, y_pos, x_pos)
426             deer_step(bigdeer3, y_pos, x_pos)
427             deer_step(bigdeer2, y_pos, x_pos)
428             deer_step(bigdeer1, y_pos, x_pos)
429             deer_step(bigdeer2, y_pos, x_pos)
430             deer_step(bigdeer3, y_pos, x_pos)
431             deer_step(bigdeer4, y_pos, x_pos)
432         deer_step(bigdeer0, y_pos, x_pos)
433
434     y_pos -= 1
435
436     deer_step(lookdeer3, y_pos, x_pos)
437     return
438
439 def main(win):
440     global stdscr
441     stdscr = win
442
443     global my_bg, y_pos, x_pos
444     global treescrn, treescrn2, treescrn3, treescrn4
445     global treescrn5, treescrn6, treescrn7, treescrn8
446     global dotdeer0, stardeer0
447     global lildeer0, lildeer1, lildeer2, lildeer3
448     global middeer0, middeer1, middeer2, middeer3
449     global bigdeer0, bigdeer1, bigdeer2, bigdeer3, bigdeer4
450     global lookdeer0, lookdeer1, lookdeer2, lookdeer3, lookdeer4
451     global w_holiday, w_del_msg
452
453     my_bg = curses.COLOR_BLACK
454     # curses.curs_set(0)
455
456     treescrn = curses.newwin(16, 27, 3, 53)
457     treescrn2 = curses.newwin(16, 27, 3, 53)
458     treescrn3 = curses.newwin(16, 27, 3, 53)
459     treescrn4 = curses.newwin(16, 27, 3, 53)
460     treescrn5 = curses.newwin(16, 27, 3, 53)
461     treescrn6 = curses.newwin(16, 27, 3, 53)
462     treescrn7 = curses.newwin(16, 27, 3, 53)
463     treescrn8 = curses.newwin(16, 27, 3, 53)
464
465     dotdeer0 = curses.newwin(3, 71, 0, 8)
466
467     stardeer0 = curses.newwin(4, 56, 0, 8)
468
469     lildeer0 = curses.newwin(7, 53, 0, 8)
470     lildeer1 = curses.newwin(2, 4, 0, 0)
471     lildeer2 = curses.newwin(2, 4, 0, 0)
472     lildeer3 = curses.newwin(2, 4, 0, 0)
473
474     middeer0 = curses.newwin(15, 42, 0, 8)
475     middeer1 = curses.newwin(3, 7, 0, 0)
476     middeer2 = curses.newwin(3, 7, 0, 0)
477     middeer3 = curses.newwin(3, 7, 0, 0)
478
479     bigdeer0 = curses.newwin(10, 23, 0, 0)
480     bigdeer1 = curses.newwin(10, 23, 0, 0)
481     bigdeer2 = curses.newwin(10, 23, 0, 0)
482     bigdeer3 = curses.newwin(10, 23, 0, 0)
483     bigdeer4 = curses.newwin(10, 23, 0, 0)
484
485     lookdeer0 = curses.newwin(10, 25, 0, 0)
486     lookdeer1 = curses.newwin(10, 25, 0, 0)
487     lookdeer2 = curses.newwin(10, 25, 0, 0)
488     lookdeer3 = curses.newwin(10, 25, 0, 0)
489     lookdeer4 = curses.newwin(10, 25, 0, 0)
490
491     w_holiday = curses.newwin(1, 27, 3, 27)
492
493     w_del_msg = curses.newwin(1, 20, 23, 60)
494
495     try:
496         w_del_msg.addstr(0, 0, "Hit any key to quit")
497     except curses.error:
498         pass
499
500     try:
501         w_holiday.addstr(0, 0, "H A P P Y  H O L I D A Y S")
502     except curses.error:
503         pass
504
505     # set up the windows for our various reindeer
506     lildeer1.addch(0, 0, ord('V'))
507     lildeer1.addch(1, 0, ord('@'))
508     lildeer1.addch(1, 1, ord('<'))
509     lildeer1.addch(1, 2, ord('>'))
510     try:
511         lildeer1.addch(1, 3, ord('~'))
512     except curses.error:
513         pass
514
515     lildeer2.addch(0, 0, ord('V'))
516     lildeer2.addch(1, 0, ord('@'))
517     lildeer2.addch(1, 1, ord('|'))
518     lildeer2.addch(1, 2, ord('|'))
519     try:
520         lildeer2.addch(1, 3, ord('~'))
521     except curses.error:
522         pass
523
524     lildeer3.addch(0, 0, ord('V'))
525     lildeer3.addch(1, 0, ord('@'))
526     lildeer3.addch(1, 1, ord('>'))
527     lildeer3.addch(1, 2, ord('<'))
528     try:
529         lildeer2.addch(1, 3, ord('~'))  # XXX
530     except curses.error:
531         pass
532
533     middeer1.addch(0, 2, ord('y'))
534     middeer1.addch(0, 3, ord('y'))
535     middeer1.addch(1, 2, ord('0'))
536     middeer1.addch(1, 3, ord('('))
537     middeer1.addch(1, 4, ord('='))
538     middeer1.addch(1, 5, ord(')'))
539     middeer1.addch(1, 6, ord('~'))
540     middeer1.addch(2, 3, ord('\\'))
541     middeer1.addch(2, 5, ord('/'))
542
543     middeer2.addch(0, 2, ord('y'))
544     middeer2.addch(0, 3, ord('y'))
545     middeer2.addch(1, 2, ord('0'))
546     middeer2.addch(1, 3, ord('('))
547     middeer2.addch(1, 4, ord('='))
548     middeer2.addch(1, 5, ord(')'))
549     middeer2.addch(1, 6, ord('~'))
550     middeer2.addch(2, 3, ord('|'))
551     middeer2.addch(2, 5, ord('|'))
552
553     middeer3.addch(0, 2, ord('y'))
554     middeer3.addch(0, 3, ord('y'))
555     middeer3.addch(1, 2, ord('0'))
556     middeer3.addch(1, 3, ord('('))
557     middeer3.addch(1, 4, ord('='))
558     middeer3.addch(1, 5, ord(')'))
559     middeer3.addch(1, 6, ord('~'))
560     middeer3.addch(2, 3, ord('/'))
561     middeer3.addch(2, 5, ord('\\'))
562
563     bigdeer1.addch(0, 17, ord('\\'))
564     bigdeer1.addch(0, 18, ord('/'))
565     bigdeer1.addch(0, 19, ord('\\'))
566     bigdeer1.addch(0, 20, ord('/'))
567     bigdeer1.addch(1, 18, ord('\\'))
568     bigdeer1.addch(1, 20, ord('/'))
569     bigdeer1.addch(2, 19, ord('|'))
570     bigdeer1.addch(2, 20, ord('_'))
571     bigdeer1.addch(3, 18, ord('/'))
572     bigdeer1.addch(3, 19, ord('^'))
573     bigdeer1.addch(3, 20, ord('0'))
574     bigdeer1.addch(3, 21, ord('\\'))
575     bigdeer1.addch(4, 17, ord('/'))
576     bigdeer1.addch(4, 18, ord('/'))
577     bigdeer1.addch(4, 19, ord('\\'))
578     bigdeer1.addch(4, 22, ord('\\'))
579     bigdeer1.addstr(5, 7, "^~~~~~~~~//  ~~U")
580     bigdeer1.addstr(6, 7, "( \\_____( /")       # ))
581     bigdeer1.addstr(7, 8, "( )    /")
582     bigdeer1.addstr(8, 9, "\\\\   /")
583     bigdeer1.addstr(9, 11, "\\>/>")
584
585     bigdeer2.addch(0, 17, ord('\\'))
586     bigdeer2.addch(0, 18, ord('/'))
587     bigdeer2.addch(0, 19, ord('\\'))
588     bigdeer2.addch(0, 20, ord('/'))
589     bigdeer2.addch(1, 18, ord('\\'))
590     bigdeer2.addch(1, 20, ord('/'))
591     bigdeer2.addch(2, 19, ord('|'))
592     bigdeer2.addch(2, 20, ord('_'))
593     bigdeer2.addch(3, 18, ord('/'))
594     bigdeer2.addch(3, 19, ord('^'))
595     bigdeer2.addch(3, 20, ord('0'))
596     bigdeer2.addch(3, 21, ord('\\'))
597     bigdeer2.addch(4, 17, ord('/'))
598     bigdeer2.addch(4, 18, ord('/'))
599     bigdeer2.addch(4, 19, ord('\\'))
600     bigdeer2.addch(4, 22, ord('\\'))
601     bigdeer2.addstr(5, 7, "^~~~~~~~~//  ~~U")
602     bigdeer2.addstr(6, 7, "(( )____( /")        # ))
603     bigdeer2.addstr(7, 7, "( /    |")
604     bigdeer2.addstr(8, 8, "\\/    |")
605     bigdeer2.addstr(9, 9, "|>   |>")
606
607     bigdeer3.addch(0, 17, ord('\\'))
608     bigdeer3.addch(0, 18, ord('/'))
609     bigdeer3.addch(0, 19, ord('\\'))
610     bigdeer3.addch(0, 20, ord('/'))
611     bigdeer3.addch(1, 18, ord('\\'))
612     bigdeer3.addch(1, 20, ord('/'))
613     bigdeer3.addch(2, 19, ord('|'))
614     bigdeer3.addch(2, 20, ord('_'))
615     bigdeer3.addch(3, 18, ord('/'))
616     bigdeer3.addch(3, 19, ord('^'))
617     bigdeer3.addch(3, 20, ord('0'))
618     bigdeer3.addch(3, 21, ord('\\'))
619     bigdeer3.addch(4, 17, ord('/'))
620     bigdeer3.addch(4, 18, ord('/'))
621     bigdeer3.addch(4, 19, ord('\\'))
622     bigdeer3.addch(4, 22, ord('\\'))
623     bigdeer3.addstr(5, 7, "^~~~~~~~~//  ~~U")
624     bigdeer3.addstr(6, 6, "( ()_____( /")       # ))
625     bigdeer3.addstr(7, 6, "/ /       /")
626     bigdeer3.addstr(8, 5, "|/          \\")
627     bigdeer3.addstr(9, 5, "/>           \\>")
628
629     bigdeer4.addch(0, 17, ord('\\'))
630     bigdeer4.addch(0, 18, ord('/'))
631     bigdeer4.addch(0, 19, ord('\\'))
632     bigdeer4.addch(0, 20, ord('/'))
633     bigdeer4.addch(1, 18, ord('\\'))
634     bigdeer4.addch(1, 20, ord('/'))
635     bigdeer4.addch(2, 19, ord('|'))
636     bigdeer4.addch(2, 20, ord('_'))
637     bigdeer4.addch(3, 18, ord('/'))
638     bigdeer4.addch(3, 19, ord('^'))
639     bigdeer4.addch(3, 20, ord('0'))
640     bigdeer4.addch(3, 21, ord('\\'))
641     bigdeer4.addch(4, 17, ord('/'))
642     bigdeer4.addch(4, 18, ord('/'))
643     bigdeer4.addch(4, 19, ord('\\'))
644     bigdeer4.addch(4, 22, ord('\\'))
645     bigdeer4.addstr(5, 7, "^~~~~~~~~//  ~~U")
646     bigdeer4.addstr(6, 6, "( )______( /")       # )
647     bigdeer4.addstr(7, 5, "(/          \\")     # )
648     bigdeer4.addstr(8, 0, "v___=             ----^")
649
650     lookdeer1.addstr(0, 16, "\\/     \\/")
651     lookdeer1.addstr(1, 17, "\\Y/ \\Y/")
652     lookdeer1.addstr(2, 19, "\\=/")
653     lookdeer1.addstr(3, 17, "^\\o o/^")
654     lookdeer1.addstr(4, 17, "//( )")
655     lookdeer1.addstr(5, 7, "^~~~~~~~~// \\O/")
656     lookdeer1.addstr(6, 7, "( \\_____( /")      # ))
657     lookdeer1.addstr(7, 8, "( )    /")
658     lookdeer1.addstr(8, 9, "\\\\   /")
659     lookdeer1.addstr(9, 11, "\\>/>")
660
661     lookdeer2.addstr(0, 16, "\\/     \\/")
662     lookdeer2.addstr(1, 17, "\\Y/ \\Y/")
663     lookdeer2.addstr(2, 19, "\\=/")
664     lookdeer2.addstr(3, 17, "^\\o o/^")
665     lookdeer2.addstr(4, 17, "//( )")
666     lookdeer2.addstr(5, 7, "^~~~~~~~~// \\O/")
667     lookdeer2.addstr(6, 7, "(( )____( /")       # ))
668     lookdeer2.addstr(7, 7, "( /    |")
669     lookdeer2.addstr(8, 8, "\\/    |")
670     lookdeer2.addstr(9, 9, "|>   |>")
671
672     lookdeer3.addstr(0, 16, "\\/     \\/")
673     lookdeer3.addstr(1, 17, "\\Y/ \\Y/")
674     lookdeer3.addstr(2, 19, "\\=/")
675     lookdeer3.addstr(3, 17, "^\\o o/^")
676     lookdeer3.addstr(4, 17, "//( )")
677     lookdeer3.addstr(5, 7, "^~~~~~~~~// \\O/")
678     lookdeer3.addstr(6, 6, "( ()_____( /")      # ))
679     lookdeer3.addstr(7, 6, "/ /       /")
680     lookdeer3.addstr(8, 5, "|/          \\")
681     lookdeer3.addstr(9, 5, "/>           \\>")
682
683     lookdeer4.addstr(0, 16, "\\/     \\/")
684     lookdeer4.addstr(1, 17, "\\Y/ \\Y/")
685     lookdeer4.addstr(2, 19, "\\=/")
686     lookdeer4.addstr(3, 17, "^\\o o/^")
687     lookdeer4.addstr(4, 17, "//( )")
688     lookdeer4.addstr(5, 7, "^~~~~~~~~// \\O/")
689     lookdeer4.addstr(6, 6, "( )______( /")      # )
690     lookdeer4.addstr(7, 5, "(/          \\")    # )
691     lookdeer4.addstr(8, 0, "v___=             ----^")
692
693     ###############################################
694     curses.cbreak()
695     stdscr.nodelay(1)
696
697     while 1:
698         stdscr.clear()
699         treescrn.erase()
700         w_del_msg.touchwin()
701         treescrn.touchwin()
702         treescrn2.erase()
703         treescrn2.touchwin()
704         treescrn8.erase()
705         treescrn8.touchwin()
706         stdscr.refresh()
707         look_out(150)
708         boxit()
709         stdscr.refresh()
710         look_out(150)
711         seas()
712         stdscr.refresh()
713         greet()
714         stdscr.refresh()
715         look_out(150)
716         fromwho()
717         stdscr.refresh()
718         look_out(150)
719         tree()
720         look_out(150)
721         balls()
722         look_out(150)
723         star()
724         look_out(150)
725         strng1()
726         strng2()
727         strng3()
728         strng4()
729         strng5()
730
731         # set up the windows for our blinking trees
732         #
733         # treescrn3
734         treescrn.overlay(treescrn3)
735
736         # balls
737         treescrn3.addch(4, 18, ord(' '))
738         treescrn3.addch(7, 6, ord(' '))
739         treescrn3.addch(8, 19, ord(' '))
740         treescrn3.addch(11, 22, ord(' '))
741
742         # star
743         treescrn3.addch(0, 12, ord('*'))
744
745         # strng1
746         treescrn3.addch(3, 11, ord(' '))
747
748         # strng2
749         treescrn3.addch(5, 13, ord(' '))
750         treescrn3.addch(6, 10, ord(' '))
751
752         # strng3
753         treescrn3.addch(7, 16, ord(' '))
754         treescrn3.addch(7, 14, ord(' '))
755
756         # strng4
757         treescrn3.addch(10, 13, ord(' '))
758         treescrn3.addch(10, 10, ord(' '))
759         treescrn3.addch(11, 8, ord(' '))
760
761         # strng5
762         treescrn3.addch(11, 18, ord(' '))
763         treescrn3.addch(12, 13, ord(' '))
764
765         # treescrn4
766         treescrn.overlay(treescrn4)
767
768         # balls
769         treescrn4.addch(3, 9, ord(' '))
770         treescrn4.addch(4, 16, ord(' '))
771         treescrn4.addch(7, 6, ord(' '))
772         treescrn4.addch(8, 19, ord(' '))
773         treescrn4.addch(11, 2, ord(' '))
774         treescrn4.addch(12, 23, ord(' '))
775
776         # star
777         treescrn4.standout()
778         treescrn4.addch(0, 12, ord('*'))
779         treescrn4.standend()
780
781         # strng1
782         treescrn4.addch(3, 13, ord(' '))
783
784         # strng2
785
786         # strng3
787         treescrn4.addch(7, 15, ord(' '))
788         treescrn4.addch(8, 11, ord(' '))
789
790         # strng4
791         treescrn4.addch(9, 16, ord(' '))
792         treescrn4.addch(10, 12, ord(' '))
793         treescrn4.addch(11, 8, ord(' '))
794
795         # strng5
796         treescrn4.addch(11, 18, ord(' '))
797         treescrn4.addch(12, 14, ord(' '))
798
799         # treescrn5
800         treescrn.overlay(treescrn5)
801
802         # balls
803         treescrn5.addch(3, 15, ord(' '))
804         treescrn5.addch(10, 20, ord(' '))
805         treescrn5.addch(12, 1, ord(' '))
806
807         # star
808         treescrn5.addch(0, 12, ord(' '))
809
810         # strng1
811         treescrn5.addch(3, 11, ord(' '))
812
813         # strng2
814         treescrn5.addch(5, 12, ord(' '))
815
816         # strng3
817         treescrn5.addch(7, 14, ord(' '))
818         treescrn5.addch(8, 10, ord(' '))
819
820         # strng4
821         treescrn5.addch(9, 15, ord(' '))
822         treescrn5.addch(10, 11, ord(' '))
823         treescrn5.addch(11, 7, ord(' '))
824
825         # strng5
826         treescrn5.addch(11, 17, ord(' '))
827         treescrn5.addch(12, 13, ord(' '))
828
829         # treescrn6
830         treescrn.overlay(treescrn6)
831
832         # balls
833         treescrn6.addch(6, 7, ord(' '))
834         treescrn6.addch(7, 18, ord(' '))
835         treescrn6.addch(10, 4, ord(' '))
836         treescrn6.addch(11, 23, ord(' '))
837
838         # star
839         treescrn6.standout()
840         treescrn6.addch(0, 12, ord('*'))
841         treescrn6.standend()
842
843         # strng1
844
845         # strng2
846         treescrn6.addch(5, 11, ord(' '))
847
848         # strng3
849         treescrn6.addch(7, 13, ord(' '))
850         treescrn6.addch(8, 9, ord(' '))
851
852         # strng4
853         treescrn6.addch(9, 14, ord(' '))
854         treescrn6.addch(10, 10, ord(' '))
855         treescrn6.addch(11, 6, ord(' '))
856
857         # strng5
858         treescrn6.addch(11, 16, ord(' '))
859         treescrn6.addch(12, 12, ord(' '))
860
861         #  treescrn7
862
863         treescrn.overlay(treescrn7)
864
865         # balls
866         treescrn7.addch(3, 15, ord(' '))
867         treescrn7.addch(6, 7, ord(' '))
868         treescrn7.addch(7, 18, ord(' '))
869         treescrn7.addch(10, 4, ord(' '))
870         treescrn7.addch(11, 22, ord(' '))
871
872         # star
873         treescrn7.addch(0, 12, ord('*'))
874
875         # strng1
876         treescrn7.addch(3, 12, ord(' '))
877
878         # strng2
879         treescrn7.addch(5, 13, ord(' '))
880         treescrn7.addch(6, 9, ord(' '))
881
882         # strng3
883         treescrn7.addch(7, 15, ord(' '))
884         treescrn7.addch(8, 11, ord(' '))
885
886         # strng4
887         treescrn7.addch(9, 16, ord(' '))
888         treescrn7.addch(10, 12, ord(' '))
889         treescrn7.addch(11, 8, ord(' '))
890
891         # strng5
892         treescrn7.addch(11, 18, ord(' '))
893         treescrn7.addch(12, 14, ord(' '))
894
895         look_out(150)
896         reindeer()
897
898         w_holiday.touchwin()
899         w_holiday.refresh()
900         w_del_msg.refresh()
901
902         look_out(500)
903         for i in range(0, 20):
904             blinkit()
905
906 curses.wrapper(main)