X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=io.c;h=fc173f7182c0baac431cdb9363a5279f6447ed68;hp=f4ed854e99e215c1f677b559d54e6321ec6873da;hb=8b0a1880ee115e281afe83e1cd0c90e3306dfed8;hpb=2e65db78c58369f165c7d5c4edc849300a2d7f53 diff --git a/io.c b/io.c index f4ed854..fc173f7 100644 --- a/io.c +++ b/io.c @@ -1,323 +1,426 @@ -#ifdef SERGEEV -#define _GNU_SOURCE -#endif /* SERGEEV */ #include -#ifdef SERGEEV #include -#endif /* SERGEEV */ #include #include #include #include #include -#ifdef SERGEEV -#include -#endif /* SERGEEV */ -#ifdef MSDOS -#include -#endif -#include -#ifdef SERGEEV -#include "sstlinux.h" -#endif /* SERGEEV */ #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 */ -static void outro(int sig) { +WINDOW *curwnd; + +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) { - (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 /* 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) { - outro(0); -} -void clearscreen(void) { - /* Somehow we need to clear the screen */ -#ifdef __BORLANDC__ - extern void clrscr(void); - clrscr(); -#else - if (curses) { - wclear(stdscr); - wrefresh(stdscr); - } else { - // proutn("\033[2J"); /* Hope for an ANSI display */ - /* much more in that old-TTY spirit to just throw linefeeds */ - int i; - for (i = 0; i < screenheight; i++) - putchar('\n'); - } -#endif +void waitfor(void) +/* wait for user action -- OK to do nothing if on a TTY */ +{ + if (curses) + getch(); } -void pause_game(int i) { -#ifndef SERGEEV - char buf[BUFSIZ], *prompt; -#else /* SERGEEV */ - char *prompt; - drawmaps(0); - setwnd(5); -#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) { - clearscreen(); - } - linecount = 0; } -#else /* SERGEEV */ - proutn(prompt); - getche(); - clrscr(); - setwnd(4); - 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==4)&&(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==4)&&(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); - } +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) +{ +#ifdef A_COLOR + if (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; } -#else /* SERGEEV */ - va_list ap; - va_start(ap, fmt); - vprouts(fmt, ap); - va_end(ap); -#endif /* SERGEEV */ + } +#endif /* A_COLOR */ } -void warble(void) +void highvideo (void) +{ + if (curses) { + wattron(curwnd, A_REVERSE); + } +} + +void commandhook(char *cmd, int before) { +} + +/* + * Things past this point have policy implications. + */ + +void drawmaps(short l) +/* hook to be called after moving to redraw maps */ { -#ifdef SERGEEV - int posx, posy; - posx=wherex(); - posy=wherey(); - drawmaps(1); - setwnd(4); - gotoxy(posx,posy); - sound(50); - delay(1000); - nosound(); -#else - prouts(" . . . . . "); -#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 getline(char *line, int max) { +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 */ +{ 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 */ + drawmaps(1); + setwnd(message_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 */ +{ + 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 { - fgets(line, max, stdin); - line[strlen(line)-1] = '\0'; + 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 commandhook(char *cmd, int before) { +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-"); + } + } else { + int i; + for(i=0;i<3;i++) game.passwd[i]=(char)(97+(int)(Rand()*25)); + game.passwd[3]=0; + } +} +