X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=io.c;h=fc173f7182c0baac431cdb9363a5279f6447ed68;hp=444a5cb2c2923e509a3702b16756d729a5fc735b;hb=8b0a1880ee115e281afe83e1cd0c90e3306dfed8;hpb=4be633b9c4830f6cf8c7213c91a31d3ea12f313c diff --git a/io.c b/io.c index 444a5cb..fc173f7 100644 --- a/io.c +++ b/io.c @@ -1,4 +1,3 @@ -#define _GNU_SOURCE #include #include #include @@ -6,331 +5,290 @@ #include #include #include -#include -#include "conio.h" -#include "sstlinux.h" #include "sst.h" +#include "sstlinux.h" -#ifndef SERGEEV static int linecount; /* for paging */ -#endif /* SERGEEV */ -static int screenheight = 24, screenwidth = 80; -#ifndef SERGEEV -static int curses = FALSE; -#else /* SERGEEV */ static int curses = TRUE; -#endif /* SERGEEV */ -#ifdef SERGEEV -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; -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); -} - -void iostart(int usecurses) { -#ifdef SERGEEV - 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); +void iostart(int usecurses) +{ + if ((curses = usecurses)) { - if ((curses = usecurses)) { - (void)initscr(); + 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); + (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 /* SERGEEV */ +#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); + message_window = newwin(0, 0, 12, 0); + prompt_window = newwin(1, 0, LINES-2, 0); + scrollok(message_window, TRUE); + setwnd(fullscreen_window); + textcolor(DEFAULT); + } } -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 > SKILL_FAIR) + prompt = "[ANOUNCEMENT ARRIVING...]"; + else + prompt = "[IMPORTANT ANNOUNCEMENT ARRIVING -- PRESS ENTER TO CONTINUE]"; + } + else { + if (skill > SKILL_FAIR) + 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(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); + 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"); + } } -static void vproutn(char *fmt, va_list ap) { - 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 */ +void prouts(char *fmt, ...) +/* print slowly! */ +{ + 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++) { + delay(500); + if (curses) { + waddch(curwnd, *s); + wrefresh(curwnd); + } + else { + putchar(*s); + fflush(stdout); + } + } } -#ifdef SERGEEV -static void prchr(char *s){ - char str[2]; - strncpy(str,s,1); - str[1]=0; - proutn(str); +void cgetline(char *line, int max) +{ + if (curses) { + wgetnstr(curwnd, line, max); + strcat(line, "\n"); + wrefresh(curwnd); + } else { + fgets(line, max, stdin); + } + line[strlen(line)-1] = '\0'; } -static void vprouts(char *fmt, va_list ap) { - char *s, *p; - vasprintf(&s, fmt, ap); - p=s; - while (*p) { - prchr(p++); - delay(30); +void setwnd(WINDOW *wnd) +/* change windows -- OK for this to be a no-op in tty mode */ +{ + if (curses) { + curwnd=wnd; + curs_set(wnd == fullscreen_window || wnd == message_window || wnd == prompt_window); } - 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 */ - va_list ap; - va_start(ap, fmt); - vprouts(fmt, ap); - va_end(ap); -#endif /* SERGEEV */ +void clreol (void) +/* clear to end of line -- can be a no-op in tty mode */ +{ + if (curses) { + wclrtoeol(curwnd); + wrefresh(curwnd); + } } -void c_printf (char *format, ... ) +void clrscr (void) +/* clear screen -- can be a no-op in tty mode */ { - char buffer[BUFSIZ]; /* Well, BUFSIZ is from ncurses... */ - va_list argp; - va_start(argp,format); - vsprintf(buffer,format,argp); - va_end(argp); -#ifdef SERGEEV - waddstr(conio_scr,buffer); -#else - proutn(buffer); -#endif /* SERGEEV */ + if (curses) { + wclear(curwnd); + wmove(curwnd,0,0); + wrefresh(curwnd); + } } -void cgetline(char *line, int max) { +void textcolor (int color) +{ +#ifdef A_COLOR 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 */ - } else { - fgets(line, max, stdin); - line[strlen(line)-1] = '\0'; + 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 setwnd(short wndnum){ -/* 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 */ +void highvideo (void) +{ + if (curses) { + wattron(curwnd, A_REVERSE); + } } - + void commandhook(char *cmd, int before) { } @@ -338,59 +296,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); - strcpy(line,"s"); - srscan(1); - if (l!=2){ - setwnd(SRSCAN_WINDOW); - clrscr(); - srscan(2); - setwnd(LRSCAN_WINDOW); - clrscr(); - strcpy(line,"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 */ +{ + 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(message_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(message_window); + sound(50); + delay(1000); + nosound(); + } else + prouts(" . . . . . "); } -void setpassword(void) { -#ifndef SERGEEV +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 (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("%d - %d ", (int)x, (int)y); + } 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]='+'; + 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); + } + } +} + +void makechart(void) +{ + if (curses) { + setwnd(message_window); + wclear(message_window); + chart(0); + } +} + +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 */ + } }