X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=io.c;h=8698ab8ec9b68ab23e379a626deb566954f796de;hp=6899ab02a2a1cdea8deaf87ae4a8b8029dab4c62;hb=9f2406f134c8e82a6ef14943c5eaf6ee2bee3af7;hpb=0dd845a602e289a5b3e5cd60a8cc2a7c4cbbbd5f diff --git a/io.c b/io.c index 6899ab0..8698ab8 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; +static int rows, linecount; /* for paging */ 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,10 +27,11 @@ static void outro(void) } } -void iostart(int usecurses) +void iostart(void) { - if ((curses = usecurses)) { - + if (!(game.options & OPTION_CURSES)) { + rows = atoi(getenv("LINES")); + } else { if (atexit(outro)){ fprintf(stderr,"Unable to register outro(), exiting...\n"); exit(1); @@ -44,27 +43,26 @@ void iostart(int usecurses) (void)saveterm(); (void)nonl(); (void)cbreak(); -#ifdef FOO +#ifdef A_COLOR { - int background = COLOR_WHITE; - start_color(); - init_pair(COLOR_BLACK, COLOR_BLACK, background); - init_pair(COLOR_GREEN, COLOR_GREEN, background); - init_pair(COLOR_RED, COLOR_RED, background); - init_pair(COLOR_CYAN, COLOR_CYAN, background); - init_pair(COLOR_WHITE, COLOR_WHITE, background); - init_pair(COLOR_MAGENTA, COLOR_MAGENTA, background); - init_pair(COLOR_BLUE, COLOR_BLUE, background); - init_pair(COLOR_YELLOW, COLOR_YELLOW, background); + 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); + 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-1, 0); + message_window = newwin(0, 0, 12, 0); + prompt_window = newwin(1, 0, LINES-2, 0); scrollok(message_window, TRUE); setwnd(fullscreen_window); textcolor(DEFAULT); @@ -75,7 +73,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(); } @@ -84,19 +82,19 @@ 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(prompt_window); wclear(prompt_window); @@ -111,7 +109,7 @@ void pause_game(int i) fgets(buf, sizeof(buf), stdin); if (i != 0) { int j; - for (j = 0; j < 24; j++) + for (j = 0; j < rows; j++) putchar('\n'); } linecount = 0; @@ -122,11 +120,18 @@ void pause_game(int i) void skip(int i) { while (i-- > 0) { - if (curses) { - proutn("\n\r"); + if (game.options & OPTION_CURSES) { + if (curwnd == message_window && linecount >= getmaxy(curwnd) - 3) { + pause_game(0); + clrscr(); + } else { + proutn("\n"); + if (curwnd == message_window) + linecount++; + } } else { linecount++; - if (linecount >= 24) + if (linecount >= rows) pause_game(0); else putchar('\n'); @@ -136,7 +141,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); } @@ -164,17 +169,14 @@ void prout(char *fmt, ...) void prouts(char *fmt, ...) /* print slowly! */ { - clock_t endTime; char *s, buf[BUFSIZ]; va_list ap; va_start(ap, fmt); vsprintf(buf, fmt, ap); va_end(ap); - skip(1); for (s = buf; *s; s++) { - endTime = clock() + CLOCKS_PER_SEC*0.05; - while (clock() < endTime) continue; - if (curses) { + delay(30); + if (game.options & OPTION_CURSES) { waddch(curwnd, *s); wrefresh(curwnd); } @@ -187,7 +189,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); @@ -200,7 +202,7 @@ 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 == message_window || wnd == prompt_window); } @@ -209,7 +211,7 @@ void setwnd(WINDOW *wnd) 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); } @@ -218,78 +220,78 @@ 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); } + linecount = 0; } void textcolor (int color) { - if (curses) { - wattroff(curwnd, A_REVERSE); -#ifdef FOO +#ifdef A_COLOR + if (game.options & OPTION_CURSES) { switch(color) { case DEFAULT: wattrset(curwnd, 0); break; case BLACK: - wattron(curwnd, COLOR_PAIR(BLACK)); + wattron(curwnd, COLOR_PAIR(COLOR_BLACK)); break; case BLUE: - wattron(curwnd, COLOR_PAIR(BLUE)); + wattron(curwnd, COLOR_PAIR(COLOR_BLUE)); break; case GREEN: - wattron(curwnd, COLOR_PAIR(GREEN)); + wattron(curwnd, COLOR_PAIR(COLOR_GREEN)); break; case CYAN: - wattron(curwnd, COLOR_PAIR(CYAN)); + wattron(curwnd, COLOR_PAIR(COLOR_CYAN)); break; case RED: - wattron(curwnd, COLOR_PAIR(RED)); + wattron(curwnd, COLOR_PAIR(COLOR_RED)); break; case MAGENTA: - wattron(curwnd, COLOR_PAIR(MAGENTA)); + wattron(curwnd, COLOR_PAIR(COLOR_MAGENTA)); break; case BROWN: - wattron(curwnd, COLOR_PAIR(YELLOW)); + wattron(curwnd, COLOR_PAIR(COLOR_YELLOW)); break; case LIGHTGRAY: - wattron(curwnd, COLOR_PAIR(WHITE)); + wattron(curwnd, COLOR_PAIR(COLOR_WHITE)); break; case DARKGRAY: - wattron(curwnd, COLOR_PAIR(BLACK) | A_BOLD); + wattron(curwnd, COLOR_PAIR(COLOR_BLACK) | A_BOLD); break; case LIGHTBLUE: - wattron(curwnd, COLOR_PAIR(BLUE) | A_BOLD); + wattron(curwnd, COLOR_PAIR(COLOR_BLUE) | A_BOLD); break; case LIGHTGREEN: - wattron(curwnd, COLOR_PAIR(GREEN) | A_BOLD); + wattron(curwnd, COLOR_PAIR(COLOR_GREEN) | A_BOLD); break; case LIGHTCYAN: - wattron(curwnd, COLOR_PAIR(CYAN) | A_BOLD); + wattron(curwnd, COLOR_PAIR(COLOR_CYAN) | A_BOLD); break; case LIGHTRED: - wattron(curwnd, COLOR_PAIR(RED) | A_BOLD); + wattron(curwnd, COLOR_PAIR(COLOR_RED) | A_BOLD); break; case LIGHTMAGENTA: - wattron(curwnd, COLOR_PAIR(MAGENTA) | A_BOLD); + wattron(curwnd, COLOR_PAIR(COLOR_MAGENTA) | A_BOLD); break; case YELLOW: - wattron(curwnd, COLOR_PAIR(YELLOW) | A_BOLD); + wattron(curwnd, COLOR_PAIR(COLOR_YELLOW) | A_BOLD); break; case WHITE: - wattron(curwnd, COLOR_PAIR(WHITE) | A_BOLD); + wattron(curwnd, COLOR_PAIR(COLOR_WHITE) | A_BOLD); break; } -#endif /* FOO */ } +#endif /* A_COLOR */ } void highvideo (void) { - if (curses) { + if (game.options & OPTION_CURSES) { wattron(curwnd, A_REVERSE); } } @@ -304,17 +306,17 @@ void commandhook(char *cmd, int before) { void drawmaps(short l) /* hook to be called after moving to redraw maps */ { - if (curses) { - if (l == 1) + if (game.options & OPTION_CURSES) { + if (l == 1) sensor(); + setwnd(srscan_window); + wmove(curwnd, 0, 0); + enqueue("no"); + srscan(SCAN_FULL); if (l != 2) { - 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); @@ -325,45 +327,50 @@ void drawmaps(short l) } } +static void put_srscan_sym(int x, int y, char sym) +{ + wmove(srscan_window, x+1, y*2+2); + waddch(srscan_window, sym); + wrefresh(srscan_window); +} + void boom(int ii, int jj) /* enemy fall down, go boom */ { - if (curses) { - setwnd(srscan_window); + if (game.options & OPTION_CURSES) { drawmaps(2); - wmove(srscan_window, ii*2+3, jj+2); + setwnd(srscan_window); wattron(srscan_window, A_REVERSE); - waddch(srscan_window, game.quad[ii][jj]); - wrefresh(srscan_window); + put_srscan_sym(ii, jj, game.quad[ii][jj]); 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(message_window); + put_srscan_sym(ii, jj, game.quad[ii][jj]); delay(500); + setwnd(message_window); } } void warble(void) /* sound and visual effects for teleportation */ { - if (curses) { - drawmaps(1); + if (game.options & OPTION_CURSES) { + drawmaps(2); setwnd(message_window); sound(50); + } + prouts(" . . . . . "); + if (game.options & OPTION_CURSES) { delay(1000); nosound(); - } else - prouts(" . . . . . "); + } } -void tracktorpedo(int x, int y, int ix, int iy, int wait, int l, int i, int n, int iquad) +void tracktorpedo(int ix, int iy, 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); @@ -375,37 +382,38 @@ void tracktorpedo(int x, int y, int ix, int iy, int wait, int l, int i, int n, i } } else if (l==4 || l==9) skip(1); - proutn("%d - %d ", (int)x, (int)y); + proutn("%d - %d ", ix, iy); } else { if (game.damage[DSRSENS]==0 || condit==IHDOCKED) { - drawmaps(2); - delay((wait!=1)*400); - if ((game.quad[ix][iy]==IHDOT)||(game.quad[ix][iy]==IHBLANK)){ - game.quad[ix][iy]='+'; + if (i != 1 && l == 1) { drawmaps(2); - game.quad[ix][iy]=iquad; + delay(400); + } + if ((iquad==IHDOT)||(iquad==IHBLANK)){ + put_srscan_sym(ix, iy, '+'); sound(l*10); delay(100); nosound(); + put_srscan_sym(ix, iy, iquad); } else { - game.quad[ix][iy] |= DAMAGED; - drawmaps(2); - game.quad[ix][iy]=iquad; + wattron(curwnd, A_REVERSE); + put_srscan_sym(ix, iy, iquad); sound(500); delay(1000); nosound(); wattroff(curwnd, A_REVERSE); + put_srscan_sym(ix, iy, iquad); } } else { - proutn("%d - %d ", (int)x, (int)y); + proutn("%d - %d ", ix, iy); } } } void makechart(void) { - if (curses) { + if (game.options & OPTION_CURSES) { setwnd(message_window); wclear(message_window); chart(0); @@ -414,7 +422,7 @@ void makechart(void) void setpassword(void) { - if (!curses) { + if (!(game.options & OPTION_CURSES)) { while (TRUE) { scan(); strcpy(game.passwd, citem);