def getTechTrades(self, player, team): iPlayerID = player.getID() tradeData = TradeData() tradeData.ItemType = TradeableItems.TRADE_TECHNOLOGIES techsByPlayer = {} for loopPlayer in TradeUtil.getTechTradePartners(player): techsToTrade = set() for iLoopTech in range(gc.getNumTechInfos()): tradeData.iData = iLoopTech if (loopPlayer.canTradeItem(iPlayerID, tradeData, False)): if (loopPlayer.getTradeDenial(iPlayerID, tradeData) == DenialTypes.NO_DENIAL): # will trade techsToTrade.add(iLoopTech) techsByPlayer[loopPlayer.getID()] = techsToTrade return techsByPlayer
def CheckForAlerts(self, iPlayer, bBeginTurn): CyPlayer = GC.getPlayer(iPlayer) CyTeam = GC.getTeam(CyPlayer.getTeam()) iGrowthCount = 0 bCheck1 = self.options.isShowDomPopAlert() bCheck2 = bBeginTurn and self.options.isShowCityPendingExpandBorderAlert() if bCheck1 or bCheck2: # Check for cultural expansion and population growth icon = "Art/Interface/Buttons/General/Warning_popup.dds" iActiveTeam = GAME.getActiveTeam() for iPlayerX in xrange(GC.getMAX_PC_PLAYERS()): CyPlayerX = GC.getPlayer(iPlayerX) if not CyPlayerX.isAlive() or CyPlayerX.getTeam() != iActiveTeam: continue for cityX in CyPlayerX.cities(): if cityX.getFoodTurnsLeft() == 1 and not cityX.isFoodProduction() and not cityX.AI_isEmphasize(5): iGrowthCount += 1 if bCheck2 and cityX.getCultureLevel() != GC.getNumCultureLevelInfos() - 1: if cityX.getCulture(iPlayerX) + cityX.getCommerceRate(CommerceTypes.COMMERCE_CULTURE) >= cityX.getCultureThreshold(): msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_CITY_TO_EXPAND",(cityX.getName(),)) CvUtil.sendMessage(msg, iPlayer, EVENT_MESSAGE_TIME_LONG, icon, -1, cityX.getX(), cityX.getY(), True, True) # Check Domination Limit if self.getCheckForDomVictory() and GAME.isVictoryValid(3): # Population Limit if bCheck1 and iGrowthCount: iTotalPop = GAME.getTotalPopulation() if iTotalPop > 10: iTeamPop = CyTeam.getTotalPopulation() fPercent = iTeamPop * 100.0 / iTotalPop fPercentNext = (iTeamPop + iGrowthCount) * 100.0 / iTotalPop if iTeamPop + iGrowthCount != self.lastPopCount: fVictoryPercent = GAME.getAdjustedPopulationPercent(3) * 1.0 iLimitPop = int(iTotalPop * fVictoryPercent / 100) if fPercent >= fVictoryPercent: msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_POP_EXCEEDS_LIMIT", (iTeamPop, (u"%.2f%%" % fPercent), iLimitPop, (u"%.2f%%" % fVictoryPercent))) self._addMessageNoIcon(iPlayer, msg) elif fPercentNext >= fVictoryPercent: msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_POP_GROWTH_EXCEEDS_LIMIT", (iTeamPop, iGrowthCount, (u"%.2f%%" % fPercentNext), iLimitPop, (u"%.2f%%" % fVictoryPercent))) self._addMessageNoIcon(iPlayer, msg) elif fVictoryPercent - fPercentNext < self.options.getDomPopThreshold(): msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_POP_GROWTH_CLOSE_TO_LIMIT", (iTeamPop, iGrowthCount, (u"%.2f%%" % fPercentNext), iLimitPop, (u"%.2f%%" % fVictoryPercent))) self._addMessageNoIcon(iPlayer, msg) elif fVictoryPercent - fPercent < self.options.getDomPopThreshold(): msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_POP_CLOSE_TO_LIMIT", (iTeamPop, (u"%.2f%%" % fPercent), iLimitPop, (u"%.2f%%" % fVictoryPercent))) self._addMessageNoIcon(iPlayer, msg) self.lastPopCount = iTeamPop + iGrowthCount # Land Limit if self.options.isShowDomLandAlert(): iTeamLand = CyTeam.getTotalLand() if iTeamLand > 40 and iTeamLand != self.lastLandCount: iTotalLand = GC.getMap().getLandPlots() fVictoryPercent = GAME.getAdjustedLandPercent(3) * 1.0 iLimitLand = int(iTotalLand * fVictoryPercent / 100) fPercent = (iTeamLand * 100.0) / iTotalLand if fPercent > fVictoryPercent: msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_LAND_EXCEEDS_LIMIT", (iTeamLand, (u"%.2f%%" % fPercent), iLimitLand, (u"%.2f%%" % fVictoryPercent))) self._addMessageNoIcon(iPlayer, msg) elif fVictoryPercent - fPercent < self.options.getDomLandThreshold(): msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_LAND_CLOSE_TO_LIMIT", (iTeamLand, (u"%.2f%%" % fPercent), iLimitLand, (u"%.2f%%" % fVictoryPercent))) self._addMessageNoIcon(iPlayer, msg) self.lastLandCount = iTeamLand if not bBeginTurn: return #********# # Trades # # | || | # tradeData = TradeData() # Bonus if self.options.isShowBonusTradeAlert(): desiredBonuses = TradeUtil.getDesiredBonuses(CyPlayer, CyTeam) tradesByPlayer = {} for CyPlayerX in TradeUtil.getBonusTradePartners(CyPlayer): will, wont = TradeUtil.getTradeableBonuses(CyPlayerX, iPlayer) tradesByPlayer[CyPlayerX.getID()] = will for iLoopPlayer, currentTrades in tradesByPlayer.iteritems(): #Did he have trades avail last turn if self.PrevAvailBonusTrades.has_key(iLoopPlayer): previousTrades = self.PrevAvailBonusTrades[iLoopPlayer] else: previousTrades = set() #Determine new bonuses newTrades = currentTrades.difference(previousTrades).intersection(desiredBonuses) if newTrades: szNewTrades = self.buildBonusString(newTrades) msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_NEW_BONUS_AVAIL", (GC.getPlayer(iLoopPlayer).getName(), szNewTrades)) self._addMessageNoIcon(iPlayer, msg) #Determine removed bonuses removedTrades = previousTrades.difference(currentTrades).intersection(desiredBonuses) if removedTrades: szRemovedTrades = self.buildBonusString(removedTrades) msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_BONUS_NOT_AVAIL", (GC.getPlayer(iLoopPlayer).getName(), szRemovedTrades)) self._addMessageNoIcon(iPlayer, msg) #save curr trades for next time self.PrevAvailBonusTrades = tradesByPlayer # Tech if self.options.isShowTechTradeAlert(): techsByPlayer = {} researchTechs = set() iTotalTechs = GC.getNumTechInfos() tradeData.ItemType = TradeableItems.TRADE_TECHNOLOGIES bCheck1 = True for CyPlayerX in TradeUtil.getTechTradePartners(CyPlayer): techsToTrade = set() for iTech in range(iTotalTechs): if bCheck1 and CyPlayer.canResearch(iTech): researchTechs.add(iTech) tradeData.iData = iTech if CyPlayerX.canTradeItem(iPlayer, tradeData, False): if CyPlayerX.getTradeDenial(iPlayer, tradeData) == DenialTypes.NO_DENIAL: # will trade techsToTrade.add(iTech) bCheck1 = False techsByPlayer[CyPlayerX.getID()] = techsToTrade for iLoopPlayer, currentTechs in techsByPlayer.iteritems(): #Did he have trades avail last turn if self.PrevAvailTechTrades.has_key(iLoopPlayer): previousTechs = self.PrevAvailTechTrades[iLoopPlayer] else: previousTechs = set() #Determine new techs newTechs = currentTechs.difference(previousTechs).intersection(researchTechs) if newTechs: szNewTechs = self.buildTechString(newTechs) msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_NEW_TECH_AVAIL", (GC.getPlayer(iLoopPlayer).getName(), szNewTechs)) self._addMessageNoIcon(iPlayer, msg) #Determine removed techs removedTechs = previousTechs.difference(currentTechs).intersection(researchTechs) if removedTechs: szRemovedTechs = self.buildTechString(removedTechs) msg = TRNSLTR.getText("TXT_KEY_MORECIV4LERTS_TECH_NOT_AVAIL", (GC.getPlayer(iLoopPlayer).getName(), szRemovedTechs)) self._addMessageNoIcon(iPlayer, msg) #save curr trades for next time self.PrevAvailTechTrades = techsByPlayer # Map if self.options.isShowMapTradeAlert(): tradeData.ItemType = TradeableItems.TRADE_MAPS oldSet = self.PrevAvailMapTrades TXT_KEY = "TXT_KEY_MORECIV4LERTS_MAP" willTrade = self.getTrades(TradeUtil.getMapTradePartners(CyPlayer), iPlayer, tradeData, oldSet, TXT_KEY) if willTrade != oldSet: self.PrevAvailMapTrades = willTrade # Open Borders if self.options.isShowOpenBordersTradeAlert(): tradeData.ItemType = TradeableItems.TRADE_OPEN_BORDERS oldSet = self.PrevAvailOpenBordersTrades TXT_KEY = "TXT_KEY_MORECIV4LERTS_OPEN_BORDERS" willTrade = self.getTrades(TradeUtil.getOpenBordersTradePartners(CyPlayer), iPlayer, tradeData, oldSet, TXT_KEY) if willTrade != oldSet: self.PrevAvailOpenBordersTrades = willTrade # Defensive Pact if self.options.isShowDefensivePactTradeAlert(): tradeData.ItemType = TradeableItems.TRADE_DEFENSIVE_PACT oldSet = self.PrevAvailDefensivePactTrades TXT_KEY = "TXT_KEY_MORECIV4LERTS_DEFENSIVE_PACT" willTrade = self.getTrades(TradeUtil.getDefensivePactTradePartners(CyPlayer), iPlayer, tradeData, oldSet, TXT_KEY) if willTrade != oldSet: self.PrevAvailDefensivePactTrades = willTrade # Alliance if self.options.isShowPermanentAllianceTradeAlert(): tradeData.ItemType = TradeableItems.TRADE_PERMANENT_ALLIANCE oldSet = self.PrevAvailPermanentAllianceTrades TXT_KEY = "TXT_KEY_MORECIV4LERTS_PERMANENT_ALLIANCE" willTrade = self.getTrades(TradeUtil.getPermanentAllianceTradePartners(CyPlayer), iPlayer, tradeData, oldSet, TXT_KEY) if willTrade != oldSet: self.PrevAvailPermanentAllianceTrades = willTrade # Vassalage if self.options.isShowVassalTradeAlert(): tradeData.ItemType = TradeableItems.TRADE_VASSAL oldSet = self.PrevAvailVassalTrades TXT_KEY = "TXT_KEY_MORECIV4LERTS_VASSAL" willTrade = self.getTrades(TradeUtil.getVassalTradePartners(CyPlayer), iPlayer, tradeData, oldSet, TXT_KEY) if willTrade != oldSet: self.PrevAvailVassalTrades = willTrade # Capitulate if self.options.isShowSurrenderTradeAlert(): tradeData.ItemType = TradeableItems.TRADE_SURRENDER oldSet = self.PrevAvailSurrenderTrades TXT_KEY = "TXT_KEY_MORECIV4LERTS_SURRENDER" willTrade = self.getTrades(TradeUtil.getCapitulationTradePartners(CyPlayer), iPlayer, tradeData, oldSet, TXT_KEY) if willTrade != oldSet: self.PrevAvailSurrenderTrades = willTrade # Peace Treaty if self.options.isShowPeaceTradeAlert(): tradeData.ItemType = TradeableItems.TRADE_PEACE_TREATY tradeData.iData = GC.getDefineINT("PEACE_TREATY_LENGTH") oldSet = self.PrevAvailPeaceTrades TXT_KEY = "TXT_KEY_MORECIV4LERTS_PEACE_TREATY" willTrade = self.getTrades(TradeUtil.getPeaceTradePartners(CyPlayer), iPlayer, tradeData, oldSet, TXT_KEY) if willTrade != oldSet: self.PrevAvailPeaceTrades = willTrade