Second round of merging Sergeev changes.
[super-star-trek.git] / io.c
diff --git a/io.c b/io.c
index a5ac6d9e30411105399ca04869758b15ffcee87a..258da5513f9bd5eeaf7e14d169925e5bebcd7d15 100644 (file)
--- a/io.c
+++ b/io.c
@@ -1,19 +1,37 @@
+#ifdef SERGEEV
+#define _GNU_SOURCE
+#endif /* SERGEEV */
 #include <stdio.h>
+#ifdef SERGEEV
+#include <unistd.h>
+#endif /* SERGEEV */
 #include <termios.h>
 #include <curses.h>
 #include <signal.h>
 #include <ctype.h>
 #include <stdarg.h>
+#ifdef SERGEEV
+#include <conio.h>
+#endif /* SERGEEV */
 #ifdef MSDOS
 #include <dos.h>
 #endif
 #include <time.h>
 
+#ifdef SERGEEV
+#include "sstlinux.h"
+#endif /* SERGEEV */
 #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 */
 
 static void outro(int sig) {
 /* wrap up, either normally or due to signal */
@@ -41,7 +59,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);
@@ -82,8 +100,14 @@ void clearscreen(void) {
 #endif
 }
 
-void pause(int i) {
+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...]";
@@ -97,6 +121,7 @@ void pause(int i) {
                        prompt = "[PRESS ENTER TO CONTINUE]";
 
        }
+#ifndef SERGEEV
        if (curses) {
            waddch(stdscr, '\n');
                waddstr(stdscr, prompt);
@@ -105,68 +130,134 @@ void pause(int i) {
                wrefresh(stdscr);
        } else {
                putchar('\n');
-               prout(prompt);
+               proutn(prompt);
                fgets(buf, sizeof(buf), stdin);
                if (i != 0) {
                        clearscreen();
                }
                linecount = 0;
        }
+#else /* SERGEEV */
+       proutn(prompt);
+       getche();
+        clrscr();
+        setwnd(4);
+        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==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 */
     }
+#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 */
 }
 
 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,12 +278,28 @@ void prouts(char *fmt, ...) {
                    fflush(stdout);
                }
        }
+#else /* SERGEEV */
+    va_list ap;
+    va_start(ap, fmt);
+    vprouts(fmt, ap);
+    va_end(ap);
+#endif /* SERGEEV */
 }
 
+#ifndef SERGEEV
 void getline(char *line, int max) {
+#else /* SERGEEV */
+void cgetline(char *line, int max) {
+#endif /* SERGEEV */
     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';