diff -ruN freeciv.orig/common/map.c freeciv/common/map.c --- freeciv.orig/common/map.c Sat Jun 17 20:05:20 2000 +++ freeciv/common/map.c Sun Jun 18 11:27:06 2000 @@ -58,6 +58,16 @@ "Airbase" }; +/* Names of terrain flags. + * (These must correspond to enum terrain_flag in terrain.h.) + */ +static char *terrain_flag_names[] = { + "Land", + "Ocean", + "SweetWater", + NULL +}; + /*************************************************************** Return a (static) string with terrain name; eg: "Hills" @@ -220,6 +230,19 @@ } return NULL; +} + +/*************************************************************** +translates string to terrain flag +***************************************************************/ +enum terrain_flag terrain_flag_from_str (char *s) { + int i; + + for (i=0; terrain_flag_names[i]; i++) + if ( !strcmp (terrain_flag_names[i], s)) + return 1<<i; + freelog(LOG_FATAL, "Unknown terrain flag: %s", s); + exit (1); } /*************************************************************** diff -ruN freeciv.orig/common/map.h freeciv/common/map.h --- freeciv.orig/common/map.h Sat Jun 17 20:05:20 2000 +++ freeciv/common/map.h Sat Jun 17 23:13:53 2000 @@ -84,6 +84,7 @@ char graphic_str[MAX_LEN_NAME]; char graphic_alt[MAX_LEN_NAME]; struct Sprite *sprite[NUM_DIRECTION_NSEW]; + enum terrain_flag flags; int movement_cost; int defense_bonus; @@ -202,6 +203,7 @@ char *get_terrain_name(enum tile_terrain_type type); enum tile_special_type get_special_by_name(char * name); char *get_special_name(enum tile_special_type type); +enum terrain_flag terrain_flag_from_str (char *s); int is_terrain_near_tile(int x, int y, enum tile_terrain_type t); int isnt_terrain_near_tile(int x, int y, enum tile_terrain_type t); int count_terrain_near_tile(int x, int y, enum tile_terrain_type t); diff -ruN freeciv.orig/common/terrain.h freeciv/common/terrain.h --- freeciv.orig/common/terrain.h Wed May 24 21:13:02 2000 +++ freeciv/common/terrain.h Sat Jun 17 22:08:12 2000 @@ -18,6 +18,10 @@ R_AS_TERRAIN=1, R_AS_SPECIAL=2 }; +enum terrain_flag { + TF_LAND=1, TF_OCEAN=2, TF_SWEETWATER=4 +}; + enum special_river_move { RMV_NORMAL=0, RMV_FAST_STRICT=1, RMV_FAST_RELAXED=2, RMV_FAST_ALWAYS=3 }; diff -ruN freeciv.orig/server/ruleset.c freeciv/server/ruleset.c --- freeciv.orig/server/ruleset.c Thu May 25 13:16:05 2000 +++ freeciv/server/ruleset.c Sun Jun 18 10:58:09 2000 @@ -1120,7 +1120,7 @@ struct section_file file; char *filename, *datafile_options; int nval; - char **sec; + char *sval, **slist, **sec; int i, j; struct tile_type *t; @@ -1257,8 +1257,29 @@ t->transform_time = secfile_lookup_int(&file, "%s.transform_time", sec[i]); t->helptext = lookup_helptext(&file, sec[i]); - } + slist = secfile_lookup_str_vec (&file, &nval, "%s.flags", sec[i]); + + for (j=0; j<nval; j++) { + sval = slist[j]; + if (!strcmp(sval,"")) + continue; + t->flags |= terrain_flag_from_str (sval); + } + free(slist); + + if (! (t->flags & (TF_OCEAN | TF_LAND))) { + freelog ( LOG_FATAL, "Terrain %s is neither Land or Ocean (%s)", + t->terrain_name, filename); + exit (1); + } + /* We will, of course, support it later */ + if ((t->flags & TF_OCEAN) && (t->flags & TF_LAND)) { + freelog ( LOG_FATAL, "Terrain %s is both Land and Ocean (%s)", + t->terrain_name, filename); + exit (1); + } + } section_file_check_unused(&file, filename); section_file_free(&file);