#include <math.h>
#include <stdlib.h>
#include <string.h>
+#include <curses.h>
#ifndef INCLUDED
#define EXTERN extern
#else
#define PHASEFAC (2.0)
#define PLNETMAX (10)
#define NEVENTS (8)
+#define GALSIZE (8)
+#define QUADSIZE (10)
+#define BASEMAX (6)
typedef struct {
int x; /* Quadrant location of planet */
basekl, // destroyed bases
killk, // Klingons killed
killc, // commanders killed
- galaxy[9][9], // The Galaxy (subscript 0 not used)
- cx[11],cy[11], // Commander quadrant coordinates
- baseqx[6], // Base quadrant X
- baseqy[6], // Base quadrant Y
- newstuf[9][9], // Extended galaxy goodies
+ galaxy[GALSIZE+1][GALSIZE+1], // The Galaxy (subscript 0 not used)
+ cx[QUADSIZE+1],cy[QUADSIZE+1], // Commander quadrant coordinates
+ baseqx[BASEMAX], // Base quadrant X
+ baseqy[BASEMAX], // Base quadrant Y
+ newstuf[GALSIZE+1][GALSIZE+1], // Extended galaxy goodies
isx, isy, // Coordinate of Super Commander
nscrem, // remaining super commanders
nromkl, // Romulans killed
remtime; // remaining time
} snapshot; // Data that is snapshot
+/*
+ * This is how the integers in the galaxy array are encoded.
+ * Someday these should turn into structure fields.
+ */
+#define SUPERNOVA_PLACE 1000
+#define KLINGON_PLACE 100
+#define BASE_PLACE 10
+#define STAR_PLACE 1
+#define KLINGONS(n) ((n)/KLINGON_PLACE)
+#define BASES(n) (((n)%KLINGON_PLACE)/BASE_PLACE)
+#define STARS(n) ((n)%BASE_PLACE)
+#define NOEXIT(s) ((s) > 899) /* supernova or >8 Klingons */
+
+/* for newstuff */
+#define ROMULAN_PLACE 10
+#define ROMULANS(n) ((n)/ROMULAN_PLACE)
+
+/* for starch */
+#define CHART_UNKNOWN -1
+
+#define SKILL_NONE 0
+#define SKILL_NOVICE 1
+#define SKILL_FAIR 2
+#define SKILL_GOOD 3
+#define SKILL_EXPERT 4
+#define SKILL_EMERITUS 5
+
+/* game options */
+#define OPTION_ALL 0xffffffff
+#define OPTION_TTY 0x00000001 /* old interface */
+#define OPTION_CURSES 0x00000002 /* new interface */
+#define OPTION_IOMODES 0x00000003 /* cover both interfaces */
+#define OPTION_PLANETS 0x00000004 /* planets and mining */
+#define OPTION_THOLIAN 0x00000008 /* Tholians and their webs */
+#define OPTION_THINGY 0x00000010 /* Space Thingy can shoot back */
+#define OPTION_PROBE 0x00000020 /* deep-space probes */
+
// Scalar variables that are needed for freezing the game
// are placed in a structure. #defines are used to access by their
// original names. Gee, I could have done this with the d structure,
#define SSTMAGIC "SST2.0\n"
-EXTERN short curwnd;
+EXTERN WINDOW *curwnd;
EXTERN struct {
char magic[sizeof(SSTMAGIC)];
+ unsigned long options;
snapshot state;
snapshot snapsht;
- char quad[11][11]; // contents of our quadrant
- double kpower[21]; // enemy energy levels
- double kdist[21]; // enemy distances
- double kavgd[21]; // average distances
+ char quad[QUADSIZE+1][QUADSIZE+1]; // contents of our quadrant
+ double kpower[(QUADSIZE+1)*(QUADSIZE+1)]; // enemy energy levels
+ double kdist[(QUADSIZE+1)*(QUADSIZE+1)]; // enemy distances
+ double kavgd[(QUADSIZE+1)*(QUADSIZE+1)]; // average distances
double damage[NDEVICES+1]; // damage encountered
double future[NEVENTS+1]; // future events
char passwd[10]; // Self Destruct password
- int kx[21]; // enemy sector locations
- int ky[21];
- int starch[9][9]; // star chart
+ int kx[(QUADSIZE+1)*(QUADSIZE+1)]; // enemy sector locations
+ int ky[(QUADSIZE+1)*(QUADSIZE+1)];
+ int starch[GALSIZE+1][GALSIZE+1]; // star chart
/* members with macro definitions start here */
int inkling,
inbase,
char *cramlc(enum loctype, int, int);
double expran(double);
double Rand(void);
-void iran8(int *, int *);
-void iran10(int *, int *);
+void iran(int, int *, int *);
#define square(i) ((i)*(i))
void dropin(int, int*, int*);
void newcnd(void);
void scom(int *);
void hittem(double *);
void prouts(char *, ...);
-void proutc(char *);
int isit(char *);
void preport(void);
void orbit(void);
-void sensor(void);
+void sensor(int);
void drawmaps(short);
void beam(void);
void mine(void);
void attakreport(int);
void movetho(void);
void probe(void);
-void iostart(int);
-void ioend(void);
-void setwnd(short);
+void iostart(void);
+void setwnd(WINDOW *);
void warble(void);
void boom(int ii, int jj);
void tracktorpedo(int x, int y, int ix, int iy, int wait, int l, int i, int n, int iquad);
void waitfor(void);
void setpassword(void);
void commandhook(char *, int);
-void c_printf (char *format, ... );
+void makechart(void);
+void enqueue(char *);
-typedef struct {
- int wndleft,wndtop,wndright,wndbottom;
-} wnd;
-extern wnd wnds[6];
-/* these need to track io.c:wnd */
-#define FULLSCREEN_WINDOW 0
-#define LEFTUPPER_WINDOW 1
-#define SRSCAN_WINDOW 2
-#define LRSCAN_WINDOW 3
-#define LOWER_WINDOW 4
-#define BOTTOM_WINDOW 5
+/* mode arguments for srscan() */
+#define SCAN_FULL 1
+#define SCAN_REQUEST 2
+#define SCAN_STATUS 3
+#define SCAN_NO_LEFTSIDE 4
+
+WINDOW *fullscreen_window;
+WINDOW *srscan_window;
+WINDOW *report_window;
+WINDOW *lrscan_window;
+WINDOW *message_window;
+WINDOW *prompt_window;
+
+extern void clreol(void);
+extern void clrscr(void);
+extern void textcolor(int color);
+extern void highvideo(void);
+
+enum COLORS {
+ DEFAULT,
+ BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY,
+ DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE
+};
+
+#define DAMAGED 128 /* marker for damaged ship in starmap */