def calculateTradeRoutes(playerOrID, withPlayerOrID=None): """ Returns the domestic and foreign trade route yields and counts for <playerOrID>: domestic yield, domestic count, foreign yield, and foreign count. If <withPlayerOrID> is given, only counts trade routes to their cities. If Fractional Trade Routes is active, the value returned is fractional (times 100). """ domesticTrade = domesticCount = foreignTrade = foreignCount = 0 eTeam = PlayerUtil.getPlayerTeam(playerOrID) eWithPlayer = PlayerUtil.getPlayerID(withPlayerOrID) for city in PlayerUtil.playerCities(playerOrID): for i in range(city.getTradeRoutes()): tradeCity = city.getTradeCity(i) if tradeCity and tradeCity.getOwner() >= 0 and ( eWithPlayer == -1 or eWithPlayer == tradeCity.getOwner()): trade = city.calculateTradeYield( YieldTypes.YIELD_COMMERCE, TRADE_PROFIT_FUNC(city, tradeCity)) if tradeCity.getTeam() == eTeam: domesticTrade += trade domesticCount += 1 else: foreignTrade += trade foreignCount += 1 return domesticTrade, domesticCount, foreignTrade, foreignCount
def isWillingToTalk(playerOrID, toPlayerOrID): """ Returns True if <player> is willing to talk to <toPlayer>. - Every player is willing to talk to themselves - All human players are willing to talk - Uses BUG DLL if present, otherwise scans attitude hover text for "Refuses to Talk!!!" in the current language Note: This function does not check if the two players can make contact. """ playerID, player = PlayerUtil.getPlayerAndID(playerOrID) toPlayerID = PlayerUtil.getPlayerID(toPlayerOrID) # if playerID == toPlayerID or player.isHuman(): # # all players talk to themselves, and all humans talk # return True # if BugDll.isPresent(): # return player.AI_isWillingToTalk(toPlayerID) # else: # hover = AttitudeUtil.getAttitudeString(playerID, toPlayerID) # if hover: # return (hover.find(BugUtil.getPlainText("TXT_KEY_MISC_REFUSES_TO_TALK")) == -1) # else: # # haven't met yet # return False # K-Mod return playerID == toPlayerID or player.AI_isWillingToTalk(toPlayerID)
def getTradeableBonuses(fromPlayerOrID, toPlayerOrID): """ Returns two sets of bonus IDs that <fromPlayer> will and won't trade to <toPlayer>. Assumes that the two players can trade bonuses. """ fromPlayer = PlayerUtil.getPlayer(fromPlayerOrID) eToPlayer = PlayerUtil.getPlayerID(toPlayerOrID) fromPlayerIsHuman = fromPlayer.isHuman() will = set() wont = set() tradeData = TradeData() tradeData.ItemType = TradeableItems.TRADE_RESOURCES for eBonus in range(gc.getNumBonusInfos()): tradeData.iData = eBonus if fromPlayer.canTradeItem(eToPlayer, tradeData, False): if fromPlayerIsHuman or fromPlayer.canTradeItem(eToPlayer, tradeData, True): will.add(eBonus) else: wont.add(eBonus) return will, wont
def calculateTradeRoutes(playerOrID, withPlayerOrID=None): """ Returns the domestic and foreign trade route yields and counts for <playerOrID>: domestic yield, domestic count, foreign yield, and foreign count. If <withPlayerOrID> is given, only counts trade routes to their cities. If Fractional Trade Routes is active, the value returned is fractional (times 100). """ domesticTrade = domesticCount = foreignTrade = foreignCount = 0 # advc.001: Bugfixes merged from Dawn of Civilization eTeam = PlayerUtil.getPlayerTeamID(playerOrID) # (was getPlayerTeam) eWithPlayer = PlayerUtil.getPlayerID(withPlayerOrID) for city in PlayerUtil.playerCities(playerOrID): # advc.001: (Only relevant for FractionalTrade) cityDomesticTrade = cityForeignTrade = 0 for i in range(city.getTradeRoutes()): tradeCity = city.getTradeCity(i) if tradeCity and tradeCity.getOwner() >= 0 and ( eWithPlayer == -1 or eWithPlayer == tradeCity.getOwner()): trade = city.calculateTradeYield( YieldTypes.YIELD_COMMERCE, TRADE_PROFIT_FUNC(city, tradeCity)) if tradeCity.getTeam() == eTeam: cityDomesticTrade += trade # advc.001: was domesticTrade+=... domesticCount += 1 else: cityForeignTrade += trade # advc.001: was foreignTrade+=... foreignCount += 1 # <advc.001> if isFractionalTrade() and not withPlayerOrID: cityDomesticTrade //= 100 cityForeignTrade //= 100 domesticTrade += cityDomesticTrade foreignTrade += cityForeignTrade if isFractionalTrade() and withPlayerOrID: domesticTrade //= 100 foreignTrade //= 100 # </advc.001> return domesticTrade, domesticCount, foreignTrade, foreignCount
def getTradeableBonuses(fromPlayerOrID, toPlayerOrID): """ Returns two sets of bonus IDs that <fromPlayer> will and won't trade to <toPlayer>. Assumes that the two players can trade bonuses. """ fromPlayer = PlayerUtil.getPlayer(fromPlayerOrID) eToPlayer = PlayerUtil.getPlayerID(toPlayerOrID) #fromPlayerIsHuman = fromPlayer.isHuman() # advc.306: Now unused will = set() wont = set() tradeData = TradeData() tradeData.ItemType = TradeableItems.TRADE_RESOURCES for eBonus in range(gc.getNumBonusInfos()): tradeData.iData = eBonus if fromPlayer.canTradeItem(eToPlayer, tradeData, False): # adcv.036: Removed 'fromPlayerIsHuman or'. Human trade denial checks whether eToPlayer needs eBonus. if fromPlayer.canTradeItem(eToPlayer, tradeData, True): will.add(eBonus) else: wont.add(eBonus) return will, wont
def calculateTradeRoutes(playerOrID, withPlayerOrID=None): """ Returns the domestic and foreign trade route yields and counts for <playerOrID>: domestic yield, domestic count, foreign yield, and foreign count. If <withPlayerOrID> is given, only counts trade routes to their cities. If Fractional Trade Routes is active, the value returned is fractional (times 100). """ domesticTrade = domesticCount = foreignTrade = foreignCount = 0 eTeam = PlayerUtil.getPlayerTeam(playerOrID) eWithPlayer = PlayerUtil.getPlayerID(withPlayerOrID) for city in PlayerUtil.playerCities(playerOrID): for i in range(city.getTradeRoutes()): tradeCity = city.getTradeCity(i) if tradeCity and tradeCity.getOwner() >= 0 and (eWithPlayer == -1 or eWithPlayer == tradeCity.getOwner()): trade = city.calculateTradeYield(YieldTypes.YIELD_COMMERCE, TRADE_PROFIT_FUNC(city, tradeCity)) if tradeCity.getTeam() == eTeam: domesticTrade += trade domesticCount += 1 else: foreignTrade += trade foreignCount += 1 return domesticTrade, domesticCount, foreignTrade, foreignCount