Complete.Org: Mailing Lists: Archives: freeciv-dev: September 2006:
[Freeciv-Dev] (PR#20606) patch to reduce corruption losses under Despoti
Home

[Freeciv-Dev] (PR#20606) patch to reduce corruption losses under Despoti

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
Subject: [Freeciv-Dev] (PR#20606) patch to reduce corruption losses under Despotism
From: "(Eddie Anderson)" <saywhat@xxxxxxxxxxxx>
Date: Fri, 8 Sep 2006 19:42:53 -0700
Reply-to: bugs@xxxxxxxxxxx

<URL: http://bugs.freeciv.org/Ticket/Display.html?id=20606 >

   I'd like to propose a solution to a longstanding problem with 

Freeciv, but I need some help to implement it.  The problem is the 

punishing effect of corruption in the early stages of the game. 

 

   Essentially Freeciv offers only one solution to the effects of 

corruption - change to another form of government.  But what if 

you could reduce corruption before you were able to switch to 

another form of government? 

 

   Here's my idea:  reduce the corruption losses in each city by a 

percent equal to the percent of happy citizens in that city.  Here's 

an example with some made up numbers: 

 

.You have a size 1 city that is located 6 tiles away from the 

capital. 

 

.That city's center is on a spice tile. 

 

.Its only citizen is working a wine tile. 

 

.The government is still Despotism. 

 

   The base output of that city is 1-1-6 (1 food (3-2), 1 shield, 

and 6 trade).  But after the effects of corruption are computed, the 

output drops to 1-1-3. 

 

   Now change the tax rate to 40% Science / 60% Luxury.  Now that 

city is producing 2 luxuries from its 3 trade points.  2 luxuries 

change that city's only citizen from content to happy. 

 

   1 happy citizen in (a city of) 1 is a 100% happy percentage.  So 

the corruption effects in that city are reduced by 100% (to 0).  Now 

the city produces 6 trade points instead of 3. 

 

   Now you can change the tax rate to 60% Science / 30% Luxury / 

10% Gold.  That will be enough to keep that city happy and to allow 

you to reap a decent amount of science and gold from that city (even 

though its still governed under Despotism).  No more need to hurry 

up to research a new form of government. 

 

   Size 2 cities could reduce their corruption penalties by 50% 

if one citizen is happy or 100% if both citizens are happy.  Size 

3 cities could get 33%, 66%, or 100% reduction.  Larger cities would 

work similarly.  As with celebration, all other citizens have to be 

content (or specialists). 

 

   The research flexibility this change offers is key.  It makes 

numerous alternative research strategies viable.  Without it, there 

is effectively only one strategy - research a new form of government 

as quickly as possible.  Researching anything else only extends the 

duration of the effects of corruption (which overwhelm any benefits 

that other strategies might provide). 

 

 

   This simple mod that I've made implements the basic function 

that I've described; but it has some problems.  I believe those 

problems result from where the mod is in the calculation sequence. 

 

   I've tried to figure out where to place the mod so that it works 

reasonably and doesn't cause undesirable side effects.  But I'm not 

getting anywhere with that.  This is where I need the help of the 

big brains on this list. 

 

 

   I put my mod in city_waste.  One of the symptoms of that 

placement is that the first tax rate change (setting luxuries to 

60%) doesn't take effect until the following turn.  By the next 

turn the happiness due to luxuries is apparently recalc'd.  Only 

then does the corruption reduction take effect. 

 

   However, even on the following turn, you can't switch that size 

1 city's citizen to work a different tile.  That's because, as soon 

as you remove the citizen from the tile that he's on, he becomes an 

entertainer. 

 

   The entertainer is *not* happy (because he's a specialist) and 

so the corruption effects instantly return.  Placing the citizen on 

a new tile doesn't necessarily produce enough luxuries (from the 

corruption depleted trade output) to make the citizen happy again. 

 

   That means that you have to bump the luxury rate back to 60% and 

wait for the next turn again.  Clearly this effect is annoying. 

 

   I assume that if the mod were placed somewhere else (perhaps 

followed by a recalc of the effect of luxuries), then these problems 

could be fixed.  But I don't know where the mod can safely be 

inserted into the existing code.  Set_city_production seems to be 

delicately balanced to make the existing functions work the way 

that they are supposed to. 

 

   Can anyone suggest a more effective placement for this mod (or 

one like it)? 

 

   I also considered implementing this feature as an effect. 

Unfortunately, I couldn't figure out how to do it.  One of the 

pieces is already available:  EFT_OUTPUT_WASTE_PCT. 

 

   Unfortunately, I couldn't figure out how to access the city size 

and the number of happy citizens to code them into effects.ruleset 

reqs.  Is there a way to do that?  (Also I would also need to be 

able to access the numbers of unhappy and angry citizens - for 

nreqs.) 

 

   Even if I could use effects to implement this, it would probably 

only be practical to add effects rules for city sizes up to 3.  That 

would require only 6 rules.  Each additional city size would require 

N additional effects rules (for Nth city).  Besides, by the time 

cities grow to size 4, many players may have already completed the 

research they need to change their form of government. 

 


   Regardless, here is the patch.  Any advice or suggestions on making
it work better will be appreciated. 

 -Eddie 


Index: common/city.c
===================================================================
--- common/city.c       (revision 12298)
+++ common/city.c       (working copy)
@@ -2177,7 +2196,7 @@
 **************************************************************************/
 int city_waste(const struct city *pcity, Output_type_id otype, int total)
 {
-  int penalty = 0;
+  int city_size, happy_count, penalty = 0;
   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),
@@ -2221,6 +2240,18 @@
 
   penalty -= penalty * waste_pct / 100;
 
+  /* reduce waste based on pct happy citizens in city (also must
+   * have no unhappy citizens).  This is particularly helpful in
+   * the early stages of the game (before new government types
+   * have been researched). */
+
+   if (pcity->ppl_happy[4] > 0 && pcity->ppl_unhappy[4] == 0
+       && pcity->ppl_angry[4] == 0) {
+     city_size = pcity->size;
+     happy_count = pcity->ppl_happy[4];
+     penalty -= (penalty * happy_count) / city_size;
+   }
+
   return MIN(MAX(penalty, 0), total);
 }
 

[Prev in Thread] Current Thread [Next in Thread]
  • [Freeciv-Dev] (PR#20606) patch to reduce corruption losses under Despotism, (Eddie Anderson) <=