X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=io.c;h=444a5cb2c2923e509a3702b16756d729a5fc735b;hp=a5ac6d9e30411105399ca04869758b15ffcee87a;hb=4be633b9c4830f6cf8c7213c91a31d3ea12f313c;hpb=bed74efa98d15a3f6497c9cc721785c6e7387c07 diff --git a/io.c b/io.c index a5ac6d9..444a5cb 100644 --- a/io.c +++ b/io.c @@ -1,19 +1,37 @@ +#define _GNU_SOURCE #include +#include #include #include #include #include #include -#ifdef MSDOS -#include -#endif #include +#include "conio.h" +#include "sstlinux.h" #include "sst.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 */ static void outro(int sig) { /* wrap up, either normally or due to signal */ @@ -33,6 +51,11 @@ static void fastexit(int sig) { } void iostart(int usecurses) { +#ifdef SERGEEV + textattr(7); + clrscr(); + setwnd(FULLSCREEN_WINDOW); +#else (void) signal(SIGINT, fastexit); (void) signal(SIGINT, fastexit); #ifdef SIGIOT @@ -41,7 +64,7 @@ void iostart(int usecurses) { if(signal(SIGQUIT,SIG_IGN) != SIG_IGN) (void)signal(SIGQUIT,fastexit); - if (curses = usecurses) { + if ((curses = usecurses)) { (void)initscr(); #ifdef KEY_MIN keypad(stdscr, TRUE); @@ -57,33 +80,30 @@ void iostart(int usecurses) { if (LINES) screenheight = atoi(LINES); } +#endif /* SERGEEV */ } void ioend(void) { +#ifndef SERGEEV outro(0); +#endif /* SERGEEV */ } -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 */ +#ifdef SERGEEV + getche(); +#endif /* SERGEEV */ } -void pause(int i) { - char buf[BUFSIZ], *prompt; +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...]"; @@ -97,6 +117,7 @@ void pause(int i) { prompt = "[PRESS ENTER TO CONTINUE]"; } +#ifndef SERGEEV if (curses) { waddch(stdscr, '\n'); waddstr(stdscr, prompt); @@ -105,68 +126,137 @@ void pause(int i) { wrefresh(stdscr); } else { putchar('\n'); - prout(prompt); + proutn(prompt); fgets(buf, sizeof(buf), stdin); if (i != 0) { - clearscreen(); + /* 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 */ } void skip(int i) { +#ifndef SERGEEV while (i-- > 0) { if (curses) { int y, x; getyx(stdscr, y, x); if (y == screenheight-1) - pause(0); + pause_game(0); else waddch(stdscr, '\n'); } else { linecount++; if (linecount >= screenheight) - pause(0); + 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 */ } +#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 */ } 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, ...) { 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! */ @@ -187,17 +277,120 @@ void prouts(char *fmt, ...) { fflush(stdout); } } +#else /* SERGEEV */ + va_list ap; + va_start(ap, fmt); + vprouts(fmt, ap); + va_end(ap); +#endif /* SERGEEV */ } -void getline(char *line, int max) { +void c_printf (char *format, ... ) +{ + 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 */ +} + +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 */ } else { fgets(line, max, stdin); line[strlen(line)-1] = '\0'; } } +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 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 + _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 */ +} + +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 */ +} + +void setpassword(void) { +#ifndef SERGEEV + 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; +#endif /* SERGEEV */ +} +