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)
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)
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)
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
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 = '世界军事速递:亚历山大东征开始了!其麾下的军队正在横扫欧亚大陆!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:亚历山大东征开始了!') if iPlayer == iRome: tem_text = '世界军事速递:罗马帝国正在崛起,其军队所向披靡!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:罗马帝国正在崛起,其军队所向披靡!') if iPlayer == iMongolia: tem_text = '世界军事速递:蒙古帝国正在崛起,成吉思汗的军队所向披靡!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:蒙古帝国正在崛起,成吉思汗的军队所向披靡!') if iPlayer == iTurks: tem_text = '世界军事速递:突厥帝国正在崛起,其军队所向披靡!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #百年战争 if iPlayer == iEngland and iYear <= 1450 and iYear >= 1250: tem_text = '英法百年战争的腥风血雨正式拉开帷幕!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #圣女贞德 if iPlayer == iFrance and iYear <= 1550 and iYear >= 1350: tem_text = '圣女贞德唤起了法国人民的民族感,法国人民为了捍卫家园而战!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #十字军 if iPlayer == iEngland and iYear <= 1200 and iYear >= 1000: tem_text = '轰动中东和欧洲的十字军东征开始了!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #萨拉丁 if iPlayer == iEgypt and iYear <= 1300 and iYear >= 1100: tem_text = '年轻的领袖萨拉丁率领军队向十字军发起猛烈的进攻!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #拿破仑战争 if iPlayer == iFrance and iYear <= 1900 and iYear >= 1700: tem_text = '拿破仑的军队正在欧洲所向披靡!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') if iYear <= 1930 and iYear >= 1900: tem_text = '第一次世界大战正在进行!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') if iYear <= 1960 and iYear >= 1930: tem_text = '第二次世界大战正在进行!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) # utils.show('军事速递:突厥帝国正在崛起,其军队所向披靡!') #####修改结束##### ####修改开始#### for city in lTargetCities: iExtra = 0 + 2 # if utils.getHumanID() not in [iPlayer, city.getOwner()]: # iExtra += 1 #max(1, gc.getPlayer(iPlayer).getCurrentEra()) # # if iPlayer == iMongolia and utils.getHumanID() != iPlayer: # iExtra += 1 tPlot = utils.findNearestLandPlot((city.getX(), city.getY()), iPlayer) if (tPlot): iBestInfantry = utils.getBestInfantry(iPlayer) iBestSiege = utils.getBestSiege(iPlayer) if iPlayer == iGreece: iBestInfantry = iHoplite iBestSiege = iCatapult if iPlayer == iMongolia: iBestInfantry = iKeshik iExtra += 2 if iPlayer == iCarthage and iYear <= 150: iExtra = 0 iBestInfantry = iWarElephant tem_text = '迦太基的汉尼拔将军翻越了阿尔卑斯山,出现在米兰附近!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) if iPlayer == iBarbarian and iYear <= 150: iExtra = -1 iBestInfantry = iMilitia utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) utils.makeUnitAI(iLightSwordsman, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) tem_text = '斯巴达克斯吹响了反抗罗马的起义号角!' CyInterface().addMessage(gc.getGame().getActivePlayer(), False, iDuration, tem_text, "", 0, "", ColorTypes(iWhite), -1, -1, True, True) if iPlayer == iEngland and iYear <= 1500: iExtra -= 0 iBestInfantry = iLongbowman # utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2) # iBestSiege = iCatapult if (iPlayer == iEngland and iYear <= 1250) or ( iPlayer == iHolyRome and iYear <= 1250) or (iPlayer == iFrance and iYear <= 1250): iExtra -= 1 # iBestInfantry = iLongbowman # utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2) # iBestSiege = iCatapult if iPlayer == iTurks and iYear <= 1250: iExtra -= 2 if iYear >= 1800: iExtra += 1 if iYear >= 1900: iExtra += 1 if iYear >= 1930: iExtra += 1 if iPreferredTarget == utils.getHumanID() and iYear >= 1300: iExtra = gc.getGame().getHandicapType() + 1 utils.makeUnitAI(iBestInfantry, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, max(2 + iExtra, 1)) utils.makeUnitAI(iBestSiege, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, max(1 + iExtra, 1)) ####修改结束##### if iPlayer == iGreece: utils.makeUnitAI(iCompanion, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) if iPlayer == iTamils: utils.makeUnitAI(iWarElephant, iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 1) if iPlayer == iSpain: utils.makeUnitAI(utils.getBestCavalry(iPlayer), iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2 * iExtra) if iPlayer == iTurks: utils.makeUnitAI(utils.getBestCavalry(iPlayer), iPlayer, tPlot, UnitAITypes.UNITAI_ATTACK_CITY, 2 + iExtra)