2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * See files README, COPYING and CREDITS in the root of the source
23 * tree for related information and legal notices. It is expected
24 * that future projects/authors will amend these files as needed.
28 * fairland.c: Create a nice, new world
30 * Known contributors to this file:
37 /* define ORE 1 to add resources, define ORE 0 if you want to use another
38 program to add the resources */
42 /* If you don't specify these command line arguments, then these are the
44 #define DEFAULT_SPIKE 10
45 #define DEFAULT_MOUNTAIN 0
46 #define DEFAULT_CONTDIST 2
47 #define DEFAULT_ISLDIST 1
49 /* The following five numbers refer to elevation under which (in the case of
50 fertility or oil) or over which (in the case of iron, gold, and uranium)
51 sectors with that elevation will contain that resource. Elevation ranges
54 /* raise FERT_MAX for more fertility */
57 /* raise OIL_MAX for more oil */
60 /* lower IRON_MIN for more iron */
63 /* lower GOLD_MIN for more gold */
66 /* lower URAN_MIN for more uranium */
78 #include "prototypes.h"
83 /* do not change these 4 defines */
84 #define LANDMIN 1 /* plate altitude for normal land */
85 #define HILLMIN 34 /* plate altitude for hills */
86 #define PLATMIN 36 /* plate altitude for plateau */
87 #define HIGHMIN 98 /* plate altitude for mountains */
89 static void qprint(const char * const fmt, ...)
90 ATTRIBUTE((format (printf, 1, 2)));
92 #define DEFAULT_OUTFILE_NAME "newcap_script"
93 static const char *outfile = DEFAULT_OUTFILE_NAME;
94 /* mark the continents with a * so you can tell them
95 from the islands 1 = mark, 0 = don't mark. */
96 static int AIRPORT_MARKER = 0;
98 /* don't let the islands crash into each other.
99 1 = don't merge, 0 = merge. */
100 static int DISTINCT_ISLANDS = 1;
102 static char *program_name;
104 #define XSIZE ((WORLD_X) / 2) /* basically world x-y size */
105 #define YSIZE (WORLD_Y)
106 #define STABLE_CYCLE 4 /* stability required for perterbed capitals */
107 #define INFINITY 999 /* a number which means "BIG" */
109 /* these defines prevent infinite loops:
112 #define COAST_SEARCH_MAX 200 /* how many times do we look for a coast sector
113 when growing continents and islands */
114 #define DRIFT_BEFORE_CHECK ((WORLD_X + WORLD_Y)/2)
115 #define DRIFT_MAX ((WORLD_X + WORLD_Y)*2)
116 #define MOUNTAIN_SEARCH_MAX 1000 /* how long do we try to place mountains */
121 #define new_x(newx) (((newx) + WORLD_X) % WORLD_X)
122 #define new_y(newy) (((newy) + WORLD_Y) % WORLD_Y)
123 #define rnd(x) (random() % (x))
125 int secs; /* number of sectors grown */
126 int ctot; /* total number of continents and islands grown */
127 int *isecs; /* array of how large each island is */
129 int nc, sc, di, sp, pm, ni, is, id; /* the 8 arguments to this program */
130 unsigned long rnd_seed; /* optional seed can be passed as an argument */
131 int *capx, *capy; /* location of the nc capitals */
132 int *mc, mcc; /* array and counter used for stability
133 check when perturbing */
134 int spike; /* are we spiking? */
135 int mind; /* the final distance between capitals that
137 int dirx[] = { -2, -1, 1, 2, 1, -1 }; /* gyujnb */
138 int diry[] = { 0, -1, -1, 0, 1, 1 };
140 int **own; /* owner of the sector. -1 means water */
141 int **elev; /* elevation of the sectors */
142 int **sectx, **secty; /* the sectors for each continent */
143 int **sectc; /* which sectors are on the coast? */
144 int *vector; /* used for measuring distances */
145 int *weight; /* used for placing mountains */
146 int *dsea, *dmoun; /* the dist to the ocean and mountain */
147 int fl_status; /* is anything wrong? */
148 #define STATUS_NO_ROOM 1 /* there was no room to grow */
149 #define NUMTRIES 10 /* keep trying to grow this many times */
151 const char *numletter =
152 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
154 static void help(char *);
155 static void usage(void);
156 static void parse_args(int argc, char *argv[]);
157 static int allocate_memory(void);
158 static void init(void);
159 static int drift(void);
160 static void grow_continents(void);
161 static void create_elevations(void);
162 static void write_sects(void);
163 static void output(void);
164 static int write_newcap_script(void);
165 static int stable(void);
166 static void elevate_land(void);
167 static void elevate_sea(void);
168 static int map_symbol(int x, int y);
169 static void set_coastal_flags(void);
171 static void print_vars(void);
172 static void fl_move(int);
173 static void next_coast(int c, int x, int y, int *xp, int *yp);
174 static void grow_islands(void);
176 /****************************************************************************
178 ****************************************************************************/
181 main(int argc, char *argv[])
184 char *config_file = NULL;
187 program_name = argv[0];
188 rnd_seed = time(NULL);
190 while ((opt = getopt(argc, argv, "ae:hioqR:s:v")) != EOF) {
196 config_file = optarg;
199 DISTINCT_ISLANDS = 0;
208 rnd_seed = strtoul(optarg, NULL, 10);
217 printf("%s\n\n%s", version, legal);
224 parse_args(argc - optind, argv + optind);
228 if (emp_config(config_file) < 0)
232 if (allocate_memory() == -1)
239 qprint("\ntry #%d (out of %d)...", i + 1, NUMTRIES);
240 qprint("\n\n #*# ...fairland rips open a rift in the datumplane... #*#\n\n");
241 qprint("seed is %lu\n", rnd_seed);
242 qprint("placing capitals...\n");
244 qprint("fairland: unstable drift -- try increasisg DRIFT_MAX\n");
245 qprint("growing continents...\n");
247 } while (fl_status && ++i < NUMTRIES);
249 fputs("ERROR: World not large enough to hold continents\n",
253 qprint("growing islands:");
255 qprint("\nelevating land...\n");
257 qprint("designating sectors...\n");
259 qprint("adding resources...\n");
260 write_newcap_script();
262 if (chdir(gamedir)) {
263 fprintf(stderr, "Can't chdir to %s (%s)\n", gamedir, strerror(errno));
266 if (!ef_open(EF_SECTOR, EFF_MEM | EFF_NOTIME, WORLD_SZ())) {
271 qprint("writing to sectors file...\n");
272 if (!ef_close(EF_SECTOR))
276 qprint("\n\nA script for adding all the countries can be found in \"%s\".\n",
279 qprint("\t*** Resources have not been added ***\n");
288 puts("Creating a planet with:\n");
289 printf("%d continents\n", nc);
290 printf("continent size: %d\n", sc);
291 printf("number of islands: %d\n", ni);
292 printf("average size of islands: %d\n", is);
293 printf("spike: %d%%\n", sp);
294 printf("%d%% of land is mountain (each continent will have %d mountains)\n",
295 pm, (pm * sc) / 100);
296 printf("minimum distance between continents: %d\n", di);
297 printf("minimum distance from islands to continents: %d\n", id);
298 printf("World dimensions: %dx%d\n", WORLD_X, WORLD_Y);
306 for (i = 1; i * i < n * 10000; ++i) ;
307 return (i + 50) / 100;
310 /****************************************************************************
311 PARSE COMMAND LINE ARGUMENTS
312 ****************************************************************************/
315 help(char *complaint)
318 fprintf(stderr, "%s: %s\n", program_name, complaint);
319 fprintf(stderr, "Try -h for help.\n");
325 printf("Usage: %s [OPTION]... NC SC [NI] [IS] [SP] [PM] [DI] [ID]\n"
326 " -a airport marker for continents\n"
327 " -e CONFIG-FILE configuration file\n"
329 " -h display this help and exit\n"
330 " -i islands may merge\n"
331 " -o don't set resources\n"
333 " -R SEED seed for random number generator\n"
334 " -s SCRIPT name of script to create (default %s)\n"
335 " NC number of continents\n"
336 " SC continent size\n"
337 " NI number of islands (default NC)\n"
338 " IS average island size (default SC/2)\n"
339 " SP spike percentage: 0 = round, 100 = snake (default %d)\n"
340 " PM percentage of land that is mountain (default %d)\n"
341 " DI minimum distance between continents (default %d)\n"
342 " ID minimum distance from islands to continents (default %d)\n",
343 program_name, dflt_econfig, DEFAULT_OUTFILE_NAME,
344 DEFAULT_SPIKE, DEFAULT_MOUNTAIN, DEFAULT_CONTDIST, DEFAULT_ISLDIST);
348 parse_args(int argc, char *argv[])
351 help("missing arguments");
355 help("too many arguments");
360 puts("fairland: error -- number of continents must be > 0");
366 puts("fairland: error -- size of continents must be > 0");
394 pm = DEFAULT_MOUNTAIN;
401 di = DEFAULT_CONTDIST;
404 puts("fairland: error -- distance between continents must be >= 0");
407 if (di > WORLD_X / 2 || di > WORLD_Y / 2) {
408 puts("fairland: error -- distance between continents too large");
415 id = DEFAULT_ISLDIST;
417 puts("fairland: error -- distance from islands to continents must be >= 0");
420 if (id > WORLD_X || id > WORLD_Y) {
421 puts("fairland: error -- distance from islands to continents too large");
424 if (nc * sc + nc * my_sqrt(sc) * 2 * (di + 1) > WORLD_X * WORLD_Y) {
425 puts("fairland: error -- world not big enough to fit continents.");
426 puts("arguments must satisfy:");
427 puts("nc*sc*sc + nc*sqrt(sc)*2*(di+1) < WORLD_X * WORLD_Y");
432 /****************************************************************************
433 VARIABLE INITIALIZATION
434 ****************************************************************************/
437 allocate_memory(void)
441 capx = calloc(nc, sizeof(int));
442 capy = calloc(nc, sizeof(int));
443 vector = calloc(WORLD_X + WORLD_Y, sizeof(int));
444 mc = calloc(STABLE_CYCLE, sizeof(int));
445 own = calloc(WORLD_X, sizeof(int *));
446 elev = calloc(WORLD_X, sizeof(int *));
447 for (i = 0; i < WORLD_X; ++i) {
448 own[i] = calloc(WORLD_Y, sizeof(int));
449 elev[i] = calloc(WORLD_Y, sizeof(int));
451 sectx = calloc(nc + ni, sizeof(int *));
452 secty = calloc(nc + ni, sizeof(int *));
453 sectc = calloc(nc + ni, sizeof(int *));
454 isecs = calloc(nc + ni, sizeof(int));
455 weight = calloc(MAX(sc, is * 2), sizeof(int));
456 dsea = calloc(MAX(sc, is * 2), sizeof(int));
457 dmoun = calloc(MAX(sc, is * 2), sizeof(int));
458 for (i = 0; i < nc; ++i) {
459 sectx[i] = calloc(sc, sizeof(int));
460 secty[i] = calloc(sc, sizeof(int));
461 sectc[i] = calloc(sc, sizeof(int));
463 for (i = nc; i < nc + ni; ++i) {
464 sectx[i] = calloc(is * 2, sizeof(int));
465 secty[i] = calloc(is * 2, sizeof(int));
466 sectc[i] = calloc(is * 2, sizeof(int));
475 int i, j, xx = 0, yy = 0;
480 for (i = 0; i < WORLD_X; ++i) {
481 for (j = 0; j < WORLD_Y; ++j) {
483 elev[i][j] = -INFINITY;
487 for (i = 0; i < nc; ++i) {
492 puts("fairland error: world not big enough for all the continents.\n");
500 for (i = 0; i < STABLE_CYCLE; ++i)
504 /****************************************************************************
505 DRIFT THE CAPITALS UNTIL THEY ARE AS FAR AWAY FROM EACH OTHER AS POSSIBLE
506 ****************************************************************************/
508 /* How isolated is capital j?
511 iso(int j, int newx, int newy)
513 int i, md, d = WORLD_X + WORLD_Y;
515 for (i = 0; i < nc; ++i) {
518 md = mapdist(capx[i], capy[i], newx, newy);
526 /* Drift all the capitals
533 for (turns = 0; turns < DRIFT_MAX; ++turns) {
534 if (turns > DRIFT_BEFORE_CHECK && (mind = stable()))
536 for (i = 0; i < nc; ++i)
542 /* Check to see if we have stabilized--can we stop drifting the capitals?
548 int i, isod, d = 0, stab = 1;
550 for (i = 0; i < nc; ++i) {
551 isod = iso(i, capx[i], capy[i]);
555 for (i = 0; i < STABLE_CYCLE; ++i)
559 mcc = (mcc + 1) % STABLE_CYCLE;
563 /* This routine does the actual drifting
569 int i, n, newx, newy;
571 for (i = rnd(6), n = 0; n < 6; i = (i + 1) % 6, ++n) {
572 newx = new_x(capx[j] + dirx[i]);
573 newy = new_y(capy[j] + diry[i]);
574 if (iso(j, newx, newy) >= iso(j, capx[j], capy[j])) {
582 /****************************************************************************
584 ****************************************************************************/
586 /* Look for a coastal sector of continent c
594 for (i = 0; i < secs; ++i) {
596 for (j = 0; j < 6; ++j)
597 if (own[new_x(sectx[c][i] + dirx[j])][new_y(secty[c][i] + diry[j])] == -1)
602 /* Used for measuring distances
614 for (i = 1; i < n && vector[i] == vector[i - 1]; ++i) ;
617 return i > 1 || vector[0] > 0;
620 /* Test to see if we're allowed to grow there: the arguments di and id
623 try_to_grow(int c, int newx, int newy, int d)
627 for (i = 1; i <= d; ++i) {
628 for (j = 0; j < i; ++j)
633 for (j = 0; j < i; ++j) {
634 px = new_x(px + dirx[vector[j]]);
635 py = new_y(py + diry[vector[j]]);
637 if (own[px][py] != -1 &&
639 (DISTINCT_ISLANDS || own[px][py] < nc))
641 } while (next_vector(i));
643 sectx[c][secs] = newx;
644 secty[c][secs] = newy;
649 /* Move along the coast in a clockwise direction.
653 next_coast(int c, int x, int y, int *xp, int *yp)
655 int i, nx, ny, wat = 0;
663 for (i = 0; i < 12; ++i) {
664 nx = new_x(x + dirx[i % 6]);
665 ny = new_y(y + diry[i % 6]);
666 if (own[nx][ny] == -1)
668 if (wat && own[nx][ny] == c) {
676 /* Choose a sector to grow from
688 i = starti = (spike && sectc[c][secs - 1]) ? secs - 1 : rnd(secs);
693 } while (i != starti);
695 printf("fairland: BUG -- couldn't find coast for continent %c, sector %d.\nPlease mail stevens@math.utoronto.ca.\n",
704 /* Grow continent c by 1 sector
708 grow_one_sector(int c)
710 int done, coast_search, try1, x, y, newx, newy, i, n, sx, sy;
712 spike = rnd(100) < sp;
713 if ((try1 = new_try(c)) == -1)
715 x = sx = sectx[c][try1];
716 y = sy = secty[c][try1];
721 for (i = rnd(6), n = 0; n < 12 && !done; i = (i + 1) % 6, ++n) {
722 newx = new_x(x + dirx[i]);
723 newy = new_y(y + diry[i]);
724 if (own[newx][newy] == -1 &&
726 (own[new_x(x+dirx[(i+5)%6])][new_y(y+diry[(i+5)%6])] == -1 &&
727 own[new_x(x+dirx[(i+1)%6])][new_y(y+diry[(i+1)%6])] == -1)))
728 if (try_to_grow(c, newx, newy, c < nc ? di : id))
732 for (i = rnd(6), n = 0; n < 6 && !done; i = (i + 1) % 6, ++n) {
733 newx = new_x(x + dirx[i]);
734 newy = new_y(y + diry[i]);
735 if (own[newx][newy] == -1)
736 if (try_to_grow(c, newx, newy, c < nc ? di : id))
739 next_coast(c, x, y, &x, &y);
741 } while (!done && coast_search < COAST_SEARCH_MAX &&
742 (secs == 1 || x != sx || y != sy));
743 if (!done && c < nc) {
744 qprint("fairland: error -- continent %c had no room to grow!\n",
746 fl_status |= STATUS_NO_ROOM;
751 /* Grow all the continents
754 grow_continents(void)
758 for (c = 0; c < nc; ++c) {
759 sectx[c][0] = capx[c];
760 secty[c][0] = capy[c];
761 own[sectx[c][0]][secty[c][0]] = c;
762 sectx[c][1] = new_x(capx[c] + 2);
763 secty[c][1] = capy[c];
764 own[sectx[c][1]][secty[c][1]] = c;
767 for (secs = 2; secs < sc && !fl_status; ++secs) {
768 for (c = 0; c < nc; ++c) {
773 for (c = 0; c < nc; ++c)
777 qprint("Only managed to grow %d out of %d sectors.\n", secs, sc);
781 /****************************************************************************
783 ****************************************************************************/
785 /* Choose a place to start growing an island from
788 place_island(int c, int *xp, int *yp)
791 int ssy = rnd(WORLD_Y);
792 int ssx = new_x(rnd(WORLD_X / 2) * 2 + ssy % 2);
794 if (ssx > WORLD_X - 2)
795 ssx = new_x(ssx + 2);
796 for (d = di + id; d >= id; --d) {
800 for (*yp = sy; *xp != sx || *yp != sy; *xp += 2) {
801 if (*xp >= WORLD_X) {
802 *yp = new_y(*yp + 1);
804 if (*xp == sx && *yp == sy)
807 if (own[*xp][*yp] == -1 && try_to_grow(c, *xp, *yp, d))
814 /* Grow all the islands
822 for (c = nc; c < nc + ni; ++c) {
824 if (!place_island(c, &x, &y))
826 isiz = 1 + rnd(2 * is - 1);
830 } while (secs < isiz && grow_one_sector(c));
832 qprint(" %d(%d)", c - nc + 1, secs);
838 /****************************************************************************
840 ****************************************************************************/
842 create_elevations(void)
848 /* Generic function for finding the distance to the closest sea, land, or
852 distance_to_what(int x, int y, int flag)
856 for (d = 1; d < 5; ++d) {
857 for (j = 0; j < d; ++j)
862 for (j = 0; j < d; ++j) {
863 px = new_x(px + dirx[vector[j]]);
864 py = new_y(py + diry[vector[j]]);
867 case 0: /* distance to sea */
868 if (own[px][py] == -1)
871 case 1: /* distance to land */
872 if (own[px][py] != -1)
875 case 2: /* distance to mountain */
876 if (elev[px][py] == INFINITY)
880 } while (next_vector(d));
885 #define ELEV elev[sectx[c][i]][secty[c][i]]
886 #define distance_to_sea() (sectc[c][i]?1:distance_to_what(sectx[c][i], secty[c][i], 0))
887 #define distance_to_mountain() distance_to_what(sectx[c][i], secty[c][i], 2)
889 /* Decide where the mountains go
894 int i, mountain_search, k, c, total, ns, nm, highest, where, h, newk,
897 for (c = 0; c < ctot; ++c) {
899 ns = (c < nc) ? sc : isecs[c];
900 nm = (pm * ns) / 100;
902 /* Place the mountains */
904 for (i = 0; i < ns; ++i) {
905 dsea[i] = distance_to_sea();
906 weight[i] = (total += (dsea[i] * dsea[i]));
909 for (k = nm, mountain_search = 0;
910 k && mountain_search < MOUNTAIN_SEARCH_MAX;
913 for (i = 0; i < ns; ++i)
914 if (r < weight[i] && ELEV == -INFINITY &&
916 ((!(capx[c] == sectx[c][i] &&
917 capy[c] == secty[c][i])) &&
918 (!(new_x(capx[c] + 2) == sectx[c][i] &&
919 capy[c] == secty[c][i]))))) {
926 /* Elevate land that is not mountain and not capital */
928 for (i = 0; i < ns; ++i)
929 dmoun[i] = distance_to_mountain();
930 dk = (ns - nm - ((c < nc) ? 3 : 1) > 0) ?
931 (100 * (HIGHMIN - LANDMIN)) / (ns - nm - ((c < nc) ? 3 : 1)) :
933 for (k = 100 * (HIGHMIN - 1);; k -= dk) {
936 for (i = 0; i < ns; ++i) {
937 if (ELEV != INFINITY &&
938 (c >= nc || ((!(capx[c] == sectx[c][i] &&
939 capy[c] == secty[c][i])) &&
940 (!(new_x(capx[c] + 2) == sectx[c][i] &&
941 capy[c] == secty[c][i]))))) {
942 h = 3 * (5 - dmoun[i]) + dsea[i];
952 if (newk >= HILLMIN && newk < PLATMIN)
956 elev[sectx[c][where]][secty[c][where]] = newk;
957 dsea[where] = -INFINITY;
958 dmoun[where] = INFINITY;
961 /* Elevate the mountains and capitals */
963 for (i = 0; i < ns; ++i) {
964 if (ELEV == INFINITY) {
966 ELEV = HILLMIN + rnd(PLATMIN - HILLMIN);
968 ELEV = HIGHMIN + rnd((256 - HIGHMIN) / 2) +
969 rnd((256 - HIGHMIN) / 2);
970 } else if ((c < nc &&
971 ((capx[c] == sectx[c][i] && capy[c] == secty[c][i]))) ||
972 ((new_x(capx[c] + 2) == sectx[c][i] &&
973 capy[c] == secty[c][i])))
979 #define distance_to_land() distance_to_what(x, y, 1)
986 for (y = 0; y < WORLD_Y; ++y) {
987 for (x = y % 2; x < WORLD_X; x += 2) {
988 if (elev[x][y] == -INFINITY)
989 elev[x][y] = -rnd((distance_to_land() * 20 + 27)) - 1;
994 /****************************************************************************
996 ****************************************************************************/
1003 fert = LANDMIN - e + 40;
1004 else if (e < FERT_MAX)
1005 fert = (120 * (FERT_MAX - e)) / (FERT_MAX - LANDMIN);
1016 oil = (LANDMIN - e) * 2 + rnd(2);
1017 else if (e <= OIL_MAX)
1018 oil = (120 * (OIL_MAX - e + 1)) / (OIL_MAX - LANDMIN + 1);
1028 if (e >= IRON_MIN && e < HIGHMIN)
1029 iron = (120 * (e - IRON_MIN + 1)) / (HIGHMIN - IRON_MIN);
1039 if (e >= GOLD_MIN) {
1041 gold = (80 * (e - GOLD_MIN + 1)) / (HIGHMIN - GOLD_MIN);
1043 gold = 100 - 20 * HIGHMIN / e;
1054 if (e >= URAN_MIN && e < HIGHMIN)
1055 uran = (120 * (e - URAN_MIN + 1)) / (HIGHMIN - URAN_MIN);
1062 add_resources(struct sctstr *sct)
1064 sct->sct_fertil = set_fert(sct->sct_elev);
1065 sct->sct_oil = set_oil(sct->sct_elev);
1066 sct->sct_min = set_iron(sct->sct_elev);
1067 sct->sct_gmin = set_gold(sct->sct_elev);
1068 sct->sct_uran = set_uran(sct->sct_elev);
1071 /****************************************************************************
1072 DESIGNATE THE SECTORS
1073 ****************************************************************************/
1081 for (y = 0; y < YSIZE; y++) {
1082 for (x = 0; x < XSIZE; x++) {
1083 sct = getsectp(x * 2 + (y & 1), y);
1084 total = elev[sct->sct_x][y];
1085 if (total < LANDMIN) {
1086 sct->sct_type = SCT_WATER;
1087 } else if (total < HILLMIN)
1088 sct->sct_type = SCT_RURAL;
1089 else if (total < PLATMIN)
1090 sct->sct_type = SCT_MOUNT;
1091 else if (total < HIGHMIN)
1092 sct->sct_type = SCT_RURAL;
1094 sct->sct_type = SCT_MOUNT;
1095 sct->sct_elev = total;
1096 sct->sct_newtype = sct->sct_type;
1102 for (c = 0; c < nc; ++c) {
1103 sct = getsectp(capx[c], capy[c]);
1104 sct->sct_type = SCT_AIRPT;
1105 sct->sct_newtype = SCT_AIRPT;
1107 set_coastal_flags();
1110 /****************************************************************************
1111 PRINT A PICTURE OF THE MAP TO YOUR SCREEN
1112 ****************************************************************************/
1118 for (i = 0; i < WORLD_Y; ++i) {
1122 for (j = i % 2; j < WORLD_X; j += 2) {
1123 if (own[j][i] == -1)
1126 printf("%c ", map_symbol(j, i));
1132 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");
1136 map_symbol(int x, int y)
1140 for (c = 0; c < nc; ++c)
1141 if ((x == capx[c] && y == capy[c])
1142 || (x == new_x(capx[c] + 2) && y == capy[c]))
1144 if ((elev[x][y] >= HILLMIN && elev[x][y] < PLATMIN)
1145 || elev[x][y] >= HIGHMIN)
1147 return own[x][y] >= nc ? '%' : iscap ? '#' : numletter[own[x][y] % 62];
1150 /***************************************************************************
1151 WRITE A SCRIPT FOR PLACING CAPITALS
1152 ****************************************************************************/
1154 write_newcap_script(void)
1157 FILE *script = fopen(outfile, "w");
1160 printf("fairland: error, unable to write to %s.\n", outfile);
1164 for (c = 0; c < nc; ++c) {
1165 fprintf(script, "add %d %d %d n i\n", c + 1, c + 1, c + 1);
1167 fprintf(script, "des %d,%d -\n", capx[c], capy[c]);
1168 fprintf(script, "newcap %d %d,%d\n", c + 1, capx[c], capy[c]);
1170 fprintf(script, "add %d visitor visitor v i\n", c + 1);
1177 qprint(const char * const fmt, ...)
1183 vfprintf(stdout, fmt, ap);
1189 set_coastal_flags(void)
1194 qprint("setting coastal flags...\n");
1195 for (i = 0; i < nc; ++i) {
1196 for (j = 0; j < sc; j++) {
1197 sp = getsectp(sectx[i][j], secty[i][j]);
1198 sp->sct_coastal = sectc[i][j];
1201 for (i = nc; i < nc + ni; ++i) {
1202 for (j = 0; j < isecs[i]; j++) {
1203 sp = getsectp(sectx[i][j], secty[i][j]);
1204 sp->sct_coastal = sectc[i][j];