Fix some C that gcc tags as unclean or unsafe. Rename 'a' structure to 'game'.
[super-star-trek.git] / setup.c
1 #include <time.h>\r
2 #include "sst.h"\r
3 \r
4 void prelim(void) {\r
5         skip(2);\r
6         prout("-SUPER- STAR TREK");\r
7         skip(1);\r
8         prout("Latest update-21 Sept 78");\r
9         skip(1);\r
10 }\r
11 \r
12 void freeze(int boss) {\r
13         char *x, *y;\r
14         FILE *fp;\r
15         int key;\r
16         if (boss) {\r
17                 strcpy(citem, "emsave.trk");\r
18         }\r
19         else {\r
20                 if ((key = scan()) == IHEOL) {\r
21                         proutn("File name: ");\r
22                         key = scan();\r
23                 }\r
24                 if (key != IHALPHA) {\r
25                         huh();\r
26                         return;\r
27                 }\r
28                 chew();\r
29                 if (strchr(citem, '.') == NULL) {\r
30                         strcat(citem, ".trk");\r
31                 }\r
32         }\r
33         if ((fp = fopen(citem, "wb")) == NULL) {\r
34                 proutn("Can't freeze game as file ");\r
35                 proutn(citem);\r
36                 skip(1);\r
37                 return;\r
38         }\r
39         fwrite(&d, sizeof(d), 1, fp);\r
40         fwrite(&snapsht, sizeof(snapsht), 1, fp);\r
41         fwrite(quad, sizeof(quad), 1, fp);\r
42         fwrite(kx, sizeof(kx), 1, fp);\r
43         fwrite(ky, sizeof(ky), 1, fp);\r
44         fwrite(starch, sizeof(starch), 1, fp);\r
45         fwrite(kpower, sizeof(kpower), 1, fp);\r
46         fwrite(kdist, sizeof(kdist), 1, fp);\r
47         fwrite(kavgd, sizeof(kavgd), 1, fp);\r
48         fwrite(damage, sizeof(damage), 1, fp);\r
49         fwrite(future, sizeof(future), 1, fp);\r
50         fwrite(&game, sizeof(game), 1, fp);\r
51         fwrite(passwd, sizeof(passwd), 1, fp);\r
52 \r
53         fclose(fp);\r
54 \r
55         /* I hope that's enough! */\r
56 }\r
57 \r
58 \r
59 void thaw(void) {\r
60         char *x, *y;\r
61         FILE *fp;\r
62         int key;\r
63 \r
64         passwd[0] = '\0';\r
65         if ((key = scan()) == IHEOL) {\r
66                 proutn("File name: ");\r
67                 key = scan();\r
68         }\r
69         if (key != IHALPHA) {\r
70                 huh();\r
71                 return;\r
72         }\r
73         chew();\r
74         if (strchr(citem, '.') == NULL) {\r
75                 strcat(citem, ".trk");\r
76         }\r
77         if ((fp = fopen(citem, "rb")) == NULL) {\r
78                 proutn("Can't find game file ");\r
79                 proutn(citem);\r
80                 skip(1);\r
81                 return;\r
82         }\r
83         fread(&d, sizeof(d), 1, fp);\r
84         fread(&snapsht, sizeof(snapsht), 1, fp);\r
85         fread(quad, sizeof(quad), 1, fp);\r
86         fread(kx, sizeof(kx), 1, fp);\r
87         fread(ky, sizeof(ky), 1, fp);\r
88         fread(starch, sizeof(starch), 1, fp);\r
89         fread(kpower, sizeof(kpower), 1, fp);\r
90         fread(kdist, sizeof(kdist), 1, fp);\r
91         fread(kavgd, sizeof(kavgd), 1, fp);\r
92         fread(damage, sizeof(damage), 1, fp);\r
93         fread(future, sizeof(future), 1, fp);\r
94         fread(&game, sizeof(game), 1, fp);\r
95         fread(passwd, sizeof(passwd), 1, fp);\r
96 \r
97         fclose(fp);\r
98 \r
99         /* I hope that's enough! */\r
100 }\r
101 \r
102 void abandn(void) {\r
103         int nb, l;\r
104 \r
105         chew();\r
106         if (condit==IHDOCKED) {\r
107                 if (ship!=IHE) {\r
108                         prout("You cannot abandon Ye Faerie Queene.");\r
109                         return;\r
110                 }\r
111         }\r
112         else {\r
113                 /* Must take shuttle craft to exit */\r
114                 if (damage[DSHUTTL]==-1) {\r
115                         prout("Ye Faerie Queene has no shuttle craft.");\r
116                         return;\r
117                 }\r
118                 if (damage[DSHUTTL]<0) {\r
119                         prout("Shuttle craft now serving Big Mac's.");\r
120                         return;\r
121                 }\r
122                 if (damage[DSHUTTL]>0) {\r
123                         prout("Shuttle craft damaged.");\r
124                         return;\r
125                 }\r
126                 if (landed==1) {\r
127                         prout("You must be aboard the Enterprise.");\r
128                         return;\r
129                 }\r
130                 if (iscraft!=1) {\r
131                         prout("Shuttle craft not currently available.");\r
132                         return;\r
133                 }\r
134                 /* Print abandon ship messages */\r
135                 skip(1);\r
136                 prouts("***ABANDON SHIP!  ABANDON SHIP!");\r
137                 skip(1);\r
138                 prouts("***ALL HANDS ABANDON SHIP!");\r
139                 skip(2);\r
140                 prout("Captain and crew escape in shuttle craft.");\r
141                 prout("Remainder of ship's complement beam down");\r
142                 prout("to nearest habitable planet.");\r
143                 if (d.rembase==0) {\r
144                         /* Ops! no place to go... */\r
145                         finish(FABANDN);\r
146                         return;\r
147                 }\r
148                 /* If at least one base left, give 'em the Faerie Queene */\r
149                 skip(1);\r
150                 icrystl = 0; /* crystals are lost */\r
151                 nprobes = 0; /* No probes */\r
152                 prout("You are captured by Klingons and released to");\r
153                 prout("the Federation in a prisoner-of-war exchange.");\r
154                 nb = Rand()*d.rembase+1;\r
155                 /* Set up quadrant and position FQ adjacient to base */\r
156                 if (quadx!=d.baseqx[nb] || quady!=d.baseqy[nb]) {\r
157                         quadx = d.baseqx[nb];\r
158                         quady = d.baseqy[nb];\r
159                         sectx = secty = 5;\r
160                         newqad(1);\r
161                 }\r
162                 for (;;) {\r
163                         /* position next to base by trial and error */\r
164                         quad[sectx][secty] = IHDOT;\r
165                         for (l = 1; l <= 10; l++) {\r
166                                 sectx = 3.0*Rand() - 1.0 + basex;\r
167                                 secty = 3.0*Rand() - 1.0 + basey;\r
168                                 if (sectx >= 1 && sectx <= 10 &&\r
169                                         secty >= 1 && secty <= 10 &&\r
170                                         quad[sectx][secty] == IHDOT) break;\r
171                         }\r
172                         if (l < 11) break; /* found a spot */\r
173                         sectx=5;\r
174                         secty=5;\r
175                         newqad(1);\r
176                 }\r
177         }\r
178         /* Get new commission */\r
179         quad[sectx][secty] = ship = IHF;\r
180         prout("Starfleet puts you in command of another ship,");\r
181         prout("the Faerie Queene, which is antiquated but,");\r
182         prout("still useable.");\r
183         if (icrystl!=0) prout("The dilithium crystals have been moved.");\r
184         imine=0;\r
185         iscraft=0; /* Gallileo disappears */\r
186         /* Resupply ship */\r
187         condit=IHDOCKED;\r
188         for (l = 1; l <= ndevice; l++) damage[l] = 0.0;\r
189         damage[DSHUTTL] = -1;\r
190         energy = inenrg = 3000.0;\r
191         shield = inshld = 1250.0;\r
192         torps = intorps = 6;\r
193         lsupres=inlsr=3.0;\r
194         shldup=0;\r
195         warpfac=5.0;\r
196         wfacsq=25.0;\r
197         return;\r
198 }\r
199         \r
200 void setup(void) {\r
201         int i,j, krem, klumper;\r
202         int ix, iy;\r
203         alldone = gamewon = 0;\r
204 #ifdef DEBUG\r
205         idebug = 0;\r
206 #endif\r
207         //  Decide how many of everything\r
208         if (choose()) return; // frozen game\r
209         // Prepare the Enterprise\r
210         ship = IHE;\r
211         energy = inenrg = 5000.0;\r
212         shield = inshld = 2500.0;\r
213         shldchg = shldup = 0;\r
214         inlsr = 4.0;\r
215         lsupres = 4.0;\r
216         iran8(&quadx, &quady);\r
217         iran10(&sectx, &secty);\r
218         torps = intorps = 10;\r
219         nprobes = (int)(3.0*Rand() + 2.0);      /* Give them 2-4 of these wonders */\r
220         warpfac = 5.0;\r
221         wfacsq = warpfac * warpfac;\r
222         for (i=0; i <= ndevice; i++) damage[i] = 0.0;\r
223         // Set up assorted game parameters\r
224         batx = baty = 0;\r
225         d.date = indate = 100.0*(int)(31.0*Rand()+20.0);\r
226         d.killk = d.killc = nkinks = nhelp = resting = casual = d.nromkl = 0;\r
227         isatb = iscate = imine = icrystl = icraft = d.nsckill = d.nplankl = 0;\r
228         iscraft = 1;\r
229         landed = -1;\r
230         alive = 1;\r
231         docfac = 0.25;\r
232         for (i = 1; i <= 8; i++)\r
233                 for (j = 1; j <= 8; j++) d.newstuf[i][j] = starch[i][j] = 0;\r
234         // Initialize times for extraneous events\r
235         future[FSNOVA] = d.date + expran(0.5 * intime);\r
236         future[FTBEAM] = d.date + expran(1.5 * (intime / d.remcom));\r
237         future[FSNAP] = d.date + 1.0 + Rand(); // Force an early snapshot\r
238         future[FBATTAK] = d.date + expran(0.3*intime);\r
239         future[FCDBAS] = 1e30;\r
240         future[FSCMOVE] = d.nscrem ? d.date+0.2777 : 1e30;\r
241         future[FSCDBAS] = 1e30;\r
242         future[FDSPROB] = 1e30;\r
243         // Starchart is functional\r
244         stdamtim = 1e30;\r
245         // Put stars in the galaxy\r
246         instar = 0;\r
247         for (i=1; i<=8; i++)\r
248                 for (j=1; j<=8; j++) {\r
249                         int k = Rand()*9.0 + 1.0;\r
250                         instar += k;\r
251                         d.galaxy[i][j] = k;\r
252                 }\r
253         // Locate star bases in galaxy\r
254         for (i = 1; i <= inbase; i++) {\r
255                 int contflag;\r
256                 do {\r
257                         do iran8(&ix, &iy);\r
258                         while (d.galaxy[ix][iy] >= 10);\r
259                         contflag = FALSE;\r
260                         for (j = i-1; j > 0; j--) {\r
261                                 /* Improved placement algorithm to spread out bases */\r
262                                 double distq = square(ix-d.baseqx[j]) + square(iy-d.baseqy[j]);\r
263                                 if (distq < 6.0*(6-inbase) && Rand() < 0.75) {\r
264                                         contflag = TRUE;\r
265 #ifdef DEBUG\r
266                                         printf("DEBUG: Abandoning base #%d at %d-%d\n", i, ix, iy);\r
267 #endif\r
268                                         break;\r
269                                 }\r
270 #ifdef DEBUG\r
271                                 else if (distq < 6.0 * (6-inbase)) {\r
272                                         printf("DEBUG: saving base #%d, close to #%d\n", i, j);\r
273                                 }\r
274 #endif\r
275                         }\r
276                 } while (contflag);\r
277                         \r
278                 d.baseqx[i] = ix;\r
279                 d.baseqy[i] = iy;\r
280                 starch[ix][iy] = -1;\r
281                 d.galaxy[ix][iy] += 10;\r
282         }\r
283         // Position ordinary Klingon Battle Cruisers\r
284         krem = inkling - incom - d.nscrem;\r
285         klumper = 0.25*skill*(9.0-length)+1.0;\r
286         if (klumper > 9) klumper = 9; // Can't have more than 9 in quadrant\r
287         do {\r
288                 double r = Rand();\r
289                 int klump = (1.0 - r*r)*klumper;\r
290                 if (klump > krem) klump = krem;\r
291                 krem -= klump;\r
292                 klump *= 100;\r
293                 do iran8(&ix, &iy);\r
294                 while (d.galaxy[ix][iy] + klump >= 1000);\r
295                 d.galaxy[ix][iy] += klump;\r
296         } while (krem > 0);\r
297         // Position Klingon Commander Ships\r
298 #ifdef DEBUG\r
299         klumper = 1;\r
300 #endif\r
301         for (i = 1; i <= incom; i++) {\r
302                 do {\r
303                         do { /* IF debugging, put commanders by bases, always! */\r
304 #ifdef DEBUG\r
305                                 if (idebug && klumper <= inbase) {\r
306                                         ix = d.baseqx[klumper];\r
307                                         iy = d.baseqy[klumper];\r
308                                         klumper++;\r
309                                 }\r
310                                 else\r
311 #endif\r
312                                         iran8(&ix, &iy);\r
313                         }\r
314                         while ((d.galaxy[ix][iy] < 99 && Rand() < 0.75)||\r
315                                    d.galaxy[ix][iy]>899);\r
316                         // check for duplicate\r
317                         for (j = 1; j < i; j++)\r
318                                 if (d.cx[j]==ix && d.cy[j]==iy) break;\r
319                 } while (j < i);\r
320                 d.galaxy[ix][iy] += 100;\r
321                 d.cx[i] = ix;\r
322                 d.cy[i] = iy;\r
323         }\r
324         // Locate planets in galaxy\r
325         for (i = 1; i <= inplan; i++) {\r
326                 do iran8(&ix, &iy);\r
327                 while (d.newstuf[ix][iy] > 0);\r
328                 d.newstuf[ix][iy] = 1;\r
329                 d.plnets[i].x = ix;\r
330                 d.plnets[i].y = iy;\r
331                 d.plnets[i].pclass = Rand()*3.0 + 1.0; // Planet class M N or O\r
332                 d.plnets[i].crystals = 1.5*Rand();              // 1 in 3 chance of crystals\r
333                 d.plnets[i].known = 0;\r
334         }\r
335         // Locate Romulans\r
336         for (i = 1; i <= d.nromrem; i++) {\r
337                 iran8(&ix, &iy);\r
338                 d.newstuf[ix][iy] += 10;\r
339         }\r
340         // Locate the Super Commander\r
341         if (d.nscrem > 0) {\r
342                 do iran8(&ix, &iy);\r
343                 while (d.galaxy[ix][iy] >= 900);\r
344                 d.isx = ix;\r
345                 d.isy = iy;\r
346                 d.galaxy[ix][iy] += 100;\r
347         }\r
348         // Place thing (in tournament game, thingx == -1, don't want one!)\r
349         if (Rand() < 0.1 && thingx != -1) {\r
350                 iran8(&thingx, &thingy);\r
351         }\r
352         else {\r
353                 thingx = thingy = 0;\r
354         }\r
355 \r
356 //      idate = date;\r
357         skip(3);\r
358         d.snap = 0;\r
359                 \r
360         if (skill == 1) {\r
361                 printf("It is stardate %d. The Federation is being attacked by\n",\r
362                            (int)d.date);\r
363                 printf("a deadly Klingon invasion force. As captain of the United\n"\r
364                            "Starship U.S.S. Enterprise, it is your mission to seek out\n"\r
365                            "and destroy this invasion force of %d battle cruisers.\n",\r
366                            inkling);\r
367                 printf("You have an initial allotment of %d stardates to complete\n"\r
368                            "your mission.  As you proceed you may be given more time.\n\n"\r
369                            "You will have %d supporting starbases.\n"\r
370                            "Starbase locations-  ",\r
371                            (int)intime, inbase);\r
372         }\r
373         else {\r
374                 printf("Stardate %d.\n\n"\r
375                            "%d Klingons.\nAn unknown number of Romulans\n",\r
376                            (int)d.date, inkling);\r
377                 if (d.nscrem) printf("and one (GULP) Super-Commander.\n");\r
378                 printf("%d stardates\n%d starbases in  ",(int)intime, inbase);\r
379         }\r
380         for (i = 1; i <= inbase; i++) {\r
381                 cramlc(0, d.baseqx[i], d.baseqy[i]);\r
382                 if (i < inbase) proutn("  ");\r
383         }\r
384         skip(2);\r
385         proutn("The Enterprise is currently in");\r
386         cramlc(1, quadx, quady);\r
387         proutn(" ");\r
388         cramlc(2, sectx, secty);\r
389         skip(2);\r
390         prout("Good Luck!");\r
391         if (d.nscrem) proutn("  YOU'LL NEED IT.");\r
392         skip(1);\r
393         newqad(0);\r
394         if (nenhere) shldup=1.0;\r
395         if (neutz) attack(0);   // bad luck to start in a Romulan Neutral Zone\r
396 }\r
397 \r
398 int choose(void) {\r
399         tourn = 0;\r
400         thawed = 0;\r
401         skill = 0;\r
402         length = 0;\r
403         while (TRUE) {\r
404                 if (fromcommandline) /* Can start with command line options */\r
405                         fromcommandline = 0;\r
406                 else\r
407                         proutn("Would you like a regular, tournament, or frozen game?");\r
408                 scan();\r
409                 if (strlen(citem)==0) continue; // Try again\r
410                 if (isit("tournament")) {\r
411                         while (scan() == IHEOL) {\r
412                                 proutn("Type in tournament number-");\r
413                         }\r
414                         if (aaitem == 0) {\r
415                                 chew();\r
416                                 continue; // We don't want a blank entry\r
417                         }\r
418                         tourn = (int)aaitem;\r
419                         thingx = -1;\r
420                         srand((unsigned int)(int)aaitem);\r
421                         break;\r
422                 }\r
423                 if (isit("frozen")) {\r
424                         thaw();\r
425                         chew();\r
426                         if (*passwd==0) continue;\r
427                         randomize();\r
428                         Rand(); Rand(); Rand(); Rand();\r
429                         if (!alldone) thawed = 1; // No plaque if not finished\r
430                         report(1);\r
431                         return TRUE;\r
432                 }\r
433                 if (isit("regular")) {\r
434                         skip(2);\r
435                         randomize();\r
436                         Rand(); Rand(); Rand(); Rand();\r
437                         break;\r
438                 }\r
439                 proutn("What is \"");\r
440                 proutn(citem);\r
441                 prout("\"?");\r
442                 chew();\r
443         }\r
444         while (length==0 || skill==0) {\r
445                 if (scan() == IHALPHA) {\r
446                         if (isit("short")) length = 1;\r
447                         else if (isit("medium")) length = 2;\r
448                         else if (isit("long")) length = 4;\r
449                         else if (isit("novice")) skill = 1;\r
450                         else if (isit("fair")) skill = 2;\r
451                         else if (isit("good")) skill = 3;\r
452                         else if (isit("expert")) skill = 4;\r
453                         else if (isit("emeritus")) skill = 5;\r
454                         else {\r
455                                 proutn("What is \"");\r
456                                 proutn(citem);\r
457                                 prout("\"?");\r
458                         }\r
459                 }\r
460                 else {\r
461                         chew();\r
462                         if (length==0) proutn("Would you like a Short, Medium, or Long game? ");\r
463                         else if (skill == 0) proutn("Are you a Novice, Fair, Good, Expert, or Emeritus player?");\r
464                 }\r
465         }\r
466         while (TRUE) {\r
467                 scan();\r
468                 strcpy(passwd, citem);\r
469                 chew();\r
470                 if (*passwd != 0) break;\r
471                 proutn("Please type in a secret password-");\r
472         }\r
473 #ifdef DEBUG\r
474         if (strcmp(passwd, "debug")==0) idebug = 1;\r
475 #endif\r
476 \r
477         // Use parameters to generate initial values of things\r
478         damfac = 0.5 * skill;\r
479         d.rembase = 3.0*Rand()+2.0;\r
480         inbase = d.rembase;\r
481         inplan = (PLNETMAX/2) + (PLNETMAX/2+1)*Rand();\r
482         d.nromrem = (2.0+Rand())*skill;\r
483         d.nscrem = (skill > 2? 1 : 0);\r
484         d.remtime = 7.0 * length;\r
485         intime = d.remtime;\r
486         d.remkl = 2.0*intime*((skill+1 - 2*Rand())*skill*0.1+.15);\r
487         inkling = d.remkl;\r
488         incom = skill + 0.0625*inkling*Rand();\r
489         d.remcom= min(10, incom);\r
490         incom = d.remcom;\r
491         d.remres = (inkling+4*incom)*intime;\r
492         inresor = d.remres;\r
493         if (inkling > 50) {\r
494                 inbase = (d.rembase += 1);\r
495         }\r
496         return FALSE;\r
497 }\r
498 \r
499 void dropin(int iquad, int *ix, int *iy) {\r
500         do iran10(ix, iy);\r
501         while (quad[*ix][*iy] != IHDOT);\r
502         quad[*ix][*iy] = iquad;\r
503 }\r
504 \r
505 void newcnd(void) {\r
506         condit = IHGREEN;\r
507         if (energy < 1000.0) condit = IHYELLOW;\r
508         if (d.galaxy[quadx][quady] > 99 || d.newstuf[quadx][quady] > 9)\r
509                 condit = IHRED;\r
510 }\r
511 \r
512 \r
513 void newqad(int shutup) {\r
514         int quadnum = d.galaxy[quadx][quady];\r
515         int newnum = d.newstuf[quadx][quady];\r
516         int i, j, ix, iy, nplan;\r
517 \r
518         iattak = 1;\r
519         justin = 1;\r
520         basex = basey = 0;\r
521         klhere = 0;\r
522         comhere = 0;\r
523         plnetx = plnety = 0;\r
524         ishere = 0;\r
525         irhere = 0;\r
526         iplnet = 0;\r
527         nenhere = 0;\r
528         neutz = 0;\r
529         inorbit = 0;\r
530         landed = -1;\r
531         ientesc = 0;\r
532         ithere = 0;\r
533         iseenit = 0;\r
534         if (iscate) {\r
535                 // Attempt to escape Super-commander, so tbeam back!\r
536                 iscate = 0;\r
537                 ientesc = 1;\r
538         }\r
539         // Clear quadrant\r
540         for (i=1; i <= 10; i++)\r
541                 for (j=1; j <= 10; j++) quad[i][j] = IHDOT;\r
542         // cope with supernova\r
543         if (quadnum > 999) {\r
544                 return;\r
545         }\r
546         klhere = quadnum/100;\r
547         irhere = newnum/10;\r
548         nplan = newnum%10;\r
549         nenhere = klhere + irhere;\r
550 \r
551         // Position Starship\r
552         quad[sectx][secty] = ship;\r
553 \r
554         // Decide if quadrant needs a Tholian\r
555         if ((skill < 3 && Rand() <= 0.02) ||   /* Lighten up if skill is low */\r
556                 (skill == 3 && Rand() <= 0.05) ||\r
557                 (skill > 3 && Rand() <= 0.08)\r
558 #ifdef DEBUG\r
559                 || strcmp(passwd, "tholianx")==0\r
560 #endif\r
561                 ) {\r
562                 do {\r
563                         ithx = Rand() > 0.5 ? 10 : 1;\r
564                         ithy = Rand() > 0.5 ? 10 : 1;\r
565                 } while (quad[ithx][ithy] != IHDOT);\r
566                 quad[ithx][ithy] = IHT;\r
567                 ithere = 1;\r
568                 /* Reserve unocupied corners */\r
569                 if (quad[1][1]==IHDOT) quad[1][1] = 'X';\r
570                 if (quad[1][10]==IHDOT) quad[1][10] = 'X';\r
571                 if (quad[10][1]==IHDOT) quad[10][1] = 'X';\r
572                 if (quad[10][10]==IHDOT) quad[10][10] = 'X';\r
573         }\r
574 \r
575         if (quadnum >= 100) {\r
576                 // Position ordinary Klingons\r
577                 quadnum -= 100*klhere;\r
578                 for (i = 1; i <= klhere; i++) {\r
579                         dropin(IHK, &ix, &iy);\r
580                         kx[i] = ix;\r
581                         ky[i] = iy;\r
582                         kdist[i] = kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));\r
583                         kpower[i] = Rand()*150.0 +300.0 +25.0*skill;\r
584                 }\r
585                 // If we need a commander, promote a Klingon\r
586                 for (i = 1; i <= d.remcom ; i++) \r
587                         if (d.cx[i]==quadx && d.cy[i]==quady) break;\r
588                         \r
589                 if (i <= d.remcom) {\r
590                         quad[ix][iy] = IHC;\r
591                         kpower[klhere] = 950.0+400.0*Rand()+50.0*skill;\r
592                         comhere = 1;\r
593                 }\r
594 \r
595                 // If we need a super-commander, promote a Klingon\r
596                 if (quadx == d.isx && quady == d.isy) {\r
597                         quad[kx[1]][ky[1]] = IHS;\r
598                         kpower[1] = 1175.0 + 400.0*Rand() + 125.0*skill;\r
599                         iscate = 1;\r
600                         ishere = 1;\r
601                 }\r
602         }\r
603         // Put in Romulans if needed\r
604         for (i = klhere+1; i <= nenhere; i++) {\r
605                 dropin(IHR, &ix, &iy);\r
606                 kx[i] = ix;\r
607                 ky[i] = iy;\r
608                 kdist[i] = kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));\r
609                 kpower[i] = Rand()*400.0 + 450.0 + 50.0*skill;\r
610         }\r
611         sortkl();\r
612         // If quadrant needs a starbase, put it in\r
613         if (quadnum >= 10) {\r
614                 quadnum -= 10;\r
615                 dropin(IHB, &basex, &basey);\r
616         }\r
617         \r
618         if (nplan) {\r
619                 // If quadrant needs a planet, put it in\r
620                 for (i=1; i <= inplan; i++)\r
621                         if (d.plnets[i].x == quadx && d.plnets[i].y == quady) break;\r
622                 if (i <= inplan) {\r
623                         iplnet = i;\r
624                         dropin(IHP, &plnetx, &plnety);\r
625                 }\r
626         }\r
627         // Check for condition\r
628         newcnd();\r
629         // And finally the stars\r
630         for (i = 1; i <= quadnum; i++) dropin(IHSTAR, &ix, &iy);\r
631 \r
632         // Check for RNZ\r
633         if (irhere > 0 && klhere == 0 && basex == 0) {\r
634                 neutz = 1;\r
635                 if (damage[DRADIO] <= 0.0) {\r
636                         skip(1);\r
637                         prout("LT. Uhura- \"Captain, an urgent message.");\r
638                         prout("  I'll put it on audio.\"  CLICK");\r
639                         skip(1);\r
640                         prout("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE.");\r
641                         prout("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!");\r
642                 }\r
643         }\r
644 \r
645         if (shutup==0) {\r
646                 // Put in THING if needed\r
647                 if (thingx == quadx && thingy == quady) {\r
648                         dropin(IHQUEST, &ix, &iy);\r
649                         thingx = thingy = 0; // Transient\r
650                         if (damage[DSRSENS] == 0.0) {\r
651                                 skip(1);\r
652                                 prout("MR. SPOCK- \"Captain, this is most unusual.");\r
653                                 prout("    Please examine your short-range scan.\"");\r
654                         }\r
655                 }\r
656         }\r
657 \r
658         // Put in a few black holes\r
659         for (i = 1; i <= 3; i++)\r
660                 if (Rand() > 0.5) dropin(IHBLANK, &ix, &iy);\r
661 \r
662         // Take out X's in corners if Tholian present\r
663         if (ithere) {\r
664                 if (quad[1][1]=='X') quad[1][1] = IHDOT;\r
665                 if (quad[1][10]=='X') quad[1][10] = IHDOT;\r
666                 if (quad[10][1]=='X') quad[10][1] = IHDOT;\r
667                 if (quad[10][10]=='X') quad[10][10] = IHDOT;\r
668         }               \r
669 }\r
670 \r
671 void sortkl(void) {\r
672         double t;\r
673         int sw, j, k;\r
674 \r
675         // The author liked bubble sort. So we will use it. :-(\r
676 \r
677         if (nenhere < 2) return;\r
678 \r
679         do {\r
680                 sw = FALSE;\r
681                 for (j = 1; j < nenhere; j++)\r
682                         if (kdist[j] > kdist[j+1]) {\r
683                                 sw = TRUE;\r
684                                 t = kdist[j];\r
685                                 kdist[j] = kdist[j+1];\r
686                                 kdist[j+1] = t;\r
687                                 t = kavgd[j];\r
688                                 kavgd[j] = kavgd[j+1];\r
689                                 kavgd[j+1] = t;\r
690                                 k = kx[j];\r
691                                 kx[j] = kx[j+1];\r
692                                 kx[j+1] = k;\r
693                                 k = ky[j];\r
694                                 ky[j] = ky[j+1];\r
695                                 ky[j+1] = k;\r
696                                 t = kpower[j];\r
697                                 kpower[j] = kpower[j+1];\r
698                                 kpower[j+1] = t;\r
699                         }\r
700         } while (sw);\r
701 }\r