From: <dil...@us...> - 2013-04-17 00:13:35
|
Revision: 5984 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5984&view=rev Author: dilvish-fo Date: 2013-04-17 00:13:21 +0000 (Wed, 17 Apr 2013) Log Message: ----------- adjustments to AI ship designs Modified Paths: -------------- trunk/FreeOrion/default/AI/EnumsAI.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2013-04-15 01:49:23 UTC (rev 5983) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2013-04-17 00:13:21 UTC (rev 5984) @@ -205,7 +205,7 @@ colonyBase={"SD_COLONY_BASE":"A", "NestBase":"B"} outpostBase={"SD_OUTPOST_BASE":"A", "OutpostBase":"B"} troopBase={"SpaceInvaders":"A"} - defenseBase={"OrbitalGrid":"A", "OrbitalShield":"B", "OrbitalMultiShield":"C"} + defenseBase={"Decoy":"A", "OrbitalGrid":"B", "OrbitalShield":"C", "OrbitalMultiShield":"D"} class AIShipRoleType(object): #this is also used in determining fleetRoles SHIP_ROLE_INVALID = -1 Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-15 01:49:23 UTC (rev 5983) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-17 00:13:21 UTC (rev 5984) @@ -68,19 +68,20 @@ return shipDesignID, shipDesign, getAvailableBuildLocations(shipDesignID) return None, None, None #must be missing a Shipyard or other orbital (or missing tech) -def shipTypeNames(shipProdPriority): + +def addDesigns(shipType, newDesigns, shipProdPriority): + designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] empire = fo.getEmpire() designIDs=[] - designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] for baseName in designNameBases: designIDs.extend( [shipDesignID for shipDesignID in empire.allShipDesigns if baseName in fo.getShipDesign(shipDesignID).name(False) ] ) shipNames = [fo.getShipDesign(shipDesignID).name(False) for shipDesignID in designIDs] + print "Current %s Designs: %s"%(shipType, shipNames) - -def addDesigns(shipType, namesToAdd, needsAdding, shipProdPriority): - if needsAdding != []: + needsAdding=[ spec for spec in newDesigns if spec[0] not in shipNames ] #spec = ( name, desc, hull, partslist, icon, model) + if needsAdding != []: #needsAdding = [ (name, desc, hull, partslist, icon, model), ... ] print "--------------" - print "%s design names apparently needing to be added: %s"%(shipType, namesToAdd) + print "%s design names apparently needing to be added: %s"%(shipType, [spec[0] for spec in needsAdding] ) print "-------" for name, desc, hull, partslist, icon, model in needsAdding: try: @@ -95,240 +96,82 @@ print "%s apparently unbuildable at present, ruh-roh"%shipType def addBaseTroopDesigns(): - empire = fo.getEmpire() - troopDesignIDs=[] - designNameBases= [key for key, val in sorted( shipTypeMap.get(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_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 BaseTroopship Designs: %s"%troopShipNames + shipType, shipProdPriority ="BaseTroopers", EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_INVASION + designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] + newTroopDesigns = [] - desc = "StormTrooper Ship" - model = "fighter" + desc, model = "StormTrooper Ship", "fighter" tp = "GT_TROOP_POD" nb, hull = designNameBases[0], "SH_COLONY_BASE" newTroopDesigns += [ (nb, desc, hull, [tp], "", model) ] + addDesigns(shipType, newTroopDesigns, shipProdPriority) - 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 Base Designs: %s"%troopShipNames - print "-----------" - print "Troop base 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 Base Design %s, with result %d"%(name, res) - except: - print "Error: exception triggered and caught adding troop base %s: "%name, traceback.format_exc() - - bestShip, bestDesign, buildChoices = getBestShipInfo( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_INVASION) - if bestDesign: - print "Best TroopBaseship buildable is %s"%bestDesign.name(False) - else: - print "TroopBaseships apparently unbuildable at present, ruh-roh" def addTroopDesigns(): addBaseTroopDesigns() - empire = fo.getEmpire() - troopDesignIDs=[] - designNameBases= [key for key, val in sorted( shipTypeMap.get(EnumsAI.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 designNameBases[1] not in troopShipNames: -# try: -# res=fo.issueCreateShipDesignOrder(designNameBases[1], "organic Hulled Troopship for economical large quantities of troops", -# "SH_ORGANIC", ["GT_TROOP_POD", "GT_TROOP_POD", "GT_TROOP_POD", "GT_TROOP_POD"], "", "fighter", False) -# print "added Troopship %s, with result %d"%(designNameBases[1] , res) -# except: -# print "Error: exception triggered and caught: ", traceback.format_exc() -# if designNameBases[2] not in troopShipNames: -# try: -# 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", "GT_TROOP_POD"], "", "fighter", False) -# print "added Troopship %s, with result %d"%(designNameBases[2] , res) -# except: -# print "Error: exception triggered and caught: ", traceback.format_exc() - - + shipType, shipProdPriority ="Troopers", EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_INVASION + designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] newTroopDesigns = [] - desc = "Troop Ship" - model = "fighter" + desc, model = "Troop Ship", "fighter" + srb = "SR_WEAPON_%1d" 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) ] + newTroopDesigns += [ (nb%(iw), desc, hull, [srb%iw]+ 3*[tp], "", model) for iw in [2, 3, 4] ] 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) ] + newTroopDesigns += [ (nb%(iw+3), desc, hull, [srb%iw]+ 4*[tp], "", model) for iw in [2, 3, 4] ] - ar1 = "AR_LEAD_PLATE" - ar2= "AR_ZORTRIUM_PLATE" - ar3= "AR_NEUTRONIUM_PLATE" + ar1, ar2, ar3 = "AR_LEAD_PLATE", "AR_ZORTRIUM_PLATE", "AR_NEUTRONIUM_PLATE" arL=[ar1, ar2, ar3] - for ari in [1, 2]: #naming below only works because skipping Lead armor - nb, hull = designNameBases[ari+1]+"%1d-%1d", "SH_ORGANIC" - newTroopDesigns += [ (nb%(1, ari), desc, hull, ["SR_WEAPON_5", arL[ari], tp, tp], "", model) ] - newTroopDesigns += [ (nb%(2, ari), desc, hull, ["SR_WEAPON_8", arL[ari], tp, tp], "", model) ] nb, hull = designNameBases[ari+1]+"%1d-%1d", "SH_STATIC_MULTICELLULAR" - newTroopDesigns += [ (nb%(3, ari), desc, hull, ["SR_WEAPON_5", arL[ari], tp, tp, tp], "", model) ] - newTroopDesigns += [ (nb%(4, ari), desc, hull, ["SR_WEAPON_8", arL[ari], tp, tp, tp], "", model) ] + newTroopDesigns += [ (nb%(ari, iw), desc, hull, [srb%iw, arL[ari]]+ 3*[tp], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[ari+1]+"%1d-%1d", "SH_ENDOMORPHIC" - newTroopDesigns += [ (nb%(5, ari), desc, hull, ["SR_WEAPON_5", arL[ari], tp, tp, tp, tp], "", model) ] - newTroopDesigns += [ (nb%(6, ari), desc, hull, ["SR_WEAPON_8", arL[ari], tp, tp, tp, tp], "", model) ] + newTroopDesigns += [ (nb%(ari, iw+3), desc, hull, [srb%iw, arL[ari]]+ 3*[tp], "", model) for iw in [2, 3, 4] ] + addDesigns(shipType, newTroopDesigns, shipProdPriority) - 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( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_INVASION) - if bestDesign: - print "Best Troopship buildable is %s"%bestDesign.name(False) - else: - print "Troopships apparently unbuildable at present, ruh-roh" - def addScoutDesigns(): - empire = fo.getEmpire() - scoutDesignIDs=[] - designNameBases= [key for key, val in sorted( shipTypeMap.get(EnumsAI.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 - + shipType, shipProdPriority ="Scout", EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION + designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] newScoutDesigns = [] - desc = "Scout" - model = "fighter" + desc, model = "Scout", "fighter" srb = "SR_WEAPON_%1d" - nb, hull = designNameBases[1]+"-%1d-%1d", "SH_ORGANIC" db = "DT_DETECTOR_%1d" - #is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" - is1 = "FU_BASIC_TANK" - is2 = "SH_DEFLECTOR" - + is1, is2 = "FU_BASIC_TANK", "SH_DEFLECTOR" + + nb, hull = designNameBases[1]+"-%1d-%1d", "SH_ORGANIC" for id in [1, 2, 3, 4]: newScoutDesigns += [ (nb%(id, 0), desc, "SH_BASIC_SMALL", [ db%id], "", model) ] - #for id in [1, 2, 3, 4]: - # 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, 0), desc, hull, [ db%id, "", "", "", is1, is1], "", model) ] - newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, srb%iw, srb%iw, is2, is2], "", model) for iw in range(5, 9) ] + for id in [3, 4]: + newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, "", "", "", ""], "", model) for iw in range(5, 9) ] + addDesigns(shipType, newScoutDesigns, shipProdPriority) - currentTurn=fo.currentTurn() - needsAdding=[] - namesToAdd=[] - for name, desc, hull, partslist, icon, model in newScoutDesigns: - if name not in scoutShipNames: - needsAdding.append( ( name, desc, hull, partslist, icon, model) ) - namesToAdd.append( name ) - - if needsAdding != []: - print "--------------" - print "Current Scout Designs: %s"%scoutShipNames - print "-----------" - print "Scout 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 Scout Design %s, with result %d"%(name, res) - except: - print "Error: exception triggered and caught adding scout %s: "%name, traceback.format_exc() - - bestShip, bestDesign, buildChoices = getBestShipInfo( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION) - if bestDesign: - print "Best Scout buildable is %s"%bestDesign.name(False) - else: - print "Scouts apparently unbuildable at present, ruh-roh" - #TODO: add more advanced designs - def addOrbitalDefenseDesigns(): - shipType="OrbitalDefense" - shipProdPriority=EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_DEFENSE - empire = fo.getEmpire() - designIDs=[] + shipType, shipProdPriority ="OrbitalDefense", EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_DEFENSE designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] - for baseName in designNameBases: - designIDs.extend( [shipDesignID for shipDesignID in empire.allShipDesigns if baseName in fo.getShipDesign(shipDesignID).name(False) ] ) - shipNames = [fo.getShipDesign(shipDesignID).name(False) for shipDesignID in designIDs] - print "Current %s Designs: %s"%(shipType, shipNames) newDesigns = [] - desc = "Orbital Defense Ship" - model = "fighter" - is1= "SH_DEFENSE_GRID" - is2 = "SH_DEFLECTOR" - is3= "SH_MULTISPEC" - hull = "SH_COLONY_BASE" - if foAI.foAIstate.aggression<=fo.aggression.cautious: - newDesigns += [ (designNameBases[0], desc, hull, [is1], "", model) ] - newDesigns += [ (designNameBases[1], desc, hull, [is2], "", model) ] - newDesigns += [ (designNameBases[2], desc, hull, [is3], "", model) ] + desc, hull, model = "Orbital Defense Ship", "SH_COLONY_BASE", "fighter" + is1, is2, is3 = "SH_DEFENSE_GRID", "SH_DEFLECTOR", "SH_MULTISPEC" + newDesigns += [ (designNameBases[0], desc, hull, [""], "", model) ] + if False: + if foAI.foAIstate.aggression<=fo.aggression.cautious: + newDesigns += [ (designNameBases[1], desc, hull, [is1], "", model) ] + newDesigns += [ (designNameBases[2], desc, hull, [is2], "", model) ] + newDesigns += [ (designNameBases[3], desc, hull, [is3], "", model) ] - currentTurn=fo.currentTurn() - needsAdding=[] - namesToAdd=[] - for name, desc, hull, partslist, icon, model in newDesigns: - if name not in shipNames: - needsAdding.append( ( name, desc, hull, partslist, icon, model) ) - namesToAdd.append( name ) - addDesigns(shipType, namesToAdd, needsAdding, shipProdPriority) + addDesigns(shipType, newDesigns, shipProdPriority) def addMarkDesigns(): addOrbitalDefenseDesigns() - empire = fo.getEmpire() - markDesignIDs = [] - designNameBases= [key for key, val in sorted( shipTypeMap.get(EnumsAI.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 + shipType, shipProdPriority ="Attack Ships", EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_MILITARY + designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] newMarkDesigns = [] - desc = "military ship" - model = "fighter" + desc, model = "military ship", "fighter" srb = "SR_WEAPON_%1d" - is1= "FU_BASIC_TANK" - is2 = "SH_DEFLECTOR" - is3= "SH_MULTISPEC" - ar1 = "AR_LEAD_PLATE" - ar2= "AR_ZORTRIUM_PLATE" - ar3= "AR_NEUTRONIUM_PLATE" + is1, is2, is3 = "SH_DEFENSE_GRID", "SH_DEFLECTOR", "SH_MULTISPEC" + ar1, ar2, ar3 = "AR_LEAD_PLATE", "AR_ZORTRIUM_PLATE", "AR_NEUTRONIUM_PLATE" if foAI.foAIstate.aggression in [fo.aggression.beginner, fo.aggression.turtle]: maxEM= 8 @@ -340,20 +183,19 @@ nb, hull = designNameBases[1]+"-%1d", "SH_BASIC_MEDIUM" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, ""], "", model) for iw in range(1, 8) ] - #newMarkDesigns += [ ((nb%iw)+'N', desc, hull, [ srb%iw, ar3, ""], "", model) for iw in range(1, 8) ] - nb, hull = designNameBases[2]+"-1-%1d", "SH_ORGANIC" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1], "", model) for iw in range(3, 9) ] - nb, hull = designNameBases[2]+"-3-%1d", "SH_STATIC_MULTICELLULAR" - newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is1, is2], "", model) for iw in range(6, 9) ] + nb, hull = designNameBases[2]+"-2-%1d", "SH_ORGANIC" + newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is2], "", model) for iw in range(3, 9) ] + nb, hull = designNameBases[2]+"-4-%1d", "SH_STATIC_MULTICELLULAR" + newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is2, is2], "", model) for iw in range(6, 9) ] - if doDoubleShields or (empire.empireID%2 == 0) : - nb, hull = designNameBases[2]+"-2-%1x", "SH_ORGANIC" + if doDoubleShields or (fo.empireID()%2 == 0) : + nb, hull = designNameBases[2]+"-3-%1x", "SH_ORGANIC" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, is2, is2], "", model) for iw in range(5, maxEM+1) ] - nb, hull = designNameBases[2]+"-4-%1d", "SH_STATIC_MULTICELLULAR" - newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, srb%iw, is2, is2], "", model) for iw in range(6, maxEM+1) ] + nb, hull = designNameBases[2]+"-6-%1d", "SH_STATIC_MULTICELLULAR" + newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, is2, is2, is2], "", model) for iw in range(6, maxEM+1) ] - nb, hull = designNameBases[3]+"-1-%1x", "SH_ENDOMORPHIC" newMarkDesigns += [ (nb%iw, desc, hull, 4*[srb%iw] + 2*[ is1], "", model) for iw in [5, 6, 7 ] ] @@ -362,10 +204,8 @@ nb = designNameBases[3]+"3-%1x" #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-%1x" #newMarkDesigns += [ (nb%iw, desc, hull, 2*[srb%iw]+[ar1] + [ is1, is2], "", model) for iw in [7, 8, 10, 11, 12 ] ] - nb = designNameBases[3]+"-5-%1x" newMarkDesigns += [ (nb%iw, desc, hull, 3*[srb%iw]+[ar2] + 2*[ is2], "", model) for iw in range(7, maxEM+1) ] @@ -413,45 +253,12 @@ newMarkDesigns += [ (nb%(3, iw), desc, hull, 8*[srb%iw]+3*[ar2] + 3*[ is3], "", model) for iw in range(10, 18) ] newMarkDesigns += [ (nb%(4, iw), desc, hull, 9*[srb%iw]+3*[ar3] + 2*[ is3], "", model) for iw in range(10, 18) ] - - currentTurn=fo.currentTurn() - needsAdding=[] - namesToAdd=[] - for name, desc, hull, partslist, icon, model in newMarkDesigns: - if name not in markShipNames: - needsAdding.append( ( name, desc, hull, partslist, icon, model) ) - namesToAdd.append( name ) - - if needsAdding != []: - print "--------------" - print "Current Mark Designs: %s"%markShipNames - print "-----------" - print "Mark 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 Mark Design %s, with result %d"%(name, res) - except: - print "Error: exception triggered and caught adding mark %s: "%name, traceback.format_exc() - - bestShip, bestDesign, buildChoices = getBestShipInfo( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_MILITARY) - if bestDesign: - print "Best Mark buildable is %s"%bestDesign.name(False) - else: - print "Marks apparently unbuildable at present, ruh-roh" + addDesigns(shipType, newMarkDesigns, shipProdPriority) #TODO: add more advanced designs def addOutpostDesigns(): - empire = fo.getEmpire() - outpostDesignIDs = [] - designNameBases= [key for key, val in sorted( shipTypeMap.get(EnumsAI.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 + shipType, shipProdPriority ="Outpost Ships", EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_OUTPOST + designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] newOutpostDesigns = [] desc = "Outpost Ship" srb = "SR_WEAPON_%1d" @@ -461,89 +268,26 @@ db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" for id in [1, 2]: - newOutpostDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", op], "", model) for iw in [2, 4, 6, 8] ] + newOutpostDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", op], "", model) for iw in [2, 3, 4] ] + addDesigns(shipType, newOutpostDesigns, shipProdPriority) - currentTurn=fo.currentTurn() - needsAdding=[] - namesToAdd=[] - for name, desc, hull, partslist, icon, model in newOutpostDesigns: - if name not in outpostShipNames: - needsAdding.append( ( name, desc, hull, partslist, icon, model) ) - namesToAdd.append( name ) - - if needsAdding != []: - print "--------------" - print "Current Outpost Designs: %s"%outpostShipNames - print "-----------" - print "Outpost 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 Outposter Design %s, with result %d"%(name, res) - except: - print "Error: exception triggered and caught adding outposter %s: "%name, traceback.format_exc() - - bestShip, bestDesign, buildChoices = getBestShipInfo( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_OUTPOST) - if bestDesign: - print "Best Outpost buildable is %s"%bestDesign.name(False) - else: - print "Outpost ships apparently unbuildable at present, ruh-roh" - def addColonyDesigns(): - empire = fo.getEmpire() - colonyDesignIDs = [] - designNameBases= [key for key, val in sorted( shipTypeMap.get(EnumsAI.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 + shipType, shipProdPriority ="Colony Ships", EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_COLONISATION + designNameBases= [key for key, val in sorted( shipTypeMap.get(shipProdPriority, {"nomatch":0}).items(), key=lambda x:x[1])] newColonyDesigns = [] - desc = "Colony Ship" - model = "seed" + desc, model = "Colony Ship", "seed" srb = "SR_WEAPON_%1d" nb, hull = designNameBases[1]+"%1d_%1d", "SH_ORGANIC" - cp = "CO_COLONY_POD" + cp, cp2 = "CO_COLONY_POD", "CO_SUSPEND_ANIM_POD" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" for id in [1, 2, 3]: - newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, srb%iw, db%id, cp], "", model) for iw in [1, 2, 5, 8] ] + newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, "", db%id, cp], "", model) for iw in [1, 2, 3, 4] ] nb = designNameBases[2]+"%1d_%1d" - cp2 = "CO_SUSPEND_ANIM_POD" for id in [1, 2, 3]: - newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp2], "", model) for iw in [5, 6, 7, 8] ] - - currentTurn=fo.currentTurn() - needsAdding=[] - namesToAdd=[] - for name, desc, hull, partslist, icon, model in newColonyDesigns: - if name not in colonyShipNames: - needsAdding.append( ( name, desc, hull, partslist, icon, model) ) - namesToAdd.append( name ) - - if needsAdding != []: - print "--------------" - print "Current Colony Designs: %s"%colonyShipNames - print "-----------" - print "Colony 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 Colony Design %s, with result %d"%(name, res) - except: - print "Error: exception triggered and caught adding colony %s: "%name, traceback.format_exc() - - bestShip, bestDesign, buildChoices = getBestShipInfo( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_COLONISATION) - if bestDesign: - print "Best Colony ship buildable is %s"%bestDesign.name(False) - else: - print "Colony ships apparently unbuildable at present, ruh-roh" - + newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp2], "", model) for iw in [3.4] ] + addDesigns(shipType, newColonyDesigns, shipProdPriority) def generateProductionOrders(): "generate production orders" @@ -708,7 +452,6 @@ if ( (currentTurn %( aggrIndex))==0) and foAI.foAIstate.aggression < fo.aggression.maniacal: sysOrbitalDefenses={} queuedDefenses={} - orbitalDefenseNames = shipTypeNames( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_DEFENSE ) defenseAllocation=0.0 targetOrbitals= min( int( ((currentTurn+4)/( 8.0*(aggrIndex)**1.5))**0.8) , fo.aggression.maniacal - aggrIndex ) print "Orbital Defense Check -- target Defense Orbitals: ", targetOrbitals |
From: <dil...@us...> - 2013-04-19 18:13:36
|
Revision: 5987 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5987&view=rev Author: dilvish-fo Date: 2013-04-19 18:13:29 +0000 (Fri, 19 Apr 2013) Log Message: ----------- misc adjustments fo AI, including fix for population miscalculation re growth specials Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/ExplorationAI.py trunk/FreeOrion/default/AI/InvasionAI.py Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-04-19 16:50:53 UTC (rev 5986) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-04-19 18:13:29 UTC (rev 5987) @@ -428,28 +428,28 @@ 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* discountMultiplier - detail.append( "PRO_SOL_ORB_GEN %.1f"%(20* discountMultiplier) ) + detail.append( "PRO_SOL_ORB_GEN BW %.1f"%(20* discountMultiplier) ) elif not alreadyGotThisOne: starBonus +=1+10*discountMultiplier #still has extra value as an alternate location for solar generators - detail.append( "PRO_SOL_ORB_GEN %.1f"%(1+10* discountMultiplier ) ) + detail.append( "PRO_SOL_ORB_GEN BW Backup Location %.1f"%(1+10* discountMultiplier ) ) elif fo.currentTurn() > 100: #lock up this whole system starBonus += 5 #TODO: how much? - detail.append( "PRO_SOL_ORB_GEN %.1f"%5 ) + detail.append( "PRO_SOL_ORB_GEN BW LockingDownSystem %.1f"%5 ) if system.starType in [fo.starType.yellow, fo.starType.orange]: if len ( AIstate.empireStars.get(fo.starType.blue, [])+AIstate.empireStars.get(fo.starType.white, [])+ AIstate.empireStars.get(fo.starType.yellow, [])+AIstate.empireStars.get(fo.starType.orange, []))==0: starBonus +=10 - detail.append( "PRO_SOL_ORB_GEN %.1f"%10 ) + detail.append( "PRO_SOL_ORB_GEN YO %.1f"%10 ) else: starBonus +=2 #still has extra value as an alternate location for solar generators - detail.append( "PRO_SOL_ORB_GEN %.1f"%2 ) + detail.append( "PRO_SOL_ORB_GEN YO Backup %.1f"%2 ) if system.starType in [fo.starType.blackHole] and fo.currentTurn() > 100: if not alreadyGotThisOne: starBonus +=10*discountMultiplier #whether have tech yet or not, assign some base value detail.append( "Black Hole %.1f"%(10* discountMultiplier) ) else: starBonus += 5*discountMultiplier - detail.append( "Black Hole %.1f"%(5* discountMultiplier ) ) + detail.append( "Black Hole Backup %.1f"%(5* discountMultiplier ) ) 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: @@ -457,7 +457,7 @@ detail.append( "PRO_SINGULAR_GEN %.1f"%(200* discountMultiplier ) ) elif planet.systemID not in (AIstate.popCtrSystemIDs + AIstate.outpostSystemIDs): starBonus +=100*discountMultiplier #still has extra value as an alternate location for generators & for blocking enemies generators - detail.append( "PRO_SINGULAR_GEN backup %.1f"%(100* discountMultiplier ) ) + detail.append( "PRO_SINGULAR_GEN Backup %.1f"%(100* discountMultiplier ) ) elif system.starType in [fo.starType.red] and ( len (AIstate.empireStars.get(fo.starType.blackHole, [])) + len (AIstate.empireStars.get(fo.starType.red, [])))==0: if planet.systemID not in (AIstate.popCtrSystemIDs + AIstate.outpostSystemIDs): starBonus +=40*discountMultiplier # can be used for artificial black hole @@ -465,7 +465,7 @@ if system.starType in [fo.starType.neutron]: if len (AIstate.empireStars.get(fo.starType.neutron, []))==0: starBonus +=80*discountMultiplier #pretty rare planets, good for armor - detail.append( "PRO_NEUTRONIUM_EXTRACTION %.1f"%(80* discountMultiplier ) ) + detail.append( "PRO_NEUTRONIUM_EXTRACTION Backup %.1f"%(80* discountMultiplier ) ) else: starBonus +=20*discountMultiplier #still has extra value as an alternate location for generators & for bnlocking enemies generators detail.append( "PRO_NEUTRONIUM_EXTRACTION %.1f"%(20* discountMultiplier ) ) @@ -476,7 +476,7 @@ detail.append( "SHP_ENRG_BOUND_MAN %.1f"%(100* discountMultiplier ) ) elif planet.systemID not in (AIstate.popCtrSystemIDs + AIstate.outpostSystemIDs): colonyStarBonus +=50*discountMultiplier #still has extra value as an alternate location for generators & for bnlocking enemies generators - detail.append( "SHP_ENRG_BOUND_MAN %.1f"%(50* discountMultiplier ) ) + detail.append( "SHP_ENRG_BOUND_MAN Backup %.1f"%(50* discountMultiplier ) ) retval = starBonus planetSpecials = list(planet.specials) @@ -580,57 +580,63 @@ return -9999 popSizeMod=0 popSizeMod += popSizeModMap["env"][planetEnv] + detail.append("EnvironPopSizeMod(%d)"%popSizeMod) if "SELF_SUSTAINING" in tagList: popSizeMod*=2 - detail.append("SelfSustaining" ) + detail.append("SelfSustaining_PSM(2)" ) if "PHOTOTROPHIC" in tagList: popSizeMod += starPopMod - detail.append("Phototropic Star Bonus %0.1f"%starPopMod) + detail.append("Phototropic Star Bonus_PSM(%0.1f)"%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: - popSizeMod += popSizeModMap["symBio"][planetEnv] - if empire.getTechStatus("GRO_XENO_GENETICS") == fo.techStatus.complete: - popSizeMod += popSizeModMap["xenoGen"][planetEnv] - if empire.getTechStatus("GRO_XENO_HYBRID") == fo.techStatus.complete: - 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 "TUNNELS_SPECIAL" in planetSpecials: + T_reason="Tunnels_PSM(%d)" + else: + T_reason="Sub_Hab_PSM(%d)" + detail.append(T_reason%popSizeModMap["subHab"][planetEnv]) + for gTech, gKey in [ ("GRO_SYMBIOTIC_BIO", "symBio"), + ("GRO_XENO_GENETICS", "xenoGen"), + ("GRO_XENO_HYBRID", "xenoHyb"), + ("GRO_CYBORG", "cyborg"), + ("CON_NDIM_STRUC", "ndim"), + ("CON_ORBITAL_HAB", "orbit") ]: + if empire.getTechStatus(gTech) == fo.techStatus.complete: + popSizeMod += popSizeModMap[gKey][planetEnv] + detail.append("%s_PSM(%d)"%(gKey, popSizeModMap["gKey"][planetEnv])) if "GAIA_SPECIAL" in planet.specials: popSizeMod += 3 - detail.append("Gaia") + detail.append("Gaia_PSM(3)") for special in [ "SLOW_ROTATION_SPECIAL", "SOLID_CORE_SPECIAL"] : if special in planetSpecials: popSizeMod -= 1 - detail.append(special) + detail.append("%s_PSM(-1)"%special) applicableBoosts=set([]) for thisTag in [ tag for tag in tagList if tag in AIDependencies.metabolims]: metabBoosts= AIDependencies.metabolimBoostMap.get(thisTag, []) for key in activeGrowthSpecials.keys(): if ( len(activeGrowthSpecials[key])>0 ) and ( key in metabBoosts ): - applicableBoosts.update(key) - detail.append("%s boost active") + applicableBoosts.add(key) + detail.append("%s boost active"%key) for boost in metabBoosts: if boost in planetSpecials: - applicableBoosts.update(boost) - detail.append("%s boost present") + applicableBoosts.add(boost) + detail.append("%s boost present"%boost) - popSizeMod += len(applicableBoosts) - #popSizeMod += len( (set(planetSpecials).union([key for key in activeGrowthSpecials.keys() if len(activeGrowthSpecials[key])>0 ] )).intersection(AIDependencies.metabolimBoostMap.get(thisTag, []) ) ) + nBoosts = len(applicableBoosts) + if nBoosts: + popSizeMod += nBoosts + detail.append("boosts_PSM(%d from %s)"%(nBoosts, applicableBoosts)) popSize = planetSize * popSizeMod + detail.append("baseMaxPop size*psm %d * %d = %d"%(planetSize, popSizeMod, popSize) ) if "DIM_RIFT_MASTER_SPECIAL" in planet.specials: popSize -= 4 - detail.append("DIM_RIFT_MASTER_SPECIAL") + detail.append("DIM_RIFT_MASTER_SPECIAL(maxPop-4)") detail.append("maxPop %.1f"%popSize) for special in [ "MINERALS_SPECIAL", "CRYSTALS_SPECIAL", "METALOIDS_SPECIAL"] : Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2013-04-19 16:50:53 UTC (rev 5986) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2013-04-19 18:13:29 UTC (rev 5987) @@ -212,8 +212,8 @@ universe = fo.getUniverse() empire = fo.getEmpire() obsLanes = empire.obstructedStarlanes() - print "object is: %s"%(obsLanes, ) - obsLanesList = [el for el in obsLanes] + #print "object is: %s"%(obsLanes, ) #IntPairVec + obsLanesList = [el for el in obsLanes] #should result in list of tuples (sysID1, sysID2) if obsLanesList: print "obstructed starlanes are: %s"%( obsLanesList, ) else: @@ -222,7 +222,7 @@ newlyExplored=[] stillUnexplored=[] for sysID in list(foAI.foAIstate.unexploredSystemIDs): - if (empire.hasExploredSystem(sysID)): + if (empire.hasExploredSystem(sysID)): #consider making determination according to visibility rather than actual visit, which I think is what empire.hasExploredSystem covers del foAI.foAIstate.unexploredSystemIDs[sysID] foAI.foAIstate.exploredSystemIDs[sysID] = 1 sys=universe.getSystem(sysID) Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2013-04-19 16:50:53 UTC (rev 5986) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2013-04-19 18:13:29 UTC (rev 5987) @@ -181,7 +181,7 @@ specName=planet.speciesName species=fo.getSpecies(specName) - if not species: + if not species: #TODO: iterate over this Empire's available species with which it could colonize after and invasion popVal = ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, [planetID], species, empire, detail) #evaluatePlanet is imported from ColonisationAI else: popVal = ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], species, empire, detail) #evaluatePlanet is imported from ColonisationAI @@ -237,7 +237,7 @@ else: troopCost = math.ceil( plannedTroops/6.0) * ( 20*( 1+foAI.foAIstate.shipCount * AIDependencies.shipUpkeep ) ) invscore = threatFactor*max(0, popVal+supplyVal+bldTally+enemyVal-0.8*troopCost), plannedTroops - print invscore, "projected Troop Cost:", troopCost, "planet detail ", detail, popVal, supplyVal, bldTally, enemyVal + print invscore, "projected Troop Cost:", troopCost, ", threatFactor: ", threatFactor, ", planet detail ", detail, "popval, supplyval, bldval, enemyval", popVal, supplyVal, bldTally, enemyVal return invscore def getPlanetPopulation(planetID): |
From: <dil...@us...> - 2013-04-23 01:07:27
|
Revision: 5990 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5990&view=rev Author: dilvish-fo Date: 2013-04-23 01:07:19 +0000 (Tue, 23 Apr 2013) Log Message: ----------- some AI bug fixes Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-04-22 00:39:55 UTC (rev 5989) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-04-23 01:07:19 UTC (rev 5990) @@ -494,7 +494,7 @@ def getShipRole(self, shipDesignID): "returns ship role for given designID, assesses and adds as needed" - if shipDesignID in self.__shipRoleByDesignID: + if shipDesignID in self.__shipRoleByDesignID and self.__shipRoleByDesignID[shipDesignID] != EnumsAI.AIShipRoleType.SHIP_ROLE_INVALID: #if thought was invalid, recheck to be sure return self.__shipRoleByDesignID[shipDesignID] else: self.getDesignIDStats(shipDesignID) # just to update with infor for this new design @@ -529,7 +529,7 @@ def getFleetRole(self, fleetID, forceNew=False): "returns fleet role by ID" - if (not forceNew) and fleetID in self.__fleetRoleByID: + if (not forceNew) and fleetID in self.__fleetRoleByID and self.__fleetRoleByID[fleetID]!=AIFleetMissionType.FLEET_MISSION_INVALID : return self.__fleetRoleByID[fleetID] else: role=FleetUtilsAI.assessFleetRole(fleetID) Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-04-22 00:39:55 UTC (rev 5989) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-04-23 01:07:19 UTC (rev 5990) @@ -604,7 +604,7 @@ ("CON_ORBITAL_HAB", "orbit") ]: if empire.getTechStatus(gTech) == fo.techStatus.complete: popSizeMod += popSizeModMap[gKey][planetEnv] - detail.append("%s_PSM(%d)"%(gKey, popSizeModMap["gKey"][planetEnv])) + detail.append("%s_PSM(%d)"%(gKey, popSizeModMap[gKey][planetEnv])) if "GAIA_SPECIAL" in planet.specials: popSizeMod += 3 Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-04-22 00:39:55 UTC (rev 5989) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-04-23 01:07:19 UTC (rev 5990) @@ -338,9 +338,12 @@ return AIShipRoleType.SHIP_ROLE_BASE_INVASION if design.starlaneSpeed == 0: - if design.parts[0] in [ "SH_DEFENSE_GRID", "SH_DEFLECTOR" , "SH_MULTISPEC" ]: + string1 = "Ship Design %s has partslist %s"%(design.name(False), [part for part in design.parts]) + if len(design.parts)==0 or design.parts[0] in [ "SH_DEFENSE_GRID", "SH_DEFLECTOR" , "SH_MULTISPEC" ] or (len(design.parts)==1 and design.parts[0]==''): + print string1, "-- classifying as Base Defense" return AIShipRoleType.SHIP_ROLE_BASE_DEFENSE else: + print string1, "-- classifying as Invalid" return AIShipRoleType.SHIP_ROLE_INVALID stats = foAI.foAIstate.getDesignStats(design) @@ -384,6 +387,7 @@ print "Military Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY)) print "Orbital Defense Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE)) print "Securing Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_SECURE)) + " (currently FLEET_MISSION_MILITARY should be used instead of this Role)" + print "Unclassifyable Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVALID)) print "" print "Explored systems :" Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-22 00:39:55 UTC (rev 5989) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-23 01:07:19 UTC (rev 5990) @@ -475,7 +475,7 @@ fleetsHere = foAI.foAIstate.systemStatus.get(sysID, {}).get('myfleets', []) for fid in fleetsHere: if foAI.foAIstate.getFleetRole(fid)==EnumsAI.AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE: - #print "Found %d existing Orbital Defenses in %s :"%(foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0), PlanetUtilsAI.sysNameIDs([sysID])) + print "Found %d existing Orbital Defenses in %s :"%(foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0), PlanetUtilsAI.sysNameIDs([sysID])) sysOrbitalDefenses[sysID] += foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) for pid in ColonisationAI.empireSpeciesSystems.get(sysID, {}).get('pids', []): sysOrbitalDefenses[sysID] += queuedDefenses.get(pid, 0) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-04-22 00:39:55 UTC (rev 5989) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-04-23 01:07:19 UTC (rev 5990) @@ -12,211 +12,8 @@ cCamps=["CON_METRO_INFRA", "CON_ARCH_PSYCH", "CON_CONC_CAMP"] def unusableTechsList(): - "techs currently unusable by the AI" + return [] - unusableTechs = [] - ptechs = primaryMetaTechsList() - for tech in [ - - 'CON_ART_HEAVENLY', - 'CON_ART_PLANET', - 'CON_CONC_CAMP', - 'CON_FRC_ENRG_CAMO', - 'CON_INFRA_ECOL', - 'CON_ORGANIC_STRC', - 'CON_PLANET_DRIVE', - 'CON_SPACE_ELEVATOR', - 'CON_STARGATE', - 'CON_TRANS_ARCH', - 'SPY_LIGHTHOUSE', - 'GRO_BIOTERROR', - 'GRO_GENOME_BANK', - 'GRO_GAIA_TRANS', - 'GRO_INDUSTRY_CLONE', - 'GRO_INDUSTRY_FARM', - 'GRO_REMOTE_TERRAFORM', - 'GRO_SUSPENDED_ANIMATION', - 'GRO_TERRAFORM', - 'LRN_ART_BLACK_HOLE', - 'LRN_ENCLAVE_VOID', - 'LRN_GATEWAY_VOID', - 'LRN_MIND_VOID', - 'LRN_OBSERVATORY_I', - 'LRN_PSY_DOM', - 'LRN_SOLAR_MAN', - 'LRN_SPATIAL_DISTORT_GEN', - 'LRN_TIME_MECH', - 'LRN_TRANSCEND', - 'LRN_UNIF_CONC', - 'LRN_XENOARCH', - 'PRO_ENVIRO_MINING', - 'PRO_HEAVY_MINING_I', - 'PRO_INDUSTRY_CENTER_I', - 'PRO_INDUSTRY_CENTER_II', - 'PRO_INDUSTRY_CENTER_III', - 'PRO_NEUTRONIUM_EXTRACTION', - 'PRO_NDIM_ASSMB', - 'PRO_ORBITAL_GEN', - 'PRO_ORBITAL_MINE', - 'PRO_SINGULAR_GEN', - 'PRO_SOL_ORB_GEN', - 'PRO_ZERO_GEN', - 'SHP_ANTIMAT_TORP', - 'SHP_ANTIMATTER_TANK', - 'SHP_ASTEROID_HULLS', - 'SHP_ASTEROID_REFORM', - 'SHP_BIOADAPT_HULL', - 'SHP_BIOBOMBER', - 'SHP_BIOINTERCEPTOR', - 'SHP_BIONEUR_SPEC', - 'SHP_BOMBER', - 'SHP_CAMO_AST_HULL', - 'SHP_CONT_BIOADAPT', - 'SHP_CONT_SYMB', - 'SHP_CONTGRAV_MAINT', - 'SHP_DEATH_RAY', - 'SHP_DEUTERIUM_TANK', - 'SPY_DIST_MOD', - 'SHP_DOMESTIC_MONSTER', - 'SHP_ENDOMORPH_HULL', - 'SHP_ENDOSYMB_HULL', - 'SHP_ENRG_BOUND_MAN', - 'SHP_FRC_ENRG_COMP', - 'SHP_HAB_MEGAFAUN', - 'SHP_INTERCEPTOR', - 'SHP_LEAD_PLATE', - 'SHP_LOGISTICS_FAC', - 'SHP_MASS_DRIVER', - 'SHP_MASSPROP_SPEC', - 'SHP_MIDCOMB_LOG', - 'SHP_MIL_ROBO_CONT', - 'SHP_MINIAST_SWARM', - 'SHP_MONOCELL_EXP', - 'SHP_MONOMOLEC_LATTICE', - 'SHP_MULTICELL_CAST', - 'SHP_MULTISPEC_SHIELD', - 'SHP_NANOROBO_HULL', - 'SHP_NANOROBO_MAINT', - 'SPY_DETECT_3', - 'SHP_NEUTRONIUM_PLATE_NUC_MIS', - 'SHP_NEUTRONIUM_PLATE_SPEC_MIS', - 'SHP_NUCLEAR_MISSILE', - 'SHP_ORG_HULL', - 'SHP_PHASOR', - 'DEF_PLANET_CLOAK', - 'SHP_PLASMA_TORP', - 'SHP_PULSE_LASER', - 'SHP_QUANT_ENRG_MAG', - 'SPY_DETECT_2', - 'SHP_RECON_FIGHT', - 'SHP_SCAT_AST_HULL', - 'SPY_DETECT_4', - 'SHP_SENT_HULL', - 'SHP_SOLAR_CONT', - 'SHP_SPACE_FLUX_DRIVE', - 'SHP_SPECTRAL_MISSILE', - 'SHP_TRANSSPACE_DRIVE', - 'SHP_ZORTRIUM_PLATE', - 'SHP_WEAPON_11', - 'SHP_WEAPON_12', - 'SHP_WEAPON_13', - 'SHP_WEAPON_14', - 'SHP_WEAPON_15', - 'SHP_WEAPON_16', - 'SHP_WEAPON_17' - ] : - if tech not in ptechs: - unusableTechs.append(tech) - - return unusableTechs - -def primaryLearningTechsList(): - "primary learning techs" - - primaryLearningTechs = [ - - 'LRN_ALGO_ELEGANCE', - 'LRN_ARTIF_MINDS'] - - return primaryLearningTechs - -def primaryGroTechsList(): - "primary growth techs" - - primaryGroTechs = [ - - 'CON_ENV_ENCAPSUL'] - - return primaryGroTechs - -def primaryShipsTechsList(): - "primary ships techs" - - primaryShipsTechs = [ - 'SHP_WEAPON_2', - 'SHP_WEAPON_3', - 'SHP_WEAPON_4', - 'SHP_WEAPON_5', - 'SHP_DEFLECTOR', - 'SHP_WEAPON_6', - 'SHP_WEAPON_7', - 'SHP_WEAPON_8', - 'SHP_WEAPON_9', - 'SHP_WEAPON_10' - ] - - return primaryShipsTechs - -def getPrimaryTechsList1(): - techsList1 = [ - "SHP_WEAPON_2", - "GRO_PLANET_ECOL", - "GRO_SUBTER_HAB", - "DEF_GARRISON_1", - "SHP_HAB_MEGAFAUN", - "LRN_ALGO_ELEGANCE", - "CON_ENV_ENCAPSUL", - "SHP_WEAPON_4", - "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", - "PRO_INDUSTRY_CENTER_I", - "GRO_SYMBIOTIC_BIO", - ] - return techsList1 - -def getPrimaryTechsList2(): - techsList2 = [ - "SHP_WEAPON_2", - "GRO_PLANET_ECOL", - "GRO_SYMBIOTIC_BIO", - "GRO_SUBTER_HAB", - "DEF_GARRISON_1", - "SHP_HAB_MEGAFAUN", - "LRN_ALGO_ELEGANCE", - "CON_ENV_ENCAPSUL", - "SHP_WEAPON_4", - "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", - "PRO_INDUSTRY_CENTER_I", - ] - return techsList2 - def defenseTechs1(): defTechs1=[ "DEF_DEFENSE_NET_1", @@ -255,15 +52,18 @@ "GRO_SYMBIOTIC_BIO", "DEF_GARRISON_1", "GRO_GENETIC_ENG", - "GRO_XENO_GENETICS", "SPY_DETECT_2", - "SHP_WEAPON_7", "PRO_INDUSTRY_CENTER_I", + "GRO_XENO_GENETICS", + "SHP_WEAPON_7", "DEF_DEFENSE_NET_2", "PRO_SOL_ORB_GEN", "SHP_WEAPON_9", "DEF_GARRISON_2", "CON_METRO_INFRA", + "GRO_LIFECYCLE_MAN", + "SHP_MULTICELL_CAST", + "SHP_ENDOCRINE_SYSTEMS", "LRN_QUANT_NET", "DEF_DEFENSE_NET_REGEN_1", "DEF_PLAN_BARRIER_SHLD_1", @@ -271,9 +71,6 @@ "PRO_INDUSTRY_CENTER_II", "SPY_DETECT_3", "SHP_WEAPON_11", - "GRO_LIFECYCLE_MAN", - "SHP_MULTICELL_CAST", - "SHP_ENDOCRINE_SYSTEMS", "DEF_PLAN_BARRIER_SHLD_2", "LRN_GRAVITONICS", "CON_CONTGRAV_ARCH", |
From: <dil...@us...> - 2013-04-27 18:27:30
|
Revision: 5993 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5993&view=rev Author: dilvish-fo Date: 2013-04-27 18:27:23 +0000 (Sat, 27 Apr 2013) Log Message: ----------- misc AI changes Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/FreeOrionAI.py trunk/FreeOrion/default/AI/InvasionAI.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 2013-04-24 23:36:51 UTC (rev 5992) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-04-27 18:27:23 UTC (rev 5993) @@ -184,6 +184,15 @@ system = universe.getSystem(sysID) if system: AIstate.empireStars.setdefault(system.starType, []).append(sysID) + + claimedStars = {} + for sType in AIstate.empireStars: + claimedStars[sType] = list( AIstate.empireStars[sType] ) + for sysID in set( AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs): + tSys = universe.getSystem(sysID) + if not tSys: continue + claimedStars.setdefault( tSys.starType, []).append(sysID) + foAI.foAIstate.misc['claimedStars'] = claimedStars oldPopCtrs=[] @@ -369,9 +378,9 @@ # assign fleet targets to colonisable outposts sendColonyShips(AIstate.outpostFleetIDs, foAI.foAIstate.colonisableOutpostIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST) -def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire): #TODO: clean up supplyable versus annexable +def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire, detail=[]): #TODO: clean up supplyable versus annexable "creates a dictionary that takes planetIDs as key and their colonisation score as value" - + origDetail = detail planetValues = {} if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): print "\n=========\nAssigning Outpost Values\n=========" @@ -383,7 +392,7 @@ pv = [] for specName in trySpecies: thisSpecies=fo.getSpecies(specName) - detail = [] + detail = origDetail[:] pv.append( (evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, thisSpecies, empire, detail), specName, list(detail)) ) best = sorted(pv)[-1:] if best!=[]: @@ -399,8 +408,21 @@ discountMultiplier = 20.0 priorityScaling=1.0 maxGGGs=1 + if empire.productionPoints <100: + backupFactor = 0.0 + else: + backupFactor = min(1.0, (empire.productionPoints/200.0)**2 ) universe = fo.getUniverse() + claimedStars= foAI.foAIstate.misc.get('claimedStars', {} ) + if claimedStars == {}: + for sType in AIstate.empireStars: + claimedStars[sType] = list( AIstate.empireStars[sType] ) + for sysID in set( AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs): + tSys = universe.getSystem(sysID) + if not tSys: continue + claimedStars.setdefault( tSys.starType, []).append(sysID) + empireResearchList = [element.tech for element in empire.researchQueue] planet = universe.getPlanet(planetID) if (planet == None): @@ -426,57 +448,60 @@ detail.append( "PHOTOTROPHIC popMod %.1f"%starPopMod ) 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: + if len (claimedStars.get(fo.starType.blue, [])+claimedStars.get(fo.starType.white, []))==0: starBonus +=20* discountMultiplier detail.append( "PRO_SOL_ORB_GEN BW %.1f"%(20* discountMultiplier) ) elif not alreadyGotThisOne: - starBonus +=1+10*discountMultiplier #still has extra value as an alternate location for solar generators - detail.append( "PRO_SOL_ORB_GEN BW Backup Location %.1f"%(1+10* discountMultiplier ) ) + starBonus +=10*discountMultiplier*backupFactor #still has extra value as an alternate location for solar generators + detail.append( "PRO_SOL_ORB_GEN BW Backup Location %.1f"%(10* discountMultiplier *backupFactor) ) elif fo.currentTurn() > 100: #lock up this whole system - starBonus += 5 #TODO: how much? - detail.append( "PRO_SOL_ORB_GEN BW LockingDownSystem %.1f"%5 ) + pass + #starBonus += 5 #TODO: how much? + #detail.append( "PRO_SOL_ORB_GEN BW LockingDownSystem %.1f"%5 ) if system.starType in [fo.starType.yellow, fo.starType.orange]: - if len ( AIstate.empireStars.get(fo.starType.blue, [])+AIstate.empireStars.get(fo.starType.white, [])+ - AIstate.empireStars.get(fo.starType.yellow, [])+AIstate.empireStars.get(fo.starType.orange, []))==0: - starBonus +=10 - detail.append( "PRO_SOL_ORB_GEN YO %.1f"%10 ) + if len ( claimedStars.get(fo.starType.blue, [])+claimedStars.get(fo.starType.white, [])+ + claimedStars.get(fo.starType.yellow, [])+claimedStars.get(fo.starType.orange, []))==0: + starBonus +=10* discountMultiplier + detail.append( "PRO_SOL_ORB_GEN YO %.1f"%10* discountMultiplier ) else: - starBonus +=2 #still has extra value as an alternate location for solar generators - detail.append( "PRO_SOL_ORB_GEN YO Backup %.1f"%2 ) + pass + #starBonus +=2 #still has extra value as an alternate location for solar generators + #detail.append( "PRO_SOL_ORB_GEN YO Backup %.1f"%2 ) if system.starType in [fo.starType.blackHole] and fo.currentTurn() > 100: if not alreadyGotThisOne: - starBonus +=10*discountMultiplier #whether have tech yet or not, assign some base value - detail.append( "Black Hole %.1f"%(10* discountMultiplier) ) + starBonus +=10*discountMultiplier*backupFactor #whether have tech yet or not, assign some base value + detail.append( "Black Hole %.1f"%(10* discountMultiplier*backupFactor) ) else: - starBonus += 5*discountMultiplier - detail.append( "Black Hole Backup %.1f"%(5* discountMultiplier ) ) + starBonus += 5*discountMultiplier*backupFactor + detail.append( "Black Hole Backup %.1f"%(5* discountMultiplier*backupFactor ) ) 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: + if len (claimedStars.get(fo.starType.blackHole, []))==0: starBonus +=200*discountMultiplier #pretty rare planets, good for generator detail.append( "PRO_SINGULAR_GEN %.1f"%(200* discountMultiplier ) ) - elif planet.systemID not in (AIstate.popCtrSystemIDs + AIstate.outpostSystemIDs): - starBonus +=100*discountMultiplier #still has extra value as an alternate location for generators & for blocking enemies generators - detail.append( "PRO_SINGULAR_GEN Backup %.1f"%(100* discountMultiplier ) ) - elif system.starType in [fo.starType.red] and ( len (AIstate.empireStars.get(fo.starType.blackHole, [])) + len (AIstate.empireStars.get(fo.starType.red, [])))==0: - if planet.systemID not in (AIstate.popCtrSystemIDs + AIstate.outpostSystemIDs): - starBonus +=40*discountMultiplier # can be used for artificial black hole + elif planet.systemID not in claimedStars.get(fo.starType.blackHole, []): + starBonus +=100*discountMultiplier*backupFactor #still has extra value as an alternate location for generators & for blocking enemies generators + detail.append( "PRO_SINGULAR_GEN Backup %.1f"%(100* discountMultiplier*backupFactor ) ) + elif system.starType in [fo.starType.red] and ( len (claimedStars.get(fo.starType.blackHole, [])) )==0: + rfactor = (1.0+len (claimedStars.get(fo.starType.red, [])))**(-2) + starBonus +=40*discountMultiplier*backupFactor*rfactor # can be used for artificial black hole + detail.append( "Red Star for Art Black Hole %.1f"%(20* discountMultiplier*backupFactor*rfactor ) ) 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: + if len (claimedStars.get(fo.starType.neutron, []))==0: starBonus +=80*discountMultiplier #pretty rare planets, good for armor - detail.append( "PRO_NEUTRONIUM_EXTRACTION Backup %.1f"%(80* discountMultiplier ) ) + detail.append( "PRO_NEUTRONIUM_EXTRACTION %.1f"%(80* discountMultiplier ) ) else: - starBonus +=20*discountMultiplier #still has extra value as an alternate location for generators & for bnlocking enemies generators - detail.append( "PRO_NEUTRONIUM_EXTRACTION %.1f"%(20* discountMultiplier ) ) + starBonus +=20*discountMultiplier*backupFactor #still has extra value as an alternate location for generators & for bnlocking enemies generators + detail.append( "PRO_NEUTRONIUM_EXTRACTION Backup %.1f"%(20* discountMultiplier*backupFactor ) ) if (empire.getTechStatus("SHP_ENRG_BOUND_MAN") == fo.techStatus.complete) or ( "SHP_ENRG_BOUND_MAN" in empireResearchList[:6]) : if system.starType in [fo.starType.blackHole, fo.starType.blue] : - if len (AIstate.empireStars.get(fo.starType.blackHole, []) + AIstate.empireStars.get(fo.starType.blue, []) ) ==0: + if len (claimedStars.get(fo.starType.blackHole, []) + claimedStars.get(fo.starType.blue, []) ) ==0: colonyStarBonus +=100*discountMultiplier #pretty rare planets, good for generator detail.append( "SHP_ENRG_BOUND_MAN %.1f"%(100* discountMultiplier ) ) - elif planet.systemID not in (AIstate.popCtrSystemIDs + AIstate.outpostSystemIDs): - colonyStarBonus +=50*discountMultiplier #still has extra value as an alternate location for generators & for bnlocking enemies generators - detail.append( "SHP_ENRG_BOUND_MAN Backup %.1f"%(50* discountMultiplier ) ) + elif planet.systemID not in (claimedStars.get(fo.starType.blackHole, []) + claimedStars.get(fo.starType.blue, []) ): + colonyStarBonus +=50*discountMultiplier*backupFactor #still has extra value as an alternate location for generators & for bnlocking enemies generators + detail.append( "SHP_ENRG_BOUND_MAN Backup %.1f"%(50* discountMultiplier*backupFactor ) ) retval = starBonus planetSpecials = list(planet.specials) @@ -484,17 +509,15 @@ fixedRes += discountMultiplier*2*3 detail.append( "ECCENTRIC_ORBIT_SPECIAL %.1f"%(discountMultiplier*2*3 ) ) - if ( "ANCIENT_RUINS_SPECIAL" in planet.specials ): + if ( "ANCIENT_RUINS_SPECIAL" in planet.specials ): #TODO: add value for depleted ancient ruins retval += discountMultiplier*20 - detail.append("Undepleted Ruins") + detail.append("Undepleted Ruins %.1f"%discountMultiplier*20) - if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): - retval += fixedRes for special in planetSpecials: if "_NEST_" in special: - retval+=5*discountMultiplier # get an outpost on the nest quick - detail.append( "%s %.1f"%(special, discountMultiplier*5 ) ) + retval+=5*discountMultiplier*backupFactor # get an outpost on the nest quick + detail.append( "%s %.1f"%(special, discountMultiplier*5*backupFactor ) ) if ( ( planet.size == fo.planetSize.asteroids ) and (empire.getTechStatus("PRO_MICROGRAV_MAN") == fo.techStatus.complete )): if system: astVal=0 @@ -535,6 +558,7 @@ else: #colonization mission if not species: return 0 + retval += fixedRes retval += colonyStarBonus asteroidBonus=0 gasGiantBonus=0 @@ -647,7 +671,7 @@ if special in planetSpecials: miningBonus+=1 - proSingVal = [0, 4][(len( AIstate.empireStars.get(fo.starType.blackHole, [])) > 0)] + proSingVal = [0, 4][(len( claimedStars.get(fo.starType.blackHole, [])) > 0)] basePopInd=0.2 indMult=1 indTechMap={ "GRO_ENERGY_META": 0.5, Modified: trunk/FreeOrion/default/AI/FreeOrionAI.py =================================================================== --- trunk/FreeOrion/default/AI/FreeOrionAI.py 2013-04-24 23:36:51 UTC (rev 5992) +++ trunk/FreeOrion/default/AI/FreeOrionAI.py 2013-04-27 18:27:23 UTC (rev 5993) @@ -270,7 +270,7 @@ # call AI modules timer=[time()] try: PriorityAI.calculatePriorities() - except: print "Error: exception triggered and caught: ", traceback.format_exc() + except: print "Error: exception triggered and caught: ", traceback.format_exc() # try traceback.print_exc() timer.append( time() ) try: ExplorationAI.assignScoutsToExploreSystems() except: print "Error: exception triggered and caught: ", traceback.format_exc() Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2013-04-24 23:36:51 UTC (rev 5992) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2013-04-27 18:27:23 UTC (rev 5993) @@ -182,7 +182,8 @@ specName=planet.speciesName species=fo.getSpecies(specName) if not species: #TODO: iterate over this Empire's available species with which it could colonize after and invasion - popVal = ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, [planetID], species, empire, detail) #evaluatePlanet is imported from ColonisationAI + planetEval = ColonisationAI.assignColonisationValues([planetID], EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], species, empire, detail) #evaluatePlanet is imported from ColonisationAI + popVal = max( 0.5*planetEval[planetID][0], ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, [planetID], species, empire, detail) ) else: popVal = ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], species, empire, detail) #evaluatePlanet is imported from ColonisationAI Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-24 23:36:51 UTC (rev 5992) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-27 18:27:23 UTC (rev 5993) @@ -307,7 +307,15 @@ currentTurn = fo.currentTurn() print "" print " Total Available Production Points: " + str(totalPP) + + if empire.productionPoints <100: + backupFactor = 0.0 + else: + backupFactor = min(1.0, (empire.productionPoints/200.0)**2 ) + claimedStars= foAI.foAIstate.misc.get('claimedStars', {} ) + + try: addScoutDesigns() except: print "Error: exception triggered and caught: ", traceback.format_exc() try: addTroopDesigns() @@ -677,7 +685,7 @@ bldName = "BLD_ART_BLACK_HOLE" if ( ( empire.buildingTypeAvailable(bldName) ) and (foAI.foAIstate.aggression > fo.aggression.typical) and - (len( AIstate.empireStars.get(fo.starType.blackHole, [])) == 0 ) and (len( AIstate.empireStars.get(fo.starType.red, [])) > 0) ): + (len( claimedStars.get(fo.starType.blackHole, [])) == 0 ) and (len( AIstate.empireStars.get(fo.starType.red, [])) > 0) ): bldType = fo.getBuildingType(bldName) alreadyGotOne=False for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-04-24 23:36:51 UTC (rev 5992) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-04-27 18:27:23 UTC (rev 5993) @@ -40,12 +40,12 @@ "GRO_SUBTER_HAB", "SHP_WEAPON_5", "LRN_ALGO_ELEGANCE", + "CON_ENV_ENCAPSUL", + "PRO_ROBOTIC_PROD", "LRN_ARTIF_MINDS", - "PRO_ROBOTIC_PROD", "SHP_WEAPON_6", "DEF_DEFENSE_NET_1", "PRO_FUSION_GEN", - "CON_ENV_ENCAPSUL", "LRN_FORCE_FIELD", "CON_ORBITAL_CON", "PRO_ORBITAL_GEN", |
From: <dil...@us...> - 2013-04-27 21:05:46
|
Revision: 5994 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5994&view=rev Author: dilvish-fo Date: 2013-04-27 21:05:39 +0000 (Sat, 27 Apr 2013) Log Message: ----------- fix /workaround for single-player crash apparently related to AI serialization with last revisions Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-04-27 18:27:23 UTC (rev 5993) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-04-27 21:05:39 UTC (rev 5994) @@ -192,7 +192,7 @@ tSys = universe.getSystem(sysID) if not tSys: continue claimedStars.setdefault( tSys.starType, []).append(sysID) - foAI.foAIstate.misc['claimedStars'] = claimedStars + #foAI.foAIstate.misc['claimedStars'] = claimedStars oldPopCtrs=[] Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-27 18:27:23 UTC (rev 5993) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-04-27 21:05:39 UTC (rev 5994) @@ -314,6 +314,13 @@ backupFactor = min(1.0, (empire.productionPoints/200.0)**2 ) claimedStars= foAI.foAIstate.misc.get('claimedStars', {} ) + if claimedStars == {}: + for sType in AIstate.empireStars: + claimedStars[sType] = list( AIstate.empireStars[sType] ) + for sysID in set( AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs): + tSys = universe.getSystem(sysID) + if not tSys: continue + claimedStars.setdefault( tSys.starType, []).append(sysID) try: addScoutDesigns() |
From: <dil...@us...> - 2013-05-05 16:48:10
|
Revision: 6000 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6000&view=rev Author: dilvish-fo Date: 2013-05-05 16:48:02 +0000 (Sun, 05 May 2013) Log Message: ----------- minor AI adjustments Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.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 2013-05-05 01:07:18 UTC (rev 5999) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-05-05 16:48:02 UTC (rev 6000) @@ -444,6 +444,9 @@ growthVal = 0 fixedInd = 0 fixedRes = 0 + haveExistingPresence=False + if AIstate.colonizedSystems.get(planet.systemID, [planetID]) != [planetID]: #if existing presence is target planet, don't count + haveExistingPresence=True if species: tagList = list( species.tags ) starPopMod=0 @@ -557,9 +560,16 @@ detail.extend( GGDetail ) else: detail.append( "Won't GGG") + thrtFactor = 1.0 if ( foAI.foAIstate.systemStatus.get(planet.systemID, {}).get('fleetThreat', 0) + foAI.foAIstate.systemStatus.get(planet.systemID, {}).get('monsterThreat', 0) )> 2*curBestMilShipRating: - retval = retval / 2.0 - detail.append( "threat halving value" ) + thrtFactor = 0.5 + retval *=thrtFactor + detail.append( "threat reducing value" ) + if haveExistingPresence: + detail.append("multiplanet presence") + if thrtFactor < 1.0: + retval = (retval/thrtFactor) * (0.5 + 0.5*thrtFactor) #mitigate threat + retval *=1.5 return int(retval) else: #colonization mission if not species: @@ -749,8 +759,17 @@ elif thrtRatio > 0: retval = 0.85* retval + thrtFactor = 1.0 if thrtRatio > 1: - retval = 0.85* retval + detail.append("threat reducing value") + thrtFactor = 0.85 + retval *= thrtFactor + + if haveExistingPresence: + detail.append("multiplanet presence") + if thrtFactor < 1.0: + retval = (retval/thrtFactor) * (0.5 + 0.5*thrtFactor) #mitigate threat + retval *=1.5 return retval Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-05 01:07:18 UTC (rev 5999) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-05 16:48:02 UTC (rev 6000) @@ -128,7 +128,7 @@ nb, hull = designNameBases[1]+"%1d", "SH_STATIC_MULTICELLULAR" newTroopDesigns += [ (nb%(iw+3), desc, hull, [srb%iw]+ 4*[tp], "", model) for iw in [2, 3, 4] ] - ar1, ar2, ar3 = "AR_LEAD_PLATE", "AR_ZORTRIUM_PLATE", "AR_NEUTRONIUM_PLATE" + ar1, ar2, ar3 = "AR_STD_PLATE", "AR_ZORTRIUM_PLATE", "AR_NEUTRONIUM_PLATE" arL=[ar1, ar2, ar3] for ari in [1, 2]: #naming below only works because skipping Lead armor nb, hull = designNameBases[ari+1]+"%1d-%1d", "SH_STATIC_MULTICELLULAR" @@ -998,15 +998,18 @@ queuedTroopShips=0 #TODO: blocked items might not need dequeuing, but rather for supply lines to be un-blockaded + dequeueList=[] fo.updateProductionQueue() for queue_index in range( len(productionQueue)): element=productionQueue[queue_index] 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) - break + if element.locationID not in AIstate.popCtrIDs+AIstate.outpostIDs: + dequeueList.append(queue_index) #TODO add assessment of recapture -- invasion target etc. + print "element %s will never be completed as stands and location %d no longer owned; deleting from queue "%(element.name, element.locationID) + else: + print "element %s will never be completed as currently stands, but will remain on queue "%element.name elif element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION: thisSpec=universe.getPlanet(element.locationID).speciesName @@ -1019,6 +1022,9 @@ print "\nFound colony ships in build queue: %s"%queuedColonyShips if queuedOutpostShips: print "\nFound colony ships in build queue: %s"%queuedOutpostShips + + for queue_index in dequeueList[::-1]: + fo.issueDequeueProductionOrder(queue_index) allMilitaryFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(EnumsAI.AIFleetMissionType.FLEET_MISSION_MILITARY ) nMilitaryTot = sum( [ foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) for fid in allMilitaryFleetIDs ] ) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-05-05 01:07:18 UTC (rev 5999) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-05-05 16:48:02 UTC (rev 6000) @@ -34,9 +34,9 @@ primaryMetaTechs = [ "SHP_WEAPON_1_2", "GRO_PLANET_ECOL", - "SHP_WEAPON_1_3", "SHP_DOMESTIC_MONSTER", "SHP_ORG_HULL", + "SHP_WEAPON_1_3", "GRO_SUBTER_HAB", "SHP_WEAPON_1_4", "LRN_ALGO_ELEGANCE", @@ -61,6 +61,7 @@ "DEF_DEFENSE_NET_2", "PRO_SOL_ORB_GEN", "SHP_WEAPON_2_4", + "SHP_ZORTRIUM_PLATE", "DEF_GARRISON_2", "CON_METRO_INFRA", "SHP_WEAPON_3_1", @@ -68,7 +69,6 @@ "GRO_LIFECYCLE_MAN", "SHP_MULTICELL_CAST", "SHP_ENDOCRINE_SYSTEMS", - "SHP_ZORTRIUM_PLATE", "DEF_DEFENSE_NET_REGEN_1", "DEF_PLAN_BARRIER_SHLD_1", "SHP_WEAPON_3_2", |
From: <dil...@us...> - 2013-05-20 09:16:42
|
Revision: 6048 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6048&view=rev Author: dilvish-fo Date: 2013-05-20 09:16:35 +0000 (Mon, 20 May 2013) Log Message: ----------- minor AI update: some revised Ship designs & adjustments to tech priorities Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-19 21:13:15 UTC (rev 6047) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-20 09:16:35 UTC (rev 6048) @@ -194,16 +194,24 @@ nb, hull = designNameBases[1]+"-%1d", "SH_BASIC_MEDIUM" newMarkDesigns += [ (nb%iw, desc, hull, [ srb%iw, srb%iw, ""], "", model) for iw in [1, 2, 3, 4] ] - newMarkDesigns += [ (nb%(iw+4), desc, hull, [ srb2%iw, srb2%iw, ""], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, [ srb2%iw, srb2%iw, ""], "", model) for iw in [ 3, 4] ] nb, hull = designNameBases[2]+"-1-%1d", "SH_ORGANIC" - newMarkDesigns += [ (nb%iw, desc, hull, [ ar1, srb%iw, srb%iw, if1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, if1], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%iw, desc, hull, [ ar1, ar1, srb%iw, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, ar1, srb2%iw, if1], "", model) for iw in [3, 4] ] + nb, hull = designNameBases[2]+"-1G-%1d", "SH_ORGANIC" + newMarkDesigns += [ (nb%iw, desc, hull, [ ar1, srb%iw, srb%iw, is1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, is1], "", model) for iw in [3, 4] ] nb, hull = designNameBases[2]+"-2-%1d", "SH_ORGANIC" - newMarkDesigns += [ (nb%iw, desc, hull, [ ar1, srb%iw, srb%iw, is2], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%iw, desc, hull, [ ar1, srb%iw, srb%iw, is2], "", model) for iw in [4] ] newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, is2], "", model) for iw in [2, 3, 4] ] - nb, hull = designNameBases[2]+"-3-%1d", "SH_STATIC_MULTICELLULAR" - newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, is2, if1], "", model) for iw in [2, 3, 4] ] + nb, hull = designNameBases[2]+"-2z-%1d", "SH_ORGANIC" + newMarkDesigns += [ (nb%iw, desc, hull, [ ar2, srb%iw, srb%iw, is2], "", model) for iw in [4] ] + newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar2, srb2%iw, srb2%iw, is2], "", model) for iw in [2, 3, 4] ] + #nb, hull = designNameBases[2]+"-3-%1d", "SH_STATIC_MULTICELLULAR" + #newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar1, srb2%iw, srb2%iw, is2, if1], "", model) for iw in [2, 3, 4] ] + #nb, hull = designNameBases[2]+"-3z-%1d", "SH_STATIC_MULTICELLULAR" + #newMarkDesigns += [ (nb%(iw+4), desc, hull, [ ar2, srb2%iw, srb2%iw, is2, if1], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[3]+"-1-%1x", "SH_ENDOMORPHIC" newMarkDesigns += [ (nb%(iw+4), desc, hull, 3*[srb2%iw] + [ar1, is2, if1], "", model) for iw in [ 4 ] ] Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-05-19 21:13:15 UTC (rev 6047) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-05-20 09:16:35 UTC (rev 6048) @@ -96,6 +96,9 @@ if element.allocation > 0.0: inProgressTechs[element.tech]=True thisTech=fo.getTech(element.tech) + if not thisTech: + print "Error: can't retrieve tech ", element.tech + continue missingPrereqs = [preReq for preReq in thisTech.recursivePrerequisites(empireID) if preReq not in completedTechs] unlockedItems = [(uli.name, uli.type) for uli in thisTech.unlockedItems] if not missingPrereqs: Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-05-19 21:13:15 UTC (rev 6047) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-05-20 09:16:35 UTC (rev 6048) @@ -38,44 +38,45 @@ "SHP_ORG_HULL", "SHP_WEAPON_1_3", "GRO_SUBTER_HAB", + "LRN_ALGO_ELEGANCE", "SHP_WEAPON_1_4", - "LRN_ALGO_ELEGANCE", - "CON_ENV_ENCAPSUL", "PRO_ROBOTIC_PROD", "LRN_ARTIF_MINDS", - "SHP_WEAPON_2_1", + "CON_ENV_ENCAPSUL", "DEF_DEFENSE_NET_1", "PRO_FUSION_GEN", + "DEF_GARRISON_1", "LRN_FORCE_FIELD", - "SHP_WEAPON_2_2", "CON_ORBITAL_CON", "PRO_ORBITAL_GEN", "GRO_SYMBIOTIC_BIO", - "DEF_GARRISON_1", + "SHP_WEAPON_2_1", + "SHP_WEAPON_2_2", + "PRO_INDUSTRY_CENTER_I", "SHP_DEFLECTOR_SHIELD", + "SHP_WEAPON_2_3", "GRO_GENETIC_ENG", + "GRO_XENO_GENETICS", "SPY_DETECT_2", - "PRO_INDUSTRY_CENTER_I", - "GRO_XENO_GENETICS", - "SHP_WEAPON_2_3", "DEF_DEFENSE_NET_2", "PRO_SOL_ORB_GEN", "SHP_WEAPON_2_4", "SHP_ZORTRIUM_PLATE", "DEF_GARRISON_2", "CON_METRO_INFRA", + "LRN_QUANT_NET", "SHP_WEAPON_3_1", - "LRN_QUANT_NET", "GRO_LIFECYCLE_MAN", + "SHP_WEAPON_3_2", + "SHP_WEAPON_3_3", "SHP_MULTICELL_CAST", + "SHP_WEAPON_3_4", "SHP_ENDOCRINE_SYSTEMS", "DEF_DEFENSE_NET_REGEN_1", "DEF_PLAN_BARRIER_SHLD_1", - "SHP_WEAPON_3_2", "PRO_INDUSTRY_CENTER_II", "CON_FRC_ENRG_STRC", "SPY_DETECT_3", - "SHP_WEAPON_3_3", "DEF_PLAN_BARRIER_SHLD_2", "LRN_GRAVITONICS", "CON_CONTGRAV_ARCH", @@ -85,7 +86,6 @@ "PRO_EXOBOTS", "LRN_XENOARCH", "SHP_DIAMOND_PLATE", - "SHP_WEAPON_3_4", "DEF_DEFENSE_NET_3", "DEF_SYST_DEF_MINE_1", "DEF_PLAN_BARRIER_SHLD_3", |
From: <dil...@us...> - 2013-05-23 10:19:43
|
Revision: 6058 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6058&view=rev Author: dilvish-fo Date: 2013-05-23 10:19:34 +0000 (Thu, 23 May 2013) Log Message: ----------- AI update -- adds ability for AI to build & use outpost bases -- tech priority revision Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-05-23 07:22:06 UTC (rev 6057) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-05-23 10:19:34 UTC (rev 6058) @@ -90,6 +90,7 @@ self.militaryRating=0 self.shipCount = 4 self.misc={} + self.qualifyingColonyBaseTargets={} def __del__(self): "destructor" @@ -102,6 +103,7 @@ del self.needsEmergencyExploration del self.newlySplitFleets del self.misc + del self.qualifyingColonyBaseTargets def clean(self): global invasionTargets @@ -535,7 +537,8 @@ role=FleetUtilsAI.assessFleetRole(fleetID) self.__fleetRoleByID[fleetID] = role makeAggressive=False - if role in [AIFleetMissionType.FLEET_MISSION_COLONISATION, AIFleetMissionType.FLEET_MISSION_OUTPOST]: + if role in [AIFleetMissionType.FLEET_MISSION_COLONISATION, AIFleetMissionType.FLEET_MISSION_OUTPOST, + AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST]: pass if role in [AIFleetMissionType.FLEET_MISSION_EXPLORATION]: thisRating=self.getRating(fleetID) @@ -582,6 +585,7 @@ outpostIDs[:] = [] outpostSystemIDs[:] = [] ResourcesAI.lastFociCheck[0]=0 + self.qualifyingColonyBaseTargets.clear() def __cleanFleetRoles(self, justResumed=False): "removes fleetRoles if a fleet has been lost, and update fleet Ratings" Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-05-23 07:22:06 UTC (rev 6057) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-05-23 10:19:34 UTC (rev 6058) @@ -10,6 +10,7 @@ import ProductionAI import TechsListsAI from EnumsAI import AIFleetMissionType, AIExplorableSystemType, AITargetType, AIFocusType +import EnumsAI empireSpecies = {} @@ -26,10 +27,9 @@ annexableRing3=set([]) annexablePlanetIDs=set([]) curBestMilShipRating = 20 +allColonyOpportunities = {} - - 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 @@ -60,7 +60,7 @@ annexableRing3.clear() annexablePlanetIDs.clear() curBestMilShipRating = 20 - + allColonyOpportunities.clear() def getColonyFleets(): global curBestMilShipRating @@ -282,8 +282,11 @@ numColonyFleets = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(colonyFleetIDs)) print "Colony Fleets Without Missions: " + str(numColonyFleets) + + outpostTargetedPlanetIDs = getOutpostTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, empireID) + outpostTargetedPlanetIDs.extend( getOutpostTargetedPlanetIDs(universe.planetIDs, AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST, empireID)) allOutpostTargetedSystemIDs = PlanetUtilsAI.getSystems(outpostTargetedPlanetIDs) # export outpost targeted systems for other AI modules @@ -300,15 +303,68 @@ numOutpostFleets = len(FleetUtilsAI.extractFleetIDsWithoutMissionTypes(outpostFleetIDs)) print "Outpost Fleets Without Missions: " + str(numOutpostFleets) + + availablePP = dict( [ (tuple(el.key()), el.data() ) for el in empire.planetsWithAvailablePP ]) #keys are sets of ints; data is doubles + availPP_BySys={} + for pSet in availablePP: + availPP_BySys.update( [ (sysID, availablePP[pSet]) for sysID in set(PlanetUtilsAI.getSystems( pSet))] ) + colonyCost=120*(1+ 0.06*len( list(AIstate.popCtrIDs) )) + outpostCost=80*(1+ 0.06*len( list(AIstate.popCtrIDs) )) + productionQueue = empire.productionQueue + queuedBases=[] + for queue_index in range(0, len(productionQueue)): + element=productionQueue[queue_index] + if element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: + if foAI.foAIstate.getShipRole(element.designID) in [ EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST , + EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_COLONISATION ] : + buildPlanet = universe.getPlanet(element.locationID) + queuedBases.append(buildPlanet.systemID) evaluatedColonyPlanetIDs = list(set(unOwnedPlanetIDs).union(empireOutpostIDs) - set(colonyTargetedPlanetIDs) ) + + for pid in evaluatedColonyPlanetIDs: + if pid in foAI.foAIstate.qualifyingColonyBaseTargets: continue + planet = universe.getPlanet(pid) + if not planet: continue + sysID = planet.systemID + for pid2 in empireSpeciesSystems.get(sysID, {}).get('pids', []): + planet2 = universe.getPlanet(pid2) + if not planet2: continue + if planet2.speciesName in empireColonizers: + if outpostCost < 12 * availPP_BySys.get(sysID, 0): #TODO: consider different ratio + system=universe.getSystem(sysID) + for pid3 in system.planetIDs: + if (pid3 not in empirePopCtrs): + foAI.foAIstate.qualifyingColonyBaseTargets.setdefault(pid3, [pid2, -1]) + break + # print "Evaluated Colony PlanetIDs: " + str(evaluatedColonyPlanetIDs) - evaluatedOutpostPlanetIDs = list(set(unOwnedPlanetIDs) - set(outpostTargetedPlanetIDs)- set(colonyTargetedPlanetIDs)) + reservedBaseTargets = foAI.foAIstate.qualifyingColonyBaseTargets.keys() + for pid in (set(reservedBaseTargets) - set(outpostTargetedPlanetIDs)): + if pid not in unOwnedPlanetIDs: continue + if foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] != -1: continue #already building for here + loc = foAI.foAIstate.qualifyingColonyBaseTargets[pid][0] + if 100 < evaluatePlanet(pid, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, None, empire, []): + bestShip, colDesign, buildChoices = ProductionAI.getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_OUTPOST, loc) + if not bestShip: + print "Error: no outpost base can be built at ", PlanetUtilsAI.planetNameIDs([loc]) + continue + #print "selecting ", PlanetUtilsAI.planetNameIDs([pid]), " to build Orbital Defenses" + retval = fo.issueEnqueueShipProductionOrder(bestShip, loc) + print "Enqueueing Outpost Base at %s for %s"%( PlanetUtilsAI.planetNameIDs([loc]), PlanetUtilsAI.planetNameIDs([pid])) + if retval !=0: + foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] = loc + #res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + + evaluatedOutpostPlanetIDs = list(set(unOwnedPlanetIDs) - set(outpostTargetedPlanetIDs)- set(colonyTargetedPlanetIDs) - set(reservedBaseTargets)) + # print "Evaluated Outpost PlanetIDs: " + str(evaluatedOutpostPlanetIDs) - evaluatedColonyPlanets = assignColonisationValues(evaluatedColonyPlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, fleetSupplyablePlanetIDs, species, empire) - + evaluatedColonyPlanets = assignColonisationValues(evaluatedColonyPlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, fleetSupplyablePlanetIDs, None, empire) + allColonyOpportunities.clear() + allColonyOpportunities.update(assignColonisationValues(evaluatedColonyPlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION, fleetSupplyablePlanetIDs, None, empire, [], True)) + sortedPlanets = evaluatedColonyPlanets.items() sortedPlanets.sort(lambda x, y: cmp(x[1], y[1]), reverse=True) @@ -326,7 +382,7 @@ allOutpostFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_OUTPOST) AIstate.outpostFleetIDs = FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allOutpostFleetIDs) - evaluatedOutpostPlanets = assignColonisationValues(evaluatedOutpostPlanetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, species, empire) + evaluatedOutpostPlanets = assignColonisationValues(evaluatedOutpostPlanetIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, None, empire) #removeLowValuePlanets(evaluatedOutpostPlanets) sortedOutposts = evaluatedOutpostPlanets.items() @@ -377,38 +433,42 @@ return outpostTargetedPlanets -def assignColonyFleetsToColonise(): - # assign fleet targets to colonisable planets - sendColonyShips(AIstate.colonyFleetIDs, foAI.foAIstate.colonisablePlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION) - - # assign fleet targets to colonisable outposts - sendColonyShips(AIstate.outpostFleetIDs, foAI.foAIstate.colonisableOutpostIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST) - -def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire, detail=[]): #TODO: clean up supplyable versus annexable +def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire, detail=[], returnAll=False): #TODO: clean up supplyable versus annexable "creates a dictionary that takes planetIDs as key and their colonisation score as value" origDetail = detail planetValues = {} if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): print "\n=========\nAssigning Outpost Values\n=========" trySpecies = [ "" ] + elif species is not None: + print "\n=========\nAssigning Colony Values\n=========" + if isinstance(species, str): + trySpecies = [species] + elif isinstance(species, list): + trySpecies = species + else: + trySpecies = [species.name] else: print "\n=========\nAssigning Colony Values\n=========" trySpecies = list( empireColonizers ) for planetID in planetIDs: pv = [] for specName in trySpecies: - thisSpecies=fo.getSpecies(specName) detail = origDetail[:] - pv.append( (evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, thisSpecies, empire, detail), specName, list(detail)) ) - best = sorted(pv)[-1:] + pv.append( (evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, specName, empire, detail), specName, list(detail)) ) + allSorted = sorted(pv, reverse=True) + best = allSorted[:1] if best!=[]: - planetValues[planetID] = best[0][:2] - print best[0][2] + if returnAll: + planetValues[planetID] = allSorted + else: + planetValues[planetID] = best[0][:2] + print best[0][2] return planetValues -def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, species, empire, detail = []): +def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, specName, empire, detail = []): "returns the colonisation value of a planet" - # TODO: in planet evaluation consider specials and distance + species=fo.getSpecies(specName or "") #in case None is passed as specName if detail != []: detail = [] discountMultiplier = 20.0 @@ -798,7 +858,6 @@ return retval - def removeLowValuePlanets(evaluatedPlanets): "removes all planets with a colonisation value < minimalColoniseValue" @@ -815,22 +874,73 @@ #print "removing ", removeIDs for ID in removeIDs: del evaluatedPlanets[ID] +def assignColonyFleetsToColonise(): + + universe = fo.getUniverse() + empire = fo.getEmpire() + empireID = empire.empireID + fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs + fleetSupplyablePlanetIDs = PlanetUtilsAI.getPlanetsInSystemsIDs(fleetSupplyableSystemIDs) + + allOutpostBaseFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST) + availOutpostBaseFleetIDs = FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allOutpostBaseFleetIDs) + for fid in availOutpostBaseFleetIDs: + fleet = universe.getFleet(fid) + if not fleet: continue + sysID = fleet.systemID + system = universe.getSystem(sysID) + availPlanets = set(system.planetIDs).intersection(set( foAI.foAIstate.qualifyingColonyBaseTargets.keys())) + targets = [pid for pid in availPlanets if foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] != -1 ] + if not targets: + print "Error found no valid target for outpost base in system %s (%d)"%(system.name, sysID) + continue + + targetID=-1 + bestScore=-1 + for pid, rating in assignColonisationValues(targets, AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, None, empire).items(): + if rating[0]>bestScore: + bestScore = rating[0] + targetID = pid + foAI.foAIstate.qualifyingColonyBaseTargets[targetID][1] = -1 #TODO: should probably delete + aiTarget = AITarget.AITarget(AITargetType.TARGET_PLANET, targetID) + aiFleetMission = foAI.foAIstate.getAIFleetMission(fid) + aiFleetMission.addAITarget(AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST, aiTarget) + + # assign fleet targets to colonisable planets + sendColonyShips(AIstate.colonyFleetIDs, foAI.foAIstate.colonisablePlanetIDs, AIFleetMissionType.FLEET_MISSION_COLONISATION) + + # assign fleet targets to colonisable outposts + sendColonyShips(AIstate.outpostFleetIDs, foAI.foAIstate.colonisableOutpostIDs, AIFleetMissionType.FLEET_MISSION_OUTPOST) + + def sendColonyShips(colonyFleetIDs, evaluatedPlanets, missionType): "sends a list of colony ships to a list of planet_value_pairs" fleetPool = colonyFleetIDs[:] + tryAll=False if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): cost = 20+AIDependencies.outpostPodCost * ( 1 + len(AIstate.popCtrIDs)*AIDependencies.colonyPodUpkeep ) else: + tryAll=True cost = 20+AIDependencies.colonyPodCost * ( 1 + len(AIstate.popCtrIDs)*AIDependencies.colonyPodUpkeep ) - if fo.currentTurn() < 30: + if fo.currentTurn() < 50: cost *= 0.4 #will be making fast tech progress so value is underestimated - elif fo.currentTurn() < 60: + elif fo.currentTurn() < 80: cost *= 0.8 #will be making fast-ish tech progress so value is underestimated potentialTargets = [ (pid, (score, specName) ) for (pid, (score, specName) ) in evaluatedPlanets if score > (0.8 * cost) ] print "colony/outpost ship matching -- fleets %s to planets %s"%( fleetPool, evaluatedPlanets) + if tryAll: + print "trying best matches to current colony ships" + bestScores= dict(evaluatedPlanets) + potentialTargets = [] + for pid, ratings in allColonyOpportunities.items(): + for rating in ratings: + if rating[0] >= 0.75 * bestScores.get(pid, [9999])[0]: + potentialTargets.append( (pid, rating ) ) + potentialTargets.sort(lambda x, y: cmp(x[1], y[1]), reverse=True) + #adding a lot of checking here because have been getting mysterious exception, after too many recursions to get info fleetPool=set(fleetPool) universe=fo.getUniverse() @@ -851,16 +961,22 @@ reportStr += "%s, "%ship.speciesName print reportStr print + alreadyTargeted = [] #for planetID_value_pair in evaluatedPlanets: while (len(fleetPool) > 0 ) and ( len(potentialTargets) >0): thisTarget = potentialTargets.pop(0) + if thisTarget in alreadyTargeted: + continue thisScore=thisTarget[1][0] thisPlanetID=thisTarget[0] + if thisPlanetID in alreadyTargeted: + continue thisPlanet = universe.getPlanet(thisPlanetID) print "checking pool %s against target %s current owner %s targetSpec %s"%(fleetPool, thisPlanet.name, thisPlanet.owner, thisTarget) thisSysID = thisPlanet.systemID if (foAI.foAIstate.systemStatus.setdefault(thisSysID, {}).setdefault('monsterThreat', 0) > 2000) or (fo.currentTurn() <20 and foAI.foAIstate.systemStatus[thisSysID]['monsterThreat'] > 200): print "Skipping colonization of system %s due to Big Monster, threat %d"%(PlanetUtilsAI.sysNameIDs([thisSysID]), foAI.foAIstate.systemStatus[thisSysID]['monsterThreat']) + alreadyTargeted.append( thisPlanetID ) continue thisSpec=thisTarget[1][1] foundFleets=[] @@ -873,6 +989,7 @@ fleetPool.update(foundFleets)#just to be safe continue #must have no compatible colony/outpost ships fleetID = thisFleetList[0] + alreadyTargeted.append( thisPlanetID ) aiTarget = AITarget.AITarget(AITargetType.TARGET_PLANET, thisPlanetID) aiFleetMission = foAI.foAIstate.getAIFleetMission(fleetID) Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-05-23 07:22:06 UTC (rev 6057) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-05-23 10:19:34 UTC (rev 6058) @@ -219,7 +219,7 @@ "returns a ship with the specified role in the fleet" if not fleetHasShipWithRole(fleetID, shipRole): - print "No ship with role " + shipRole + " found." + print "No ship with role " + __AIShipRoleTypeNames.name(shipRole) + " found." return None universe = fo.getUniverse() @@ -386,6 +386,7 @@ print "Invasion Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVASION)) print "Military Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY)) print "Orbital Defense Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE)) + print "Outpost Base Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST)) print "Securing Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_SECURE)) + " (currently FLEET_MISSION_MILITARY should be used instead of this Role)" print "Unclassifyable Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVALID)) @@ -420,6 +421,14 @@ for outpostAIFleetMission in outpostAIFleetMissions: print " " + str(outpostAIFleetMission) + outpostBaseAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST]) + if len( outpostBaseAIFleetMissions) >0: + print "Outpost Base targets (must have been interrupted by combat): " + else: + print "Outpost targets: None (as expected, due to expected timing of order submission and execution)" + for outpostAIFleetMission in outpostBaseAIFleetMissions: + print " " + str(outpostAIFleetMission) + invasionAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_INVASION]) if len( invasionAIFleetMissions) >0: print "Invasion targets: " Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2013-05-23 07:22:06 UTC (rev 6057) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2013-05-23 10:19:34 UTC (rev 6058) @@ -182,10 +182,10 @@ specName=planet.speciesName species=fo.getSpecies(specName) if not species: #TODO: iterate over this Empire's available species with which it could colonize after and invasion - planetEval = ColonisationAI.assignColonisationValues([planetID], EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], species, empire, detail) #evaluatePlanet is imported from ColonisationAI - popVal = max( 0.5*planetEval[planetID][0], ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, [planetID], species, empire, detail) ) + planetEval = ColonisationAI.assignColonisationValues([planetID], EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], None, empire, detail) #evaluatePlanet is imported from ColonisationAI + popVal = max( 0.75*planetEval.get(planetID, [0])[0], ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, [planetID], None, empire, detail) ) else: - popVal = ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], species, empire, detail) #evaluatePlanet is imported from ColonisationAI + popVal = ColonisationAI.evaluatePlanet(planetID, EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION, [planetID], specName, empire, detail) #evaluatePlanet is imported from ColonisationAI bldTally=0 for bldType in [universe.getObject(bldg).buildingTypeName for bldg in planet.buildingIDs]: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-23 07:22:06 UTC (rev 6057) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-05-23 10:19:34 UTC (rev 6058) @@ -17,6 +17,7 @@ bestMilRatingsHistory={} shipTypeMap = { EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION: EnumsAI.AIShipDesignTypes.explorationShip, EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_OUTPOST: EnumsAI.AIShipDesignTypes.outpostShip, + EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_OUTPOST: EnumsAI.AIShipDesignTypes.outpostBase, EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_COLONISATION: EnumsAI.AIShipDesignTypes.colonyShip, EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_INVASION: EnumsAI.AIShipDesignTypes.troopShip, EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_MILITARY: EnumsAI.AIShipDesignTypes.attackShip, @@ -1110,12 +1111,14 @@ queuedColonyShips[thisSpec] = queuedColonyShips.get(thisSpec, 0) + element.remaining*element.blocksize if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_OUTPOST: queuedOutpostShips+= element.remaining*element.blocksize + if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST: + queuedOutpostShips+= element.remaining*element.blocksize if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_MILITARY_INVASION: queuedTroopShips+= element.remaining*element.blocksize if queuedColonyShips: print "\nFound colony ships in build queue: %s"%queuedColonyShips if queuedOutpostShips: - print "\nFound colony ships in build queue: %s"%queuedOutpostShips + print "\nFound outpost ships and bases in build queue: %s"%(queuedOutpostShips) for queue_index in dequeueList[::-1]: fo.issueDequeueProductionOrder(queue_index) @@ -1213,10 +1216,10 @@ planetsWithWastedPP = set( [tuple(pidset) for pidset in empire.planetsWithWastedPP ] ) print "availPP ( <systems> : pp ):" for pSet in availablePP: - print "\t%s\t%.2f"%( PlanetUtilsAI.sysNameIDs(set(PlanetUtilsAI.getSystems( sorted(pSet)))), availablePP[pSet]) + print "\t%s\t%.2f"%( PlanetUtilsAI.sysNameIDs(set(PlanetUtilsAI.getSystems( pSet))), availablePP[pSet]) print "\nallocatedPP ( <systems> : pp ):" for pSet in allocatedPP: - print "\t%s\t%.2f"%( PlanetUtilsAI.sysNameIDs(set(PlanetUtilsAI.getSystems( sorted(pSet)))), allocatedPP[pSet]) + print "\t%s\t%.2f"%( PlanetUtilsAI.sysNameIDs(set(PlanetUtilsAI.getSystems( pSet))), allocatedPP[pSet]) print "\n\nBuilding Ships in system groups with remaining PP:" for pSet in planetsWithWastedPP: @@ -1224,7 +1227,7 @@ availPP = totalPP - allocatedPP.get(pSet, 0) if availPP <=0.01: continue - print "%.2f PP remaining in system group: %s"%(availPP, PlanetUtilsAI.sysNameIDs(set(PlanetUtilsAI.getSystems( sorted(pSet))))) + print "%.2f PP remaining in system group: %s"%(availPP, PlanetUtilsAI.sysNameIDs(set(PlanetUtilsAI.getSystems( pSet)))) print "\t owned planets in this group are:" print "\t %s"%( PlanetUtilsAI.planetNameIDs(pSet) ) bestShip, bestDesign, buildChoices = getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, list(pSet)) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-05-23 07:22:06 UTC (rev 6057) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-05-23 10:19:34 UTC (rev 6058) @@ -29,7 +29,7 @@ def primaryMetaTechsList(index=0): "primary techs for all categories" #index=1-index - #index=0 + #index=1 if index == 0: primaryMetaTechs = [ "SHP_WEAPON_1_2", @@ -49,19 +49,21 @@ "LRN_FORCE_FIELD", "CON_ORBITAL_CON", "PRO_ORBITAL_GEN", + "SHP_ZORTRIUM_PLATE", "GRO_SYMBIOTIC_BIO", "SHP_WEAPON_2_1", "SHP_WEAPON_2_2", "PRO_INDUSTRY_CENTER_I", "SHP_DEFLECTOR_SHIELD", "SHP_WEAPON_2_3", + "DEF_DEFENSE_NET_2", + "DEF_DEFENSE_NET_REGEN_1", + "SPY_DETECT_2", + "PRO_INDUSTRY_CENTER_II", + "PRO_SOL_ORB_GEN", "GRO_GENETIC_ENG", "GRO_XENO_GENETICS", - "SPY_DETECT_2", - "DEF_DEFENSE_NET_2", - "PRO_SOL_ORB_GEN", "SHP_WEAPON_2_4", - "SHP_ZORTRIUM_PLATE", "DEF_GARRISON_2", "CON_METRO_INFRA", "LRN_QUANT_NET", @@ -72,9 +74,7 @@ "SHP_MULTICELL_CAST", "SHP_WEAPON_3_4", "SHP_ENDOCRINE_SYSTEMS", - "DEF_DEFENSE_NET_REGEN_1", "DEF_PLAN_BARRIER_SHLD_1", - "PRO_INDUSTRY_CENTER_II", "CON_FRC_ENRG_STRC", "SPY_DETECT_3", "DEF_PLAN_BARRIER_SHLD_2", @@ -171,12 +171,14 @@ "PRO_MICROGRAV_MAN", "SHP_ASTEROID_HULLS", "SHP_DEFLECTOR_SHIELD", + "DEF_DEFENSE_NET_2", + "DEF_DEFENSE_NET_REGEN_1", + "SPY_DETECT_2", + "PRO_INDUSTRY_CENTER_II", + "PRO_SOL_ORB_GEN", "SHP_WEAPON_2_3", "GRO_GENETIC_ENG", "GRO_XENO_GENETICS", - "SPY_DETECT_2", - "DEF_DEFENSE_NET_2", - "PRO_SOL_ORB_GEN", "SHP_WEAPON_2_4", "DEF_GARRISON_2", "CON_METRO_INFRA", @@ -189,9 +191,7 @@ "SHP_WEAPON_3_4", "SHP_ENDOCRINE_SYSTEMS", "SHP_DIAMOND_PLATE", - "DEF_DEFENSE_NET_REGEN_1", "DEF_PLAN_BARRIER_SHLD_1", - "PRO_INDUSTRY_CENTER_II", "CON_FRC_ENRG_STRC", "SPY_DETECT_3", "DEF_PLAN_BARRIER_SHLD_2", |
From: <dil...@us...> - 2013-05-24 20:07:46
|
Revision: 6064 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6064&view=rev Author: dilvish-fo Date: 2013-05-24 20:07:37 +0000 (Fri, 24 May 2013) Log Message: ----------- Minor AI adjustment Modified Paths: -------------- trunk/FreeOrion/default/AI/AIDependencies.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/AIDependencies.py =================================================================== --- trunk/FreeOrion/default/AI/AIDependencies.py 2013-05-24 11:12:18 UTC (rev 6063) +++ trunk/FreeOrion/default/AI/AIDependencies.py 2013-05-24 20:07:37 UTC (rev 6064) @@ -13,6 +13,8 @@ colonyPodCost = 120 colonyPodUpkeep = 0.06 outpostPodCost = 80 -shipUpkeep = 0.05 +shipUpkeep = 0.01 +outposting_tech = "CON_ENV_ENCAPSUL" + Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-05-24 11:12:18 UTC (rev 6063) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-05-24 20:07:37 UTC (rev 6064) @@ -308,8 +308,8 @@ availPP_BySys={} for pSet in availablePP: availPP_BySys.update( [ (sysID, availablePP[pSet]) for sysID in set(PlanetUtilsAI.getSystems( pSet))] ) - colonyCost=120*(1+ 0.06*len( list(AIstate.popCtrIDs) )) - outpostCost=80*(1+ 0.06*len( list(AIstate.popCtrIDs) )) + colonyCost= AIDependencies.colonyPodCost *(1+ AIDependencies.colonyPodUpkeep *len( list(AIstate.popCtrIDs) )) + outpostCost= AIDependencies.outpostPodCost *(1+ AIDependencies.colonyPodUpkeep *len( list(AIstate.popCtrIDs) )) productionQueue = empire.productionQueue queuedBases=[] for queue_index in range(0, len(productionQueue)): @@ -341,21 +341,22 @@ # print "Evaluated Colony PlanetIDs: " + str(evaluatedColonyPlanetIDs) reservedBaseTargets = foAI.foAIstate.qualifyingColonyBaseTargets.keys() - for pid in (set(reservedBaseTargets) - set(outpostTargetedPlanetIDs)): - if pid not in unOwnedPlanetIDs: continue - if foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] != -1: continue #already building for here - loc = foAI.foAIstate.qualifyingColonyBaseTargets[pid][0] - if 100 < evaluatePlanet(pid, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, None, empire, []): - bestShip, colDesign, buildChoices = ProductionAI.getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_OUTPOST, loc) - if not bestShip: - print "Error: no outpost base can be built at ", PlanetUtilsAI.planetNameIDs([loc]) - continue - #print "selecting ", PlanetUtilsAI.planetNameIDs([pid]), " to build Orbital Defenses" - retval = fo.issueEnqueueShipProductionOrder(bestShip, loc) - print "Enqueueing Outpost Base at %s for %s"%( PlanetUtilsAI.planetNameIDs([loc]), PlanetUtilsAI.planetNameIDs([pid])) - if retval !=0: - foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] = loc - #res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + if ( empire.getTechStatus(AIDependencies.outposting_tech) == fo.techStatus.complete): + for pid in (set(reservedBaseTargets) - set(outpostTargetedPlanetIDs)): + if pid not in unOwnedPlanetIDs: continue + if foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] != -1: continue #already building for here + loc = foAI.foAIstate.qualifyingColonyBaseTargets[pid][0] + if 100 < evaluatePlanet(pid, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, None, empire, []): + bestShip, colDesign, buildChoices = ProductionAI.getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_OUTPOST, loc) + if not bestShip: + print "Error: no outpost base can be built at ", PlanetUtilsAI.planetNameIDs([loc]) + continue + #print "selecting ", PlanetUtilsAI.planetNameIDs([pid]), " to build Orbital Defenses" + retval = fo.issueEnqueueShipProductionOrder(bestShip, loc) + print "Enqueueing Outpost Base at %s for %s"%( PlanetUtilsAI.planetNameIDs([loc]), PlanetUtilsAI.planetNameIDs([pid])) + if retval !=0: + foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] = loc + #res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front evaluatedOutpostPlanetIDs = list(set(unOwnedPlanetIDs) - set(outpostTargetedPlanetIDs)- set(colonyTargetedPlanetIDs) - set(reservedBaseTargets)) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-05-24 11:12:18 UTC (rev 6063) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-05-24 20:07:37 UTC (rev 6064) @@ -45,6 +45,7 @@ "CON_ENV_ENCAPSUL", "DEF_DEFENSE_NET_1", "PRO_FUSION_GEN", + "PRO_INDUSTRY_CENTER_I", "DEF_GARRISON_1", "LRN_FORCE_FIELD", "CON_ORBITAL_CON", @@ -53,7 +54,6 @@ "GRO_SYMBIOTIC_BIO", "SHP_WEAPON_2_1", "SHP_WEAPON_2_2", - "PRO_INDUSTRY_CENTER_I", "SHP_DEFLECTOR_SHIELD", "SHP_WEAPON_2_3", "DEF_DEFENSE_NET_2", @@ -159,20 +159,20 @@ "CON_ENV_ENCAPSUL", "DEF_DEFENSE_NET_1", "PRO_FUSION_GEN", + "PRO_INDUSTRY_CENTER_I", "DEF_GARRISON_1", - "LRN_FORCE_FIELD", "CON_ORBITAL_CON", "PRO_ORBITAL_GEN", - "SHP_ZORTRIUM_PLATE", + "PRO_MICROGRAV_MAN", + "SHP_ASTEROID_HULLS", + "LRN_FORCE_FIELD", "GRO_SYMBIOTIC_BIO", "SHP_WEAPON_2_1", "SHP_WEAPON_2_2", - "PRO_INDUSTRY_CENTER_I", - "PRO_MICROGRAV_MAN", - "SHP_ASTEROID_HULLS", "SHP_DEFLECTOR_SHIELD", "DEF_DEFENSE_NET_2", "DEF_DEFENSE_NET_REGEN_1", + "SHP_ZORTRIUM_PLATE", "SPY_DETECT_2", "PRO_INDUSTRY_CENTER_II", "PRO_SOL_ORB_GEN", |
From: <dil...@us...> - 2013-06-03 17:34:08
|
Revision: 6104 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6104&view=rev Author: dilvish-fo Date: 2013-06-03 17:34:01 +0000 (Mon, 03 Jun 2013) Log Message: ----------- AI tweaks Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-03 15:54:40 UTC (rev 6103) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-03 17:34:01 UTC (rev 6104) @@ -999,20 +999,30 @@ tInd=planet.currentMeterValue(fo.meterType.targetIndustry) cInd=planet.currentMeterValue(fo.meterType.industry) cPop = planet.currentMeterValue(fo.meterType.population) - if (cPop < 23) or cPop < 0.8*tPop: #check even if not aggressive, etc, just in case acquired planet with a ConcCamp on it + if (cPop <= 35) or (cPop < 0.8*tPop) or ( (planet.speciesName not in ColonisationAI.empireColonizers) and cPop < 50 ): #check even if not aggressive, etc, just in case acquired planet with a ConcCamp on it for bldg in planet.buildingIDs: if universe.getObject(bldg).buildingTypeName == bldName: res=fo.issueScrapOrder( bldg) print "Tried scrapping %s at planet %s, got result %d"%(bldName, planet.name, res) - elif foAI.foAIstate.aggression>fo.aggression.typical and empire.buildingTypeAvailable(bldName) and (tPop >= 32) : + elif foAI.foAIstate.aggression>fo.aggression.typical and empire.buildingTypeAvailable(bldName) and (tPop >= 36) : if (planet.focus== EnumsAI.AIFocusType.FOCUS_GROWTH) or ("COMPUTRONIUM_SPECIAL" in planet.specials): #continue pass # now that focus setting takes these into account, probably works ok to have conc camp queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] - if (cPop >=0.95*tPop):# and cInd < 1.5* tInd: + if (cPop >=0.95*tPop) and( (planet.speciesName in ColonisationAI.empireColonizers) or cPop >= 50 ):# if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building - #if planet.focus not in [ EnumsAI.AIFocusType.FOCUS_INDUSTRY ]: - # fo.issueChangeFocusOrder(pid, EnumsAI.AIFocusType.FOCUS_INDUSTRY) + if planet.focus in [ EnumsAI.AIFocusType.FOCUS_INDUSTRY ]: + if cInd >= tInd+cPop: + continue + else: + oldFocus=planet.focus + fo.issueChangeFocusOrder(pid, EnumsAI.AIFocusType.FOCUS_INDUSTRY) + universe.updateMeterEstimates([pid]) + tInd=planet.currentMeterValue(fo.meterType.targetIndustry) + if cInd >= tInd+cPop: + fo.issueChangeFocusOrder(pid, oldFocus) + universe.updateMeterEstimates([pid]) + continue res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, universe.getPlanet(pid).name, res) if res: Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-06-03 15:54:40 UTC (rev 6103) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-06-03 17:34:01 UTC (rev 6104) @@ -49,34 +49,39 @@ "DEF_GARRISON_1", "LRN_FORCE_FIELD", "CON_ORBITAL_CON", + "GRO_SYMBIOTIC_BIO", "PRO_ORBITAL_GEN", "SHP_ZORTRIUM_PLATE", - "GRO_SYMBIOTIC_BIO", "SHP_WEAPON_2_1", "SHP_WEAPON_2_2", + "SHP_WEAPON_2_3", + "SPY_DETECT_2", "SHP_DEFLECTOR_SHIELD", - "SHP_WEAPON_2_3", "DEF_DEFENSE_NET_2", "DEF_DEFENSE_NET_REGEN_1", - "SPY_DETECT_2", + "SHP_REINFORCED_HULL", "PRO_INDUSTRY_CENTER_II", + "SHP_BASIC_DAM_CONT", "PRO_SOL_ORB_GEN", "GRO_GENETIC_ENG", "GRO_XENO_GENETICS", "SHP_WEAPON_2_4", "DEF_GARRISON_2", "CON_METRO_INFRA", - "LRN_QUANT_NET", "SHP_WEAPON_3_1", + "SHP_DIAMOND_PLATE", "GRO_LIFECYCLE_MAN", + "SHP_MULTICELL_CAST", + "SHP_ENDOCRINE_SYSTEMS", "SHP_WEAPON_3_2", "SHP_WEAPON_3_3", - "SHP_MULTICELL_CAST", "SHP_WEAPON_3_4", - "SHP_ENDOCRINE_SYSTEMS", + "PRO_MICROGRAV_MAN", "DEF_PLAN_BARRIER_SHLD_1", "CON_FRC_ENRG_STRC", "SPY_DETECT_3", + "SHP_ADV_DAM_CONT", + "LRN_QUANT_NET", "DEF_PLAN_BARRIER_SHLD_2", "LRN_GRAVITONICS", "CON_CONTGRAV_ARCH", @@ -85,7 +90,6 @@ "PRO_SENTIENT_AUTOMATION", "PRO_EXOBOTS", "LRN_XENOARCH", - "SHP_DIAMOND_PLATE", "DEF_DEFENSE_NET_3", "DEF_SYST_DEF_MINE_1", "DEF_PLAN_BARRIER_SHLD_3", @@ -95,41 +99,38 @@ "SHP_MONOCELL_EXP", "SHP_BIOADAPTIVE_SPEC", "PRO_SINGULAR_GEN", + "CON_NDIM_STRC", "SHP_PLASMA_SHIELD", - "PRO_MICROGRAV_MAN", "GRO_XENO_HYBRIDS", + "SHP_CONT_BIOADAPT", + "SHP_SENT_HULL", "LRN_TIME_MECH", "LRN_STELLAR_TOMOGRAPHY", + "SHP_XENTRONIUM_PLATE", + "GRO_CYBORG", + "GRO_ENERGY_META", + "LRN_ENCLAVE_VOID", "SPY_DETECT_4", - "LRN_ENCLAVE_VOID", + "SHP_WEAPON_4_1", + "SHP_WEAPON_4_2", "LRN_PSY_DOM", - "CON_NDIM_STRC", - "LRN_ART_BLACK_HOLE", + "SHP_WEAPON_4_3", "LRN_DISTRIB_THOUGHT", "PRO_NEUTRONIUM_EXTRACTION", - "SHP_XENTRONIUM_PLATE", "SHP_ASTEROID_HULLS", "GRO_TERRAFORM", "GRO_GENETIC_MED", "SHP_INTSTEL_LOG", - "SHP_REINFORCED_HULL", - "SHP_CONT_BIOADAPT", "SPY_STEALTH_1", - "GRO_CYBORG", - "SHP_BASIC_DAM_CONT", "CON_CONC_CAMP", "PRO_INDUSTRY_CENTER_III", - "SHP_SENT_HULL", "SPY_STEALTH_2", "DEF_SYST_DEF_MINE_2", - "SHP_ADV_DAM_CONT", - "SHP_WEAPON_4_1", - "SHP_WEAPON_4_2", - "SHP_WEAPON_4_3", "DEF_SYST_DEF_MINE_3", "SPY_STEALTH_3", "SPY_DETECT_5", "SHP_WEAPON_4_4", + "LRN_ART_BLACK_HOLE", "SHP_BLACKSHIELD", "DEF_GARRISON_4", "DEF_DEFENSE_NET_REGEN_2", @@ -140,7 +141,6 @@ "GRO_GAIA_TRANS", "GRO_ENERGY_META", "CON_ART_PLANET", - "GRO_ENERGY_META", "SHP_SOLAR_CONT", ] #"SHP_ENDOSYMB_HULL", @@ -169,30 +169,33 @@ "GRO_SYMBIOTIC_BIO", "SHP_WEAPON_2_1", "SHP_WEAPON_2_2", + "SHP_WEAPON_2_3", + "SPY_DETECT_2", "SHP_DEFLECTOR_SHIELD", "DEF_DEFENSE_NET_2", "DEF_DEFENSE_NET_REGEN_1", "SHP_ZORTRIUM_PLATE", - "SPY_DETECT_2", "PRO_INDUSTRY_CENTER_II", + "SHP_REINFORCED_HULL", + "SHP_BASIC_DAM_CONT", "PRO_SOL_ORB_GEN", - "SHP_WEAPON_2_3", "GRO_GENETIC_ENG", "GRO_XENO_GENETICS", "SHP_WEAPON_2_4", "DEF_GARRISON_2", "CON_METRO_INFRA", - "LRN_QUANT_NET", "SHP_WEAPON_3_1", + "SHP_DIAMOND_PLATE", "GRO_LIFECYCLE_MAN", + "SHP_MULTICELL_CAST", + "SHP_ENDOCRINE_SYSTEMS", "SHP_WEAPON_3_2", "SHP_WEAPON_3_3", - "SHP_MULTICELL_CAST", "SHP_WEAPON_3_4", - "SHP_ENDOCRINE_SYSTEMS", - "SHP_DIAMOND_PLATE", "DEF_PLAN_BARRIER_SHLD_1", "CON_FRC_ENRG_STRC", + "SHP_ADV_DAM_CONT", + "LRN_QUANT_NET", "SPY_DETECT_3", "DEF_PLAN_BARRIER_SHLD_2", "LRN_GRAVITONICS", @@ -213,37 +216,35 @@ "PRO_SINGULAR_GEN", "SHP_PLASMA_SHIELD", "GRO_XENO_HYBRIDS", + "SHP_CONT_BIOADAPT", + "SHP_SENT_HULL", "LRN_TIME_MECH", "LRN_STELLAR_TOMOGRAPHY", + "SHP_XENTRONIUM_PLATE", + "GRO_CYBORG", + "GRO_ENERGY_META", + "LRN_ENCLAVE_VOID", "SPY_DETECT_4", - "LRN_ENCLAVE_VOID", + "SHP_WEAPON_4_1", + "SHP_WEAPON_4_2", "LRN_PSY_DOM", "CON_NDIM_STRC", - "LRN_ART_BLACK_HOLE", + "SHP_WEAPON_4_3", "LRN_DISTRIB_THOUGHT", "PRO_NEUTRONIUM_EXTRACTION", - "SHP_XENTRONIUM_PLATE", "GRO_TERRAFORM", "GRO_GENETIC_MED", "SHP_INTSTEL_LOG", - "SHP_REINFORCED_HULL", - "SHP_CONT_BIOADAPT", "SPY_STEALTH_1", - "GRO_CYBORG", - "SHP_BASIC_DAM_CONT", "CON_CONC_CAMP", "PRO_INDUSTRY_CENTER_III", - "SHP_SENT_HULL", "SPY_STEALTH_2", "DEF_SYST_DEF_MINE_2", - "SHP_ADV_DAM_CONT", - "SHP_WEAPON_4_1", - "SHP_WEAPON_4_2", - "SHP_WEAPON_4_3", "DEF_SYST_DEF_MINE_3", "SPY_STEALTH_3", "SPY_DETECT_5", "SHP_WEAPON_4_4", + "LRN_ART_BLACK_HOLE", "SHP_BLACKSHIELD", "DEF_GARRISON_4", "DEF_DEFENSE_NET_REGEN_2", @@ -254,16 +255,15 @@ "GRO_GAIA_TRANS", "GRO_ENERGY_META", "CON_ART_PLANET", - "GRO_ENERGY_META", "SHP_SOLAR_CONT", ] - #"CON_FRC_ENRG_STRC", #"CON_FRC_ENRG_CAMO", #"SHP_TITAN_HULL" return primaryMetaTechs -MasterTechList=[ # just for reference +#the following is just for reference +MasterTechList= """ "CON_ARCH_MONOFILS", "CON_ARCH_PSYCH", "CON_ART_HEAVENLY", @@ -437,4 +437,5 @@ "SPY_STEALTH_2", "SPY_STEALTH_3", "SPY_STEALTH_4", - ] + """ +pass |
From: <dil...@us...> - 2013-06-19 20:43:46
|
Revision: 6171 http://sourceforge.net/p/freeorion/code/6171 Author: dilvish-fo Date: 2013-06-19 20:43:42 +0000 (Wed, 19 Jun 2013) Log Message: ----------- -some tweaks to AI research, and adjustments to reduce some AI logging -reorganized charting script to process large log files more efficiently Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py 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/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py trunk/FreeOrion/default/AI/TechsListsAI.py trunk/FreeOrion/default/AI/charting/charts.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -260,7 +260,7 @@ #for aiFleetOrder2 in self.getAIFleetOrders(): # print "\t\t %s"%aiFleetOrder2 for aiFleetOrder in self.getAIFleetOrders(): - print " %s"%(aiFleetOrder) + #print " %s"%(aiFleetOrder) clearAll=False if aiFleetOrder.getAIFleetOrderType() in [EnumsAI.AIFleetOrderType.ORDER_COLONISE, EnumsAI.AIFleetOrderType.ORDER_OUTPOST]:#TODO: invasion? universe=fo.getUniverse() @@ -273,6 +273,7 @@ elif not planet.unowned: clearAll =True if clearAll: + print " %s"%(aiFleetOrder) print "Fleet %d had a target planet that is no longer valid for this mission; aborting."%(self.getAITargetID() ) self.clearAIFleetOrders() self.clearAITargets(([-1]+ self.getAIMissionTypes()[:1])[-1]) Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -114,9 +114,10 @@ invasionTargets[:]=[] ExplorationAI.graphFlags.clear() - print "-------------------------------------------------" - print "Border Exploration Update" - print "-------------------------------------------------" + if fo.currentTurn() < 50: + print "-------------------------------------------------" + print "Border Exploration Update" + print "-------------------------------------------------" for sysID in list(self.visBorderSystemIDs): ExplorationAI.followVisSystemConnections(sysID, self.origHomeSystemID) newlyExplored = ExplorationAI.updateExploredSystems() @@ -175,6 +176,8 @@ del self.__fleetRoleByID[fleetID] def reportSystemThreats(self, sysIDList=None): + if fo.currentTurn() >= 50: + return universe = fo.getUniverse() if sysIDList is None: sysIDList = sorted( universe.systemIDs )# will normally look at this, the list of all known systems Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -372,7 +372,8 @@ print "" print "Settleable Colony Planets (score,species) | ID | Name | Specials:" for ID, score in sortedPlanets: - print " %15s | %5s | %s | %s "%(score, ID, universe.getPlanet(ID).name , list(universe.getPlanet(ID).specials)) + if score > 0.5: + print " %15s | %5s | %s | %s "%(score, ID, universe.getPlanet(ID).name , list(universe.getPlanet(ID).specials)) print "" sortedPlanets = [(ID, score) for ID, score in sortedPlanets if score[0] > 0] @@ -391,7 +392,8 @@ print "Settleable Outpost PlanetIDs:" for ID, score in sortedOutposts: - print " %5s | %5s | %s | %s "%(score, ID, universe.getPlanet(ID).name , list(universe.getPlanet(ID).specials)) + if score > 0.5: + print " %5s | %5s | %s | %s "%(score, ID, universe.getPlanet(ID).name , list(universe.getPlanet(ID).specials)) print "" sortedOutposts = [(ID, score) for ID, score in sortedOutposts if score[0] > 0] @@ -439,10 +441,10 @@ origDetail = detail planetValues = {} if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): - print "\n=========\nAssigning Outpost Values\n=========" + #print "\n=========\nAssigning Outpost Values\n=========" trySpecies = [ "" ] elif species is not None: - print "\n=========\nAssigning Colony Values\n=========" + #print "\n=========\nAssigning Colony Values\n=========" if isinstance(species, str): trySpecies = [species] elif isinstance(species, list): @@ -450,7 +452,7 @@ else: trySpecies = [species.name] else: - print "\n=========\nAssigning Colony Values\n=========" + #print "\n=========\nAssigning Colony Values\n=========" trySpecies = list( empireColonizers ) for planetID in planetIDs: pv = [] @@ -464,7 +466,7 @@ planetValues[planetID] = allSorted else: planetValues[planetID] = best[0][:2] - print best[0][2] + #print best[0][2] return planetValues def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, specName, empire, detail = []): @@ -670,8 +672,8 @@ elif tagType =="RESEARCH": resTagMod = grade - if AITags != "": - print "Species %s has AITags %s"%(specName, AITags) + #if AITags != "": + # print "Species %s has AITags %s"%(specName, AITags) retval += fixedRes retval += colonyStarBonus Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -152,7 +152,8 @@ preVis = "an interior system" else: preVis = "an unknown system" - print "*** system ID %d ( %s ) ; previously %s, new visibility_turns vector is %s "%(curSystemID, sysName, preVis, [turn for turn in universe.getVisibilityTurns(curSystemID, empireID)]) + if fo.currentTurn() < 50: + print "*** system ID %d ( %s ) ; previously %s, new visibility_turns vector is %s "%(curSystemID, sysName, preVis, [turn for turn in universe.getVisibilityTurns(curSystemID, empireID)]) statusStr = "*** system ID %d ( %s ) ; "%(curSystemID, sysName) isVisible = ( universe.getVisibilityTurns(curSystemID, empireID)[fo.visibility.partial] > 0 ) # more precisely, this means HAS BEEN visible #print "previous visTurns result: %s"% ([val for val in universe.getVisibilityTurns(curSystemID, empireID)], ) @@ -175,7 +176,8 @@ sysStatus['neighbors']=sysNeighbors neighbors=sysStatus['neighbors'].keys() sysPlanets=sysStatus.get('planets', {}) - print " previously knew of system %d planets %s"%(curSystemID, sysPlanets.keys()) + if fo.currentTurn() < 50: + print " previously knew of system %d planets %s"%(curSystemID, sysPlanets.keys()) if system: for planet in system.planetIDs: targPop=sysPlanets.setdefault(planet, {}).setdefault('targetPop',0) @@ -184,14 +186,17 @@ if planetObj: newPop=planetObj.currentMeterValue(fo.meterType.targetPopulation) if newPop != sysPlanets[planet]['targetPop']: - print " * updating targetPop of planet %d ( %s ) to %.2f from %.2f"%(planet, planetObj.name, newPop, sysPlanets[planet]['targetPop']) + if fo.currentTurn() < 50: + print " * updating targetPop of planet %d ( %s ) to %.2f from %.2f"%(planet, planetObj.name, newPop, sysPlanets[planet]['targetPop']) troops = planetObj.currentMeterValue(fo.meterType.troops) if troops != sysPlanets[planet].get('troops', 0): - print " * updating troops of planet %d ( %s ) to %.2f from %.2f"%(planet, planetObj.name, troops, sysPlanets[planet]['troops']) + if fo.currentTurn() < 50: + print " * updating troops of planet %d ( %s ) to %.2f from %.2f"%(planet, planetObj.name, troops, sysPlanets[planet]['troops']) sysPlanets[planet]['targetPop']= newPop sysPlanets[planet]['troops']= troops sysStatus['planets']=sysPlanets - print " now know of system %d planets %s"%(curSystemID, sysPlanets.keys()) + if fo.currentTurn() < 50: + print " now know of system %d planets %s"%(curSystemID, sysPlanets.keys()) foAI.foAIstate.systemStatus[curSystemID]=sysStatus #neighbors = list( universe.getImmediateNeighbors(curSystemID, empireID) ) #imNeighbors #if set(neighbors) != set(neighbors2): @@ -204,8 +209,9 @@ if (sysID not in graphFlags) and (sysID not in foAI.foAIstate.visInteriorSystemIDs ): foAI.foAIstate.visBorderSystemIDs[sysID] = 1 explorationList.append(sysID) - print statusStr - print "----------------------------------------------------------" + if fo.currentTurn() < 50: + print statusStr + print "----------------------------------------------------------" def updateExploredSystems(): Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -390,12 +390,13 @@ print "Securing Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_SECURE)) + " (currently FLEET_MISSION_MILITARY should be used instead of this Role)" print "Unclassifyable Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_INVALID)) - print "" - print "Explored systems :" - printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED)) - print "Unexplored systems:" - printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED)) - print "" + if fo.currentTurn() <50: + print "" + print "Explored systems :" + printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_EXPLORED)) + print "Unexplored systems:" + printSystems(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED)) + print "" explorationAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_EXPLORATION]) if len( explorationAIFleetMissions) >0: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -262,6 +262,8 @@ newMarkDesigns += [ (nb%(iw+12), desc, hull, 3*[srb4%iw]+[ar5] + [ is3, if1], "", model) for iw in [2, 3, 4] ] nb = designNameBases[3]+"4g-%1x" newMarkDesigns += [ (nb%(iw+12), desc, hull, 3*[srb4%iw]+[ar5] + [ is4, if1], "", model) for iw in [2, 3, 4] ] + nb = designNameBases[3]+"4h-%1x" + newMarkDesigns += [ (nb%(iw+12), desc, hull, 3*[srb4%iw]+[ar5] + [ is5, if1], "", model) for iw in [2, 3, 4] ] else: nb, hull = designNameBases[4]+"-%1x-%1x", "SH_ENDOSYMBIOTIC" #newMarkDesigns += [ (nb%(1, iw), desc, hull, 4*[srb%iw] + 3*[ is2], "", model) for iw in range(7, 15) ] @@ -277,28 +279,32 @@ newMarkDesigns += [ (nb%(1, iw+4), desc, hull, 2*[srb4%iw]+[ar4] + [ is3, if1, if1], "", model) for iw in [2, 3, 4] ] newMarkDesigns += [ (nb%(2, iw) , desc, hull, 2*[srb3%iw]+[ar4] + [ is4, if1, if1], "", model) for iw in [4] ] newMarkDesigns += [ (nb%(2, iw+4), desc, hull, 2*[srb4%iw]+[ar4] + [ is4, if1, if1], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%(2, iw+8), desc, hull, 2*[srb4%iw]+[ar4] + [ is5, if1, if1], "", model) for iw in [2, 3, 4] ] newMarkDesigns += [ (nb%(3, iw) , desc, hull, 2*[srb3%iw]+[ar5] + [ is3, if1, if1], "", model) for iw in [4] ] newMarkDesigns += [ (nb%(3, iw+4), desc, hull, 2*[srb4%iw]+[ar5] + [ is3, if1, if1], "", model) for iw in [2, 3, 4] ] newMarkDesigns += [ (nb%(4, iw) , desc, hull, 2*[srb3%iw]+[ar5] + [ is4, if1, if1], "", model) for iw in [4] ] newMarkDesigns += [ (nb%(4, iw+4), desc, hull, 2*[srb4%iw]+[ar5] + [ is4, if1, if1], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%(4, iw+8), desc, hull, 2*[srb4%iw]+[ar5] + [ is5, if1, if1], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[5]+"-%1x-%1x", "SH_HEAVY_ASTEROID" #8 , 9, 10 = "Atlas":"FA", "Pele":"FB", "Xena":"FC" newMarkDesigns += [ (nb%(1, iw) , desc, hull, [srb%iw]+5*[""] + [if1, if1, if1], "", model) for iw in [2, 3, 4] ] newMarkDesigns += [ (nb%(2, iw) , desc, hull, [srb2%iw]+5*[""] + [if1, if1, if1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(3, iw) , desc, hull, [srb2%iw]+3*[""] +2*[ar2]+ [if1, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(3, iw) , desc, hull, [srb2%iw]+4*[""] +[ar2]+ [if1, if1, if1], "", model) for iw in [3, 4] ] nb, hull = designNameBases[6]+"-%1x-%1x", "SH_HEAVY_ASTEROID" #8 , 9, 10 = "Atlas":"FA", "Pele":"FB", "Xena":"FC" - newMarkDesigns += [ (nb%(1, iw) , desc, hull, [srb3%iw]+3*[""] +2*[ar2]+ [if1, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(1, iw) , desc, hull, [srb3%iw]+4*[""] +[ar2]+ [if1, if1, if1], "", model) for iw in [3, 4] ] newMarkDesigns += [ (nb%(2, iw) , desc, hull, [srb3%iw]+3*[""] +2*[ar3]+ [if1, if1, if1], "", model) for iw in [3, 4] ] newMarkDesigns += [ (nb%(3, iw) , desc, hull, 3*[srb3%iw]+3*[ar3]+ [is3, if1, if1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(4, iw) , desc, hull, 2*[srb3%iw]+1*[""]+3*[ar3]+ [is4, if1, if1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(5, iw) , desc, hull, 2*[srb3%iw]+1*[""]+3*[ar4]+ [is4, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(4, iw) , desc, hull, 4*[srb3%iw]+2*[ar3]+ [is4, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(5, iw) , desc, hull, 4*[srb3%iw]+2*[ar4]+ [is4, if1, if1], "", model) for iw in [3, 4] ] nb, hull = designNameBases[7]+"-%1x-%1x", "SH_HEAVY_ASTEROID" #8 , 9, 10 = "Atlas":"FA", "Pele":"FB", "Xena":"FC" - newMarkDesigns += [ (nb%(1, iw) , desc, hull, 2*[srb4%iw]+1*[""]+3*[ar3]+ [is3, if1, if1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(2, iw) , desc, hull, 2*[srb4%iw]+1*[""]+3*[ar4]+ [is3, if1, if1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(3, iw) , desc, hull, 3*[srb4%iw]+0*[""]+3*[ar3]+ [is4, if1, if1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(4, iw) , desc, hull, 3*[srb4%iw]+0*[""]+3*[ar4]+ [is4, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(1, iw) , desc, hull, 4*[srb4%iw]+2*[ar3]+ [is3, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(2, iw) , desc, hull, 4*[srb4%iw]+2*[ar4]+ [is3, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(3, iw) , desc, hull, 4*[srb4%iw]+2*[ar3]+ [is4, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(4, iw) , desc, hull, 4*[srb4%iw]+2*[ar4]+ [is4, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(5, iw) , desc, hull, 4*[srb4%iw]+2*[ar3]+ [is5, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(6, iw) , desc, hull, 4*[srb4%iw]+2*[ar4]+ [is5, if1, if1], "", model) for iw in [3, 4] ] - if foAI.foAIstate.aggression >fo.aggression.typical: + if False and foAI.foAIstate.aggression >fo.aggression.typical: hull = "SH_SENTIENT" for cld in [2, 3]: nb = designNameBases[8]+"-%%1xa%1d-%%1x"%cld @@ -603,6 +609,8 @@ buildLoc= pids[-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) + if res: + break # only start at most one new shipyard per species per turn for pid in ColonisationAI.empireSpecies.get(specName, []): planet=universe.getPlanet(pid) if planet: Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -6,6 +6,7 @@ import traceback import sys import ColonisationAI +import random inProgressTechs={} @@ -64,7 +65,7 @@ CO_idx = researchQueueList.index( "CON_ORBITAL_CON") res=fo.issueEnqueueTechOrder("SPY_DETECT_2", CO_idx+1) print "Empire has poor colony/outpost prospects, so attempted to fast-track %s, got result %d"%("CON_ORBITAL_CON", res) - + gotGGG = empire.getTechStatus("PRO_ORBITAL_GEN") == fo.techStatus.complete gotSymBio = empire.getTechStatus("GRO_SYMBIOTIC_BIO") == fo.techStatus.complete gotXenoGen = empire.getTechStatus("GRO_XENO_GENETICS") == fo.techStatus.complete @@ -100,7 +101,8 @@ print "Error: can't retrieve tech ", element.tech continue missingPrereqs = [preReq for preReq in thisTech.recursivePrerequisites(empireID) if preReq not in completedTechs] - unlockedItems = [(uli.name, uli.type) for uli in thisTech.unlockedItems] + #unlockedItems = [(uli.name, uli.type) for uli in thisTech.unlockedItems] + unlockedItems = [uli.name for uli in thisTech.unlockedItems] if not missingPrereqs: print " %25s allocated %6.2f RP -- unlockable items: %s "%(element.tech, element.allocation, unlockedItems) else: @@ -160,6 +162,13 @@ 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) + + if (random.random() <= 0.5) and ( "SHP_WEAPON_2_1" in researchQueueList) : # somewhat prioritize a couple defensive techs + idx = researchQueueList.index( "SHP_WEAPON_2_1") + for def_tech in ["DEF_PLAN_BARRIER_SHLD_1", "DEF_DEFENSE_NET_2" ]: + res=fo.issueEnqueueTechOrder(def_tech, idx) + print "Empire feeling defensive today, so attempted to fast-track %s, got result %d"%(def_tech, res) + print"" generateDefaultResearchOrders() Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -163,9 +163,9 @@ "DEF_GARRISON_1", "CON_ORBITAL_CON", "PRO_ORBITAL_GEN", + "SHP_ZORTRIUM_PLATE", "PRO_MICROGRAV_MAN", "SHP_ASTEROID_HULLS", - "SHP_ZORTRIUM_PLATE", "LRN_FORCE_FIELD", "GRO_SYMBIOTIC_BIO", "SHP_WEAPON_2_1", @@ -185,11 +185,11 @@ "GRO_XENO_GENETICS", "SPY_DETECT_3", "CON_METRO_INFRA", - "SHP_WEAPON_3_1", - "SHP_DIAMOND_PLATE", "GRO_LIFECYCLE_MAN", "SHP_MULTICELL_CAST", "SHP_ENDOCRINE_SYSTEMS", + "SHP_DIAMOND_PLATE", + "SHP_WEAPON_3_1", "SHP_WEAPON_3_2", "SHP_WEAPON_3_3", "SHP_WEAPON_3_4", Modified: trunk/FreeOrion/default/AI/charting/charts.py =================================================================== --- trunk/FreeOrion/default/AI/charting/charts.py 2013-06-19 15:50:12 UTC (rev 6170) +++ trunk/FreeOrion/default/AI/charting/charts.py 2013-06-19 20:43:42 UTC (rev 6171) @@ -7,7 +7,7 @@ #import matplotlib.pyplot as plt import matplotlib.ticker as ticker -dataDir = "." +dataDir = os.environ.get('HOME', "")+"/.freeorion" graphDir=dataDir fileRoot="game1" @@ -24,144 +24,143 @@ else: return '' -doPlotTypes = ["PP"]#+ [ "RP"] +[ "ShipCount"] +doPlotTypes = ["PP"]+ [ "RP"] #+[ "ShipCount"] +def parseFile(fileName, AI =True): + print "processing file ", fileName + sys.stdout.flush() + gotColors=False + gotSpecies=False + gotName=False + data={"PP":[], "RP":[], "ShipCount":[], "turnsP":[], "turnPP":[]} + details={'color':{1, 1, 1, 1}, 'name':"", 'species':""} + with open(fileName, 'r') as lf: + while True: + line=lf.readline() + if not line: + break + if not gotColors and "EmpireColors:" in line: + colors = line.split("EmpireColors:")[1].split() + if len(colors)==4: + gotColors=True + if type(colors[0])==type("0"): + details['color'] = tuple(map(lambda x: float(x)/255.0, colors)) + else: + details['color'] = tuple(map(lambda x: float(ord(x[0]))/255.0, colors)) + if AI and not gotSpecies and "CapitalID:" in line: + gotSpecies = True + details['species'] = line.split("Species:")[1].strip() + if AI and not gotName and "CapitalID:" in line: + gotName=True + details['name'] = line.split("Name:")[1].split("Turn:")[0].strip() + if "Current Output (turn" in line: + info = line.split("Current Output (turn")[1] + parts = info.split(')') + data['turnsP'].append( ( int( parts[0] )) ) + data['turnPP'].append( ( int( parts[0] ), float( parts[1].split('/')[-1]) ) ) + RPPP = parts[1].split('(')[-1].split('/') + data['PP'].append( float( RPPP[1]) ) + data['RP'].append( float( RPPP[0]) ) + if "Empire Ship Count:" in line: + data['ShipCount'].append( int(line.split("Empire Ship Count:")[1])) + return data, details + +allData={} +species={} +empires=[] +empireColors={} +playerName="Player" + +if not os.path.exists(dataDir+os.sep+"freeorion.log"): + print "can't find freeorion.log" +else: + data, details = parseFile(dataDir+os.sep+"freeorion.log", False) + allData[playerName]=data + empireColors[playerName]=details['color'] + +logfiles=sorted(glob(dataDir+os.sep+"A*.log")) +A1log = glob(dataDir+os.sep+"AI_1.log") +if A1log and A1log[0] in logfiles: + A1Time = os.path.getmtime(A1log[0]) + for path in logfiles[::-1]: + logtime = os.path.getmtime(path) + #print "path ", path, "logtime diff: %.1f"%(A1Time -logtime) + if logtime < A1Time - 300: + del logfiles[ logfiles.index(path)] + print "skipping stale logfile ", path +for lfile in logfiles: + try: + data, details = parseFile(lfile, True) + allData[details['name']]=data + empireColors[details['name']]=details['color'] + species[details['name']]=details['species'] + except: + print "error processing %s"%lfile + print "Error: exception triggered and caught: ", traceback.format_exc() + +print for plotType in doPlotTypes: if plotType=="PP": caption="Production" + elif plotType=="RP": + caption="Research" else: - caption="Research" - + caption="Ships" figure(figsize=(10, 6)) ax=gca() - allData={} - species={} - empires=[] - empireColors={} - playerName="" ymin = 9999 ymax = 0 + rankings=[] + turns=[] + + pdata = allData.get(playerName, {}).get(plotType, []) + if pdata != []: + ymin = min(ymin, min(pdata)) + ymax = max(ymax, max(pdata)) + turns=allData.get(playerName, {}).get('turnsP', []) + + for empireName, data in allData.items(): + if empireName == playerName: + continue + adata = data.get(plotType, []) + if adata != []: + rankings.append( (adata[-1], empireName) ) + thisMin=min(adata) + if thisMin>0: + ymin = min(ymin, thisMin) + ymax = max(ymax, max(adata)) + if not turns: + turns = adata.get('turnsP', []) - if not os.path.exists(dataDir+os.sep+"freeorion.log"): - print "can't find freeorion.log" - else: - with open(dataDir+os.sep+"freeorion.log", 'r') as lf: - dat1=lf.read() - playerName="Player" - colorParts= dat1.split("EmpireColors:") - if len( colorParts )>=2: - colorLine=colorParts[1].split('\n')[0].strip() - colors=colorLine.split() - print "Player colors = %s , type = %s"%( colors, type(colors[0])) - if len(colors)==4: - if type(colors[0])==type("0"): - empireColors[playerName]= tuple(map(lambda x: float(x)/255.0, colors)) - else: - empireColors[playerName]= tuple(map(lambda x: float(ord(x[0]))/255.0, colors)) - datalines = [lines.split('\n')[0] for lines in dat1.split("Current Output (turn")][1:] - turnPP = [ ( int( parts[0] ), float( parts[1].split('/')[-1]) ) for parts in [line.split(')') for line in datalines]] - turnsP = [ int( parts[0]) for parts in [line.split(')') for line in datalines]] - PP = [ float( parts[1].split('/')[-1]) for parts in [line.split(')') for line in datalines]] - RP = [ float( parts[1].split('/')[-2].split('(')[-1]) for parts in [line.split(')') for line in datalines]] - shipCount = [int(lines.split('\n')[0]) for lines in dat1.split("Empire Ship Count:")[1:]] - - if plotType=="PP": - data=PP - elif plotType=="RP": - data=RP - else: - data = shipCount - if data != []: - ymin = min(ymin, min(data)) - ymax = max(ymax, max(data)) - #plot(turnsP[:50],data[:50], 'bo-', label=playerName, linewidth=2.0) - allData[playerName]=data - - logfiles=sorted(glob(dataDir+os.sep+"A*.log")) - A1log = glob(dataDir+os.sep+"AI_1.log") - if A1log and A1log[0] in logfiles: - A1Time = os.path.getmtime(A1log[0]) - for path in logfiles[::-1]: - logtime = os.path.getmtime(path) - print "path ", path, "logtime diff: %.1f"%(A1Time -logtime) - if logtime < A1Time - 300: - del logfiles[ logfiles.index(path)] - print "skipping stale logfile ", path - empire=0 - for lfile in logfiles: - with open(lfile, 'r') as lf: - try: - dat1=lf.read() - specName=dat1.split("CapitalID:")[1].split("Species:")[1].split('\n')[0].strip() - empireName=dat1.split("EmpireID:")[1].split("Name:")[1].split("Turn:")[0].strip() - empires.append(empireName) - colorParts= dat1.split("EmpireColors:") - if len( colorParts )>=2: - colorLine=colorParts[1].split('\n')[0].strip() - colors=colorLine.split() - if len(colors)==4: - empireColors[empireName]= tuple(map(lambda x: int(x)/255.0, colors)) - print "empire colors for %s are %s -- %s "%(empireName, colors, empireColors[empireName]) - datalines = [lines.split('\n')[0] for lines in dat1.split("Current Output (turn")][1:] - turnPP = [ ( int( parts[0] ), float( parts[1].split('/')[-1]) ) for parts in [line.split(')') for line in datalines]] - turnsAI = [ int( parts[0]) for parts in [line.split(')') for line in datalines]] - PP = [ float( parts[1].split('/')[-1]) for parts in [line.split(')') for line in datalines]] - RP = [ float( parts[1].split('/')[-2].split('(')[-1]) for parts in [line.split(')') for line in datalines]] - shipCount = [1+int(lines.split('\n')[0]) for lines in dat1.split("Empire Ship Count:")[1:]] - if plotType=="PP": - data=PP - rankings.append( (PP[-1], empireName) ) - elif plotType=="RP": - data=RP - else: - data = shipCount - if data != []: - thisMin=min(data) - if thisMin>0: ymin = min(ymin, thisMin) - ymax = max(ymax, max(data)) - #plot(turnsAI[:50],data[:50], label=specName, linewidth=2.0) - species[empireName]=specName - allData[empireName]=data - empire+=1 - except: - print "error processing %s"%lfile - print "Error: exception triggered and caught: ", traceback.format_exc() - + if not turns: + if len(allData)==0: + break + turns = range(1,len(allData.values()[0].get(plotType, []))+1) rankings.sort() - legend(loc='upper left',prop={"size":'medium'}) xlabel('Turn') ylabel(plotType) title(caption+' Progression') - #if saveFile: - # savefig(graphDir+os.sep+plotType+"_"+fileRoot+"_toTurn50.png") - #show() - - turns=turnsP or turnsAI or range(1,len(allData.values()[0])+1) - #if len(turns) >50: - #if (allData.get(playerName,[]) or allData.values()[0])[-1]>100: - # ax.set_yscale('log',basey=10) ax.set_yscale('log',basey=10) - #ax.axis["right"].set_visible(True) - #figure(figsize=(10, 6)) if playerName not in allData: print "can't find playerData in allData" else: if playerName in empireColors: - print "plotting with color for player: ", playerName, "data min/max: ", min(allData[playerName]), ' | ', max(allData[playerName]) - plot(turnsP, allData[playerName], 'o-', color=empireColors[playerName], label=playerName, linewidth=2.0) + turnsP = allData[playerName].get("turnsP", []) + print "plotting with color for player: ", playerName, "data min/max: ", min(allData[playerName].get(plotType, [])), ' | ', max(allData[playerName].get(plotType, [])) + plot(turnsP, allData[playerName].get(plotType, []), 'o-', color=empireColors[playerName], label=playerName, linewidth=2.0) else: - print "plotting withOUT color for player: ", playerName, "data min/max: ", min(allData[playerName]), ' | ', max(allData[playerName]) - plot(turnsP, allData[playerName], 'bx-', label=playerName, linewidth=2.0) - #show() - #for i in range(len(species)): - # name=empires[i] + print "plotting withOUT color for player: ", playerName, "data min/max: ", min(allData[playerName].get(plotType, [])), ' | ', max(allData[playerName].get(plotType, [])) + plot(turnsP, allData[playerName].get(plotType, []), 'bx-', label=playerName, linewidth=2.0) for rank,name in rankings[::-1]: if name in empireColors: - plot(range(turns[0], turns[0]+len(allData[name])), allData[name], color=empireColors[name], label=name+" : "+species[name], linewidth=2.0) + adata = allData[name].get(plotType, []) + plot(range(turns[0], turns[0]+len(adata)), adata, color=empireColors[name], label=name+" : "+species[name], linewidth=2.0) else: - plot(range(turns[0], turns[0]+len(allData[name])), allData[name], label="(%d) "%(empires.index(name)+1)+name+" : "+species[name], linewidth=2.0) + print "can't find empire color for ", name + #plot(range(turns[0], turns[0]+len(allData[name])), allData[name].get(plotType, []), label="(%d) "%(empires.index(name)+1)+name+" : "+species[name], linewidth=2.0) + #legend(loc='upper left',prop={"size":'medium'}) legend(loc='upper left', prop={"size":9},labelspacing=0.2) xlabel('Turn') ylabel(plotType) @@ -174,8 +173,6 @@ break print "y1: %.1f ; ymin: %.1f ; newY2/100: %.1f"%(y1, ymin, newY2/100) y1 = max(y1, 4, ymin, newY2/100) - #axis( (x1,min(x2,200),y1,y2)) - #ax.yaxis.set_minor_locator(ticker.AutoMinorLocator()) axis( (x1,x2,y1,newY2)) grid(b=True, which='major', color='0.25',linestyle='-') grid(b=True, which='minor', color='0.1', linestyle='--') |
From: <dil...@us...> - 2013-06-22 01:29:21
|
Revision: 6183 http://sourceforge.net/p/freeorion/code/6183 Author: dilvish-fo Date: 2013-06-22 01:29:17 +0000 (Sat, 22 Jun 2013) Log Message: ----------- - fixed charting script bug relating to human observer/moderator - fixed AI over-proliferation of shipyards Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/charting/charts.py Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-06-21 21:57:50 UTC (rev 6182) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-06-22 01:29:17 UTC (rev 6183) @@ -224,7 +224,7 @@ if (AIFocusType.FOCUS_MINING in planet.availableFoci): fo.issueChangeFocusOrder(pID, AIFocusType.FOCUS_MINING) print "Changing focus of newly acquired planet ID %d : %s to mining "%(pID, planet.name ) - empireSpecies[pSpecName] = empireSpecies.get(pSpecName, [])+[pID] + empireSpecies.setdefault(pSpecName, []).append(pID) print "\n"+"Empire species roster:" for specName in empireSpecies: thisSpec=fo.getSpecies(specName) Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-21 21:57:50 UTC (rev 6182) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-22 01:29:17 UTC (rev 6183) @@ -287,9 +287,10 @@ newMarkDesigns += [ (nb%(4, iw+8), desc, hull, 2*[srb4%iw]+[ar5] + [ is5, if1, if1], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[5]+"-%1x-%1x", "SH_HEAVY_ASTEROID" #8 , 9, 10 = "Atlas":"FA", "Pele":"FB", "Xena":"FC" - newMarkDesigns += [ (nb%(1, iw) , desc, hull, [srb%iw]+5*[""] + [if1, if1, if1], "", model) for iw in [2, 3, 4] ] - newMarkDesigns += [ (nb%(2, iw) , desc, hull, [srb2%iw]+5*[""] + [if1, if1, if1], "", model) for iw in [3, 4] ] - newMarkDesigns += [ (nb%(3, iw) , desc, hull, [srb2%iw]+4*[""] +[ar2]+ [if1, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(1, iw) , desc, hull, [srb%iw] +5*[""] + [if1, if1, if1], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%(2, iw) , desc, hull, [srb2%iw]+5*[""] + [if1, if1, if1], "", model) for iw in [2, 3, 4] ] + newMarkDesigns += [ (nb%(3, iw) , desc, hull, [srb%iw] +3*[""] +2*[ar2]+ [if1, if1, if1], "", model) for iw in [3, 4] ] + newMarkDesigns += [ (nb%(4, iw) , desc, hull, [srb2%iw]+3*[""] +2*[ar2]+ [if1, if1, if1], "", model) for iw in [2, 3, 4] ] nb, hull = designNameBases[6]+"-%1x-%1x", "SH_HEAVY_ASTEROID" #8 , 9, 10 = "Atlas":"FA", "Pele":"FB", "Xena":"FC" newMarkDesigns += [ (nb%(1, iw) , desc, hull, [srb3%iw]+4*[""] +[ar2]+ [if1, if1, if1], "", model) for iw in [3, 4] ] newMarkDesigns += [ (nb%(2, iw) , desc, hull, [srb3%iw]+3*[""] +2*[ar3]+ [if1, if1, if1], "", model) for iw in [3, 4] ] @@ -597,7 +598,7 @@ systemColonies={} colonySystems={} for specName in ColonisationAI.empireColonizers: - if (len( ColonisationAI.empireColonizers[specName])<=int(currentTurn/100)) and (specName in ColonisationAI.empireSpecies): #no current shipyards for this species#TODO: also allow orbital incubators and/or asteroid ships + if (len( ColonisationAI.empireColonizers[specName])<=int(currentTurn/100)) and (specName in ColonisationAI.empireSpecies): #not enough current shipyards for this species#TODO: also allow orbital incubators and/or asteroid ships for pID in ColonisationAI.empireSpecies.get(specName, []): #SP_EXOBOT may not actually have a colony yet but be in empireColonizers if pID in queuedShipyardLocs: break #won't try building more than one shipyard at once, per colonizer @@ -610,6 +611,7 @@ 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) if res: + queuedShipyardLocs.append(buildLoc) break # only start at most one new shipyard per species per turn for pid in ColonisationAI.empireSpecies.get(specName, []): planet=universe.getPlanet(pid) @@ -617,12 +619,15 @@ systemColonies.setdefault(planet.systemID, {}).setdefault('pids', []).append(pid) colonySystems[pid]=planet.systemID + aciremaSystems={} for pid in ColonisationAI.empireSpecies.get("SP_ACIREMA", []): + aciremaSystems.setdefault( universe.getPlanet(pid).systemID, [] ).append(pid) if (pid in queuedShipyardLocs ) or not bldType.canBeProduced(empire.empireID, pid) : continue #but not 'break' because we want to build shipyards at *every* Acirema planet res=fo.issueEnqueueBuildingProductionOrder("BLD_SHIPYARD_BASE", pid) print "Enqueueing BLD_SHIPYARD_BASE at planet %d (%s) for Acirema, with result %d"%(pid, universe.getPlanet(pid).name, res) if res: + queuedShipyardLocs.append(pid) res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front print "Requeueing Acirema BLD_SHIPYARD_BASE to front of build queue, with result %d"%(res) @@ -648,20 +653,20 @@ res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front print "Requeueing %s to front of build queue, with result %d"%(bldName, res) - for bldName in [ "BLD_SHIPYARD_BASE" ]: - if empire.buildingTypeAvailable(bldName) and (bldgExpense<bldgRatio*totalPP) and ( totalPP >50 or currentTurn > 80 ): - queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] - bldType = fo.getBuildingType(bldName) - for pid in enrgyShipyardLocs: - 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) - cost, time = empire.productionCostAndTime( productionQueue[productionQueue.size -1] ) - bldgExpense += cost/time # productionQueue[productionQueue.size -1].blocksize * - res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front - print "Requeueing %s to front of build queue, with result %d"%(bldName, res) + queuedShipyards=[] + bldName = "BLD_SHIPYARD_BASE" + if empire.buildingTypeAvailable(bldName) and (bldgExpense<bldgRatio*totalPP) and ( totalPP >50 or currentTurn > 80 ): + bldType = fo.getBuildingType(bldName) + for pid in enrgyShipyardLocs: + if pid not in queuedShipyardLocs 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: + queuedShipyardLocs.append(pid) + cost, time = empire.productionCostAndTime( productionQueue[productionQueue.size -1] ) + bldgExpense += cost/time # productionQueue[productionQueue.size -1].blocksize * + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) for bldName in [ "BLD_SHIPYARD_ORG_ORB_INC" , "BLD_SHIPYARD_ORG_XENO_FAC" ]: if empire.buildingTypeAvailable(bldName) and (bldgExpense<bldgRatio*totalPP) and ( totalPP >40 or currentTurn > 40 ): @@ -699,40 +704,80 @@ ShipYardType = fo.getBuildingType("BLD_SHIPYARD_BASE") bldName = "BLD_SHIPYARD_AST" - maxAst=1 if empire.buildingTypeAvailable(bldName) and foAI.foAIstate.aggression > fo.aggression.beginner: queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] - bldType = fo.getBuildingType(bldName) - for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): - thisPlanet=universe.getPlanet(pid) - if (thisPlanet.systemID not in ColonisationAI.empireSpeciesSystems): - continue - localShipBuilders=[] - for pid2 in ColonisationAI.empireSpeciesSystems[thisPlanet.systemID].get('pids', []): - p2 = universe.getPlanet(pid2) - if (not p2) or (p2.speciesName==""): - continue - spec2=fo.getSpecies(p2.speciesName) - if spec2 and spec2.canProduceShips: - localShipBuilders.append(pid2) - if ShipYardType.canBeProduced(empire.empireID, pid2) and ( pid2 not in [element.locationID for element in productionQueue if (element.name=="BLD_SHIPYARD_BASE") ] ): - res=fo.issueEnqueueBuildingProductionOrder("BLD_SHIPYARD_BASE", pid2) - print "Enqueueing %s at planet %d (%s) , with result %d"%("BLD_SHIPYARD_BASE", pid2, universe.getPlanet(pid2).name, res) + if not queuedBldLocs: + bldType = fo.getBuildingType(bldName) + asteroidSystems = {} + asteroidYards = {} + queuedSystems=set() + shipyardSystems={} + builderSystems={} + for pid in list(AIstate.popCtrIDs) + list(AIstate.outpostIDs): + planet=universe.getPlanet(pid) + thisSpec = planet.speciesName + sysID = planet.systemID + if planet.size == fo.planetSize.asteroids and sysID in ColonisationAI.empireSpeciesSystems: + asteroidSystems.setdefault(sysID, []).append(pid) + if bldName in [universe.getObject(bldg).buildingTypeName for bldg in planet.buildingIDs]: + asteroidYards[sysID]=pid #shouldn't ever overwrite another, but ok if it did + if thisSpec in ColonisationAI.empireShipBuilders: + if pid in ColonisationAI.empireShipBuilders[thisSpec]: + shipyardSystems.setdefault(sysID, []).append(pid) + else: + builderSystems.setdefault(sysID, []).append((planet.speciesName, pid)) + #check if we need to build another asteroid processor: + # check if local shipyard to go with the asteroid processor + yardLocs = [] + needYard ={} + for sysID in set(asteroidSystems.keys()).difference(asteroidYards.keys()): + if sysID in aciremaSystems: + yardLocs.append(sysID ) #prioritize acirema asteroid yards + for pid in aciremaSystems[sysID]: + if pid not in (ColonisationAI.empireShipBuilders.get("SP_ACIREMA", [])+ queuedShipyardLocs): + needYard[sysID] = pid + if ( not yardLocs ) and len(asteroidYards.values())<= int(currentTurn/100): # not yet building & not enough current locs, find a locaiton to build one + queuedYardSystems = set(PlanetUtilsAI.getSystems(queuedShipyardLocs)) + colonizerLocChoices=[] + builderLocChoices=[] + bldSystems = set(asteroidSystems.keys()).difference(asteroidYards.keys()) + for sysID in bldSystems.intersection(builderSystems.keys()): + for thisSpec, pid in builderSystems[sysID]: + if thisSpec in ColonisationAI.empireColonizers: + if pid in (ColonisationAI.empireColonizers[thisSpec]+queuedShipyardLocs): + colonizerLocChoices.insert(0, sysID) + else: + colonizerLocChoices.append(sysID) + needYard[sysID] = pid + else: + if pid in (ColonisationAI.empireColonizers[thisSpec]+queuedShipyardLocs): + builderLocChoices.insert(0, sysID) + else: + builderLocChoices.append(sysID) + needYard[sysID] = pid + yardLocs.extend( (colonizerLocChoices+builderLocChoices)[:1] ) #add at most one of these non acirema locs + for sysID in yardLocs: + pid = asteroidSystems[sysID][0] + if sysID in needYard: + pid2 = needYard[sysID] + if ShipYardType.canBeProduced(empire.empireID, pid2): + res=fo.issueEnqueueBuildingProductionOrder("BLD_SHIPYARD_BASE", pid2) + print "Enqueueing %s at planet %d (%s) to go with Aseroid Processor , with result %d"%("BLD_SHIPYARD_BASE", pid2, universe.getPlanet(pid2).name, res) + if res: + queuedShipyardLocs.append(pid2) + cost, time = empire.productionCostAndTime( productionQueue[productionQueue.size -1] ) + bldgExpense += cost/time # productionQueue[productionQueue.size -1].blocksize * + res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + print "Requeueing %s to front of build queue, with result %d"%("BLD_SHIPYARD_BASE", res) + if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid): + res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + print "Enqueueing %s at planet %d (%s) , with result %d on turn %d"%(bldName, pid, universe.getPlanet(pid).name, res, currentTurn) if res: + queuedBldLocs.append(pid) + cost, time = empire.productionCostAndTime( productionQueue[productionQueue.size -1] ) + bldgExpense += cost/time # productionQueue[productionQueue.size -1].blocksize * res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front - print "Requeueing %s to front of build queue, with result %d"%("BLD_SHIPYARD_BASE", res) - break#TODO: consider building shipyards at more than one planet here - if not localShipBuilders: - continue - if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid): #TODO: consider limiting how many asteroid processors get built - res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) - print "Enqueueing %s at planet %d (%s) , with result %d on turn %d"%(bldName, pid, universe.getPlanet(pid).name, res, currentTurn) - if res: - queuedBldLocs.append(pid) - cost, time = empire.productionCostAndTime( productionQueue[productionQueue.size -1] ) - bldgExpense += cost/time # productionQueue[productionQueue.size -1].blocksize * - res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front - print "Requeueing %s to front of build queue, with result %d"%(bldName, res) + print "Requeueing %s to front of build queue, with result %d"%(bldName, res) bldName = "BLD_GAS_GIANT_GEN" maxGGGs=1 @@ -1007,12 +1052,12 @@ tInd=planet.currentMeterValue(fo.meterType.targetIndustry) cInd=planet.currentMeterValue(fo.meterType.industry) cPop = planet.currentMeterValue(fo.meterType.population) - if (cPop <= 35) or (cPop < 0.8*tPop) or ( (planet.speciesName not in ColonisationAI.empireColonizers) and cPop < 50 ): #check even if not aggressive, etc, just in case acquired planet with a ConcCamp on it + if (cPop <= 36) or (cPop < 0.8*tPop) or ( (planet.speciesName not in ColonisationAI.empireColonizers) and cPop < 50 ): #check even if not aggressive, etc, just in case acquired planet with a ConcCamp on it for bldg in planet.buildingIDs: if universe.getObject(bldg).buildingTypeName == bldName: res=fo.issueScrapOrder( bldg) print "Tried scrapping %s at planet %s, got result %d"%(bldName, planet.name, res) - elif foAI.foAIstate.aggression>fo.aggression.typical and empire.buildingTypeAvailable(bldName) and (tPop >= 36) : + elif foAI.foAIstate.aggression>fo.aggression.typical and empire.buildingTypeAvailable(bldName) and (tPop >= 42) : if (planet.focus== EnumsAI.AIFocusType.FOCUS_GROWTH) or ("COMPUTRONIUM_SPECIAL" in planet.specials): #continue pass # now that focus setting takes these into account, probably works ok to have conc camp Modified: trunk/FreeOrion/default/AI/charting/charts.py =================================================================== --- trunk/FreeOrion/default/AI/charting/charts.py 2013-06-21 21:57:50 UTC (rev 6182) +++ trunk/FreeOrion/default/AI/charting/charts.py 2013-06-22 01:29:17 UTC (rev 6183) @@ -71,12 +71,19 @@ empireColors={} playerName="Player" +logfiles=sorted(glob(dataDir+os.sep+"A*.log")) +A1log = glob(dataDir+os.sep+"AI_1.log") + + if not os.path.exists(dataDir+os.sep+"freeorion.log"): print "can't find freeorion.log" +elif A1log and ( A1log[0] in logfiles ) and ( os.path.getmtime(dataDir+os.sep+"freeorion.log") < os.path.getmtime(A1log[0]) -300 ): + print "freeorion.log file is stale ( more than 5 minutes older than AI_1.log) and will be skipped" else: data, details = parseFile(dataDir+os.sep+"freeorion.log", False) - allData[playerName]=data - empireColors[playerName]=details['color'] + if len(data.get('PP', [])) > 0: + allData[playerName]=data + empireColors[playerName]=details['color'] logfiles=sorted(glob(dataDir+os.sep+"A*.log")) A1log = glob(dataDir+os.sep+"AI_1.log") @@ -131,7 +138,7 @@ ymin = min(ymin, thisMin) ymax = max(ymax, max(adata)) if not turns: - turns = adata.get('turnsP', []) + turns = data.get('turnsP', []) if not turns: if len(allData)==0: |
From: <dil...@us...> - 2013-06-23 23:58:02
|
Revision: 6193 http://sourceforge.net/p/freeorion/code/6193 Author: dilvish-fo Date: 2013-06-23 23:58:00 +0000 (Sun, 23 Jun 2013) Log Message: ----------- AI tweaks, mostly some slightly improved colonization planning Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-06-23 23:42:23 UTC (rev 6192) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-06-23 23:58:00 UTC (rev 6193) @@ -727,6 +727,7 @@ return -9999 popSizeMod=0 conditionalPopSizeMod=0 + postPopSizeMod=0 popSizeMod += popSizeModMap["env"][planetEnv] detail.append("EnvironPopSizeMod(%d)"%popSizeMod) if "SELF_SUSTAINING" in tagList: @@ -746,20 +747,23 @@ for gTech, gKey in [ ("GRO_SYMBIOTIC_BIO", "symBio"), ("GRO_XENO_GENETICS", "xenoGen"), ("GRO_XENO_HYBRID", "xenoHyb"), - ("GRO_CYBORG", "cyborg"), - ("CON_NDIM_STRUC", "ndim"), - ("CON_ORBITAL_HAB", "orbit") ]: + ("GRO_CYBORG", "cyborg") ]: if empire.getTechStatus(gTech) == fo.techStatus.complete: popSizeMod += popSizeModMap[gKey][planetEnv] detail.append("%s_PSM(%d)"%(gKey, popSizeModMap[gKey][planetEnv])) + for gTech, gKey in [ ("CON_NDIM_STRUC", "ndim"), + ("CON_ORBITAL_HAB", "orbit") ]: + if empire.getTechStatus(gTech) == fo.techStatus.complete: + conditionalPopSizeMod += popSizeModMap[gKey][planetEnv] + detail.append("%s_PSM(%d)"%(gKey, popSizeModMap[gKey][planetEnv])) - if "GAIA_SPECIAL" in planet.specials: - popSizeMod += 3 + if "GAIA_SPECIAL" in planet.specials and species.name!="SP_EXOBOT": #exobots can't ever get to good environ so no gaiai bonus, for others we'll assume they'll get there + conditionalPopSizeMod += 3 detail.append("Gaia_PSM(3)") for special in [ "SLOW_ROTATION_SPECIAL", "SOLID_CORE_SPECIAL"] : if special in planetSpecials: - popSizeMod -= 1 + postPopSizeMod -= 1 detail.append("%s_PSM(-1)"%special) applicableBoosts=set([]) @@ -777,10 +781,14 @@ nBoosts = len(applicableBoosts) if nBoosts: - popSizeMod += nBoosts + conditionalPopSizeMod += nBoosts detail.append("boosts_PSM(%d from %s)"%(nBoosts, applicableBoosts)) - if popSizeMod > 0: + if popSizeMod >= 0: popSizeMod += conditionalPopSizeMod + popSizeMod += postPopSizeMod + + if planetID in species.homeworlds: #TODO: check for homeworld growth focus + popSizeMod+=2 popSize = planetSize * popSizeMod * popTagMod detail.append("baseMaxPop size*psm %d * %d * %.2f = %d"%(planetSize, popSizeMod, popTagMod, popSize) ) @@ -803,7 +811,7 @@ "PRO_INDUSTRY_CENTER_I": 1, "PRO_INDUSTRY_CENTER_II":1, "PRO_INDUSTRY_CENTER_III":1, - "PRO_SOL_ORB_GEN": 2.0, #assumes will build a gen at a blue/white star + "PRO_SOL_ORB_GEN": 2.0, #TODO don't assume will build a gen at a blue/white star "PRO_SINGULAR_GEN": proSingVal, } Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-06-23 23:42:23 UTC (rev 6192) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-06-23 23:58:00 UTC (rev 6193) @@ -162,7 +162,8 @@ universe = fo.getUniverse() fleetA = universe.getFleet(fleetA_ID) sysID=fleetA.systemID - if not fleetA: + fleetB = universe.getFleet(fleetB_ID) + if not fleetA or not fleetB: return 0 success = True initRating = foAI.foAIstate.getRating(fleetA_ID) @@ -170,9 +171,18 @@ transferredRating = 0 transferredAttack=0 transferredHealth=0 + BHasMonster=False + for shipID in fleetB.shipIDs: + thisShip=universe.getShip(shipID) + if (not thisShip): + continue + if thisShip.isMonster: + BHasMonster = True + break for shipID in fleetA.shipIDs: thisShip=universe.getShip(shipID) - if not thisShip: continue + if (not thisShip) or ( thisShip.isMonster != BHasMonster ) : + continue stats = foAI.foAIstate.getDesignIDStats(thisShip.designID) thisRating = stats['attack'] * ( stats['structure'] + stats['shields'] ) if (remainingRating['attack'] -stats['attack'])*(remainingRating['health'] -( stats['structure'] + stats['shields'] )) < leaveRating: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-23 23:42:23 UTC (rev 6192) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-06-23 23:58:00 UTC (rev 6193) @@ -750,7 +750,7 @@ colonizerLocChoices.append(sysID) needYard[sysID] = pid else: - if pid in (ColonisationAI.empireColonizers[thisSpec]+queuedShipyardLocs): + if pid in (ColonisationAI.empireShipBuilders.get(thisSpec, [])+queuedShipyardLocs): builderLocChoices.insert(0, sysID) else: builderLocChoices.append(sysID) |
From: <dil...@us...> - 2013-07-04 20:28:27
|
Revision: 6223 http://sourceforge.net/p/freeorion/code/6223 Author: dilvish-fo Date: 2013-07-04 20:28:22 +0000 (Thu, 04 Jul 2013) Log Message: ----------- - AI mods, increasing safety margin for considering concentration camps Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/MilitaryAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResourcesAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-07-04 01:05:53 UTC (rev 6222) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-07-04 20:28:22 UTC (rev 6223) @@ -160,9 +160,11 @@ self.fleetStatus[fleetID]['sysID']= newLoc self.fleetStatus[fleetID]['nships']= len(fleet.shipIDs) if movedFleets: - print "(moved_fleet, oldSys, newSys): %s"%movedFleets + #print "(moved_fleet, oldSys, newSys): %s"%movedFleets + pass else: - print "no moved_fleets this turn" + #print "no moved_fleets this turn" + pass def deleteFleetInfo(self, fleetID, sysID=-1): for systemID in [sid for sid in [sysID, self.fleetStatus.get(fleetID, {}).get('sysID', -1)] if sid != -1]: @@ -182,12 +184,12 @@ if sysIDList is None: sysIDList = sorted( universe.systemIDs )# will normally look at this, the list of all known systems #assess fleet and planet threats - print "----------------------------------------------" - print "System Threat Assessments" - for sysID in sysIDList: - sysStatus = self.systemStatus.get(sysID, {}) - system = universe.getSystem(sysID) - print "System %4d ( %12s ) : %s"%(sysID, (system and system.name) or "unknown", sysStatus) + #print "----------------------------------------------" + #print "System Threat Assessments" + #for sysID in sysIDList: + #sysStatus = self.systemStatus.get(sysID, {}) + #system = universe.getSystem(sysID) + #print "System %4d ( %12s ) : %s"%(sysID, (system and system.name) or "unknown", sysStatus) def assessPlanetThreat(self, pid, sightingAge=0): sightingAge+=1#play it safe @@ -273,13 +275,13 @@ enemyHealth = sum( [rating.get('health', 0) for rating in enemyRatings]) enemyRating = enemyAttack * enemyHealth if fleetsLostBySystem.get(sysID, []) != []: - 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"%( - currentTurn, sysID, ["not", ""][sawEnemiesAtSystem.get(sysID, False)], partialVisTurn, localEnemyFleetIDs) + #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"%( + # currentTurn, sysID, ["not", ""][sawEnemiesAtSystem.get(sysID, False)], partialVisTurn, localEnemyFleetIDs) lostFleetAttack = sum( [rating.get('attack', 0) for rating in fleetsLostBySystem.get(sysID, {}) ] ) lostFleetHealth = sum( [rating.get('health', 0) for rating in fleetsLostBySystem.get(sysID, {} ) ] ) lostFleetRating= lostFleetAttack * lostFleetHealth if (not system) or partialVisTurn==-9999: - print "Have never had partial vis for system %d ( %s ) -- basing threat assessment on old info and lost ships"%(sysID, sysStatus.get('name', "name unknown")) + #print "Have never had partial vis for system %d ( %s ) -- basing threat assessment on old info and lost ships"%(sysID, sysStatus.get('name', "name unknown")) sysStatus['planetThreat'] = 0 sysStatus['fleetThreat'] = int( max(enemyRating, 0.98*sysStatus.get('fleetThreat', 0) , 1.1*lostFleetRating) ) sysStatus['monsterThreat']=0 @@ -309,7 +311,7 @@ lostFleetRating=0 if not partialVisTurn == currentTurn: #(universe.getVisibility(sysID, self.empireID) >= fo.visibility.partial): - print "Stale visibility for system %d ( %s ) -- last seen %d, current Turn %d -- basing threat assessment on old info and lost ships"%(sysID, sysStatus.get('name', "name unknown"), partialVisTurn, currentTurn) + #print "Stale visibility for system %d ( %s ) -- last seen %d, current Turn %d -- basing threat assessment on old info and lost ships"%(sysID, sysStatus.get('name', "name unknown"), partialVisTurn, currentTurn) sysStatus['fleetThreat'] = int( max(enemyRating, 0.98*sysStatus.get('fleetThreat', 0), 1.1*lostFleetRating) ) sysStatus['totalThreat'] = (pattack + enemyAttack + sysStatus.get('monsterThreat', 0)**0.5) * (phealth + enemyHealth + sysStatus.get('monsterThreat', 0)**0.5) else: #system considered visible #TODO: reevaluate as visibility rules change @@ -567,7 +569,7 @@ "removes a fleet ID/role pair" if fleetID in self.__fleetRoleByID: - print "Removed role for fleet ID: " + str(fleetID) + #print "Removed role for fleet ID: " + str(fleetID) del self.__fleetRoleByID[fleetID] return @@ -610,7 +612,7 @@ if unaccountedFleets: print "Fleets unaccounted for in Empire Records: ", unaccountedFleets print "-----------" - print "statusList %s"%[self.fleetStatus[fid] for fid in sorted( self.fleetStatus.keys() ) ] + #print "statusList %s"%[self.fleetStatus[fid] for fid in sorted( self.fleetStatus.keys() ) ] print "-----------" minThreatRating = {'overall':MinThreat, 'attack':MinThreat**0.5, 'health':MinThreat**0.5} for fleetID in fleetList: @@ -638,7 +640,7 @@ fleetsLostBySystem.setdefault(oldSysID, []).append( minThreatRating ) 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 + #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 if fleetID in self.__fleetRoleByID: del self.__fleetRoleByID[fleetID] @@ -659,8 +661,8 @@ sys2Name= 'starlane' else: 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.get('overall', 0), newRating.get('overall', 0), - fleet.systemID, sys1Name, fleet.nextSystemID, sys2Name) + #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 nextSysID !=-1: status['sysID'] = nextSysID Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-07-04 01:05:53 UTC (rev 6222) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-07-04 20:28:22 UTC (rev 6223) @@ -45,6 +45,12 @@ "gaia": [ 0, 3, 3, 3, 3 ], } +nestValMap = { + "SNOWFLAKE_NEST_SPECIAL": 5, + "KRAKEN_NEST_SPECIAL":10, + "JUGGERNAUT_NEST_SPECIAL":20, + } + def dictFromMap(map): return dict( [ (el.key(), el.data() ) for el in map ] ) def resetCAIGlobals(): @@ -223,8 +229,9 @@ if pID not in oldPopCtrs: if (AIFocusType.FOCUS_MINING in planet.availableFoci): fo.issueChangeFocusOrder(pID, AIFocusType.FOCUS_MINING) - print "Changing focus of newly acquired planet ID %d : %s to mining "%(pID, planet.name ) - empireSpecies.setdefault(pSpecName, []).append(pID) + print "Changing focus of newly acquired planet ID %d : %s to mining "%(pID, planet.name ) #stale code left as an example; Mining no longer an option + if planet.currentMeterValue(fo.meterType.population)>0 : + empireSpecies.setdefault(pSpecName, []).append(pID) print "\n"+"Empire species roster:" for specName in empireSpecies: thisSpec=fo.getSpecies(specName) @@ -587,9 +594,11 @@ if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): for special in planetSpecials: + nestVal = 0 if "_NEST_" in special: - retval+=5*discountMultiplier*backupFactor # get an outpost on the nest quick - detail.append( "%s %.1f"%(special, discountMultiplier*5*backupFactor ) ) + nestVal = nestValMap.get(special, 5) * discountMultiplier*backupFactor # get an outpost on the nest quick + retval+=nestVal + detail.append( "%s %.1f"%(special, nestVal ) ) if ( planet.size == fo.planetSize.asteroids ): if (empire.getTechStatus("PRO_MICROGRAV_MAN") == fo.techStatus.complete ): if system: @@ -1002,7 +1011,7 @@ if thisPlanetID in alreadyTargeted: continue thisPlanet = universe.getPlanet(thisPlanetID) - print "checking pool %s against target %s current owner %s targetSpec %s"%(fleetPool, thisPlanet.name, thisPlanet.owner, thisTarget) + #print "checking pool %s against target %s current owner %s targetSpec %s"%(fleetPool, thisPlanet.name, thisPlanet.owner, thisTarget) thisSysID = thisPlanet.systemID if (foAI.foAIstate.systemStatus.setdefault(thisSysID, {}).setdefault('monsterThreat', 0) > 2000) or (fo.currentTurn() <20 and foAI.foAIstate.systemStatus[thisSysID]['monsterThreat'] > 200): print "Skipping colonization of system %s due to Big Monster, threat %d"%(PlanetUtilsAI.sysNameIDs([thisSysID]), foAI.foAIstate.systemStatus[thisSysID]['monsterThreat']) Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-07-04 01:05:53 UTC (rev 6222) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-07-04 20:28:22 UTC (rev 6223) @@ -195,20 +195,23 @@ 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==""]) + else: + print "\t\t\t\t *** attempted 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 <= transferredAttack*transferredHealth: #transferredRating: break fleetA = universe.getFleet(fleetA_ID) if (not fleetA) or fleetA.empty or fleetA_ID in universe.destroyedObjectIDs(fo.empireID()): - print "\t\t\t\t\tdeleting fleet info for old fleet %d after transfers into fleet %d"%(fleetA_ID, fleetB_ID) + #print "\t\t\t\t\tdeleting fleet info for old fleet %d after transfers into fleet %d"%(fleetA_ID, fleetB_ID) 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"%(transferredAttack*transferredHealth, fleetA_ID, fleetB_ID, newARating['overall']) + #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']) + pass 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']) + #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']) + pass foAI.foAIstate.updateFleetRating(fleetB_ID) return transferredAttack*transferredHealth, transferredAttack, transferredHealth @@ -324,8 +327,8 @@ selectedRole= AIFleetMissionType.FLEET_MISSION_MILITARY 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).get('overall', 0)) + #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).get('overall', 0)) return selectedRole def assessShipDesignRole(design): @@ -350,10 +353,10 @@ if design.starlaneSpeed == 0: string1 = "Ship Design %s has partslist %s"%(design.name(False), [part for part in design.parts]) if len(design.parts)==0 or design.parts[0] in [ "SH_DEFENSE_GRID", "SH_DEFLECTOR" , "SH_MULTISPEC" ] or (len(design.parts)==1 and design.parts[0]==''): - print string1, "-- classifying as Base Defense" + #print string1, "-- classifying as Base Defense" return AIShipRoleType.SHIP_ROLE_BASE_DEFENSE else: - print string1, "-- classifying as Invalid" + #print string1, "-- classifying as Invalid" return AIShipRoleType.SHIP_ROLE_INVALID stats = foAI.foAIstate.getDesignStats(design) Modified: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py 2013-07-04 01:05:53 UTC (rev 6222) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2013-07-04 20:28:22 UTC (rev 6223) @@ -16,6 +16,7 @@ minMilAllocations = {} totMilRating=0 milShips=0 +verboseMilReporting=False def tryAgain(milFleetIDs, tryReset=False, round=""): for fid in milFleetIDs: @@ -173,16 +174,18 @@ allocationGroups.setdefault('capitol', []).append( ( capitalSysID, newAlloc, True, 2*capitalThreat) ) remainingMilRating -= newAlloc if "Main" in round or newAlloc >0: - print "Empire Capital System: (%d) %s -- threat : %d, military allocation: existing: %d ; new: %d"%(capitalSysID, universe.getSystem(capitalSysID).name , capitalThreat, alreadyAssignedRating[capitalSysID], newAlloc) - print "-----------------" + if verboseMilReporting: + print "Empire Capital System: (%d) %s -- threat : %d, military allocation: existing: %d ; new: %d"%(capitalSysID, universe.getSystem(capitalSysID).name , capitalThreat, alreadyAssignedRating[capitalSysID], newAlloc) + print "-----------------" #================================ #--------Empire Occupied Systems ---------- empirePlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) empireOccupiedSystemIDs = list( set(PlanetUtilsAI.getSystems(empirePlanetIDs)) - set([capitalSysID] ) ) if "Main" in round: - print "Empire-Occupied Systems: %s"%( [ "| %d %s |"%(eoSysID, universe.getSystem(eoSysID).name) for eoSysID in empireOccupiedSystemIDs ] ) - print "-----------------" + if verboseMilReporting: + print "Empire-Occupied Systems: %s"%( [ "| %d %s |"%(eoSysID, universe.getSystem(eoSysID).name) for eoSysID in empireOccupiedSystemIDs ] ) + print "-----------------" newAlloc=0 if len( empireOccupiedSystemIDs ) > 0: ocSysTotThreat = [ ( oSID, threatBias +safetyFactor*sum( [ foAI.foAIstate.systemStatus.get(oSID, {}).get(thrtKey, 0) for thrtKey in ['totalThreat', 'neighborThreat']] )) @@ -206,18 +209,21 @@ remainingMilRating -= thisAlloc ocSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - print "Provincial Occupied system %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) + if verboseMilReporting: + print "Provincial Occupied system %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) if "Main" in round or newAlloc >0: - print "Provincial Empire-Occupied Sytems under total threat: %d -- total mil allocation: existing %d ; new: %d"%(totocSysThreat, totCurAlloc, ocSysAlloc ) - print "-----------------" + if verboseMilReporting: + print "Provincial Empire-Occupied Sytems under total threat: %d -- total mil allocation: existing %d ; new: %d"%(totocSysThreat, totCurAlloc, ocSysAlloc ) + print "-----------------" #================================ #--------Top Targeted Systems ---------- #TODO: do native invasions highest priority otherTargetedSystemIDs = topTargetSystems if "Main" in round: - print "Top Colony and Invasion Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) - print "-----------------" + if verboseMilReporting: + print "Top Colony and Invasion 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 newAlloc=0 if len( otherTargetedSystemIDs ) > 0: @@ -240,19 +246,22 @@ remainingMilRating -= thisAlloc otSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - 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) + if verboseMilReporting: + 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) if "Main" in round or newAlloc >0: - print "-----------------" - print "Top Colony and Invasion Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) - print "-----------------" + if verboseMilReporting: + print "-----------------" + print "Top Colony and Invasion Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "-----------------" #================================ #--------Targeted Systems ---------- #TODO: do native invasions highest priority otherTargetedSystemIDs = [sysID for sysID in set( PlanetUtilsAI.getSystems(AIstate.opponentPlanetIDs)) if sysID not in topTargetSystems] if "Main" in round: - print "Other Invasion Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) - print "-----------------" + if verboseMilReporting: + print "Other Invasion 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 newAlloc=0 if len( otherTargetedSystemIDs ) > 0: @@ -275,16 +284,19 @@ remainingMilRating -= thisAlloc otSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - 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) + if verboseMilReporting: + 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) if "Main" in round or newAlloc >0: - print "-----------------" - print "Invasion Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) - print "-----------------" + if verboseMilReporting: + print "-----------------" + print "Invasion Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "-----------------" otherTargetedSystemIDs = [sysID for sysID in list(set(AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs)) if sysID not in topTargetSystems] if "Main" in round: - print "Other Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) - print "-----------------" + if verboseMilReporting: + print "Other Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) + print "-----------------" if len( otherTargetedSystemIDs ) > 0: otSysAlloc = 0 otSysThreat = [ ( oSID, safetyFactor*(threatBias +foAI.foAIstate.systemStatus.get(oSID, {}).get('totalThreat', 0)+0.5*foAI.foAIstate.systemStatus.get(oSID, {}).get('neighborThreat', 0) ) ) for oSID in otherTargetedSystemIDs ] @@ -306,11 +318,13 @@ remainingMilRating -= thisAlloc otSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - 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) + if verboseMilReporting: + 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) if "Main" in round or newAlloc >0: - print "-----------------" - print "Other Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) - print "-----------------" + if verboseMilReporting: + print "-----------------" + print "Other Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "-----------------" otherTargetedSystemIDs = [] targetableIDs = ColonisationAI.annexableSystemIDs.union( empire.fleetSupplyableSystemIDs ) @@ -324,8 +338,9 @@ break if "Main" in round: - print "Blockade Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) - print "-----------------" + if verboseMilReporting: + print "Blockade Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) + print "-----------------" if len( otherTargetedSystemIDs ) > 0: otSysAlloc = 0 otSysThreat = [ ( oSID, threatBias +safetyFactor*(foAI.foAIstate.systemStatus.get(oSID, {}).get('totalThreat', 0)+ 0.5*foAI.foAIstate.systemStatus.get(oSID, {}).get('neighborThreat', 0) ) ) for oSID in otherTargetedSystemIDs ] @@ -347,20 +362,23 @@ remainingMilRating -= thisAlloc otSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - 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) + if verboseMilReporting: + 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) if "Main" in round or newAlloc >0: - print "-----------------" - print "Blockade Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) - print "-----------------" + if verboseMilReporting: + 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 = (targetableIDs.union(interiorIDs)).difference( currentMilSystems ) interiorTargets = [sid for sid in interiorTargets1 if ( (threatBias + foAI.foAIstate.systemStatus.get(sid, {}).get('totalThreat', 0) >0.8*alreadyAssignedRating[sid] ) ) ] if "Main" in round: - print "" - print "Other Empire-Proximal Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in interiorTargets1 ] ) - print "-----------------" + if verboseMilReporting: + print "" + print "Other Empire-Proximal Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in interiorTargets1 ] ) + print "-----------------" # for these, calc fleet threat only, no neighbor threat, but use a multiplier for fleet safety newAlloc=0 if len(interiorTargets) >0: @@ -383,24 +401,28 @@ remainingMilRating -= thisAlloc otSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - 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) + if verboseMilReporting: + 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) if "Main" in round or newAlloc >0: + if verboseMilReporting: + print "-----------------" + print "Other Interior Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "-----------------" + elif "Main" in round: + if verboseMilReporting: print "-----------------" - print "Other Interior Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "No Other Interior Systems with fleet threat " print "-----------------" - elif "Main" in round: - print "-----------------" - print "No Other Interior Systems with fleet threat " - print "-----------------" monsterDens=[] #exploTargetIDs, _ = ExplorationAI.getCurrentExplorationInfo(verbose=False) exploTargetIDs=[] if "Main" in round: - print "" - print "Exploration-targeted Systems: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in exploTargetIDs ] ) - print "-----------------" + if verboseMilReporting: + print "" + print "Exploration-targeted Systems: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in exploTargetIDs ] ) + print "-----------------" # for these, calc fleet threat only, no neighbor threat, but use a multiplier for fleet safety newAlloc=0 if len(exploTargetIDs) > 0: @@ -427,11 +449,13 @@ remainingMilRating -= thisAlloc otSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - 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) + if verboseMilReporting: + 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) if "Main" in round or newAlloc >0: - print "-----------------" - print "Exploration-targeted s under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) - print "-----------------" + if verboseMilReporting: + print "-----------------" + print "Exploration-targeted s under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "-----------------" visibleSystemIDs = foAI.foAIstate.visInteriorSystemIDs.keys() + foAI.foAIstate. visBorderSystemIDs.keys() accessibleSystemIDs = [sysID for sysID in visibleSystemIDs if universe.systemsConnected(sysID, homeSystemID, empireID) ] @@ -439,9 +463,10 @@ 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] )) ] if "Main" in round: - print "" - print "Empire-Accessible Systems not yet allocated military: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID) and universe.getSystem(sysID).name) for sysID in borderTargets1 ] ) - print "-----------------" + if verboseMilReporting: + print "" + print "Empire-Accessible Systems not yet allocated military: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID) and universe.getSystem(sysID).name) for sysID in borderTargets1 ] ) + print "-----------------" # for these, calc fleet threat only, no neighbor threat, but use a multiplier for fleet safety newAlloc=0 if len(borderTargets) > 0: @@ -464,21 +489,25 @@ remainingMilRating -= thisAlloc otSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - 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) + if verboseMilReporting: + 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) if "Main" in round or newAlloc >0: + if verboseMilReporting: + print "-----------------" + print "Other Empire-Accessible Systems under total biased threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "-----------------" + elif "Main" in round: + if verboseMilReporting: print "-----------------" - print "Other Empire-Accessible Systems under total biased threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) + print "No Other Empire-Accessible Systems with biased local threat " print "-----------------" - elif "Main" in round: - print "-----------------" - print "No Other Empire-Accessible Systems with biased local threat " - print "-----------------" #monster den treatment probably unnecessary now if "Main" in round: - print "" - print "Big-Monster Dens: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in monsterDens ] ) - print "-----------------" + if verboseMilReporting: + print "" + print "Big-Monster Dens: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in monsterDens ] ) + print "-----------------" # for these, calc fleet threat only, no neighbor threat, but use a multiplier for fleet safety newAlloc=0 if len(monsterDens) > 0: @@ -496,9 +525,11 @@ remainingMilRating -= thisAlloc otSysAlloc += thisAlloc if "Main" in round or thisAlloc >0: - print "Monster Den %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) + if verboseMilReporting: + print "Monster Den %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) if "Main" in round or newAlloc >0: - print "-----------------" + if verboseMilReporting: + print "-----------------" if remainingMilRating <=6: @@ -525,7 +556,8 @@ if "Main" in round: MilitaryAllocations = newAllocations minMilAllocations = dict( [ (sid, alloc) for sid, alloc, takeAny, mm in allocations ] ) - print "------------------------------\nFinal %s Round Military Allocations: %s \n-----------------------"%(round, dict( [ (sid, alloc) for sid, alloc, minalloc, takeAny in newAllocations ] ) ) + if verboseMilReporting or "Main" in round: + print "------------------------------\nFinal %s Round Military Allocations: %s \n-----------------------"%(round, dict( [ (sid, alloc) for sid, alloc, minalloc, takeAny in newAllocations ] ) ) # export military systems for other AI modules if "Main" in round: @@ -646,7 +678,8 @@ if theseFleets == []: if foundFleets==[] or not ( FleetUtilsAI.statsMeetReqs( foundStats, {'rating':minalloc}) or takeAny): if doingMain: - 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) + if verboseMilReporting: + 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: @@ -654,12 +687,12 @@ #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 doingMain: + if doingMain and verboseMilReporting: 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: print "FULL MIN military allocation for system %d ( %s ) -- requested allocation %8d -- got %8d with fleets %s "%(sysID, universe.getSystem(sysID).name, minMilAllocations.get(sysID, 0) , rating, theseFleets) - elif doingMain: + elif doingMain and verboseMilReporting: print "FULL+ military allocation for system %d ( %s ) -- requested allocation %8d, got %8d with fleets %s"%(sysID, universe.getSystem(sysID).name, alloc, foundStats.get('rating', 0), theseFleets) aiTarget = AITarget.AITarget(AITargetType.TARGET_SYSTEM, sysID) for fleetID in theseFleets: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-07-04 01:05:53 UTC (rev 6222) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-07-04 20:28:22 UTC (rev 6223) @@ -1042,28 +1042,55 @@ print "Requeueing %s to front of build queue, with result %d"%(bldName, res) break #only initiate max of one new build per turn + colonyShipMap={} + for fid in FleetUtilsAI.getEmpireFleetIDsByRole( EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION): + fleet = universe.getFleet(fid) + if not fleet: continue + for shipID in fleet.shipIDs: + thisShip=universe.getShip(shipID) + if thisShip and (foAI.foAIstate.getShipRole(thisShip.design.id) ==EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION): + colonyShipMap.setdefault( thisShip.speciesName, []).append(1) + bldName = "BLD_CONC_CAMP" + verboseCamp = False bldType = fo.getBuildingType(bldName) for pid in AIstate.popCtrIDs: planet=universe.getPlanet(pid) if not planet: continue + canBuildCamp = bldType.canBeProduced(empire.empireID, pid) tPop = planet.currentMeterValue(fo.meterType.targetPopulation) tInd=planet.currentMeterValue(fo.meterType.targetIndustry) cInd=planet.currentMeterValue(fo.meterType.industry) cPop = planet.currentMeterValue(fo.meterType.population) - if (cPop <= 32) or (cPop < 0.8*tPop) or ( (planet.speciesName not in ColonisationAI.empireColonizers) and cPop < 50 ): #check even if not aggressive, etc, just in case acquired planet with a ConcCamp on it + popDisqualified = (cPop <= 32) or (cPop < 0.8*tPop) + checkedCamp=False + builtCamp=False + thisSpec = planet.speciesName + safetyMarginMet = ( (thisSpec in ColonisationAI.empireColonizers and ( len(ColonisationAI.empireSpecies.get(thisSpec, [])+colonyShipMap.get(thisSpec, []))>=2 )) or (cPop >= 50 )) + if popDisqualified or not safetyMarginMet : #check even if not aggressive, etc, just in case acquired planet with a ConcCamp on it + if canBuildCamp: + if popDisqualified: + if verboseCamp: + print "Conc Camp disqualified at %s due to low pop: current %.1f target: %.1f"%(planet.name, cPop, tPop) + else: + if verboseCamp: + print "Conc Camp disqualified at %s due to safety margin; species %s, colonizing planets %s, with %d colony ships"%(planet.name, planet.speciesName, ColonisationAI.empireSpecies.get(planet.speciesName, []), len(colonyShipMap.get(planet.speciesName, []))) for bldg in planet.buildingIDs: if universe.getObject(bldg).buildingTypeName == bldName: res=fo.issueScrapOrder( bldg) print "Tried scrapping %s at planet %s, got result %d"%(bldName, planet.name, res) - elif foAI.foAIstate.aggression>fo.aggression.typical and empire.buildingTypeAvailable(bldName) and (tPop >= 36) : + elif foAI.foAIstate.aggression>fo.aggression.typical and canBuildCamp and (tPop >= 36): + checkedCamp=True if (planet.focus== EnumsAI.AIFocusType.FOCUS_GROWTH) or ("COMPUTRONIUM_SPECIAL" in planet.specials): #continue pass # now that focus setting takes these into account, probably works ok to have conc camp queuedBldLocs = [element.locationID for element in productionQueue if (element.name==bldName) ] - if (cPop >=0.95*tPop) and( (planet.speciesName in ColonisationAI.empireColonizers) or cPop >= 50 ):# - if pid not in queuedBldLocs and bldType.canBeProduced(empire.empireID, pid):#TODO: verify that canBeProduced() checks for prexistence of a barring building + if (cPop <0.95*tPop):# + if verboseCamp: + print "Conc Camp disqualified at %s due to pop: current %.1f target: %.1f"%(planet.name, cPop, tPop) + else: + if pid not in queuedBldLocs: if planet.focus in [ EnumsAI.AIFocusType.FOCUS_INDUSTRY ]: if cInd >= tInd+cPop: continue @@ -1077,11 +1104,14 @@ universe.updateMeterEstimates([pid]) continue res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + builtCamp = res 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 - + if verboseCamp: + print "conc camp status at %s : checkedCamp: %s, builtCamp: %s"%( planet.name, canBuildCamp, builtCamp) + bldName = "BLD_SCANNING_FACILITY" if empire.buildingTypeAvailable(bldName): bldType = fo.getBuildingType(bldName) @@ -1313,7 +1343,7 @@ del localPriorities[priority] #must be missing a shipyard -- TODO build a shipyard if necessary continue bestShips[priority] = [bestShip, bestDesign, buildChoices ] - print "bestShips[%s] = %s \t locs from %s"%( EnumsAI.AIPriorityNames[priority], bestShips[priority] , pSet) + print "bestShips[%s] = %s \t locs from %s"%( EnumsAI.AIPriorityNames[priority], bestDesign.name(False) , pSet) if len(localPriorities)==0: print "Alert!! need shipyards in systemSet ", PlanetUtilsAI.sysNameIDs(set(PlanetUtilsAI.getSystems( sorted(pSet)))) Modified: trunk/FreeOrion/default/AI/ResourcesAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResourcesAI.py 2013-07-04 01:05:53 UTC (rev 6222) +++ trunk/FreeOrion/default/AI/ResourcesAI.py 2013-07-04 20:28:22 UTC (rev 6223) @@ -27,6 +27,7 @@ GFocus = AIFocusType.FOCUS_GROWTH useGrowth = True +limitAssessments = False lastFociCheck=[0] @@ -146,7 +147,7 @@ empireID = empire.empireID currentTurn = fo.currentTurn() freq = min(3, ( max(5, currentTurn-120) )/4.0)**(1.0/3) - if ( abs(currentTurn - lastFociCheck[0] ) <1.5*freq) and ( random() < 1.0/freq ) : + if limitAssessments and ( abs(currentTurn - lastFociCheck[0] ) <1.5*freq) and ( random() < 1.0/freq ) : timer = 6*[time()] else: lastFociCheck[0]=currentTurn @@ -211,6 +212,7 @@ if result == 1: universe.updateMeterEstimates(empirePlanetIDs) if curFocus == RFocus or result==1: + print "%s focus of planet %s (%d) (with Computronium Moon) at Research Focus"%( ["set", "left" ][ curFocus == RFocus ] , planetMap[pid].name, pid) if pid in empirePlanetIDs: del empirePlanetIDs[ empirePlanetIDs.index( pid ) ] elif ( ([bld.buildingTypeName for bld in map( universe.getObject, planet.buildingIDs) if bld.buildingTypeName in @@ -232,6 +234,7 @@ print ("Error: Failed setting %s for Concentration Camp planet %s (%d) with species %s and current focus %s, but new planet copy shows %s"% ( newFoci[pid], planetMap[pid].name, pid, planetMap[pid].speciesName, planetMap[pid].focus, newplanet.focus )) if curFocus == IFocus or result==1: + print "%s focus of planet %s (%d) (with Concentration Camps/Remnants) at Industry Focus"%( ["set", "left" ][ curFocus == IFocus ] , planetMap[pid].name, pid) if pid in empirePlanetIDs: del empirePlanetIDs[ empirePlanetIDs.index( pid ) ] @@ -260,7 +263,7 @@ CI, CR = currentOutput[pid][ IFocus], currentOutput[pid][ RFocus] #if AI is aggressive+, and this planet in range where temporary Research focus can get an additional RP at cost of 1 PP, and still need some RP, then do it if True and (foAI.foAIstate.aggression >= fo.aggression.aggressive): - if (CR<=RR-1) and ( (CR-IR) >= (II-CI) ) and (priorityRatio > 0.8* ( (CR+1)/ max(0.001, CI -1))): + if ( CI > II ) or ( (CR<=RR-1) and ( (CR-IR) >= (II-CI) ) and (priorityRatio > 0.8* ( (CR+1)/ max(0.001, CI -1)))): curTargetPP += CI -1 # curTargetRP += CR+1 newFoci[pid] = RFocus |
From: <dil...@us...> - 2013-07-10 03:22:33
|
Revision: 6229 http://sourceforge.net/p/freeorion/code/6229 Author: dilvish-fo Date: 2013-07-10 03:22:29 +0000 (Wed, 10 Jul 2013) Log Message: ----------- AI tweaks Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.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-07-08 16:48:59 UTC (rev 6228) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-07-10 03:22:29 UTC (rev 6229) @@ -28,6 +28,7 @@ annexablePlanetIDs=set([]) curBestMilShipRating = 20 allColonyOpportunities = {} +gotRuins=False 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 } @@ -69,7 +70,7 @@ allColonyOpportunities.clear() def getColonyFleets(): - global curBestMilShipRating + global curBestMilShipRating, gotRuins curBestMilShipRating = ProductionAI.curBestMilShipRating() @@ -186,6 +187,8 @@ planet=universe.getPlanet(pid) if planet: AIstate.colonizedSystems.setdefault(planet.systemID, []).append(pid) # track these to plan Solar Generators and Singularity Generators, etc. + if "ANCIENT_RUINS_SPECIAL" in planet.specials: + gotRuins = True AIstate.empireStars.clear() for sysID in AIstate.colonizedSystems: system = universe.getSystem(sysID) @@ -588,11 +591,12 @@ fixedRes += discountMultiplier*2*3 detail.append( "ECCENTRIC_ORBIT_SPECIAL %.1f"%(discountMultiplier*2*3 ) ) - if ( "ANCIENT_RUINS_SPECIAL" in planet.specials ): #TODO: add value for depleted ancient ruins - retval += discountMultiplier*20 - detail.append("Undepleted Ruins %.1f"%discountMultiplier*20) + if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): - if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): + if ( "ANCIENT_RUINS_SPECIAL" in planet.specials ): #TODO: add value for depleted ancient ruins + retval += discountMultiplier*30 + detail.append("Undepleted Ruins %.1f"%discountMultiplier*30) + for special in planetSpecials: nestVal = 0 if "_NEST_" in special: @@ -665,6 +669,11 @@ else: #colonization mission if not species: return 0 + + if ( "ANCIENT_RUINS_SPECIAL" in planet.specials ): #TODO: add value for depleted ancient ruins + retval += discountMultiplier*50 + detail.append("Undepleted Ruins %.1f"%discountMultiplier*50) + popTagMod = 1.0 indTagMod = 1.0 resTagMod = 1.0 Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-07-08 16:48:59 UTC (rev 6228) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-07-10 03:22:29 UTC (rev 6229) @@ -184,12 +184,34 @@ elif fo.currentTurn() >100: generateDefaultResearchOrders() - #researchQueueList = getResearchQueueTechs() + researchQueueList = getResearchQueueTechs() if fo.currentTurn() >50 and len (AIstate.empireStars.get(fo.starType.blackHole, []))!=0 and foAI.foAIstate.aggression > fo.aggression.cautious: for singTech in [ "CON_ARCH_PSYCH", "CON_CONC_CAMP", "LRN_GRAVITONICS" , "PRO_SINGULAR_GEN"]: if (empire.getTechStatus(singTech) != fo.techStatus.complete) and ( singTech not in researchQueueList[:4]) : res=fo.issueEnqueueTechOrder(singTech,0) print "have a black hole star outpost/colony, so attempted to fast-track %s, got result %d"%(singTech, res) + researchQueueList = getResearchQueueTechs() + + if ColonisationAI.gotRuins: + if empire.getTechStatus("LRN_XENOARCH") != fo.techStatus.complete and "LRN_XENOARCH" not in researchQueueList[:4]: + for xenoTech in [ "LRN_XENOARCH", "LRN_TRANSLING_THT", "LRN_PHYS_BRAIN" , "LRN_ALGO_ELEGANCE"]: + if (empire.getTechStatus(xenoTech) != fo.techStatus.complete) and ( xenoTech not in researchQueueList[:4]) : + res=fo.issueEnqueueTechOrder(xenoTech,0) + print "ANCIENT_RUINS: have an ancient ruins, so attempted to fast-track %s to enable LRN_XENOARCH, got result %d"%(xenoTech, res) + + if empire.getTechStatus("SHP_WEAPON_4_1" ) == fo.techStatus.complete: + thisTech=fo.getTech("SHP_WEAPON_4_1") + if thisTech: + missingPrereqs = [preReq for preReq in thisTech.recursivePrerequisites(empireID) if preReq in researchQueueList] + if len(missingPrereqs) > 2 : + for preReq in sorted(missingPrereqs, reverse=True)[2:]: #leave plasma 4 and 3 + if preReq not in researchQueueList: + break + res = fo.issueDequeueTechOrder(preReq) + researchQueueList = getResearchQueueTechs() + if "SHP_WEAPON_4_2" in researchQueueList: #(should be) + idx = researchQueueList.index("SHP_WEAPON_4_2") + res=fo.issueEnqueueTechOrder("SHP_WEAPON_4_2", max(0, idx-15) ) def generateResearchOrders_old(): "generate research orders" Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-07-08 16:48:59 UTC (rev 6228) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-07-10 03:22:29 UTC (rev 6229) @@ -100,8 +100,8 @@ "SHP_BIOADAPTIVE_SPEC", "PRO_SINGULAR_GEN", "CON_NDIM_STRC", + "GRO_XENO_HYBRIDS", "SHP_PLASMA_SHIELD", - "GRO_XENO_HYBRIDS", "SHP_CONT_BIOADAPT", "SHP_SENT_HULL", "LRN_TIME_MECH", @@ -214,8 +214,8 @@ "SHP_MONOCELL_EXP", "SHP_BIOADAPTIVE_SPEC", "PRO_SINGULAR_GEN", + "GRO_XENO_HYBRIDS", "SHP_PLASMA_SHIELD", - "GRO_XENO_HYBRIDS", "SHP_CONT_BIOADAPT", "SHP_SENT_HULL", "LRN_TIME_MECH", |
From: <dil...@us...> - 2013-07-24 16:02:04
|
Revision: 6261 http://sourceforge.net/p/freeorion/code/6261 Author: dilvish-fo Date: 2013-07-24 16:02:01 +0000 (Wed, 24 Jul 2013) Log Message: ----------- fixed bug causing AI to prematurely terminate certain military missions Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/FleetUtilsAI.py Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2013-07-24 11:31:42 UTC (rev 6260) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2013-07-24 16:02:01 UTC (rev 6261) @@ -255,10 +255,10 @@ # TODO: priority ordersCompleted = True - print "Checking orders for fleet %d"%(self.getAITargetID()) - #print "\t Full Orders are:" + print "Checking orders for fleet %d (on turn %d)"%(self.getAITargetID(), fo.currentTurn()) + #print "\t\t\t Full Orders are:" #for aiFleetOrder2 in self.getAIFleetOrders(): - # print "\t\t %s"%aiFleetOrder2 + # print "\t\t\t\t %s"%aiFleetOrder2 for aiFleetOrder in self.getAIFleetOrders(): #print " %s"%(aiFleetOrder) clearAll=False @@ -337,11 +337,22 @@ 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 + lastSystTarget = -1 if orders and lastOrder.getAIFleetOrderType() == EnumsAI.AIFleetOrderType.ORDER_MILITARY: + lastSystTarget = lastOrder.getTargetAITarget().getTargetID() # 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 + + if (lastSystTarget 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()) + secureType="Unidentified" + if (lastSystTarget in AIstate.colonyTargetedSystemIDs): + secureType = "Colony" + elif lastSystTarget in AIstate.outpostTargetedSystemIDs : + secureType = "Outpost" + elif lastSystTarget in AIstate.invasionTargetedSystemIDs : + secureType = "Invasion" + elif lastSystTarget in AIstate.blockadeTargetedSystemIDs : + secureType = "Blockade" + print "Fleet %d has completed initial stage of its mission to secure system %d (targeted for %s), may release a portion of ships"%(self.getAITargetID() , lastSystTarget, secureType) clearAll=False fleetID=self.getAITargetID() fleet=universe.getFleet(fleetID) @@ -366,7 +377,13 @@ MilitaryAI.assignMilitaryFleetsToSystems(useFleetIDList=[fleetID], allocations=allocations) else: #TODO: evaluate releasing a smaller portion or none of the ships - newFleets=FleetUtilsAI.splitFleet(self.getAITargetID() ) #at least first stage of current task is done; release extra ships for potential other deployments + sysStatus = foAI.foAIstate.systemStatus.setdefault(lastSystTarget, {}) + newFleets=[] + if (sysStatus.get('totalThreat', 0) == 0): + print "No current threat in target system; releasing a portion of ships." + newFleets=FleetUtilsAI.splitFleet(self.getAITargetID() ) #at least first stage of current task is done; release extra ships for potential other deployments + else: + print "Threat remains in target system; NOT releasing any ships." newMilFleets = [] for fleetID in newFleets: if foAI.foAIstate.getFleetRole(fleetID) in [ EnumsAI.AIFleetMissionType.FLEET_MISSION_MILITARY, @@ -375,7 +392,9 @@ EnumsAI.AIFleetMissionType.FLEET_MISSION_HIT_AND_RUN, EnumsAI.AIFleetMissionType.FLEET_MISSION_SECURE ]: newMilFleets.append(fleetID) - allocations = MilitaryAI.getMilitaryFleets(milFleetIDs=newMilFleets, tryReset=False, round="Fleet Reassignment %s"%newMilFleets) + allocations=[] + if newMilFleets: + allocations = MilitaryAI.getMilitaryFleets(milFleetIDs=newMilFleets, tryReset=False, round="Fleet Reassignment %s"%newMilFleets) if allocations: MilitaryAI.assignMilitaryFleetsToSystems(useFleetIDList=newMilFleets, allocations=allocations) Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-07-24 11:31:42 UTC (rev 6260) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-07-24 16:02:01 UTC (rev 6261) @@ -390,14 +390,15 @@ "generates fleet orders from targets" print("Generating fleet orders") - print "" + # The following fleet lists are based on *Roles* -- Secure type missions are done by fleets with Military Roles + print "Fleets by Role\n" 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 "Military Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY)) print "Orbital Defense Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE)) print "Outpost Base Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST)) print "Securing Fleets : " + str(getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_SECURE)) + " (currently FLEET_MISSION_MILITARY should be used instead of this Role)" @@ -453,11 +454,20 @@ militaryAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_MILITARY]) if len( militaryAIFleetMissions) >0: - print "Military targets: " + print "General Military targets: " else: - print "Military targets: None" + print "General Military targets: None" for militaryAIFleetMission in militaryAIFleetMissions: print " " + str(militaryAIFleetMission) + + secureAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_SECURE]) + if len( secureAIFleetMissions) >0: + print "Secure targets: " + else: + print "Secure targets: None" + for secureAIFleetMission in secureAIFleetMissions: + print " " + str(secureAIFleetMission) + orbDefenseAIFleetMissions = foAI.foAIstate.getAIFleetMissionsWithAnyMissionTypes([AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE]) if len( orbDefenseAIFleetMissions) >0: print "Orbital Defense targets: " |
From: <mar...@us...> - 2013-09-07 09:56:19
|
Revision: 6401 http://sourceforge.net/p/freeorion/code/6401 Author: marcel_metz Date: 2013-09-07 09:56:17 +0000 (Sat, 07 Sep 2013) Log Message: ----------- Fixed indentation as suggested by pylint for better PEP-8 compliance. Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.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/InvasionAI.py trunk/FreeOrion/default/AI/MoveUtilsAI.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 Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -91,7 +91,7 @@ def checkMergers(self, fleetID=None, context=""): if fleetID==None: - fleetID = self.getAITargetID() + fleetID = self.getAITargetID() #mainFleetMission=foAI.foAIstate.getAIFleetMission(fleetID) mainMissionTypeList = self.getAIMissionTypes() #normally, currently, should only be one if len( mainMissionTypeList ) != 1: @@ -271,7 +271,7 @@ if ( (planet.currentMeterValue(fo.meterType.population) >0) or not ( planet.unowned or planet.ownedBy(fo.empireID()) ) ) : clearAll =True elif not planet.unowned: - clearAll =True + clearAll =True if clearAll: print " %s"%(aiFleetOrder) print "Fleet %d had a target planet that is no longer valid for this mission; aborting."%(self.getAITargetID() ) Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -635,7 +635,7 @@ if float(thisRating.get('overall', 0))/thisRating.get('nships', 1) >= 0.5 * ProductionAI.curBestMilShipRating(): makeAggressive=True else: - makeAggressive=True + makeAggressive=True fo.issueAggressionOrder(fleetID, makeAggressive) return role Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -372,10 +372,10 @@ for queue_index in range(0, len(productionQueue)): element=productionQueue[queue_index] if element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: - if foAI.foAIstate.getShipRole(element.designID) in [ EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST , + if foAI.foAIstate.getShipRole(element.designID) in [ EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST , EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_COLONISATION ] : - buildPlanet = universe.getPlanet(element.locationID) - queuedBases.append(buildPlanet.systemID) + buildPlanet = universe.getPlanet(element.locationID) + queuedBases.append(buildPlanet.systemID) evaluatedColonyPlanetIDs = list(set(unOwnedPlanetIDs).union(empireOutpostIDs) - set(colonyTargetedPlanetIDs) ) @@ -392,7 +392,7 @@ system=universe.getSystem(sysID) for pid3 in system.planetIDs: if (pid3 not in empirePopCtrs): - foAI.foAIstate.qualifyingColonyBaseTargets.setdefault(pid3, [pid2, -1]) + foAI.foAIstate.qualifyingColonyBaseTargets.setdefault(pid3, [pid2, -1]) break # print "Evaluated Colony PlanetIDs: " + str(evaluatedColonyPlanetIDs) Modified: trunk/FreeOrion/default/AI/EnumsAI.py =================================================================== --- trunk/FreeOrion/default/AI/EnumsAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/EnumsAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -161,40 +161,40 @@ return __getInterval(0, 10) def getFleetOrderTypeForMission(aiFleetMissionType, option=None): - if aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_EXPLORATION: - return AIFleetOrderType.ORDER_MOVE - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_OUTPOST: - return AIFleetOrderType.ORDER_OUTPOST - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_COLONISATION: - return AIFleetOrderType.ORDER_COLONISE - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_SPLIT_FLEET: #not really supported in this fashion currently - return AIFleetOrderType.ORDER_SPLIT_FLEET - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_MERGE_FLEET: #not really supported in this fashion currently - return AIFleetOrderType.ORDER_MERGE_FLEET - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_HIT_AND_RUN: # currently same as MILITARY - return AIFleetOrderType.ORDER_MILITARY - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ATTACK: # currently same as MILITARY - return AIFleetOrderType.ORDER_MILITARY - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_DEFEND: # currently same as MILITARY - return AIFleetOrderType.ORDER_MILITARY - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_LAST_STAND: # currently same as MILITARY - return AIFleetOrderType.ORDER_MILITARY - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_INVASION: - return AIFleetOrderType.ORDER_INVADE - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_MILITARY: - return AIFleetOrderType.ORDER_MILITARY - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_SECURE: # mostly same as MILITARY, but waits for system removal from all targeted system lists (invasion, colonization, outpost, blockade) before clearing - return AIFleetOrderType.ORDER_MILITARY - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE: - return AIFleetOrderType.ORDER_DEFEND - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ORBITAL_INVASION: - return AIFleetOrderType.ORDER_INVADE - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST: - return AIFleetOrderType.ORDER_OUTPOST - elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ORBITAL_COLONISATION: - return AIFleetOrderType.ORDER_COLONISE - else: - return AIFleetOrderType.ORDER_INVALID + if aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_EXPLORATION: + return AIFleetOrderType.ORDER_MOVE + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_OUTPOST: + return AIFleetOrderType.ORDER_OUTPOST + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_COLONISATION: + return AIFleetOrderType.ORDER_COLONISE + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_SPLIT_FLEET: #not really supported in this fashion currently + return AIFleetOrderType.ORDER_SPLIT_FLEET + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_MERGE_FLEET: #not really supported in this fashion currently + return AIFleetOrderType.ORDER_MERGE_FLEET + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_HIT_AND_RUN: # currently same as MILITARY + return AIFleetOrderType.ORDER_MILITARY + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ATTACK: # currently same as MILITARY + return AIFleetOrderType.ORDER_MILITARY + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_DEFEND: # currently same as MILITARY + return AIFleetOrderType.ORDER_MILITARY + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_LAST_STAND: # currently same as MILITARY + return AIFleetOrderType.ORDER_MILITARY + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_INVASION: + return AIFleetOrderType.ORDER_INVADE + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_MILITARY: + return AIFleetOrderType.ORDER_MILITARY + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_SECURE: # mostly same as MILITARY, but waits for system removal from all targeted system lists (invasion, colonization, outpost, blockade) before clearing + return AIFleetOrderType.ORDER_MILITARY + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE: + return AIFleetOrderType.ORDER_DEFEND + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ORBITAL_INVASION: + return AIFleetOrderType.ORDER_INVADE + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST: + return AIFleetOrderType.ORDER_OUTPOST + elif aiFleetMissionType == AIFleetMissionType.FLEET_MISSION_ORBITAL_COLONISATION: + return AIFleetOrderType.ORDER_COLONISE + else: + return AIFleetOrderType.ORDER_INVALID class AIShipDesignTypes(object): explorationShip = {"SD_SCOUT":"A", "Scout":"B", "Tracker":"C"} Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -13,7 +13,7 @@ def statsMeetReq(stats, reqs, reqName): if stats.get(reqName, 0) < reqs.get(reqName, 0): - return False + return False return True def statsMeetReqs(stats, reqs): @@ -133,7 +133,7 @@ if not fleet.ownedBy(empireID): return [] if len(list(fleet.shipIDs)) <= 1: # fleet with only one ship cannot be split - return [] + return [] shipIDs = list( fleet.shipIDs ) for shipID in shipIDs[1:]: newFleetID = fo.issueNewFleetOrder("Fleet %d"%(shipID), shipID) @@ -159,61 +159,61 @@ return newfleets def mergeFleetAintoB(fleetA_ID, fleetB_ID, leaveRating=0, needRating=0, context=""): - universe = fo.getUniverse() - fleetA = universe.getFleet(fleetA_ID) - sysID=fleetA.systemID - fleetB = universe.getFleet(fleetB_ID) - if not fleetA or not fleetB: - return 0 - success = True - initRating = foAI.foAIstate.getRating(fleetA_ID) - remainingRating = initRating.copy() - transferredRating = 0 - transferredAttack=0 - transferredHealth=0 - BHasMonster=False - for shipID in fleetB.shipIDs: - thisShip=universe.getShip(shipID) - if (not thisShip): - continue - if thisShip.isMonster: - BHasMonster = True - break - for shipID in fleetA.shipIDs: - thisShip=universe.getShip(shipID) - if (not thisShip) or ( thisShip.isMonster != BHasMonster ) : - continue - stats = foAI.foAIstate.getDesignIDStats(thisShip.designID) - thisRating = stats['attack'] * ( stats['structure'] + stats['shields'] ) - if (remainingRating['attack'] -stats['attack'])*(remainingRating['health'] -( stats['structure'] + stats['shields'] )) < leaveRating: - continue - #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'] ) - else: - print "\t\t\t\t *** attempted 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 <= transferredAttack*transferredHealth: #transferredRating: - break - fleetA = universe.getFleet(fleetA_ID) - if (not fleetA) or fleetA.empty or fleetA_ID in universe.destroyedObjectIDs(fo.empireID()): - #print "\t\t\t\t\tdeleting fleet info for old fleet %d after transfers into fleet %d"%(fleetA_ID, fleetB_ID) - foAI.foAIstate.deleteFleetInfo(fleetA_ID) + universe = fo.getUniverse() + fleetA = universe.getFleet(fleetA_ID) + sysID=fleetA.systemID + fleetB = universe.getFleet(fleetB_ID) + if not fleetA or not fleetB: + return 0 + success = True + initRating = foAI.foAIstate.getRating(fleetA_ID) + remainingRating = initRating.copy() + transferredRating = 0 + transferredAttack=0 + transferredHealth=0 + BHasMonster=False + for shipID in fleetB.shipIDs: + thisShip=universe.getShip(shipID) + if (not thisShip): + continue + if thisShip.isMonster: + BHasMonster = True + break + for shipID in fleetA.shipIDs: + thisShip=universe.getShip(shipID) + if (not thisShip) or ( thisShip.isMonster != BHasMonster ) : + continue + stats = foAI.foAIstate.getDesignIDStats(thisShip.designID) + thisRating = stats['attack'] * ( stats['structure'] + stats['shields'] ) + if (remainingRating['attack'] -stats['attack'])*(remainingRating['health'] -( stats['structure'] + stats['shields'] )) < leaveRating: + continue + #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'] ) 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['overall']) - pass - 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']) - pass - foAI.foAIstate.updateFleetRating(fleetB_ID) - return transferredAttack*transferredHealth, transferredAttack, transferredHealth + print "\t\t\t\t *** attempted 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 <= transferredAttack*transferredHealth: #transferredRating: + break + fleetA = universe.getFleet(fleetA_ID) + if (not fleetA) or fleetA.empty or fleetA_ID in universe.destroyedObjectIDs(fo.empireID()): + #print "\t\t\t\t\tdeleting fleet info for old fleet %d after transfers into fleet %d"%(fleetA_ID, fleetB_ID) + 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"%(transferredAttack*transferredHealth, fleetA_ID, fleetB_ID, newARating['overall']) + pass + 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']) + pass + foAI.foAIstate.updateFleetRating(fleetB_ID) + return transferredAttack*transferredHealth, transferredAttack, transferredHealth def fleetHasShipWithRole(fleetID, shipRole): "returns True if a ship with shipRole is in the fleet" Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -177,7 +177,7 @@ planetPartialVisTurn = dictFromMap(universe.getVisibilityTurnsMap(planetID, empireID)).get(fo.visibility.partial, -9999) if planetPartialVisTurn < sysPartialVisTurn: - return 0, 0 #last time we had partial vis of the system, the planet was stealthed to us #TODO: track detection strength, order new scouting when it goes up + return 0, 0 #last time we had partial vis of the system, the planet was stealthed to us #TODO: track detection strength, order new scouting when it goes up specName=planet.speciesName species=fo.getSpecies(specName) @@ -224,9 +224,9 @@ if planet.owner== -1: #if (pmaxShield <10): if ( sysFThrt < 0.5*ProductionAI.curBestMilShipRating() ): - if ( sysMThrt < 3*ProductionAI.curBestMilShipRating()): + if ( sysMThrt < 3*ProductionAI.curBestMilShipRating()): supplyVal = 50 - else: + else: supplyVal = 20 else: supplyVal *= int( min(1, ProductionAI.curBestMilShipRating() / sysFThrt ) ) Modified: trunk/FreeOrion/default/AI/MoveUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/MoveUtilsAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/MoveUtilsAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -71,7 +71,7 @@ targetSysID in annexableRing1 and len( unsuppliedStops) < fuel or foAI.foAIstate.aggression >=fo.aggression.typical and targetSysID in annexableRing2 and len( unsuppliedStops) < fuel -1 or foAI.foAIstate.aggression >=fo.aggression.aggressive and targetSysID in annexableRing3 and len( unsuppliedStops) < fuel -2 ): - retPath = [ AITarget.AITarget(AITargetType.TARGET_SYSTEM, sid) for sid in shortPath] + retPath = [ AITarget.AITarget(AITargetType.TARGET_SYSTEM, sid) for sid in shortPath] else: #print " getting path from 'canTravelToSystemAndReturnToResupply' ", retPath = canTravelToSystemAndReturnToResupply(fleetID, fromSystemAITarget, toSystemAITarget, empireID, verbose=True) Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -168,8 +168,8 @@ for queue_index in range(0, len(productionQueue)): element=productionQueue[queue_index] if element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_EXPLORATION : - queuedScoutShips += element.remaining * element.blocksize + if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_EXPLORATION : + queuedScoutShips += element.remaining * element.blocksize milShips = MilitaryAI.milShips scoutsNeeded = max(0, min( 4+int(milShips/5), 4+int(fo.currentTurn()/50) , 2+ numUnexploredSystems**0.5 ) - numScouts - queuedScoutShips ) @@ -254,9 +254,9 @@ for queue_index in range(0, len(productionQueue)): element=productionQueue[queue_index] if element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: - if foAI.foAIstate.getShipRole(element.designID) in [ EnumsAI.AIShipRoleType.SHIP_ROLE_MILITARY_INVASION, EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_INVASION] : - design = fo.getShipDesign(element.designID) - queuedTroopPods += element.remaining*element.blocksize * list(design.parts).count("GT_TROOP_POD") + if foAI.foAIstate.getShipRole(element.designID) in [ EnumsAI.AIShipRoleType.SHIP_ROLE_MILITARY_INVASION, EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_INVASION] : + design = fo.getShipDesign(element.designID) + queuedTroopPods += element.remaining*element.blocksize * list(design.parts).count("GT_TROOP_POD") bestShip, bestDesign, buildChoices = ProductionAI.getBestShipInfo( EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_INVASION) if bestDesign: troopsPerBestShip = troopsPerPod*( list(bestDesign.parts).count("GT_TROOP_POD") ) @@ -323,9 +323,9 @@ threatRoot = status.get('fleetThreat', 0)**0.5 + status.get('planetThreat', 0)**0.5 + monsterThreat**0.5 if sysID in mySystems: - threatRoot += (0.3* status.get('neighborThreat', 0))**0.5 + threatRoot += (0.3* status.get('neighborThreat', 0))**0.5 else: - threatRoot += (0.1* status.get('neighborThreat', 0))**0.5 + threatRoot += (0.1* status.get('neighborThreat', 0))**0.5 threat = threatRoot**2 unmetThreat += max( 0, threat - myRating ) shipsNeeded += math.ceil( max(0, (threatRoot/cSRR)- (myRating/curShipRating)**0.5 ) ) Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -1297,15 +1297,15 @@ else: print "element %s will never be completed as currently stands, but will remain on queue "%element.name elif element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION: - thisSpec=universe.getPlanet(element.locationID).speciesName - queuedColonyShips[thisSpec] = queuedColonyShips.get(thisSpec, 0) + element.remaining*element.blocksize - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_OUTPOST: - queuedOutpostShips+= element.remaining*element.blocksize - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST: - queuedOutpostShips+= element.remaining*element.blocksize - if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_MILITARY_INVASION: - queuedTroopShips+= element.remaining*element.blocksize + if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION: + thisSpec=universe.getPlanet(element.locationID).speciesName + queuedColonyShips[thisSpec] = queuedColonyShips.get(thisSpec, 0) + element.remaining*element.blocksize + if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_OUTPOST: + queuedOutpostShips+= element.remaining*element.blocksize + if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST: + queuedOutpostShips+= element.remaining*element.blocksize + if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_MILITARY_INVASION: + queuedTroopShips+= element.remaining*element.blocksize if queuedColonyShips: print "\nFound colony ships in build queue: %s"%queuedColonyShips if queuedOutpostShips: @@ -1545,8 +1545,8 @@ if totalPP > 10* perTurnCost : leadingBlockPP = 0 for elem in [productionQueue[elemi] for elemi in range(0, min(4, productionQueue.size))]: - cost, time = empire.productionCostAndTime( elem ) - leadingBlockPP += elem.blocksize *cost/time + cost, time = empire.productionCostAndTime( elem ) + leadingBlockPP += elem.blocksize *cost/time if leadingBlockPP > 0.5* totalPP or (militaryEmergency and thisPriority==EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_MILITARY ): res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front print "" Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -200,18 +200,18 @@ print "ANCIENT_RUINS: have an ancient ruins, so attempted to fast-track %s to enable LRN_XENOARCH, got result %d"%(xenoTech, res) if empire.getTechStatus("SHP_WEAPON_4_1" ) == fo.techStatus.complete: - thisTech=fo.getTech("SHP_WEAPON_4_1") - if thisTech: - missingPrereqs = [preReq for preReq in thisTech.recursivePrerequisites(empireID) if preReq in researchQueueList] - if len(missingPrereqs) > 2 : - for preReq in sorted(missingPrereqs, reverse=True)[2:]: #leave plasma 4 and 3 - if preReq not in researchQueueList: - break - res = fo.issueDequeueTechOrder(preReq) - researchQueueList = getResearchQueueTechs() - if "SHP_WEAPON_4_2" in researchQueueList: #(should be) - idx = researchQueueList.index("SHP_WEAPON_4_2") - res=fo.issueEnqueueTechOrder("SHP_WEAPON_4_2", max(0, idx-15) ) + thisTech=fo.getTech("SHP_WEAPON_4_1") + if thisTech: + missingPrereqs = [preReq for preReq in thisTech.recursivePrerequisites(empireID) if preReq in researchQueueList] + if len(missingPrereqs) > 2 : + for preReq in sorted(missingPrereqs, reverse=True)[2:]: #leave plasma 4 and 3 + if preReq not in researchQueueList: + break + res = fo.issueDequeueTechOrder(preReq) + researchQueueList = getResearchQueueTechs() + if "SHP_WEAPON_4_2" in researchQueueList: #(should be) + idx = researchQueueList.index("SHP_WEAPON_4_2") + res=fo.issueEnqueueTechOrder("SHP_WEAPON_4_2", max(0, idx-15) ) def generateResearchOrders_old(): "generate research orders" Modified: trunk/FreeOrion/default/AI/ResourcesAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResourcesAI.py 2013-09-07 08:03:45 UTC (rev 6400) +++ trunk/FreeOrion/default/AI/ResourcesAI.py 2013-09-07 09:56:17 UTC (rev 6401) @@ -303,16 +303,16 @@ (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 + 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 #if planetMap[pid].currentMeterValue(fo.meterType.targetPopulation) >0: #only set to research if pop won't die out newFoci[pid] = RFocus curTargetRP += (RR-IR) |
From: <mar...@us...> - 2013-09-07 12:20:28
|
Revision: 6403 http://sourceforge.net/p/freeorion/code/6403 Author: marcel_metz Date: 2013-09-07 12:20:22 +0000 (Sat, 07 Sep 2013) Log Message: ----------- Simplified AITarget code, made code conform to PEP-8. Modified Paths: -------------- trunk/FreeOrion/default/AI/AIAbstractMission.py 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/ExplorationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/MilitaryAI.py trunk/FreeOrion/default/AI/MoveUtilsAI.py Modified: trunk/FreeOrion/default/AI/AIAbstractMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIAbstractMission.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/AIAbstractMission.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -21,15 +21,17 @@ return self.__aiTarget - def getAITargetID(self): + @property + def target_id(self): "return id" - return self.getAITarget().getTargetID() + return self.getAITarget().target_id - def getAITargetType(self): + @property + def target_type(self): "return mission AITargetType" - return self.getAITarget().getAITargetType() + return self.getAITarget().target_type def getAIMissionType(self): "return AIMissionType" @@ -112,7 +114,7 @@ if other == None: return False - if self.getAITargetID() == other.getAITargetID(): + if self.target_id == other.target_id: return True return False @@ -121,7 +123,7 @@ if other == None: return False - if self.getAIMissionType() == other.getAIMissionType() and self.getAITargetType() == self.getAITargetType(): + if self.getAIMissionType() == other.getAIMissionType() and self.target_type == self.target_type: return self.__cmp__(other) == 0 print "NOT IMPLEMENTED AIAbstractMission eq\n" Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -32,7 +32,7 @@ missionStrings=[] for aiFleetMissionType in self.getAIMissionTypes(): universe = fo.getUniverse() - fleetID = self.getAITargetID() + fleetID = self.target_id 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).get('overall', 0)) @@ -49,7 +49,7 @@ for aiFleetMissionType in self.getAIMissionTypes(): aiTargets = self.getAITargets(aiFleetMissionType) for aiTarget in aiTargets: - result.extend(aiTarget.getRequiredSystemAITargets()) + result.extend(aiTarget.get_required_system_ai_targets()) return result def getVisitingSystemAITargets(self): @@ -84,14 +84,14 @@ self.__aiFleetOrders = [] def __getAIFleetOrderFromAITarget(self, aiFleetMissionType, aiTarget): - fleetAITarget = AITarget.AITarget(EnumsAI.AITargetType.TARGET_FLEET, self.getAITargetID()) + fleetAITarget = AITarget.AITarget(EnumsAI.AITargetType.TARGET_FLEET, self.target_id) orderType = EnumsAI.getFleetOrderTypeForMission(aiFleetMissionType, option=None) result = AIFleetOrder.AIFleetOrder(orderType, fleetAITarget, aiTarget) return result def checkMergers(self, fleetID=None, context=""): if fleetID==None: - fleetID = self.getAITargetID() + fleetID = self.target_id #mainFleetMission=foAI.foAIstate.getAIFleetMission(fleetID) mainMissionTypeList = self.getAIMissionTypes() #normally, currently, should only be one if len( mainMissionTypeList ) != 1: @@ -127,7 +127,7 @@ mMT0ID = None else: mMT0=mainMissionTargets[0] - mMT0ID = mMT0.getTargetID() + mMT0ID = mMT0.target_id if len(mainMissionTargets)>1: pass print "\tConsidering merging fleets into fleet %d, but it has multiple targets: %s"%(fleetID, str(mainMissionTargets)) @@ -167,7 +167,7 @@ #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() + targetB = f2Targets[0].target_id if targetB == mMT0ID: print "Military fleet %d has same target as %s fleet %d and will (at least temporarily) be merged into the latter"%(fid, AIFleetMissionTypeNames.name( fleetRoleB) , fleetID) doMerge=True #TODO: should probably ensure that fleetA has aggression on now @@ -194,47 +194,47 @@ return def isValidFleetMissionAITarget(self, aiFleetMissionType, aiTarget): - if aiTarget.isValid() == False: + if not aiTarget.valid: return False if aiFleetMissionType == EnumsAI.AIFleetMissionType.FLEET_MISSION_EXPLORATION: - if aiTarget.getAITargetType() == EnumsAI.AITargetType.TARGET_SYSTEM: + if aiTarget.target_type == EnumsAI.AITargetType.TARGET_SYSTEM: empire = fo.getEmpire() - if not empire.hasExploredSystem(aiTarget.getTargetID()): + if not empire.hasExploredSystem(aiTarget.target_id): return True elif aiFleetMissionType in [EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, EnumsAI.AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST]: universe = fo.getUniverse() - fleet = universe.getFleet(self.getAITargetID()) + fleet = universe.getFleet(self.target_id) if not fleet.hasOutpostShips: return False - if aiTarget.getAITargetType() == EnumsAI.AITargetType.TARGET_PLANET: - planet = universe.getPlanet(aiTarget.getTargetID()) + if aiTarget.target_type == EnumsAI.AITargetType.TARGET_PLANET: + planet = universe.getPlanet(aiTarget.target_id) if planet.unowned: return True elif aiFleetMissionType in [ EnumsAI.AIFleetMissionType.FLEET_MISSION_COLONISATION, EnumsAI.AIFleetMissionType.FLEET_MISSION_ORBITAL_COLONISATION]: universe = fo.getUniverse() - fleet = universe.getFleet(self.getAITargetID()) + fleet = universe.getFleet(self.target_id) if not fleet.hasColonyShips: return False - if aiTarget.getAITargetType() == EnumsAI.AITargetType.TARGET_PLANET: - planet = universe.getPlanet(aiTarget.getTargetID()) + if aiTarget.target_type == EnumsAI.AITargetType.TARGET_PLANET: + planet = universe.getPlanet(aiTarget.target_id) planetPopulation = planet.currentMeterValue(fo.meterType.population) if planet.unowned or (planet.owner==fleet.owner and planetPopulation == 0): return True elif aiFleetMissionType in [ EnumsAI.AIFleetMissionType.FLEET_MISSION_INVASION, EnumsAI.AIFleetMissionType.FLEET_MISSION_ORBITAL_INVASION]: universe = fo.getUniverse() - fleet = universe.getFleet(self.getAITargetID()) + fleet = universe.getFleet(self.target_id) if not fleet.hasTroopShips: return False - if aiTarget.getAITargetType() == EnumsAI.AITargetType.TARGET_PLANET: - planet = universe.getPlanet(aiTarget.getTargetID()) + if aiTarget.target_type == EnumsAI.AITargetType.TARGET_PLANET: + planet = universe.getPlanet(aiTarget.target_id) if not planet.unowned or planet.owner!=fleet.owner: return True elif aiFleetMissionType in [ EnumsAI.AIFleetMissionType.FLEET_MISSION_MILITARY, EnumsAI.AIFleetMissionType.FLEET_MISSION_SECURE, EnumsAI.AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE]: universe = fo.getUniverse() - fleet = universe.getFleet(self.getAITargetID()) + fleet = universe.getFleet(self.target_id) #if not fleet.hasArmedShips: # return False - if aiTarget.getAITargetType() == EnumsAI.AITargetType.TARGET_SYSTEM: + if aiTarget.target_type == EnumsAI.AITargetType.TARGET_SYSTEM: return True # TODO: implement other mission types @@ -255,7 +255,7 @@ # TODO: priority ordersCompleted = True - print "Checking orders for fleet %d (on turn %d)"%(self.getAITargetID(), fo.currentTurn()) + print "Checking orders for fleet %d (on turn %d)"%(self.target_id, fo.currentTurn()) #print "\t\t\t Full Orders are:" #for aiFleetOrder2 in self.getAIFleetOrders(): # print "\t\t\t\t %s"%aiFleetOrder2 @@ -264,7 +264,7 @@ clearAll=False if aiFleetOrder.getAIFleetOrderType() in [EnumsAI.AIFleetOrderType.ORDER_COLONISE, EnumsAI.AIFleetOrderType.ORDER_OUTPOST]:#TODO: invasion? universe=fo.getUniverse() - planet = universe.getPlanet(aiFleetOrder.getTargetAITarget().getTargetID()) + planet = universe.getPlanet(aiFleetOrder.getTargetAITarget().target_id) if not planet: clearAll =True elif aiFleetOrder.getAIFleetOrderType() == EnumsAI.AIFleetOrderType.ORDER_COLONISE : @@ -274,10 +274,10 @@ clearAll =True if clearAll: print " %s"%(aiFleetOrder) - print "Fleet %d had a target planet that is no longer valid for this mission; aborting."%(self.getAITargetID() ) + print "Fleet %d had a target planet that is no longer valid for this mission; aborting."%(self.target_id) self.clearAIFleetOrders() self.clearAITargets(([-1]+ self.getAIMissionTypes()[:1])[-1]) - FleetUtilsAI.splitFleet(self.getAITargetID() ) + FleetUtilsAI.splitFleet(self.target_id) return self.checkMergers(context=str(aiFleetOrder)) if aiFleetOrder.canIssueOrder(verbose=True): @@ -290,7 +290,7 @@ ordersCompleted = False else: #check that we're not held up by a Big Monster if aiFleetOrder.getAIFleetOrderType() == EnumsAI.AIFleetOrderType.ORDER_MOVE: - thisSysID = aiFleetOrder.getTargetAITarget().getTargetID() + thisSysID = aiFleetOrder.getTargetAITarget().target_id thisStatus = foAI.foAIstate.systemStatus.setdefault(thisSysID, {}) if ( thisStatus.get('monsterThreat', 0) > fo.currentTurn() * ProductionAI.curBestMilShipRating()/4.0 ) : if ( ( (self.getAIMissionTypes() + [-1] )[0] not in [ EnumsAI.AIFleetMissionType.FLEET_MISSION_ATTACK, @@ -310,8 +310,8 @@ # moving to another system stops issuing all orders in system where fleet is # move order is also the last order in system if aiFleetOrder.getAIFleetOrderType() == EnumsAI.AIFleetOrderType.ORDER_MOVE: - fleet = fo.getUniverse().getFleet( self.getAITargetID() ) - if fleet.systemID != aiFleetOrder.getTargetAITarget().getTargetID(): + fleet = fo.getUniverse().getFleet( self.target_id) + if fleet.systemID != aiFleetOrder.getTargetAITarget().target_id: break else: #went through entire order list if ordersCompleted: @@ -319,18 +319,18 @@ lastOrder= orders and orders[-1] universe=fo.getUniverse() if orders and lastOrder.getAIFleetOrderType() == EnumsAI.AIFleetOrderType.ORDER_COLONISE: - planet = universe.getPlanet(lastOrder.getTargetAITarget().getTargetID()) + planet = universe.getPlanet(lastOrder.getTargetAITarget().target_id) pop=planet.currentMeterValue(fo.meterType.population) if pop==0: - print "Fleet %d has tentatively completed its colonize mission but will wait to confirm population."%(self.getAITargetID() ) + print "Fleet %d has tentatively completed its colonize mission but will wait to confirm population."%(self.target_id) print " Order details are %s"%lastOrder print " Order is valid: %s ; is Executed : %s ; is execution completed: %s "%(lastOrder.isValid(), lastOrder.isExecuted(), lastOrder.isExecutionCompleted()) if not lastOrder.isValid(): sourceT = lastOrder.getSourceAITarget() targT = lastOrder.getTargetAITarget() - print " source target validity: %s ; target target validity: %s "%(sourceT.isValid() , targT.isValid()) + print " source target validity: %s ; target target validity: %s "%(sourceT.valid, targT.valid) if EnumsAI.AITargetType.TARGET_SHIP == sourceT: - shipID = sourceT.getTargetID() + shipID = sourceT.target_id ship = universe.getShip(shipID) if not ship: print "Ship id %d not a valid ship id"%(shipID) @@ -339,7 +339,7 @@ clearAll=True lastSystTarget = -1 if orders and lastOrder.getAIFleetOrderType() == EnumsAI.AIFleetOrderType.ORDER_MILITARY: - lastSystTarget = lastOrder.getTargetAITarget().getTargetID() + lastSystTarget = lastOrder.getTargetAITarget().target_id # if (AIFleetMissionType.FLEET_MISSION_SECURE in self.getAIMissionTypes()) or # not doing this until decide a way to release from a SECURE mission if (lastSystTarget in list(set(AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs + AIstate.invasionTargetedSystemIDs + AIstate.blockadeTargetedSystemIDs))): #consider a secure mission @@ -352,16 +352,16 @@ secureType = "Invasion" elif lastSystTarget in AIstate.blockadeTargetedSystemIDs : secureType = "Blockade" - print "Fleet %d has completed initial stage of its mission to secure system %d (targeted for %s), may release a portion of ships"%(self.getAITargetID() , lastSystTarget, secureType) + print "Fleet %d has completed initial stage of its mission to secure system %d (targeted for %s), may release a portion of ships"%(self.target_id, lastSystTarget, secureType) clearAll=False - fleetID=self.getAITargetID() + fleetID=self.target_id fleet=universe.getFleet(fleetID) if fleet.systemID != -1: loc = fleet.systemID else: loc=fleet.nextSystemID if clearAll: - print "Fleet %d has completed its mission; clearing all orders and targets."%(self.getAITargetID() ) + print "Fleet %d has completed its mission; clearing all orders and targets." % self.target_id print "Full set of orders were:" for aiFleetOrder2 in self.getAIFleetOrders(): print "\t\t %s"%aiFleetOrder2 @@ -381,7 +381,7 @@ newFleets=[] if (sysStatus.get('totalThreat', 0) == 0): print "No current threat in target system; releasing a portion of ships." - newFleets=FleetUtilsAI.splitFleet(self.getAITargetID() ) #at least first stage of current task is done; release extra ships for potential other deployments + newFleets=FleetUtilsAI.splitFleet(self.target_id) #at least first stage of current task is done; release extra ships for potential other deployments else: print "Threat remains in target system; NOT releasing any ships." newMilFleets = [] @@ -402,7 +402,7 @@ "generates AIFleetOrders from fleets targets to accomplish" universe = fo.getUniverse() - fleetID = self.getAITargetID() + fleetID = self.target_id fleet = universe.getFleet(fleetID) if (not fleet) or fleet.empty or (fleetID in universe.destroyedObjectIDs(fo.empireID())): #fleet was probably merged into another or was destroyed foAI.foAIstate.deleteFleetInfo(fleetID) @@ -439,7 +439,7 @@ for aiFleetMissionType in aiMissionTypes: aiTargets = self.getAITargets(aiFleetMissionType) for aiTarget in aiTargets: - if systemAITarget in aiTarget.getRequiredSystemAITargets(): + if systemAITarget in aiTarget.get_required_system_ai_targets(): # from target required to visit get fleet orders to accomplish target aiFleetOrder = self.__getAIFleetOrderFromAITarget(aiFleetMissionType, aiTarget) self.appendAIFleetOrder(aiFleetOrder) @@ -448,7 +448,7 @@ # if fleet doesn't have any mission, then resupply if is current location not in supplyable system empire = fo.getEmpire() fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs - if (not self.hasAnyAIMissionTypes()) and not(self.getLocationAITarget().getTargetID() in fleetSupplyableSystemIDs): + if (not self.hasAnyAIMissionTypes()) and not(self.getLocationAITarget().target_id in fleetSupplyableSystemIDs): resupplyAIFleetOrder = MoveUtilsAI.getResupplyAIFleetOrder(self.getAITarget(), self.getLocationAITarget()) if resupplyAIFleetOrder.isValid(): self.appendAIFleetOrder(resupplyAIFleetOrder) @@ -457,7 +457,7 @@ "system AITarget where fleet is or will be" # TODO add parameter turn universe = fo.getUniverse() - fleet = universe.getFleet(self.getAITargetID()) + fleet = universe.getFleet(self.target_id) systemID = fleet.systemID if systemID >= 0: return AITarget.AITarget(EnumsAI.AITargetType.TARGET_SYSTEM, systemID) Modified: trunk/FreeOrion/default/AI/AIFleetOrder.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetOrder.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/AIFleetOrder.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -41,8 +41,8 @@ self.__executionCompleted = True def __checkValidityShipInFleet(self, shipAITarget, fleetAITarget): - shipID = shipAITarget.getTargetID() - fleetID = fleetAITarget.getTargetID() + shipID = shipAITarget.target_id + fleetID = fleetAITarget.target_id universe = fo.getUniverse() fleet = universe.getFleet(fleetID) # ship is in fleet @@ -55,7 +55,7 @@ if (self.isExecuted() and self.isExecutionCompleted()): return False - if self.getSourceAITarget().isValid() and self.getTargetAITarget().isValid(): + if self.getSourceAITarget().valid and self.getTargetAITarget().valid: sourceAITargetTypeValid = False targetAITargetTypeValid = False universe = fo.getUniverse() @@ -63,18 +63,18 @@ # outpost if AIFleetOrderType.ORDER_OUTPOST == self.getAIFleetOrderType(): # with ship - if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): - ship = universe.getShip(self.getSourceAITarget().getTargetID()) + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + ship = universe.getShip(self.getSourceAITarget().target_id) if ship.canColonize: sourceAITargetTypeValid = True # with fleet - elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): - fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleet = universe.getFleet(self.getSourceAITarget().target_id) if fleet.hasOutpostShips: sourceAITargetTypeValid = True # colonise planet - if AITargetType.TARGET_PLANET == self.getTargetAITarget().getAITargetType(): - planet = universe.getPlanet(self.getTargetAITarget().getTargetID()) + if AITargetType.TARGET_PLANET == self.getTargetAITarget().target_type: + planet = universe.getPlanet(self.getTargetAITarget().target_id) if planet.unowned: targetAITargetTypeValid = True else:#try to get order cancelled out @@ -84,18 +84,18 @@ # colonise elif AIFleetOrderType.ORDER_COLONISE == self.getAIFleetOrderType(): # with ship - if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): - ship = universe.getShip(self.getSourceAITarget().getTargetID()) + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + ship = universe.getShip(self.getSourceAITarget().target_id) if ship.canColonize: sourceAITargetTypeValid = True # with fleet - elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): - fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleet = universe.getFleet(self.getSourceAITarget().target_id) if fleet.hasColonyShips: sourceAITargetTypeValid = True # colonise planet - if AITargetType.TARGET_PLANET == self.getTargetAITarget().getAITargetType(): - planet = universe.getPlanet(self.getTargetAITarget().getTargetID()) + if AITargetType.TARGET_PLANET == self.getTargetAITarget().target_type: + planet = universe.getPlanet(self.getTargetAITarget().target_id) if planet.unowned or (planet.ownedBy(fo.empireID()) and planet.currentMeterValue(fo.meterType.population)==0 ): targetAITargetTypeValid = True else:#try to get order cancelled out @@ -104,18 +104,18 @@ # invade elif AIFleetOrderType.ORDER_INVADE == self.getAIFleetOrderType(): # with ship - if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): - ship = universe.getShip(self.getSourceAITarget().getTargetID()) + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + ship = universe.getShip(self.getSourceAITarget().target_id) if ship.canInvade: sourceAITargetTypeValid = True # with fleet - elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): - fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleet = universe.getFleet(self.getSourceAITarget().target_id) if fleet.hasTroopShips: sourceAITargetTypeValid = True # invade planet - if AITargetType.TARGET_PLANET == self.getTargetAITarget().getAITargetType(): - planet = universe.getPlanet(self.getTargetAITarget().getTargetID()) + if AITargetType.TARGET_PLANET == self.getTargetAITarget().target_type: + planet = universe.getPlanet(self.getTargetAITarget().target_id) planetPopulation = planet.currentMeterValue(fo.meterType.population) if not planet.unowned or planetPopulation > 0: targetAITargetTypeValid = True @@ -125,62 +125,62 @@ # military elif AIFleetOrderType.ORDER_MILITARY == self.getAIFleetOrderType(): # with ship - if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): - ship = universe.getShip(self.getSourceAITarget().getTargetID()) + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + ship = universe.getShip(self.getSourceAITarget().target_id) if ship.isArmed: sourceAITargetTypeValid = True # with fleet - elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): - fleet = universe.getFleet(self.getSourceAITarget().getTargetID()) + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleet = universe.getFleet(self.getSourceAITarget().target_id) if fleet.hasArmedShips: sourceAITargetTypeValid = True # military system - if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType(): - system = universe.getSystem(self.getTargetAITarget().getTargetID()) + if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().target_type: + system = universe.getSystem(self.getTargetAITarget().target_id) targetAITargetTypeValid = True # move elif AIFleetOrderType.ORDER_MOVE == self.getAIFleetOrderType(): # with fleet - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: sourceAITargetTypeValid = True # move to system - if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType(): + if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().target_type: targetAITargetTypeValid = True # resupply elif AIFleetOrderType.ORDER_RESUPPLY == self.getAIFleetOrderType(): # with fleet - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: sourceAITargetTypeValid = True # move to system - if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType(): + if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().target_type: empire = fo.getEmpire() fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs - if (self.getTargetAITarget().getTargetID() in fleetSupplyableSystemIDs): + if (self.getTargetAITarget().target_id in fleetSupplyableSystemIDs): targetAITargetTypeValid = True # split fleet elif AIFleetOrderType.ORDER_SPLIT_FLEET == self.getAIFleetOrderType(): # with fleet - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: sourceAITargetTypeValid = True # split ship - if AITargetType.TARGET_SHIP == self.getTargetAITarget().getAITargetType(): + if AITargetType.TARGET_SHIP == self.getTargetAITarget().target_type: targetAITargetTypeValid = True if sourceAITargetTypeValid == True and targetAITargetTypeValid == True: if self.__checkValidityShipInFleet(self.getTargetAITarget(), self.getSourceAITarget()): return True elif AIFleetOrderType.ORDER_ATTACK == self.getAIFleetOrderType(): # with fleet - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: sourceAITargetTypeValid = True # move to system - if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType() or AITargetType.TARGET_PLANET == self.getTargetAITarget().getAITargetType(): + if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().target_type or AITargetType.TARGET_PLANET == self.getTargetAITarget().target_type: targetAITargetTypeValid = True elif AIFleetOrderType.ORDER_DEFEND == self.getAIFleetOrderType(): # with fleet - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: sourceAITargetTypeValid = True # move to system - if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().getAITargetType() or AITargetType.TARGET_PLANET == self.getTargetAITarget().getAITargetType(): + if AITargetType.TARGET_SYSTEM == self.getTargetAITarget().target_type or AITargetType.TARGET_PLANET == self.getTargetAITarget().target_type: targetAITargetTypeValid = True if sourceAITargetTypeValid == True and targetAITargetTypeValid == True: @@ -201,18 +201,18 @@ universe = fo.getUniverse() fleetID = None shipID = None - if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): - shipID = self.getSourceAITarget().getTargetID() + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + shipID = self.getSourceAITarget().target_id ship = universe.getShip(shipID) fleetID = ship.fleetID - elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): - fleetID = self.getSourceAITarget().getTargetID() + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleetID = self.getSourceAITarget().target_id fleet = universe.getFleet(fleetID) systemID = fleet.systemID sys1=universe.getSystem(systemID) sysName = (sys1 and sys1.name) or "unknown" - targetID = self.getTargetAITarget().getTargetID() + targetID = self.getTargetAITarget().target_id if verbose: mainFleetMission=foAI.foAIstate.getAIFleetMission(fleetID) @@ -224,12 +224,12 @@ # outpost # if AIFleetOrderType.ORDER_OUTPOST == self.getAIFleetOrderType():#TODO: check for separate fleet holding outpost ships - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_CIVILIAN_OUTPOST) if shipID is None: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_BASE_OUTPOST) ship = universe.getShip(shipID) - planet = universe.getPlanet(self.getTargetAITarget().getTargetID()) + planet = universe.getPlanet(self.getTargetAITarget().target_id) if (ship != None) and (fleet.systemID == planet.systemID) and ship.canColonize: return True return False @@ -237,12 +237,12 @@ # colonise # elif AIFleetOrderType.ORDER_COLONISE == self.getAIFleetOrderType():#TODO: check for separate fleet holding colony ships - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION) if shipID is None: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_BASE_COLONISATION) ship = universe.getShip(shipID) - planet = universe.getPlanet(self.getTargetAITarget().getTargetID()) + planet = universe.getPlanet(self.getTargetAITarget().target_id) if ship and not ship.canColonize: print "Error: colonization fleet %d has no colony ship"%fleetID if (ship != None) and (fleet.systemID == planet.systemID) and ship.canColonize: @@ -252,12 +252,12 @@ # invade # elif AIFleetOrderType.ORDER_INVADE == self.getAIFleetOrderType():#TODO: check for separate fleet holding invasion ships - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_MILITARY_INVASION) if shipID is None: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_BASE_INVASION) ship = universe.getShip(shipID) - planet = universe.getPlanet(self.getTargetAITarget().getTargetID()) + planet = universe.getPlanet(self.getTargetAITarget().target_id) if (ship != None) and (fleet.systemID == planet.systemID) and ship.canInvade and ( planet.currentMeterValue(fo.meterType.shield) ==0 or planet.owner==-1):# native planets currently shouldnt have shields, but a bug sometimes makes it look like they do return True return False @@ -265,10 +265,10 @@ # military # elif AIFleetOrderType.ORDER_MILITARY == self.getAIFleetOrderType(): - if AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): + if AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_MILITARY) ship = universe.getShip(shipID) - system = universe.getSystem(self.getTargetAITarget().getTargetID()) + system = universe.getSystem(self.getTargetAITarget().target_id) if (ship != None) and (fleet.systemID == system.systemID) and ship.isArmed: return True return False @@ -276,14 +276,14 @@ # split fleet # elif AIFleetOrderType.ORDER_SPLIT_FLEET == self.getAIFleetOrderType(): - fleet2 = universe.getFleet(self.getSourceAITarget().getTargetID()) + fleet2 = universe.getFleet(self.getSourceAITarget().target_id) if len(fleet2.shipIDs) <= 1: return False # # move -- have fleets will do a safety check, also check for potential military fleet mergers # elif AIFleetOrderType.ORDER_MOVE == self.getAIFleetOrderType(): - #targetID = self.getTargetAITarget().getTargetID() + #targetID = self.getTargetAITarget().target_id #TODO: figure out better way to have invasions (& possibly colonizations) require visibility on target without needing visibility of all intermediate systems if False and mainMissionType not in [ AIFleetMissionType.FLEET_MISSION_ATTACK, #TODO: consider this later AIFleetMissionType.FLEET_MISSION_MILITARY, @@ -333,33 +333,33 @@ self.__setExecuted() # outpost if AIFleetOrderType.ORDER_OUTPOST == self.getAIFleetOrderType(): - planet=universe.getPlanet( self.getTargetAITarget().getTargetID() ) + planet=universe.getPlanet(self.getTargetAITarget().target_id) if not planet.unowned: self.__setExecutionCompleted() return shipID = None - if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): - shipID = self.getSourceAITarget().getTargetID() - elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): - fleetID = self.getSourceAITarget().getTargetID() + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + shipID = self.getSourceAITarget().target_id + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleetID = self.getSourceAITarget().target_id shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_CIVILIAN_OUTPOST) if shipID is None: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_BASE_OUTPOST) - result=fo.issueColonizeOrder(shipID, self.getTargetAITarget().getTargetID()) + result=fo.issueColonizeOrder(shipID, self.getTargetAITarget().target_id) if result==0: self.__executed = False # colonise elif AIFleetOrderType.ORDER_COLONISE == 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() + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + shipID = self.getSourceAITarget().target_id + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleetID = self.getSourceAITarget().target_id shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION) if shipID is None: shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_BASE_COLONISATION) - planetID = self.getTargetAITarget().getTargetID() + planetID = self.getTargetAITarget().target_id planet=universe.getPlanet(planetID) planetName = (planet and planet.name) or "apparently invisible" result = fo.issueColonizeOrder(shipID, planetID) @@ -370,13 +370,13 @@ elif AIFleetOrderType.ORDER_INVADE == self.getAIFleetOrderType(): result = False shipID = None - planetID = self.getTargetAITarget().getTargetID() + planetID = self.getTargetAITarget().target_id planet=universe.getPlanet(planetID) planetName = (planet and planet.name) or "invisible" - if AITargetType.TARGET_SHIP == self.getSourceAITarget().getAITargetType(): - shipID = self.getSourceAITarget().getTargetID() - elif AITargetType.TARGET_FLEET == self.getSourceAITarget().getAITargetType(): - fleetID = self.getSourceAITarget().getTargetID() + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + shipID = self.getSourceAITarget().target_id + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleetID = self.getSourceAITarget().target_id fleet = fo.getUniverse().getFleet(fleetID) for shipID in fleet.shipIDs: ship = universe.getShip(shipID) @@ -405,13 +405,13 @@ # 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() + if AITargetType.TARGET_SHIP == self.getSourceAITarget().target_type: + shipID = self.getSourceAITarget().target_id + elif AITargetType.TARGET_FLEET == self.getSourceAITarget().target_type: + fleetID = self.getSourceAITarget().target_id shipID = FleetUtilsAI.getShipIDWithRole(fleetID, AIShipRoleType.SHIP_ROLE_MILITARY) - #fo.issueFleetMoveOrder(fleetID, self.getTargetAITarget().getTargetID()) #moving is already taken care of separately - targetSysID = self.getTargetAITarget().getTargetID() + #fo.issueFleetMoveOrder(fleetID, self.getTargetAITarget().target_id) #moving is already taken care of separately + targetSysID = self.getTargetAITarget().target_id fleet = fo.getUniverse().getFleet(fleetID) systemStatus = foAI.foAIstate.systemStatus.get(targetSysID, {}) if (fleet )and ( fleet.systemID==targetSysID ) and ((systemStatus.get('fleetThreat', 0) + systemStatus.get('planetThreat', 0)+ systemStatus.get('monsterThreat', 0))==0): @@ -419,8 +419,8 @@ # move or resupply elif (AIFleetOrderType.ORDER_MOVE == self.getAIFleetOrderType()) or (AIFleetOrderType.ORDER_RESUPPLY == self.getAIFleetOrderType()): - fleetID = self.getSourceAITarget().getTargetID() - systemID = self.getTargetAITarget().getTargetID() + fleetID = self.getSourceAITarget().target_id + systemID = self.getTargetAITarget().target_id fleet = fo.getUniverse().getFleet(fleetID) if systemID not in [fleet.systemID, fleet.nextSystemID] : fo.issueFleetMoveOrder(fleetID, systemID) @@ -434,16 +434,16 @@ # split fleet elif AIFleetOrderType.ORDER_SPLIT_FLEET == self.getAIFleetOrderType(): - fleetID = self.getSourceAITarget().getTargetID() - shipID = self.getTargetAITarget().getTargetID() + fleetID = self.getSourceAITarget().target_id + shipID = self.getTargetAITarget().target_id fleet = fo.getUniverse().getFleet(fleetID) if shipID in fleet.shipIDs: fo.issueNewFleetOrder(str(shipID), shipID) self.__setExecutionCompleted() # attack elif (AIFleetOrderType.ORDER_ATTACK == self.getAIFleetOrderType()): - fleetID = self.getSourceAITarget().getTargetID() - systemID = self.getTargetAITarget().getRequiredSystemAITargets()[0].getTargetID() + fleetID = self.getSourceAITarget().target_id + systemID = self.getTargetAITarget().get_required_system_ai_targets()[0].target_id fo.issueFleetMoveOrder(fleetID, systemID) Modified: trunk/FreeOrion/default/AI/AITarget.py =================================================================== --- trunk/FreeOrion/default/AI/AITarget.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/AITarget.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -2,46 +2,26 @@ from EnumsAI import AITargetType import freeOrionAIInterface as fo -AITargetTypeNames = AITargetType() +AI_TARGET_TYPE_NAMES = AITargetType() class AITarget(object): "stores information about AI target - its id and type" - def __init__(self, aiTargetType, targetID): + def __init__(self, target_type, target_id): "constructor" - self.__aiTargetType__ = aiTargetType - self.__targetID__ = targetID + self.target_type = target_type + self.target_id = target_id - 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(): + if self.target_id < other.target_id: return - 1 - elif self.getTargetID() == other.getTargetID(): - if self.getAITargetType() < other.getAITargetType(): + elif self.target_id == other.target_id: + if self.target_type < other.target_type: return - 1 - elif self.getAITargetType() == other.getAITargetType(): + elif self.target_type == other.target_type: return 0 return 1 return 1 @@ -65,92 +45,75 @@ def __str__(self): "returns describing string" - target= self.getTargetObj() + target = self.target_obj if target is None: - targetName = "%4d"%self.__targetID__ + target_name = "%4d" % self.target_id else: - targetName = target.name - return "{ %7s : [%4d] %9s}"%(AITargetTypeNames.name(self.__aiTargetType__ ), self.__targetID__ , targetName) + target_name = target.name + return "{ %7s : [%4d] %9s}" % ( + AI_TARGET_TYPE_NAMES.name(self.target_type), + self.target_id, + target_name + ) - def getTargetObj(self): - "returns target UniverseObject for fleets, systems, planets, buildings; None for other targets" + @property + def target_obj(self): + """ + returns target UniverseObject for fleets, systems, planets, buildings; + None for other targets + """ universe = fo.getUniverse() - if self.__aiTargetType__ == AITargetType.TARGET_FLEET : - return universe.getFleet(self.__targetID__ ) - elif self.__aiTargetType__ == AITargetType.TARGET_SYSTEM : - return universe.getSystem(self.__targetID__ ) - elif self.__aiTargetType__ == AITargetType.TARGET_PLANET : - return universe.getPlanet(self.__targetID__ ) - elif self.__aiTargetType__ == AITargetType.TARGET_BUILDING : - return universe.getBuilding(self.__targetID__ ) - else: - return None + target = None + if self.target_type == AITargetType.TARGET_FLEET: + target = universe.getFleet(self.target_id) + elif self.target_type == AITargetType.TARGET_SYSTEM: + target = universe.getSystem(self.target_id) + elif self.target_type == AITargetType.TARGET_PLANET: + target = universe.getPlanet(self.target_id) + elif self.target_type == AITargetType.TARGET_BUILDING: + target = universe.getBuilding(self.target_id) + return target - def isValid(self): + def valid(self): "returns if this object is valid" - if self.getTargetID() == None or self.getAITargetType() == None or EnumsAI.checkValidity(self.getTargetID()) == False: + if self.target_id == None or self.target_type == None or \ + EnumsAI.checkValidity(self.target_id) == False: return False - universe = fo.getUniverse() - if AITargetType.TARGET_FLEET == self.getAITargetType(): - fleet = universe.getFleet(self.getTargetID()) - if fleet == None: - return False - return True + if AITargetType.TARGET_EMPIRE == self.target_type: + return self.target_id in fo.AllEmpireIDs() + else: + return None != self.target_obj - 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): + def get_required_system_ai_targets(self): "returns all system AITargets required to visit in this object" # TODO: add parameter turn result = [] - if AITargetType.TARGET_SYSTEM == self.getAITargetType(): + if AITargetType.TARGET_SYSTEM == self.target_type: result.append(self) - elif AITargetType.TARGET_PLANET == self.getAITargetType(): + elif AITargetType.TARGET_PLANET == self.target_type: universe = fo.getUniverse() - planet = universe.getPlanet(self.getTargetID()) - aiTarget = AITarget(AITargetType.TARGET_SYSTEM, planet.systemID) + planet = universe.getPlanet(self.target_id) + ai_target = AITarget(AITargetType.TARGET_SYSTEM, planet.systemID) - result.append(aiTarget) + result.append(ai_target) - elif AITargetType.TARGET_FLEET == self.getAITargetType(): + elif AITargetType.TARGET_FLEET == self.target_type: # Fleet systemID is where is fleet going. # If fleet is going nowhere, then it is location of fleet universe = fo.getUniverse() - fleet = universe.getFleet(self.getTargetID()) - systemID = fleet.nextSystemID - if (systemID == -1): - systemID = fleet.systemID - aiTarget = AITarget(AITargetType.TARGET_SYSTEM, systemID) + fleet = universe.getFleet(self.target_id) + system_id = fleet.nextSystemID + if (system_id == -1): + system_id = fleet.systemID + ai_target = AITarget(AITargetType.TARGET_SYSTEM, system_id) - result.append(aiTarget) + result.append(ai_target) return result Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -425,8 +425,8 @@ aiFleetMissions = self.getAllAIFleetMissions() deletedFleetIDs = [] for aiFleetMission in aiFleetMissions: - if not(aiFleetMission.getAITargetID() in fleetIDs): - deletedFleetIDs.append(aiFleetMission.getAITargetID()) + if not(aiFleetMission.target_id in fleetIDs): + deletedFleetIDs.append(aiFleetMission.target_id) for deletedFleetID in deletedFleetIDs: self.__removeAIFleetMission(deletedFleetID) @@ -760,8 +760,8 @@ mainMissionTargets = mainFleetMission.getAITargets(mainMissionType) if mainMissionTargets: mMT0=mainMissionTargets[0] - if mMT0.getAITargetType()==AITargetType.TARGET_SYSTEM: - status['sysID'] = mMT0.getTargetID() #hmm, but might still be a fair ways from here + if mMT0.target_type == AITargetType.TARGET_SYSTEM: + status['sysID'] = mMT0.target_id #hmm, but might still be a fair ways from here self.shipCount = shipCount print "------------------------" print "Empire Ship Count: ", shipCount Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -33,7 +33,7 @@ if len(aiFleetMission.getAIMissionTypes()) == 0: availableScouts.append(fleetID) else: - targets = [targ.getTargetID() for targ in aiFleetMission.getAITargets(AIFleetMissionType.FLEET_MISSION_EXPLORATION) ] + targets = [targ.target_id for targ in aiFleetMission.getAITargets(AIFleetMissionType.FLEET_MISSION_EXPLORATION) ] if verbose: if len(targets)==0: print "problem determining existing exploration target systems from targets:\n%s"%(aiFleetMission.getAITargets(AIFleetMissionType.FLEET_MISSION_EXPLORATION)) Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -492,8 +492,8 @@ round += 1 print "issuing fleet orders Round %d:"%round for aiFleetMission in aiFleetMissions: - fleetID = aiFleetMission.getAITargetID() - fleet = aiFleetMission.getAITarget().getTargetObj() + fleetID = aiFleetMission.target_id + fleet = aiFleetMission.getAITarget().target_obj if (not fleet) or ( len(fleet.shipIDs)==0) or fleetID in universe.destroyedObjectIDs(fo.empireID()): # in case fleet was merged into another previously during this turn continue aiFleetMission.issueAIFleetOrders() Modified: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -96,10 +96,10 @@ for aiFleetMissionType in aiFleetMission.getAIMissionTypes(): aiTargets = aiFleetMission.getAITargets(aiFleetMissionType) for aiTarget in aiTargets: - sysTargets.extend(aiTarget.getRequiredSystemAITargets()) + sysTargets.extend(aiTarget.get_required_system_ai_targets()) 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 + lastSys = sysTargets[-1].target_id # will count this fleet as assigned to last system in target list assignedAttack[lastSys] += foAI.foAIstate.getRating(fleetID).get('attack', 0) assignedHP[lastSys] += foAI.foAIstate.getRating(fleetID).get('health', 0) for sysID in universe.systemIDs: Modified: trunk/FreeOrion/default/AI/MoveUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/MoveUtilsAI.py 2013-09-07 10:58:15 UTC (rev 6402) +++ trunk/FreeOrion/default/AI/MoveUtilsAI.py 2013-09-07 12:20:22 UTC (rev 6403) @@ -12,13 +12,13 @@ # TODO: add priority empireID = fo.empireID() # determine system where fleet will be or where is if is going nowhere - lastSystemAITarget = fleetAITarget.getRequiredSystemAITargets()[0] + lastSystemAITarget = fleetAITarget.get_required_system_ai_targets()[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) #print "checking system targets" - systemAITargets = canTravelToSystem(fleetAITarget.getTargetID(), lastSystemAITarget, aiTarget, empireID) - #print "making path with %d targets: "%len(systemAITargets) , PlanetUtilsAI.sysNameIDs( [sysTarg. getTargetID() for sysTarg in systemAITargets]) + systemAITargets = canTravelToSystem(fleetAITarget.target_id, lastSystemAITarget, aiTarget, empireID) + #print "making path with %d targets: "%len(systemAITargets) , PlanetUtilsAI.sysNameIDs( [sysTarg.target_id for sysTarg in systemAITargets]) if len(systemAITargets) > 0: # for every system required to visit create move order for systemAITarget in systemAITargets: @@ -28,10 +28,10 @@ aiFleetOrder = AIFleetOrder.AIFleetOrder(AIFleetOrderType.ORDER_MOVE, fleetAITarget, systemAITarget) result.append(aiFleetOrder) else: - startSysID = lastSystemAITarget.getTargetID() - targetSysID = aiTarget.getTargetID() + startSysID = lastSystemAITarget.target_id + targetSysID = aiTarget.target_id if startSysID != targetSysID: - print "fleetID: " + str(fleetAITarget.getTargetID()) + " can't travel to target:" + str(aiTarget) + print "fleetID: " + str(fleetAITarget.target_id) + " can't travel to target:" + str(aiTarget) return result @@ -43,14 +43,14 @@ fleet = universe.getFleet(fleetID) maxFuel = int(fleet.maxFuel) fuel = int(fleet.fuel) - if fuel < 1.0 or fromSystemAITarget.getTargetID() == toSystemAITarget.getTargetID: + if fuel < 1.0 or fromSystemAITarget.target_id == toSystemAITarget.target_id: return [] if foAI.foAIstate.aggression<=fo.aggression.typical or True: #TODO: sort out if shortestPath leaves off some intermediate destinations pathFunc=universe.leastJumpsPath else: pathFunc=universe.shortestPath - startSysID = fromSystemAITarget.getTargetID() - targetSysID = toSystemAITarget.getTargetID() + startSysID = fromSystemAITarget.target_id + targetSysID = toSystemAITarget.target_id shortPath= list( 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 ] @@ -81,7 +81,7 @@ "check if fleet can travel from starting system to wanted system" systemAITargets = [] - if not fromSystemAITarget.getTargetID() == toSystemAITarget.getTargetID: + if not fromSystemAITarget.target_id == toSystemAITarget.target_id: # get supplyable systems empire = fo.getEmpire() fleetSupplyableSystemIDs = empire.fleetSupplyableSystemIDs @@ -94,12 +94,12 @@ print " fleet ID %d has %.1f fuel to get fr... [truncated message content] |
From: <dil...@us...> - 2013-09-07 19:24:13
|
Revision: 6405 http://sourceforge.net/p/freeorion/code/6405 Author: dilvish-fo Date: 2013-09-07 19:24:10 +0000 (Sat, 07 Sep 2013) Log Message: ----------- some AI code cleanup Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/ResearchAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-09-07 19:06:19 UTC (rev 6404) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-09-07 19:24:10 UTC (rev 6405) @@ -553,7 +553,7 @@ total_enemy_weights += count continue structure_tally += count * max(mystructure, min(estats.get('attacks', {})) - myshields ) # - eshields = enemystats.get('shields', 0) + eshields = enemy_stats.get('shields', 0) tempattacktally=0 tempstruc = estats.get('structure', 1) total_enemy_weights += count * tempstruc Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-09-07 19:06:19 UTC (rev 6404) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-09-07 19:24:10 UTC (rev 6405) @@ -8,7 +8,6 @@ __AIFleetMissionTypeNames = AIFleetMissionType() def clearShipDesignInfo(): - __designRoles.clear() __designStats.clear() def statsMeetReq(stats, reqs, reqName): Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-07 19:06:19 UTC (rev 6404) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-07 19:24:10 UTC (rev 6405) @@ -960,7 +960,7 @@ 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 + print "problem queueing BLD_SOL_ORB_GEN at planet", useLoc, "of system ", useSys pass bldName = "BLD_ART_BLACK_HOLE" @@ -1005,7 +1005,7 @@ 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 %s at planet"%bldName, useloc, "of system ", useSys + print "problem queueing %s at planet"%bldName, useLoc, "of system ", useSys bldName = "BLD_BLACK_HOLE_POW_GEN" if empire.buildingTypeAvailable(bldName) and foAI.foAIstate.aggression > fo.aggression.cautious: @@ -1036,7 +1036,7 @@ 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 + print "problem queueing BLD_BLACK_HOLE_POW_GEN at planet", useLoc, "of system ", useSys pass bldName = "BLD_ENCLAVE_VOID" @@ -1109,7 +1109,7 @@ 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 + print "problem queueing BLD_NEUTRONIUM_EXTRACTOR at planet", useLoc, "of system ", useSys pass bldName = "BLD_NEUTRONIUM_FORGE" Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-09-07 19:06:19 UTC (rev 6404) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-09-07 19:24:10 UTC (rev 6405) @@ -213,88 +213,6 @@ idx = researchQueueList.index("SHP_WEAPON_4_2") res=fo.issueEnqueueTechOrder("SHP_WEAPON_4_2", max(0, idx-15) ) -def generateResearchOrders_old(): - "generate research orders" - - empire = fo.getEmpire() - print "Research Queue Management:" - print "" - print "Techs researched and available for use:" - completedTechs = getCompletedTechs() - for techname in completedTechs: - print " " + techname - print"" - - print "Techs currently in Research Queue:" - researchQueue = empire.researchQueue - researchQueueList = getResearchQueueTechs() - for element in researchQueue: - print " " + element.tech - print "" - - # get the highest research priorities - print "Research Queue Priorities:" - researchPriorities = {} - for priorityType in getAIPriorityResearchTypes(): - researchPriorities[priorityType] = foAI.foAIstate.getPriority(priorityType) - - sortedPriorities = researchPriorities.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 Research Queue Priority: " + str(topPriority) - print "" - - if topPriority == AIPriorityType.PRIORITY_RESEARCH_LEARNING: - primaryLearningTechs = TechsListsAI.primaryLearningTechsList() - pLTsToEnqueue = (set(primaryLearningTechs)-(set(completedTechs)|set(researchQueueList))) - if not pLTsToEnqueue: - print "All primaryLearningTechs are enqueued or completed." - print"" - generateDefaultResearchOrders() - else: - for name in pLTsToEnqueue: - fo.issueEnqueueTechOrder(name, -1) - print " Enqueued Tech: " + name - print"" - generateDefaultResearchOrders() - elif topPriority == AIPriorityType.PRIORITY_RESEARCH_GROWTH: - primaryGroTechs = TechsListsAI.primaryGroTechsList() - pGTsToEnqueue = (set(primaryGroTechs)-(set(completedTechs)|set(researchQueueList))) - if not pGTsToEnqueue: - print "All primaryGrowthTechs are enqueued or completed." - print"" - generateDefaultResearchOrders() - else: - for name in pGTsToEnqueue: - fo.issueEnqueueTechOrder(name, -1) - print " Enqueued Tech: " + name - print "" - generateDefaultResearchOrders() - elif topPriority == AIPriorityType.PRIORITY_RESEARCH_PRODUCTION: - generateDefaultResearchOrders() - elif topPriority == AIPriorityType.PRIORITY_RESEARCH_CONSTRUCTION: - generateDefaultResearchOrders() - elif topPriority == AIPriorityType.PRIORITY_RESEARCH_ECONOMICS: - generateDefaultResearchOrders() - elif topPriority == AIPriorityType.PRIORITY_RESEARCH_SHIPS: - primaryShipsTechs = TechsListsAI.primaryShipsTechsList() - pSTsToEnqueue = (set(primaryShipsTechs)-(set(completedTechs)|set(researchQueueList))) - if not pSTsToEnqueue: - print "All primaryShipsTechs are enqueued or completed." - generateDefaultResearchOrders() - print "" - else: - for name in pSTsToEnqueue: - fo.issueEnqueueTechOrder(name, -1) - print " Enqueued Tech: " + name - print "" - generateDefaultResearchOrders() - def generateDefaultResearchOrders(): "generate default research orders" |
From: <mar...@us...> - 2013-09-07 20:35:08
|
Revision: 6406 http://sourceforge.net/p/freeorion/code/6406 Author: marcel_metz Date: 2013-09-07 20:35:05 +0000 (Sat, 07 Sep 2013) Log Message: ----------- Made TechsListsAI.py PEP-8 compliant. Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.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-09-07 19:24:10 UTC (rev 6405) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-09-07 20:35:05 UTC (rev 6406) @@ -247,7 +247,7 @@ availableGrowthSpecials.clear() activeGrowthSpecials.clear() empirePlanetsWithGrowthSpecials.clear() - if empire.getTechStatus(TechsListsAI.exobotTechName) == fo.techStatus.complete: + if empire.getTechStatus(TechsListsAI.EXOBOT_TECH_NAME) == fo.techStatus.complete: empireColonizers["SP_EXOBOT"]=[]# get it into colonizer list even if no colony yet empireSpeciesSystems.clear() Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-09-07 19:24:10 UTC (rev 6405) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-09-07 20:35:05 UTC (rev 6406) @@ -110,9 +110,9 @@ print "" if (fo.currentTurn()==1) or ((fo.currentTurn()<5) and (len(researchQueueList)==0) ): if foAI.foAIstate.aggression <=fo.aggression.typical: - newtech = TechsListsAI.primaryMetaTechsList( index=empireID%2 ) + newtech = TechsListsAI.primary_meta_techs(index = empireID % 2) else: - newtech = TechsListsAI.primaryMetaTechsList( index=empireID%3 ) + newtech = TechsListsAI.primary_meta_techs(index = empireID % 3) #pLTsToEnqueue = (set(newtech)-(set(completedTechs)|set(researchQueueList))) pLTsToEnqueue = newtech[:] techBase = set(completedTechs+researchQueueList) @@ -145,7 +145,7 @@ print " Error: exception triggered and caught: ", traceback.format_exc() if foAI.foAIstate.aggression <= fo.aggression.cautious: researchQueueList = getResearchQueueTechs() - defTechs=TechsListsAI.defenseTechs1() + defTechs = TechsListsAI.defense_techs_1() 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))) @@ -258,7 +258,7 @@ if empire.getTechStatus(techname) == fo.techStatus.researchable: preliminaryProjects.append(techname) - unusableTechs = TechsListsAI.unusableTechsList() + unusableTechs = TechsListsAI.unusable_techs() possibleProjects = (set(preliminaryProjects)-set(unusableTechs)) return possibleProjects Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-09-07 19:24:10 UTC (rev 6405) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-09-07 20:35:05 UTC (rev 6406) @@ -1,37 +1,51 @@ +""" +The TechsListAI module provides functions that describes dependencies between +various technologies to help the AI decide which technologies should be +researched next. +""" +# TODO: this whole module shouldn't exist. These informations belong into the +# data files or should be calculated by the AI scripts. +# # 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 +# individual techs are to be removed from unusable list as AI programming +# progresses -outpostTechName = "CON_ENV_ENCAPSUL" -exobotTechName = "PRO_EXOBOTS" -gasOrbitalTechName = "PRO_ORBITAL_GEN" -solarOrbitalTechName = "PRO_SOL_ORB_GEN" +EXOBOT_TECH_NAME = "PRO_EXOBOTS" -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(): +def unusable_techs(): + """ + Returns a list of technologies that shouldn't be researched by the AI. + """ return [] -def defenseTechs1(): - defTechs1=[ +def defense_techs_1(): + """ + Returns a list of technologies that implement the first planetary defensive + measures. + """ + return [ "DEF_DEFENSE_NET_1", - "DEF_GARRISON_1", - ] - return defTechs1 + "DEF_GARRISON_1" + ] -def defenseTechs2(): - defTechs2=[ - ] - return defTechs2 +def defense_techs_2(): + """ + Returns a list of technologies that implement additional planetary defensive + measures. To use use the AI need to have built all defense technologies that + are provided by defense_techs_1(). + """ + return [] -def primaryMetaTechsList(index=0): - "primary techs for all categories" - #index=1-index - index=2 +def primary_meta_techs(index = 0): + """ + Primary techs for all categories. + """ + #index = 1 - index + index = 2 + result = [] if index == 0: - primaryMetaTechs = [ + result = [ "SHP_WEAPON_1_2", "GRO_PLANET_ECOL", "SHP_DOMESTIC_MONSTER", @@ -142,10 +156,10 @@ "GRO_ENERGY_META", "CON_ART_PLANET", "SHP_SOLAR_CONT", - ] + ] #"SHP_ENDOSYMB_HULL", elif index == 1: - primaryMetaTechs = [ + result = [ "SHP_WEAPON_1_2", "GRO_PLANET_ECOL", "SHP_DOMESTIC_MONSTER", @@ -256,11 +270,11 @@ "GRO_ENERGY_META", "CON_ART_PLANET", "SHP_SOLAR_CONT", - ] + ] #"CON_FRC_ENRG_CAMO", #"SHP_TITAN_HULL" elif index == 2: - primaryMetaTechs = [ + result = [ "LRN_ALGO_ELEGANCE", "LRN_ARTIF_MINDS", "SHP_WEAPON_1_2", @@ -372,11 +386,11 @@ "GRO_ENERGY_META", "CON_ART_PLANET", "SHP_SOLAR_CONT", - ] + ] #"CON_FRC_ENRG_CAMO", #"SHP_TITAN_HULL" elif index == 2: - primaryMetaTechs = [ + result = [ "LRN_ALGO_ELEGANCE", "LRN_ARTIF_MINDS", "SHP_WEAPON_1_2", @@ -488,186 +502,183 @@ "GRO_ENERGY_META", "CON_ART_PLANET", "SHP_SOLAR_CONT", - ] + ] #"CON_FRC_ENRG_CAMO", #"SHP_TITAN_HULL" - return primaryMetaTechs + return result #the following is just for reference -MasterTechList= """ - "CON_ARCH_MONOFILS", - "CON_ARCH_PSYCH", - "CON_ART_HEAVENLY", - "CON_ART_PLANET", - "CON_CONC_CAMP", - "CON_CONTGRAV_ARCH", - "CON_ENV_ENCAPSUL", - "CON_FRC_ENRG_CAMO", - "CON_FRC_ENRG_STRC", - "CON_GAL_INFRA", - "CON_INFRA_ECOL", - "CON_METRO_INFRA", - "CON_NDIM_STRC", - "CON_ORBITAL_CON", - "CON_ORBITAL_HAB", - "CON_ORGANIC_STRC", - "CON_PLANET_DRIVE", - "CON_STARGATE", - "CON_SUBTER_CONST", - "CON_TRANS_ARCH", - "DEF_DEFENSE_NET_1", - "DEF_DEFENSE_NET_2", - "DEF_DEFENSE_NET_3", - "DEF_DEFENSE_NET_REGEN_1", - "DEF_DEFENSE_NET_REGEN_2", - "DEF_GARRISON_1", - "DEF_GARRISON_2", - "DEF_GARRISON_3", - "DEF_GARRISON_4", - "DEF_PLANET_CLOAK", - "DEF_PLAN_BARRIER_SHLD_1", - "DEF_PLAN_BARRIER_SHLD_2", - "DEF_PLAN_BARRIER_SHLD_3", - "DEF_PLAN_BARRIER_SHLD_4", - "DEF_PLAN_BARRIER_SHLD_5", - "DEF_ROOT_DEFENSE", - "DEF_SYST_DEF_MINE_1", - "DEF_SYST_DEF_MINE_2", - "DEF_SYST_DEF_MINE_3", - "GRO_ADV_ECOMAN", - "GRO_BIOTERROR", - "GRO_CYBORG", - "GRO_ECO_METAMORPH", - "GRO_ENERGY_META", - "GRO_GAIA_TRANS", - "GRO_GENETIC_ENG", - "GRO_GENETIC_MED", - "GRO_GENOME_BANK", - "GRO_LIFECYCLE_MAN", - "GRO_MEDICAL_PATH", - "GRO_NANOTECH_MED", - "GRO_NANO_CYBERNET", - "GRO_PLANET_ECOL", - "GRO_SUBTER_HAB", - "GRO_SYMBIOTIC_BIO", - "GRO_TERRAFORM", - "GRO_TRANSORG_SENT", - "GRO_XENO_GENETICS", - "GRO_XENO_HYBRIDS", - "LRN_ALGO_ELEGANCE", - "LRN_ARTIF_MINDS", - "LRN_ART_BLACK_HOLE", - "LRN_DISTRIB_THOUGHT", - "LRN_ENCLAVE_VOID", - "LRN_EVERYTHING", - "LRN_FORCE_FIELD", - "LRN_GATEWAY_VOID", - "LRN_GRAVITONICS", - "LRN_MIND_VOID", - "LRN_NDIM_SUBSPACE", - "LRN_OBSERVATORY_I", - "LRN_PHYS_BRAIN", - "LRN_PSIONICS", - "LRN_PSY_DOM", - "LRN_QUANT_NET", - "LRN_SPATIAL_DISTORT_GEN", - "LRN_STELLAR_TOMOGRAPHY", - "LRN_TIME_MECH", - "LRN_TRANSCEND", - "LRN_TRANSLING_THT", - "LRN_UNIF_CONC", - "LRN_XENOARCH", - "PRO_CORE_MINE", - "PRO_EXOBOTS", - "PRO_FUSION_GEN", - "PRO_INDUSTRY_CENTER_I", - "PRO_INDUSTRY_CENTER_II", - "PRO_INDUSTRY_CENTER_III", - "PRO_MICROGRAV_MAN", - "PRO_NANOTECH_PROD", - "PRO_NDIM_ASSMB", - "PRO_NEUTRONIUM_EXTRACTION", - "PRO_ORBITAL_GEN", - "PRO_ROBOTIC_PROD", - "PRO_SENTIENT_AUTOMATION", - "PRO_SINGULAR_GEN", - "PRO_SOL_ORB_GEN", - "PRO_ZERO_GEN", - "SHP_ADV_DAM_CONT", - "SHP_ANTIMATTER_TANK", - "SHP_ASTEROID_HULLS", - "SHP_ASTEROID_REFORM", - "SHP_BASIC_DAM_CONT", - "SHP_BIOADAPTIVE_SPEC", - "SHP_BIOTERM", - "SHP_CAMO_AST_HULL", - "SHP_CONTGRAV_MAINT", - "SHP_CONT_BIOADAPT", - "SHP_CONT_SYMB", - "SHP_DEATH_SPORE", - "SHP_DEUTERIUM_TANK", - "SHP_DIAMOND_PLATE", - "SHP_DOMESTIC_MONSTER", - "SHP_ENDOCRINE_SYSTEMS", - "SHP_ENDOSYMB_HULL", - "SHP_ENRG_BOUND_MAN", - "SHP_FLEET_REPAIR", - "SHP_FRC_ENRG_COMP", - "SHP_GAL_EXPLO", - "SHP_IMPROVED_ENGINE_COUPLINGS", - "SHP_INTSTEL_LOG", - "SHP_LEAD_PLATE", - "SHP_MASSPROP_SPEC", - "SHP_MIDCOMB_LOG", - "SHP_MIL_ROBO_CONT", - "SHP_MINIAST_SWARM", - "SHP_MONOCELL_EXP", - "SHP_MONOMOLEC_LATTICE", - "SHP_MULTICELL_CAST", - "SHP_MULTISPEC_SHIELD", - "SHP_NANOROBO_MAINT", - "SHP_NOVA_BOMB", - "SHP_N_DIMENSIONAL_ENGINE_MATRIX", - "SHP_ORG_HULL", - "SHP_QUANT_ENRG_MAG", - "SHP_REINFORCED_HULL", - "SHP_ROOT_AGGRESSION", - "SHP_SCAT_AST_HULL", - "SHP_SENT_HULL", - "SHP_SINGULARITY_ENGINE_CORE", - "SHP_SOLAR_CONT", - "SHP_SPACE_FLUX_DRIVE", - "SHP_TRANSSPACE_DRIVE", - "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_WEAPON_2", - "SHP_WEAPON_3", - "SHP_WEAPON_4", - "SHP_WEAPON_5", - "SHP_WEAPON_6", - "SHP_WEAPON_7", - "SHP_WEAPON_8", - "SHP_WEAPON_9", - "SHP_ZORTRIUM_PLATE", - "SPY_DETECT_1", - "SPY_DETECT_2", - "SPY_DETECT_3", - "SPY_DETECT_4", - "SPY_DETECT_5", - "SPY_DIST_MOD", - "SPY_LIGHTHOUSE", - "SPY_PLANET_STEALTH_MOD", - "SPY_ROOT_DECEPTION", - "SPY_STEALTH_1", - "SPY_STEALTH_2", - "SPY_STEALTH_3", - "SPY_STEALTH_4", - """ -pass +# "CON_ARCH_MONOFILS", +# "CON_ARCH_PSYCH", +# "CON_ART_HEAVENLY", +# "CON_ART_PLANET", +# "CON_CONC_CAMP", +# "CON_CONTGRAV_ARCH", +# "CON_ENV_ENCAPSUL", +# "CON_FRC_ENRG_CAMO", +# "CON_FRC_ENRG_STRC", +# "CON_GAL_INFRA", +# "CON_INFRA_ECOL", +# "CON_METRO_INFRA", +# "CON_NDIM_STRC", +# "CON_ORBITAL_CON", +# "CON_ORBITAL_HAB", +# "CON_ORGANIC_STRC", +# "CON_PLANET_DRIVE", +# "CON_STARGATE", +# "CON_SUBTER_CONST", +# "CON_TRANS_ARCH", +# "DEF_DEFENSE_NET_1", +# "DEF_DEFENSE_NET_2", +# "DEF_DEFENSE_NET_3", +# "DEF_DEFENSE_NET_REGEN_1", +# "DEF_DEFENSE_NET_REGEN_2", +# "DEF_GARRISON_1", +# "DEF_GARRISON_2", +# "DEF_GARRISON_3", +# "DEF_GARRISON_4", +# "DEF_PLANET_CLOAK", +# "DEF_PLAN_BARRIER_SHLD_1", +# "DEF_PLAN_BARRIER_SHLD_2", +# "DEF_PLAN_BARRIER_SHLD_3", +# "DEF_PLAN_BARRIER_SHLD_4", +# "DEF_PLAN_BARRIER_SHLD_5", +# "DEF_ROOT_DEFENSE", +# "DEF_SYST_DEF_MINE_1", +# "DEF_SYST_DEF_MINE_2", +# "DEF_SYST_DEF_MINE_3", +# "GRO_ADV_ECOMAN", +# "GRO_BIOTERROR", +# "GRO_CYBORG", +# "GRO_ECO_METAMORPH", +# "GRO_ENERGY_META", +# "GRO_GAIA_TRANS", +# "GRO_GENETIC_ENG", +# "GRO_GENETIC_MED", +# "GRO_GENOME_BANK", +# "GRO_LIFECYCLE_MAN", +# "GRO_MEDICAL_PATH", +# "GRO_NANOTECH_MED", +# "GRO_NANO_CYBERNET", +# "GRO_PLANET_ECOL", +# "GRO_SUBTER_HAB", +# "GRO_SYMBIOTIC_BIO", +# "GRO_TERRAFORM", +# "GRO_TRANSORG_SENT", +# "GRO_XENO_GENETICS", +# "GRO_XENO_HYBRIDS", +# "LRN_ALGO_ELEGANCE", +# "LRN_ARTIF_MINDS", +# "LRN_ART_BLACK_HOLE", +# "LRN_DISTRIB_THOUGHT", +# "LRN_ENCLAVE_VOID", +# "LRN_EVERYTHING", +# "LRN_FORCE_FIELD", +# "LRN_GATEWAY_VOID", +# "LRN_GRAVITONICS", +# "LRN_MIND_VOID", +# "LRN_NDIM_SUBSPACE", +# "LRN_OBSERVATORY_I", +# "LRN_PHYS_BRAIN", +# "LRN_PSIONICS", +# "LRN_PSY_DOM", +# "LRN_QUANT_NET", +# "LRN_SPATIAL_DISTORT_GEN", +# "LRN_STELLAR_TOMOGRAPHY", +# "LRN_TIME_MECH", +# "LRN_TRANSCEND", +# "LRN_TRANSLING_THT", +# "LRN_UNIF_CONC", +# "LRN_XENOARCH", +# "PRO_CORE_MINE", +# "PRO_EXOBOTS", +# "PRO_FUSION_GEN", +# "PRO_INDUSTRY_CENTER_I", +# "PRO_INDUSTRY_CENTER_II", +# "PRO_INDUSTRY_CENTER_III", +# "PRO_MICROGRAV_MAN", +# "PRO_NANOTECH_PROD", +# "PRO_NDIM_ASSMB", +# "PRO_NEUTRONIUM_EXTRACTION", +# "PRO_ORBITAL_GEN", +# "PRO_ROBOTIC_PROD", +# "PRO_SENTIENT_AUTOMATION", +# "PRO_SINGULAR_GEN", +# "PRO_SOL_ORB_GEN", +# "PRO_ZERO_GEN", +# "SHP_ADV_DAM_CONT", +# "SHP_ANTIMATTER_TANK", +# "SHP_ASTEROID_HULLS", +# "SHP_ASTEROID_REFORM", +# "SHP_BASIC_DAM_CONT", +# "SHP_BIOADAPTIVE_SPEC", +# "SHP_BIOTERM", +# "SHP_CAMO_AST_HULL", +# "SHP_CONTGRAV_MAINT", +# "SHP_CONT_BIOADAPT", +# "SHP_CONT_SYMB", +# "SHP_DEATH_SPORE", +# "SHP_DEUTERIUM_TANK", +# "SHP_DIAMOND_PLATE", +# "SHP_DOMESTIC_MONSTER", +# "SHP_ENDOCRINE_SYSTEMS", +# "SHP_ENDOSYMB_HULL", +# "SHP_ENRG_BOUND_MAN", +# "SHP_FLEET_REPAIR", +# "SHP_FRC_ENRG_COMP", +# "SHP_GAL_EXPLO", +# "SHP_IMPROVED_ENGINE_COUPLINGS", +# "SHP_INTSTEL_LOG", +# "SHP_LEAD_PLATE", +# "SHP_MASSPROP_SPEC", +# "SHP_MIDCOMB_LOG", +# "SHP_MIL_ROBO_CONT", +# "SHP_MINIAST_SWARM", +# "SHP_MONOCELL_EXP", +# "SHP_MONOMOLEC_LATTICE", +# "SHP_MULTICELL_CAST", +# "SHP_MULTISPEC_SHIELD", +# "SHP_NANOROBO_MAINT", +# "SHP_NOVA_BOMB", +# "SHP_N_DIMENSIONAL_ENGINE_MATRIX", +# "SHP_ORG_HULL", +# "SHP_QUANT_ENRG_MAG", +# "SHP_REINFORCED_HULL", +# "SHP_ROOT_AGGRESSION", +# "SHP_SCAT_AST_HULL", +# "SHP_SENT_HULL", +# "SHP_SINGULARITY_ENGINE_CORE", +# "SHP_SOLAR_CONT", +# "SHP_SPACE_FLUX_DRIVE", +# "SHP_TRANSSPACE_DRIVE", +# "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_WEAPON_2", +# "SHP_WEAPON_3", +# "SHP_WEAPON_4", +# "SHP_WEAPON_5", +# "SHP_WEAPON_6", +# "SHP_WEAPON_7", +# "SHP_WEAPON_8", +# "SHP_WEAPON_9", +# "SHP_ZORTRIUM_PLATE", +# "SPY_DETECT_1", +# "SPY_DETECT_2", +# "SPY_DETECT_3", +# "SPY_DETECT_4", +# "SPY_DETECT_5", +# "SPY_DIST_MOD", +# "SPY_LIGHTHOUSE", +# "SPY_PLANET_STEALTH_MOD", +# "SPY_ROOT_DECEPTION", +# "SPY_STEALTH_1", +# "SPY_STEALTH_2", +# "SPY_STEALTH_3", +# "SPY_STEALTH_4", |
From: <dil...@us...> - 2013-09-08 01:41:10
|
Revision: 6409 http://sourceforge.net/p/freeorion/code/6409 Author: dilvish-fo Date: 2013-09-08 01:41:05 +0000 (Sun, 08 Sep 2013) Log Message: ----------- yet more AI code cleanup Modified Paths: -------------- trunk/FreeOrion/default/AI/AIFleetMission.py trunk/FreeOrion/default/AI/AIFleetOrder.py trunk/FreeOrion/default/AI/AITarget.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/ExplorationAI.py trunk/FreeOrion/default/AI/FleetUtilsAI.py trunk/FreeOrion/default/AI/InvasionAI.py trunk/FreeOrion/default/AI/MilitaryAI.py trunk/FreeOrion/default/AI/MoveUtilsAI.py trunk/FreeOrion/default/AI/PlanetUtilsAI.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 Modified: trunk/FreeOrion/default/AI/AIFleetMission.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetMission.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/AIFleetMission.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import AIFleetOrder import AITarget @@ -372,7 +372,7 @@ EnumsAI.AIFleetMissionType.FLEET_MISSION_DEFEND, EnumsAI.AIFleetMissionType.FLEET_MISSION_HIT_AND_RUN, EnumsAI.AIFleetMissionType.FLEET_MISSION_SECURE ]: - allocations = MilitaryAI.getMilitaryFleets(milFleetIDs=[fleetID], tryReset=False, round="Fleet %d Reassignment"%fleetID) + allocations = MilitaryAI.getMilitaryFleets(milFleetIDs=[fleetID], tryReset=False, thisround="Fleet %d Reassignment"%fleetID) if allocations: MilitaryAI.assignMilitaryFleetsToSystems(useFleetIDList=[fleetID], allocations=allocations) else: @@ -394,7 +394,7 @@ newMilFleets.append(fleetID) allocations=[] if newMilFleets: - allocations = MilitaryAI.getMilitaryFleets(milFleetIDs=newMilFleets, tryReset=False, round="Fleet Reassignment %s"%newMilFleets) + allocations = MilitaryAI.getMilitaryFleets(milFleetIDs=newMilFleets, tryReset=False, thisround="Fleet Reassignment %s"%newMilFleets) if allocations: MilitaryAI.assignMilitaryFleetsToSystems(useFleetIDList=newMilFleets, allocations=allocations) Modified: trunk/FreeOrion/default/AI/AIFleetOrder.py =================================================================== --- trunk/FreeOrion/default/AI/AIFleetOrder.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/AIFleetOrder.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,6 +1,6 @@ from EnumsAI import AIFleetOrderType, AITargetType, AIShipRoleType, AIFleetMissionType import FleetUtilsAI -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import FreeOrionAI as foAI AIFleetOrderTypeNames=AIFleetOrderType() Modified: trunk/FreeOrion/default/AI/AITarget.py =================================================================== --- trunk/FreeOrion/default/AI/AITarget.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/AITarget.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,6 +1,6 @@ import EnumsAI from EnumsAI import AITargetType -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error AI_TARGET_TYPE_NAMES = AITargetType() Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,5 +1,5 @@ #get these declared first to help avoid import circularities -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import AIDependencies import AITarget @@ -57,8 +57,8 @@ "JUGGERNAUT_NEST_SPECIAL":20, } -def dictFromMap(map): - return dict( [ (el.key(), el.data() ) for el in map ] ) +def dictFromMap(this_map): + return dict( [ (el.key(), el.data() ) for el in this_map ] ) def resetCAIGlobals(): global curBestMilShipRating empireSpecies.clear() @@ -89,18 +89,18 @@ universe = fo.getUniverse() planet = universe.getPlanet(pid) if (not planet) or (not planet.speciesName): - return 0.0 + return 0.0 thisSpec = fo.getSpecies(planet.speciesName) if not thisSpec: - return 0.0 + return 0.0 return ratePilotingTag(thisSpec.tags) def getColonyFleets(): + "examines known planets, collects various colonization data, to be later used to send colony fleets" global curBestMilShipRating, gotRuins, curBestPilotRating, curMidPilotRating curBestMilShipRating = ProductionAI.curBestMilShipRating() - "get colony fleets" allColonyFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_COLONISATION) AIstate.colonyFleetIDs[:] = FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allColonyFleetIDs) @@ -314,8 +314,8 @@ else: curMidPilotRating = ratingList[1+int(len(ratingList)/5)] else: - curBestPilotRating = 1e-8 - curMidPilotRating = 1e-8 + curBestPilotRating = 1e-8 + curMidPilotRating = 1e-8 if empireSpecies!=oldEmpSpec: print "Old empire species: %s ; new empire species: %s"%(oldEmpSpec, empireSpecies) if empireColonizers!=oldEmpCol: @@ -493,8 +493,10 @@ return outpostTargetedPlanets -def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire, detail=[], returnAll=False): #TODO: clean up supplyable versus annexable +def assignColonisationValues(planetIDs, missionType, fleetSupplyablePlanetIDs, species, empire, detail=None, returnAll=False): #TODO: clean up supplyable versus annexable "creates a dictionary that takes planetIDs as key and their colonisation score as value" + if detail is None: + detail = [] origDetail = detail planetValues = {} if (missionType == AIFleetMissionType.FLEET_MISSION_OUTPOST ): @@ -526,8 +528,10 @@ #print best[0][2] return planetValues -def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, specName, empire, detail = []): +def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, specName, empire, detail = None): "returns the colonisation value of a planet" + if detail is None: + detail = [] retval = 0 discountMultiplier = 20.0 species=fo.getSpecies(specName or "") #in case None is passed as specName @@ -762,7 +766,7 @@ if system and AIFocusType.FOCUS_INDUSTRY in species.foci: gotAsteroids=False - for pid in [id for id in system.planetIDs if id != planetID]: + for pid in [temp_id for temp_id in system.planetIDs if temp_id != planetID]: p2 = universe.getPlanet(pid) if p2: if p2.size== fo.planetSize.asteroids and not gotAsteroids : Modified: trunk/FreeOrion/default/AI/ExplorationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ExplorationAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/ExplorationAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo # interface used to interact with FreeOrion AI client +import freeOrionAIInterface as fo # interface used to interact with FreeOrion AI client # pylint: disable=import-error import FreeOrionAI as foAI import FleetUtilsAI from EnumsAI import AIFleetMissionType, AIExplorableSystemType, AITargetType @@ -8,16 +8,16 @@ from random import shuffle graphFlags={} -__interiorExploredSystemIDs = {} # explored systems whose neighbors are also all -__borderExploredSystemIDs = {} -__borderUnexploredSystemIDs = {} +interiorExploredSystemIDs = {} # explored systems whose neighbors are also all +borderExploredSystemIDs = {} +borderUnexploredSystemIDs = {} currentScoutFleetIDs = [] -def dictFromMap(map): - return dict( [ (el.key(), el.data() ) for el in map ] ) +def dictFromMap(this_map): + return dict( [ (el.key(), el.data() ) for el in this_map ] ) def getBorderExploredSystemIDs(): - return list( __borderExploredSystemIDs ) + return list( borderExploredSystemIDs ) def updateScoutFleets(): currentScoutFleetIDs[:] = [] @@ -48,7 +48,7 @@ capitalSysID = PlanetUtilsAI.getCapitalSysID() # order fleets to explore #explorableSystemIDs = foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED) - explorableSystemIDs = list(__borderUnexploredSystemIDs) + explorableSystemIDs = list(borderUnexploredSystemIDs) if not explorableSystemIDs: return expSystemsByDist = sorted( map( lambda x: ( universe.linearDistance(capitalSysID, x), x) , explorableSystemIDs ) ) @@ -233,8 +233,8 @@ foAI.foAIstate.exploredSystemIDs[sysID] = 1 sys=universe.getSystem(sysID) print "Moved system %d ( %s ) from unexplored list to explored list"%( sysID, (sys and sys.name) or "name unknown") - if sysID in __borderUnexploredSystemIDs: - del __borderUnexploredSystemIDs[sysID] + if sysID in borderUnexploredSystemIDs: + del borderUnexploredSystemIDs[sysID] newlyExplored.append(sysID) else: stillUnexplored.append(sysID) @@ -251,11 +251,11 @@ else: nextList.append(neighborID) if allExplored: - __interiorExploredSystemIDs[sysID] = 1 - if (sysID in __borderExploredSystemIDs) : - del __borderExploredSystemIDs[sysID] + interiorExploredSystemIDs[sysID] = 1 + if (sysID in borderExploredSystemIDs) : + del borderExploredSystemIDs[sysID] else: - __borderExploredSystemIDs[sysID] = 1 + borderExploredSystemIDs[sysID] = 1 for sysID in stillUnexplored: neighbors = list( universe.getImmediateNeighbors(sysID, empireID) ) @@ -264,6 +264,6 @@ if neighborID in foAI.foAIstate.exploredSystemIDs: #consider changing to unexplored test -- when it matters, unexplored will be smaller than explored, but need to not get previously untreated neighbors anyExplored=True if anyExplored: - __borderUnexploredSystemIDs[sysID] = 1 + borderUnexploredSystemIDs[sysID] = 1 return newlyExplored Modified: trunk/FreeOrion/default/AI/FleetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/FleetUtilsAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import FreeOrionAI as foAI import EnumsAI from EnumsAI import AIFleetMissionType, AIShipRoleType, AIExplorableSystemType, AIShipDesignTypes @@ -41,7 +41,9 @@ return tally def getFleetsForMission(nships, targetStats, minStats, curStats, species, systemsToCheck, systemsChecked, fleetPoolSet, fleetList, - takeAny=False, extendSearch=True, triedFleets=set([]), verbose=False, depth=0): #implements breadth-first search through systems + takeAny=False, extendSearch=True, triedFleets=None, verbose=False, depth=0): #implements breadth-first search through systems + if triedFleets is None: + triedFleets = set() if verbose: print "getFleetsForMission: (nships:%1d, targetStats:%s, minStats:%s, curStats:%s, species:%6s, systemsToCheck:%8s, systemsChecked:%8s, fleetPoolSet:%8s, fleetList:%8s) "%( nships, targetStats, minStats, curStats, species, systemsToCheck, systemsChecked, fleetPoolSet, fleetList) @@ -62,7 +64,7 @@ fleetID=fleetsHere.pop(0) fleet = universe.getFleet(fleetID) if not fleet: - "in getFleetsForMission, fleetID %d appers invalid; cannot retrieve"%fleetID + print "in getFleetsForMission, fleetID %d appears invalid; cannot retrieve"%fleetID fleetPoolSet.remove( fleetID) continue if len (list(fleet.shipIDs)) > 1: @@ -486,10 +488,10 @@ print "" universe=fo.getUniverse() aiFleetMissions = foAI.foAIstate.getAllAIFleetMissions() - round = 0 - while (round <3): - round += 1 - print "issuing fleet orders Round %d:"%round + thisround = 0 + while (thisround <3): + thisround += 1 + print "issuing fleet orders Round %d:"%thisround for aiFleetMission in aiFleetMissions: fleetID = aiFleetMission.target_id fleet = aiFleetMission.getAITarget().target_obj Modified: trunk/FreeOrion/default/AI/InvasionAI.py =================================================================== --- trunk/FreeOrion/default/AI/InvasionAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/InvasionAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import FreeOrionAI as foAI import AIstate import AIDependencies @@ -11,8 +11,8 @@ import ColonisationAI import MilitaryAI -def dictFromMap(map): - return dict( [ (el.key(), el.data() ) for el in map ] ) +def dictFromMap(thismap): + return dict( [ (el.key(), el.data() ) for el in thismap ] ) def getInvasionFleets(): "get invasion fleets" @@ -150,7 +150,6 @@ "BLD_SHIPYARD_CON_ADV_ENGINE": 1000, "BLD_SHIPYARD_AST": 300, "BLD_SHIPYARD_AST_REF": 1000, - "BLD_SHIPYARD_ENRG_COMP": 500, "BLD_SHIPYARD_ENRG_SOLAR": 1500, "BLD_INDUSTRY_CENTER": 500, "BLD_GAS_GIANT_GEN": 200, Modified: trunk/FreeOrion/default/AI/MilitaryAI.py =================================================================== --- trunk/FreeOrion/default/AI/MilitaryAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/MilitaryAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import FreeOrionAI as foAI import AIstate import AITarget @@ -15,15 +15,15 @@ MilitaryAllocations = [] minMilAllocations = {} totMilRating=0 -milShips=0 +num_milships=0 verboseMilReporting=False -def tryAgain(milFleetIDs, tryReset=False, round=""): +def tryAgain(milFleetIDs, tryReset=False, thisround=""): for fid in milFleetIDs: thisMission=foAI.foAIstate.getAIFleetMission(fid) thisMission.clearAIFleetOrders() thisMission.clearAITargets(-1) - getMilitaryFleets(tryReset=tryReset, round=round) + getMilitaryFleets(tryReset=tryReset, thisround=thisround) return def ratingNeeded(target, current=0): @@ -32,9 +32,9 @@ else: return target + current - (4*target*current)**0.5 -def getMilitaryFleets(milFleetIDs=None, tryReset=True, round="Main"): +def getMilitaryFleets(milFleetIDs=None, tryReset=True, thisround="Main"): "get armed military fleets" - global MilitaryAllocations, totMilRating + global MilitaryAllocations, totMilRating, num_milships universe = fo.getUniverse() empire = fo.getEmpire() @@ -53,33 +53,33 @@ allMilitaryFleetIDs = milFleetIDs else: allMilitaryFleetIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_MILITARY ) - if tryReset and ((fo.currentTurn()+empireID) % 10 ==0) and round=="Main": - tryAgain(allMilitaryFleetIDs, tryReset=False, round = round+" Reset") + if tryReset and ((fo.currentTurn()+empireID) % 10 ==0) and thisround=="Main": + tryAgain(allMilitaryFleetIDs, tryReset=False, thisround = thisround+" Reset") - milShips = 0 + num_milships = 0 for fid in allMilitaryFleetIDs: - milShips += foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) + num_milships += foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) thisTotMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x).get('overall', 0), allMilitaryFleetIDs ) ) - if "Main" in round: + if "Main" in thisround: totMilRating = thisTotMilRating print "==================================================" - print "%s Round Total Military Rating: %d"%(round, totMilRating) + print "%s Round Total Military Rating: %d"%(thisround, totMilRating) print "---------------------------------" foAI.foAIstate.militaryRating=totMilRating milFleetIDs = list( FleetUtilsAI.extractFleetIDsWithoutMissionTypes(allMilitaryFleetIDs)) availMilRating = sum( map(lambda x: foAI.foAIstate.getRating(x).get('overall', 0), milFleetIDs ) ) - if "Main" in round: + if "Main" in thisround: print "==================================================" - print "%s Round Available Military Rating: %d"%(round, availMilRating) + print "%s Round Available Military Rating: %d"%(thisround, availMilRating) print "---------------------------------" remainingMilRating = availMilRating allocations = [] allocationGroups={} if milFleetIDs == []: - if "Main" in round: + if "Main" in thisround: MilitaryAllocations = [] return [] @@ -173,7 +173,7 @@ allocations.append( ( capitalSysID, newAlloc, True, 2*capitalThreat) ) allocationGroups.setdefault('capitol', []).append( ( capitalSysID, newAlloc, True, 2*capitalThreat) ) remainingMilRating -= newAlloc - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "Empire Capital System: (%d) %s -- threat : %d, military allocation: existing: %d ; new: %d"%(capitalSysID, universe.getSystem(capitalSysID).name , capitalThreat, alreadyAssignedRating[capitalSysID], newAlloc) print "-----------------" @@ -182,7 +182,7 @@ #--------Empire Occupied Systems ---------- empirePlanetIDs = PlanetUtilsAI.getOwnedPlanetsByEmpire(universe.planetIDs, empireID) empireOccupiedSystemIDs = list( set(PlanetUtilsAI.getSystems(empirePlanetIDs)) - set([capitalSysID] ) ) - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "Empire-Occupied Systems: %s"%( [ "| %d %s |"%(eoSysID, universe.getSystem(eoSysID).name) for eoSysID in empireOccupiedSystemIDs ] ) print "-----------------" @@ -208,10 +208,10 @@ allocationGroups.setdefault('occupied', []).append( (sid, thisAlloc, True, 2*thrt) ) remainingMilRating -= thisAlloc ocSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: print "Provincial Occupied system %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "Provincial Empire-Occupied Sytems under total threat: %d -- total mil allocation: existing %d ; new: %d"%(totocSysThreat, totCurAlloc, ocSysAlloc ) print "-----------------" @@ -220,7 +220,7 @@ #--------Top Targeted Systems ---------- #TODO: do native invasions highest priority otherTargetedSystemIDs = topTargetSystems - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "Top Colony and Invasion Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) print "-----------------" @@ -245,10 +245,10 @@ allocationGroups.setdefault('topTargets', []).append( (sid, thisAlloc, takeAny , maxAlloc) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: 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) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "-----------------" print "Top Colony and Invasion Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) @@ -258,7 +258,7 @@ #--------Targeted Systems ---------- #TODO: do native invasions highest priority otherTargetedSystemIDs = [sysID for sysID in set( PlanetUtilsAI.getSystems(AIstate.opponentPlanetIDs)) if sysID not in topTargetSystems] - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "Other Invasion Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) print "-----------------" @@ -283,17 +283,17 @@ allocationGroups.setdefault('otherTargets', []).append( (sid, thisAlloc, takeAny , maxAlloc) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: 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) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "-----------------" print "Invasion Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) print "-----------------" otherTargetedSystemIDs = [sysID for sysID in list(set(AIstate.colonyTargetedSystemIDs + AIstate.outpostTargetedSystemIDs)) if sysID not in topTargetSystems] - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "Other Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) print "-----------------" @@ -317,10 +317,10 @@ allocationGroups.setdefault('otherTargets', []).append( (sid, thisAlloc, takeAny , maxAlloc) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: 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) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "-----------------" print "Other Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) @@ -337,7 +337,7 @@ otherTargetedSystemIDs.append(sysID) break - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "Blockade Targeted Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in otherTargetedSystemIDs ] ) print "-----------------" @@ -361,10 +361,10 @@ allocationGroups.setdefault('otherTargets', []).append( (sid, thisAlloc, takeAny , maxAlloc) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: 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) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "-----------------" print "Blockade Targeted Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) @@ -374,7 +374,7 @@ interiorIDs = list( foAI.foAIstate.expInteriorSystemIDs) interiorTargets1 = (targetableIDs.union(interiorIDs)).difference( currentMilSystems ) interiorTargets = [sid for sid in interiorTargets1 if ( (threatBias + foAI.foAIstate.systemStatus.get(sid, {}).get('totalThreat', 0) >0.8*alreadyAssignedRating[sid] ) ) ] - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "" print "Other Empire-Proximal Systems : %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in interiorTargets1 ] ) @@ -400,15 +400,15 @@ allocationGroups.setdefault('otherTargets', []).append( (sid, thisAlloc, takeAny , maxAlloc) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: 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) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "-----------------" print "Other Interior Systems under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) print "-----------------" - elif "Main" in round: + elif "Main" in thisround: if verboseMilReporting: print "-----------------" print "No Other Interior Systems with fleet threat " @@ -418,7 +418,7 @@ #exploTargetIDs, _ = ExplorationAI.getCurrentExplorationInfo(verbose=False) exploTargetIDs=[] - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "" print "Exploration-targeted Systems: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in exploTargetIDs ] ) @@ -448,10 +448,10 @@ allocationGroups.setdefault('exploreTargets', []).append( (sid, thisAlloc, takeAny , maxAlloc) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: 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) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "-----------------" print "Exploration-targeted s under total threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) @@ -462,7 +462,7 @@ 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] )) ] - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "" print "Empire-Accessible Systems not yet allocated military: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID) and universe.getSystem(sysID).name) for sysID in borderTargets1 ] ) @@ -488,22 +488,22 @@ allocationGroups.setdefault('accessibleTargets', []).append( (sid, thisAlloc, takeAny , maxAlloc) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: 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) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "-----------------" print "Other Empire-Accessible Systems under total biased threat: %d -- total mil allocation-- existing: %d ; new: %d"%(tototSysThreat, totCurAlloc, otSysAlloc ) print "-----------------" - elif "Main" in round: + elif "Main" in thisround: if verboseMilReporting: print "-----------------" print "No Other Empire-Accessible Systems with biased local threat " print "-----------------" #monster den treatment probably unnecessary now - if "Main" in round: + if "Main" in thisround: if verboseMilReporting: print "" print "Big-Monster Dens: %s"%( [ "| %d %s |"%(sysID, universe.getSystem(sysID).name) for sysID in monsterDens ] ) @@ -524,10 +524,10 @@ allocations.append( (sid, thisAlloc, False, 5) ) remainingMilRating -= thisAlloc otSysAlloc += thisAlloc - if "Main" in round or thisAlloc >0: + if "Main" in thisround or thisAlloc >0: if verboseMilReporting: print "Monster Den %4d ( %10s ) has local threat %8d ; existing military allocation %d and new allocation %8d"%(sid, universe.getSystem(sid).name, thrt, curAlloc, thisAlloc) - if "Main" in round or newAlloc >0: + if "Main" in thisround or newAlloc >0: if verboseMilReporting: print "-----------------" @@ -542,7 +542,7 @@ print "error unpacking sid, alloc, takeAny, maxAlloc from ", 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) - print "%s Round Remaining military strength allocation %d will be allocated as surplus allocation to top current priorities"%(round, remainingMilRating) + print "%s Round Remaining military strength allocation %d will be allocated as surplus allocation to top current priorities"%(thisround, remainingMilRating) newAllocations = [] for cat in ['capitol', 'topTargets', 'otherTargets', 'accessibleTargets', 'occupied', 'exploreTargets']: for sid, alloc, takeAny, maxAlloc in allocationGroups.get(cat, []): @@ -553,14 +553,15 @@ newAllocations.append( ( sid, newRating, alloc, takeAny ) ) remainingMilRating -= ( newRating - alloc ) - if "Main" in round: + if "Main" in thisround: MilitaryAllocations = newAllocations - minMilAllocations = dict( [ (sid, alloc) for sid, alloc, takeAny, mm in allocations ] ) - if verboseMilReporting or "Main" in round: - print "------------------------------\nFinal %s Round Military Allocations: %s \n-----------------------"%(round, dict( [ (sid, alloc) for sid, alloc, minalloc, takeAny in newAllocations ] ) ) + minMilAllocations.clear() + minMilAllocations.update( [ (sid, alloc) for sid, alloc, takeAny, mm in allocations ] ) + if verboseMilReporting or "Main" in thisround: + print "------------------------------\nFinal %s Round Military Allocations: %s \n-----------------------"%(thisround, dict( [ (sid, alloc) for sid, alloc, minalloc, takeAny in newAllocations ] ) ) # export military systems for other AI modules - if "Main" in round: + if "Main" in thisround: AIstate.militarySystemIDs = list( set([sid for sid, alloc, minalloc, takeAny in newAllocations]).union( [sid for sid in alreadyAssignedRating if alreadyAssignedRating[sid]>0 ] )) else: AIstate.militarySystemIDs = list( set([sid for sid, alloc, minalloc, takeAny in newAllocations]).union( AIstate.militarySystemIDs) ) @@ -623,12 +624,14 @@ else: return 1 + .25 * distanceFactor -def assignMilitaryFleetsToSystems(useFleetIDList=None, allocations=[]): +def assignMilitaryFleetsToSystems(useFleetIDList=None, allocations=None): # assign military fleets to military theater systems global MilitaryAllocations universe = fo.getUniverse() + if allocations is None: + allocations = [] - doingMain = (useFleetIDList==None) + doingMain = (useFleetIDList is None) if doingMain: baseDefenseIDs = FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_ORBITAL_DEFENSE) unassignedBaseDefenseIDs = FleetUtilsAI.extractFleetIDsWithoutMissionTypes(baseDefenseIDs) @@ -685,7 +688,7 @@ else: theseFleets = foundFleets #rating = sum( map(lambda x: foAI.foAIstate.rateFleet(x), foundFleets ) ) - ratings = map(lambda x: foAI.foAIstate.rateFleet(x), foundFleets ) + ratings = map(foAI.foAIstate.rateFleet, foundFleets ) rating = sum([fr.get('attack', 0) for fr in ratings]) * sum([fr.get('health', 0) for fr in ratings]) if doingMain and verboseMilReporting: if rating < minMilAllocations.get(sysID, 0): Modified: trunk/FreeOrion/default/AI/MoveUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/MoveUtilsAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/MoveUtilsAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import FreeOrionAI as foAI from EnumsAI import AITargetType, AIFleetOrderType import AITarget Modified: trunk/FreeOrion/default/AI/PlanetUtilsAI.py =================================================================== --- trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/PlanetUtilsAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import FreeOrionAI as foAI def sysNameIDs(sysIDs): Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,7 +1,7 @@ import math import random -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import AIstate import ColonisationAI @@ -161,7 +161,7 @@ universe = fo.getUniverse() empire = fo.getEmpire() - numUnexploredSystems = len( ExplorationAI.__borderUnexploredSystemIDs ) #len(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED)) + numUnexploredSystems = len( ExplorationAI.borderUnexploredSystemIDs ) #len(foAI.foAIstate.getExplorableSystems(AIExplorableSystemType.EXPLORABLE_SYSTEM_UNEXPLORED)) numScouts = sum( [ foAI.foAIstate.fleetStatus.get(fid, {}).get('nships', 0) for fid in ExplorationAI.currentScoutFleetIDs] ) # FleetUtilsAI.getEmpireFleetIDsByRole(AIFleetMissionType.FLEET_MISSION_EXPLORATION) productionQueue = empire.productionQueue queuedScoutShips=0 @@ -171,7 +171,7 @@ if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_EXPLORATION : queuedScoutShips += element.remaining * element.blocksize - milShips = MilitaryAI.milShips + milShips = MilitaryAI.num_milships scoutsNeeded = max(0, min( 4+int(milShips/5), 4+int(fo.currentTurn()/50) , 2+ numUnexploredSystems**0.5 ) - numScouts - queuedScoutShips ) explorationPriority = int(40*scoutsNeeded) Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -2,7 +2,7 @@ import traceback import random -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import AIstate @@ -32,8 +32,8 @@ doDoubleShields=False -def dictFromMap(map): - return dict( [ (el.key(), el.data() ) for el in map ] ) +def dictFromMap(this_map): + return dict( [ (el.key(), el.data() ) for el in this_map ] ) #get key routines declared for import by others before completing present imports, to avoid circularity problems def curBestMilShipRating(): @@ -228,11 +228,11 @@ is1, is2 = "FU_BASIC_TANK", "SH_DEFLECTOR" nb, hull = designNameBases[1]+"-%1d-%1d", "SH_ORGANIC" - for id in [1, 2, 3, 4]: - newScoutDesigns += [ (nb%(id, 0), desc, "SH_BASIC_SMALL", [ db%id], "", model) ] + for d_id in [1, 2, 3, 4]: + newScoutDesigns += [ (nb%(d_id, 0), desc, "SH_BASIC_SMALL", [ db%d_id], "", model) ] nb, hull = designNameBases[2]+"-%1d-%1d", "SH_ENDOMORPHIC" - #for id in [3, 4]: - # newScoutDesigns += [ (nb%(id, iw), desc, hull, [ db%id, srb%iw, "", "", "", ""], "", model) for iw in range(5, 9) ] + #for d_id in [3, 4]: + # newScoutDesigns += [ (nb%(d_id, iw), desc, hull, [ db%d_id, srb%iw, "", "", "", ""], "", model) for iw in range(5, 9) ] addDesigns(shipType, newScoutDesigns, shipProdPriority) def addOrbitalDefenseDesigns(): @@ -410,8 +410,8 @@ op = "CO_OUTPOST_POD" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" - for id in [1, 2]: - newOutpostDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", op], "", model) for iw in [2, 3, 4] ] + for p_id in [1, 2]: + newOutpostDesigns += [ (nb%(p_id, iw), desc, hull, [ srb%iw, db%p_id, "", op], "", model) for iw in [2, 3, 4] ] addDesigns(shipType, newOutpostDesigns, shipProdPriority) def addColonyDesigns(): @@ -424,12 +424,12 @@ cp, cp2 = "CO_COLONY_POD", "CO_SUSPEND_ANIM_POD" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" - for id in [1, 2, 3]: - newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, "", db%id, cp], "", model) for iw in [1, 2, 3, 4] ] + for p_id in [1, 2, 3]: + newColonyDesigns += [ (nb%(p_id, iw), desc, hull, [ srb%iw, "", db%p_id, cp], "", model) for iw in [1, 2, 3, 4] ] nb = designNameBases[2]+"%1d_%1d" - for id in [1, 2, 3]: - newColonyDesigns += [ (nb%(id, iw), desc, hull, [ srb%iw, db%id, "", cp2], "", model) for iw in [3.4] ] + for p_id in [1, 2, 3]: + newColonyDesigns += [ (nb%(p_id, iw), desc, hull, [ srb%iw, db%p_id, "", cp2], "", model) for iw in [3.4] ] addDesigns(shipType, newColonyDesigns, shipProdPriority) def generateProductionOrders(): @@ -1497,6 +1497,7 @@ bestDesignID, bestDesign, buildChoices = getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_COLONISATION, loc) elif thisPriority == EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_MILITARY: selector = random.random() + choice = milBuildChoices[0] #milBuildChoices can't be empty due to earlier check for choice in milBuildChoices: if choice[0] >= selector: break @@ -1517,11 +1518,11 @@ if ratingRatio < 0.1: locPlanet = universe.getPlanet(loc) if locPlanet: - pname = locPlanet.name - thisRating = ColonisationAI.ratePlanetaryPiloting(loc) - ratingRatio = float(thisRating) / ColonisationAI.curBestPilotRating - qualifier = ["", "suboptimal"][ratingRatio < 1.0] - print "Building mil ship at loc %d (%s) with %s pilot Rating: %.1f; ratio to empire best is %.1f"%(loc, pname, qualifier, thisRating, ratingRatio) + pname = locPlanet.name + thisRating = ColonisationAI.ratePlanetaryPiloting(loc) + ratingRatio = float(thisRating) / ColonisationAI.curBestPilotRating + qualifier = ["", "suboptimal"][ratingRatio < 1.0] + print "Building mil ship at loc %d (%s) with %s pilot Rating: %.1f; ratio to empire best is %.1f"%(loc, pname, qualifier, thisRating, ratingRatio) while ( totalPP > 40*perTurnCost): numShips *= 2 perTurnCost *= 2 Modified: trunk/FreeOrion/default/AI/ResearchAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResearchAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/ResearchAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import FreeOrionAI as foAI import TechsListsAI from EnumsAI import AIPriorityType, getAIPriorityResearchTypes @@ -11,7 +11,6 @@ inProgressTechs={} def generateResearchOrders(): - global inProgressTechs "generate research orders" universe=fo.getUniverse() Modified: trunk/FreeOrion/default/AI/ResourcesAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResourcesAI.py 2013-09-08 01:40:28 UTC (rev 6408) +++ trunk/FreeOrion/default/AI/ResourcesAI.py 2013-09-08 01:41:05 UTC (rev 6409) @@ -1,4 +1,4 @@ -import freeOrionAIInterface as fo +import freeOrionAIInterface as fo # pylint: disable=import-error import FreeOrionAI as foAI import AIstate from EnumsAI import AIPriorityType, getAIPriorityResourceTypes, AIFocusType @@ -137,7 +137,6 @@ def setPlanetResourceFoci(): #+ "set resource focus of planets " - global __timerFile newFoci = {} print "\n============================" @@ -354,7 +353,6 @@ resourceTimerFile.flush() def generateResourcesOrders(): #+ - global __timerFile "generate resources focus orders" timer= [ time() ] |
From: <dil...@us...> - 2013-09-08 19:37:29
|
Revision: 6410 http://sourceforge.net/p/freeorion/code/6410 Author: dilvish-fo Date: 2013-09-08 19:37:25 +0000 (Sun, 08 Sep 2013) Log Message: ----------- AI improvement to military assessments Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ProductionAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-09-08 01:41:05 UTC (rev 6409) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-09-08 19:37:25 UTC (rev 6410) @@ -271,7 +271,23 @@ enemyRating=0 monsterRatings=[] lostFleetRating=0 - enemyRatings = [self.rateFleet(fid) for fid in localEnemyFleetIDs ] + #enemyRatings = [self.rateFleet(fid) for fid in localEnemyFleetIDs ] + enemyRatings = [] + for fid in localEnemyFleetIDs: + oldstyle_rating = self.old_rate_fleet(fid) + newstyle_rating = self.rateFleet(fid) + enemyRatings.append(newstyle_rating) + if oldstyle_rating.get('overall', 0) != newstyle_rating.get('overall', 0): + loc = "" + fleetname = "" + fleet = universe.getFleet(fid) + if fleet: + fleetname = fleet.name + sysID = fleet.systemID + system = universe.getSystem(sysID) + if system: + loc = " at %s" % system.name + print "AiState.updateSystemStatus for fleet %s id (%d)%s got different newstyle rating (%s) and oldstyle rating (%s)" % (fleetname, fid, loc, newstyle_rating, oldstyle_rating) enemyAttack = sum( [rating.get('attack', 0) for rating in enemyRatings]) enemyHealth = sum( [rating.get('health', 0) for rating in enemyRatings]) enemyRating = enemyAttack * enemyHealth @@ -445,8 +461,37 @@ if mission.hasTarget(aiFleetMissionType, aiTarget): return True return False + + def rateFleet(self, fleetID, enemy_stats=None): + if enemy_stats is None: + enemy_stats=[ (1, {}) ] + universe=fo.getUniverse() + fleet=universe.getFleet(fleetID) + if fleet and (not fleet.aggressive) and fleet.ownedBy(self.empireID): + pass + #fleet.setAggressive(True) + if not fleet: + return {} + 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) + if not ship: + continue + stats = self.get_weighted_design_stats(ship.designID, ship.speciesName) + structure = ship.currentMeterValue(fo.meterType.structure) + stats['structure'] = structure + self.adjust_stats_vs_enemy(stats, enemy_stats) + rating += stats['attack'] * stats['structure'] + attack += stats['attack'] + health += stats['structure'] + nships+=1 + return {'overall':attack*health, 'tally':rating, 'attack':attack, 'health':health, 'nships':nships} - def rateFleet(self, fleetID): + def old_rate_fleet(self, fleetID): universe=fo.getUniverse() fleet=universe.getFleet(fleetID) if fleet and (not fleet.aggressive) and fleet.ownedBy(self.empireID): @@ -471,6 +516,7 @@ return {'overall':attack*health, 'tally':rating, 'attack':attack, 'health':health, 'nships':nships} def getRating(self, fleetID, forceNew=False): + "returns a dict with various rating info" if (fleetID in self.fleetStatus) and not forceNew: return self.fleetStatus[fleetID].get('rating', {} ) else: @@ -529,16 +575,17 @@ weapons_grade, shields_grade = self.get_piloting_grades(species_name) design_stats = dict( self.getDesignIDStats(design_id) ) #new dict so we don't modify our original data myattacks = self.weight_attacks(design_stats.get('attacks', {}), weapons_grade) + design_stats['attacks'] = myattacks #mystructure = design_stats.get('structure', 1) myshields = self.weight_shields(design_stats.get('shields', 0), shields_grade) design_stats['attack'] = sum([a * b for a, b in myattacks.items()]) design_stats['shields'] = myshields return design_stats - def get_weighted_rating(self, ship_stats, enemy_stats=None): - "rate a ship w/r/t a particular enemy" + def adjust_stats_vs_enemy(self, ship_stats, enemy_stats=None ): + "rate a ship w/r/t a particular enemy, adjusts ship_stats in place" if enemy_stats is None: - enemy_stats=[ (1, {}) ] + enemy_stats = [ (1, {}) ] myattacks = ship_stats.get('attacks', {}) mystructure = ship_stats.get('structure', 1) myshields = ship_stats.get('shields', 0) @@ -550,23 +597,29 @@ estats = enemygroup[1] if estats == {}: attack_tally += count * sum([ a * b for a, b in myattacks.items()]) - structure_tally += count * (mystructure + myshields * sum(myattacks.values)) + structure_tally += count * (mystructure + myshields * sum(myattacks.values())) #uses num of my attacks for proxy calc of structure help from shield total_enemy_weights += count continue - structure_tally += count * max(mystructure, min(estats.get('attacks', {})) - myshields ) # eshields = estats.get('shields', 0) tempattacktally=0 - tempstruc = estats.get('structure', 1) - total_enemy_weights += count * tempstruc - for attack in myattacks: + tempstruc = max(1e-4, estats.get('structure', 1)) + thisweight = count * tempstruc + total_enemy_weights += thisweight + structure_tally += thisweight * max(mystructure, min(estats.get('attacks', {})) - myshields ) # + for attack, nattacks in myattacks: adjustedattack = max(0, attack-eshields) - nattacks = myattacks[attack] thisattack = min(tempstruc, nattacks*adjustedattack) tempattacktally += thisattack tempstruc -= thisattack if tempstruc <= 0: break - attack_tally += count * tempattacktally + attack_tally += thisweight * tempattacktally + weighted_attack = attack_tally / total_enemy_weights + weighted_structure = structure_tally / total_enemy_weights + ship_stats['attack'] = weighted_attack + ship_stats['structure'] = weighted_structure + ship_stats['weighted'] = True + return ship_stats def getDesignIDStats(self, designID): if designID is None: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-08 01:41:05 UTC (rev 6409) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-08 19:37:25 UTC (rev 6410) @@ -1292,10 +1292,11 @@ print " " + blockStr + element.name+" requiring " + str(element.turnsLeft) + " more turns; alloc: %.2f PP"%element.allocation + " with cum. progress of %.1f"%element.progress + " being built at " + universe.getObject(element.locationID).name if element.turnsLeft == -1: if element.locationID not in AIstate.popCtrIDs+AIstate.outpostIDs: - dequeueList.append(queue_index) #TODO add assessment of recapture -- invasion target etc. - print "element %s will never be completed as stands and location %d no longer owned; deleting from queue "%(element.name, element.locationID) + #dequeueList.append(queue_index) #TODO add assessment of recapture -- invasion target etc. + #print "element %s will never be completed as stands and location %d no longer owned; deleting from queue "%(element.name, element.locationID) + print "element %s will never be completed as stands and location %d no longer owned; could consider deleting from queue "%(element.name, element.locationID) #TODO: else: - print "element %s will never be completed as currently stands, but will remain on queue "%element.name + print "element %s is projected to never be completed as currently stands, but will remain on queue "%element.name elif element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: if foAI.foAIstate.getShipRole(element.designID) == EnumsAI.AIShipRoleType.SHIP_ROLE_CIVILIAN_COLONISATION: thisSpec=universe.getPlanet(element.locationID).speciesName |
From: <dil...@us...> - 2013-09-10 19:55:57
|
Revision: 6412 http://sourceforge.net/p/freeorion/code/6412 Author: dilvish-fo Date: 2013-09-10 19:55:54 +0000 (Tue, 10 Sep 2013) Log Message: ----------- AI update, adjusted tech preferences & improved use of outpost bases Modified Paths: -------------- trunk/FreeOrion/default/AI/AIstate.py trunk/FreeOrion/default/AI/ColonisationAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/AIstate.py =================================================================== --- trunk/FreeOrion/default/AI/AIstate.py 2013-09-09 15:01:50 UTC (rev 6411) +++ trunk/FreeOrion/default/AI/AIstate.py 2013-09-10 19:55:54 UTC (rev 6412) @@ -93,6 +93,7 @@ self.shipCount = 4 self.misc={} self.qualifyingColonyBaseTargets={} + self.qualifyingOutpostBaseTargets={} def __del__(self): "destructor" @@ -106,6 +107,7 @@ del self.newlySplitFleets del self.misc del self.qualifyingColonyBaseTargets + del self.qualifyingOutpostBaseTargets def clean(self): "turn start AIstate cleanup" @@ -730,6 +732,7 @@ outpostSystemIDs[:] = [] ResourcesAI.lastFociCheck[0]=0 self.qualifyingColonyBaseTargets.clear() + self.qualifyingOutpostBaseTargets.clear() def __cleanFleetRoles(self, justResumed=False): "removes fleetRoles if a fleet has been lost, and update fleet Ratings" Modified: trunk/FreeOrion/default/AI/ColonisationAI.py =================================================================== --- trunk/FreeOrion/default/AI/ColonisationAI.py 2013-09-09 15:01:50 UTC (rev 6411) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-09-10 19:55:54 UTC (rev 6412) @@ -368,54 +368,78 @@ colonyCost= AIDependencies.colonyPodCost *(1+ AIDependencies.colonyPodUpkeep *len( list(AIstate.popCtrIDs) )) outpostCost= AIDependencies.outpostPodCost *(1+ AIDependencies.colonyPodUpkeep *len( list(AIstate.popCtrIDs) )) productionQueue = empire.productionQueue - queuedBases=[] + queued_outpost_bases=[] + queued_colony_bases=[] for queue_index in range(0, len(productionQueue)): element=productionQueue[queue_index] if element.buildType == EnumsAI.AIEmpireProductionTypes.BT_SHIP: - if foAI.foAIstate.getShipRole(element.designID) in [ EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST , - EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_COLONISATION ] : + if foAI.foAIstate.getShipRole(element.designID) in [ EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_OUTPOST ] : buildPlanet = universe.getPlanet(element.locationID) - queuedBases.append(buildPlanet.systemID) + queued_outpost_bases.append(buildPlanet.systemID) + elif foAI.foAIstate.getShipRole(element.designID) in [ EnumsAI.AIShipRoleType.SHIP_ROLE_BASE_COLONISATION ] : + buildPlanet = universe.getPlanet(element.locationID) + queued_colony_bases.append(buildPlanet.systemID) - evaluatedColonyPlanetIDs = list(set(unOwnedPlanetIDs).union(empireOutpostIDs) - set(colonyTargetedPlanetIDs) ) - - for pid in evaluatedColonyPlanetIDs: - if pid in foAI.foAIstate.qualifyingColonyBaseTargets: continue + evaluatedColonyPlanetIDs = list(set(unOwnedPlanetIDs).union(empireOutpostIDs) - set(colonyTargetedPlanetIDs) ) # places for possible colonyBase + + #foAI.foAIstate.qualifyingOutpostBaseTargets.clear() #don't want to lose the info by clearing, but #TODO: should double check if still own colonizer planet + #foAI.foAIstate.qualifyingColonyBaseTargets.clear() + cost_ratio = 120 #TODO: temp ratio; reest to 12 *; consider different ratio + for pid in evaluatedColonyPlanetIDs: #TODO: reorganize + if pid in foAI.foAIstate.qualifyingOutpostBaseTargets: + continue planet = universe.getPlanet(pid) - if not planet: continue + if not planet: + continue sysID = planet.systemID for pid2 in empireSpeciesSystems.get(sysID, {}).get('pids', []): planet2 = universe.getPlanet(pid2) - if not planet2: continue + if not planet2: + continue if planet2.speciesName in empireColonizers: - if outpostCost < 12 * availPP_BySys.get(sysID, 0): #TODO: consider different ratio - system=universe.getSystem(sysID) - for pid3 in system.planetIDs: - if (pid3 not in empirePopCtrs): - foAI.foAIstate.qualifyingColonyBaseTargets.setdefault(pid3, [pid2, -1]) - break + if colonyCost < cost_ratio * availPP_BySys.get(sysID, 0): + foAI.foAIstate.qualifyingColonyBaseTargets.setdefault(pid, [pid2, -1])#TODO: check other local colonizers for better score + if (pid not in empireOutpostIDs): + foAI.foAIstate.qualifyingOutpostBaseTargets.setdefault(pid, [pid2, -1]) + break # print "Evaluated Colony PlanetIDs: " + str(evaluatedColonyPlanetIDs) - reservedBaseTargets = foAI.foAIstate.qualifyingColonyBaseTargets.keys() + reserved_outpost_base_targets = foAI.foAIstate.qualifyingOutpostBaseTargets.keys() + max_queued_outpost_bases = max(1, int(2*empire.productionPoints / outpostCost)) + print "considering possible outpost bases at %s" % (reserved_outpost_base_targets) if ( empire.getTechStatus(AIDependencies.outposting_tech) == fo.techStatus.complete): - for pid in (set(reservedBaseTargets) - set(outpostTargetedPlanetIDs)): - if pid not in unOwnedPlanetIDs: continue - if foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] != -1: continue #already building for here - loc = foAI.foAIstate.qualifyingColonyBaseTargets[pid][0] - if 100 < evaluatePlanet(pid, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, None, empire, []): - bestShip, colDesign, buildChoices = ProductionAI.getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_OUTPOST, loc) - if not bestShip: - print "Error: no outpost base can be built at ", PlanetUtilsAI.planetNameIDs([loc]) - continue - #print "selecting ", PlanetUtilsAI.planetNameIDs([pid]), " to build Orbital Defenses" - retval = fo.issueEnqueueShipProductionOrder(bestShip, loc) - print "Enqueueing Outpost Base at %s for %s"%( PlanetUtilsAI.planetNameIDs([loc]), PlanetUtilsAI.planetNameIDs([pid])) - if retval !=0: - foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] = loc - #res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) # move to front + for pid in (set(reserved_outpost_base_targets) - set(outpostTargetedPlanetIDs)): + if len(queued_outpost_bases) >=max_queued_outpost_bases: + print "too many queued outpost bases to build any more now" + break + if pid not in unOwnedPlanetIDs: + continue + if foAI.foAIstate.qualifyingOutpostBaseTargets[pid][1] != -1: + continue #already building for here + loc = foAI.foAIstate.qualifyingOutpostBaseTargets[pid][0] + this_score = evaluatePlanet(pid, EnumsAI.AIFleetMissionType.FLEET_MISSION_OUTPOST, fleetSupplyablePlanetIDs, None, empire, []) + planet = universe.getPlanet(pid) + if this_score == 0: + #print "Potential outpost base (rejected) for %s to be built at planet id(%d); outpost score %.1f" % ( ((planet and planet.name) or "unknown"), loc, this_score) + continue + print "Potential outpost base for %s to be built at planet id(%d); outpost score %.1f" % ( ((planet and planet.name) or "unknown"), loc, this_score) + if this_score < 100: + print "Potential outpost base (rejected) for %s to be built at planet id(%d); outpost score %.1f" % ( ((planet and planet.name) or "unknown"), loc, this_score) + continue + bestShip, colDesign, buildChoices = ProductionAI.getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_ORBITAL_OUTPOST, loc) + if not bestShip: + print "Error: no outpost base can be built at ", PlanetUtilsAI.planetNameIDs([loc]) + continue + #print "selecting ", PlanetUtilsAI.planetNameIDs([pid]), " to build Orbital Defenses" + retval = fo.issueEnqueueShipProductionOrder(bestShip, loc) + print "Enqueueing Outpost Base at %s for %s"%( PlanetUtilsAI.planetNameIDs([loc]), PlanetUtilsAI.planetNameIDs([pid])) + if retval !=0: + foAI.foAIstate.qualifyingOutpostBaseTargets[pid][1] = loc + queued_outpost_bases.append((planet and planet.systemID) or -1) + #res=fo.issueRequeueProductionOrder(productionQueue.size -1, 0) #TODO: evaluate move to front - evaluatedOutpostPlanetIDs = list(set(unOwnedPlanetIDs) - set(outpostTargetedPlanetIDs)- set(colonyTargetedPlanetIDs) - set(reservedBaseTargets)) + evaluatedOutpostPlanetIDs = list(set(unOwnedPlanetIDs) - set(outpostTargetedPlanetIDs)- set(colonyTargetedPlanetIDs) - set(reserved_outpost_base_targets)) # print "Evaluated Outpost PlanetIDs: " + str(evaluatedOutpostPlanetIDs) @@ -1000,8 +1024,8 @@ if not fleet: continue sysID = fleet.systemID system = universe.getSystem(sysID) - availPlanets = set(system.planetIDs).intersection(set( foAI.foAIstate.qualifyingColonyBaseTargets.keys())) - targets = [pid for pid in availPlanets if foAI.foAIstate.qualifyingColonyBaseTargets[pid][1] != -1 ] + availPlanets = set(system.planetIDs).intersection(set( foAI.foAIstate.qualifyingOutpostBaseTargets.keys())) + targets = [pid for pid in availPlanets if foAI.foAIstate.qualifyingOutpostBaseTargets[pid][1] != -1 ] if not targets: print "Error found no valid target for outpost base in system %s (%d)"%(system.name, sysID) continue @@ -1012,7 +1036,7 @@ if rating[0]>bestScore: bestScore = rating[0] targetID = pid - foAI.foAIstate.qualifyingColonyBaseTargets[targetID][1] = -1 #TODO: should probably delete + foAI.foAIstate.qualifyingOutpostBaseTargets[targetID][1] = -1 #TODO: should probably delete aiTarget = AITarget.AITarget(AITargetType.TARGET_PLANET, targetID) aiFleetMission = foAI.foAIstate.getAIFleetMission(fid) aiFleetMission.addAITarget(AIFleetMissionType.FLEET_MISSION_ORBITAL_OUTPOST, aiTarget) Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-09-09 15:01:50 UTC (rev 6411) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-09-10 19:55:54 UTC (rev 6412) @@ -42,7 +42,6 @@ Primary techs for all categories. """ #index = 1 - index - index = 2 result = [] if index == 0: result = [ @@ -70,7 +69,8 @@ "SHP_WEAPON_2_2", "SHP_WEAPON_2_3", "SPY_DETECT_2", - "SHP_DEFLECTOR_SHIELD", + "PRO_MICROGRAV_MAN", + "SHP_ASTEROID_HULLS", "DEF_DEFENSE_NET_2", "DEF_DEFENSE_NET_REGEN_1", "SHP_REINFORCED_HULL", @@ -81,6 +81,7 @@ "GRO_GENETIC_ENG", "DEF_GARRISON_2", "GRO_XENO_GENETICS", + "SHP_DEFLECTOR_SHIELD", "SPY_DETECT_3", "CON_METRO_INFRA", "SHP_WEAPON_3_1", @@ -91,8 +92,6 @@ "SHP_WEAPON_3_2", "SHP_WEAPON_3_3", "SHP_WEAPON_3_4", - "PRO_MICROGRAV_MAN", - "SHP_ASTEROID_HULLS", "DEF_PLAN_BARRIER_SHLD_1", "CON_FRC_ENRG_STRC", "SHP_ADV_DAM_CONT", @@ -160,116 +159,118 @@ #"SHP_ENDOSYMB_HULL", elif index == 1: result = [ - "SHP_WEAPON_1_2", - "GRO_PLANET_ECOL", - "SHP_DOMESTIC_MONSTER", - "SHP_ORG_HULL", - "SHP_WEAPON_1_3", - "GRO_SUBTER_HAB", - "LRN_ALGO_ELEGANCE", - "SHP_WEAPON_1_4", - "PRO_ROBOTIC_PROD", - "LRN_ARTIF_MINDS", - "CON_ENV_ENCAPSUL", - "DEF_DEFENSE_NET_1", - "PRO_FUSION_GEN", - "PRO_INDUSTRY_CENTER_I", - "DEF_GARRISON_1", - "CON_ORBITAL_CON", - "PRO_ORBITAL_GEN", - "SHP_ZORTRIUM_PLATE", - "PRO_MICROGRAV_MAN", - "SHP_ASTEROID_HULLS", - "LRN_FORCE_FIELD", - "GRO_SYMBIOTIC_BIO", - "SHP_WEAPON_2_1", - "SHP_WEAPON_2_2", - "SHP_WEAPON_2_3", - "SPY_DETECT_2", - "SHP_DEFLECTOR_SHIELD", - "DEF_DEFENSE_NET_2", - "DEF_DEFENSE_NET_REGEN_1", - "SHP_WEAPON_2_4", - "PRO_INDUSTRY_CENTER_II", - "SHP_REINFORCED_HULL", - "SHP_BASIC_DAM_CONT", - "PRO_SOL_ORB_GEN", - "GRO_GENETIC_ENG", - "DEF_GARRISON_2", - "GRO_XENO_GENETICS", - "SPY_DETECT_3", - "CON_METRO_INFRA", - "GRO_LIFECYCLE_MAN", - "SHP_MULTICELL_CAST", - "SHP_ENDOCRINE_SYSTEMS", - "SHP_DIAMOND_PLATE", - "SHP_WEAPON_3_1", - "SHP_WEAPON_3_2", - "SHP_WEAPON_3_3", - "SHP_WEAPON_3_4", - "DEF_PLAN_BARRIER_SHLD_1", - "CON_FRC_ENRG_STRC", - "SHP_ADV_DAM_CONT", - "LRN_QUANT_NET", - "DEF_PLAN_BARRIER_SHLD_2", - "LRN_GRAVITONICS", - "CON_CONTGRAV_ARCH", - "LRN_PHYS_BRAIN", - "LRN_TRANSLING_THT", - "PRO_SENTIENT_AUTOMATION", - "PRO_EXOBOTS", - "LRN_XENOARCH", - "DEF_DEFENSE_NET_3", - "DEF_SYST_DEF_MINE_1", - "DEF_PLAN_BARRIER_SHLD_3", - "CON_ORBITAL_HAB", - "DEF_GARRISON_3", - "SHP_CONT_SYMB", - "SHP_MONOCELL_EXP", - "SHP_BIOADAPTIVE_SPEC", - "PRO_SINGULAR_GEN", - "GRO_XENO_HYBRIDS", - "SHP_PLASMA_SHIELD", - "SHP_CONT_BIOADAPT", - "SHP_SENT_HULL", - "LRN_TIME_MECH", - "LRN_STELLAR_TOMOGRAPHY", - "SHP_XENTRONIUM_PLATE", - "GRO_CYBORG", - "GRO_ENERGY_META", - "LRN_ENCLAVE_VOID", - "SPY_DETECT_4", - "SHP_WEAPON_4_1", - "SHP_WEAPON_4_2", - "LRN_PSY_DOM", - "CON_NDIM_STRC", - "SHP_WEAPON_4_3", - "LRN_DISTRIB_THOUGHT", - "PRO_NEUTRONIUM_EXTRACTION", - "GRO_TERRAFORM", - "GRO_GENETIC_MED", - "SHP_INTSTEL_LOG", - "SPY_STEALTH_1", - "CON_CONC_CAMP", - "PRO_INDUSTRY_CENTER_III", - "SPY_STEALTH_2", - "DEF_SYST_DEF_MINE_2", - "DEF_SYST_DEF_MINE_3", - "SPY_STEALTH_3", - "SPY_DETECT_5", - "SHP_WEAPON_4_4", - "LRN_ART_BLACK_HOLE", - "SHP_BLACKSHIELD", - "DEF_GARRISON_4", - "DEF_DEFENSE_NET_REGEN_2", - "SPY_STEALTH_4", - "SHP_ENRG_BOUND_MAN", - "DEF_PLAN_BARRIER_SHLD_4", - "DEF_PLAN_BARRIER_SHLD_5", - "GRO_GAIA_TRANS", - "GRO_ENERGY_META", - "CON_ART_PLANET", - "SHP_SOLAR_CONT", + "SHP_WEAPON_1_2", + "LRN_ALGO_ELEGANCE", + "LRN_ARTIF_MINDS", + "SHP_WEAPON_1_3", + "GRO_PLANET_ECOL", + "SHP_DOMESTIC_MONSTER", + "SHP_ORG_HULL", + "GRO_SUBTER_HAB", + "DEF_DEFENSE_NET_1", + "CON_ENV_ENCAPSUL", + "PRO_ROBOTIC_PROD", + "DEF_GARRISON_1", + "SHP_WEAPON_1_4", + "PRO_FUSION_GEN", + "PRO_MICROGRAV_MAN", + "SHP_ASTEROID_HULLS", + "PRO_INDUSTRY_CENTER_I", + "CON_ORBITAL_CON", + "GRO_SYMBIOTIC_BIO", + "PRO_ORBITAL_GEN", + "SHP_ZORTRIUM_PLATE", + "SPY_DETECT_2", + "LRN_FORCE_FIELD", + "SHP_WEAPON_2_1", + "SHP_WEAPON_2_2", + "SHP_WEAPON_2_3", + "PRO_SENTIENT_AUTOMATION", + "PRO_INDUSTRY_CENTER_II", + "SHP_WEAPON_2_4", + "PRO_SOL_ORB_GEN", + "SHP_BASIC_DAM_CONT", + "DEF_DEFENSE_NET_2", + "DEF_DEFENSE_NET_REGEN_1", + "LRN_PHYS_BRAIN", + "LRN_TRANSLING_THT", + "GRO_GENETIC_ENG", + "DEF_GARRISON_2", + "GRO_XENO_GENETICS", + "SHP_ADV_DAM_CONT", + "GRO_LIFECYCLE_MAN", + "SHP_ASTEROID_REFORM", + "CON_FRC_ENRG_STRC", + "PRO_EXOBOTS", + "GRO_XENO_HYBRIDS", + "SPY_DETECT_3", + "CON_METRO_INFRA", + "SHP_WEAPON_3_1", + "DEF_PLAN_BARRIER_SHLD_1", + "SHP_DIAMOND_PLATE", + "SHP_REINFORCED_HULL", + "LRN_QUANT_NET", + "CON_NDIM_STRC", + "SHP_DEFLECTOR_SHIELD", + "SHP_MULTICELL_CAST", + "SHP_ENDOCRINE_SYSTEMS", + "SHP_WEAPON_3_2", + "SHP_WEAPON_3_3", + "SHP_WEAPON_3_4", + "DEF_PLAN_BARRIER_SHLD_2", + "LRN_GRAVITONICS", + "CON_CONTGRAV_ARCH", + "LRN_XENOARCH", + "DEF_DEFENSE_NET_3", + "DEF_SYST_DEF_MINE_1", + "DEF_PLAN_BARRIER_SHLD_3", + "CON_ORBITAL_HAB", + "DEF_GARRISON_3", + "SHP_CONT_SYMB", + "SHP_MONOCELL_EXP", + "SHP_BIOADAPTIVE_SPEC", + "PRO_SINGULAR_GEN", + "SHP_PLASMA_SHIELD", + "SHP_CONT_BIOADAPT", + "SHP_SENT_HULL", + "LRN_TIME_MECH", + "LRN_STELLAR_TOMOGRAPHY", + "SHP_XENTRONIUM_PLATE", + "GRO_CYBORG", + "GRO_ENERGY_META", + "LRN_ENCLAVE_VOID", + "SPY_DETECT_4", + "SHP_WEAPON_4_1", + "SHP_WEAPON_4_2", + "LRN_PSY_DOM", + "SHP_WEAPON_4_3", + "LRN_DISTRIB_THOUGHT", + "PRO_NEUTRONIUM_EXTRACTION", + "SHP_ASTEROID_HULLS", + "GRO_TERRAFORM", + "GRO_GENETIC_MED", + "SHP_INTSTEL_LOG", + "SPY_STEALTH_1", + "CON_CONC_CAMP", + "PRO_INDUSTRY_CENTER_III", + "SPY_STEALTH_2", + "DEF_SYST_DEF_MINE_2", + "DEF_SYST_DEF_MINE_3", + "SPY_STEALTH_3", + "SPY_DETECT_5", + "SHP_WEAPON_4_4", + "LRN_ART_BLACK_HOLE", + "SHP_BLACKSHIELD", + "DEF_GARRISON_4", + "DEF_DEFENSE_NET_REGEN_2", + "SPY_STEALTH_4", + "SHP_ENRG_BOUND_MAN", + "DEF_PLAN_BARRIER_SHLD_4", + "DEF_PLAN_BARRIER_SHLD_5", + "GRO_GAIA_TRANS", + "GRO_ENERGY_META", + "CON_ART_PLANET", + "SHP_SOLAR_CONT", ] #"CON_FRC_ENRG_CAMO", #"SHP_TITAN_HULL" |
From: <dil...@us...> - 2013-09-21 20:46:37
|
Revision: 6421 http://sourceforge.net/p/freeorion/code/6421 Author: dilvish-fo Date: 2013-09-21 20:46:35 +0000 (Sat, 21 Sep 2013) Log Message: ----------- AI tweaks to research priorities and production planning Modified Paths: -------------- trunk/FreeOrion/default/AI/ProductionAI.py trunk/FreeOrion/default/AI/TechsListsAI.py Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-21 20:34:54 UTC (rev 6420) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-21 20:46:35 UTC (rev 6421) @@ -424,12 +424,14 @@ cp, cp2 = "CO_COLONY_POD", "CO_SUSPEND_ANIM_POD" db = "DT_DETECTOR_%1d" is1, is2 = "FU_BASIC_TANK", "ST_CLOAK_1" + ar1, ar2, ar3, ar4, ar5 = "AR_STD_PLATE", "AR_ZORTRIUM_PLATE", "AR_DIAMOND_PLATE", "AR_XENTRONIUM_PLATE", "AR_NEUTRONIUM_PLATE" for p_id in [1, 2, 3]: - newColonyDesigns += [ (nb%(p_id, iw), desc, hull, [ srb%iw, "", db%p_id, cp], "", model) for iw in [1, 2, 3, 4] ] + newColonyDesigns += [ (nb%(p_id, iw)+"S", desc, hull, [ srb%iw, ar1, db%p_id, cp], "", model) for iw in [1, 2, 3, 4] ] + newColonyDesigns += [ (nb%(p_id, iw)+"Z", desc, hull, [ srb%iw, ar2, db%p_id, cp], "", model) for iw in [1, 2, 3, 4] ] - nb = designNameBases[2]+"%1d_%1d" + nb = designNameBases[2]+"%1d_%1dZ" for p_id in [1, 2, 3]: - newColonyDesigns += [ (nb%(p_id, iw), desc, hull, [ srb%iw, db%p_id, "", cp2], "", model) for iw in [3.4] ] + newColonyDesigns += [ (nb%(p_id, iw), desc, hull, [ srb%iw, db%p_id, ar2, cp2], "", model) for iw in [3.4] ] addDesigns(shipType, newColonyDesigns, shipProdPriority) def generateProductionOrders(): @@ -488,9 +490,8 @@ if (currentTurn==1) and (productionQueue.totalSpent < totalPP): bestDesignID, bestDesign, buildChoices = getBestShipInfo(EnumsAI.AIPriorityType.PRIORITY_PRODUCTION_EXPLORATION) if bestDesignID: - retval = fo.issueEnqueueShipProductionOrder(bestDesignID, buildChoices[0]) - if retval: - fo.issueChangeProductionQuantityOrder(productionQueue.size -1, 1, 2) + for scout_count in range(5): + retval = fo.issueEnqueueShipProductionOrder(bestDesignID, buildChoices[0]) fo.updateProductionQueue() movedCapital=False Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-09-21 20:34:54 UTC (rev 6420) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-09-21 20:46:35 UTC (rev 6421) @@ -3,13 +3,12 @@ various technologies to help the AI decide which technologies should be researched next. """ -# TODO: this whole module shouldn't exist. These informations belong into the -# data files or should be calculated by the AI scripts. -# -# 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 +# TODO: further consider alternative implementations for tech priorities +# adrian_broher recommends this whole module (and related +# decision branches within ResearchAI.py) not exist-- that this +# informations instead go in the FOCS techs.txt file as a priority expression +# for each respective tech specification, or that it be dynamically calculated +# by the AI scripts based purely on the info parsed from techs.txt EXOBOT_TECH_NAME = "PRO_EXOBOTS" @@ -43,6 +42,8 @@ """ #index = 1 - index result = [] + + print "Choosing Research Techlist Index %d" % index if index == 0: result = [ "SHP_WEAPON_1_2", @@ -81,12 +82,13 @@ "GRO_GENETIC_ENG", "DEF_GARRISON_2", "GRO_XENO_GENETICS", + "CON_INFRA_ECOL", + "GRO_LIFECYCLE_MAN", "SHP_DEFLECTOR_SHIELD", "SPY_DETECT_3", "CON_METRO_INFRA", "SHP_WEAPON_3_1", "SHP_DIAMOND_PLATE", - "GRO_LIFECYCLE_MAN", "SHP_MULTICELL_CAST", "SHP_ENDOCRINE_SYSTEMS", "SHP_WEAPON_3_2", @@ -159,138 +161,139 @@ #"SHP_ENDOSYMB_HULL", elif index == 1: result = [ - "SHP_WEAPON_1_2", - "LRN_ALGO_ELEGANCE", - "LRN_ARTIF_MINDS", - "SHP_WEAPON_1_3", - "GRO_PLANET_ECOL", - "SHP_DOMESTIC_MONSTER", - "SHP_ORG_HULL", - "GRO_SUBTER_HAB", - "DEF_DEFENSE_NET_1", - "CON_ENV_ENCAPSUL", - "PRO_ROBOTIC_PROD", - "DEF_GARRISON_1", - "SHP_WEAPON_1_4", - "PRO_FUSION_GEN", - "PRO_MICROGRAV_MAN", - "SHP_ASTEROID_HULLS", - "PRO_INDUSTRY_CENTER_I", - "CON_ORBITAL_CON", - "GRO_SYMBIOTIC_BIO", - "PRO_ORBITAL_GEN", - "SHP_ZORTRIUM_PLATE", - "SPY_DETECT_2", - "LRN_FORCE_FIELD", - "SHP_WEAPON_2_1", - "SHP_WEAPON_2_2", - "SHP_WEAPON_2_3", - "PRO_SENTIENT_AUTOMATION", - "PRO_INDUSTRY_CENTER_II", - "SHP_WEAPON_2_4", - "PRO_SOL_ORB_GEN", - "SHP_BASIC_DAM_CONT", - "DEF_DEFENSE_NET_2", - "DEF_DEFENSE_NET_REGEN_1", - "LRN_PHYS_BRAIN", - "LRN_TRANSLING_THT", - "GRO_GENETIC_ENG", - "DEF_GARRISON_2", - "GRO_XENO_GENETICS", - "SHP_ADV_DAM_CONT", - "GRO_LIFECYCLE_MAN", - "SHP_ASTEROID_REFORM", - "CON_FRC_ENRG_STRC", - "PRO_EXOBOTS", - "GRO_XENO_HYBRIDS", - "SPY_DETECT_3", - "CON_METRO_INFRA", - "SHP_WEAPON_3_1", - "DEF_PLAN_BARRIER_SHLD_1", - "SHP_DIAMOND_PLATE", - "SHP_REINFORCED_HULL", - "LRN_QUANT_NET", - "CON_NDIM_STRC", - "SHP_DEFLECTOR_SHIELD", - "SHP_MULTICELL_CAST", - "SHP_ENDOCRINE_SYSTEMS", - "SHP_WEAPON_3_2", - "SHP_WEAPON_3_3", - "SHP_WEAPON_3_4", - "DEF_PLAN_BARRIER_SHLD_2", - "LRN_GRAVITONICS", - "CON_CONTGRAV_ARCH", - "LRN_XENOARCH", - "DEF_DEFENSE_NET_3", - "DEF_SYST_DEF_MINE_1", - "DEF_PLAN_BARRIER_SHLD_3", - "CON_ORBITAL_HAB", - "DEF_GARRISON_3", - "SHP_CONT_SYMB", - "SHP_MONOCELL_EXP", - "SHP_BIOADAPTIVE_SPEC", - "PRO_SINGULAR_GEN", - "SHP_PLASMA_SHIELD", - "SHP_CONT_BIOADAPT", - "SHP_SENT_HULL", - "LRN_TIME_MECH", - "LRN_STELLAR_TOMOGRAPHY", - "SHP_XENTRONIUM_PLATE", - "GRO_CYBORG", - "GRO_ENERGY_META", - "LRN_ENCLAVE_VOID", - "SPY_DETECT_4", - "SHP_WEAPON_4_1", - "SHP_WEAPON_4_2", - "LRN_PSY_DOM", - "SHP_WEAPON_4_3", - "LRN_DISTRIB_THOUGHT", - "PRO_NEUTRONIUM_EXTRACTION", - "SHP_ASTEROID_HULLS", - "GRO_TERRAFORM", - "GRO_GENETIC_MED", - "SHP_INTSTEL_LOG", - "SPY_STEALTH_1", - "CON_CONC_CAMP", - "PRO_INDUSTRY_CENTER_III", - "SPY_STEALTH_2", - "DEF_SYST_DEF_MINE_2", - "DEF_SYST_DEF_MINE_3", - "SPY_STEALTH_3", - "SPY_DETECT_5", - "SHP_WEAPON_4_4", - "LRN_ART_BLACK_HOLE", - "SHP_BLACKSHIELD", - "DEF_GARRISON_4", - "DEF_DEFENSE_NET_REGEN_2", - "SPY_STEALTH_4", - "SHP_ENRG_BOUND_MAN", - "DEF_PLAN_BARRIER_SHLD_4", - "DEF_PLAN_BARRIER_SHLD_5", - "GRO_GAIA_TRANS", - "GRO_ENERGY_META", - "CON_ART_PLANET", - "SHP_SOLAR_CONT", + "SHP_WEAPON_1_2", + "SHP_WEAPON_1_3", + "GRO_PLANET_ECOL", + "SHP_DOMESTIC_MONSTER", + "SHP_ORG_HULL", + "LRN_ALGO_ELEGANCE", + "GRO_SUBTER_HAB", + "LRN_ARTIF_MINDS", + "DEF_DEFENSE_NET_1", + "CON_ENV_ENCAPSUL", + "PRO_ROBOTIC_PROD", + "DEF_GARRISON_1", + "SHP_WEAPON_1_4", + "PRO_FUSION_GEN", + "PRO_MICROGRAV_MAN", + "SHP_ASTEROID_HULLS", + "PRO_INDUSTRY_CENTER_I", + "CON_ORBITAL_CON", + "GRO_SYMBIOTIC_BIO", + "PRO_ORBITAL_GEN", + "SHP_ZORTRIUM_PLATE", + "SPY_DETECT_2", + "LRN_FORCE_FIELD", + "SHP_WEAPON_2_1", + "SHP_WEAPON_2_2", + "SHP_WEAPON_2_3", + "PRO_SENTIENT_AUTOMATION", + "PRO_INDUSTRY_CENTER_II", + "SHP_WEAPON_2_4", + "PRO_SOL_ORB_GEN", + "SHP_BASIC_DAM_CONT", + "DEF_DEFENSE_NET_2", + "DEF_DEFENSE_NET_REGEN_1", + "LRN_PHYS_BRAIN", + "LRN_TRANSLING_THT", + "GRO_GENETIC_ENG", + "DEF_GARRISON_2", + "PRO_EXOBOTS", + "GRO_XENO_GENETICS", + "SHP_ADV_DAM_CONT", + "CON_INFRA_ECOL", + "GRO_LIFECYCLE_MAN", + "SHP_ASTEROID_REFORM", + "CON_FRC_ENRG_STRC", + "GRO_XENO_HYBRIDS", + "SPY_DETECT_3", + "CON_METRO_INFRA", + "SHP_WEAPON_3_1", + "DEF_PLAN_BARRIER_SHLD_1", + "SHP_DIAMOND_PLATE", + "SHP_REINFORCED_HULL", + "LRN_QUANT_NET", + "CON_NDIM_STRC", + "SHP_DEFLECTOR_SHIELD", + "SHP_MULTICELL_CAST", + "SHP_ENDOCRINE_SYSTEMS", + "SHP_WEAPON_3_2", + "SHP_WEAPON_3_3", + "SHP_WEAPON_3_4", + "DEF_PLAN_BARRIER_SHLD_2", + "LRN_GRAVITONICS", + "CON_CONTGRAV_ARCH", + "LRN_XENOARCH", + "DEF_DEFENSE_NET_3", + "DEF_SYST_DEF_MINE_1", + "DEF_PLAN_BARRIER_SHLD_3", + "CON_ORBITAL_HAB", + "DEF_GARRISON_3", + "SHP_CONT_SYMB", + "SHP_MONOCELL_EXP", + "SHP_BIOADAPTIVE_SPEC", + "PRO_SINGULAR_GEN", + "SHP_PLASMA_SHIELD", + "SHP_CONT_BIOADAPT", + "SHP_SENT_HULL", + "LRN_TIME_MECH", + "LRN_STELLAR_TOMOGRAPHY", + "SHP_XENTRONIUM_PLATE", + "GRO_CYBORG", + "GRO_ENERGY_META", + "LRN_ENCLAVE_VOID", + "SPY_DETECT_4", + "SHP_WEAPON_4_1", + "SHP_WEAPON_4_2", + "LRN_PSY_DOM", + "SHP_WEAPON_4_3", + "LRN_DISTRIB_THOUGHT", + "PRO_NEUTRONIUM_EXTRACTION", + "SHP_ASTEROID_HULLS", + "GRO_TERRAFORM", + "GRO_GENETIC_MED", + "SHP_INTSTEL_LOG", + "SPY_STEALTH_1", + "CON_CONC_CAMP", + "PRO_INDUSTRY_CENTER_III", + "SPY_STEALTH_2", + "DEF_SYST_DEF_MINE_2", + "DEF_SYST_DEF_MINE_3", + "SPY_STEALTH_3", + "SPY_DETECT_5", + "SHP_WEAPON_4_4", + "LRN_ART_BLACK_HOLE", + "SHP_BLACKSHIELD", + "DEF_GARRISON_4", + "DEF_DEFENSE_NET_REGEN_2", + "SPY_STEALTH_4", + "SHP_ENRG_BOUND_MAN", + "DEF_PLAN_BARRIER_SHLD_4", + "DEF_PLAN_BARRIER_SHLD_5", + "GRO_GAIA_TRANS", + "GRO_ENERGY_META", + "CON_ART_PLANET", + "SHP_SOLAR_CONT", ] #"CON_FRC_ENRG_CAMO", #"SHP_TITAN_HULL" elif index == 2: result = [ "LRN_ALGO_ELEGANCE", - "LRN_ARTIF_MINDS", "SHP_WEAPON_1_2", "GRO_PLANET_ECOL", "SHP_DOMESTIC_MONSTER", "SHP_ORG_HULL", + "LRN_ARTIF_MINDS", "SHP_WEAPON_1_3", + "SHP_WEAPON_1_4", "GRO_SUBTER_HAB", - "SHP_WEAPON_1_4", "PRO_ROBOTIC_PROD", + "DEF_DEFENSE_NET_1", + "PRO_FUSION_GEN", + "CON_ENV_ENCAPSUL", "PRO_MICROGRAV_MAN", "SHP_ASTEROID_HULLS", - "CON_ENV_ENCAPSUL", - "DEF_DEFENSE_NET_1", - "PRO_FUSION_GEN", "PRO_INDUSTRY_CENTER_I", "DEF_GARRISON_1", "CON_ORBITAL_CON", @@ -303,7 +306,6 @@ "SHP_WEAPON_2_3", "SPY_DETECT_2", "PRO_SENTIENT_AUTOMATION", - "PRO_EXOBOTS", "DEF_DEFENSE_NET_2", "DEF_DEFENSE_NET_REGEN_1", "SHP_WEAPON_2_4", @@ -313,9 +315,11 @@ "PRO_SOL_ORB_GEN", "GRO_GENETIC_ENG", "DEF_GARRISON_2", + "PRO_EXOBOTS", "GRO_XENO_GENETICS", "SPY_DETECT_3", "CON_METRO_INFRA", + "CON_INFRA_ECOL", "GRO_LIFECYCLE_MAN", "SHP_DEFLECTOR_SHIELD", "SHP_MULTICELL_CAST", |
From: <dil...@us...> - 2013-09-29 20:26:50
|
Revision: 6426 http://sourceforge.net/p/freeorion/code/6426 Author: dilvish-fo Date: 2013-09-29 20:26:45 +0000 (Sun, 29 Sep 2013) Log Message: ----------- incremental AI improvements to colonization & invasion planning, and other misc minor AI adjustments Modified Paths: -------------- trunk/FreeOrion/default/AI/ColonisationAI.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 2013-09-29 20:24:59 UTC (rev 6425) +++ trunk/FreeOrion/default/AI/ColonisationAI.py 2013-09-29 20:26:45 UTC (rev 6426) @@ -19,6 +19,7 @@ empireColonizers = {} empireShipBuilders={} empireShipyards = {} +empire_dry_docks = {} availableGrowthSpecials={} empirePlanetsWithGrowthSpecials={} activeGrowthSpecials={} @@ -67,6 +68,7 @@ empireColonizers.clear() empireShipBuilders.clear() empireShipyards.clear() + empire_dry_docks.clear() activeGrowthSpecials.clear() annexableSystemIDs.clear() annexableRing1.clear() @@ -243,6 +245,7 @@ empireColonizers.clear() empireShipBuilders.clear() empireShipyards.clear() + empire_dry_docks.clear() empireMetabolisms.clear() availableGrowthSpecials.clear() activeGrowthSpecials.clear() @@ -278,7 +281,8 @@ shipyards=[] for pID in empireSpecies[specName]: planet=universe.getPlanet(pID) - if not planet: continue + if not planet: + continue for metab in thisMetab: #prev = empireMetabolisms.get(metab, [0.0, 0.0] ) prev = empireMetabolisms.get(metab, 0.0 ) @@ -292,10 +296,13 @@ availableGrowthSpecials.setdefault(special, []).append(pID) if planet.focus == AIFocusType.FOCUS_GROWTH: activeGrowthSpecials.setdefault(special, []).append(pID) + buildings_here = [universe.getObject(bldg).buildingTypeName for bldg in planet.buildingIDs] if thisSpec.canProduceShips: pilotRatings[pID] = pilotVal - if "BLD_SHIPYARD_BASE" in [universe.getObject(bldg).buildingTypeName for bldg in planet.buildingIDs]: + if "BLD_SHIPYARD_BASE" in buildings_here: shipyards.append(pID) + if "BLD_SHIPYARD_ORBITAL_DRYDOCK" in buildings_here: + empire_dry_docks.setdefault(planet.systemID, []).append(pID) empireSpeciesSystems.setdefault(planet.systemID, {}).setdefault('pids', []).append(pID) if thisSpec.canProduceShips: empireShipBuilders[specName]=shipyards @@ -551,7 +558,34 @@ planetValues[planetID] = best[0][:2] #print best[0][2] return planetValues + +def next_turn_pop_change(cur_pop, target_pop): + "population change calc taken from PopCenter.cpp" + pop_change = 0 + if (target_pop > cur_pop): + pop_change = cur_pop * (target_pop + 1 - cur_pop) / 100 + pop_change = min(pop_change, target_pop - cur_pop) + else: + pop_change = -(cur_pop - target_pop) / 10 + pop_change = max(pop_change, target_pop - cur_pop) + return pop_change; +def project_ind_val(init_pop, max_pop_size, init_industry, max_ind_factor, flat_industry, discountMultiplier): + "returns a discouted value for a projected industry stream over time with changing population" + discount_factor = 0.95 + if discountMultiplier > 1.0: + discount_factor = 1.0 - 1.0/discountMultiplier + cur_pop = float(init_pop) + cur_ind = float(init_industry) + ind_val = 0 + val_factor = 1.0 + for turn in range(50): + cur_pop += next_turn_pop_change(cur_pop, max_pop_size) + cur_ind = min(cur_ind + 1, max(0, cur_ind - 1, flat_industry + cur_pop * max_ind_factor)) + val_factor *= discount_factor + ind_val += val_factor * cur_ind + return ind_val + def evaluatePlanet(planetID, missionType, fleetSupplyablePlanetIDs, specName, empire, detail = None): "returns the colonisation value of a planet" if detail is None: @@ -566,12 +600,12 @@ pilotVal *= 2 if pilotVal > 2: retval += discountMultiplier*5*pilotVal - detail.append("Pilot Val %.1f"%discountMultiplier*50) + detail.append("Pilot Val %.1f"%(discountMultiplier*5*pilotVal)) if detail != []: detail = [] priorityScaling=1.0 - maxGGGs=1 + maxGGGs=1 #if goes above 1 need some other adjustments below if empire.productionPoints <100: backupFactor = 0.0 else: @@ -783,31 +817,47 @@ retval += colonyStarBonus asteroidBonus=0 gasGiantBonus=0 - GGPresent=False + flat_industry = 0 miningBonus=0 - perGGG=2*10*discountMultiplier + perGGG=10 planetSize = planet.size + gotAsteroids=False + gotOwnedAsteroids = False + gotGG = False + gotOwnedGG = False if system and AIFocusType.FOCUS_INDUSTRY in species.foci: - gotAsteroids=False for pid in [temp_id for temp_id in system.planetIDs if temp_id != planetID]: p2 = universe.getPlanet(pid) if p2: - if p2.size== fo.planetSize.asteroids and not gotAsteroids : + if p2.size== fo.planetSize.asteroids: gotAsteroids = True - if ( (empire.getTechStatus("PRO_MICROGRAV_MAN") == fo.techStatus.complete ) or ( "PRO_MICROGRAV_MAN" in empireResearchList[:3]) ): - asteroidBonus = 10*discountMultiplier - detail.append( "Asteroid mining from %s %.1f"%(p2.name, 10*discountMultiplier ) ) - if (empire.getTechStatus("SHP_ASTEROID_HULLS") == fo.techStatus.complete ) or ( "SHP_ASTEROID_HULLS" in empireResearchList[:8]) : - if species and species.canProduceShips: - asteroidBonus += 20*discountMultiplier*pilotVal - detail.append( "Asteroid ShipBuilding from %s %.1f"%(p2.name, discountMultiplier*20*pilotVal ) ) - if p2.size== fo.planetSize.gasGiant : - GGPresent=True - if ( (empire.getTechStatus("PRO_ORBITAL_GEN") == fo.techStatus.complete ) or ( "PRO_ORBITAL_GEN" in empireResearchList[:3]) ): - gasGiantBonus += perGGG - detail.append( "GGG from %s %.1f"%(p2.name, perGGG ) ) - gasGiantBonus = min( gasGiantBonus, maxGGGs * perGGG ) + if p2.owner != -1: + gotOwnedAsteroids = True + if p2.size== fo.planetSize.gasGiant: + gotGG = True + if p2.owner != -1: + gotOwnedGG = True + if gotAsteroids: + if ( (empire.getTechStatus("PRO_MICROGRAV_MAN") == fo.techStatus.complete ) or ( "PRO_MICROGRAV_MAN" in empireResearchList[:3]) ): + if gotOwnedAsteroids: #can be quickly captured + flat_industry += 5 #will go into detailed industry projection + detail.append( "Asteroid mining ~ %.1f"%(5*discountMultiplier ) ) + else: #uncertain when can be outposted + asteroidBonus = 2.5*discountMultiplier #give partial value + detail.append( "Asteroid mining %.1f"%(5*discountMultiplier ) ) + if (empire.getTechStatus("SHP_ASTEROID_HULLS") == fo.techStatus.complete ) or ( "SHP_ASTEROID_HULLS" in empireResearchList[:8]) : + if species and species.canProduceShips: + asteroidBonus += 30*discountMultiplier*pilotVal + detail.append( "Asteroid ShipBuilding from %s %.1f"%(p2.name, discountMultiplier*20*pilotVal ) ) + if gotGG: + if ( (empire.getTechStatus("PRO_ORBITAL_GEN") == fo.techStatus.complete ) or ( "PRO_ORBITAL_GEN" in empireResearchList[:3]) ): + if gotOwnedGG: + flat_industry += perGGG #will go into detailed industry projection + detail.append( "GGG ~ %.1f"%( perGGG * discountMultiplier ) ) + else: + gasGiantBonus = 0.5 * perGGG * discountMultiplier + detail.append( "GGG %.1f"%( 0.5 * perGGG * discountMultiplier ) ) if (planet.size==fo.planetSize.gasGiant): if not (species and species.name == "SP_SUPER_TEST"): detail.append("Can't Settle GG" ) @@ -895,13 +945,13 @@ if planetID in species.homeworlds: #TODO: check for homeworld growth focus popSizeMod+=2 - popSize = planetSize * popSizeMod * popTagMod - detail.append("baseMaxPop size*psm %d * %d * %.2f = %d"%(planetSize, popSizeMod, popTagMod, popSize) ) + max_pop_size = planetSize * popSizeMod * popTagMod + detail.append("baseMaxPop size*psm %d * %d * %.2f = %d"%(planetSize, popSizeMod, popTagMod, max_pop_size) ) if "DIM_RIFT_MASTER_SPECIAL" in planet.specials: - popSize -= 4 + max_pop_size -= 4 detail.append("DIM_RIFT_MASTER_SPECIAL(maxPop-4)") - detail.append("maxPop %.1f"%popSize) + detail.append("maxPop %.1f"%max_pop_size) for special in [ "MINERALS_SPECIAL", "CRYSTALS_SPECIAL", "METALOIDS_SPECIAL"] : if special in planetSpecials: @@ -924,11 +974,21 @@ if (empire.getTechStatus(tech) == fo.techStatus.complete): indMult += indTechMap[tech] indVal = 0 + max_ind_factor = 0 if (empire.getTechStatus("PRO_SENTIENT_AUTOMATION") == fo.techStatus.complete): fixedInd += discountMultiplier * 5 if AIFocusType.FOCUS_INDUSTRY in species.foci: - indVal += discountMultiplier * basePopInd * popSize*miningBonus - indVal += discountMultiplier * basePopInd * popSize * indMult + #indVal += discountMultiplier * basePopInd * max_pop_size*miningBonus + #indVal += discountMultiplier * basePopInd * max_pop_size * indMult + max_ind_factor += basePopInd * miningBonus + max_ind_factor += basePopInd * indMult + cur_pop = 1.0 #assume an initial colonization vale + if planet.speciesName != "": + cur_pop = planet.currentMeterValue(fo.meterType.population) + elif empire.getTechStatus("GRO_LIFECYCLE_MAN") == fo.techStatus.complete : + cur_pop = 3.0 + cur_industry = planet.currentMeterValue(fo.meterType.industry) + indVal = project_ind_val(cur_pop, max_pop_size, cur_industry, max_ind_factor, flat_industry, discountMultiplier) detail.append("indVal %.1f"%indVal) # used to give preference to closest worlds empireID = empire.empireID @@ -949,15 +1009,15 @@ basePopRes = 0.2 #will also be doubling value of research, below if AIFocusType.FOCUS_RESEARCH in species.foci: - researchBonus += discountMultiplier*2*basePopRes*popSize + researchBonus += discountMultiplier*2*basePopRes*max_pop_size if ( "ANCIENT_RUINS_SPECIAL" in planet.specials ) or ( "ANCIENT_RUINS_DEPLETED_SPECIAL" in planet.specials ): - researchBonus += discountMultiplier*2*basePopRes*popSize*5 + researchBonus += discountMultiplier*2*basePopRes*max_pop_size*5 detail.append("Ruins Research") if "COMPUTRONIUM_SPECIAL" in planet.specials: researchBonus += discountMultiplier*2*10 #TODO: do actual calc detail.append("COMPUTRONIUM_SPECIAL") - if popSize <= 0: + if max_pop_size <= 0: detail.append("Non-positive population projection for species '%s', so no colonization value"%(species and species.name)) return 0 Modified: trunk/FreeOrion/default/AI/PriorityAI.py =================================================================== --- trunk/FreeOrion/default/AI/PriorityAI.py 2013-09-29 20:24:59 UTC (rev 6425) +++ trunk/FreeOrion/default/AI/PriorityAI.py 2013-09-29 20:26:45 UTC (rev 6426) @@ -237,13 +237,26 @@ global allottedInvasionTargets troopsPerPod=2 empire=fo.getEmpire() + multiplier = 1 + + if len(foAI.foAIstate.colonisablePlanetIDs) > 0: + bestColonyScore = max( 2, foAI.foAIstate.colonisablePlanetIDs[0][1][0] ) + else: + bestColonyScore = 2 if foAI.foAIstate.aggression==fo.aggression.beginner and fo.currentTurn()<150: return 0 allottedInvasionTargets = 1+ int(fo.currentTurn()/25) - totalVal= sum( [pscore for pid, pscore, trp in AIstate.invasionTargets[:allottedInvasionTargets] ] ) - troopsNeeded= sum( [(trp+4) for pid, pscore, trp in AIstate.invasionTargets[:allottedInvasionTargets] ] ) + totalVal = 0 + troopsNeeded = 0 + for pid, pscore, trp in AIstate.invasionTargets[:allottedInvasionTargets]: + if pscore > bestColonyScore: + multiplier += 1 + totalVal += 2 * pscore + else: + totalVal += pscore + troopsNeeded += trp+4 if totalVal == 0: return 0 @@ -270,7 +283,7 @@ troopShipsNeeded = math.ceil((opponentTroopPods - (numTroopPods+ queuedTroopPods ))/troopsPerBestShip) #invasionPriority = max( 10+ 200*max(0, troopShipsNeeded ) , int(0.1* totalVal) ) - invasionPriority = 30+ 150*max(0, troopShipsNeeded ) + invasionPriority = multiplier * (30+ 150*max(0, troopShipsNeeded )) if invasionPriority < 0: return 0 if foAI.foAIstate.aggression==fo.aggression.beginner: Modified: trunk/FreeOrion/default/AI/ProductionAI.py =================================================================== --- trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-29 20:24:59 UTC (rev 6425) +++ trunk/FreeOrion/default/AI/ProductionAI.py 2013-09-29 20:26:45 UTC (rev 6426) @@ -1250,6 +1250,30 @@ queuedLocs.append( planet.systemID ) break + bldName = "BLD_SHIPYARD_ORBITAL_DRYDOCK" + if empire.buildingTypeAvailable(bldName): + bldType = fo.getBuildingType(bldName) + queued_locs = [element.locationID for element in productionQueue if (element.name==bldName) ] + drydock_locs={} + drydock_locs.update([(sys_id, True) for sys_id in queued_locs + list(ColonisationAI.empire_dry_docks)]) + max_dock_builds = int(0.5 + empire.productionPoints/80) + for sys_id, pids in ColonisationAI.empireSpeciesSystems.items(): #TODO: sort/prioritize in some fashion + if len(queued_locs)>= max_dock_builds: + break + if sys_id in drydock_locs: + continue + for pid in pids: + if pid not in ColonisationAI.empireShipyards: + continue + planet = universe.getPlanet(pid) + res=fo.issueEnqueueBuildingProductionOrder(bldName, pid) + print "Enqueueing %s at planet %d (%s) , with result %d"%(bldName, pid, planet.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) + queued_locs.append( planet.systemID ) + break + bldName = "BLD_EVACUATION" bldType = fo.getBuildingType(bldName) for pid in AIstate.popCtrIDs: Modified: trunk/FreeOrion/default/AI/TechsListsAI.py =================================================================== --- trunk/FreeOrion/default/AI/TechsListsAI.py 2013-09-29 20:24:59 UTC (rev 6425) +++ trunk/FreeOrion/default/AI/TechsListsAI.py 2013-09-29 20:26:45 UTC (rev 6426) @@ -166,22 +166,22 @@ "GRO_PLANET_ECOL", "SHP_DOMESTIC_MONSTER", "SHP_ORG_HULL", + "GRO_SUBTER_HAB", + "SHP_WEAPON_1_4", "LRN_ALGO_ELEGANCE", - "GRO_SUBTER_HAB", "LRN_ARTIF_MINDS", "DEF_DEFENSE_NET_1", "CON_ENV_ENCAPSUL", "PRO_ROBOTIC_PROD", "DEF_GARRISON_1", - "SHP_WEAPON_1_4", "PRO_FUSION_GEN", - "PRO_MICROGRAV_MAN", - "SHP_ASTEROID_HULLS", "PRO_INDUSTRY_CENTER_I", "CON_ORBITAL_CON", "GRO_SYMBIOTIC_BIO", "PRO_ORBITAL_GEN", "SHP_ZORTRIUM_PLATE", + "PRO_MICROGRAV_MAN", + "SHP_ASTEROID_HULLS", "SPY_DETECT_2", "LRN_FORCE_FIELD", "SHP_WEAPON_2_1", @@ -284,10 +284,10 @@ "GRO_PLANET_ECOL", "SHP_DOMESTIC_MONSTER", "SHP_ORG_HULL", - "LRN_ARTIF_MINDS", "SHP_WEAPON_1_3", "SHP_WEAPON_1_4", "GRO_SUBTER_HAB", + "LRN_ARTIF_MINDS", "PRO_ROBOTIC_PROD", "DEF_DEFENSE_NET_1", "PRO_FUSION_GEN", |