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

Reply via email to