First round of changes from Stas Sergeev.
[super-star-trek.git] / setup.c
diff --git a/setup.c b/setup.c
index 649774487639b56d45ab29ebd98570cf51b849f8..1d7dd0153679b77abc4e5d21520c216fb44bb48e 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -45,10 +45,9 @@ void freeze(int boss) {
 }\r
 \r
 \r
-void thaw(void) {\r
-       char *x, *y;\r
+int thaw(void) {\r
        FILE *fp;\r
-       int key;\r
+        int key;\r
 \r
        game.passwd[0] = '\0';\r
        if ((key = scan()) == IHEOL) {\r
@@ -57,7 +56,7 @@ void thaw(void) {
        }\r
        if (key != IHALPHA) {\r
                huh();\r
-               return;\r
+               return 1;\r
        }\r
        chew();\r
        if (strchr(citem, '.') == NULL) {\r
@@ -67,18 +66,19 @@ void thaw(void) {
                proutn("Can't find game file ");\r
                proutn(citem);\r
                skip(1);\r
-               return;\r
+               return 1;\r
        }\r
        fread(&game, sizeof(game), 1, fp);\r
        if (strcmp(game.magic, SSTMAGIC)) {\r
                prout("Game file format is bad, should begin with " SSTMAGIC);\r
                skip(1);\r
-               return;\r
+               fclose(fp);\r
+               return 1;\r
        }\r
 \r
        fclose(fp);\r
 \r
-       /* I hope that's enough! */\r
+        return 0;\r
 }\r
 \r
 void abandn(void) {\r
@@ -182,13 +182,13 @@ void abandn(void) {
 void setup(int needprompt) {\r
        int i,j, krem, klumper;\r
        int ix, iy;\r
-       alldone = gamewon = 0;\r
 #ifdef DEBUG\r
        idebug = 0;\r
 #endif\r
        //  Decide how many of everything\r
        if (choose(needprompt)) return; // frozen game\r
        // Prepare the Enterprise\r
+        alldone = gamewon = 0;\r
        ship = IHE;\r
        energy = inenrg = 5000.0;\r
        shield = inshld = 2500.0;\r
@@ -207,6 +207,7 @@ void setup(int needprompt) {
        game.state.date = indate = 100.0*(int)(31.0*Rand()+20.0);\r
        game.state.killk = game.state.killc = nkinks = nhelp = resting = casual = game.state.nromkl = 0;\r
        isatb = iscate = imine = icrystl = icraft = game.state.nsckill = game.state.nplankl = 0;\r
+        game.state.starkl = game.state.basekl = 0;\r
        iscraft = 1;\r
        landed = -1;\r
        alive = 1;\r
@@ -328,7 +329,7 @@ void setup(int needprompt) {
                game.state.galaxy[ix][iy] += 100;\r
        }\r
        // Place thing (in tournament game, thingx == -1, don't want one!)\r
-       if (Rand() < 0.1 && thingx != -1) {\r
+       if (thingx != -1) {\r
                iran8(&thingx, &thingy);\r
        }\r
        else {\r
@@ -336,7 +337,7 @@ void setup(int needprompt) {
        }\r
 \r
 //     idate = date;\r
-       skip(3);\r
+       skip(2);\r
        game.state.snap = 0;\r
                \r
        if (skill == 1) {\r
@@ -374,7 +375,7 @@ void setup(int needprompt) {
        prout("Good Luck!");\r
        if (game.state.nscrem) prout("  YOU'LL NEED IT.");\r
        newqad(0);\r
-       if (nenhere) shldup=1.0;\r
+        if (nenhere-iqhere-ithere) shldup=1.0;\r
        if (neutz) attack(0);   // bad luck to start in a Romulan Neutral Zone\r
 }\r
 \r
@@ -515,6 +516,8 @@ void newqad(int shutup) {
        landed = -1;\r
        ientesc = 0;\r
        ithere = 0;\r
+        iqhere=0;\r
+        iqengry=0;\r
        iseenit = 0;\r
        if (iscate) {\r
                // Attempt to escape Super-commander, so tbeam back!\r
@@ -536,27 +539,6 @@ void newqad(int shutup) {
        // Position Starship\r
        game.quad[sectx][secty] = ship;\r
 \r
-       // Decide if quadrant needs a Tholian\r
-       if ((skill < 3 && Rand() <= 0.02) ||   /* Lighten up if skill is low */\r
-               (skill == 3 && Rand() <= 0.05) ||\r
-               (skill > 3 && Rand() <= 0.08)\r
-#ifdef DEBUG\r
-               || strcmp(game.passwd, "tholianx")==0\r
-#endif\r
-               ) {\r
-               do {\r
-                       ithx = Rand() > 0.5 ? 10 : 1;\r
-                       ithy = Rand() > 0.5 ? 10 : 1;\r
-               } while (game.quad[ithx][ithy] != IHDOT);\r
-               game.quad[ithx][ithy] = IHT;\r
-               ithere = 1;\r
-               /* Reserve unocupied corners */\r
-               if (game.quad[1][1]==IHDOT) game.quad[1][1] = 'X';\r
-               if (game.quad[1][10]==IHDOT) game.quad[1][10] = 'X';\r
-               if (game.quad[10][1]==IHDOT) game.quad[10][1] = 'X';\r
-               if (game.quad[10][10]==IHDOT) game.quad[10][10] = 'X';\r
-       }\r
-\r
        if (quadnum >= 100) {\r
                // Position ordinary Klingons\r
                quadnum -= 100*klhere;\r
@@ -581,7 +563,7 @@ void newqad(int shutup) {
                if (quadx == game.state.isx && quady == game.state.isy) {\r
                        game.quad[game.kx[1]][game.ky[1]] = IHS;\r
                        game.kpower[1] = 1175.0 + 400.0*Rand() + 125.0*skill;\r
-                       iscate = 1;\r
+                        iscate = game.state.remkl>1;\r
                        ishere = 1;\r
                }\r
        }\r
@@ -615,7 +597,7 @@ void newqad(int shutup) {
        for (i = 1; i <= quadnum; i++) dropin(IHSTAR, &ix, &iy);\r
 \r
        // Check for RNZ\r
-       if (irhere > 0 && klhere == 0 && basex == 0) {\r
+       if (irhere > 0 && klhere == 0) {\r
                neutz = 1;\r
                if (game.damage[DRADIO] <= 0.0) {\r
                        skip(1);\r
@@ -631,7 +613,14 @@ void newqad(int shutup) {
                // Put in THING if needed\r
                if (thingx == quadx && thingy == quady) {\r
                        dropin(IHQUEST, &ix, &iy);\r
-                       thingx = thingy = 0; // Transient\r
+                        iran8(&thingx, &thingy);\r
+                        nenhere++;\r
+                        iqhere=1;\r
+                        game.kx[nenhere] = ix;\r
+                        game.ky[nenhere] = iy;\r
+                        game.kdist[nenhere] = game.kavgd[nenhere] =\r
+                           sqrt(square(sectx-ix) + square(secty-iy));\r
+                        game.kpower[nenhere] = Rand()*6000.0 +500.0 +250.0*skill;\r
                        if (game.damage[DSRSENS] == 0.0) {\r
                                skip(1);\r
                                prout("MR. SPOCK- \"Captain, this is most unusual.");\r
@@ -640,6 +629,34 @@ void newqad(int shutup) {
                }\r
        }\r
 \r
+        // Decide if quadrant needs a Tholian\r
+        if ((skill < 3 && Rand() <= 0.02) ||   /* Lighten up if skill is low */\r
+                (skill == 3 && Rand() <= 0.05) ||\r
+                (skill > 3 && Rand() <= 0.08)\r
+#ifdef DEBUG\r
+                || strcmp(passwd, "tholianx")==0\r
+#endif\r
+                ) {\r
+                do {\r
+                        ithx = Rand() > 0.5 ? 10 : 1;\r
+                        ithy = Rand() > 0.5 ? 10 : 1;\r
+                } while (game.quad[ithx][ithy] != IHDOT);\r
+                game.quad[ithx][ithy] = IHT;\r
+                ithere = 1;\r
+                nenhere++;\r
+                game.kx[nenhere] = ithx;\r
+                game.ky[nenhere] = ithy;\r
+                game.kdist[nenhere] = game.kavgd[nenhere] =\r
+                   sqrt(square(sectx-ithx) + square(secty-ithy));\r
+                game.kpower[nenhere] = Rand()*400.0 +100.0 +25.0*skill;\r
+                /* Reserve unocupied corners */\r
+                if (game.quad[1][1]==IHDOT) game.quad[1][1] = 'X';\r
+                if (game.quad[1][10]==IHDOT) game.quad[1][10] = 'X';\r
+                if (game.quad[10][1]==IHDOT) game.quad[10][1] = 'X';\r
+                if (game.quad[10][10]==IHDOT) game.quad[10][10] = 'X';\r
+        }\r
+        sortkl();\r
+\r
        // Put in a few black holes\r
        for (i = 1; i <= 3; i++)\r
                if (Rand() > 0.5) dropin(IHBLANK, &ix, &iy);\r
@@ -659,7 +676,7 @@ void sortkl(void) {
 \r
        // The author liked bubble sort. So we will use it. :-(\r
 \r
-       if (nenhere < 2) return;\r
+        if (nenhere-iqhere-ithere < 2) return;\r
 \r
        do {\r
                sw = FALSE;\r