Full ANSIfication with prototypes.
[vms-empire.git] / display.c
index 744cac0..0970c58 100644 (file)
--- a/display.c
+++ b/display.c
@@ -1,5 +1,3 @@
-/* $Id$  - (c) Copyright 1987, 1988 Chuck Simmons */
-
 /*
  *    Copyright (C) 1987, 1988 Chuck Simmons
  * 
@@ -18,12 +16,7 @@ information:
        point of view;
 */
 
-#ifdef SYSV
 #include <string.h>
-#else
-#include <strings.h>
-#endif
-
 #include <curses.h>
 #include "empire.h"
 #include "extern.h"
@@ -35,8 +28,12 @@ static int save_sector; /* the currently displayed sector */
 static int save_cursor; /* currently displayed cursor position */
 static int change_ok = TRUE; /* true if new sector may be displayed */
 
+static void show_loc(view_map_t vmap[],loc_t loc);
+static void disp_square(view_map_t *vp);
+int on_screen(loc_t loc);
+
 #ifdef A_COLOR
-void init_colors()
+void init_colors(void)
 {
     start_color();
 
@@ -48,15 +45,82 @@ void init_colors()
     init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
     init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
     init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
+    attron(A_BOLD);    /* otherwise we get gray for white */
+    keypad(stdscr, TRUE);
 }
 #endif /* A_COLOR */
 
+/*
+Used for win announcements 
+ */
+void announce (char *msg) {
+    (void) addstr (msg);
+}
+
+
+/*
+ * Map input character to direction offset.
+ * Attempts to enable arrow and keypad keys.
+ */
+int direction(chtype c)
+{
+    switch (c)
+    {
+    case 'w':
+    case 'W':
+    case KEY_UP:
+       return 0;
+
+    case 'e':
+    case 'E':
+    case KEY_A3:
+    case KEY_PPAGE:
+       return 1;
+
+    case 'd':
+    case 'D':
+    case KEY_RIGHT:
+       return 2;
+
+    case 'c':
+    case 'C':
+    case KEY_C3:
+    case KEY_NPAGE:
+       return 3;
+
+    case 'x':
+    case 'X':
+    case KEY_DOWN:
+       return 4;
+
+    case 'z':
+    case 'Z':
+    case KEY_C1:
+    case KEY_END:
+       return 5;
+
+    case 'a':
+    case 'A':
+    case KEY_LEFT:
+       return 6;
+
+    case 'q':
+    case 'Q':
+    case KEY_A1:
+    case KEY_HOME:
+       return 7;
+
+    default:
+       return -1;
+    }
+}
+
 /*
 This routine is called when the current display has been
 trashed and no sector is shown on the screen.
 */
 
-void kill_display () {
+void kill_display (void) {
        whose_map = UNOWNED;
 }
 
@@ -65,7 +129,7 @@ This routine is called when a new sector may be displayed on the
 screen even if the location to be displayed is already on the screen.
 */
 
-void sector_change () {
+void sector_change (void) {
        change_ok = TRUE;
 }
 
@@ -74,7 +138,7 @@ Return the currently displayed user sector, if any.  If a user
 sector is not displayed, return -1.
 */
 
-int cur_sector () {
+int cur_sector (void) {
        if (whose_map != USER) return (-1);
        return (save_sector);
 }
@@ -84,7 +148,7 @@ Return the current position of the cursor.  If the user's map
 is not on the screen, we return -1.
 */
 
-long cur_cursor () {
+loc_t cur_cursor (void) {
        if (whose_map != USER) return (-1);
        return (save_cursor);
 }
@@ -99,13 +163,9 @@ redisplay the sector, or if the location is not on the screen.
 */
 
 void
-display_loc (whose, vmap, loc)
-int whose; /* whose map to display */
-view_map_t vmap[];
-long loc; /* location to display */
+display_loc (int whose, view_map_t vmap[], loc_t loc)
+/* whose is whose map to display; loc is location to display */
 {
-       void print_sector(), show_loc();
-       
        if (change_ok || whose != whose_map || !on_screen (loc))
                print_sector (whose, vmap, loc_sector (loc));
                
@@ -117,10 +177,8 @@ Display a location iff the location is on the screen.
 */
 
 void
-display_locx (whose, vmap, loc)
-int whose; /* whose map to display */
-view_map_t vmap[];
-long loc; /* location to display */
+display_locx (int whose, view_map_t vmap[], loc_t loc)
+/* whose is whose map to display; loc is location to display */
 {
        if (whose == whose_map && on_screen (loc))
                show_loc (vmap, loc);
@@ -131,9 +189,7 @@ Display a location which exists on the screen.
 */
 
 void
-show_loc (vmap, loc)
-view_map_t vmap[];
-long loc;
+show_loc (view_map_t vmap[], loc_t loc)
 {
        int r, c;
        
@@ -165,10 +221,8 @@ screen.
 */
  
 void
-print_sector (whose, vmap, sector)
-char whose; /* USER or COMP */
-view_map_t vmap[]; /* map to display */
-int sector; /* sector to display */
+print_sector(int whose, view_map_t vmap[], int sector)
+/* whose is USER or COMP, vmap is map to display, sector is sector to display */
 {
        void display_screen();
 
@@ -220,16 +274,16 @@ int sector; /* sector to display */
        /* print x-coordinates along bottom of screen */
        for (c = ref_col; c < ref_col + display_cols && c < MAP_WIDTH; c++)
        if (c % 10 == 0) {
-               pos_str (lines-1, c-ref_col, "%d", c);
+               pos_str (lines-1, c-ref_col, "%d", c,0,0,0,0,0,0,0);
        }
        /* print y-coordinates along right of screen */
        for (r = ref_row; r < ref_row + display_rows && r < MAP_HEIGHT; r++) {
                if (r % 2 == 0)
-                       pos_str (r-ref_row+NUMTOPS, cols-NUMSIDES+1, "%2d", r);
-               else pos_str (r-ref_row+NUMTOPS, cols-NUMSIDES+1, "  ");
+                       pos_str (r-ref_row+NUMTOPS, cols-NUMSIDES+1, "%2d", r,0,0,0,0,0,0,0);
+               else pos_str (r-ref_row+NUMTOPS, cols-NUMSIDES+1, "  ",0,0,0,0,0,0,0,0);
        }
        /* print round number */
-       (void) sprintf (jnkbuf, "Sector %d Round %d", sector, date);
+       (void) sprintf (jnkbuf, "Sector %d Round %ld", sector, date);
        for (r = 0; jnkbuf[r] != '\0'; r++) {
                if (r+NUMTOPS >= MAP_HEIGHT) break;
                (void) move (r+NUMTOPS, cols-NUMSIDES+4);
@@ -246,17 +300,18 @@ pretty.
 */
 
 
-static disp_square(vp)
-view_map_t *vp;
+static void disp_square(view_map_t *vp)
 {
 #ifdef A_COLOR
+       chtype attr;
+
        switch(vp->contents)
        {
        case '+':
-               attron(COLOR_PAIR(COLOR_GREEN));
+           attr = COLOR_PAIR(COLOR_GREEN);
                break;
        case '.':
-               attron(A_BOLD | COLOR_PAIR(COLOR_BLUE));
+               attr = COLOR_PAIR(COLOR_CYAN);
                break;
        case 'a':
        case 'f':
@@ -268,16 +323,18 @@ view_map_t *vp;
        case 's':
        case 'z':
        case 'X':
-               attron(COLOR_PAIR(COLOR_RED));
+               attr = COLOR_PAIR(COLOR_RED);
                break;
        default:
-               attron(COLOR_PAIR(COLOR_WHITE));
+               attr = COLOR_PAIR(COLOR_WHITE);
                break;
        }
+       attron(attr);
 #endif /* A_COLOR */
        (void) addch ((chtype)vp->contents);
 #ifdef A_COLOR
-       attrset(0);
+       attroff(attr);
+       attron(COLOR_PAIR(COLOR_WHITE));
 #endif /* A_COLOR */
 }
 
@@ -286,12 +343,11 @@ view_map_t *vp;
 Display the portion of the map that appears on the screen.
 */
 
-void display_screen (vmap)
-view_map_t vmap[];
+void display_screen(view_map_t vmap[])
 {
        int display_rows, display_cols;
        int r, c;
-       long t;
+       loc_t t;
 
        display_rows = lines - NUMTOPS - 1; /* num lines to display */
        display_cols = cols - NUMSIDES;
@@ -311,11 +367,10 @@ We display the cursor on the screen, if possible.
 */
 
 int
-move_cursor (cursor, offset)
-long *cursor; /* current cursor position */
-int offset; /* offset to add to cursor */
+move_cursor(loc_t *cursor, int offset)
+/* cursor is current cursor position, offset is offset to add to cursor */
 {
-       long t;
+       loc_t t;
        int r, c;
  
        t = *cursor + offset; /* proposed location */
@@ -336,8 +391,7 @@ int offset; /* offset to add to cursor */
 See if a location is displayed on the screen.
 */
 
-int on_screen (loc)
-long loc;
+int on_screen (loc_t loc)
 {
        int new_r, new_c;
        
@@ -356,12 +410,11 @@ long loc;
 /* Print a view map for debugging. */
 
 void
-print_xzoom (vmap)
-view_map_t *vmap;
+print_xzoom(view_map_t *vmap)
 {
        print_zoom (vmap);
 #if 0
-       prompt ("Hit a key: ");
+       prompt ("Hit a key: ",0,0,0,0,0,0,0,0);
        (void) get_chx (); /* wait for user */
 #endif
 }
@@ -373,10 +426,9 @@ Print a condensed version of the map.
 char zoom_list[] = "XO*tcbsdpfaTCBSDPFAzZ+. ";
 
 void
-print_zoom (vmap)
-view_map_t *vmap;
+print_zoom(view_map_t *vmap)
 {
-       void print_zoom_cell();
+       void print_zoom_cell ();
 
        int row_inc, col_inc;
        int r, c;
@@ -390,7 +442,7 @@ view_map_t *vmap;
        for (c = 0; c < MAP_WIDTH; c += col_inc)
        print_zoom_cell (vmap, r, c, row_inc, col_inc);
 
-       pos_str (0, 0, "Round #%d", date);
+       pos_str (0, 0, "Round #%d", date,0,0,0,0,0,0,0);
        
        (void) refresh ();
 }
@@ -400,10 +452,8 @@ Print a single cell in condensed format.
 */
 
 void
-print_zoom_cell (vmap, row, col, row_inc, col_inc)
-view_map_t *vmap;
-int row, col;
-int row_inc, col_inc;
+print_zoom_cell(view_map_t *vmap, 
+                int row, int col, int row_inc, int col_inc)
 {
        int r, c;
        char cell;
@@ -424,10 +474,7 @@ Print a condensed version of a pathmap.
 */
 
 void
-print_pzoom (s, pmap, vmap)
-char *s;
-path_map_t *pmap;
-view_map_t *vmap;
+print_pzoom(char *s, path_map_t *pmap, view_map_t *vmap)
 {
        void print_pzoom_cell();
 
@@ -443,7 +490,7 @@ view_map_t *vmap;
        for (c = 0; c < MAP_WIDTH; c += col_inc)
        print_pzoom_cell (pmap, vmap, r, c, row_inc, col_inc);
 
-       prompt (s);
+       prompt (s,0,0,0,0,0,0,0,0);
        (void) get_chx (); /* wait for user */
        
        (void) refresh ();
@@ -459,11 +506,8 @@ between P and Z are printed as U.
 */
 
 void
-print_pzoom_cell (pmap, vmap, row, col, row_inc, col_inc)
-path_map_t *pmap;
-view_map_t *vmap;
-int row, col;
-int row_inc, col_inc;
+print_pzoom_cell(path_map_t *pmap, view_map_t *vmap, 
+                 int row, int col, int row_inc, int col_inc)
 {
        int r, c;
        int sum, d;
@@ -503,8 +547,179 @@ Display the score off in the corner of the screen.
 */
 
 void
-display_score ()
+display_score(void)
+{
+       pos_str (1, cols-12, " User  Comp",0,0,0,0,0,0,0,0);
+       pos_str (2, cols-12, "%5d %5d", user_score, comp_score,0,0,0,0,0,0);
+}
+
+/*
+Clear the end of a specified line starting at the specified column.
+*/
+
+void
+clreol(int linep, int colp)
+{
+       (void) move (linep, colp);
+       (void) clrtoeol();
+}
+
+/*
+Initialize the terminal.
+*/
+
+void
+ttinit(void)
+{
+       (void) initscr();
+       (void) noecho();
+       (void) crmode();
+#ifdef A_COLOR
+       init_colors();
+#endif /* A_COLOR */
+       lines = LINES;
+       cols = COLS;
+       if (lines > MAP_HEIGHT + NUMTOPS + 1)
+               lines = MAP_HEIGHT + NUMTOPS + 1;
+       if (cols > MAP_WIDTH + NUMSIDES)
+               cols = MAP_WIDTH + NUMSIDES;
+}
+
+
+/*
+Clear the screen.  We must also kill information maintained about the
+display.
+*/
+
+void
+clear_screen(void)
+{
+       (void) clear ();
+       (void) refresh ();
+       kill_display ();
+}
+
+/*
+Redraw the screen.
+*/
+
+void 
+redisplay(void)
+{
+       (void) refresh ();
+}
+
+void
+redraw(void)
+{
+       (void) clearok (curscr, TRUE);
+       (void) refresh ();
+}
+
+/*
+Wait a little bit to give user a chance to see a message.  We refresh
+the screen and pause for a few milliseconds.
+*/
+
+void
+delay(void)
 {
-       pos_str (0, cols-12, " User  Comp");
-       pos_str (1, cols-12, "%5d %5d", user_score, comp_score);
+        int t = delay_time;
+        int i = 500;
+       (void) refresh ();
+        if (t > i) {
+          (void) move (LINES - 1, 0);
+        }
+        for (; t > 0; t -= i) {
+          (void) napms ((t > i) ? i : t); /* pause a bit */
+          if (t > i) {
+            addstr ("*");
+            refresh (); 
+          }
+        }
+}
+
+/*
+Clean up the display.  This routine gets called as we leave the game.
+*/
+
+void
+close_disp(void)
+{
+       (void) move (LINES - 1, 0);
+       (void) clrtoeol ();
+       (void) refresh ();
+       (void) endwin ();
+}
+
+/*
+Position the cursor and output a string.
+*/
+
+void
+pos_str1(int row, int col, char *str, char *a, 
+         int b, int c, int d, int e, int f, int g, int h)
+{
+       (void) move (row, col);
+       addprintf1 (str, a, b, c, d, e, f, g, h);
+}
+
+void
+pos_str(int row, int col, char *str, 
+       int a, int b, int c, int d, int e, int f, int g, int h)
+{
+       (void) move (row, col);
+       addprintf (str, a, b, c, d, e, f, g, h);
+}
+
+void
+/* VARARGS1 */
+addprintf(char *str, int a, int b, int c, int d, int e, int f, int g, int h)
+{
+       char junkbuf[STRSIZE];
+       
+       (void) sprintf (junkbuf, str, a, b, c, d, e, f, g, h);
+       (void) addstr (junkbuf);
+}
+void
+/* VARARGS1 */
+addprintf1(char *str, char *a, int b, int c, int d, int e, int f, int g, int h)
+{
+       char junkbuf[STRSIZE];
+       
+       (void) sprintf (junkbuf, str, a, b, c, d, e, f, g, h);
+       (void) addstr (junkbuf);
+}
+
+void
+/* VARARGS1 */
+addprintf2(char *str, char *a, int b, int c, int d, char *e, char *f, int g, int h)
+{
+       char junkbuf[STRSIZE];
+       
+       (void) sprintf (junkbuf, str, a, b, c, d, e, f, g, h);
+       (void) addstr (junkbuf);
+}
+
+/*
+Print a single cell in condensed format.
+*/
+
+extern char zoom_list[];
+
+void
+print_movie_cell(char *mbuf, int row, int col, int row_inc, int col_inc)
+{
+       int r, c;
+       char cell;
+
+       cell = ' ';
+       for (r = row; r < row + row_inc; r++)
+       for (c = col; c < col + col_inc; c++)
+       if (strchr (zoom_list, mbuf[row_col_loc(r,c)])
+               < strchr (zoom_list, cell))
+       cell = mbuf[row_col_loc(r,c)];
+       
+       (void) move (row/row_inc + NUMTOPS, col/col_inc);
+       (void) addch ((chtype)cell);
 }