1. We have added a Gift Upgrades feature that allows you to gift an account upgrade to another member, just in time for the holiday season. You can see the gift option when going to the Account Upgrades screen, or on any user profile screen.
    Dismiss Notice

Pillage formula for conquer gold on city capture

Discussion in 'Civ4 Strategy Articles' started by T-hawk, Mar 25, 2010.

  1. T-hawk

    T-hawk Transcend

    Joined:
    Feb 14, 2002
    Messages:
    2,579
    Location:
    Hoboken NJ / NYC
    I recently did a code dive to figure this out, so enjoy. Here is the formula for cash earned when you capture a city. (It's variously called pillage gold or conquer gold; the code calls it capture gold.)

    (20 + 10 × pop + rand(1..50) + rand(1..50)) × TurnsOwned/50

    The first part of the formula is the full value. Then multiply it by X/50 where X is the number of turns the current owner has controlled the city, max 50. So you get full value after 50 turns, or proportionally less before that, which comes to -2% for each turn less than 50.

    It does not appear to scale for game speed.

    In the code, all those numbers are actually values from GlobalDefines.xml:

    Code:
    		<DefineName>BASE_CAPTURE_GOLD</DefineName>
    		<iDefineIntVal>20</iDefineIntVal>
    		<DefineName>CAPTURE_GOLD_PER_POPULATION</DefineName>
    		<iDefineIntVal>10</iDefineIntVal>
    		<DefineName>CAPTURE_GOLD_RAND1</DefineName>
    		<iDefineIntVal>50</iDefineIntVal>
    		<DefineName>CAPTURE_GOLD_RAND2</DefineName>
    		<iDefineIntVal>50</iDefineIntVal>
    		<DefineName>CAPTURE_GOLD_MAX_TURNS</DefineName>
    		<iDefineIntVal>50</iDefineIntVal>
    Here's the code, from Beyond the Sword\Assets\Python\CvGameUtils.py :

    Code:
    def doCityCaptureGold(self, argsList):
    
    	iCaptureGold = 0
    		
    	iCaptureGold += gc.getDefineINT("BASE_CAPTURE_GOLD")
    	iCaptureGold += (pOldCity.getPopulation() * gc.getDefineINT("CAPTURE_GOLD_PER_POPULATION"))
    	iCaptureGold += CyGame().getSorenRandNum(gc.getDefineINT("CAPTURE_GOLD_RAND1"), "Capture Gold 1")
    	iCaptureGold += CyGame().getSorenRandNum(gc.getDefineINT("CAPTURE_GOLD_RAND2"), "Capture Gold 2")
    
    	if (gc.getDefineINT("CAPTURE_GOLD_MAX_TURNS") > 0):
    		iCaptureGold *= cyIntRange((CyGame().getGameTurn() - pOldCity.getGameTurnAcquired()), 0, gc.getDefineINT("CAPTURE_GOLD_MAX_TURNS"))
    		iCaptureGold /= gc.getDefineINT("CAPTURE_GOLD_MAX_TURNS")
    		
    	return iCaptureGold
     

Share This Page