]> git.pond.sub.org Git - empserver/blobdiff - src/util/fairland.c
Update copyright notice.
[empserver] / src / util / fairland.c
index a00c08a1489e259f276a86e6dd935a84f69fe32c..58ad7c563791eff5c005143820c6880aab088864 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2005, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2007, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                           Ken Stevens, Steve McClure
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,9 +19,9 @@
  *
  *  ---
  *
- *  See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- *  related information and legal notices. It is expected that any future
- *  projects/authors will amend these files as needed.
+ *  See files README, COPYING and CREDITS in the root of the source
+ *  tree for related information and legal notices.  It is expected
+ *  that future projects/authors will amend these files as needed.
  *
  *  ---
  *
@@ -32,6 +32,8 @@
  *     Steve McClure, 1998
  */
 
+#include <config.h>
+
 /* define ORE 1 to add resources, define ORE 0 if you want to use another
    program to add the resources */
 static int ORE = 1;
@@ -66,21 +68,23 @@ static int quiet = 0;
 
 #if defined(_WIN32)
 #include "../lib/gen/getopt.h"
+#else
+#include <unistd.h>
 #endif
 
 #include <errno.h>
 #include <stdarg.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <fcntl.h>
+#include "file.h"
 #include "misc.h"
-#include "power.h"
 #include "nat.h"
-#include "sect.h"
-#include "file.h"
-#include "xy.h"
 #include "optlist.h"
+#include "power.h"
 #include "prototypes.h"
+#include "sect.h"
+#include "version.h"
+#include "xy.h"
 
 /* do not change these 4 defines */
 #define LANDMIN                1       /* plate altitude for normal land */
@@ -122,9 +126,6 @@ static char *program_name;
 
 #define new_x(newx) (((newx) + WORLD_X) % WORLD_X)
 #define new_y(newy) (((newy) + WORLD_Y) % WORLD_Y)
-#if !defined(_WIN32)
-#define max(a,b) (a>b?a:b)
-#endif
 #define rnd(x) (random() % (x))
 
 int secs;                      /* number of sectors grown */
@@ -174,10 +175,8 @@ static int write_newcap_script(void);
 static int stable(void);
 static void elevate_land(void);
 static void elevate_sea(void);
-static void translate_continents(void);
 static int map_symbol(int x, int y);
-static void fl_sct_init(coord x, coord y, s_char *ptr,
-                       time_t timestamp);
+static void fl_sct_init(coord, coord, struct sctstr *, time_t timestamp);
 static void set_coastal_flags(void);
 
 static void print_vars(void);
@@ -199,32 +198,35 @@ main(int argc, char *argv[])
     program_name = argv[0];
     rnd_seed = time(NULL);
 
-    while ((opt = getopt(argc, argv, "ae:hioqs:R:")) != EOF) {
+    while ((opt = getopt(argc, argv, "ae:hioqR:s:v")) != EOF) {
        switch (opt) {
        case 'a':
            AIRPORT_MARKER = 1;
            break;
-       case 'i':
-           DISTINCT_ISLANDS = 0;
-           break;
        case 'e':
            config_file = optarg;
            break;
+       case 'i':
+           DISTINCT_ISLANDS = 0;
+           break;
        case 'o':
            ORE = 0;
            break;
        case 'q':
            quiet = 1;
            break;
-       case 's':
-           outfile = optarg;
-           break;
        case 'R':
            rnd_seed = strtoul(optarg, NULL, 10);
            break;
+       case 's':
+           outfile = optarg;
+           break;
        case 'h':
            usage();
-           return 0;
+           exit(0);
+       case 'v':
+           printf("%s\n\n%s", version, legal);
+           exit(0);
        default:
            help(NULL);
            exit(1);
@@ -316,24 +318,25 @@ help(char *complaint)
 static void
 usage(void)
 {
-    printf("Usage: %s [-e CONFIG] [-aiqo] [-s SCRIPT] [-R SEED] NC SC [NI] [IS] [SP] [PM] [DI] [ID]\n"
-          "  -q            quiet\n"
-          "  -o            don't set resources\n"
-          "  -a            airport marker for continents\n"
-          "  -i            islands may merge\n"
-          "  -R SEED       seed for random number generator\n"
-          "  -e CONFIG     configuration file\n"
-          "  -s SCRIPT     name of script to create (default %s)\n"
-          "  NC            number of continents\n"
-          "  SC            continent size\n"
-          "  NI            number of islands (default NC)\n"
-          "  IS            average island size (default SC/2)\n"
-          "  SP            spike percentage: 0 = round, 100 = snake\n"
-          "                (default = %d)\n"
-          "  PM            percentage of land that is mountain (default %d)\n"
-          "  DI            minimum distance between continents (default %d)\n"
-          "  ID            minimum distance from islands to continents (default %d)\n",
-          program_name, DEFAULT_OUTFILE_NAME,
+    printf("Usage: %s [OPTION]... NC SC [NI] [IS] [SP] [PM] [DI] [ID]\n"
+          "  -a              airport marker for continents\n"
+          "  -e CONFIG-FILE  configuration file\n"
+          "                  (default %s)\n"
+          "  -h              display this help and exit\n"
+          "  -i              islands may merge\n"
+          "  -o              don't set resources\n"
+          "  -q              quiet\n"
+          "  -R SEED         seed for random number generator\n"
+          "  -s SCRIPT       name of script to create (default %s)\n"
+          "  NC              number of continents\n"
+          "  SC              continent size\n"
+          "  NI              number of islands (default NC)\n"
+          "  IS              average island size (default SC/2)\n"
+          "  SP              spike percentage: 0 = round, 100 = snake (default %d)\n"
+          "  PM              percentage of land that is mountain (default %d)\n"
+          "  DI              minimum distance between continents (default %d)\n"
+          "  ID              minimum distance from islands to continents (default %d)\n",
+          program_name, dflt_econfig, DEFAULT_OUTFILE_NAME,
           DEFAULT_SPIKE, DEFAULT_MOUNTAIN, DEFAULT_CONTDIST, DEFAULT_ISLDIST);
 }
 
@@ -432,8 +435,8 @@ allocate_memory(void)
     int i;
     char *fname;
 
-    fname = malloc(strlen(datadir) + 1 + strlen(empfile[EF_SECTOR].file) + 1);
-    sprintf(fname, "%s/%s", datadir, empfile[EF_SECTOR].file);
+    fname = malloc(strlen(gamedir) + 1 + strlen(empfile[EF_SECTOR].file) + 1);
+    sprintf(fname, "%s/%s", gamedir, empfile[EF_SECTOR].file);
     sect_fptr = fopen(fname, "wb");
     if (sect_fptr == NULL) {
        perror(fname);
@@ -458,9 +461,9 @@ allocate_memory(void)
     secty = calloc(nc + ni, sizeof(int *));
     sectc = calloc(nc + ni, sizeof(int *));
     isecs = calloc(nc + ni, sizeof(int));
-    weight = calloc(max(sc, is * 2), sizeof(int));
-    dsea = calloc(max(sc, is * 2), sizeof(int));
-    dmoun = calloc(max(sc, is * 2), sizeof(int));
+    weight = calloc(MAX(sc, is * 2), sizeof(int));
+    dsea = calloc(MAX(sc, is * 2), sizeof(int));
+    dmoun = calloc(MAX(sc, is * 2), sizeof(int));
     for (i = 0; i < nc; ++i) {
        sectx[i] = calloc(sc, sizeof(int));
        secty[i] = calloc(sc, sizeof(int));
@@ -805,7 +808,7 @@ place_island(int c, int *xp, int *yp)
        for (*yp = sy; *xp != sx || *yp != sy; *xp += 2) {
            if (*xp >= WORLD_X) {
                *yp = new_y(*yp + 1);
-               *xp = (*yp) % 2;
+               *xp = *yp % 2;
                if (*xp == sx && *yp == sy)
                    break;
            }
@@ -1088,7 +1091,7 @@ write_sects(void)
     sct = sectsbuf;
     for (y = 0; y < YSIZE; y++) {
        for (x = 0; x < XSIZE; x++, sct++) {
-           fl_sct_init(x * 2 + (y & 01), y, (s_char *)sct, current_time);
+           fl_sct_init(x * 2 + (y & 1), y, sct, current_time);
            total = elev[sct->sct_x][y];
            if (total < LANDMIN) {
                sct->sct_type = SCT_WATER;
@@ -1142,8 +1145,6 @@ static void
 output(void)
 {
     int i, j;
-    if (opt_BLITZ)
-       translate_continents();
     if (quiet == 0) {
        for (i = 0; i < WORLD_Y; ++i) {
            puts("");
@@ -1162,55 +1163,6 @@ output(void)
        printf("\n\nEach continent is marked by a \"*\" on the map (to distinguish them from\nthe islands).  You can redesignate these airfields to wilderness sectors\none at a time, each time you add a new country to the game.\n");
 }
 
-/* Reorder the continents from top left to bottom right */
-static void
-translate_continents(void)
-{
-    int i, j, n = 0, k, gotit, c;
-    int *trans, *trans_cont, *oldcapx, *oldcapy;
-
-    trans = calloc(nc, sizeof(int));
-    trans_cont = calloc(nc, sizeof(int));
-    oldcapx = calloc(nc, sizeof(int));
-    oldcapy = calloc(nc, sizeof(int));
-
-    for (i = 0; i < WORLD_Y; ++i) {
-       for (j = i % 2; j < WORLD_X; j += 2) {
-           if (own[j][i] > -1 && own[j][i] < nc) {
-               gotit = 0;
-               for (k = 0; k < n; ++k) {
-                   if (trans[k] == own[j][i])
-                       gotit = 1;
-               }
-               if (!gotit) {
-                   if (n > nc) {
-                       printf("fairland: BUG in translate continents!  mail stevens@math.utoronto.ca\n");
-                       exit(2);
-                   }
-                   trans[n] = own[j][i];
-                   trans_cont[own[j][i]] = n;
-                   ++n;
-               }
-           }
-       }
-    }
-    for (i = 0; i < WORLD_Y; ++i) {
-       for (j = i % 2; j < WORLD_X; j += 2) {
-           if (own[j][i] > -1 && own[j][i] < nc) {
-               own[j][i] = trans_cont[own[j][i]];
-           }
-       }
-    }
-    for (c = 0; c < nc; ++c) {
-       oldcapx[c] = capx[c];
-       oldcapy[c] = capy[c];
-    }
-    for (c = 0; c < nc; ++c) {
-       capx[c] = oldcapx[trans[c]];
-       capy[c] = oldcapy[trans[c]];
-    }
-}
-
 static int
 map_symbol(int x, int y)
 {
@@ -1267,10 +1219,8 @@ qprint(const char * const fmt, ...)
 }
 
 static void
-fl_sct_init(coord x, coord y, s_char *ptr, time_t timestamp)
+fl_sct_init(coord x, coord y, struct sctstr *sp, time_t timestamp)
 {
-    struct sctstr *sp = (struct sctstr *)ptr;
-
     sp->ef_type = EF_SECTOR;
     sp->sct_x = x;
     sp->sct_y = y;