def calculateInvasionPriority(): "calculates the demand for troop ships by opponent planets" global allottedInvasionTargets troopsPerPod=2 empire=fo.getEmpire() if foAI.foAIstate.aggression==fo.aggression.beginner and fo.currentTurn()<150: return 0 allottedInvasionTargets = 1+ int(fo.currentTurn()/25) totalVal= sum( [pscore for pid, pscore, trp in AIstate.invasionTargets[:allottedInvasionTargets] ] ) troopsNeeded= sum( [(trp+4) for pid, pscore, trp in AIstate.invasionTargets[:allottedInvasionTargets] ] ) if totalVal == 0: return 0 opponentTroopPods = int(troopsNeeded/troopsPerPod) productionQueue = empire.productionQueue queuedTroopPods=0 for queue_index in range(0, len(productionQueue)): element=productionQueue[queue_index] if element.buildType == AIEmpireProductionTypes.BT_SHIP: if foAI.foAIstate.getShipRole(element.designID) in [ AIShipRoleType.SHIP_ROLE_MILITARY_INVASION, AIShipRoleType.SHIP_ROLE_BASE_INVASION] : design = fo.getShipDesign(element.designID) queuedTroopPods += element.remaining*element.blocksize * list(design.parts).count("GT_TROOP_POD") bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_INVASION) if bestDesign: troopsPerBestShip = troopsPerPod*( list(bestDesign.parts).count("GT_TROOP_POD") ) else: troopsPerBestShip=troopsPerPod #may actually not have any troopers available, but this num will do for now #don't cound troop bases here since if through misplanning cannot be used where made, cannot be redeployed #troopFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) + FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ORBITAL_INVASION) troopFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) numTroopPods = sum([ FleetUtilsAI.countPartsFleetwide(fleetID, ["GT_TROOP_POD"]) for fleetID in troopFleetIDs]) troopShipsNeeded = math.ceil((opponentTroopPods - (numTroopPods+ queuedTroopPods ))/troopsPerBestShip) #invasionPriority = max( 10+ 200*max(0, troopShipsNeeded ) , int(0.1* totalVal) ) invasionPriority = 20+ 120*max(0, troopShipsNeeded ) if invasionPriority < 0: return 0 if foAI.foAIstate.aggression==fo.aggression.beginner: return 0.5* invasionPriority else: return invasionPriority
def calculateInvasionPriority(): "calculates the demand for troop ships by opponent planets" empire=fo.getEmpire() numOpponentPlanetIDs = len(AIstate.opponentPlanetIDs) if numOpponentPlanetIDs == 0: return 10 #hsould always have at least a low lvl of production going into fleets opponentTroopPods = sum( [math.ceil((ptroops+1)/5) for sid, pscore, ptroops in AIstate.invasionTargets] ) productionQueue = empire.productionQueue queuedTroopPods=0 for queue_index in range(0, len(productionQueue)): element=productionQueue[queue_index] if element.buildType == AIEmpireProductionTypes.BT_SHIP: if foAI.foAIstate.getShipRole(element.designID) == AIShipRoleType.SHIP_ROLE_MILITARY_INVASION: design = fo.getShipDesign(element.designID) queuedTroopPods += element.remaining*element.blocksize * list(design.parts).count("GT_TROOP_POD") bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_INVASION) if bestDesign: troopsPerBestShip = 2*( list(bestDesign.parts).count("GT_TROOP_POD") ) else: troopsPerBestShip=2 #may actually not have any troopers available, but this num will do for now troopFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) numTroopPods = sum([ FleetUtilsAI.countPartsFleetwide(fleetID, ["GT_TROOP_POD"]) for fleetID in FleetUtilsAI.extractFleetIDsWithoutMissionTypes(troopFleetIDs)]) troopShipsNeeded = math.ceil((opponentTroopPods - (numTroopPods+ queuedTroopPods ))/troopsPerBestShip) #milFleetEquiv= math.ceil( MilitaryAI.totMilRating / curBestMilShipRating() ) #troopShipsNeeded = min( troopShipsNeeded , math.floor( milFleetEquiv / 2) - myTroopShips) # stale calcs to limit troops priority relative to current tot mil rating invasionPriority = 10+ 200*max(0, troopShipsNeeded ) # print "" # print "Number of Troop Ships Without Missions: " + str(numTroopShips) # print "Number of Opponent Planets: " + str(numOpponentPlanetIDs) # print "Priority for Troop Ships : " + str(invasionPriority) print "Invasion Priority Calc: Opponent TroopsPods: %d , my queued Pods: %d, my fleet troop pods: %d -- priority %d"%(opponentTroopPods, queuedTroopPods, numTroopPods, invasionPriority) if invasionPriority < 0: return 0 return invasionPriority
def sendInvasionFleets(invasionFleetIDs, evaluatedPlanets, missionType): "sends a list of invasion fleets to a list of planet_value_pairs" universe=fo.getUniverse() invasionPool = invasionFleetIDs[:] #need to make a copy bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_INVASION) if bestDesign: troopsPerBestShip = 2*( list(bestDesign.parts).count("GT_TROOP_POD") ) else: troopsPerBestShip=5 #may actually not have any troopers available, but this num will do for now #sortedTargets=sorted( [ ( pscore-ptroops/2 , pID, pscore, ptroops) for pID, pscore, ptroops in evaluatedPlanets ] , reverse=True) invasionPool=set(invasionPool) for pID, pscore, ptroops in evaluatedPlanets: # if not invasionPool: return planet=universe.getPlanet(pID) if not planet: continue sysID = planet.systemID foundFleets = [] podsNeeded= int(math.ceil( (ptroops+1.1)/2.0)+0.0001) foundStats={} minStats= {'rating':0, 'troopPods':podsNeeded} targetStats={'rating':10,'troopPods':podsNeeded+2} theseFleets = FleetUtilsAI.getFleetsForMission(1, targetStats , minStats, foundStats, "", systemsToCheck=[sysID], systemsChecked=[], fleetPoolSet=invasionPool, fleetList=foundFleets, verbose=False) if theseFleets == []: if not FleetUtilsAI.statsMeetReqs(foundStats, minStats): print "Insufficient invasion troop allocation for system %d ( %s ) -- requested %s , found %s"%(sysID, universe.getSystem(sysID).name, minStats, foundStats) invasionPool.update( foundFleets ) continue else: theseFleets = foundFleets aiTarget = AITarget.AITarget(AITargetType.TARGET_PLANET, pID) print "assigning invasion fleets %s to target %s"%(theseFleets, aiTarget) for fleetID in theseFleets: fleet=universe.getFleet(fleetID) aiFleetMission = foAI.foAIstate.getAIFleetMission(fleetID) aiFleetMission.clearAIFleetOrders() aiFleetMission.clearAITargets( (aiFleetMission.getAIMissionTypes() + [-1])[0] ) aiFleetMission.addAITarget(missionType, aiTarget)