def onChangeWar(bWar, iPlayer, iOtherPlayer):
	if isCongressEnabled():
		if bWar and not isGlobalWar():
			lAttackers, lDefenders = determineAlliances(iPlayer, iOtherPlayer)
			
			if startsGlobalWar(lAttackers, lDefenders):
				iAttacker = utils.getHighestEntry(lAttackers, lambda iPlayer: gc.getTeam(iPlayer).getPower(True))
				iDefender = utils.getHighestEntry(lDefenders, lambda iPlayer: gc.getTeam(iPlayer).getPower(True))
			
				data.iGlobalWarAttacker = iAttacker
				data.iGlobalWarDefender = iDefender
		
		if not bWar and data.iGlobalWarAttacker in [iPlayer, iOtherPlayer] and data.iGlobalWarDefender in [iPlayer, iOtherPlayer]:
			endGlobalWar(iPlayer, iOtherPlayer)
def onChangeWar(bWar, iPlayer, iOtherPlayer):
	if isCongressEnabled():
		if bWar and not isGlobalWar():
			lAttackers, lDefenders = determineAlliances(iPlayer, iOtherPlayer)
			
			if startsGlobalWar(lAttackers, lDefenders):
				iAttacker = utils.getHighestEntry(lAttackers, lambda iPlayer: gc.getTeam(iPlayer).getPower(True))
				iDefender = utils.getHighestEntry(lDefenders, lambda iPlayer: gc.getTeam(iPlayer).getPower(True))
			
				data.iGlobalWarAttacker = iAttacker
				data.iGlobalWarDefender = iDefender
		
		if not bWar and data.iGlobalWarAttacker in [iPlayer, iOtherPlayer] and data.iGlobalWarDefender in [iPlayer, iOtherPlayer]:
			endGlobalWar(iPlayer, iOtherPlayer)
    def determineAttackingPlayer(self):
        lAggressionLevels = [
            data.players[i].iAggressionLevel for i in range(iNumPlayers)
            if self.possibleTargets(i)
        ]
        iHighestEntry = utils.getHighestEntry(lAggressionLevels)

        return lAggressionLevels.index(iHighestEntry)
Example #4
0
	def checkSchism(self, iGameTurn):
		if not gc.getGame().isReligionFounded(iOrthodoxy): return
		if gc.getGame().isReligionFounded(iCatholicism): return
		
		if gc.getGame().countReligionLevels(iOrthodoxy) < 10: return
		
		lStateReligionCities = []
		lNoStateReligionCities = []
		lDifferentStateReligionCities = []
		lMinorCities = []
		
		for iPlayer in range(iNumTotalPlayersB):
			iStateReligion = gc.getPlayer(iPlayer).getStateReligion()
			lCities = [city for city in utils.getCityList(iPlayer) if city.isHasReligion(iOrthodoxy)]
			if iStateReligion == iOrthodoxy: lStateReligionCities.extend(lCities)
			elif gc.getPlayer(iPlayer).isMinorCiv() or gc.getPlayer(iPlayer).isBarbarian(): lMinorCities.extend(lCities)
			elif iStateReligion == -1: lNoStateReligionCities.extend(lCities)
			else: lDifferentStateReligionCities.extend(lCities)
			
		if not lStateReligionCities: return
		if not lNoStateReligionCities and not lMinorCities: return
		
		if len(lStateReligionCities) >= len(lNoStateReligionCities) + len(lMinorCities): return
		
		lOrthodoxCapitals = [city for city in lStateReligionCities if city.isCapital()]
		
		if lOrthodoxCapitals:
			pOrthodoxCapital = utils.getHighestEntry(lOrthodoxCapitals, lambda city: gc.getPlayer(city.getOwner()).getScoreHistory(iGameTurn))
		else:
			pOrthodoxCapital = gc.getGame().getHolyCity(iOrthodoxy)
		
		lCatholicCities = []
		lCatholicCities.extend(lNoStateReligionCities)
		lCatholicCities.extend(lMinorCities)
		pCatholicCapital = utils.getHighestEntry([city for city in lCatholicCities if city.plot().getSpreadFactor(iCatholicism) >= 3 and city != pOrthodoxCapital], lambda city: city.getPopulation())
		
		if not pCatholicCapital:
			pCatholicCapital = utils.getHighestEntry(lCatholicCities, lambda city: city.getPopulation())
		
		self.foundReligion((pCatholicCapital.getX(), pCatholicCapital.getY()), iCatholicism)
		
		lIndependentCities = []
		lIndependentCities.extend(lDifferentStateReligionCities)
		lIndependentCities.extend(lMinorCities)
				
		self.schism(pOrthodoxCapital, pCatholicCapital, lNoStateReligionCities, lIndependentCities)
	def checkSchism(self, iGameTurn):
		if not gc.getGame().isReligionFounded(iOrthodoxy): return
		if gc.getGame().isReligionFounded(iCatholicism): return
		
		lStateReligionCities = []
		lNoStateReligionCities = []
		lDifferentStateReligionCities = []
		lMinorCities = []
		
		for iPlayer in range(iNumTotalPlayersB):
			iStateReligion = gc.getPlayer(iPlayer).getStateReligion()
			lCities = [city for city in utils.getCityList(iPlayer) if city.isHasReligion(iOrthodoxy)]
			if iStateReligion == iOrthodoxy: lStateReligionCities.extend(lCities)
			elif gc.getPlayer(iPlayer).isMinorCiv() or gc.getPlayer(iPlayer).isBarbarian(): lMinorCities.extend(lCities)
			elif iStateReligion == -1: lNoStateReligionCities.extend(lCities)
			else: lDifferentStateReligionCities.extend(lCities)
			
		if not lStateReligionCities: return
		if not lNoStateReligionCities and not lMinorCities: return
		
		if len(lStateReligionCities) >= len(lNoStateReligionCities) + len(lMinorCities): return
		
		lOrthodoxCapitals = [city for city in lStateReligionCities if city.isCapital()]
		
		if lOrthodoxCapitals:
			pOrthodoxCapital = utils.getHighestEntry(lOrthodoxCapitals, lambda city: gc.getPlayer(city.getOwner()).getScoreHistory(iGameTurn))
		else:
			pOrthodoxCapital = gc.getGame().getHolyCity(iOrthodoxy)
		
		lCatholicCities = []
		lCatholicCities.extend(lNoStateReligionCities)
		lCatholicCities.extend(lMinorCities)
		pCatholicCapital = utils.getHighestEntry([city for city in lCatholicCities if city.plot().getSpreadFactor(iCatholicism) >= 3 and city != pOrthodoxCapital], lambda city: city.getPopulation())
		
		if not pCatholicCapital:
			pCatholicCapital = utils.getHighestEntry(lCatholicCities, lambda city: city.getPopulation())
		
		self.foundReligion((pCatholicCapital.getX(), pCatholicCapital.getY()), iCatholicism)
		
		lIndependentCities = []
		lIndependentCities.extend(lDifferentStateReligionCities)
		lIndependentCities.extend(lMinorCities)
				
		self.schism(pOrthodoxCapital, pCatholicCapital, lNoStateReligionCities, lIndependentCities)
Example #6
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 #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 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 makeClaimAI(self, iPlayer):
		if len(self.dPossibleClaims[iPlayer]) == 0: return
		x, y, iValue = utils.getHighestEntry(self.dPossibleClaims[iPlayer], lambda x: x[2])
		self.dCityClaims[iPlayer] = (x, y, iValue)
    def determineTargetPlayer(self, iPlayer):
        pPlayer = gc.getPlayer(iPlayer)
        tPlayer = gc.getTeam(pPlayer.getTeam())
        lPotentialTargets = []
        lTargetValues = [0 for i in range(iNumPlayers)]

        # determine potential targets
        for iLoopPlayer in self.possibleTargets(iPlayer):
            pLoopPlayer = gc.getPlayer(iLoopPlayer)
            tLoopPlayer = gc.getTeam(pLoopPlayer.getTeam())

            if iLoopPlayer == iPlayer: continue

            # requires live civ and past contact
            if not pLoopPlayer.isAlive(): continue
            if not tPlayer.isHasMet(iLoopPlayer): continue

            # no masters or vassals
            if tPlayer.isVassal(iLoopPlayer): continue
            if tLoopPlayer.isVassal(iPlayer): continue

            # not already at war
            if tPlayer.isAtWar(iLoopPlayer): continue

            lPotentialTargets.append(iLoopPlayer)

        if not lPotentialTargets: return -1

        # iterate the map for all potential targets
        for i in range(iWorldX):
            for j in range(iWorldY):
                iOwner = gc.getMap().plot(i, j).getOwner()
                if iOwner in lPotentialTargets:
                    lTargetValues[iOwner] += pPlayer.getWarValue(i, j)

        # hard to attack with lost contact
        for iLoopPlayer in lPotentialTargets:
            lTargetValues[iLoopPlayer] /= 8

        # normalization
        iMaxValue = utils.getHighestEntry(lTargetValues)
        if iMaxValue == 0: return -1

        for iLoopPlayer in lPotentialTargets:
            lTargetValues[iLoopPlayer] *= 500
            lTargetValues[iLoopPlayer] /= iMaxValue

        for iLoopPlayer in lPotentialTargets:

            # randomization
            if lTargetValues[iLoopPlayer] <= iThreshold:
                lTargetValues[iLoopPlayer] += gc.getGame().getSorenRandNum(
                    100, 'random modifier')
            else:
                lTargetValues[iLoopPlayer] += gc.getGame().getSorenRandNum(
                    300, 'random modifier')

            # balanced by attitude
            iAttitude = pPlayer.AI_getAttitude(iLoopPlayer) - 2
            if iAttitude > 0:
                lTargetValues[iLoopPlayer] /= 2 * iAttitude

            # exploit plague
            if data.players[iLoopPlayer].iPlagueCountdown > 0 or data.players[
                    iLoopPlayer].iPlagueCountdown < -10:
                if gc.getGame().getGameTurn() > getTurnForYear(
                        tBirth[iLoopPlayer]) + utils.getTurns(20):
                    lTargetValues[iLoopPlayer] *= 3
                    lTargetValues[iLoopPlayer] /= 2

            # determine master
            iMaster = -1
            for iLoopMaster in range(iNumPlayers):
                if tLoopPlayer.isVassal(iLoopMaster):
                    iMaster = iLoopMaster
                    break

            # master attitudes
            if iMaster >= 0:
                iAttitude = gc.getPlayer(iMaster).AI_getAttitude(iLoopPlayer)
                if iAttitude > 0:
                    lTargetValues[iLoopPlayer] /= 2 * iAttitude

            # peace counter
            if not tPlayer.isAtWar(iLoopPlayer):
                iCounter = min(
                    7, max(1, tPlayer.AI_getAtPeaceCounter(iLoopPlayer)))
                if iCounter <= 7:
                    lTargetValues[iLoopPlayer] *= 20 + 10 * iCounter
                    lTargetValues[iLoopPlayer] /= 100

            # defensive pact
            if tPlayer.isDefensivePact(iLoopPlayer):
                lTargetValues[iLoopPlayer] /= 4

            # consider power
            iOurPower = tPlayer.getPower(True)
            iTheirPower = gc.getTeam(iLoopPlayer).getPower(True)
            if iOurPower > 2 * iTheirPower:
                lTargetValues[iLoopPlayer] *= 2
            elif 2 * iOurPower < iTheirPower:
                lTargetValues[iLoopPlayer] /= 2

            # spare smallish civs
            if iLoopPlayer in [iNetherlands, iPortugal, iItaly]:
                lTargetValues[iLoopPlayer] *= 4
                lTargetValues[iLoopPlayer] /= 5

            # no suicide
            if iPlayer == iNetherlands:
                if iLoopPlayer in [iFrance, iHolyRome, iGermany]:
                    lTargetValues[iLoopPlayer] /= 2
            elif iPlayer == iPortugal:
                if iLoopPlayer == iSpain:
                    lTargetValues[iLoopPlayer] /= 2
            elif iPlayer == iItaly:
                if iLoopPlayer in [iFrance, iHolyRome, iGermany]:
                    lTargetValues[iLoopPlayer] /= 2

        return utils.getHighestIndex(lTargetValues)
Example #10
0
    def onGreatPersonBorn(self, argsList):
        'Great Person Born'
        pUnit, iPlayer, pCity = argsList

        gp.onGreatPersonBorn(pUnit, iPlayer, pCity)
        vic.onGreatPersonBorn(iPlayer, pUnit)
        sta.onGreatPersonBorn(iPlayer)

        # Leoreth: Silver Tree Fountain effect
        if gc.getUnitInfo(pUnit.getUnitType()).getLeaderExperience(
        ) > 0 and gc.getPlayer(iPlayer).isHasBuildingEffect(
                iSilverTreeFountain):
            city = utils.getHighestEntry(
                utils.getCityList(iPlayer),
                lambda city: city.getGreatPeopleProgress())
            if city and city.getGreatPeopleProgress() > 0:
                iGreatPerson = utils.getHighestEntry(
                    range(iNumUnits),
                    lambda iUnit: city.getGreatPeopleUnitProgress(iUnit))
                if iGreatPerson >= 0:
                    gc.getPlayer(iPlayer).createGreatPeople(
                        iGreatPerson, False, False, city.getX(), city.getY())

        # Leoreth: Nobel Prize effect
        if gc.getGame().getBuildingClassCreatedCount(
                gc.getBuildingInfo(iNobelPrize).getBuildingClassType()) > 0:
            if gc.getUnitInfo(pUnit.getUnitType()).getLeaderExperience(
            ) == 0 and gc.getUnitInfo(
                    pUnit.getUnitType()).getEspionagePoints() == 0:
                for iLoopPlayer in range(iNumPlayers):
                    if gc.getPlayer(iLoopPlayer).isHasBuildingEffect(
                            iNobelPrize):
                        if pUnit.getOwner() != iLoopPlayer and gc.getPlayer(
                                pUnit.getOwner()).AI_getAttitude(
                                    iLoopPlayer
                                ) >= AttitudeTypes.ATTITUDE_PLEASED:
                            for pLoopCity in utils.getCityList(iLoopPlayer):
                                if pLoopCity.isHasBuildingEffect(iNobelPrize):
                                    iGreatPersonType = pUnit.getUnitType()
                                    if iGreatPersonType in dFemaleGreatPeople.values(
                                    ):
                                        for iLoopGreatPerson in dFemaleGreatPeople:
                                            if iGreatPersonType == dFemaleGreatPeople[
                                                    iLoopGreatPerson]:
                                                iGreatPersonType = iLoopGreatPerson
                                                break

                                    iGreatPeoplePoints = max(
                                        4,
                                        gc.getPlayer(iLoopPlayer).
                                        getGreatPeopleCreated())

                                    pLoopCity.changeGreatPeopleProgress(
                                        iGreatPeoplePoints)
                                    pLoopCity.changeGreatPeopleUnitProgress(
                                        iGreatPersonType, iGreatPeoplePoints)
                                    CyInterface().setDirty(
                                        InterfaceDirtyBits.
                                        MiscButtons_DIRTY_BIT, True)
                                    CyInterface().addMessage(
                                        iLoopPlayer, False, iDuration,
                                        CyTranslator().getText(
                                            "TXT_KEY_BUILDING_NOBEL_PRIZE_EFFECT",
                                            (gc.getPlayer(pUnit.getOwner(
                                            )).getCivilizationAdjective(0),
                                             pUnit.getName(),
                                             pLoopCity.getName(),
                                             iGreatPeoplePoints)), "", 0, "",
                                        ColorTypes(iWhite), -1, -1, True, True)
                                    break
                            break
Example #11
0
    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 determineTargetPlayer(self, iPlayer):
		pPlayer = gc.getPlayer(iPlayer)
		tPlayer = gc.getTeam(pPlayer.getTeam())
		lPotentialTargets = []
		lTargetValues = [0 for i in range(iNumPlayers)]

		# determine potential targets
		for iLoopPlayer in range(iNumPlayers):
			pLoopPlayer = gc.getPlayer(iLoopPlayer)
			tLoopPlayer = gc.getTeam(pLoopPlayer.getTeam())
			
			# requires live civ and past contact
			if not pLoopPlayer.isAlive(): continue
			if not tPlayer.isHasMet(iLoopPlayer): continue
			
			# no masters or vassals
			if tPlayer.isVassal(iLoopPlayer): continue
			if tLoopPlayer.isVassal(iPlayer): continue
			
			# not already at war
			if tPlayer.isAtWar(iLoopPlayer): continue
			
			lPotentialTargets.append(iLoopPlayer)
			
		if not lPotentialTargets: return -1
			
		# iterate the map for all potential targets
		for i in range(124):
			for j in range(68):
				iOwner = gc.getMap().plot(i,j).getOwner()
				if iOwner in lPotentialTargets:
					lTargetValues[iOwner] += pPlayer.getWarValue(i, j)
					
		# hard to attack with lost contact
		for iLoopPlayer in lPotentialTargets:
			lTargetValues[iLoopPlayer] /= 8
			
		# normalization
		iMaxValue = utils.getHighestEntry(lTargetValues)
		if iMaxValue == 0: return -1
		
		for iLoopPlayer in lPotentialTargets:
			lTargetValues[iLoopPlayer] *= 500
			lTargetValues[iLoopPlayer] /= iMaxValue
			
		for iLoopPlayer in lPotentialTargets:
		
			# randomization
			if lTargetValues[iLoopPlayer] <= iThreshold:
				lTargetValues[iLoopPlayer] += gc.getGame().getSorenRandNum(100, 'random modifier')
			else:
				lTargetValues[iLoopPlayer] += gc.getGame().getSorenRandNum(300, 'random modifier')
			
			# balanced by attitude
			iAttitude = pPlayer.AI_getAttitude(iLoopPlayer) - 2
			if iAttitude > 0:
				lTargetValues[iLoopPlayer] /= 2 * iAttitude
				
			# exploit plague
			if data.players[iLoopPlayer].iPlagueCountdown > 0 or data.players[iLoopPlayer].iPlagueCountdown < -10:
				if gc.getGame().getGameTurn() > getTurnForYear(tBirth[iLoopPlayer]) + utils.getTurns(20):
					lTargetValues[iLoopPlayer] *= 3
					lTargetValues[iLoopPlayer] /= 2
		
			# determine master
			iMaster = -1
			for iLoopMaster in range(iNumPlayers):
				if tLoopPlayer.isVassal(iLoopMaster):
					iMaster = iLoopMaster
					break
					
			# master attitudes
			if iMaster >= 0:
				iAttitude = gc.getPlayer(iMaster).AI_getAttitude(iLoopPlayer)
				if iAttitude > 0:
					lTargetValues[iLoopPlayer] /= 2 * iAttitude
			
			# peace counter
			if not tPlayer.isAtWar(iLoopPlayer):
				iCounter = min(7, max(1, tPlayer.AI_getAtPeaceCounter(iLoopPlayer)))
				if iCounter <= 7:
					lTargetValues[iLoopPlayer] *= 20 + 10 * iCounter
					lTargetValues[iLoopPlayer] /= 100
					
			# defensive pact
			if tPlayer.isDefensivePact(iLoopPlayer):
				lTargetValues[iLoopPlayer] /= 4
				
			# consider power
			iOurPower = tPlayer.getPower(True)
			iTheirPower = gc.getTeam(iLoopPlayer).getPower(True)
			if iOurPower > 2 * iTheirPower:
				lTargetValues[iLoopPlayer] *= 2
			elif 2 * iOurPower < iTheirPower:
				lTargetValues[iLoopPlayer] /= 2
				
			# spare smallish civs
			if iLoopPlayer in [iNetherlands, iPortugal, iItaly]:
				lTargetValues[iLoopPlayer] *= 4
				lTargetValues[iLoopPlayer] /= 5
				
			# no suicide
			if iPlayer == iNetherlands:
				if iLoopPlayer in [iFrance, iHolyRome, iGermany]:
					lTargetValues[iLoopPlayer] /= 2
			elif iPlayer == iPortugal:
				if iLoopPlayer == iSpain:
					lTargetValues[iLoopPlayer] /= 2
			elif iPlayer == iItaly:
				if iLoopPlayer in [iFrance, iHolyRome, iGermany]:
					lTargetValues[iLoopPlayer] /= 2
					
		return utils.getHighestIndex(lTargetValues)
	def determineAttackingPlayer(self):
		lAggressionLevels = [data.players[i].iAggressionLevel for i in range(iNumPlayers)]
		iHighestEntry = utils.getHighestEntry(lAggressionLevels)
		
		return lAggressionLevels.index(iHighestEntry)
	def makeClaimAI(self, iPlayer):
		if len(self.dPossibleClaims[iPlayer]) == 0: return
		x, y, iValue = utils.getHighestEntry(self.dPossibleClaims[iPlayer], lambda x: x[2])
		self.dCityClaims[iPlayer] = (x, y, iValue)
    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 = '&#19990;&#30028;&#20891;&#20107;&#36895;&#36882;&#65306;&#20122;&#21382;&#23665;&#22823;&#19996;&#24449;&#24320;&#22987;&#20102;&#65281;&#20854;&#40638;&#19979;&#30340;&#20891;&#38431;&#27491;&#22312;&#27178;&#25195;&#27431;&#20122;&#22823;&#38470;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#20122;&#21382;&#23665;&#22823;&#19996;&#24449;&#24320;&#22987;&#20102;&#65281;')
            if iPlayer == iRome:
                tem_text = '&#19990;&#30028;&#20891;&#20107;&#36895;&#36882;&#65306;&#32599;&#39532;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#32599;&#39532;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
            if iPlayer == iMongolia:
                tem_text = '&#19990;&#30028;&#20891;&#20107;&#36895;&#36882;&#65306;&#33945;&#21476;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#25104;&#21513;&#24605;&#27735;&#30340;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#33945;&#21476;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#25104;&#21513;&#24605;&#27735;&#30340;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
            if iPlayer == iTurks:
                tem_text = '&#19990;&#30028;&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
    #百年战争
            if iPlayer == iEngland and iYear <= 1450 and iYear >= 1250:
                tem_text = '&#33521;&#27861;&#30334;&#24180;&#25112;&#20105;&#30340;&#33125;&#39118;&#34880;&#38632;&#27491;&#24335;&#25289;&#24320;&#24119;&#24149;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
    #圣女贞德
            if iPlayer == iFrance and iYear <= 1550 and iYear >= 1350:
                tem_text = '&#22307;&#22899;&#36126;&#24503;&#21796;&#36215;&#20102;&#27861;&#22269;&#20154;&#27665;&#30340;&#27665;&#26063;&#24863;&#65292;&#27861;&#22269;&#20154;&#27665;&#20026;&#20102;&#25421;&#21355;&#23478;&#22253;&#32780;&#25112;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
    #十字军
            if iPlayer == iEngland and iYear <= 1200 and iYear >= 1000:
                tem_text = '&#36720;&#21160;&#20013;&#19996;&#21644;&#27431;&#27954;&#30340;&#21313;&#23383;&#20891;&#19996;&#24449;&#24320;&#22987;&#20102;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
    #萨拉丁
            if iPlayer == iEgypt and iYear <= 1300 and iYear >= 1100:
                tem_text = '&#24180;&#36731;&#30340;&#39046;&#34966;&#33832;&#25289;&#19969;&#29575;&#39046;&#20891;&#38431;&#21521;&#21313;&#23383;&#20891;&#21457;&#36215;&#29467;&#28872;&#30340;&#36827;&#25915;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
    #拿破仑战争
            if iPlayer == iFrance and iYear <= 1900 and iYear >= 1700:
                tem_text = '&#25343;&#30772;&#20177;&#30340;&#20891;&#38431;&#27491;&#22312;&#27431;&#27954;&#25152;&#21521;&#25259;&#38753;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
            if iYear <= 1930 and iYear >= 1900:
                tem_text = '&#31532;&#19968;&#27425;&#19990;&#30028;&#22823;&#25112;&#27491;&#22312;&#36827;&#34892;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)
    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')
            if iYear <= 1960 and iYear >= 1930:
                tem_text = '&#31532;&#20108;&#27425;&#19990;&#30028;&#22823;&#25112;&#27491;&#22312;&#36827;&#34892;&#65281;'
                CyInterface().addMessage(gc.getGame().getActivePlayer(), False,
                                         iDuration, tem_text, "", 0, "",
                                         ColorTypes(iWhite), -1, -1, True,
                                         True)

    #			utils.show('&#20891;&#20107;&#36895;&#36882;&#65306;&#31361;&#21413;&#24093;&#22269;&#27491;&#22312;&#23835;&#36215;&#65292;&#20854;&#20891;&#38431;&#25152;&#21521;&#25259;&#38753;&#65281;')

#####修改结束#####
####修改开始####
        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 = '&#36838;&#22826;&#22522;&#30340;&#27721;&#23612;&#25300;&#23558;&#20891;&#32763;&#36234;&#20102;&#38463;&#23572;&#21329;&#26031;&#23665;&#65292;&#20986;&#29616;&#22312;&#31859;&#20848;&#38468;&#36817;&#65281;'
                    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 = '&#26031;&#24052;&#36798;&#20811;&#26031;&#21561;&#21709;&#20102;&#21453;&#25239;&#32599;&#39532;&#30340;&#36215;&#20041;&#21495;&#35282;&#65281;'
                    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)