/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2017, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
* Known contributors to this file:
* Ken Stevens, 1995
* Steve McClure, 1998
+ * Markus Armbruster, 2004-2013
*/
#include <config.h>
#include <stdarg.h>
#include <stdio.h>
#include <unistd.h>
-#include "file.h"
-#include "misc.h"
-#include "nat.h"
+#include "chance.h"
#include "optlist.h"
-#include "power.h"
#include "prototypes.h"
#include "sect.h"
#include "version.h"
#define new_x(newx) (((newx) + WORLD_X) % WORLD_X)
#define new_y(newy) (((newy) + WORLD_Y) % WORLD_Y)
-#define rnd(x) (random() % (x))
static int secs; /* number of sectors grown */
static int ctot; /* total number of continents and islands grown */
static int *isecs; /* array of how large each island is */
static int nc, sc, di, sp, pm, ni, is, id; /* the 8 args to this program */
-static unsigned long rnd_seed; /* optional seed argument */
static int *capx, *capy; /* location of the nc capitals */
static int *mc, mcc; /* array and counter used for stability
check when perturbing */
static void help(char *);
static void usage(void);
static void parse_args(int argc, char *argv[]);
-static int allocate_memory(void);
+static void allocate_memory(void);
static void init(void);
static int drift(void);
static void grow_continents(void);
static void print_vars(void);
static void fl_move(int);
-static void next_coast(int c, int x, int y, int *xp, int *yp);
static void grow_islands(void);
/****************************************************************************
int opt;
char *config_file = NULL;
int i = 0;
+ unsigned rnd_seed = 0;
+ int seed_set = 0;
program_name = argv[0];
- rnd_seed = time(NULL);
while ((opt = getopt(argc, argv, "ae:hioqR:s:v")) != EOF) {
switch (opt) {
break;
case 'R':
rnd_seed = strtoul(optarg, NULL, 10);
+ seed_set = 1;
break;
case 's':
outfile = optarg;
}
parse_args(argc - optind, argv + optind);
- srandom(rnd_seed);
+ if (!seed_set)
+ rnd_seed = pick_seed();
+ seed_prng(rnd_seed);
empfile_init();
if (emp_config(config_file) < 0)
exit(1);
empfile_fixup();
- if (allocate_memory() == -1)
- exit(-1);
+ allocate_memory();
print_vars();
+ qprint("\n #*# ...fairland rips open a rift in the datumplane... #*#\n\n");
+ qprint("seed is %u\n", rnd_seed);
do {
init();
if (i)
- qprint("\ntry #%d (out of %d)...", i + 1, NUMTRIES);
- qprint("\n\n #*# ...fairland rips open a rift in the datumplane... #*#\n\n");
- qprint("seed is %lu\n", rnd_seed);
+ qprint("\ntry #%d (out of %d)...\n", i + 1, NUMTRIES);
qprint("placing capitals...\n");
if (!drift())
qprint("fairland: unstable drift -- try increasisg DRIFT_MAX\n");
fprintf(stderr, "Can't chdir to %s (%s)\n", gamedir, strerror(errno));
exit(EXIT_FAILURE);
}
- if (!ef_open(EF_SECTOR, EFF_MEM | EFF_NOTIME, WORLD_SZ())) {
- perror("ef_open");
+ if (!ef_open(EF_SECTOR, EFF_MEM | EFF_NOTIME))
exit(1);
- }
write_sects();
qprint("writing to sectors file...\n");
if (!ef_close(EF_SECTOR))
- exit(-1);
+ exit(1);
output();
qprint("\n\nA script for adding all the countries can be found in \"%s\".\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"
+ " -h display this help and exit\n"
+ " -v display version information and exit\n"
" NC number of continents\n"
" SC continent size\n"
" NI number of islands (default NC)\n"
is = atoi(argv[3]);
else
is = sc / 2;
- if (is < 0)
- is = 0;
+ if (is < 1)
+ is = 1;
if (argc > 4)
sp = atoi(argv[4]);
else
sp = DEFAULT_SPIKE;
- if (sp < 0)
- sp = 0;
- if (sp > 100)
- sp = 100;
+ sp = LIMIT_TO(sp, 0, 100);
if (argc > 5)
pm = atoi(argv[5]);
VARIABLE INITIALIZATION
****************************************************************************/
-static int
+static void
allocate_memory(void)
{
int i;
sectc[i] = calloc(is * 2, sizeof(int));
}
- return 0;
}
static void
{
int i, n, newx, newy;
- for (i = rnd(6), n = 0; n < 6; i = (i + 1) % 6, ++n) {
+ for (i = roll0(6), n = 0; n < 6; i = (i + 1) % 6, ++n) {
newx = new_x(capx[j] + dirx[i]);
newy = new_y(capy[j] + diry[i]);
if (iso(j, newx, newy) >= iso(j, capx[j], capy[j])) {
if (sectc[c][0])
return 0;
} else {
- i = starti = (spike && sectc[c][secs - 1]) ? secs - 1 : rnd(secs);
+ i = starti = (spike && sectc[c][secs - 1]) ? secs - 1 : roll0(secs);
do {
if (sectc[c][i])
return i;
{
int done, coast_search, try1, x, y, newx, newy, i, n, sx, sy;
- spike = rnd(100) < sp;
+ spike = roll0(100) < sp;
if ((try1 = new_try(c)) == -1)
return 0;
x = sx = sectx[c][try1];
done = 0;
do {
if (spike) {
- for (i = rnd(6), n = 0; n < 12 && !done; i = (i + 1) % 6, ++n) {
+ for (i = roll0(6), n = 0; n < 12 && !done; i = (i + 1) % 6, ++n) {
newx = new_x(x + dirx[i]);
newy = new_y(y + diry[i]);
if (own[newx][newy] == -1 &&
done = 1;
}
} else
- for (i = rnd(6), n = 0; n < 6 && !done; i = (i + 1) % 6, ++n) {
+ for (i = roll0(6), n = 0; n < 6 && !done; i = (i + 1) % 6, ++n) {
newx = new_x(x + dirx[i]);
newy = new_y(y + diry[i]);
if (own[newx][newy] == -1)
place_island(int c, int *xp, int *yp)
{
int d, sx, sy;
- int ssy = rnd(WORLD_Y);
- int ssx = new_x(rnd(WORLD_X / 2) * 2 + ssy % 2);
+ int ssy = roll0(WORLD_Y);
+ int ssx = new_x(roll0(WORLD_X / 2) * 2 + ssy % 2);
if (ssx > WORLD_X - 2)
ssx = new_x(ssx + 2);
secs = 0;
if (!place_island(c, &x, &y))
return;
- isiz = 1 + rnd(2 * is - 1);
+ isiz = roll(is) + roll0(is);
do {
++secs;
find_coast(c);
for (k = nm, mountain_search = 0;
k && mountain_search < MOUNTAIN_SEARCH_MAX;
++mountain_search) {
- r = rnd(total);
+ r = roll0(total);
for (i = 0; i < ns; ++i)
if (r < weight[i] && ELEV == -INFINITY &&
(c >= nc ||
for (i = 0; i < ns; ++i) {
if (ELEV == INFINITY) {
if (dsea[i] == 1)
- ELEV = HILLMIN + rnd(PLATMIN - HILLMIN);
+ ELEV = HILLMIN + roll0(PLATMIN - HILLMIN);
else
- ELEV = HIGHMIN + rnd((256 - HIGHMIN) / 2) +
- rnd((256 - HIGHMIN) / 2);
- } else if ((c < nc &&
- ((capx[c] == sectx[c][i] && capy[c] == secty[c][i]))) ||
- ((new_x(capx[c] + 2) == sectx[c][i] &&
- capy[c] == secty[c][i])))
+ ELEV = HIGHMIN + roll0((256 - HIGHMIN) / 2) +
+ roll0((256 - HIGHMIN) / 2);
+ } else if (c < nc &&
+ (((capx[c] == sectx[c][i] && capy[c] == secty[c][i])) ||
+ ((new_x(capx[c] + 2) == sectx[c][i] &&
+ capy[c] == secty[c][i]))))
ELEV = PLATMIN;
}
}
for (y = 0; y < WORLD_Y; ++y) {
for (x = y % 2; x < WORLD_X; x += 2) {
if (elev[x][y] == -INFINITY)
- elev[x][y] = -rnd((distance_to_land() * 20 + 27)) - 1;
+ elev[x][y] = -roll(distance_to_land() * 20 + 27);
}
}
}
{
int oil = 0;
if (e < LANDMIN)
- oil = (LANDMIN - e) * 2 + rnd(2);
+ oil = (LANDMIN - e) * 2 + roll0(2);
else if (e <= OIL_MAX)
oil = (120 * (OIL_MAX - e + 1)) / (OIL_MAX - LANDMIN + 1);
if (oil > 100)
sct->sct_type = SCT_MOUNT;
sct->sct_elev = total;
sct->sct_newtype = sct->sct_type;
+ sct->sct_dterr = own[sct->sct_x][y] + 1;
if (ORE)
add_resources(sct);
}
}
for (c = 0; c < nc; ++c) {
- fprintf(script, "add %d %d %d n i\n", c + 1, c + 1, c + 1);
+ fprintf(script, "add %d %d %d p\n", c + 1, c + 1, c + 1);
if (AIRPORT_MARKER)
fprintf(script, "des %d,%d -\n", capx[c], capy[c]);
fprintf(script, "newcap %d %d,%d\n", c + 1, capx[c], capy[c]);
}
- fprintf(script, "add %d visitor visitor v i\n", c + 1);
+ fprintf(script, "add %d visitor visitor v\n", c + 1);
fclose(script);
return 0;
}