URL:
  <http://gna.org/bugs/?17348>

                 Summary: notradesize/fulltradesize is included in corruption
                 Project: Freeciv
            Submitted by: handuman
            Submitted on: Sat Dec 18 12:17:39 2010
                Category: general
                Severity: 3 - Normal
                Priority: 5 - Normal
                  Status: None
             Assigned to: None
        Originator Email: 
             Open/Closed: Open
                 Release: 2.2.3, trunk
         Discussion Lock: Any
        Operating System: None
         Planned Release: 

    _______________________________________________________

Details:

This is related to bug #15144.

The effects of notradesize and fulltradesize settings should be calculated
separately from the normal corruption calculation. Current calculation gives
inconsistent values and allows size-dependent effects to be mitigated with
Courthouse (as kernigh predicted in bug #15144).

An example: notradesize=3, fulltradesize=9, city size 5 with
real_map_distance of 10 from capital under monarchy, no courthouse. Trade
surplus as function of trade produced by the citizen goes like:
1(+1)
2(+1)
*3(+0)*
4(+1)
5(+1)
*6(+0)*
7(+1)
8(+1)
*9(+0)*
10(+1)
11(+1)
*12(+0)*
and so on...
If the city size is 4, you only get surplus of one trade if you produce 1 or
2 trade from the city. All other (bigger) values give zero trade.

To fix, here is my suggestion. I do not have a suitable development
environmet so I cannot compile and test this. That's why I'm not attaching it
as a patch.


Index: ../SVN/trunk/common/city.c
===================================================================
--- ../SVN/trunk/common/city.c  (revision 18782)
+++ ../SVN/trunk/common/city.c  (working copy)
@@ -2883,6 +2883,8 @@
 int city_waste(const struct city *pcity, Output_type_id otype, int total)
 {
   int penalty = 0;
+  int size_penalty = 0; /* separate notradesize/fulltradeisze from normal
corruption */
+  int effective_total = total; /* normal corruption calculated on total
reduced by possible size penalty */
   int waste_level = get_city_output_bonus(pcity, get_output_type(otype),
                                           EFT_OUTPUT_WASTE);
   int waste_by_dist = get_city_output_bonus(pcity, get_output_type(otype),
@@ -2902,9 +2904,9 @@
     if (pcity->size <= notradesize) {
       return total; /* Then no trade income. */
     } else if (pcity->size >= fulltradesize) {
-      penalty = 0;
+      size_penalty = 0;
     } else {
-      penalty = total * (fulltradesize - pcity->size)
+      size_penalty = effective_total * (fulltradesize - pcity->size)
        / (fulltradesize - notradesize);
     }
   }
@@ -2920,12 +2922,20 @@
     }
   }
 
+  /* reduce the amount subjected to corruption */
+  effective_total -= size_penalty;
+
+  /* corruption/waste calculated only for the actually produced amount */
   if (waste_level > 0) {
-    penalty += total * waste_level / 100;
+    penalty += effective_total * waste_level / 100;
   }
 
+  /* bonus calculated only for the actually produced amount */
   penalty -= penalty * waste_pct / 100;
 
+  /* add up total penalty */
+  penalty += size_penalty;
+
   return MIN(MAX(penalty, 0), total);
 }
 


Tip: you also might want to multiply the values by 100 or so before
calculation and divide the result accordingly to not loose precision on the
way.




    _______________________________________________________

Reply to this item at:

  <http://gna.org/bugs/?17348>

_______________________________________________
  Message sent via/by Gna!
  http://gna.org/


_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to