The Curious Cat - City Upkeep Explained

I tried to use the formula eg577 posted here. I cannot confirm the formula. Maybe one of you can help me what I'm doing wrong.
First I'm using BTS 3.19.
Game Settings are: Emporer, Large Map, Pop=17, courthouse = Yes, Distance to Palace=4

I verified modifiers for Worldsize and handicap because it could be that those ones used in this post are not matching to BTS 3.19, but I found they were still matching.

For the city given above the City Screen tells me Distance Cost = 2.30

When I do the math using the formula eg577 provided:
DistanceMaint =
[ ([25*Distance*(Pop+7)/10] * Building_m * WorldSize_m * Handicap_m) / DistanceScale ]
my result is 2.42.

Parameters I used: Building_M=0.5; Distance=4; Handicap_m=0.95; WorldSize_m=0.9; DistanceScale=26+16=42
Expressions I calculated:
A. 25 * 4 * (17+7) / 10) = 240
B. 240 * 0.5 = 120
C. 120 * 0.9 = 108
D. 108 * 0.95 = 102.6 ( I rounded that value down to 102)
E. 102/42 = 2.42 ( City Screen says 2.30)

Can anyone explain what I'm doing wrong?
(Find the attached city screen)
 

Attachments

  • CityMaintenanceDist.jpg
    CityMaintenanceDist.jpg
    474.7 KB · Views: 941
... I forgot to mention:

In the City Screen shown in the post before this post you can see the capital city (Palace) 4 fields (8-8-8-8) away. Distance = 4.
 
I'm not sure what all the calcs you did mean, but do they take account of the presence of your corporation? They make maintenance skyrocket, even in the capital.

EDIT - The article hasn't been updated since 2006, before BTS was released so theres your problem, it doesn't account for corp maintenance.
 
I'm not sure what all the calcs you did mean, but do they take account of the presence of your corporation? They make maintenance skyrocket, even in the capital.

EDIT - The article hasn't been updated since 2006, before BTS was released so theres your problem, it doesn't account for corp maintenance.

As you see in the screenshot cost for corporation are shown separately.
It is clear that total city maintenance is built from:

Difference Maintenance + Number of City Maintenance + Corporation Costs

But I'm interested in "Difference Maintenance" which is independent from Corporation Costs.
 
It seems that the formula to calculate Difference City Maintenance has changed in BTS 3.19.

I found following Python code but I cannot translate it into a common formula. Is here anyone who can translate following code into a formula as it was provided by eg577 for old version?

int CvCity::calculateDistanceMaintenanceTimes100() const
{
CvCity* pLoopCity;
int iWorstCityMaintenance;
int iBestCapitalMaintenance;
int iTempMaintenance;
int iLoop;

iWorstCityMaintenance = 0;
iBestCapitalMaintenance = MAX_INT;

for (pLoopCity = GET_PLAYER(getOwnerINLINE()).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(getOwnerINLINE()).nextCity(&iLoop))
{
iTempMaintenance = 100 * (GC.getDefineINT("MAX_DISTANCE_CITY_MAINTENANCE") * plotDistance(getX_INLINE(), getY_INLINE(), pLoopCity->getX_INLINE(), pLoopCity->getY_INLINE()));

iTempMaintenance *= (getPopulation() + 7);
iTempMaintenance /= 10;

iTempMaintenance *= std::max(0, (GET_PLAYER(getOwnerINLINE()).getDistanceMaintenanceModifier() + 100));
iTempMaintenance /= 100;

iTempMaintenance *= GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getDistanceMaintenancePercent();
iTempMaintenance /= 100;

iTempMaintenance *= GC.getHandicapInfo(getHandicapType()).getDistanceMaintenancePercent();
iTempMaintenance /= 100;

iTempMaintenance /= GC.getMapINLINE().maxPlotDistance();

iWorstCityMaintenance = std::max(iWorstCityMaintenance, iTempMaintenance);

if (pLoopCity->isGovernmentCenter())
{
iBestCapitalMaintenance = std::min(iBestCapitalMaintenance, iTempMaintenance);
}
}

iTempMaintenance = std::min(iWorstCityMaintenance, iBestCapitalMaintenance);
FAssert(iTempMaintenance >= 0);

return iTempMaintenance;
 
After spending the weekend with Python and a test game I found a formula which is providing the Distance Maintenance as shown in the City Screen.

There are two errors in the formula provided by eg577 earlier in this thread:
First, there is no building_M (Building Modifier) for Distance Maintenance. A courthouse has no influence on Distance Maintenance.
Second, MaxPlotDistance (eg577 was calling it DistanceScale) is not MapHeight + MapWidth.

Here my Formula for Distance Maintenance:

=(100 x (MaxDistanceCityMaint x Distance) x (CityPop + 7) / 10 x (DistanceModifier + 100) / 100 x DistanceMaintPercent/100 x HandicapPercent/100) / MaxPlotDistance

With:
MaxDistanceCityMaint a constant =25
Distance: Distance of City to Palace (or Forbidden Palace, Versailles)
CityPop: Population of City
DistanceModifier: Is always 0 except if civic is State property. Then it is -100 and CityMaint gets 0
DistanceMaintPercent: Depending from Mapsize. For Standard = 80
HandicapPercent: Depending from Difficulty Level. For Emporer =95
MaxPlotDistance: For cylindrical map with Standard size (64 x 42): 58

Note: MaxPlotDistance 58 will not work. I had to use 55. To me it is not clear how to determine MaxPlotsize for different maps.

At the end the formula above works fine for my 2 test games. Distance Maintenance is a linear function on not only the distance from Palace but the city population as well. So whipping your pop will reduce your maintenance cost.

Graph in Spoiler is showing dependency of DistanceMaintenance from Distance to Palace for Emporer game on standard map and city population = 4
Spoiler :




Graph in Spoiler is showing dependency of DistanceMaintenance from City population for Emporer game on standard map and distance to palace = 10
Spoiler :




Spoiler shows how I determined MaxPlotDistance for Standard map size.
Spoiler :




Maybe one of you can help me to understand the calculation of MaxPlotSize better. That's one thing I'm still unclear. And I would appriciate if more users could verify my formula.
But at the end I'm happy that I can calculate Distance Maintenace for BTS 3.19.
Regards,
Spaghetti
 

Attachments

  • MaintenanceVsDistance.jpg
    MaintenanceVsDistance.jpg
    98.4 KB · Views: 1,019
  • MaintenanceVspopulation.jpg
    MaintenanceVspopulation.jpg
    132.2 KB · Views: 1,014
  • MaxPlotDistanceStandardMap.jpg
    MaxPlotDistanceStandardMap.jpg
    221 KB · Views: 983
This is a section from a larger project I'm working on. It should explain all the observations in earlier posts. Things really are not all that strange and there are no humps or plateaus. It's a simple linear function, albeit with a number of factors.

I took a look at the pdf's equation and found that, regardless of difficulty level or map size XML values, the fluctuating in-game variable expenses within the Distance-Based City Maintenance (DBCM) remain constant to each other.

After a game is started, the player has control over the following DBCM related costs:
- distance of city from the gov't center
- # of buildings within the city
- city population
- whether or not the city contains a maintenance reducing building (ie. courthouse)

Of the first three, the least expensive is
population 'X' (X = the DBCM cost of increasing the city population by 1), then

distance to a gov't center '4X' (each additional tile away from the gov't. center is equal to the cost of increasing the population by 4), and then

# of buildings within the city '8X' (each additional building is equal to the cost of increasing the population by 8 [note: this is reduced by 50% with a courthouse or 20% with a Zulu barracks]).

I did not consider the impact of State Property/Kremlin as none of my games last that long.
 
Top Bottom