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