From: <geo...@us...> - 2009-05-13 07:52:10
|
Revision: 3036 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3036&view=rev Author: geoffthemedio Date: 2009-05-13 07:52:00 +0000 (Wed, 13 May 2009) Log Message: ----------- AI patch by OndrejR Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/ExplorationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/MoveUtilsAI.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2009-05-12 04:21:32 UTC (rev 3035) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2009-05-13 07:52:00 UTC (rev 3036) @@ -111,7 +111,9 @@ result = "" for aiFleetMissionType in self.getAIFleetMissionTypes(): - targetsString = "fleet:" + str(self.getFleetID()) + "[" + str(aiFleetMissionType) + "]:" + universe = fo.getUniverse() + fleet = universe.getFleet(self.getFleetID()) + targetsString = "fleet name:" + fleet.name + " id:"+ str(self.getFleetID()) + "[" + str(aiFleetMissionType) + "]:" targets = self.getAITargets(aiFleetMissionType) for target in targets: targetsString = targetsString + str(target) @@ -247,7 +249,20 @@ for aiFleetOrder in aiFleetOrdersToVisitSystems: self.appendAIFleetOrder(aiFleetOrder) + + def getLocationAITarget(self): + "system AITarget where fleet is or will be" + # TODO add parameter turn + universe = fo.getUniverse() + fleet = universe.getFleet(self.getFleetID()) + systemID = fleet.systemID + if systemID >=0: + return AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID) + else: + return AITarget.AITarget(AITargetType.TARGET_SYSTEM, fleet.nextSystemID) + + def getFleetIDsFromAIFleetMissions(aiFleetMissions): result = [] for aiFleetMission in aiFleetMissions: Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2009-05-12 04:21:32 UTC (rev 3035) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2009-05-13 07:52:00 UTC (rev 3036) @@ -3,6 +3,7 @@ import FleetUtilsAI from EnumsAI import AIFleetMissionType, AIExplorableSystemType, AITargetType import AITarget +import MoveUtilsAI def assignScoutsToExploreSystems(): # TODO: use Graph Theory to explore closest systems @@ -24,9 +25,10 @@ if foAI.foAIstate.hasAITarget(AIFleetMissionType.FLEET_MISSION_EXPLORATION, aiTarget): continue - # add exploration mission to fleet with target unexplored system - aiFleetMission.addAITarget(AIFleetMissionType.FLEET_MISSION_EXPLORATION, aiTarget) - break + # add exploration mission to fleet with target unexplored system and this system is in range + if len(MoveUtilsAI.canTravelToSystemAndReturnToResupply(fleetID, aiFleetMission.getLocationAITarget(), aiTarget, fo.empireID())) > 0: + aiFleetMission.addAITarget(AIFleetMissionType.FLEET_MISSION_EXPLORATION, aiTarget) + break def getHomeSystemID(): "returns the systemID of the home world" Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2009-05-12 04:21:32 UTC (rev 3035) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2009-05-13 07:52:00 UTC (rev 3036) @@ -175,6 +175,8 @@ def issueAIFleetOrdersForAIFleetMissions(): "issues fleet orders" + print "" + print "issuing fleet orders:" aiFleetMissions = foAI.foAIstate.getAllAIFleetMissions() for aiFleetMission in aiFleetMissions: aiFleetMission.issueAIFleetOrders() Modified: trunk/FreeOrion/default/AI/MoveUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/MoveUtilsAI.py 2009-05-12 04:21:32 UTC (rev 3035) +++ trunk/FreeOrion/default/AI/MoveUtilsAI.py 2009-05-13 07:52:00 UTC (rev 3036) @@ -1,3 +1,4 @@ +import freeOrionAIInterface as fo from EnumsAI import AITargetType, AIFleetOrderType import AITarget import AIFleetOrder @@ -5,10 +6,112 @@ def getAIFleetOrdersFromSystemAITargets(fleetID, aiTargets): result = [] # TODO: use Graph Theory to construct move orders - # TODO: take fuel into account - fleetAITarget = AITarget.AITarget(AITargetType.TARGET_FLEET, fleetID) + # TODO: add priority + fleetAITarget = AITarget.AITarget(AITargetType.TARGET_FLEET, fleetID) + empireID = fo.empireID() + # determine system where fleet will be or where is if is going nowhere + lastSystemAITarget = fleetAITarget.getRequiredSystemAITargets()[0] + # for every system which fleet wanted to visit, determine systems to visit and create move orders for aiTarget in aiTargets: - aiFleetOrder = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_MOVE, fleetAITarget, aiTarget) - result.append(aiFleetOrder) + # determine systems required to visit(with possible return to supplied system) + systemAITargets = canTravelToSystemAndReturnToResupply(fleetID, lastSystemAITarget, aiTarget, empireID) + if len(systemAITargets) > 0: + # for every system required to visit create move order + for systemAITarget in systemAITargets: + # remember last system which will be visited + lastSystemAITarget = systemAITarget + # create move order + aiFleetOrder = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_MOVE, fleetAITarget, systemAITarget) + result.append(aiFleetOrder) + else: + print "fleetID: " + str(fleetID) + " can't travel to target:" + str(aiTarget) return result + +def canTravelToSystemAndReturnToResupply(fleetID, fromSystemAITarget, toSystemAITarget, empireID): + "check if fleet can travel from starting system to wanted system" + + systemAITargets = [] + if not fromSystemAITarget.getTargetID() == toSystemAITarget.getTargetID: + # get supplyable systems + empire = fo.getEmpire() + fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs + # get current fuel and max fuel + universe = fo.getUniverse() + fleet = universe.getFleet(fleetID) + maxFuel = int(fleet.maxFuel) + fuel = int(fleet.fuel) + + # try to find path without going resupply first + supplySystemID = getNearestSuppliedSystem(toSystemAITarget.getTargetID(), empireID) + systemAITargets = __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, systemAITargets, fleetSupplyableSystemIDs, maxFuel, fuel, supplySystemID) + # resupply in system first is required to find path + if not(fromSystemAITarget.getTargetID() in fleetSupplyableSystemIDs) and len(systemAITargets)==0: + # add supply system to visit + supplySystemID = getNearestSuppliedSystem(fromSystemAITarget.getTargetID(), empireID) + fromSystemAITarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, supplySystemID) + systemAITargets.append(fromSystemAITarget) + # find path from supplied system to wanted system + supplySystemID = getNearestSuppliedSystem(toSystemAITarget.getTargetID(), empireID) + systemAITargets = __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, systemAITargets, fleetSupplyableSystemIDs, maxFuel, maxFuel, supplySystemID) + + return systemAITargets + +def getNearestSuppliedSystem(startSystemID, empireID): + "returns systemID of nearest supplied system from starting system startSystemID" + + empire = fo.getEmpire() + fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs + universe = fo.getUniverse() + + if startSystemID in fleetSupplyableSystemIDs: + return startSystemID + else: + minJumps = 9999 # infinity + supplySystemID = -1 + for systemID in fleetSupplyableSystemIDs: + leastJumpsPath = universe.leastJumpsPath(startSystemID, systemID, empireID) + if len(leastJumpsPath) < minJumps: + minJumps = len(leastJumpsPath) + supplySystemID = systemID + + return supplySystemID + +def __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, resultSystemAITargets, fleetSupplyableSystemIDs, maxFuel, fuel, supplySystemID): + "returns system AITargets required to visit with fuel to nearest supplied system" + + result = True + # try to find if there is possible path to wanted system from system + universe = fo.getUniverse() + leastJumpsPath = universe.leastJumpsPath(fromSystemAITarget.getTargetID(), toSystemAITarget.getTargetID(), empireID) + fromSystemID = fromSystemAITarget.getTargetID() + for systemID in leastJumpsPath: + if not fromSystemID == systemID: + if fromSystemID in fleetSupplyableSystemIDs: + # from supplied system fleet can travel without fuel consumption and also in this system refuels + fuel = maxFuel + # too long paths tends to be out of range although it is valid path. It is caused by leastJumpsPath + if not systemID == toSystemAITarget.getTargetID(): + resultSystemAITargets.append(AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID)) + else: + fuel = fuel - 1 + + if fuel < 0: + result = False + + fromSystemID = systemID + # if there is path to wanted system, then also if there is path back to supplyable system + if result == True: + # jump from A to B means leastJumpsPath=[A,B], but minJumps=1 + minJumps = len(universe.leastJumpsPath(toSystemAITarget.getTargetID(), supplySystemID, empireID)) - 1 + + if minJumps > fuel: + # print "fleetID:" + str(fleetID) + " fuel:" + str(fuel) + " required: " + str(minJumps) + result = False + else: + resultSystemAITargets.append(toSystemAITarget) + + if result == False: + resultSystemAITargets = [] + + return resultSystemAITargets |
From: <geo...@us...> - 2009-05-13 23:16:34
|
Revision: 3039 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3039&view=rev Author: geoffthemedio Date: 2009-05-13 23:16:28 +0000 (Wed, 13 May 2009) Log Message: ----------- AI patch by OndrejR: -if fleet has nothing to do, then it returns to supplied system -fixed problem traveling to unknown system through enemy system -initial Research AI - AI researches cheapest technology Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/AIFleetOrder.py trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/MoveUtilsAI.py Added Paths: ----------- trunk/FreeOrion/default/AI/ResearchAI.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2009-05-13 10:44:19 UTC (rev 3038) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2009-05-13 23:16:28 UTC (rev 3039) @@ -210,7 +210,7 @@ ordersInSystemCompleted = True for aiFleetOrder in self.getAIFleetOrders(): if aiFleetOrder.canIssueOrder(): - print "issuing AIFleetOrders: " + str(aiFleetOrder) + print " " + str(aiFleetOrder) if aiFleetOrder.getAIFleetOrderType() == AIFleetOrderType.ORDER_MOVE and ordersInSystemCompleted: aiFleetOrder.issueOrder() elif aiFleetOrder.getAIFleetOrderType() != AIFleetOrderType.ORDER_MOVE: @@ -229,7 +229,7 @@ self.clearAIFleetOrders() # for some targets fleet has to visit systems and therefore fleet visit them systemAITargets = self.__getRequiredToVisitSystemAITargets() - aiFleetOrdersToVisitSystems = MoveUtilsAI.getAIFleetOrdersFromSystemAITargets(self.getFleetID(), systemAITargets) + aiFleetOrdersToVisitSystems = MoveUtilsAI.getAIFleetOrdersFromSystemAITargets(self.getFleetAITarget(), systemAITargets) # if fleet is in some system = fleet.systemID >=0, then also generate system AIFleetOrders universe = fo.getUniverse() @@ -240,16 +240,30 @@ systemAITarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID) # if mission aiTarget has required system where fleet is, then generate aiFleetOrder from this aiTarget aiMissionTypes = self.getAIFleetMissionTypes() + # for all targets in all mission types get required systems to visit for aiFleetMissionType in aiMissionTypes: aiTargets = self.getAITargets(aiFleetMissionType) for aiTarget in aiTargets: if systemAITarget in aiTarget.getRequiredSystemAITargets(): + # from target required to visit get fleet orders to accomplish target aiFleetOrder = self.__getAIFleetOrderFromAITarget(aiFleetMissionType, aiTarget) self.appendAIFleetOrder(aiFleetOrder) for aiFleetOrder in aiFleetOrdersToVisitSystems: self.appendAIFleetOrder(aiFleetOrder) + # if fleet don't have any mission, then resupply if is current location not in supplyable system + empire = fo.getEmpire() + fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs + if (not self.hasAnyAIFleetMissionTypes()) and not(self.getLocationAITarget().getTargetID() in fleetSupplyableSystemIDs): + resupplyAIFleetOrder = MoveUtilsAI.getResupplyAIFleetOrder(self.getFleetAITarget(), self.getLocationAITarget()) + self.appendAIFleetOrder(resupplyAIFleetOrder) + + def getFleetAITarget(self): + "return fleets AITarget" + + return AITarget.AITarget(AITargetType.TARGET_FLEET, self.getFleetID()) + def getLocationAITarget(self): "system AITarget where fleet is or will be" # TODO add parameter turn Modified: trunk/FreeOrion/default/AI/AIFleetOrder.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetOrder.py 2009-05-13 10:44:19 UTC (rev 3038) +++ trunk/FreeOrion/default/AI/AIFleetOrder.py 2009-05-13 23:16:28 UTC (rev 3039) @@ -79,6 +79,17 @@ # move to system if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType(): targetAITargetTypeValid = True + # resupply + elif AIFleetOrderType.ORDER_RESUPPLY == self.getAIFleetOrderType(): + # with fleet + if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + sourceAITargetTypeValid = True + # move to system + if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType(): + empire = fo.getEmpire() + fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs + if (self.getTargetAITarget().getTargetID() in fleetSupplyableSystemIDs): + targetAITargetTypeValid = True # split fleet elif AIFleetOrderType.ORDER_SPLIT_FLEET == self.getAIFleetOrderType(): # with fleet @@ -147,8 +158,8 @@ shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION) fo.issueColonizeOrder(shipID, self.getTargetAITarget().getTargetID()) - # move - elif AIFleetOrderType.ORDER_MOVE == self.getAIFleetOrderType(): + # move or resupply + elif (AIFleetOrderType.ORDER_MOVE == self.getAIFleetOrderType()) or (AIFleetOrderType.ORDER_RESUPPLY == self.getAIFleetOrderType()): fleetID = self.getSourceAITarget().getTargetID() systemID = self.getTargetAITarget().getTargetID() Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2009-05-13 10:44:19 UTC (rev 3038) +++ trunk/FreeOrion/default/AI/AIstate.py 2009-05-13 23:16:28 UTC (rev 3039) @@ -12,8 +12,6 @@ class AIstate(object): "stores AI game state" - # def endTurn - # - def getLostFleets (save fleets last turn, look if still there) # => from AI interface SITREP? @@ -58,6 +56,12 @@ self.__cleanFleetRoles() self.__cleanAIFleetMissions(fleetIDs) + + def afterTurnCleanup(self): + "removes not required information to save from AI state after AI complete its turn" + + # some ships in fleet can be destroyed between turns and then fleet may have have different roles + self.__fleetRoleByID = {} def __hasAIFleetMission(self, fleetID): "returns True if fleetID has AIFleetMission" @@ -189,7 +193,7 @@ del self.__fleetRoleByID[fleetID] return - print "Fleet ID " + str(fleetID) + " not found." + #print "Fleet ID " + str(fleetID) + " not found." def __cleanFleetRoles(self): "removes fleetRoles if a fleet has been lost" Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2009-05-13 10:44:19 UTC (rev 3038) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2009-05-13 23:16:28 UTC (rev 3039) @@ -55,9 +55,9 @@ class AIFleetMissionType(object): - FLEET_MISSION_INVALID = -1 + FLEET_MISSION_INVALID = -1 FLEET_MISSION_EXPLORATION = 0 - FLEET_MISSION_COLONISATION = 1 + FLEET_MISSION_COLONISATION = 1 FLEET_MISSION_SPLIT_FLEET = 2 FLEET_MISSION_MERGE_FLEET = 3 FLEET_MISSION_HIT_AND_RUN = 4 @@ -72,14 +72,15 @@ class AIFleetOrderType(object): ORDER_INVALID = -1 ORDER_MOVE = 0 - ORDER_SPLIT_FLEET = 1 - ORDER_MERGE_FLEET = 2 - ORDER_COLONISE = 3 - ORDER_ATACK = 4 - ORDER_DEFEND = 5 + ORDER_RESUPPLY = 1 + ORDER_SPLIT_FLEET = 2 + ORDER_MERGE_FLEET = 3 + ORDER_COLONISE = 4 + ORDER_ATACK = 5 + ORDER_DEFEND = 6 def getAIFleetOrderTypes(): - return __getInterval(0, 5) + return __getInterval(0, 6) class AIShipRoleType(object): @@ -108,3 +109,26 @@ def getAITargetTypes(): return __getInterval(0, 7) + + +class AIProductionDemandType(object): + PRODUCTION_DEMAND_INVALID = -1 + PRODUCTION_DEMAND_SHIP = 0 + PRODUCTION_DEMAND_BUILDING = 1 + +def getAIProductionDemandTypes(): + return __getInterval(0, 1) + + +class AIProductionRequirementType(object): + PRODUCTION_REQUIREMENT_INVALID = -1 + PRODUCTION_REQUIREMENT_MINERALS_POINTS = 0 + PRODUCTION_REQUIREMENT_FOOD_POINTS = 1 + PRODUCTION_REQUIREMENT_RESEARCH_POINTS = 2 + PRODUCTION_REQUIREMENT_TRADE_POINTS = 3 + PRODUCTION_REQUIREMENT_PRODUCTION_POINTS = 4 + PRODUCTION_REQUIREMENT_MINIMUM_TURNS = 5 + PRODUCTION_REQUIREMENT_MINIMUM_SHIPYARDS = 6 + +def getAIProductionRequirementTypes(): + return __getInterval(0, 6) Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2009-05-13 10:44:19 UTC (rev 3038) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2009-05-13 23:16:28 UTC (rev 3039) @@ -6,6 +6,7 @@ import ColonisationAI # import TacticsAI import PriorityAI +import ResearchAI # import ProductionAI # AIstate @@ -22,19 +23,25 @@ def startNewGame(): print "New game started" - universe = fo.getUniverse() - # initialize AIstate global foAIstate foAIstate = AIstate.AIstate() print "Initialized foAIstate class" - # split all fleets - for fleetID in universe.fleetIDs: FleetUtilsAI.splitFleet(fleetID) + splitFleet() identifyShipDesigns() identifyFleetsRoles() +def splitFleet(): + "split all fleets" + + # TODO: only after analyzing situation in map can fleet can be split + universe = fo.getUniverse() + for fleetID in universe.fleetIDs: + FleetUtilsAI.splitFleet(fleetID) + # old fleet may have different role after split, later will be again identified + foAIstate.removeFleetRole(fleetID) def identifyShipDesigns(): "identify ship designs" @@ -98,9 +105,11 @@ def generateOrders(): print "" - print "TURN: " + str(fo.currentTurn()) + empire = fo.getEmpire() + print empire.name + " TURN: " + str(fo.currentTurn()) # turn cleanup + splitFleet() identifyShipDesigns() identifyFleetsRoles() foAIstate.clean(ExplorationAI.getHomeSystemID(), FleetUtilsAI.getEmpireFleetIDs()) @@ -116,5 +125,8 @@ # TacticsAI.generateTacticOrders() FleetUtilsAI.generateAIFleetOrdersForAIFleetMissions() FleetUtilsAI.issueAIFleetOrdersForAIFleetMissions() + + ResearchAI.generateResearchOrders() + foAIstate.afterTurnCleanup() fo.doneTurn() Modified: trunk/FreeOrion/default/AI/MoveUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/MoveUtilsAI.py 2009-05-13 10:44:19 UTC (rev 3038) +++ trunk/FreeOrion/default/AI/MoveUtilsAI.py 2009-05-13 23:16:28 UTC (rev 3039) @@ -3,18 +3,17 @@ import AITarget import AIFleetOrder -def getAIFleetOrdersFromSystemAITargets(fleetID, aiTargets): +def getAIFleetOrdersFromSystemAITargets(fleetAITarget, aiTargets): result = [] # TODO: use Graph Theory to construct move orders # TODO: add priority - fleetAITarget = AITarget.AITarget(AITargetType.TARGET_FLEET, fleetID) empireID = fo.empireID() # determine system where fleet will be or where is if is going nowhere lastSystemAITarget = fleetAITarget.getRequiredSystemAITargets()[0] # for every system which fleet wanted to visit, determine systems to visit and create move orders for aiTarget in aiTargets: # determine systems required to visit(with possible return to supplied system) - systemAITargets = canTravelToSystemAndReturnToResupply(fleetID, lastSystemAITarget, aiTarget, empireID) + systemAITargets = canTravelToSystemAndReturnToResupply(fleetAITarget.getTargetID(), lastSystemAITarget, aiTarget, empireID) if len(systemAITargets) > 0: # for every system required to visit create move order for systemAITarget in systemAITargets: @@ -24,7 +23,7 @@ aiFleetOrder = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_MOVE, fleetAITarget, systemAITarget) result.append(aiFleetOrder) else: - print "fleetID: " + str(fleetID) + " can't travel to target:" + str(aiTarget) + print "fleetID: " + str(fleetAITarget.getTargetID()) + " can't travel to target:" + str(aiTarget) return result @@ -90,17 +89,20 @@ if fromSystemID in fleetSupplyableSystemIDs: # from supplied system fleet can travel without fuel consumption and also in this system refuels fuel = maxFuel - # too long paths tends to be out of range although it is valid path. It is caused by leastJumpsPath - if not systemID == toSystemAITarget.getTargetID(): - resultSystemAITargets.append(AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID)) else: fuel = fuel - 1 + # leastJumpPath can differ from shortestPath + # TODO: use Graph Theory to optimize + if (not systemID == toSystemAITarget.getTargetID()) and (systemID in fleetSupplyableSystemIDs): + resultSystemAITargets.append(AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID)) + if fuel < 0: result = False fromSystemID = systemID - # if there is path to wanted system, then also if there is path back to supplyable system + + # if there is path to wanted system, then also if there is path back to supplyable system if result == True: # jump from A to B means leastJumpsPath=[A,B], but minJumps=1 minJumps = len(universe.leastJumpsPath(toSystemAITarget.getTargetID(), supplySystemID, empireID)) - 1 @@ -115,3 +117,16 @@ resultSystemAITargets = [] return resultSystemAITargets + +def getResupplyAIFleetOrder(fleetAITarget, currentSystemAITarget): + "returns resupply AIFleetOrder to nearest supplied system" + + # find nearest supplied system + empireID = fo.empireID() + suppliedSystemID = getNearestSuppliedSystem(currentSystemAITarget.getTargetID(), empireID) + suppliedSystemAITarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, suppliedSystemID) + + # create resupply AIFleetOrder + aiFleetOrder = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_RESUPPLY, fleetAITarget, suppliedSystemAITarget) + + return aiFleetOrder Added: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py (rev 0) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2009-05-13 23:16:28 UTC (rev 3039) @@ -0,0 +1,63 @@ +import freeOrionAIInterface as fo + +def generateResearchOrders(): + "generate research orders" + + print "Research:" + + empire = fo.getEmpire() + availableRP = empire.resourceProduction(fo.resourceType.research) + print "total Research Points: " + str(availableRP) + print "spent Research Points: " + str(totalSpentRP()) + + # get all researchable techs not already queued for research + possibleResearchProjects = getPossibleProjects() + empire = fo.getEmpire() + researchQueue = empire.researchQueue + for element in researchQueue: + possibleResearchProjects.remove(element.tech.name) + + print "projects already in research queue: " + for element in researchQueue: + print " " + element.tech.name + + print "possible new research projects:" + cheapestProject = None + INFINITY = 9999 + cheapestCost = INFINITY + for project in possibleResearchProjects: + tech = fo.getTech(project) + print " " + tech.name + " ["+ tech.category + "] cost:"+ str(tech.researchCost) + + if (cheapestCost > tech.researchCost): + cheapestCost = tech.researchCost + cheapestProject = project + + print "" + if INFINITY > cheapestCost and totalSpentRP() < availableRP: + tech = fo.getTech(cheapestProject) + print "adding new research project: " + tech.name + " to queue" + fo.issueEnqueueTechOrder(cheapestProject,-1) + + print "" + +def getPossibleProjects(): + "get possible projects" + + possibleProjects = [] + technames = fo.techs() + empire = fo.getEmpire() + for techname in technames: + if empire.getTechStatus(techname) == fo.techStatus.researchable: + possibleProjects.append(techname) + + return possibleProjects + +def totalSpentRP(): + "calculate RPs spent this turn so far" + + queue=fo.getEmpire().researchQueue + total = 0 + for element in queue: + total = total + element.allocation + return total |
From: <geo...@us...> - 2009-05-19 23:28:21
|
Revision: 3061 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3061&view=rev Author: geoffthemedio Date: 2009-05-19 23:28:11 +0000 (Tue, 19 May 2009) Log Message: ----------- AI patch by OndrejR Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/AITarget.py trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/MoveUtilsAI.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2009-05-19 12:11:31 UTC (rev 3060) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2009-05-19 23:28:11 UTC (rev 3061) @@ -257,7 +257,8 @@ fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs if (not self.hasAnyAIFleetMissionTypes()) and not(self.getLocationAITarget().getTargetID() in fleetSupplyableSystemIDs): resupplyAIFleetOrder = MoveUtilsAI.getResupplyAIFleetOrder(self.getFleetAITarget(), self.getLocationAITarget()) - self.appendAIFleetOrder(resupplyAIFleetOrder) + if resupplyAIFleetOrder.isValid(): + self.appendAIFleetOrder(resupplyAIFleetOrder) def getFleetAITarget(self): "return fleets AITarget" Modified: trunk/FreeOrion/default/AI/AITarget.py =================================================================== --- trunk/FreeOrion/default/AI/AITarget.py 2009-05-19 12:11:31 UTC (rev 3060) +++ trunk/FreeOrion/default/AI/AITarget.py 2009-05-19 23:28:11 UTC (rev 3061) @@ -1,3 +1,4 @@ +import EnumsAI from EnumsAI import AITargetType import freeOrionAIInterface as fo @@ -68,7 +69,7 @@ def isValid(self): "returns if this object is valid" - if self.getTargetID() == None or self.getAITargetType() == None: + if self.getTargetID() == None or self.getAITargetType() == None or EnumsAI.checkValidity(self.getTargetID()) == False: return False universe = fo.getUniverse() Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2009-05-19 12:11:31 UTC (rev 3060) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2009-05-19 23:28:11 UTC (rev 3061) @@ -1,6 +1,7 @@ def checkValidity(value): + "checks if value is valid" + if (value == None or value < 0): - print "value: " + str(value) + " is not valid" return False return True @@ -132,3 +133,27 @@ def getAIProductionRequirementTypes(): return __getInterval(0, 6) + + +class AIResearchRequirementType(object): + RESEARCH_REQUIREMENT_INVALID = -1 + RESEARCH_REQUIREMENT_THEORY = 0 + RESEARCH_REQUIREMENT_REFIMENT = 1 + RESEARCH_REQUIREMENT_APPLICATION = 2 + RESEARCH_REQUIREMENT_RESEARCH_POINTS = 3 + +def getAIResearchRequirementTypes(): + return __getInterval(0,3) + + +class AIWarTacticsMissionType(object): + WAR_TACTICS_MISSION_INVALID = -1 + WAR_TACTICS_DEFEND_SYSTEM = 0 + WAR_TACTICS_DEFEND_SHIP = 1 + WAR_TACTICS_DEFEND_FLEET = 2 + WAR_TACTICS_MISSION_GET_PLANET = 3 + WAR_TACTICS_MISSION_GET_SYSTEM = 4 + +def getAIWarTacticsMissionType(): + return __getInterval(0, 4) + Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2009-05-19 12:11:31 UTC (rev 3060) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2009-05-19 23:28:11 UTC (rev 3061) @@ -106,7 +106,7 @@ print "" empire = fo.getEmpire() - print empire.name + " TURN: " + str(fo.currentTurn()) + print "EMPIRE: " + empire.name + " TURN: " + str(fo.currentTurn()) # turn cleanup splitFleet() Modified: trunk/FreeOrion/default/AI/MoveUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/MoveUtilsAI.py 2009-05-19 12:11:31 UTC (rev 3060) +++ trunk/FreeOrion/default/AI/MoveUtilsAI.py 2009-05-19 23:28:11 UTC (rev 3061) @@ -42,29 +42,27 @@ fuel = int(fleet.fuel) # try to find path without going resupply first - supplySystemID = getNearestSuppliedSystem(toSystemAITarget.getTargetID(), empireID) - systemAITargets = __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, systemAITargets, fleetSupplyableSystemIDs, maxFuel, fuel, supplySystemID) + supplySystemAITarget = getNearestSuppliedSystem(toSystemAITarget.getTargetID(), empireID) + systemAITargets = __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, systemAITargets, fleetSupplyableSystemIDs, maxFuel, fuel, supplySystemAITarget) # resupply in system first is required to find path if not(fromSystemAITarget.getTargetID() in fleetSupplyableSystemIDs) and len(systemAITargets)==0: # add supply system to visit - supplySystemID = getNearestSuppliedSystem(fromSystemAITarget.getTargetID(), empireID) - fromSystemAITarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, supplySystemID) + fromSystemAITarget = getNearestSuppliedSystem(fromSystemAITarget.getTargetID(), empireID) systemAITargets.append(fromSystemAITarget) # find path from supplied system to wanted system - supplySystemID = getNearestSuppliedSystem(toSystemAITarget.getTargetID(), empireID) - systemAITargets = __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, systemAITargets, fleetSupplyableSystemIDs, maxFuel, maxFuel, supplySystemID) + systemAITargets = __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, systemAITargets, fleetSupplyableSystemIDs, maxFuel, maxFuel, supplySystemAITarget) return systemAITargets def getNearestSuppliedSystem(startSystemID, empireID): - "returns systemID of nearest supplied system from starting system startSystemID" + "returns systemAITarget of nearest supplied system from starting system startSystemID" empire = fo.getEmpire() fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs universe = fo.getUniverse() if startSystemID in fleetSupplyableSystemIDs: - return startSystemID + return AITarget.AITarget(AITargetType.TARGET_SYSTEM, startSystemID) else: minJumps = 9999 # infinity supplySystemID = -1 @@ -74,38 +72,41 @@ minJumps = len(leastJumpsPath) supplySystemID = systemID - return supplySystemID + return AITarget.AITarget(AITargetType.TARGET_SYSTEM, supplySystemID) -def __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, resultSystemAITargets, fleetSupplyableSystemIDs, maxFuel, fuel, supplySystemID): +def __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, resultSystemAITargets, fleetSupplyableSystemIDs, maxFuel, fuel, supplySystemAITarget): "returns system AITargets required to visit with fuel to nearest supplied system" result = True # try to find if there is possible path to wanted system from system - universe = fo.getUniverse() - leastJumpsPath = universe.leastJumpsPath(fromSystemAITarget.getTargetID(), toSystemAITarget.getTargetID(), empireID) - fromSystemID = fromSystemAITarget.getTargetID() - for systemID in leastJumpsPath: - if not fromSystemID == systemID: - if fromSystemID in fleetSupplyableSystemIDs: - # from supplied system fleet can travel without fuel consumption and also in this system refuels - fuel = maxFuel - else: - fuel = fuel - 1 - - # leastJumpPath can differ from shortestPath - # TODO: use Graph Theory to optimize - if (not systemID == toSystemAITarget.getTargetID()) and (systemID in fleetSupplyableSystemIDs): - resultSystemAITargets.append(AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID)) - - if fuel < 0: - result = False - - fromSystemID = systemID + if fromSystemAITarget.isValid() and toSystemAITarget.isValid() and supplySystemAITarget.isValid(): + universe = fo.getUniverse() + leastJumpsPath = universe.leastJumpsPath(fromSystemAITarget.getTargetID(), toSystemAITarget.getTargetID(), empireID) + fromSystemID = fromSystemAITarget.getTargetID() + for systemID in leastJumpsPath: + if not fromSystemID == systemID: + if fromSystemID in fleetSupplyableSystemIDs: + # from supplied system fleet can travel without fuel consumption and also in this system refuels + fuel = maxFuel + else: + fuel = fuel - 1 + + # leastJumpPath can differ from shortestPath + # TODO: use Graph Theory to optimize + if (not systemID == toSystemAITarget.getTargetID()) and (systemID in fleetSupplyableSystemIDs): + resultSystemAITargets.append(AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID)) + + if fuel < 0: + result = False + + fromSystemID = systemID + else: + result = False # if there is path to wanted system, then also if there is path back to supplyable system if result == True: # jump from A to B means leastJumpsPath=[A,B], but minJumps=1 - minJumps = len(universe.leastJumpsPath(toSystemAITarget.getTargetID(), supplySystemID, empireID)) - 1 + minJumps = len(universe.leastJumpsPath(toSystemAITarget.getTargetID(), supplySystemAITarget.getTargetID(), empireID)) - 1 if minJumps > fuel: # print "fleetID:" + str(fleetID) + " fuel:" + str(fuel) + " required: " + str(minJumps) @@ -123,8 +124,7 @@ # find nearest supplied system empireID = fo.empireID() - suppliedSystemID = getNearestSuppliedSystem(currentSystemAITarget.getTargetID(), empireID) - suppliedSystemAITarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, suppliedSystemID) + suppliedSystemAITarget = getNearestSuppliedSystem(currentSystemAITarget.getTargetID(), empireID) # create resupply AIFleetOrder aiFleetOrder = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_RESUPPLY, fleetAITarget, suppliedSystemAITarget) |
From: <on...@us...> - 2009-09-02 13:16:32
|
Revision: 3136 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3136&view=rev Author: ondrejr Date: 2009-09-02 13:16:22 +0000 (Wed, 02 Sep 2009) Log Message: ----------- -Added possibility to AI to implement distinguish between fleet, empire and alliance conflict. Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/AIFleetOrder.py trunk/FreeOrion/default/AI/AITarget.py trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/ExplorationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/MoveUtilsAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py Added Paths: ----------- trunk/FreeOrion/default/AI/AIAbstractMission.py trunk/FreeOrion/default/AI/AIEmpireWarMission.py trunk/FreeOrion/default/AI/PlanetUtilsAI.py Removed Paths: ------------- trunk/FreeOrion/default/AI/PlanetUtilAI.py Added: trunk/FreeOrion/default/AI/AIAbstractMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIAbstractMission.py (rev 0) +++ trunk/FreeOrion/default/AI/AIAbstractMission.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -0,0 +1,133 @@ +from AITarget import AITarget +import EnumsAI +from EnumsAI import AIMissionType + +class AIAbstractMission(object): + "" + + def __init__(self, aiMissionType, aiTargetType, aiTargetID): + "constructor" + + aiTarget = AITarget(aiTargetType, aiTargetID) + self.__aiTarget = aiTarget + self.__aiMissionType = aiMissionType + + self.__aiMissionTypes = {} + for __aiMissionType in self.getAnyAIMissionTypes(): + self.__aiMissionTypes[__aiMissionType] = [] + + def getAITarget(self): + "return mission AITarget" + + return self.__aiTarget + + def getAITargetID(self): + "return id" + + return self.getAITarget().getTargetID() + + def getAITargetType(self): + "return mission AITargetType" + + return self.getAITarget().getAITargetType() + + def getAIMissionType(self): + "return AIMissionType" + + return self.__aiMissionType + + def getAnyAIMissionTypes(self): + "return types of mission" + + if AIMissionType.FLEET_MISSION == self.getAIMissionType(): + return EnumsAI.getAIFleetMissionTypes() + elif AIMissionType.EMPIRE_WAR_MISSION == self.getAIMissionType(): + return EnumsAI.getAIEmpireWarMissionTypes() + + return NotImplemented + + def addAITarget(self, aiMissionType, aiTarget): + targets = self.getAITargets(aiMissionType) + if not targets.__contains__(aiTarget): + targets.append(aiTarget) + + def removeAITarget(self, aiMissionType, aiTarget): + targets = self.getAITargets(aiMissionType) + if targets.__contains__(aiTarget): + result = [] + for target in targets: + if aiTarget.__cmp__(target) != 0: + result.append(target) + self.__aiMissionTypes[aiMissionType] = result + + del aiTarget + + def clearAITargets(self, aiMissionType): + aiTargets = self.getAITargets(aiMissionType) + for aiTarget in aiTargets: + self.removeAITarget(aiMissionType, aiTarget) + + def getAITargets(self, aiMissionType): + "getter" + + return self.__aiMissionTypes[aiMissionType] + + def hasTarget(self, aiMissionType, aiTarget): + targets = self.getAITargets(aiMissionType) + for target in targets: + if target.__eq__(aiTarget): + return True + return False + + def getAIMissionTypes(self): + result = [] + for aiMissionType in self.getAnyAIMissionTypes(): + aiTargets = self.getAITargets(aiMissionType) + if len(aiTargets) > 0: + result.append(aiMissionType) + + return result + + def hasAnyAIMissionTypes(self): + aiMissionTypes = self.getAIMissionTypes() + if len(aiMissionTypes) > 0: + return True + return False + + def hasAnyOfAIMissionTypes(self, wantedAIMissionTypes): + aiMissionTypes = self.getAIMissionTypes() + + for wantedAIMissionType in wantedAIMissionTypes: + if wantedAIMissionType in aiMissionTypes: + return True + return False + + def __cmp__(self, other): + "compares AIMissions" + + if other == None: + return False + if self.getAITargetID() == other.getAITargetID(): + return True + return False + + def __eq__(self, other): + "returns equal to other object" + + if other == None: + return False + if self.getAIMissionType() == other.getAIMissionType() and self.getAITargetType() == self.getAITargetType(): + return self.__cmp__(other) == 0 + + print "NOT IMPLEMENTED\n" + return NotImplemented + + def __ne__(self, other): + "returns not equal to other object" + + result = self.__eq__(other) + if result is NotImplemented: + return result + + print "NOT IMPLEMENTED\n" + return not result Property changes on: trunk/FreeOrion/default/AI/AIAbstractMission.py ___________________________________________________________________ Added: svn:mime-type + text/plain Added: trunk/FreeOrion/default/AI/AIEmpireWarMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIEmpireWarMission.py (rev 0) +++ trunk/FreeOrion/default/AI/AIEmpireWarMission.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -0,0 +1,13 @@ +from AIAbstractMission import AIAbstractMission +from EnumsAI import AITargetType, AIMissionType + +class AIEmpireWarMission(AIAbstractMission): + "Stores information about how to achieve war objectives of the empire via war" + + def __init__(self, empireID): + "constructor" + + AIAbstractMission.__init__(self, AIMissionType.EMPIRE_WAR_MISSION, AITargetType.TARGET_EMPIRE, empireID) + + + Property changes on: trunk/FreeOrion/default/AI/AIEmpireWarMission.py ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -1,180 +1,90 @@ -import EnumsAI -from EnumsAI import AIFleetOrderType, AIFleetMissionType, AITargetType +from EnumsAI import AIFleetOrderType, AIFleetMissionType, AITargetType, AIMissionType import MoveUtilsAI import AITarget import AIFleetOrder import freeOrionAIInterface as fo +from AIAbstractMission import AIAbstractMission -class AIFleetMission(object): +class AIFleetMission(AIAbstractMission): ''' Stores information about AI mission. Every mission has fleetID and AI targets depending upon AI fleet mission type. ''' - + def __init__(self, fleetID): "constructor" - - self.__fleetID = fleetID - self.__aiFleetOrders = [] - self.__aiFleetMissionTypes = {} - for aiFleetMissionType in EnumsAI.getAIFleetMissionTypes(): - self.__aiFleetMissionTypes[aiFleetMissionType] = [] - - def getFleetID(self): - "getter" - - return self.__fleetID - - def addAITarget(self, aiFleetMissionType, aiTarget): - targets = self.getAITargets(aiFleetMissionType) - if not targets.__contains__(aiTarget): - targets.append(aiTarget) - - def removeAITarget(self, aiFleetMissionType, aiTarget): - targets = self.getAITargets(aiFleetMissionType) - if targets.__contains__(aiTarget): - result = [] - for target in targets: - if aiTarget.__cmp__(target) !=0: - result.append(target) - self.__aiFleetMissionTypes[aiFleetMissionType] = result - - del aiTarget - - def clearAITargets(self, aiFleetMissionType): - aiTargets = self.getAITargets(aiFleetMissionType) - for aiTarget in aiTargets: - self.removeAITarget(aiFleetMissionType, aiTarget) - - def getAITargets(self, aiFleetMissionType): - "getter" - - return self.__aiFleetMissionTypes[aiFleetMissionType] - - def hasTarget(self, aiFleetMissionType, aiTarget): - targets = self.getAITargets(aiFleetMissionType) - for target in targets: - if target.__eq__(aiTarget): - return True - return False - - def getAIFleetMissionTypes(self): - result = [] - for aiFleetMissionType in EnumsAI.getAIFleetMissionTypes(): - aiTargets = self.getAITargets(aiFleetMissionType) - if len(aiTargets) > 0: - result.append(aiFleetMissionType) - - return result - - def hasAnyAIFleetMissionTypes(self): - aiFleetMissionTypes = self.getAIFleetMissionTypes() - if len(aiFleetMissionTypes) > 0: - return True - return False - - def hasAnyOfAIFleetMissionTypes(self, wantedAIFleetMissionTypes): - aiFleetMissionTypes = self.getAIFleetMissionTypes() - - for wantedAIFleetMissionType in wantedAIFleetMissionTypes: - if wantedAIFleetMissionType in aiFleetMissionTypes: - return True - return False - - def __cmp__(self, other): - "compares AIFleetMissions" - - if other == None: - return False - if self.getFleetID() == other.getFleetID(): - return True - return False - - def __eq__(self, other): - "returns equal to other object" - - if other == None: - return False - if isinstance(other, AIFleetMission): - return self.__cmp__(other) == 0 - return NotImplemented - - def __ne__(self, other): - "returns not equal to other object" - - result = self.__eq__(other) - if result is NotImplemented: - return result - return not result - + + AIAbstractMission.__init__(self, AIMissionType.FLEET_MISSION, AITargetType.TARGET_FLEET, fleetID) + self.__aiFleetOrders = [] + def __str__(self): "returns describing string" - + result = "" - for aiFleetMissionType in self.getAIFleetMissionTypes(): + for aiFleetMissionType in self.getAIMissionTypes(): universe = fo.getUniverse() - fleet = universe.getFleet(self.getFleetID()) - targetsString = "fleet name:" + fleet.name + " id:"+ str(self.getFleetID()) + "[" + str(aiFleetMissionType) + "]:" + fleet = universe.getFleet(self.getAITargetID()) + targetsString = "fleet name:" + fleet.name + " id:" + str(self.getAITargetID()) + "[" + str(aiFleetMissionType) + "]:" targets = self.getAITargets(aiFleetMissionType) for target in targets: - targetsString = targetsString + str(target) + targetsString = targetsString + str(target) result = result + targetsString + "\n" return result - + def __getRequiredToVisitSystemAITargets(self): "returns all system AITargets required to visit in this object" - + result = [] - for aiFleetMissionType in self.getAIFleetMissionTypes(): + for aiFleetMissionType in self.getAIMissionTypes(): aiTargets = self.getAITargets(aiFleetMissionType) for aiTarget in aiTargets: result.extend(aiTarget.getRequiredSystemAITargets()) - + return result - + def getVisitingSystemAITargets(self): "returns all system AITargets which will be visited" - + result = [] for aiFleetOrder in self.getAIFleetOrders(): if aiFleetOrder.getAIFleetOrderType() == AIFleetOrderType.ORDER_MOVE: result.append(aiFleetOrder.getTargetAITarget()) return result - + def getAIFleetOrders(self): return self.__aiFleetOrders - + def appendAIFleetOrder(self, aiFleetOrder): self.__aiFleetOrders.append(aiFleetOrder) - + def hasAIFleetOrder(self, aiFleetOrder): aiFleetOrders = self.getAIFleetOrders() return aiFleetOrders.__contains__(aiFleetOrder) - + def removeAIFleetOrder(self, aiFleetOrder): result = [] - for fleetOrder in self.__aiFleetOrders: + for fleetOrder in self.__aiFleetOrders: if fleetOrder.__cmp__(aiFleetOrder) != 0: result.append(fleetOrder) self.__aiFleetOrders = result - + del aiFleetOrder - + def clearAIFleetOrders(self): self.__aiFleetOrders = [] - + def __getAIFleetOrderFromAITarget(self, aiFleetMissionType, aiTarget): result = None - fleetAITarget = AITarget.AITarget(AITargetType.TARGET_FLEET, self.getFleetID()) + fleetAITarget = AITarget.AITarget(AITargetType.TARGET_FLEET, self.getAITargetID()) if aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_COLONISATION: result = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_COLONISE, fleetAITarget, aiTarget) # TODO: implement other mission types - + return result - + def isValidFleetMissionAITarget(self, aiFleetMissionType, aiTarget): if aiTarget.isValid() == False: return False - + if aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_EXPLORATION: if aiTarget.getAITargetType() == AITargetType.TARGET_SYSTEM: empire = fo.getEmpire() @@ -182,30 +92,30 @@ return True elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_COLONISATION: universe = fo.getUniverse() - fleet = universe.getFleet(self.getFleetID()) + fleet = universe.getFleet(self.getAITargetID()) if not fleet.hasColonyShips: return False - if aiTarget.getAITargetType() == AITargetType.TARGET_PLANET: + if aiTarget.getAITargetType() == AITargetType.TARGET_PLANET: planet = universe.getPlanet(aiTarget.getTargetID()) if planet.unowned: return True - + # TODO: implement other mission types return False - + def cleanInvalidAITargets(self): "clean invalid AITargets" - - allAIFleetMissionTypes = self.getAIFleetMissionTypes() + + allAIFleetMissionTypes = self.getAIMissionTypes() for aiFleetMissionType in allAIFleetMissionTypes: allAITargets = self.getAITargets(aiFleetMissionType) for aiTarget in allAITargets: if not self.isValidFleetMissionAITarget(aiFleetMissionType, aiTarget): self.removeAITarget(aiFleetMissionType, aiTarget) - + def issueAIFleetOrders(self): "issues AIFleetOrders which can be issued in system and moves to next one if is possible" - + # TODO: priority ordersInSystemCompleted = True for aiFleetOrder in self.getAIFleetOrders(): @@ -221,25 +131,25 @@ # move order is also the last order in system if aiFleetOrder.getAIFleetOrderType() == AIFleetOrderType.ORDER_MOVE: break - + def generateAIFleetOrders(self): "generates AIFleetOrders from fleets targets to accomplish" - + # TODO: priority self.clearAIFleetOrders() # for some targets fleet has to visit systems and therefore fleet visit them systemAITargets = self.__getRequiredToVisitSystemAITargets() - aiFleetOrdersToVisitSystems = MoveUtilsAI.getAIFleetOrdersFromSystemAITargets(self.getFleetAITarget(), systemAITargets) - + aiFleetOrdersToVisitSystems = MoveUtilsAI.getAIFleetOrdersFromSystemAITargets(self.getAITarget(), systemAITargets) + # if fleet is in some system = fleet.systemID >=0, then also generate system AIFleetOrders universe = fo.getUniverse() - fleet = universe.getFleet(self.getFleetID()) - systemID = fleet.systemID - if systemID >=0: + fleet = universe.getFleet(self.getAITargetID()) + systemID = fleet.systemID + if systemID >= 0: # system in where fleet is systemAITarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID) # if mission aiTarget has required system where fleet is, then generate aiFleetOrder from this aiTarget - aiMissionTypes = self.getAIFleetMissionTypes() + aiMissionTypes = self.getAIMissionTypes() # for all targets in all mission types get required systems to visit for aiFleetMissionType in aiMissionTypes: aiTargets = self.getAITargets(aiFleetMissionType) @@ -248,39 +158,34 @@ # from target required to visit get fleet orders to accomplish target aiFleetOrder = self.__getAIFleetOrderFromAITarget(aiFleetMissionType, aiTarget) self.appendAIFleetOrder(aiFleetOrder) - + for aiFleetOrder in aiFleetOrdersToVisitSystems: self.appendAIFleetOrder(aiFleetOrder) - + # if fleet don't have any mission, then resupply if is current location not in supplyable system empire = fo.getEmpire() fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs - if (not self.hasAnyAIFleetMissionTypes()) and not(self.getLocationAITarget().getTargetID() in fleetSupplyableSystemIDs): - resupplyAIFleetOrder = MoveUtilsAI.getResupplyAIFleetOrder(self.getFleetAITarget(), self.getLocationAITarget()) + if (not self.hasAnyAIMissionTypes()) and not(self.getLocationAITarget().getTargetID() in fleetSupplyableSystemIDs): + resupplyAIFleetOrder = MoveUtilsAI.getResupplyAIFleetOrder(self.getAITarget(), self.getLocationAITarget()) if resupplyAIFleetOrder.isValid(): self.appendAIFleetOrder(resupplyAIFleetOrder) - - def getFleetAITarget(self): - "return fleets AITarget" - - return AITarget.AITarget(AITargetType.TARGET_FLEET, self.getFleetID()) - + def getLocationAITarget(self): "system AITarget where fleet is or will be" # TODO add parameter turn - + universe = fo.getUniverse() - fleet = universe.getFleet(self.getFleetID()) + fleet = universe.getFleet(self.getAITargetID()) systemID = fleet.systemID - if systemID >=0: + if systemID >= 0: return AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID) else: return AITarget.AITarget(AITargetType.TARGET_SYSTEM, fleet.nextSystemID) - - + + def getFleetIDsFromAIFleetMissions(aiFleetMissions): result = [] for aiFleetMission in aiFleetMissions: - result.append(aiFleetMission.getFleetID()) - + result.append(aiFleetMission.getMissionAITargetID()) + return result Modified: trunk/FreeOrion/default/AI/AIFleetOrder.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetOrder.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/AIFleetOrder.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -12,28 +12,28 @@ self.__targetAITarget = targetAITarget self.__executed = False self.__executionCompleted = False - + def getAIFleetOrderType(self): return self.__aiFleetOrderType - + def getSourceAITarget(self): return self.__sourceAITarget - + def getTargetAITarget(self): return self.__targetAITarget - + def isExecuted(self): - return self.__executed - + return self.__executed + def __setExecuted(self): self.__executed = True - + def isExecutionCompleted(self): return self.__executionCompleted - + def __setExecutionCompleted(self): self.__executionCompleted = True - + def __checkValidityShipInFleet(self, shipAITarget, fleetAITarget): shipID = shipAITarget.getTargetID() fleetID = fleetAITarget.getTargetID() @@ -43,17 +43,17 @@ if (shipID in fleet.shipIDs): return True return False - + def isValid(self): "check if FleetOrder could be somehow in future issued = is valid" - + if (self.isExecuted() and self.isExecutionCompleted()): return False if self.getSourceAITarget().isValid() and self.getTargetAITarget().isValid(): sourceAITargetTypeValid = False targetAITargetTypeValid = False universe = fo.getUniverse() - + # colonise if AIFleetOrderType.ORDER_COLONISE == self.getAIFleetOrderType(): # with ship @@ -62,7 +62,7 @@ if ship.canColonize: sourceAITargetTypeValid = True # with fleet - elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) if fleet.hasColonyShips: sourceAITargetTypeValid = True @@ -108,20 +108,20 @@ # move to system if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType() or AITargetType.TARGET_PLANET == self.getTargetAITarget().getAITargetType(): targetAITargetTypeValid = True - + if sourceAITargetTypeValid == True and targetAITargetTypeValid == True: return True - + return False - + def canIssueOrder(self): "if FleetOrder can be issued now" - + if self.isExecuted(): return False if not self.isValid(): return False - + universe = fo.getUniverse() # colonise if AIFleetOrderType.ORDER_COLONISE == self.getAIFleetOrderType(): @@ -135,7 +135,7 @@ fleetID = self.getSourceAITarget().getTargetID() shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION) - ship = universe.getShip(shipID) + ship = universe.getShip(shipID) fleet = universe.getFleet(fleetID) planet = universe.getPlanet(self.getTargetAITarget().getTargetID()) if (ship != None) and (fleet.systemID == planet.systemID) and ship.canColonize: @@ -146,15 +146,15 @@ fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) if len(fleet.shipIDs) <= 1: return False - + return True - + def issueOrder(self): if not self.canIssueOrder(): print "can't issue " + self else: self.__setExecuted() - + # colonise if AIFleetOrderType.ORDER_COLONISE == self.getAIFleetOrderType(): shipID = None @@ -163,40 +163,40 @@ elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): fleetID = self.getSourceAITarget().getTargetID() shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION) - - fo.issueColonizeOrder(shipID, self.getTargetAITarget().getTargetID()) + + fo.issueColonizeOrder(shipID, self.getTargetAITarget().getTargetID()) # move or resupply elif (AIFleetOrderType.ORDER_MOVE == self.getAIFleetOrderType()) or (AIFleetOrderType.ORDER_RESUPPLY == self.getAIFleetOrderType()): fleetID = self.getSourceAITarget().getTargetID() systemID = self.getTargetAITarget().getTargetID() - + fo.issueFleetMoveOrder(fleetID, systemID) # split fleet elif AIFleetOrderType.ORDER_SPLIT_FLEET == self.getAIFleetOrderType(): fleetID = self.getSourceAITarget().getTargetID() shipID = self.getTargetAITarget().getTargetID() - + fo.issueNewFleetOrder(str(shipID), shipID) self.__setExecutionCompleted() elif (AIFleetOrderType.ORDER_ATACK == self.getAIFleetOrderType()): fleetID = self.getSourceAITarget().getTargetID() systemID = self.getTargetAITarget().getRequiredSystemAITargets()[0].getTargetID() - + fo.issueFleetMoveOrder(fleetID, systemID) - + def __str__(self): "returns describing string" - + return "fleet order[" + str(self.getAIFleetOrderType()) + "] source:" + str(self.getSourceAITarget()) + " target:" + str(self.getTargetAITarget()) - + def __cmp__(self, other): "compares AIFleetOrders" - + if other == None: return False if self.getAIFleetOrderType() < other.getAIFleetOrderType(): - return -1 - elif self.getAIFleetOrderType() == other.getAIFleetOrderType(): + return - 1 + elif self.getAIFleetOrderType() == other.getAIFleetOrderType(): result = self.getSourceAITarget().__cmp__(other.getSourceAITarget()) if result == 0: result = self.getTargetAITarget().__cmp__(other.getTargetAITarget()) @@ -204,19 +204,19 @@ else: return result return 1 - + def __eq__(self, other): "returns equal to other object" - + if other == None: return False if isinstance(other, AIFleetOrder): return self.__cmp__(other) == 0 return NotImplemented - + def __ne__(self, other): "returns not equal to other object" - + result = self.__eq__(other) if result is NotImplemented: return result Modified: trunk/FreeOrion/default/AI/AITarget.py =================================================================== --- trunk/FreeOrion/default/AI/AITarget.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/AITarget.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -7,120 +7,120 @@ def __init__(self, aiTargetType, targetID): "constructor" - + self.__aiTargetType__ = aiTargetType - self.__targetID__ = targetID + self.__targetID__ = targetID def getTargetID(self): "getter" - + return self.__targetID__ def getAITargetType(self): "getter" - + return self.__aiTargetType__ def setTargetID(self, value): "setter" - + self.__targetID__ = value def setAITargetType(self, value): "setter" - + self.__aiTargetType__ = value - + def __cmp__(self, other): "compares AITargets" - + if self.getTargetID() < other.getTargetID(): - return -1 + return - 1 elif self.getTargetID() == other.getTargetID(): if self.getAITargetType() < other.getAITargetType(): - return -1 + return - 1 elif self.getAITargetType() == other.getAITargetType(): return 0 return 1 return 1 - + def __eq__(self, other): "returns equal to other object" - + if other == None: return False if isinstance(other, AITarget): return self.__cmp__(other) == 0 return NotImplemented - + def __ne__(self, other): "returns not equal to other object" - + result = self.__eq__(other) if result is NotImplemented: return result return not result - + def __str__(self): "returns describing string" - - return "{" + str(self.getAITargetType()) + ":" + str(self.getTargetID())+"}" - + + return "{" + str(self.getAITargetType()) + ":" + str(self.getTargetID()) + "}" + def isValid(self): "returns if this object is valid" - + if self.getTargetID() == None or self.getAITargetType() == None or EnumsAI.checkValidity(self.getTargetID()) == False: return False - + universe = fo.getUniverse() - if AITargetType.TARGET_FLEET == self.getAITargetType(): + if AITargetType.TARGET_FLEET == self.getAITargetType(): fleet = universe.getFleet(self.getTargetID()) if fleet == None: return False return True - + elif AITargetType.TARGET_SYSTEM == self.getAITargetType(): system = universe.getSystem(self.getTargetID()) if system == None: return False return True - + elif AITargetType.TARGET_PLANET == self.getAITargetType(): planet = universe.getPlanet(self.getTargetID()) if planet == None: return False return True - + elif AITargetType.TARGET_BUILDING == self.getAITargetType(): building = universe.getBuilding(self.getTargetID()) if building == None: return False return True - + elif AITargetType.TARGET_EMPIRE == self.getAITargetType(): empireIDs = fo.AllEmpireIDs() if (empireIDs == None) or (not self.getTargetID() in empireIDs): return False return True - + return False - + def getRequiredSystemAITargets(self): "returns all system AITargets required to visit in this object" - + # TODO: add parameter turn - + result = [] if AITargetType.TARGET_SYSTEM == self.getAITargetType(): result.append(self) - + elif AITargetType.TARGET_PLANET == self.getAITargetType(): universe = fo.getUniverse() planet = universe.getPlanet(self.getTargetID()) aiTarget = AITarget(AITargetType.TARGET_SYSTEM, planet.systemID) - + result.append(aiTarget) - + elif AITargetType.TARGET_FLEET == self.getAITargetType(): # Fleet systemID is where is fleet going. # If fleet is going nowhere, then it is location of fleet @@ -130,7 +130,7 @@ if (systemID == -1): systemID = fleet.systemID aiTarget = AITarget(AITargetType.TARGET_SYSTEM, systemID) - + result.append(aiTarget) - + return result Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/AIstate.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -12,22 +12,18 @@ class AIstate(object): "stores AI game state" - # - def getLostFleets (save fleets last turn, look if still there) - # => from AI interface SITREP? - - # common variables # def colonisablePlanets (should be set at start of turn) # getColonisablePlanets (deepcopy!) def __init__(self): "constructor" - + self.__missionsByType = {} for missionType in EnumsAI.getAIFleetMissionTypes(): self.__missionsByType[missionType] = {} - + self.__aiMissionsByFleetID = {} - + self.__shipRoleByDesignID = {} self.__fleetRoleByID = {} self.__priorityByType = {} @@ -38,7 +34,7 @@ def __del__(self): "destructor" - + del self.__missionsByType del self.__shipRoleByDesignID del self.__fleetRoleByID @@ -48,90 +44,90 @@ def clean(self, startSystemID, fleetIDs): "turn AIstate cleanup" - + # cleanup explorable systems self.__cleanExplorableSystems(startSystemID) # TODO: cleanup colonisable planets # cleanup fleet roles self.__cleanFleetRoles() - + self.__cleanAIFleetMissions(fleetIDs) - + def afterTurnCleanup(self): "removes not required information to save from AI state after AI complete its turn" - + # some ships in fleet can be destroyed between turns and then fleet may have have different roles self.__fleetRoleByID = {} - + def __hasAIFleetMission(self, fleetID): "returns True if fleetID has AIFleetMission" - + return self.__aiMissionsByFleetID.__contains__(fleetID) - + def getAIFleetMission(self, fleetID): "returns AIFleetMission with fleetID" - + if self.__hasAIFleetMission(fleetID): return self.__aiMissionsByFleetID[fleetID] return None - - def getAllAIFleetMissions(self): + + def getAllAIFleetMissions(self): "returns all AIFleetMissions" - + return self.__aiMissionsByFleetID.values() - + def getAIFleetMissionsWithAnyMissionTypes(self, fleetMissionTypes): "returns all AIFleetMissions which contains any of fleetMissionTypes" - + result = [] - + aiFleetMissions = self.getAllAIFleetMissions() for aiFleetMission in aiFleetMissions: - if aiFleetMission.hasAnyOfAIFleetMissionTypes(fleetMissionTypes): + if aiFleetMission.hasAnyOfAIMissionTypes(fleetMissionTypes): result.append(aiFleetMission) return result - + def __addAIFleetMission(self, fleetID): "add new AIFleetMission with fleetID if it already not exists" - + if self.getAIFleetMission(fleetID) == None: aiFleetMission = AIFleetMission.AIFleetMission(fleetID) self.__aiMissionsByFleetID[fleetID] = aiFleetMission - + def __removeAIFleetMission(self, fleetID): "remove invalid AIFleetMission with fleetID if it exists" - + aiFleetMission = self.getAIFleetMission(fleetID) if aiFleetMission != None: self.__aiMissionsByFleetID[fleetID] = None del aiFleetMission del self.__aiMissionsByFleetID[fleetID] - + def __cleanAIFleetMissions(self, fleetIDs): "cleanup of AIFleetMissions" - + for fleetID in fleetIDs: if self.getAIFleetMission(fleetID) == None: self.__addAIFleetMission(fleetID) - + aiFleetMissions = self.getAllAIFleetMissions() deletedFleetIDs = [] for aiFleetMission in aiFleetMissions: - if not(aiFleetMission.getFleetID() in fleetIDs): - deletedFleetIDs.append(aiFleetMission.getFleetID()) + if not(aiFleetMission.getAITargetID() in fleetIDs): + deletedFleetIDs.append(aiFleetMission.getAITargetID()) for deletedFleetID in deletedFleetIDs: self.__removeAIFleetMission(deletedFleetID) - + aiFleetMissions = self.getAllAIFleetMissions() for aiFleetMission in aiFleetMissions: aiFleetMission.cleanInvalidAITargets() - + def hasAITarget(self, aiFleetMissionType, aiTarget): aiFleetMissions = self.getAIFleetMissionsWithAnyMissionTypes([aiFleetMissionType]) for mission in aiFleetMissions: if mission.hasTarget(aiFleetMissionType, aiTarget): return True - return False + return False def getShipRole(self, shipDesignID): "returns ship role by name" @@ -212,7 +208,7 @@ def getExplorableSystem(self, systemID): "determines system type from ID and returns it" - + for explorableSystemsType in EnumsAI.getAIExplorableSystemTypes(): systems = self.getExplorableSystems(explorableSystemsType) if systemID in systems: @@ -221,9 +217,9 @@ # print "SystemID " + str(systemID) + " not found." return AIExplorableSystemType.EXPLORABLE_SYSTEM_INVALID - def addExplorableSystem(self, explorableSystemsType, systemID): + def addExplorableSystem(self, explorableSystemsType, systemID): "add explorable system ID with type" - + if not (explorableSystemsType in EnumsAI.getAIExplorableSystemTypes()): return @@ -232,18 +228,18 @@ return systems[systemID] = systemID - def removeExplorableSystem(self, explorableSystemsType, systemID): + def removeExplorableSystem(self, explorableSystemsType, systemID): "removes explorable system ID with type" - + systems = self.__explorableSystemByType[explorableSystemsType] if len(systems) == 0: return if systemID in systems: del systems[systemID] - def __cleanExplorableSystems(self, startSystemID): + def __cleanExplorableSystems(self, startSystemID): "cleanup of all explorable systems" - + universe = fo.getUniverse() objectIDs = universe.allObjectIDs empireID = fo.empireID() @@ -253,23 +249,23 @@ system = universe.getSystem(objectID) if (system == None): continue if (empire.hasExploredSystem(objectID)): - self.addExplorableSystem(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED, objectID) - self.removeExplorableSystem(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED, objectID) + self.addExplorableSystem(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED, objectID) + self.removeExplorableSystem(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED, objectID) continue if (not universe.systemsConnected(objectID, startSystemID, empireID)): for explorableSystemsType in EnumsAI.getAIExplorableSystemTypes(): - self.removeExplorableSystem(explorableSystemsType, objectID) + self.removeExplorableSystem(explorableSystemsType, objectID) continue explorableSystemsType = self.getExplorableSystem(objectID) if (explorableSystemsType == AIExplorableSystemType.EXPLORABLE_SYSTEM_TARGET): continue - self.addExplorableSystem(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED, objectID) + self.addExplorableSystem(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED, objectID) def getExplorableSystems(self, explorableSystemsType): "get all explorable systems determined by type " - + return copy.deepcopy(self.__explorableSystemByType[explorableSystemsType]) - + def setPriority(self, priorityType, value): "sets a priority of the specified type" @@ -290,7 +286,7 @@ def printPriorities(self): "prints all priorities" - + print "all priorities:" for priority in self.__priorityByType: print " " + str(priority) + ": " + str(self.__priorityByType[priority]) Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -4,7 +4,7 @@ import FleetUtilsAI from EnumsAI import AIFleetMissionType, AIExplorableSystemType, AITargetType import AITarget -import PlanetUtilAI +import PlanetUtilsAI # globals colonisablePlanetIDs = [] # TODO: move into AIstate @@ -16,7 +16,7 @@ # get planets systemIDs = foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED) - planetIDs = PlanetUtilAI.getPlanetsInSystemsIDs(systemIDs) + planetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(systemIDs) removeAlreadyOwnedPlanetIDs(planetIDs) @@ -24,13 +24,13 @@ removeLowValuePlanets(evaluatedPlanets) sortedPlanets = evaluatedPlanets.items() - sortedPlanets.sort(lambda x,y: cmp(x[1],y[1]), reverse=True) + sortedPlanets.sort(lambda x, y: cmp(x[1], y[1]), reverse=True) print "Colonisable planets:" for evaluationPair in sortedPlanets: print " ID|Score: " + str(evaluationPair) print "" - + # export planets for other AI modules global colonisablePlanetIDs colonisablePlanetIDs = sortedPlanets # !!! move into AIstate? @@ -124,9 +124,9 @@ fleetID = colonyFleetIDs[i] planetID = planetID_value_pair[0] - + aiTarget = AITarget.AITarget(AITargetType.TARGET_PLANET, planetID) aiFleetMission = foAI.foAIstate.getAIFleetMission(fleetID) - aiFleetMission.addAITarget(AIFleetMissionType.FLEET_MISSION_COLONISATION, aiTarget) + aiFleetMission.addAITarget(AIFleetMissionType.FLEET_MISSION_COLONISATION, aiTarget) i = i + 1 Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -1,13 +1,13 @@ def checkValidity(value): "checks if value is valid" - + if (value == None or value < 0): return False return True def __getInterval(low, high): "returns integer numbers from interval <low, high>" - + result = [] # <low, high) for i in range(low, high): @@ -34,7 +34,7 @@ PRIORITY_RESEARCH_CONSTRUCTION = 12 PRIORITY_RESEARCH_ECONOMICS = 13 PRIORITY_RESEARCH_SHIPS = 14 - + def getAIPriorityResourceTypes(): return __getInterval(0, 4) def getAIPriorityProductionTypes(): @@ -44,13 +44,13 @@ def getAIPriorityTypes(): return __getInterval(0, 14) - + class AIExplorableSystemType(object): EXPLORABLE_SYSTEM_INVALID = -1 EXPLORABLE_SYSTEM_UNEXPLORED = 0 EXPLORABLE_SYSTEM_TARGET = 1 - EXPLORABLE_SYSTEM_EXPLORED = 2 - + EXPLORABLE_SYSTEM_EXPLORED = 2 + def getAIExplorableSystemTypes(): return __getInterval(0, 2) @@ -58,14 +58,14 @@ class AIFleetMissionType(object): FLEET_MISSION_INVALID = -1 FLEET_MISSION_EXPLORATION = 0 - FLEET_MISSION_COLONISATION = 1 + FLEET_MISSION_COLONISATION = 1 FLEET_MISSION_SPLIT_FLEET = 2 FLEET_MISSION_MERGE_FLEET = 3 FLEET_MISSION_HIT_AND_RUN = 4 FLEET_MISSION_ATTACK = 5 FLEET_MISSION_DEFEND = 6 FLEET_MISSION_LAST_STAND = 7 - + def getAIFleetMissionTypes(): return __getInterval(0, 7) @@ -92,7 +92,7 @@ SHIP_ROLE_MILITARY_POINTDEFENSE = 3 SHIP_ROLE_CIVILIAN_EXPLORATION = 4 SHIP_ROLE_CIVILIAN_COLONISATION = 5 - + def getAIShipRolesTypes(): return __getInterval(0, 5) @@ -107,7 +107,7 @@ TARGET_FLEET = 5 TARGET_EMPIRE = 6 TARGET_ALL_OTHER_EMPIRES = 7 - + def getAITargetTypes(): return __getInterval(0, 7) @@ -116,7 +116,7 @@ PRODUCTION_DEMAND_INVALID = -1 PRODUCTION_DEMAND_SHIP = 0 PRODUCTION_DEMAND_BUILDING = 1 - + def getAIProductionDemandTypes(): return __getInterval(0, 1) @@ -130,7 +130,7 @@ PRODUCTION_REQUIREMENT_PRODUCTION_POINTS = 4 PRODUCTION_REQUIREMENT_MINIMUM_TURNS = 5 PRODUCTION_REQUIREMENT_MINIMUM_SHIPYARDS = 6 - + def getAIProductionRequirementTypes(): return __getInterval(0, 6) @@ -143,17 +143,27 @@ RESEARCH_REQUIREMENT_RESEARCH_POINTS = 3 def getAIResearchRequirementTypes(): - return __getInterval(0,3) + return __getInterval(0, 3) -class AIWarTacticsMissionType(object): - WAR_TACTICS_MISSION_INVALID = -1 - WAR_TACTICS_DEFEND_SYSTEM = 0 - WAR_TACTICS_DEFEND_SHIP = 1 - WAR_TACTICS_DEFEND_FLEET = 2 - WAR_TACTICS_MISSION_GET_PLANET = 3 - WAR_TACTICS_MISSION_GET_SYSTEM = 4 - -def getAIWarTacticsMissionType(): +class AIMissionType(object): + MISSION_INVALID = -1 + FLEET_MISSION = 0 + EMPIRE_WAR_MISSION = 1 + ALLIANCE_WAR_MISSION = 2 + DIPLOMATIC_MISSION = 3 + +def getAIMissionTypes(): + return __getInterval(0, 3) + + +class AIEmpireWarMissionType(object): + EMPIRE_WAR_MISSION_INVALID = -1 + EMPIRE_WAR_MISSION_DEFEND_SYSTEM = 0 + EMPIRE_WAR_MISSION_DEFEND_SHIP = 1 + EMPIRE_WAR_MISSION_DEFEND_FLEET = 2 + EMPIRE_WAR_MISSION_GET_PLANET = 3 + EMPIRE_WAR_MISSION_GET_SYSTEM = 4 + +def getAIEmpireWarMissionTypes(): return __getInterval(0, 4) - Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -7,29 +7,29 @@ def assignScoutsToExploreSystems(): # TODO: use Graph Theory to explore closest systems - + fleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_EXPLORATION) - + # order fleets to explore explorableSystemIDs = foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED) for fleetID in fleetIDs: # if fleet already has a mission, continue aiFleetMission = foAI.foAIstate.getAIFleetMission(fleetID) - if len(aiFleetMission.getAIFleetMissionTypes()) > 0: + if len(aiFleetMission.getAIMissionTypes()) > 0: continue - + # else send fleet to a system for systemID in explorableSystemIDs: # if system is already being explored, continue aiTarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID) if foAI.foAIstate.hasAITarget(AIFleetMissionType.FLEET_MISSION_EXPLORATION, aiTarget): continue - + # add exploration mission to fleet with target unexplored system and this system is in range if len(MoveUtilsAI.canTravelToSystemAndReturnToResupply(fleetID, aiFleetMission.getLocationAITarget(), aiTarget, fo.empireID())) > 0: aiFleetMission.addAITarget(AIFleetMissionType.FLEET_MISSION_EXPLORATION, aiTarget) break - + def getHomeSystemID(): "returns the systemID of the home world" Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -88,7 +88,7 @@ for fleetID in fleetIDs: aiFleetMission = foAI.foAIstate.getAIFleetMission(fleetID) - if not aiFleetMission.hasAnyAIFleetMissionTypes(): + if not aiFleetMission.hasAnyAIMissionTypes(): fleetIDsWithoutMission.append(fleetID) return fleetIDsWithoutMission @@ -108,9 +108,9 @@ for shipID in fleet.shipIDs: ship = universe.getShip(shipID) role = foAI.foAIstate.getShipRole(ship.design.id) - + if role != AIShipRoleType.SHIP_ROLE_INVALID: - shipRoles[role] = shipRoles[role] +1 + shipRoles[role] = shipRoles[role] + 1 # determine most common shipRole favouriteRole = AIShipRoleType.SHIP_ROLE_INVALID @@ -134,7 +134,7 @@ universe = fo.getUniverse() ship = universe.getShip(shipID) - + if ship.canColonize: return AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION elif ship.isArmed: @@ -146,7 +146,7 @@ def generateAIFleetOrdersForAIFleetMissions(): "generates fleet orders from targets" - + print "Exploration fleets: " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_EXPLORATION)) print "Colonisation fleets: " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION)) print "Attack fleets: " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ATTACK)) @@ -155,42 +155,42 @@ print "Explored systems:" printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED)) print "Unexplored systems:" - printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED)) + printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED)) print "" - + print "Exploration fleet targets: fleetID[AIFleetMissionType]:{AITargetType:targetID}" explorationAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_EXPLORATION]) for explorationAIFleetMission in explorationAIFleetMissions: print " " + str(explorationAIFleetMission) - + print "Colonisation fleet targets: fleetID[AIFleetMissionType]:{AITargetType:targetID}" colonisationAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_COLONISATION]) for colonisationAIFleetMission in colonisationAIFleetMissions: print " " + str(colonisationAIFleetMission) - + aiFleetMissions = foAI.foAIstate.getAllAIFleetMissions() for aiFleetMission in aiFleetMissions: aiFleetMission.generateAIFleetOrders() def issueAIFleetOrdersForAIFleetMissions(): "issues fleet orders" - + print "" print "issuing fleet orders:" aiFleetMissions = foAI.foAIstate.getAllAIFleetMissions() for aiFleetMission in aiFleetMissions: aiFleetMission.issueAIFleetOrders() print "" - + def printSystems(systemIDs): universe = fo.getUniverse() empire = fo.getEmpire() fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs - for systemID in systemIDs: + for systemID in systemIDs: # determine if system is in supplied suppliedSystem = "" if systemID in fleetSupplyableSystemIDs: suppliedSystem = " supplied" - - system = universe.getSystem(systemID) + + system = universe.getSystem(systemID) print " name:" + system.name + " id:" + str(systemID) + suppliedSystem Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -32,10 +32,10 @@ identifyShipDesigns() identifyFleetsRoles() - + def splitFleet(): "split all fleets" - + # TODO: only after analyzing situation in map can fleet can be split universe = fo.getUniverse() for fleetID in universe.fleetIDs: @@ -45,11 +45,11 @@ def identifyShipDesigns(): "identify ship designs" - + shipIDs = [] - + universe = fo.getUniverse() - + for fleetID in universe.fleetIDs: fleet = universe.getFleet(fleetID) @@ -60,10 +60,10 @@ shipRole = FleetUtilsAI.assessShipRole(shipID) foAIstate.addShipRole(ship.design.id, shipRole) # print str(ship.design.id) + ": " + str(shipRole) - + def identifyFleetsRoles(): "identify fleet roles" - + # assign roles to fleets universe = fo.getUniverse() for fleetID in universe.fleetIDs: @@ -118,14 +118,14 @@ # call AI modules PriorityAI.calculatePriorities() - + ExplorationAI.assignScoutsToExploreSystems() ColonisationAI.assignColonyFleetsToColonise() # ProductionAI.generateProductionOrders() # TacticsAI.generateTacticOrders() FleetUtilsAI.generateAIFleetOrdersForAIFleetMissions() FleetUtilsAI.issueAIFleetOrdersForAIFleetMissions() - + ResearchAI.generateResearchOrders() ProductionAI.generateProductionOrders() Modified: trunk/FreeOrion/default/AI/MoveUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/MoveUtilsAI.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/MoveUtilsAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -24,12 +24,12 @@ result.append(aiFleetOrder) else: print "fleetID: " + str(fleetAITarget.getTargetID()) + " can't travel to target:" + str(aiTarget) - + return result def canTravelToSystemAndReturnToResupply(fleetID, fromSystemAITarget, toSystemAITarget, empireID): "check if fleet can travel from starting system to wanted system" - + systemAITargets = [] if not fromSystemAITarget.getTargetID() == toSystemAITarget.getTargetID: # get supplyable systems @@ -40,27 +40,27 @@ fleet = universe.getFleet(fleetID) maxFuel = int(fleet.maxFuel) fuel = int(fleet.fuel) - + # try to find path without going resupply first supplySystemAITarget = getNearestSuppliedSystem(toSystemAITarget.getTargetID(), empireID) systemAITargets = __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, systemAITargets, fleetSupplyableSystemIDs, maxFuel, fuel, supplySystemAITarget) # resupply in system first is required to find path - if not(fromSystemAITarget.getTargetID() in fleetSupplyableSystemIDs) and len(systemAITargets)==0: + if not(fromSystemAITarget.getTargetID() in fleetSupplyableSystemIDs) and len(systemAITargets) == 0: # add supply system to visit fromSystemAITarget = getNearestSuppliedSystem(fromSystemAITarget.getTargetID(), empireID) systemAITargets.append(fromSystemAITarget) # find path from supplied system to wanted system systemAITargets = __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, systemAITargets, fleetSupplyableSystemIDs, maxFuel, maxFuel, supplySystemAITarget) - + return systemAITargets def getNearestSuppliedSystem(startSystemID, empireID): "returns systemAITarget of nearest supplied system from starting system startSystemID" - + empire = fo.getEmpire() fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs universe = fo.getUniverse() - + if startSystemID in fleetSupplyableSystemIDs: return AITarget.AITarget(AITargetType.TARGET_SYSTEM, startSystemID) else: @@ -71,7 +71,7 @@ if len(leastJumpsPath) < minJumps: minJumps = len(leastJumpsPath) supplySystemID = systemID - + return AITarget.AITarget(AITargetType.TARGET_SYSTEM, supplySystemID) def __findPathWithFuelToSystemWithPossibleReturn(fromSystemAITarget, toSystemAITarget, empireID, resultSystemAITargets, fleetSupplyableSystemIDs, maxFuel, fuel, supplySystemAITarget): @@ -90,19 +90,19 @@ fuel = maxFuel else: fuel = fuel - 1 - + # leastJumpPath can differ from shortestPath # TODO: use Graph Theory to optimize if (not systemID == toSystemAITarget.getTargetID()) and (systemID in fleetSupplyableSystemIDs): resultSystemAITargets.append(AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID)) - + if fuel < 0: result = False - + fromSystemID = systemID else: - result = False - + result = False + # if there is path to wanted system, then also if there is path back to supplyable system if result == True: # jump from A to B means leastJumpsPath=[A,B], but minJumps=1 @@ -113,20 +113,20 @@ result = False else: resultSystemAITargets.append(toSystemAITarget) - + if result == False: resultSystemAITargets = [] - + return resultSystemAITargets def getResupplyAIFleetOrder(fleetAITarget, currentSystemAITarget): "returns resupply AIFleetOrder to nearest supplied system" - + # find nearest supplied system empireID = fo.empireID() suppliedSystemAITarget = getNearestSuppliedSystem(currentSystemAITarget.getTargetID(), empireID) - + # create resupply AIFleetOrder aiFleetOrder = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_RESUPPLY, fleetAITarget, suppliedSystemAITarget) - + return aiFleetOrder Deleted: trunk/FreeOrion/default/AI/PlanetUtilAI.py =================================================================== --- trunk/FreeOrion/default/AI/PlanetUtilAI.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/PlanetUtilAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -1,30 +0,0 @@ -import freeOrionAIInterface as fo - -def getPlanetsInSystemsIDs(systemIDs): - "creates a list with all planets known to the empire" - - universe = fo.getUniverse() - - planetIDs = [] - - for systemID in systemIDs: - - system = universe.getSystem(systemID) - if (system == None): continue - - planetIDs.extend(system.planetIDs) - - return planetIDs - -def getOwnedPlanetsByEmpire(planetIDs, empireID): - "return list of planets ownned by empireID" - - result = [] - - universe = fo.getUniverse() - for planetID in planetIDs: - planet = universe.getPlanet(planetID) - if (not planet.unowned) and planet.ownedBy(empireID): - result.append(planetID) - - return result Copied: trunk/FreeOrion/default/AI/PlanetUtilsAI.py (from rev 3135, trunk/FreeOrion/default/AI/PlanetUtilAI.py) =================================================================== --- trunk/FreeOrion/default/AI/PlanetUtilsAI.py (rev 0) +++ trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -0,0 +1,30 @@ +import freeOrionAIInterface as fo + +def getPlanetsInSystemsIDs(systemIDs): + "creates a list with all planets known to the empire" + + universe = fo.getUniverse() + + planetIDs = [] + + for systemID in systemIDs: + + system = universe.getSystem(systemID) + if (system == None): continue + + planetIDs.extend(system.planetIDs) + + return planetIDs + +def getOwnedPlanetsByEmpire(planetIDs, empireID): + "return list of planets owned by empireID" + + result = [] + + universe = fo.getUniverse() + for planetID in planetIDs: + planet = universe.getPlanet(planetID) + if (not planet.unowned) and planet.ownedBy(empireID): + result.append(planetID) + + return result Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2009-08-31 18:24:04 UTC (rev 3135) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2009-09-02 13:16:22 UTC (rev 3136) @@ -1,39 +1,39 @@ import freeOrionAIInterface as fo import FreeOrionAI as foAI from EnumsAI import AIExplorableSystemType -import PlanetUtilAI +import PlanetUtilsAI def generateProductionOrders(): "generate production orders" - + print "Production:" empire = fo.getEmpire() totalPP = empire.pr... [truncated message content] |
From: <geo...@us...> - 2011-01-29 23:18:06
|
Revision: 3959 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3959&view=rev Author: geoffthemedio Date: 2011-01-29 23:18:00 +0000 (Sat, 29 Jan 2011) Log Message: ----------- AI scripts update by RgnadKzin. Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2011-01-29 23:17:19 UTC (rev 3958) +++ trunk/FreeOrion/default/AI/AIstate.py 2011-01-29 23:18:00 UTC (rev 3959) @@ -1,7 +1,7 @@ import copy import freeOrionAIInterface as fo +import EnumsAI from EnumsAI import AIFleetMissionType, AIShipRoleType, AIExplorableSystemType -import EnumsAI import AIFleetMission # global variables @@ -16,6 +16,9 @@ class AIstate(object): "stores AI game state" + # def colonisablePlanets (should be set at start of turn) + # getColonisablePlanets (deepcopy!) + def __init__(self): "constructor" Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2011-01-29 23:17:19 UTC (rev 3958) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2011-01-29 23:18:00 UTC (rev 3959) @@ -13,9 +13,15 @@ # get supplyable systems empire = fo.getEmpire() + universe = fo.getUniverse() + capitolID = empire.capitolID + homeworld = universe.getPlanet(capitolID) + speciesName = homeworld.speciesName + species = fo.getSpecies(speciesName) + fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) - print ":: fleetSupplyablePlanetIDs:" + str(fleetSupplyablePlanetIDs) + print " fleetSupplyablePlanetIDs:" + str(fleetSupplyablePlanetIDs) # get planets systemIDs = foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED) @@ -24,7 +30,7 @@ removeAlreadyOwnedPlanetIDs(planetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION) removeAlreadyOwnedPlanetIDs(planetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST) - evaluatedPlanets = assignColonisationValues(planetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, fleetSupplyablePlanetIDs) + evaluatedPlanets = assignColonisationValues(planetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, fleetSupplyablePlanetIDs, species, empire) removeLowValuePlanets(evaluatedPlanets) sortedPlanets = evaluatedPlanets.items() @@ -42,7 +48,7 @@ allOutpostFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST) AIstate.outpostFleetIDs = FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allOutpostFleetIDs) - evaluatedOutposts = assignColonisationValues(planetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs) + evaluatedOutposts = assignColonisationValues(planetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, species, empire) removeLowValuePlanets(evaluatedOutposts) sortedOutposts = evaluatedOutposts.items() @@ -90,17 +96,17 @@ # print "removed planet " + str(ID) -def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs): +def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire): "creates a dictionary that takes planetIDs as key and their colonisation score as value" planetValues = {} for planetID in planetIDs: - planetValues[planetID] = evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs) + planetValues[planetID] = evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, species, empire) return planetValues -def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs): +def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, species, empire): "returns the colonisation value of a planet" # TODO: in planet evaluation consider specials and distance @@ -109,21 +115,34 @@ planet = universe.getPlanet(planetID) if (planet == None): return 0 - # print ":: evaluatePlanet ID:" + str(planetID) + "/" + str(planet.type) + "/" + str(planet.size) + # give preference to closest worlds + empireID = empire.empireID + capitolID = empire.capitolID + homeworld = universe.getPlanet(capitolID) + homeSystemID = homeworld.systemID + evalSystemID = planet.systemID + leastJumpsPath = len(universe.leastJumpsPath(homeSystemID, evalSystemID, empireID)) + distanceFactor = 1.001 / (leastJumpsPath + 1) + + # print ">>> evaluatePlanet ID:" + str(planetID) + "/" + str(planet.type) + "/" + str(planet.size) + "/" + str(leastJumpsPath) + "/" + str(distanceFactor) if missionType == AIFleetMissionType.FLEET_MISSION_COLONISATION: # planet size ranges from 1-5 if (planetID in fleetSupplyablePlanetIDs): - return getPlanetHospitality(planetID) * planet.size + 1 + return getPlanetHospitality(planetID, species) * planet.size + distanceFactor else: - return getPlanetHospitality(planetID) * planet.size + return getPlanetHospitality(planetID, species) * planet.size - distanceFactor elif missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST: - if str(planet.type) == str("gasGiant") or str(planet.type) == str("asteroids"): + planetEnvironment = species.getPlanetEnvironment(planet.type) + if planetEnvironment == fo.planetEnvironment.uninhabitable: + # prevent outposts from being built when they cannot get food if (planetID in fleetSupplyablePlanetIDs): - return AIstate.minimalColoniseValue + 1 + return AIstate.minimalColoniseValue + distanceFactor + elif (str("GRO_ORBIT_FARMING") in empire.availableTechs): + return AIstate.minimalColoniseValue + distanceFactor else: - return AIstate.minimalColoniseValue - 1 + return AIstate.minimalColoniseValue - distanceFactor -def getPlanetHospitality(planetID): +def getPlanetHospitality(planetID, species): "returns a value depending on the planet type" universe = fo.getUniverse() @@ -131,20 +150,15 @@ planet = universe.getPlanet(planetID) if planet == None: return 0 - empire = fo.getEmpire() - capitolID = empire.capitolID - homeworld = universe.getPlanet(capitolID) - speciesName = homeworld.speciesName - species = fo.getSpecies(speciesName) planetEnvironment = species.getPlanetEnvironment(planet.type) # print ":: planet:" + str(planetID) + " type:" + str(planet.type) + " size:" + str(planet.size) + " env:" + str(planetEnvironment) # reworked with races - if planetEnvironment == fo.planetEnvironment.good: return 2.5 + if planetEnvironment == fo.planetEnvironment.good: return 2.75 if planetEnvironment == fo.planetEnvironment.adequate: return 1 if planetEnvironment == fo.planetEnvironment.poor: return 0.5 if planetEnvironment == fo.planetEnvironment.hostile: return 0.25 - if planetEnvironment == fo.planetEnvironment.uninhabitable: return 0.25 + if planetEnvironment == fo.planetEnvironment.uninhabitable: return 0.1 return 0 Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2011-01-29 23:17:19 UTC (rev 3958) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2011-01-29 23:18:00 UTC (rev 3959) @@ -189,3 +189,4 @@ FOCUS_MINING = "FOCUS_MINING" FOCUS_INDUSTRY = "FOCUS_INDUSTRY" FOCUS_RESEARCH = "FOCUS_RESEARCH" + FOCUS_TRADE = "FOCUS_TRADE" Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2011-01-29 23:17:19 UTC (rev 3958) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2011-01-29 23:18:00 UTC (rev 3959) @@ -177,12 +177,12 @@ printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED)) print "" - print "Exploration fleet targets: fleetID[AIFleetMissionType]:{AITargetType:targetID}" + print "Exploration targets: fleetID[MissionType]:{TargetType:targetID}" explorationAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_EXPLORATION]) for explorationAIFleetMission in explorationAIFleetMissions: print " " + str(explorationAIFleetMission) - print "Colonisation fleet targets: fleetID[AIFleetMissionType]:{AITargetType:targetID}" + print "Colonisation targets: fleetID[MissionType]:{TargetType:targetID}" colonisationAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_COLONISATION]) for colonisationAIFleetMission in colonisationAIFleetMissions: print " " + str(colonisationAIFleetMission) Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2011-01-29 23:17:19 UTC (rev 3958) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2011-01-29 23:18:00 UTC (rev 3959) @@ -67,7 +67,7 @@ universe = fo.getUniverse() for fleetID in universe.fleetIDs: foAIstate.addFleetRole(fleetID, FleetUtilsAI.assessFleetRole(fleetID)) - # print str(fleetID) + ": " + FleetUtilsAIAIAI.assessFleetRole(fleetID) + # print str(fleetID) + ": " + FleetUtilsAI.assessFleetRole(fleetID) # called when client receives a load game message def resumeLoadedGame(savedStateString): Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2011-01-29 23:17:19 UTC (rev 3958) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2011-01-29 23:18:00 UTC (rev 3959) @@ -40,9 +40,9 @@ foodPriority = (foodTarget - foodStockpile) / foodTarget * 100 print "" - print "Size of food stockpile: " + str(foodStockpile) - print "Target food stockpile: " + str (foodTarget) - print "Priority for Food: " + str(foodPriority) + print "Size of food stockpile: " + str(foodStockpile) + print "Target food stockpile : " + str (foodTarget) + print "Priority for Food : " + str(foodPriority) if foodPriority < 0: return 0 @@ -62,9 +62,9 @@ explorationPriority = (numUnexploredSystems - numScouts) / numUnexploredSystems * 100 print "" - print "Number of Scouts: " + str(numScouts) + print "Number of Scouts : " + str(numScouts) print "Number of Unexplored systems: " + str(numUnexploredSystems) - print "Priority for scouts: " + str(explorationPriority) + print "Priority for scouts : " + str(explorationPriority) if explorationPriority < 0: return 0 Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2011-01-29 23:17:19 UTC (rev 3958) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2011-01-29 23:18:00 UTC (rev 3959) @@ -94,9 +94,9 @@ print " ID|Focus: " + str(planetID) + "|" + str(planet.focus) # for focus in planet.availableFoci: # print " >" + str(focus) - if str(planet.focus) != str(newFocus) and str(newFocus) in planet.availableFoci: - fo.issueChangeFocusOrder(planetID, newFocus) - print " issueChangeFocusOrder(" + str(planetID) + ", " + str(newFocus) + ")" + # if str(planet.focus) != str(newFocus) and str(newFocus) in planet.availableFoci: + # fo.issueChangeFocusOrder(planetID, newFocus) + # print " issueChangeFocusOrder(" + str(planetID) + ", " + str(newFocus) + ")" def getAvailableBuildLocations(shipDesignID): "returns locations where shipDesign can be built" |
From: <geo...@us...> - 2011-12-25 19:17:17
|
Revision: 4541 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4541&view=rev Author: geoffthemedio Date: 2011-12-25 19:17:09 +0000 (Sun, 25 Dec 2011) Log Message: ----------- Updated AI Python scripts by Gray Area. Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/PlanetUtilsAI.py trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2011-12-25 09:05:19 UTC (rev 4540) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2011-12-25 19:17:09 UTC (rev 4541) @@ -7,13 +7,15 @@ import PlanetUtilsAI def getColonyFleets(): - # get colony fleets + "get colony fleets" + allColonyFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION) AIstate.colonyFleetIDs = FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allColonyFleetIDs) - # get supplyable systems + # get suppliable systems and planets + universe = fo.getUniverse() empire = fo.getEmpire() - universe = fo.getUniverse() + empireID = empire.empireID capitalID = empire.capitalID homeworld = universe.getPlanet(capitalID) speciesName = homeworld.speciesName @@ -21,22 +23,68 @@ fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) - print " fleetSupplyablePlanetIDs:" + str(fleetSupplyablePlanetIDs) + print "" + print " fleetSupplyableSystemIDs: " + str(list(fleetSupplyableSystemIDs)) + print " fleetSupplyablePlanetIDs: " + str(fleetSupplyablePlanetIDs) + print "" - # get planets - systemIDs = foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED) - planetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(systemIDs) + # get outpost and colonization planets + exploredSystemIDs = empire.exploredSystemIDs + print "Explored SystemIDs: " + str(list(exploredSystemIDs)) - removeAlreadyOwnedPlanetIDs(planetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION) - removeAlreadyOwnedPlanetIDs(planetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST) + exploredPlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(exploredSystemIDs) + print "Explored PlanetIDs: " + str(exploredPlanetIDs) + print "" - evaluatedPlanets = assignColonisationValues(planetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, fleetSupplyablePlanetIDs, species, empire) - removeLowValuePlanets(evaluatedPlanets) + allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) + print "All Owned and Populated PlanetIDs: " + str(allOwnedPlanetIDs) - sortedPlanets = evaluatedPlanets.items() + empireOwnedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + print "Empire Owned PlanetIDs: " + str(empireOwnedPlanetIDs) + + unpopulatedPlanetIDs = list(set(exploredPlanetIDs) -set(allOwnedPlanetIDs)) + print "Unpopulated PlanetIDs: " + str(unpopulatedPlanetIDs) + + print "" + colonyTargetedPlanetIDs = getColonyTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, empireID) + print "Colony Targeted PlanetIDs: " + str(colonyTargetedPlanetIDs) + + colonyFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION) + if not colonyFleetIDs: + print "Available Colony Fleets: 0" + else: + print "Colony FleetIDs: " + str(FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION)) + + numColonyFleets = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(colonyFleetIDs)) + print "Colony Fleets Without Missions: " + str(numColonyFleets) + + print "" + outpostTargetedPlanetIDs = getOutpostTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, empireID) + print "Outpost Targeted PlanetIDs: " + str(outpostTargetedPlanetIDs) + + outpostFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST) + if not outpostFleetIDs: + print "Available Outpost Fleets: 0" + else: + print "Outpost FleetIDs: " + str(FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST)) + + numOutpostFleets = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(outpostFleetIDs)) + print "Outpost Fleets Without Missions: " + str(numOutpostFleets) + + evaluatedColonyPlanetIDs = list(set(unpopulatedPlanetIDs) - set(colonyTargetedPlanetIDs)) + # print "Evaluated Colony PlanetIDs: " + str(evaluatedColonyPlanetIDs) + + evaluatedOutpostPlanetIDs = list(set(unpopulatedPlanetIDs) - set(outpostTargetedPlanetIDs)) + # print "Evaluated Outpost PlanetIDs: " + str(evaluatedOutpostPlanetIDs) + + evaluatedColonyPlanets = assignColonisationValues(evaluatedColonyPlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, fleetSupplyablePlanetIDs, species, empire) + removeLowValuePlanets(evaluatedColonyPlanets) + + sortedPlanets = evaluatedColonyPlanets.items() sortedPlanets.sort(lambda x, y: cmp(x[1], y[1]), reverse=True) - print "Colonisable planets:" + print "" + print "Settleable Colony PlanetIDs:" for evaluationPair in sortedPlanets: print " ID|Score: " + str(evaluationPair) print "" @@ -48,13 +96,13 @@ allOutpostFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST) AIstate.outpostFleetIDs = FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allOutpostFleetIDs) - evaluatedOutposts = assignColonisationValues(planetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, species, empire) - removeLowValuePlanets(evaluatedOutposts) + evaluatedOutpostPlanets = assignColonisationValues(evaluatedOutpostPlanetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, species, empire) + removeLowValuePlanets(evaluatedOutpostPlanets) - sortedOutposts = evaluatedOutposts.items() + sortedOutposts = evaluatedOutpostPlanets.items() sortedOutposts.sort(lambda x, y: cmp(x[1], y[1]), reverse=True) - print "Colonisable outposts:" + print "Settleable Outpost PlanetIDs:" for evaluationPair in sortedOutposts: print " ID|Score: " + str(evaluationPair) print "" @@ -62,40 +110,49 @@ # export outposts for other AI modules AIstate.colonisableOutpostIDs = sortedOutposts -def assignColonyFleetsToColonise(): - # assign fleet targets to colonisable planets - sendColonyShips(AIstate.colonyFleetIDs, AIstate.colonisablePlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION) +def getColonyTargetedPlanetIDs(planetIDs, missionType, empireID): + "return list being settled with colony planets" - # assign fleet targets to colonisable outposts - sendColonyShips(AIstate.outpostFleetIDs, AIstate.colonisableOutpostIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST) + universe = fo.getUniverse() + colonyAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([missionType]) -def removeAlreadyOwnedPlanetIDs(planetIDs, missionType): - "removes planets that already are being colonised or owned" + colonyTargetedPlanets = [] + for planetID in planetIDs: + planet = universe.getPlanet(planetID) + # add planets that are target of a mission + for colonyAIFleetMission in colonyAIFleetMissions: + aiTarget = AITarget.AITarget(AITargetType.TARGET_PLANET, planetID) + if colonyAIFleetMission.hasTarget(missionType, aiTarget): + colonyTargetedPlanets.append(planetID) + + return colonyTargetedPlanets + +def getOutpostTargetedPlanetIDs(planetIDs, missionType, empireID): + "return list being settled with outposts planets" + universe = fo.getUniverse() + outpostAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([missionType]) - coloniseAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([missionType]) - deletePlanets = [] + outpostTargetedPlanets = [] for planetID in planetIDs: - planet = universe.getPlanet(planetID) - # remove owned planets - if (not planet.unowned): - deletePlanets.append(planetID) - continue - - # remove planets that are target of a mission - for coloniseAIFleetMission in coloniseAIFleetMissions: + # add planets that are target of a mission + for outpostAIFleetMission in outpostAIFleetMissions: aiTarget = AITarget.AITarget(AITargetType.TARGET_PLANET, planetID) - if coloniseAIFleetMission.hasTarget(missionType, aiTarget): - deletePlanets.append(planetID) + if outpostAIFleetMission.hasTarget(missionType, aiTarget): + outpostTargetedPlanets.append(planetID) - for ID in deletePlanets: - planetIDs.remove(ID) - # print "removed planet " + str(ID) + return outpostTargetedPlanets +def assignColonyFleetsToColonise(): + # assign fleet targets to colonisable planets + sendColonyShips(AIstate.colonyFleetIDs, AIstate.colonisablePlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION) + # assign fleet targets to colonisable outposts + sendColonyShips(AIstate.outpostFleetIDs, AIstate.colonisableOutpostIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST) + def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire): "creates a dictionary that takes planetIDs as key and their colonisation score as value" @@ -127,20 +184,20 @@ # print ">>> evaluatePlanet ID:" + str(planetID) + "/" + str(planet.type) + "/" + str(planet.size) + "/" + str(leastJumpsPath) + "/" + str(distanceFactor) if missionType == AIFleetMissionType.FLEET_MISSION_COLONISATION: # planet size ranges from 1-5 - if (planetID in fleetSupplyablePlanetIDs): - return getPlanetHospitality(planetID, species) * planet.size + distanceFactor - else: - return getPlanetHospitality(planetID, species) * planet.size - distanceFactor + if (planetID in fleetSupplyablePlanetIDs): + return getPlanetHospitality(planetID, species) * planet.size + distanceFactor + else: + return getPlanetHospitality(planetID, species) * planet.size - distanceFactor elif missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST: - planetEnvironment = species.getPlanetEnvironment(planet.type) + planetEnvironment = species.getPlanetEnvironment(planet.type) if planetEnvironment == fo.planetEnvironment.uninhabitable: - # prevent outposts from being built when they cannot get food - if (planetID in fleetSupplyablePlanetIDs): - return AIstate.minimalColoniseValue + distanceFactor - elif (str("GRO_ORBIT_FARMING") in empire.availableTechs): - return AIstate.minimalColoniseValue + distanceFactor - else: - return AIstate.minimalColoniseValue - distanceFactor + # prevent outposts from being built when they cannot get food + if (planetID in fleetSupplyablePlanetIDs): + return AIstate.minimalColoniseValue + distanceFactor + elif (str("GRO_ORBIT_FARMING") in empire.availableTechs): + return AIstate.minimalColoniseValue + distanceFactor + else: + return AIstate.minimalColoniseValue - distanceFactor def getPlanetHospitality(planetID, species): "returns a value depending on the planet type" @@ -169,7 +226,7 @@ # print ":: min:" + str(AIstate.minimalColoniseValue) for planetID in evaluatedPlanets.iterkeys(): - # print ":: eval:" + str(planetID) + " val:" + str(evaluatedPlanets[planetID]) + # print ":: eval:" + str(planetID) + " val:" + str(evaluatedPlanets[planetID]) if (evaluatedPlanets[planetID] < AIstate.minimalColoniseValue): removeIDs.append(planetID) Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2011-12-25 09:05:19 UTC (rev 4540) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2011-12-25 19:17:09 UTC (rev 4541) @@ -24,27 +24,29 @@ PRIORITY_RESOURCE_PRODUCTION = 2 PRIORITY_RESOURCE_RESEARCH = 3 PRIORITY_RESOURCE_TRADE = 4 - PRIORITY_PRODUCTION_EXPLORATION = 5 - PRIORITY_PRODUCTION_OUTPOST = 6 - PRIORITY_PRODUCTION_COLONISATION = 7 - PRIORITY_PRODUCTION_INVASION = 8 - PRIORITY_PRODUCTION_MILITARY = 9 - PRIORITY_PRODUCTION_BUILDINGS = 10 - PRIORITY_RESEARCH_LEARNING = 11 - PRIORITY_RESEARCH_GROWTH = 12 - PRIORITY_RESEARCH_PRODUCTION = 13 - PRIORITY_RESEARCH_CONSTRUCTION = 14 - PRIORITY_RESEARCH_ECONOMICS = 15 - PRIORITY_RESEARCH_SHIPS = 16 + PRIORITY_RESOURCE_CONSTRUCTION = 5 + PRIORITY_PRODUCTION_EXPLORATION = 6 + PRIORITY_PRODUCTION_OUTPOST = 7 + PRIORITY_PRODUCTION_COLONISATION = 8 + PRIORITY_PRODUCTION_INVASION = 9 + PRIORITY_PRODUCTION_MILITARY = 10 + PRIORITY_PRODUCTION_BUILDINGS = 11 + PRIORITY_RESEARCH_LEARNING = 12 + PRIORITY_RESEARCH_GROWTH = 13 + PRIORITY_RESEARCH_PRODUCTION = 14 + PRIORITY_RESEARCH_CONSTRUCTION = 15 + PRIORITY_RESEARCH_ECONOMICS = 16 + PRIORITY_RESEARCH_SHIPS = 17 + PRIORITY_RESEARCH_DEFENSE = 18 def getAIPriorityResourceTypes(): - return __getInterval(0, 4) + return __getInterval(0, 5) def getAIPriorityProductionTypes(): - return __getInterval(5, 10) + return __getInterval(6, 11) def getAIPriorityResearchTypes(): - return __getInterval(11, 16) + return __getInterval(12, 18) def getAIPriorityTypes(): - return __getInterval(0, 16) + return __getInterval(0, 18) class AIExplorableSystemType(object): EXPLORABLE_SYSTEM_INVALID = -1 @@ -67,7 +69,7 @@ FLEET_MISSION_DEFEND = 7 FLEET_MISSION_LAST_STAND = 8 FLEET_MISSION_INVASION = 9 - FLEET_MISSION_MILITARY = 10 + FLEET_MISSION_MILITARY = 10 def getAIFleetMissionTypes(): return __getInterval(0, 10) @@ -183,3 +185,4 @@ FOCUS_INDUSTRY = "FOCUS_INDUSTRY" FOCUS_RESEARCH = "FOCUS_RESEARCH" FOCUS_TRADE = "FOCUS_TRADE" + FOCUS_CONSTRUCTION = "FOCUS_CONSTRUCTION" Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2011-12-25 09:05:19 UTC (rev 4540) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2011-12-25 19:17:09 UTC (rev 4541) @@ -20,23 +20,36 @@ fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) - # get competitor planets - allOwnedPlanetIDs = getAllOwnedPlanetIDs(universe.planetIDs) - print "All Owned and Populated PlanetIDs: " + str(allOwnedPlanetIDs) + # get competitor planets + exploredSystemIDs = empire.exploredSystemIDs + exploredPlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(exploredSystemIDs) + allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) + # print "All Owned and Populated PlanetIDs: " + str(allOwnedPlanetIDs) + empireOwnedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) - print "Empire Owned PlanetIDs: " + str(empireOwnedPlanetIDs) + # print "Empire Owned PlanetIDs: " + str(empireOwnedPlanetIDs) + competitorPlanetIDs = list(set(allOwnedPlanetIDs) - set(empireOwnedPlanetIDs)) + print "Competitor PlanetIDs: " + str(competitorPlanetIDs) + + print "" invasionTargetedPlanetIDs = getInvasionTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_INVASION, empireID) print "Invasion Targeted PlanetIDs: " + str(invasionTargetedPlanetIDs) - competitorPlanetIDs = list(set(allOwnedPlanetIDs) - set(empireOwnedPlanetIDs)) - print "Competitor PlanetIDs: " + str(competitorPlanetIDs) + invasionFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) + if not invasionFleetIDs: + print "Available Invasion Fleets: 0" + else: + print "Invasion FleetIDs: " + str(FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION)) + + numInvasionFleets = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(invasionFleetIDs)) + print "Invasion Fleets Without Missions: " + str(numInvasionFleets) - planetIDs = list(set(competitorPlanetIDs) - set(invasionTargetedPlanetIDs)) - print "Evaluated PlanetIDs: " + str(planetIDs) + evaluatedPlanetIDs = list(set(competitorPlanetIDs) - set(invasionTargetedPlanetIDs)) + # print "Evaluated PlanetIDs: " + str(evaluatedPlanetIDs) - evaluatedPlanets = assignInvasionValues(planetIDs, AIFleetMissionType.FLEET_MISSION_INVASION, fleetSupplyablePlanetIDs, empire) + evaluatedPlanets = assignInvasionValues(evaluatedPlanetIDs, AIFleetMissionType.FLEET_MISSION_INVASION, fleetSupplyablePlanetIDs, empire) sortedPlanets = evaluatedPlanets.items() sortedPlanets.sort(lambda x, y: cmp(x[1], y[1]), reverse=True) @@ -50,11 +63,9 @@ AIstate.opponentPlanetIDs = sortedPlanets def getInvasionTargetedPlanetIDs(planetIDs, missionType, empireID): - "return list of Empire owned or being invaded planets" + "return list of being invaded planets" universe = fo.getUniverse() - empire = fo.getEmpire() - empireID = empire.empireID invasionAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([missionType]) targetedPlanets = [] @@ -69,19 +80,6 @@ return targetedPlanets -def getAllOwnedPlanetIDs(planetIDs): - "return list of owned planetIDs" - - universe = fo.getUniverse() - allOwnedPlanetIDs = [] - for planetID in planetIDs: - planet = universe.getPlanet(planetID) - planetPopulation = planet.currentMeterValue(fo.meterType.population) - if not planet.unowned or planetPopulation > 0: - allOwnedPlanetIDs.append(planetID) - - return allOwnedPlanetIDs - def assignInvasionValues(planetIDs, missionType, fleetSupplyablePlanetIDs, empire): "creates a dictionary that takes planetIDs as key and their invasion score as value" Modified: trunk/FreeOrion/default/AI/PlanetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2011-12-25 09:05:19 UTC (rev 4540) +++ trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2011-12-25 19:17:09 UTC (rev 4541) @@ -1,26 +1,26 @@ import freeOrionAIInterface as fo def getPlanetsInSystemsIDs(systemIDs): - "creates a list with all planets known to the empire" + "return list of planets in systems" universe = fo.getUniverse() planetIDs = [] for systemID in systemIDs: - system = universe.getSystem(systemID) - if (system == None): continue + if system == None: continue - planetIDs.extend(system.planetIDs) + planetIDs.extend(list(system.planetIDs)) # added list return planetIDs def getOwnedPlanetsByEmpire(planetIDs, empireID): "return list of planets owned by empireID" + universe = fo.getUniverse() + result = [] - universe = fo.getUniverse() for planetID in planetIDs: planet = universe.getPlanet(planetID) if (not planet.unowned) and planet.ownedBy(empireID): @@ -28,8 +28,23 @@ return result +def getAllOwnedPlanetIDs(planetIDs): + "return list of all owned planetIDs" + + universe = fo.getUniverse() + + allOwnedPlanetIDs = [] + + for planetID in planetIDs: + planet = universe.getPlanet(planetID) + planetPopulation = planet.currentMeterValue(fo.meterType.population) + if not planet.unowned or planetPopulation > 0: + allOwnedPlanetIDs.append(planetID) + + return allOwnedPlanetIDs + def getCapitalID(): - "return planet id of empire capital" + "return planetID of empire capital" empire = fo.getEmpire() capitalID = empire.capitalID Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2011-12-25 09:05:19 UTC (rev 4540) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2011-12-25 19:17:09 UTC (rev 4541) @@ -14,6 +14,13 @@ ColonisationAI.getColonyFleets() # sets AIstate.colonisablePlanetIDs and AIstate.outpostPlanetIDs InvasionAI.getInvasionFleets() # sets AIstate.opponentPlanetIDs + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_FOOD, calculateFoodPriority()) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_MINERALS, calculateMineralsPriority()) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_PRODUCTION, calculateIndustryPriority()) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_RESEARCH, 10) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_TRADE, 0) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_CONSTRUCTION, 0) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION, calculateExplorationPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_OUTPOST, calculateOutpostPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, calculateColonisationPriority()) @@ -21,18 +28,13 @@ foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_MILITARY, 20) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_BUILDINGS, 25) - foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_FOOD, calculateFoodPriority()) - foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_PRODUCTION, calculateIndustryPriority()) - foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_MINERALS, calculateMineralsPriority()) - foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_RESEARCH, 10) - foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_TRADE, 0) - foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESEARCH_LEARNING, calculateLearningPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESEARCH_GROWTH, calculateGrowthPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESEARCH_PRODUCTION, calculateTechsProductionPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESEARCH_CONSTRUCTION, calculateConstructionPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESEARCH_ECONOMICS, 0) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESEARCH_SHIPS, calculateShipsPriority()) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESEARCH_DEFENSE, 0) # foAI.foAIstate.printPriorities() @@ -93,10 +95,10 @@ numColonyships = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(colonyshipIDs)) colonisationPriority = 100 * (numColonisablePlanetIDs - numColonyships) / numColonisablePlanetIDs - print "" - print "Number of Colony Ships : " + str(numColonyships) - print "Number of Colonisable planets : " + str(numColonisablePlanetIDs) - print "Priority for colony ships : " + str(colonisationPriority) + # print "" + # print "Number of Colony Ships : " + str(numColonyships) + # print "Number of Colonisable planets : " + str(numColonisablePlanetIDs) + # print "Priority for colony ships : " + str(colonisationPriority) if colonisationPriority < 0: return 0 @@ -107,17 +109,17 @@ numOutpostPlanetIDs = len(AIstate.colonisableOutpostIDs) completedTechs = getCompletedTechs() - if numOutpostPlanetIDs == 0 or not 'GRO_HABITATION_DOMES' in completedTechs: + if numOutpostPlanetIDs == 0 or not 'GRO_ENV_ENCAPSUL' in completedTechs: return 0 outpostShipIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST) numOutpostShips = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(outpostShipIDs)) outpostPriority = 101 * (numOutpostPlanetIDs - numOutpostShips) / numOutpostPlanetIDs - print "" - print "Number of Outpost Ships : " + str(numOutpostShips) - print "Number of Colonisable outposts: " + str(numOutpostPlanetIDs) - print "Priority for outpost ships : " + str(outpostPriority) + # print "" + # print "Number of Outpost Ships : " + str(numOutpostShips) + # print "Number of Colonisable outposts: " + str(numOutpostPlanetIDs) + # print "Priority for outpost ships : " + str(outpostPriority) if outpostPriority < 0: return 0 @@ -133,10 +135,10 @@ numTroopShips = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(troopShipIDs)) invasionPriority = 105 * (numOpponentPlanetIDs - numTroopShips) / numOpponentPlanetIDs - print "" - print "Number of Troop Ships : " + str(numTroopShips) - print "Number of Opponent Planets: " + str(numOpponentPlanetIDs) - print "Priority for Troop Ships : " + str(invasionPriority) + # print "" + # print "Number of Troop Ships Without Missions: " + str(numTroopShips) + # print "Number of Opponent Planets: " + str(numOpponentPlanetIDs) + # print "Priority for Troop Ships : " + str(invasionPriority) if invasionPriority < 0: return 0 @@ -218,34 +220,34 @@ "calculates the demand for techs growth category" productionPriority = calculateTopProductionQueuePriority() - if productionPriority == 7: + if productionPriority == 8: return 70 - elif productionPriority != 7: + elif productionPriority != 8: return 0 def calculateTechsProductionPriority(): "calculates the demand for techs production category" productionPriority = calculateTopProductionQueuePriority() - if productionPriority == 6 or productionPriority == 8: + if productionPriority == 7 or productionPriority == 9: return 60 - elif productionPriority != 6 or productionPriority != 8: + elif productionPriority != 7 or productionPriority != 9: return 0 def calculateConstructionPriority(): "calculates the demand for techs construction category" productionPriority = calculateTopProductionQueuePriority() - if productionPriority == 5 or productionPriority == 10: + if productionPriority == 6 or productionPriority == 11: return 80 - elif productionPriority != 5 or productionPriority != 10: + elif productionPriority != 6 or productionPriority != 11: return 30 def calculateShipsPriority(): "calculates the demand for techs ships category" productionPriority = calculateTopProductionQueuePriority() - if productionPriority == 9: + if productionPriority == 10: return 90 - elif productionPriority != 9: + elif productionPriority != 10: return 0 Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2011-12-25 09:05:19 UTC (rev 4540) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2011-12-25 19:17:09 UTC (rev 4541) @@ -1,9 +1,8 @@ import freeOrionAIInterface as fo import FreeOrionAI as foAI -from EnumsAI import AIExplorableSystemType, AIPriorityType, getAIPriorityResourceTypes, getAIPriorityProductionTypes, AIFocusType, AIFleetMissionType +from EnumsAI import AIExplorableSystemType, AIPriorityType, getAIPriorityResourceTypes, getAIPriorityProductionTypes, AIFocusType import PlanetUtilsAI import AIstate -from FleetUtilsAI import extractFleetIDsWithoutMissionTypes, getEmpireFleetIDsByRole def generateProductionOrders(): "generate production orders" @@ -21,18 +20,6 @@ print " Wasted Production Points: " + str(wastedPP) print "" - colonisablePlanetIDs = AIstate.colonisablePlanetIDs - for element in colonisablePlanetIDs: - print " Colonizable Planet ID, Score: " + str(element) - - colonyFleetIDs = getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION) - for element in colonyFleetIDs: - print " Colony Fleet ID: " + str(element) - - numColonyFleets = len(extractFleetIDsWithoutMissionTypes(colonyFleetIDs)) - print " Number of Colony Fleets Without Missions: " + str(numColonyFleets) - print "" - print "Possible building types to build:" possibleBuildingTypes = empire.availableBuildingTypes for buildingTypeID in possibleBuildingTypes: @@ -78,27 +65,27 @@ colonyShipName = "Colony Ship" outpostShipName = "Outpost Ship" troopShipName = "Troop Ship" - if topPriority == 5 and shipDesign.name(True) == explorationShipName: + if topPriority == 6 and shipDesign.name(True) == explorationShipName: # exploration ship print "" print "adding new ship to production queue: " + shipDesign.name(True) fo.issueEnqueueShipProductionOrder(shipDesignID, locationIDs[0]) - elif topPriority == 6 and shipDesign.canColonize and shipDesign.name(True) == outpostShipName: + elif topPriority == 7 and shipDesign.canColonize and shipDesign.name(True) == outpostShipName: # outpost ship print "" print "adding new ship to production queue: " + shipDesign.name(True) fo.issueEnqueueShipProductionOrder(shipDesignID, locationIDs[0]) - elif topPriority == 7 and shipDesign.canColonize and shipDesign.name(True) == colonyShipName: + elif topPriority == 8 and shipDesign.canColonize and shipDesign.name(True) == colonyShipName: # colony ship print "" print "adding new ship to production queue: " + shipDesign.name(True) fo.issueEnqueueShipProductionOrder(shipDesignID, locationIDs[0]) - elif topPriority == 8 and shipDesign.name(True) == troopShipName: + elif topPriority == 9 and shipDesign.canInvade and shipDesign.name(True) == troopShipName: # troop ship print "" print "adding new ship to production queue: " + shipDesign.name(True) fo.issueEnqueueShipProductionOrder(shipDesignID, locationIDs[0]) - elif topPriority == 9 and shipDesign.isArmed: + elif topPriority == 10 and shipDesign.isArmed: # military ship print "" print "adding new ship to production queue: " + shipDesign.name(True) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2011-12-25 09:05:19 UTC (rev 4540) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2011-12-25 19:17:09 UTC (rev 4541) @@ -1,4 +1,3 @@ -# TechsListsAI module is utilized by ResearchAI module # AI can not currently add new building types to production queue # AI can not currently design or build custom ships # individual techs are to be removed from unusable list as AI programming progresses @@ -9,18 +8,16 @@ unusableTechs = [ 'CON_ART_HEAVENLY', - 'CON_ART_MOON', 'CON_ART_PLANET', 'CON_CONC_CAMP', 'CON_FRC_ENRG_CAMO', 'CON_INFRA_ECOL', - 'CON_MEGALITH', - 'CON_ORGANIC_STRC', + 'CON_ORGANIC_STRC', 'CON_PLANET_DRIVE', 'CON_SPACE_ELEVATOR', 'CON_STARGATE', 'CON_TRANS_ARCH', - 'CON_TRANS_STRC', + 'DEF_LIGHTHOUSE', 'GRO_BIOTERROR', 'GRO_GENOME_BANK', 'GRO_GAIA_TRANS', @@ -30,8 +27,7 @@ 'GRO_SUSPENDED_ANIMATION', 'GRO_TERRAFORM', 'LRN_ART_BLACK_HOLE', - 'LRN_COLLECTIVE_NET', - 'LRN_ENCLAVE_VOID', + 'LRN_ENCLAVE_VOID', 'LRN_GATEWAY_VOID', 'LRN_MIND_VOID', 'LRN_OBSERVATORY_I', @@ -42,38 +38,29 @@ 'LRN_TRANSCEND', 'LRN_UNIF_CONC', 'LRN_XENOARCH', - 'LRN_XENOARCH_RESTORE', - 'PRO_BLACK_HOLE_POW_GEN', - 'PRO_ENERGY_CONV', + 'PRO_ENERGY_CONV', 'PRO_ENVIRO_MINING', - 'PRO_GAS_GIANT_GEN', - 'PRO_HEAVY_MINING_I', - 'PRO_HYPER_DAM', - 'PRO_INDUSTRY_CENTER_I', + 'PRO_HEAVY_MINING_I', + 'PRO_INDUSTRY_CENTER_I', 'PRO_INDUSTRY_CENTER_II', 'PRO_INDUSTRY_CENTER_III', - 'PRO_MATENG_REPLIC', - 'PRO_NEUTRONIUM_EXTRACTION', + 'PRO_NEUTRONIUM_EXTRACTION', 'PRO_NDIM_ASSMB', 'PRO_ORBITAL_GEN', 'PRO_ORBITAL_MINE', 'PRO_SINGULAR_GEN', 'PRO_SOL_ORB_GEN', 'PRO_ZERO_GEN', - 'SHP_AGREG_AST_HULL', - 'SHP_ANTIMAT_TORP', + 'SHP_ANTIMAT_TORP', 'SHP_ANTIMATTER_TANK', - 'SHP_AST_HULL', - 'SHP_ASTEROID_HULLS', + 'SHP_ASTEROID_HULLS', 'SHP_ASTEROID_REFORM', 'SHP_BIOADAPT_HULL', 'SHP_BIOBOMBER', 'SHP_BIOINTERCEPTOR', 'SHP_BIONEUR_SPEC', 'SHP_BOMBER', - 'SHP_CAMO_AST_HULL', - 'SHP_CAMO_AST_PARTS', - 'SHP_COMP_ENRG_HULL', + 'SHP_CAMO_AST_HULL', 'SHP_CONT_BIOADAPT', 'SHP_CONT_SYMB', 'SHP_CONTGRAV_MAINT', @@ -83,18 +70,15 @@ 'SHP_DEFLECTOR', 'SHP_DEUTERIUM_TANK', 'SHP_DIST_MOD', + 'SHP_DOMESTIC_MONSTER', 'SHP_ENDOMORPH_HULL', 'SHP_ENDOSYMB_HULL', 'SHP_ENRG_BOUND_MAN', - 'SHP_FLEET_LOGISTICS', - 'SHP_FRAC_ENRG_HULL', - 'SHP_FRC_ENRG_COMP', + 'SHP_FRC_ENRG_COMP', 'SHP_HAB_MEGAFAUN', - 'SHP_HEAVY_AST_HULL', - 'SHP_INTERCEPTOR', + 'SHP_INTERCEPTOR', 'SHP_LEAD_PLATE', - 'SHP_LIGHTHOUSE', - 'SHP_LOGISTICS_FAC', + 'SHP_LOGISTICS_FAC', 'SHP_MASS_DRIVER', 'SHP_MASSPROP_SPEC', 'SHP_MIDCOMB_LOG', @@ -105,9 +89,10 @@ 'SHP_MULTICELL_CAST', 'SHP_MULTISPEC_SHIELD', 'SHP_NANOROBO_HULL', - 'SHP_NANOROBO_MAINT', - 'SHP_NEUTRONIUM_PLATE', - 'SHP_NEUTRONIUM_PLATE_NUC_MIS', + 'SHP_NANOROBO_MAINT', + 'SHP_NEUTRON_SCANNER', + 'SHP_NEUTRONIUM_PLATE', + 'SHP_NEUTRONIUM_PLATE_NUC_MIS', 'SHP_NEUTRONIUM_PLATE_SPEC_MIS', 'SHP_NUCLEAR_MISSILE', 'SHP_ORG_HULL', @@ -116,26 +101,38 @@ 'SHP_PLASMA_TORP', 'SHP_PULSE_LASER', 'SHP_PROTOPLASM_HULL', - 'SHP_QUANT_ENRG_HULL', - 'SHP_QUANT_ENRG_MAG', + 'SHP_QUANT_ENRG_MAG', + 'SHP_RADAR', 'SHP_RAVEN_HULL', 'SHP_RECON_FIGHT', - 'SHP_ROBO_HULL', - 'SHP_ROCK_PLATE', - 'SHP_SCAT_AST_HULL', - 'SHP_SELFGRAV_HULL', + 'SHP_ROCK_PLATE', + 'SHP_SCAT_AST_HULL', + 'SHP_SELFGRAV_HULL', + 'SHP_SENSORS', 'SHP_SENT_HULL', - 'SHP_SMALL_AST_HULL', - 'SHP_SOLAR_CONT', - 'SHP_SOLAR_HULL', - 'SHP_SPACE_FLUX_DRIVE', - 'SHP_SPACE_FLUX_HULL', - 'SHP_SPECTRAL_MISSILE', + 'SHP_SOLAR_CONT', + 'SHP_SPACE_FLUX_DRIVE', + 'SHP_SPECTRAL_MISSILE', 'SHP_STAT_MULTICELL_HULL', 'SHP_SYMB_HULL', 'SHP_TITAN_HULL', 'SHP_TRANSSPACE_DRIVE', 'SHP_TRANSSPACE_HULL', + 'SHP_WEAPON_3', + 'SHP_WEAPON_4', + 'SHP_WEAPON_5', + 'SHP_WEAPON_6', + 'SHP_WEAPON_7', + 'SHP_WEAPON_8', + 'SHP_WEAPON_9', + 'SHP_WEAPON_10', + 'SHP_WEAPON_11', + 'SHP_WEAPON_12', + 'SHP_WEAPON_13', + 'SHP_WEAPON_14', + 'SHP_WEAPON_15', + 'SHP_WEAPON_16', + 'SHP_WEAPON_17', 'SHP_ZORTRIUM_PLATE'] return unusableTechs @@ -146,8 +143,7 @@ primaryLearningTechs = [ 'LRN_ALGO_ELEGANCE', - 'LRN_ARTIF_MINDS', - 'LRN_AUTOLAB_I'] + 'LRN_ARTIF_MINDS'] return primaryLearningTechs @@ -156,9 +152,8 @@ primaryGroTechs = [ - 'GRO_ENV_ENCAPSUL', - 'GRO_HABITATION_DOMES'] - + 'GRO_ENV_ENCAPSUL'] + return primaryGroTechs def primaryShipsTechsList(): @@ -166,9 +161,6 @@ primaryShipsTechs = [ - 'SHP_GAL_EXPLO', - 'SHP_SPACE_TACTICS', - 'SHP_SPACE_WEAPON', - 'SHP_ION_CANNON'] + 'SHP_WEAPON_2'] return primaryShipsTechs |
From: <geo...@us...> - 2012-01-02 06:28:04
|
Revision: 4554 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4554&view=rev Author: geoffthemedio Date: 2012-01-02 06:27:57 +0000 (Mon, 02 Jan 2012) Log Message: ----------- Military AI patch by Grey Area. Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/AIFleetOrder.py trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/PlanetUtilsAI.py trunk/FreeOrion/default/AI/PriorityAI.py Added Paths: ----------- trunk/FreeOrion/default/AI/MilitaryAI.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -80,6 +80,8 @@ result = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_COLONISE, fleetAITarget, aiTarget) elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_INVASION: result = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_INVADE, fleetAITarget, aiTarget) + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_MILITARY: + result = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_MILITARY, fleetAITarget, aiTarget) # TODO: implement other mission types return result @@ -87,7 +89,6 @@ def isValidFleetMissionAITarget(self, aiFleetMissionType, aiTarget): if aiTarget.isValid() == False: return False - if aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_EXPLORATION: if aiTarget.getAITargetType() == AITargetType.TARGET_SYSTEM: empire = fo.getEmpire() @@ -121,8 +122,15 @@ planetPopulation = planet.currentMeterValue(fo.meterType.population) if not planet.unowned or planetPopulation > 0: return True + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_MILITARY: + universe = fo.getUniverse() + fleet = universe.getFleet(self.getAITargetID()) + if not fleet.hasArmedShips: + return False + if aiTarget.getAITargetType() == AITargetType.TARGET_SYSTEM: + return True # TODO: implement other mission types - + return False def cleanInvalidAITargets(self): Modified: trunk/FreeOrion/default/AI/AIFleetOrder.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetOrder.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/AIFleetOrder.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -106,6 +106,22 @@ planetPopulation = planet.currentMeterValue(fo.meterType.population) if not planet.unowned or planetPopulation > 0: targetAITargetTypeValid = True + # military + elif AIFleetOrderType.ORDER_MILITARY == self.getAIFleetOrderType(): + # with ship + if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): + ship = universe.getShip(self.getSourceAITarget().getTargetID()) + if ship.isArmed: + sourceAITargetTypeValid = True + # with fleet + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) + if fleet.hasArmedShips: + sourceAITargetTypeValid = True + # military system + if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType(): + system = universe.getSystem(self.getTargetAITarget().getTargetID()) + targetAITargetTypeValid = True # move elif AIFleetOrderType.ORDER_MOVE == self.getAIFleetOrderType(): # with fleet @@ -212,6 +228,24 @@ if (ship != None) and (fleet.systemID == planet.systemID) and ship.canInvade: return True return False + # military + elif AIFleetOrderType.ORDER_MILITARY == self.getAIFleetOrderType(): + fleetID = None + shipID = None + if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): + shipID = self.getSourceAITarget().getTargetID() + ship = universe.getShip(shipID) + fleetID = ship.fleetID + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + fleetID = self.getSourceAITarget().getTargetID() + shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_MILITARY) + + ship = universe.getShip(shipID) + fleet = universe.getFleet(fleetID) + system = universe.getSystem(self.getTargetAITarget().getTargetID()) + if (ship != None) and (fleet.systemID == system.systemID) and ship.isArmed: + return True + return False # split fleet elif AIFleetOrderType.ORDER_SPLIT_FLEET == self.getAIFleetOrderType(): fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) @@ -256,6 +290,16 @@ shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_MILITARY_INVASION) fo.issueInvadeOrder(shipID, self.getTargetAITarget().getTargetID()) + # military + elif AIFleetOrderType.ORDER_MILITARY == self.getAIFleetOrderType(): + shipID = None + if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): + shipID = self.getSourceAITarget().getTargetID() + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + fleetID = self.getSourceAITarget().getTargetID() + shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_MILITARY) + + fo.issueFleetMoveOrder(fleetID, self.getTargetAITarget().getTargetID()) # move or resupply elif (AIFleetOrderType.ORDER_MOVE == self.getAIFleetOrderType()) or (AIFleetOrderType.ORDER_RESUPPLY == self.getAIFleetOrderType()): fleetID = self.getSourceAITarget().getTargetID() @@ -269,6 +313,7 @@ fo.issueNewFleetOrder(str(shipID), shipID) self.__setExecutionCompleted() + # attack elif (AIFleetOrderType.ORDER_ATACK == self.getAIFleetOrderType()): fleetID = self.getSourceAITarget().getTargetID() systemID = self.getTargetAITarget().getRequiredSystemAITargets()[0].getTargetID() Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/AIstate.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -8,11 +8,16 @@ foodStockpileSize = 1 # food stored per population minimalColoniseValue = 4 # minimal value for a planet to be colonised, now a size 2 terran world colonisablePlanetIDs = [] # TODO: move into AIstate +colonyTargetedSystemIDs = [] colonisableOutpostIDs = [] # TODO: move into AIstate +outpostTargetedSystemIDs = [] +opponentPlanetIDs = [] +invasionTargetedSystemIDs = [] +militarySystemIDs = [] +militaryTargetedSystemIDs = [] colonyFleetIDs = [] outpostFleetIDs = [] invasionFleetIDs = [] -opponentPlanetIDs = [] militaryFleetIDs = [] # AIstate class Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -46,7 +46,12 @@ print "Unpopulated PlanetIDs: " + str(unpopulatedPlanetIDs) print "" + print "Colony Targeted SystemIDs: " + str(AIstate.colonyTargetedSystemIDs) colonyTargetedPlanetIDs = getColonyTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, empireID) + allColonyTargetedSystemIDs = PlanetUtilsAI.getSystems(colonyTargetedPlanetIDs) + + # export colony targeted systems for other AI modules + AIstate.colonyTargetedSystemIDs = allColonyTargetedSystemIDs print "Colony Targeted PlanetIDs: " + str(colonyTargetedPlanetIDs) colonyFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION) @@ -59,7 +64,12 @@ print "Colony Fleets Without Missions: " + str(numColonyFleets) print "" + print "Outpost Targeted SystemIDs: " + str(AIstate.outpostTargetedSystemIDs) outpostTargetedPlanetIDs = getOutpostTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, empireID) + allOutpostTargetedSystemIDs = PlanetUtilsAI.getSystems(outpostTargetedPlanetIDs) + + # export outpost targeted systems for other AI modules + AIstate.outpostTargetedSystemIDs = allOutpostTargetedSystemIDs print "Outpost Targeted PlanetIDs: " + str(outpostTargetedPlanetIDs) outpostFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST) Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -86,9 +86,10 @@ ORDER_ATACK = 7 ORDER_DEFEND = 8 ORDER_INVADE = 9 + ORDER_MILITARY = 10 def getAIFleetOrderTypes(): - return __getInterval(0, 9) + return __getInterval(0, 10) class AIShipRoleType(object): SHIP_ROLE_INVALID = -1 @@ -100,9 +101,10 @@ SHIP_ROLE_CIVILIAN_COLONISATION = 5 SHIP_ROLE_CIVILIAN_OUTPOST = 6 SHIP_ROLE_MILITARY_INVASION = 7 + SHIP_ROLE_MILITARY = 8 def getAIShipRolesTypes(): - return __getInterval(0, 7) + return __getInterval(0, 8) class AITargetType(object): TARGET_INVALID = -1 Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -26,7 +26,6 @@ if fleet == None: return False for shipID in fleet.shipIDs: - ship = universe.getShip(shipID) if (foAI.foAIstate.getShipRole(ship.design.id) == shipRole): return True @@ -135,6 +134,8 @@ return AIFleetMissionType.FLEET_MISSION_INVASION if favouriteRole == AIShipRoleType.SHIP_ROLE_MILITARY_ATTACK: return AIFleetMissionType.FLEET_MISSION_ATTACK + if favouriteRole == AIShipRoleType.SHIP_ROLE_MILITARY: + return AIFleetMissionType.FLEET_MISSION_MILITARY return AIShipRoleType.SHIP_ROLE_INVALID @@ -160,7 +161,7 @@ if ship.design.parts.__contains__("GT_TROOP_POD"): return AIShipRoleType.SHIP_ROLE_MILITARY_INVASION elif ship.isArmed: - return AIShipRoleType.SHIP_ROLE_MILITARY_ATTACK + return AIShipRoleType.SHIP_ROLE_MILITARY else: return AIShipRoleType.SHIP_ROLE_CIVILIAN_EXPLORATION @@ -169,13 +170,16 @@ def generateAIFleetOrdersForAIFleetMissions(): "generates fleet orders from targets" - print "Exploration fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_EXPLORATION)) - print "Colonisation fleets: " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION)) - print "Outpost fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST)) - print "Attack fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ATTACK)) - print "Defend fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_DEFEND)) - print "Invasion fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION)) print "" + print "Exploration Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_EXPLORATION)) + print "Colonization Fleets: " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION)) + print "Outpost Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST)) + print "Attack Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ATTACK)) + print "Defend Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_DEFEND)) + print "Invasion Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION)) + print "Military Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY)) + + print "" print "Explored systems :" printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED)) print "Unexplored systems:" @@ -187,7 +191,7 @@ for explorationAIFleetMission in explorationAIFleetMissions: print " " + str(explorationAIFleetMission) - print "Colonisation targets: fleetID[MissionType]:{TargetType:targetID}" + print "Colonization targets: fleetID[MissionType]:{TargetType:targetID}" colonisationAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_COLONISATION]) for colonisationAIFleetMission in colonisationAIFleetMissions: print " " + str(colonisationAIFleetMission) @@ -197,6 +201,11 @@ for invasionAIFleetMission in invasionAIFleetMissions: print " " + str(invasionAIFleetMission) + print "Military targets: fleetID[MissionType]:{TargetType:targetID}" + militaryAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_MILITARY]) + for militaryAIFleetMission in militaryAIFleetMissions: + print " " + str(militaryAIFleetMission) + aiFleetMissions = foAI.foAIstate.getAllAIFleetMissions() for aiFleetMission in aiFleetMissions: aiFleetMission.generateAIFleetOrders() Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -9,6 +9,7 @@ import ProductionAI import ResourcesAI import InvasionAI +import MilitaryAI # AIstate foAIstate = None @@ -97,9 +98,12 @@ # at end of this function, fo.doneTurn() should be called to indicate to the client that orders are finished # and can be sent to the server for processing. def generateOrders(): + universe = fo.getUniverse() empire = fo.getEmpire() - print "Empire: " + empire.name + " TURN: " + str(fo.currentTurn()) - print "Capital: " + str(empire.capitalID) + planetID = empire.capitalID + planet = universe.getPlanet(planetID) + print "EmpireID: " + str(empire.empireID) + " Name: " + empire.name + " Turn: " + str(fo.currentTurn()) + print "CapitalID: " + str(planetID) + " Name: " + planet.name + " Species: " + planet.speciesName # turn cleanup splitFleet() @@ -115,6 +119,7 @@ ExplorationAI.assignScoutsToExploreSystems() ColonisationAI.assignColonyFleetsToColonise() InvasionAI.assignInvasionFleetsToInvade() + MilitaryAI.assignMilitaryFleetsToSystems() FleetUtilsAI.generateAIFleetOrdersForAIFleetMissions() FleetUtilsAI.issueAIFleetOrdersForAIFleetMissions() ResearchAI.generateResearchOrders() Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -34,7 +34,12 @@ print "Competitor PlanetIDs: " + str(competitorPlanetIDs) print "" + print "Invasion Targeted SystemIDs: " + str(AIstate.invasionTargetedSystemIDs) invasionTargetedPlanetIDs = getInvasionTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_INVASION, empireID) + allInvasionTargetedSystemIDs = PlanetUtilsAI.getSystems(invasionTargetedPlanetIDs) + + # export invasion targeted systems for other AI modules + AIstate.invasionTargetedSystemIDs = allInvasionTargetedSystemIDs print "Invasion Targeted PlanetIDs: " + str(invasionTargetedPlanetIDs) invasionFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) @@ -78,7 +83,7 @@ if invasionAIFleetMission.hasTarget(missionType, aiTarget): targetedPlanets.append(planetID) - return targetedPlanets + return targetedPlanets def assignInvasionValues(planetIDs, missionType, fleetSupplyablePlanetIDs, empire): "creates a dictionary that takes planetIDs as key and their invasion score as value" @@ -128,7 +133,7 @@ i = 0 - for planetID_value_pair in evaluatedPlanets: + for planetID_value_pair in evaluatedPlanets: # evaluatedPlanets is a dictionary if i >= len(invasionFleetIDs): return fleetID = invasionFleetIDs[i] Added: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py (rev 0) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -0,0 +1,159 @@ +import freeOrionAIInterface as fo +import FreeOrionAI as foAI +import AIstate +import AITarget +from EnumsAI import AIFleetMissionType, AITargetType +import FleetUtilsAI +import PlanetUtilsAI + +def getMilitaryFleets(): + "get armed military fleets" + + allMilitaryFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY) + AIstate.militaryFleetIDs = FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allMilitaryFleetIDs) + + # get systems to defend + universe = fo.getUniverse() + empire = fo.getEmpire() + empireID = empire.empireID + capitalID = empire.capitalID + capitalPlanet = universe.getPlanet(capitalID) + capitalPlanetSystem = capitalPlanet.systemID + + capitalSystemID = [] + capitalSystemID.append(capitalPlanetSystem) + + fleetSupplyableSystemIDs = list(empire.fleetSupplyableSystemIDs) + + exploredSystemIDs = empire.exploredSystemIDs + # print "Explored SystemIDs: " + str(list(exploredSystemIDs)) + + exploredPlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(exploredSystemIDs) + allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) + allPopulatedSystemIDs = PlanetUtilsAI.getAllPopulatedSystemIDs(allOwnedPlanetIDs) + print "" + print "All Populated SystemIDs: " + str(list(set(allPopulatedSystemIDs))) + + empirePlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + empireOccupiedSystemIDs = list(set(PlanetUtilsAI.getSystemsOccupiedByEmpire(empirePlanetIDs, empireID))) + print "" + print "Empire Capital SystemID: " + str(capitalSystemID) + # print "Empire Occupied SystemIDs: " + str(empireOccupiedSystemIDs) + + empireProvinceSystemIDs = list(set(empireOccupiedSystemIDs) - set(capitalSystemID)) + print "Empire Province SystemIDs: " + str(empireProvinceSystemIDs) + + competitorSystemIDs = list(set(allPopulatedSystemIDs) - set(empireOccupiedSystemIDs)) + print "Competitor SystemIDs: " + str(competitorSystemIDs) + + otherTargetedSystemIDs = list(set(AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs + AIstate.invasionTargetedSystemIDs)) + print "Other Targeted SystemIDs: " + str(otherTargetedSystemIDs) + + militaryTheaterSystemIDs = list(set(fleetSupplyableSystemIDs + empireOccupiedSystemIDs + competitorSystemIDs + otherTargetedSystemIDs)) + print "Military Theater SystemIDs: " + str(militaryTheaterSystemIDs) + + allMilitaryTargetedSystemIDs = getMilitaryTargetedSystemIDs(universe.systemIDs, AIFleetMissionType.FLEET_MISSION_MILITARY, empireID) + # export military targeted systems for other AI modules + AIstate.militaryTargetedSystemIDs = allMilitaryTargetedSystemIDs + print "" + print "Military Targeted SystemIDs: " + str(allMilitaryTargetedSystemIDs) + + militaryFleetIDs = allMilitaryFleetIDs + if not militaryFleetIDs: + print "Available Military Fleets: 0" + else: + print "Military FleetIDs: " + str(allMilitaryFleetIDs) + + numMilitaryFleets = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(militaryFleetIDs)) + print "Military Fleets Without Missions: " + str(numMilitaryFleets) + + evaluatedSystemIDs = list(set(militaryTheaterSystemIDs) - set(allMilitaryTargetedSystemIDs)) + # print "Evaluated SystemIDs: " +str(evaluatedSystemIDs) + + evaluatedSystems = assignMilitaryValues(evaluatedSystemIDs, AIFleetMissionType.FLEET_MISSION_MILITARY, empireProvinceSystemIDs, otherTargetedSystemIDs, empire) + + sortedSystems = evaluatedSystems.items() + sortedSystems.sort(lambda x, y: cmp(x[1], y[1]), reverse=True) + + print "" + print "Military SystemIDs:" + for evaluationPair in sortedSystems: + print " ID|Score: " + str(evaluationPair) + + # export military systems for other AI modules + AIstate.militarySystemIDs = sortedSystems + +def getMilitaryTargetedSystemIDs(systemIDs, missionType, empireID): + "return list of military targeted systems" + + universe = fo.getUniverse() + militaryAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([missionType]) + + targetedSystems = [] + + for systemID in systemIDs: + system = universe.getSystem(systemID) + # add systems that are target of a mission + for militaryAIFleetMission in militaryAIFleetMissions: + aiTarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID) + if militaryAIFleetMission.hasTarget(missionType, aiTarget): + targetedSystems.append(systemID) + + return targetedSystems + +def assignMilitaryValues(systemIDs, missionType, empireProvinceSystemIDs, otherTargetedSystemIDs, empire): + "creates a dictionary that takes systemIDs as key and their military score as value" + + systemValues = {} + + for systemID in systemIDs: + systemValues[systemID] = evaluateSystem(systemID, missionType, empireProvinceSystemIDs, otherTargetedSystemIDs, empire) + + return systemValues + +def evaluateSystem(systemID, missionType, empireProvinceSystemIDs, otherTargetedSystemIDs, empire): + "return the military value of a system" + + universe = fo.getUniverse() + system = universe.getSystem(systemID) + if (system == None): return 0 + + # give preference to home system then closest systems + empireID = empire.empireID + capitalID = empire.capitalID + homeworld = universe.getPlanet(capitalID) + homeSystemID = homeworld.systemID + evalSystemID = system.systemID + leastJumpsPath = len(universe.leastJumpsPath(homeSystemID, evalSystemID, empireID)) + distanceFactor = 1.001/(leastJumpsPath + 1) + + if systemID == homeSystemID: + return 10 + elif systemID in empireProvinceSystemIDs: + return 3 + distanceFactor + elif systemID in otherTargetedSystemIDs: + return 2 + distanceFactor + else: + return 1 + .25 * distanceFactor + +def sendMilitaryFleets(militaryFleetIDs, evaluatedSystems, missionType): + "sends a list of military fleets to a list of system_value_pairs" + + i = 0 + + for systemID_value_pair in evaluatedSystems: # evaluatedSystems is a dictionary + if i >= len(militaryFleetIDs): return + + fleetID = militaryFleetIDs[i] + systemID = systemID_value_pair[0] + + aiTarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, systemID) + aiFleetMission = foAI.foAIstate.getAIFleetMission(fleetID) + aiFleetMission.addAITarget(missionType, aiTarget) + + i = i + 1 + +def assignMilitaryFleetsToSystems(): + # assign military fleets to military theater systems + + sendMilitaryFleets(AIstate.militaryFleetIDs, AIstate.militarySystemIDs, AIFleetMissionType.FLEET_MISSION_MILITARY) Modified: trunk/FreeOrion/default/AI/PlanetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -1,9 +1,9 @@ import freeOrionAIInterface as fo + def getPlanetsInSystemsIDs(systemIDs): "return list of planets in systems" universe = fo.getUniverse() - planetIDs = [] for systemID in systemIDs: @@ -18,7 +18,6 @@ "return list of planets owned by empireID" universe = fo.getUniverse() - result = [] for planetID in planetIDs: @@ -29,10 +28,9 @@ return result def getAllOwnedPlanetIDs(planetIDs): - "return list of all owned planetIDs" + "return list of all owned and populated planetIDs" universe = fo.getUniverse() - allOwnedPlanetIDs = [] for planetID in planetIDs: @@ -43,7 +41,49 @@ return allOwnedPlanetIDs -def getCapitalID(): +def getAllPopulatedSystemIDs(planetIDs): + "return list of all populated systemIDs" + + universe = fo.getUniverse() + allPopulatedSystemIDs = [] + + for planetID in planetIDs: + planet = universe.getPlanet(planetID) + systemID = planet.systemID + + allPopulatedSystemIDs.append(systemID) + + return allPopulatedSystemIDs + +def getSystemsOccupiedByEmpire(planetIDs, empireID): + "return list of systems occupied by empireID" + + universe = fo.getUniverse() + occupiedSystemIDs = [] + + for planetID in planetIDs: + planet = universe.getPlanet(planetID) + systemID = planet.systemID + + occupiedSystemIDs.append(systemID) + + return occupiedSystemIDs + +def getSystems(planetIDs): + "return list of systems containing planetIDs" + + universe = fo.getUniverse() + systemIDs = [] + + for planetID in planetIDs: + planet = universe.getPlanet(planetID) + systemID = planet.systemID + + systemIDs.append(systemID) + + return systemIDs + +def getCapitalID(): # to be deleted after update of ResourcesAI module "return planetID of empire capital" empire = fo.getEmpire() Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2012-01-02 06:26:10 UTC (rev 4553) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2012-01-02 06:27:57 UTC (rev 4554) @@ -1,3 +1,4 @@ +import freeOrionAIInterface as fo from EnumsAI import AIPriorityType, AIFleetMissionType, AIExplorableSystemType, getAIPriorityProductionTypes import AIstate import ColonisationAI @@ -4,15 +5,16 @@ import EnumsAI import FleetUtilsAI import FreeOrionAI as foAI -import freeOrionAIInterface as fo from ResearchAI import getCompletedTechs import InvasionAI +import MilitaryAI def calculatePriorities(): "calculates the priorities of the AI player" ColonisationAI.getColonyFleets() # sets AIstate.colonisablePlanetIDs and AIstate.outpostPlanetIDs - InvasionAI.getInvasionFleets() # sets AIstate.opponentPlanetIDs + InvasionAI.getInvasionFleets() # sets AIstate.invasionFleetIDs, AIstate.opponentPlanetIDs, and AIstate.invasionTargetedPlanetIDs + MilitaryAI.getMilitaryFleets() # sets AIstate.militaryFleetIDs and AIstate.militaryTargetedSystemIDs foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_FOOD, calculateFoodPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_MINERALS, calculateMineralsPriority()) @@ -25,7 +27,7 @@ foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_OUTPOST, calculateOutpostPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, calculateColonisationPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_INVASION, calculateInvasionPriority()) - foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_MILITARY, 20) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_MILITARY, calculateMilitaryPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_PRODUCTION_BUILDINGS, 25) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESEARCH_LEARNING, calculateLearningPriority()) @@ -64,6 +66,30 @@ return foodPriority +def calculateMineralsPriority(): + "calculates the demand for minerals by industry" + + empire = fo.getEmpire() + + # get current minerals and industry production + mineralsProduction = empire.resourceProduction(fo.resourceType.minerals) + mineralsStockpile = empire.resourceStockpile(fo.resourceType.minerals) + mineralsTurns = mineralsStockpile / (mineralsProduction + 0.001) + industryProduction = empire.resourceProduction(fo.resourceType.industry) + mineralsTarget = 10 * industryProduction + + mineralsPriority = (mineralsTarget - mineralsStockpile) / mineralsTarget * 99 + + print "" + print "Minerals Production: " + str(mineralsProduction) + print "Size of Minerals Stockpile: " + str(mineralsStockpile) + print "Target Minerals Stockpile: " + str(mineralsTarget) + # print "Minerals Production Turns: " + str(mineralsTurns) + # print "industry production : " + str(industryProduction) + print "Priority for Minerals: " + str(mineralsPriority) + + return mineralsPriority + def calculateExplorationPriority(): "calculates the demand for scouts by unexplored systems" @@ -74,7 +100,7 @@ if (numUnexploredSystems == 0) or (numScouts >= 2): return 0 - explorationPriority = 100 * (numUnexploredSystems - numScouts) / numUnexploredSystems + explorationPriority = 95 * (numUnexploredSystems - numScouts) / numUnexploredSystems print "" print "Number of Scouts : " + str(numScouts) @@ -93,7 +119,7 @@ colonyshipIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION) numColonyships = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(colonyshipIDs)) - colonisationPriority = 100 * (numColonisablePlanetIDs - numColonyships) / numColonisablePlanetIDs + colonisationPriority = 101 * (numColonisablePlanetIDs - numColonyships) / numColonisablePlanetIDs # print "" # print "Number of Colony Ships : " + str(numColonyships) @@ -114,7 +140,7 @@ outpostShipIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST) numOutpostShips = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(outpostShipIDs)) - outpostPriority = 101 * (numOutpostPlanetIDs - numOutpostShips) / numOutpostPlanetIDs + outpostPriority = 102 * (numOutpostPlanetIDs - numOutpostShips) / numOutpostPlanetIDs # print "" # print "Number of Outpost Ships : " + str(numOutpostShips) @@ -133,7 +159,7 @@ troopShipIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) numTroopShips = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(troopShipIDs)) - invasionPriority = 105 * (numOpponentPlanetIDs - numTroopShips) / numOpponentPlanetIDs + invasionPriority = 110 * (numOpponentPlanetIDs - numTroopShips) / numOpponentPlanetIDs # print "" # print "Number of Troop Ships Without Missions: " + str(numTroopShips) @@ -144,29 +170,24 @@ return invasionPriority -def calculateMineralsPriority(): - "calculates the demand for minerals by industry" +def calculateMilitaryPriority(): + "calculates the demand for military ships by military targeted systems" - empire = fo.getEmpire() + numMilitaryTargetedSystemIDs = len(AIstate.militaryTargetedSystemIDs) + militaryShipIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY) + numMilitaryShips = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(militaryShipIDs)) - # get current minerals and industry production - mineralsProduction = empire.resourceProduction(fo.resourceType.minerals) - mineralsStockpile = empire.resourceStockpile(fo.resourceType.minerals) - mineralsTurns = mineralsStockpile / (mineralsProduction + 0.001) - industryProduction = empire.resourceProduction(fo.resourceType.industry) - mineralsTarget = 10 * industryProduction + # build one more military ship than military targeted systems + militaryPriority = 100 * ((numMilitaryTargetedSystemIDs +2) - numMilitaryShips) / (numMilitaryTargetedSystemIDs + 1) - mineralsPriority = (mineralsTarget - mineralsStockpile) / mineralsTarget * 99 + # print "" + # print "Number of Military Ships Without Missions: " + str(numMilitaryShips) + # print "Number of Military Targeted Systems: " + str(numMilitaryTargetedSystemIDs) + # print "Priority for Military Ships: " + str(militaryPriority) - print "" - print "Minerals Production: " + str(mineralsProduction) - print "Size of Minerals Stockpile: " + str(mineralsStockpile) - print "Target Minerals Stockpile: " + str(mineralsTarget) - # print "Minerals Production Turns: " + str(mineralsTurns) - # print "industry production : " + str(industryProduction) - print "Priority for Minerals: " + str(mineralsPriority) + if militaryPriority < 0: return 0 - return mineralsPriority + return militaryPriority def calculateIndustryPriority(): "calculates the demand for industry" |
From: <geo...@us...> - 2012-01-06 20:19:44
|
Revision: 4576 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4576&view=rev Author: geoffthemedio Date: 2012-01-06 20:19:38 +0000 (Fri, 06 Jan 2012) Log Message: ----------- AI patch by Grey Area Modified Paths: -------------- trunk/FreeOrion/default/AI/PlanetUtilsAI.py trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/ResourcesAI.py Modified: trunk/FreeOrion/default/AI/PlanetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2012-01-06 16:22:57 UTC (rev 4575) +++ trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2012-01-06 20:19:38 UTC (rev 4576) @@ -27,6 +27,23 @@ return result +def getTypePlanetEmpireOwned(planetType): + "return list of specific type planets owned by empireID" + + universe = fo.getUniverse() + empire = fo.getEmpire() + empireID = empire.empireID + ownedPlanetIDs = getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + + ownedTypePlanetIDs = [] + + for planetID in ownedPlanetIDs: + planet = universe.getPlanet(planetID) + if planet.type == planetType: + ownedTypePlanetIDs.append(planetID) + + return ownedTypePlanetIDs + def getAllOwnedPlanetIDs(planetIDs): "return list of all owned and populated planetIDs" @@ -82,11 +99,3 @@ systemIDs.append(systemID) return systemIDs - -def getCapitalID(): # to be deleted after update of ResourcesAI module - "return planetID of empire capital" - - empire = fo.getEmpire() - capitalID = empire.capitalID - - return capitalID Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2012-01-06 16:22:57 UTC (rev 4575) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2012-01-06 20:19:38 UTC (rev 4576) @@ -1,17 +1,16 @@ import freeOrionAIInterface as fo +import FreeOrionAI as foAI +import AIstate +import EnumsAI from EnumsAI import AIPriorityType, AIFleetMissionType, AIExplorableSystemType, getAIPriorityProductionTypes -import AIstate import ColonisationAI -import EnumsAI import FleetUtilsAI -import FreeOrionAI as foAI from ResearchAI import getCompletedTechs -import InvasionAI +import InvasionAI import MilitaryAI def calculatePriorities(): - "calculates the priorities of the AI player" - + "calculates the priorities of the AI player" ColonisationAI.getColonyFleets() # sets AIstate.colonisablePlanetIDs and AIstate.outpostPlanetIDs InvasionAI.getInvasionFleets() # sets AIstate.invasionFleetIDs, AIstate.opponentPlanetIDs, and AIstate.invasionTargetedPlanetIDs MilitaryAI.getMilitaryFleets() # sets AIstate.militaryFleetIDs and AIstate.militaryTargetedSystemIDs @@ -19,7 +18,7 @@ foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_FOOD, calculateFoodPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_MINERALS, calculateMineralsPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_PRODUCTION, calculateIndustryPriority()) - foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_RESEARCH, 10) + foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_RESEARCH, calculateResearchPriority()) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_TRADE, 0) foAI.foAIstate.setPriority(AIPriorityType.PRIORITY_RESOURCE_CONSTRUCTION, 0) @@ -46,14 +45,14 @@ # foodStockpile == 0 => returns 100, foodStockpile == foodTarget => returns 0 empire = fo.getEmpire() - foodProduction = empire.resourceProduction(fo.resourceType.food) + foodProduction = empire.resourceProduction(fo.resourceType.food) foodStockpile = empire.resourceStockpile(fo.resourceType.food) foodTarget = 10 * empire.population() * AIstate.foodStockpileSize if (foodTarget == 0): return 0 - foodPriority = (foodTarget - foodStockpile) / foodTarget * 100 + foodPriority = (foodTarget - foodStockpile) / foodTarget * 115 print "" print "Food Production: " + str(foodProduction) @@ -90,6 +89,45 @@ return mineralsPriority +def calculateIndustryPriority(): + "calculates the demand for industry" + + empire = fo.getEmpire() + + # get current minerals and industry production + mineralsProduction = empire.resourceProduction(fo.resourceType.minerals) + mineralsStockpile = empire.resourceStockpile(fo.resourceType.minerals) + mineralsTurns = mineralsStockpile / (mineralsProduction + 0.001) + industryProduction = empire.resourceProduction(fo.resourceType.industry) + + # increase demand for industry if mineralsProduction is higher + industryPriority = 38 * (mineralsProduction - mineralsTurns) / (industryProduction + 0.001) + + print "" + # print "minerals production : " + str(mineralsProduction) + # print "minerals stockpile : " + str(mineralsStockpile) + # print "minerals turns : " + str(mineralsTurns) + print "Industry Production : " + str(industryProduction) + print "Priority for Industry: " + str(industryPriority) + + return industryPriority + +def calculateResearchPriority(): + "calculates the AI empire's demand for research" + + empire = fo.getEmpire() + totalPP = empire.productionPoints + totalRP = empire.resourceProduction(fo.resourceType.research) + + # increase demand for research if significantly lagging production capability + researchPriority = 10 * totalPP / (totalRP + 1) + + print "" + print "Research Production : " + str(totalRP) + print "Priority for Research: " + str(researchPriority) + + return researchPriority + def calculateExplorationPriority(): "calculates the demand for scouts by unexplored systems" @@ -189,29 +227,6 @@ return militaryPriority -def calculateIndustryPriority(): - "calculates the demand for industry" - - empire = fo.getEmpire() - - # get current minerals and industry production - mineralsProduction = empire.resourceProduction(fo.resourceType.minerals) - mineralsStockpile = empire.resourceStockpile(fo.resourceType.minerals) - mineralsTurns = mineralsStockpile / (mineralsProduction + 0.001) - industryProduction = empire.resourceProduction(fo.resourceType.industry) - - # increase demand for industry if mineralsProduction is higher - industryPriority = 38 * (mineralsProduction - mineralsTurns) / (industryProduction + 0.001) - - print "" - # print "minerals production : " + str(mineralsProduction) - # print "minerals stockpile : " + str(mineralsStockpile) - # print "minerals turns : " + str(mineralsTurns) - print "Industry Production : " + str(industryProduction) - print "Priority for Industry: " + str(industryPriority) - - return industryPriority - def calculateTopProductionQueuePriority(): "calculates the top production queue priority" Modified: trunk/FreeOrion/default/AI/ResourcesAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResourcesAI.py 2012-01-06 16:22:57 UTC (rev 4575) +++ trunk/FreeOrion/default/AI/ResourcesAI.py 2012-01-06 20:19:38 UTC (rev 4576) @@ -1,21 +1,17 @@ import freeOrionAIInterface as fo import FreeOrionAI as foAI +import AIstate from EnumsAI import AIPriorityType, getAIPriorityResourceTypes, AIFocusType import PlanetUtilsAI -import AIstate -def generateResourcesOrders(): - "generate resources focus orders" +def topResourcePriority(): + "calculate top resource priority" - # get the highest resource priorities universe = fo.getUniverse() empire = fo.getEmpire() empireID = empire.empireID ownedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) - capitalID = PlanetUtilsAI.getCapitalID() - print "Resources Management:" - print "" - print "Resource Priorities:" + resourcePriorities = {} for priorityType in getAIPriorityResourceTypes(): resourcePriorities[priorityType] = foAI.foAIstate.getPriority(priorityType) @@ -26,48 +22,165 @@ for evaluationPair in sortedPriorities: if topPriority < 0: topPriority = evaluationPair[0] - print " ID|Score: " + str(evaluationPair) - print " Top Resource Priority: " + str(topPriority) + return topPriority + +def setCapitalIDResourceFocus(): + "set resource focus of CapitalID planet" + + universe = fo.getUniverse() + empire = fo.getEmpire() + empireID = empire.empireID + ownedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + capitalID = empire.capitalID + topPriority = topResourcePriority() + if topPriority == AIPriorityType.PRIORITY_RESOURCE_FOOD: newFocus = AIFocusType.FOCUS_FARMING - print " New Resource Focus: " + str(newFocus) for planetID in ownedPlanetIDs: planet = universe.getPlanet(planetID) focus = newFocus - if planetID == capitalID and newFocus in planet.availableFoci: - print " Capital ID: " + str(planetID) + " Resource Focus: " + str(newFocus) - fo.issueChangeFocusOrder(planetID, newFocus) + if planetID == capitalID and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) elif topPriority == AIPriorityType.PRIORITY_RESOURCE_MINERALS: newFocus = AIFocusType.FOCUS_MINING - print " Top Resource Focus: " + str(newFocus) for planetID in ownedPlanetIDs: planet = universe.getPlanet(planetID) focus = newFocus - if planetID == capitalID and newFocus in planet.availableFoci: - print " Capital ID: " + str(planetID) + " Resource Focus: " + str(newFocus) - fo.issueChangeFocusOrder(planetID, newFocus) + if planetID == capitalID and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) elif topPriority == AIPriorityType.PRIORITY_RESOURCE_PRODUCTION: newFocus = AIFocusType.FOCUS_INDUSTRY - print " New Resource Focus: " + str(newFocus) for planetID in ownedPlanetIDs: planet = universe.getPlanet(planetID) focus = newFocus - if planetID == capitalID and newFocus in planet.availableFoci: - print " Capital ID: " + str(planetID) + " Resource Focus: " + str(newFocus) - fo.issueChangeFocusOrder(planetID, newFocus) + if planetID == capitalID and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) + elif topPriority == AIPriorityType.PRIORITY_RESOURCE_RESEARCH: + newFocus = AIFocusType.FOCUS_RESEARCH + for planetID in ownedPlanetIDs: + planet = universe.getPlanet(planetID) + focus = newFocus + if planetID == capitalID and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) +def setGeneralPlanetResourceFocus(): + "set resource focus of planets except capitalID, asteroids, and gas giants" + + universe = fo.getUniverse() + empire = fo.getEmpire() + empireID = empire.empireID + empirePlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + capitalID = [empire.capitalID] + asteroids = PlanetUtilsAI.getTypePlanetEmpireOwned(fo.planetType.asteroids) + gasGiants = PlanetUtilsAI.getTypePlanetEmpireOwned(fo.planetType.gasGiant) + generalPlanetIDs = list(set(empirePlanetIDs) - (set(capitalID)|set(asteroids)|set(gasGiants))) + topPriority = topResourcePriority() + fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs + fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) + + if topPriority == AIPriorityType.PRIORITY_RESOURCE_FOOD: + newFocus = AIFocusType.FOCUS_FARMING + for planetID in generalPlanetIDs: + planet = universe.getPlanet(planetID) + focus = newFocus + if focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) + elif topPriority == AIPriorityType.PRIORITY_RESOURCE_MINERALS: + newFocus = AIFocusType.FOCUS_MINING + for planetID in generalPlanetIDs: + planet = universe.getPlanet(planetID) + focus = newFocus + if planetID in fleetSupplyablePlanetIDs and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) + elif topPriority == AIPriorityType.PRIORITY_RESOURCE_PRODUCTION: + newFocus = AIFocusType.FOCUS_INDUSTRY + for planetID in generalPlanetIDs: + planet = universe.getPlanet(planetID) + focus = newFocus + if planetID in fleetSupplyablePlanetIDs and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) elif topPriority == AIPriorityType.PRIORITY_RESOURCE_RESEARCH: newFocus = AIFocusType.FOCUS_RESEARCH - print " New Resource Focus: " + str(newFocus) + for planetID in generalPlanetIDs: + planet = universe.getPlanet(planetID) + focus = newFocus + if planetID in fleetSupplyablePlanetIDs and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) + else: + focus = AIFocusType.FOCUS_FARMING + if focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) +def setAsteroidsResourceFocus(): + "change resource focus of asteroids from farming to mining" + + universe = fo.getUniverse() + empire = fo.getEmpire() + empireID = empire.empireID + ownedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + newFocus = AIFocusType.FOCUS_MINING + for planetID in ownedPlanetIDs: + planet = universe.getPlanet(planetID) + focus = newFocus + if planet.type == fo.planetType.asteroids and 'GRO_ORBIT_FARMING' in empire.availableTechs and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) + +def setGasGiantsResourceFocus(): + "change resource focus of gas giants from farming to research" + + universe = fo.getUniverse() + empire = fo.getEmpire() + empireID = empire.empireID + ownedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + newFocus = AIFocusType.FOCUS_RESEARCH + for planetID in ownedPlanetIDs: + planet = universe.getPlanet(planetID) + focus = newFocus + if planet.type == fo.planetType.gasGiant and 'GRO_ORBIT_FARMING' in empire.availableTechs and focus in planet.availableFoci: + fo.issueChangeFocusOrder(planetID, focus) + +def printResourcesPriority(): + "calculate top resource priority" + + universe = fo.getUniverse() + empire = fo.getEmpire() + empireID = empire.empireID + ownedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + print "Resource Management:" + print "" + print "Resource Priorities:" + resourcePriorities = {} + for priorityType in getAIPriorityResourceTypes(): + resourcePriorities[priorityType] = foAI.foAIstate.getPriority(priorityType) + + sortedPriorities = resourcePriorities.items() + sortedPriorities.sort(lambda x,y: cmp(x[1], y[1]), reverse=True) + topPriority = -1 + for evaluationPair in sortedPriorities: + if topPriority < 0: + topPriority = evaluationPair[0] + print " ID|Score: " + str(evaluationPair) + + print " Top Resource Priority: " + str(topPriority) # what is the focus of available resource centers? print "" print "Planet Resources Foci:" - - print "" - print " Empire Owned planetIDs:" + str(ownedPlanetIDs) for planetID in ownedPlanetIDs: planet = universe.getPlanet(planetID) - planetPopulation = planet.currentMeterValue(fo.meterType.population) + planetPopulation = planet.currentMeterValue(fo.meterType.population) print " ID: " + str(planetID) + " Name: " + str(planet.name) + " Type: " + str(planet.type) + " Size: " + str(planet.size) + " Focus: " + str(planet.focus) + " Species: " + str(planet.speciesName) + " Population: " + str(planetPopulation) + +def generateResourcesOrders(): + "generate resources focus orders" + + # calculate top resource priority + topResourcePriority() + + # set resource foci of planets + setCapitalIDResourceFocus() + setGeneralPlanetResourceFocus() + setAsteroidsResourceFocus() + setGasGiantsResourceFocus() + + printResourcesPriority() |
From: <geo...@us...> - 2012-07-06 08:06:15
|
Revision: 4985 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4985&view=rev Author: geoffthemedio Date: 2012-07-06 08:06:04 +0000 (Fri, 06 Jul 2012) Log Message: ----------- Removed or replaced some food and mining enums with a growth enum, and removed some mining-related priority and focus-related code. Modified Paths: -------------- trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/ResourcesAI.py Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2012-07-06 08:04:06 UTC (rev 4984) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2012-07-06 08:06:04 UTC (rev 4985) @@ -19,8 +19,7 @@ class AIPriorityType(object): PRIORITY_INVALID = -1 - PRIORITY_RESOURCE_FOOD = 0 - PRIORITY_RESOURCE_MINERALS = 1 + PRIORITY_RESOURCE_GROWTH = 0 PRIORITY_RESOURCE_PRODUCTION = 2 PRIORITY_RESOURCE_RESEARCH = 3 PRIORITY_RESOURCE_TRADE = 4 @@ -182,8 +181,7 @@ return __getInterval(0, 2) class AIFocusType(object): - FOCUS_FARMING = "FOCUS_FARMING" - FOCUS_MINING = "FOCUS_MINING" + FOCUS_GROWTH = "FOCUS_GROWTH" FOCUS_INDUSTRY = "FOCUS_INDUSTRY" FOCUS_RESEARCH = "FOCUS_RESEARCH" FOCUS_TRADE = "FOCUS_TRADE" Modified: trunk/FreeOrion/default/AI/ResourcesAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResourcesAI.py 2012-07-06 08:04:06 UTC (rev 4984) +++ trunk/FreeOrion/default/AI/ResourcesAI.py 2012-07-06 08:06:04 UTC (rev 4985) @@ -35,20 +35,13 @@ capitalID = empire.capitalID topPriority = topResourcePriority() - if topPriority == AIPriorityType.PRIORITY_RESOURCE_FOOD: - newFocus = AIFocusType.FOCUS_FARMING + if topPriority == AIPriorityType.PRIORITY_RESOURCE_GROWTH: + newFocus = AIFocusType.FOCUS_GROWTH for planetID in ownedPlanetIDs: planet = universe.getPlanet(planetID) focus = newFocus if planetID == capitalID and focus in planet.availableFoci: fo.issueChangeFocusOrder(planetID, focus) - elif topPriority == AIPriorityType.PRIORITY_RESOURCE_MINERALS: - newFocus = AIFocusType.FOCUS_MINING - for planetID in ownedPlanetIDs: - planet = universe.getPlanet(planetID) - focus = newFocus - if planetID == capitalID and focus in planet.availableFoci: - fo.issueChangeFocusOrder(planetID, focus) elif topPriority == AIPriorityType.PRIORITY_RESOURCE_PRODUCTION: newFocus = AIFocusType.FOCUS_INDUSTRY for planetID in ownedPlanetIDs: @@ -79,20 +72,13 @@ fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) - if topPriority == AIPriorityType.PRIORITY_RESOURCE_FOOD: - newFocus = AIFocusType.FOCUS_FARMING + if topPriority == AIPriorityType.PRIORITY_RESOURCE_GROWTH: + newFocus = AIFocusType.FOCUS_GROWTH for planetID in generalPlanetIDs: planet = universe.getPlanet(planetID) focus = newFocus if focus in planet.availableFoci: fo.issueChangeFocusOrder(planetID, focus) - elif topPriority == AIPriorityType.PRIORITY_RESOURCE_MINERALS: - newFocus = AIFocusType.FOCUS_MINING - for planetID in generalPlanetIDs: - planet = universe.getPlanet(planetID) - focus = newFocus - if planetID in fleetSupplyablePlanetIDs and focus in planet.availableFoci: - fo.issueChangeFocusOrder(planetID, focus) elif topPriority == AIPriorityType.PRIORITY_RESOURCE_PRODUCTION: newFocus = AIFocusType.FOCUS_INDUSTRY for planetID in generalPlanetIDs: @@ -119,7 +105,7 @@ empire = fo.getEmpire() empireID = empire.empireID ownedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) - newFocus = AIFocusType.FOCUS_MINING + newFocus = AIFocusType.FOCUS_INDUSTRY for planetID in ownedPlanetIDs: planet = universe.getPlanet(planetID) focus = newFocus |
From: <geo...@us...> - 2012-10-19 18:40:56
|
Revision: 5308 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5308&view=rev Author: geoffthemedio Date: 2012-10-19 18:40:49 +0000 (Fri, 19 Oct 2012) Log Message: ----------- AI tweaks / fixes by Dilvish. Modified Paths: -------------- trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2012-10-17 20:24:58 UTC (rev 5307) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2012-10-19 18:40:49 UTC (rev 5308) @@ -219,7 +219,7 @@ # build one more military ship than military targeted systems #militaryPriority = 100 * ((numMilitaryTargetedSystemIDs +2) - numMilitaryShips) / (numMilitaryTargetedSystemIDs + 1) - militaryPriority = int( 30 + max(0, 100*((2.0*totalThreat - totalFleetRating ) / curShipRating)) ) + militaryPriority = int( 30 + max(0, 50*((1.25*totalThreat - totalFleetRating ) / curShipRating)) ) # print "" # print "Number of Military Ships Without Missions: " + str(numMilitaryShips) # print "Number of Military Targeted Systems: " + str(numMilitaryTargetedSystemIDs) Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2012-10-17 20:24:58 UTC (rev 5307) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2012-10-19 18:40:49 UTC (rev 5308) @@ -6,6 +6,7 @@ import AIstate import FleetUtilsAI from random import choice +import sys shipTypeMap = dict( zip( [AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION, AIPriorityType.PRIORITY_PRODUCTION_OUTPOST, AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, AIPriorityType.PRIORITY_PRODUCTION_INVASION, AIPriorityType.PRIORITY_PRODUCTION_MILITARY], [AIShipDesignTypes.explorationShip, AIShipDesignTypes.outpostShip, AIShipDesignTypes.colonyShip, AIShipDesignTypes.troopShip, AIShipDesignTypes.attackShip ] ) ) @@ -58,10 +59,17 @@ print "Possible building types to build:" for buildingTypeID in possibleBuildingTypeIDs: buildingType = fo.getBuildingType(buildingTypeID) + print "buildingType object:", buildingType + print "dir(buildingType): ", dir(buildingType) print " " + str(buildingType.name) # + " cost:" + str(buildingType.productionCost) + " time:" + str(buildingType.productionTime) + print "'try'ing to print 'cost:' + str(buildingType.productionCost) + ' time:' + str(buildingType.productionTime)" + try: + print " cost:" + str(buildingType.productionCost(empire.empireID, homeworld.id)) + " time:" + str(buildingType.productionTime(empire.empireID, homeworld.id)) + except: + print"failed with error:", sys.exc_info()[0] + + possibleBuildingTypes = [fo.getBuildingType(buildingTypeID) and fo.getBuildingType(buildingTypeID).name for buildingTypeID in possibleBuildingTypeIDs ] #makes sure is not None before getting name - possibleBuildingTypes = [ fo.getBuildingType(buildingTypeID).name for buildingTypeID in possibleBuildingTypeIDs ] - print "" print "Buildings already in Production Queue:" productionQueue = empire.productionQueue |
From: <geo...@us...> - 2012-10-20 23:06:21
|
Revision: 5315 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5315&view=rev Author: geoffthemedio Date: 2012-10-20 23:06:15 +0000 (Sat, 20 Oct 2012) Log Message: ----------- AI update by Dilvish. Modified Paths: -------------- trunk/FreeOrion/default/AI/ExplorationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/MilitaryAI.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2012-10-20 22:51:06 UTC (rev 5314) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2012-10-20 23:06:15 UTC (rev 5315) @@ -69,7 +69,7 @@ sentList=[] while (len(availableScouts) > 0 ) and ( len(needsCoverage) >0): thisSysID = needsCoverage.pop(0) - thisFleetList = FleetUtilsAI.getFleetsForMission(nships=1, minRating=0, curRating=0, species="", systemsToCheck=[thisSysID], systemsChecked=[], + thisFleetList = FleetUtilsAI.getFleetsForMission(nships=1, targetRating=0, minRating=0, curRating=[0], species="", systemsToCheck=[thisSysID], systemsChecked=[], fleetPool = availableScouts, fleetList=[], verbose=False) if thisFleetList==[]: break #must have ran out of scouts Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2012-10-20 22:51:06 UTC (rev 5314) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2012-10-20 23:06:15 UTC (rev 5315) @@ -12,15 +12,15 @@ __designStats.clear() -def getFleetsForMission(nships, minRating, curRating, species, systemsToCheck, systemsChecked, fleetPool, fleetList, takeAny=False, verbose=False): #implements breadth-first search through systems +def getFleetsForMission(nships, targetRating, minRating, curRating, species, systemsToCheck, systemsChecked, fleetPool, fleetList, takeAny=False, verbose=False): #implements breadth-first search through systems if verbose: - print "getFleetsForMission: (nships:%1d, minRating:%6d, curRating:%6d, species:%6s, systemsToCheck:%8s, systemsChecked:%8s, fleetPool:%8s, fleetList:%8s) "%( - nships, minRating, curRating, species, systemsToCheck, systemsChecked, fleetPool, fleetList) + print "getFleetsForMission: (nships:%1d, targetRating:%6d, minRating:%6d, curRating:%6d, species:%6s, systemsToCheck:%8s, systemsChecked:%8s, fleetPool:%8s, fleetList:%8s) "%( + nships, targetRating, minRating, curRating[0], species, systemsToCheck, systemsChecked, fleetPool, fleetList) universe = fo.getUniverse() if not (systemsToCheck and fleetPool): if verbose: print "no more systems or fleets to check" - if takeAny: + if takeAny or curRating[0] > minRating: return fleetList else: return [] @@ -28,7 +28,7 @@ systemsChecked.append(thisSystemID) #thisSys = universe.getSystem(thisSystemID) #if not thisSys: - # return getFleetsForMission(nships, minRating, curRating, species, systemsToCheck, systemsChecked, fleetPool, fleetList) + # return getFleetsForMission(nships, targetRating, minRating, curRating, species, systemsToCheck, systemsChecked, fleetPool, fleetList) fleetsHere = [fleetID for fleetID in fleetPool if ( foAI.foAIstate.fleetStatus.get(fleetID, {}).get('sysID', -1) == thisSystemID ) ] if verbose: print "found fleetPool Fleets %s"%fleetsHere @@ -37,8 +37,8 @@ pass #TODO: colony mission species req not implemented yet fleetList.append(fleetID) del fleetPool[ fleetPool.index( fleetID) ] - curRating += foAI.foAIstate.getRating(fleetID) - if ( len(fleetList) >= nships ) and ( curRating >= minRating ): + curRating[0] += foAI.foAIstate.getRating(fleetID) + if ( len(fleetList) >= nships ) and ( curRating[0] >= targetRating ): if verbose: print "returning fleetlist: %s"%fleetList return fleetList @@ -47,7 +47,7 @@ for neighborID in [el.key() for el in universe.getSystemNeighborsMap(thisSystemID, foAI.foAIstate.empireID) ]: if neighborID not in systemsChecked and neighborID in foAI.foAIstate.exploredSystemIDs: systemsToCheck.append(neighborID) - return getFleetsForMission(nships, minRating, curRating, species, systemsToCheck, systemsChecked, fleetPool, fleetList, takeAny, verbose) + return getFleetsForMission(nships, targetRating, minRating, curRating, species, systemsToCheck, systemsChecked, fleetPool, fleetList, takeAny, verbose) def getEmpireFleets(empireID=None): Modified: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py 2012-10-20 22:51:06 UTC (rev 5314) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2012-10-20 23:06:15 UTC (rev 5315) @@ -176,7 +176,7 @@ print "-----------------" if remainingMilRating <=6: - newAllocations = allocations + newAllocations = [ (sid, alc, alc, ta) for (sid, alc, ta) in allocations ] else: totAlloc = sum( [alloc for sid, alloc, takeAny in allocations ] ) factor =(2.0* remainingMilRating ) / ( totAlloc + 0.1) @@ -184,10 +184,10 @@ newAllocations = [] for sid, alloc, takeAny in allocations: if remainingMilRating <= 0 : - newAllocations.append( ( sid, alloc, takeAny ) ) + newAllocations.append( ( sid, alloc, alloc, takeAny ) ) else: thisAlloc = int( factor * alloc ) - newAllocations.append( ( sid, alloc+thisAlloc, takeAny ) ) + newAllocations.append( ( sid, alloc+thisAlloc, alloc, takeAny ) ) remainingMilRating -= thisAlloc MilitaryAllocations = newAllocations @@ -242,7 +242,7 @@ print " ID|Score: " + str(evaluationPair) # export military systems for other AI modules - AIstate.militarySystemIDs = [sid for sid, alloc, takeAny in newAllocations] + AIstate.militarySystemIDs = [sid for sid, alloc, minalloc, takeAny in newAllocations] def getMilitaryTargetedSystemIDs(systemIDs, missionType, empireID): "return list of military targeted systems" @@ -362,11 +362,12 @@ # get systems to defend universe = fo.getUniverse() - for sysID, alloc, takeAny in MilitaryAllocations: + for sysID, alloc, minalloc, takeAny in MilitaryAllocations: foundFleets = [] - theseFleets = FleetUtilsAI.getFleetsForMission(1, alloc, 0, "", systemsToCheck=[sysID], systemsChecked=[], fleetPool=availMilFleetIDs, fleetList=foundFleets, verbose=False) + foundRating=[0] + theseFleets = FleetUtilsAI.getFleetsForMission(1, alloc, minalloc, foundRating, "", systemsToCheck=[sysID], systemsChecked=[], fleetPool=availMilFleetIDs, fleetList=foundFleets, verbose=False) if theseFleets == []: - if foundFleets==[] or not takeAny: + if foundFleets==[] or (foundRating[0]<minalloc and not takeAny): print "NO available/suitable military allocation for system %d ( %s ) -- requested allocation %8d"%(sysID, universe.getSystem(sysID).name, alloc) continue else: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2012-10-20 22:51:06 UTC (rev 5314) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2012-10-20 23:06:15 UTC (rev 5315) @@ -61,12 +61,7 @@ buildingType = fo.getBuildingType(buildingTypeID) print "buildingType object:", buildingType print "dir(buildingType): ", dir(buildingType) - print " " + str(buildingType.name) # + " cost:" + str(buildingType.productionCost) + " time:" + str(buildingType.productionTime) - print "'try'ing to print 'cost:' + str(buildingType.productionCost) + ' time:' + str(buildingType.productionTime)" - try: - print " cost:" + str(buildingType.productionCost(empire.empireID, homeworld.id)) + " time:" + str(buildingType.productionTime(empire.empireID, homeworld.id)) - except: - print"failed with error:", sys.exc_info()[0] + print " " + str(buildingType.name) + " cost: " +str(buildingType.productionCost(empire.empireID, homeworld.id)) + " time: " + str(buildingType.productionTime(empire.empireID, homeworld.id)) possibleBuildingTypes = [fo.getBuildingType(buildingTypeID) and fo.getBuildingType(buildingTypeID).name for buildingTypeID in possibleBuildingTypeIDs ] #makes sure is not None before getting name @@ -99,7 +94,7 @@ print "Possible ship designs to build:" for shipDesignID in empire.availableShipDesigns: shipDesign = fo.getShipDesign(shipDesignID) - print " " + str(shipDesign.name(True)) + " cost:" + str(shipDesign.productionCost) + " time:" + str(shipDesign.productionTime) + print " " + str(shipDesign.name(True)) + " cost:" + str(shipDesign.productionCost(empire.empireID, homeworld.id) )+ " time:" + str(shipDesign.productionTime(empire.empireID, homeworld.id)) print "" print "Projects already in Production Queue:" @@ -195,10 +190,10 @@ totColonyFleets +=1 # assumes the enqueueing below succeeds, but really no harm if assumption proves wrong bestShip, bestDesign, buildChoices = bestShips[thisPriority] loc = choice(buildChoices) - print "adding new ship to production queue: %s; per turn production cost %.1f"%(bestDesign.name(True), (float(bestDesign.productionCost) / bestDesign.productionTime)) + print "adding new ship to production queue: %s; per turn production cost %.1f"%(bestDesign.name(True), (float(bestDesign.productionCost(empire.empireID, homeworld.id)) / bestDesign.productionTime(empire.empireID, homeworld.id))) print "" fo.issueEnqueueShipProductionOrder(bestShip, loc) - wastedPP -= ( float(bestDesign.productionCost) / bestDesign.productionTime) + wastedPP -= ( float(bestDesign.productionCost(empire.empireID, homeworld.id)) / bestDesign.productionTime(empire.empireID, homeworld.id)) print "" def getAvailableBuildLocations(shipDesignID): |
From: <geo...@us...> - 2012-10-24 19:36:59
|
Revision: 5333 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5333&view=rev Author: geoffthemedio Date: 2012-10-24 19:36:52 +0000 (Wed, 24 Oct 2012) Log Message: ----------- Dilvish AI script bugfix update. Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/AIFleetOrder.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2012-10-24 19:12:52 UTC (rev 5332) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2012-10-24 19:36:52 UTC (rev 5333) @@ -28,8 +28,8 @@ universe = fo.getUniverse() fleetID = self.getAITargetID() fleet = universe.getFleet(fleetID) - targetsString = "fleet %4d (%14s) [ %10s mission ] : %3d ships , total Rating:%7d "%(fleetID, fleet.name, AIFleetMissionTypeNames.name(aiFleetMissionType) , - len(fleet.shipIDs), foAI.foAIstate.getRating(fleetID)) + targetsString = "fleet %4d (%14s) [ %10s mission ] : %3d ships , total Rating:%7d "%(fleetID, (fleet and fleet.name) or "Fleet Invalid", AIFleetMissionTypeNames.name(aiFleetMissionType) , + (fleet and len(fleet.shipIDs)) or 0, foAI.foAIstate.getRating(fleetID)) targets = self.getAITargets(aiFleetMissionType) for target in targets: targetsString = targetsString + str(target) @@ -175,6 +175,9 @@ else: #went through entire order list if ordersCompleted: print "Fleet %d has completed its mission; clearing all orders and targets."%(self.getAITargetID() ) + print "Full set of orders were:" + for aiFleetOrder2 in self.getAIFleetOrders(): + print "\t\t %s"%aiFleetOrder2 self.clearAIFleetOrders() self.clearAITargets( (self.getAIMissionTypes() + [-1])[0] ) FleetUtilsAI.splitFleet(self.getAITargetID() ) #current task is done, split up fleet for later deployments Modified: trunk/FreeOrion/default/AI/AIFleetOrder.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetOrder.py 2012-10-24 19:12:52 UTC (rev 5332) +++ trunk/FreeOrion/default/AI/AIFleetOrder.py 2012-10-24 19:36:52 UTC (rev 5333) @@ -227,8 +227,8 @@ otherFleetsHere = [ fID for fID, val in foAI.foAIstate.fleetStatus.items() if (fID != fleetID) and (val.get('sysID', -2)==systemID)] for fID in otherFleetsHere: fleet2 = universe.getFleet(fID) - if not fleet2.systemID == systemID: - #print "\t\t fleet2 (id %4d) not actually in system %4d %s"%(fID, systemID, sysName) + if not (fleet2 and (fleet2.systemID == systemID)): + print "\t\t fleet2 (id %4d) not actually in system %4d %s although AI records thought it should be"%(fID, systemID, sysName) continue if not fleet2.ownedBy(foAI.foAIstate.empireID): #print "\t\t tried fleet %d, but not owned by this empire"%fID |
From: <geo...@us...> - 2012-11-01 16:33:58
|
Revision: 5366 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5366&view=rev Author: geoffthemedio Date: 2012-11-01 16:33:51 +0000 (Thu, 01 Nov 2012) Log Message: ----------- AI update by Dilvish, mainly to unbreak the AI after the recent changes to the main codebase, and to make it more resistant to breaking due to future changes. Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/MilitaryAI.py trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2012-11-01 16:29:34 UTC (rev 5365) +++ trunk/FreeOrion/default/AI/AIstate.py 2012-11-01 16:33:51 UTC (rev 5366) @@ -26,6 +26,10 @@ militaryFleetIDs = [] fleetsLostBySystem={} fleetsLostByID={} +popCtrSystemIDs=[] +popCtrIDs=[] +outpostIDs=[] +outpostSystemIDs=[] def dictFromMap(map): return dict( [ (el.key(), el.data() ) for el in map ] ) Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2012-11-01 16:29:34 UTC (rev 5365) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2012-11-01 16:33:51 UTC (rev 5366) @@ -82,7 +82,26 @@ unOwnedPlanetIDs = list(set(exploredPlanetIDs) -set(allOwnedPlanetIDs)) print "UnOwned PlanetIDs: " + str(unOwnedPlanetIDs) - empireOutpostIDs=set(empireOwnedPlanetIDs) - set( PlanetUtilsAI.getPopulatedPlanetIDs( empireOwnedPlanetIDs) ) + empirePopCtrs = set( PlanetUtilsAI.getPopulatedPlanetIDs( empireOwnedPlanetIDs) ) + empireOutpostIDs=set(empireOwnedPlanetIDs) - empirePopCtrs + AIstate.popCtrIDs=empirePopCtrs + AIstate.popCtrSystemIDs=set(PlanetUtilsAI.getSystems(empirePopCtrs)) + AIstate.outpostIDs=empireOutpostIDs + AIstate.outpostSystemIDs=set(PlanetUtilsAI.getSystems(empireOutpostIDs)) + + empireSpecies={} + for pID in empirePopCtrs: + planet=universe.getPlanet(pID) + if not planet: + print "Error empire has apparently lost sight of former colony at planet %d but doesn't realize it"%pID + continue + pSpecName=planet.speciesName + empireSpecies[pSpecName] = empireSpecies.get(pSpecName, [])+[pID] + print "\n"+"Empire species roster:" + for specName in empireSpecies: + thisSpec=fo.getSpecies(specName) + print "%s on planets %s; has tags %s"%(specName, empireSpecies[specName], list(thisSpec.tags)) + print"" # export colony targeted systems for other AI modules colonyTargetedPlanetIDs = getColonyTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, empireID) @@ -224,7 +243,7 @@ for special in planetSpecials: if "_NEST_" in special: return 30 # get an outpost on the nest quick - if ( ( planet.size == fo.planetSize.asteroids ) and (empire.getTechStatus("PRO_ASTEROID_MINE") == fo.techStatus.complete ) ): + if ( ( planet.size == fo.planetSize.asteroids ) and (empire.getTechStatus("PRO_MICROGRAV_MAN") == fo.techStatus.complete ) ): retval= 15 # asteroid mining is great, fast return for special in [ "MINERALS_SPECIAL", "CRYSTALS_SPECIAL", "METALOIDS_SPECIAL"] : if special in planetSpecials: Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2012-11-01 16:29:34 UTC (rev 5365) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2012-11-01 16:33:51 UTC (rev 5366) @@ -14,6 +14,7 @@ import PlanetUtilsAI from time import time import os +import traceback # AIstate foAIstate = None @@ -215,27 +216,38 @@ # call AI modules timer=[time()] - PriorityAI.calculatePriorities() + try: PriorityAI.calculatePriorities() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - ExplorationAI.assignScoutsToExploreSystems() + try: ExplorationAI.assignScoutsToExploreSystems() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - ColonisationAI.assignColonyFleetsToColonise() + try: ColonisationAI.assignColonyFleetsToColonise() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - InvasionAI.assignInvasionFleetsToInvade() + try: InvasionAI.assignInvasionFleetsToInvade() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - MilitaryAI.assignMilitaryFleetsToSystems() + try: MilitaryAI.assignMilitaryFleetsToSystems() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - FleetUtilsAI.generateAIFleetOrdersForAIFleetMissions() + try: FleetUtilsAI.generateAIFleetOrdersForAIFleetMissions() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - FleetUtilsAI.issueAIFleetOrdersForAIFleetMissions() + try: FleetUtilsAI.issueAIFleetOrdersForAIFleetMissions() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - ResearchAI.generateResearchOrders() + try: ResearchAI.generateResearchOrders() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - ProductionAI.generateProductionOrders() + try: ProductionAI.generateProductionOrders() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - ResourcesAI.generateResourcesOrders() + try: ResourcesAI.generateResourcesOrders() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) - foAIstate.afterTurnCleanup() + try: foAIstate.afterTurnCleanup() + except: print "Error: exception triggered: ", traceback.format_exc() timer.append( time() ) times = [timer[i] - timer[i-1] for i in range(1, len(timer) ) ] timeFmt = "%30s: %8d msec " @@ -245,4 +257,5 @@ if __timerFile: __timerFile.write( __timerFileFmt%tuple( [ fo.currentTurn() ]+map(lambda x: int(1000*x), times )) +'\n') __timerFile.flush() - fo.doneTurn() + try: fo.doneTurn() + except: print "Error: exception triggered: ", traceback.format_exc() Modified: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py 2012-11-01 16:29:34 UTC (rev 5365) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2012-11-01 16:33:51 UTC (rev 5366) @@ -11,10 +11,11 @@ MinThreat = 6 # the minimum threat level that will be ascribed to an unkown threat capable of killing scouts MilitaryAllocations = [] minMilAllocations = {} +totMilRating=0 def getMilitaryFleets(): "get armed military fleets" - global MilitaryAllocations + global MilitaryAllocations, totMilRating allMilitaryFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY) if allMilitaryFleetIDs == []: Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2012-11-01 16:29:34 UTC (rev 5365) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2012-11-01 16:33:51 UTC (rev 5366) @@ -131,11 +131,22 @@ def calculateExplorationPriority(): "calculates the demand for scouts by unexplored systems" + universe = fo.getUniverse() + empire = fo.getEmpire() numUnexploredSystems = len( ExplorationAI.__borderUnexploredSystemIDs ) #len(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED)) scoutIDs = ExplorationAI.currentScoutFleetIDs # FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_EXPLORATION) numScouts = len(scoutIDs) - explorationPriority = 95*math.ceil( math.sqrt(max(0, (numUnexploredSystems - numScouts)) / (numUnexploredSystems +0.001) )) + productionQueue = empire.productionQueue + queuedScoutShips=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_CIVILIAN_EXPLORATION : + queuedScoutShips +=1 + + explorationPriority = 95*math.ceil( math.sqrt(max(0, (numUnexploredSystems - (numScouts+queuedScoutShips)) / (numUnexploredSystems +0.001) ))) + print "" print "Number of Scouts : " + str(numScouts) print "Number of Unexplored systems: " + str(numUnexploredSystems) @@ -204,7 +215,12 @@ troopShipIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) #numTroopShips = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(troopShipIDs)) - invasionPriority = 30+ 200*max(0, math.ceil(opponentTroops/5) - len(troopShipIDs) -queuedTroopShips ) + myTroopShips = len(troopShipIDs) -queuedTroopShips + troopShipsNeeded = math.ceil(opponentTroops/5) - myTroopShips + milFleetEquiv= math.ceil( MilitaryAI.totMilRating / curBestMilShipRating() ) + troopShipsNeeded = min( troopShipsNeeded , math.floor( milFleetEquiv / 2) - myTroopShips) + + invasionPriority = 20+ 200*max(0, troopShipsNeeded ) # print "" # print "Number of Troop Ships Without Missions: " + str(numTroopShips) Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2012-11-01 16:29:34 UTC (rev 5365) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2012-11-01 16:33:51 UTC (rev 5366) @@ -33,7 +33,7 @@ empire = fo.getEmpire() theseDesigns = [shipDesign for shipDesign in empire.availableShipDesigns if shipTypeMap.get(priority, "nomatch") in fo.getShipDesign(shipDesign).name(False) and getAvailableBuildLocations(shipDesign) != [] ] if theseDesigns == []: - return None, None, None #must be missing a Shipyard + return None, None, None #must be missing a Shipyard (or checking for outpost ship but missing tech) ships = [ ( fo.getShipDesign(shipDesign).name(False), shipDesign) for shipDesign in theseDesigns ] bestShip = sorted( ships)[-1][-1] buildChoices = getAvailableBuildLocations(bestShip) @@ -86,11 +86,26 @@ print queuedBldgNames=[ bldg.name for bldg in queuedBldgs ] - if ("BLD_INDUSTRY_CENTER" in possibleBuildingTypes) and ("BLD_INDUSTRY_CENTER" not in (capitalBldgs+queuedBldgNames)): print "Enqueueing BLD_INDUSTRY_CENTER" fo.issueEnqueueBuildingProductionOrder("BLD_INDUSTRY_CENTER", empire.capitalID) + if ("BLD_SHIPYARD_BASE" in possibleBuildingTypes) and ("BLD_SHIPYARD_BASE" not in (capitalBldgs+queuedBldgNames)): + try: + fo.issueEnqueueBuildingProductionOrder("BLD_SHIPYARD_BASE", empire.capitalID) + print "Enqueueing BLD_SHIPYARD_BASE" + except: + print "Error: cant build shipyard at new capital, probably no population; we're hosed" + + if ("BLD_SHIPYARD_ORG_ORB_INC" in possibleBuildingTypes) and ("BLD_SHIPYARD_ORG_ORB_INC" not in (capitalBldgs+queuedBldgNames)): + try: + fo.issueEnqueueBuildingProductionOrder("BLD_SHIPYARD_ORG_ORB_INC", empire.capitalID) + print "Enqueueing BLD_SHIPYARD_ORG_ORB_INC" + except: + pass + + + if ("BLD_EXOBOT_SHIP" in possibleBuildingTypes) and ("BLD_EXOBOT_SHIP" not in capitalBldgs+queuedBldgNames): #TODO: print "Would Enqueueing BLD_EXOBOT_SHIP if had better handling" Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2012-11-01 16:29:34 UTC (rev 5365) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2012-11-01 16:33:51 UTC (rev 5366) @@ -7,30 +7,38 @@ def generateResearchOrders(): "generate research orders" + empire = fo.getEmpire() + print "Research Queue Management:" + print "" + print "Techs researched and available for use:" + completedTechs = sorted(list(getCompletedTechs())) + tlist = completedTechs+3*[" "] + tlines = zip( tlist[0::3], tlist[1::3], tlist[2::3]) + for tline in tlines: + print "%25s %25s %25s"%tline + print"" + researchQueue = empire.researchQueue + researchQueueList = getResearchQueueTechs() + if researchQueueList: + print "Techs currently at head of Research Queue:" + for element in list(researchQueue)[:10]: + print " %25s allocated %6.2f RP"%(element.tech, element.allocation) + print "" if fo.currentTurn()<=1: - empire = fo.getEmpire() - print "Research Queue Management:" - print "" - print "Techs researched and available for use:" - completedTechs = getCompletedTechs() - for techname in completedTechs: - print " " + techname - print"" - researchQueue = empire.researchQueue - researchQueueList = getResearchQueueTechs() - if researchQueueList: - print "Techs currently at head of Research Queue:" - for element in researchQueueList[:10]: - print " " + element.tech - print "" newtech = TechsListsAI.primaryMetaTechsList() #pLTsToEnqueue = (set(newtech)-(set(completedTechs)|set(researchQueueList))) pLTsToEnqueue = newtech[:] for tech in pLTsToEnqueue: if (tech in completedTechs) or (tech in researchQueueList): pLTsToEnqueue.remove(tech) for name in pLTsToEnqueue: - fo.issueEnqueueTechOrder(name, -1) - print " Enqueued Tech: " + name + try: + enqueueRes = fo.issueEnqueueTechOrder(name, -1) + if enqueueRes == 1: + print " Enqueued Tech: " + name + else: + print " Error: failed attempt to enqueued Tech: " + name + except: + print " Error: failed attempt to enqueued Tech: " + name print"" generateDefaultResearchOrders() elif fo.currentTurn() >100: @@ -139,7 +147,7 @@ # store projects mapped to their costs, so they can be sorted by that cost projectsDict = dict() for name in possibleResearchProjects: - projectsDict[name] = fo.getTech(name).researchCost + projectsDict[name] = fo.getTech(name).researchCost(empire.empireID) # iterate through techs in order of cost print "enqueuing techs. already spent RP: " + str(spentRP()) + " total RP: " + str(totalRP) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2012-11-01 16:29:34 UTC (rev 5365) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2012-11-01 16:33:51 UTC (rev 5366) @@ -148,7 +148,7 @@ primaryGroTechs = [ - 'GRO_ENV_ENCAPSUL'] + 'CON_ENV_ENCAPSUL'] return primaryGroTechs @@ -176,9 +176,9 @@ primaryMetaTechs = [ 'GRO_SUBTER_HAB', - 'CON_ORBITAL_CON', 'DEF_GARRISON_1', 'SHP_WEAPON_2', + 'SHP_HAB_MEGAFAUN', 'SHP_WEAPON_3', 'SHP_WEAPON_4', 'SHP_WEAPON_5', @@ -187,10 +187,10 @@ 'SHP_SPACE_TACTICS', 'SHP_DEFLECTOR', 'GRO_GENETIC_ENG', - 'GRO_ENV_ENCAPSUL', + 'CON_ENV_ENCAPSUL', 'GRO_XENO_GENETICS', 'PRO_MICROGRAV_MAN', - 'PRO_ASTEROID_MINE', + 'CON_ORBITAL_CON', 'LRN_ALGO_ELEGANCE', 'LRN_ARTIF_MINDS', 'GRO_XENO_HYBRIDS', @@ -200,10 +200,8 @@ 'SHP_WEAPON_7', 'SHP_WEAPON_8', 'SHP_DOMESTIC_MONSTER', - 'SHP_HAB_MEGAFAUN', 'SHP_ORG_HULL', 'SHP_MULTICELL_CAST', - 'SHP_ENDOMORPH_HULL', 'DEF_DEFENSE_NET', 'PRO_FUSION_GEN', 'PRO_INDUSTRY_CENTER_I', |
From: <ewi...@us...> - 2012-11-28 22:35:04
|
Revision: 5478 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5478&view=rev Author: ewillgohs Date: 2012-11-28 22:34:57 +0000 (Wed, 28 Nov 2012) Log Message: ----------- Flavorful ship design names, & catching up to recent hull & tech changes Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResourcesAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2012-11-28 18:56:49 UTC (rev 5477) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2012-11-28 22:34:57 UTC (rev 5478) @@ -301,8 +301,8 @@ else: #went through entire order list if ordersCompleted: orders=self.getAIFleetOrders() - if orders and orders[-1].getAIFleetOrderType() == AIFleetOrderType.ORDER_COLONISE: - lastOrder=orders[-1] + lastOrder= orders and orders[-1] + if orders and lastOrder.getAIFleetOrderType() == AIFleetOrderType.ORDER_COLONISE: universe=fo.getUniverse() planet = universe.getPlanet(lastOrder.getTargetAITarget().getTargetID()) pop=planet.currentMeterValue(fo.meterType.population) @@ -322,10 +322,11 @@ print " source target Ship (%d), species %s, can%s colonize"%( shipID, ship.speciesName, ["not", ""][ship.canColonize]) return # colonize order must not have completed yet clearAll=True - if orders and orders[-1].getAIFleetOrderType() == AIFleetOrderType.ORDER_MILITARY: - lastOrder=orders[-1] - if lastOrder.getTargetAITarget().getTargetID() in list(set(AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs + AIstate.invasionTargetedSystemIDs + AIstate.blockadeTargetedSystemIDs)): #consider a secure mission - print "Fleet %d has completed initial stage of its mission to secure system %d, releasing a portion of ships"%(self.getAITargetID() , lastOrder.getTargetAITarget().getTargetID()) + if orders and lastOrder.getAIFleetOrderType() == AIFleetOrderType.ORDER_MILITARY: + # if (AIFleetMissionType.FLEET_MISSION_SECURE in self.getAIMissionTypes()) or # not doing this until decide a way to release from a SECURE mission + if (lastOrder.getTargetAITarget().getTargetID() in list(set(AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs + + AIstate.invasionTargetedSystemIDs + AIstate.blockadeTargetedSystemIDs))): #consider a secure mission + print "Fleet %d has completed initial stage of its mission to secure system %d, may release a portion of ships"%(self.getAITargetID() , lastOrder.getTargetAITarget().getTargetID()) clearAll=False if clearAll: print "Fleet %d has completed its mission; clearing all orders and targets."%(self.getAITargetID() ) @@ -335,6 +336,7 @@ self.clearAIFleetOrders() self.clearAITargets(([-1]+ self.getAIMissionTypes()[:1])[-1]) else: + #TODO: evaluate releasing a smaller portion or none of the ships FleetUtilsAI.splitFleet(self.getAITargetID() ) #at least first stage of current task is done; release extra ships for potential other deployments def generateAIFleetOrders(self): "generates AIFleetOrders from fleets targets to accomplish" Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2012-11-28 18:56:49 UTC (rev 5477) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2012-11-28 22:34:57 UTC (rev 5478) @@ -176,11 +176,11 @@ return AIFleetOrderType.ORDER_INVALID class AIShipDesignTypes(object): - explorationShip = "SD_SCOUT" - colonyShip = "SD_COLONY_SHIP" - outpostShip = "SD_OUTPOST_SHIP" - troopShip = "SD_TROOP_SHIP" - attackShip= "SD_MARK" + explorationShip = {"SD_SCOUT":"A", "Scout":"B", "Tracker":"C"} + colonyShip = {"SD_COLONY_SHIP":"A", "Seeder":"B", "Nest-Maker":"C", "Den-Maker":"D"} + outpostShip = {"SD_OUTPOST_SHIP":"A", "Outposter":"B"} + troopShip = {"SD_TROOP_SHIP":"A", "Basic-Troopers":"B", "Heavy-Troopers":"C"} + attackShip= {"SD_MARK":"A", "Lynx":"B","Griffon":"C", "Wyvern":"D", "Manticore":"E"} class AIShipRoleType(object): #this is also used in determining fleetRoles SHIP_ROLE_INVALID = -1 Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2012-11-28 18:56:49 UTC (rev 5477) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2012-11-28 22:34:57 UTC (rev 5478) @@ -20,8 +20,13 @@ foAIstate = None __timerEntries= ["PriorityAI", "ExplorationAI", "ColonisationAI", "InvasionAI", "MilitaryAI", "Gen_Fleet_Orders", "Issue_Fleet_Orders", "ResearchAI", "ProductionAI", "ResourcesAI", "Cleanup"] +__timerBucketEntries= ["Server_Processing", "AI_Planning"] + __timerFile = None +__timerBucketFile = None __timerFileFmt = "%8d"+ (len(__timerEntries)*"\t %8d") +__timerBucketFileFmt = "%8d"+ (len(__timerBucketEntries)*"\t %8d") +lastTurnTimestamp=0 # called when Python AI starts, before any game new game starts or saved game is resumed def initFreeOrionAI(): @@ -31,7 +36,7 @@ # called when a new game is started (but not when a game is loaded). should clear any pre-existing state # and set up whatever is needed for AI to generate orders def startNewGame(): - global __timerFile + global __timerFile, lastTurnTimestamp, __timerBucketFile print "New game started" # initialize AIstate @@ -49,6 +54,10 @@ timerpath="timers"+os.path.sep+"timer_%02d.dat"%(empireID-1) __timerFile = open(timerpath, 'w') __timerFile.write("Turn\t" + "\t".join(__timerEntries) +'\n') + timerBucketpath="timers"+os.path.sep+"timer_bucket_%02d.dat"%(empireID-1) + __timerBucketFile = open(timerBucketpath, 'w') + __timerBucketFile.write("Turn\t" + "\t".join(__timerBucketEntries) +'\n') + lastTurnTimestamp = time() if ResourcesAI.doResourceTiming: ResourcesAI.resourceTimerFile = open("timers"+os.path.sep+"resourceTimer_%2d.dat"%(empireID-1), 'w') ResourcesAI.resourceTimerFile.write("Turn\t"+ "\t".join(ResourcesAI.__timerEntries)+"\n") @@ -121,7 +130,7 @@ # called when client receives a load game message def resumeLoadedGame(savedStateString): global foAIstate - global __timerFile + global __timerFile, lastTurnTimestamp, __timerBucketFile print "Resuming loaded game" try: #loading saved state @@ -143,6 +152,10 @@ timerpath="timers"+os.path.sep+"timer_%02d.dat"%(empireID-1) __timerFile = open(timerpath, 'w') __timerFile.write("Turn\t" + "\t".join(__timerEntries) +'\n') + timerBucketpath="timers"+os.path.sep+"timer_bucket_%02d.dat"%(empireID-1) + __timerBucketFile = open(timerBucketpath, 'w') + __timerBucketFile.write("Turn\t" + "\t".join(__timerBucketEntries) +'\n') + lastTurnTimestamp = time() if ResourcesAI.doResourceTiming: ResourcesAI.resourceTimerFile = open("timers"+os.path.sep+"resourceTimer_%2d.dat"%(empireID-1), 'w') ResourcesAI.resourceTimerFile.write("Turn\t"+ "\t".join(ResourcesAI.__timerEntries)+"\n") @@ -195,7 +208,9 @@ # at end of this function, fo.doneTurn() should be called to indicate to the client that orders are finished # and can be sent to the server for processing. def generateOrders(): + global lastTurnTimestamp universe = fo.getUniverse() + turnStartTime=time() #starting AI timer here, to be sure AI doesn't get blame for any lags in server being able to provide the Universe object empire = fo.getEmpire() planetID = PlanetUtilsAI.getCapital() if planetID is not None: @@ -263,6 +278,7 @@ except: print "Error: exception triggered and caught: ", traceback.format_exc() timer.append( time() ) times = [timer[i] - timer[i-1] for i in range(1, len(timer) ) ] + turnEndTime=time() timeFmt = "%30s: %8d msec " print "AI Module Time Requirements:" for mod, modTime in zip(__timerEntries, times): @@ -270,5 +286,10 @@ if __timerFile: __timerFile.write( __timerFileFmt%tuple( [ fo.currentTurn() ]+map(lambda x: int(1000*x), times )) +'\n') __timerFile.flush() + if __timerBucketFile: + __timerBucketFile.write( __timerBucketFileFmt%tuple( [ fo.currentTurn(), (turnStartTime-lastTurnTimestamp)*1000, (turnEndTime-turnStartTime)*1000 ]) +'\n') + __timerBucketFile.flush() + lastTurnTimestamp = time() + try: fo.doneTurn() except: print "Error: exception triggered and caught: ", traceback.format_exc() Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2012-11-28 18:56:49 UTC (rev 5477) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2012-11-28 22:34:57 UTC (rev 5478) @@ -166,8 +166,10 @@ troopsPerBestShip = 5*( 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) - for pID, pscore, ptroops in evaluatedPlanets: # evaluatedPlanets is a dictionary + for modscrore, pID, pscore, ptroops in sortedTargets: # evaluatedPlanets is a dictionary if invasionPool ==[]: return planet=universe.getPlanet(pID) if not planet: continue Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2012-11-28 18:56:49 UTC (rev 5477) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2012-11-28 22:34:57 UTC (rev 5478) @@ -12,7 +12,6 @@ from ColonisationAI import empireSpecies, empireColonizers, empireSpeciesSystems import TechsListsAI - shipTypeMap = dict( zip( [AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION, AIPriorityType.PRIORITY_PRODUCTION_OUTPOST, AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, AIPriorityType.PRIORITY_PRODUCTION_INVASION, AIPriorityType.PRIORITY_PRODUCTION_MILITARY], [AIShipDesignTypes.explorationShip, AIShipDesignTypes.outpostShip, AIShipDesignTypes.colonyShip, AIShipDesignTypes.troopShip, AIShipDesignTypes.attackShip ] ) ) @@ -25,31 +24,27 @@ def checkTroopShips(): empire = fo.getEmpire() - troopDesignIDs = [shipDesignID for shipDesignID in empire.allShipDesigns if shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_INVASION, "nomatch") in fo.getShipDesign(shipDesignID).name(False) ] + troopDesignIDs=[] + designNameBases= [key for key, val in sorted( shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_INVASION, {"nomatch":0}).items(), key=lambda x:x[1])] + for baseName in designNameBases: + troopDesignIDs.extend( [shipDesignID for shipDesignID in empire.allShipDesigns if baseName in fo.getShipDesign(shipDesignID).name(False) ] ) troopShipNames = [fo.getShipDesign(shipDesignID).name(False) for shipDesignID in troopDesignIDs] print "Current Troopship Designs: %s"%troopShipNames if fo.currentTurn() >1 : return - if False and len(troopDesignIDs) ==1 : + if designNameBases[1] not in troopShipNames: try: - res=fo.issueCreateShipDesignOrder("SD_TROOP_SHIP_A2", "Medium Hulled Troopship for economical large quantities of troops", - "SH_BASIC_MEDIUM", ["GT_TROOP_POD", "GT_TROOP_POD", "GT_TROOP_POD"], "", "fighter", False) - print "added Troopship SD_TROOP_SHIP_A2, with result %d"%res - except: - print "Error: exception triggered and caught: ", traceback.format_exc() - if "SD_TROOP_SHIP_A3" not in troopShipNames: - try: - res=fo.issueCreateShipDesignOrder("SD_TROOP_SHIP_A3", "multicell Hulled Troopship for economical large quantities of troops", + res=fo.issueCreateShipDesignOrder(designNameBases[1], "multicell Hulled Troopship for economical large quantities of troops", "SH_STATIC_MULTICELLULAR", ["GT_TROOP_POD", "GT_TROOP_POD", "SR_WEAPON_2", "GT_TROOP_POD", ""], "", "fighter", False) - print "added Troopship SD_TROOP_SHIP_A3, with result %d"%res + print "added Troopship %s, with result %d"%(designNameBases[1] , res) except: print "Error: exception triggered and caught: ", traceback.format_exc() - if "SD_TROOP_SHIP_A4" not in troopShipNames: + if designNameBases[2] not in troopShipNames: try: - res=fo.issueCreateShipDesignOrder("SD_TROOP_SHIP_A4", "multicell Hulled Troopship for economical large quantities of troops", + res=fo.issueCreateShipDesignOrder(designNameBases[2], "multicell Hulled Troopship for economical large quantities of troops", "SH_STATIC_MULTICELLULAR", ["GT_TROOP_POD", "GT_TROOP_POD", "SR_WEAPON_5", "GT_TROOP_POD", ""], "", "fighter", False) - print "added Troopship SD_TROOP_SHIP_A4, with result %d"%res + print "added Troopship %s, with result %d"%(designNameBases[2] , res) except: print "Error: exception triggered and caught: ", traceback.format_exc() bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_INVASION) @@ -60,20 +55,23 @@ def checkScouts(): empire = fo.getEmpire() - scoutDesignIDs = [shipDesignID for shipDesignID in empire.allShipDesigns if shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION, "nomatch") in fo.getShipDesign(shipDesignID).name(False) ] + scoutDesignIDs=[] + designNameBases= [key for key, val in sorted( shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION, {"nomatch":0}).items(), key=lambda x:x[1])] + for baseName in designNameBases: + scoutDesignIDs.extend( [shipDesignID for shipDesignID in empire.allShipDesigns if baseName in fo.getShipDesign(shipDesignID).name(False) ] ) scoutShipNames = [fo.getShipDesign(shipDesignID).name(False) for shipDesignID in scoutDesignIDs] #print "Current Scout Designs: %s"%scoutShipNames # name desc hull partslist icon model newScoutDesigns = [] - desc = "SD_SCOUT_DESC" + desc = "Scout" model = "fighter" srb = "SR_WEAPON_%1d" - nb, hull = "SD_SCOUT_A%1d_%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[1]+"%1d-%1d", "SH_STATIC_MULTICELLULAR" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" for id in [1, 2, 3, 4]: newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, srb%iw, is1, is1], "", model) for iw in range(1, 9) ] - nb = "SD_SCOUT_B%1d_%1d" + nb = designNameBases[2]+"%1d_%1d" for id in [1, 2, 3, 4]: newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, srb%iw, is1, is2], "", model) for iw in range(1, 9) ] @@ -109,65 +107,69 @@ def checkMarks(): empire = fo.getEmpire() - markDesignIDs = [shipDesignID for shipDesignID in empire.allShipDesigns if shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_MILITARY, "nomatch") in fo.getShipDesign(shipDesignID).name(False) ] + markDesignIDs = [] + designNameBases= [key for key, val in sorted( shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_MILITARY, {"nomatch":0}).items(), key=lambda x:x[1])] + for baseName in designNameBases: + markDesignIDs.extend( [shipDesignID for shipDesignID in empire.allShipDesigns if baseName in fo.getShipDesign(shipDesignID).name(False) ] ) markShipNames = [fo.getShipDesign(shipDesignID).name(False) for shipDesignID in markDesignIDs] #print "Current Mark Designs: %s"%markShipNames # name desc hull partslist icon model newMarkDesigns = [] - desc = "SD_MARK1_DESC" + desc = "military ship" model = "fighter" srb = "SR_WEAPON_%1d" - nb, hull = "SD_MARK_Z_A%1d", "SH_BASIC_MEDIUM" + nb, hull = designNameBases[1]+"-%1d", "SH_BASIC_MEDIUM" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, ""], "", model) for iw in range(1, 9) ] - nb, hull = "SD_MARK_Z_C_MC%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[2]+"-1-%1d", "SH_STATIC_MULTICELLULAR" is1, is2 = "FU_BASIC_TANK", "FU_BASIC_TANK" - newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(2, 9) ] - nb= "SD_MARK_Z_C2_MC%1d" + newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(2, 5) ] + nb= designNameBases[2]+"-2-%1d" is2 = "SH_DEFLECTOR" - newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(7, 9) ] +# newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(7, 9) ] - nb, hull = "SD_MARK_Z_D_ENDO%1d", "SH_ENDOMORPHIC" + #nb, hull = designNameBases[3]+"-%1d", "SH_ENDOMORPHIC" + nb, hull = designNameBases[3]+"-%1d", "SH_STATIC_MULTICELLULAR" is1 = "FU_BASIC_TANK" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + 3*[ is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] + 2*[ is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] - nb = "SD_MARK_Z_D2_ENDO%1d" + nb = designNameBases[3]+"-2-%1d" is3 = "SH_DEFLECTOR" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is1, is1, is3], "", model) for iw in [7, 8, 10, 11, 12 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] + [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12 ] ] - nb = "SD_MARK_Z_D3_ENDO%1d" + nb = designNameBases[3]+"3-%1d" ar1 = "AR_LEAD_PLATE" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar1] + [ is1, is1, is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] - nb = "SD_MARK_Z_D4_ENDO%1d" + nb = designNameBases[3]+"-4-%1d" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar1] + [ is1, is1, is3], "", model) for iw in [7, 8, 10, 11, 12 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12 ] ] - nb = "SD_MARK_Z_D5_ENDO%1d" + nb = designNameBases[4]+"-5-%1d" ar2= "AR_ZORTRIUM_PLATE" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + [ is1, is1, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar2] + [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] - nb = "SD_MARK_Z_D6_ENDO%1d" + nb = designNameBases[4]+"-6-%1d" ar3= "AR_NEUTRONIUM_PLATE" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] +[ar3]+ [ is1, is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw] +[ar3]+ [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] - nb = "SD_MARK_Z_D7_ENDO%1d" + nb = designNameBases[4]+"-7-%1d" is3= "SH_MULTISPEC" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is3, is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] + [ is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] - nb = "SD_MARK_Z_D8_ENDO%1d" + nb = designNameBases[4]+"-8-%1d" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + [ is3, is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar2] + [ is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] - nb = "SD_MARK_Z_D9_ENDO%1d" + nb = designNameBases[4]+"-9-%1d" #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar3] + [ is3, is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar3] + [ is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] currentTurn=fo.currentTurn() needsAdding=[] @@ -200,15 +202,18 @@ def checkOutpostShips(): empire = fo.getEmpire() - outpostDesignIDs = [shipDesignID for shipDesignID in empire.allShipDesigns if shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_OUTPOST, "nomatch") in fo.getShipDesign(shipDesignID).name(False) ] + outpostDesignIDs = [] + designNameBases= [key for key, val in sorted( shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_OUTPOST, {"nomatch":0}).items(), key=lambda x:x[1])] + for baseName in designNameBases: + outpostDesignIDs.extend( [shipDesignID for shipDesignID in empire.allShipDesigns if baseName in fo.getShipDesign(shipDesignID).name(False) ] ) outpostShipNames = [fo.getShipDesign(shipDesignID).name(False) for shipDesignID in outpostDesignIDs] #print "Current Outpost Designs: %s"%scoutShipNames # name desc hull partslist icon model newOutpostDesigns = [] - desc = "SD_OUTPOST_SHIP_DESC" + desc = "Outpost Ship" srb = "SR_WEAPON_%1d" model = "seed" - nb, hull = "SD_OUTPOST_SHIP_A%1d_%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[1]+"%1d_%1d", "SH_STATIC_MULTICELLULAR" op = "CO_OUTPOST_POD" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" @@ -245,15 +250,18 @@ def checkColonyShips(): empire = fo.getEmpire() - colonyDesignIDs = [shipDesignID for shipDesignID in empire.allShipDesigns if shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, "nomatch") in fo.getShipDesign(shipDesignID).name(False) ] + colonyDesignIDs = [] + designNameBases= [key for key, val in sorted( shipTypeMap.get(AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, {"nomatch":0}).items(), key=lambda x:x[1])] + for baseName in designNameBases: + colonyDesignIDs.extend( [shipDesignID for shipDesignID in empire.allShipDesigns if baseName in fo.getShipDesign(shipDesignID).name(False) ] ) colonyShipNames = [fo.getShipDesign(shipDesignID).name(False) for shipDesignID in colonyDesignIDs] #print "Current Outpost Designs: %s"%scoutShipNames # name desc hull partslist icon model newColonyDesigns = [] - desc = "SD_COLONY_SHIP_DESC" + desc = "Colony Ship" model = "seed" srb = "SR_WEAPON_%1d" - nb, hull = "SD_COLONY_SHIP_A%1d_%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[1]+"%1d_%1d", "SH_STATIC_MULTICELLULAR" cp = "CO_COLONY_POD" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" @@ -262,7 +270,7 @@ for id in [1, 2, 3, 4]: newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp, cp], "", model) for iw in range(6, 9) ] # when farther along, use 2 pods - nb = "SD_COLONY_SHIP_B%1d_%1d" + nb = designNameBases[2]+"%1d_%1d" cp = "CO_SUSPEND_ANIM_POD" for id in [1, 2, 3, 4]: newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp, is1], "", model) for iw in range(2, 9) ] @@ -299,11 +307,14 @@ def getBestShipInfo(priority): "returns designID, design, buildLocList" empire = fo.getEmpire() - theseDesigns = [shipDesign for shipDesign in empire.availableShipDesigns if shipTypeMap.get(priority, "nomatch") in fo.getShipDesign(shipDesign).name(False) and getAvailableBuildLocations(shipDesign) != [] ] - if theseDesigns == []: + theseDesignIDs = [] + designNameBases= shipTypeMap.get(priority, ["nomatch"]) + for baseName in designNameBases: + theseDesignIDs.extend( [(designNameBases[baseName]+fo.getShipDesign(shipDesign).name(False) , shipDesign ) for shipDesign in empire.availableShipDesigns if baseName in fo.getShipDesign(shipDesign).name(False) and getAvailableBuildLocations(shipDesign) != [] ] ) + if theseDesignIDs == []: return None, None, None #must be missing a Shipyard (or checking for outpost ship but missing tech) - ships = [ ( fo.getShipDesign(shipDesign).name(False), shipDesign) for shipDesign in theseDesigns ] - bestShip = sorted( ships)[-1][-1] + #ships = [ ( fo.getShipDesign(shipDesign).name(False), shipDesign) for shipDesign in theseDesignIDs ] + bestShip = sorted( theseDesignIDs)[-1][-1] buildChoices = getAvailableBuildLocations(bestShip) bestDesign= fo.getShipDesign(bestShip) return bestShip, bestDesign, buildChoices Modified: trunk/FreeOrion/default/AI/ResourcesAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResourcesAI.py 2012-11-28 18:56:49 UTC (rev 5477) +++ trunk/FreeOrion/default/AI/ResourcesAI.py 2012-11-28 22:34:57 UTC (rev 5478) @@ -382,7 +382,7 @@ if not printedHeader: printedHeader=True print "Rejecting further Research Focus choices as too expensive:" - print "%34s|%20s|%15s |%15s|%15s |%15s |%15s"%(" Planet ", " current RP/PP ", " current target RP/PP ", "current Focus "," rejectedFocus ", " rejected target RP/PP ", "rejected RP-PP equivalence Factor") + print "%34s|%20s|%15s |%15s|%15s |%15s |%15s"%(" Planet ", " current RP/PP ", " current target RP/PP ", "current Focus "," rejectedFocus ", " rejected target RP/PP ", "rejected RP-PP EQF") oldFocus=currentFocus[pid] cPP, cRP = currentOutput[pid][IFocus], currentOutput[pid][RFocus] otPP, otRP= newTargets[pid].get(oldFocus, (0, 0)) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2012-11-28 18:56:49 UTC (rev 5477) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2012-11-28 22:34:57 UTC (rev 5478) @@ -222,28 +222,27 @@ "GRO_PLANET_ECOL", "GRO_SUBTER_HAB", "DEF_GARRISON_1", - "SHP_HAB_MEGAFAUN", + "SHP_ENDOCRINE_SYSTEMS", "GRO_SYMBIOTIC_BIO", "LRN_ALGO_ELEGANCE", + "SHP_WEAPON_5", "CON_ENV_ENCAPSUL", "GRO_GENETIC_ENG", "DEF_DEFENSE_NET", "GRO_GENETIC_ENG", "SHP_MULTICELL_CAST", "DEF_GARRISON_2", - "SHP_WEAPON_5", "DEF_GARRISON_3", "SHP_WEAPON_6", "PRO_ROBOTIC_PROD", "PRO_FUSION_GEN", "GRO_XENO_GENETICS", + "LRN_ARTIF_MINDS", "SPY_DETECT_2", "GRO_XENO_HYBRIDS", - "SHP_ORG_HULL", "DEF_GARRISON_4", "SHP_WEAPON_7", "SHP_WEAPON_8", - "LRN_ARTIF_MINDS", "PRO_ORBITAL_GEN", "PRO_INDUSTRY_CENTER_I", "LRN_FORCE_FIELD", @@ -275,6 +274,7 @@ "SHP_BASIC_DAM_CONT", "DEF_HI_ENRG_FOCUS", "PRO_SINGULAR_GEN", + "SHP_INTSTEL_LOG", "SPY_CLOAK_1", "SHP_ADV_DAM_CONT", "SPY_DETECT_3", |
From: <ewi...@us...> - 2012-11-29 16:53:29
|
Revision: 5481 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5481&view=rev Author: ewillgohs Date: 2012-11-29 16:53:19 +0000 (Thu, 29 Nov 2012) Log Message: ----------- AI adjustments responsive to invasion changes among others Modified Paths: -------------- trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2012-11-29 16:47:34 UTC (rev 5480) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2012-11-29 16:53:19 UTC (rev 5481) @@ -163,7 +163,7 @@ invasionPool = invasionFleetIDs[:] #need to make a copy bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_INVASION) if bestDesign: - troopsPerBestShip = 5*( list(bestDesign.parts).count("GT_TROOP_POD") ) + 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 @@ -175,7 +175,7 @@ if not planet: continue sysID = planet.systemID foundFleets = [] - podsNeeded= int(math.ceil( (ptroops+4)/5)+0.0001) + podsNeeded= int(math.ceil( (ptroops+2)/2)+0.0001) foundStats={} minStats= {'rating':0, 'troopPods':podsNeeded} targetStats={'rating':10,'troopPods':podsNeeded+2} Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2012-11-29 16:47:34 UTC (rev 5480) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2012-11-29 16:53:19 UTC (rev 5481) @@ -218,7 +218,7 @@ queuedTroopPods += element.remaining*element.blocksize * list(design.parts).count("GT_TROOP_POD") bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_INVASION) if bestDesign: - troopsPerBestShip = 5*( list(bestDesign.parts).count("GT_TROOP_POD") ) + 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 Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2012-11-29 16:47:34 UTC (rev 5480) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2012-11-29 16:53:19 UTC (rev 5481) @@ -220,17 +220,18 @@ primaryMetaTechs = [ "SHP_WEAPON_2", "GRO_PLANET_ECOL", + "GRO_GENETIC_ENG", "GRO_SUBTER_HAB", "DEF_GARRISON_1", - "SHP_ENDOCRINE_SYSTEMS", + "SHP_DOMESTIC_MONSTER", + "SHP_ORG_HULL", + "LRN_ALGO_ELEGANCE", + "SHP_MULTICELL_CAST", "GRO_SYMBIOTIC_BIO", - "LRN_ALGO_ELEGANCE", "SHP_WEAPON_5", "CON_ENV_ENCAPSUL", "GRO_GENETIC_ENG", "DEF_DEFENSE_NET", - "GRO_GENETIC_ENG", - "SHP_MULTICELL_CAST", "DEF_GARRISON_2", "DEF_GARRISON_3", "SHP_WEAPON_6", @@ -240,14 +241,13 @@ "LRN_ARTIF_MINDS", "SPY_DETECT_2", "GRO_XENO_HYBRIDS", - "DEF_GARRISON_4", "SHP_WEAPON_7", "SHP_WEAPON_8", + "SHP_ENDOCRINE_SYSTEMS", "PRO_ORBITAL_GEN", "PRO_INDUSTRY_CENTER_I", "LRN_FORCE_FIELD", "PRO_INDUSTRY_CENTER_II", - "SHP_ORG_HULL", "GRO_LIFECYCLE_MAN", "GRO_TERRAFORM", "PRO_SOL_ORB_GEN", @@ -266,6 +266,7 @@ "PRO_MICROGRAV_MAN", "DEF_SYST_DEF_MINE", "SHP_ZORTRIUM_PLATE", + "DEF_GARRISON_4", "LRN_XENOARCH", "CON_METRO_INFRA", "CON_SUBTER_CONST", |
From: <ewi...@us...> - 2012-12-07 20:24:39
|
Revision: 5528 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5528&view=rev Author: ewillgohs Date: 2012-12-07 20:24:30 +0000 (Fri, 07 Dec 2012) Log Message: ----------- updates to AI, improving invasion planning, also hopefully improving planning efficiency at later game stages Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/ExplorationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/MilitaryAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/AIstate.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -9,6 +9,7 @@ import ExplorationAI from MilitaryAI import MinThreat import ProductionAI +import ResourcesAI ##moving ALL or NEARLY ALL 'global' variables into AIState object rather than module # global variables @@ -19,6 +20,7 @@ #colonisableOutpostIDs = [] # moved into AIstate outpostTargetedSystemIDs = [] opponentPlanetIDs = [] +opponentSystemIDs=[] invasionTargets=[] invasionTargetedSystemIDs = [] blockadeTargetedSystemIDs=[] @@ -57,6 +59,7 @@ self.colonisableOutpostIDs = [] # self.outpostTargetedSystemIDs = [] self.opponentPlanetIDs = [] + self.opponentSystemIDs=[] self.invasionTargetedSystemIDs = [] self.militarySystemIDs = [] self.militaryTargetedSystemIDs = [] @@ -113,6 +116,7 @@ del self.colonisableOutpostIDs del self.outpostTargetedSystemIDs del self.opponentPlanetIDs + del self.opponentSystemIDs del self.invasionTargetedSystemIDs del self.militarySystemIDs del self.militaryTargetedSystemIDs @@ -541,6 +545,7 @@ return def sessionStartCleanup(self): + ResourcesAI.newTargets.clear() self.newlySplitFleets={} for fleetID in FleetUtilsAI.getEmpireFleetIDs(): self.getFleetRole(fleetID) # Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -42,7 +42,9 @@ empireID = empire.empireID capitalID = PlanetUtilsAI.getCapital() #capitalID = empire.capitalID - homeworld = universe.getPlanet(capitalID) + homeworld=None + if capitalID: + homeworld = universe.getPlanet(capitalID) if homeworld: speciesName = homeworld.speciesName homeworldName=homeworld.name @@ -152,7 +154,7 @@ if thisSpec.canColonize: if "BLD_SHIPYARD_BASE" in [universe.getObject(bldg).buildingTypeName for bldg in planet.buildingIDs]: shipyards.append(pID) - empireSpeciesSystems[planet.systemID]=True + empireSpeciesSystems.setdefault(planet.systemID, {}).setdefault('pids', []).append(pID) if thisSpec.canColonize: empireColonizers[specName]=shipyards print "%s on planets %s; can%s colonize from %d shipyards; has tags %s"%(specName, empireSpecies[specName], ["not", ""][thisSpec.canColonize], len(shipyards), list(thisSpec.tags)) @@ -318,7 +320,7 @@ if (empire.getTechStatus("PRO_SOL_ORB_GEN") == fo.techStatus.complete) or ( "PRO_SOL_ORB_GEN" in empireResearchList[:8]) : if system.starType in [fo.starType.blue, fo.starType.white]: if len (AIstate.empireStars.get(fo.starType.blue, [])+AIstate.empireStars.get(fo.starType.white, []))==0: - starBonus +=20 + starBonus +=40 else: starBonus +=5 #still has extra value as an alternate location for solar generators if system.starType in [fo.starType.yellow, fo.starType.orange]: @@ -326,17 +328,17 @@ AIstate.empireStars.get(fo.starType.yellow, [])+AIstate.empireStars.get(fo.starType.orange, []))==0: starBonus +=10 else: - starBonus +=3 #still has extra value as an alternate location for solar generators + starBonus +=2 #still has extra value as an alternate location for solar generators if (empire.getTechStatus("PRO_SINGULAR_GEN") == fo.techStatus.complete) or ( "PRO_SINGULAR_GEN" in empireResearchList[:8]) : if system.starType in [fo.starType.blackHole]: if len (AIstate.empireStars.get(fo.starType.blackHole, []))==0: - starBonus +=60 #pretty rare planets, good for generator + starBonus +=80 #pretty rare planets, good for generator else: - starBonus +=10 #still has extra value as an alternate location for generators & for bnlocking enemies generators + starBonus +=20 #still has extra value as an alternate location for generators & for bnlocking enemies generators if (empire.getTechStatus("PRO_NEUTRONIUM_EXTRACTION") == fo.techStatus.complete) or ( "PRO_NEUTRONIUM_EXTRACTION" in empireResearchList[:8]) : if system.starType in [fo.starType.neutron]: if len (AIstate.empireStars.get(fo.starType.neutron, []))==0: - starBonus +=20 #pretty rare planets, good for armor + starBonus +=40 #pretty rare planets, good for armor else: starBonus +=5 #still has extra value as an alternate location for generators & for bnlocking enemies generators retval = starBonus @@ -346,13 +348,13 @@ for special in planetSpecials: if "_NEST_" in special: retval+=10 # get an outpost on the nest quick - if ( ( planet.size == fo.planetSize.asteroids ) and (empire.getTechStatus("PRO_MICROGRAV_MAN") == fo.techStatus.complete ) and planet.systemID in empireSpeciesSystems): - retval+=25 # asteroid mining is good return + if ( ( planet.size == fo.planetSize.asteroids ) and (empire.getTechStatus("PRO_MICROGRAV_MAN") == fo.techStatus.complete )): + retval+=10*len( empireSpeciesSystems.get(planet.systemID , [])) # asteroid mining is good return #TODO: check that no preexisting asteroid outpost in system for special in [ "MINERALS_SPECIAL", "CRYSTALS_SPECIAL", "METALOIDS_SPECIAL"] : if special in planetSpecials: retval += 30 #expects we can make exobots soonish or will have other colonizers & want to claim the planet - if ( ( planet.size == fo.planetSize.gasGiant ) and ( (empire.getTechStatus("PRO_ORBITAL_GEN") == fo.techStatus.complete ) or ( "PRO_ORBITAL_GEN" in empireResearchList[:10]) ) and planet.systemID in empireSpeciesSystems ): - retval += 45 # gias giant generators great, fast return + if ( ( planet.size == fo.planetSize.gasGiant ) and ( (empire.getTechStatus("PRO_ORBITAL_GEN") == fo.techStatus.complete ) or ( "PRO_ORBITAL_GEN" in empireResearchList[:10]) )): + retval += 45*len( empireSpeciesSystems.get(planet.systemID , [])) # gias giant generators great, fast return if foAI.foAIstate.systemStatus.get(planet.systemID, {}).get('fleetThreat', 0) > 0: retval = retval / 2.0 return int(retval) @@ -467,7 +469,7 @@ return (retval+ popSize + distanceFactor + valMod + gasGiantBonus + asteroidBonus)*threatFactor #return getPlanetHospitality(planetID, species) * planet.size + distanceFactor else: - return (retval+popSize - distanceFactor + valMod)*threatFactor + return (retval+popSize + distanceFactor + valMod)*threatFactor #return getPlanetHospitality(planetID, species) * planet.size - distanceFactor def getPlanetHospitality(planetID, species): @@ -510,6 +512,7 @@ print "colony/outpost ship matching -- fleets %s to planets %s"%( fleetPool, evaluatedPlanets) #for planetID_value_pair in evaluatedPlanets: + fleetPool=set(fleetPool) universe=fo.getUniverse() while (len(fleetPool) > 0 ) and ( len(potentialTargets) >0): thisTarget = potentialTargets.pop(0) @@ -519,10 +522,12 @@ print "Skipping colonization of system %d due to Big Monster, threat %d"%(thisSysID, foAI.foAIstate.systemStatus[thisSysID]['monsterThreat']) continue thisSpec=thisTarget[1][1] + foundFleets=[] thisFleetList = FleetUtilsAI.getFleetsForMission(nships=1, targetStats={}, minStats={}, curStats={}, species=thisSpec, systemsToCheck=[thisSysID], systemsChecked=[], - fleetPool = fleetPool, fleetList=[], verbose=False) + fleetPoolSet = fleetPool, fleetList=foundFleets, verbose=False) if thisFleetList==[]: - continue #must have no compatible colony/outpost ships + fleetPool.update(foundFleets)#just to be safe + continue #must have no compatible colony/outpost ships fleetID = thisFleetList[0] aiTarget = AITarget.AITarget(AITargetType.TARGET_PLANET, thisPlanetID) Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -56,6 +56,7 @@ exploreList = [sysID for dist, sysID in expSystemsByDist ] alreadyCovered, availableScouts = getCurrentExplorationInfo() + print "explorable sys IDs: %s"%exploreList print "already targeted: %s"%alreadyCovered @@ -68,14 +69,16 @@ if not needsCoverage or not availableScouts: return + availableScouts = set(availableScouts) sentList=[] while (len(availableScouts) > 0 ) and ( len(needsCoverage) >0): thisSysID = needsCoverage.pop(0) if (foAI.foAIstate.systemStatus.setdefault(thisSysID, {}).setdefault('monsterThreat', 0) > 2000) or (fo.currentTurn() <20 and foAI.foAIstate.systemStatus[thisSysID]['monsterThreat'] > 200): print "Skipping exploration of system %d due to Big Monster, threat %d"%(thisSysID, foAI.foAIstate.systemStatus[thisSysID]['monsterThreat']) continue + foundFleets=[] thisFleetList = FleetUtilsAI.getFleetsForMission(nships=1, targetStats={}, minStats={}, curStats={}, species="", systemsToCheck=[thisSysID], systemsChecked=[], - fleetPool = availableScouts, fleetList=[], verbose=False) + fleetPoolSet = availableScouts, fleetList=foundFleets, verbose=False) if thisFleetList==[]: print "seem to have run out of scouts while trying to cover sysID %d"%thisSysID break #must have ran out of scouts @@ -87,7 +90,7 @@ sentList.append(thisSysID) else: #system too far out, skip it, but can add scout back to available pool print "sysID %d too far out for fleet ( ID %d ) to readch"%(thisSysID, fleetID) - availableScouts.append(fleetID) + availableScouts.update(thisFleetList) print "sent scouting fleets to sysIDs : %s"%sentList return """ Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -42,12 +42,12 @@ tally += 1 return tally -def getFleetsForMission(nships, targetStats, minStats, curStats, species, systemsToCheck, systemsChecked, fleetPool, fleetList, takeAny=False, verbose=False): #implements breadth-first search through systems +def getFleetsForMission(nships, targetStats, minStats, curStats, species, systemsToCheck, systemsChecked, fleetPoolSet, fleetList, takeAny=False, verbose=False): #implements breadth-first search through systems if verbose: - print "getFleetsForMission: (nships:%1d, targetStats:%6d, minStats:%6d, curStats:%6d, species:%6s, systemsToCheck:%8s, systemsChecked:%8s, fleetPool:%8s, fleetList:%8s) "%( - nships, targetStats, minStats, curStats, species, systemsToCheck, systemsChecked, fleetPool, fleetList) + print "getFleetsForMission: (nships:%1d, targetStats:%6d, minStats:%6d, curStats:%6d, species:%6s, systemsToCheck:%8s, systemsChecked:%8s, fleetPoolSet:%8s, fleetList:%8s) "%( + nships, targetStats, minStats, curStats, species, systemsToCheck, systemsChecked, fleetPoolSet, fleetList) universe = fo.getUniverse() - if not (systemsToCheck and fleetPool): + if not (systemsToCheck and fleetPoolSet): if verbose: print "no more systems or fleets to check" if takeAny or ( statsMeetReqs(curStats, minStats) and ( sum( [len(universe.getFleet(fID).shipIDs) for fID in fleetList] ) >= nships)): @@ -59,18 +59,20 @@ #thisSys = universe.getSystem(thisSystemID) #if not thisSys: # return getFleetsForMission(nships.... - fleetsHere = [fleetID for fleetID in fleetPool if ( foAI.foAIstate.fleetStatus.get(fleetID, {}).get('sysID', -1) == thisSystemID ) ] + #fleetsHere = [fleetID for fleetID in fleetPoolSet if ( foAI.foAIstate.fleetStatus.get(fleetID, {}).get('sysID', -1) == thisSystemID ) ] + fleetsHere = [ fid for fid in foAI.foAIstate.systemStatus.get(thisSystemID, {}).get('myfleets', []) if fid in fleetPoolSet] if verbose: print "found fleetPool Fleets %s"%fleetsHere while fleetsHere !=[]: fleetID=fleetsHere.pop(0) fleet = universe.getFleet(fleetID) if not fleet: - del fleetPool[ fleetPool.index( fleetID) ] + #del fleetPool[ fleetPool.index( fleetID) ] + fleetPoolSet.remove( fleetID) continue if len (list(fleet.shipIDs)) > 1: newFleets = splitFleet(fleetID) # try splitting fleet - fleetPool.extend(newFleets) + fleetPoolSet.update(newFleets) fleetsHere.extend(newFleets) meetsSpeciesReq=False if (species == ""): @@ -83,7 +85,8 @@ break if meetsSpeciesReq: fleetList.append(fleetID) - del fleetPool[ fleetPool.index( fleetID) ] + #del fleetPool[ fleetPool.index( fleetID) ] + fleetPoolSet.remove( fleetID) curStats['rating'] = curStats.get('rating', 0) + foAI.foAIstate.getRating(fleetID) if 'troopPods' in targetStats: curStats['troopPods'] = curStats.get('troopPods', 0) + countPartsFleetwide(fleetID, ["GT_TROOP_POD"]) @@ -96,7 +99,7 @@ for neighborID in [el.key() for el in universe.getSystemNeighborsMap(thisSystemID, foAI.foAIstate.empireID) ]: if neighborID not in systemsChecked and neighborID in foAI.foAIstate.exploredSystemIDs: systemsToCheck.append(neighborID) - return getFleetsForMission(nships, targetStats, minStats, curStats, species, systemsToCheck, systemsChecked, fleetPool, fleetList, takeAny, verbose) + return getFleetsForMission(nships, targetStats, minStats, curStats, species, systemsToCheck, systemsChecked, fleetPoolSet, fleetList, takeAny, verbose) def splitFleet(fleetID): "splits a fleet into its ships" Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -213,16 +213,19 @@ turnStartTime=time() #starting AI timer here, to be sure AI doesn't get blame for any lags in server being able to provide the Universe object empire = fo.getEmpire() planetID = PlanetUtilsAI.getCapital() + planet=None if planetID is not None: planet = universe.getPlanet(planetID) print "***************************************************************************" print "***************************************************************************" print ("Generating Orders") print "EmpireID: " + str(empire.empireID) + " Name: " + empire.name + " Turn: " + str(fo.currentTurn()) + empireColor=empire.colour + print "EmpireColors: %d %d %d %d"%(empireColor.r, empireColor.g, empireColor.b, empireColor.a) if planet: print "CapitalID: " + str(planetID) + " Name: " + planet.name + " Species: " + planet.speciesName else: - print "No current capital" + print "CapitalID: None Currently Name: None Species: None " print "***************************************************************************" print "***************************************************************************" Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -7,6 +7,7 @@ import AITarget import math from ProductionAI import getBestShipInfo +from ColonisationAI import evaluatePlanet def getInvasionFleets(): "get invasion fleets" @@ -21,6 +22,13 @@ fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) + + primeInvadableSystemIDs = set([]) + for sysID in empire.fleetSupplyableSystemIDs: + primeInvadableSystemIDs.add(sysID) + for nID in universe.getImmediateNeighbors(sysID, empireID): + primeInvadableSystemIDs.add(nID) + primeInvadablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(primeInvadableSystemIDs) # get competitor planets exploredSystemIDs = empire.exploredSystemIDs @@ -34,8 +42,8 @@ empireOwnedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) # print "Empire Owned PlanetIDs: " + str(empireOwnedPlanetIDs) - invadablePlanetIDs = list(set(allPopulatedPlanets) - set(empireOwnedPlanetIDs)) - print "Invadable PlanetIDs: " + str(invadablePlanetIDs) + invadablePlanetIDs = set(primeInvadablePlanetIDs).intersection(set(allPopulatedPlanets) - set(empireOwnedPlanetIDs)) + print "Prime Invadable PlanetIDs: " + str(invadablePlanetIDs) print "" print "Invasion Targeted SystemIDs: " + str(AIstate.invasionTargetedSystemIDs) @@ -103,46 +111,52 @@ planetValues = {} for planetID in planetIDs: - planetValues[planetID] = evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, empire) + planetValues[planetID] = evaluateInvasionPlanet(planetID, missionType, fleetSupplyablePlanetIDs, empire) return planetValues -def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, empire): +def evaluateInvasionPlanet(planetID, missionType, fleetSupplyablePlanetIDs, empire): "return the invasion value of a planet" - + #TODO: add more factors, as used for colonization universe = fo.getUniverse() + empireID = empire.empireID distanceFactor = 0 planet = universe.getPlanet(planetID) - if (planet == None): + if (planet == None) : #TODO: exclude planets with stealth higher than empireDetection print "invasion AI couldn't get current info on planet %d"%planetID return 0, 0 - - # give preference to closest invadable planets - empireID = empire.empireID + capitalID = PlanetUtilsAI.getCapital() homeworld = universe.getPlanet(capitalID) if homeworld: homeSystemID = homeworld.systemID evalSystemID = planet.systemID leastJumpsPath = len(universe.leastJumpsPath(homeSystemID, evalSystemID, empireID)) - distanceFactor = 1.001/(leastJumpsPath + 1) + distanceFactor = 4.0/(leastJumpsPath + 1) - targetPop=planet.currentMeterValue(fo.meterType.targetPopulation) - if planetID in fleetSupplyablePlanetIDs: - popVal = 4*targetPop + troops = planet.currentMeterValue(fo.meterType.troops) + specName=planet.speciesName + species=fo.getSpecies(specName) + if not species:# perhaps stealth might make species info inaccessible + targetPop=planet.currentMeterValue(fo.meterType.targetPopulation) + if planetID in fleetSupplyablePlanetIDs: + popVal = 4*targetPop + else: + popVal = 6*targetPop#assign higher value if the colony would extend our supply range + planetSpecials = list(planet.specials) + specialVal=0 + if ( ( planet.size == fo.planetSize.asteroids ) and (empire.getTechStatus("PRO_ASTEROID_MINE") == fo.techStatus.complete ) ): + specialVal= 15 # asteroid mining is great, fast return + for special in [ "MINERALS_SPECIAL", "CRYSTALS_SPECIAL", "METALOIDS_SPECIAL"] : + if special in planetSpecials: + specialVal = 40 + return popVal+specialVal, troops else: - popVal = targetPop + popVal = evaluatePlanet(planetID, AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], species, empire) #evaluatePlanet is implorted from ColonisationAI + if planetID not in fleetSupplyablePlanetIDs: + popVal = 1.3*popVal#assign higher value if the colony would extend our supply range + return popVal, troops - troops = planet.currentMeterValue(fo.meterType.troops) - planetSpecials = list(planet.specials) - specialVal=0 - if ( ( planet.size == fo.planetSize.asteroids ) and (empire.getTechStatus("PRO_ASTEROID_MINE") == fo.techStatus.complete ) ): - specialVal= 15 # asteroid mining is great, fast return - for special in [ "MINERALS_SPECIAL", "CRYSTALS_SPECIAL", "METALOIDS_SPECIAL"] : - if special in planetSpecials: - specialVal = 40 - return popVal+specialVal, troops - def getPlanetPopulation(planetID): @@ -169,8 +183,9 @@ sortedTargets=sorted( [ ( pscore-ptroops/2 , pID, pscore, ptroops) for pID, pscore, ptroops in evaluatedPlanets ] , reverse=True) + invasionPool=set(invasionPool) for modscrore, pID, pscore, ptroops in sortedTargets: # evaluatedPlanets is a dictionary - if invasionPool ==[]: return + if not invasionPool: return planet=universe.getPlanet(pID) if not planet: continue sysID = planet.systemID @@ -179,10 +194,11 @@ foundStats={} minStats= {'rating':0, 'troopPods':podsNeeded} targetStats={'rating':10,'troopPods':podsNeeded+2} - theseFleets = FleetUtilsAI.getFleetsForMission(1, targetStats , minStats, foundStats, "", systemsToCheck=[sysID], systemsChecked=[], fleetPool=invasionPool, fleetList=foundFleets, verbose=False) + 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 Modified: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -94,13 +94,14 @@ else: threatBias = 200 + # allocation format: ( sysID, newAllocation, takeAny, maxMultiplier ) #================================ #--------Capital Threat ---------- capitalThreat = 2* threatBias +sum( [ foAI.foAIstate.systemStatus[capitalSysID][thrtKey] for thrtKey in [tkey for tkey in foAI.foAIstate.systemStatus.get(capitalSysID, {}).keys() if 'Threat' in tkey]] ) newAlloc=0 if capitalThreat > 0.8*alreadyAssignedRating[capitalSysID]: newAlloc = min(remainingMilRating, int( 0.999 + 1.2*(capitalThreat- 0.8*alreadyAssignedRating[capitalSysID]) ) ) - allocations.append( ( capitalSysID, newAlloc, True) ) + allocations.append( ( capitalSysID, newAlloc, True, 3) ) remainingMilRating -= newAlloc print "Empire Capital System: (%d) %s -- threat : %d, military allocation: existing: %d ; new: %d"%(capitalSysID, universe.getSystem(capitalSysID).name , capitalThreat, alreadyAssignedRating[capitalSysID], newAlloc) print "-----------------" @@ -122,7 +123,7 @@ thisAlloc=0 if (thrt > curAlloc) and remainingMilRating > 0: thisAlloc = max(0, min( min( int(0.99999 + (thrt-curAlloc)*allocationFactor ), 0.5*availMilRating) , remainingMilRating)) - allocations.append( (sid, thisAlloc, True) ) + allocations.append( (sid, thisAlloc, True, 2) ) remainingMilRating -= thisAlloc ocSysAlloc += thisAlloc print "Provincial Empire-Occupied Sytems under total threat: %d -- total mil allocation: existing %d ; new: %d"%(totocSysThreat, totCurAlloc, ocSysAlloc ) @@ -145,7 +146,7 @@ thisAlloc=0 if thrt>curAlloc and remainingMilRating > 10+ 1.5*(thrt-curAlloc) and foAI.foAIstate.systemStatus.get(sid, {}).get('monsterThreat', 0) < 0.4*totMilRating: #only record an allocation for this invasion if we have enough rating available thisAlloc =int(10.99999 + (thrt-curAlloc)*1.5) - allocations.append( (sid, thisAlloc, False) ) + allocations.append( (sid, thisAlloc, False, 3) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc print "Targeted system %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) @@ -167,7 +168,7 @@ thisAlloc=0 if (thrt > curAlloc) and remainingMilRating > 1.5*(thrt-curAlloc) and foAI.foAIstate.systemStatus.get(sid, {}).get('monsterThreat', 0) < 0.4*totMilRating: thisAlloc = min( min( int(0.99999 + (thrt-curAlloc)*1.5), remainingMilRating ), 0.5*availMilRating) - allocations.append( (sid, thisAlloc, False) ) + allocations.append( (sid, thisAlloc, False, 2.0) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc print "Targeted system %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) @@ -175,7 +176,39 @@ print "Other Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) print "-----------------" - currentMilSystems = [sid for sid, alloc, takeAny in allocations ] + otherTargetedSystemIDs = [] + fleetSuppliableSystemIDs = empire.fleetSupplyableSystemIDs + for sysID in AIstate.opponentSystemIDs: + if sysID in fleetSuppliableSystemIDs: + otherTargetedSystemIDs.append(sysID) + else: + for nID in universe.getImmediateNeighbors(sysID, empireID): + if nID in fleetSuppliableSystemIDs: + otherTargetedSystemIDs.append(sysID) + break + + print "Blockade Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) + print "-----------------" + # for these, calc local threat only, no neighbor threat, but use a multiplier for fleet safety + if len( otherTargetedSystemIDs ) > 0: + otSysAlloc = 0 + otSysThreat = [ ( oSID, threatBias +foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0)+ foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) ) for oSID in otherTargetedSystemIDs ] + tototSysThreat = sum( [thrt for sid, thrt in otSysThreat] ) + totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in otSysThreat] ) + for sid, thrt in otSysThreat: + curAlloc=0.8*alreadyAssignedRating[sid] + thisAlloc=0 + if (thrt > curAlloc) and remainingMilRating > 1.5*(thrt-curAlloc) and foAI.foAIstate.systemStatus.get(sid, {}).get('monsterThreat', 0) < 0.4*totMilRating: + thisAlloc = min( min( int(0.99999 + (thrt-curAlloc)*1.5), remainingMilRating ), 0.5*availMilRating) + allocations.append( (sid, thisAlloc, False, 10) ) + remainingMilRating -= thisAlloc + otSysAlloc += thisAlloc + print "Blockade Targeted system %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) + print "-----------------" + print "Blockade Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "-----------------" + + currentMilSystems = [sid for sid, alloc, takeAny, mm in allocations ] interiorIDs = list( foAI.foAIstate.expInteriorSystemIDs) interiorTargets1 = [sid for sid in interiorIDs if ( ( sid not in currentMilSystems )) ] interiorTargets = [sid for sid in interiorIDs if ( (threatBias + foAI.foAIstate.systemStatus.get(sid, {}).get('fleetThreat', 0) >0.8*alreadyAssignedRating[sid] ) ) ] @@ -193,7 +226,7 @@ thisAlloc=0 if (thrt > curAlloc) and remainingMilRating > 0 : thisAlloc = min( min( int(0.99999 +( thrt-curAlloc)*1.5), remainingMilRating ), 0.5*availMilRating) - allocations.append( (sid, thisAlloc, True) ) + allocations.append( (sid, thisAlloc, True, 1.2) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc print "Other interior system %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) @@ -229,7 +262,7 @@ monsterDens.append(sid) continue # consider dealing with big monsters later thisAlloc = min( min( int(0.99999 + (thrt-curAlloc)*1.5), remainingMilRating ), 0.5*availMilRating) - allocations.append( (sid, thisAlloc, False) ) + allocations.append( (sid, thisAlloc, False, 2) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc print "Exploration-targeted %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) @@ -239,7 +272,7 @@ visibleSystemIDs = foAI.foAIstate.visInteriorSystemIDs.keys() + foAI.foAIstate. visBorderSystemIDs.keys() accessibleSystemIDs = [sysID for sysID in visibleSystemIDs if universe.systemsConnected(sysID, homeSystemID, empireID) ] - currentMilSystems = [sid for sid, alloc, takeAny in allocations if alloc > 0 ] + currentMilSystems = [sid for sid, alloc, takeAny, multiplier in allocations if alloc > 0 ] borderTargets1 = [sid for sid in accessibleSystemIDs if ( ( sid not in currentMilSystems )) ] borderTargets = [sid for sid in borderTargets1 if ( ( threatBias +foAI.foAIstate.systemStatus.get(sid, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(sid, {}).get('planetThreat', 0) > 0.8*alreadyAssignedRating[sid] )) ] print "" @@ -260,7 +293,7 @@ monsterDens.append(sid) continue # consider dealing with big monsters later thisAlloc = min( min( int(0.99999 + (thrt-curAlloc)*1.5), remainingMilRating ), 0.5*availMilRating) - allocations.append( (sid, thisAlloc, False) ) + allocations.append( (sid, thisAlloc, False, 5) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc print "Other Empire-Accessible system %4d ( %10s ) has local biased threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) @@ -294,22 +327,22 @@ if remainingMilRating <=6: - newAllocations = [ (sid, alc, alc, ta) for (sid, alc, ta) in allocations ] + newAllocations = [ (sid, alc, alc, ta) for (sid, alc, ta, mm) in allocations ] else: - totAlloc = sum( [alloc for sid, alloc, takeAny in allocations ] ) + totAlloc = sum( [alloc for sid, alloc, takeAny, maxMul in allocations ] ) factor =(2.0* remainingMilRating ) / ( totAlloc + 0.1) print "Remaining military strength allocation %d will be allocated as %.1f %% surplus allocation to top current priorities"%(remainingMilRating, 100*factor) newAllocations = [] - for sid, alloc, takeAny in allocations: + for sid, alloc, takeAny, maxMul in allocations: if remainingMilRating <= 0 : newAllocations.append( ( sid, alloc, alloc, takeAny ) ) else: - thisAlloc = int( factor * alloc ) + thisAlloc = int( max( maxMul-1, factor )* alloc ) newAllocations.append( ( sid, alloc+thisAlloc, alloc, takeAny ) ) remainingMilRating -= thisAlloc MilitaryAllocations = newAllocations - minMilAllocations = dict( [ (sid, alloc) for sid, alloc, takeAny in allocations ] ) + minMilAllocations = dict( [ (sid, alloc) for sid, alloc, takeAny, mm in allocations ] ) print "------------------------------\nFinal Military Allocations: %s \n-----------------------"%dict( [ (sid, alloc) for sid, alloc, minalloc, takeAny in newAllocations ] ) if False: #keep old code for reference, for now @@ -482,13 +515,15 @@ # get systems to defend universe = fo.getUniverse() + availMilFleetIDs = set(availMilFleetIDs) for sysID, alloc, minalloc, takeAny in MilitaryAllocations: foundFleets = [] foundStats={} - theseFleets = FleetUtilsAI.getFleetsForMission(1, {'rating':alloc}, {'rating':minalloc}, foundStats, "", systemsToCheck=[sysID], systemsChecked=[], fleetPool=availMilFleetIDs, fleetList=foundFleets, verbose=False) + theseFleets = FleetUtilsAI.getFleetsForMission(1, {'rating':alloc}, {'rating':minalloc}, foundStats, "", systemsToCheck=[sysID], systemsChecked=[], fleetPoolSet=availMilFleetIDs, fleetList=foundFleets, verbose=False) if theseFleets == []: if foundFleets==[] or not ( FleetUtilsAI.statsMeetReqs( foundStats, {'rating':minalloc}) or takeAny): print "NO available/suitable military allocation for system %d ( %s ) -- requested allocation %8d, found available rating %8d in fleets %s"%(sysID, universe.getSystem(sysID).name, minalloc, foundStats.get('rating', 0), foundFleets) + availMilFleetIDs.update(foundFleets) continue else: theseFleets = foundFleets Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -409,8 +409,8 @@ #TODO: add totalPP checks below, so don't overload queue queuedShipyardLocs = [element.locationID for element in productionQueue if (element.name=="BLD_SHIPYARD_BASE") ] - theseSystems={} - theseplanets={} #unused for now + colonySystems={} + colonyPlanets={} for specName in empireColonizers: if (len( empireColonizers[specName])==0) and (specName in empireSpecies): #no current shipyards for this species#TODO: also allow orbital incubators and/or asteroid ships for pID in empireSpecies.get(specName, []): #SP_EXOBOT may not actually have a colony yet but be in empireColonizers @@ -423,11 +423,11 @@ buildLoc= pops[-1][1] res=fo.issueEnqueueBuildingProductionOrder("BLD_SHIPYARD_BASE", buildLoc) print "Enqueueing BLD_SHIPYARD_BASE at planet %d (%s) for colonizer species %s, with result %d"%(buildLoc, universe.getPlanet(buildLoc).name, specName, res) - for pid in empireSpecies.get(specName, []): - planet=universe.getPlanet(pid) - if planet: - theseSystems.setdefault(planet.systemID, {}).setdefault('pids', []).append(pid) - theseplanets[pid]=planet.systemID + for pid in empireSpecies.get(specName, []): + planet=universe.getPlanet(pid) + if planet: + colonySystems.setdefault(planet.systemID, {}).setdefault('pids', []).append(pid) + colonyPlanets[pid]=planet.systemID bldName = "BLD_SHIPYARD_ORG_ORB_INC" if empire.buildingTypeAvailable(bldName): @@ -443,11 +443,13 @@ if empire.buildingTypeAvailable(bldName): queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] bldType = fo.getBuildingType(bldName) - for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): + for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs):#TODO: check to ensure that a resource center exists in system, or GGG would be wasted if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building - res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) - if res: queuedBldLocs.append(pid) - print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) + thisPlanet=universe.getPlanet(pid) + if thisPlanet.systemID in empireSpeciesSystems: + res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + if res: queuedBldLocs.append(pid) + print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) bldName = "BLD_SOL_ORB_GEN" if empire.buildingTypeAvailable(bldName): @@ -596,7 +598,7 @@ planet=universe.getPlanet(pid) if bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building if bldName not in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: - if "BLD_SHIPYARD_BASE" not in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: + if "BLD_SHIPYARD_BASE" in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) if res: @@ -654,13 +656,14 @@ topPriority = -1 topscore = -1 + numTotalFleets = len(foAI.foAIstate.fleetStatus) numColonyTargs=len(foAI.foAIstate.colonisablePlanetIDs ) numColonyFleets=len( FleetUtilsAI.getEmpireFleetIDsByRole( AIFleetMissionType.FLEET_MISSION_COLONISATION) )# counting existing colony fleets each as one ship totColonyFleets = sum(queuedColonyShips.values()) + numColonyFleets bestShip, bestDesign, buildChoices = getBestShipInfo(AIPriorityType.PRIORITY_PRODUCTION_COLONISATION) colonyBuildLocs=[] speciesMap = {} - for loc in buildChoices: + for loc in (buildChoices or []): thisSpec = universe.getPlanet(loc).speciesName speciesMap.setdefault(thisSpec, []).append( loc) colonyBuildChoices=[] @@ -671,6 +674,8 @@ numOutpostTargs=len(foAI.foAIstate.colonisableOutpostIDs ) numOutpostFleets=len( FleetUtilsAI.getEmpireFleetIDsByRole( AIFleetMissionType.FLEET_MISSION_OUTPOST) )# counting existing outpost fleets each as one ship totOutpostFleets = queuedOutpostShips + numOutpostFleets + maxColonyFleets = min( numColonyTargs+1+fo.currentTurn()/10 , numTotalFleets/4 ) + maxOutpostFleets = min(numOutpostTargs+1+fo.currentTurn()/10, numTotalFleets/4 ) print "Production Queue Priorities:" filteredPriorities = {} @@ -680,9 +685,9 @@ topscore = score #don't really need topscore nor sorting with current handling print " Score: %4d -- %s "%(score, AIPriorityNames[ID] ) if ID != AIPriorityType.PRIORITY_PRODUCTION_BUILDINGS: - if ( ID == AIPriorityType.PRIORITY_PRODUCTION_COLONISATION ) and ( totColonyFleets < numColonyTargs+1+int(fo.currentTurn()/10) ) and len(colonyBuildChoices) >0: + if ( ID == AIPriorityType.PRIORITY_PRODUCTION_COLONISATION ) and ( totColonyFleets < maxColonyFleets) and len(colonyBuildChoices) >0: filteredPriorities[ID]= score - elif ( ID == AIPriorityType.PRIORITY_PRODUCTION_OUTPOST ) and ( totOutpostFleets < numOutpostTargs+1+int(fo.currentTurn()/20) ): + elif ( ID == AIPriorityType.PRIORITY_PRODUCTION_OUTPOST ) and ( totOutpostFleets < maxOutpostFleets ): filteredPriorities[ID]= score elif ID not in [AIPriorityType.PRIORITY_PRODUCTION_OUTPOST , AIPriorityType.PRIORITY_PRODUCTION_COLONISATION ]: filteredPriorities[ID]= score @@ -726,16 +731,22 @@ makingColonyShip=False makingOutpostShip=False if ( thisPriority == AIPriorityType.PRIORITY_PRODUCTION_COLONISATION ): - if ( totColonyFleets >= numColonyTargs+1+int(fo.currentTurn()/10) ): + if ( totColonyFleets >= maxColonyFleets ): print "Already sufficient colony ships in queue, trying next priority choice" print "" + for i in range( len(priorityChoices)-1, -1, -1): + if priorityChoices[i]==AIPriorityType.PRIORITY_PRODUCTION_COLONISATION: + del priorityChoices[i] continue else: makingColonyShip=True if ( thisPriority == AIPriorityType.PRIORITY_PRODUCTION_OUTPOST ): - if ( totOutpostFleets >= numOutpostTargs+1+int(fo.currentTurn()/20) ): + if ( totOutpostFleets >= maxOutpostFleets ): print "Already sufficient outpost ships in queue, trying next priority choice" print "" + for i in range( len(priorityChoices)-1, -1, -1): + if priorityChoices[i]==AIPriorityType.PRIORITY_PRODUCTION_OUTPOST: + del priorityChoices[i] continue else: makingOutpostShip=True @@ -746,7 +757,7 @@ loc = choice(buildChoices) numShips=1 perTurnCost = (float(bestDesign.productionCost(empire.empireID, homeworld.id)) / bestDesign.productionTime(empire.empireID, loc)) - if not ( makingColonyShip or makingOutpostShip ): #TODO: consider whether to allow multiples of colony or outpost ships; if not, priority sampling gets skewed + if not ( makingColonyShip ): #TODO: consider whether to allow multiples of colony ships; if not, priority sampling gets skewed while ( totalPP > 25*perTurnCost): numShips *= 5 perTurnCost *= 5 Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -62,7 +62,7 @@ else: print " %25s allocated %6.2f RP -- missing preReqs: %s -- unlockable items: %s "%(element.tech, element.allocation, missingPrereqs, unlockedItems) print "" - if fo.currentTurn()<=1: + if fo.currentTurn()==1: newtech = TechsListsAI.primaryMetaTechsList() #pLTsToEnqueue = (set(newtech)-(set(completedTechs)|set(researchQueueList))) pLTsToEnqueue = newtech[:] Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2012-12-07 16:27:48 UTC (rev 5527) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2012-12-07 20:24:30 UTC (rev 5528) @@ -222,33 +222,35 @@ "GRO_PLANET_ECOL", "GRO_GENETIC_ENG", "GRO_SUBTER_HAB", - "DEF_GARRISON_1", "SHP_DOMESTIC_MONSTER", "SHP_ORG_HULL", "LRN_ALGO_ELEGANCE", "SHP_MULTICELL_CAST", - "GRO_SYMBIOTIC_BIO", - "SHP_WEAPON_5", "CON_ENV_ENCAPSUL", - "GRO_GENETIC_ENG", + "DEF_GARRISON_1", + "SHP_WEAPON_5", + "GRO_SYMBIOTIC_BIO", + "PRO_ROBOTIC_PROD", + "PRO_INDUSTRY_CENTER_I", + "PRO_FUSION_GEN", "DEF_DEFENSE_NET", "DEF_GARRISON_2", - "DEF_GARRISON_3", "SHP_WEAPON_6", - "PRO_ROBOTIC_PROD", - "PRO_FUSION_GEN", "GRO_XENO_GENETICS", + "PRO_INDUSTRY_CENTER_II", + "PRO_ORBITAL_GEN", "LRN_ARTIF_MINDS", + "LRN_FORCE_FIELD", + "CON_ORBITAL_CON", "SPY_DETECT_2", "GRO_XENO_HYBRIDS", + "GRO_LIFECYCLE_MAN", + "SHP_ENDOCRINE_SYSTEMS", "SHP_WEAPON_7", + "PRO_MICROGRAV_MAN", + "SHP_ASTEROID_HULLS", "SHP_WEAPON_8", - "SHP_ENDOCRINE_SYSTEMS", - "PRO_ORBITAL_GEN", - "PRO_INDUSTRY_CENTER_I", - "LRN_FORCE_FIELD", - "PRO_INDUSTRY_CENTER_II", - "GRO_LIFECYCLE_MAN", + "DEF_GARRISON_3", "GRO_TERRAFORM", "PRO_SOL_ORB_GEN", "LRN_PHYS_BRAIN", @@ -256,26 +258,25 @@ "GRO_GENETIC_MED", "SHP_LEAD_PLATE", "GRO_CYBORG", - "LRN_QUANT_NET", - "CON_FRC_ENRG_CAMO", "PRO_SENTIENT_AUTOMATION", "PRO_EXOBOTS", + "SHP_WEAPON_9", + "LRN_QUANT_NET", + "CON_FRC_ENRG_CAMO", "LRN_GRAVITONICS", - "SHP_ASTEROID_HULLS", - "CON_ORBITAL_CON", - "PRO_MICROGRAV_MAN", "DEF_SYST_DEF_MINE", + "SHP_INTSTEL_LOG", + "SHP_REINFORCED_HULL", + "SHP_WEAPON_10", "SHP_ZORTRIUM_PLATE", - "DEF_GARRISON_4", "LRN_XENOARCH", "CON_METRO_INFRA", "CON_SUBTER_CONST", "GRO_GENOME_BANK", - "DEF_PLAN_DEFLECT_SHLD", "SHP_BASIC_DAM_CONT", "DEF_HI_ENRG_FOCUS", "PRO_SINGULAR_GEN", - "SHP_INTSTEL_LOG", + "DEF_GARRISON_4", "SPY_CLOAK_1", "SHP_ADV_DAM_CONT", "SPY_DETECT_3", @@ -284,18 +285,16 @@ "CON_ART_PLANET", "PRO_INDUSTRY_CENTER_III", "CON_FRC_ENRG_STRC", - "DEF_PLAN_BARRIER_SHLD", "PRO_NEUTRONIUM_EXTRACTION", "LRN_STELLAR_TOMOGRAPHY", "LRN_ENCLAVE_VOID", "CON_NDIM_STRC", "CON_ORBITAL_HAB", "LRN_DISTRIB_THOUGHT", - "SHP_WEAPON_9", - "SHP_WEAPON_10", "GRO_ENERGY_META", "LRN_ENCLAVE_VOID", "SHP_WEAPON_13", + "DEF_PLAN_BARRIER_SHLD", "SPY_DETECT_4", "SHP_WEAPON_11", "SHP_WEAPON_12", |
From: <ewi...@us...> - 2012-12-10 06:12:00
|
Revision: 5534 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5534&view=rev Author: ewillgohs Date: 2012-12-10 06:11:53 +0000 (Mon, 10 Dec 2012) Log Message: ----------- A few more changes to AI military planning Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/AIFleetOrder.py trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/MilitaryAI.py trunk/FreeOrion/default/AI/PriorityAI.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2012-12-09 06:42:10 UTC (rev 5533) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2012-12-10 06:11:53 UTC (rev 5534) @@ -31,8 +31,8 @@ universe = fo.getUniverse() fleetID = self.getAITargetID() fleet = universe.getFleet(fleetID) - targetsString = "fleet %4d (%14s) [ %10s mission ] : %3d ships , total Rating:%7d "%(fleetID, (fleet and fleet.name) or "Fleet Invalid", AIFleetMissionTypeNames.name(aiFleetMissionType) , - (fleet and len(fleet.shipIDs)) or 0, foAI.foAIstate.getRating(fleetID)) + targetsString = "fleet %4d (%14s) [ %10s mission ] : %3d ships , total Rating:%7d "%(fleetID, (fleet and fleet.name) or "Fleet Invalid", + AIFleetMissionTypeNames.name(aiFleetMissionType) , (fleet and len(fleet.shipIDs)) or 0, foAI.foAIstate.getRating(fleetID).get('overall', 0)) targets = self.getAITargets(aiFleetMissionType) for target in targets: targetsString = targetsString + str(target) @@ -176,7 +176,7 @@ [foAI.foAIstate.systemStatus.get(neighbor, {}) for neighbor in [ nid for nid in foAI.foAIstate.systemStatus.get(systemID, {}).get('neighbors', []) if nid != mMT0ID ] ] ] ) fBRating = foAI.foAIstate.getRating(fid) - if needLeft < fBRating: + if (needLeft < fBRating.get('overall', 0)) and fBRating.get('nships', 0)>1 : doMerge=True if doMerge: #print "preparing to merge fleet %d into fleet %d, leaving at least %d rating behind"%(fid, fleetID, needLeft) Modified: trunk/FreeOrion/default/AI/AIFleetOrder.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetOrder.py 2012-12-09 06:42:10 UTC (rev 5533) +++ trunk/FreeOrion/default/AI/AIFleetOrder.py 2012-12-10 06:11:53 UTC (rev 5534) @@ -279,7 +279,7 @@ sys1Name = (sys1 and sys1.name) or "unknown" targ1 = universe.getSystem(targetID) targ1Name = (targ1 and targ1.name) or "unknown" - fleetRating = foAI.foAIstate.getRating(fleetID) + fleetRating = foAI.foAIstate.getRating(fleetID).get('overall', 0) threat = foAI.foAIstate.systemStatus.get(targetID, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(targetID, {}).get('planetThreat', 0) safetyFactor = 1.0 @@ -288,7 +288,9 @@ else: #following line was poor because AIstate.militaryFleetIDs only covers fleets without current missions #myOtherFleetsRating = sum([foAI.foAIstate.fleetStatus.get(fleetID, {}).get('rating', 0) for fleetID in foAI.foAIstate.militaryFleetIDs if ( foAI.foAIstate.fleetStatus.get(fleetID, {}).get('sysID', -1) == thisSystemID ) ]) - myOtherFleetsRating = sum([foAI.foAIstate.fleetStatus.get(fid, {}).get('rating', 0) for fid in foAI.foAIstate.systemStatus.get( targetID, {}).get('myfleets', []) ]) + myOtherFleetsRatings = [foAI.foAIstate.fleetStatus.get(fid, {}).get('rating', {}) for fid in foAI.foAIstate.systemStatus.get( targetID, {}).get('myfleets', []) ] + #myOtherFleetsRating = sum([foAI.foAIstate.fleetStatus.get(fid, {}).get('rating', 0) for fid in foAI.foAIstate.systemStatus.get( targetID, {}).get('myfleets', []) ]) + myOtherFleetsRating = foAI.foAIstate.systemStatus.get( targetID, {}).get('myFleetRating', 0) if (myOtherFleetsRating > safetyFactor* threat) or (myOtherFleetsRating + fleetRating > 1.5*safetyFactor*threat): if verbose: print "\tAdvancing fleet %d (rating %d) at system %d (%s) into system %d (%s) with threat %d because of sufficient empire fleet strength already at desination"%(fleetID, fleetRating, systemID, sys1Name, targetID, targ1Name, threat) Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2012-12-09 06:42:10 UTC (rev 5533) +++ trunk/FreeOrion/default/AI/AIstate.py 2012-12-10 06:11:53 UTC (rev 5534) @@ -211,22 +211,28 @@ #assess enemy fleets that may have been momentarily visible enemyFleetIDs = [] enemiesBySystem = {} + myFleetsBySystem={}#not really used currently sawEnemiesAtSystem={} currentTurn = fo.currentTurn() for fleetID in universe.fleetIDs: - if ( fleetID in self.fleetStatus ): # only looking for enemies here - continue + #if ( fleetID in self.fleetStatus ): # only looking for enemies here + # continue fleet = universe.getFleet(fleetID) if (fleet == None): continue - if (not fleet.ownedBy(empireID)) and ( not(fleet.empty) ): - partialVisTurn = dictFromMap(universe.getVisibilityTurnsMap(fleetID, empireID)).get(fo.visibility.partial, -9999) - if partialVisTurn >= currentTurn -1 : #only interested in immediately recent data - sawEnemiesAtSystem[fleet.systemID] = True - if (fleetID not in destroyedObjIDs): - enemyFleetIDs.append( fleetID ) - enemiesBySystem.setdefault( fleet.systemID, [] ).append( fleetID ) + if not(fleet.empty) : + if fleet.ownedBy(empireID): + if fleet.systemID != -1: + myFleetsBySystem.setdefault( fleet.systemID, [] ).append( fleetID )#currently, not used, info gotten through system.fleetIDs + else: + partialVisTurn = dictFromMap(universe.getVisibilityTurnsMap(fleetID, empireID)).get(fo.visibility.partial, -9999) + if partialVisTurn >= currentTurn -1 : #only interested in immediately recent data + sawEnemiesAtSystem[fleet.systemID] = True + if (fleetID not in destroyedObjIDs): + enemyFleetIDs.append( fleetID ) + thisSysID = (fleet.systemID!= -1 and fleet.systemID) or fleet.nextSystemID + enemiesBySystem.setdefault( thisSysID, [] ).append( fleetID ) - #assess fleet and planet threats + #assess fleet and planet threats & my local fleets for sysID in sysIDList: sysStatus = self.systemStatus.setdefault(sysID, {}) sysStatus['myfleets']=[] @@ -239,7 +245,7 @@ self.deleteFleetInfo(fid)#this is safe even if fleet wasn't mine continue fleet = universe.getFleet(fid) - if not fleet: + if not fleet or fleet.empty: self.deleteFleetInfo(fid)#this is safe even if fleet wasn't mine continue if fleet.ownedBy(empire.empireID): @@ -259,8 +265,12 @@ print (" Assessing threats on turn %d ; noting that fleets were just lost in system %d , enemy fleets were %s seen as of turn %d, of which %s survived and %s were"+ " just briefly glimpsed")%( currentTurn, sysID, ["not", ""][sawEnemiesAtSystem.get(sysID, False)], partialVisTurn, localEnemyFleetIDs, glimpsedEnemies) if partialVisTurn >= currentTurn -1: - enemyRating = sum( [self.rateFleet(fid) for fid in localEnemyFleetIDs ] )#TODO: check for monsters - monsterRating = sum( [self.rateFleet(fid) for fid in localEnemyFleetIDs ] )#TODO: check for monsters + #enemyRating = sum( [self.rateFleet(fid) for fid in localEnemyFleetIDs ] ) + #monsterRating = sum( [self.rateFleet(fid) for fid in localEnemyFleetIDs ] ) + enemyRatings = [self.rateFleet(fid) for fid in localEnemyFleetIDs ] + monsterRatings = [self.rateFleet(fid) for fid in localEnemyFleetIDs ] + enemyRating = sum( [rating.get('attack', 0) for rating in enemyRatings]) * sum( [rating.get('health', 0) for rating in enemyRatings]) + monsterRating = sum( [rating.get('attack', 0) for rating in enemyRatings]) * sum( [rating.get('health', 0) for rating in enemyRatings]) if (not system) or not (universe.getVisibility(sysID, self.empireID) >= fo.visibility.partial):#TODO split off treatment of no system from not visible print "Can't see into system %d ( %s ) -- basing threat assessment on old info and lost ships"%(sysID, sysStatus.get('name', "name unknown")) sysStatus['planetThreat'] = int( sysStatus.get('planetThreat', 0) ) # if no current info, leave as previous, or 0 if no previous rating @@ -274,15 +284,16 @@ else: #system considered visible #TODO: reevaluate as visibility rules change threat=0 monsterThreat=0 - sawContents= len( list(system.allObjectIDs)) > 0 + #sawContents= len( list(system.allObjectIDs)) > 0 + sawContents=True for fleetID in system.fleetIDs: sawContents=True #apparently can be logged as visisble for rest of turn even if can no longer get sys contents fleet = universe.getFleet(fleetID) if ( fleet) and (not fleet.ownedBy(self.empireID)): if fleet.hasMonsters: - monsterThreat += self.rateFleet(fleetID)# + monsterThreat += self.rateFleet(fleetID).get('overall',0)# else: - threat += self.rateFleet(fleetID)#currently treating all unowned fleets as hostile + threat += self.rateFleet(fleetID).get('overall',0)#currently treating all unowned fleets as hostile if sawContents: sysStatus['fleetThreat'] = max( int( threat )+int(monsterThreat), 1.05*sum(fleetsLostBySystem.get(sysID, []) )) #fleetThreat always includes monster threat, and may not have seen stealthed enemies sysStatus['monsterThreat']=int(monsterThreat) @@ -303,11 +314,19 @@ print "Error: couldn't read meters for threat assessment of visible planet %d : %s"%(planetID, planet.name) print "Error: exception triggered and caught: ", traceback.format_exc() sysStatus['planetThreat'] = int( threat ) - self.systemStatus[sysID] = sysStatus + #self.systemStatus[sysID] = sysStatus #no longer necessary because using setdefault - #assess secondary threats (one half of threats of surrounding systems + #assess secondary threats (one half of threats of surrounding systems and update my fleet rating for sysID in sysIDList: sysStatus = self.systemStatus[sysID] + myattack, myhealth=0, 0 + for fid in sysStatus['myfleets']: + thisRating=self.getRating(fid) + myattack += thisRating['attack'] + myhealth += thisRating['health'] + if sysID != -1: + sysStatus['myFleetRating'] = myattack * myhealth + system = universe.getSystem(sysID) neighborDict = dictFromMap( universe.getSystemNeighborsMap(sysID, self.empireID) ) neighbors = neighborDict.keys() @@ -428,6 +447,9 @@ if not fleet: return 0 rating=0 + attack=0 + health=0 + nships=0 for shipID in fleet.shipIDs: #could approximate by design, but checking meters has better current accuracy ship = universe.getShip(shipID) @@ -435,11 +457,14 @@ continue stats = self.getDesignIDStats(ship.designID) rating += stats['attack'] * ( stats['structure'] + stats['shields'] ) - return rating + attack += stats['attack'] + health += ( stats['structure'] + stats['shields'] ) + nships+=1 + return {'overall':attack*health, 'tally':rating, 'attack':attack, 'health':health, 'nships':nships} def getRating(self, fleetID): if fleetID in self.fleetStatus: - return self.fleetStatus[fleetID].get('rating', 0) + return self.fleetStatus[fleetID].get('rating', {}) else: fleet = fo.getUniverse().getFleet(fleetID) if not fleet: return 0 @@ -517,8 +542,11 @@ role=FleetUtilsAI.assessFleetRole(fleetID) self.__fleetRoleByID[fleetID] = role makeAggressive=False - if role in [AIFleetMissionType.FLEET_MISSION_COLONISATION, AIFleetMissionType.FLEET_MISSION_OUTPOST, AIFleetMissionType.FLEET_MISSION_EXPLORATION]: - if self.getRating(fleetID) >= 2.0 * ProductionAI.curBestMilShipRating(): + if role in [AIFleetMissionType.FLEET_MISSION_COLONISATION, AIFleetMissionType.FLEET_MISSION_OUTPOST]: + pass + if role in [AIFleetMissionType.FLEET_MISSION_EXPLORATION]: + thisRating=self.getRating(fleetID) + if float(thisRating.get('overall', 0))/thisRating.get('nships', 1) >= 0.5 * ProductionAI.curBestMilShipRating(): makeAggressive=True else: makeAggressive=True @@ -582,7 +610,7 @@ print "-----------" for fleetID in fleetList: status=self.fleetStatus.get(fleetID, {} ) - rating = status.get('rating', -1) + rating = status.get('rating', {}) newRating = self.rateFleet(fleetID) oldSysID = status.get('sysID', -2) fleet = universe.getFleet(fleetID) @@ -595,7 +623,7 @@ if (fleetID not in okFleets):# or fleet.empty: if not ( (self.__fleetRoleByID.get(fleetID, -1) ==-1) ): if not justResumed: - fleetsLostBySystem[sysID] = fleetsLostBySystem.get(sysID, []) + [max(rating, MinThreat)] + fleetsLostBySystem.setdefault(sysID, []).append( max(rating.get('overall', 0), MinThreat) ) sys=universe.getSystem(sysID) sysName=(sys and sys.name) or "unknown" print "Fleet %d with role %s was used up, lost or destroyed at sys (%d) %s"%(fleetID, self.__fleetRoleByID[fleetID], sysID, sysName) #perhaps diff message for successful colony fleets @@ -606,12 +634,12 @@ if fleetID in self.fleetStatus: del self.fleetStatus[fleetID] continue - else: + else:#fleet not in ok fleets sys1 = universe.getSystem(sysID) sys1Name = (sys1 and sys1.name ) or "unknown" sys2 = universe.getSystem(fleet.nextSystemID) sys2Name = (sys2 and sys2.name ) or "unknown" - print "Fleet %d (%s) oldRating: %6d | newRating %6d | at system %d (%s) | next system %d (%s)"%(fleetID, fleet.name, rating, newRating, + print "Fleet %d (%s) oldRating: %6d | newRating %6d | at system %d (%s) | next system %d (%s)"%(fleetID, fleet.name, rating.get('overall', 0), newRating.get('overall', 0), fleet.systemID, sys1Name, fleet.nextSystemID, sys2Name) status['rating'] = newRating if sysID !=-1: @@ -629,9 +657,9 @@ status['sysID'] = mMT0.getTargetID() #hmm, but might still be a fair ways from here #status['sysID'] = (fleet.systemID != -1 and fleet.systemID ) or fleet.nextSystemID #universe should still give fleet & fleet.systemID even if just destroyed self.fleetStatus[fleetID] = status - if sysID != -1: - self.systemStatus.setdefault(sysID, {}).setdefault('myFleetRating', 0) - self.systemStatus[sysID]['myFleetRating'] += newRating #TODO: should probably do this up at updateSystemStatus + #if sysID != -1: + # self.systemStatus.setdefault(sysID, {}).setdefault('myFleetRating', 0) + # self.systemStatus[sysID]['myFleetRating'] += newRating #moved to updateSystemStatus def getExplorableSystems(self, explorableSystemsType): "get all explorable systems determined by type " Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2012-12-09 06:42:10 UTC (rev 5533) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2012-12-10 06:11:53 UTC (rev 5534) @@ -87,7 +87,10 @@ fleetList.append(fleetID) #del fleetPool[ fleetPool.index( fleetID) ] fleetPoolSet.remove( fleetID) - curStats['rating'] = curStats.get('rating', 0) + foAI.foAIstate.getRating(fleetID) + thisRating=foAI.foAIstate.getRating(fleetID) + curStats['attack'] = curStats.get('attack', 0) + thisRating['attack'] + curStats['health'] = curStats.get('health', 0) + thisRating['health'] + curStats['rating'] = curStats['attack'] * curStats['health'] if 'troopPods' in targetStats: curStats['troopPods'] = curStats.get('troopPods', 0) + countPartsFleetwide(fleetID, ["GT_TROOP_POD"]) if ( sum( [len(universe.getFleet(fID).shipIDs) for fID in fleetList] ) >= nships ) and statsMeetReqs(curStats, targetStats) : @@ -142,21 +145,29 @@ if not fleetA: return 0 success = True - remainingRating = foAI.foAIstate.getRating(fleetA_ID) + initRating = foAI.foAIstate.getRating(fleetA_ID) + remainingRating = initRating.copy() transferredRating = 0 + transferredAttack=0 + transferredHealth=0 for shipID in fleetA.shipIDs: thisShip=universe.getShip(shipID) if not thisShip: continue stats = foAI.foAIstate.getDesignIDStats(thisShip.designID) thisRating = stats['attack'] * ( stats['structure'] + stats['shields'] ) - if remainingRating - thisRating < leaveRating: + if (remainingRating['attack'] -stats['attack'])*(remainingRating['health'] -( stats['structure'] + stats['shields'] )) < leaveRating: continue - transferredRating += thisRating - remainingRating -= thisRating + #remainingRating -= thisRating + remainingRating['attack'] -= stats['attack'] + remainingRating['health'] -= ( stats['structure'] + stats['shields'] ) thisSuccess = ( fo.issueFleetTransferOrder(shipID, fleetB_ID) )#returns a zero if transfer failure + if thisSuccess: + transferredRating += thisRating + transferredAttack += stats['attack'] + transferredHealth += ( stats['structure'] + stats['shields'] ) print "\t\t\t\t *** attempting transfer of ship %4d, formerly of fleet %4d, into fleet %4d with result %d; %s"%(shipID, fleetA_ID, fleetB_ID, thisSuccess, [" context is %s"%context, ""][context==""]) success = success and thisSuccess - if needRating !=0 and needRating <= transferredRating: + if needRating !=0 and needRating <= transferredAttack*transferredHealth: #transferredRating: break fleetA = universe.getFleet(fleetA_ID) if (not fleetA) or fleetA.empty or fleetA_ID in universe.destroyedObjectIDs(fo.empireID()): @@ -164,12 +175,12 @@ foAI.foAIstate.deleteFleetInfo(fleetA_ID) else: newARating = foAI.foAIstate.updateFleetRating(fleetA_ID) - if success and ( newARating==remainingRating) : - print "\t\t\t\t\t\t\%d rating from fleet %d successfully transferred to fleet %d, leaving %d"%(transferredRating, fleetA_ID, fleetB_ID, remainingRating) + if success : #and ( newARating==remainingRating) : + print "\t\t\t\t\t\t\%d rating from fleet %d successfully transferred to fleet %d, leaving %d"%(transferredAttack*transferredHealth, fleetA_ID, fleetB_ID, newRating['overal']) else: - print "\t\t\t\t\t\t transfer of %d rating from fleet %d to fleet %d was attempted but appears to have had problems, leaving %d"%(transferredRating, fleetA_ID, fleetB_ID, newARating) + print "\t\t\t\t\t\t transfer of %d rating from fleet %d to fleet %d was attempted but appears to have had problems, leaving %d"%(transferredAttack*transferredHealth, fleetA_ID, fleetB_ID, newARating['overall']) foAI.foAIstate.updateFleetRating(fleetB_ID) - return transferredRating + return transferredAttack*transferredHealth, transferredAttack, transferredHealth def fleetHasShipWithRole(fleetID, shipRole): "returns True if a ship with shipRole is in the fleet" @@ -276,7 +287,7 @@ else: selectedRole= AIShipRoleType.SHIP_ROLE_INVALID print "fleetID %d : primary fleet mission type %d: '%s' ; found ship roles %s : %s ; rating %d"%(fleetID,selectedRole, __AIFleetMissionTypeNames.name(selectedRole), - shipRoles, [ "%s: %d "%(__AIShipRoleTypeNames.name(rtype), rnum) for rtype, rnum in shipRoles.items()] , foAI.foAIstate.getRating(fleetID)) + shipRoles, [ "%s: %d "%(__AIShipRoleTypeNames.name(rtype), rnum) for rtype, rnum in shipRoles.items()] , foAI.foAIstate.getRating(fleetID).get('overall', 0)) return selectedRole def assessShipDesignRole(design): Modified: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py 2012-12-09 06:42:10 UTC (rev 5533) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2012-12-10 06:11:53 UTC (rev 5534) @@ -28,14 +28,14 @@ homeSystemID=-1 allMilitaryFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY ) - totMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x), allMilitaryFleetIDs ) ) + totMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x).get('overall', 0), allMilitaryFleetIDs ) ) print "==================================================" print "Total Military Rating: %d"%totMilRating print "---------------------------------" milFleetIDs = list( FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allMilitaryFleetIDs)) - availMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x), milFleetIDs ) ) + availMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x).get('overall', 0), milFleetIDs ) ) print "==================================================" print "Available Military Rating: %d"%availMilRating print "---------------------------------" @@ -60,7 +60,7 @@ if not sysTargets: #shouldn't really be possible continue lastSys = sysTargets[-1].getTargetID() # will count this fleet as assigned to last system in target list - alreadyAssignedRating[lastSys] += foAI.foAIstate.getRating(fleetID) + alreadyAssignedRating[lastSys] += foAI.foAIstate.getRating(fleetID).get('overall', 0) #TODO: would preferably tally attack and health and take product # get systems to defend capitalID = PlanetUtilsAI.getCapital() @@ -505,8 +505,8 @@ availMilFleetIDs = list( AIstate.militaryFleetIDs ) #availMilFleetIDs = list( allMilitaryFleetIDs) - totMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x), allMilitaryFleetIDs ) ) - availMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x), availMilFleetIDs ) ) + totMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x).get('overall', 0), allMilitaryFleetIDs ) ) + availMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x).get('overall', 0), availMilFleetIDs ) ) print "==================================================" print "assigning military fleets" print "---------------------------------" @@ -527,7 +527,9 @@ continue else: theseFleets = foundFleets - rating = sum( map(lambda x: foAI.foAIstate.rateFleet(x), foundFleets ) ) + #rating = sum( map(lambda x: foAI.foAIstate.rateFleet(x), foundFleets ) ) + ratings = map(lambda x: foAI.foAIstate.rateFleet(x), foundFleets ) + rating = sum([fr.get('attack', 0) for fr in ratings]) * sum([fr.get('health', 0) for fr in ratings]) if rating < minMilAllocations.get(sysID, 0): print "PARTIAL military allocation for system %d ( %s ) -- requested allocation %8d -- got %8d with fleets %s"%(sysID, universe.getSystem(sysID).name, minalloc, rating, theseFleets) else: Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2012-12-09 06:42:10 UTC (rev 5533) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2012-12-10 06:11:53 UTC (rev 5534) @@ -258,7 +258,7 @@ totalThreat += max(0, (sysStatus.get('fleetThreat', 0) + sysStatus.get('planetThreat', 0) - 0.7*sysStatus.get('monsterThreat', 0) + sysStatus.get('neighborThreat', 0) )) #being safe; should never be neg since fleetThreat should include monsterThreat totalFleetRating = 0 for fleetStatus in foAI.foAIstate.fleetStatus.values(): - totalFleetRating += fleetStatus.get('rating', 0) + totalFleetRating += fleetStatus.get('rating', {}).get('overall', 0) #numMilitaryTargetedSystemIDs = len(AIstate.militaryTargetedSystemIDs) |
From: <ewi...@us...> - 2012-12-31 08:26:27
|
Revision: 5592 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5592&view=rev Author: ewillgohs Date: 2012-12-31 08:26:14 +0000 (Mon, 31 Dec 2012) Log Message: ----------- AI update, at least mostly catching up with recent changes to tech & hulls Modified Paths: -------------- trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2012-12-30 04:37:41 UTC (rev 5591) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2012-12-31 08:26:14 UTC (rev 5592) @@ -179,8 +179,8 @@ explorationShip = {"SD_SCOUT":"A", "Scout":"B", "Tracker":"C"} colonyShip = {"SD_COLONY_SHIP":"A", "Seeder":"B", "Nest-Maker":"C", "Den-Maker":"D"} outpostShip = {"SD_OUTPOST_SHIP":"A", "Outposter":"B"} - troopShip = {"SD_TROOP_SHIP":"A", "Basic-Troopers":"B", "Heavy-Troopers":"C"} - attackShip= {"SD_MARK":"A", "Lynx":"B","Griffon":"C", "Wyvern":"D", "Manticore":"E"} + troopShip = {"SD_TROOP_SHIP":"A", "Basic-Troopers":"B", "Medium-Troopers":"C", "Heavy-Troopers":"D", "Very-Heavy-Troopers":"D"} + attackShip= {"SD_MARK":"A", "Lynx":"B","Griffon":"C", "Wyvern":"D", "Manticore":"E", "Reaver":"F"} class AIShipRoleType(object): #this is also used in determining fleetRoles SHIP_ROLE_INVALID = -1 Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2012-12-30 04:37:41 UTC (rev 5591) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2012-12-31 08:26:14 UTC (rev 5592) @@ -220,7 +220,7 @@ 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 + 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)]) @@ -228,7 +228,7 @@ #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 = 20+ 200*max(0, troopShipsNeeded ) + invasionPriority = 10+ 200*max(0, troopShipsNeeded ) # print "" # print "Number of Troop Ships Without Missions: " + str(numTroopShips) @@ -286,7 +286,7 @@ # build one more military ship than military targeted systems #militaryPriority = 100 * ((numMilitaryTargetedSystemIDs +2) - numMilitaryShips) / (numMilitaryTargetedSystemIDs + 1) militaryPriority = int( 40 + max(0, 15*((1.25*totalThreat +threatBias - totalFleetRating ) / curShipRating)) ) - print "Military Priority Calc: int( 30 + max(0, 10*((1.25*totalThreat(%d) - totalFleetRating(%d) ) / curShipRating(%d) )) ) = %d"%(totalThreat, totalFleetRating, curShipRating, militaryPriority) + print "Military Priority Calc: int( 40 + max(0, 10*((1.25*totalThreat(%d) - totalFleetRating(%d) ) / curShipRating(%d) )) ) = %d"%(totalThreat, totalFleetRating, curShipRating, militaryPriority) # print "" # print "Number of Military Ships Without Missions: " + str(numMilitaryShips) # print "Number of Military Targeted Systems: " + str(numMilitaryTargetedSystemIDs) Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2012-12-30 04:37:41 UTC (rev 5591) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2012-12-31 08:26:14 UTC (rev 5592) @@ -15,6 +15,12 @@ shipTypeMap = dict( zip( [AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION, AIPriorityType.PRIORITY_PRODUCTION_OUTPOST, AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, AIPriorityType.PRIORITY_PRODUCTION_INVASION, AIPriorityType.PRIORITY_PRODUCTION_MILITARY], [AIShipDesignTypes.explorationShip, AIShipDesignTypes.outpostShip, AIShipDesignTypes.colonyShip, AIShipDesignTypes.troopShip, AIShipDesignTypes.attackShip ] ) ) +#TODO: dynamic lookup of hull stats +hullStats = { + + } + + def curBestMilShipRating(): bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_MILITARY) if bestDesign is None: @@ -47,6 +53,59 @@ print "added Troopship %s, with result %d"%(designNameBases[2] , res) except: print "Error: exception triggered and caught: ", traceback.format_exc() + + + newTroopDesigns = [] + desc = "Troop Ship" + model = "fighter" + tp = "GT_TROOP_POD" + nb, hull = designNameBases[1]+"%1d", "SH_BASIC_MEDIUM" + newTroopDesigns += [ (nb%(1), desc, hull, 3*[tp], "", model) ] + nb, hull = designNameBases[1]+"%1d", "SH_ORGANIC" + newTroopDesigns += [ (nb%(2), desc, hull, ["SR_WEAPON_2"]+ 3*[tp], "", model) ] + newTroopDesigns += [ (nb%(3), desc, hull, ["SR_WEAPON_5"]+ 3*[tp], "", model) ] + nb, hull = designNameBases[1]+"%1d", "SH_STATIC_MULTICELLULAR" + newTroopDesigns += [ (nb%(4), desc, hull, ["SR_WEAPON_2"]+ 4*[tp], "", model) ] + newTroopDesigns += [ (nb%(5), desc, hull, ["SR_WEAPON_5"]+ 4*[tp], "", model) ] + + ar1 = "AR_LEAD_PLATE" + ar2= "AR_ZORTRIUM_PLATE" + ar3= "AR_NEUTRONIUM_PLATE" + arL=[ar1, ar2, ar3] + + for ari in [0, 1, 2]: + nb, hull = designNameBases[ari+2]+"%1d-%1d", "SH_ORGANIC" + newTroopDesigns += [ (nb%(2, ari+1), desc, hull, ["SR_WEAPON_2", arL[ari], tp, tp], "", model) ] + newTroopDesigns += [ (nb%(3, ari+1), desc, hull, ["SR_WEAPON_5", arL[ari], tp, tp], "", model) ] + nb, hull = designNameBases[ari+2]+"%1d-%1d", "SH_STATIC_MULTICELLULAR" + newTroopDesigns += [ (nb%(4, ari+1), desc, hull, ["SR_WEAPON_2", arL[ari], tp, tp, tp], "", model) ] + newTroopDesigns += [ (nb%(5, ari+1), desc, hull, ["SR_WEAPON_5", arL[ari], tp, tp, tp], "", model) ] + nb, hull = designNameBases[ari+2]+"%1d-%1d", "SH_ENDOMORPHIC" + newTroopDesigns += [ (nb%(6, ari+1), desc, hull, ["SR_WEAPON_5", arL[ari], tp, tp, tp, tp], "", model) ] + newTroopDesigns += [ (nb%(7, ari+1), desc, hull, ["SR_WEAPON_8", arL[ari], tp, tp, tp, tp], "", model) ] + + currentTurn=fo.currentTurn() + needsAdding=[] + namesToAdd=[] + for name, desc, hull, partslist, icon, model in newTroopDesigns: + if name not in troopShipNames: + needsAdding.append( ( name, desc, hull, partslist, icon, model) ) + namesToAdd.append( name ) + + if needsAdding != []: + print "--------------" + print "Current Troop Designs: %s"%troopShipNames + print "-----------" + print "Troop design names apparently needing to be added: %s"%namesToAdd + print "-------" + if currentTurn ==1: #due to some apparent problem with these repeatedly being added, only do it on first turn + for name, desc, hull, partslist, icon, model in needsAdding: + try: + res=fo.issueCreateShipDesignOrder( name, desc, hull, partslist, icon, model, False) + print "added Troop Design %s, with result %d"%(name, res) + except: + print "Error: exception triggered and caught adding troop %s: "%name, traceback.format_exc() + bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_INVASION) if bestDesign: print "Best Troopship buildable is %s"%bestDesign.name(False) @@ -66,14 +125,14 @@ desc = "Scout" model = "fighter" srb = "SR_WEAPON_%1d" - nb, hull = designNameBases[1]+"%1d-%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[1]+"%1d-%1d", "SH_ORGANIC" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" for id in [1, 2, 3, 4]: - newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, srb%iw, is1, is1], "", model) for iw in range(1, 9) ] - nb = designNameBases[2]+"%1d_%1d" + newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, srb%iw, is1], "", model) for iw in range(1, 9) ] + nb, hull = designNameBases[2]+"%1d-%1d", "SH_ENDOMORPHIC" for id in [1, 2, 3, 4]: - newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, srb%iw, is1, is2], "", model) for iw in range(1, 9) ] + newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(1, 9) ] currentTurn=fo.currentTurn() needsAdding=[] @@ -121,55 +180,45 @@ nb, hull = designNameBases[1]+"-%1d", "SH_BASIC_MEDIUM" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, ""], "", model) for iw in range(1, 9) ] - nb, hull = designNameBases[2]+"-1-%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[2]+"-1-%1d", "SH_ORGANIC" is1, is2 = "FU_BASIC_TANK", "FU_BASIC_TANK" - newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(2, 5) ] - nb= designNameBases[2]+"-2-%1d" + newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1], "", model) for iw in range(2, 9) ] + nb, hull = designNameBases[2]+"-2-%1d", "SH_STATIC_MULTICELLULAR" is2 = "SH_DEFLECTOR" -# newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(7, 9) ] + newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(7, 9) ] - #nb, hull = designNameBases[3]+"-%1d", "SH_ENDOMORPHIC" - nb, hull = designNameBases[3]+"-%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[3]+"-%1d", "SH_ENDOMORPHIC" is1 = "FU_BASIC_TANK" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] + 2*[ is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + 2*[ is1], "", model) for iw in [5, 6, 7, 8 ] ] nb = designNameBases[3]+"-2-%1d" is3 = "SH_DEFLECTOR" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] + [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is3, is3], "", model) for iw in [7, 8, 9, 10, 11, 12 ] ] nb = designNameBases[3]+"3-%1d" ar1 = "AR_LEAD_PLATE" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] + #newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] nb = designNameBases[3]+"-4-%1d" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12 ] ] + #newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12 ] ] nb = designNameBases[4]+"-5-%1d" ar2= "AR_ZORTRIUM_PLATE" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar2] + [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + 2*[ is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] nb = designNameBases[4]+"-6-%1d" ar3= "AR_NEUTRONIUM_PLATE" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw] +[ar3]+ [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] +[ar3]+ 2*[ is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] nb = designNameBases[4]+"-7-%1d" is3= "SH_MULTISPEC" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] + [ is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is3, is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] nb = designNameBases[4]+"-8-%1d" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar2] + [ is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + [ is3, is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] nb = designNameBases[4]+"-9-%1d" - #intentionally skipping 9 due to jump in expense - newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar3] + [ is3, is3], "", model) for iw in [7, 8, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar3] + [ is3, is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] currentTurn=fo.currentTurn() needsAdding=[] @@ -213,12 +262,12 @@ desc = "Outpost Ship" srb = "SR_WEAPON_%1d" model = "seed" - nb, hull = designNameBases[1]+"%1d_%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[1]+"%1d_%1d", "SH_ORGANIC" op = "CO_OUTPOST_POD" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" - for id in [1, 2, 3, 4]: - newOutpostDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", op, is1], "", model) for iw in range(2, 9) ] + for id in [1, 2]: + newOutpostDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", op], "", model) for iw in [2, 4, 6, 8] ] currentTurn=fo.currentTurn() needsAdding=[] @@ -261,19 +310,19 @@ desc = "Colony Ship" model = "seed" srb = "SR_WEAPON_%1d" - nb, hull = designNameBases[1]+"%1d_%1d", "SH_STATIC_MULTICELLULAR" + nb, hull = designNameBases[1]+"%1d_%1d", "SH_ORGANIC" cp = "CO_COLONY_POD" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" for id in [1, 2, 3, 4]: - newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp, is1], "", model) for iw in range(2, 6) ] - for id in [1, 2, 3, 4]: - newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp, cp], "", model) for iw in range(6, 9) ] # when farther along, use 2 pods + newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp], "", model) for iw in range(2, 6) ] +# for id in [1, 2, 3, 4]: +# newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp], "", model) for iw in range(6, 9) ] # when farther along, use 2 pods - nb = designNameBases[2]+"%1d_%1d" + nb, hull = designNameBases[2]+"%1d_%1d", "SH_ENDOMORPHIC" cp = "CO_SUSPEND_ANIM_POD" for id in [1, 2, 3, 4]: - newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp, is1], "", model) for iw in range(2, 9) ] + newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", "", cp, is1], "", model) for iw in range(2, 9) ] currentTurn=fo.currentTurn() needsAdding=[] @@ -307,17 +356,23 @@ def getBestShipInfo(priority): "returns designID, design, buildLocList" empire = fo.getEmpire() + empireID = empire.empireID + capitolID = PlanetUtilsAI.getCapital() + planetIDs = [capitolID] + list(AIstate.popCtrIDs) #TODO: restrict to planets with shipyards theseDesignIDs = [] designNameBases= shipTypeMap.get(priority, ["nomatch"]) for baseName in designNameBases: - theseDesignIDs.extend( [(designNameBases[baseName]+fo.getShipDesign(shipDesign).name(False) , shipDesign ) for shipDesign in empire.availableShipDesigns if baseName in fo.getShipDesign(shipDesign).name(False) and getAvailableBuildLocations(shipDesign) != [] ] ) + theseDesignIDs.extend( [(designNameBases[baseName]+fo.getShipDesign(shipDesign).name(False) , shipDesign ) for shipDesign in empire.availableShipDesigns if baseName in fo.getShipDesign(shipDesign).name(False) ] ) if theseDesignIDs == []: return None, None, None #must be missing a Shipyard (or checking for outpost ship but missing tech) #ships = [ ( fo.getShipDesign(shipDesign).name(False), shipDesign) for shipDesign in theseDesignIDs ] - bestShip = sorted( theseDesignIDs)[-1][-1] - buildChoices = getAvailableBuildLocations(bestShip) - bestDesign= fo.getShipDesign(bestShip) - return bestShip, bestDesign, buildChoices + + for _ , shipDesignID in sorted( theseDesignIDs, reverse=True): + shipDesign = fo.getShipDesign(shipDesignID) + for pid in planetIDs: + if shipDesign.productionLocationForEmpire(empireID, pid): + return shipDesignID, shipDesign, getAvailableBuildLocations(shipDesignID) + return None, None, None #must be missing a Shipyard or other orbital (or missing tech) def generateProductionOrders(): "generate production orders" @@ -378,7 +433,8 @@ if capitolQueuedBldgs == []: print "None" print queuedBldgNames=[ bldg.name for bldg in capitolQueuedBldgs ] - + + if ("BLD_INDUSTRY_CENTER" in possibleBuildingTypes) and ("BLD_INDUSTRY_CENTER" not in (capitalBldgs+queuedBldgNames)): res=fo.issueEnqueueBuildingProductionOrder("BLD_INDUSTRY_CENTER", empire.capitalID) print "Enqueueing BLD_INDUSTRY_CENTER, with result %d"%res @@ -391,12 +447,15 @@ print "Error: cant build shipyard at new capital, probably no population; we're hosed" print "Error: exception triggered and caught: ", traceback.format_exc() - if ("BLD_SHIPYARD_ORG_ORB_INC" in possibleBuildingTypes) and ("BLD_SHIPYARD_ORG_ORB_INC" not in (capitalBldgs+queuedBldgNames)): - try: - res=fo.issueEnqueueBuildingProductionOrder("BLD_SHIPYARD_ORG_ORB_INC", empire.capitalID) - print "Enqueueing BLD_SHIPYARD_ORG_ORB_INC, with result %d"%res - except: - print "Error: exception triggered and caught: ", traceback.format_exc() + for bldName in [ "BLD_SHIPYARD_ORG_ORB_INC", "BLD_SHIPYARD_ORG_XENO_FAC", "BLD_SHIPYARD_ORG_CELL_GRO_CHAMB" ]: + if (bldName in possibleBuildingTypes) and (bldName not in (capitalBldgs+queuedBldgNames)): + try: + res=fo.issueEnqueueBuildingProductionOrder(bldName, empire.capitalID) + print "Enqueueing %s at capitol, with result %d"%(bldName, res) + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) + except: + print "Error: exception triggered and caught: ", traceback.format_exc() if ("BLD_EXOBOT_SHIP" in possibleBuildingTypes) and ("BLD_EXOBOT_SHIP" not in capitalBldgs+queuedBldgNames): if len( empireColonizers.get("SP_EXOBOT", []))==0 : #don't have an exobot shipyard yet @@ -406,6 +465,13 @@ except: print "Error: exception triggered and caught: ", traceback.format_exc() + if ("BLD_IMPERIAL_PALACE" in possibleBuildingTypes) and ("BLD_IMPERIAL_PALACE" not in (capitalBldgs+queuedBldgNames)): + res=fo.issueEnqueueBuildingProductionOrder("BLD_INDUSTRY_CENTER", empire.capitalID) + print "Enqueueing BLD_IMPERIAL_PALACE, with result %d"%res + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing BLD_IMPERIAL_PALACE to front of build queue, with result %d"%res + + #TODO: add totalPP checks below, so don't overload queue queuedShipyardLocs = [element.locationID for element in productionQueue if (element.name=="BLD_SHIPYARD_BASE") ] @@ -429,15 +495,21 @@ colonySystems.setdefault(planet.systemID, {}).setdefault('pids', []).append(pid) colonyPlanets[pid]=planet.systemID - bldName = "BLD_SHIPYARD_ORG_ORB_INC" - if empire.buildingTypeAvailable(bldName): - queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] - bldType = fo.getBuildingType(bldName) - for pid in AIstate.popCtrIDs: - if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building - res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) - if res: queuedBldLocs.append(pid) - print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) + popCtrs = list(AIstate.popCtrIDs) + for bldName in [ "BLD_SHIPYARD_ORG_ORB_INC" , "BLD_SHIPYARD_ORG_XENO_FAC" ]: + if empire.buildingTypeAvailable(bldName): + queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] + bldType = fo.getBuildingType(bldName) + for pid in popCtrs: + if len(queuedBldLocs)>1: #build a max of 2 at once + break + if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building + res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) + if res: + queuedBldLocs.append(pid) + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) bldName = "BLD_GAS_GIANT_GEN" if empire.buildingTypeAvailable(bldName): @@ -604,9 +676,22 @@ if res: break #only initiate max of one new build per turn -#TODO:more advanced shipyards? + bldName = "BLD_CONC_CAMP" + if empire.buildingTypeAvailable(bldName): + queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] + bldType = fo.getBuildingType(bldName) + for pid in AIstate.popCtrIDs: + if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building + planet=universe.getPlanet(pid) + cPop = planet.currentMeterValue(fo.meterType.population) + tPop = planet.currentMeterValue(fo.meterType.targetPopulation) + if (tPop >= 32) and (cPop >=0.9*tPop): + if planet.focus in [ AIFocusType.FOCUS_INDUSTRY, AIFocusType.FOCUS_MINING ]: + fo.issueChangeFocusOrder(pid, AIFocusType.FOCUS_RESEARCH) + res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + if res: queuedBldLocs.append(pid) + print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) - totalPPSpent = fo.getEmpire().productionQueue.totalSpent print " Total Production Points Spent: " + str(totalPPSpent) @@ -649,7 +734,7 @@ # get the highest production priorities productionPriorities = {} for priorityType in getAIPriorityProductionTypes(): - productionPriorities[priorityType] = foAI.foAIstate.getPriority(priorityType) + productionPriorities[priorityType] = int(max(1, ( foAI.foAIstate.getPriority(priorityType) )**0.5)) sortedPriorities = productionPriorities.items() sortedPriorities.sort(lambda x,y: cmp(x[1], y[1]), reverse=True) @@ -674,7 +759,7 @@ numOutpostTargs=len(foAI.foAIstate.colonisableOutpostIDs ) numOutpostFleets=len( FleetUtilsAI.getEmpireFleetIDsByRole( AIFleetMissionType.FLEET_MISSION_OUTPOST) )# counting existing outpost fleets each as one ship totOutpostFleets = queuedOutpostShips + numOutpostFleets - maxColonyFleets = min( numColonyTargs+1+fo.currentTurn()/10 , numTotalFleets/4 ) + maxColonyFleets = max( min( numColonyTargs+1+fo.currentTurn()/10 , numTotalFleets/4 ), 1+int(2*len(empireColonizers))) maxOutpostFleets = min(numOutpostTargs+1+fo.currentTurn()/10, numTotalFleets/4 ) print "Production Queue Priorities:" @@ -777,18 +862,17 @@ def getAvailableBuildLocations(shipDesignID): "returns locations where shipDesign can be built" - result = [] - - systemIDs = foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED) - planetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(systemIDs) + #systemIDs = foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED) + #planetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(systemIDs) shipDesign = fo.getShipDesign(shipDesignID) empire = fo.getEmpire() empireID = empire.empireID + capitolID = PlanetUtilsAI.getCapital() + planetIDs = set([capitolID] + list(AIstate.popCtrIDs)) #TODO: restrict to planets with shipyards for planetID in planetIDs: if shipDesign.productionLocationForEmpire(empireID, planetID): result.append(planetID) - return result def spentPP(): Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2012-12-30 04:37:41 UTC (rev 5591) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2012-12-31 08:26:14 UTC (rev 5592) @@ -16,7 +16,8 @@ empire = fo.getEmpire() empireID = empire.empireID print "Research Queue Management:" - print "\nTotal Current Research Points: %.2f\n"%empire.resourceProduction(fo.resourceType.research) + tRP = empire.resourceProduction(fo.resourceType.research) + print "\nTotal Current Research Points: %.2f\n"%tRP print "Techs researched and available for use:" completedTechs = sorted(list(getCompletedTechs())) tlist = completedTechs+3*[" "] @@ -25,6 +26,18 @@ print "%25s %25s %25s"%tline print"" + if tRP >= 20: + researchQueueList = getResearchQueueTechs() + if (empire.getTechStatus("LRN_PSIONICS") != fo.techStatus.complete) and ( "LRN_PSIONICS" not in researchQueueList[:5] ) : + for specName in ColonisationAI.empireSpecies: + thisSpec=fo.getSpecies(specName) + if thisSpec: + if "TELEPATHIC" in list(thisSpec.tags): + res=fo.issueEnqueueTechOrder("LRN_DISTRIB_THOUGHT", 0) + res=fo.issueEnqueueTechOrder("LRN_PSIONICS", 0) + break + + gotSymBio = empire.getTechStatus("GRO_SYMBIOTIC_BIO") == fo.techStatus.complete gotXenoGen = empire.getTechStatus("GRO_XENO_GENETICS") == fo.techStatus.complete #assess if our empire has any non-lousy colonizers, & boost gro_xeno_gen if we don't Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2012-12-30 04:37:41 UTC (rev 5591) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2012-12-31 08:26:14 UTC (rev 5592) @@ -7,6 +7,10 @@ gasOrbitalTechName = "PRO_ORBITAL_GEN" solarOrbitalTechName = "PRO_SOL_ORB_GEN" +SupplyTechs=[ "CON_ORBITAL_CON" , "CON_CONTGRAV_ARCH", "CON_GAL_INFRA", "CON_ARCH_MONOFILS"] + +cCamps=["CON_METRO_INFRA", "CON_ARCH_PSYCH", "CON_CONC_CAMP"] + def unusableTechsList(): "techs currently unusable by the AI" @@ -220,23 +224,27 @@ primaryMetaTechs = [ "SHP_WEAPON_2", "GRO_PLANET_ECOL", - "GRO_GENETIC_ENG", "GRO_SUBTER_HAB", "SHP_DOMESTIC_MONSTER", "SHP_ORG_HULL", + "GRO_GENETIC_ENG", "LRN_ALGO_ELEGANCE", - "SHP_MULTICELL_CAST", "CON_ENV_ENCAPSUL", "DEF_GARRISON_1", + "SHP_MULTICELL_CAST", "SHP_WEAPON_5", "GRO_SYMBIOTIC_BIO", "PRO_ROBOTIC_PROD", "PRO_INDUSTRY_CENTER_I", "PRO_FUSION_GEN", - "DEF_DEFENSE_NET", + "DEF_DEFENSE_NET_1", "DEF_GARRISON_2", + "GRO_LIFECYCLE_MAN", "SHP_WEAPON_6", "GRO_XENO_GENETICS", + "SHP_ENDOCRINE_SYSTEMS", + "SHP_CONT_SYMB", + "DEF_GARRISON_3", "PRO_INDUSTRY_CENTER_II", "PRO_ORBITAL_GEN", "LRN_ARTIF_MINDS", @@ -244,61 +252,74 @@ "CON_ORBITAL_CON", "SPY_DETECT_2", "GRO_XENO_HYBRIDS", - "GRO_LIFECYCLE_MAN", - "SHP_ENDOCRINE_SYSTEMS", "SHP_WEAPON_7", + "DEF_DEFENSE_NET_2", + "DEF_PLAN_BARRIER_SHLD_1", + "LRN_PHYS_BRAIN", + "LRN_TRANSLING_THT", "PRO_MICROGRAV_MAN", + "SHP_ENDOSYMB_HULL", "SHP_ASTEROID_HULLS", "SHP_WEAPON_8", - "DEF_GARRISON_3", "GRO_TERRAFORM", "PRO_SOL_ORB_GEN", - "LRN_PHYS_BRAIN", - "LRN_TRANSLING_THT", "GRO_GENETIC_MED", + "LRN_GRAVITONICS", "SHP_LEAD_PLATE", + "SHP_MONOCELL_EXP", "GRO_CYBORG", "PRO_SENTIENT_AUTOMATION", "PRO_EXOBOTS", + "DEF_DEFENSE_NET_REGEN_1", + "DEF_PLAN_BARRIER_SHLD_2", + "DEF_DEFENSE_NET_3", + "SHP_BIOADAPTIVE_SPEC", "SHP_WEAPON_9", - "LRN_QUANT_NET", + "DEF_SYST_DEF_MINE_1", + "DEF_PLAN_BARRIER_SHLD_3", + "LRN_QUANT_NET", "CON_FRC_ENRG_CAMO", - "LRN_GRAVITONICS", - "DEF_SYST_DEF_MINE", "SHP_INTSTEL_LOG", - "SHP_REINFORCED_HULL", + "SHP_REINFORCED_HULL", "SHP_WEAPON_10", + "SHP_CONT_BIOADAPT", + "SHP_SENT_HULL", "SHP_ZORTRIUM_PLATE", + "DEF_SYST_DEF_MINE_2", "LRN_XENOARCH", "CON_METRO_INFRA", "CON_SUBTER_CONST", "GRO_GENOME_BANK", "SHP_BASIC_DAM_CONT", - "DEF_HI_ENRG_FOCUS", + "CON_ARCH_PSYCH", + "CON_CONC_CAMP", "PRO_SINGULAR_GEN", + "SHP_ADV_DAM_CONT", + "PRO_INDUSTRY_CENTER_III", "DEF_GARRISON_4", "SPY_CLOAK_1", - "SHP_ADV_DAM_CONT", "SPY_DETECT_3", + "DEF_DEFENSE_NET_REGEN_2", "GRO_GAIA_TRANS", "GRO_ENERGY_META", "CON_ART_PLANET", - "PRO_INDUSTRY_CENTER_III", "CON_FRC_ENRG_STRC", "PRO_NEUTRONIUM_EXTRACTION", "LRN_STELLAR_TOMOGRAPHY", "LRN_ENCLAVE_VOID", "CON_NDIM_STRC", "CON_ORBITAL_HAB", + "LRN_PSIONICS", "LRN_DISTRIB_THOUGHT", "GRO_ENERGY_META", - "LRN_ENCLAVE_VOID", + "DEF_SYST_DEF_MINE_3", + "DEF_PLAN_BARRIER_SHLD_4", "SHP_WEAPON_13", - "DEF_PLAN_BARRIER_SHLD", "SPY_DETECT_4", "SHP_WEAPON_11", "SHP_WEAPON_12", "SHP_TITAN_HULL" + "DEF_PLAN_BARRIER_SHLD_5", "SHP_SOLAR_CONT", "SHP_WEAPON_14", "SHP_WEAPON_15", |
From: <dil...@us...> - 2013-01-04 04:45:47
|
Revision: 5612 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5612&view=rev Author: dilvish-fo Date: 2013-01-04 04:45:38 +0000 (Fri, 04 Jan 2013) Log Message: ----------- AI updatae for aggression levels & a bit of other minor changes Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/AIFleetOrder.py trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/ExplorationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/MilitaryAI.py trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/ResourcesAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -123,37 +123,27 @@ sysName = (sys1 and sys1.name) or "unknown" mMT0=mainMissionTargets[0] mMT0ID = mMT0.getTargetID() - #targetID = self.getTargetAITarget().getTargetID() - #print "\tMain-Mission type %s -- primary target : %s"%( AIFleetMissionTypeNames.name(mainMissionType), mMT0) for fid in otherFleetsHere: fleetRoleA = foAI.foAIstate.getFleetRole(fid) if fleetRoleA != AIFleetMissionType.FLEET_MISSION_MILITARY: #TODO: if fleetRoles such as LongRange start being used, adjust this continue # will only considering subsuming fleets that have a military type role fleet2 = universe.getFleet(fid) if not (fleet2 and (fleet2.systemID == systemID)): - #print "\t\t considering merging fleet (id %d ) into fleet (id %4d) but the former no longer exists or not actually in system %4d %s although AI records thought it should be"%(fid, fleetID, systemID, sysName) continue if not fleet2.ownedBy(foAI.foAIstate.empireID): - #print "\t\t considered merging fleet (id %d ) into fleet (id %d ), but former not owned by this empire"%(fid, fleetID) continue f2Mission=foAI.foAIstate.getAIFleetMission(fid) doMerge=False needLeft=0 if not f2Mission: - #continue #no, let's take this fleet over doMerge=True else: f2MType = (f2Mission.getAIMissionTypes()+[-1])[0] - #print "\t\t fleet2 (id %d) has mission type %s "%(fid, AIFleetMissionTypeNames.name(f2MType)) f2Targets = f2Mission.getAITargets(f2MType) if len(f2Targets)>1: - #print "\t\t\t considered merging fleet (id %d ) into fleet (id %d ) but former has multiple targets: %s"%(fid, fleetID, str(f2Targets)) pass elif len(f2Targets)==0: - #print "\t\t\t *****" - print "\t\t\t ** Considering merging fleetA (id: %4d) into fleetB (id %d ) and former has no targets, will take it. FleetA mission was %s "%(fid, fleetID, f2Mission) - #print "\t\t\t ** FleetA has ship ids %s"%list(fleet2.shipIDs) - #print "\t\t\t *****" + #print "\t\t\t ** Considering merging fleetA (id: %4d) into fleetB (id %d ) and former has no targets, will take it. FleetA mission was %s "%(fid, fleetID, f2Mission) doMerge=True else: targetB = f2Targets[0].getTargetID() @@ -179,7 +169,6 @@ if (needLeft < fBRating.get('overall', 0)) and fBRating.get('nships', 0)>1 : doMerge=True if doMerge: - #print "preparing to merge fleet %d into fleet %d, leaving at least %d rating behind"%(fid, fleetID, needLeft) FleetUtilsAI.mergeFleetAintoB(fid, fleetID, needLeft, context="Order %s of mission %s"%(context, str(self))) return Modified: trunk/FreeOrion/default/AI/AIFleetOrder.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetOrder.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/AIFleetOrder.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -66,9 +66,6 @@ ship = universe.getShip(self.getSourceAITarget().getTargetID()) if ship.canColonize: sourceAITargetTypeValid = True - else: - print "Fleet outpost order fails due to ship %d faile ship.canColonize"%ship.id - print "from source target %s and targetTarget %s"%(self.__sourceAITarget , self.__targetAITarget) # with fleet elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -49,7 +49,7 @@ # def colonisablePlanets (should be set at start of turn) # getColonisablePlanets (deepcopy!) - def __init__(self): + def __init__(self, aggression=2): "constructor" # 'global' (?) variables self.foodStockpileSize = 1 # food stored per population @@ -67,12 +67,7 @@ self.outpostFleetIDs = [] self.invasionFleetIDs = [] self.militaryFleetIDs = [] - self.untaskedFleets=[] - self.__missionsByType = {} - for missionType in EnumsAI.getAIFleetMissionTypes(): - self.__missionsByType[missionType] = {} - self.__aiMissionsByFleetID = {} self.__shipRoleByDesignID = {} @@ -102,10 +97,10 @@ self.systemStatus={} #keys: 'fleetThreat'. 'planetThreat', 'monsterThreat', 'myfleets', 'neighbors', 'name' self.needsEmergencyExploration=[] self.newlySplitFleets={} + self.aggression=aggression def __del__(self): "destructor" - del self.__missionsByType del self.__shipRoleByDesignID del self.__fleetRoleByID del self.__priorityByType Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -496,11 +496,14 @@ "removes all planets with a colonisation value < minimalColoniseValue" removeIDs = [] + minVal = AIstate.minimalColoniseValue + if foAI.foAIstate.aggression <2: + minVal *= 3 # print ":: min:" + str(AIstate.minimalColoniseValue) for planetID in evaluatedPlanets.iterkeys(): #print ":: eval:" + str(planetID) + " val:" + str(evaluatedPlanets[planetID]) - if (evaluatedPlanets[planetID][0] < AIstate.minimalColoniseValue): + if (evaluatedPlanets[planetID][0] < minVal): removeIDs.append(planetID) #print "removing ", removeIDs for ID in removeIDs: del evaluatedPlanets[ID] Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -180,7 +180,7 @@ colonyShip = {"SD_COLONY_SHIP":"A", "Seeder":"B", "Nest-Maker":"C", "Den-Maker":"D"} outpostShip = {"SD_OUTPOST_SHIP":"A", "Outposter":"B"} troopShip = {"SD_TROOP_SHIP":"A", "Basic-Troopers":"B", "Medium-Troopers":"C", "Heavy-Troopers":"D", "Very-Heavy-Troopers":"D"} - attackShip= {"SD_MARK":"A", "Lynx":"B","Griffon":"C", "Wyvern":"D", "Manticore":"E", "Reaver":"F"} + attackShip= {"SD_MARK":"A", "Lynx":"B","Griffon":"C", "Wyvern":"D", "Manticore":"E", "Devil":"F", "Reaver":"G"} class AIShipRoleType(object): #this is also used in determining fleetRoles SHIP_ROLE_INVALID = -1 Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -73,7 +73,7 @@ sentList=[] while (len(availableScouts) > 0 ) and ( len(needsCoverage) >0): thisSysID = needsCoverage.pop(0) - if (foAI.foAIstate.systemStatus.setdefault(thisSysID, {}).setdefault('monsterThreat', 0) > 2000) or (fo.currentTurn() <20 and foAI.foAIstate.systemStatus[thisSysID]['monsterThreat'] > 200): + if (foAI.foAIstate.systemStatus.setdefault(thisSysID, {}).setdefault('monsterThreat', 0) > 2000*(1+foAI.foAIstate.aggression) ) or (fo.currentTurn() <20 and foAI.foAIstate.systemStatus[thisSysID]['monsterThreat'] > 200): print "Skipping exploration of system %d due to Big Monster, threat %d"%(thisSysID, foAI.foAIstate.systemStatus[thisSysID]['monsterThreat']) continue foundFleets=[] Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -56,10 +56,6 @@ return [] thisSystemID = systemsToCheck.pop(0) #take the head of the line systemsChecked.append(thisSystemID) - #thisSys = universe.getSystem(thisSystemID) - #if not thisSys: - # return getFleetsForMission(nships.... - #fleetsHere = [fleetID for fleetID in fleetPoolSet if ( foAI.foAIstate.fleetStatus.get(fleetID, {}).get('sysID', -1) == thisSystemID ) ] fleetsHere = [ fid for fid in foAI.foAIstate.systemStatus.get(thisSystemID, {}).get('myfleets', []) if fid in fleetPoolSet] if verbose: print "found fleetPool Fleets %s"%fleetsHere @@ -67,7 +63,6 @@ fleetID=fleetsHere.pop(0) fleet = universe.getFleet(fleetID) if not fleet: - #del fleetPool[ fleetPool.index( fleetID) ] fleetPoolSet.remove( fleetID) continue if len (list(fleet.shipIDs)) > 1: @@ -85,7 +80,6 @@ break if meetsSpeciesReq: fleetList.append(fleetID) - #del fleetPool[ fleetPool.index( fleetID) ] fleetPoolSet.remove( fleetID) thisRating=foAI.foAIstate.getRating(fleetID) curStats['attack'] = curStats.get('attack', 0) + thisRating['attack'] @@ -309,7 +303,6 @@ return AIShipRoleType.SHIP_ROLE_MILITARY else: return AIShipRoleType.SHIP_ROLE_CIVILIAN_EXPLORATION #let this be the default since even without detection part a ship has some inherent - #return AIShipRoleType.SHIP_ROLE_INVALID def assessDesignIDStats(designID): design = fo.getShipDesign(designID) Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -35,13 +35,13 @@ # called when a new game is started (but not when a game is loaded). should clear any pre-existing state # and set up whatever is needed for AI to generate orders -def startNewGame(): +def startNewGame(aggression=4): global __timerFile, lastTurnTimestamp, __timerBucketFile - print "New game started" + print "New game started, AI Agression level %d"%aggression # initialize AIstate global foAIstate - foAIstate = AIstate.AIstate() + foAIstate = AIstate.AIstate(aggression=aggression) foAIstate.sessionStartCleanup() print "Initialized foAIstate class" if __timerFile: @@ -139,7 +139,7 @@ except: print "failed to parse saved state string" #assigning new state - foAIstate = AIstate.AIstate() + foAIstate = AIstate.AIstate(aggression=4) foAIstate.sessionStartCleanup() print "Error: exception triggered and caught: ", traceback.format_exc() if __timerFile: @@ -208,6 +208,7 @@ # at end of this function, fo.doneTurn() should be called to indicate to the client that orders are finished # and can be sent to the server for processing. def generateOrders(): + aggressions=["Turtle", "Cautious", "Typical", "Aggressive", "Maniacal"] global lastTurnTimestamp universe = fo.getUniverse() turnStartTime=time() #starting AI timer here, to be sure AI doesn't get blame for any lags in server being able to provide the Universe object @@ -219,7 +220,7 @@ print "***************************************************************************" print "***************************************************************************" print ("Generating Orders") - print "EmpireID: " + str(empire.empireID) + " Name: " + empire.name + " Turn: " + str(fo.currentTurn()) + print "EmpireID: " + str(empire.empireID) + " Name: " + empire.name+ "_"+str(empire.empireID) +"_"+aggressions[foAIstate.aggression] + " Turn: " + str(fo.currentTurn()) empireColor=empire.colour print "EmpireColors: %d %d %d %d"%(empireColor.r, empireColor.g, empireColor.b, empireColor.a) if planet: Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -154,7 +154,7 @@ else: popVal = evaluatePlanet(planetID, AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], species, empire) #evaluatePlanet is implorted from ColonisationAI if planetID not in fleetSupplyablePlanetIDs: - popVal = 1.3*popVal#assign higher value if the colony would extend our supply range + popVal = 2.0*popVal#assign higher value if the colony would extend our supply range return popVal, troops Modified: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -13,7 +13,7 @@ minMilAllocations = {} totMilRating=0 -def getMilitaryFleets(): +def getMilitaryFleets(tryReset=True): "get armed military fleets" global MilitaryAllocations, totMilRating @@ -90,15 +90,27 @@ elif fo.currentTurn() < 60: threatBias = 80 elif fo.currentTurn() < 80: - threatBias = 100 - else: threatBias = 200 - + else: + threatBias = 400 + + + safetyFactor = [ 2.0, 1.25, 1.0, 0.95, 0.95 ][foAI.foAIstate.aggression] + # allocation format: ( sysID, newAllocation, takeAny, maxMultiplier ) #================================ #--------Capital Threat ---------- - capitalThreat = 2* threatBias +sum( [ foAI.foAIstate.systemStatus[capitalSysID][thrtKey] for thrtKey in [tkey for tkey in foAI.foAIstate.systemStatus.get(capitalSysID, {}).keys() if 'Threat' in tkey]] ) + capitalThreat = safetyFactor*(2* threatBias +sum( [ foAI.foAIstate.systemStatus[capitalSysID][thrtKey] for thrtKey in [tkey for tkey in foAI.foAIstate.systemStatus.get(capitalSysID, {}).keys() if 'Threat' in tkey]] )) newAlloc=0 + if (capitalThreat > (availMilRating+0.8*alreadyAssignedRating[capitalSysID]) ) and tryReset: + if foAI.foAIstate.aggression > 0: + for fid in allMilitaryFleetIDs: + thisMission=foAI.foAIstate.getAIFleetMission(fid) + thisMission.clearAIFleetOrders() + thisMission.clearAITargets(-1) + getMilitaryFleets(tryReset=False) + return + if capitalThreat > 0.8*alreadyAssignedRating[capitalSysID]: newAlloc = min(remainingMilRating, int( 0.999 + 1.2*(capitalThreat- 0.8*alreadyAssignedRating[capitalSysID]) ) ) allocations.append( ( capitalSysID, newAlloc, True, 3) ) @@ -113,7 +125,7 @@ print "Empire-Occupied Systems: %s"%( [ "| %d %s |"%(eoSysID, universe.getSystem(eoSysID).name) for eoSysID in empireOccupiedSystemIDs ] ) print "-----------------" if len( empireOccupiedSystemIDs ) > 0: - ocSysTotThreat = [ ( oSID, threatBias +sum( [ foAI.foAIstate.systemStatus.get(oSID, {}).get(thrtKey, 0) for thrtKey in ['fleetThreat', 'planetThreat', 'neighborThreat']] ) ) for oSID in empireOccupiedSystemIDs ] + ocSysTotThreat = [ ( oSID, threatBias +safetyFactor*sum( [ foAI.foAIstate.systemStatus.get(oSID, {}).get(thrtKey, 0) for thrtKey in ['fleetThreat', 'planetThreat', 'neighborThreat']] ) ) for oSID in empireOccupiedSystemIDs ] totocSysThreat = sum( [thrt for sid, thrt in ocSysTotThreat] ) totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in ocSysTotThreat] ) allocationFactor = min( 1.2, remainingMilRating /max(0.01, ( totocSysThreat -totCurAlloc) )) @@ -138,7 +150,7 @@ # for these, calc local threat only, no neighbor threat, but use a multiplier for fleet safety if len( otherTargetedSystemIDs ) > 0: otSysAlloc = 0 - otSysThreat = [ ( oSID, threatBias +foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0)+ foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) ) for oSID in otherTargetedSystemIDs ] + otSysThreat = [ ( oSID, threatBias +safetyFactor*(foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0)+ foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0)) ) for oSID in otherTargetedSystemIDs ] tototSysThreat = sum( [thrt for sid, thrt in otSysThreat] ) totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in otSysThreat] ) for sid, thrt in otSysThreat: @@ -160,7 +172,7 @@ # for these, calc local threat only, no neighbor threat, but use a multiplier for fleet safety if len( otherTargetedSystemIDs ) > 0: otSysAlloc = 0 - otSysThreat = [ ( oSID, threatBias +foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0)+ foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) ) for oSID in otherTargetedSystemIDs ] + otSysThreat = [ ( oSID, safetyFactor*(threatBias +foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0)+ foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) )) for oSID in otherTargetedSystemIDs ] tototSysThreat = sum( [thrt for sid, thrt in otSysThreat] ) totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in otSysThreat] ) for sid, thrt in otSysThreat: @@ -192,7 +204,7 @@ # for these, calc local threat only, no neighbor threat, but use a multiplier for fleet safety if len( otherTargetedSystemIDs ) > 0: otSysAlloc = 0 - otSysThreat = [ ( oSID, threatBias +foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0)+ foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) ) for oSID in otherTargetedSystemIDs ] + otSysThreat = [ ( oSID, threatBias +safetyFactor*(foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0)+ foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) )) for oSID in otherTargetedSystemIDs ] tototSysThreat = sum( [thrt for sid, thrt in otSysThreat] ) totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in otSysThreat] ) for sid, thrt in otSysThreat: @@ -218,7 +230,7 @@ # for these, calc fleet threat only, no neighbor threat, but use a multiplier for fleet safety if len(interiorTargets) >0: otSysAlloc = 0 - otSysThreat = [ ( oSID, threatBias +foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0) ) for oSID in interiorTargets ] + otSysThreat = [ ( oSID, threatBias +safetyFactor*foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0) ) for oSID in interiorTargets ] tototSysThreat = sum( [thrt for sid, thrt in otSysThreat] ) totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in otSysThreat] ) for sid, thrt in otSysThreat: @@ -247,7 +259,7 @@ # for these, calc fleet threat only, no neighbor threat, but use a multiplier for fleet safety if len(exploTargetIDs) > 0: otSysAlloc = 0 - otSysThreat = [ ( oSID, foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) ) for oSID in exploTargetIDs ] + otSysThreat = [ ( oSID, safetyFactor*(foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) )) for oSID in exploTargetIDs ] tototSysThreat = sum( [thrt for sid, thrt in otSysThreat] ) totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in otSysThreat] ) if availMilRating <1125: @@ -281,7 +293,7 @@ # for these, calc fleet threat only, no neighbor threat, but use a multiplier for fleet safety if len(borderTargets) > 0: otSysAlloc = 0 - otSysThreat = [ ( oSID, threatBias +foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) ) for oSID in borderTargets ] + otSysThreat = [ ( oSID, threatBias +safetyFactor*(foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0)) ) for oSID in borderTargets ] tototSysThreat = sum( [thrt for sid, thrt in otSysThreat] ) totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in otSysThreat] ) for sid, thrt in otSysThreat: @@ -311,7 +323,7 @@ # for these, calc fleet threat only, no neighbor threat, but use a multiplier for fleet safety if len(monsterDens) > 0: otSysAlloc = 0 - otSysThreat = [ ( oSID, foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) ) for oSID in monsterDens ] + otSysThreat = [ ( oSID, safetyFactor*(foAI.foAIstate.systemStatus.get(oSID, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(oSID, {}).get('planetThreat', 0) ) ) for oSID in monsterDens ] tototSysThreat = sum( [thrt for sid, thrt in otSysThreat] ) totCurAlloc = sum( [0.8*alreadyAssignedRating[sid] for sid, thrt in otSysThreat] ) for sid, thrt in otSysThreat: @@ -345,54 +357,6 @@ minMilAllocations = dict( [ (sid, alloc) for sid, alloc, takeAny, mm in allocations ] ) print "------------------------------\nFinal Military Allocations: %s \n-----------------------"%dict( [ (sid, alloc) for sid, alloc, minalloc, takeAny in newAllocations ] ) - if False: #keep old code for reference, for now - fleetSupplyableSystemIDs = list(empire.fleetSupplyableSystemIDs) - exploredSystemIDs = empire.exploredSystemIDs - - exploredPlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(exploredSystemIDs) - allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) - allPopulatedSystemIDs = PlanetUtilsAI.getAllPopulatedSystemIDs(allOwnedPlanetIDs) - print "" - print "All Populated SystemIDs: " + str(list(set(allPopulatedSystemIDs))) - - empireProvinceSystemIDs = list(set(empireOccupiedSystemIDs) - set([capitalSysID])) - print "Empire Province SystemIDs: " + str(empireProvinceSystemIDs) - - competitorSystemIDs = list(set(allPopulatedSystemIDs) - set(empireOccupiedSystemIDs)) - print "Competitor SystemIDs: " + str(competitorSystemIDs) - - - militaryTheaterSystemIDs = list(set(fleetSupplyableSystemIDs + empireOccupiedSystemIDs + competitorSystemIDs + otherTargetedSystemIDs)) - print "Military Theater SystemIDs: " + str(militaryTheaterSystemIDs) - - allMilitaryTargetedSystemIDs = getMilitaryTargetedSystemIDs(universe.systemIDs, AIFleetMissionType.FLEET_MISSION_MILITARY, empireID) - # export military targeted systems for other AI modules - AIstate.militaryTargetedSystemIDs = allMilitaryTargetedSystemIDs - print "" - print "Military Targeted SystemIDs: " + str(allMilitaryTargetedSystemIDs) - - militaryFleetIDs = allMilitaryFleetIDs - if not militaryFleetIDs: - print "Available Military Fleets: 0" - else: - print "Military FleetIDs: " + str(allMilitaryFleetIDs) - - numMilitaryFleets = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(militaryFleetIDs)) - print "Military Fleets Without Missions: " + str(numMilitaryFleets) - - evaluatedSystemIDs = list(set(militaryTheaterSystemIDs) - set(allMilitaryTargetedSystemIDs)) - # print "Evaluated SystemIDs: " +str(evaluatedSystemIDs) - - evaluatedSystems = assignMilitaryValues(evaluatedSystemIDs, AIFleetMissionType.FLEET_MISSION_MILITARY, empireProvinceSystemIDs, otherTargetedSystemIDs, empire) - - sortedSystems = evaluatedSystems.items() - sortedSystems.sort(lambda x, y: cmp(x[1], y[1]), reverse=True) - - print "" - print "Military SystemIDs:" - for evaluationPair in sortedSystems: - print " ID|Score: " + str(evaluationPair) - # export military systems for other AI modules AIstate.militarySystemIDs = [sid for sid, alloc, minalloc, takeAny in newAllocations] Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -120,9 +120,9 @@ if (fo.currentTurn() < 20) or not gotAlgo: researchPriority = 60 # mid industry , high research at beginning of game to get easy gro tech and to get research booster Algotrithmic Elegance elif fo.currentTurn() < 30: - researchPriority = 20 # mid industry , mid research + researchPriority = 30 # mid industry , mid research elif fo.currentTurn() < 40: - researchPriority = 15 # high industry , low research + researchPriority = 20 # high industry , low research else: researchPriority = 15 # high industry , low research Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -181,45 +181,72 @@ newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, ""], "", model) for iw in range(1, 9) ] nb, hull = designNameBases[2]+"-1-%1d", "SH_ORGANIC" - is1, is2 = "FU_BASIC_TANK", "FU_BASIC_TANK" + is1= "FU_BASIC_TANK" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1], "", model) for iw in range(2, 9) ] nb, hull = designNameBases[2]+"-2-%1d", "SH_STATIC_MULTICELLULAR" is2 = "SH_DEFLECTOR" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(7, 9) ] + if foAI.foAIstate.aggression ==0: + maxEM= 8 + elif foAI.foAIstate.aggression ==1: + maxEM= 12 + else: + maxEM= 10 + nb, hull = designNameBases[3]+"-%1d", "SH_ENDOMORPHIC" - is1 = "FU_BASIC_TANK" - newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + 2*[ is1], "", model) for iw in [5, 6, 7, 8 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + 2*[ is1], "", model) for iw in [5, 6, 7 ] ] nb = designNameBases[3]+"-2-%1d" - is3 = "SH_DEFLECTOR" - newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is3, is3], "", model) for iw in [7, 8, 9, 10, 11, 12 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is2, is2], "", model) for iw in range(6, maxEM+1) ] nb = designNameBases[3]+"3-%1d" ar1 = "AR_LEAD_PLATE" #newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is1], "", model) for iw in [5, 6, 7, 8, 10, 11, 12 ] ] nb = designNameBases[3]+"-4-%1d" - #newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is3], "", model) for iw in [7, 8, 10, 11, 12 ] ] + #newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is2], "", model) for iw in [7, 8, 10, 11, 12 ] ] nb = designNameBases[4]+"-5-%1d" ar2= "AR_ZORTRIUM_PLATE" - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + 2*[ is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + 2*[ is2], "", model) for iw in range(7, maxEM+1) ] nb = designNameBases[4]+"-6-%1d" ar3= "AR_NEUTRONIUM_PLATE" - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] +[ar3]+ 2*[ is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] - + if foAI.foAIstate.aggression ==0: + newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw] +[ar3, ar3]+ 2*[ is2], "", model) for iw in range(8, maxEM+1) ] + else: + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw] +[ar3]+ 2*[ is2], "", model) for iw in range(8, maxEM+1) ] + nb = designNameBases[4]+"-7-%1d" is3= "SH_MULTISPEC" - newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is3, is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + [ is3, is3], "", model) for iw in range(8, maxEM+1) ] nb = designNameBases[4]+"-8-%1d" - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + [ is3, is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + [ is3, is3], "", model) for iw in range(8, maxEM+1) ] nb = designNameBases[4]+"-9-%1d" - newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar3] + [ is3, is3], "", model) for iw in [7, 8, 9, 10, 11, 12, 14, 15, 16, 17 ] ] + newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar3] + [ is3, is3], "", model) for iw in range(8, maxEM+1) ] + if foAI.foAIstate.aggression >=2: + nb, hull = designNameBases[4]+"-%1d-%1d", "SH_ENDOSYMBIOTIC" + newMarkDesigns += [ (nb%(1, iw), desc, hull, 3*[srb%iw]+[ar2] + 3*[ is2], "", model) for iw in range(7, 12) ] + newMarkDesigns += [ (nb%(2, iw), desc, hull, 3*[srb%iw]+[ar3] + 3*[ is2], "", model) for iw in range(8, 12) ] + newMarkDesigns += [ (nb%(3, iw), desc, hull, 3*[srb%iw]+[ar2] + 3*[ is3], "", model) for iw in range(7, 12) ] + newMarkDesigns += [ (nb%(4, iw), desc, hull, 3*[srb%iw]+[ar3] + 3*[ is3], "", model) for iw in range(8, 12) ] + #bioadaptive + nb, hull = designNameBases[4]+"-%1d-%1d", "SH_BIOADAPTIVE" + newMarkDesigns += [ (nb%(5, iw), desc, hull, 3*[srb%iw] + 3*[ is2], "", model) for iw in range(9, 14) ] + newMarkDesigns += [ (nb%(6, iw), desc, hull, 2*[srb%iw]+[ar2] + 3*[ is2], "", model) for iw in range(9, 14) ] + newMarkDesigns += [ (nb%(7, iw), desc, hull, 3*[srb%iw] + 3*[ is3], "", model) for iw in range(9, 14) ] + newMarkDesigns += [ (nb%(8, iw), desc, hull, 2*[srb%iw]+[ar3] + 3*[ is3], "", model) for iw in range(9, 14) ] + if foAI.foAIstate.aggression >2: + nb, hull = designNameBases[5]+"-%1d-%1d", "SH_SENTIENT" + newMarkDesigns += [ (nb%(1, iw), desc, hull, 4*[srb%iw]+2*[ar2] + 3*[ is2], "", model) for iw in range(10, 17) ] + newMarkDesigns += [ (nb%(2, iw), desc, hull, 5*[srb%iw]+[ar3] + 3*[ is2], "", model) for iw in range(10, 17) ] + newMarkDesigns += [ (nb%(3, iw), desc, hull, 5*[srb%iw]+[ar2] + 3*[ is3], "", model) for iw in range(10, 17) ] + newMarkDesigns += [ (nb%(4, iw), desc, hull, 5*[srb%iw]+[ar3] + 3*[ is3], "", model) for iw in range(10, 17) ] + currentTurn=fo.currentTurn() needsAdding=[] namesToAdd=[] @@ -287,9 +314,9 @@ for name, desc, hull, partslist, icon, model in needsAdding: try: res=fo.issueCreateShipDesignOrder( name, desc, hull, partslist, icon, model, False) - print "added Mark Design %s, with result %d"%(name, res) + print "added Outposter Design %s, with result %d"%(name, res) except: - print "Error: exception triggered and caught adding outpost %s: "%name, traceback.format_exc() + print "Error: exception triggered and caught adding outposter %s: "%name, traceback.format_exc() bestShip, bestDesign, buildChoices = getBestShipInfo( AIPriorityType.PRIORITY_PRODUCTION_OUTPOST) if bestDesign: @@ -457,7 +484,7 @@ except: print "Error: exception triggered and caught: ", traceback.format_exc() - if ("BLD_EXOBOT_SHIP" in possibleBuildingTypes) and ("BLD_EXOBOT_SHIP" not in capitalBldgs+queuedBldgNames): + if ("BLD_EXOBOT_SHIP" in possibleBuildingTypes) and ("BLD_EXOBOT_SHIP" not in queuedBldgNames): if len( empireColonizers.get("SP_EXOBOT", []))==0 : #don't have an exobot shipyard yet try: res=fo.issueEnqueueBuildingProductionOrder("BLD_EXOBOT_SHIP", empire.capitalID) @@ -677,7 +704,7 @@ break #only initiate max of one new build per turn bldName = "BLD_CONC_CAMP" - if empire.buildingTypeAvailable(bldName): + if foAI.foAIstate.aggression>2 and empire.buildingTypeAvailable(bldName): queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] bldType = fo.getBuildingType(bldName) for pid in AIstate.popCtrIDs: Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -26,7 +26,7 @@ print "%25s %25s %25s"%tline print"" - if tRP >= 20: + if tRP >= 20 and foAI.foAIstate.aggression > 1: researchQueueList = getResearchQueueTechs() if (empire.getTechStatus("LRN_PSIONICS") != fo.techStatus.complete) and ( "LRN_PSIONICS" not in researchQueueList[:5] ) : for specName in ColonisationAI.empireSpecies: @@ -41,7 +41,7 @@ gotSymBio = empire.getTechStatus("GRO_SYMBIOTIC_BIO") == fo.techStatus.complete gotXenoGen = empire.getTechStatus("GRO_XENO_GENETICS") == fo.techStatus.complete #assess if our empire has any non-lousy colonizers, & boost gro_xeno_gen if we don't - if gotSymBio and (not gotXenoGen): + if gotSymBio and (not gotXenoGen) and foAI.foAIstate.aggression!=0: mostAdequate=0 for specName in ColonisationAI.empireColonizers: environs={} Modified: trunk/FreeOrion/default/AI/ResourcesAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResourcesAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/ResourcesAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -3,7 +3,7 @@ import AIstate from EnumsAI import AIPriorityType, getAIPriorityResourceTypes, AIFocusType import PlanetUtilsAI -from random import shuffle +from random import shuffle, random from time import time AIPriorityTypeNames=AIPriorityType() @@ -304,6 +304,18 @@ resourceTimerFile.flush() +def tallyStream(curVal, targetVal, nTurns, force=False): + tally=0 + if curVal <= targetVal: + delta = [1, 3][force] + mycomp=min + else: + delta = [-1, -5][force] + mycomp=max + for turn in range(nTurns): + tally += mycomp(targetVal, curVal+turn*delta) + return tally + def setPlanetResourceFoci(): "set resource focus of planets except capitalID, asteroids, and gas giants" global __timerFile @@ -313,112 +325,123 @@ universe = fo.getUniverse() empire = fo.getEmpire() empireID = empire.empireID - timer= [ time() ] # getPlanets - empirePlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) - timer.append( time() ) #filter - timer.append( time() ) #Priority - #TODO: take into acct splintering of resource groups - #fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs - #fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) - ppPrio = foAI.foAIstate.getPriority(AIPriorityType.PRIORITY_RESOURCE_PRODUCTION) - rpPrio = foAI.foAIstate.getPriority(AIPriorityType.PRIORITY_RESOURCE_RESEARCH) - priorityRatio = float(rpPrio)/(ppPrio+0.0001) - timer.append( time() ) # shuffle - # not supporting Growth for general planets until also adding code to make sure would actually benefit - #shuffle(generalPlanetIDs) - timer.append( time() ) # targets - pp, rp = getResourceTargetTotals() - planets = map(universe.getPlanet, empirePlanetIDs) - planetMap = dict( zip( empirePlanetIDs, planets)) - print "\n-----------------------------------------" - print "Making Planet Focus Change Determinations\n" - - ratios = [] - #for each planet, calculate RP:PP value ratio at which industry/Mining focus and research focus would have the same total value, & sort by that - # include a bias to slightly discourage changing foci - curTargetPP = 0 - curTargetRP = 0 - newFoci = {} - timer.append( time() ) #loop - for pid in newTargets: - II, IR = newTargets[pid][IFocus] - RI, RR = newTargets[pid][RFocus] - if currentFocus[pid] == MFocus: - II = max( II, newTargets[pid][MFocus][0] ) - curTargetPP += II #icurTargets initially calculated by Industry focus, which will be our default focus - curTargetRP += IR - newFoci[pid] = IFocus - if currentFocus[pid] in [ IFocus, MFocus] : - II += min( 2, II /4.0 ) - elif currentFocus[pid] == RFocus: - RR += min( 2, RR/4.0 ) - #calculate factor F at which II + F * RI == RI + F * RR =====> F = ( II-RI ) / (RR-IR) - thisFactor = ( II-RI ) / max( 0.01, RR-IR) # don't let denominator be zero for planets where focus doesn't change RP - ratios.append( (thisFactor, pid ) ) + currentTurn = fo.currentTurn() + freq = (1.0 + currentTurn/4.0)**(1.0/3) + if random() > 1.0/freq: + timer = 6*[time()] + else: + timer= [ time() ] # getPlanets + empirePlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) + timer.append( time() ) #filter + timer.append( time() ) #Priority + #TODO: take into acct splintering of resource groups + #fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs + #fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) + ppPrio = foAI.foAIstate.getPriority(AIPriorityType.PRIORITY_RESOURCE_PRODUCTION) + rpPrio = foAI.foAIstate.getPriority(AIPriorityType.PRIORITY_RESOURCE_RESEARCH) + priorityRatio = float(rpPrio)/(ppPrio+0.0001) + timer.append( time() ) # shuffle + # not supporting Growth for general planets until also adding code to make sure would actually benefit + #shuffle(generalPlanetIDs) + timer.append( time() ) # targets + pp, rp = getResourceTargetTotals() + planets = map(universe.getPlanet, empirePlanetIDs) + planetMap = dict( zip( empirePlanetIDs, planets)) + print "\n-----------------------------------------" + print "Making Planet Focus Change Determinations\n" - ctPP0 = curTargetPP - ctRP0 = curTargetRP - ratios.sort() - printedHeader=False - fociMap={IFocus:"Industry", RFocus:"Research", MFocus:"Mining", GFocus:"Growth"} - gotAlgo = empire.getTechStatus("LRN_ALGO_ELEGANCE") == fo.techStatus.complete - for ratio, pid in ratios: - if priorityRatio < ( curTargetRP/ (curTargetPP + 0.0001)) : #we have enough RP - if ratio < 1.1: #but wait, RP is still super cheap relative to PP, maybe will take more RP - if priorityRatio < 1.5* ( curTargetRP/ (curTargetPP + 0.0001)) : #yeah, really a glut of RP, stop taking RP + ratios = [] + #for each planet, calculate RP:PP value ratio at which industry/Mining focus and research focus would have the same total value, & sort by that + # include a bias to slightly discourage changing foci + curTargetPP = 0 + curTargetRP = 0 + newFoci = {} + timer.append( time() ) #loop + hasForce = empire.getTechStatus("CON_FRC_ENRG_STRC") == fo.techStatus.complete + for pid in newTargets: + II, IR = newTargets[pid][IFocus] + RI, RR = newTargets[pid][RFocus] + if currentFocus[pid] == MFocus: + II = max( II, newTargets[pid][MFocus][0] ) + curTargetPP += II #icurTargets initially calculated by Industry focus, which will be our default focus + curTargetRP += IR + newFoci[pid] = IFocus + if foAI.foAIstate.aggression < 4: + if currentFocus[pid] in [ IFocus, MFocus] : + II += min( 2, II /4.0 ) + elif currentFocus[pid] == RFocus: + RR += min( 2, RR/4.0 ) + #calculate factor F at which II + F * RI == RI + F * RR =====> F = ( II-RI ) / (RR-IR) + thisFactor = ( II-RI ) / max( 0.01, RR-IR) # don't let denominator be zero for planets where focus doesn't change RP + if foAI.foAIstate.aggression >3: + if currentOutput[pid][ IFocus] > II +RI - RR: + thisFactor = min(thisFactor, 1.0 + thisFactor/10.0 ) + ratios.append( (thisFactor, pid ) ) + + ctPP0 = curTargetPP + ctRP0 = curTargetRP + ratios.sort() + printedHeader=False + fociMap={IFocus:"Industry", RFocus:"Research", MFocus:"Mining", GFocus:"Growth"} + gotAlgo = empire.getTechStatus("LRN_ALGO_ELEGANCE") == fo.techStatus.complete + for ratio, pid in ratios: + if priorityRatio < ( curTargetRP/ (curTargetPP + 0.0001)) : #we have enough RP + if ratio < 1.1 and foAI.foAIstate.aggression >1 : #but wait, RP is still super cheap relative to PP, maybe will take more RP + if priorityRatio < 1.5* ( curTargetRP/ (curTargetPP + 0.0001)) : #yeah, really a glut of RP, stop taking RP + break + else: #RP not super cheap & we have enough, stop taking it break - else: #RP not super cheap & we have enough, stop taking it - break - II, IR = newTargets[pid][IFocus] - RI, RR = newTargets[pid][RFocus] - if currentFocus[pid] == MFocus: - II = max( II, newTargets[pid][MFocus][0] ) - if gotAlgo and ( - (ratio > 2.0 and curTargetPP < 15) or - (ratio > 2.5 and curTargetPP < 25 and II > 5) or - (ratio > 3.0 and curTargetPP < 40 and II > 5) or - (ratio > 4.0 and curTargetPP < 100 and II > 10) or - ( (curTargetRP+RR-IR)/max(0.001, curTargetPP - II+RI) > 2* priorityRatio )): # we already have algo elegance and more RP would be too expensive, or overkill - if not printedHeader: - printedHeader=True - print "Rejecting further Research Focus choices as too expensive:" - print "%34s|%20s|%15s |%15s|%15s |%15s |%15s"%(" Planet ", " current RP/PP ", " current target RP/PP ", "current Focus "," rejectedFocus ", " rejected target RP/PP ", "rejected RP-PP EQF") - oldFocus=currentFocus[pid] - cPP, cRP = currentOutput[pid][IFocus], currentOutput[pid][RFocus] - otPP, otRP= newTargets[pid].get(oldFocus, (0, 0)) - ntPP, ntRP= newTargets[pid].get(RFocus, (0, 0)) - print "pID (%3d) %22s | c: %5.1f / %5.1f | cT: %5.1f / %5.1f | cF: %8s | nF: %8s | cT: %5.1f / %5.1f | %.2f"%(pid, planetMap[pid].name, cRP, cPP, otRP, otPP, fociMap.get(oldFocus, 'unknown'), fociMap[RFocus] , ntRP, ntPP , ratio) - continue # RP is getting too expensive, but might be willing to still allocate from a planet with less PP to lose - newFoci[pid] = RFocus - curTargetRP += (RR-IR) - curTargetPP -= (II-RI) - print "============================" - print "Planet Focus Assignments to achieve target RP/PP ratio of %.2f from current ratio of %.2f ( %.1f / %.1f )"%(priorityRatio, rp/(pp+0.0001), rp, pp) - print "Max Industry assignments would result in target RP/PP ratio of %.2f ( %.1f / %.1f )"%( ctRP0/ (ctPP0 + 0.0001), ctRP0, ctPP0 ) - print "-------------------------------------" - print "%34s|%20s|%15s |%15s|%15s |%15s "%(" Planet ", " current RP/PP ", " current target RP/PP ", "current Focus "," newFocus ", " new target RP/PP ") - totalChanged=0 - for pid in newTargets: - oldFocus=currentFocus[pid] - changeFocus=False - newFocus = newFoci[pid] - cPP, cRP = currentOutput[pid][IFocus], currentOutput[pid][RFocus] - if newFocus==RFocus and oldFocus!=RFocus: - changeFocus = True - elif newFocus == IFocus: - if ( MFocus in planetMap[pid].availableFoci ) and ( newTargets[pid].setdefault(MFocus, (25, IR))[0] > newTargets[pid][IFocus][0]): - newFocus=MFocus - if newFocus !=oldFocus: + II, IR = newTargets[pid][IFocus] + RI, RR = newTargets[pid][RFocus] + if currentFocus[pid] == MFocus: + II = max( II, newTargets[pid][MFocus][0] ) + if gotAlgo and ( + (ratio > 2.0 and curTargetPP < 15) or + (ratio > 2.5 and curTargetPP < 25 and II > 5) or + (ratio > 3.0 and curTargetPP < 40 and II > 5) or + (ratio > 4.0 and curTargetPP < 100 and II > 10) or + ( (curTargetRP+RR-IR)/max(0.001, curTargetPP - II+RI) > 2* priorityRatio )): # we already have algo elegance and more RP would be too expensive, or overkill + if not printedHeader: + printedHeader=True + print "Rejecting further Research Focus choices as too expensive:" + print "%34s|%20s|%15s |%15s|%15s |%15s |%15s"%(" Planet ", " current RP/PP ", " current target RP/PP ", "current Focus "," rejectedFocus ", " rejected target RP/PP ", "rejected RP-PP EQF") + oldFocus=currentFocus[pid] + cPP, cRP = currentOutput[pid][IFocus], currentOutput[pid][RFocus] + otPP, otRP= newTargets[pid].get(oldFocus, (0, 0)) + ntPP, ntRP= newTargets[pid].get(RFocus, (0, 0)) + print "pID (%3d) %22s | c: %5.1f / %5.1f | cT: %5.1f / %5.1f | cF: %8s | nF: %8s | cT: %5.1f / %5.1f | %.2f"%(pid, planetMap[pid].name, cRP, cPP, otRP, otPP, fociMap.get(oldFocus, 'unknown'), fociMap[RFocus] , ntRP, ntPP , ratio) + continue # RP is getting too expensive, but might be willing to still allocate from a planet with less PP to lose + newFoci[pid] = RFocus + curTargetRP += (RR-IR) + curTargetPP -= (II-RI) + print "============================" + print "Planet Focus Assignments to achieve target RP/PP ratio of %.2f from current ratio of %.2f ( %.1f / %.1f )"%(priorityRatio, rp/(pp+0.0001), rp, pp) + print "Max Industry assignments would result in target RP/PP ratio of %.2f ( %.1f / %.1f )"%( ctRP0/ (ctPP0 + 0.0001), ctRP0, ctPP0 ) + print "-------------------------------------" + print "%34s|%20s|%15s |%15s|%15s |%15s "%(" Planet ", " current RP/PP ", " current target RP/PP ", "current Focus "," newFocus ", " new target RP/PP ") + totalChanged=0 + for pid in newTargets: + oldFocus=currentFocus[pid] + changeFocus=False + newFocus = newFoci[pid] + cPP, cRP = currentOutput[pid][IFocus], currentOutput[pid][RFocus] + if newFocus==RFocus and oldFocus!=RFocus: changeFocus = True - else: - pass #not supporting growth focus yet - if changeFocus: - totalChanged+=1 - fo.issueChangeFocusOrder(pid, newFocus) - otPP, otRP= newTargets[pid].get(oldFocus, (0, 0)) - ntPP, ntRP= newTargets[pid].get(newFocus, (0, 0)) - print "pID (%3d) %22s | c: %5.1f / %5.1f | cT: %5.1f / %5.1f | cF: %8s | nF: %8s | cT: %5.1f / %5.1f "%(pid, planetMap[pid].name, cRP, cPP, otRP, otPP, fociMap.get(oldFocus, 'unknown'), fociMap[newFocus] , ntRP, ntPP ) - print "-------------------------------------\nFinal Ratio Target (turn %4d) RP/PP : %.2f ( %.1f / %.1f ) after %d Focus changes"%( fo.currentTurn(), curTargetRP/ (curTargetPP + 0.0001), curTargetRP, curTargetPP , totalChanged) + elif newFocus == IFocus: + if ( MFocus in planetMap[pid].availableFoci ) and ( newTargets[pid].setdefault(MFocus, (25, IR))[0] > newTargets[pid][IFocus][0]): + newFocus=MFocus + if newFocus !=oldFocus: + changeFocus = True + else: + pass #not supporting growth focus yet + if changeFocus: + totalChanged+=1 + fo.issueChangeFocusOrder(pid, newFocus) + otPP, otRP= newTargets[pid].get(oldFocus, (0, 0)) + ntPP, ntRP= newTargets[pid].get(newFocus, (0, 0)) + print "pID (%3d) %22s | c: %5.1f / %5.1f | cT: %5.1f / %5.1f | cF: %8s | nF: %8s | cT: %5.1f / %5.1f "%(pid, planetMap[pid].name, cRP, cPP, otRP, otPP, fociMap.get(oldFocus, 'unknown'), fociMap[newFocus] , ntRP, ntPP ) + print "-------------------------------------\nFinal Ratio Target (turn %4d) RP/PP : %.2f ( %.1f / %.1f ) after %d Focus changes"%( fo.currentTurn(), curTargetRP/ (curTargetPP + 0.0001), curTargetRP, curTargetPP , totalChanged) + aPP, aRP = empire.productionPoints, empire.resourceProduction(fo.resourceType.research) print "Current Output (turn %4d) RP/PP : %.2f ( %.1f / %.1f )"%(fo.currentTurn(), aRP/ (aPP + 0.0001), aRP, aPP ), "\n------------------------" Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-01-02 09:02:25 UTC (rev 5611) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-01-04 04:45:38 UTC (rev 5612) @@ -234,6 +234,7 @@ "SHP_MULTICELL_CAST", "SHP_WEAPON_5", "GRO_SYMBIOTIC_BIO", + "GRO_XENO_GENETICS", "PRO_ROBOTIC_PROD", "PRO_INDUSTRY_CENTER_I", "PRO_FUSION_GEN", @@ -241,9 +242,7 @@ "DEF_GARRISON_2", "GRO_LIFECYCLE_MAN", "SHP_WEAPON_6", - "GRO_XENO_GENETICS", "SHP_ENDOCRINE_SYSTEMS", - "SHP_CONT_SYMB", "DEF_GARRISON_3", "PRO_INDUSTRY_CENTER_II", "PRO_ORBITAL_GEN", @@ -253,6 +252,7 @@ "SPY_DETECT_2", "GRO_XENO_HYBRIDS", "SHP_WEAPON_7", + "SHP_CONT_SYMB", "DEF_DEFENSE_NET_2", "DEF_PLAN_BARRIER_SHLD_1", "LRN_PHYS_BRAIN", |
From: <dil...@us...> - 2013-01-04 19:05:43
|
Revision: 5613 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5613&view=rev Author: dilvish-fo Date: 2013-01-04 19:05:36 +0000 (Fri, 04 Jan 2013) Log Message: ----------- minorish AI tweaks, mostly re production planning Modified Paths: -------------- trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2013-01-04 04:45:38 UTC (rev 5612) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2013-01-04 19:05:36 UTC (rev 5613) @@ -208,7 +208,7 @@ # at end of this function, fo.doneTurn() should be called to indicate to the client that orders are finished # and can be sent to the server for processing. def generateOrders(): - aggressions=["Turtle", "Cautious", "Typical", "Aggressive", "Maniacal"] + aggressions=["Turtle", "Cautious", "Moderate", "Aggressive", "Maniacal"] global lastTurnTimestamp universe = fo.getUniverse() turnStartTime=time() #starting AI timer here, to be sure AI doesn't get blame for any lags in server being able to provide the Universe object Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-04 04:45:38 UTC (rev 5612) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-04 19:05:36 UTC (rev 5613) @@ -380,12 +380,15 @@ print "Colony ships apparently unbuildable at present, ruh-roh" -def getBestShipInfo(priority): +def getBestShipInfo(priority, loc=None): "returns designID, design, buildLocList" empire = fo.getEmpire() empireID = empire.empireID capitolID = PlanetUtilsAI.getCapital() - planetIDs = [capitolID] + list(AIstate.popCtrIDs) #TODO: restrict to planets with shipyards + if loc is None: + planetIDs = [capitolID] + list(AIstate.popCtrIDs) #TODO: restrict to planets with shipyards + else: + planetIDs=[loc] theseDesignIDs = [] designNameBases= shipTypeMap.get(priority, ["nomatch"]) for baseName in designNameBases: @@ -489,14 +492,18 @@ try: res=fo.issueEnqueueBuildingProductionOrder("BLD_EXOBOT_SHIP", empire.capitalID) print "Enqueueing BLD_EXOBOT_SHIP, with result %d"%res + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%("BLD_EXOBOT_SHIP", res) except: print "Error: exception triggered and caught: ", traceback.format_exc() if ("BLD_IMPERIAL_PALACE" in possibleBuildingTypes) and ("BLD_IMPERIAL_PALACE" not in (capitalBldgs+queuedBldgNames)): res=fo.issueEnqueueBuildingProductionOrder("BLD_INDUSTRY_CENTER", empire.capitalID) print "Enqueueing BLD_IMPERIAL_PALACE, with result %d"%res - res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front - print "Requeueing BLD_IMPERIAL_PALACE to front of build queue, with result %d"%res + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing BLD_IMPERIAL_PALACE to front of build queue, with result %d"%res #TODO: add totalPP checks below, so don't overload queue @@ -547,7 +554,10 @@ thisPlanet=universe.getPlanet(pid) if thisPlanet.systemID in empireSpeciesSystems: res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) - if res: queuedBldLocs.append(pid) + if res: + queuedBldLocs.append(pid) + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) bldName = "BLD_SOL_ORB_GEN" @@ -593,13 +603,17 @@ distanceMap[sysID] = len(universe.leastJumpsPath(homeworld.systemID, sysID, empire.empireID)) except: pass - useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1] # kinda messy, but ensures a value + useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value if useSys!= -1: try: useLoc = AIstate.colonizedSystems[useSys][0] res=fo.issueEnqueueBuildingProductionOrder(bldName, useLoc) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, useLoc, universe.getPlanet(useLoc).name, res) + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) except: + print "problem queueing BLD_SOL_ORB_GEN at planet", useloc, "of system ", useSys pass bldName = "BLD_BLACK_HOLE_POW_GEN" @@ -620,13 +634,17 @@ distanceMap[sysID] = len(universe.leastJumpsPath(homeworld.systemID, sysID, empire.empireID)) except: pass - useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1] # kinda messy, but ensures a value + useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value if useSys!= -1: try: useLoc = AIstate.colonizedSystems[useSys][0] res=fo.issueEnqueueBuildingProductionOrder(bldName, useLoc) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, useLoc, universe.getPlanet(useLoc).name, res) + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) except: + print "problem queueing BLD_BLACK_HOLE_POW_GEN at planet", useloc, "of system ", useSys pass bldName = "BLD_ENCLAVE_VOID" @@ -642,6 +660,9 @@ try: res=fo.issueEnqueueBuildingProductionOrder(bldName, capitolID) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, capitolID, universe.getPlanet(capitolID).name, res) + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) except: pass @@ -658,18 +679,24 @@ try: res=fo.issueEnqueueBuildingProductionOrder(bldName, capitolID) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, capitolID, universe.getPlanet(capitolID).name, res) + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) except: pass bldName = "BLD_NEUTRONIUM_EXTRACTOR" + alreadyGotExtractor=False + for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): + planet=universe.getPlanet(pid) + if ( planet and ( planet.systemID in AIstate.empireStars.get(fo.starType.neutron, []) ) and ( + (bldName in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]) or + ("BLD_NEUTRONIUM_SYNTH" in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]) + )): + alreadyGotExtractor = True if empire.buildingTypeAvailable(bldName) and ( [element.locationID for element in productionQueue if (element.name==bldName) ]==[]): bldType = fo.getBuildingType(bldName) - alreadyGotOne=False - for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): - planet=universe.getPlanet(pid) - if planet and( planet.systemID in AIstate.empireStars.get(fo.starType.neutron, []) ) and (bldName in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]): - alreadyGotOne = True - if not alreadyGotOne: + if not alreadyGotExtractor: if not homeworld: useSys= AIstate.empireStars.get(fo.starType.neutron, [])[0] else: @@ -678,21 +705,29 @@ distanceMap[sysID] = len(universe.leastJumpsPath(homeworld.systemID, sysID, empire.empireID)) except: pass - useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1] # kinda messy, but ensures a value + useSys = ([-1] + sorted( [ (dist, sysID) for sysID, dist in distanceMap.items() ] ))[:2][-1][-1] # kinda messy, but ensures a value if useSys!= -1: try: useLoc = AIstate.colonizedSystems[useSys][0] res=fo.issueEnqueueBuildingProductionOrder(bldName, useLoc) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, useLoc, universe.getPlanet(useLoc).name, res) + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) except: + print "problem queueing BLD_NEUTRONIUM_EXTRACTOR at planet", useloc, "of system ", useSys pass bldName = "BLD_NEUTRONIUM_FORGE" - if empire.buildingTypeAvailable(bldName): + if empire.buildingTypeAvailable(bldName) and alreadyGotExtractor: queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] bldType = fo.getBuildingType(bldName) if len(queuedBldLocs) < 2 : #don't build too many at once - for pid in AIstate.popCtrIDs: + if homeworld: + tryLocs= [capitolID] + list(AIstate.popCtrIDs) + else: + tryLocs= AIstate.popCtrIDs + for pid in tryLocs: if pid not in queuedBldLocs: planet=universe.getPlanet(pid) if bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building @@ -700,7 +735,10 @@ if "BLD_SHIPYARD_BASE" in [bld.name for bld in map( universe.getObject, planet.buildingIDs)]: res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) - if res: + if res: + if productionQueue.size > 5: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 3) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) break #only initiate max of one new build per turn bldName = "BLD_CONC_CAMP" @@ -719,10 +757,10 @@ if planet.focus in [ AIFocusType.FOCUS_INDUSTRY, AIFocusType.FOCUS_MINING ]: fo.issueChangeFocusOrder(pid, AIFocusType.FOCUS_RESEARCH) res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) if res: queuedBldLocs.append(pid) res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front - print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) elif (cPop < 20 ): for bldg in planet.buildingIDs: if universe.getObject(bldg).buildingTypeName == bldName: @@ -792,12 +830,12 @@ colonyBuildChoices=[] for pid, score_Spec_tuple in foAI.foAIstate.colonisablePlanetIDs: score, thisSpec = score_Spec_tuple - colonyBuildChoices.extend( int(math.ceil(score))*speciesMap.get(thisSpec, []) )#TODO: make the list cover the best colony ship buildable for each species; don't rule out a species if can't make overall best + colonyBuildChoices.extend( int(math.ceil(score))*speciesMap.get(thisSpec, []) ) numOutpostTargs=len(foAI.foAIstate.colonisableOutpostIDs ) numOutpostFleets=len( FleetUtilsAI.getEmpireFleetIDsByRole( AIFleetMissionType.FLEET_MISSION_OUTPOST) )# counting existing outpost fleets each as one ship totOutpostFleets = queuedOutpostShips + numOutpostFleets - maxColonyFleets = max( min( numColonyTargs+1+fo.currentTurn()/10 , numTotalFleets/4 ), 1+int(2*len(empireColonizers))) + maxColonyFleets = max( min( numColonyTargs+1+fo.currentTurn()/10 , numTotalFleets/4 ), 3+int(3*len(empireColonizers))) maxOutpostFleets = min(numOutpostTargs+1+fo.currentTurn()/10, numTotalFleets/4 ) print "Production Queue Priorities:" @@ -817,14 +855,10 @@ if filteredPriorities == {}: print "No non-building-production priorities with nonzero score, setting to default: Military" filteredPriorities [AIPriorityType.PRIORITY_PRODUCTION_MILITARY ] = 1 - while (topscore >5000): + while (topscore >900): topscore = 0 for pty in filteredPriorities: - score = filteredPriorities[pty] - if score <= 500: - score = math.ceil(score/50) - else: - score = math.ceil(score/100) + score = filteredPriorities[pty] ** 0.5 filteredPriorities[pty] = score if score > topscore: topscore=score @@ -845,7 +879,6 @@ #print "\n ship priority selection list: \n %s \n\n"%str(priorityChoices) loopCount = 0 - nextIdx = len(productionQueue) while (wastedPP > 0) and (loopCount <100) and (priorityChoices != [] ): #make sure don't get stuck in some nonbreaking loop like if all shipyards captured loopCount +=1 print "Beginning build enqueue loop %d; %.1f PP available"%(loopCount, wastedPP) @@ -876,26 +909,27 @@ bestShip, bestDesign, buildChoices = bestShips[thisPriority] if makingColonyShip: loc = choice(colonyBuildChoices) + bestShip, colDesign, buildChoices = getBestShipInfo(AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, loc) else: loc = choice(buildChoices) numShips=1 perTurnCost = (float(bestDesign.productionCost(empire.empireID, homeworld.id)) / bestDesign.productionTime(empire.empireID, loc)) if not ( makingColonyShip ): #TODO: consider whether to allow multiples of colony ships; if not, priority sampling gets skewed - while ( totalPP > 25*perTurnCost): - numShips *= 5 - perTurnCost *= 5 + while ( totalPP > 40*perTurnCost): + numShips *= 2 + perTurnCost *= 2 retval = fo.issueEnqueueShipProductionOrder(bestShip, loc) if retval !=0: print "adding %d new ship(s) to production queue: %s; per turn production cost %.1f"%(numShips, bestDesign.name(True), perTurnCost) print "" if numShips>1: - fo.issueChangeProductionQuantityOrder(nextIdx, 1, numShips) + fo.issueChangeProductionQuantityOrder(productionQueue.size -1, 1, numShips) wastedPP -= perTurnCost - nextIdx+=1 if makingColonyShip: - totColonyFleets +=numShips # assumes the enqueueing below succeeds, but really no harm if assumption proves wrong + totColonyFleets +=numShips + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front if makingOutpostShip: - totOutpostFleets +=numShips # assumes the enqueueing below succeeds, but really no harm if assumption proves wrong + totOutpostFleets +=numShips print "" def getAvailableBuildLocations(shipDesignID): |
From: <dil...@us...> - 2013-01-06 02:25:52
|
Revision: 5618 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5618&view=rev Author: dilvish-fo Date: 2013-01-06 02:25:45 +0000 (Sun, 06 Jan 2013) Log Message: ----------- some AI production management and invasion planning improvements Modified Paths: -------------- trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2013-01-05 18:28:29 UTC (rev 5617) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2013-01-06 02:25:45 UTC (rev 5618) @@ -9,6 +9,24 @@ from ProductionAI import getBestShipInfo from ColonisationAI import evaluatePlanet +def sysNameIDs(sysIDs): + universe = fo.getUniverse() + res=[] + for sysID in sysIDs: + sys = universe.getSystem(sysID) + if sys: + res.append( "%s:%d"%(sys.name, sysID ) ) + return res + +def planetNameIDs(planetIDs): + universe = fo.getUniverse() + res=[] + for pid in planetIDs: + planet = universe.getSystem(pid) + if planet: + res.append( "%s:%d"%(planet.name, pid ) ) + return res + def getInvasionFleets(): "get invasion fleets" @@ -19,40 +37,80 @@ universe = fo.getUniverse() empire = fo.getEmpire() empireID = empire.empireID + capitalID = PlanetUtilsAI.getCapital() + #capitalID = empire.capitalID + homeworld=None + if capitalID: + homeworld = universe.getPlanet(capitalID) + if homeworld: + homeSystemID = homeworld.systemID + else: + speciesName = "" + homeworldName=" no remaining homeworld " + homeSystemID = -1 fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) + primeInvadableSystemIDs1 = set([]) primeInvadableSystemIDs = set([]) + print "Current Fleet Supplyable Systems: ", sysNameIDs(empire.fleetSupplyableSystemIDs) for sysID in empire.fleetSupplyableSystemIDs: primeInvadableSystemIDs.add(sysID) for nID in universe.getImmediateNeighbors(sysID, empireID): primeInvadableSystemIDs.add(nID) + primeInvadableSystemIDs1.add(nID) + primeInvadableSystemIDs1.difference_update(empire.fleetSupplyableSystemIDs) + print "First Ring of invadable systems: ", sysNameIDs(primeInvadableSystemIDs1) + if empire.getTechStatus("CON_ORBITAL_CON") == fo.techStatus.complete: + primeInvadableSystemIDs2 = set([]) + for sysID in list(primeInvadableSystemIDs1): + for nID in universe.getImmediateNeighbors(sysID, empireID): + primeInvadableSystemIDs2.add(nID) + primeInvadableSystemIDs2.difference_update(primeInvadableSystemIDs) + print "Second Ring of invadable systems: ", sysNameIDs(primeInvadableSystemIDs2) + primeInvadableSystemIDs.update(primeInvadableSystemIDs2) + primeInvadableSystemIDs3 = set([]) + if foAI.foAIstate.aggression > 1: + for sysID in list(primeInvadableSystemIDs2): + for nID in universe.getImmediateNeighbors(sysID, empireID): + primeInvadableSystemIDs3.add(nID) + primeInvadableSystemIDs3.difference_update(primeInvadableSystemIDs) + print "Third Ring of invadable systems: ", sysNameIDs(primeInvadableSystemIDs3) + primeInvadableSystemIDs.update(primeInvadableSystemIDs3) primeInvadablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(primeInvadableSystemIDs) # get competitor planets exploredSystemIDs = empire.exploredSystemIDs exploredPlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(exploredSystemIDs) + + visibleSystemIDs = foAI.foAIstate.visInteriorSystemIDs.keys() + foAI.foAIstate. visBorderSystemIDs.keys() + visiblePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(visibleSystemIDs) + accessibleSystemIDs = [sysID for sysID in visibleSystemIDs if universe.systemsConnected(sysID, homeSystemID, empireID) ] + acessiblePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(accessibleSystemIDs) + - allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) + #allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) + allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(acessiblePlanetIDs) # print "All Owned and Populated PlanetIDs: " + str(allOwnedPlanetIDs) - allPopulatedPlanets=PlanetUtilsAI.getPopulatedPlanetIDs(exploredPlanetIDs) + allPopulatedPlanets=PlanetUtilsAI.getPopulatedPlanetIDs(acessiblePlanetIDs) + print "All Visible and accessible Populated PlanetIDs (including this empire's): " + str(planetNameIDs(allPopulatedPlanets)) empireOwnedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) # print "Empire Owned PlanetIDs: " + str(empireOwnedPlanetIDs) invadablePlanetIDs = set(primeInvadablePlanetIDs).intersection(set(allPopulatedPlanets) - set(empireOwnedPlanetIDs)) - print "Prime Invadable PlanetIDs: " + str(invadablePlanetIDs) + print "Prime Invadable PlanetIDs: " + str(planetNameIDs(invadablePlanetIDs)) print "" - print "Invasion Targeted SystemIDs: " + str(AIstate.invasionTargetedSystemIDs) + print "Invasion Targeted SystemIDs: " + str(sysNameIDs(AIstate.invasionTargetedSystemIDs)) invasionTargetedPlanetIDs = getInvasionTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_INVASION, empireID) allInvasionTargetedSystemIDs = PlanetUtilsAI.getSystems(invasionTargetedPlanetIDs) # export invasion targeted systems for other AI modules AIstate.invasionTargetedSystemIDs = allInvasionTargetedSystemIDs - print "Invasion Targeted PlanetIDs: " + str(invasionTargetedPlanetIDs) + print "Invasion Targeted PlanetIDs: " + str(planetNameIDs(invasionTargetedPlanetIDs)) invasionFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) if not invasionFleetIDs: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-05 18:28:29 UTC (rev 5617) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-06 02:25:45 UTC (rev 5618) @@ -457,17 +457,23 @@ print "" print "Buildings already in Production Queue:" - capitolQueuedBldgs=[element for element in productionQueue if (element.buildType == AIEmpireProductionTypes.BT_BUILDING and element.locationID==homeworld.id)] + capitolQueuedBldgs=[] + bldgExpense=0.0 + for element in [e for e in productionQueue if (e.buildType == AIEmpireProductionTypes.BT_BUILDING)]: + bldgExpense += element.allocation + if ( element.locationID==homeworld.id): + capitolQueuedBldgs.append ( element ) for bldg in capitolQueuedBldgs: print " " + bldg.name + " turns:" + str(bldg.turnsLeft) + " PP:" + str(bldg.allocation) if capitolQueuedBldgs == []: print "None" print queuedBldgNames=[ bldg.name for bldg in capitolQueuedBldgs ] - - if ("BLD_INDUSTRY_CENTER" in possibleBuildingTypes) and ("BLD_INDUSTRY_CENTER" not in (capitalBldgs+queuedBldgNames)): + if ("BLD_INDUSTRY_CENTER" in possibleBuildingTypes) and ("BLD_INDUSTRY_CENTER" not in (capitalBldgs+queuedBldgNames)) and (bldgExpense<0.5*totalPP): res=fo.issueEnqueueBuildingProductionOrder("BLD_INDUSTRY_CENTER", empire.capitalID) print "Enqueueing BLD_INDUSTRY_CENTER, with result %d"%res + if res: + bldgExpense += productionQueue[productionQueue.size -1].allocation if ("BLD_SHIPYARD_BASE" in possibleBuildingTypes) and ("BLD_SHIPYARD_BASE" not in (capitalBldgs+queuedBldgNames)): try: @@ -478,12 +484,14 @@ print "Error: exception triggered and caught: ", traceback.format_exc() for bldName in [ "BLD_SHIPYARD_ORG_ORB_INC", "BLD_SHIPYARD_ORG_XENO_FAC", "BLD_SHIPYARD_ORG_CELL_GRO_CHAMB" ]: - if (bldName in possibleBuildingTypes) and (bldName not in (capitalBldgs+queuedBldgNames)): + if (bldName in possibleBuildingTypes) and (bldName not in (capitalBldgs+queuedBldgNames)) and (bldgExpense<0.5*totalPP): try: res=fo.issueEnqueueBuildingProductionOrder(bldName, empire.capitalID) print "Enqueueing %s at capitol, with result %d"%(bldName, res) - res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front - print "Requeueing %s to front of build queue, with result %d"%(bldName, res) + if res: + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + bldgExpense += productionQueue[0].allocation + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) except: print "Error: exception triggered and caught: ", traceback.format_exc() @@ -531,7 +539,7 @@ popCtrs = list(AIstate.popCtrIDs) for bldName in [ "BLD_SHIPYARD_ORG_ORB_INC" , "BLD_SHIPYARD_ORG_XENO_FAC" ]: - if empire.buildingTypeAvailable(bldName): + if empire.buildingTypeAvailable(bldName) and (bldgExpense<0.5*totalPP): queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] bldType = fo.getBuildingType(bldName) for pid in popCtrs: @@ -543,6 +551,7 @@ if res: queuedBldLocs.append(pid) res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + bldgExpense += productionQueue[0].allocation print "Requeueing %s to front of build queue, with result %d"%(bldName, res) bldName = "BLD_GAS_GIANT_GEN" @@ -557,6 +566,7 @@ if res: queuedBldLocs.append(pid) res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + bldgExpense += productionQueue[0].allocation print "Requeueing %s to front of build queue, with result %d"%(bldName, res) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) @@ -611,6 +621,7 @@ print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, useLoc, universe.getPlanet(useLoc).name, res) if res: res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + bldgExpense += productionQueue[0].allocation print "Requeueing %s to front of build queue, with result %d"%(bldName, res) except: print "problem queueing BLD_SOL_ORB_GEN at planet", useloc, "of system ", useSys @@ -790,7 +801,8 @@ #TODO: blocked items might not need dequeuing, but rather for supply lines to be un-blockaded for queue_index in range( len(productionQueue)): element=productionQueue[queue_index] - print " " + element.name + " turns:" + str(element.turnsLeft) + " PP:%.2f"%element.allocation + " being built at " + universe.getObject(element.locationID).name + blockStr = ["", "in blocks of %d "%element.blocksize][element.blocksize>1] + print " " + element.name+blockStr + " turns:" + str(element.turnsLeft) + " PP:%.2f"%element.allocation + " being built at " + universe.getObject(element.locationID).name if element.turnsLeft == -1: print "element %s will never be completed as stands "%element.name #fo.issueDequeueProductionOrder(queue_index) |
From: <dil...@us...> - 2013-01-06 22:40:30
|
Revision: 5620 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5620&view=rev Author: dilvish-fo Date: 2013-01-06 22:40:24 +0000 (Sun, 06 Jan 2013) Log Message: ----------- AI's rename original Capitol Planet according to personality Modified Paths: -------------- trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2013-01-06 19:52:11 UTC (rev 5619) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2013-01-06 22:40:24 UTC (rev 5620) @@ -181,6 +181,9 @@ outpostShip = {"SD_OUTPOST_SHIP":"A", "Outposter":"B"} troopShip = {"SD_TROOP_SHIP":"A", "Basic-Troopers":"B", "Medium-Troopers":"C", "Heavy-Troopers":"D", "Very-Heavy-Troopers":"D"} attackShip= {"SD_MARK":"A", "Lynx":"B","Griffon":"C", "Wyvern":"D", "Manticore":"E", "Devil":"F", "Reaver":"G"} + colonyBase={"SD_COLONY_BASE":"A", "NestBase":"B"} + outpostBase={"SD_OUTPOST_BASE":"A", "OutpostBase":"B"} + troopBase={"StormTroopers":"A"} class AIShipRoleType(object): #this is also used in determining fleetRoles SHIP_ROLE_INVALID = -1 Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2013-01-06 19:52:11 UTC (rev 5619) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2013-01-06 22:40:24 UTC (rev 5620) @@ -16,6 +16,9 @@ import os import traceback +aggressions={0:"Turtle", 1:"Cautious", 2:"Moderate", 3:"Aggressive", 4:"Maniacal"} +capitols={0:"Citadel ", 1:"Bastion of the Brave, ", 2:"Haven ", 3:"Royal Demesne ", 4:"Stairway to Heaven, "} + # AIstate foAIstate = None __timerEntries= ["PriorityAI", "ExplorationAI", "ColonisationAI", "InvasionAI", "MilitaryAI", "Gen_Fleet_Orders", "Issue_Fleet_Orders", @@ -44,6 +47,12 @@ foAIstate = AIstate.AIstate(aggression=aggression) foAIstate.sessionStartCleanup() print "Initialized foAIstate class" + planetID = PlanetUtilsAI.getCapital() + planet=None + universe=fo.getUniverse() + if planetID is not None: + planet = universe.getPlanet(planetID) + fo.issueRenameOrder(planetID, capitols.get(aggression, "")+planet.name) if __timerFile: __timerFile.close() if ResourcesAI.resourceTimerFile: @@ -208,7 +217,6 @@ # at end of this function, fo.doneTurn() should be called to indicate to the client that orders are finished # and can be sent to the server for processing. def generateOrders(): - aggressions=["Turtle", "Cautious", "Moderate", "Aggressive", "Maniacal"] global lastTurnTimestamp universe = fo.getUniverse() turnStartTime=time() #starting AI timer here, to be sure AI doesn't get blame for any lags in server being able to provide the Universe object @@ -220,7 +228,7 @@ print "***************************************************************************" print "***************************************************************************" print ("Generating Orders") - print "EmpireID: " + str(empire.empireID) + " Name: " + empire.name+ "_"+str(empire.empireID) +"_"+aggressions[foAIstate.aggression] + " Turn: " + str(fo.currentTurn()) + print "EmpireID: " + str(empire.empireID) + " Name: " + empire.name+ "_"+str(empire.empireID) +"_"+aggressions.get(foAIstate.aggression, "?") + " Turn: " + str(fo.currentTurn()) empireColor=empire.colour print "EmpireColors: %d %d %d %d"%(empireColor.r, empireColor.g, empireColor.b, empireColor.a) if planet: |
From: <dil...@us...> - 2013-01-09 02:52:37
|
Revision: 5622 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5622&view=rev Author: dilvish-fo Date: 2013-01-09 02:52:29 +0000 (Wed, 09 Jan 2013) Log Message: ----------- AI updates: Some more differentiation between AI aggression levels, some improved AI colonization and invasion planning, and some computation efficiency improvements in AI fleet path planning Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/MoveUtilsAI.py trunk/FreeOrion/default/AI/PlanetUtilsAI.py trunk/FreeOrion/default/AI/PriorityAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-01-07 23:06:43 UTC (rev 5621) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-01-09 02:52:29 UTC (rev 5622) @@ -11,6 +11,12 @@ empireSpecies = {} empireSpeciesSystems={} empireColonizers = {} +annexableSystemIDs=set([]) +annexableRing1=set([]) +annexableRing2=set([]) +annexableRing3=set([]) +annexablePlanetIDs=set([]) +curBestMilShipRating = 20 # makes these mapped to string version of values in case any sizes become reals instead of int planetSIzes= { str(fo.planetSize.tiny): 1, str(fo.planetSize.small): 2, str(fo.planetSize.medium): 3, str(fo.planetSize.large): 4, str(fo.planetSize.huge): 5, str(fo.planetSize.asteroids): 0, str(fo.planetSize.gasGiant): 0 } @@ -29,8 +35,11 @@ def getColonyFleets(): - global empireSpecies, empireColonizers, empireSpeciesSystems + global empireSpecies, empireColonizers, empireSpeciesSystems, annexableSystemIDs, annexableRing1, annexableRing2, annexableRing3 + global annexablePlanetIDs, curBestMilShipRating + curBestMilShipRating = ProductionAI.curBestMilShipRating() + "get colony fleets" allColonyFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION) @@ -73,6 +82,35 @@ print "-------\nEmpire Obstructed Starlanes:" print list(empire.obstructedStarlanes()) + + annexableSystemIDs.clear() + annexableRing1.clear() + annexableRing2.clear() + annexableRing3.clear() + annexablePlanetIDs.clear() + for sysID in empire.fleetSupplyableSystemIDs: + annexableSystemIDs.add(sysID) + for nID in universe.getImmediateNeighbors(sysID, empireID): + annexableSystemIDs.add(nID) + annexableRing1.add(nID) + annexableRing1.difference_update(empire.fleetSupplyableSystemIDs) + print "First Ring of annexable systems: ", PlanetUtilsAI.sysNameIDs(annexableRing1) + if empire.getTechStatus("CON_ORBITAL_CON") == fo.techStatus.complete: + for sysID in list(annexableRing1): + for nID in universe.getImmediateNeighbors(sysID, empireID): + annexableRing2.add(nID) + annexableRing2.difference_update(annexableSystemIDs) + print "Second Ring of annexable systems: ", PlanetUtilsAI.sysNameIDs(annexableRing2) + annexableSystemIDs.update(annexableRing2) + if foAI.foAIstate.aggression > 1: + for sysID in list(annexableRing2): + for nID in universe.getImmediateNeighbors(sysID, empireID): + annexableRing3.add(nID) + annexableRing3.difference_update(annexableSystemIDs) + print "Third Ring of annexable systems: ", PlanetUtilsAI.sysNameIDs(annexableRing3) + annexableSystemIDs.update(annexableRing3) + annexablePlanetIDs.update( PlanetUtilsAI.getPlanetsInSystemsIDs(annexableSystemIDs)) + # get outpost and colonization planets exploredSystemIDs = foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED) @@ -85,25 +123,24 @@ print "Explored PlanetIDs: " + str(exploredPlanetIDs) print "" - visibleSystemIDs = foAI.foAIstate.visInteriorSystemIDs.keys() + foAI.foAIstate. visBorderSystemIDs.keys() - visiblePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(visibleSystemIDs) - print "VisiblePlanets: %s "%[ (pid, (universe.getPlanet(pid) and universe.getPlanet(pid).name) or "unknown") for pid in visiblePlanetIDs] - print "" + #visibleSystemIDs = foAI.foAIstate.visInteriorSystemIDs.keys() + foAI.foAIstate. visBorderSystemIDs.keys() + #visiblePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(visibleSystemIDs) + #print "VisiblePlanets: %s "%[ (pid, (universe.getPlanet(pid) and universe.getPlanet(pid).name) or "unknown") for pid in visiblePlanetIDs] + #print "" - accessibleSystemIDs = [sysID for sysID in visibleSystemIDs if universe.systemsConnected(sysID, homeSystemID, empireID) ] - acessiblePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(accessibleSystemIDs) - - #allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) #working with Explored systems not all 'visible' because might not have a path to the latter - allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(acessiblePlanetIDs) # - print "All Owned or Populated PlanetIDs: " + str(allOwnedPlanetIDs) + #accessibleSystemIDs = [sysID for sysID in visibleSystemIDs if universe.systemsConnected(sysID, homeSystemID, empireID) ] + #acessiblePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(accessibleSystemIDs) empireOwnedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) print "Empire Owned PlanetIDs: " + str(empireOwnedPlanetIDs) + #allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) #working with Explored systems not all 'visible' because might not have a path to the latter + allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(annexablePlanetIDs) # + print "All annexable Owned or Populated PlanetIDs: " + str(set(allOwnedPlanetIDs)-set(empireOwnedPlanetIDs)) #unOwnedPlanetIDs = list(set(exploredPlanetIDs) -set(allOwnedPlanetIDs)) - unOwnedPlanetIDs = list(set(acessiblePlanetIDs) -set(allOwnedPlanetIDs)) - print "UnOwned PlanetIDs: " + str(unOwnedPlanetIDs) + unOwnedPlanetIDs = list(set(annexablePlanetIDs) -set(allOwnedPlanetIDs)) + print "UnOwned annexable PlanetIDs: " + str(PlanetUtilsAI.planetNameIDs(unOwnedPlanetIDs)) empirePopCtrs = set( PlanetUtilsAI.getPopulatedPlanetIDs( empireOwnedPlanetIDs) ) empireOutpostIDs=set(empireOwnedPlanetIDs) - empirePopCtrs @@ -206,7 +243,7 @@ evaluatedColonyPlanetIDs = list(set(unOwnedPlanetIDs).union(empireOutpostIDs) - set(colonyTargetedPlanetIDs) ) # print "Evaluated Colony PlanetIDs: " + str(evaluatedColonyPlanetIDs) - evaluatedOutpostPlanetIDs = list(set(unOwnedPlanetIDs) - set(outpostTargetedPlanetIDs)) + evaluatedOutpostPlanetIDs = list(set(unOwnedPlanetIDs) - set(outpostTargetedPlanetIDs)- set(colonyTargetedPlanetIDs)) # print "Evaluated Outpost PlanetIDs: " + str(evaluatedOutpostPlanetIDs) evaluatedColonyPlanets = assignColonisationValues(evaluatedColonyPlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, fleetSupplyablePlanetIDs, species, empire) @@ -285,7 +322,7 @@ # assign fleet targets to colonisable outposts sendColonyShips(AIstate.outpostFleetIDs, foAI.foAIstate.colonisableOutpostIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST) -def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire): +def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire): #TODO: clean up supplyable versus annexable "creates a dictionary that takes planetIDs as key and their colonisation score as value" planetValues = {} @@ -298,7 +335,7 @@ if best!=[]: if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): planetValues[planetID] = (best[0][0], "") - else: + else:#TODO: check for system-local colonizer; also, if a tie amongst top try to choose empire main species planetValues[planetID] = best[0] return planetValues @@ -349,18 +386,37 @@ if "_NEST_" in special: retval+=10 # get an outpost on the nest quick if ( ( planet.size == fo.planetSize.asteroids ) and (empire.getTechStatus("PRO_MICROGRAV_MAN") == fo.techStatus.complete )): - retval+=10*len( empireSpeciesSystems.get(planet.systemID , [])) # asteroid mining is good return #TODO: check that no preexisting asteroid outpost in system - for special in [ "MINERALS_SPECIAL", "CRYSTALS_SPECIAL", "METALOIDS_SPECIAL"] : - if special in planetSpecials: - retval += 30 #expects we can make exobots soonish or will have other colonizers & want to claim the planet + if system: + astVal=0 + for pid in system.planetIDs: + otherPlanet=universe.getPlanet(pid) + if otherPlanet.size == fo.planetSize.asteroids: + if pid==planetID: + continue + elif pid < planetID: + astVal=0 + break + elif otherPlanet.size!= fo.planetSize.gasGiant and otherPlanet.owner==empire.empireID: + astVal+=20 + retval += astVal if ( ( planet.size == fo.planetSize.gasGiant ) and ( (empire.getTechStatus("PRO_ORBITAL_GEN") == fo.techStatus.complete ) or ( "PRO_ORBITAL_GEN" in empireResearchList[:10]) )): - retval += 45*len( empireSpeciesSystems.get(planet.systemID , [])) # gias giant generators great, fast return - if foAI.foAIstate.systemStatus.get(planet.systemID, {}).get('fleetThreat', 0) > 0: + if system: + orbGenVal=0 + for pid in system.planetIDs: + otherPlanet=universe.getPlanet(pid) + if otherPlanet.size == fo.planetSize.asteroids and otherPlanet.owner==empire.empireID: + if empire.getTechStatus("PRO_EXOBOTS") == fo.techStatus.complete: + orbGenVal+=30 + elif otherPlanet.size!= fo.planetSize.gasGiant and otherPlanet.owner==empire.empireID: + orbGenVal+=50 + retval += orbGenVal + if foAI.foAIstate.systemStatus.get(planet.systemID, {}).get('fleetThreat', 0) > curBestMilShipRating: retval = retval / 2.0 return int(retval) else: #colonization mission asteroidBonus=0 gasGiantBonus=0 + miningBonus=0 if (planet.size==fo.planetSize.gasGiant) and not (species and species.name == "SP_SUPER_TEST"): return 0 elif ( planet.size == fo.planetSize.asteroids ): @@ -384,9 +440,9 @@ p2 = universe.getPlanet(pid) if p2: if p2.size== fo.planetSize.asteroids : - asteroidBonus = 5 + asteroidBonus = 30 if p2.size== fo.planetSize.gasGiant : - gasGiantBonus += 10 + gasGiantBonus += 50 planetEnv = environs[ str(species.getPlanetEnvironment(planet.type)) ] popSizeMod=0 popSizeMod += popSizeModMap["env"][planetEnv] @@ -445,8 +501,12 @@ if "DIM_RIFT_MASTER_SPECIAL" in planet.specials: popSize -= 4 + for special in [ "MINERALS_SPECIAL", "CRYSTALS_SPECIAL", "METALOIDS_SPECIAL"] : + if special in planetSpecials: + miningBonus=150 - # give preference to closest worlds + + # used to give preference to closest worlds empireID = empire.empireID capitalID = PlanetUtilsAI.getCapital() homeworld = universe.getPlanet(capitalID) @@ -457,21 +517,33 @@ distanceFactor = 1.001 / (leastJumpsPath + 1) else: distanceFactor = 0 + + retval=0.0 + if popSize<0: #can still have industry focus bonuses and buildings + if foAI.foAIstate.aggression > 2: + retval = starBonus+asteroidBonus+gasGiantBonus + elif popSize==0: + if foAI.foAIstate.aggression > 2: + retval = starBonus+max(asteroidBonus+gasGiantBonus, miningBonus) + else: + retval = starBonus+max(asteroidBonus+gasGiantBonus, miningBonus) + valMod + 2*popSize + if planet.systemID in annexableRing1: + retval += 10 + elif planet.systemID in annexableRing2: + retval += 20 + elif planet.systemID in annexableRing3: + retval += 10 - if foAI.foAIstate.systemStatus.get(planet.systemID, {}).get('fleetThreat', 0) > 0: - threatFactor = 0.7 - else: - threatFactor = 1.0 - - if popSize<1: - return 0 - if (planetID in fleetSupplyablePlanetIDs): - return (retval+ popSize + distanceFactor + valMod + gasGiantBonus + asteroidBonus)*threatFactor - #return getPlanetHospitality(planetID, species) * planet.size + distanceFactor - else: - return (retval+popSize + distanceFactor + valMod)*threatFactor - #return getPlanetHospitality(planetID, species) * planet.size - distanceFactor + thrtRatio = (foAI.foAIstate.systemStatus.get(planet.systemID, {}).get('fleetThreat', 0)+0.2*foAI.foAIstate.systemStatus.get(planet.systemID, {}).get('neighborThreat', 0)) / float(curBestMilShipRating) + if thrtRatio > 4: + retval = 0.3*retval + elif thrtRatio >= 2: + retval = 0.7* retval + elif thrtRatio > 0: + retval = 0.85* retval + return retval + def getPlanetHospitality(planetID, species): "returns a value depending on the planet type" Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2013-01-07 23:06:43 UTC (rev 5621) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2013-01-09 02:52:29 UTC (rev 5622) @@ -7,26 +7,9 @@ import AITarget import math from ProductionAI import getBestShipInfo -from ColonisationAI import evaluatePlanet +from ColonisationAI import evaluatePlanet, annexableSystemIDs, annexableRing1, annexableRing2, annexableRing3 +import ColonisationAI -def sysNameIDs(sysIDs): - universe = fo.getUniverse() - res=[] - for sysID in sysIDs: - sys = universe.getSystem(sysID) - if sys: - res.append( "%s:%d"%(sys.name, sysID ) ) - return res - -def planetNameIDs(planetIDs): - universe = fo.getUniverse() - res=[] - for pid in planetIDs: - planet = universe.getSystem(pid) - if planet: - res.append( "%s:%d"%(planet.name, pid ) ) - return res - def getInvasionFleets(): "get invasion fleets" @@ -52,32 +35,7 @@ fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) - primeInvadableSystemIDs1 = set([]) - primeInvadableSystemIDs = set([]) - print "Current Fleet Supplyable Systems: ", sysNameIDs(empire.fleetSupplyableSystemIDs) - for sysID in empire.fleetSupplyableSystemIDs: - primeInvadableSystemIDs.add(sysID) - for nID in universe.getImmediateNeighbors(sysID, empireID): - primeInvadableSystemIDs.add(nID) - primeInvadableSystemIDs1.add(nID) - primeInvadableSystemIDs1.difference_update(empire.fleetSupplyableSystemIDs) - print "First Ring of invadable systems: ", sysNameIDs(primeInvadableSystemIDs1) - if empire.getTechStatus("CON_ORBITAL_CON") == fo.techStatus.complete: - primeInvadableSystemIDs2 = set([]) - for sysID in list(primeInvadableSystemIDs1): - for nID in universe.getImmediateNeighbors(sysID, empireID): - primeInvadableSystemIDs2.add(nID) - primeInvadableSystemIDs2.difference_update(primeInvadableSystemIDs) - print "Second Ring of invadable systems: ", sysNameIDs(primeInvadableSystemIDs2) - primeInvadableSystemIDs.update(primeInvadableSystemIDs2) - primeInvadableSystemIDs3 = set([]) - if foAI.foAIstate.aggression > 1: - for sysID in list(primeInvadableSystemIDs2): - for nID in universe.getImmediateNeighbors(sysID, empireID): - primeInvadableSystemIDs3.add(nID) - primeInvadableSystemIDs3.difference_update(primeInvadableSystemIDs) - print "Third Ring of invadable systems: ", sysNameIDs(primeInvadableSystemIDs3) - primeInvadableSystemIDs.update(primeInvadableSystemIDs3) + primeInvadableSystemIDs = set(ColonisationAI.annexableSystemIDs) primeInvadablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(primeInvadableSystemIDs) # get competitor planets @@ -88,29 +46,28 @@ visiblePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(visibleSystemIDs) accessibleSystemIDs = [sysID for sysID in visibleSystemIDs if universe.systemsConnected(sysID, homeSystemID, empireID) ] acessiblePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(accessibleSystemIDs) - #allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(exploredPlanetIDs) allOwnedPlanetIDs = PlanetUtilsAI.getAllOwnedPlanetIDs(acessiblePlanetIDs) # print "All Owned and Populated PlanetIDs: " + str(allOwnedPlanetIDs) allPopulatedPlanets=PlanetUtilsAI.getPopulatedPlanetIDs(acessiblePlanetIDs) - print "All Visible and accessible Populated PlanetIDs (including this empire's): " + str(planetNameIDs(allPopulatedPlanets)) + print "All Visible and accessible Populated PlanetIDs (including this empire's): " + str(PlanetUtilsAI.planetNameIDs(allPopulatedPlanets)) empireOwnedPlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) # print "Empire Owned PlanetIDs: " + str(empireOwnedPlanetIDs) invadablePlanetIDs = set(primeInvadablePlanetIDs).intersection(set(allPopulatedPlanets) - set(empireOwnedPlanetIDs)) - print "Prime Invadable PlanetIDs: " + str(planetNameIDs(invadablePlanetIDs)) + print "Prime Invadable PlanetIDs: " + str(PlanetUtilsAI.planetNameIDs(invadablePlanetIDs)) print "" - print "Invasion Targeted SystemIDs: " + str(sysNameIDs(AIstate.invasionTargetedSystemIDs)) + print "Current Invasion Targeted SystemIDs: " + str(PlanetUtilsAI.sysNameIDs(AIstate.invasionTargetedSystemIDs)) invasionTargetedPlanetIDs = getInvasionTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_INVASION, empireID) allInvasionTargetedSystemIDs = PlanetUtilsAI.getSystems(invasionTargetedPlanetIDs) # export invasion targeted systems for other AI modules AIstate.invasionTargetedSystemIDs = allInvasionTargetedSystemIDs - print "Invasion Targeted PlanetIDs: " + str(planetNameIDs(invasionTargetedPlanetIDs)) + print "Current Invasion Targeted PlanetIDs: " + str(PlanetUtilsAI.planetNameIDs(invasionTargetedPlanetIDs)) invasionFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION) if not invasionFleetIDs: Modified: trunk/FreeOrion/default/AI/MoveUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/MoveUtilsAI.py 2013-01-07 23:06:43 UTC (rev 5621) +++ trunk/FreeOrion/default/AI/MoveUtilsAI.py 2013-01-09 02:52:29 UTC (rev 5622) @@ -1,7 +1,9 @@ import freeOrionAIInterface as fo +import FreeOrionAI as foAI from EnumsAI import AITargetType, AIFleetOrderType import AITarget import AIFleetOrder +from ColonisationAI import annexableSystemIDs, annexableRing1, annexableRing2, annexableRing3 def getAIFleetOrdersFromSystemAITargets(fleetAITarget, aiTargets): result = [] @@ -13,7 +15,7 @@ # for every system which fleet wanted to visit, determine systems to visit and create move orders for aiTarget in aiTargets: # determine systems required to visit(with possible return to supplied system) - systemAITargets = canTravelToSystemAndReturnToResupply(fleetAITarget.getTargetID(), lastSystemAITarget, aiTarget, empireID)#TODO: dont require return + systemAITargets = canTravelToSystem(fleetAITarget.getTargetID(), lastSystemAITarget, aiTarget, empireID) if len(systemAITargets) > 0: # for every system required to visit create move order for systemAITarget in systemAITargets: @@ -27,6 +29,38 @@ return result +def canTravelToSystem(fleetID, fromSystemAITarget, toSystemAITarget, empireID, ensureReturn=False): + empire = fo.getEmpire() + fleetSupplyableSystemIDs = set(empire.fleetSupplyableSystemIDs) + # get current fuel and max fuel + universe = fo.getUniverse() + fleet = universe.getFleet(fleetID) + maxFuel = int(fleet.maxFuel) + fuel = int(fleet.fuel) + if fuel < 1.0 or fromSystemAITarget.getTargetID() == toSystemAITarget.getTargetID: + return [] + if foAI.foAIstate.aggression<=2: + pathFunc=universe.leastJumpsPath + else: + pathFunc=universe.shortestPath + startSysID = fromSystemAITarget.getTargetID() + targetSysID = toSystemAITarget.getTargetID() + shortPath= pathFunc(startSysID, targetSysID, empireID) + suppliedStops = [ sid for sid in shortPath if sid in fleetSupplyableSystemIDs ] + unsuppliedStops = [sid for sid in shortPath if sid not in suppliedStops ] + if len( unsuppliedStops) == 0: + return [ AITarget.AITarget(AITargetType.TARGET_SYSTEM, sid) for sid in shortPath] + elif targetSysID in fleetSupplyableSystemIDs and len( unsuppliedStops) < fuel -1: + return [ AITarget.AITarget(AITargetType.TARGET_SYSTEM, sid) for sid in shortPath] + elif targetSysID in fleetSupplyableSystemIDs.union(annexableRing1) and len( unsuppliedStops) < fuel -1: + return [ AITarget.AITarget(AITargetType.TARGET_SYSTEM, sid) for sid in shortPath] + elif foAI.foAIstate.aggression >=2 and targetSysID in fleetSupplyableSystemIDs.union(annexableRing2) and len( unsuppliedStops) < fuel -2: + return [ AITarget.AITarget(AITargetType.TARGET_SYSTEM, sid) for sid in shortPath] + elif foAI.foAIstate.aggression >=3 and targetSysID in fleetSupplyableSystemIDs.union(annexableRing3) and len( unsuppliedStops) < fuel -3: + return [ AITarget.AITarget(AITargetType.TARGET_SYSTEM, sid) for sid in shortPath] + else: + return canTravelToSystemAndReturnToResupply(fleetID, fromSystemAITarget, toSystemAITarget, empireID) + def canTravelToSystemAndReturnToResupply(fleetID, fromSystemAITarget, toSystemAITarget, empireID, verbose=False): "check if fleet can travel from starting system to wanted system" Modified: trunk/FreeOrion/default/AI/PlanetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2013-01-07 23:06:43 UTC (rev 5621) +++ trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2013-01-09 02:52:29 UTC (rev 5622) @@ -1,6 +1,24 @@ import freeOrionAIInterface as fo import FreeOrionAI as foAI +def sysNameIDs(sysIDs): + universe = fo.getUniverse() + res=[] + for sysID in sysIDs: + sys = universe.getSystem(sysID) + if sys: + res.append( "%s:%d"%(sys.name, sysID ) ) + return res + +def planetNameIDs(planetIDs): + universe = fo.getUniverse() + res=[] + for pid in planetIDs: + planet = universe.getSystem(pid) + if planet: + res.append( "%s:%d"%(planet.name, pid ) ) + return res + def getCapital(): # if no current capital returns planet with biggest pop universe = fo.getUniverse() empire = fo.getEmpire() @@ -8,7 +26,10 @@ capitalID = empire.capitalID homeworld = universe.getPlanet(capitalID) if homeworld: - return capitalID + if homeworld.owner==empireID: + return capitalID + else: + print "Nominal Capitol %s does not appear to be owned by empire %d %s"%(homeworld.name, empireID, empire.name) #exploredSystemIDs = empire.exploredSystemIDs #exploredPlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(exploredSystemIDs) empireOwnedPlanetIDs = getOwnedPlanetsByEmpire(universe.planetIDs, empireID) Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2013-01-07 23:06:43 UTC (rev 5621) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2013-01-09 02:52:29 UTC (rev 5622) @@ -124,7 +124,18 @@ elif fo.currentTurn() < 40: researchPriority = 20 # high industry , low research else: + researchQueue = list(empire.researchQueue) researchPriority = 15 # high industry , low research + if len(researchQueue) == 0 : + researchPriority = 0 # done with research + elif len(researchQueue) <5 and researchQueue[-1].allocation > 0 : + researchPriority = 1 # barely not done with research + elif len(researchQueue) <10 and researchQueue[-1].allocation > 0 : + researchPriority = 2 # almost done with research + elif len(researchQueue) <20 and researchQueue[int(len(researchQueue)/2)].allocation > 0 : + researchPriority = 5 # closing in on end of research + elif len(researchQueue) <20: + researchPriority = 10 # high industry , low research print "" @@ -167,7 +178,7 @@ colonyshipIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION) numColonyships = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(colonyshipIDs)) - colonisationPriority = 101 * (numColonisablePlanetIDs - numColonyships) / numColonisablePlanetIDs + colonisationPriority = 121 * (2+numColonisablePlanetIDs - numColonyships) / (numColonisablePlanetIDs+1) # print "" # print "Number of Colony Ships : " + str(numColonyships) Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-01-07 23:06:43 UTC (rev 5621) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-01-09 02:52:29 UTC (rev 5622) @@ -76,7 +76,10 @@ print " %25s allocated %6.2f RP -- missing preReqs: %s -- unlockable items: %s "%(element.tech, element.allocation, missingPrereqs, unlockedItems) print "" if fo.currentTurn()==1: - newtech = TechsListsAI.primaryMetaTechsList() + if foAI.foAIstate.aggression in [0, 1, 2, 3]: + newtech = TechsListsAI.primaryMetaTechsList() + else: + newtech = TechsListsAI.maniacalTechsList() #pLTsToEnqueue = (set(newtech)-(set(completedTechs)|set(researchQueueList))) pLTsToEnqueue = newtech[:] techBase = set(completedTechs+researchQueueList) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-01-07 23:06:43 UTC (rev 5621) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-01-09 02:52:29 UTC (rev 5622) @@ -219,7 +219,7 @@ def primaryMetaTechsList(): - "primary techs for al categories" + "primary techs for all categories" primaryMetaTechs = [ "SHP_WEAPON_2", @@ -328,7 +328,7 @@ ] return primaryMetaTechs - MasterTechList=[ #currently with typos, just for reference +MasterTechList=[ #currently with typos, just for reference "CON_ARCH_MONOFILS", "CON_ARCH_PSYCH", "CON_ART_HEAVENLY", @@ -467,3 +467,113 @@ "SPY_STEALTH_1", "SPY_STEALTH_3" ] + +def maniacalTechsList(): + "primary techs for all categories" + + maniacalTechs = [ + "SHP_WEAPON_2", + "GRO_PLANET_ECOL", + "GRO_SUBTER_HAB", + "SHP_DOMESTIC_MONSTER", + "SHP_ORG_HULL", + "LRN_ALGO_ELEGANCE", + "GRO_SYMBIOTIC_BIO", + "CON_ENV_ENCAPSUL", + "SHP_WEAPON_5", + "PRO_FUSION_GEN", + "DEF_DEFENSE_NET_1", + "PRO_ORBITAL_GEN", + "GRO_GENETIC_ENG", + "DEF_GARRISON_1", + "SHP_MULTICELL_CAST", + "GRO_XENO_GENETICS", + "PRO_ROBOTIC_PROD", + "PRO_INDUSTRY_CENTER_I", + "DEF_GARRISON_2", + "GRO_LIFECYCLE_MAN", + "SHP_WEAPON_6", + "SHP_ENDOCRINE_SYSTEMS", + "DEF_GARRISON_3", + "PRO_INDUSTRY_CENTER_II", + "LRN_ARTIF_MINDS", + "LRN_FORCE_FIELD", + "CON_ORBITAL_CON", + "SPY_DETECT_2", + "GRO_XENO_HYBRIDS", + "SHP_WEAPON_7", + "SHP_CONT_SYMB", + "DEF_DEFENSE_NET_2", + "DEF_PLAN_BARRIER_SHLD_1", + "LRN_PHYS_BRAIN", + "LRN_TRANSLING_THT", + "PRO_MICROGRAV_MAN", + "SHP_ENDOSYMB_HULL", + "SHP_ASTEROID_HULLS", + "SHP_WEAPON_8", + "GRO_TERRAFORM", + "PRO_SOL_ORB_GEN", + "GRO_GENETIC_MED", + "LRN_GRAVITONICS", + "SHP_LEAD_PLATE", + "SHP_MONOCELL_EXP", + "GRO_CYBORG", + "PRO_SENTIENT_AUTOMATION", + "PRO_EXOBOTS", + "DEF_DEFENSE_NET_REGEN_1", + "DEF_PLAN_BARRIER_SHLD_2", + "DEF_DEFENSE_NET_3", + "SHP_BIOADAPTIVE_SPEC", + "SHP_WEAPON_9", + "DEF_SYST_DEF_MINE_1", + "DEF_PLAN_BARRIER_SHLD_3", + "LRN_QUANT_NET", + "CON_FRC_ENRG_CAMO", + "SHP_INTSTEL_LOG", + "SHP_REINFORCED_HULL", + "SHP_WEAPON_10", + "SHP_CONT_BIOADAPT", + "SHP_SENT_HULL", + "SHP_ZORTRIUM_PLATE", + "DEF_SYST_DEF_MINE_2", + "LRN_XENOARCH", + "CON_METRO_INFRA", + "CON_SUBTER_CONST", + "GRO_GENOME_BANK", + "SHP_BASIC_DAM_CONT", + "CON_ARCH_PSYCH", + "CON_CONC_CAMP", + "PRO_SINGULAR_GEN", + "SHP_ADV_DAM_CONT", + "PRO_INDUSTRY_CENTER_III", + "DEF_GARRISON_4", + "SPY_CLOAK_1", + "SPY_DETECT_3", + "DEF_DEFENSE_NET_REGEN_2", + "GRO_GAIA_TRANS", + "GRO_ENERGY_META", + "CON_ART_PLANET", + "CON_FRC_ENRG_STRC", + "PRO_NEUTRONIUM_EXTRACTION", + "LRN_STELLAR_TOMOGRAPHY", + "LRN_ENCLAVE_VOID", + "CON_NDIM_STRC", + "CON_ORBITAL_HAB", + "LRN_PSIONICS", + "LRN_DISTRIB_THOUGHT", + "GRO_ENERGY_META", + "DEF_SYST_DEF_MINE_3", + "DEF_PLAN_BARRIER_SHLD_4", + "SHP_WEAPON_13", + "SPY_DETECT_4", + "SHP_WEAPON_11", + "SHP_WEAPON_12", + "SHP_TITAN_HULL" + "DEF_PLAN_BARRIER_SHLD_5", + "SHP_SOLAR_CONT", + "SHP_WEAPON_14", + "SHP_WEAPON_15", + "SHP_WEAPON_16", + "SHP_WEAPON_17", + ] + return maniacalTechs |
From: <dil...@us...> - 2013-01-17 02:26:42
|
Revision: 5650 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5650&view=rev Author: dilvish-fo Date: 2013-01-17 02:26:34 +0000 (Thu, 17 Jan 2013) Log Message: ----------- Some adjustments making the more defensive AIs even more defensive Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-01-17 00:27:34 UTC (rev 5649) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-01-17 02:26:34 UTC (rev 5650) @@ -444,6 +444,8 @@ if p2.size== fo.planetSize.gasGiant : gasGiantBonus += 50 planetEnv = environs[ str(species.getPlanetEnvironment(planet.type)) ] + if planetEnv==0: + return -9999 popSizeMod=0 popSizeMod += popSizeModMap["env"][planetEnv] if empire.getTechStatus("GRO_SUBTER_HAB") == fo.techStatus.complete: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-17 00:27:34 UTC (rev 5649) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-01-17 02:26:34 UTC (rev 5650) @@ -649,11 +649,13 @@ #TODO: add totalPP checks below, so don't overload queue + maxDefensePortion = [0.7, 0.6, 0.5, 0.3, 0.2 ][ foAI.foAIstate.aggression] + sysOrbitalDefenses={} queuedDefenses={} orbitalDefenseNames = shipTypeNames( AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_DEFENSE ) defenseAllocation=0.0 - targetOrbitals= int( (fo.currentTurn()/( 10.0*(foAI.foAIstate.aggression +1)))**0.8) + targetOrbitals= int( ((fo.currentTurn()+4)/( 8.0*(foAI.foAIstate.aggression +1)**1.5))**0.8) print "Orbital Defense Check -- target Defense Orbitals: ", targetOrbitals for element in productionQueue: if ( element.buildType == AIEmpireProductionTypes.BT_SHIP) and (foAI.foAIstate.getShipRole(element.designID) == AIShipRoleType.SHIP_ROLE_BASE_DEFENSE): @@ -661,7 +663,7 @@ defenseAllocation += element.allocation print "Queued Defenses:", [( PlanetUtilsAI.sysNameIDs([sysID]), num) for sysID, num in queuedDefenses.items()] for sysID in empireSpeciesSystems: - if defenseAllocation > 0.5 * totalPP: + if defenseAllocation > maxDefensePortion * totalPP: break #print "checking ", PlanetUtilsAI.sysNameIDs([sysID]) sysOrbitalDefenses[sysID]=0 Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-01-17 00:27:34 UTC (rev 5649) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-01-17 02:26:34 UTC (rev 5650) @@ -103,6 +103,13 @@ except: print " Error: failed attempt to enqueued Tech: " + name print " Error: exception triggered and caught: ", traceback.format_exc() + if foAI.foAIstate.aggression in [0, 1]: + researchQueueList = getResearchQueueTechs() + defTechs=TechsListsAI.defenseTechs1() + for defTech in defTechs: + if defTech not in researchQueueList[:5] and empire.getTechStatus(defTech) != fo.techStatus.complete: + res=fo.issueEnqueueTechOrder(defTech, min(3, len(researchQueueList))) + print "Empire is very defensive, so attempted to fast-track %s, got result %d"%(defTech, res) print"" generateDefaultResearchOrders() print "\n\nAll techs:" Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-01-17 00:27:34 UTC (rev 5649) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-01-17 02:26:34 UTC (rev 5650) @@ -217,7 +217,18 @@ ] return techsList2 +def defenseTechs1(): + defTechs1=[ + "DEF_DEFENSE_NET_1", + "DEF_GARRISON_1", + ] + return defTechs1 +def defenseTechs2(): + defTechs2=[ + ] + return defTechs2 + def primaryMetaTechsList(): "primary techs for all categories" |
From: <dil...@us...> - 2013-01-20 23:49:08
|
Revision: 5669 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5669&view=rev Author: dilvish-fo Date: 2013-01-20 23:49:00 +0000 (Sun, 20 Jan 2013) Log Message: ----------- AI adjustment for population / growth tech changes Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-01-20 23:26:46 UTC (rev 5668) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-01-20 23:49:00 UTC (rev 5669) @@ -19,18 +19,20 @@ curBestMilShipRating = 20 # makes these mapped to string version of values in case any sizes become reals instead of int -planetSIzes= { str(fo.planetSize.tiny): 1, str(fo.planetSize.small): 2, str(fo.planetSize.medium): 3, str(fo.planetSize.large): 4, str(fo.planetSize.huge): 5, str(fo.planetSize.asteroids): 0, str(fo.planetSize.gasGiant): 0 } +planetSIzes= { str(fo.planetSize.tiny): 1, str(fo.planetSize.small): 2, str(fo.planetSize.medium): 3, str(fo.planetSize.large): 4, str(fo.planetSize.huge): 5, str(fo.planetSize.asteroids): 3, str(fo.planetSize.gasGiant): 3 } environs = { str(fo.planetEnvironment.uninhabitable): 0, str(fo.planetEnvironment.hostile): 1, str(fo.planetEnvironment.poor): 2, str(fo.planetEnvironment.adequate): 3, str(fo.planetEnvironment.good):4 } +photoMap= { fo.starType.blue:3 , fo.starType.white:1.5 , fo.starType.red:-1 , fo.starType.neutron: -1 , fo.starType.blackHole: -10 , fo.starType.noStar: -10 } # mods per environ uninhab hostile poor adequate good popSizeModMap={ - "env": [ 0, -3, -1, 0, 3 ], - "subHab": [ 0, 1, 1, 1, 1 ], - "symBio": [ 0, 1, 1, 1, 0 ], - "xenoGen": [ 0, 1, 1, 1, 1 ], - "xenoHyb": [ 0, 1, 1, 1, 0 ], - "cyborg": [ 0, 1, 1, 1, 0 ], - "ndim": [ 0,15,15,15,15], - "orbit": [ 0, 5, 5, 5, 5 ], + "env": [ 0, -4, -2, 0, 3 ], + "subHab": [ 0, 1, 1, 1, 1 ], + "symBio": [ 0, 0, 1, 1, 1 ], + "xenoGen": [ 0, 1, 2, 2, 0 ], + "xenoHyb": [ 0, 2, 1, 0, 0 ], + "cyborg": [ 0, 2, 0, 0, 0 ], + "ndim": [ 0, 2, 2, 2, 2 ], + "orbit": [ 0, 1, 1, 1, 1 ], + "gaia": [ 0, 3, 3, 3, 3 ], } @@ -353,7 +355,10 @@ starBonus=0 if species: tagList = [tag for tag in species.tags] + starPopMod=0 if system: + if "PHOTOTROPHIC" in tagList: + starPopMod = photoMap.get( system.starType, 0 ) if (empire.getTechStatus("PRO_SOL_ORB_GEN") == fo.techStatus.complete) or ( "PRO_SOL_ORB_GEN" in empireResearchList[:8]) : if system.starType in [fo.starType.blue, fo.starType.white]: if len (AIstate.empireStars.get(fo.starType.blue, [])+AIstate.empireStars.get(fo.starType.white, []))==0: @@ -448,7 +453,10 @@ return -9999 popSizeMod=0 popSizeMod += popSizeModMap["env"][planetEnv] - if empire.getTechStatus("GRO_SUBTER_HAB") == fo.techStatus.complete: + if "SELF_SUSTAINING" in tagList: + popSizeMod+=3 + popSizeMod += starPopMod + if (empire.getTechStatus("GRO_SUBTER_HAB") == fo.techStatus.complete) or "TUNNELS_SPECIAL" in planetSpecials: if "TECTONIC_INSTABILITY_SPECIAL" not in planetSpecials: popSizeMod += popSizeModMap["subHab"][planetEnv] if empire.getTechStatus("GRO_SYMBIOTIC_BIO") == fo.techStatus.complete: @@ -459,21 +467,18 @@ popSizeMod += popSizeModMap["xenoHyb"][planetEnv] if empire.getTechStatus("GRO_CYBORG") == fo.techStatus.complete: popSizeMod += popSizeModMap["cyborg"][planetEnv] + if empire.getTechStatus("CON_NDIM_STRUC") == fo.techStatus.complete: + popSizeMod += popSizeModMap["ndim"][planetEnv] + if empire.getTechStatus("CON_ORBITAL_HAB") == fo.techStatus.complete: + popSizeMod += popSizeModMap["orbit"][planetEnv] + if "GAIA_SPECIAL" in planet.specials: + popSizeMod += 3 + for special in [ "SLOW_ROTATION_SPECIAL", "SOLID_CORE_SPECIAL"] : if special in planetSpecials: popSizeMod -= 1 - #have to use these namelists since species tags don't seem available to AI currently - #for special, namelist in [ ("PROBIOTIC_SPECIAL", ["SP_HUMAN", "SP_SCYLIOR", "SP_GYSACHE", "SP_HHHOH", "SP_EAXAW"]), - # ("FRUIT_SPECIAL", ["SP_HUMAN", "SP_SCYLIOR", "SP_GYSACHE", "SP_HHHOH", "SP_EAXAW", "SP_TRITH"]), - # ("SPICE_SPECIAL", ["SP_HUMAN", "SP_SCYLIOR", "SP_GYSACHE", "SP_HHHOH", "SP_EAXAW"]), - # ("MONOPOLE_SPECIAL", ["SP_CRAY"]), - # ("SUPERCONDUCTOR_SPECIAL", ["SP_CRAY"]), - # ("POSITRONIUM_SPECIAL", ["SP_CRAY"]), - # ("MINERALS_SPECIAL", ["SP_GEORGE", "SP_EGASSEM"]), - # ("METALOIDS_SPECIAL", ["SP_GEORGE", "SP_EGASSEM"]), - # ]: for special, tag in [ ("PROBIOTIC_SPECIAL", "ORGANIC"), ("FRUIT_SPECIAL", "ORGANIC"), ("SPICE_SPECIAL", "ORGANIC"), @@ -491,14 +496,7 @@ #else: # print "planet %s had special %s without pop mod for species %s"%(planet.name, special, species.name) - if "GAIA_SPECIAL" in planet.specials: - popSizeMod += 3 - popSize = planet.size * popSizeMod - if empire.getTechStatus("CON_NDIM_STRUC") == fo.techStatus.complete: - popSize += popSizeModMap["ndim"][planetEnv] - if empire.getTechStatus("CON_ORBITAL_HAB") == fo.techStatus.complete: - popSize += popSizeModMap["orbit"][planetEnv] if "DIM_RIFT_MASTER_SPECIAL" in planet.specials: popSize -= 4 Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-01-20 23:26:46 UTC (rev 5668) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-01-20 23:49:00 UTC (rev 5669) @@ -182,7 +182,7 @@ else: newARating = foAI.foAIstate.updateFleetRating(fleetA_ID) if success : #and ( newARating==remainingRating) : - print "\t\t\t\t\t\t\%d rating from fleet %d successfully transferred to fleet %d, leaving %d"%(transferredAttack*transferredHealth, fleetA_ID, fleetB_ID, newARating['overal']) + print "\t\t\t\t\t\t\%d rating from fleet %d successfully transferred to fleet %d, leaving %d"%(transferredAttack*transferredHealth, fleetA_ID, fleetB_ID, newARating['overall']) else: print "\t\t\t\t\t\t transfer of %d rating from fleet %d to fleet %d was attempted but appears to have had problems, leaving %d"%(transferredAttack*transferredHealth, fleetA_ID, fleetB_ID, newARating['overall']) foAI.foAIstate.updateFleetRating(fleetB_ID) Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-01-20 23:26:46 UTC (rev 5668) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-01-20 23:49:00 UTC (rev 5669) @@ -80,7 +80,8 @@ if foAI.foAIstate.aggression <=fo.aggression.typical: newtech = TechsListsAI.primaryMetaTechsList() else: - newtech = TechsListsAI.aggressiveTechs() + #newtech = TechsListsAI.aggressiveTechs() + newtech = TechsListsAI.primaryMetaTechsList() #pLTsToEnqueue = (set(newtech)-(set(completedTechs)|set(researchQueueList))) pLTsToEnqueue = newtech[:] techBase = set(completedTechs+researchQueueList) @@ -110,6 +111,18 @@ if defTech not in researchQueueList[:5] and empire.getTechStatus(defTech) != fo.techStatus.complete: res=fo.issueEnqueueTechOrder(defTech, min(3, len(researchQueueList))) print "Empire is very defensive, so attempted to fast-track %s, got result %d"%(defTech, res) + if foAI.foAIstate.aggression >= fo.aggression.aggressive: + researchQueueList = getResearchQueueTechs() + if "CON_CONC_CAMP" in researchQueueList: + insertIdx = min(40, researchQueueList.index("CON_CONC_CAMP")) + else: + insertIdx=max(0, min(40, len(researchQueueList)-10)) + if "SHP_ASTEROID_HULLS" in researchQueueList: + insertIdx = min(insertIdx, researchQueueList.index("SHP_ASTEROID_HULLS")) + for ccTech in [ "CON_ARCH_PSYCH", "CON_CONC_CAMP"]: + if ccTech not in researchQueueList[:insertIdx+1] and empire.getTechStatus(ccTech) != fo.techStatus.complete: + res=fo.issueEnqueueTechOrder(ccTech, insertIdx) + print "Empire is very aggressive, so attempted to fast-track %s, got result %d"%(ccTech, res) print"" generateDefaultResearchOrders() print "\n\nAll techs:" Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-01-20 23:26:46 UTC (rev 5668) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-01-20 23:49:00 UTC (rev 5669) @@ -233,85 +233,83 @@ "primary techs for all categories" primaryMetaTechs = [ - "SHP_WEAPON_2", "GRO_PLANET_ECOL", "GRO_SUBTER_HAB", "SHP_DOMESTIC_MONSTER", "SHP_ORG_HULL", - "GRO_GENETIC_ENG", + "SHP_WEAPON_3", "LRN_ALGO_ELEGANCE", "CON_ENV_ENCAPSUL", - "DEF_GARRISON_1", - "SHP_MULTICELL_CAST", + "PRO_FUSION_GEN", "SHP_WEAPON_5", - "GRO_SYMBIOTIC_BIO", - "GRO_XENO_GENETICS", + "PRO_ORBITAL_GEN", "PRO_ROBOTIC_PROD", - "PRO_INDUSTRY_CENTER_I", - "PRO_FUSION_GEN", "DEF_DEFENSE_NET_1", - "DEF_GARRISON_2", - "GRO_LIFECYCLE_MAN", + "DEF_GARRISON_1", "SHP_WEAPON_6", - "SHP_ENDOCRINE_SYSTEMS", - "DEF_GARRISON_3", - "PRO_INDUSTRY_CENTER_II", - "PRO_ORBITAL_GEN", + "GRO_SYMBIOTIC_BIO", "LRN_ARTIF_MINDS", "LRN_FORCE_FIELD", + "SHP_WEAPON_8", + "GRO_GENETIC_ENG", + "SHP_MULTICELL_CAST", "CON_ORBITAL_CON", "PRO_MICROGRAV_MAN", + "PRO_INDUSTRY_CENTER_I", + "DEF_GARRISON_2", + "GRO_LIFECYCLE_MAN", + "SHP_ENDOCRINE_SYSTEMS", + "LRN_GRAVITONICS", + "CON_CONTGRAV_ARCH", + "DEF_GARRISON_3", + "PRO_INDUSTRY_CENTER_II", + "GRO_XENO_GENETICS", "SPY_DETECT_2", "GRO_XENO_HYBRIDS", - "SHP_WEAPON_7", "SHP_CONT_SYMB", "DEF_DEFENSE_NET_2", "DEF_PLAN_BARRIER_SHLD_1", - "LRN_GRAVITONICS", - "CON_CONTGRAV_ARCH", - "LRN_PHYS_BRAIN", - "LRN_TRANSLING_THT", + "CON_METRO_INFRA", + "CON_SUBTER_CONST", + "SHP_MONOCELL_EXP", "SHP_ENDOSYMB_HULL", "SHP_ASTEROID_HULLS", "SHP_WEAPON_8", "GRO_TERRAFORM", "PRO_SOL_ORB_GEN", - "CON_METRO_INFRA", - "CON_SUBTER_CONST", + "LRN_PHYS_BRAIN", + "LRN_TRANSLING_THT", + "LRN_XENOARCH", "GRO_GENETIC_MED", "SHP_LEAD_PLATE", - "SHP_MONOCELL_EXP", + "SHP_BIOADAPTIVE_SPEC", "GRO_CYBORG", "PRO_SENTIENT_AUTOMATION", "PRO_EXOBOTS", "DEF_DEFENSE_NET_REGEN_1", "DEF_PLAN_BARRIER_SHLD_2", "DEF_DEFENSE_NET_3", - "SHP_BIOADAPTIVE_SPEC", "SHP_WEAPON_9", "DEF_SYST_DEF_MINE_1", "DEF_PLAN_BARRIER_SHLD_3", + "SPY_DETECT_3", "LRN_QUANT_NET", "SHP_INTSTEL_LOG", "SHP_REINFORCED_HULL", "SHP_WEAPON_10", - "CON_NDIM_STRC", "SHP_CONT_BIOADAPT", "SHP_SENT_HULL", "SHP_ZORTRIUM_PLATE", "DEF_SYST_DEF_MINE_2", - "LRN_XENOARCH", + "CON_FRC_ENRG_CAMO", "GRO_GENOME_BANK", "SHP_BASIC_DAM_CONT", - "CON_ARCH_PSYCH", "CON_CONC_CAMP", "PRO_SINGULAR_GEN", "SHP_ADV_DAM_CONT", - "CON_FRC_ENRG_CAMO", "PRO_INDUSTRY_CENTER_III", "DEF_GARRISON_4", "SPY_CLOAK_1", - "SPY_DETECT_3", "DEF_DEFENSE_NET_REGEN_2", "GRO_GAIA_TRANS", "GRO_ENERGY_META", @@ -321,12 +319,12 @@ "LRN_STELLAR_TOMOGRAPHY", "LRN_ENCLAVE_VOID", "CON_ORBITAL_HAB", - "LRN_PSIONICS", "LRN_DISTRIB_THOUGHT", "GRO_ENERGY_META", "DEF_SYST_DEF_MINE_3", "DEF_PLAN_BARRIER_SHLD_4", "SHP_WEAPON_13", + "CON_NDIM_STRC", "SPY_DETECT_4", "SHP_WEAPON_11", "SHP_WEAPON_12", |