Make fairland obey file locks
Do that by making it use file.h instead of stdio. This doesn't overwrite the sector file completely anymore, it just sets sct_type, sct_newtype, sct_elev and sct_coastal. You really need to run files first now.
This commit is contained in:
parent
d2a7bb6b6f
commit
ba1a320ce2
1 changed files with 35 additions and 68 deletions
|
@ -66,6 +66,7 @@ static int quiet = 0;
|
||||||
/* lower URAN_MIN for more uranium */
|
/* lower URAN_MIN for more uranium */
|
||||||
#define URAN_MIN 56
|
#define URAN_MIN 56
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -143,9 +144,6 @@ int **sectc; /* which sectors are on the coast? */
|
||||||
int *vector; /* used for measuring distances */
|
int *vector; /* used for measuring distances */
|
||||||
int *weight; /* used for placing mountains */
|
int *weight; /* used for placing mountains */
|
||||||
int *dsea, *dmoun; /* the dist to the ocean and mountain */
|
int *dsea, *dmoun; /* the dist to the ocean and mountain */
|
||||||
FILE *sect_fptr; /* the file we write everything to */
|
|
||||||
struct sctstr **sects;
|
|
||||||
struct sctstr *sectsbuf;
|
|
||||||
int fl_status; /* is anything wrong? */
|
int fl_status; /* is anything wrong? */
|
||||||
#define STATUS_NO_ROOM 1 /* there was no room to grow */
|
#define STATUS_NO_ROOM 1 /* there was no room to grow */
|
||||||
#define NUMTRIES 10 /* keep trying to grow this many times */
|
#define NUMTRIES 10 /* keep trying to grow this many times */
|
||||||
|
@ -162,14 +160,12 @@ static int drift(void);
|
||||||
static void grow_continents(void);
|
static void grow_continents(void);
|
||||||
static void create_elevations(void);
|
static void create_elevations(void);
|
||||||
static void write_sects(void);
|
static void write_sects(void);
|
||||||
static int write_file(void);
|
|
||||||
static void output(void);
|
static void output(void);
|
||||||
static int write_newcap_script(void);
|
static int write_newcap_script(void);
|
||||||
static int stable(void);
|
static int stable(void);
|
||||||
static void elevate_land(void);
|
static void elevate_land(void);
|
||||||
static void elevate_sea(void);
|
static void elevate_sea(void);
|
||||||
static int map_symbol(int x, int y);
|
static int map_symbol(int x, int y);
|
||||||
static void fl_sct_init(coord, coord, struct sctstr *);
|
|
||||||
static void set_coastal_flags(void);
|
static void set_coastal_flags(void);
|
||||||
|
|
||||||
static void print_vars(void);
|
static void print_vars(void);
|
||||||
|
@ -228,8 +224,10 @@ main(int argc, char *argv[])
|
||||||
parse_args(argc - optind, argv + optind);
|
parse_args(argc - optind, argv + optind);
|
||||||
|
|
||||||
srandom(rnd_seed);
|
srandom(rnd_seed);
|
||||||
if (emp_config(config_file))
|
empfile_init();
|
||||||
|
if (emp_config(config_file) < 0)
|
||||||
exit(1);
|
exit(1);
|
||||||
|
empfile_fixup();
|
||||||
|
|
||||||
if (allocate_memory() == -1)
|
if (allocate_memory() == -1)
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
@ -259,12 +257,24 @@ main(int argc, char *argv[])
|
||||||
qprint("designating sectors...\n");
|
qprint("designating sectors...\n");
|
||||||
if (ORE)
|
if (ORE)
|
||||||
qprint("adding resources...\n");
|
qprint("adding resources...\n");
|
||||||
|
write_newcap_script();
|
||||||
|
|
||||||
|
if (chdir(gamedir)) {
|
||||||
|
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");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
write_sects();
|
write_sects();
|
||||||
qprint("writing to sectors file...\n");
|
qprint("writing to sectors file...\n");
|
||||||
if (write_file() == -1)
|
if (!ef_close(EF_SECTOR))
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
|
||||||
output();
|
output();
|
||||||
write_newcap_script();
|
qprint("\n\nA script for adding all the countries can be found in \"%s\".\n",
|
||||||
|
outfile);
|
||||||
if (!ORE)
|
if (!ORE)
|
||||||
qprint("\t*** Resources have not been added ***\n");
|
qprint("\t*** Resources have not been added ***\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -427,20 +437,7 @@ static int
|
||||||
allocate_memory(void)
|
allocate_memory(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *fname;
|
|
||||||
|
|
||||||
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);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
free(fname);
|
|
||||||
sectsbuf = calloc((YSIZE * XSIZE), sizeof(struct sctstr));
|
|
||||||
sects = calloc(YSIZE, sizeof(struct sctstr *));
|
|
||||||
for (i = 0; i < YSIZE; i++)
|
|
||||||
sects[i] = §sbuf[XSIZE * i];
|
|
||||||
capx = calloc(nc, sizeof(int));
|
capx = calloc(nc, sizeof(int));
|
||||||
capy = calloc(nc, sizeof(int));
|
capy = calloc(nc, sizeof(int));
|
||||||
vector = calloc(WORLD_X + WORLD_Y, sizeof(int));
|
vector = calloc(WORLD_X + WORLD_Y, sizeof(int));
|
||||||
|
@ -1081,11 +1078,9 @@ write_sects(void)
|
||||||
struct sctstr *sct;
|
struct sctstr *sct;
|
||||||
int c, x, y, total;
|
int c, x, y, total;
|
||||||
|
|
||||||
/* sct = §s[0][0]; */
|
|
||||||
sct = sectsbuf;
|
|
||||||
for (y = 0; y < YSIZE; y++) {
|
for (y = 0; y < YSIZE; y++) {
|
||||||
for (x = 0; x < XSIZE; x++) {
|
for (x = 0; x < XSIZE; x++) {
|
||||||
fl_sct_init(x * 2 + (y & 1), y, sct);
|
sct = getsectp(x * 2 + (y & 1), y);
|
||||||
total = elev[sct->sct_x][y];
|
total = elev[sct->sct_x][y];
|
||||||
if (total < LANDMIN) {
|
if (total < LANDMIN) {
|
||||||
sct->sct_type = SCT_WATER;
|
sct->sct_type = SCT_WATER;
|
||||||
|
@ -1101,38 +1096,17 @@ write_sects(void)
|
||||||
sct->sct_newtype = sct->sct_type;
|
sct->sct_newtype = sct->sct_type;
|
||||||
if (ORE)
|
if (ORE)
|
||||||
add_resources(sct);
|
add_resources(sct);
|
||||||
sct++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (AIRPORT_MARKER)
|
if (AIRPORT_MARKER)
|
||||||
for (c = 0; c < nc; ++c) {
|
for (c = 0; c < nc; ++c) {
|
||||||
sects[capy[c]][capx[c] / 2 + capy[c] % 2].sct_type = SCT_AIRPT;
|
sct = getsectp(capx[c], capy[c]);
|
||||||
sects[capy[c]][capx[c] / 2 + capy[c] % 2].sct_newtype = SCT_AIRPT;
|
sct->sct_type = SCT_AIRPT;
|
||||||
|
sct->sct_newtype = SCT_AIRPT;
|
||||||
}
|
}
|
||||||
set_coastal_flags();
|
set_coastal_flags();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
WRITE ALL THIS STUFF TO THE FILE
|
|
||||||
****************************************************************************/
|
|
||||||
static int
|
|
||||||
write_file(void)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
|
|
||||||
n = fwrite(sectsbuf, sizeof(struct sctstr), YSIZE * XSIZE, sect_fptr);
|
|
||||||
if (n <= 0) {
|
|
||||||
perror(empfile[EF_SECTOR].file);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (n != YSIZE * XSIZE) {
|
|
||||||
printf("%s:partial write\n", empfile[EF_SECTOR].file);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
fclose(sect_fptr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
PRINT A PICTURE OF THE MAP TO YOUR SCREEN
|
PRINT A PICTURE OF THE MAP TO YOUR SCREEN
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -1196,8 +1170,6 @@ write_newcap_script(void)
|
||||||
fprintf(script, "add %d visitor visitor v i\n", c + 1);
|
fprintf(script, "add %d visitor visitor v i\n", c + 1);
|
||||||
++c;
|
++c;
|
||||||
fclose(script);
|
fclose(script);
|
||||||
qprint("\n\nA script for adding all the countries can be found in \"%s\".\n",
|
|
||||||
outfile);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1213,28 +1185,23 @@ qprint(const char * const fmt, ...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
fl_sct_init(coord x, coord y, struct sctstr *sp)
|
|
||||||
{
|
|
||||||
sp->ef_type = EF_SECTOR;
|
|
||||||
sp->sct_uid = XYOFFSET(x, y);
|
|
||||||
sp->sct_x = x;
|
|
||||||
sp->sct_y = y;
|
|
||||||
sp->sct_dist_x = x;
|
|
||||||
sp->sct_dist_y = y;
|
|
||||||
sp->sct_coastal = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_coastal_flags(void)
|
set_coastal_flags(void)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
struct sctstr *sp;
|
||||||
|
|
||||||
qprint("setting coastal flags...\n");
|
qprint("setting coastal flags...\n");
|
||||||
for (i = 0; i < nc; ++i)
|
for (i = 0; i < nc; ++i) {
|
||||||
for (j = 0; j < sc; j++)
|
for (j = 0; j < sc; j++) {
|
||||||
sects[secty[i][j]][sectx[i][j] / 2].sct_coastal = sectc[i][j];
|
sp = getsectp(sectx[i][j], secty[i][j]);
|
||||||
for (i = nc; i < nc + ni; ++i)
|
sp->sct_coastal = sectc[i][j];
|
||||||
for (j = 0; j < isecs[i]; j++)
|
}
|
||||||
sects[secty[i][j]][sectx[i][j] / 2].sct_coastal = sectc[i][j];
|
}
|
||||||
|
for (i = nc; i < nc + ni; ++i) {
|
||||||
|
for (j = 0; j < isecs[i]; j++) {
|
||||||
|
sp = getsectp(sectx[i][j], secty[i][j]);
|
||||||
|
sp->sct_coastal = sectc[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue