Prevent the sensor display from being garbled.
[super-star-trek.git] / io.c
diff --git a/io.c b/io.c
index 91d938720346faba5942380b9a30460d86adec8a..d59a5092550843fcf3800b88524a224cf4c6af5b 100644 (file)
--- a/io.c
+++ b/io.c
@@ -6,15 +6,16 @@
 #include <signal.h>
 #include <ctype.h>
 #include <stdarg.h>
+#include <time.h>
 
 #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;
+#endif /* SERGEEV */
 #ifndef SERGEEV
 static int curses = FALSE;
 #else /* SERGEEV */
@@ -32,6 +33,7 @@ wnd wnds[6]={{1,1,80,25},     /* FULLSCREEN_WINDOW */
 short curwnd;
 #endif /* SERGEEV */
 
+#ifndef SERGEEV
 static void outro(int sig) {
 /* wrap up, either normally or due to signal */
     if (curses) {
@@ -48,8 +50,15 @@ static void fastexit(int 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
@@ -74,10 +83,13 @@ void iostart(int usecurses) {
                if (LINES)
                    screenheight = atoi(LINES);
        }
+#endif /* SERGEEV */
 }
 
 void ioend(void) {
+#ifndef SERGEEV
     outro(0);
+#endif /* SERGEEV */
 }
 
 void waitfor(void) {
@@ -156,9 +168,11 @@ void skip(int i) {
        }
 #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;
@@ -244,8 +258,8 @@ static void vprouts(char *fmt, va_list ap) {
     }
     free(s);
 }
-
 #endif /* SERGEEV */
+
 void prouts(char *fmt, ...) {
 #ifndef SERGEEV
        clock_t endTime;
@@ -290,40 +304,6 @@ void c_printf (char *format, ... )
 #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 */
-}
-
 void cgetline(char *line, int max) {
     if (curses) {
 #ifndef SERGEEV
@@ -358,3 +338,145 @@ void setwnd(short wndnum){
 
 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);
+     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 */
+}
+
+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 */
+} 
+
+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 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) {
+           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);
+       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;
+           drawmaps(2);
+           game.quad[ix][iy]=iquad;
+           _setcursortype(_NOCURSOR);
+           sound(500);
+           delay(1000);
+           nosound();
+           lowvideo();
+           _setcursortype(_NORMALCURSOR);
+       }
+    } 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 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 */
+}
+