├── .gitignore ├── LICENSE ├── Makefile ├── README.ja.md ├── README.md ├── demo.gif ├── sl.h ├── wsl.1 ├── wsl.1.ja └── wsl.c /.gitignore: -------------------------------------------------------------------------------- 1 | /wsl 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 1993,1998,2014 Toyoda Masashi (mtoyoda@acm.org) 2 | 3 | Everyone is permitted to do anything on this program including copying, 4 | modifying, and improving, unless you try to pretend that you wrote it. 5 | i.e., the above copyright notice has to appear in all copies. 6 | THE AUTHOR DISCLAIMS ANY RESPONSIBILITY WITH REGARD TO THIS SOFTWARE. 7 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | #========================================== 2 | # Makefile: makefile for wsl 1.0 3 | # Copyright 1993, 1998, 2014 4 | # Toyoda Masashi 5 | # (mtoyoda@acm.org) 6 | # Last Modified: 2021/05/18 7 | #========================================== 8 | 9 | CC=gcc 10 | CFLAGS=-O -Wall 11 | 12 | all: wsl 13 | 14 | wsl: wsl.c sl.h 15 | $(CC) $(CFLAGS) -o wsl wsl.c -lncurses 16 | 17 | clean: 18 | rm -f wsl 19 | 20 | distclean: clean 21 | -------------------------------------------------------------------------------- /README.ja.md: -------------------------------------------------------------------------------- 1 | WSL: キータイプ矯正ソフト 2 | ======================== 3 | 4 | むかしにも投稿された冗談ソフトの sl の豪華版です。 5 | アイデアは借り物ですが、プログラム自体は私のオリジナルです。 6 | いまさらながら若干アップデートしました。 7 | a,l,F,c オプションが有効です。機能は実行して確かめてください。 8 | 9 | Copyright 1993,1998,2014 Toyoda Masashi (mtoyoda@acm.org) 10 | 11 | 12 | というものを名前を変えて2編成走らせるようにしたものです. 13 | え?Windows Subsytem for Linux?知らない子ですね... (sksat) 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | WSL(1): Cure your bad habit of mistyping 2 | ======================================= 3 | 4 | WSL (Double Steam Locomotive) runs across your terminal when you type "wsl". 5 | It's just a joke command, and not useful at 6 | all. 7 | 8 | Copyright 1993,1998,2014 Toyoda Masashi (mtoyoda@acm.org) 9 | 10 | ![](demo.gif) 11 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sksat/wsl/fb91bd12e52c6096a95cbafff1a310733770a596/demo.gif -------------------------------------------------------------------------------- /sl.h: -------------------------------------------------------------------------------- 1 | /*======================================== 2 | * sl.h: SL version 5.02 3 | * Copyright 1993,2002,2014 4 | * Toyoda Masashi 5 | * (mtoyoda@acm.org) 6 | * Last Modified: 2014/06/03 7 | *======================================== 8 | */ 9 | 10 | #define D51HEIGHT 10 11 | #define D51FUNNEL 7 12 | #define D51LENGTH 83 13 | #define D51PATTERNS 6 14 | 15 | 16 | #define D51STR1 " ==== ________ ___________ " 17 | #define D51STR2 " _D _| |_______/ \\__I_I_____===__|_________| " 18 | #define D51STR3 " |(_)--- | H\\________/ | | =|___ ___| " 19 | #define D51STR4 " / | | H | | | | ||_| |_|| " 20 | #define D51STR5 " | | | H |__--------------------| [___] | " 21 | #define D51STR6 " | ________|___H__/__|_____/[][]~\\_______| | " 22 | #define D51STR7 " |/ | |-----------I_____I [][] [] D |=======|__ " 23 | 24 | #define D51WHL11 "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ " 25 | #define D51WHL12 " |/-=|___|= || || || |_____/~\\___/ " 26 | #define D51WHL13 " \\_/ \\O=====O=====O=====O_/ \\_/ " 27 | 28 | #define D51WHL21 "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ " 29 | #define D51WHL22 " |/-=|___|=O=====O=====O=====O |_____/~\\___/ " 30 | #define D51WHL23 " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ " 31 | 32 | #define D51WHL31 "__/ =| o |=-O=====O=====O=====O \\ ____Y___________|__ " 33 | #define D51WHL32 " |/-=|___|= || || || |_____/~\\___/ " 34 | #define D51WHL33 " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ " 35 | 36 | #define D51WHL41 "__/ =| o |=-~O=====O=====O=====O\\ ____Y___________|__ " 37 | #define D51WHL42 " |/-=|___|= || || || |_____/~\\___/ " 38 | #define D51WHL43 " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ " 39 | 40 | #define D51WHL51 "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ " 41 | #define D51WHL52 " |/-=|___|= O=====O=====O=====O|_____/~\\___/ " 42 | #define D51WHL53 " \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ " 43 | 44 | #define D51WHL61 "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ " 45 | #define D51WHL62 " |/-=|___|= || || || |_____/~\\___/ " 46 | #define D51WHL63 " \\_/ \\_O=====O=====O=====O/ \\_/ " 47 | 48 | #define D51DEL " " 49 | 50 | #define COAL01 " " 51 | #define COAL02 " " 52 | #define COAL03 " _________________ " 53 | #define COAL04 " _| \\_____A " 54 | #define COAL05 " =| | " 55 | #define COAL06 " -| | " 56 | #define COAL07 "__|________________________|_ " 57 | #define COAL08 "|__________________________|_ " 58 | #define COAL09 " |_D__D__D_| |_D__D__D_| " 59 | #define COAL10 " \\_/ \\_/ \\_/ \\_/ " 60 | 61 | #define COALDEL " " 62 | 63 | #define LOGOHEIGHT 6 64 | #define LOGOFUNNEL 4 65 | #define LOGOLENGTH 84 66 | #define LOGOPATTERNS 6 67 | 68 | #define LOGO1 " ++ +------ " 69 | #define LOGO2 " || |+-+ | " 70 | #define LOGO3 " /---------|| | | " 71 | #define LOGO4 " + ======== +-+ | " 72 | 73 | #define LWHL11 " _|--O========O~\\-+ " 74 | #define LWHL12 "//// \\_/ \\_/ " 75 | 76 | #define LWHL21 " _|--/O========O\\-+ " 77 | #define LWHL22 "//// \\_/ \\_/ " 78 | 79 | #define LWHL31 " _|--/~O========O-+ " 80 | #define LWHL32 "//// \\_/ \\_/ " 81 | 82 | #define LWHL41 " _|--/~\\------/~\\-+ " 83 | #define LWHL42 "//// \\_O========O " 84 | 85 | #define LWHL51 " _|--/~\\------/~\\-+ " 86 | #define LWHL52 "//// \\O========O/ " 87 | 88 | #define LWHL61 " _|--/~\\------/~\\-+ " 89 | #define LWHL62 "//// O========O_/ " 90 | 91 | #define LCOAL1 "____ " 92 | #define LCOAL2 "| \\@@@@@@@@@@@ " 93 | #define LCOAL3 "| \\@@@@@@@@@@@@@_ " 94 | #define LCOAL4 "| | " 95 | #define LCOAL5 "|__________________| " 96 | #define LCOAL6 " (O) (O) " 97 | 98 | #define LCAR1 "____________________ " 99 | #define LCAR2 "| ___ ___ ___ ___ | " 100 | #define LCAR3 "| |_| |_| |_| |_| | " 101 | #define LCAR4 "|__________________| " 102 | #define LCAR5 "|__________________| " 103 | #define LCAR6 " (O) (O) " 104 | 105 | #define DELLN " " 106 | 107 | #define C51HEIGHT 11 108 | #define C51FUNNEL 7 109 | #define C51LENGTH 87 110 | #define C51PATTERNS 6 111 | 112 | #define C51DEL " " 113 | 114 | #define C51STR1 " ___ " 115 | #define C51STR2 " _|_|_ _ __ __ ___________" 116 | #define C51STR3 " D__/ \\_(_)___| |__H__| |_____I_Ii_()|_________|" 117 | #define C51STR4 " | `---' |:: `--' H `--' | |___ ___| " 118 | #define C51STR5 " +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_|| " 119 | #define C51STR6 " || | :: H +=====+ | |:: ...| " 120 | #define C51STR7 "| | _______|_::-----------------[][]-----| | " 121 | 122 | #define C51WH61 "| /~~ || |-----/~~~~\\ /[I_____I][][] --|||_______|__" 123 | #define C51WH62 "------'|oOo|==[]=- || || | ||=======_|__" 124 | #define C51WH63 "/~\\____|___|/~\\_| O=======O=======O |__|+-/~\\_| " 125 | #define C51WH64 "\\_/ \\_/ \\____/ \\____/ \\____/ \\_/ " 126 | 127 | #define C51WH51 "| /~~ || |-----/~~~~\\ /[I_____I][][] --|||_______|__" 128 | #define C51WH52 "------'|oOo|===[]=- || || | ||=======_|__" 129 | #define C51WH53 "/~\\____|___|/~\\_| O=======O=======O |__|+-/~\\_| " 130 | #define C51WH54 "\\_/ \\_/ \\____/ \\____/ \\____/ \\_/ " 131 | 132 | #define C51WH41 "| /~~ || |-----/~~~~\\ /[I_____I][][] --|||_______|__" 133 | #define C51WH42 "------'|oOo|===[]=- O=======O=======O | ||=======_|__" 134 | #define C51WH43 "/~\\____|___|/~\\_| || || |__|+-/~\\_| " 135 | #define C51WH44 "\\_/ \\_/ \\____/ \\____/ \\____/ \\_/ " 136 | 137 | #define C51WH31 "| /~~ || |-----/~~~~\\ /[I_____I][][] --|||_______|__" 138 | #define C51WH32 "------'|oOo|==[]=- O=======O=======O | ||=======_|__" 139 | #define C51WH33 "/~\\____|___|/~\\_| || || |__|+-/~\\_| " 140 | #define C51WH34 "\\_/ \\_/ \\____/ \\____/ \\____/ \\_/ " 141 | 142 | #define C51WH21 "| /~~ || |-----/~~~~\\ /[I_____I][][] --|||_______|__" 143 | #define C51WH22 "------'|oOo|=[]=- O=======O=======O | ||=======_|__" 144 | #define C51WH23 "/~\\____|___|/~\\_| || || |__|+-/~\\_| " 145 | #define C51WH24 "\\_/ \\_/ \\____/ \\____/ \\____/ \\_/ " 146 | 147 | #define C51WH11 "| /~~ || |-----/~~~~\\ /[I_____I][][] --|||_______|__" 148 | #define C51WH12 "------'|oOo|=[]=- || || | ||=======_|__" 149 | #define C51WH13 "/~\\____|___|/~\\_| O=======O=======O |__|+-/~\\_| " 150 | #define C51WH14 "\\_/ \\_/ \\____/ \\____/ \\____/ \\_/ " 151 | -------------------------------------------------------------------------------- /wsl.1: -------------------------------------------------------------------------------- 1 | .\" 2 | .\" Copyright 1993,1998,2014 Toyoda Masashi (mtoyoda@acm.org) 3 | .\" 4 | .\" @(#)sl.1 5 | .\" 6 | .TH SL 1 "March 31, 2014" 7 | .SH NAME 8 | sl \- cure your bad habit of mistyping 9 | .SH SYNOPSIS 10 | .B sl 11 | [ 12 | .B \-alFc 13 | ] 14 | .SH DESCRIPTION 15 | .B sl 16 | is a highly advanced animation program for curing your bad habit of mistyping. 17 | .PP 18 | .TP 19 | .B \-a 20 | An accident is occurring. People cry for help. 21 | .TP 22 | .B \-l 23 | Little version. 24 | .TP 25 | .B \-F 26 | It flies like the galaxy express 999. 27 | .TP 28 | .B \-c 29 | C51 appears instead of D51. 30 | .PP 31 | .SH SEE ALSO 32 | .BR ls (1) 33 | .SH BUGS 34 | It sometimes lists directory contents. 35 | .SH AUTHOR 36 | Toyoda Masashi (mtoyoda@acm.org) 37 | -------------------------------------------------------------------------------- /wsl.1.ja: -------------------------------------------------------------------------------- 1 | .\" 2 | .\" Copyright 1993,2014 Toyoda Masashi. 3 | .\" (mtoyoda@acm.org) 4 | .\" @(#)sl.1 5 | .\" 6 | .TH SL 1 "March 31, 2014" 7 | .SH 名称 8 | sl \- キータイプを矯正します。 9 | .SH 形式 10 | .B sl 11 | [ 12 | .B \-alF 13 | ] 14 | .SH 解説 15 | .B sl 16 | は、高度に発展した、キータイプ矯正を目的とするアニメーションプログラムです。 17 | .PP 18 | 次のようなオプションがあります。 19 | .TP 20 | .B \-a 21 | なにかアクシデントがあったようですね。助けを求める人々が悲痛です。 22 | .TP 23 | .B \-l 24 | 小さくなります。 25 | .TP 26 | .B \-F 27 | 飛びます。 28 | .TP 29 | .B \-c 30 | C51になります。 31 | .PP 32 | .SH 関連事項 33 | .BR ls (1) 34 | .SH バグ 35 | カレントディレクトリの内容が表示されることがあります。 36 | .SH 著者 37 | 豊田 正史 (mtoyoda@acm.org) 38 | -------------------------------------------------------------------------------- /wsl.c: -------------------------------------------------------------------------------- 1 | /*======================================== 2 | * wsl.c: WSL version 1.0 3 | * Copyright 1993,1998,2014-2015,2021 4 | * Toyoda Masashi 5 | * (mtoyoda@acm.org) 6 | * Last Modified: 2021/05/18 7 | *======================================== 8 | */ 9 | /* wsl version 1.0 : WSL: W(double) Steam Locomotive */ 10 | /* by sksat 2021/05/18 */ 11 | /* sl version 5.03 : Fix some more compiler warnings. */ 12 | /* by Ryan Jacobs 2015/01/19 */ 13 | /* sl version 5.02 : Fix compiler warnings. */ 14 | /* by Jeff Schwab 2014/06/03 */ 15 | /* sl version 5.01 : removed cursor and handling of IO */ 16 | /* by Chris Seymour 2014/01/03 */ 17 | /* sl version 5.00 : add -c option */ 18 | /* by Toyoda Masashi 2013/05/05 */ 19 | /* sl version 4.00 : add C51, usleep(40000) */ 20 | /* by Toyoda Masashi 2002/12/31 */ 21 | /* sl version 3.03 : add usleep(20000) */ 22 | /* by Toyoda Masashi 1998/07/22 */ 23 | /* sl version 3.02 : D51 flies! Change options. */ 24 | /* by Toyoda Masashi 1993/01/19 */ 25 | /* sl version 3.01 : Wheel turns smoother */ 26 | /* by Toyoda Masashi 1992/12/25 */ 27 | /* sl version 3.00 : Add d(D51) option */ 28 | /* by Toyoda Masashi 1992/12/24 */ 29 | /* sl version 2.02 : Bug fixed.(dust remains in screen) */ 30 | /* by Toyoda Masashi 1992/12/17 */ 31 | /* sl version 2.01 : Smoke run and disappear. */ 32 | /* Change '-a' to accident option. */ 33 | /* by Toyoda Masashi 1992/12/16 */ 34 | /* sl version 2.00 : Add a(all),l(long),F(Fly!) options. */ 35 | /* by Toyoda Masashi 1992/12/15 */ 36 | /* sl version 1.02 : Add turning wheel. */ 37 | /* by Toyoda Masashi 1992/12/14 */ 38 | /* sl version 1.01 : Add more complex smoke. */ 39 | /* by Toyoda Masashi 1992/12/14 */ 40 | /* sl version 1.00 : SL runs vomiting out smoke. */ 41 | /* by Toyoda Masashi 1992/12/11 */ 42 | 43 | #include 44 | #include 45 | #include 46 | #include "sl.h" 47 | 48 | void add_smoke(int y, int x, int count); 49 | void add_man(int y, int x); 50 | int add_C51(int y0, int x, int count); 51 | int add_D51(int y0, int x, int count); 52 | int add_sl(int y0, int x, int count); 53 | int add_wsl(int x); 54 | int add_wC51(int x); 55 | int add_wD51(int x); 56 | void option(char *str); 57 | int my_mvaddstr(int y, int x, char *str); 58 | 59 | int ACCIDENT = 0; 60 | int LOGO = 0; 61 | int FLY = 0; 62 | int C51 = 0; 63 | 64 | int my_mvaddstr(int y, int x, char *str) 65 | { 66 | for ( ; x < 0; ++x, ++str) 67 | if (*str == '\0') return ERR; 68 | for ( ; *str != '\0'; ++str, ++x) 69 | if (mvaddch(y, x, *str) == ERR) return ERR; 70 | return OK; 71 | } 72 | 73 | void option(char *str) 74 | { 75 | extern int ACCIDENT, LOGO, FLY, C51; 76 | 77 | while (*str != '\0') { 78 | switch (*str++) { 79 | case 'a': ACCIDENT = 1; break; 80 | case 'F': FLY = 1; break; 81 | case 'l': LOGO = 1; break; 82 | case 'c': C51 = 1; break; 83 | default: break; 84 | } 85 | } 86 | } 87 | 88 | int main(int argc, char *argv[]) 89 | { 90 | int x, i; 91 | 92 | for (i = 1; i < argc; ++i) { 93 | if (*argv[i] == '-') { 94 | option(argv[i] + 1); 95 | } 96 | } 97 | initscr(); 98 | signal(SIGINT, SIG_IGN); 99 | noecho(); 100 | curs_set(0); 101 | nodelay(stdscr, TRUE); 102 | leaveok(stdscr, TRUE); 103 | scrollok(stdscr, FALSE); 104 | 105 | for (x = COLS - 1; ; --x) { 106 | if (LOGO == 1) { 107 | if (add_wsl(x) == ERR) break; 108 | } 109 | else if (C51 == 1) { 110 | if (add_wC51(x) == ERR) break; 111 | } 112 | else { 113 | if (add_wD51(x) == ERR) break; 114 | } 115 | getch(); 116 | refresh(); 117 | usleep(40000); 118 | } 119 | mvcur(0, COLS - 1, LINES - 1, 0); 120 | endwin(); 121 | 122 | return 0; 123 | } 124 | 125 | int add_wsl(int x) 126 | { 127 | static int count = 0; 128 | if (x % 4 == 0) count ++; 129 | 130 | int y0 = LINES / 3; 131 | return add_sl(y0, x, count) | add_sl(y0+y0, x, count); 132 | } 133 | 134 | int add_wC51(int x) 135 | { 136 | static int count = 0; 137 | if (x % 4 == 0) count ++; 138 | 139 | int y0 = LINES / 3; 140 | return add_C51(y0, x, count) | add_C51(y0+y0, x, count); 141 | } 142 | 143 | int add_wD51(int x) 144 | { 145 | static int count = 0; 146 | if (x % 4 == 0) count ++; 147 | 148 | int y0 = LINES / 3; 149 | return add_D51(y0, x, count) | add_D51(y0+y0, x, count); 150 | } 151 | 152 | int add_sl(int y0, int x, int count) 153 | { 154 | static char *sl[LOGOPATTERNS][LOGOHEIGHT + 1] 155 | = {{LOGO1, LOGO2, LOGO3, LOGO4, LWHL11, LWHL12, DELLN}, 156 | {LOGO1, LOGO2, LOGO3, LOGO4, LWHL21, LWHL22, DELLN}, 157 | {LOGO1, LOGO2, LOGO3, LOGO4, LWHL31, LWHL32, DELLN}, 158 | {LOGO1, LOGO2, LOGO3, LOGO4, LWHL41, LWHL42, DELLN}, 159 | {LOGO1, LOGO2, LOGO3, LOGO4, LWHL51, LWHL52, DELLN}, 160 | {LOGO1, LOGO2, LOGO3, LOGO4, LWHL61, LWHL62, DELLN}}; 161 | 162 | static char *coal[LOGOHEIGHT + 1] 163 | = {LCOAL1, LCOAL2, LCOAL3, LCOAL4, LCOAL5, LCOAL6, DELLN}; 164 | 165 | static char *car[LOGOHEIGHT + 1] 166 | = {LCAR1, LCAR2, LCAR3, LCAR4, LCAR5, LCAR6, DELLN}; 167 | 168 | int i, y, py1 = 0, py2 = 0, py3 = 0; 169 | 170 | if (x < - LOGOLENGTH) return ERR; 171 | y = y0; 172 | 173 | if (FLY == 1) { 174 | y = (x / 6) + LINES - (COLS / 6) - LOGOHEIGHT; 175 | py1 = 2; py2 = 4; py3 = 6; 176 | } 177 | for (i = 0; i <= LOGOHEIGHT; ++i) { 178 | my_mvaddstr(y + i, x, sl[(LOGOLENGTH + x) / 3 % LOGOPATTERNS][i]); 179 | my_mvaddstr(y + i + py1, x + 21, coal[i]); 180 | my_mvaddstr(y + i + py2, x + 42, car[i]); 181 | my_mvaddstr(y + i + py3, x + 63, car[i]); 182 | } 183 | if (ACCIDENT == 1) { 184 | add_man(y + 1, x + 14); 185 | add_man(y + 1 + py2, x + 45); add_man(y + 1 + py2, x + 53); 186 | add_man(y + 1 + py3, x + 66); add_man(y + 1 + py3, x + 74); 187 | } 188 | add_smoke(y - 1, x + LOGOFUNNEL, count); 189 | return OK; 190 | } 191 | 192 | 193 | int add_D51(int y0, int x, int count) 194 | { 195 | static char *d51[D51PATTERNS][D51HEIGHT + 1] 196 | = {{D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7, 197 | D51WHL11, D51WHL12, D51WHL13, D51DEL}, 198 | {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7, 199 | D51WHL21, D51WHL22, D51WHL23, D51DEL}, 200 | {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7, 201 | D51WHL31, D51WHL32, D51WHL33, D51DEL}, 202 | {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7, 203 | D51WHL41, D51WHL42, D51WHL43, D51DEL}, 204 | {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7, 205 | D51WHL51, D51WHL52, D51WHL53, D51DEL}, 206 | {D51STR1, D51STR2, D51STR3, D51STR4, D51STR5, D51STR6, D51STR7, 207 | D51WHL61, D51WHL62, D51WHL63, D51DEL}}; 208 | static char *coal[D51HEIGHT + 1] 209 | = {COAL01, COAL02, COAL03, COAL04, COAL05, 210 | COAL06, COAL07, COAL08, COAL09, COAL10, COALDEL}; 211 | 212 | int y, i, dy = 0; 213 | 214 | if (x < - D51LENGTH) return ERR; 215 | y = y0; 216 | 217 | if (FLY == 1) { 218 | y = (x / 7) + LINES - (COLS / 7) - D51HEIGHT; 219 | dy = 1; 220 | } 221 | for (i = 0; i <= D51HEIGHT; ++i) { 222 | my_mvaddstr(y + i, x, d51[(D51LENGTH + x) % D51PATTERNS][i]); 223 | my_mvaddstr(y + i + dy, x + 53, coal[i]); 224 | } 225 | if (ACCIDENT == 1) { 226 | add_man(y + 2, x + 43); 227 | add_man(y + 2, x + 47); 228 | } 229 | add_smoke(y - 1, x + D51FUNNEL, count); 230 | return OK; 231 | } 232 | 233 | int add_C51(int y0, int x, int count) 234 | { 235 | static char *c51[C51PATTERNS][C51HEIGHT + 1] 236 | = {{C51STR1, C51STR2, C51STR3, C51STR4, C51STR5, C51STR6, C51STR7, 237 | C51WH11, C51WH12, C51WH13, C51WH14, C51DEL}, 238 | {C51STR1, C51STR2, C51STR3, C51STR4, C51STR5, C51STR6, C51STR7, 239 | C51WH21, C51WH22, C51WH23, C51WH24, C51DEL}, 240 | {C51STR1, C51STR2, C51STR3, C51STR4, C51STR5, C51STR6, C51STR7, 241 | C51WH31, C51WH32, C51WH33, C51WH34, C51DEL}, 242 | {C51STR1, C51STR2, C51STR3, C51STR4, C51STR5, C51STR6, C51STR7, 243 | C51WH41, C51WH42, C51WH43, C51WH44, C51DEL}, 244 | {C51STR1, C51STR2, C51STR3, C51STR4, C51STR5, C51STR6, C51STR7, 245 | C51WH51, C51WH52, C51WH53, C51WH54, C51DEL}, 246 | {C51STR1, C51STR2, C51STR3, C51STR4, C51STR5, C51STR6, C51STR7, 247 | C51WH61, C51WH62, C51WH63, C51WH64, C51DEL}}; 248 | static char *coal[C51HEIGHT + 1] 249 | = {COALDEL, COAL01, COAL02, COAL03, COAL04, COAL05, 250 | COAL06, COAL07, COAL08, COAL09, COAL10, COALDEL}; 251 | 252 | int y, i, dy = 0; 253 | 254 | if (x < - C51LENGTH) return ERR; 255 | y = y0; 256 | 257 | if (FLY == 1) { 258 | y = (x / 7) + LINES - (COLS / 7) - C51HEIGHT; 259 | dy = 1; 260 | } 261 | for (i = 0; i <= C51HEIGHT; ++i) { 262 | my_mvaddstr(y + i, x, c51[(C51LENGTH + x) % C51PATTERNS][i]); 263 | my_mvaddstr(y + i + dy, x + 55, coal[i]); 264 | } 265 | if (ACCIDENT == 1) { 266 | add_man(y + 3, x + 45); 267 | add_man(y + 3, x + 49); 268 | } 269 | //add_smoke(y - 1, x + C51FUNNEL, 0); 270 | add_smoke(y - 1, x + LOGOFUNNEL, count); 271 | return OK; 272 | } 273 | 274 | 275 | void add_man(int y, int x) 276 | { 277 | static char *man[2][2] = {{"", "(O)"}, {"Help!", "\\O/"}}; 278 | int i; 279 | 280 | for (i = 0; i < 2; ++i) { 281 | my_mvaddstr(y + i, x, man[(LOGOLENGTH + x) / 12 % 2][i]); 282 | } 283 | } 284 | 285 | 286 | void add_smoke(int y, int x, int sum) 287 | #define SMOKEPTNS 16 288 | { 289 | static int call = 0; 290 | static struct smokes { 291 | int y, x; 292 | int ptrn, kind; 293 | } S[2][1000]; 294 | static char *Smoke[2][SMOKEPTNS] 295 | = {{"( )", "( )", "( )", "( )", "( )", 296 | "( )" , "( )" , "( )" , "()" , "()" , 297 | "O" , "O" , "O" , "O" , "O" , 298 | " " }, 299 | {"(@@@)", "(@@@@)", "(@@@@)", "(@@@)", "(@@)", 300 | "(@@)" , "(@)" , "(@)" , "@@" , "@@" , 301 | "@" , "@" , "@" , "@" , "@" , 302 | " " }}; 303 | static char *Eraser[SMOKEPTNS] 304 | = {" ", " ", " ", " ", " ", 305 | " " , " " , " " , " " , " " , 306 | " " , " " , " " , " " , " " , 307 | " " }; 308 | static int dy[SMOKEPTNS] = { 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 309 | 0, 0, 0, 0, 0, 0 }; 310 | static int dx[SMOKEPTNS] = {-2, -1, 0, 1, 1, 1, 1, 1, 2, 2, 311 | 2, 2, 2, 3, 3, 3 }; 312 | int i; 313 | 314 | if (x % 4 == 0) { 315 | int n = call % 2; 316 | for (i = 0; i < sum; ++i) { 317 | my_mvaddstr(S[n][i].y, S[n][i].x, Eraser[S[n][i].ptrn]); 318 | S[n][i].y -= dy[S[n][i].ptrn]; 319 | S[n][i].x += dx[S[n][i].ptrn]; 320 | S[n][i].ptrn += (S[n][i].ptrn < SMOKEPTNS - 1) ? 1 : 0; 321 | my_mvaddstr(S[n][i].y, S[n][i].x, Smoke[S[n][i].kind][S[n][i].ptrn]); 322 | } 323 | my_mvaddstr(y, x, Smoke[sum % 2][0]); 324 | S[n][sum].y = y; S[n][sum].x = x; 325 | S[n][sum].ptrn = 0; S[n][sum].kind = sum % 2; 326 | } 327 | call ++; 328 | } 329 | --------------------------------------------------------------------------------