Taking a city is not instant. When your unit occupies an enemy city, a hidden capture-turns counter ticks up each turn you hold it; the city flips to you only when the counter reaches its threshold. Leave or get pushed off before then and the progress unwinds. The threshold depends on the city's culture level and on whether you originally founded it.
How the counter works
-
Each turn your unit is actively occupying the city
(
isUnitCapturingCity), the counter increases by +1 (changeCaptureTurns(1)). -
The city flips the moment the counter reaches
getCaptureThreshold()— control transfers and the city is left damaged to 50% HP (CITY_CAPTURE_DAMAGE_PERCENT). - If no one is occupying it, the counter ticks −1 per turn and resets to 0 — an interrupted capture is undone. You must hold the city continuously for the full count.
-
Recapture / liberation also resets the counter to 0 when ownership
changes (
setCaptureTurns(0)).
The threshold formula
The culture term uses the highest culture level of any team other than
the capturer that has culture in the city — effectively the defender's
cultural entrenchment. Per culture.xml
(iExtraCaptureTurns):
| City culture | Extra turns |
|---|---|
| Weak | +0 |
| Developing | +1 |
| Strong | +2 |
| Legendary | +3 |
The +1 original-founder term is getCaptureTeam() !=
getFirstTeam(): it applies when you take a city your team did
not found, so retaking your own former city is exactly one turn
faster — and "your own" means the team that originally founded it, even
if an enemy captured and grew it since.
Turns to flip
Hold-time required, by the city's culture level and whether you founded it:
| City culture | Taking a foreign city | Retaking your own |
|---|---|---|
| Weak (+0) | 3 | 2 |
| Developing (+1) | 4 | 3 |
| Strong (+2) | 5 | 4 |
| Legendary (+3) | 6 | 5 |
So a freshly-founded enemy outpost flips in 3 turns of unbroken occupation; an old Legendary enemy capital takes 6. Liberating one of your own cities shaves a turn off each.
When a captured city is razed instead
On reaching the threshold, the city is normally transferred. It is
razed instead in two cases (setCaptureTurns):
-
A Tribe captures it and the
GAMEOPTION_ALLOW_CITY_RAZINGoption is on. -
A player captures it but is already at their city cap
(
isCityMaxReached()) — they can't hold another, so it burns.
Worked example
- You assault a rival's Strong-culture city (you did not found it). Threshold = 2 (base) + 2 (Strong) + 1 (not founder) = 5.
- Your unit occupies the city. Each end of turn it holds, the counter goes 1 → 2 → 3 → 4 → 5.
- If a relief force evicts your unit on, say, turn 3 (counter at 3), the counter starts falling −1/turn back toward 0 — you'd have to start over.
- Hold all 5 turns and the city flips to you at 50% HP. If that same city had originally been yours, it would have flipped in 4.
Source: City.cs — getCaptureThreshold() (formula),
setCaptureTurns() (flip / raze / 50% damage), and the
+1 / −1 accrual in doTribeTurn(). Constants from
globalsInt.xml (CITY_BASE_CAPTURE_TURNS,
CITY_CAPTURE_DAMAGE_PERCENT) and
culture.xml (iExtraCaptureTurns).