Example #1
0
	def onCityAcquired(self, argsList):
		iPreviousOwner, iNewOwner, city, bConquest, bTrade = argsList
		
		if not gc.getGame().isVictoryValid(iHistoricalVictory):
			return
		
		iYear = utils.getYear()
		
		return
    def checkName(self, iPlayer):

        return

        #print "checkName"

        if iPlayer >= iNumPlayers:
            return
        if not gc.getPlayer(iPlayer).isAlive:
            return

        bVassal = utils.isAVassal(iPlayer)
        pPlayer = gc.getPlayer(iPlayer)
        iReligion = pPlayer.getStateReligion()
        capital = gc.getPlayer(iPlayer).getCapitalCity()
        iGameTurn = gc.getGame().getGameTurn()

        iCivilization = sd.getCivilization(iPlayer)

        # 3 kingdoms > respawn > capital > religion > empire > vassal

        if iPlayer == con.iJin:
            if gc.getPlayer(con.iQin).isAlive() and gc.getPlayer(
                    con.iHan).isAlive():
                self.setCivDesc(iPlayer, self.SpecialNames[iPlayer])
                return
        if iPlayer in [con.iRome, con.iByzantines]:
            if utils.getYear() >= con.tBirth[con.iByzantines] and gc.getPlayer(
                    con.iByzantines).isAlive():
                self.setCivDesc(iPlayer, self.SpecialNames[iPlayer])
                self.setCivDesc(con.iByzantines,
                                self.SpecialNames[con.iByzantines])
                return
        #if iPlayer == con.iByzantines and utils.isActive(con.iRome) and sd.getCivilization(con.iByzantines) == con.iByzantines:
        #self.setCivDesc(iPlayer, self.SpecialNames[iPlayer])
        #self.setCivDesc(con.iRome, self.SpecialNames[con.iRome])
        #return

        # by vassalage
        if bVassal and iCivilization in self.vassalNames:
            szName = self.vassalNames[iCivilization]
        else:
            szName = self.defaultNames[iCivilization]

        # by status (empires)
        if not bVassal:
            iCivic = pPlayer.getCivics(0)
            if iCivilization in self.empireNames:
                minCities = 5
                if iCivic == con.iEmpireCivic or pPlayer.getNumCities(
                ) >= minCities:
                    if pPlayer.getNumCities() >= (minCities):
                        szName = self.empireNames[iCivilization]

        self.setCivDesc(iPlayer, szName)
Example #3
0
	def foundCity(self, iCiv, sName, iX, iY, lReligions=[], lCorporations =[], lBuildings=[]):
	
		#print ("CITY:", sName, "lReligions=", lReligions, "lCorporations=", lCorporations, "lBuildings=", lBuildings)
	
		if not self.checkRegion(iX, iY):
			return None
		
		pCiv = gc.getPlayer(iCiv)
		pCiv.initCity(iX, iY)
		city = gc.getMap().plot(iX, iY).getPlotCity()
		
		if not city or city.isNone():
			return None
		
		city.setName(sName, False)
		
		if utils.getYear() < -100:
			pCiv.initUnit(con.iMilitiaSpearman, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
		elif utils.getYear() < 100:
			pCiv.initUnit(con.iSpearman, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
		else:
			pCiv.initUnit(con.iHeavySpearman, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
		
		if utils.getYear() < 0:
			pCiv.initUnit(con.iArcher, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
		elif utils.getYear() < 200:
			pCiv.initUnit(con.iBowman, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
		else:
			pCiv.initUnit(con.iHeavyBowman, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
		
		for iReligion in lReligions:
			city.setHasReligion(iReligion, True, False, False)
		
		for iCorporation in lCorporations:
			city.setHasCorporation(iCorporation, True, False, False)
			
		for iBuilding in lBuildings:
			city.setNumRealBuilding(iBuilding, 1)
			
		UnitArtStyler.updateUnitArtAtPlot(city.plot())
		
		return city	
Example #4
0
 def onGoldenAge(self, argsList):
     'Golden Age'
     iPlayer = argsList[0]
     if iPlayer < iNumPlayers:
         self.vic.onGoldenAge(iPlayer)
         print("STABILITY RESET GA, iPlayer=",
               gc.getPlayer(iPlayer).getCivilizationShortDescription(0),
               "year=", utils.getYear())
         pTeam = gc.getTeam(gc.getPlayer(iPlayer).getTeam())
         pTeam.setHasTech(con.iStabilityStable, True, iPlayer, False,
                          False)  ## srpt stability conversion
         pTeam.setHasTech(con.iStabilityUnstable, False, iPlayer, False,
                          False)
         pTeam.setHasTech(con.iStabilityCollapsing, False, iPlayer, False,
                          False)
Example #5
0
    def onRevolution(self, argsList):
        'Called at the start of a revolution'
        iPlayer = argsList[0]

        if iPlayer < iNumPlayers:
            self.dc.onRevolution(iPlayer)

        if iPlayer < iNumPlayers:
            self.rfccwaiw.onRevolution(iPlayer)
            if iPlayer < iNumPlayers and gc.getPlayer(iPlayer).getNumCities(
            ) > 1 and gc.getPlayer(iPlayer).getGoldenAgeTurns() < 1:
                utils.setCivicsStability(iPlayer)
                print("STABILITY CHECK revolution, iPlayer=",
                      gc.getPlayer(iPlayer).getCivilizationShortDescription(0),
                      "year=", utils.getYear())
                utils.stabilityCheck(iPlayer, 0)
Example #6
0
    def onTechAcquired(self, argsList):
        'Tech Acquired'
        iTechType, iTeam, iPlayer, bAnnounce = argsList

        if iPlayer < iNumPlayers and iTechType not in [
                con.iStabilityStable, con.iStabilityUnstable,
                con.iStabilityCollapsing
        ]:
            self.vic.onTechAcquired(iTechType, iPlayer)  # Franks
            self.res.onTechAcquired(iTechType)
            self.rel.onTechAcquired(iTechType, iPlayer)
            if iPlayer < con.iNumMajPlayers and gc.getPlayer(
                    iPlayer).getNumCities() > 1 and utils.getYear() > (
                        con.tBirth[sd.getCivilization(iPlayer)]
                    ) + 50 and iTechType in con.lStabilityTechs:
                #if iPlayer < con.iNumMajPlayers:
                #if gc.getPlayer(iPlayer).getNumCities() > 1:
                #print ("ERROR iPlayer=", iPlayer, "sd.getCivilization(iPlayer)", sd.getCivilization(iPlayer))
                #if utils.getYear() >  (con.tBirth[sd.getCivilization(iPlayer)]) + 50:
                if utils.getYear() < con.tFall[iPlayer]:
                    if (sd.getLastRebellion(iPlayer)) < utils.getYear() - 30:
                        print(
                            "STABILITY CHECK tech, iPlayer=",
                            gc.getPlayer(
                                iPlayer).getCivilizationShortDescription(0),
                            "year=", utils.getYear())
                        utils.stabilityCheck(iPlayer, 0)
                else:
                    if (sd.getLastRebellion(iPlayer)) < utils.getYear() - 10:
                        print(
                            "STABILITY CHECK tech, iPlayer=",
                            gc.getPlayer(
                                iPlayer).getCivilizationShortDescription(0),
                            "year=", utils.getYear())
                        utils.stabilityCheck(iPlayer, 0)

        if iTechType == con.iTheStirrup:
            gc.getTeam(gc.getPlayer(iPlayer).getTeam()).setHasTech(
                con.iTrajansColumnFunctionTech, False, utils.getHumanID(),
                False, False)
Example #7
0
    def onCityAcquired(self, argsList):
        'City Acquired'
        iPreviousOwner, iNewOwner, city, bConquest, bTrade = argsList
        pNewOwner = gc.getPlayer(iNewOwner)
        #print ("city acquired", city.getName(), "year=", utils.getYear())
        #print ("iNewOwner=", gc.getPlayer(iNewOwner).getCivilizationShortDescription(0), "iPreviousOwner=", gc.getPlayer(iPreviousOwner).getCivilizationShortDescription(0))
        self.cnm.renameCity(city, iNewOwner)
        self.rnf.checkCapitalsOnCapture(
            city, iNewOwner)  # edead: free capital move for the AI

        if bConquest:
            if iNewOwner != con.iBarbarian or not (gc.getTeam(
                    gc.getPlayer(iPreviousOwner).getTeam()).isHasTech(
                        con.iTrajansColumnFunctionTech)):
                if iPreviousOwner < con.iNumPlayers and gc.getPlayer(
                        iPreviousOwner).getNumCities() >= 1 and gc.getPlayer(
                            iPreviousOwner).getGoldenAgeTurns() < 1:
                    if utils.getYear() < con.tFall[iPreviousOwner]:
                        if (sd.getLastRebellion(iPreviousOwner)
                            ) < utils.getYear() - 5:
                            print("STABILITY CHECK city lost iNewOwner=",
                                  iNewOwner, "iPreviousOwner=", iPreviousOwner,
                                  "year=", utils.getYear())
                            regionID = gc.getMap().plot(
                                city.getX(), city.getY()).getRegionID()
                            if regionID in utils.getCoreRegions(
                                    sd.getCivilization(iPreviousOwner)):
                                utils.stabilityCheck(iPreviousOwner, -3)
                            elif regionID in utils.getNormalRegions(
                                    sd.getCivilization(iPreviousOwner)):
                                if not (gc.getTeam(
                                        gc.getPlayer(iPreviousOwner).getTeam()
                                ).isHasTech(con.iStabilityStable)):
                                    utils.stabilityCheck(iPreviousOwner, -2)
                            else:
                                if not (gc.getTeam(
                                        gc.getPlayer(iPreviousOwner).getTeam()
                                ).isHasTech(con.iStabilityStable)):
                                    utils.stabilityCheck(iPreviousOwner, -1)
                    else:
                        print("STABILITY CHECK city lost iNewOwner=",
                              iNewOwner, "iPreviousOwner=", iPreviousOwner,
                              "year=", utils.getYear())
                        regionID = gc.getMap().plot(city.getX(),
                                                    city.getY()).getRegionID()
                        if regionID in utils.getCoreRegions(
                                sd.getCivilization(iPreviousOwner)):
                            utils.stabilityCheck(iPreviousOwner, -3)
                        elif regionID in utils.getNormalRegions(
                                sd.getCivilization(iPreviousOwner)):
                            if not (gc.getTeam(
                                    gc.getPlayer(iPreviousOwner).getTeam()).
                                    isHasTech(con.iStabilityStable)):
                                utils.stabilityCheck(iPreviousOwner, -2)
                        else:
                            if not (gc.getTeam(
                                    gc.getPlayer(iPreviousOwner).getTeam()).
                                    isHasTech(con.iStabilityStable)):
                                utils.stabilityCheck(iPreviousOwner, -1)

        if iNewOwner < iNumPlayers:
            utils.spreadMajorCulture(iNewOwner, city.getX(), city.getY())
            #self.pla.onCityAcquired(iPreviousOwner, iNewOwner, city)
            self.dc.onCityAcquired(argsList)

        self.rel.onCityAcquired(argsList)

        self.vic.maccabeanCheck()
        self.corp.onCityAcquired(argsList)
        self.vic.onCityAcquired(argsList)
        self.rfccwaiw.onCityAcquired(argsList)
        self.rnf.onCityAcquired(argsList)

        # Move the palace to historical backup capital
        if iPreviousOwner < iNumPlayers:
            if (city.getX(), city.getY()) == con.tCapitals[iPreviousOwner]:
                self.rnf.moveCapital(con.tBackupCapitals[iPreviousOwner],
                                     iPreviousOwner, True)
Example #8
0
 def onCityRazed(self, argsList):
     'City Razed'
     city, iPlayer = argsList
     iPreviousOwner = city.getOwner()
     #print ("onCityRazed", city.getName(), "iPlayer=", gc.getPlayer(iPlayer).getCivilizationShortDescription(0), "iPreviousOwner=", gc.getPlayer(iPreviousOwner).getCivilizationShortDescription(0), "year=", utils.getYear())
     if iPreviousOwner == iPlayer and city.getPreviousOwner() != -1:
         iPreviousOwner = city.getPreviousOwner()
     #self.pla.onCityRazed(argsList)
     self.rel.onCityRazed(argsList)
     self.rfccwaiw.onCityRazed(argsList)
     if iPlayer != con.iBarbarian or not (gc.getTeam(
             gc.getPlayer(iPreviousOwner).getTeam()).isHasTech(
                 con.iTrajansColumnFunctionTech)):
         if iPreviousOwner < con.iNumPlayers and gc.getPlayer(
                 iPreviousOwner).getNumCities() > 1 and gc.getPlayer(
                     iPreviousOwner).getAnarchyTurns() < 1 and gc.getPlayer(
                         iPreviousOwner).getGoldenAgeTurns() < 1:
             if utils.getYear() < con.tFall[iPreviousOwner]:
                 if (sd.getLastRebellion(iPreviousOwner)
                     ) < utils.getYear() - 5:
                     print(
                         "STABILITY CHECK city razed iPreviousOwner=",
                         gc.getPlayer(iPreviousOwner).
                         getCivilizationShortDescription(0), "year=",
                         utils.getYear())
                     regionID = gc.getMap().plot(city.getX(),
                                                 city.getY()).getRegionID()
                     if regionID in utils.getCoreRegions(
                             sd.getCivilization(iPreviousOwner)):
                         utils.stabilityCheck(iPreviousOwner, -3)
                     elif regionID in utils.getNormalRegions(
                             sd.getCivilization(iPreviousOwner)):
                         if not (gc.getTeam(
                                 gc.getPlayer(iPreviousOwner).getTeam()).
                                 isHasTech(con.iStabilityStable)):
                             utils.stabilityCheck(iPreviousOwner, -2)
                     else:
                         if not (gc.getTeam(
                                 gc.getPlayer(iPreviousOwner).getTeam()).
                                 isHasTech(con.iStabilityStable)):
                             utils.stabilityCheck(iPreviousOwner, -1)
             else:
                 print(
                     "STABILITY CHECK city razed iPreviousOwner=",
                     gc.getPlayer(
                         iPreviousOwner).getCivilizationShortDescription(0),
                     "year=", utils.getYear())
                 regionID = gc.getMap().plot(city.getX(),
                                             city.getY()).getRegionID()
                 if regionID in utils.getCoreRegions(
                         sd.getCivilization(iPreviousOwner)):
                     utils.stabilityCheck(iPreviousOwner, -3)
                 elif regionID in utils.getNormalRegions(
                         sd.getCivilization(iPreviousOwner)):
                     if not (gc.getTeam(
                             gc.getPlayer(iPreviousOwner).getTeam()).
                             isHasTech(con.iStabilityStable)):
                         utils.stabilityCheck(iPreviousOwner, -2)
                 else:
                     if not (gc.getTeam(
                             gc.getPlayer(iPreviousOwner).getTeam()).
                             isHasTech(con.iStabilityStable)):
                         utils.stabilityCheck(iPreviousOwner, -1)
             if iPlayer < con.iNumPlayers and gc.getPlayer(
                     iPreviousOwner).getNumCities() > 1 and gc.getPlayer(
                         iPreviousOwner).getAnarchyTurns(
                         ) < 1 and gc.getPlayer(
                             iPreviousOwner).getGoldenAgeTurns() < 1:
                 print(
                     "STABILITY CHECK city razed iPlayer=",
                     gc.getPlayer(iPlayer).getCivilizationShortDescription(
                         0), "year=", utils.getYear())
                 regionID = gc.getMap().plot(city.getX(),
                                             city.getY()).getRegionID()
                 if regionID in utils.getCoreRegions(
                         sd.getCivilization(iPlayer)):
                     utils.stabilityCheck(iPlayer, -9)
                 elif regionID in utils.getNormalRegions(
                         sd.getCivilization(iPlayer)):
                     utils.stabilityCheck(iPlayer, -6)
                 else:
                     utils.stabilityCheck(iPlayer, -3)
         # Refugees
         sd.setVal('tRazedCityData',
                   (city.getX(), city.getY(), city.getNameKey()))
    def stabilityCheck(iPlayer, iAdjustment=0):

        #print "stabilityCheck called"

        #CyInterface().addMessage(utils.getHumanID(), True, iDuration, CyTranslator().getText("STABILITY CHECK", ()) + " " + gc.getPlayer(iPlayer).getCivilizationDescription(0), "", 0, "", ColorTypes(iRed), -1, -1, True, True)
        if (iPlayer > iNumPlayers):
            return
        pPlayer = gc.getPlayer(iPlayer)
        pTeam = gc.getTeam(pPlayer.getTeam())
        apCityList = PyPlayer(iPlayer).getCityList()
        iCiv = sd.getCivilization(iPlayer)
        iGameTurn = gc.getGame().getGameTurn()
        iCivicGovernment = pPlayer.getCivics(0)
        iCivicLegal = pPlayer.getCivics(1)
        iCivicLabor = pPlayer.getCivics(2)
        iCivicReligion = pPlayer.getCivics(4)

        # calibrate the system here:
        #iAdjustment -= 1

        if utils.getYear() > tFall[iCiv]:
            iAdjustment -= 3

        if iPlayer == iRome and (tBirth[iByzantines] +
                                 20) > utils.getYear() > (tBirth[iByzantines] -
                                                          20):
            #print "pass on Byzantine birth"
            return

        if (iGameTurn < getTurnForYear(tBirth[iPlayer]) + 50):
            #print "pass, too early"
            return

        if iPlayer == iRome and gc.getPlayer(iByzantines).isAlive(
        ) and sd.getCivilization(iByzantines) == iRebelRome:
            #print "pass for Rome during civil war"
            return
        '''if pTeam.isHasTech(iStabilityCollapsing):
			if iGameTurn > getTurnForYear(tFall[iCiv]):
				print ("quick terminal crisis, iCiv=", gc.getPlayer(iPlayer).getCivilizationShortDescription(0), "year=", utils.getYear())
				self.terminalCrisis(iPlayer, iCiv, pPlayer, pTeam)
				return
			else:
				print ("quick severe crisis, iCiv=", gc.getPlayer(iPlayer).getCivilizationShortDescription(0), "year=", utils.getYear())
				self.severeCrisis(iPlayer, iCiv, pPlayer, pTeam)
				return'''

        ## CIVICS ##

        # combinations of civics and state religions

        # Civics
        #print "CIVICS"

        iCivicsRating = sd.getCivicsStability(iPlayer)

        ## HAPPINESS AND HEALTH ##
        #print "HEALTH & HAPPINESS"
        # balance of health and happiness per city, with extra penalty for angry citizens

        iNumCities = pPlayer.getNumCities()
        if iNumCities < 1: iNumCities = 1

        iHappinessAndHealthRating = 0
        #print ("total happy", pPlayer.calculateTotalCityHappiness(), "total unhappy", pPlayer.calculateTotalCityUnhappiness(), "cities", iNumCities)
        #print ("total health", pPlayer.calculateTotalCityHealthiness(), "total unhealth", pPlayer.calculateTotalCityUnhealthiness(), "cities", iNumCities)
        iHappiness = ((pPlayer.calculateTotalCityHappiness()) -
                      (pPlayer.calculateTotalCityUnhappiness())) / (iNumCities)
        iHealth = ((pPlayer.calculateTotalCityHealthiness()) -
                   (pPlayer.calculateTotalCityUnhealthiness())) / (iNumCities)
        #print ("iHappiness=", iHappiness, "iHealth=", iHealth)

        if iHappiness < 0: iHappinessAndHealthRating -= 1
        elif iHappiness > 3: iHappinessAndHealthRating += 1

        if iHealth < 0: iHappinessAndHealthRating -= 1
        elif iHealth > 3: iHappinessAndHealthRating += 1

        if iPlayer == utils.getHumanID():  # I think this kills the AI unfairly
            for pLoopCity in apCityList:
                if (pLoopCity.GetCy().angryPopulation(0) > 0):
                    iHappinessAndHealthRating -= 1
                    #print "angry city"

        ## ECONOMY ##
        #print "ECONOMY"
        # balance of income and costs

        iEconomyRating = 0

        iRate = (pPlayer.calculateGoldRate() +
                 pPlayer.calculateBaseNetResearch()) - (
                     pPlayer.calculateInflatedCosts())
        #print ("gold=", pPlayer.calculateGoldRate(), "research=", pPlayer.calculateBaseNetResearch(), "costs=", pPlayer.calculateInflatedCosts(), "iRate", iRate)

        if iRate < -300: iEconomyRating -= 4
        elif iRate < -200: iEconomyRating -= 3
        elif iRate < -100: iEconomyRating -= 2
        elif iRate < -20: iEconomyRating -= 1
        elif iRate > +10: iEconomyRating += 1
        elif iRate > +30: iEconomyRating += 2

        #else:
        #iEconomyRating += 2
        #print "pass on savings"

        ## EMPIRE ##
        #print "EMPIRE"
        # balance of core and empire populations, mitigated by courthouses and civics

        iEmpireRating = 0
        bExiled = True
        for regionID in utils.getCoreRegions(iCiv):
            if (utils.checkRegionOwnedCity(iPlayer, regionID)):
                bExiled = False
            if not (utils.checkRegionControl(iPlayer, regionID)):
                iEmpireRating -= 4
                #print "core province not controlled"
        if bExiled:
            #print "Exiled"
            self.terminalCrisis(iPlayer, iCiv, pPlayer, pTeam)

        iCorePop = 0
        iEmpirePop = 0
        for pLoopCity in apCityList:
            if not pLoopCity.isNone():  # possible fix for C++ exception
                if pLoopCity.GetCy().isCapital():
                    iCorePop += pLoopCity.getPopulation() * 3
                else:
                    regionID = gc.getMap().plot(
                        pLoopCity.GetCy().getX(),
                        pLoopCity.GetCy().getY()).getRegionID()
                    if regionID in utils.getCoreRegions(
                            iCiv) or regionID in utils.getSpecialRegions(iCiv):
                        iCorePop += pLoopCity.getPopulation() * 2
                    elif regionID in utils.getNormalRegions(iCiv):
                        iFactor = 1
                        if not (
                            (iCivicGovernment == iTheocracyCivic) and
                            (pLoopCity.GetCy().isHasReligion(iStateReligion))):
                            if iCivicGovernment != iEmpireCivic: iFactor += 1
                        if not (iCivicLegal == iBureaucracyCivic):
                            iFactor += 1
                        print "C++ exception, Normal Regions", (
                            "iPlayer = ",
                            iPlayer), ("Year = ", utils.getYear()), (
                                "Location = ", "(", pLoopCity.GetCy().getX(),
                                ",", pLoopCity.GetCy().getY())
                        if not (pLoopCity.GetCy().getNumRealBuilding(
                                iCourthouse)):
                            print "Courthouse statement answered no"
                            iFactor += 1
                        else:
                            print "Courthouse statement answered yes"
                        iEmpirePop += pLoopCity.getPopulation() * iFactor
                    else:
                        iFactor = 2
                        if not (
                            (iCivicGovernment == iTheocracyCivic) and
                            (pLoopCity.GetCy().isHasReligion(iStateReligion))):
                            if iCivicGovernment != iEmpireCivic: iFactor += 1
                        if not (iCivicLegal == iBureaucracyCivic):
                            iFactor += 1
                        print "C++ exception, Other Regions", (
                            "iPlayer = ",
                            iPlayer), ("Year = ", utils.getYear()), (
                                "Location = ", "(", pLoopCity.GetCy().getX(),
                                ",", pLoopCity.GetCy().getY())
                        if not (pLoopCity.GetCy().getNumRealBuilding(
                                iCourthouse)):
                            print "Courthouse statement answered no"
                            iFactor += 1
                        else:
                            print "Courthouse statement answered yes"
                        iEmpirePop += pLoopCity.getPopulation() * iFactor

        #print ("iCorePop=", iCorePop, "iEmpirePop=", iEmpirePop)

        #if iCorePop > iEmpirePop *5: iEmpireRating += 5
        #elif iCorePop > iEmpirePop *4: iEmpireRating += 4
        #elif iCorePop > iEmpirePop *3: iEmpireRating += 3
        #iEmpireRating += self.empireStability(iCorePop, iEmpirePop)

        if iCorePop > iEmpirePop * 2: iEmpireRating += 2
        elif iCorePop > iEmpirePop: iEmpireRating += 1
        elif iCorePop * 5 < iEmpirePop: iEmpireRating -= 5
        elif iCorePop * 4 < iEmpirePop: iEmpireRating -= 4
        elif iCorePop * 3 < iEmpirePop: iEmpireRating -= 3
        elif iCorePop * 2 < iEmpirePop: iEmpireRating -= 2
        elif iCorePop < iEmpirePop: iEmpireRating -= 1

        #if iCorePop < iEmpirePop:
        #iEmpireRating -= (((iEmpirePop * 10) / iCorePop) * ((iEmpirePop * 10) / iCorePop)) / 100

        #print ("iEmpireRating=", iEmpireRating)

        ## RELIGION ##
        #print "RELIGION"
        iReligionRating = 0
        iNumForeignReligions = 0
        iNumNonbelievingCities = 0

        if (iCivicReligion == iDynasticCultCivic) or (iCivicReligion
                                                      == iPaganismCivic):
            for pLoopCity in apCityList:
                for iLoopReligion in range(iNumReligions):
                    if pLoopCity.GetCy().isHasReligion(iLoopReligion):
                        if iLoopReligion != iHinduism:
                            iNumForeignReligions += 1
                        elif iLoopReligion == iHinduism and iCivicLabor != iCasteSystemCivic:
                            iNumForeignReligions += 1
        elif iCivicReligion == iStateReligionCivic:
            for pLoopCity in apCityList:
                if not pLoopCity.GetCy().isHasReligion(iStateReligion):
                    iNumNonbelievingCities += 2
                for iLoopReligion in range(iNumReligions):
                    if pLoopCity.GetCy().isHasReligion(
                            iLoopReligion) and iLoopReligion != iStateReligion:
                        iNumForeignReligions += 1
        elif (iCivicReligion == iMilitancyCivic) or (iCivicGovernment
                                                     == iTheocracyCivic):
            for pLoopCity in apCityList:
                if not pLoopCity.GetCy().isHasReligion(iStateReligion):
                    iNumNonbelievingCities += 2
                for iLoopReligion in range(iNumReligions):
                    if pLoopCity.GetCy().isHasReligion(
                            iLoopReligion) and iLoopReligion != iStateReligion:
                        iNumForeignReligions += 2

        #print ("iNumForeignReligions", iNumForeignReligions, "iNumNonbelievingCities", iNumNonbelievingCities, "iNumCities", iNumCities)

        if iNumNonbelievingCities * 2 > iNumCities: iReligionRating -= 2
        elif iNumNonbelievingCities * 4 > iNumCities: iReligionRating -= 1

        if iNumForeignReligions > iNumCities * 2: iReligionRating -= 2
        elif iNumForeignReligions > iNumCities: iReligionRating -= 1

        #print ("iReligionRating=", iReligionRating)

        #print "TOTALS"
        #print ("Civics:", iCivicsRating, "Health & Happiness:", iHappinessAndHealthRating, "Economy:", iEconomyRating, "Empire:", iEmpireRating, "Religion:", iReligionRating)
        #print ("Total:", iCivicsRating + iHappinessAndHealthRating + iEconomyRating + iEmpireRating + iReligionRating)
        #iAdjustment = 3
        #print ("iAdjustment=", iAdjustment)

        iStability = iCivicsRating + iHappinessAndHealthRating + iEconomyRating + iEmpireRating + iReligionRating + iAdjustment
        if iPlayer == iByzantines: iStability += 3  # Byzantine UP
        if iGameTurn > getTurnForYear(tFall[iCiv]): iStability -= 3

        ### RESULTS ###

        if pTeam.isHasTech(iStabilityCollapsing):
            if iStability < -3:
                if iGameTurn > getTurnForYear(tFall[iCiv]):
                    #print "RESULT"
                    #print ("already collapsing, terminal crisis, iCiv=", iCiv)
                    self.terminalCrisis(iPlayer, iCiv, pPlayer, pTeam)
                    return
                else:
                    #print "RESULT"
                    #print ("already collapsing, severe crisis, iCiv=", iCiv)
                    self.severeCrisis(iPlayer, iCiv, pPlayer, pTeam)
                    return
            elif iStability < 3:
                #print "RESULT"
                #print ("stability flat at collapsing, moderate crisis, iCiv=", iCiv)
                self.moderateCrisis(iPlayer, iCiv, pPlayer, pTeam)
            elif iStability > 3:
                #print "RESULT"
                #print ("upgrade from collapsing to unstable, iCiv=", iCiv)
                pTeam.setHasTech(iStabilityCollapsing, False, iPlayer, False,
                                 False)
                pTeam.setHasTech(iStabilityUnstable, True, iPlayer, False,
                                 False)
                return

        elif pTeam.isHasTech(iStabilityUnstable):
            if iStability < -6:
                if iGameTurn > getTurnForYear(tFall[iCiv]):
                    #print "RESULT"
                    #print ("downgrade from unstable to collapsing, severe crisis, iCiv=", iCiv)
                    pTeam.setHasTech(iStabilityUnstable, False, iPlayer, False,
                                     False)
                    pTeam.setHasTech(iStabilityCollapsing, True, iPlayer,
                                     False, False)
                    self.severeCrisis(iPlayer, iCiv, pPlayer, pTeam)
                    return
                else:
                    #print "RESULT"
                    #print ("downgrade from unstable to collapsing, moderate crisis, iCiv=", iCiv)
                    pTeam.setHasTech(iStabilityUnstable, False, iPlayer, False,
                                     False)
                    pTeam.setHasTech(iStabilityCollapsing, True, iPlayer,
                                     False, False)
                    self.moderateCrisis(iPlayer, iCiv, pPlayer, pTeam)
                    return
            elif iStability <= 0:
                #print "RESULT"
                #print ("stability flat at unstable, minor crisis, iCiv=", iCiv)
                self.minorCrisis(iPlayer, iCiv, pPlayer, pTeam)
                return
            else:
                #print "RESULT"
                #print ("stability upgrade from unstable to stable, no crisis, iCiv=", iCiv)
                pTeam.setHasTech(iStabilityUnstable, False, iPlayer, False,
                                 False)
                pTeam.setHasTech(iStabilityStable, True, iPlayer, False, False)
                return
        else:
            if iStability < -6:
                #print "RESULT"
                #print ("downgrade from stable to unstable, minor crisis, iCiv=", iCiv)
                pTeam.setHasTech(iStabilityStable, False, iPlayer, False,
                                 False)
                pTeam.setHasTech(iStabilityUnstable, True, iPlayer, False,
                                 False)
                self.minorCrisis(iPlayer, iCiv, pPlayer, pTeam)
                return
            elif iStability < -3:
                #print "RESULT"
                #print ("downgrade from stable to unstable, no crisis, iCiv=", iCiv)
                pTeam.setHasTech(iStabilityStable, False, iPlayer, False,
                                 False)
                pTeam.setHasTech(iStabilityUnstable, True, iPlayer, False,
                                 False)
                return
            #elif iStability >= 0: print ("stability flat at stable, no crisis, iCiv=", iCiv)
Example #10
0
    def checkGrid(self, iCiv):

        pCiv = gc.getPlayer(iCiv)
        tCiv = gc.getTeam(pCiv.getTeam())
        lTargetCivs = []

        #clean it, sometimes it takes old values in memory
        for k in range(iNumTotalPlayers):
            lTargetCivs.append(0)

        #set alive civs to 1 to differentiate them from dead civs
        for k in range(iNumTotalPlayers):
            if gc.getPlayer(k).isAlive() and tCiv.isHasMet(k):
                lTargetCivs[k] = 1

        #set master or vassal to 0
        for k in range(iNumPlayers):
            if gc.getTeam(gc.getPlayer(k).getTeam()).isVassal(
                    iCiv) or tCiv.isVassal(k):
                lTargetCivs[k] = 0

        #if already at war
        for k in range(iNumTotalPlayers):
            if tCiv.isAtWar(k):
                lTargetCivs[k] = 0

        lTargetCivs[iCiv] = 0

        #edead: changed Rhye's code to Regions (provinces)
        map = CyMap()
        for i in range(map.numPlots()):
            plot = map.plotByIndex(i)
            if plot.isCity():
                iOwner = plot.getOwner()
                if iOwner >= 0 and iOwner < iNumTotalPlayers and iOwner != iCiv:
                    if lTargetCivs[iOwner] > 0:
                        regionID = plot.getRegionID()
                        if regionID in utils.getCoreRegions(iCiv):
                            lTargetCivs[iOwner] += 10
                        elif regionID in utils.getNormalRegions(iCiv):
                            lTargetCivs[iOwner] += 5
                        elif regionID in utils.getBroaderRegions(iCiv):
                            lTargetCivs[iOwner] += 2

        #srpt: important war
        if utils.getYear() >= -250 and utils.getYear() < -150:
            if iCiv == con.iRome:
                lTargetCivs[con.iCarthage] += 30
            elif iCiv == con.iCarthage:
                lTargetCivs[con.iRome] += 30

        #srpt: important war
        if utils.getYear() >= -400 and utils.getYear() < -300:
            if iCiv == con.iMacedon:
                lTargetCivs[con.iAthens] += 30
            elif iCiv == con.iAthens:
                lTargetCivs[con.iMacedon] += 30

        #srpt: important war
        if utils.getYear() >= -350 and utils.getYear() < -300:
            if iCiv == con.iQin:
                lTargetCivs[con.iJinState] += 30
            elif iCiv == con.iJinState:
                lTargetCivs[con.iQin] += 30

        #there are other routines for this
        lTargetCivs[iIndependent1] /= 3
        lTargetCivs[iIndependent2] /= 3
        lTargetCivs[iIndependent3] /= 3
        lTargetCivs[iIndependent4] /= 3

        #no random silly wars - edead
        for k in range(iNumTotalPlayers):
            if lTargetCivs[k] == 1:
                lTargetCivs[k] = 0

        print("AIWars grid for ", iCiv)
        print(lTargetCivs)

        #normalization
        iMaxTempValue = -1
        for k in range(iNumTotalPlayers):
            if (lTargetCivs[k] > iMaxTempValue):
                iMaxTempValue = lTargetCivs[k]
        if (iMaxTempValue > 0):
            for k in range(iNumTotalPlayers):
                if (lTargetCivs[k] > 0):
                    lTargetCivs[k] = lTargetCivs[k] * 500 / iMaxTempValue

        print(lTargetCivs)

        for iLoopCiv in range(iNumTotalPlayers):

            if (lTargetCivs[iLoopCiv] <= 0):
                continue

            #add a random value
            if (lTargetCivs[iLoopCiv] <= iThreshold):
                lTargetCivs[iLoopCiv] += gc.getGame().getSorenRandNum(
                    100, 'random modifier')
            if (lTargetCivs[iLoopCiv] > iThreshold):
                lTargetCivs[iLoopCiv] += gc.getGame().getSorenRandNum(
                    300, 'random modifier')

            #balanced with attitude
            attitude = 2 * (pCiv.AI_getAttitude(iLoopCiv) - 2)
            if (attitude > 0):
                lTargetCivs[iLoopCiv] /= attitude

            #exploit plague
            if iLoopCiv < iNumPlayers:
                if (sd.getPlagueCountdown(iLoopCiv) > 0
                        or sd.getPlagueCountdown(iLoopCiv) < -10
                        and not (gc.getGame().getGameTurn() <= getTurnForYear(
                            con.tBirth[iLoopCiv]) + utils.getTurns(20))):
                    lTargetCivs[iLoopCiv] *= 3
                    lTargetCivs[iLoopCiv] /= 2

            #balanced with master's attitude
            for j in range(iNumTotalPlayers):
                if (tCiv.isVassal(j)):
                    attitude = 2 * (gc.getPlayer(j).AI_getAttitude(iLoopCiv) -
                                    2)
                    if (attitude > 0):
                        lTargetCivs[iLoopCiv] /= attitude

            #if already at war
            if (not tCiv.isAtWar(iLoopCiv)):
                #consider peace counter
                iCounter = min(7, max(1, tCiv.AI_getAtPeaceCounter(iLoopCiv)))
                if (iCounter <= 7):
                    lTargetCivs[iLoopCiv] *= 20 + 10 * iCounter
                    lTargetCivs[iLoopCiv] /= 100

            #if under pact
            if (tCiv.isDefensivePact(iLoopCiv)):
                lTargetCivs[iLoopCiv] /= 4

            #if friend of a friend
##					for jLoopCiv in range( iNumTotalPlayers ):
##						if (tCiv.isDefensivePact(jLoopCiv) and gc.getTeam(gc.getPlayer(iLoopCiv).getTeam()).isDefensivePact(jLoopCiv)):
##							lTargetCivs[iLoopCiv] /= 2

        print(lTargetCivs)

        #find max
        iMaxValue = 0
        iTargetCiv = -1
        for iLoopCiv in range(iNumTotalPlayers):
            if (lTargetCivs[iLoopCiv] > iMaxValue):
                iMaxValue = lTargetCivs[iLoopCiv]
                iTargetCiv = iLoopCiv

        print("maxvalue", iMaxValue)
        print("target civ", iTargetCiv)

        if (iMaxValue >= iMinValue):
            return iTargetCiv
        return -1
Example #11
0
    def chooseAttackingPlayer(self):
        #finding max teams ever alive (countCivTeamsEverAlive() doesn't work as late human starting civ gets killed every turn)
        iMaxCivs = iNumPlayers
        for i in range(iNumPlayers):
            j = iNumPlayers - 1 - i
            if (gc.getPlayer(j).isAlive()):
                iMaxCivs = j
                break
        #print ("iMaxCivs", iMaxCivs)

        if (gc.getGame().countCivPlayersAlive() <= 3):
            return -1
        else:
            iRndnum = gc.getGame().getSorenRandNum(iMaxCivs,
                                                   'attacking civ index')

            # Important war: Carthage vs. Rome
            if utils.getYear() >= -250 and utils.getYear() < -150:
                if gc.getPlayer(con.iRome).isAlive() and gc.getPlayer(
                        con.iCarthage).isAlive():
                    if not gc.getTeam(gc.getPlayer(
                            con.iRome).getTeam()).isAtWar(con.iCarthage):
                        if gc.getPlayer(con.iRome) != utils.getHumanID():
                            iRndnum = con.iRome
                        elif gc.getPlayer(con.iCarthage) != utils.getHumanID():
                            iRndnum = con.iCarthage

            # Important war: Macedon vs. Athens
            if utils.getYear() >= -400 and utils.getYear() < -300:
                if gc.getPlayer(con.iMacedon).isAlive() and gc.getPlayer(
                        con.iAthens).isAlive():
                    if not gc.getTeam(gc.getPlayer(
                            con.iMacedon).getTeam()).isAtWar(con.iAthens):
                        if gc.getPlayer(con.iMacedon) != utils.getHumanID():
                            iRndnum = con.iMacedon
                        elif gc.getPlayer(con.iAthens) != utils.getHumanID():
                            iRndnum = con.iAthens
                            iRndnum = con.iCarthage

            # Important war: Qin vs. Jin
            if utils.getYear() >= -350 and utils.getYear() < -300:
                if gc.getPlayer(con.iQin).isAlive() and gc.getPlayer(
                        con.iJinState).isAlive():
                    if not gc.getTeam(gc.getPlayer(
                            con.iQin).getTeam()).isAtWar(con.iJinState):
                        if gc.getPlayer(con.iQin) != utils.getHumanID():
                            iRndnum = con.iQin
                        elif gc.getPlayer(con.iJinState) != utils.getHumanID():
                            iRndnum = con.iJinState

            #print ("iRndnum", iRndnum)
            iAlreadyAttacked = -100
            iMin = 100
            iCiv = -1
            for i in range(iRndnum, iRndnum + iMaxCivs):
                iLoopCiv = i % iMaxCivs
                pLoopPlayer = gc.getPlayer(iLoopCiv)
                if (pLoopPlayer.isAlive() and not pLoopPlayer.isHuman()):
                    if (sd.getPlagueCountdown(iLoopCiv) >= -10
                            and sd.getPlagueCountdown(iLoopCiv) <= 0
                        ):  #civ is not under plague or quit recently from it
                        iAlreadyAttacked = sd.getAttackingCivsArray(iLoopCiv)
                        if (utils.isAVassal(iLoopCiv)):
                            iAlreadyAttacked += 1  #less likely to attack
                        #check if a world war is already in place
                        iNumAlreadyWar = 0
                        tLoopCiv = gc.getTeam(pLoopPlayer.getTeam())
                        for kLoopCiv in range(iNumPlayers):
                            if (tLoopCiv.isAtWar(kLoopCiv)):
                                if gc.getPlayer(kLoopCiv).isAlive():
                                    iNumAlreadyWar += 1
                        if (iNumAlreadyWar >= 4):
                            iAlreadyAttacked += 2  #much less likely to attack
                        elif (iNumAlreadyWar >= 2):
                            iAlreadyAttacked += 1  #less likely to attack

                        if (iAlreadyAttacked < iMin):
                            iMin = iAlreadyAttacked
                            iCiv = iLoopCiv
                #print ("attacking civ", iCiv)
                if (iAlreadyAttacked != -100):
                    sd.setAttackingCivsArray(iCiv, iAlreadyAttacked + 1)
                    return iCiv
                else:
                    return -1
        return -1
Example #12
0
    def killUnitsByPlague(self, city, pCurrent, baseValue, iDamage,
                          iPreserveDefenders):

        iOwner = city.getOwner()
        pOwner = gc.getPlayer(iOwner)
        teamOwner = gc.getTeam(gc.getPlayer(city.getOwner()).getTeam())

        #deadly plague when human player isn't born yet, will speed up the loading
        if utils.getYear() <= getTurnForYear(con.tBirth[utils.getHumanID()]):
            iDamage += 10
            baseValue -= 5

        # modify strength on per-plague basis
        iDamage *= self.getPlagueMultiplier()
        iDamage /= 100

        # spare less urbanized civs
        if iOwner in con.lBlackDeathSurvivors:
            iDamage = (iDamage * 2) / 3
            baseValue += 5

        #print (city.getX(), city.getY())
        iNumUnitsInAPlot = pCurrent.getNumUnits()
        #iPreserveHumanDefenders = iPreserveDefenders -1 #human handicap
        iPreserveHumanDefenders = iPreserveDefenders
        iHuman = utils.getHumanID()
        if (iPreserveDefenders > 0):  #cities only
            #handicap for civs distant from human player too
            if (not pOwner.isHuman()):  #if not human and close or at war
                #iPreserveDefenders -= 1
                if (teamOwner.isAtWar(iHuman)):
                    iPreserveDefenders += 2
                # else:
                # for j in range(len(con.lCivGroups)):
                # if ((iOwner in con.lCivGroups[j]) and (utils.getHumanID() in con.lCivGroups[j])):
                # iPreserveDefenders += 1
                # break
        if (iNumUnitsInAPlot):
            for j in range(iNumUnitsInAPlot):
                i = iNumUnitsInAPlot - j - 1
                unit = pCurrent.getUnit(i)
                if (gc.getPlayer(unit.getOwner()).isHuman()):
                    #print ("iPreserveHumanDefenders", iPreserveHumanDefenders)
                    if (iPreserveHumanDefenders > 0):
                        #if (utils.isDefenderUnit(unit)):
                        iPreserveHumanDefenders -= 1
                        if (pCurrent.getNumUnits() > iPreserveDefenders):
                            pass
                        else:
                            unit.setDamage(unit.getDamage() + iDamage - 20,
                                           con.iBarbarian)
                        #print ("preserve")
                        continue
                else:
                    if (iPreserveDefenders > 0):
                        #if (utils.isDefenderUnit(unit)):
                        iPreserveDefenders -= 1
                        if (pCurrent.getNumUnits() > iPreserveDefenders
                                or gc.getTeam(
                                    gc.getPlayer(unit.getOwner()).getTeam()
                                ).isAtWar(iHuman)):
                            pass
                        else:
                            unit.setDamage(unit.getDamage() + iDamage - 20,
                                           con.iBarbarian)
                        #print ("preserve")
                        continue
                if (utils.isMortalUnit(unit)):  #another human handicap inside
                    iThreshold = baseValue + 5 * city.healthRate(False, 0)
                    #print ("iThreshold", iThreshold)

                    if (teamOwner.isAtWar(iHuman) and iOwner < iNumPlayers):
                        if (unit.getOwner() == iOwner):
                            iDamage *= 3
                            iDamage /= 4

                    if (gc.getGame().getSorenRandNum(100, 'roll') >
                            iThreshold):
                        if (iDamage == 100):
                            if (unit.getOwner() != city.getOwner() and
                                    gc.getPlayer(unit.getOwner()).isHuman()):
                                CyInterface().addMessage(
                                    unit.getOwner(), False, con.iDuration / 2,
                                    CyTranslator().getText(
                                        "TXT_KEY_PLAGUE_PROCESS_UNIT",
                                        ()) + " " + city.getName(),
                                    "AS2D_PLAGUE", 0, "",
                                    ColorTypes(con.iLime), -1, -1, True, True)
                            unit.kill(False, iBarbarian)
                        else:
                            if (iDamage - unit.getExperience() / 10 -
                                    unit.baseCombatStr() * 3 / 7 >=
                                    100 - unit.getDamage()):
                                if (unit.getOwner() != iOwner and gc.getPlayer(
                                        unit.getOwner()).isHuman()):
                                    CyInterface().addMessage(
                                        unit.getOwner(), False,
                                        con.iDuration / 2,
                                        CyTranslator().getText(
                                            "TXT_KEY_PLAGUE_PROCESS_UNIT",
                                            ()) + " " + city.getName(),
                                        "AS2D_PLAGUE", 0, "",
                                        ColorTypes(con.iLime), -1, -1, True,
                                        True)
                            unit.setDamage(
                                unit.getDamage() + iDamage -
                                unit.getExperience() / 10 -
                                unit.baseCombatStr() / 2, con.iBarbarian)
                            #print ("process")
                        break
Example #13
0
    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