def tamilConquestUP(self, iEnemy, iNumTargets=1): # Unused lEnemyCities = [] print "Getting closest city." for pCity in utils.getCityList(iEnemy): iDist = utils.calculateDistance(pCity.getX(), pCity.getY(), pTamils.getCapitalCity().getX(), pTamils.getCapitalCity().getY()) lEnemyCities.append((iDist, pCity)) lEnemyCities.sort() for i in range(iNumTargets): if lEnemyCities: pTargetCity = lEnemyCities.pop(0)[1] tPlot = utils.findNearestLandPlot( (pTargetCity.getX(), pTargetCity.getY()), iTamils) utils.makeUnitAI(iSwordsman, iTamils, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2) utils.makeUnitAI(iWarElephant, iTamils, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) utils.makeUnitAI(iCatapult, iTamils, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) CyInterface().addMessage( iEnemy, False, iDuration, CyTranslator().getText("TXT_KEY_UP_TAMIL_CONQUESTS_TARGET", ()), "", 0, "", ColorTypes(iWhite), -1, -1, True, True)
def greekConquestUP(self, iEnemy, iNumTargets=1): # Unused lEnemyCities = [] print "Getting closest city." for city in utils.getCityList(iEnemy): iDist = utils.calculateDistance(pCity.getX(), pCity.getY(), pGreece.getCapitalCity().getX(), pGreece.getCapitalCity().getY()) lEnemyCities.append((iDist, pCity)) lEnemyCities.sort() for i in range(iNumTargets): if len(lEnemyCities) > 0: pTargetCity = lEnemyCities.pop(0)[1] tPlot = utils.findNearestLandPlot( (pTargetCity.getX(), pTargetCity.getY()), iGreece) iExtra = 0 if utils.getHumanID() not in [iGreece, iEnemy]: iExtra = 1 if iEnemy == iPersia: iExtra = 2 utils.makeUnitAI(iHoplite, iGreece, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 20 + iExtra * 2) utils.makeUnitAI(iCatapult, iGreece, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 10 + iExtra * 2) CyInterface().addMessage( iEnemy, False, iDuration, CyTranslator().getText("TXT_KEY_UP_GREEK_CONQUESTS_TARGET", ()), "", 0, "", ColorTypes(iWhite), -1, -1, True, True)
def greekConquestUP(self, iEnemy, iNumTargets=1): # Unused lEnemyCities = [] print "Getting closest city." for city in utils.getCityList(iEnemy): iDist = utils.calculateDistance(pCity.getX(), pCity.getY(), pGreece.getCapitalCity().getX(), pGreece.getCapitalCity().getY()) lEnemyCities.append((iDist, pCity)) lEnemyCities.sort() for i in range(iNumTargets): if len(lEnemyCities) > 0: pTargetCity = lEnemyCities.pop(0)[1] tPlot = utils.findNearestLandPlot((pTargetCity.getX(), pTargetCity.getY()), iGreece) iExtra = 0 if utils.getHumanID() not in [iGreece, iEnemy]: iExtra = 1 if iEnemy == iPersia: iExtra = 2 utils.makeUnitAI(iGreekHoplite, iGreece, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2+iExtra*2) utils.makeUnitAI(iCatapult, iGreece, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1+iExtra*2) utils.makeUnitAI(iGreekHetairoi, iGreece, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1+iExtra*2) CyInterface().addMessage(iEnemy, False, iDuration, CyTranslator().getText("TXT_KEY_UP_GREEK_CONQUESTS_TARGET", ()), "", 0, "", ColorTypes(iWhite), -1, -1, True, True)
def romanConquestUP(self, iEnemy, iNumTargets=1, lPreferredTargetRegions=[]): # Unused lEnemyCities = [] lPreferredCities = [] print "Getting closest city." for city in utils.getCityList(iEnemy): iDist = utils.calculateDistance(pCity.getX(), pCity.getY(), pRome.getCapitalCity().getX(), pRome.getCapitalCity().getY()) lEnemyCities.append((iDist, pCity)) if pCity.getRegionID() in lPreferredTargetRegions: lPreferredCities.append((iDist, pCity)) if lPreferredCities: lEnemyCities = lPreferredCities lEnemyCities.sort() for i in range(iNumTargets): if lEnemyCities: pTargetCity = lEnemyCities.pop(0)[1] tPlot = utils.findNearestLandPlot((pTargetCity.getX(), pTargetCity.getY()), iRome) iExtra = 0 if utils.getHumanID() != iRome and utils.getHumanID() != iEnemy: iExtra = 1 utils.makeUnitAI(iRomanLegion, iRome, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2+iExtra) utils.makeUnitAI(iCatapult, iRome, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1+iExtra*2) #utils.debugTextPopup("Roman conquerors against "+CyTranslator().getText(str(gc.getPlayer(iEnemy).getCivilizationShortDescriptionKey()), ())) CyInterface().addMessage(iRome, False, iDuration, CyTranslator().getText("TXT_KEY_UP_ROMAN_CONQUESTS",(gc.getPlayer(iEnemy).getCivilizationShortDescriptionKey(),)), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) CyInterface().addMessage(iEnemy, False, iDuration, CyTranslator().getText("TXT_KEY_UP_ROMAN_CONQUESTS_TARGET", ()), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) print ("Message displayed.")
def romanConquestUP(self, iEnemy, iNumTargets=1, lPreferredTargetRegions=[]): # Unused lEnemyCities = [] lPreferredCities = [] print "Getting closest city." for city in utils.getCityList(iEnemy): iDist = utils.calculateDistance(pCity.getX(), pCity.getY(), pRome.getCapitalCity().getX(), pRome.getCapitalCity().getY()) lEnemyCities.append((iDist, pCity)) if pCity.getRegionID() in lPreferredTargetRegions: lPreferredCities.append((iDist, pCity)) if lPreferredCities: lEnemyCities = lPreferredCities lEnemyCities.sort() for i in range(iNumTargets): if lEnemyCities: pTargetCity = lEnemyCities.pop(0)[1] tPlot = utils.findNearestLandPlot((pTargetCity.getX(), pTargetCity.getY()), iRome) iExtra = 0 if utils.getHumanID() != iRome and utils.getHumanID() != iEnemy: iExtra = 1 utils.makeUnitAI(iLegion, iRome, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2+iExtra) utils.makeUnitAI(iCatapult, iRome, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1+iExtra*2) #utils.debugTextPopup("Roman conquerors against "+CyTranslator().getText(str(gc.getPlayer(iEnemy).getCivilizationShortDescriptionKey()), ())) CyInterface().addMessage(iRome, False, iDuration, CyTranslator().getText("TXT_KEY_UP_ROMAN_CONQUESTS",(gc.getPlayer(iEnemy).getCivilizationShortDescriptionKey(),)), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) CyInterface().addMessage(iEnemy, False, iDuration, CyTranslator().getText("TXT_KEY_UP_ROMAN_CONQUESTS_TARGET", ()), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) print ("Message displayed.")
def infectCitiesNear(self, iPlayer, startingX, startingY): for city in utils.getCityList(iPlayer): if utils.calculateDistance(city.getX(), city.getY(), startingX, startingY) <= 3: self.infectCity(city) if (gc.getDefineINT("PYTHON_LOG_ON_MAIN_PLAGUE") == 1): utils.logwithid(iPlayer, ' is infecting near city') self.announceForeignPlagueSpread(city)
def spreadBetweenCities(self, iPlayer, lSourceCities, lTargetCities): if data.players[iPlayer].iPlagueCountdown <= 2: return random.shuffle(lTargetCities) for targetCity in lTargetCities: if [city for city in lSourceCities if targetCity.isConnectedTo(city) and utils.calculateDistance(targetCity.getX(), targetCity.getY(), city.getX(), city.getY()) <= 6]: self.infectCity(targetCity) return
def spreadBetweenCities(self, iPlayer, lSourceCities, lTargetCities): if data.players[iPlayer].iPlagueCountdown <= 2: return random.shuffle(lTargetCities) for targetCity in lTargetCities: if [ city for city in lSourceCities if targetCity.isConnectedTo(city) and utils.calculateDistance(targetCity.getX( ), targetCity.getY(), city.getX(), city.getY()) <= 6 ]: self.infectCity(targetCity) return
def tradingCompanyCulture(self, city, iCiv, iPreviousOwner): tCity = (city.getX(), city.getY()) x, y = tCity for (i, j) in utils.surroundingPlots(tCity): pPlot = gc.getMap().plot(i, j) if (i, j) == tCity: utils.convertPlotCulture(pPlot, iCiv, 51, False) elif pPlot.isCity(): pass elif utils.calculateDistance(i, j, x ,y) == 1: utils.convertPlotCulture(pPlot, iCiv, 65, True) else: if pPlot.getOwner() == iPreviousOwner: utils.convertPlotCulture(pPlot, iCiv, 15, False)
def turkishUP(self, city, iCiv, iPreviousOwner): tPlot = (city.getX(), city.getY()) x, y = tPlot for (i, j) in utils.surroundingPlots(tPlot, 2): pPlot = gc.getMap().plot(i, j) if (i, j) == tPlot: utils.convertPlotCulture(pPlot, iCiv, 51, False) elif pPlot.isCity(): pass elif utils.calculateDistance(i, j, x ,y) == 1: utils.convertPlotCulture(pPlot, iCiv, 80, True) else: if pPlot.getOwner() == iPreviousOwner: utils.convertPlotCulture(pPlot, iCiv, 20, False)
def ottomanUP(self, city, iCiv, iPreviousOwner): tPlot = (city.getX(), city.getY()) x, y = tPlot for (i, j) in utils.surroundingPlots(tPlot, 2): pPlot = gc.getMap().plot(i, j) if (i, j) == tPlot: utils.convertPlotCulture(pPlot, iCiv, 51, False) elif pPlot.isCity(): pass elif utils.calculateDistance(i, j, x, y) == 1: utils.convertPlotCulture(pPlot, iCiv, 80, True) else: if pPlot.getOwner() == iPreviousOwner: utils.convertPlotCulture(pPlot, iCiv, 20, False)
def tradingCompanyCulture(self, city, iCiv, iPreviousOwner): tCity = (city.getX(), city.getY()) x, y = tCity for (i, j) in utils.surroundingPlots(tCity): pPlot = gc.getMap().plot(i, j) if (i, j) == tCity: utils.convertPlotCulture(pPlot, iCiv, 51, False) elif pPlot.isCity(): pass elif utils.calculateDistance(i, j, x, y) == 1: utils.convertPlotCulture(pPlot, iCiv, 65, True) else: if pPlot.getOwner() == iPreviousOwner: utils.convertPlotCulture(pPlot, iCiv, 15, False)
def spawnConquerors(self, iPlayer, iPreferredTarget, tTL, tBR, iNumTargets, iYear, iIntervalTurns, iWarPlan = WarPlanTypes.WARPLAN_TOTAL): lCities = [] for city in utils.getAreaCities(utils.getPlotList(tTL, tBR)): if city.getOwner() != iPlayer and not gc.getTeam(city.getOwner()).isVassal(iPlayer): lCities.append(city) capital = gc.getPlayer(iPlayer).getCapitalCity() lTargetCities = [] for i in range(iNumTargets): if len(lCities) == 0: break targetCity = utils.getHighestEntry(lCities, lambda x: -utils.calculateDistance(x.getX(), x.getY(), capital.getX(), capital.getY()) + int(x.getOwner() == iPreferredTarget) * 1000) lTargetCities.append(targetCity) lCities.remove(targetCity) lOwners = [] for city in lTargetCities: if city.getOwner() not in lOwners: lOwners.append(city.getOwner()) if iPreferredTarget not in lOwners and gc.getPlayer(iPreferredTarget).isAlive(): gc.getTeam(iPlayer).declareWar(iPreferredTarget, True, iWarPlan) for iOwner in lOwners: gc.getTeam(iPlayer).declareWar(iOwner, True, iWarPlan) CyInterface().addMessage(iOwner, False, iDuration, CyTranslator().getText("TXT_KEY_UP_CONQUESTS_TARGET", (gc.getPlayer(iPlayer).getCivilizationShortDescription(0),)), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) for city in lTargetCities: iExtra = 0 if utils.getHumanID() not in [iPlayer, city.getOwner()]: iExtra = 1 #max(1, gc.getPlayer(iPlayer).getCurrentEra()) tPlot = utils.findNearestLandPlot((city.getX(), city.getY()), iPlayer) iBestInfantry = utils.getBestInfantry(iPlayer) iBestSiege = utils.getBestSiege(iPlayer) if iPlayer == iGreece: iBestInfantry = iHoplite iBestSiege = iCatapult utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2 + iExtra) utils.makeUnitAI(iBestSiege, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1 + 2*iExtra) if iPlayer == iTamils: utils.makeUnitAI(iWarElephant, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) if iPlayer == iSpain: utils.makeUnitAI(utils.getBestCavalry(iPlayer), iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2 * iExtra)
def damageNearbyUnits(self, city): for (x, y) in utils.surroundingPlots((city.getX(), city.getY()), 3): plot = gc.getMap().plot(x, y) iDistance = utils.calculateDistance(city.getX(), city.getY(), x, y) if iDistance == 0: self.killUnitsByPlague(city, plot, 0, 42, 2) elif not plot.isCity(): if iDistance < 3: if plot.isRoute(): self.killUnitsByPlague(city, plot, 10, 35, 0) else: self.killUnitsByPlague(city, plot, 30, 35, 0) else: if plot.isRoute() or plot.isWater(): self.killUnitsByPlague(city, plot, 30, 35, 0)
def spreadBetweenCities(self, iPlayer, lSourceCities, lTargetCities): if data.players[iPlayer].iPlagueCountdown <= 2: return random.shuffle(lTargetCities) for targetCity in lTargetCities: if [ city for city in lSourceCities if targetCity.isConnectedTo(city) and utils.calculateDistance(targetCity.getX( ), targetCity.getY(), city.getX(), city.getY()) <= 6 ]: self.infectCity(targetCity) if (gc.getDefineINT("PYTHON_LOG_ON_MAIN_PLAGUE") == 1): utils.logwithid(iPlayer, ' plague is spreading between city') return
def damageNearbyUnits(self, city): for (x, y) in utils.surroundingPlots((city.getX(), city.getY()), 3): plot = gc.getMap().plot(x, y) iDistance = utils.calculateDistance(city.getX(), city.getY(), x, y) if iDistance == 0: self.killUnitsByPlague(city, plot, 0, 42, 2) elif not plot.isCity(): if iDistance < 3: if plot.isRoute(): self.killUnitsByPlague(city, plot, 10, 35, 0) else: self.killUnitsByPlague(city, plot, 30, 35, 0) else: if plot.isRoute() or plot.isWater(): self.killUnitsByPlague(city, plot, 30, 35, 0)
def spawnConquerors(self, iPlayer, iPreferredTarget, tTL, tBR, iNumTargets, iYear, iIntervalTurns, iWarPlan = WarPlanTypes.WARPLAN_TOTAL): lCities = [] for city in utils.getAreaCities(utils.getPlotList(tTL, tBR)): if city.getOwner() != iPlayer and not gc.getTeam(city.getOwner()).isVassal(iPlayer): lCities.append(city) capital = gc.getPlayer(iPlayer).getCapitalCity() lTargetCities = [] for i in range(iNumTargets): if len(lCities) == 0: break targetCity = utils.getHighestEntry(lCities, lambda x: -utils.calculateDistance(x.getX(), x.getY(), capital.getX(), capital.getY()) + int(x.getOwner() == iPreferredTarget) * 1000) lTargetCities.append(targetCity) lCities.remove(targetCity) lOwners = [] for city in lTargetCities: if city.getOwner() not in lOwners: lOwners.append(city.getOwner()) if iPreferredTarget not in lOwners and gc.getPlayer(iPreferredTarget).isAlive(): gc.getTeam(iPlayer).declareWar(iPreferredTarget, True, iWarPlan) for iOwner in lOwners: gc.getTeam(iPlayer).declareWar(iOwner, True, iWarPlan) CyInterface().addMessage(iOwner, False, iDuration, CyTranslator().getText("TXT_KEY_UP_CONQUESTS_TARGET", (gc.getPlayer(iPlayer).getCivilizationShortDescription(0),)), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) for city in lTargetCities: iExtra = 0 if utils.getHumanID() not in [iPlayer, city.getOwner()]: iExtra = 1 tPlot = utils.findNearestLandPlot((city.getX(), city.getY()), iPlayer) iBestInfantry = utils.getBestInfantry(iPlayer) iBestSiege = utils.getBestSiege(iPlayer) if iPlayer == iGreece: iBestInfantry = iGreekHoplite iBestSiege = iCatapult utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2 + iExtra) utils.makeUnitAI(iBestSiege, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1 + 2*iExtra) if iPlayer == iTamils: utils.makeUnitAI(iWarElephant, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1)
def onCityAcquired(self, iOldOwner, iNewOwner, city): if (city.getNumRealBuilding(iPlague) > 0): if ( sd.getPlagueCountdown(iNewOwner) <= 0 and gc.getGame().getGameTurn() > getTurnForYear( con.tBirth[iNewOwner]) + utils.getTurns(iImmunity) ): #skip immunity in this case (to prevent expoiting of being immune to conquer weak civs), but not for the new born civs self.spreadPlague(iNewOwner) apCityList = PyPlayer(iNewOwner).getCityList() for pCity in apCityList: cityNear = pCity.GetCy() if (utils.calculateDistance(city.getX(), city.getY(), cityNear.getX(), cityNear.getY()) <= 3): self.infectCity(cityNear) return city.setNumRealBuilding(iPlague, 0)
def infectCitiesNear(self, iPlayer, startingX, startingY): apCityList = PyPlayer(iPlayer).getCityList() for pCity in apCityList: city = pCity.GetCy() if (utils.calculateDistance(city.getX(), city.getY(), startingX, startingY) <= 3): self.infectCity(city) iHuman = utils.getHumanID() if (gc.getPlayer(iHuman).canContact(iPlayer) and iHuman != iPlayer): CyInterface().addMessage( iHuman, True, con.iDuration / 2, CyTranslator().getText("TXT_KEY_PLAGUE_SPREAD_CITY", ()) + " " + city.getName() + " (" + gc.getPlayer(iPlayer).getCivilizationAdjective(0) + ")", "AS2D_PLAGUE", 0, "", ColorTypes(con.iLime), -1, -1, True, True)
def tamilConquestUP(self, iEnemy, iNumTargets=1): # Unused lEnemyCities = [] print "Getting closest city." for pCity in utils.getCityList(iEnemy): iDist = utils.calculateDistance(pCity.getX(), pCity.getY(), pTamils.getCapitalCity().getX(), pTamils.getCapitalCity().getY()) lEnemyCities.append((iDist, pCity)) lEnemyCities.sort() for i in range(iNumTargets): if lEnemyCities: pTargetCity = lEnemyCities.pop(0)[1] tPlot = utils.findNearestLandPlot((pTargetCity.getX(), pTargetCity.getY()), iTamils) utils.makeUnitAI(iSwordsman, iTamils, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2) utils.makeUnitAI(iWarElephant, iTamils, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) utils.makeUnitAI(iCatapult, iTamils, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) CyInterface().addMessage(iEnemy, False, iDuration, CyTranslator().getText("TXT_KEY_UP_TAMIL_CONQUESTS_TARGET", ()), "", 0, "", ColorTypes(iWhite), -1, -1, True, True)
def infectCitiesNear(self, iPlayer, startingX, startingY): for city in utils.getCityList(iPlayer): if utils.calculateDistance(city.getX(), city.getY(), startingX, startingY) <= 3: self.infectCity(city) self.announceForeignPlagueSpread(city)
def onCombatResult(self, argsList): self.rnf.immuneMode(argsList) self.up.vikingUP(argsList) # includes Moorish Corsairs pWinningUnit, pLosingUnit = argsList iWinningPlayer = pWinningUnit.getOwner() iLosingPlayer = pLosingUnit.getOwner() vic.onCombatResult(pWinningUnit, pLosingUnit) iUnitPower = 0 pLosingUnitInfo = gc.getUnitInfo(pLosingUnit.getUnitType()) if pLosingUnitInfo.getUnitCombatType() != gc.getInfoTypeForString( "UNITCOMBAT_SIEGE"): iUnitPower = pLosingUnitInfo.getPowerValue() sta.onCombatResult(iWinningPlayer, iLosingPlayer, iUnitPower) # capture slaves if iWinningPlayer == iAztecs and not pAztecs.isReborn(): utils.captureUnit(pLosingUnit, pWinningUnit, iAztecSlave, 35) elif iLosingPlayer == iNative: if iWinningPlayer not in lCivBioNewWorld or True in data.lFirstContactConquerors: if gc.getPlayer(iWinningPlayer).isSlavery() or gc.getPlayer( iWinningPlayer).isColonialSlavery(): if pWinningUnit.getUnitType() == iBandeirante: utils.captureUnit(pLosingUnit, pWinningUnit, iSlave, 100) else: utils.captureUnit(pLosingUnit, pWinningUnit, iSlave, 35) # Maya Holkans give food to closest city on victory if pWinningUnit.getUnitType() == iHolkan: iOwner = pWinningUnit.getOwner() if gc.getPlayer(iOwner).getNumCities() > 0: city = gc.getMap().findCity(pWinningUnit.getX(), pWinningUnit.getY(), iOwner, TeamTypes.NO_TEAM, False, False, TeamTypes.NO_TEAM, DirectionTypes.NO_DIRECTION, CyCity()) if city: city.changeFood(5) if utils.getHumanID() == pWinningUnit.getOwner(): data.iTeotlSacrifices += 1 sAdjective = gc.getPlayer( pLosingUnit.getOwner()).getCivilizationAdjectiveKey() CyInterface().addMessage( iOwner, False, iDuration, CyTranslator().getText( "TXT_KEY_MAYA_HOLKAN_EFFECT", (sAdjective, pLosingUnit.getNameKey(), 5, city.getName())), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # Brandenburg Gate effect if gc.getPlayer(iLosingPlayer).isHasBuildingEffect(iBrandenburgGate): for iPromotion in range(gc.getNumPromotionInfos()): if gc.getPromotionInfo(iPromotion).isLeader( ) and pLosingUnit.isHasPromotion(iPromotion): gc.getPlayer(iLosingPlayer).restoreGeneralThreshold() # Motherland Calls effect if gc.getPlayer(iLosingPlayer).isHasBuildingEffect(iMotherlandCalls): if pLosingUnit.getLevel() >= 3: lCities = [ city for city in utils.getCityList(iLosingPlayer) if not city.isDrafted() ] pCity = utils.getHighestEntry( lCities, lambda city: -utils.calculateDistance( city.getX(), city.getY(), pLosingUnit.getX(), pLosingUnit.getY())) if pCity: pCity.conscript(True) gc.getPlayer(iLosingPlayer).changeConscriptCount(-1) CyInterface().addMessage( iLosingPlayer, False, iDuration, CyTranslator().getText( "TXT_KEY_BUILDING_MOTHERLAND_CALLS_EFFECT", (pLosingUnit.getName(), pCity.getName())), "", 0, "", ColorTypes(iWhite), -1, -1, True, True)
def onCityBuilt(self, argsList): city = argsList[0] iOwner = city.getOwner() tCity = (city.getX(), city.getY()) x, y = tCity if iOwner < iNumActivePlayers: cnm.onCityBuilt(city) # starting workers if city.isCapital(): self.rnf.createStartingWorkers(iOwner, tCity) #Rhye - delete culture of barbs and minor civs to prevent weird unhappiness pPlot = gc.getMap().plot(x, y) for i in range(iNumTotalPlayers - iNumActivePlayers): iMinorCiv = i + iNumActivePlayers pPlot.setCulture(iMinorCiv, 0, True) pPlot.setCulture(iBarbarian, 0, True) if iOwner < iNumMajorPlayers: utils.spreadMajorCulture(iOwner, tCity) if gc.getPlayer(iOwner).getNumCities() < 2: gc.getPlayer(iOwner).AI_updateFoundValues(False) # fix for settler maps not updating after 1st city is founded if iOwner == iOttomans: self.up.ottomanUP(city, iOwner, -1) if iOwner == iCarthage: if tCity == (58, 39): if not gc.getPlayer(iCarthage).isHuman(): x = gc.getPlayer(iCarthage).getCapitalCity().getX() y = gc.getPlayer(iCarthage).getCapitalCity().getY() carthage = gc.getMap().plot(58, 39).getPlotCity() carthage.setHasRealBuilding(iPalace, True) gc.getMap().plot(x, y).getPlotCity().setHasRealBuilding( iPalace, False) dc.onPalaceMoved(iCarthage) carthage.setPopulation(3) utils.makeUnitAI(iWorkboat, iCarthage, (58, 39), UnitAITypes.UNITAI_WORKER_SEA, 1) utils.makeUnitAI(iGalley, iCarthage, (57, 40), UnitAITypes.UNITAI_SETTLER_SEA, 1) utils.makeUnitAI(iSettler, iCarthage, (57, 40), UnitAITypes.UNITAI_SETTLE, 1) # additional defenders and walls to make human life not too easy if utils.getHumanID() == iRome: carthage.setHasRealBuilding(iWalls, True) utils.makeUnitAI(iArcher, iCarthage, (58, 39), UnitAITypes.UNITAI_CITY_DEFENSE, 2) utils.makeUnit(iNumidianCavalry, iCarthage, (58, 39), 3) utils.makeUnitAI(iWarElephant, iCarthage, (58, 39), UnitAITypes.UNITAI_CITY_COUNTER, 2) if utils.getOwnedCoreCities(iCarthage) > 0: utils.setReborn(iCarthage, True) if iOwner == iByzantium and tCity == Areas.getCapital( iByzantium ) and gc.getGame().getGameTurn() <= getTurnForYear(330) + 3: if city.getPopulation() < 5: city.setPopulation(5) city.setHasRealBuilding(iBarracks, True) city.setHasRealBuilding(iWalls, True) city.setHasRealBuilding(iLibrary, True) city.setHasRealBuilding(iMarket, True) city.setHasRealBuilding(iGranary, True) city.setHasRealBuilding(iHarbor, True) city.setHasRealBuilding(iForge, True) city.setHasRealBuilding( iTemple + 4 * gc.getPlayer(iOwner).getStateReligion(), True) if iOwner == iPortugal and tCity == Areas.getCapital( iPortugal) and gc.getGame().getGameTurn() <= getTurnForYear( tBirth[iPortugal]) + 3: city.setPopulation(5) for iBuilding in [ iLibrary, iMarket, iHarbor, iLighthouse, iForge, iWalls, iTemple + 4 * gc.getPlayer(iPortugal).getStateReligion() ]: city.setHasRealBuilding(iBuilding, True) if iOwner == iNetherlands and tCity == Areas.getCapital( iNetherlands ) and gc.getGame().getGameTurn() <= getTurnForYear(1580) + 3: city.setPopulation(9) for iBuilding in [ iLibrary, iMarket, iWharf, iLighthouse, iBarracks, iPharmacy, iBank, iArena, iTheatre, iTemple + 4 * gc.getPlayer(iNetherlands).getStateReligion() ]: city.setHasRealBuilding(iBuilding, True) gc.getPlayer(iNetherlands).AI_updateFoundValues(False) if iOwner == iItaly and tCity == Areas.getCapital( iItaly) and gc.getGame().getGameTurn() <= getTurnForYear( tBirth[iItaly]) + 3: city.setPopulation(7) for iBuilding in [ iLibrary, iPharmacy, iTemple + 4 * gc.getPlayer(iItaly).getStateReligion(), iMarket, iArtStudio, iAqueduct, iCourthouse, iWalls ]: city.setHasRealBuilding(iBuilding, True) gc.getPlayer(iItaly).AI_updateFoundValues(False) vic.onCityBuilt(iOwner, city) if iOwner < iNumPlayers: dc.onCityBuilt(iOwner) if iOwner == iArabia: if not gc.getGame().isReligionFounded(iIslam): if tCity == (75, 33): self.rel.foundReligion(tCity, iIslam) # Leoreth: free defender and worker for AI colonies if iOwner in lCivGroups[0]: if city.getRegionID() not in mercRegions[iArea_Europe]: if utils.getHumanID() != iOwner: utils.createGarrisons(tCity, iOwner, 1) utils.makeUnit(iWorker, iOwner, tCity, 1) # Holy Rome founds its capital if iOwner == iHolyRome: if gc.getPlayer(iHolyRome).getNumCities() == 1: self.rnf.holyRomanSpawn() # Leoreth: Escorial effect if gc.getPlayer(iOwner).isHasBuildingEffect(iEscorial): if city.isColony(): capital = gc.getPlayer(iOwner).getCapitalCity() iGold = utils.getTurns(10 + utils.calculateDistance( capital.getX(), capital.getY(), city.getX(), city.getY())) CyInterface().addMessage( iOwner, False, iDuration, CyTranslator().getText("TXT_KEY_BUILDING_ESCORIAL_EFFECT", (iGold, city.getName())), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) gc.getPlayer(iOwner).changeGold(iGold) # Leoreth: free defender and worker for cities founded by American Pioneer in North America if iOwner == iAmerica: if city.getRegionID() in [rUnitedStates, rCanada, rAlaska]: utils.createGarrisons(tCity, iOwner, 1) utils.makeUnit(iWorker, iOwner, tCity, 1)
def onCityAcquired(self, argsList): iOwner, iPlayer, city, bConquest, bTrade = argsList tCity = (city.getX(), city.getY()) cnm.onCityAcquired(city, iPlayer) if bConquest: sta.onCityAcquired(city, iOwner, iPlayer) if iPlayer == iArabia: self.up.arabianUP(city) if iPlayer == iMongolia and bConquest and utils.getHumanID( ) != iPlayer: self.up.mongolUP(city) # relocate capitals if utils.getHumanID() != iPlayer: if iPlayer == iOttomans and tCity == (68, 45): utils.moveCapital(iOttomans, tCity) # Kostantiniyye elif iPlayer == iMongolia and tCity == (102, 47): utils.moveCapital(iMongolia, tCity) # Khanbaliq elif iPlayer == iTurks and utils.isAreaControlled( iTurks, Areas.tCoreArea[iPersia][0], Areas.tCoreArea[iPersia][1]): capital = pTurks.getCapitalCity() if not utils.isPlotInArea((capital.getX(), capital.getY()), Areas.tCoreArea[iPersia][0], Areas.tCoreArea[iPersia][1]): newCapital = utils.getRandomEntry( utils.getAreaCitiesCiv( iTurks, utils.getPlotList(Areas.tCoreArea[iPersia][0], Areas.tCoreArea[iPersia][1]))) if newCapital: utils.moveCapital( iTurks, (newCapital.getX(), newCapital.getY())) # remove slaves if unable to practice slavery if not gc.getPlayer(iPlayer).canUseSlaves(): utils.removeSlaves(city) else: utils.freeSlaves(city, iPlayer) if city.isCapital(): if city.isHasRealBuilding(iAdministrativeCenter): city.setHasRealBuilding(iAdministrativeCenter, False) # Leoreth: relocate capital for AI if reacquired: if utils.getHumanID() != iPlayer and iPlayer < iNumPlayers: if data.players[iPlayer].iResurrections == 0: if Areas.getCapital(iPlayer) == tCity: utils.relocateCapital(iPlayer, city) else: if Areas.getRespawnCapital(iPlayer) == tCity: utils.relocateCapital(iPlayer, city) # Leoreth: conquering Constantinople adds it to the Turkish core + Rumelia if iPlayer == iOttomans and tCity == (68, 45): utils.setReborn(iOttomans, True) if iPlayer == iTurks: if utils.isAreaControlled(iPlayer, Areas.tCoreArea[iPersia][0], Areas.tCoreArea[iPersia][1]): utils.setReborn(iTurks, True) else: utils.setReborn(iTurks, False) # Leoreth: help Byzantium/Constantinople if iPlayer == iByzantium and tCity == Areas.getCapital( iByzantium ) and gc.getGame().getGameTurn() <= getTurnForYear(330) + 3: if city.getPopulation() < 5: city.setPopulation(5) city.setHasRealBuilding(iBarracks, True) city.setHasRealBuilding(iWalls, True) city.setHasRealBuilding(iLibrary, True) city.setHasRealBuilding(iMarket, True) city.setHasRealBuilding(iGranary, True) city.setHasRealBuilding(iHarbor, True) city.setHasRealBuilding(iForge, True) city.setName("Konstantinoupolis", False) city.setHasRealBuilding( iTemple + 4 * gc.getPlayer(iPlayer).getStateReligion(), True) if bConquest: # Colombian UP: no resistance in conquered cities in Latin America if iPlayer == iMaya and utils.isReborn(iMaya): if utils.isPlotInArea(tCity, tSouthCentralAmericaTL, tSouthCentralAmericaBR): city.setOccupationTimer(0) # Statue of Zeus effect: no city resistance on conquest if gc.getPlayer(iPlayer).isHasBuildingEffect(iStatueOfZeus): city.setOccupationTimer(0) # Byzantium reduced to four cities: core shrinks to Constantinople if iOwner == iByzantium and gc.getPlayer( iByzantium).getNumCities <= 4: utils.setReborn(iByzantium, True) if bTrade: for i in range(iNumBuildings): iNationalWonder = i if isNationalWonderClass( gc.getBuildingInfo(iNationalWonder). getBuildingClassType()) and city.hasBuilding( iNationalWonder): city.setHasRealBuilding(iNationalWonder, False) # Leoreth: Escorial effect if gc.getPlayer(iPlayer).isHasBuildingEffect(iEscorial): if city.isColony(): capital = gc.getPlayer(iPlayer).getCapitalCity() iGold = utils.getTurns(10 + utils.calculateDistance( capital.getX(), capital.getY(), city.getX(), city.getY())) CyInterface().addMessage( iPlayer, False, iDuration, CyTranslator().getText("TXT_KEY_BUILDING_ESCORIAL_EFFECT", (iGold, city.getName())), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) gc.getPlayer(iPlayer).changeGold(iGold) self.pla.onCityAcquired(iOwner, iPlayer, city) # Plague self.com.onCityAcquired(city) # Communications self.corp.onCityAcquired(argsList) # Companies dc.onCityAcquired(iOwner, iPlayer) # DynamicCivs vic.onCityAcquired(iPlayer, iOwner, city, bConquest) lTradingCompanyList = [ iSpain, iFrance, iEngland, iPortugal, iNetherlands ] if bTrade and iPlayer in lTradingCompanyList and ( city.getX(), city.getY() ) in tTradingCompanyPlotLists[lTradingCompanyList.index(iPlayer)]: self.up.tradingCompanyCulture(city, iPlayer, iOwner) return 0
def spawnConquerors(self, iPlayer, iPreferredTarget, tTL, tBR, iNumTargets, iYear, iIntervalTurns, iWarPlan=WarPlanTypes.WARPLAN_TOTAL): if not gc.getPlayer(iPlayer).isAlive(): for iTech in sta.getResurrectionTechs(iPlayer): gc.getTeam(gc.getPlayer(iPlayer).getTeam()).setHasTech( iTech, True, iPlayer, False, False) lCities = [] for city in utils.getAreaCities(utils.getPlotList(tTL, tBR)): if city.getOwner() != iPlayer and not gc.getTeam( city.getOwner()).isVassal(iPlayer): if (gc.getDefineINT("AIWAR_PY_CANNOT_DO_AIWAR_TO_HUMAN") > 0 and (city.getOwner() == utils.getHumanID())): pass else: lCities.append(city) capital = gc.getPlayer(iPlayer).getCapitalCity() lTargetCities = [] for i in range(iNumTargets): if len(lCities) == 0: break targetCity = utils.getHighestEntry( lCities, lambda x: -utils.calculateDistance( x.getX(), x.getY(), capital.getX(), capital.getY()) + int( x.getOwner() == iPreferredTarget) * 1000) lTargetCities.append(targetCity) lCities.remove(targetCity) lOwners = [] for city in lTargetCities: if city.getOwner() not in lOwners: lOwners.append(city.getOwner()) if iPreferredTarget >= 0 and iPreferredTarget not in lOwners and gc.getPlayer( iPreferredTarget).isAlive(): if (gc.getDefineINT("AIWAR_PY_CANNOT_DO_AIWAR_TO_HUMAN") > 0 and (iPreferredTarget == utils.getHumanID())): pass else: self.declareWar(iPlayer, iPreferredTarget, iWarPlan) for iOwner in lOwners: self.declareWar(iPlayer, iOwner, iWarPlan) CyInterface().addMessage( iOwner, False, iDuration, CyTranslator().getText( "TXT_KEY_UP_CONQUESTS_TARGET", (gc.getPlayer(iPlayer).getCivilizationShortDescription(0), )), "", 0, "", ColorTypes(iWhite), -1, -1, True, True) #####修改开始##### #消息传送区 if (gc.getDefineINT("PYTHON_USE_ADVANCE_ALERT") == 1): #参数控制 if iPlayer == iGreece: tem_text = '世界军事速递:亚历山大东征开始了!其麾下的军队正在横扫欧亚大陆!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:亚历山大东征开始了!') if iPlayer == iRome: tem_text = '世界军事速递:罗马帝国正在崛起,其军队所向披靡!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:罗马帝国正在崛起,其军队所向披靡!') if iPlayer == iMongolia: tem_text = '世界军事速递:蒙古帝国正在崛起,成吉思汗的军队所向披靡!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:蒙古帝国正在崛起,成吉思汗的军队所向披靡!') if iPlayer == iTurks: tem_text = '世界军事速递:突厥帝国正在崛起,其军队所向披靡!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #百年战争 if iPlayer == iEngland and iYear <= 1450 and iYear >= 1250: tem_text = '英法百年战争的腥风血雨正式拉开帷幕!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #圣女贞德 if iPlayer == iFrance and iYear <= 1550 and iYear >= 1350: tem_text = '圣女贞德唤起了法国人民的民族感,法国人民为了捍卫家园而战!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #十字军 if iPlayer == iEngland and iYear <= 1200 and iYear >= 1000: tem_text = '轰动中东和欧洲的十字军东征开始了!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #萨拉丁 if iPlayer == iEgypt and iYear <= 1300 and iYear >= 1100: tem_text = '年轻的领袖萨拉丁率领军队向十字军发起猛烈的进攻!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #拿破仑战争 if iPlayer == iFrance and iYear <= 1900 and iYear >= 1700: tem_text = '拿破仑的军队正在欧洲所向披靡!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') if iYear <= 1930 and iYear >= 1900: tem_text = '第一次世界大战正在进行!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') if iYear <= 1960 and iYear >= 1930: tem_text = '第二次世界大战正在进行!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #####修改结束##### ####修改开始#### for city in lTargetCities: iExtra = 0 + 2 # if utils.getHumanID() not in [iPlayer, city.getOwner()]: # iExtra += 1 #max(1, gc.getPlayer(iPlayer).getCurrentEra()) # # if iPlayer == iMongolia and utils.getHumanID() != iPlayer: # iExtra += 1 tPlot = utils.findNearestLandPlot((city.getX(), city.getY()), iPlayer) if (tPlot): iBestInfantry = utils.getBestInfantry(iPlayer) iBestSiege = utils.getBestSiege(iPlayer) if iPlayer == iGreece: iBestInfantry = iHoplite iBestSiege = iCatapult if iPlayer == iMongolia: iBestInfantry = iKeshik iExtra += 2 if iPlayer == iCarthage and iYear <= 150: iExtra = 0 iBestInfantry = iWarElephant tem_text = '迦太基的汉尼拔将军翻越了阿尔卑斯山,出现在米兰附近!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) if iPlayer == iBarbarian and iYear <= 150: iExtra = -1 iBestInfantry = iMilitia utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) utils.makeUnitAI(iLightSwordsman, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) tem_text = '斯巴达克斯吹响了反抗罗马的起义号角!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) if iPlayer == iEngland and iYear <= 1500: iExtra -= 0 iBestInfantry = iLongbowman # utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2) # iBestSiege = iCatapult if (iPlayer == iEngland and iYear <= 1250) or ( iPlayer == iHolyRome and iYear <= 1250) or (iPlayer == iFrance and iYear <= 1250): iExtra -= 1 # iBestInfantry = iLongbowman # utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2) # iBestSiege = iCatapult if iPlayer == iTurks and iYear <= 1250: iExtra -= 2 if iYear >= 1800: iExtra += 1 if iYear >= 1900: iExtra += 1 if iYear >= 1930: iExtra += 1 if iPreferredTarget == utils.getHumanID() and iYear >= 1300: iExtra = gc.getGame().getHandicapType() + 1 utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, max(2 + iExtra, 1)) utils.makeUnitAI(iBestSiege, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, max(1 + iExtra, 1)) ####修改结束##### if iPlayer == iGreece: utils.makeUnitAI(iCompanion, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) if iPlayer == iTamils: utils.makeUnitAI(iWarElephant, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) if iPlayer == iSpain: utils.makeUnitAI(utils.getBestCavalry(iPlayer), iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2 * iExtra) if iPlayer == iTurks: utils.makeUnitAI(utils.getBestCavalry(iPlayer), iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2 + iExtra)
def getResurrectionCities_manual(iPlayer, bFromCollapse=False): pPlayer = gc.getPlayer(iPlayer) teamPlayer = gc.getTeam(iPlayer) lPotentialCities = [] lFlippingCities = [] tCapital = Areas.getRespawnCapital(iPlayer) for (x, y) in Areas.getRespawnArea(iPlayer): plot = gc.getMap().plot(x, y) if plot.isCity(): city = plot.getPlotCity() # for humans: exclude recently conquered cities to avoid annoying reflips if city.getOwner() != utils.getHumanID( ) or city.getGameTurnAcquired( ) < gc.getGame().getGameTurn() - utils.getTurns(5): lPotentialCities.append(city) for city in lPotentialCities: iOwner = city.getOwner() iMinNumCitiesOwner = 3 # barbarian and minor cities always flip if iOwner >= iNumPlayers: lFlippingCities.append(city) continue iOwnerStability = utils.getStabilityLevel(iOwner) bCapital = ((city.getX(), city.getY()) == tCapital) # flips are less likely before Nationalism if data.iCivsWithNationalism == 0: iOwnerStability += 1 if utils.getHumanID() != iOwner: iMinNumCitiesOwner = 2 iOwnerStability -= 1 if gc.getPlayer(iOwner).getNumCities() >= iMinNumCitiesOwner: # special case for civs returning from collapse: be more strict if bFromCollapse: if iOwnerStability < iStabilityShaky: lFlippingCities.append(city) continue # owner stability below shaky: city always flips if iOwnerStability < iStabilityShaky: lFlippingCities.append(city) # owner stability below stable: city flips if far away from their capital, or is capital spot of the dead civ elif iOwnerStability < iStabilityStable: ownerCapital = gc.getPlayer(iOwner).getCapitalCity() iDistance = utils.calculateDistance(city.getX(), city.getY(), ownerCapital.getX(), ownerCapital.getY()) if bCapital or iDistance >= 8: lFlippingCities.append(city) # owner stability below solid: only capital spot flips elif iOwnerStability < iStabilitySolid: if bCapital: lFlippingCities.append(city) # if capital exists and does not flip, the respawn fails capitalX, capitalY = tCapital if gc.getMap().plot(capitalX, capitalY).isCity(): if tCapital not in [(city.getX(), city.getY()) for city in lFlippingCities]: return [] # if only up to two cities wouldn't flip, they flip as well (but at least one city has to flip already, else the respawn fails) if len(lFlippingCities) + 2 >= len(lPotentialCities) and len( lFlippingCities) > 0 and len(lFlippingCities) * 2 >= len( lPotentialCities) and not bFromCollapse: # cities in core are not affected by this for city in lPotentialCities: if not city.plot().isCore( city.getOwner()) and city not in lFlippingCities: lFlippingCities.append(city) return lFlippingCities
def infectCitiesNear(self, iPlayer, startingX, startingY): for city in utils.getCityList(iPlayer): if utils.calculateDistance(city.getX(), city.getY(), startingX, startingY) <= 3: self.infectCity(city) self.announceForeignPlagueSpread(city)
def processPlague(self, iPlayer): pPlayer = gc.getPlayer(iPlayer) #first spread to close locations cityList = [] #see below apCityList = PyPlayer(iPlayer).getCityList() for pCity in apCityList: city = pCity.GetCy() cityList.append(city) #see below if (city.getNumRealBuilding(iPlague) > 0): #print ("plague in city", city.getName()) if (city.getPopulation() > 1): #print("healthRate in city", 35 + 5*city.healthRate(False, 0)) if utils.getYear() < 1250: iMin = 80 elif city.plot().getRegionID() in con.lBlackDeathRegions: if city.getOwner() in con.lBlackDeathSurvivors: iMin = 80 else: iMin = 50 else: iMin = 90 if (gc.getGame().getSorenRandNum(100, 'roll') > iMin + 5 * city.healthRate(False, 0)): city.changePopulation(-1) if (city.isCapital()): #delete in vanilla for iLoopCiv in range(iNumPlayers): if (gc.getTeam(pPlayer.getTeam()).isVassal(iLoopCiv) or \ gc.getTeam(gc.getPlayer(iLoopCiv).getTeam()).isVassal(iPlayer)): if ( gc.getPlayer(iLoopCiv).getNumCities() > 0 ): #this check is needed, otherwise game crashes capital = gc.getPlayer( iLoopCiv).getCapitalCity() if (self.isVulnerable(iLoopCiv) == True): if (sd.getPlagueCountdown(iPlayer) > 2): #don't spread the last turns self.spreadPlague(iLoopCiv) self.infectCity(capital) #print ("infect master/vassal", city.getName(), "to", capital.getName()) for x in range(city.getX() - 2, city.getX() + 3): for y in range(city.getY() - 2, city.getY() + 3): ##print ("plagueXY", x, y) pCurrent = gc.getMap().plot(x, y) if (pCurrent.getOwner() != iPlayer and pCurrent.getOwner() >= 0): if (sd.getPlagueCountdown(iPlayer) > 2): #don't spread the last turns if (self.isVulnerable( pCurrent.getOwner()) == True): self.spreadPlague(pCurrent.getOwner()) self.infectCitiesNear( pCurrent.getOwner(), x, y) #print ("infect foreign near", city.getName()) else: if (pCurrent.isCity() and not (x == city.getX() and y == city.getY())): #print ("is city", x, y) cityNear = pCurrent.getPlotCity() if (not cityNear.getNumRealBuilding(iPlague) > 0): if (sd.getPlagueCountdown(iPlayer) > 2): #don't spread the last turns self.infectCity(cityNear) #print ("infect near", city.getName(), "to", cityNear.getName()) else: if (x == city.getX() and y == city.getY()): self.killUnitsByPlague( city, pCurrent, 0, 42, 2) else: if (pCurrent.isRoute()): self.killUnitsByPlague( city, pCurrent, 10, 35, 0) elif (pCurrent.isWater()): self.killUnitsByPlague( city, pCurrent, 30, 35, 0) else: self.killUnitsByPlague( city, pCurrent, 30, 35, 0) for x in range(city.getX() - 3, city.getX() + 4): pCurrent = gc.getMap().plot(x, city.getY() - 3) if (pCurrent.getOwner() == iPlayer or not pCurrent.isOwned()): if (not pCurrent.isCity()): if (pCurrent.isRoute() or pCurrent.isWater()): self.killUnitsByPlague(city, pCurrent, 30, 35, 0) pCurrent = gc.getMap().plot(x, city.getY() + 4) if (pCurrent.getOwner() == iPlayer or not pCurrent.isOwned()): if (not pCurrent.isCity()): if (pCurrent.isRoute() or pCurrent.isWater()): self.killUnitsByPlague(city, pCurrent, 30, 35, 0) for y in range(city.getY() - 2, city.getY() + 3): pCurrent = gc.getMap().plot(city.getX() - 3, y) if (pCurrent.getOwner() == iPlayer or not pCurrent.isOwned()): if (not pCurrent.isCity()): if (pCurrent.isRoute() or pCurrent.isWater()): self.killUnitsByPlague(city, pCurrent, 30, 35, 0) pCurrent = gc.getMap().plot(city.getX() + 4, y) if (pCurrent.getOwner() == iPlayer or not pCurrent.isOwned()): if (not pCurrent.isCity()): if (pCurrent.isRoute() or pCurrent.isWater()): self.killUnitsByPlague(city, pCurrent, 30, 35, 0) #spread to trade route cities if (sd.getPlagueCountdown(iPlayer) > 2): #don't spread the last turns for i in range(city.getTradeRoutes()): #for i in range(gc.getDefineINT("MAX_TRADE_ROUTES")): loopCity = city.getTradeCity(i) if (not loopCity.isNone()): if (not loopCity.getNumRealBuilding(iPlague) > 0): #utils.echo("Plagued caravan arrives at %s" %(loopCity.getName())) iOwner = loopCity.getOwner() if (iPlayer == iOwner or gc.getTeam(pPlayer.getTeam()).isOpenBorders(iOwner) or \ gc.getTeam(pPlayer.getTeam()).isVassal(iOwner) or \ gc.getTeam(gc.getPlayer(iOwner).getTeam()).isVassal(iPlayer)): #own city, or open borders, or vassal if (iPlayer != iOwner): if (self.isVulnerable(iOwner) == True): self.spreadPlague(iOwner) self.infectCity(loopCity) #utils.echo("infect by trade route: %s to %s" %(city.getName(), loopCity.getName())) iHuman = utils.getHumanID() if (gc.getPlayer( iHuman).canContact(iOwner) and iHuman != iOwner): CyInterface().addMessage( iHuman, True, con.iDuration / 2, CyTranslator().getText( "TXT_KEY_PLAGUE_SPREAD_CITY", ()) + " " + loopCity.getName() + " (" + gc.getPlayer(iOwner). getCivilizationAdjective(0) + ")", "AS2D_PLAGUE", 0, "", ColorTypes(con.iLime), -1, -1, True, True) else: self.infectCity(loopCity) #utils.echo("infect by trade route: %s to %s" %(city.getName(), loopCity.getName())) #spread to other cities of the empire if (len(cityList)): if (sd.getPlagueCountdown(iPlayer) > 2): #don't spread the last turns for city1 in cityList: ##print ("citylist", city1.getName()) if (not city1.getNumRealBuilding(iPlague) > 0): for city2 in cityList: if (city1 != city2): if (city2.getNumRealBuilding(iPlague) > 0): if (city1.isConnectedTo(city2)): ##print ("infect distant", city1.getName(), "to", city2.getName(), utils.calculateDistance(city1.getX(), city1.getY(), city2.getX(), city2.getY())) if (utils.calculateDistance( city1.getX(), city1.getY(), city2.getX(), city2.getY()) <= 6): #print ("infect distant", city2.getName(), "to", city1.getName()) self.infectCity(city1) return