# Sid Meier's Civilization 4 # Copyright Firaxis Games 2005 # # CvRandomEventInterface.py # # These functions are App Entry Points from C++ # WARNING: These function names should not be changed # WARNING: These functions can not be placed into a class # # No other modules should import this # import CvUtil from CvPythonExtensions import * from EventSigns import placeLandmark # K-Mod from operator import itemgetter # K-Mod (used to avoid OOS when sorting) gc = CyGlobalContext() localText = CyTranslator() # advc.137: All event preconditions that use DefaultPlayers in BtS are going to use this function instead. Using default player counts was a bad idea to begin with, and now that I've increased the default player count on Deity, it's totally out of whack. def worldSizeTarget(): # 5 adjusted by building class prereq modifier, rounded to nearest. return ((5 * (100 + gc.getWorldInfo(gc.getMap().getWorldSize()).getBuildingClassPrereqModifier())) + 50) // 100 ######## BLESSED SEA ########### def getHelpBlessedSea1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] map = gc.getMap() # iOurMinLandmass = (3 * gc.getWorldInfo(map.getWorldSize()).getDefaultPlayers()) / 2 iOurMinLandmass = gc.getWorldInfo(map.getWorldSize()).getTargetNumCities() # K-Mod szHelp = localText.getText("TXT_KEY_EVENT_BLESSED_SEA_HELP", (iOurMinLandmass, )) return szHelp def canTriggerBlessedSea(argsList): kTriggeredData = argsList[0] map = gc.getMap() if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false # iMapMinLandmass = 2 * gc.getWorldInfo(map.getWorldSize()).getDefaultPlayers() # iOurMaxLandmass = gc.getWorldInfo(map.getWorldSize()).getDefaultPlayers() / 2 # K-Mod iMapMinLandmass = 4 * gc.getWorldInfo(map.getWorldSize()).getTargetNumCities() / 3 iOurMaxLandmass = 2 * gc.getWorldInfo(map.getWorldSize()).getTargetNumCities() / 3 # K-Mod end if (map.getNumLandAreas() < iMapMinLandmass): return false iOurLandmasses = 0 for i in range(map.getIndexAfterLastArea()): area = map.getArea(i) if not area.isNone() and not area.isWater() and area.getCitiesPerPlayer(kTriggeredData.ePlayer) > 0: iOurLandmasses += 1 if (iOurLandmasses > iOurMaxLandmass): return false player = gc.getPlayer(kTriggeredData.ePlayer) if player.getUnitClassCount(CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_GALLEY')) == 0: if player.getUnitClassCount(CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_CARAVEL')) == 0: if player.getUnitClassCount(CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_GALLEON')) == 0: return false return true def canTriggerBlessedSea2(argsList): kTriggeredData = argsList[0] map = gc.getMap() # iOurMinLandmass = (3 * gc.getWorldInfo(map.getWorldSize()).getDefaultPlayers()) / 2 iOurMinLandmass = gc.getWorldInfo(map.getWorldSize()).getTargetNumCities() # K-Mod iOurLandmasses = 0 for i in range(map.getIndexAfterLastArea()): area = map.getArea(i) if not area.isNone() and not area.isWater() and area.getCitiesPerPlayer(kTriggeredData.ePlayer) > 0: iOurLandmasses += 1 if (iOurLandmasses < iOurMinLandmass): return false return true def applyBlessedSea2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iBuilding = -1 if (-1 != kTriggeredData.eReligion): for i in range(gc.getNumBuildingInfos()): if (gc.getBuildingInfo(i).getSpecialBuildingType() == CvUtil.findInfoTypeNum(gc.getSpecialBuildingInfo,gc.getNumSpecialBuildingInfos(),'SPECIALBUILDING_TEMPLE')): if (gc.getBuildingInfo(i).getReligionType() == kTriggeredData.eReligion): iBuilding = i break if (iBuilding == -1): return player = gc.getPlayer(kTriggeredData.ePlayer) (loopCity, iter) = player.firstCity(false) while(loopCity): if (loopCity.getPopulation() >= 5): if (loopCity.canConstruct(iBuilding, false, false, true)): loopCity.setNumRealBuilding(iBuilding, 1) (loopCity, iter) = player.nextCity(iter, false) def canApplyBlessedSea2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iBuilding = -1 if (-1 != kTriggeredData.eReligion): for i in range(gc.getNumBuildingInfos()): if (gc.getBuildingInfo(i).getSpecialBuildingType() == CvUtil.findInfoTypeNum(gc.getSpecialBuildingInfo,gc.getNumSpecialBuildingInfos(),'SPECIALBUILDING_TEMPLE')): if (gc.getBuildingInfo(i).getReligionType() == kTriggeredData.eReligion): iBuilding = i break if (iBuilding == -1): return false player = gc.getPlayer(kTriggeredData.ePlayer) (loopCity, iter) = player.firstCity(false) bFound = false while(loopCity): if (loopCity.getPopulation() >= 5): if (loopCity.canConstruct(iBuilding, false, false, true)): bFound = true break (loopCity, iter) = player.nextCity(iter, false) return bFound ######## HOLY MOUNTAIN ########### def getHelpHolyMountain1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] map = gc.getMap() iMinPoints = 2 * worldSizeTarget() iBuilding = -1 iReligion = gc.getPlayer(kTriggeredData.ePlayer).getStateReligion() if (-1 != iReligion): for i in range(gc.getNumBuildingInfos()): if (gc.getBuildingInfo(i).getSpecialBuildingType() == CvUtil.findInfoTypeNum(gc.getSpecialBuildingInfo, gc.getNumSpecialBuildingInfos(), 'SPECIALBUILDING_CATHEDRAL')): if (gc.getBuildingInfo(i).getReligionType() == iReligion): iBuilding = i break szHelp = localText.getText("TXT_KEY_EVENT_HOLY_MOUNTAIN_HELP", ( gc.getBuildingInfo(iBuilding).getTextKey(), gc.getBuildingInfo(iBuilding).getTextKey(), iMinPoints)) return szHelp def canTriggerHolyMountain(argsList): kTriggeredData = argsList[0] map = gc.getMap() if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if (plot.getOwner() == -1): return true return false def expireHolyMountain1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if (plot == None): return true if (plot.getOwner() != kTriggeredData.ePlayer and plot.getOwner() != -1): return true return false def canTriggerHolyMountainDone(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) if (kOrigTriggeredData == None): return false plot = gc.getMap().plot(kOrigTriggeredData.iPlotX, kOrigTriggeredData.iPlotY) if (plot == None): return false if (plot.getOwner() != kTriggeredData.ePlayer): return false return true def canTriggerHolyMountainRevealed(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) if (kOrigTriggeredData == None): return false iNumPoints = 0 for i in range(gc.getNumBuildingInfos()): if (gc.getBuildingInfo(i).getReligionType() == kOrigTriggeredData.eReligion): if (gc.getBuildingInfo(i).getSpecialBuildingType() == CvUtil.findInfoTypeNum(gc.getSpecialBuildingInfo,gc.getNumSpecialBuildingInfos(),'SPECIALBUILDING_CATHEDRAL')): iNumPoints += 4 * player.countNumBuildings(i) elif (gc.getBuildingInfo(i).getSpecialBuildingType() == CvUtil.findInfoTypeNum(gc.getSpecialBuildingInfo,gc.getNumSpecialBuildingInfos(),'SPECIALBUILDING_TEMPLE')): iNumPoints += player.countNumBuildings(i) elif (gc.getBuildingInfo(i).getSpecialBuildingType() == CvUtil.findInfoTypeNum(gc.getSpecialBuildingInfo,gc.getNumSpecialBuildingInfos(),'SPECIALBUILDING_MONASTERY')): iNumPoints += player.countNumBuildings(i) if iNumPoints < 2 * worldSizeTarget(): return false plot = gc.getMap().plot(kOrigTriggeredData.iPlotX, kOrigTriggeredData.iPlotY) if (plot == None): return false plot.setRevealed(player.getTeam(), true, true, -1) kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iPlotX = kOrigTriggeredData.iPlotX kActualTriggeredDataObject.iPlotY = kOrigTriggeredData.iPlotY return true def doHolyMountainRevealed(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] if (kTriggeredData.ePlayer == gc.getGame().getActivePlayer()): CyCamera().JustLookAtPlot( CyMap().plot( kTriggeredData.iPlotX, kTriggeredData.iPlotY ) ) return 1 ######## MARATHON ########### def canTriggerMarathon(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) team = gc.getTeam(player.getTeam()) if (team.AI_getAtWarCounter(otherPlayer.getTeam()) == 1): (loopUnit, iter) = otherPlayer.firstUnit(false) while( loopUnit ): plot = loopUnit.plot() if (not plot.isNone()): if (plot.getOwner() == kTriggeredData.ePlayer): return true (loopUnit, iter) = otherPlayer.nextUnit(iter, false) return false ######## WEDDING FEUD ########### def doWeddingFeud2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) (loopCity, iter) = player.firstCity(false) while(loopCity): if loopCity.isHasReligion(kTriggeredData.eReligion): loopCity.changeHappinessTimer(30) (loopCity, iter) = player.nextCity(iter, false) return 1 def getHelpWeddingFeud2(argsList): iEvent = argsList[0] event = gc.getEventInfo(iEvent) kTriggeredData = argsList[1] religion = gc.getReligionInfo(kTriggeredData.eReligion) szHelp = localText.getText("TXT_KEY_EVENT_WEDDING_FEUD_2_HELP", (gc.getDefineINT("TEMP_HAPPY"), 30, religion.getChar())) return szHelp def canDoWeddingFeud3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) if player.getGold() - 10 * player.getNumCities() < 0: return false return true def doWeddingFeud3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] destPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) player = gc.getPlayer(kTriggeredData.ePlayer) for iLoopPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iLoopPlayer) if loopPlayer.isAlive() and loopPlayer.getStateReligion() == player.getStateReligion(): loopPlayer.AI_changeAttitudeExtra(kTriggeredData.ePlayer, 1) player.AI_changeAttitudeExtra(iLoopPlayer, 1) if gc.getTeam(destPlayer.getTeam()).canDeclareWar(player.getTeam()): if destPlayer.isHuman(): # this works only because it's a single-player only event popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON) popupInfo.setText(localText.getText("TXT_KEY_EVENT_WEDDING_FEUD_OTHER_3", (gc.getReligionInfo(kTriggeredData.eReligion).getAdjectiveKey(), player.getCivilizationShortDescriptionKey()))) popupInfo.setData1(kTriggeredData.eOtherPlayer) popupInfo.setData2(kTriggeredData.ePlayer) popupInfo.setPythonModule("CvRandomEventInterface") popupInfo.setOnClickedPythonCallback("weddingFeud3Callback") popupInfo.addPythonButton(localText.getText("TXT_KEY_POPUP_YES", ()), "") popupInfo.addPythonButton(localText.getText("TXT_KEY_POPUP_NO", ()), "") popupInfo.addPopup(kTriggeredData.eOtherPlayer) else: # advc.106g: Let the DLL know that this is through an event gc.getTeam(destPlayer.getTeam()).declareWarEvent(player.getTeam(), false, WarPlanTypes.WARPLAN_LIMITED) return 1 def weddingFeud3Callback(argsList): iButton = argsList[0] iData1 = argsList[1] iData2 = argsList[2] iData3 = argsList[3] szText = argsList[4] bOption1 = argsList[5] bOption2 = argsList[6] if iButton == 0: destPlayer = gc.getPlayer(iData1) player = gc.getPlayer(iData2) # advc.106g: Let the DLL know that this is through an event gc.getTeam(destPlayer.getTeam()).declareWarEvent(player.getTeam(), false, WarPlanTypes.WARPLAN_LIMITED) return 0 def getHelpWeddingFeud3(argsList): iEvent = argsList[0] event = gc.getEventInfo(iEvent) kTriggeredData = argsList[1] religion = gc.getReligionInfo(kTriggeredData.eReligion) szHelp = localText.getText("TXT_KEY_EVENT_WEDDING_FEUD_3_HELP", (1, religion.getChar())) return szHelp ######## SPICY ########### def canTriggerSpicy(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iSpice = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_SPICES') iHappyBonuses = 0 bSpices = false for i in range(gc.getNumBonusInfos()): bonus = gc.getBonusInfo(i) iNum = player.getNumAvailableBonuses(i) if iNum > 0 : if bonus.getHappiness() > 0: iHappyBonuses += 1 if iHappyBonuses > 4: return false if i == iSpice: return false plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.canHaveBonus(iSpice, false): return false return true def doSpicy2(argsList): # need this because plantations are notmally not allowed unless there are already spices iEvent = argsList[0] kTriggeredData = argsList[1] plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.isNone(): plot.setImprovementType(CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_PLANTATION')) return 1 def getHelpSpicy2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iPlantation = CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_PLANTATION') szHelp = localText.getText("TXT_KEY_EVENT_IMPROVEMENT_GROWTH", ( gc.getImprovementInfo(iPlantation).getTextKey(), )) return szHelp ######## BABY BOOM ########### def canTriggerBabyBoom(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) team = gc.getTeam(player.getTeam()) if team.getAtWarCount(true) > 0: return false for iLoopTeam in range(gc.getMAX_CIV_TEAMS()): if iLoopTeam != player.getTeam(): if team.AI_getAtPeaceCounter(iLoopTeam) == 1: return true return false ######## BARD TALE ########### def applyBardTale3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) player.changeGold(-10 * player.getNumCities()) def canApplyBardTale3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) if player.getGold() - 10 * player.getNumCities() < 0: return false return true def getHelpBardTale3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) szHelp = localText.getText("TXT_KEY_EVENT_GOLD_LOST", (10 * player.getNumCities(), )) return szHelp ######## LOOTERS ########### def getHelpLooters3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) city = otherPlayer.getCity(kTriggeredData.iOtherPlayerCityId) szHelp = localText.getText("TXT_KEY_EVENT_LOOTERS_3_HELP", (1, 2, city.getNameKey())) return szHelp def canApplyLooters3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) city = otherPlayer.getCity(kTriggeredData.iOtherPlayerCityId) iNumBuildings = 0 for iBuilding in range(gc.getNumBuildingInfos()): if (city.getNumRealBuilding(iBuilding) > 0 and gc.getBuildingInfo(iBuilding).getProductionCost() <= 100 and gc.getBuildingInfo(iBuilding).getProductionCost() > 0 and not isLimitedWonderClass(gc.getBuildingInfo(iBuilding).getBuildingClassType())): iNumBuildings += 1 return (iNumBuildings > 0) def applyLooters3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) city = otherPlayer.getCity(kTriggeredData.iOtherPlayerCityId) iNumBuildings = gc.getGame().getSorenRandNum(2, "Looters event number of buildings destroyed") iNumBuildingsDestroyed = 0 listBuildings = [] for iBuilding in range(gc.getNumBuildingInfos()): if (city.getNumRealBuilding(iBuilding) > 0 and gc.getBuildingInfo(iBuilding).getProductionCost() <= 100 and gc.getBuildingInfo(iBuilding).getProductionCost() > 0 and not isLimitedWonderClass(gc.getBuildingInfo(iBuilding).getBuildingClassType())): listBuildings.append(iBuilding) for i in range(iNumBuildings+1): if len(listBuildings) > 0: iBuilding = listBuildings[gc.getGame().getSorenRandNum(len(listBuildings), "Looters event building destroyed")] szBuffer = localText.getText("TXT_KEY_EVENT_CITY_IMPROVEMENT_DESTROYED", (gc.getBuildingInfo(iBuilding).getTextKey(), )) CyInterface().addMessage(kTriggeredData.eOtherPlayer, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", InterfaceMessageTypes.MESSAGE_TYPE_INFO, gc.getBuildingInfo(iBuilding).getButton(), gc.getInfoTypeForString("COLOR_RED"), city.getX(), city.getY(), true, true) city.setNumRealBuilding(iBuilding, 0) iNumBuildingsDestroyed += 1 listBuildings.remove(iBuilding) if iNumBuildingsDestroyed > 0: szBuffer = localText.getText("TXT_KEY_EVENT_NUM_BUILDINGS_DESTROYED", (iNumBuildingsDestroyed, gc.getPlayer(kTriggeredData.eOtherPlayer).getCivilizationAdjectiveKey(), city.getNameKey())) CyInterface().addMessage(kTriggeredData.ePlayer, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", InterfaceMessageTypes.MESSAGE_TYPE_INFO, None, gc.getInfoTypeForString("COLOR_WHITE"), -1, -1, true, true) ######## BROTHERS IN NEED ########### def canTriggerBrothersInNeed(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) if not player.canTradeNetworkWith(kTriggeredData.eOtherPlayer): return false listResources = [] listResources.append(CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_COPPER')) listResources.append(CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_IRON')) listResources.append(CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_HORSE')) listResources.append(CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_IVORY')) listResources.append(CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_OIL')) listResources.append(CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_URANIUM')) bFound = false for iResource in listResources: if (player.getNumTradeableBonuses(iResource) > 1 and otherPlayer.getNumAvailableBonuses(iResource) <= 0): bFound = true break if not bFound: return false for iTeam in range(gc.getMAX_CIV_TEAMS()): if iTeam != player.getTeam() and iTeam != otherPlayer.getTeam() and gc.getTeam(iTeam).isAlive(): if gc.getTeam(iTeam).isAtWar(otherPlayer.getTeam()) and not gc.getTeam(iTeam).isAtWar(player.getTeam()): return true return false def canDoBrothersInNeed1(argsList): kTriggeredData = argsList[1] newArgs = (kTriggeredData, ) return canTriggerBrothersInNeed(newArgs) ######## HURRICANE ########### def canTriggerHurricaneCity(argsList): eTrigger = argsList[0] ePlayer = argsList[1] iCity = argsList[2] player = gc.getPlayer(ePlayer) city = player.getCity(iCity) if city.isNone(): return false if not city.isCoastal(gc.getMIN_WATER_SIZE_FOR_OCEAN()): return false if city.plot().getLatitude() <= 0: return false if city.getPopulation() < 2: return false return true def canApplyHurricane1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) listBuildings = [] for iBuilding in range(gc.getNumBuildingInfos()): if (city.getNumRealBuilding(iBuilding) > 0 and gc.getBuildingInfo(iBuilding).getProductionCost() > 0 and not isLimitedWonderClass(gc.getBuildingInfo(iBuilding).getBuildingClassType())): listBuildings.append(iBuilding) return (len(listBuildings) > 0) def canApplyHurricane2(argsList): return (not canApplyHurricane1(argsList)) def applyHurricane1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) listCheapBuildings = [] listExpensiveBuildings = [] for iBuilding in range(gc.getNumBuildingInfos()): if (city.getNumRealBuilding(iBuilding) > 0 and gc.getBuildingInfo(iBuilding).getProductionCost() <= 100 and gc.getBuildingInfo(iBuilding).getProductionCost() > 0 and not isLimitedWonderClass(gc.getBuildingInfo(iBuilding).getBuildingClassType())): listCheapBuildings.append(iBuilding) if (city.getNumRealBuilding(iBuilding) > 0 and gc.getBuildingInfo(iBuilding).getProductionCost() > 100 and gc.getBuildingInfo(iBuilding).getProductionCost() > 0 and not isLimitedWonderClass(gc.getBuildingInfo(iBuilding).getBuildingClassType())): listExpensiveBuildings.append(iBuilding) if len(listCheapBuildings) > 0: iBuilding = listCheapBuildings[gc.getGame().getSorenRandNum(len(listCheapBuildings), "Hurricane event cheap building destroyed")] szBuffer = localText.getText("TXT_KEY_EVENT_CITY_IMPROVEMENT_DESTROYED", (gc.getBuildingInfo(iBuilding).getTextKey(), )) CyInterface().addMessage(kTriggeredData.ePlayer, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", InterfaceMessageTypes.MESSAGE_TYPE_INFO, gc.getBuildingInfo(iBuilding).getButton(), gc.getInfoTypeForString("COLOR_RED"), city.getX(), city.getY(), true, true) city.setNumRealBuilding(iBuilding, 0) if len(listExpensiveBuildings) > 0: iBuilding = listExpensiveBuildings[gc.getGame().getSorenRandNum(len(listExpensiveBuildings), "Hurricane event expensive building destroyed")] szBuffer = localText.getText("TXT_KEY_EVENT_CITY_IMPROVEMENT_DESTROYED", (gc.getBuildingInfo(iBuilding).getTextKey(), )) CyInterface().addMessage(kTriggeredData.ePlayer, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", InterfaceMessageTypes.MESSAGE_TYPE_INFO, gc.getBuildingInfo(iBuilding).getButton(), gc.getInfoTypeForString("COLOR_RED"), city.getX(), city.getY(), true, true) city.setNumRealBuilding(iBuilding, 0) ######## CYCLONE ########### def canTriggerCycloneCity(argsList): eTrigger = argsList[0] ePlayer = argsList[1] iCity = argsList[2] player = gc.getPlayer(ePlayer) city = player.getCity(iCity) if city.isNone(): return false if not city.isCoastal(gc.getMIN_WATER_SIZE_FOR_OCEAN()): return false if city.plot().getLatitude() >= 0: return false return true ######## TSUNAMI ########### def canTriggerTsunamiCity(argsList): eTrigger = argsList[0] ePlayer = argsList[1] iCity = argsList[2] player = gc.getPlayer(ePlayer) city = player.getCity(iCity) if city.isNone(): return false if not city.isCoastal(gc.getMIN_WATER_SIZE_FOR_OCEAN()): return false return true def canApplyTsunami1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) return (city.getPopulation() < 6) def canApplyTsunami2(argsList): return (not canApplyTsunami1(argsList)) def applyTsunami1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) city.kill() def applyTsunami2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) listBuildings = [] for iBuilding in range(gc.getNumBuildingInfos()): if (city.getNumRealBuilding(iBuilding) > 0 and gc.getBuildingInfo(iBuilding).getProductionCost() > 0 and not isLimitedWonderClass(gc.getBuildingInfo(iBuilding).getBuildingClassType())): listBuildings.append(iBuilding) for i in range(5): if len(listBuildings) > 0: iBuilding = listBuildings[gc.getGame().getSorenRandNum(len(listBuildings), "Tsunami event building destroyed")] szBuffer = localText.getText("TXT_KEY_EVENT_CITY_IMPROVEMENT_DESTROYED", (gc.getBuildingInfo(iBuilding).getTextKey(), )) CyInterface().addMessage(kTriggeredData.ePlayer, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", InterfaceMessageTypes.MESSAGE_TYPE_INFO, gc.getBuildingInfo(iBuilding).getButton(), gc.getInfoTypeForString("COLOR_RED"), city.getX(), city.getY(), true, true) city.setNumRealBuilding(iBuilding, 0) listBuildings.remove(iBuilding) def getHelpTsunami2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) szHelp = localText.getText("TXT_KEY_EVENT_TSUNAMI_2_HELP", (5, city.getNameKey())) return szHelp ######## MONSOON ########### def canTriggerMonsoonCity(argsList): eTrigger = argsList[0] ePlayer = argsList[1] iCity = argsList[2] player = gc.getPlayer(ePlayer) city = player.getCity(iCity) if city.isNone(): return false if city.isCoastal(gc.getMIN_WATER_SIZE_FOR_OCEAN()): return false iJungleType = CvUtil.findInfoTypeNum(gc.getFeatureInfo, gc.getNumFeatureInfos(),'FEATURE_JUNGLE') for iDX in range(-3, 4): for iDY in range(-3, 4): pLoopPlot = plotXY(city.getX(), city.getY(), iDX, iDY) if not pLoopPlot.isNone() and pLoopPlot.getFeatureType() == iJungleType: return true return false ######## VOLCANO ########### def getHelpVolcano1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_VOLCANO_1_HELP", ()) return szHelp def canApplyVolcano1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumImprovements = 0 for iDX in range(-1, 2): for iDY in range(-1, 2): loopPlot = plotXY(kTriggeredData.iPlotX, kTriggeredData.iPlotY, iDX, iDY) if not loopPlot.isNone(): if (iDX != 0 or iDY != 0): if loopPlot.getImprovementType() != -1: iNumImprovements += 1 return (iNumImprovements > 0) def applyVolcano1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] listPlots = [] for iDX in range(-1, 2): for iDY in range(-1, 2): loopPlot = plotXY(kTriggeredData.iPlotX, kTriggeredData.iPlotY, iDX, iDY) if not loopPlot.isNone(): if (iDX != 0 or iDY != 0): if loopPlot.getImprovementType() != -1: listPlots.append(loopPlot) listRuins = [] ## K-Mod: I don't think cottages and hamlets are big enough to leave "city ruins" #listRuins.append(CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_COTTAGE')) #listRuins.append(CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_HAMLET')) listRuins.append(CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_VILLAGE')) listRuins.append(CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_TOWN')) iRuins = CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_CITY_RUINS') for i in range(3): if len(listPlots) > 0: plot = listPlots[gc.getGame().getSorenRandNum(len(listPlots), "Volcano event improvement destroyed")] iImprovement = plot.getImprovementType() szBuffer = localText.getText("TXT_KEY_EVENT_CITY_IMPROVEMENT_DESTROYED", (gc.getImprovementInfo(iImprovement).getTextKey(), )) #CyInterface().addMessage(kTriggeredData.ePlayer, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", InterfaceMessageTypes.MESSAGE_TYPE_INFO, gc.getImprovementInfo(iImprovement).getButton(), gc.getInfoTypeForString("COLOR_RED"), plot.getX(), plot.getY(), true, true) # K-Mod if plot.getOwner() != PlayerTypes.NO_PLAYER: plot_owner = plot.getOwner() else: plot_owner = kTriggeredData.ePlayer if (gc.getPlayer(plot_owner).isHuman()): CyInterface().addMessage(plot_owner, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_BOMBARDED", InterfaceMessageTypes.MESSAGE_TYPE_INFO, gc.getImprovementInfo(iImprovement).getButton(), gc.getInfoTypeForString("COLOR_RED"), plot.getX(), plot.getY(), true, true) # K-Mod end if iImprovement in listRuins: plot.setImprovementType(iRuins) else: plot.setImprovementType(-1) listPlots.remove(plot) if i == 1 and gc.getGame().getSorenRandNum(100, "Volcano event num improvements destroyed") < 50: break ## # K-Mod, karadoc, 26/Jun/2011 # Volcanic ash improves some tiles ## sEventType = gc.getEventInfo(iEvent).getType(); # Event name string listPlots = [] for iDX in range(-1, 2): for iDY in range(-1, 2): loopPlot = plotXY(kTriggeredData.iPlotX, kTriggeredData.iPlotY, iDX, iDY) if not loopPlot.isNone() and not loopPlot.isWater(): if (iDX != 0 or iDY != 0): if gc.getGame().getPlotExtraYield(loopPlot.getX(), loopPlot.getY(), YieldTypes.YIELD_FOOD) == 0: listPlots.append(loopPlot) # zero - 50%, one - 25%, two - 25% iCount = gc.getGame().getSorenRandNum(4, "Volcanic ash fertility bonus") - 1 for i in range(iCount): if len(listPlots) <= 0: break plot = listPlots[gc.getGame().getSorenRandNum(len(listPlots), "Volcano event increased yield")] gc.getGame().setPlotExtraYield(plot.getX(), plot.getY(), YieldTypes.YIELD_FOOD, 1) placeLandmark(plot, sEventType, 1, 0, 0, True, -1) # event sign if plot.getOwner() != PlayerTypes.NO_PLAYER: plot_owner = plot.getOwner() else: plot_owner = kTriggeredData.ePlayer if (gc.getPlayer(plot_owner).isHuman()): CyInterface().addMessage(plot_owner, false, gc.getEVENT_MESSAGE_TIME(), localText.getText("TXT_KEY_EVENT_VOLCANO_FERTILITY", ()), "", InterfaceMessageTypes.MESSAGE_TYPE_INFO, None, gc.getInfoTypeForString("COLOR_WHITE"), plot.getX(), plot.getY(), true, true) listPlots.remove(plot) # K-Mod end ######## DUSTBOWL ########### def canTriggerDustbowlCont(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) if (kOrigTriggeredData == None): return false iFarmType = CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_FARM') iPlainsType = CvUtil.findInfoTypeNum(gc.getTerrainInfo,gc.getNumTerrainInfos(),'TERRAIN_PLAINS') map = gc.getMap() iBestValue = map.getGridWidth() + map.getGridHeight() bestPlot = None for i in range(map.numPlots()): plot = map.plotByIndex(i) if (plot.getOwner() == kTriggeredData.ePlayer and plot.getImprovementType() == iFarmType and plot.getTerrainType() == iPlainsType): iValue = plotDistance(kOrigTriggeredData.iPlotX, kOrigTriggeredData.iPlotY, plot.getX(), plot.getY()) if iValue < iBestValue: iBestValue = iValue bestPlot = plot if bestPlot != None: kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iPlotX = bestPlot.getX() kActualTriggeredDataObject.iPlotY = bestPlot.getY() else: player.resetEventOccured(trigger.getPrereqEvent(0)) return false return true def getHelpDustBowl2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_DUSTBOWL_2_HELP", ()) return szHelp ######## SALTPETER ########### def getSaltpeterNumExtraPlots(): map = gc.getMap() if map.getWorldSize() <= 1: return 1 elif map.getWorldSize() <= 3: return 2 elif map.getWorldSize() <= 4: return 3 else: return 4 def getHelpSaltpeter(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_SALTPETER_HELP", (getSaltpeterNumExtraPlots(), )) return szHelp def canApplySaltpeter(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] map = gc.getMap() player = gc.getPlayer(kTriggeredData.ePlayer) plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if (plot == None): return false iForest = CvUtil.findInfoTypeNum(gc.getFeatureInfo,gc.getNumFeatureInfos(),'FEATURE_FOREST') iNumPlots = 0 for i in range(map.numPlots()): loopPlot = map.plotByIndex(i) if (loopPlot.getOwner() == kTriggeredData.ePlayer and loopPlot.getFeatureType() == iForest and loopPlot.isHills()): iDistance = plotDistance(kTriggeredData.iPlotX, kTriggeredData.iPlotY, loopPlot.getX(), loopPlot.getY()) if iDistance > 0: iNumPlots += 1 return (iNumPlots >= getSaltpeterNumExtraPlots()) # K-Mod. EventSigns originally overwrote applySaltpeter with an equivalent function in EventSigns.py. # I think it makes much more sense to just apply the changes here directly - so that's what I've done. def applySaltpeter(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] # EventSigns start -- setup event = gc.getEventInfo(iEvent) iFood = event.getPlotExtraYield(YieldTypes.YIELD_FOOD) iProd = event.getPlotExtraYield(YieldTypes.YIELD_PRODUCTION) iComm = event.getPlotExtraYield(YieldTypes.YIELD_COMMERCE) sEventType = event.getType() # EventSigns end map = gc.getMap() player = gc.getPlayer(kTriggeredData.ePlayer) plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if (plot == None): return # EventSigns start -- Add landmark for initial plot, if there is still a yield change placeLandmark(plot, sEventType, iFood, iProd, iComm, True, -1) # EventSigns end iForest = gc.getInfoTypeForString('FEATURE_FOREST') listPlots = [] for i in range(map.numPlots()): loopPlot = map.plotByIndex(i) if (loopPlot.getOwner() == kTriggeredData.ePlayer and loopPlot.getFeatureType() == iForest and loopPlot.isHills()): iDistance = plotDistance(kTriggeredData.iPlotX, kTriggeredData.iPlotY, loopPlot.getX(), loopPlot.getY()) if iDistance > 0: listPlots.append((iDistance, loopPlot)) #listPlots.sort() listPlots.sort(key=itemgetter(0)) # K-Mod. Sorting by pointers can cause OOS. iCount = getSaltpeterNumExtraPlots() for loopPlot in listPlots: if iCount == 0: break iCount -= 1 gc.getGame().setPlotExtraYield(loopPlot[1].getX(), loopPlot[1].getY(), YieldTypes.YIELD_COMMERCE, 1) CyInterface().addMessage(kTriggeredData.ePlayer, false, gc.getEVENT_MESSAGE_TIME(), localText.getText("TXT_KEY_EVENT_SALTPETER_DISCOVERED", ()), "", InterfaceMessageTypes.MESSAGE_TYPE_INFO, None, gc.getInfoTypeForString("COLOR_WHITE"), loopPlot[1].getX(), loopPlot[1].getY(), true, true) # EventSigns start -- Add landmark for other plots, if there is still a yield change placeLandmark(loopPlot[1], sEventType, 0, 0, 1, True, -1) # K-Mod. (originally it used iFood, iProd, iComm -- and that's not correct.) # EventSigns end ######## GREAT DEPRESSION ########### def applyGreatDepression(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) corporation = gc.getCorporationInfo(kTriggeredData.eCorporation) for iPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iPlayer) if loopPlayer.isAlive(): loopPlayer.changeGold(-loopPlayer.getGold()/4) if iPlayer != kTriggeredData.ePlayer: szText = localText.getText("TXT_KEY_EVENTTRIGGER_GREAT_DEPRESSION", (player.getCivilizationAdjectiveKey(), u"", u"", u"", u"", corporation.getTextKey())) szText += u"\n\n" + localText.getText("TXT_KEY_EVENT_GREAT_DEPRESSION_HELP", (25, )) popupInfo = CyPopupInfo() popupInfo.setText(szText) popupInfo.addPopup(iPlayer) def getHelpGreatDepression(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_GREAT_DEPRESSION_HELP", (25, )) return szHelp ######## CHAMPION ########### def canTriggerChampion(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) team = gc.getTeam(player.getTeam()) if team.getAtWarCount(true) > 0: return false return true def canTriggerChampionUnit(argsList): eTrigger = argsList[0] ePlayer = argsList[1] iUnit = argsList[2] player = gc.getPlayer(ePlayer) unit = player.getUnit(iUnit) if unit.isNone(): return false if unit.getDamage() > 0: return false if unit.getExperience() < 3: return false iLeadership = CvUtil.findInfoTypeNum(gc.getPromotionInfo,gc.getNumPromotionInfos(),'PROMOTION_LEADERSHIP') if unit.isHasPromotion(iLeadership): return false return true def applyChampion(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) unit = player.getUnit(kTriggeredData.iUnitId) iLeadership = CvUtil.findInfoTypeNum(gc.getPromotionInfo,gc.getNumPromotionInfos(),'PROMOTION_LEADERSHIP') unit.setHasPromotion(iLeadership, true) def getHelpChampion(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) unit = player.getUnit(kTriggeredData.iUnitId) iLeadership = CvUtil.findInfoTypeNum(gc.getPromotionInfo,gc.getNumPromotionInfos(),'PROMOTION_LEADERSHIP') szHelp = localText.getText("TXT_KEY_EVENT_CHAMPION_HELP", (unit.getNameKey(), gc.getPromotionInfo(iLeadership).getTextKey())) return szHelp ######## ELECTRIC COMPANY ########### def canTriggerElectricCompany(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) (loopCity, iter) = player.firstCity(false) while(loopCity): if (loopCity.angryPopulation(0) > 0): return false (loopCity, iter) = player.nextCity(iter, false) return true ######## GOLD RUSH ########### def canTriggerGoldRush(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iIndustrial = CvUtil.findInfoTypeNum(gc.getEraInfo,gc.getNumEraInfos(),'ERA_INDUSTRIAL') if player.getCurrentEra() != iIndustrial: return false return true ######## INFLUENZA ########### def canTriggerInfluenza(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) team = gc.getTeam(player.getTeam()) iIndustrial = CvUtil.findInfoTypeNum(gc.getEraInfo,gc.getNumEraInfos(),'ERA_INDUSTRIAL') if player.getCurrentEra() <= iIndustrial: return false iMedicine = CvUtil.findInfoTypeNum(gc.getTechInfo,gc.getNumTechInfos(),'TECH_MEDICINE') if team.isHasTech(iMedicine): return false return true def applyInfluenza2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) eventCity = player.getCity(kTriggeredData.iCityId) iNumCities = 2 + gc.getGame().getSorenRandNum(3, "Influenza event number of cities") listCities = [] (loopCity, iter) = player.firstCity(false) while(loopCity): if loopCity.getPopulation() > 2: iDistance = plotDistance(eventCity.getX(), eventCity.getY(), loopCity.getX(), loopCity.getY()) if iDistance > 0: listCities.append((iDistance, loopCity)) (loopCity, iter) = player.nextCity(iter, false) #listCities.sort() listCities.sort(key=itemgetter(0)) # K-Mod. Sorting by pointers can cause OOS. if iNumCities > len(listCities): iNumCities = len(listCities) for i in range(iNumCities): (iDist, loopCity) = listCities[i] loopCity.changePopulation(-2) szBuffer = localText.getText("TXT_KEY_EVENT_INFLUENZA_HIT_CITY", (loopCity.getNameKey(), )) CyInterface().addMessage(kTriggeredData.ePlayer, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_PILLAGE", InterfaceMessageTypes.MESSAGE_TYPE_INFO, None, gc.getInfoTypeForString("COLOR_RED"), loopCity.getX(), loopCity.getY(), true, true) def getHelpInfluenza2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_INFLUENZA_HELP_2", (2, )) return szHelp ######## SOLO FLIGHT ########### def canTriggerSoloFlight(argsList): kTriggeredData = argsList[0] map = gc.getMap() if map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_DUEL'): iMinLandmass = 3 elif map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_TINY'): iMinLandmass = 4 elif map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_SMALL'): iMinLandmass = 6 elif map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_STANDARD'): iMinLandmass = 8 elif map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_LARGE'): iMinLandmass = 10 else: iMinLandmass = 12 if (map.getNumLandAreas() < iMinLandmass): return false if gc.getGame().isGameMultiPlayer(): return false return true def getHelpSoloFlight(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_SOLO_FLIGHT_HELP_1", (1, )) return szHelp def applySoloFlight(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] for iPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iPlayer) if loopPlayer.isAlive() and iPlayer != kTriggeredData.ePlayer: loopTeam = gc.getTeam(loopPlayer.getTeam()) if loopTeam.isHasMet(gc.getPlayer(kTriggeredData.ePlayer).getTeam()): loopPlayer.AI_changeAttitudeExtra(kTriggeredData.ePlayer, 1) ######## ANTELOPE ########### def canTriggerAntelope(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iDeer = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_DEER') iHappyBonuses = 0 bDeer = false for i in range(gc.getNumBonusInfos()): bonus = gc.getBonusInfo(i) iNum = player.getNumAvailableBonuses(i) if iNum > 0 : if bonus.getHappiness() > 0: iHappyBonuses += 1 if iHappyBonuses > 5: return false if i == iDeer: return false plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.canHaveBonus(iDeer, false): return false return true def doAntelope2(argsList): # Need this because camps are not normally allowed unless there is already deer. iEvent = argsList[0] kTriggeredData = argsList[1] plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.isNone(): plot.setImprovementType(CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_CAMP')) return 1 def getHelpAntelope2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iCamp = CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_CAMP') szHelp = localText.getText("TXT_KEY_EVENT_IMPROVEMENT_GROWTH", ( gc.getImprovementInfo(iCamp).getTextKey(), )) return szHelp ######## WHALEOFATHING ########### def canTriggerWhaleOfAThing(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iWhale = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_WHALE') iHappyBonuses = 0 bWhale = false for i in range(gc.getNumBonusInfos()): bonus = gc.getBonusInfo(i) iNum = player.getNumAvailableBonuses(i) if iNum > 0 : if bonus.getHappiness() > 0: iHappyBonuses += 1 if iHappyBonuses > 5: return false if i == iWhale: return false plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.canHaveBonus(iWhale, false): return false return true ######## HIYOSILVER ########### def canTriggerHiyoSilver(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iSilver = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_SILVER') iHappyBonuses = 0 bSilver = false for i in range(gc.getNumBonusInfos()): bonus = gc.getBonusInfo(i) iNum = player.getNumAvailableBonuses(i) if iNum > 0 : if bonus.getHappiness() > 0: iHappyBonuses += 1 if iHappyBonuses > 5: return false if i == iSilver: return false plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.canHaveBonus(iSilver, false): return false return true ######## WININGMONKS ########### def canTriggerWiningMonks(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if player.getNumAvailableBonuses(CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_WINE')) > 0: return false return true def doWiningMonks2(argsList): # Need this because wineries are not normally allowed unless there is already wine. iEvent = argsList[0] kTriggeredData = argsList[1] plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.isNone(): plot.setImprovementType(CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_WINERY')) return 1 def getHelpWiningMonks2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iImp = CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_WINERY') szHelp = localText.getText("TXT_KEY_EVENT_IMPROVEMENT_GROWTH", ( gc.getImprovementInfo(iImp).getTextKey(), )) return szHelp ######## INDEPENDENTFILMS ########### def canTriggerIndependentFilms(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) for i in range(gc.getNumBuildingInfos()): if gc.getBuildingInfo(i).getFreeBonus() == CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_MOVIES'): if player.countNumBuildings(i) > 0: return false return true def doIndependentFilms(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) iBonus = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_MOVIES') city.changeFreeBonus(iBonus, 1) return 1 def getHelpIndependentFilms(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) iBonus = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_MOVIES') szHelp = localText.getText("TXT_KEY_EVENT_INDEPENDENTFILMS_HELP_1", ( 1, gc.getBonusInfo(iBonus).getChar(), city.getNameKey())) return szHelp ######## ANCIENT OLYMPICS ########### def canTriggerAncientOlympics(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) stateReligion = player.getStateReligion() if stateReligion == CvUtil.findInfoTypeNum(gc.getReligionInfo,gc.getNumReligionInfos(),'RELIGION_JUDAISM'): return false if stateReligion == CvUtil.findInfoTypeNum(gc.getReligionInfo,gc.getNumReligionInfos(),'RELIGION_CHRISTIANITY'): return false if stateReligion == CvUtil.findInfoTypeNum(gc.getReligionInfo,gc.getNumReligionInfos(),'RELIGION_ISLAM'): return false return true def doAncientOlympics2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] map = gc.getMap() for j in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(j) if j != kTriggeredData.ePlayer and loopPlayer.isAlive() and not loopPlayer.isMinorCiv(): for i in range(map.numPlots()): plot = map.plotByIndex(i) if not plot.isWater() and plot.getOwner() == kTriggeredData.ePlayer and plot.isAdjacentPlayer(j, true): loopPlayer.AI_changeMemoryCount(kTriggeredData.ePlayer, MemoryTypes.MEMORY_EVENT_GOOD_TO_US, 1) break return 1 def getHelpAncientOlympics2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_ANCIENTOLYMPICS_HELP_2", ( 1, )) return szHelp ######## MODERN OLYMPICS ########### def canTriggerModernOlympics(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) if (kOrigTriggeredData == None): return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iCityId = kOrigTriggeredData.iCityId kActualTriggeredDataObject.iPlotX = kOrigTriggeredData.iPlotX kActualTriggeredDataObject.iPlotY = kOrigTriggeredData.iPlotY return true def getHelpModernOlympics(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_SOLO_FLIGHT_HELP_1", (1, )) return szHelp def applyModernOlympics(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] for iPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iPlayer) if loopPlayer.isAlive() and iPlayer != kTriggeredData.ePlayer: loopTeam = gc.getTeam(loopPlayer.getTeam()) if loopTeam.isHasMet(gc.getPlayer(kTriggeredData.ePlayer).getTeam()): loopPlayer.AI_changeAttitudeExtra(kTriggeredData.ePlayer, 1) ######## INTERSTATE ########### def canTriggerInterstate(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) if not player.isCivic(CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_EMANCIPATION')): return false return true def getHelpInterstate(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_UNIT_MOVEMENT", (1, gc.getRouteInfo(CvUtil.findInfoTypeNum(gc.getRouteInfo,gc.getNumRouteInfos(),'ROUTE_ROAD')).getTextKey())) return szHelp def applyInterstate(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) team = gc.getTeam(player.getTeam()) iRoad = CvUtil.findInfoTypeNum(gc.getRouteInfo,gc.getNumRouteInfos(),'ROUTE_ROAD') team.changeRouteChange(iRoad, -5) ######## EARTH DAY ########### def getHelpEarthDay2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_EARTHDAY_HELP_2", ()) return szHelp def canApplyEarthDay2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iCivic = CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_ENVIRONMENTALISM') for iPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iPlayer) if loopPlayer.isAlive() and iPlayer != kTriggeredData.ePlayer and not loopPlayer.isHuman(): loopTeam = gc.getTeam(loopPlayer.getTeam()) if loopTeam.isHasMet(gc.getPlayer(kTriggeredData.ePlayer).getTeam()): tradeData = TradeData() tradeData.ItemType = TradeableItems.TRADE_CIVIC tradeData.iData = iCivic if loopPlayer.canTradeItem(kTriggeredData.ePlayer, tradeData, False): if (loopPlayer.getTradeDenial(kTriggeredData.ePlayer, tradeData) == DenialTypes.NO_DENIAL): return true return false def applyEarthDay2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iCivic = CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_ENVIRONMENTALISM') iCivicOption = CvUtil.findInfoTypeNum(gc.getCivicOptionInfo,gc.getNumCivicOptionInfos(),'CIVICOPTION_ECONOMY') listPlayers = [] for iPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iPlayer) if loopPlayer.isAlive() and iPlayer != kTriggeredData.ePlayer and not loopPlayer.isHuman(): loopTeam = gc.getTeam(loopPlayer.getTeam()) if loopTeam.isHasMet(gc.getPlayer(kTriggeredData.ePlayer).getTeam()): tradeData = TradeData() tradeData.ItemType = TradeableItems.TRADE_CIVIC tradeData.iData = iCivic if loopPlayer.canTradeItem(kTriggeredData.ePlayer, tradeData, False): if (loopPlayer.getTradeDenial(kTriggeredData.ePlayer, tradeData) == DenialTypes.NO_DENIAL): listPlayers.append((-loopPlayer.AI_civicValue(iCivic), iPlayer)) #listPlayers.sort() listPlayers.sort(key=itemgetter(0)) # K-Mod. For consistent usage of 'sort', ignore the player id. if len(listPlayers) > 3: listPlayers = listPlayers[:2] for (iValue, iPlayer) in listPlayers: gc.getPlayer(iPlayer).setCivics(iCivicOption, iCivic) ######## FREEDOM CONCERT ########### def getHelpFreedomConcert2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_FREEDOMCONCERT_HELP_2", ()) return szHelp def canApplyFreedomConcert2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) eventCity = player.getCity(kTriggeredData.iCityId) for iReligion in range(gc.getNumReligionInfos()): if eventCity.isHasReligion(iReligion): (loopCity, iter) = player.firstCity(false) while(loopCity): if not loopCity.isHasReligion(iReligion): for jReligion in range(gc.getNumReligionInfos()): if loopCity.isHasReligion(jReligion): return true (loopCity, iter) = player.nextCity(iter, false) return false def applyFreedomConcert2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) eventCity = player.getCity(kTriggeredData.iCityId) for iReligion in range(gc.getNumReligionInfos()): if eventCity.isHasReligion(iReligion): bestCity = None iBestDistance = 0 (loopCity, iter) = player.firstCity(false) while(loopCity): if not loopCity.isHasReligion(iReligion): bValid = false for jReligion in range(gc.getNumReligionInfos()): if loopCity.isHasReligion(jReligion): bValid = true break if bValid: iDistance = plotDistance(eventCity.getX(), eventCity.getY(), loopCity.getX(), loopCity.getY()) if iDistance < iBestDistance or bestCity == None: bestCity = loopCity iBestDistance = iDistance (loopCity, iter) = player.nextCity(iter, false) if bestCity != None: bestCity.setHasReligion(iReligion, true, true, true) ######## HEROIC_GESTURE ########### def canTriggerHeroicGesture(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) destPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) if not gc.getTeam(destPlayer.getTeam()).canChangeWarPeace(player.getTeam()): return false if gc.getTeam(destPlayer.getTeam()).AI_getWarSuccess(player.getTeam()) <= 0: return false if gc.getTeam(player.getTeam()).AI_getWarSuccess(destPlayer.getTeam()) <= 0: return false # K-Mod. an ugly hack to prevent the AI from signing a peace deal when it really doesn't want to. tradeData = TradeData() tradeData.ItemType = TradeableItems.TRADE_PEACE_TREATY if player.getTradeDenial(kTriggeredData.eOtherPlayer, tradeData) != DenialTypes.NO_DENIAL: return false if destPlayer.getTradeDenial(kTriggeredData.ePlayer, tradeData) != DenialTypes.NO_DENIAL: return false # K-Mod end return true def doHeroicGesture2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] destPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) player = gc.getPlayer(kTriggeredData.ePlayer) if destPlayer.isHuman(): # this works only because it's a single-player only event popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON) popupInfo.setText(localText.getText("TXT_KEY_EVENT_HEROIC_GESTURE_OTHER_3", (player.getCivilizationAdjectiveKey(), ))) popupInfo.setData1(kTriggeredData.eOtherPlayer) popupInfo.setData2(kTriggeredData.ePlayer) popupInfo.setPythonModule("CvRandomEventInterface") popupInfo.setOnClickedPythonCallback("heroicGesture2Callback") popupInfo.addPythonButton(localText.getText("TXT_KEY_POPUP_YES", ()), "") popupInfo.addPythonButton(localText.getText("TXT_KEY_POPUP_NO", ()), "") popupInfo.addPopup(kTriggeredData.eOtherPlayer) else: #destPlayer.forcePeace(kTriggeredData.ePlayer) # advc.106g: I don't think there's a difference between CvPlayer::forcePeace and CvTeam::makePeace, so I'm going to use the makePeaceEvent function to let the DLL know that peace happens through an event. gc.getTeam(destPlayer.getTeam()).makePeaceEvent(player.getTeam()) destPlayer.AI_changeAttitudeExtra(kTriggeredData.ePlayer, 1) player.AI_changeAttitudeExtra(kTriggeredData.eOtherPlayer, 1) return def heroicGesture2Callback(argsList): iButton = argsList[0] iData1 = argsList[1] iData2 = argsList[2] iData3 = argsList[3] szText = argsList[4] bOption1 = argsList[5] bOption2 = argsList[6] if iButton == 0: destPlayer = gc.getPlayer(iData1) player = gc.getPlayer(iData2) destPlayer.forcePeace(iData2) destPlayer.AI_changeAttitudeExtra(iData2, 1) player.AI_changeAttitudeExtra(iData1, 1) return 0 def getHelpHeroicGesture2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] destPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) # Get help text szHelp = localText.getText("TXT_KEY_EVENT_ATTITUDE_GOOD", (1, destPlayer.getNameKey())); return szHelp ######## GREAT_MEDIATOR ########### def canTriggerGreatMediator(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) destPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) if not gc.getTeam(player.getTeam()).canChangeWarPeace(destPlayer.getTeam()): return false if gc.getTeam(player.getTeam()).AI_getAtWarCounter(destPlayer.getTeam()) < 10: return false # K-Mod. an ugly hack to prevent the AI from signing a peace deal when it really doesn't want to. tradeData = TradeData() tradeData.ItemType = TradeableItems.TRADE_PEACE_TREATY if player.getTradeDenial(kTriggeredData.eOtherPlayer, tradeData) != DenialTypes.NO_DENIAL: return false if destPlayer.getTradeDenial(kTriggeredData.ePlayer, tradeData) != DenialTypes.NO_DENIAL: return false # K-Mod end return true def doGreatMediator2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] destPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) player = gc.getPlayer(kTriggeredData.ePlayer) if destPlayer.isHuman(): # this works only because it's a single-player only event popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON) popupInfo.setText(localText.getText("TXT_KEY_EVENT_GREAT_MEDIATOR_OTHER_3", (player.getCivilizationAdjectiveKey(), ))) popupInfo.setData1(kTriggeredData.eOtherPlayer) popupInfo.setData2(kTriggeredData.ePlayer) popupInfo.setPythonModule("CvRandomEventInterface") popupInfo.setOnClickedPythonCallback("greatMediator2Callback") popupInfo.addPythonButton(localText.getText("TXT_KEY_POPUP_YES", ()), "") popupInfo.addPythonButton(localText.getText("TXT_KEY_POPUP_NO", ()), "") popupInfo.addPopup(kTriggeredData.eOtherPlayer) else: # advc.106g: Let the DLL know that this is through an event gc.getTeam(player.getTeam()).makePeaceEvent(destPlayer.getTeam()) destPlayer.AI_changeAttitudeExtra(kTriggeredData.ePlayer, 1) player.AI_changeAttitudeExtra(kTriggeredData.eOtherPlayer, 1) return def greatMediator2Callback(argsList): iButton = argsList[0] iData1 = argsList[1] iData2 = argsList[2] iData3 = argsList[3] szText = argsList[4] bOption1 = argsList[5] bOption2 = argsList[6] if iButton == 0: destPlayer = gc.getPlayer(iData1) player = gc.getPlayer(iData2) gc.getTeam(destPlayer.getTeam()).makePeace(player.getTeam()) destPlayer.AI_changeAttitudeExtra(iData2, 1) player.AI_changeAttitudeExtra(iData1, 1) return 0 def getHelpGreatMediator2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] destPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) # Get help text szHelp = localText.getText("TXT_KEY_EVENT_ATTITUDE_GOOD", (1, destPlayer.getNameKey())); return szHelp ######## ANCIENT_TEXTS ########### def doAncientTexts2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] for iPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iPlayer) if loopPlayer.isAlive() and iPlayer != kTriggeredData.ePlayer: loopTeam = gc.getTeam(loopPlayer.getTeam()) if loopTeam.isHasMet(gc.getPlayer(kTriggeredData.ePlayer).getTeam()): loopPlayer.AI_changeAttitudeExtra(kTriggeredData.ePlayer, 1) return def getHelpAncientTexts2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_SOLO_FLIGHT_HELP_1", (1, )) return szHelp ######## IMPACT_CRATER ########### def canTriggerImpactCrater(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iUranium = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_URANIUM') if player.getNumAvailableBonuses(iUranium) > 0: return false plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.canHaveBonus(iUranium, false): return false return true def doImpactCrater2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if not plot.isNone(): plot.setImprovementType(CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_MINE')) return 1 def getHelpImpactCrater2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iMine = CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_MINE') szHelp = localText.getText("TXT_KEY_EVENT_IMPROVEMENT_GROWTH", ( gc.getImprovementInfo(iMine).getTextKey(), )) return szHelp # def numUnitsUprising(playerId): # BtS code (deleted at the call locations): #map = gc.getMap() #if map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_DUEL'): # iNumUnits = 1 #elif map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_TINY'): # iNumUnits = 2 #elif map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_SMALL'): # iNumUnits = 3 #elif map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_STANDARD'): # iNumUnits = 4 #elif map.getWorldSize() == CvUtil.findInfoTypeNum(gc.getWorldInfo, gc.getNumWorldInfos(), 'WORLDSIZE_LARGE'): # iNumUnits = 5 #else: # iNumUnits = 6 #r = 2; #for i in range(gc.getPlayer(playerId).getCurrentEra() + 1): # r += i #return r # Next attempt (5 in the Medieval era seems one too many after all) return 2 + gc.getPlayer(playerId).getCurrentEra() # Based (loosely) on BtS code deleted from the five canTriggerThe... functions def hasAnyCivTeamTech(techTag): techId = gc.getInfoTypeForString(techTag) if techId < 0: return False for i in range(gc.getMAX_CIV_TEAMS()): t = gc.getTeam(i) if t.isAlive() and t.isHasTech(techId): return True return False def isUprisingPlot(p, playerId): # Cut from the uprising canTrigger and apply functions (was repeated there 10 times) #return (not p.isOwned() and not p.isWater() and not p.isImpassable() and p.area().getCitiesPerPlayer(playerId) > 0 and p.isAdjacentPlayer(playerId, True)) if p.isWater(): # Redundant, but may save time. return False # Let's not take Barbarian territory off limits if p.isOwned() and (not p.isBarbarian() or p.isCity()): return False # As above: if p.isImpassable() or p.area().getCitiesPerPlayer(playerId) <= 0: return False # Additional checks: if p.isUnit() or p.area().isBorderObstacle(gc.getPlayer(playerId).getTeam()): return False valid = False for dx in range(-1, 2): for dy in range(-1, 2): if dx == 0 and dy == 0: continue adj = plotXY(p.getX(), p.getY(), dx, dy) if not adj: continue # Adjacent is too close if adj.isOwned() and not adj.isBarbarian(): return False # Two plots away is what I want if adj.isAdjacentPlayer(playerId, True): valid = True return valid # Based on BtS code deleted from the five canTriggerThe... functions def canTriggerUprising(playerId, techReqTag1, techReqTag2, counterUnitClassTag): player = gc.getPlayer(playerId) if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_NO_BARBARIANS): return False if (techReqTag1 and not hasAnyCivTeamTech(techReqTag1)) or (techReqTag2 and not hasAnyCivTeamTech(techReqTag2)): return False if counterUnitClassTag: counterClassId = gc.getInfoTypeForString(counterUnitClassTag) if counterClassId < 0: return False counterUnitId = gc.getCivilizationInfo(player.getCivilizationType()).getCivilizationUnits(counterClassId) if counterUnitId < 0: return False canTrain = False (c, iter) = player.firstCity(False) while c: if c.canTrain(counterUnitId, False, False): canTrain = True break (c, iter) = player.nextCity(iter, False) if not canTrain: return False map = gc.getMap() for i in range(map.numPlots()): if isUprisingPlot(map.plotByIndex(i), playerId): return True return False # ######## THE_HUNS ########### def canTriggerTheHuns(argsList): # advc.311: Moved into new function return canTriggerUprising(argsList[0].ePlayer, 'TECH_HORSEBACK_RIDING', 'TECH_IRON_WORKING', 'UNITCLASS_SPEARMAN') def getHelpTheHuns1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_THE_HUNS_HELP_1", ()) return szHelp def applyTheHuns1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) listPlots = [] map = gc.getMap() for i in range(map.numPlots()): if isUprisingPlot(map.plotByIndex(i), kTriggeredData.ePlayer): # advc.311 listPlots.append(i) if 0 == len(listPlots): return plot = map.plotByIndex(listPlots[gc.getGame().getSorenRandNum(len(listPlots), "Hun event location")]) iNumUnits = numUnitsUprising(kTriggeredData.ePlayer) # advc.311 iUnitType = CvUtil.findInfoTypeNum(gc.getUnitInfo, gc.getNumUnitInfos(), 'UNIT_HORSE_ARCHER') barbPlayer = gc.getPlayer(gc.getBARBARIAN_PLAYER()) for i in range(iNumUnits): barbPlayer.initUnit(iUnitType, plot.getX(), plot.getY(), UnitAITypes.UNITAI_ATTACK_CITY_LEMMING, DirectionTypes.DIRECTION_SOUTH) ######## THE_VANDALS ########### def canTriggerTheVandals(argsList): # advc.311: Moved into new function return canTriggerUprising(argsList[0].ePlayer, 'TECH_METAL_CASTING', 'TECH_IRON_WORKING', 'UNITCLASS_AXEMAN') def getHelpTheVandals1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_THE_VANDALS_HELP_1", ()) return szHelp def applyTheVandals1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) listPlots = [] map = gc.getMap() for i in range(map.numPlots()): if isUprisingPlot(map.plotByIndex(i), kTriggeredData.ePlayer): # advc.311 listPlots.append(i) if 0 == len(listPlots): return plot = map.plotByIndex(listPlots[gc.getGame().getSorenRandNum(len(listPlots), "Vandal event location")]) iNumUnits = numUnitsUprising(kTriggeredData.ePlayer) # advc.311 iUnitType = CvUtil.findInfoTypeNum(gc.getUnitInfo, gc.getNumUnitInfos(), 'UNIT_SWORDSMAN') barbPlayer = gc.getPlayer(gc.getBARBARIAN_PLAYER()) for i in range(iNumUnits): barbPlayer.initUnit(iUnitType, plot.getX(), plot.getY(), UnitAITypes.UNITAI_ATTACK_CITY_LEMMING, DirectionTypes.DIRECTION_SOUTH) ######## THE_GOTHS ########### def canTriggerTheGoths(argsList): # advc.311: Moved into new function return canTriggerUprising(argsList[0].ePlayer, 'TECH_MATHEMATICS', 'TECH_IRON_WORKING', 'UNITCLASS_CHARIOT') def getHelpTheGoths1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_THE_GOTHS_HELP_1", ()) return szHelp def applyTheGoths1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) listPlots = [] map = gc.getMap() for i in range(map.numPlots()): if isUprisingPlot(map.plotByIndex(i), kTriggeredData.ePlayer): # advc.311 listPlots.append(i) if 0 == len(listPlots): return plot = map.plotByIndex(listPlots[gc.getGame().getSorenRandNum(len(listPlots), "Goth event location")]) iNumUnits = numUnitsUprising(kTriggeredData.ePlayer) # advc.311 iUnitType = CvUtil.findInfoTypeNum(gc.getUnitInfo, gc.getNumUnitInfos(), 'UNIT_AXEMAN') barbPlayer = gc.getPlayer(gc.getBARBARIAN_PLAYER()) for i in range(iNumUnits): barbPlayer.initUnit(iUnitType, plot.getX(), plot.getY(), UnitAITypes.UNITAI_ATTACK_CITY_LEMMING, DirectionTypes.DIRECTION_SOUTH) ######## THE_PHILISTINES ########### def canTriggerThePhilistines(argsList): # advc.311: Moved into new function return canTriggerUprising(argsList[0].ePlayer, 'TECH_MONOTHEISM', 'TECH_BRONZE_WORKING', 'UNITCLASS_AXEMAN') def getHelpThePhilistines1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_THE_PHILISTINES_HELP_1", ()) return szHelp def applyThePhilistines1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) listPlots = [] map = gc.getMap() for i in range(map.numPlots()): if isUprisingPlot(map.plotByIndex(i), kTriggeredData.ePlayer): # advc.311 listPlots.append(i) if 0 == len(listPlots): return plot = map.plotByIndex(listPlots[gc.getGame().getSorenRandNum(len(listPlots), "Philistine event location")]) iNumUnits = numUnitsUprising(kTriggeredData.ePlayer) # advc.311 iUnitType = CvUtil.findInfoTypeNum(gc.getUnitInfo, gc.getNumUnitInfos(), 'UNIT_SPEARMAN') barbPlayer = gc.getPlayer(gc.getBARBARIAN_PLAYER()) for i in range(iNumUnits): barbPlayer.initUnit(iUnitType, plot.getX(), plot.getY(), UnitAITypes.UNITAI_ATTACK_CITY_LEMMING, DirectionTypes.DIRECTION_SOUTH) ######## THE_VEDIC_ARYANS ########### def canTriggerTheVedicAryans(argsList): # advc.311: Moved into new function; replace Polytheism with Priesthood (from BUFFY 3.19.003). return canTriggerUprising(argsList[0].ePlayer, 'TECH_PRIESTHOOD', 'TECH_ARCHERY', 'UNITCLASS_ARCHER') def getHelpTheVedicAryans1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_THE_VEDIC_ARYANS_HELP_1", ()) return szHelp def applyTheVedicAryans1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) listPlots = [] map = gc.getMap() for i in range(map.numPlots()): if isUprisingPlot(map.plotByIndex(i), kTriggeredData.ePlayer): # advc.311 listPlots.append(i) if 0 == len(listPlots): return plot = map.plotByIndex(listPlots[gc.getGame().getSorenRandNum(len(listPlots), "Vedic Aryan event location")]) iNumUnits = numUnitsUprising(kTriggeredData.ePlayer) # advc.311 iUnitType = CvUtil.findInfoTypeNum(gc.getUnitInfo, gc.getNumUnitInfos(), 'UNIT_ARCHER') barbPlayer = gc.getPlayer(gc.getBARBARIAN_PLAYER()) for i in range(iNumUnits): barbPlayer.initUnit(iUnitType, plot.getX(), plot.getY(), UnitAITypes.UNITAI_ATTACK_CITY_LEMMING, DirectionTypes.DIRECTION_SOUTH) ######## SECURITY_TAX ########### def canTriggerSecurityTax(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iWalls = CvUtil.findInfoTypeNum(gc.getBuildingClassInfo, gc.getNumBuildingClassInfos(), 'BUILDINGCLASS_WALLS') if player.getNumCities() > player.getBuildingClassCount(iWalls): return false return true ######## LITERACY ########### def canTriggerLiteracy(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iLibrary = CvUtil.findInfoTypeNum(gc.getBuildingClassInfo, gc.getNumBuildingClassInfos(), 'BUILDINGCLASS_LIBRARY') if player.getNumCities() > player.getBuildingClassCount(iLibrary): return false return true ######## TEA ########### def canTriggerTea(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if player.isCivic(CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_MERCANTILISM')): return false bCanTrade = false for iLoopPlayer in range(gc.getMAX_CIV_PLAYERS()): if player.canHaveTradeRoutesWith(iLoopPlayer): bCanTrade = true break if not bCanTrade: return false return true ######## HORSE WHISPERING ########### def canTriggerHorseWhispering(argsList): kTriggeredData = argsList[0] if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false return true def getHelpHorseWhispering1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] map = gc.getMap() iNumStables = worldSizeTarget() szHelp = localText.getText("TXT_KEY_EVENT_HORSE_WHISPERING_HELP", (iNumStables, )) return szHelp def canTriggerHorseWhisperingDone(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) iStable = CvUtil.findInfoTypeNum(gc.getBuildingClassInfo, gc.getNumBuildingClassInfos(), 'BUILDINGCLASS_STABLE') if worldSizeTarget() > player.getBuildingClassCount(iStable): return false return true def getHelpHorseWhisperingDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] map = gc.getMap() iNumUnits = worldSizeTarget() szHelp = localText.getText("TXT_KEY_EVENT_HORSE_WHISPERING_DONE_HELP_1", (iNumUnits, )) return szHelp def applyHorseWhisperingDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) map = gc.getMap() plot = map.plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) iNumUnits = worldSizeTarget() iUnitClassType = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_HORSE_ARCHER') iUnitType = gc.getCivilizationInfo(player.getCivilizationType()).getCivilizationUnits(iUnitClassType) if iUnitType != -1: for i in range(iNumUnits): player.initUnit(iUnitType, plot.getX(), plot.getY(), UnitAITypes.UNITAI_ATTACK, DirectionTypes.DIRECTION_SOUTH) ######## HARBORMASTER ########### def getHelpHarbormaster1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iHarborsRequired = worldSizeTarget() iCaravelsRequired = iHarborsRequired / 2 + 1 szHelp = localText.getText("TXT_KEY_EVENT_HARBORMASTER_HELP", (iHarborsRequired, iCaravelsRequired)) return szHelp def canTriggerHarbormaster(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false map = gc.getMap() iNumWater = 0 for i in range(map.numPlots()): plot = map.plotByIndex(i) if plot.isWater(): iNumWater += 1 if 100 * iNumWater >= 40 * map.numPlots(): return true return false def canTriggerHarbormasterDone(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) iHarbor = CvUtil.findInfoTypeNum(gc.getBuildingClassInfo, gc.getNumBuildingClassInfos(), 'BUILDINGCLASS_HARBOR') iHarborsRequired = worldSizeTarget() if iHarborsRequired > player.getBuildingClassCount(iHarbor): return false iCaravel = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_CARAVEL') iCaravelsRequired = iHarborsRequired / 2 + 1 if iCaravelsRequired > player.getUnitClassCount(iCaravel): return false return true ######## CLASSIC LITERATURE ########### def canTriggerClassicLiterature(argsList): kTriggeredData = argsList[0] if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false return true def getHelpClassicLiterature1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iLibrariesRequired = worldSizeTarget() szHelp = localText.getText("TXT_KEY_EVENT_CLASSIC_LITERATURE_HELP_1", (iLibrariesRequired, )) return szHelp def canTriggerClassicLiteratureDone(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) iLibrary = CvUtil.findInfoTypeNum(gc.getBuildingClassInfo, gc.getNumBuildingClassInfos(), 'BUILDINGCLASS_LIBRARY') iBuildingsRequired = worldSizeTarget() if iBuildingsRequired > player.getBuildingClassCount(iLibrary): return false return true def getHelpClassicLiteratureDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_CLASSIC_LITERATURE_DONE_HELP_2", ( )) return szHelp def canApplyClassicLiteratureDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iEraAncient = CvUtil.findInfoTypeNum(gc.getEraInfo, gc.getNumEraInfos(), 'ERA_ANCIENT') for iTech in range(gc.getNumTechInfos()): if gc.getTechInfo(iTech).getEra() == iEraAncient and player.canResearch(iTech, false): return true return false def applyClassicLiteratureDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iEraAncient = CvUtil.findInfoTypeNum(gc.getEraInfo, gc.getNumEraInfos(), 'ERA_ANCIENT') listTechs = [] for iTech in range(gc.getNumTechInfos()): if gc.getTechInfo(iTech).getEra() == iEraAncient and player.canResearch(iTech, false): listTechs.append(iTech) if len(listTechs) > 0: iTech = listTechs[gc.getGame().getSorenRandNum(len(listTechs), "Classic Literature Event Tech selection")] gc.getTeam(player.getTeam()).setHasTech(iTech, true, kTriggeredData.ePlayer, true, true) def getHelpClassicLiteratureDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iSpecialist = CvUtil.findInfoTypeNum(gc.getSpecialistInfo, gc.getNumSpecialistInfos(), 'SPECIALIST_SCIENTIST', ) iGreatLibrary = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_GREAT_LIBRARY') szCityName = u"" (loopCity, iter) = player.firstCity(false) while(loopCity): if (loopCity.isHasBuilding(iGreatLibrary)): szCityName = loopCity.getNameKey() break (loopCity, iter) = player.nextCity(iter, false) szHelp = localText.getText("TXT_KEY_EVENT_FREE_SPECIALIST", (1, gc.getSpecialistInfo(iSpecialist).getTextKey(), szCityName)) return szHelp def canApplyClassicLiteratureDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iGreatLibrary = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_GREAT_LIBRARY') (loopCity, iter) = player.firstCity(false) while(loopCity): if (loopCity.isHasBuilding(iGreatLibrary)): return true (loopCity, iter) = player.nextCity(iter, false) return false def applyClassicLiteratureDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iSpecialist = CvUtil.findInfoTypeNum(gc.getSpecialistInfo, gc.getNumSpecialistInfos(), 'SPECIALIST_SCIENTIST', ) iGreatLibrary = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_GREAT_LIBRARY') (loopCity, iter) = player.firstCity(false) while(loopCity): if (loopCity.isHasBuilding(iGreatLibrary)): loopCity.changeFreeSpecialistCount(iSpecialist, 1) return (loopCity, iter) = player.nextCity(iter, false) ######## MASTER BLACKSMITH ########### def canTriggerMasterBlacksmith(argsList): kTriggeredData = argsList[0] if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false return true def getHelpMasterBlacksmith1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iRequired = worldSizeTarget() szHelp = localText.getText("TXT_KEY_EVENT_MASTER_BLACKSMITH_HELP_1", (iRequired, player.getCity(kTriggeredData.iCityId).getNameKey())) return szHelp def expireMasterBlacksmith1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) if city == None or city.getOwner() != kTriggeredData.ePlayer: return true return false def canTriggerMasterBlacksmithDone(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) iForge = CvUtil.findInfoTypeNum(gc.getBuildingClassInfo, gc.getNumBuildingClassInfos(), 'BUILDINGCLASS_FORGE') iBuildingsRequired = worldSizeTarget() if iBuildingsRequired > player.getBuildingClassCount(iForge): return false kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) city = player.getCity(kOrigTriggeredData.iCityId) if city == None or city.getOwner() != kTriggeredData.ePlayer: return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iCityId = kOrigTriggeredData.iCityId return true def canApplyMasterBlacksmithDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iBonus = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_COPPER') city = player.getCity(kTriggeredData.iCityId) if city == None: return false map = gc.getMap() iBestValue = map.getGridWidth() + map.getGridHeight() bestPlot = None for i in range(map.numPlots()): plot = map.plotByIndex(i) if (plot.getOwner() == kTriggeredData.ePlayer and plot.canHaveBonus(iBonus, false)): iValue = plotDistance(city.getX(), city.getY(), plot.getX(), plot.getY()) if iValue < iBestValue: iBestValue = iValue bestPlot = plot if bestPlot == None: return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iPlotX = bestPlot.getX() kActualTriggeredDataObject.iPlotY = bestPlot.getY() return true def applyMasterBlacksmithDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) city = player.getCity(kTriggeredData.iCityId) iBonus = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_COPPER') plot.setBonusType(iBonus) szBuffer = localText.getText("TXT_KEY_MISC_DISCOVERED_NEW_RESOURCE", (gc.getBonusInfo(iBonus).getTextKey(), city.getNameKey())) CyInterface().addMessage(kTriggeredData.ePlayer, false, gc.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DISCOVERBONUS", InterfaceMessageTypes.MESSAGE_TYPE_MINOR_EVENT, gc.getBonusInfo(iBonus).getButton(), gc.getInfoTypeForString("COLOR_WHITE"), plot.getX(), plot.getY(), true, true) def canApplyMasterBlacksmithDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) if player.getStateReligion() == -1: return false return true ######## THE BEST DEFENSE ########### def canTriggerBestDefense(argsList): kTriggeredData = argsList[0] if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false return true def getHelpBestDefense1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iRequired = worldSizeTarget() szHelp = localText.getText("TXT_KEY_EVENT_BEST_DEFENSE_HELP_1", (iRequired, )) return szHelp def canTriggerBestDefenseDone(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) iCastle = CvUtil.findInfoTypeNum(gc.getBuildingClassInfo, gc.getNumBuildingClassInfos(), 'BUILDINGCLASS_CASTLE') iBuildingsRequired = worldSizeTarget() if iBuildingsRequired > player.getBuildingClassCount(iCastle): return false return true def getHelpBestDefenseDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_BEST_DEFENSE_DONE_HELP_2", (3, )) return szHelp def applyBestDefenseDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] for iPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iPlayer) if loopPlayer.isAlive() and iPlayer != kTriggeredData.ePlayer: loopTeam = gc.getTeam(loopPlayer.getTeam()) if loopTeam.isHasMet(gc.getPlayer(kTriggeredData.ePlayer).getTeam()): loopPlayer.AI_changeAttitudeExtra(kTriggeredData.ePlayer, 3) def canApplyBestDefenseDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iGreatWall = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_GREAT_WALL') (loopCity, iter) = player.firstCity(false) while(loopCity): if (loopCity.isHasBuilding(iGreatWall)): return true (loopCity, iter) = player.nextCity(iter, false) return false ######## NATIONAL SPORTS LEAGUE ########### def canTriggerSportsLeague(argsList): kTriggeredData = argsList[0] if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false return true def getHelpSportsLeague1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iRequired = worldSizeTarget() iBuilding = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_STATUE_OF_ZEUS') szHelp = localText.getText("TXT_KEY_EVENT_SPORTS_LEAGUE_HELP_1", (iRequired, gc.getBuildingInfo(iBuilding).getTextKey())) return szHelp def canTriggerSportsLeagueDone(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) iCastle = CvUtil.findInfoTypeNum(gc.getBuildingClassInfo, gc.getNumBuildingClassInfos(), 'BUILDINGCLASS_COLOSSEUM') iBuildingsRequired = worldSizeTarget() if iBuildingsRequired > player.getBuildingClassCount(iCastle): return false return true def canApplySportsLeagueDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iZeus = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_STATUE_OF_ZEUS') (loopCity, iter) = player.firstCity(false) while(loopCity): if (loopCity.isHasBuilding(iZeus)): return true (loopCity, iter) = player.nextCity(iter, false) return false ######## CRUSADE ########### def canTriggerCrusade(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false if holyCity.getOwner() != kTriggeredData.eOtherPlayer: return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iOtherPlayerCityId = holyCity.getID() return true def getHelpCrusade1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) szHelp = localText.getText("TXT_KEY_EVENT_CRUSADE_HELP_1", (holyCity.getNameKey(), )) return szHelp def expireCrusade1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) if holyCity.getOwner() == kTriggeredData.ePlayer: return false if player.getStateReligion() != kTriggeredData.eReligion: return true if holyCity.getOwner() != kTriggeredData.eOtherPlayer: return true if not gc.getTeam(player.getTeam()).isAtWar(otherPlayer.getTeam()): return true return false def canTriggerCrusadeDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) holyCity = gc.getGame().getHolyCity(kOrigTriggeredData.eReligion) if holyCity.getOwner() != kTriggeredData.ePlayer: return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iCityId = holyCity.getID() kActualTriggeredDataObject.eOtherPlayer = kOrigTriggeredData.eOtherPlayer kActualTriggeredDataObject.eReligion = kOrigTriggeredData.eReligion for iBuilding in range(gc.getNumBuildingInfos()): if gc.getBuildingInfo(iBuilding).getHolyCity() == kOrigTriggeredData.eReligion: kActualTriggeredDataObject.eBuilding = BuildingTypes(iBuilding) break return true def getHelpCrusadeDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) szUnit = gc.getUnitInfo(holyCity.getConscriptUnit()).getTextKey() iNumUnits = worldSizeTarget() / 2 + 1 szHelp = localText.getText("TXT_KEY_EVENT_CRUSADE_DONE_HELP_1", (iNumUnits, szUnit, holyCity.getNameKey())) return szHelp def canApplyCrusadeDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) if -1 == holyCity.getConscriptUnit(): return false return true def applyCrusadeDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) iUnitType = holyCity.getConscriptUnit() iNumUnits = worldSizeTarget() / 2 + 1 if iUnitType != -1: for i in range(iNumUnits): player.initUnit(iUnitType, holyCity.getX(), holyCity.getY(), UnitAITypes.UNITAI_CITY_DEFENSE, DirectionTypes.DIRECTION_SOUTH) def getHelpCrusadeDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) szHelp = localText.getText("TXT_KEY_EVENT_CRUSADE_DONE_HELP_2", (gc.getBuildingInfo(kTriggeredData.eBuilding).getTextKey(), holyCity.getNameKey())) return szHelp def canApplyCrusadeDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) if -1 == kTriggeredData.eBuilding or holyCity.isHasBuilding(kTriggeredData.eBuilding): return false return true def applyCrusadeDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) holyCity.setNumRealBuilding(kTriggeredData.eBuilding, 1) if (not gc.getGame().isNetworkMultiPlayer() and kTriggeredData.ePlayer == gc.getGame().getActivePlayer()): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN) popupInfo.setData1(kTriggeredData.eBuilding) popupInfo.setData2(holyCity.getID()) popupInfo.setData3(0) popupInfo.setText(u"showWonderMovie") popupInfo.addPopup(kTriggeredData.ePlayer) def getHelpCrusadeDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumCities = worldSizeTarget() holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) szHelp = localText.getText("TXT_KEY_EVENT_CRUSADE_DONE_HELP_3", (gc.getReligionInfo(kTriggeredData.eReligion).getTextKey(), iNumCities)) return szHelp def canApplyCrusadeDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumCities = worldSizeTarget() if gc.getGame().getNumCities() == gc.getGame().countReligionLevels(kTriggeredData.eReligion): return false return true def applyCrusadeDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] holyCity = gc.getGame().getHolyCity(kTriggeredData.eReligion) listCities = [] for iPlayer in range(gc.getMAX_CIV_PLAYERS()): loopPlayer = gc.getPlayer(iPlayer) if loopPlayer.isAlive(): (loopCity, iter) = loopPlayer.firstCity(false) while(loopCity): if (not loopCity.isHasReligion(kTriggeredData.eReligion)): iDistance = plotDistance(holyCity.getX(), holyCity.getY(), loopCity.getX(), loopCity.getY()) listCities.append((iDistance, loopCity)) (loopCity, iter) = loopPlayer.nextCity(iter, false) #listCities.sort() listCities.sort(key=itemgetter(0)) # K-Mod. Sorting by pointers can cause OOS. iNumCities = min(worldSizeTarget(), len(listCities)) for i in range(iNumCities): iDistance, loopCity = listCities[i] loopCity.setHasReligion(kTriggeredData.eReligion, true, true, true) ######## ESTEEMEED_PLAYWRIGHT ########### def canTriggerEsteemedPlaywright(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) # If source civ is operating this Civic, disallow the event to trigger. if player.isCivic(CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_SLAVERY')): return false return true ######## SECRET_KNOWLEDGE ########### def getHelpSecretKnowledge2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) szHelp = localText.getText("TXT_KEY_EVENT_YIELD_CHANGE_BUILDING", (gc.getBuildingInfo(kTriggeredData.eBuilding).getTextKey(), u"+4[ICON_CULTURE]")) return szHelp def applySecretKnowledge2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) city.setBuildingCommerceChange(gc.getBuildingInfo(kTriggeredData.eBuilding).getBuildingClassType(), CommerceTypes.COMMERCE_CULTURE, 4) ######## HIGH_WARLORD ########### def canTriggerHighWarlord(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) # If source civ is operating this Civic, disallow the event to trigger. if player.isCivic(CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_EMANCIPATION')): return false return true ######## EXPERIENCED_CAPTAIN ########### def canTriggerExperiencedCaptain(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) unit = player.getUnit(kTriggeredData.iUnitId) if unit.isNone(): return false if unit.getExperience() < 7: return false return true ######## PARTISANS ########### def getNumPartisanUnits(plot, iPlayer): # Let the DLL handle this so that it's consistent with the code moved from CvEventManager.onCityRazed. if not plot.isCity(): return 1 # (shouldn't happen) return plot.getPlotCity().getNumPartisanUnits(iPlayer) # def getHelpPartisans1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) capital = player.getCapitalCity() plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if None != capital and not capital.isNone(): iNumUnits = getNumPartisanUnits(plot, kTriggeredData.ePlayer) szUnit = gc.getUnitInfo(capital.getConscriptUnit()).getTextKey() szHelp = localText.getText("TXT_KEY_EVENT_PARTISANS_HELP_1", (iNumUnits, szUnit)) return szHelp def canApplyPartisans1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if getNumPartisanUnits(plot, kTriggeredData.ePlayer) <= 0: return false for i in range(3): for j in range(3): loopPlot = gc.getMap().plot(kTriggeredData.iPlotX + i - 1, kTriggeredData.iPlotY + j - 1) if None != loopPlot and not loopPlot.isNone(): if not (loopPlot.isVisibleEnemyUnit(kTriggeredData.ePlayer) or loopPlot.isWater() or loopPlot.isImpassable() or loopPlot.isCity()): return true return false def applyPartisans1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) capital = player.getCapitalCity() plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if None != capital and not capital.isNone(): iNumUnits = getNumPartisanUnits(plot, kTriggeredData.ePlayer) listPlots = [] for i in range(3): for j in range(3): loopPlot = gc.getMap().plot(kTriggeredData.iPlotX + i - 1, kTriggeredData.iPlotY + j - 1) if None != loopPlot and not loopPlot.isNone() and (i != 1 or j != 1): if not (loopPlot.isVisibleEnemyUnit(kTriggeredData.ePlayer) or loopPlot.isWater() or loopPlot.isImpassable()): listPlots.append(loopPlot) if len(listPlots) > 0: for i in range(iNumUnits): iPlot = gc.getGame().getSorenRandNum(len(listPlots), "Partisan event placement") player.initUnit(capital.getConscriptUnit(), listPlots[iPlot].getX(), listPlots[iPlot].getY(), UnitAITypes.UNITAI_ATTACK, DirectionTypes.DIRECTION_SOUTH) def getHelpPartisans2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) capital = player.getCapitalCity() plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if None != capital and not capital.isNone(): iNumUnits = max(1, getNumPartisanUnits(plot, kTriggeredData.ePlayer) / 2) szUnit = gc.getUnitInfo(capital.getConscriptUnit()).getTextKey() szHelp = localText.getText("TXT_KEY_EVENT_PARTISANS_HELP_2", (iNumUnits, szUnit, capital.getNameKey())) return szHelp def canApplyPartisans2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) return (max(1, getNumPartisanUnits(plot, kTriggeredData.ePlayer) / 2) > 0) def applyPartisans2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) capital = player.getCapitalCity() plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if None != capital and not capital.isNone(): iNumUnits = max(1, getNumPartisanUnits(plot, kTriggeredData.ePlayer) / 2) for i in range(iNumUnits): player.initUnit(capital.getConscriptUnit(), capital.getX(), capital.getY(), UnitAITypes.UNITAI_ATTACK, DirectionTypes.DIRECTION_SOUTH) ######## GREED ########### def canTriggerGreed(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) if not gc.getTeam(player.getTeam()).canChangeWarPeace(otherPlayer.getTeam()): return false listBonuses = [] iOil = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_OIL') if 0 == player.getNumAvailableBonuses(iOil): listBonuses.append(iOil) iIron = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_IRON') if 0 == player.getNumAvailableBonuses(iIron): listBonuses.append(iIron) iHorse = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_HORSE') if 0 == player.getNumAvailableBonuses(iHorse): listBonuses.append(iHorse) iCopper = CvUtil.findInfoTypeNum(gc.getBonusInfo,gc.getNumBonusInfos(),'BONUS_COPPER') if 0 == player.getNumAvailableBonuses(iCopper): listBonuses.append(iCopper) map = gc.getMap() bFound = false listPlots = [] for iBonus in listBonuses: for i in range(map.numPlots()): loopPlot = map.plotByIndex(i) if loopPlot.getOwner() == kTriggeredData.eOtherPlayer and loopPlot.getBonusType(player.getTeam()) == iBonus and loopPlot.isRevealed(player.getTeam(), false) and not loopPlot.isWater(): listPlots.append(loopPlot) bFound = true if bFound: break if not bFound: return false plot = listPlots[gc.getGame().getSorenRandNum(len(listPlots), "Greed event plot selection")] if -1 == getGreedUnit(player, plot): return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iPlotX = plot.getX() kActualTriggeredDataObject.iPlotY = plot.getY() return true def getHelpGreed1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) iBonus = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY).getBonusType(player.getTeam()) iTurns = gc.getGameSpeedInfo(gc.getGame().getGameSpeedType()).getGrowthPercent() szHelp = localText.getText("TXT_KEY_EVENT_GREED_HELP_1", (otherPlayer.getCivilizationShortDescriptionKey(), gc.getBonusInfo(iBonus).getTextKey(), iTurns)) return szHelp def expireGreed1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) otherPlayer = gc.getPlayer(kTriggeredData.eOtherPlayer) plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) if plot.getOwner() == kTriggeredData.ePlayer or plot.getOwner() == -1: return false if gc.getGame().getGameTurn() >= kTriggeredData.iTurn + gc.getGameSpeedInfo(gc.getGame().getGameSpeedType()).getGrowthPercent(): return true if plot.getOwner() != kTriggeredData.eOtherPlayer: return true return false def canTriggerGreedDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) plot = gc.getMap().plot(kOrigTriggeredData.iPlotX, kOrigTriggeredData.iPlotY) if plot.getOwner() != kOrigTriggeredData.ePlayer: return false if -1 == getGreedUnit(player, plot): return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iPlotX = kOrigTriggeredData.iPlotX kActualTriggeredDataObject.iPlotY = kOrigTriggeredData.iPlotY kActualTriggeredDataObject.eOtherPlayer = kOrigTriggeredData.eOtherPlayer return true def getGreedUnit(player, plot): iBonus = plot.getBonusType(player.getTeam()) iBestValue = 0 iBestUnit = -1 for iUnitClass in range(gc.getNumUnitClassInfos()): iUnit = gc.getCivilizationInfo(player.getCivilizationType()).getCivilizationUnits(iUnitClass) if -1 != iUnit and player.canTrain(iUnit, false, false) and (gc.getUnitInfo(iUnit).getDomainType() == DomainTypes.DOMAIN_LAND): iValue = 0 if gc.getUnitInfo(iUnit).getPrereqAndBonus() == iBonus: iValue = player.AI_unitValue(iUnit, UnitAITypes.UNITAI_ATTACK, plot.area()) else: for j in range(gc.getNUM_UNIT_PREREQ_OR_BONUSES()): if (gc.getUnitInfo(iUnit).getPrereqOrBonuses(j) == iBonus): iValue = player.AI_unitValue(iUnit, UnitAITypes.UNITAI_ATTACK, plot.area()) break if iValue > iBestValue: iBestValue = iValue iBestUnit = iUnit return iBestUnit def getHelpGreedDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) iNumUnits = worldSizeTarget() / 2 + 1 iUnitType = getGreedUnit(player, plot) if iUnitType != -1: szHelp = localText.getText("TXT_KEY_EVENT_GREED_DONE_HELP_1", (iNumUnits, gc.getUnitInfo(iUnitType).getTextKey())) return szHelp def applyGreedDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) plot = gc.getMap().plot(kTriggeredData.iPlotX, kTriggeredData.iPlotY) iUnitType = getGreedUnit(player, plot) iNumUnits = worldSizeTarget() / 2 + 1 if iUnitType != -1: for i in range(iNumUnits): player.initUnit(iUnitType, plot.getX(), plot.getY(), UnitAITypes.UNITAI_ATTACK, DirectionTypes.DIRECTION_SOUTH) ######## WAR CHARIOTS ########### def canTriggerWarChariots(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.eReligion = ReligionTypes(player.getStateReligion()) return true def getHelpWarChariots1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumUnits = worldSizeTarget() + 1 szHelp = localText.getText("TXT_KEY_EVENT_WAR_CHARIOTS_HELP_1", (iNumUnits, )) return szHelp def canTriggerWarChariotsDone(argsList): kTriggeredData = argsList[0] trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) player = gc.getPlayer(kTriggeredData.ePlayer) iNumUnits = worldSizeTarget() + 1 iUnitClassType = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_CHARIOT') if player.getUnitClassCount(iUnitClassType) < iNumUnits: return false kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.eReligion = kOrigTriggeredData.eReligion return true ######## ELITE SWORDSMEN ########### def getHelpEliteSwords1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumUnits = worldSizeTarget() + 1 szHelp = localText.getText("TXT_KEY_EVENT_ELITE_SWORDS_HELP_1", (iNumUnits, )) return szHelp def canTriggerEliteSwordsDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iNumUnits = worldSizeTarget() + 1 iUnitClassType = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_SWORDSMAN') if player.getUnitClassCount(iUnitClassType) < iNumUnits: return false return true def canApplyEliteSwordsDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iCivic = CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_HEREDITARY_RULE') if not player.isCivic(iCivic): return false return true ######## WARSHIPS ########### def canTriggerWarships(argsList): kTriggeredData = argsList[0] map = gc.getMap() iNumWater = 0 for i in range(map.numPlots()): plot = map.plotByIndex(i) if plot.isWater(): iNumWater += 1 if 100 * iNumWater >= 55 * map.numPlots(): return true return false def getHelpWarships1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumUnits = worldSizeTarget() iBuilding = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_GREAT_LIGHTHOUSE') szHelp = localText.getText("TXT_KEY_EVENT_WARSHIPS_HELP_1", (iNumUnits, gc.getBuildingInfo(iBuilding).getTextKey())) return szHelp def canTriggerWarshipsDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iNumUnits = worldSizeTarget() iUnitClassType = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_TRIREME') if player.getUnitClassCount(iUnitClassType) < iNumUnits: return false return true def canApplyWarshipsDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iBuilding = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_GREAT_LIGHTHOUSE') if player.getBuildingClassCount(gc.getBuildingInfo(iBuilding).getBuildingClassType()) == 0: return false return true ######## GUNS NOT BUTTER ########### def getHelpGunsButter1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumUnits = worldSizeTarget() + 1 iBuilding = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_TAJ_MAHAL') szHelp = localText.getText("TXT_KEY_EVENT_GUNS_BUTTER_HELP_1", (iNumUnits, gc.getBuildingInfo(iBuilding).getTextKey())) return szHelp def canTriggerGunsButterDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iNumUnits = worldSizeTarget() + 1 iUnitClassType = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_MUSKETMAN') if player.getUnitClassCount(iUnitClassType) < iNumUnits: return false return true def canApplyGunsButterDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iCivic = CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_VASSALAGE') if not player.isCivic(iCivic): return false return true def canApplyGunsButterDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iBuilding = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_TAJ_MAHAL') if player.getBuildingClassCount(gc.getBuildingInfo(iBuilding).getBuildingClassType()) == 0: return false return true ######## NOBLE KNIGHTS ########### def canTriggerNobleKnights(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.eReligion = ReligionTypes(player.getStateReligion()) return true def getHelpNobleKnights1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumUnits = worldSizeTarget() + 1 iBuilding = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_ORACLE') szHelp = localText.getText("TXT_KEY_EVENT_NOBLE_KNIGHTS_HELP_1", (iNumUnits, gc.getBuildingInfo(iBuilding).getTextKey())) return szHelp def canTriggerNobleKnightsDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iNumUnits = worldSizeTarget() + 1 iUnitClassType = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_KNIGHT') if player.getUnitClassCount(iUnitClassType) < iNumUnits: return false trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.eReligion = kOrigTriggeredData.eReligion iBuilding = CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), 'BUILDING_ORACLE') (loopCity, iter) = player.firstCity(false) while(loopCity): if (loopCity.isHasBuilding(iBuilding)): kActualTriggeredDataObject.iPlotX = loopCity.getX() kActualTriggeredDataObject.iPlotY = loopCity.getY() kActualTriggeredDataObject.iCityId = loopCity.getID() break (loopCity, iter) = player.nextCity(iter, false) return true def canApplyNobleKnightsDone2(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iCivic = CvUtil.findInfoTypeNum(gc.getCivicInfo,gc.getNumCivicInfos(),'CIVIC_ORGANIZED_RELIGION') if not player.isCivic(iCivic): return false return true ######## OVERWHELM DOCTRINE ########### def canTriggerOverwhelm(argsList): kTriggeredData = argsList[0] map = gc.getMap() iNumWater = 0 for i in range(map.numPlots()): plot = map.plotByIndex(i) if plot.isWater(): iNumWater += 1 if 100 * iNumWater >= 55 * map.numPlots(): return true return false def getHelpOverwhelm1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iDestroyer = CvUtil.findInfoTypeNum(gc.getUnitInfo, gc.getNumUnitInfos(), 'UNIT_DESTROYER') iNumDestroyers = 4 iBattleship = CvUtil.findInfoTypeNum(gc.getUnitInfo, gc.getNumUnitInfos(), 'UNIT_BATTLESHIP') iNumBattleships = 2 iCarrier = CvUtil.findInfoTypeNum(gc.getUnitInfo, gc.getNumUnitInfos(), 'UNIT_CARRIER') iNumCarriers = 3 iFighter = CvUtil.findInfoTypeNum(gc.getSpecialUnitInfo, gc.getNumSpecialUnitInfos(), 'SPECIALUNIT_FIGHTER') iNumFighters = 9 iProject = CvUtil.findInfoTypeNum(gc.getProjectInfo, gc.getNumProjectInfos(), 'PROJECT_MANHATTAN_PROJECT') szHelp = localText.getText("TXT_KEY_EVENT_OVERWHELM_HELP_1", (iNumDestroyers, gc.getUnitInfo(iDestroyer).getTextKey(), iNumBattleships, gc.getUnitInfo(iBattleship).getTextKey(), iNumCarriers, gc.getUnitInfo(iCarrier).getTextKey(), iNumFighters, gc.getSpecialUnitInfo(iFighter).getTextKey(), gc.getProjectInfo(iProject).getTextKey())) return szHelp def canTriggerOverwhelmDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iDestroyer = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_DESTROYER') iNumDestroyers = 4 if player.getUnitClassCount(iDestroyer) < iNumDestroyers: return false iBattleship = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_BATTLESHIP') iNumBattleships = 2 if player.getUnitClassCount(iBattleship) < iNumBattleships: return false iCarrier = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_CARRIER') iNumCarriers = 3 if player.getUnitClassCount(iCarrier) < iNumCarriers: return false iFighter = CvUtil.findInfoTypeNum(gc.getSpecialUnitInfo, gc.getNumSpecialUnitInfos(), 'SPECIALUNIT_FIGHTER') iNumFighters = 9 iNumPlayerFighters = 0 (loopUnit, iter) = player.firstUnit(false) while (loopUnit): if loopUnit.getSpecialUnitType() == iFighter: iNumPlayerFighters += 1 (loopUnit, iter) = player.nextUnit(iter, false) if iNumPlayerFighters < iNumFighters: return false return true def getHelpOverwhelmDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_OVERWHELM_DONE_HELP_3", ()) return szHelp def canApplyOverwhelmDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iProject = CvUtil.findInfoTypeNum(gc.getProjectInfo, gc.getNumProjectInfos(), 'PROJECT_MANHATTAN_PROJECT') if gc.getTeam(player.getTeam()).getProjectCount(iProject) == 0: return false return true def applyOverwhelmDone3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] gc.getGame().changeNoNukesCount(1) ######## CORPORATE EXPANSION ########### def canTriggerCorporateExpansion(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) city = gc.getGame().getHeadquarters(kTriggeredData.eCorporation) if None == city or city.isNone(): return false # Hack to remember the number of cities you already have with the Corporation kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iOtherPlayerCityId = gc.getGame().countCorporationLevels(kTriggeredData.eCorporation) kActualTriggeredDataObject.iCityId = city.getID() kActualTriggeredDataObject.iPlotX = city.getX() kActualTriggeredDataObject.iPlotY = city.getY() bFound = false for iBuilding in range(gc.getNumBuildingInfos()): if gc.getBuildingInfo(iBuilding).getFoundsCorporation() == kTriggeredData.eCorporation: kActualTriggeredDataObject.eBuilding = BuildingTypes(iBuilding) bFound = true break if not bFound: return false return true def expireCorporateExpansion1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) if None == city or city.isNone(): return true return false def getHelpCorporateExpansion1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] iNumCities = worldSizeTarget() + 1 szHelp = localText.getText("TXT_KEY_EVENT_CORPORATE_EXPANSION_HELP_1", (gc.getCorporationInfo(kTriggeredData.eCorporation).getTextKey(), iNumCities)) return szHelp def canTriggerCorporateExpansionDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) iNumCitiesRequired = worldSizeTarget() + 1 + kOrigTriggeredData.iOtherPlayerCityId if iNumCitiesRequired > gc.getGame().countCorporationLevels(kOrigTriggeredData.eCorporation): return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.eCorporation = kOrigTriggeredData.eCorporation kActualTriggeredDataObject.eBuilding = kOrigTriggeredData.eBuilding kActualTriggeredDataObject.iCityId = kOrigTriggeredData.iCityId kActualTriggeredDataObject.iPlotX = kOrigTriggeredData.iPlotX kActualTriggeredDataObject.iPlotY = kOrigTriggeredData.iPlotY return true def getHelpCorporateExpansionDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_YIELD_CHANGE_BUILDING", (gc.getBuildingInfo(kTriggeredData.eBuilding).getTextKey(), u"+10[ICON_GOLD]")) return szHelp def applyCorporateExpansionDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) if None != city and not city.isNone(): city.setBuildingCommerceChange(gc.getBuildingInfo(kTriggeredData.eBuilding).getBuildingClassType(), CommerceTypes.COMMERCE_GOLD, 10) ######## HOSTILE TAKEOVER ########### def canTriggerHostileTakeover(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ONE_CITY_CHALLENGE) and gc.getPlayer(kTriggeredData.ePlayer).isHuman(): return false city = gc.getGame().getHeadquarters(kTriggeredData.eCorporation) if None == city or city.isNone(): return false # Hack to remember the number of cities you already have with the Corporation kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.iCityId = city.getID() kActualTriggeredDataObject.iPlotX = city.getX() kActualTriggeredDataObject.iPlotY = city.getY() bFound = false for iBuilding in range(gc.getNumBuildingInfos()): if gc.getBuildingInfo(iBuilding).getFoundsCorporation() == kTriggeredData.eCorporation: kActualTriggeredDataObject.eBuilding = BuildingTypes(iBuilding) bFound = true break if not bFound: return false listResources = getHostileTakeoverListResources(gc.getCorporationInfo(kTriggeredData.eCorporation), player) if len(listResources) == 0: return false return true def expireHostileTakeover1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) if None == city or city.isNone(): return true return false def getHostileTakeoverListResources(corporation, player): map = gc.getMap() listHave = [] for i in range(map.numPlots()): plot = map.plotByIndex(i) if plot.getOwner() == player.getID(): iBonus = plot.getBonusType(player.getTeam()) if iBonus != -1: if not iBonus in listHave: listHave.append(iBonus) listNeed = [] for i in range(gc.getNUM_CORPORATION_PREREQ_BONUSES()): iBonus = corporation.getPrereqBonus(i) if iBonus != -1: if not iBonus in listHave: listNeed.append(iBonus) return listNeed def getHelpHostileTakeover1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) listResources = getHostileTakeoverListResources(gc.getCorporationInfo(kTriggeredData.eCorporation), player) szList = u"" bFirst = true for iBonus in listResources: if not bFirst: szList += u", " else: bFirst = false szList += u"[COLOR_HIGHLIGHT_TEXT]" + gc.getBonusInfo(iBonus).getDescription() + u"[COLOR_REVERT]" szHelp = localText.getText("TXT_KEY_EVENT_HOSTILE_TAKEOVER_HELP_1", (len(listResources), szList)) return szHelp def canTriggerHostileTakeoverDone(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) trigger = gc.getEventTriggerInfo(kTriggeredData.eTrigger) kOrigTriggeredData = player.getEventOccured(trigger.getPrereqEvent(0)) listResources = getHostileTakeoverListResources(gc.getCorporationInfo(kOrigTriggeredData.eCorporation), player) if len(listResources) > 0: return false kActualTriggeredDataObject = player.getEventTriggered(kTriggeredData.iId) kActualTriggeredDataObject.eCorporation = kOrigTriggeredData.eCorporation kActualTriggeredDataObject.eBuilding = kOrigTriggeredData.eBuilding kActualTriggeredDataObject.iCityId = kOrigTriggeredData.iCityId kActualTriggeredDataObject.iPlotX = kOrigTriggeredData.iPlotX kActualTriggeredDataObject.iPlotY = kOrigTriggeredData.iPlotY return true def getHelpHostileTakeoverDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] szHelp = localText.getText("TXT_KEY_EVENT_YIELD_CHANGE_BUILDING", (gc.getBuildingInfo(kTriggeredData.eBuilding).getTextKey(), u"+20[ICON_GOLD]")) return szHelp def applyHostileTakeoverDone1(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) city = player.getCity(kTriggeredData.iCityId) if None != city and not city.isNone(): city.setBuildingCommerceChange(gc.getBuildingInfo(kTriggeredData.eBuilding).getBuildingClassType(), CommerceTypes.COMMERCE_GOLD, 20) ######## Great Beast ######## def doGreatBeast3(argsList): kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) (loopCity, iter) = player.firstCity(false) while(loopCity): if loopCity.isHasReligion(kTriggeredData.eReligion): loopCity.changeHappinessTimer(40) (loopCity, iter) = player.nextCity(iter, false) def getHelpGreatBeast3(argsList): kTriggeredData = argsList[1] religion = gc.getReligionInfo(kTriggeredData.eReligion) szHelp = localText.getText("TXT_KEY_EVENT_GREAT_BEAST_3_HELP", (gc.getDefineINT("TEMP_HAPPY"), 40, religion.getChar())) return szHelp ####### Comet Fragment ######## def canDoCometFragment(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if (player.getSpaceProductionModifier()) > 10: return false return true ####### Immigrants ######## def canTriggerImmigrantCity(argsList): ePlayer = argsList[1] iCity = argsList[2] player = gc.getPlayer(ePlayer) city = player.getCity(iCity) if city.isNone(): return false if ((city.happyLevel() - city.unhappyLevel(0) < 1) or (city.goodHealth() - city.badHealth(true) < 1)): return false if (city.getCommerceRateTimes100(CommerceTypes.COMMERCE_CULTURE) < 5500): return false ####### Controversial Philosopher ###### def canTriggerControversialPhilosopherCity(argsList): ePlayer = argsList[1] iCity = argsList[2] player = gc.getPlayer(ePlayer) city = player.getCity(iCity) if city.isNone(): return false if (not city.isCapital()): return false if (city.getCommerceRateTimes100(CommerceTypes.COMMERCE_RESEARCH) < 3500): return false return true ####### Spy Discovered ####### def canDoSpyDiscovered3(argsList): iEvent = argsList[0] kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) if player.getNumCities() < 4: return false if player.getCapitalCity().isNone(): return false return true def doSpyDiscovered3(argsList): kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) plot = player.getCapitalCity().plot() iNumUnits = player.getNumCities() / 4 iUnitClassType = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_TANK') iUnitType = gc.getCivilizationInfo(player.getCivilizationType()).getCivilizationUnits(iUnitClassType) if iUnitType != -1: for i in range(iNumUnits): player.initUnit(iUnitType, plot.getX(), plot.getY(), UnitAITypes.UNITAI_ATTACK, DirectionTypes.DIRECTION_SOUTH) def getHelpSpyDiscovered3(argsList): kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iNumUnits = player.getNumCities() / 4 szHelp = localText.getText("TXT_KEY_EVENT_SPY_DISCOVERED_3_HELP", (iNumUnits, )) return szHelp ####### Nuclear Protest ####### def canTriggerNuclearProtest(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) iICBMClass = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_ICBM') iTacNukeClass = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_TACTICAL_NUKE') if player.getUnitClassCount(iICBMClass) + player.getUnitClassCount(iTacNukeClass) < 10: return false return true def doNuclearProtest1(argsList): kTriggeredData = argsList[1] player = gc.getPlayer(kTriggeredData.ePlayer) iICBMClass = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_ICBM') iTacNukeClass = CvUtil.findInfoTypeNum(gc.getUnitClassInfo, gc.getNumUnitClassInfos(), 'UNITCLASS_TACTICAL_NUKE') (loopUnit, iter) = player.firstUnit(false) while (loopUnit): if loopUnit.getUnitClassType() == iICBMClass or loopUnit.getUnitClassType() == iTacNukeClass: loopUnit.kill(false, -1) (loopUnit, iter) = player.nextUnit(iter, false) def getHelpNuclearProtest1(argsList): szHelp = localText.getText("TXT_KEY_EVENT_NUCLEAR_PROTEST_1_HELP", ()) return szHelp ######## Preaching Researcher ####### def canTriggerPreachingResearcherCity(argsList): iCity = argsList[2] player = gc.getPlayer(argsList[1]) city = player.getCity(iCity) if city.isHasBuilding(gc.getInfoTypeForString("BUILDING_UNIVERSITY")): return true return false ######## Toxcatl (Aztec event) ######### def canTriggerToxcatl(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if (player.getCivilizationType() == gc.getInfoTypeForString("CIVILIZATION_AZTEC")): return true return false ######## Dissident Priest (Egyptian event) ####### def canTriggerDissidentPriest(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if (player.getCivilizationType() == gc.getInfoTypeForString("CIVILIZATION_EGYPT")): return true return false def canTriggerDissidentPriestCity(argsList): iCity = argsList[2] player = gc.getPlayer(argsList[1]) city = player.getCity(iCity) if city.isGovernmentCenter(): return false if (city.getCommerceRateTimes100(CommerceTypes.COMMERCE_CULTURE) < 3000): return false if (player.getStateReligion() != -1): return false return true ######## Rogue Station (Russian event) ########### def canTriggerRogueStation(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if (player.getCivilizationType() == gc.getInfoTypeForString("CIVILIZATION_RUSSIA")): return true return false ######## Antimonarchists (French event) ######### def canTriggerAntiMonarchists(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if (player.getCivilizationType() == gc.getInfoTypeForString("CIVILIZATION_FRANCE")): return true return false ######## Impeachment (American event) ######## def canTriggerImpeachment(argsList): kTriggeredData = argsList[0] player = gc.getPlayer(kTriggeredData.ePlayer) if (player.getCivilizationType() == gc.getInfoTypeForString("CIVILIZATION_AMERICA")): return true return false def canTriggerImpeachmentCity(argsList): iCity = argsList[2] player = gc.getPlayer(argsList[1]) city = player.getCity(iCity) if city.isCapital(): return true return false