class CulturalRebellion(Rebellion):
@classmethod
def checkConditions(cls, pCivPlayer, pCity):
return ( pCity.isDisorder()
and not pCity.isOccupation()
and not pCity.isNeverLost()
and isChance(iCulturalRebellionPercentage) )
def setRebelPlayer(self, pCity):
self.eRebelPlayer = getHighestCityCulturalRival(pCity)
if self.eRebelPlayer == -1:
self.eRebelPlayer = self.eCityOwner + iNumMajorPlayers
def setNumUnits(self, pCity):
self.iNumUnits = max(1, pCity.getCulturePercentAnger() / 100)
class Resistance(Rebellion):
@classmethod
def checkConditions(cls, pCivPlayer, pCity):
return ( pCity.isDisorder()
and pCity.isOccupation()
and isChance(iResistancePercent) )
def setRebelPlayer(self, pCity):
self.eRebelPlayer = pCity.getPreviousOwner()
def setUnitType(self, pCity):
self.eUnitType = getTechUnitType(self.getRebelCiv().get(CyTeam))
def setNumUnits(self, pCity):
iNatives = pCity.getCulturePercentAnger() / 100
iPopulation = pCity.getPopulation()
self.iNumUnits = max(1, min(iNatives, iPopulation))
def process(self):
if ( Game.getGameTurn() - self.getRebellionTurn() >= iResistanceDomesticTurns
and isChance(iResistanceDomesticPercentage) ):
self.killRebelUnits()
removeRebellion(self)
pDomesticRebellion = DomesticRebellion.initRebellion(self.getCityOwner(), self.getCyCity())
appendRebellion(pDomesticRebellion)
class DomesticRebellion(Rebellion):
@classmethod
def checkConditions(cls, pCivPlayer, pCity):
return ( pCity.isDisorder()
and isChance(iDomesticRebellionPercentage - isCivilized(pCivPlayer) * 5) )
def setRebelPlayer(self, pCity):
self.eRebelPlayer = self.eCityOwner + iNumMajorPlayers
self.updateRebelTechs()
def setNumUnits(self, pCity):
iUnhappyLevel = pCity.unhappyLevel(0)
iPopulation = pCity.getPopulation()
iDistance = getDistanceToCapital(pCity)
self.iNumUnits = iPopulation / 2 * iUnhappyLevel + iDistance
class MinorRevolt(Rebellion):
@classmethod
def checkConditions(cls, pCivPlayer, pCity):
return ( pCity.angryPopulation() > 0
and isChance(iMinorRevoltPercentage) )
def setRebelPlayer(self, pCity):
self.eRebelPlayer = self.eCityOwner + iNumMajorPlayers
self.updateRebelTechs()
def setNumUnits(self, pCity):
iUnhappyLevel = pCity.unhappyLevel(0)
iAngryPopulation = pCity.angryPopulation()
iPopulation = pCity.getPopulation()
self.iNumUnits = max(1, min(iUnhappyLevel - iAngryPopulation, iPopulation))
class CivilWar(Rebellion):
lCivilWarCities = list()
@classmethod
def isCivilWarActive(cls):
return len(cls.lCivilWarCities) > 0
@classmethod
def checkConditions(cls, iNumDefectingCities, iNumTotalCities):
return iNumDefectingCities >= iNumTotalCities * 0.3
@classmethod
def initCivilWar(cls, pCivPlayer, lDefectingCities):
tBiggestCity = None, 0, None
for pCity in lDefectingCities:
pCivilWar = CivilWar(pCivPlayer, pCity)
appendRebellion(pCivilWar)
CivilWar.lCivilWarCities.append(self)
pCivilWar.setActivate()
pCivilWar.flipCity()
iPopulation = pCity.getPopulation()
if iPopulation > tBiggestCity[1]:
tBiggestCity = pCity, iPopulation, pCivilWar
pRebelHive = tBiggestCity[2]
pRebelHive.spawnRebelUnits()
pRebelHive.terminationMessage = CivilWarTerminationMessage
pRebelHive.addRebellionMessage()
pRebelHive.getCityOwner().get(CyPlayer).getCapitalCity().changeExtraHappiness(-2)
def setRebelPlayer(self, pCity):
self.eRebelPlayer = self.eCityOwner + iNumMajorPlayers
self.updateRebelTechs()
def setNumUnits(self, pCity):
self.iNumUnits = 6
def setMessages(self, pCity):
self.rebellionMessage = CivilWarMessage
self.terminationMessage = ""
self.unitSpawnMessage = CivilWarUnitSpawnMessage
def flipCity(self):
pCity = self.getCyCity()
iX, iY = self.getPlotCoords()
pRebelCiv = self.getRebelCiv()
lCityUnits = getCityUnits(pCity)
pRebelCiv.get(CyPlayer).acquireCity(pCity, True, False)
for pUnit in lCityUnits:
pRebelUnit = pRebelCiv.get(PyPlayer).initUnit(pUnit.getUnitType(), iX, iY)
pRebelUnit.convert(pUnit)
for pUnit in lCityUnits:
pUnit.kill(False, pRebelCiv.get(playerID))
def checkTermination(self, iGameTurn):
if not self.getRebelCiv().get(CyPlayer).isAlive():
self.terminateCivilWar()
return True
def terminateCivilWar(self):
for pCivilWar in getGlobalData("lCurrentRebellions"):
if pCivilWar == self: continue
removeRebellion(pCivilWar)
pCivilWar.setDeactivate()
self.getCityOwner().get(CyPlayer).getCapitalCity().changeExtraHappiness(2)
class SlaveRevolt(Rebellion):
@classmethod
def checkConditions(cls):
return isChance(iSlaveRevoltPercentage)
@classmethod
def initSlaveRevolt(cls, pEventTriggeredData):
pCivPlayer = instance(pEventTriggeredData.ePlayer)
pCity = pCivPlayer.get(CyPlayer).getCity(pEventTriggeredData.iCityID)
pSlaveRevolt = SlaveRevolt(pCivPlayer, pCity)
appendRebellion(pSlaveRevolt)
pSlaveRevolt.setActivate()
pSlaveRevolt.spawnRebelUnits()
pSlaveRevolt.addRebellionMessage()
def setRebelPlayer(self, pCity):
self.eRebelPlayer = eSlaves
def setNumUnits(self, pCity):
self.iNumUnits = pCity.getPopulation()
def setMessages(self, pCity):
self.rebellionMessage = slaveRevoltMessage
self.terminationMessage = slaveRevoltTerminationMessage
self.unitSpawnMessage = slaveRevoltMessage
def checkTermination(self, iGameTurn):
if self.getCityOwner().get(CyPlayer).getCivics(eLabor) != eSlavery:
self.revertSlaveCities()
return True
unitFlag = self.getUnitFlag()
for pUnit in self.getRebelCiv().get(PyPlayer).getUnitList():
if pUnit.getScriptData() == unitFlag:
return False
return True
def revertSlaveCities(self):
pPlayer = self.getCityOwner().get(CyPlayer)
for pCity in (city.GetCy() for city in self.getRebelCiv().get(PyPlayer).getCityList()):
pCityOwner.acquireCity(pCity, False, False)