5119
  #   ˆl–Ým_JJh¥ ² ¸È®2ò˜´o¿„m4çÂÁ ?÷     # asciixmas
# December 1989             Larry Bartz           Indianapolis, IN
#
# $Id$
#
# I'm dreaming of an ascii character-based monochrome Christmas,
# Just like the ones I used to know!
# Via a full duplex communications channel,
# At 9600 bits per second,
# Even though it's kinda slow.
#
# I'm dreaming of an ascii character-based monochrome Christmas,
# With ev'ry C program I write!
# May your screen be merry and bright!
# And may all your Christmases be amber or green,
# (for reduced eyestrain and improved visibility)!
#
#
# Notes on the Python version:
# I used a couple of `try...except curses.error' to get around some functions
# returning ERR. The errors come from using wrapping functions to fill
# windows to the last character cell. The C version doesn't have this problem,
# it simply ignores any return values.
#

import curses
import sys

FROMWHO = "Thomas Gellekum <tg@FreeBSD.org>"

def set_color(win, color):
    if curses.has_colors():
        n = color + 1
        curses.init_pair(n, color, my_bg)
        win.attroff(curses.A_COLOR)
        win.attron(curses.color_pair(n))

def unset_color(win):
    if curses.has_colors():
        win.attrset(curses.color_pair(0))

def look_out(msecs):
    curses.napms(msecs)
    if stdscr.getch() != -1:
        curses.beep()
        sys.exit(0)

def boxit():
    for y in range(0, 20):
        stdscr.addch(y, 7, ord('|'))

    for x in range(8, 80):
        stdscr.addch(19, x, ord('_'))

    for x in range(0, 80):
        stdscr.addch(22, x, ord('_'))

    return

def seas():
    stdscr.addch(4, 1, ord('S'))
    stdscr.addch(6, 1, ord('E'))
    stdscr.addch(8, 1, ord('A'))
    stdscr.addch(10, 1, ord('S'))
    stdscr.addch(12, 1, ord('O'))
    stdscr.addch(14, 1, ord('N'))
    stdscr.addch(16, 1, ord("'"))
    stdscr.addch(18, 1, ord('S'))

    return

def greet():
    stdscr.addch(3, 5, ord('G'))
    stdscr.addch(5, 5, ord('R'))
    stdscr.addch(7, 5, ord('E'))
    stdscr.addch(9, 5, ord('E'))
    stdscr.addch(11, 5, ord('T'))
    stdscr.addch(13, 5, ord('I'))
    stdscr.addch(15, 5, ord('N'))
    stdscr.addch(17, 5, ord('G'))
    stdscr.addch(19, 5, ord('S'))

    return

def fromwho():
    stdscr.addstr(21, 13, FROMWHO)
    return

def tree():
    set_color(treescrn, curses.COLOR_GREEN)
    treescrn.addch(1, 11, ord('/'))
    treescrn.addch(2, 11, ord('/'))
    treescrn.addch(3, 10, ord('/'))
    treescrn.addch(4, 9, ord('/'))
    treescrn.addch(5, 9, ord('/'))
    treescrn.addch(6, 8, ord('/'))
    treescrn.addch(7, 7, ord('/'))
    treescrn.addch(8, 6, ord('/'))
    treescrn.addch(9, 6, ord('/'))
    treescrn.addch(10, 5, ord('/'))
    treescrn.addch(11, 3, ord('/'))
    treescrn.addch(12, 2, ord('/'))

    treescrn.addch(1, 13, ord('\\'))
    treescrn.addch(2, 13, ord('\\'))
    treescrn.addch(3, 14, ord('\\'))
    treescrn.addch(4, 15, ord('\\'))
    treescrn.addch(5, 15, ord('\\'))
    treescrn.addch(6, 16, ord('\\'))
    treescrn.addch(7, 17, ord('\\'))
    treescrn.addch(8, 18, ord('\\'))
    treescrn.addch(9, 18, ord('\\'))
    treescrn.addch(10, 19, ord('\\'))
    treescrn.addch(11, 21, ord('\\'))
    treescrn.addch(12, 22, ord('\\'))

    treescrn.addch(4, 10, ord('_'))
    treescrn.addch(4, 14, ord('_'))
    treescrn.addch(8, 7, ord('_'))
    treescrn.addch(8, 17, ord('_'))

    treescrn.addstr(13, 0, "//////////// \\\\\\\\\\\\\\\\\\\\\\\\")

    treescrn.addstr(14, 11, "| |")
    treescrn.addstr(15, 11, "|_|")

    unset_color(treescrn)
    treescrn.refresh()
    w_del_msg.refresh()

    return

def balls():
    treescrn.overlay(treescrn2)

    set_color(treescrn2, curses.COLOR_BLUE)
    treescrn2.addch(3, 9, ord('@'))
    treescrn2.addch(3, 15, ord('@'))
    treescrn2.addch(4, 8, ord('@'))
    treescrn2.addch(4, 16, ord('@'))
    treescrn2.addch(5, 7, ord('@'))
    treescrn2.addch(5, 17, ord('@'))
    treescrn2.addch(7, 6, ord('@'))
    treescrn2.addch(7, 18, ord('@'))
    treescrn2.addch(8, 5, ord('@'))
    treescrn2.addch(8, 19, ord('@'))
    treescrn2.addch(10, 4, ord('@'))
    treescrn2.addch(10