Author: jtn Date: Tue May 12 09:25:36 2015 New Revision: 29067 URL: http://svn.gna.org/viewcvs/freeciv?rev=29067&view=rev Log: Policy/multiplier changes now do not take effect until end of turn (strictly, phase).
See gna patch #5341. Modified: branches/S2_6/ai/default/aiplayer.c branches/S2_6/ai/default/daieffects.c branches/S2_6/client/citydlg_common.c branches/S2_6/client/gui-gtk-2.0/gamedlgs.c branches/S2_6/client/gui-gtk-3.0/gamedlgs.c branches/S2_6/client/packhand.c branches/S2_6/common/effects.c branches/S2_6/common/packets.def branches/S2_6/common/player.c branches/S2_6/common/player.h branches/S2_6/fc_version branches/S2_6/server/plrhand.c branches/S2_6/server/savegame.c branches/S2_6/server/savegame2.c branches/S2_6/server/srv_main.c Modified: branches/S2_6/ai/default/aiplayer.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/ai/default/aiplayer.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/ai/default/aiplayer.c (original) +++ branches/S2_6/ai/default/aiplayer.c Tue May 12 09:25:36 2015 @@ -143,7 +143,7 @@ { if (pplayer->ai_common.skill_level != AI_LEVEL_AWAY) { multipliers_iterate(pmul) { - pplayer->multipliers[multiplier_index(pmul)] = pmul->def; + pplayer->multipliers_target[multiplier_index(pmul)] = pmul->def; } multipliers_iterate_end; } Modified: branches/S2_6/ai/default/daieffects.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/ai/default/daieffects.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/ai/default/daieffects.c (original) +++ branches/S2_6/ai/default/daieffects.c Tue May 12 09:25:36 2015 @@ -147,7 +147,7 @@ if (peffect->multiplier) { if (pplayer) { - amount = pplayer->multipliers[multiplier_index(peffect->multiplier)] * amount; + amount = player_multiplier_value(pplayer, peffect->multiplier) * amount; } else { amount = 0; } Modified: branches/S2_6/client/citydlg_common.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/citydlg_common.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/client/citydlg_common.c (original) +++ branches/S2_6/client/citydlg_common.c Tue May 12 09:25:36 2015 @@ -510,8 +510,8 @@ get_effect_req_text(peffect, buf2, sizeof(buf2)); if (peffect->multiplier) { - Multiplier_type_id index = multiplier_index(peffect->multiplier); - int mul = city_owner(pcity)->multipliers[index]; + int mul = player_multiplier_value(city_owner(pcity), + peffect->multiplier); if (mul == 0) { /* Suppress text when multiplier setting suppresses effect @@ -641,8 +641,8 @@ get_effect_req_text(peffect, buf2, sizeof(buf2)); if (peffect->multiplier) { - Multiplier_type_id index = multiplier_index(peffect->multiplier); - int mul = city_owner(pcity)->multipliers[index]; + int mul = player_multiplier_value(city_owner(pcity), + peffect->multiplier); if (mul == 0) { /* Suppress text when multiplier setting suppresses effect @@ -715,8 +715,7 @@ get_effect_req_text(peffect, buf2, sizeof(buf2)); if (peffect->multiplier) { - Multiplier_type_id index = multiplier_index(peffect->multiplier); - mul = city_owner(pcity)->multipliers[index]; + mul = player_multiplier_value(city_owner(pcity), peffect->multiplier); if (mul == 0) { /* Suppress text when multiplier setting suppresses effect Modified: branches/S2_6/client/gui-gtk-2.0/gamedlgs.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-gtk-2.0/gamedlgs.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/client/gui-gtk-2.0/gamedlgs.c (original) +++ branches/S2_6/client/gui-gtk-2.0/gamedlgs.c Tue May 12 09:25:36 2015 @@ -280,7 +280,7 @@ multipliers_iterate(pmul) { Multiplier_type_id multiplier = multiplier_index(pmul); - int val = client_player()->multipliers[multiplier]; + int val = player_multiplier_target_value(client_player(), pmul); gtk_range_set_value(GTK_RANGE(multipliers_scale[multiplier]), mult_to_scale(pmul, val)); @@ -329,12 +329,13 @@ multipliers_scale[multiplier] = scale; gtk_range_set_increments(GTK_RANGE(multipliers_scale[multiplier]), 1, MAX(2, mult_to_scale(pmul, pmul->stop) / 10)); - fc_assert(scale_to_mult(pmul, - mult_to_scale(pmul, - pplayer->multipliers[multiplier])) - == pplayer->multipliers[multiplier]); - gtk_range_set_value(GTK_RANGE(multipliers_scale[multiplier]), - mult_to_scale(pmul, pplayer->multipliers[multiplier])); + { + int val = player_multiplier_target_value(pplayer, pmul); + + fc_assert(scale_to_mult(pmul, mult_to_scale(pmul, val)) == val); + gtk_range_set_value(GTK_RANGE(multipliers_scale[multiplier]), + mult_to_scale(pmul, val)); + } g_signal_connect(multipliers_scale[multiplier], "format-value", G_CALLBACK(multiplier_value_callback), pmul); g_signal_connect(multipliers_scale[multiplier], "destroy", Modified: branches/S2_6/client/gui-gtk-3.0/gamedlgs.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-gtk-3.0/gamedlgs.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/client/gui-gtk-3.0/gamedlgs.c (original) +++ branches/S2_6/client/gui-gtk-3.0/gamedlgs.c Tue May 12 09:25:36 2015 @@ -278,7 +278,7 @@ multipliers_iterate(pmul) { Multiplier_type_id multiplier = multiplier_index(pmul); - int val = client_player()->multipliers[multiplier]; + int val = player_multiplier_target_value(client_player(), pmul); gtk_range_set_value(GTK_RANGE(multipliers_scale[multiplier]), mult_to_scale(pmul, val)); @@ -328,12 +328,13 @@ multipliers_scale[multiplier] = scale; gtk_range_set_increments(GTK_RANGE(multipliers_scale[multiplier]), 1, MAX(2, mult_to_scale(pmul, pmul->stop) / 10)); - fc_assert(scale_to_mult(pmul, - mult_to_scale(pmul, - pplayer->multipliers[multiplier])) - == pplayer->multipliers[multiplier]); - gtk_range_set_value(GTK_RANGE(multipliers_scale[multiplier]), - mult_to_scale(pmul, pplayer->multipliers[multiplier])); + { + int val = player_multiplier_target_value(pplayer, pmul); + + fc_assert(scale_to_mult(pmul, mult_to_scale(pmul, val)) == val); + gtk_range_set_value(GTK_RANGE(multipliers_scale[multiplier]), + mult_to_scale(pmul, val)); + } g_signal_connect(multipliers_scale[multiplier], "format-value", G_CALLBACK(multiplier_value_callback), pmul); g_signal_connect(multipliers_scale[multiplier], "destroy", Modified: branches/S2_6/client/packhand.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/packhand.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/client/packhand.c (original) +++ branches/S2_6/client/packhand.c Tue May 12 09:25:36 2015 @@ -2139,7 +2139,9 @@ multipliers_iterate(pmul) { pplayer->multipliers[multiplier_index(pmul)] = - pinfo->multiplier[multiplier_index(pmul)]; + pinfo->multiplier[multiplier_index(pmul)]; + pplayer->multipliers_target[multiplier_index(pmul)] = + pinfo->multiplier_target[multiplier_index(pmul)]; } multipliers_iterate_end; /* if the server requests that the client reset, then information about Modified: branches/S2_6/common/effects.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/effects.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/common/effects.c (original) +++ branches/S2_6/common/effects.c Tue May 12 09:25:36 2015 @@ -526,7 +526,8 @@ * by player's multiplier factor. */ if (peffect->multiplier) { if (target_player) { - bonus += peffect->value * target_player->multipliers[multiplier_index(peffect->multiplier)]; + bonus += peffect->value + * player_multiplier_value(target_player, peffect->multiplier); } } else { bonus += peffect->value; Modified: branches/S2_6/common/packets.def URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/packets.def?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/common/packets.def (original) +++ branches/S2_6/common/packets.def Tue May 12 09:25:36 2015 @@ -797,6 +797,7 @@ CITYSPE wonders[B_LAST]; diff SINT32 multiplier[MAX_NUM_MULTIPLIERS]; + SINT32 multiplier_target[MAX_NUM_MULTIPLIERS]; end PACKET_PLAYER_PHASE_DONE = 52; cs, dsend Modified: branches/S2_6/common/player.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/player.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/common/player.c (original) +++ branches/S2_6/common/player.c Tue May 12 09:25:36 2015 @@ -1702,3 +1702,23 @@ { pplayer->server.ais[ai_type_number(ai)] = data; } + +/************************************************************************** + Return the multiplier value currently in effect for pplayer. +**************************************************************************/ +int player_multiplier_value(const struct player *pplayer, + const struct multiplier *pmul) +{ + return pplayer->multipliers[multiplier_index(pmul)]; +} + +/************************************************************************** + Return the player's target value for a multiplier (which may be + different from the value currently in force; it will take effect + next turn). +**************************************************************************/ +int player_multiplier_target_value(const struct player *pplayer, + const struct multiplier *pmul) +{ + return pplayer->multipliers_target[multiplier_index(pmul)]; +} Modified: branches/S2_6/common/player.h URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/player.h?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/common/player.h (original) +++ branches/S2_6/common/player.h Tue May 12 09:25:36 2015 @@ -265,7 +265,10 @@ struct rgbcolor *rgb; + /* Values currently in force. */ int multipliers[MAX_NUM_MULTIPLIERS]; + /* Values to be used next turn. */ + int multipliers_target[MAX_NUM_MULTIPLIERS]; int culture; /* National level culture - does not include culture of individual * cities. */ @@ -443,6 +446,11 @@ bv_diplrel_all_reqs diplrel_req_contradicts(const struct requirement *req); +int player_multiplier_value(const struct player *pplayer, + const struct multiplier *pmul); +int player_multiplier_target_value(const struct player *pplayer, + const struct multiplier *pmul); + /* iterate over all player slots */ #define player_slots_iterate(_pslot) \ if (player_slots_initialised()) { \ Modified: branches/S2_6/fc_version URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/fc_version?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/fc_version (original) +++ branches/S2_6/fc_version Tue May 12 09:25:36 2015 @@ -54,7 +54,7 @@ # - Avoid adding a new mandatory capability to the development branch for # as long as possible. We want to maintain network compatibility with # the stable branch for as long as possible. -NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel-2.6-2015.May.09b" +NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel-2.6-2015.May.09c" NETWORK_CAPSTRING_OPTIONAL="" FREECIV_DISTRIBUTOR="" Modified: branches/S2_6/server/plrhand.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/plrhand.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/server/plrhand.c (original) +++ branches/S2_6/server/plrhand.c Tue May 12 09:25:36 2015 @@ -1078,10 +1078,13 @@ multipliers_iterate(pmul) { packet->multiplier[multiplier_index(pmul)] = plr->multipliers[multiplier_index(pmul)]; + packet->multiplier_target[multiplier_index(pmul)] = + plr->multipliers_target[multiplier_index(pmul)]; } multipliers_iterate_end; } else { multipliers_iterate(pmul) { packet->multiplier[multiplier_index(pmul)] = 0; + packet->multiplier_target[multiplier_index(pmul)] = 0; } multipliers_iterate_end; } @@ -3001,7 +3004,7 @@ } for (i = 0; i < count; i++) { - pplayer->multipliers[i] = multipliers[i]; + pplayer->multipliers_target[i] = multipliers[i]; } send_player_info_c(pplayer, NULL); Modified: branches/S2_6/server/savegame.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/savegame.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/server/savegame.c (original) +++ branches/S2_6/server/savegame.c Tue May 12 09:25:36 2015 @@ -1755,7 +1755,8 @@ /* Multipliers: post-date version 1 savefiles, so use ruleset defaults */ multipliers_iterate(pmul) { - plr->multipliers[multiplier_index(pmul)] = pmul->def; + plr->multipliers[multiplier_index(pmul)] + = plr->multipliers_target[multiplier_index(pmul)] = pmul->def; } multipliers_iterate_end; p = secfile_lookup_str(file, "player%d.city_style_by_name", plrno); Modified: branches/S2_6/server/savegame2.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/savegame2.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/server/savegame2.c (original) +++ branches/S2_6/server/savegame2.c Tue May 12 09:25:36 2015 @@ -3434,7 +3434,8 @@ /* First initialise player values with ruleset defaults; this will * cover any in the ruleset not known when the savefile was created. */ multipliers_iterate(pmul) { - pplayer->multipliers[multiplier_index(pmul)] = pmul->def; + pplayer->multipliers[multiplier_index(pmul)] + = pplayer->multipliers_target[multiplier_index(pmul)] = pmul->def; } multipliers_iterate_end; /* Now override with any values from the savefile. */ @@ -3442,6 +3443,7 @@ const struct multiplier *pmul = loading->multiplier.order[k]; if (pmul) { + Multiplier_type_id index = multiplier_index(pmul); int val = secfile_lookup_int_default(loading->file, pmul->def, "player%d.multiplier%d.val", @@ -3454,7 +3456,22 @@ "was %d, clamped to %d", pslot_id, multiplier_rule_name(pmul), val, rval); } - pplayer->multipliers[multiplier_index(pmul)] = rval; + pplayer->multipliers[index] = rval; + + val = + secfile_lookup_int_default(loading->file, + pplayer->multipliers[index], + "player%d.multiplier%d.target", + player_slot_index(pslot), k); + rval = (((CLIP(pmul->start, val, pmul->stop) + - pmul->start) / pmul->step) * pmul->step) + pmul->start; + + if (rval != val) { + log_verbose("Player %d had illegal value for multiplier_target " + "\"%s\": was %d, clamped to %d", pslot_id, + multiplier_rule_name(pmul), val, rval); + } + pplayer->multipliers_target[index] = rval; } /* else silently discard multiplier not in current ruleset */ } } player_slots_iterate_end; @@ -4241,6 +4258,8 @@ for (k = 0; k < i; k++) { secfile_insert_int(saving->file, plr->multipliers[k], "player%d.multiplier%d.val", plrno, k); + secfile_insert_int(saving->file, plr->multipliers_target[k], + "player%d.multiplier%d.target", plrno, k); } secfile_insert_str(saving->file, ai_level_name(plr->ai_common.skill_level), Modified: branches/S2_6/server/srv_main.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/srv_main.c?rev=29067&r1=29066&r2=29067&view=diff ============================================================================== --- branches/S2_6/server/srv_main.c (original) +++ branches/S2_6/server/srv_main.c Tue May 12 09:25:36 2015 @@ -1083,6 +1083,16 @@ lsend_packet_end_phase(pplayer->connections); } phase_players_iterate_end; + /* Enact any policy changes. + * Do this first so that following end-phase activities take the + * change into account. */ + phase_players_iterate(pplayer) { + multipliers_iterate(pmul) { + pplayer->multipliers[multiplier_index(pmul)] = + pplayer->multipliers_target[multiplier_index(pmul)]; + } multipliers_iterate_end; + } phase_players_iterate_end; + phase_players_iterate(pplayer) { struct research *presearch = research_get(pplayer); @@ -2704,7 +2714,9 @@ } multipliers_iterate(pmul) { - pplayer->multipliers[multiplier_index(pmul)] = pmul->def; + pplayer->multipliers[multiplier_index(pmul)] + = pplayer->multipliers_target[multiplier_index(pmul)] + = pmul->def; } multipliers_iterate_end; } players_iterate_end; } _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits