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