More merging of SERGEEV changes.
[super-star-trek.git] / setup.c
diff --git a/setup.c b/setup.c
index 002188291aff1dafc53b7b9cf80c1ddf0dfcbca9..55db1d9cbfc2c24554e15c2bf20575f7a5079af6 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -10,7 +10,6 @@ void prelim(void) {
 }\r
 \r
 void freeze(int boss) {\r
-       char *x, *y;\r
        FILE *fp;\r
        int key;\r
        if (boss) {\r
@@ -45,10 +44,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 +55,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 +65,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
@@ -179,16 +178,16 @@ void abandn(void) {
        return;\r
 }\r
        \r
-void setup(void) {\r
+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()) return; // frozen game\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 +206,7 @@ void setup(void) {
        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 +328,7 @@ void setup(void) {
                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 +336,7 @@ void setup(void) {
        }\r
 \r
 //     idate = date;\r
-       skip(3);\r
+       skip(2);\r
        game.state.snap = 0;\r
                \r
        if (skill == 1) {\r
@@ -372,23 +372,27 @@ void setup(void) {
         proutn(cramlc(sector, sectx, secty));\r
        skip(2);\r
        prout("Good Luck!");\r
-       if (game.state.nscrem) proutn("  YOU'LL NEED IT.");\r
-       skip(1);\r
+       if (game.state.nscrem) prout("  YOU'LL NEED IT.");\r
+#ifdef SERGEEV\r
+        getche();\r
+#endif /* SERGEEV */\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
-int choose(void) {\r
+void randomize(void) {\r
+       srand((int)time(NULL));\r
+}\r
+\r
+int choose(int needprompt) {\r
        tourn = 0;\r
        thawed = 0;\r
        skill = 0;\r
        length = 0;\r
        while (TRUE) {\r
-               if (fromcommandline) /* Can start with command line options */\r
-                       fromcommandline = 0;\r
-               else\r
-                       proutn("Would you like a regular, tournament, or frozen game?");\r
+               if (needprompt) /* Can start with command line options */\r
+                   proutn("Would you like a regular, tournament, or frozen game?");\r
                scan();\r
                if (strlen(citem)==0) continue; // Try again\r
                if (isit("tournament")) {\r
@@ -444,9 +448,10 @@ int choose(void) {
                else {\r
                        chew();\r
                        if (length==0) proutn("Would you like a Short, Medium, or Long game? ");\r
-                       else if (skill == 0) proutn("Are you a Novice, Fair, Good, Expert, or Emeritus player?");\r
+                       else if (skill == 0) proutn("Are you a Novice, Fair, Good, Expert, or Emeritus player? ");\r
                }\r
        }\r
+#ifndef SERGEEV\r
        while (TRUE) {\r
                scan();\r
                strcpy(game.passwd, citem);\r
@@ -454,6 +459,10 @@ int choose(void) {
                if (*game.passwd != 0) break;\r
                proutn("Please type in a secret password-");\r
        }\r
+#else\r
+        for(i=0;i<3;i++) game.passwd[i]=(char)(97+(int)(Rand()*25));\r
+        game.passwd[3]=0;\r
+#endif /* SERGEEV */\r
 #ifdef DEBUG\r
        if (strcmp(game.passwd, "debug")==0) idebug = 1;\r
 #endif\r
@@ -491,6 +500,7 @@ void newcnd(void) {
        if (energy < 1000.0) condit = IHYELLOW;\r
        if (game.state.galaxy[quadx][quady] > 99 || game.state.newstuf[quadx][quady] > 9)\r
                condit = IHRED;\r
+        if (!alive) condit=IHDEAD;\r
 }\r
 \r
 \r
@@ -514,6 +524,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
@@ -535,27 +547,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
@@ -580,7 +571,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
@@ -614,7 +605,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
@@ -630,7 +621,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
@@ -639,6 +637,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
@@ -658,7 +684,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