module Main where import Data.List import Foreign import Foreign.C import System.Posix.Signals {- Constants -} cD51HEIGHT = 10 cD51FUNNEL = 7 cD51LENGTH = 83 cD51PATTERNS = 6 cD51STR1 = " ==== ________ ___________ " cD51STR2 = " _D _| |_______/ \\__I_I_____===__|_________| " cD51STR3 = " |(_)--- | H\\________/ | | =|___ ___| " cD51STR4 = " / | | H | | | | ||_| |_|| " cD51STR5 = " | | | H |__--------------------| [___] | " cD51STR6 = " | ________|___H__/__|_____/[][]~\\_______| | " cD51STR7 = " |/ | |-----------I_____I [][] [] D |=======|__ " cD51WHL11 = "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ " cD51WHL12 = " |/-=|___|= || || || |_____/~\\___/ " cD51WHL13 = " \\_/ \\O=====O=====O=====O_/ \\_/ " cD51WHL21 = "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ " cD51WHL22 = " |/-=|___|=O=====O=====O=====O |_____/~\\___/ " cD51WHL23 = " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ " cD51WHL31 = "__/ =| o |=-O=====O=====O=====O \\ ____Y___________|__ " cD51WHL32 = " |/-=|___|= || || || |_____/~\\___/ " cD51WHL33 = " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ " cD51WHL41 = "__/ =| o |=-~O=====O=====O=====O\\ ____Y___________|__ " cD51WHL42 = " |/-=|___|= || || || |_____/~\\___/ " cD51WHL43 = " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ " cD51WHL51 = "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ " cD51WHL52 = " |/-=|___|= O=====O=====O=====O|_____/~\\___/ " cD51WHL53 = " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ " cD51WHL61 = "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ " cD51WHL62 = " |/-=|___|= || || || |_____/~\\___/ " cD51WHL63 = " \\_/ \\_O=====O=====O=====O/ \\_/ " cD51DEL = " " cCOAL01 = " " cCOAL02 = " " cCOAL03 = " _________________ " cCOAL04 = " _| \\_____A " cCOAL05 = " =| | " cCOAL06 = " -| | " cCOAL07 = "__|________________________|_ " cCOAL08 = "|__________________________|_ " cCOAL09 = " |_D__D__D_| |_D__D__D_| " cCOAL10 = " \\_/ \\_/ \\_/ \\_/ " cCOALDEL = " " cD51MAP = [[cD51STR1, cD51STR2, cD51STR3, cD51STR4, cD51STR5, cD51STR6, cD51STR7, cD51WHL11, cD51WHL12, cD51WHL13, cD51DEL], [cD51STR1, cD51STR2, cD51STR3, cD51STR4, cD51STR5, cD51STR6, cD51STR7, cD51WHL21, cD51WHL22, cD51WHL23, cD51DEL], [cD51STR1, cD51STR2, cD51STR3, cD51STR4, cD51STR5, cD51STR6, cD51STR7, cD51WHL31, cD51WHL32, cD51WHL33, cD51DEL], [cD51STR1, cD51STR2, cD51STR3, cD51STR4, cD51STR5, cD51STR6, cD51STR7, cD51WHL41, cD51WHL42, cD51WHL43, cD51DEL], [cD51STR1, cD51STR2, cD51STR3, cD51STR4, cD51STR5, cD51STR6, cD51STR7, cD51WHL51, cD51WHL52, cD51WHL53, cD51DEL], [cD51STR1, cD51STR2, cD51STR3, cD51STR4, cD51STR5, cD51STR6, cD51STR7, cD51WHL61, cD51WHL62, cD51WHL63, cD51DEL]] cCOALMAP = [cCOAL01, cCOAL02, cCOAL03, cCOAL04, cCOAL05, cCOAL06, cCOAL07, cCOAL08, cCOAL09, cCOAL10, cCOALDEL] {- Curses -} foreign import ccall "curses.h &COLS" curses_COLS :: Ptr (CInt) foreign import ccall "curses.h &LINES" curses_LINES :: Ptr (CInt) foreign import ccall "initscr" curses_initscr :: IO () foreign import ccall "endwin" curses_endwin :: IO () foreign import ccall "refresh" curses_refresh :: IO () foreign import ccall "mvaddch" curses_mvaddch :: CInt -> CInt -> Char -> IO () cCOLS = peek curses_COLS cLINES = peek curses_LINES {- System -} foreign import ccall "usleep" system_usleep :: Int -> IO () {- Implementation -} my_mvaddstr :: CInt -> CInt -> [Char] -> IO () my_mvaddstr y x [] = return () my_mvaddstr y x (head:xs) = if x < 0 then my_mvaddstr y (x + 1) xs else do curses_mvaddch y x head my_mvaddstr y (x + 1) xs lookupD51MAP :: CInt -> CInt -> [Char] lookupD51MAP i j = (genericIndex (genericIndex cD51MAP i) j) lookupCOALMAP :: CInt -> [Char] lookupCOALMAP i = (genericIndex cCOALMAP i) showD51 :: CInt -> CInt -> CInt -> IO () showD51 y x i = if i < 0 then return () else let d51map_index = (mod (cD51LENGTH + x) cD51PATTERNS) in do my_mvaddstr (y + i) x (lookupD51MAP d51map_index i) my_mvaddstr (y + i) (x + 53) (lookupCOALMAP i) showD51 y x (i - 1) addD51 :: CInt -> IO () addD51 x = if x < (-cD51LENGTH) then return () else do lines <- cLINES showD51 ((div lines 2) - 5) x cD51HEIGHT system_usleep 20000 curses_refresh addD51 (x - 1) main :: IO () main = do curses_initscr installHandler sigINT (Catch (return ())) Nothing cols <- cCOLS addD51 cols curses_endwin