X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=io.c;h=54b109bde0a7e3224eaeedcd1ac8e9cb2ee89547;hp=d87d097990a70e5fc4b2cd2926d5c879977aa658;hb=89e52d61fcf689e15a8f831dea084a33ceaa8217;hpb=4db9f58f3d225517845712696e3c58a16e4fb19c diff --git a/io.c b/io.c index d87d097..54b109b 100644 --- a/io.c +++ b/io.c @@ -1,4 +1,3 @@ -#define _GNU_SOURCE #include #include #include @@ -8,323 +7,222 @@ #include #include -#include "conio.h" #include "sst.h" #include "sstlinux.h" -#ifndef SERGEEV static int linecount; /* for paging */ -static int screenheight = 24, screenwidth = 80; -#endif /* SERGEEV */ -#ifndef SERGEEV -static int curses = FALSE; -#else /* SERGEEV */ static int curses = TRUE; -#endif /* SERGEEV */ -#ifdef SERGEEV -typedef struct { - int wndleft,wndtop,wndright,wndbottom; -} wnd; -static wnd wnds[6]={{1,1,80,25}, /* FULLSCREEN_WINDOW */ - {1,1,25,12}, /* LEFTUPPER_WINDOW */ - {26,2,80,12}, /* SRSCAN_WINDOW */ - {65,1,80,10}, /* LRSCAN_WINDOW */ - {1,13,80,23}, /* LOWER_WINDOW */ - {1,24,80,25}, /* BOTTOM_WINDOW */ -}; -short curwnd; -#endif /* SERGEEV */ +WINDOW *curwnd; -#ifndef SERGEEV -static void outro(int sig) { +static void outro(void) /* wrap up, either normally or due to signal */ +{ if (curses) { clear(); + curs_set(1); (void)refresh(); (void)resetterm(); //(void)echo(); (void)endwin(); + putchar('\n'); } } -static void fastexit(int sig) { - outro(sig); - putchar('\n'); - exit(0); -} -#endif /* SERGEEV */ - -void iostart(int usecurses) { -#ifdef SERGEEV - initconio(); - textattr(7); - clrscr(); - setwnd(FULLSCREEN_WINDOW); -#else - (void) signal(SIGINT, fastexit); - (void) signal(SIGINT, fastexit); -#ifdef SIGIOT - (void) signal(SIGIOT,fastexit); /* for assert(3) */ -#endif /* SIGIOT */ - if(signal(SIGQUIT,SIG_IGN) != SIG_IGN) - (void)signal(SIGQUIT,fastexit); - - if ((curses = usecurses)) { - (void)initscr(); +void iostart(int usecurses) +{ + if ((curses = usecurses)) { + if (atexit(outro)){ + fprintf(stderr,"Unable to register outro(), exiting...\n"); + exit(1); + } + (void)initscr(); #ifdef KEY_MIN - keypad(stdscr, TRUE); + keypad(stdscr, TRUE); #endif /* KEY_MIN */ - (void)saveterm(); - (void)nonl(); - (void)cbreak(); - //(void)noecho(); - scrollok(stdscr, TRUE); - getmaxyx(stdscr, screenheight, screenwidth); - } else { - char *LINES = getenv("LINES"); - if (LINES) - screenheight = atoi(LINES); - } -#endif /* SERGEEV */ + (void)saveterm(); + (void)nonl(); + (void)cbreak(); + //(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); + } } -void ioend(void) { -#ifndef SERGEEV - outro(0); -#endif /* SERGEEV */ -} -void waitfor(void) { +void waitfor(void) /* wait for user action -- OK to do nothing if on a TTY */ -#ifdef SERGEEV - getche(); -#endif /* SERGEEV */ +{ + if (curses) + getch(); } -void pause_game(int i) { - char *prompt; -#ifndef SERGEEV - char buf[BUFSIZ]; -#else /* SERGEEV */ - drawmaps(0); - setwnd(BOTTOM_WINDOW); -#endif /* SERGEEV */ - if (i==1) { - if (skill > 2) - prompt = "[ANOUNCEMENT ARRIVING...]"; - else - prompt = "[IMPORTANT ANNOUNCEMENT ARRIVING -- PRESS ENTER TO CONTINUE]"; - } - else { - if (skill > 2) - prompt = "[CONTINUE?]"; - else - prompt = "[PRESS ENTER TO CONTINUE]"; +void pause_game(int i) +{ + char *prompt; + char buf[BUFSIZ]; + if (i==1) { + if (skill > 2) + prompt = "[ANOUNCEMENT ARRIVING...]"; + else + prompt = "[IMPORTANT ANNOUNCEMENT ARRIVING -- PRESS ENTER TO CONTINUE]"; + } + else { + if (skill > 2) + prompt = "[CONTINUE?]"; + else + prompt = "[PRESS ENTER TO CONTINUE]"; - } -#ifndef SERGEEV - if (curses) { - waddch(stdscr, '\n'); - waddstr(stdscr, prompt); - wgetnstr(stdscr, buf, sizeof(buf)); - wclear(stdscr); - wrefresh(stdscr); - } else { + } + if (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); + } else { + putchar('\n'); + proutn(prompt); + fgets(buf, sizeof(buf), stdin); + if (i != 0) { + int j; + for (j = 0; j < 24; j++) putchar('\n'); - proutn(prompt); - fgets(buf, sizeof(buf), stdin); - if (i != 0) { - /* much more in that old-TTY spirit to throw linefeeds */ - int j; - for (j = 0; j < screenheight; j++) - putchar('\n'); - } - linecount = 0; } -#else /* SERGEEV */ - proutn(prompt); - getche(); - clrscr(); - setwnd(LOWER_WINDOW); - clrscr(); -#endif /* SERGEEV */ + linecount = 0; + } } -void skip(int i) { -#ifndef SERGEEV +void skip(int i) +{ while (i-- > 0) { if (curses) { - int y, x; - getyx(stdscr, y, x); - if (y == screenheight-1) - pause_game(0); - else - waddch(stdscr, '\n'); + proutn("\n\r"); } else { linecount++; - if (linecount >= screenheight) + if (linecount >= 24) pause_game(0); else putchar('\n'); } -#else /* SERGEEV */ - while (i-- > 0) proutn("\n\r"); -#endif /* SERGEEV */ + } } -static void vproutn(char *fmt, va_list ap) { -#ifdef SERGEEV - char *s, *p; - vasprintf(&s, fmt, ap); - p=s; - if ((curwnd==LOWER_WINDOW)&&(wherey()==wnds[curwnd].wndbottom-wnds[curwnd].wndtop)){ - if (strchr(s,'\n')) { - p=strchr(s,'\n'); - p[0]=0; - cprintf("%s",s); - p++; - pause_game(0); - } -#endif /* SERGEEV */ +static void vproutn(char *fmt, va_list ap) +{ + if (curses) { + vwprintw(curwnd, fmt, ap); + wrefresh(curwnd); } -#ifdef SERGEEV - if ((curwnd==LOWER_WINDOW)&&(wherey()>wnds[curwnd].wndbottom-wnds[curwnd].wndtop+1)) - cprintf("\r"); -// setwnd(curwnd); - if (strchr(s,'\n') || strchr(s,'\r')) clreol(); - cprintf("%s",p); - free(s); -#endif /* SERGEEV */ + else + vprintf(fmt, ap); } -void proutn(char *fmt, ...) { +void proutn(char *fmt, ...) +{ va_list ap; va_start(ap, fmt); -#ifndef SERGEEV - if (curses) { - vw_printw(stdscr, fmt, ap); - wrefresh(stdscr); - } else - vprintf(fmt, ap); -#else /* SERGEEV */ vproutn(fmt, ap); -#endif /* SERGEEV */ va_end(ap); } -void prout(char *fmt, ...) { +void prout(char *fmt, ...) +{ va_list ap; va_start(ap, fmt); -#ifndef SERGEEV - if (curses) { - vw_printw(stdscr, fmt, ap); - wrefresh(stdscr); - } else - vprintf(fmt, ap); -#else /* SERGEEV */ vproutn(fmt, ap); -#endif /* SERGEEV */ va_end(ap); skip(1); } -void proutc(char *line) { - line[strlen(line)-1] = '\0'; -#ifndef SERGEEV - if (curses) - waddstr(stdscr, line); - else - fputs(line, stdout); -#else /* SERGEEV */ - cputs(line); -#endif /* SERGEEV */ - skip(1); -} - -#ifdef SERGEEV -static void prchr(char *s){ - char str[2]; - strncpy(str,s,1); - str[1]=0; - proutn(str); -} - -static void vprouts(char *fmt, va_list ap) { - char *s, *p; - vasprintf(&s, fmt, ap); - p=s; - while (*p) { - prchr(p++); - delay(30); - } - free(s); -} -#endif /* SERGEEV */ - -void prouts(char *fmt, ...) { -#ifndef SERGEEV - clock_t endTime; - char *s, buf[BUFSIZ]; - /* print slowly! */ - 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) { - waddch(stdscr, *s); - wrefresh(stdscr); - } - else { - putchar(*s); - fflush(stdout); - } - } -#else /* SERGEEV */ +void prouts(char *fmt, ...) +/* print slowly! */ +{ + clock_t endTime; + char *s, buf[BUFSIZ]; va_list ap; va_start(ap, fmt); - vprouts(fmt, ap); + vsprintf(buf, fmt, ap); va_end(ap); -#endif /* SERGEEV */ + skip(1); + for (s = buf; *s; s++) { + endTime = clock() + CLOCKS_PER_SEC*0.05; + while (clock() < endTime) continue; + if (curses) { + waddch(curwnd, *s); + wrefresh(curwnd); + } + else { + putchar(*s); + fflush(stdout); + } + } } -void cgetline(char *line, int max) { +void cgetline(char *line, int max) +{ if (curses) { -#ifndef SERGEEV - wgetnstr(stdscr, line, max); - wrefresh(stdscr); -#else /* SERGEEV */ - line[0]=max-1; - cgets(line); - memmove(line,&line[2],max-3); -#endif /* SERGEEV */ + wgetnstr(curwnd, line, max); + strcat(line, "\n"); + wrefresh(curwnd); } else { fgets(line, max, stdin); - line[strlen(line)-1] = '\0'; } + line[strlen(line)-1] = '\0'; } -void setwnd(short wndnum){ +void setwnd(WINDOW *wnd) /* change windows -- OK for this to be a no-op in tty mode */ -#ifdef SERGEEV - int cury; - cury=wherey()+wnds[curwnd].wndtop-wnds[wndnum].wndtop; - if ((curwnd==FULLSCREEN_WINDOW)&&(wndnum!=FULLSCREEN_WINDOW)) clrscr(); - window(wnds[wndnum].wndleft, wnds[wndnum].wndtop, wnds[wndnum].wndright, wnds[wndnum].wndbottom); - if ((curwnd==wndnum)&&(cury>wnds[wndnum].wndbottom-wnds[wndnum].wndtop+1)){ - gotoxy(wnds[wndnum].wndright-wnds[wndnum].wndleft+1,wnds[wndnum].wndbottom-wnds[wndnum].wndtop+1); - skip(1); - } - curwnd=wndnum; - gotoxy(1,cury); -#endif /* SERGEEV */ +{ + if (curses) { + curwnd=wnd; + curs_set(wnd == FULLSCREEN_WINDOW || wnd == LOWER_WINDOW); + } +} + +void clreol (void) +/* clear to end of line -- can be a no-op in tty mode */ +{ + if (curses) { + wclrtoeol(curwnd); + wrefresh(curwnd); + } } +void clrscr (void) +/* clear screen -- can be a no-op in tty mode */ +{ + if (curses) { + wclear(curwnd); + wmove(curwnd,0,0); + wrefresh(curwnd); + } +} + +void textcolor (int color) +{ + if (curses) { + wattroff(curwnd, A_REVERSE); + // FIXME + } +} + +void highvideo (void) +{ + if (curses) { + attron(A_REVERSE); + } +} + void commandhook(char *cmd, int before) { } @@ -332,144 +230,131 @@ void commandhook(char *cmd, int before) { * Things past this point have policy implications. */ -void drawmaps(short l) { +void drawmaps(short l) /* hook to be called after moving to redraw maps */ -#ifdef SERGEEV - _setcursortype(_NOCURSOR); - if (l==1) sensor(); - if (l!=2) setwnd(LEFTUPPER_WINDOW); - gotoxy(1,1); - enqueue("no"); - srscan(SCAN_FULL); - if (l!=2){ - setwnd(SRSCAN_WINDOW); - clrscr(); - srscan(SCAN_NO_LEFTSIDE); - setwnd(LRSCAN_WINDOW); - clrscr(); - enqueue("l"); - lrscan(); - _setcursortype(_NORMALCURSOR); - } -#endif /* SERGEEV */ +{ + if (curses) { + if (l == 1) + sensor(); + 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); + srscan(SCAN_NO_LEFTSIDE); + setwnd(LRSCAN_WINDOW); + wclear(LRSCAN_WINDOW); + wmove(LRSCAN_WINDOW, 0, 0); + enqueue("l"); + lrscan(); + } + } } void boom(int ii, int jj) /* enemy fall down, go boom */ { -#ifdef SERGEEV - int crx, cry; - crx=wherex(); - cry=wherey(); - setwnd(LEFTUPPER_WINDOW); - drawmaps(2); - gotoxy(jj*2+3,ii+2); - highvideo(); - proutn("%c", game.quad[ii][jj]); - gotoxy(wherex()-1,wherey()); - sound(500); - delay(1000); - nosound(); - lowvideo(); - proutn("%c", game.quad[ii][jj]); - setwnd(LOWER_WINDOW); - gotoxy(crx,cry); - _setcursortype(_NORMALCURSOR); - delay(500); -#endif /* SERGEEV */ + if (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); + 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); + delay(500); + } } void warble(void) /* sound and visual effects for teleportation */ { -#ifdef SERGEEV - int posx, posy; - posx=wherex(); - posy=wherey(); - drawmaps(1); - setwnd(LOWER_WINDOW); - gotoxy(posx,posy); - sound(50); - delay(1000); - nosound(); -#else - prouts(" . . . . . "); -#endif /* SERGEEV */ + if (curses) { + drawmaps(1); + setwnd(LOWER_WINDOW); + sound(50); + 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) /* torpedo-track animation */ { -#ifndef SERGEEV - if (l == 1) { - if (n != 1) { + if (!curses) { + if (l == 1) { + if (n != 1) { + skip(1); + proutn("Track for torpedo number %d- ", i); + } + else { + skip(1); + proutn("Torpedo track- "); + } + } else if (l==4 || l==9) skip(1); - proutn("Track for torpedo number %d- ", i); - } - else { - skip(1); - proutn("Torpedo track- "); - } - } else if (l==4 || l==9) - skip(1); - proutn("%d - %d ", (int)x, (int)y); -#else - if (game.damage[DSRSENS]==0 || condit==IHDOCKED) { - int crx, cry; - crx = wherex(); - cry = wherey(); - drawmaps(2); - delay((wait!=1)*400); - gotoxy(iy*2+3,ix+2); - if ((game.quad[ix][iy]==IHDOT)||(game.quad[ix][iy]==IHBLANK)){ - game.quad[ix][iy]='+'; - drawmaps(2); - game.quad[ix][iy]=iquad; - sound(l*10); - delay(100); - nosound(); - } - else { - game.quad[ix][iy]|=128; + proutn("%d - %d ", (int)x, (int)y); + } else { + if (game.damage[DSRSENS]==0 || condit==IHDOCKED) { drawmaps(2); - game.quad[ix][iy]=iquad; - _setcursortype(_NOCURSOR); - sound(500); - delay(1000); - nosound(); - lowvideo(); - _setcursortype(_NORMALCURSOR); + delay((wait!=1)*400); + if ((game.quad[ix][iy]==IHDOT)||(game.quad[ix][iy]==IHBLANK)){ + game.quad[ix][iy]='+'; + drawmaps(2); + game.quad[ix][iy]=iquad; + sound(l*10); + delay(100); + nosound(); + } + else { + game.quad[ix][iy] |= DAMAGED; + drawmaps(2); + game.quad[ix][iy]=iquad; + sound(500); + delay(1000); + nosound(); + wattroff(curwnd, A_REVERSE); + } + } else { + proutn("%d - %d ", (int)x, (int)y); } - gotoxy(crx, cry); - } else { - proutn("%d - %d ", (int)x, (int)y); } -#endif /* SERGEEV */ } -void makechart(void) { -#ifdef SERGEEV - _setcursortype(_NOCURSOR); - setwnd(LOWER_WINDOW); - clrscr(); - chart(0); - _setcursortype(_NORMALCURSOR); -#endif /* SERGEEV */ +void makechart(void) +{ + if (curses) { + setwnd(LOWER_WINDOW); + wclear(LOWER_WINDOW); + chart(0); + } } -void setpassword(void) { -#ifndef SERGEEV +void setpassword(void) +{ + if (!curses) { while (TRUE) { - scan(); - strcpy(game.passwd, citem); - chew(); - if (*game.passwd != 0) break; - proutn("Please type in a secret password-"); + scan(); + strcpy(game.passwd, citem); + chew(); + if (*game.passwd != 0) break; + proutn("Please type in a secret password-"); } -#else + } else { int i; for(i=0;i<3;i++) game.passwd[i]=(char)(97+(int)(Rand()*25)); game.passwd[3]=0; -#endif /* SERGEEV */ + } }