• We are currently performing site maintenance, parts of civfanatics are currently offline, but will come back online in the coming days. For more updates please see here.

City Flipping: Culture or Espionage?

Woodreaux

Prince
Joined
Sep 18, 2007
Messages
357
Location
So Cal
I know there have been many discussion on the merits of obtaining techs using :espionage: rather than :science:. The efficiency arguments often boil down to sheer number of :espionage: points you harvest from the buildings compared to the national economy investments needed to wrack up beakers/flasks.

So here's a similar question: how does a series of Spread Culture spy missions targeting a single rival's city compare with cranking up the :culture: slider, and running artists and/or building :culture: in nearby cities? In this situation, please assume the empire has lots of mature towns, so the slider is very relevant.

Intuitively, I would imagine directly applying the slider will produce much more raw :culture:. But it's spread out across the whole Civilization, and pretty much wasted if the shared border is really short. So if I'm trying to take over a border city with culture, do yall find espionage missions are more effective than the direct :culture: impact, or no?
 
Espionage, easily. It depends on mapsize a bit. I usually play on the largest mapsizes so running a high culture slider means the commerce of more cities is wasted just so you can take over 1 city. On smaller mapsizes, the benefit of taking a single city is greater, so the cost of running the culture slider is not as worrying.

The problem with taking cities via espionage is that you need to have spread at least 1 culture onto the target city anyway. This means you can only take the cities closest to your borders, and you have to have paid at least some attention to culture building already.

But generally speaking, running the spread culture mission repeatedly (maybe 10 times or so in about 10 turns) is often enough to flip a city and it's pretty fun/funny! It's most viable if running an espionage economy of some description and only if the civ is one which you would want to avoid war with anyway. You can take the valuable border cities of your best ally with no diplomatic penalty other than the few spies that get caught and the close borders (which you'd already have anyway). And if you're running an esp economy, you'd have the negative diplo from spies being caught already as well.

The Spread Culture mission IMO is a very powerful feature that many, if not most, players have not discovered, even though it is mentioned in some excellent Strategy Articles. EDIT: It would seem part of the reason for this is that, as pointed out below, 3.17 broke the Spread Culture mission so that it only spread 0.05% culture instead of 5% and it has only been fixed in Dresden's Unofficial Patch. So those playing stock 3.17 will find the mission 100% useless.

It was from one such article that I learned that using Spread Culture a few times on a city you wish to steal techs from will make the tech stealing cheaper in the long run as well!
 
Are you SURE POM? That's not what I remember about spread culture at all.

IIRC, it actually affected the set culture within the city screen, but not TILE culture (which is what flips cities). In other words, it was possible to spread your culture into a city such that it had 2+ border pops the turn it left revolt...or even to make it come out of revolt legendary. My understanding was that this was patched out in 3.17 and the mission was never truly fixed to do anything of substance afterwards.

Was I mistaken? I haven't played with the mission a whole lot since it was changed TBH. Does it actually affect tile culture now?
 
TMIT. I'm not 100% certain how the distinction between city culture and tile culture works, but I'm very confident that the culture you inject through this mission does contribute to the city being more likely to flip. This was made painfully evident when I discovered the bug in an older version of Better AI, where injecting culture just 3 or so times was enough to flip the city... a couple more injections was enough to send it to more than 10 times the amount of culture it needed for Legendary. :lol: (the mission was injecting 500% of total city culture instead of the 5% it should have been)

It definitely helps flip cities. It doesn't help spread culture around that city until you do flip it and the city is already at a higher culture level when it comes out of revolt.

EDIT. After a bit of experimenting in game, I'm not as sure about the above details now. I think the amount of culture you can spread to the city depends on the city culture (5%) but indeed the culture that flips the city is the tile culture. For an established city, the tile culture could be huge. I think what make the tile culture huge is if another city is putting culture on it. I'm curious... seeing as the tile culture multiplier increases by 20 each time the city has another radius, does the city tile have 20 straight away? I'm going to look for the article on it.

EDIT2. This is the thread where it all started IIRC. I think I was also wrong when I said "It doesn't help spread culture around that city until you do flip it and the city is already at a higher culture level when it comes out of revolt."
 
Ok I found it. Wow. This was a pretty interesting topic so I ran some tests and I was getting way different behavior than UncleJJ was. Then I saw that disclaimer that UncleJJ was running 3.13 and the readme for 3.17 claims: So I decided to do a comparison of the SDK sources and it appears that the 3.17 patch completely destroys this mission. Here is the relevant piece of CvPlayer::doEspionageMission() from Bhruic's 3.13 patch (I don't have the original 3.13 sources):
Spoiler :
Code:
	////////////////////////////// 	// Insert Culture into City  	if (kMission.getCityInsertCultureCostFactor() > 0) 	{ 		if (NULL != pPlot) 		{ 			CvCity* pCity = pPlot->getPlotCity();  			if (NULL != pCity) 			{ 				int iCultureAmount = kMission.getCityInsertCultureAmountFactor() * pCity->countTotalCultureTimes100(); 				iCultureAmount /= 10000; 				iCultureAmount = std::max(1, iCultureAmount);  				szBuffer = gDLL->getText("TXT_KEY_ESPIONAGE_TARGET_CITY_CULTURE_INSERTED", pCity->getNameKey()).GetCString();				 				pCity->changeCulture(getID(), iCultureAmount, true, true);  				bSomethingHappened = true; 			}  		} 	}
And here is how the official 3.17 patch handles things:
Spoiler :
Code:
	////////////////////////////// 	// Insert Culture into City  	if (kMission.getCityInsertCultureCostFactor() > 0) 	{ 		if (NULL != pPlot) 		{ 			CvCity* pCity = pPlot->getPlotCity();  			if (NULL != pCity) 			{ 				szBuffer = gDLL->getText("TXT_KEY_ESPIONAGE_TARGET_CITY_CULTURE_INSERTED", pCity->getNameKey()).GetCString();				  				int iCultureAmount = kMission.getCityInsertCultureAmountFactor() * pCity->countTotalCultureTimes100(); 				iCultureAmount /= 10000; 				iCultureAmount = std::max(1, iCultureAmount);  				int iNumTurnsApplied = (GC.getDefineINT("GREAT_WORKS_CULTURE_TURNS") * GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getUnitGreatWorkPercent()) / 100;  				for (int i = 0; i < iNumTurnsApplied; ++i) 				{ 					pCity->changeCultureTimes100(getID(), iCultureAmount / iNumTurnsApplied, true, true); 				}  				if (iNumTurnsApplied > 0) 				{ 					pCity->changeCultureTimes100(getID(), iCultureAmount % iNumTurnsApplied, false, true); 				}  				bSomethingHappened = true; 			}  		} 	}
It looks like the purpose of the change was to have several small increases in the TC portion of the culture rather than having the entire increase applied to the TC at once. But there's a big problem with this implementation. In 3.13/Bhruic, the game used a single call to changeCulture() but in 3.17/Official it instead uses changeCultureTimes100(). However, the base amount of culture added is the same! So while 3.13 adds 5% of the culture for you 3.17 actually only adds .05% :eek: Here's an example of the 3.17 behavior from an ad-hoc in-game test. The game situation was that the Khmer had a city with 280 total culture, generating 3 culture per turn. Using WorldBuilder, I placed a city of my own three tiles due west of them and gave my city 150 culture so that the culture spread mission would be possible and placed a bunch of spies. First spread culture mission:
Code:
				int iCultureAmount = kMission.getCityInsertCultureAmountFactor() * pCity->countTotalCultureTimes100(); 				iCultureAmount /= 10000; 				iCultureAmount = std::max(1, iCultureAmount);
countTotalCultureTimes100() returns 28000 as expected since there was 280 Khmer culture and nothing else there. Thus, iCultureAmount = 5 * 28000 / 10000 = 14. So far so good as this is the expected 5%.
Code:
				int iNumTurnsApplied = (GC.getDefineINT("GREAT_WORKS_CULTURE_TURNS") * GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getUnitGreatWorkPercent()) / 100;
Since the game was on epic speed and the global define wasn't changed, iNumTurnsApplied is 30.
Code:
				for (int i = 0; i < iNumTurnsApplied; ++i) 				{ 					pCity->changeCultureTimes100(getID(), iCultureAmount / iNumTurnsApplied, true, true); 				}
Now with integer mathematics iCultureAmount/iNumTurnsApplied = 14/30 = 0. Thus we add absolutely nothing to both the City and Plot culture 30 times. :)
Code:
				if (iNumTurnsApplied > 0) 				{ 					pCity->changeCultureTimes100(getID(), iCultureAmount % iNumTurnsApplied, false, true); 				}
Now, iCultureAmount % iNumTurnsApplied will be 14 and so we will add 14 of my civ's culture to the city only. But wait! The function is using changeCultureTimes100 so in actuality it is adding only .14 culture. :eek: If you call countTotalCultureTimes100() and getCultureTimes100() on that city immediately after this and divide all returned values by 100, it tells you there is 280.14 culture, 280.00 of which is Khmer and .14 of which is mine. This was verified in the Python Console. I ran the spread culture mission 3 more times over the next 3 turns and each time, the mission told me I'd spread 14 culture, but in actuality was spreading .14 culture. After 17 more successful missions I had a whopping 2.80 total culture in that city. I expect this is why mirthadir (who is running 3.17) was seeing lower-than-expected culture increases on successive missions and why it looked like the game was using 5% of the Japanese culture instead of 5% of the total. It really was using the total, but the amount of added culture was so small as to be almost inconsequential. By the end of the test only 13.6 culture had actually been added after 2 dozen missions. In summary, I fear spread culture is pretty close to useless under 3.17. It looks like they tried to adjust the "TC" amount and in the process completely broke it...[/QUOTE]"]Post
by Dresden.
Spoiler :

Wow. This was a pretty interesting topic so I ran some tests and I was getting way different behavior than UncleJJ was. Then I saw that disclaimer that UncleJJ was running 3.13 and the readme for 3.17 claims:
So I decided to do a comparison of the SDK sources and it appears that the 3.17 patch completely destroys this mission.

Here is the relevant piece of CvPlayer::doEspionageMission() from Bhruic's 3.13 patch (I don't have the original 3.13 sources):
Spoiler :
Code:
	//////////////////////////////
	// Insert Culture into City

	if (kMission.getCityInsertCultureCostFactor() > 0)
	{
		if (NULL != pPlot)
		{
			CvCity* pCity = pPlot->getPlotCity();

			if (NULL != pCity)
			{
				int iCultureAmount = kMission.getCityInsertCultureAmountFactor() * pCity->countTotalCultureTimes100();
				iCultureAmount /= 10000;
				iCultureAmount = std::max(1, iCultureAmount);

				szBuffer = gDLL->getText("TXT_KEY_ESPIONAGE_TARGET_CITY_CULTURE_INSERTED", pCity->getNameKey()).GetCString();				
				pCity->changeCulture(getID(), iCultureAmount, true, true);

				bSomethingHappened = true;
			}

		}
	}

And here is how the official 3.17 patch handles things:

Spoiler :
Code:
	//////////////////////////////
	// Insert Culture into City

	if (kMission.getCityInsertCultureCostFactor() > 0)
	{
		if (NULL != pPlot)
		{
			CvCity* pCity = pPlot->getPlotCity();

			if (NULL != pCity)
			{
				szBuffer = gDLL->getText("TXT_KEY_ESPIONAGE_TARGET_CITY_CULTURE_INSERTED", pCity->getNameKey()).GetCString();				

				int iCultureAmount = kMission.getCityInsertCultureAmountFactor() * pCity->countTotalCultureTimes100();
				iCultureAmount /= 10000;
				iCultureAmount = std::max(1, iCultureAmount);

				int iNumTurnsApplied = (GC.getDefineINT("GREAT_WORKS_CULTURE_TURNS") * GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getUnitGreatWorkPercent()) / 100;

				for (int i = 0; i < iNumTurnsApplied; ++i)
				{
					pCity->changeCultureTimes100(getID(), iCultureAmount / iNumTurnsApplied, true, true);
				}

				if (iNumTurnsApplied > 0)
				{
					pCity->changeCultureTimes100(getID(), iCultureAmount % iNumTurnsApplied, false, true);
				}

				bSomethingHappened = true;
			}

		}
	}

It looks like the purpose of the change was to have several small increases in the TC portion of the culture rather than having the entire increase applied to the TC at once. But there's a big problem with this implementation. In 3.13/Bhruic, the game used a single call to changeCulture() but in 3.17/Official it instead uses changeCultureTimes100(). However, the base amount of culture added is the same! So while 3.13 adds 5% of the culture for you 3.17 actually only adds .05% :eek:

Here's an example of the 3.17 behavior from an ad-hoc in-game test. The game situation was that the Khmer had a city with 280 total culture, generating 3 culture per turn. Using WorldBuilder, I placed a city of my own three tiles due west of them and gave my city 150 culture so that the culture spread mission would be possible and placed a bunch of spies.

First spread culture mission:
Code:
				int iCultureAmount = kMission.getCityInsertCultureAmountFactor() * pCity->countTotalCultureTimes100();
				iCultureAmount /= 10000;
				iCultureAmount = std::max(1, iCultureAmount);
countTotalCultureTimes100() returns 28000 as expected since there was 280 Khmer culture and nothing else there. Thus, iCultureAmount = 5 * 28000 / 10000 = 14. So far so good as this is the expected 5%.

Code:
				int iNumTurnsApplied = (GC.getDefineINT("GREAT_WORKS_CULTURE_TURNS") * GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getUnitGreatWorkPercent()) / 100;
Since the game was on epic speed and the global define wasn't changed, iNumTurnsApplied is 30.

Code:
				for (int i = 0; i < iNumTurnsApplied; ++i)
				{
					pCity->changeCultureTimes100(getID(), iCultureAmount / iNumTurnsApplied, true, true);
				}
Now with integer mathematics iCultureAmount/iNumTurnsApplied = 14/30 = 0. Thus we add absolutely nothing to both the City and Plot culture 30 times. :)

Code:
				if (iNumTurnsApplied > 0)
				{
					pCity->changeCultureTimes100(getID(), iCultureAmount % iNumTurnsApplied, false, true);
				}
Now, iCultureAmount % iNumTurnsApplied will be 14 and so we will add 14 of my civ's culture to the city only. But wait! The function is using changeCultureTimes100 so in actuality it is adding only .14 culture. :eek: If you call countTotalCultureTimes100() and getCultureTimes100() on that city immediately after this and divide all returned values by 100, it tells you there is 280.14 culture, 280.00 of which is Khmer and .14 of which is mine. This was verified in the Python Console. I ran the spread culture mission 3 more times over the next 3 turns and each time, the mission told me I'd spread 14 culture, but in actuality was spreading .14 culture. After 17 more successful missions I had a whopping 2.80 total culture in that city.

I expect this is why mirthadir (who is running 3.17) was seeing lower-than-expected culture increases on successive missions and why it looked like the game was using 5% of the Japanese culture instead of 5% of the total. It really was using the total, but the amount of added culture was so small as to be almost inconsequential. By the end of the test only 13.6 culture had actually been added after 2 dozen missions.

In summary, I fear spread culture is pretty close to useless under 3.17. It looks like they tried to adjust the "TC" amount and in the process completely broke it...


Emphasis added by me.

It was wrecked to 0.05% in 3.17. It has been fixed in the unofficial patches (Dresden's ones - not Solver's) so that it is useful again.
 
I don't use the culture slider to take cities. If you want to do that you use espionage or specialists. As pointed out, using hte slider wastes a lot of commerce in your empire. Run artists instead.
 
Thanks y'all. I appreciate the info. That pretty much reinforces what I suspected. Bummer about the over-nerfing of the :culture: spread mission. I'm going to have to look into Dresden's patch.

Normally, the only times I use the :culture: slider is for temporary :) boosts during wars that last too long or UN/AP defiance.
 
Back
Top Bottom