X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=io.c;h=b3d2438d0b3ed289edd7a92c39790b696c5100da;hp=54b109bde0a7e3224eaeedcd1ac8e9cb2ee89547;hb=e536fe754b3a9be00dcaee8f6ec50ea2d8c7a184;hpb=89e52d61fcf689e15a8f831dea084a33ceaa8217 diff --git a/io.c b/io.c index 54b109b..b3d2438 100644 --- a/io.c +++ b/io.c @@ -5,20 +5,18 @@ #include #include #include -#include #include "sst.h" #include "sstlinux.h" static int linecount; /* for paging */ -static int curses = TRUE; WINDOW *curwnd; static void outro(void) /* wrap up, either normally or due to signal */ { - if (curses) { + if (game.options & OPTION_CURSES) { clear(); curs_set(1); (void)refresh(); @@ -29,9 +27,10 @@ static void outro(void) } } -void iostart(int usecurses) +void iostart(void) { - if ((curses = usecurses)) { + if (game.options & OPTION_CURSES) { + if (atexit(outro)){ fprintf(stderr,"Unable to register outro(), exiting...\n"); exit(1); @@ -43,14 +42,29 @@ void iostart(int usecurses) (void)saveterm(); (void)nonl(); (void)cbreak(); +#ifdef A_COLOR + { + start_color(); + init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); + init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK); + init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK); + init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK); + init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK); + init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); + init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); + init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); + } +#endif /* A_COLOR */ //(void)noecho(); - FULLSCREEN_WINDOW = stdscr; - SRSCAN_WINDOW = newwin(12, 25, 0, 0); - REPORT_WINDOW = newwin(10, 0, 1, 25); - LRSCAN_WINDOW = newwin(10, 0, 0, 64); - LOWER_WINDOW = newwin(0, 0, 12, 0); - BOTTOM_WINDOW = newwin(1, 0, LINES-1, 0); - scrollok(LOWER_WINDOW, TRUE); + fullscreen_window = stdscr; + srscan_window = newwin(12, 25, 0, 0); + report_window = newwin(10, 0, 1, 25); + lrscan_window = newwin(10, 0, 0, 64); + message_window = newwin(0, 0, 12, 0); + prompt_window = newwin(1, 0, LINES-2, 0); + scrollok(message_window, TRUE); + setwnd(fullscreen_window); + textcolor(DEFAULT); } } @@ -58,7 +72,7 @@ void iostart(int usecurses) void waitfor(void) /* wait for user action -- OK to do nothing if on a TTY */ { - if (curses) + if (game.options & OPTION_CURSES) getch(); } @@ -67,27 +81,27 @@ void pause_game(int i) char *prompt; char buf[BUFSIZ]; if (i==1) { - if (skill > 2) + if (skill > SKILL_FAIR) prompt = "[ANOUNCEMENT ARRIVING...]"; else prompt = "[IMPORTANT ANNOUNCEMENT ARRIVING -- PRESS ENTER TO CONTINUE]"; } else { - if (skill > 2) + if (skill > SKILL_FAIR) prompt = "[CONTINUE?]"; else prompt = "[PRESS ENTER TO CONTINUE]"; } - if (curses) { + if (game.options & OPTION_CURSES) { drawmaps(0); - setwnd(BOTTOM_WINDOW); - wclear(BOTTOM_WINDOW); - waddstr(BOTTOM_WINDOW, prompt); - wgetnstr(BOTTOM_WINDOW, buf, sizeof(buf)); - wclear(BOTTOM_WINDOW); - wrefresh(BOTTOM_WINDOW); - setwnd(LOWER_WINDOW); + setwnd(prompt_window); + wclear(prompt_window); + waddstr(prompt_window, prompt); + wgetnstr(prompt_window, buf, sizeof(buf)); + wclear(prompt_window); + wrefresh(prompt_window); + setwnd(message_window); } else { putchar('\n'); proutn(prompt); @@ -105,7 +119,7 @@ void pause_game(int i) void skip(int i) { while (i-- > 0) { - if (curses) { + if (game.options & OPTION_CURSES) { proutn("\n\r"); } else { linecount++; @@ -119,7 +133,7 @@ void skip(int i) static void vproutn(char *fmt, va_list ap) { - if (curses) { + if (game.options & OPTION_CURSES) { vwprintw(curwnd, fmt, ap); wrefresh(curwnd); } @@ -147,7 +161,6 @@ void prout(char *fmt, ...) void prouts(char *fmt, ...) /* print slowly! */ { - clock_t endTime; char *s, buf[BUFSIZ]; va_list ap; va_start(ap, fmt); @@ -155,9 +168,8 @@ void prouts(char *fmt, ...) va_end(ap); skip(1); for (s = buf; *s; s++) { - endTime = clock() + CLOCKS_PER_SEC*0.05; - while (clock() < endTime) continue; - if (curses) { + delay(500); + if (game.options & OPTION_CURSES) { waddch(curwnd, *s); wrefresh(curwnd); } @@ -170,7 +182,7 @@ void prouts(char *fmt, ...) void cgetline(char *line, int max) { - if (curses) { + if (game.options & OPTION_CURSES) { wgetnstr(curwnd, line, max); strcat(line, "\n"); wrefresh(curwnd); @@ -183,16 +195,16 @@ void cgetline(char *line, int max) void setwnd(WINDOW *wnd) /* change windows -- OK for this to be a no-op in tty mode */ { - if (curses) { + if (game.options & OPTION_CURSES) { curwnd=wnd; - curs_set(wnd == FULLSCREEN_WINDOW || wnd == LOWER_WINDOW); + curs_set(wnd == fullscreen_window || wnd == message_window || wnd == prompt_window); } } void clreol (void) /* clear to end of line -- can be a no-op in tty mode */ { - if (curses) { + if (game.options & OPTION_CURSES) { wclrtoeol(curwnd); wrefresh(curwnd); } @@ -201,7 +213,7 @@ void clreol (void) void clrscr (void) /* clear screen -- can be a no-op in tty mode */ { - if (curses) { + if (game.options & OPTION_CURSES) { wclear(curwnd); wmove(curwnd,0,0); wrefresh(curwnd); @@ -210,16 +222,69 @@ void clrscr (void) void textcolor (int color) { - if (curses) { - wattroff(curwnd, A_REVERSE); - // FIXME - } +#ifdef A_COLOR + if (game.options & OPTION_CURSES) { + switch(color) { + case DEFAULT: + wattrset(curwnd, 0); + break; + case BLACK: + wattron(curwnd, COLOR_PAIR(COLOR_BLACK)); + break; + case BLUE: + wattron(curwnd, COLOR_PAIR(COLOR_BLUE)); + break; + case GREEN: + wattron(curwnd, COLOR_PAIR(COLOR_GREEN)); + break; + case CYAN: + wattron(curwnd, COLOR_PAIR(COLOR_CYAN)); + break; + case RED: + wattron(curwnd, COLOR_PAIR(COLOR_RED)); + break; + case MAGENTA: + wattron(curwnd, COLOR_PAIR(COLOR_MAGENTA)); + break; + case BROWN: + wattron(curwnd, COLOR_PAIR(COLOR_YELLOW)); + break; + case LIGHTGRAY: + wattron(curwnd, COLOR_PAIR(COLOR_WHITE)); + break; + case DARKGRAY: + wattron(curwnd, COLOR_PAIR(COLOR_BLACK) | A_BOLD); + break; + case LIGHTBLUE: + wattron(curwnd, COLOR_PAIR(COLOR_BLUE) | A_BOLD); + break; + case LIGHTGREEN: + wattron(curwnd, COLOR_PAIR(COLOR_GREEN) | A_BOLD); + break; + case LIGHTCYAN: + wattron(curwnd, COLOR_PAIR(COLOR_CYAN) | A_BOLD); + break; + case LIGHTRED: + wattron(curwnd, COLOR_PAIR(COLOR_RED) | A_BOLD); + break; + case LIGHTMAGENTA: + wattron(curwnd, COLOR_PAIR(COLOR_MAGENTA) | A_BOLD); + break; + case YELLOW: + wattron(curwnd, COLOR_PAIR(COLOR_YELLOW) | A_BOLD); + break; + case WHITE: + wattron(curwnd, COLOR_PAIR(COLOR_WHITE) | A_BOLD); + break; + } + } +#endif /* A_COLOR */ } void highvideo (void) { - if (curses) { - attron(A_REVERSE); + if (game.options & OPTION_CURSES) { + wattron(curwnd, A_REVERSE); } } @@ -233,21 +298,21 @@ void commandhook(char *cmd, int before) { void drawmaps(short l) /* hook to be called after moving to redraw maps */ { - if (curses) { - if (l == 1) - sensor(); + if (game.options & OPTION_CURSES) { + if (l == 1) + sensor(FALSE); if (l != 2) { - setwnd(SRSCAN_WINDOW); + setwnd(srscan_window); wmove(curwnd, 0, 0); enqueue("no"); srscan(SCAN_FULL); - setwnd(REPORT_WINDOW); - wclear(REPORT_WINDOW); - wmove(REPORT_WINDOW, 0, 0); + setwnd(report_window); + wclear(report_window); + wmove(report_window, 0, 0); srscan(SCAN_NO_LEFTSIDE); - setwnd(LRSCAN_WINDOW); - wclear(LRSCAN_WINDOW); - wmove(LRSCAN_WINDOW, 0, 0); + setwnd(lrscan_window); + wclear(lrscan_window); + wmove(lrscan_window, 0, 0); enqueue("l"); lrscan(); } @@ -257,21 +322,21 @@ void drawmaps(short l) void boom(int ii, int jj) /* enemy fall down, go boom */ { - if (curses) { - setwnd(SRSCAN_WINDOW); + if (game.options & OPTION_CURSES) { + setwnd(srscan_window); drawmaps(2); - wmove(SRSCAN_WINDOW, ii*2+3, jj+2); - wattron(SRSCAN_WINDOW, A_REVERSE); - waddch(SRSCAN_WINDOW, game.quad[ii][jj]); - wrefresh(SRSCAN_WINDOW); + wmove(srscan_window, ii*2+3, jj+2); + wattron(srscan_window, A_REVERSE); + waddch(srscan_window, game.quad[ii][jj]); + wrefresh(srscan_window); sound(500); delay(1000); nosound(); - wmove(SRSCAN_WINDOW, ii*2+3, jj+2); - wattroff(SRSCAN_WINDOW, A_REVERSE); - waddch(SRSCAN_WINDOW, game.quad[ii][jj]); - wrefresh(SRSCAN_WINDOW); - setwnd(LOWER_WINDOW); + wmove(srscan_window, ii*2+3, jj+2); + wattroff(srscan_window, A_REVERSE); + waddch(srscan_window, game.quad[ii][jj]); + wrefresh(srscan_window); + setwnd(message_window); delay(500); } } @@ -279,9 +344,9 @@ void boom(int ii, int jj) void warble(void) /* sound and visual effects for teleportation */ { - if (curses) { + if (game.options & OPTION_CURSES) { drawmaps(1); - setwnd(LOWER_WINDOW); + setwnd(message_window); sound(50); delay(1000); nosound(); @@ -292,7 +357,7 @@ void warble(void) void tracktorpedo(int x, int y, int ix, int iy, int wait, int l, int i, int n, int iquad) /* torpedo-track animation */ { - if (!curses) { + if (!game.options & OPTION_CURSES) { if (l == 1) { if (n != 1) { skip(1); @@ -334,16 +399,16 @@ void tracktorpedo(int x, int y, int ix, int iy, int wait, int l, int i, int n, i void makechart(void) { - if (curses) { - setwnd(LOWER_WINDOW); - wclear(LOWER_WINDOW); + if (game.options & OPTION_CURSES) { + setwnd(message_window); + wclear(message_window); chart(0); } } void setpassword(void) { - if (!curses) { + if (!(game.options & OPTION_CURSES)) { while (TRUE) { scan(); strcpy(game.passwd, citem);