First round of Sergeev merges.
[super-star-trek.git] / sst.h
1 #include <stdio.h>\r
2 #include <math.h>\r
3 #include <stdlib.h>\r
4 #include <string.h>\r
5 #ifndef INCLUDED\r
6 #define EXTERN extern\r
7 #else\r
8 #define EXTERN\r
9 #endif\r
10 \r
11 #define min(x, y)       ((x)<(y)?(x):(y))\r
12 #define max(x, y)       ((x)>(y)?(x):(y))\r
13 \r
14 // #define DEBUG\r
15 \r
16 #define NDEVICES (15)   // Number of devices\r
17 #define PHASEFAC (2.0)\r
18 #define PLNETMAX (10)\r
19 #define NEVENTS (8)\r
20 \r
21 typedef struct {\r
22     int x;      /* Quadrant location of planet */\r
23     int y;\r
24     enum {M=0, N=1, O=2} pclass;\r
25     int crystals; /* has crystals */\r
26     enum {unknown, known, shuttle_down} known;\r
27 } planet;\r
28 \r
29 #define DESTROY(pl)     memset(pl, '\0', sizeof(planet))\r
30 \r
31 typedef struct {\r
32     int snap,           // snapshot taken\r
33         remkl,                  // remaining klingons\r
34         remcom,                 // remaining commanders\r
35         rembase,                // remaining bases\r
36         starkl,                 // destroyed stars\r
37         basekl,                 // destroyed bases\r
38         killk,                  // Klingons killed\r
39         killc,                  // commanders killed\r
40         galaxy[9][9],   // The Galaxy (subscript 0 not used)\r
41         cx[11],cy[11],  // Commander quadrant coordinates\r
42         baseqx[6],              // Base quadrant X\r
43         baseqy[6],              // Base quadrant Y\r
44         newstuf[9][9],  // Extended galaxy goodies\r
45         isx, isy,               // Coordinate of Super Commander\r
46         nscrem,                 // remaining super commanders\r
47         nromkl,                 // Romulans killed\r
48         nromrem,                // Romulans remaining\r
49         nsckill,                // super commanders killed\r
50         nplankl;                // destroyed planets\r
51         planet plnets[PLNETMAX];  // Planet information\r
52         double date,            // stardate\r
53             remres,             // remaining resources\r
54             remtime;            // remaining time\r
55 } snapshot;                             // Data that is snapshot\r
56 \r
57 // Scalar variables that are needed for freezing the game\r
58 // are placed in a structure. #defines are used to access by their\r
59 // original names. Gee, I could have done this with the d structure,\r
60 // but I just didn't think of it back when I started.\r
61 \r
62 #define SSTMAGIC        "SST2.0\n"\r
63 \r
64 EXTERN struct {\r
65     char magic[sizeof(SSTMAGIC)];\r
66     snapshot state;\r
67     snapshot snapsht;\r
68     char quad[11][11];          // contents of our quadrant\r
69     double kpower[21];          // enemy energy levels\r
70     double kdist[21];           // enemy distances\r
71     double kavgd[21];           // average distances\r
72     double damage[NDEVICES+1];  // damage encountered\r
73     double future[NEVENTS+1];   // future events\r
74     char passwd[10];            // Self Destruct password\r
75     int kx[21];                 // enemy sector locations\r
76     int ky[21];\r
77     int starch[9][9];           // star chart\r
78     /* members with macro definitions start here */\r
79     int inkling,\r
80         inbase,\r
81         incom,\r
82         instar,\r
83         intorps,\r
84         condit,\r
85         torps,\r
86         ship,\r
87         quadx,\r
88         quady,\r
89         sectx,\r
90         secty,\r
91         length,\r
92         skill,\r
93         basex,\r
94         basey,\r
95         klhere,\r
96         comhere,\r
97         casual,\r
98         nhelp,\r
99         nkinks,\r
100         ididit,\r
101         gamewon,\r
102         alive,\r
103         justin,\r
104         alldone,\r
105         shldchg,\r
106         thingx,\r
107         thingy,\r
108         plnetx,\r
109         plnety,\r
110         inorbit,\r
111         landed,\r
112         iplnet,\r
113         imine,\r
114         inplan,\r
115         nenhere,\r
116         ishere,\r
117         neutz,\r
118         irhere,\r
119         icraft,\r
120         ientesc,\r
121         iscraft,\r
122         isatb,\r
123         iscate,\r
124 #ifdef DEBUG\r
125         idebug,\r
126 #endif\r
127         iattak,\r
128         icrystl,\r
129         tourn,\r
130         thawed,\r
131         batx,\r
132         baty,\r
133         ithere,\r
134         iqhere,\r
135         iqengry,\r
136         ithx,\r
137         ithy,\r
138         iseenit,\r
139         probecx,\r
140         probecy,\r
141         proben,\r
142         isarmed,\r
143         nprobes;\r
144     double inresor,\r
145         intime,\r
146         inenrg,\r
147         inshld,\r
148         inlsr,\r
149         indate,\r
150         energy,\r
151         shield,\r
152         shldup,\r
153         warpfac,\r
154         wfacsq,\r
155         lsupres,\r
156         dist,\r
157         direc,\r
158         Time,\r
159         docfac,\r
160         resting,\r
161         damfac,\r
162         stdamtim,\r
163         cryprob,\r
164         probex,\r
165         probey,\r
166         probeinx,\r
167         probeiny;\r
168 } game;\r
169 \r
170 #define inkling game.inkling            // Initial number of klingons\r
171 #define inbase game.inbase                      // Initial number of bases\r
172 #define incom game.incom                        // Initian number of commanders\r
173 #define instar game.instar                      // Initial stars\r
174 #define intorps game.intorps            // Initial/Max torpedoes\r
175 #define condit game.condit                      // Condition (red, yellow, green docked)\r
176 #define torps game.torps                        // number of torpedoes\r
177 #define ship game.ship                          // Ship type -- 'E' is Enterprise\r
178 #define quadx game.quadx                        // where we are\r
179 #define quady game.quady                        //\r
180 #define sectx game.sectx                        // where we are\r
181 #define secty game.secty                        //\r
182 #define length game.length                      // length of game\r
183 #define skill game.skill                        // skill level\r
184 #define basex game.basex                        // position of base in current quad\r
185 #define basey game.basey                        //\r
186 #define klhere game.klhere                      // klingons here\r
187 #define comhere game.comhere            // commanders here\r
188 #define casual game.casual                      // causalties\r
189 #define nhelp game.nhelp                        // calls for help\r
190 #define nkinks game.nkinks                      //\r
191 #define ididit game.ididit                      // Action taken -- allows enemy to attack\r
192 #define gamewon game.gamewon            // Finished!\r
193 #define alive game.alive                        // We are alive (not killed)\r
194 #define justin game.justin                      // just entered quadrant\r
195 #define alldone game.alldone            // game is now finished\r
196 #define shldchg game.shldchg            // shield is changing (affects efficiency)\r
197 #define thingx game.thingx                      // location of strange object in galaxy\r
198 #define thingy game.thingy                      //\r
199 #define plnetx game.plnetx                      // location of planet in quadrant\r
200 #define plnety game.plnety                      //\r
201 #define inorbit game.inorbit            // orbiting\r
202 #define landed game.landed                      // party on planet (1), on ship (-1)\r
203 #define iplnet game.iplnet                      // planet # in quadrant\r
204 #define imine game.imine                        // mining\r
205 #define inplan game.inplan                      // initial planets\r
206 #define nenhere game.nenhere            // Number of enemies in quadrant\r
207 #define ishere game.ishere                      // Super-commander in quandrant\r
208 #define neutz game.neutz                        // Romulan Neutral Zone\r
209 #define irhere game.irhere                      // Romulans in quadrant\r
210 #define iqhere game.iqhere                      // Thing in quadrant\r
211 #define iqengry game.iqengry                    // Thing attacking\r
212 #define icraft game.icraft                      // Kirk in Galileo\r
213 #define ientesc game.ientesc            // Attempted escape from supercommander\r
214 #define iscraft game.iscraft            // =1 if craft on ship, -1 if removed from game\r
215 #define isatb game.isatb                        // =1 if SuperCommander is attacking base\r
216 #define iscate game.iscate                      // Super Commander is here\r
217 #ifdef DEBUG\r
218 #define idebug game.idebug                      // Debug mode\r
219 #endif\r
220 #define iattak game.iattak                      // attack recursion elimination (was cracks[4])\r
221 #define icrystl game.icrystl            // dilithium crystals aboard\r
222 #define tourn game.tourn                        // Tournament number\r
223 #define thawed game.thawed                      // Thawed game\r
224 #define batx game.batx                          // Base coordinates being attacked\r
225 #define baty game.baty                          //\r
226 #define ithere game.ithere                      // Tholean is here \r
227 #define ithx game.ithx                          // coordinates of tholean\r
228 #define ithy game.ithy\r
229 #define iseenit game.iseenit            // Seen base attack report\r
230 #define inresor game.inresor            // initial resources\r
231 #define intime game.intime                      // initial time\r
232 #define inenrg game.inenrg                      // Initial/Max Energy\r
233 #define inshld game.inshld                      // Initial/Max Shield\r
234 #define inlsr game.inlsr                        // initial life support resources\r
235 #define indate game.indate                      // Initial date\r
236 #define energy game.energy                      // Energy level\r
237 #define shield game.shield                      // Shield level\r
238 #define shldup game.shldup                      // Shields are up\r
239 #define warpfac game.warpfac            // Warp speed\r
240 #define wfacsq game.wfacsq                      // squared warp factor\r
241 #define lsupres game.lsupres            // life support reserves\r
242 #define dist game.dist                          // movement distance\r
243 #define direc game.direc                        // movement direction\r
244 #define Time game.Time                          // time taken by current operation\r
245 #define docfac game.docfac                      // repair factor when docking (constant?)\r
246 #define resting game.resting            // rest time\r
247 #define damfac game.damfac                      // damage factor\r
248 #define stdamtim game.stdamtim          // time that star chart was damaged\r
249 #define cryprob game.cryprob            // probability that crystal will work\r
250 #define probex game.probex                      // location of probe\r
251 #define probey game.probey\r
252 #define probecx game.probecx            // current probe quadrant\r
253 #define probecy game.probecy    \r
254 #define probeinx game.probeinx          // Probe x,y increment\r
255 #define probeiny game.probeiny          \r
256 #define proben game.proben                      // number of moves for probe\r
257 #define isarmed game.isarmed            // Probe is armed\r
258 #define nprobes game.nprobes            // number of probes available\r
259 \r
260 /* the following global state doesn't need to be saved */\r
261 EXTERN char     *device[NDEVICES+1];\r
262 EXTERN int iscore, iskill; // Common PLAQ\r
263 EXTERN double perdate;\r
264 EXTERN double aaitem;\r
265 EXTERN char citem[10];\r
266 \r
267 typedef enum {FWON, FDEPLETE, FLIFESUP, FNRG, FBATTLE,\r
268               FNEG3, FNOVA, FSNOVAED, FABANDN, FDILITHIUM,\r
269                           FMATERIALIZE, FPHASER, FLOST, FMINING, FDPLANET,\r
270                           FPNOVA, FSSC, FSTRACTOR, FDRAY, FTRIBBLE,\r
271                           FHOLE} FINTYPE ;\r
272 enum loctype {neither, quadrant, sector};\r
273 \r
274 /* Define devices */\r
275 #define DSRSENS 1\r
276 #define DLRSENS 2\r
277 #define DPHASER 3\r
278 #define DPHOTON 4\r
279 #define DLIFSUP 5\r
280 #define DWARPEN 6\r
281 #define DIMPULS 7\r
282 #define DSHIELD 8\r
283 #define DRADIO  9\r
284 #define DSHUTTL 10\r
285 #define DCOMPTR 11\r
286 #define DTRANSP 12\r
287 #define DSHCTRL 13\r
288 #define DDRAY   14  // Added deathray\r
289 #define DDSP    15  // Added deep space probe\r
290 \r
291 /* Define future events */\r
292 #define FSPY    0       // Spy event happens always (no future[] entry)\r
293                                         // can cause SC to tractor beam Enterprise\r
294 #define FSNOVA  1   // Supernova\r
295 #define FTBEAM  2   // Commander tractor beams Enterprise\r
296 #define FSNAP   3   // Snapshot for time warp\r
297 #define FBATTAK 4   // Commander attacks base\r
298 #define FCDBAS  5   // Commander destroys base\r
299 #define FSCMOVE 6   // Supercommander moves (might attack base)\r
300 #define FSCDBAS 7   // Supercommander destroys base\r
301 #define FDSPROB 8   // Move deep space probe\r
302 \r
303 #ifdef INCLUDED\r
304 char *device[NDEVICES+1] = {\r
305         "",\r
306         "S. R. Sensors",\r
307         "L. R. Sensors",\r
308         "Phasers",\r
309         "Photon Tubes",\r
310         "Life Support",\r
311         "Warp Engines",\r
312         "Impulse Engines",\r
313         "Shields",\r
314         "Subspace Radio",\r
315         "Shuttle Craft",\r
316         "Computer",\r
317         "Transporter",\r
318         "Shield Control",\r
319     "Death Ray",\r
320     "D. S. Probe"};                                                                     \r
321 #endif\r
322 \r
323 #ifndef TRUE\r
324 #define TRUE (1)\r
325 #define FALSE (0)\r
326 #endif\r
327 \r
328 #define IHR 'R'\r
329 #define IHK 'K'\r
330 #define IHC 'C'\r
331 #define IHS 'S'\r
332 #define IHSTAR '*'\r
333 #define IHP 'P'\r
334 #define IHB 'B'\r
335 #define IHBLANK ' '\r
336 #define IHDOT '.'\r
337 #define IHQUEST '?'\r
338 #define IHE 'E'\r
339 #define IHF 'F'\r
340 #define IHT 'T'\r
341 #define IHWEB '#'\r
342 #define IHGREEN 'G'\r
343 #define IHYELLOW 'Y'\r
344 #define IHRED 'R'\r
345 #define IHDOCKED 'D'\r
346 #define IHDEAD 'Z'\r
347 #define IHMATER0 '-'\r
348 #define IHMATER1 'o'\r
349 #define IHMATER2 '0'\r
350 \r
351 \r
352 /* Function prototypes */\r
353 void prelim(void);\r
354 void attack(int);\r
355 int choose(int);\r
356 void setup(int);\r
357 void score(void);\r
358 void atover(int);\r
359 void srscan(int);\r
360 void lrscan(void);\r
361 void phasers(void);\r
362 void photon(void);\r
363 void warp(int);\r
364 void doshield(int);\r
365 void dock(int);\r
366 void dreprt(void);\r
367 void chart(int);\r
368 void impuls(void);\r
369 void wait(void);\r
370 void setwrp(void);\r
371 void events(void);\r
372 void report(int);\r
373 void eta(void);\r
374 void help(void);\r
375 void abandn(void);\r
376 void finish(FINTYPE);\r
377 void dstrct(void);\r
378 void kaboom(void);\r
379 void freeze(int);\r
380 int thaw(void);\r
381 void plaque(void);\r
382 int scan(void);\r
383 #define IHEOL (0)\r
384 #define IHALPHA (1)\r
385 #define IHREAL (2)\r
386 void chew(void);\r
387 void chew2(void);\r
388 void skip(int);\r
389 void prout(char *, ...);\r
390 void proutn(char *, ...);\r
391 void stars(void);\r
392 void newqad(int);\r
393 int ja(void);\r
394 void cramen(int);\r
395 void crmshp(void);\r
396 char *cramlc(enum loctype, int, int);\r
397 double expran(double);\r
398 double Rand(void);\r
399 void iran8(int *, int *);\r
400 void iran10(int *, int *);\r
401 #define square(i) ((i)*(i))\r
402 void dropin(int, int*, int*);\r
403 void newcnd(void);\r
404 void sortkl(void);\r
405 void imove(void);\r
406 void ram(int, int, int, int);\r
407 void crmena(int, int, int, int, int);\r
408 void deadkl(int, int, int, int, int);\r
409 void timwrp(void);\r
410 void movcom(void);\r
411 void torpedo(double, double, int, int, double *, int);\r
412 void huh(void);\r
413 void pause_game(int);\r
414 void nova(int, int);\r
415 void snova(int, int);\r
416 void scom(int *);\r
417 void hittem(double *);\r
418 void prouts(char *, ...);\r
419 void proutc(char *);\r
420 int isit(char *);\r
421 void preport(void);\r
422 void orbit(void);\r
423 void sensor(void);\r
424 void beam(void);\r
425 void mine(void);\r
426 void usecrystals(void);\r
427 void shuttle(void);\r
428 void deathray(void);\r
429 void debugme(void);\r
430 void attakreport(int);\r
431 void movetho(void);\r
432 void probe(void);\r
433 void clearscreen(void);\r
434 void iostart(int);\r
435 void ioend(void);\r
436 void getline(char *, int);\r
437 void commandhook(char *, int);\r