diff -ru freeciv.o/common/nation.h freeciv/common/nation.h --- freeciv.o/common/nation.h Tue Mar 20 16:21:39 2001 +++ freeciv/common/nation.h Tue Mar 20 16:22:18 2001 @@ -37,6 +37,10 @@ int leader_is_male[MAX_NUM_LEADERS]; int city_style; char **default_city_names; + char **default_rcity_names; /* river city names */ + char **default_crcity_names; /* coastal-river city names */ + char **default_ccity_names; /* coastal city names */ + char **default_hcity_names; /* hill city names */ struct Sprite *flag_sprite; /* untranslated copies: */ diff -ru freeciv.o/data/nation/canadian.ruleset freeciv/data/nation/canadian.ruleset --- freeciv.o/data/nation/canadian.ruleset Tue Mar 20 16:21:47 2001 +++ freeciv/data/nation/canadian.ruleset Tue Mar 20 16:24:07 2001 @@ -21,15 +21,34 @@ government="Democracy" cities = - "Ottawa", "Toronto", "Vancouver", "Montreal", "Quebec", "Winnipeg", - "Calgary", "Edmonton", "Victoria", "Yellowknife", "Fredericton", - "Charlottetown", "Regina", "Saskatoon", "Whitehorse", "Iqaluit", - "Hamilton", "Kelowna", "Moose Jaw", "Brandon", "Sudbury", "St. John", - "St. John's", "Sault Ste. Marie", "Thunder Bay", "Red Deer", "Jasper", - "Prince Rupert", "Windsor", "Prince George", "Kamloops", "Lethbridge", - "Medicine Hat", "Prince Albert", "Thompson", "Timmins", "Sarnia", - "Guelph", "St. Catharines", "Barrie", "North Bay", "Belleville", - "Kingston", "Cornwall", "Trois-Rivieres", "Chicoutimi", "Rimouski", - "Moncton", "Dartmouth", "Glace Bay", "Corner Brook", "Gander" + "Toronto", "Vancouver", "Ottawa", "Edmonton", "Alberta", "Calgary", + "Winnipeg", "Hamilton", "Kitchener", "St. Catharines", "Halifax", + "Victoria", "Windsor", "Oshawa", "Saskatoon", "Regina", "St. John's", + "Sudbury", "Chicoutimi", "Sherbrooke", "Kingston", "Kelowna", + "Saint John", "Barrie", "Sydney", "Moncton", "Guelph", "Peterborough", + "Belleville", "Sarnia", "Nanaimo", "Kamloops", "Sault Ste. Marie", + "Fredericton", "Prince George", "Chatham", "Chilliwack", "Drummondville", + "Cornwall", "Red Deer", "Shawinigan", "Granby", "Charlottetown", + "Medicine Hat", "Vernon", "Courtenay", "Saint-Hyacinthe", "Whitehorse", + "Yellowknife", "Iqaluit", "Gander" +river_cities = + "Quebec", "Trois-Rivieres", "Abbotsford", "Brantford", + "Saint-Jean-sur-Richelieu", "Lethbridge", "La Grande", "La Ronge", + "La Tuque", "Pembroke", "Powell River", "Riviere-du-Loup", + "Smooth Rock Falls", "Swift Current", "Corner Brook" +coastal_river_cities = + "Dartmouth" + +coastal_cities = + "Thunder Bay", "North Bay", "Baker Lake", "Owen Sound", "Cold Lake", + "Deer Lake", "East Point", "Elliot Lake", "Goose Bay", "Harrington Harbour", + "Iles-de-la-Madeleine", "Kirkland Lake", "Parry Sound", "Port Alberni", + "Port aux Basques", "Port Hardy", "Sept-Iles", "Slave Lake", + "Wabush Lake", "Williams Lake", "Bathurst Inlet", "Cape Perry", + "Ocean Falls", "Repulse Bay" + +hill_cities = + "Montreal", "Churchill", "High Level", "Mont-Joli", "Mont-Laurier", + "Montmagny" diff -ru freeciv.o/server/cityhand.c freeciv/server/cityhand.c --- freeciv.o/server/cityhand.c Tue Mar 20 16:21:48 2001 +++ freeciv/server/cityhand.c Tue Mar 20 16:22:07 2001 @@ -47,13 +47,22 @@ struct packet_generic_integer *packet) { struct packet_city_name_suggestion reply; + struct unit *punit; + + punit = player_find_unit_by_id(pconn->player, packet->value); + if (!pconn->player) { freelog(LOG_ERROR, "City-name suggestion request from non-player %s", conn_description(pconn)); return; } + + freelog(LOG_VERBOSE, "Handle_city_name_suggest_req (%d,%d)", + punit->x, punit->y); + reply.id = packet->value; - sz_strlcpy(reply.name, city_name_suggestion(pconn->player)); + sz_strlcpy(reply.name, city_name_suggestion(pconn->player, + punit->x, punit->y)); send_packet_city_name_suggestion(pconn, &reply); } @@ -65,7 +74,7 @@ { struct city *pcity; pcity=find_city_by_id(preq->city_id); - if(!pcity) + if(!pcity) return; if(!player_owns_city(pplayer, pcity)) return; diff -ru freeciv.o/server/citytools.c freeciv/server/citytools.c --- freeciv.o/server/citytools.c Tue Mar 20 16:21:48 2001 +++ freeciv/server/citytools.c Tue Mar 20 16:22:21 2001 @@ -65,7 +65,7 @@ buffer etc, and should be considered read-only (and not freed) by caller. *****************************************************************/ -char *city_name_suggestion(struct player *pplayer) +char *city_name_suggestion(struct player *pplayer, int x, int y) { char **nptr; int i, j; @@ -73,8 +73,42 @@ static const int num_tiles = MAP_MAX_WIDTH * MAP_MAX_HEIGHT; - freelog(LOG_VERBOSE, "Suggesting city name for %s", pplayer->name); + freelog(LOG_VERBOSE, "Suggesting city name for %s (%d,%d)", pplayer->name, + x,y); + /* if the tile has a river, suggest a river-type city name + * such as Dartmouth (mouth of the Dart) or Stratford-upon-Avon. */ + + if(is_real_tile(x, y)) { + if(map_get_special(x, y) & S_RIVER) { + if(is_terrain_near_tile(x, y, T_OCEAN)) { + for(nptr=get_nation_by_plr(pplayer)->default_crcity_names; *nptr; nptr++){ + if(!game_find_city_by_name(*nptr)) + return *nptr; + } + } + for(nptr=get_nation_by_plr(pplayer)->default_rcity_names; *nptr; nptr++){ + if(!game_find_city_by_name(*nptr)) + return *nptr; + } + } + if(is_terrain_near_tile(x, y, T_OCEAN)){ + for(nptr=get_nation_by_plr(pplayer)->default_ccity_names; *nptr; nptr++){ + if(!game_find_city_by_name(*nptr)) + return *nptr; + } + } + } + + /* now check if the tile has a hill. */ + if(map_get_terrain(x, y) == T_HILLS) { + for(nptr=get_nation_by_plr(pplayer)->default_hcity_names; *nptr; nptr++){ + if(!game_find_city_by_name(*nptr)) + return *nptr; + } + } + + /* if the tile has no river _or_ if no name exists, choose as before. */ for(nptr=get_nation_by_plr(pplayer)->default_city_names; *nptr; nptr++) { if(!game_find_city_by_name(*nptr)) return *nptr; diff -ru freeciv.o/server/citytools.h freeciv/server/citytools.h --- freeciv.o/server/citytools.h Tue Mar 20 16:21:48 2001 +++ freeciv/server/citytools.h Tue Mar 20 16:22:07 2001 @@ -92,7 +92,7 @@ void change_build_target(struct player *pplayer, struct city *pcity, int target, int is_unit, int event); -char *city_name_suggestion(struct player *pplayer); +char *city_name_suggestion(struct player *pplayer, int x, int y); extern char **misc_city_names; extern int num_misc_city_names; diff -ru freeciv.o/server/ruleset.c freeciv/server/ruleset.c --- freeciv.o/server/ruleset.c Tue Mar 20 16:21:49 2001 +++ freeciv/server/ruleset.c Tue Mar 20 16:22:18 2001 @@ -1989,6 +1989,55 @@ } } if(cities) free(cities); + + /* read river city names */ + cities = secfile_lookup_str_vec(file, &dim, "%s.river_cities", sec[i]); + pl->default_rcity_names = fc_calloc(dim+1, sizeof(char*)); + pl->default_rcity_names[dim] = NULL; + for (j = 0; j < dim; j++) { + pl->default_rcity_names[j] = mystrdup(cities[j]); + if (check_name(cities[j])) { + pl->default_rcity_names[j][MAX_LEN_NAME - 1] = 0; + } + } + if(cities) free(cities); + + /* read coastal-river city names */ + cities = secfile_lookup_str_vec(file, &dim, "%s.coastal_river_cities", sec[i]); + pl->default_crcity_names = fc_calloc(dim+1, sizeof(char*)); + pl->default_crcity_names[dim] = NULL; + for (j = 0; j < dim; j++) { + pl->default_crcity_names[j] = mystrdup(cities[j]); + if (check_name(cities[j])) { + pl->default_crcity_names[j][MAX_LEN_NAME - 1] = 0; + } + } + if(cities) free(cities); + + /* read coastal city names */ + cities = secfile_lookup_str_vec(file, &dim, "%s.coastal_cities", sec[i]); + pl->default_ccity_names = fc_calloc(dim+1, sizeof(char*)); + pl->default_ccity_names[dim] = NULL; + for (j = 0; j < dim; j++) { + pl->default_ccity_names[j] = mystrdup(cities[j]); + if (check_name(cities[j])) { + pl->default_ccity_names[j][MAX_LEN_NAME - 1] = 0; + } + } + if(cities) free(cities); + + /* read hill city names */ + cities = secfile_lookup_str_vec(file, &dim, "%s.hill_cities", sec[i]); + pl->default_hcity_names = fc_calloc(dim+1, sizeof(char*)); + pl->default_hcity_names[dim] = NULL; + for (j = 0; j < dim; j++) { + pl->default_hcity_names[j] = mystrdup(cities[j]); + if (check_name(cities[j])) { + pl->default_hcity_names[j][MAX_LEN_NAME - 1] = 0; + } + } + if(cities) free(cities); + } /* read miscellaneous city names */ diff -ru freeciv.o/server/settlers.c freeciv/server/settlers.c --- freeciv.o/server/settlers.c Tue Mar 20 16:21:49 2001 +++ freeciv/server/settlers.c Tue Mar 20 16:22:07 2001 @@ -64,8 +64,9 @@ struct city *pcity; int i, j; req.unit_id=punit->id; - sz_strlcpy(req.name, city_name_suggestion(pplayer)); + x = punit->x; y = punit->y; /* Trevor Pering points out that punit gets freed */ + sz_strlcpy(req.name, city_name_suggestion(pplayer, x, y)); handle_unit_build_city(pplayer, &req); pcity=map_get_city(x, y); /* so we need to cache x and y for a very short time */ if (!pcity) diff -ru freeciv.o/server/unithand.c freeciv/server/unithand.c --- freeciv.o/server/unithand.c Tue Mar 20 16:21:49 2001 +++ freeciv/server/unithand.c Tue Mar 20 16:22:07 2001 @@ -817,7 +817,7 @@ struct player *pplayer = unit_owner(punit); if (is_ok_city_spot(punit->x, punit->y)) { - create_city(pplayer, punit->x, punit->y, city_name_suggestion(pplayer)); + create_city(pplayer, punit->x, punit->y, city_name_suggestion(pplayer, punit->x, punit->y)); } else { notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT, _("Game: Friendly nomads are impressed by you,"