def getKnownTrainableUnits(playerOrID, askingPlayerOrID, knowableUnits, bonuses, military=None): player, team = PlayerUtil.getPlayerAndTeam(playerOrID) askingPlayer = PlayerUtil.getPlayer(askingPlayerOrID) eAskingTeam, askingTeam = PlayerUtil.getPlayerTeamAndID(askingPlayer) #trade = player.canTradeNetworkWith(askingPlayer.getID()) cities = PlayerUtil.getPlayerCities( player, lambda city: city.isRevealed(eAskingTeam, False)) # separate units into two groups: yes and maybe units = getTrainableUnits(playerOrID, knowableUnits, False, military) yesUnits = set() maybeUnits = set() BugUtil.debug("-----------------------") for eUnit in units: if not canAnyCityBuildUnit(eUnit, cities, eAskingTeam, False): BugUtil.debug(" no %s", gc.getUnitInfo(eUnit).getDescription()) elif hasBonusesForUnit(eUnit, bonuses): BugUtil.debug(" yes %s", gc.getUnitInfo(eUnit).getDescription()) yesUnits.add(eUnit) elif bonuses is None: BugUtil.debug(" maybe %s", gc.getUnitInfo(eUnit).getDescription()) maybeUnits.add(eUnit) return yesUnits, maybeUnits
def getKnownTrainableUnits(playerOrID, askingPlayerOrID, knowableUnits, bonuses, military=None): player, team = PlayerUtil.getPlayerAndTeam(playerOrID) askingPlayer = PlayerUtil.getPlayer(askingPlayerOrID) eAskingTeam, askingTeam = PlayerUtil.getPlayerTeamAndID(askingPlayer) # trade = player.canTradeNetworkWith(askingPlayer.getID()) cities = PlayerUtil.getPlayerCities(player, lambda city: city.isRevealed(eAskingTeam, False)) # separate units into two groups: yes and maybe units = getTrainableUnits(playerOrID, knowableUnits, False, military) yesUnits = set() maybeUnits = set() BugUtil.debug("-----------------------") for eUnit in units: if not canAnyCityBuildUnit(eUnit, cities, eAskingTeam, False): BugUtil.debug(" no %s", gc.getUnitInfo(eUnit).getDescription()) elif hasBonusesForUnit(eUnit, bonuses): BugUtil.debug(" yes %s", gc.getUnitInfo(eUnit).getDescription()) yesUnits.add(eUnit) elif bonuses is None: BugUtil.debug(" maybe %s", gc.getUnitInfo(eUnit).getDescription()) maybeUnits.add(eUnit) return yesUnits, maybeUnits
def getCanTrainUnits(playerOrID, askingPlayerOrID=None, military=None): """ Returns the set of all units the player can train. Searches all of the player's cities to find which units can be trained. If askingPlayerOrID is given, only cities they have seen are checked, and only units whose prerequisite techs they know or can research are returned. Also, if the two players' trade networks are not connected, units that require resources to train are returned in a second set. If military is provided, only military or civilian units are checked depending on its value, True or False, respectively. *** OBSOLETE *** """ player, team = PlayerUtil.getPlayerAndTeam(playerOrID) askingPlayer = PlayerUtil.getPlayer(askingPlayerOrID) if askingPlayer: eAskingTeam, askingTeam = PlayerUtil.getPlayerTeamAndID(askingPlayer) trade = player.canTradeNetworkWith(askingPlayer.getID()) civInfo = gc.getCivilizationInfo(player.getCivilizationType()) units = set() maybeUnits = set() for eClass in range(NUM_CLASSES): eUnit = civInfo.getCivilizationUnits(eClass) if eUnit == -1: classInfo = gc.getUnitClassInfo(eClass) BugUtil.debug("%s doesn't have %s", civInfo.getDescription(), classInfo.getDescription()) eUnit = classInfo.getDefaultUnitIndex() unitInfo = gc.getUnitInfo(eUnit) if unitInfo: if ((military == True and unitInfo.getUnitCombatType() <= 0) or (military == False and unitInfo.getUnitCombatType() > 0)): BugUtil.debug("skipping (non-)military %s", unitInfo.getDescription()) continue if askingPlayer: for eTech in unitTechs[eUnit]: if not (askingTeam.isHasTech(eTech) or askingPlayer.canResearch(eTech, False)): BugUtil.debug( "%s doesn't comprehend %s", askingPlayer.getCivilizationShortDescription(0), gc.getTechInfo(eTech).getDescription()) skip = True break else: skip = False if skip: BugUtil.debug("skipping unknowable %s", unitInfo.getDescription()) continue for city in PlayerUtil.playerCities(player): if askingPlayer: if not city.isRevealed(eAskingTeam, False): continue if city.canTrain(eUnit, False, not trade): if eUnit in unitsWithBonuses: maybeUnits.add(eUnit) else: units.add(eUnit) break else: if city.canTrain(eUnit, False, False): units.add(eUnit) break BugUtil.debug("%s can train:", player.getCivilizationShortDescription(0)) for eUnit in units: unitInfo = gc.getUnitInfo(eUnit) BugUtil.debug(" %s", unitInfo.getDescription()) if askingPlayer: BugUtil.debug("%s can maybe train:", player.getCivilizationShortDescription(0)) for eUnit in maybeUnits: unitInfo = gc.getUnitInfo(eUnit) BugUtil.debug(" %s", unitInfo.getDescription()) return units, maybeUnits else: return units
def getCanTrainUnits(playerOrID, askingPlayerOrID=None, military=None): """ Returns the set of all units the player can train. Searches all of the player's cities to find which units can be trained. If askingPlayerOrID is given, only cities they have seen are checked, and only units whose prerequisite techs they know or can research are returned. Also, if the two players' trade networks are not connected, units that require resources to train are returned in a second set. If military is provided, only military or civilian units are checked depending on its value, True or False, respectively. *** OBSOLETE *** """ player, team = PlayerUtil.getPlayerAndTeam(playerOrID) askingPlayer = PlayerUtil.getPlayer(askingPlayerOrID) if askingPlayer: eAskingTeam, askingTeam = PlayerUtil.getPlayerTeamAndID(askingPlayer) trade = player.canTradeNetworkWith(askingPlayer.getID()) civInfo = gc.getCivilizationInfo(player.getCivilizationType()) units = set() maybeUnits = set() for eClass in range(NUM_CLASSES): eUnit = civInfo.getCivilizationUnits(eClass) if eUnit == -1: classInfo = gc.getUnitClassInfo(eClass) BugUtil.debug("%s doesn't have %s", civInfo.getDescription(), classInfo.getDescription()) eUnit = classInfo.getDefaultUnitIndex() unitInfo = gc.getUnitInfo(eUnit) if unitInfo: if ((military == True and unitInfo.getUnitCombatType() <= 0) or (military == False and unitInfo.getUnitCombatType() > 0)): BugUtil.debug("skipping (non-)military %s", unitInfo.getDescription()) continue if askingPlayer: for eTech in unitTechs[eUnit]: if not (askingTeam.isHasTech(eTech) or askingPlayer.canResearch(eTech, False)): BugUtil.debug("%s doesn't comprehend %s", askingPlayer.getName(), gc.getTechInfo(eTech).getDescription()) skip = True break else: skip = False if skip: BugUtil.debug("skipping unknowable %s", unitInfo.getDescription()) continue for city in PlayerUtil.playerCities(player): if askingPlayer: if not city.isRevealed(eAskingTeam, False): continue if city.canTrain(eUnit, False, not trade): if eUnit in unitsWithBonuses: maybeUnits.add(eUnit) else: units.add(eUnit) break else: if city.canTrain(eUnit, False, False): units.add(eUnit) break BugUtil.debug("%s can train:", player.getName()) for eUnit in units: unitInfo = gc.getUnitInfo(eUnit) BugUtil.debug(" %s", unitInfo.getDescription()) if askingPlayer: BugUtil.debug("%s can maybe train:", player.getName()) for eUnit in maybeUnits: unitInfo = gc.getUnitInfo(eUnit) BugUtil.debug(" %s", unitInfo.getDescription()) return units, maybeUnits else: return units