Fixed issue-number mistake in NEWS update.
[python.git] / Demo / curses / xmas.py
blob349b3a8bdaaec7aae3549c4c119fdfcc0d9da867
1 # asciixmas
2 # December 1989 Larry Bartz Indianapolis, IN
4 # $Id$
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.
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)!
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.
26 import curses
27 import sys
29 FROMWHO = "Thomas Gellekum <tg@FreeBSD.org>"
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))
38 def unset_color(win):
39 if curses.has_colors():
40 win.attrset(curses.color_pair(0))
42 def look_out(msecs):
43 curses.napms(msecs)
44 if stdscr.getch() != -1:
45 curses.beep()
46 sys.exit(0)
48 def boxit():
49 for y in range(0, 20):
50 stdscr.addch(y, 7, ord('|'))
52 for x in range(8, 80):
53 stdscr.addch(19, x, ord('_'))
55 for x in range(0, 80):
56 stdscr.addch(22, x, ord('_'))
58 return
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'))
70 return
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'))
83 return
85 def fromwho():
86 stdscr.addstr(21, 13, FROMWHO)
87 return
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('/'))
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('\\'))
117 treescrn.addch(4, 10, ord('_'))
118 treescrn.addch(4, 14, ord('_'))
119 treescrn.addch(8, 7, ord('_'))
120 treescrn.addch(8, 17, ord('_'))
122 treescrn.addstr(13, 0, "//////////// \\\\\\\\\\\\\\\\\\\\\\\\")
124 treescrn.addstr(14, 11, "| |")
125 treescrn.addstr(15, 11, "|_|")
127 unset_color(treescrn)
128 treescrn.refresh()
129 w_del_msg.refresh()
131 return
133 def balls():
134 treescrn.overlay(treescrn2)
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('@'))
154 unset_color(treescrn2)
155 treescrn2.refresh()
156 w_del_msg.refresh()
157 return
159 def star():
160 treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
161 set_color(treescrn2, curses.COLOR_YELLOW)
163 treescrn2.addch(0, 12, ord('*'))
164 treescrn2.standend()
166 unset_color(treescrn2)
167 treescrn2.refresh()
168 w_del_msg.refresh()
169 return
171 def strng1():
172 treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
173 set_color(treescrn2, curses.COLOR_WHITE)
175 treescrn2.addch(3, 13, ord('\''))
176 treescrn2.addch(3, 12, ord(':'))
177 treescrn2.addch(3, 11, ord('.'))
179 treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
180 unset_color(treescrn2)
182 treescrn2.refresh()
183 w_del_msg.refresh()
184 return
186 def strng2():
187 treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
188 set_color(treescrn2, curses.COLOR_WHITE)
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(':'))
197 treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
198 unset_color(treescrn2)
200 treescrn2.refresh()
201 w_del_msg.refresh()
202 return
204 def strng3():
205 treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
206 set_color(treescrn2, curses.COLOR_WHITE)
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(','))
217 treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
218 unset_color(treescrn2)
220 treescrn2.refresh()
221 w_del_msg.refresh()
222 return
224 def strng4():
225 treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
226 set_color(treescrn2, curses.COLOR_WHITE)
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('\''))
242 treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
243 unset_color(treescrn2)
245 treescrn2.refresh()
246 w_del_msg.refresh()
247 return
249 def strng5():
250 treescrn2.attrset(curses.A_BOLD | curses.A_BLINK)
251 set_color(treescrn2, curses.COLOR_WHITE)
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(','))
262 treescrn2.attroff(curses.A_BOLD | curses.A_BLINK)
263 unset_color(treescrn2)
265 # save a fully lit tree
266 treescrn2.overlay(treescrn)
268 treescrn2.refresh()
269 w_del_msg.refresh()
270 return
272 def blinkit():
273 treescrn8.touchwin()
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
302 treescrn8.touchwin()
304 # ALL ON
305 treescrn.overlay(treescrn8)
306 treescrn8.refresh()
307 w_del_msg.refresh()
309 return
311 def deer_step(win, y, x):
312 win.mvwin(y, x)
313 win.refresh()
314 w_del_msg.refresh()
315 look_out(5)
317 def reindeer():
318 y_pos = 0
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)
331 y_pos = 2
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
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()
355 x_pos = 58
357 for y_pos in range(2, 5):
358 lildeer0.touchwin()
359 lildeer0.refresh()
360 w_del_msg.refresh()
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)
369 lildeer0.touchwin()
370 lildeer0.refresh()
371 w_del_msg.refresh()
373 x_pos -= 2
375 x_pos = 35
377 for y_pos in range(5, 10):
379 middeer0.touchwin()
380 middeer0.refresh()
381 w_del_msg.refresh()
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)
390 middeer0.touchwin()
391 middeer0.refresh()
392 w_del_msg.refresh()
394 x_pos -= 3
396 look_out(300)
398 y_pos = 1
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)
410 x_pos -= 1
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)
421 deer_step(lookdeer0, y_pos, x_pos)
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)
434 y_pos -= 1
436 deer_step(lookdeer3, y_pos, x_pos)
437 return
439 def main(win):
440 global stdscr
441 stdscr = win
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
453 my_bg = curses.COLOR_BLACK
454 # curses.curs_set(0)
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)
465 dotdeer0 = curses.newwin(3, 71, 0, 8)
467 stardeer0 = curses.newwin(4, 56, 0, 8)
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)
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)
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)
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)
491 w_holiday = curses.newwin(1, 27, 3, 27)
493 w_del_msg = curses.newwin(1, 20, 23, 60)
495 try:
496 w_del_msg.addstr(0, 0, "Hit any key to quit")
497 except curses.error:
498 pass
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
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
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
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
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('/'))
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('|'))
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('\\'))
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, "\\>/>")
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, "|> |>")
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, "/> \\>")
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___= ----^")
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, "\\>/>")
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, "|> |>")
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, "/> \\>")
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___= ----^")
693 ###############################################
694 curses.cbreak()
695 stdscr.nodelay(1)
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()
731 # set up the windows for our blinking trees
733 # treescrn3
734 treescrn.overlay(treescrn3)
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(' '))
742 # star
743 treescrn3.addch(0, 12, ord('*'))
745 # strng1
746 treescrn3.addch(3, 11, ord(' '))
748 # strng2
749 treescrn3.addch(5, 13, ord(' '))
750 treescrn3.addch(6, 10, ord(' '))
752 # strng3
753 treescrn3.addch(7, 16, ord(' '))
754 treescrn3.addch(7, 14, ord(' '))
756 # strng4
757 treescrn3.addch(10, 13, ord(' '))
758 treescrn3.addch(10, 10, ord(' '))
759 treescrn3.addch(11, 8, ord(' '))
761 # strng5
762 treescrn3.addch(11, 18, ord(' '))
763 treescrn3.addch(12, 13, ord(' '))
765 # treescrn4
766 treescrn.overlay(treescrn4)
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(' '))
776 # star
777 treescrn4.standout()
778 treescrn4.addch(0, 12, ord('*'))
779 treescrn4.standend()
781 # strng1
782 treescrn4.addch(3, 13, ord(' '))
784 # strng2
786 # strng3
787 treescrn4.addch(7, 15, ord(' '))
788 treescrn4.addch(8, 11, ord(' '))
790 # strng4
791 treescrn4.addch(9, 16, ord(' '))
792 treescrn4.addch(10, 12, ord(' '))
793 treescrn4.addch(11, 8, ord(' '))
795 # strng5
796 treescrn4.addch(11, 18, ord(' '))
797 treescrn4.addch(12, 14, ord(' '))
799 # treescrn5
800 treescrn.overlay(treescrn5)
802 # balls
803 treescrn5.addch(3, 15, ord(' '))
804 treescrn5.addch(10, 20, ord(' '))
805 treescrn5.addch(12, 1, ord(' '))
807 # star
808 treescrn5.addch(0, 12, ord(' '))
810 # strng1
811 treescrn5.addch(3, 11, ord(' '))
813 # strng2
814 treescrn5.addch(5, 12, ord(' '))
816 # strng3
817 treescrn5.addch(7, 14, ord(' '))
818 treescrn5.addch(8, 10, ord(' '))
820 # strng4
821 treescrn5.addch(9, 15, ord(' '))
822 treescrn5.addch(10, 11, ord(' '))
823 treescrn5.addch(11, 7, ord(' '))
825 # strng5
826 treescrn5.addch(11, 17, ord(' '))
827 treescrn5.addch(12, 13, ord(' '))
829 # treescrn6
830 treescrn.overlay(treescrn6)
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(' '))
838 # star
839 treescrn6.standout()
840 treescrn6.addch(0, 12, ord('*'))
841 treescrn6.standend()
843 # strng1
845 # strng2
846 treescrn6.addch(5, 11, ord(' '))
848 # strng3
849 treescrn6.addch(7, 13, ord(' '))
850 treescrn6.addch(8, 9, ord(' '))
852 # strng4
853 treescrn6.addch(9, 14, ord(' '))
854 treescrn6.addch(10, 10, ord(' '))
855 treescrn6.addch(11, 6, ord(' '))
857 # strng5
858 treescrn6.addch(11, 16, ord(' '))
859 treescrn6.addch(12, 12, ord(' '))
861 # treescrn7
863 treescrn.overlay(treescrn7)
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(' '))
872 # star
873 treescrn7.addch(0, 12, ord('*'))
875 # strng1
876 treescrn7.addch(3, 12, ord(' '))
878 # strng2
879 treescrn7.addch(5, 13, ord(' '))
880 treescrn7.addch(6, 9, ord(' '))
882 # strng3
883 treescrn7.addch(7, 15, ord(' '))
884 treescrn7.addch(8, 11, ord(' '))
886 # strng4
887 treescrn7.addch(9, 16, ord(' '))
888 treescrn7.addch(10, 12, ord(' '))
889 treescrn7.addch(11, 8, ord(' '))
891 # strng5
892 treescrn7.addch(11, 18, ord(' '))
893 treescrn7.addch(12, 14, ord(' '))
895 look_out(150)
896 reindeer()
898 w_holiday.touchwin()
899 w_holiday.refresh()
900 w_del_msg.refresh()
902 look_out(500)
903 for i in range(0, 20):
904 blinkit()
906 curses.wrapper(main)