Author: cazfi Date: Fri Jun 24 12:10:53 2016 New Revision: 33005 URL: http://svn.gna.org/viewcvs/freeciv?rev=33005&view=rev Log: If there's international migration between two players' cities, refresh cities on everyone's clients.
Reported by Frank <dunnoob> See bug #24464 Modified: branches/S2_5/server/citytools.c branches/S2_5/server/cityturn.c branches/S2_5/server/cityturn.h branches/S2_5/server/srv_main.c Modified: branches/S2_5/server/citytools.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/server/citytools.c?rev=33005&r1=33004&r2=33005&view=diff ============================================================================== --- branches/S2_5/server/citytools.c (original) +++ branches/S2_5/server/citytools.c Fri Jun 24 12:10:53 2016 @@ -2181,8 +2181,9 @@ { struct player *powner = city_owner(pcity); - if (S_S_RUNNING != server_state() && S_S_OVER != server_state()) + if (S_S_RUNNING != server_state() && S_S_OVER != server_state()) { return; + } if (dest == powner && send_city_suppressed) { return; Modified: branches/S2_5/server/cityturn.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/server/cityturn.c?rev=33005&r1=33004&r2=33005&view=diff ============================================================================== --- branches/S2_5/server/cityturn.c (original) +++ branches/S2_5/server/cityturn.c Fri Jun 24 12:10:53 2016 @@ -134,7 +134,7 @@ static float city_migration_score(struct city *pcity); static bool do_city_migration(struct city *pcity_from, struct city *pcity_to); -static void check_city_migrations_player(const struct player *pplayer); +static bool check_city_migrations_player(const struct player *pplayer); /************************************************************************** Updates unit upkeeps and city internal cached data. Returns whether @@ -2376,7 +2376,7 @@ } /************************************************************************** - Called every turn, at end of turn, for every city. + Called every turn, at end of turn, for every city. **************************************************************************/ static void update_city_activity(struct city *pcity) { @@ -2927,17 +2927,21 @@ 'game.server.mgr_worldchance' gives the chance for migration between all nations. -**************************************************************************/ -void check_city_migrations(void) -{ + + Returns TRUE iff there has been INTERNATIONAL migration. +**************************************************************************/ +bool check_city_migrations(void) +{ + bool internat = FALSE; + if (!game.server.migration) { - return; + return FALSE; } if (game.server.mgr_turninterval <= 0 || (game.server.mgr_worldchance <= 0 && game.server.mgr_nationchance <= 0)) { - return; + return FALSE; } /* check for migration */ @@ -2946,8 +2950,12 @@ continue; } - check_city_migrations_player(pplayer); + if (check_city_migrations_player(pplayer)) { + internat = TRUE; + } } players_iterate_end; + + return internat; } /************************************************************************** @@ -3087,13 +3095,14 @@ * if a city is found check the distance * compare the migration score **************************************************************************/ -static void check_city_migrations_player(const struct player *pplayer) +static bool check_city_migrations_player(const struct player *pplayer) { char city_link_text[MAX_LEN_LINK]; float best_city_player_score, best_city_world_score; struct city *best_city_player, *best_city_world, *acity; float score_from, score_tmp, weight; int dist, mgr_dist; + bool internat = FALSE; /* check for each city * city_list_iterate_safe_end must be used because we could @@ -3219,6 +3228,7 @@ /* second, do the migration between all nations */ if (fc_rand(100) >= game.server.mgr_worldchance) { const char *nname; + nname = nation_adjective_for_player(city_owner(best_city_world)); /* no migration */ /* N.B.: city_link always returns the same pointer. */ @@ -3230,10 +3240,13 @@ city_link_text, city_link(best_city_world), nname); } else { do_city_migration(pcity, best_city_world); + internat = TRUE; } /* stop here */ continue; } } city_list_iterate_safe_end; -} + + return internat; +} Modified: branches/S2_5/server/cityturn.h URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/server/cityturn.h?rev=33005&r1=33004&r2=33005&view=diff ============================================================================== --- branches/S2_5/server/cityturn.h (original) +++ branches/S2_5/server/cityturn.h Fri Jun 24 12:10:53 2016 @@ -46,7 +46,7 @@ void nullify_prechange_production(struct city *pcity); -void check_city_migrations(void); +bool check_city_migrations(void); void check_disasters(void); Modified: branches/S2_5/server/srv_main.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/server/srv_main.c?rev=33005&r1=33004&r2=33005&view=diff ============================================================================== --- branches/S2_5/server/srv_main.c (original) +++ branches/S2_5/server/srv_main.c Fri Jun 24 12:10:53 2016 @@ -1182,7 +1182,15 @@ if (game.server.migration) { log_debug("Season of migrations"); - check_city_migrations(); + if (check_city_migrations()) { + /* Make sure everyone has updated information about BOTH ends of the + * migration movements. */ + players_iterate(plr) { + city_list_iterate(plr->cities, pcity) { + send_city_info(NULL, pcity); + } city_list_iterate_end; + } players_iterate_end; + } } check_disasters(); _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits