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