示例#1
0
文件: ai.py 项目: taislin/outerspace
 def _colonize_free_systems(self, valid_systems, colony_design_id):
     should_repeat = False
     colony_fleets = self.data.myFleetsWithDesign.get(
         colony_design_id, set())
     for fleet_id in copy.copy(colony_fleets & self.data.idleFleets):
         max_range = tool.subfleetMarange(self.client, self.db,
                                          {colony_design_id: 1}, fleet_id)
         nearest = tool.findNearest(self.db, self.db[fleet_id],
                                    valid_systems, max_range)
         if len(nearest) > 0:
             system_id = nearest[0]
             system = self.db[system_id]
             target_id = self._find_best_planet(system.planets)
             fleet, new_fleet, my_fleets = tool.orderPartFleet(
                 self.client, self.db, {colony_design_id: 1}, True,
                 fleet_id, Const.FLACTION_DEPLOY, target_id,
                 colony_design_id)
             self.data.myFleetSheets[fleet_id][colony_design_id] -= 1
             if self.data.myFleetSheets[fleet_id][colony_design_id] == 0:
                 del self.data.myFleetSheets[fleet_id][colony_design_id]
                 colony_fleets.remove(fleet_id)
             else:
                 should_repeat = True
             self.data.freeSystems.remove(system_id)
             valid_systems.remove(system_id)
     return should_repeat
示例#2
0
 def _logistics_manager(self):
     for system_id in self.data.mySystems - self.data.myRelevantSystems:
         system = self.db[system_id]
         for fleet_id in set(system.fleets) & self.data.idleFleets:
             fleet = self.db[fleet_id]
             subfleet = tool.getSubfleet(fleet, {1:0, 4:0}, False)
             if len(subfleet):
                 fleet_range = tool.subfleetMarange(self.client, self.db, {1:0, 4:0}, fleet_id)
                 relevant_sys_id = tool.findNearest(self.db, system, self.data.myRelevantSystems, fleet_range)
                 if relevant_sys_id:
                     relevant_sys_id = relevant_sys_id[0]
                     fleet, new_fleet, my_fleets = tool.orderPartFleet(self.client, self.db,
                         {1:0, 4:0}, True, fleet_id, Const.FLACTION_MOVE, relevant_sys_id, None)
                     self.data.idleFleets -= set([fleet_id])
                 else:
                     min_dist = fleet_range
                     min_dist_sys_id = None
                     min_dist_rel = self.data.distanceToRelevance[system_id]
                     for temp_id, dist in self.data.distanceToRelevance.items():
                         temp = self.db[temp_id]
                         distance = math.hypot(temp.x - system.x, temp.y - system.y)
                         if distance < min_dist and dist < min_dist_rel:
                             min_dist = distance
                             min_dist_sys_id = temp_id
                             min_dist_rel = dist
                     if min_dist_sys_id:
                         fleet, new_fleet, my_fleets = tool.orderPartFleet(self.client, self.db,
                             {1:0, 4:0}, True, fleet_id, Const.FLACTION_MOVE, min_dist_sys_id, None)
                         self.data.idleFleets -= set([fleet_id])
示例#3
0
 def _help_system(self):
     tool.doDanger(self.data, self.client, self.db)
     pirate_influenced_systems = tool.findInfluence(self.data, self.client, self.db, Rules.pirateInfluenceRange, self.data.pirateSystems)
     one_fighter_mp = self.player.shipDesigns[self.designs["fighter"]].combatPwr
     for system_id in set(self.data.endangeredSystems) - set(pirate_influenced_systems):
         mil_pwr, shipQuantity = self.data.endangeredSystems[system_id]
         mil_pwr = -mil_pwr
         if system_id in self.data.myMPPerSystem:
             mil_pwr += self.data.myMPPerSystem[system_id]
         if mil_pwr < 0:
             system = self.db[system_id]
             nearest = tool.findNearest(self.db, system, self.data.mySystems, 99999, 20)[1:]
             for temp_id in nearest:
                 if temp_id in self.data.myMPPerSystem:
                     temp_mp = self.data.myMPPerSystem[temp_id]
                 else:
                     temp_mp = 0
                     self.data.myMPPerSystem[temp_id] = 0
                 if temp_id in self.data.endangeredSystems:
                     a, b = self.data.endangeredSystems[temp_id]
                     temp_mp -= a * 1.5
                     if temp_mp <= 0: continue
                 orig = temp_mp = min(-mil_pwr, temp_mp) * 1.25
                 # this is just prototype, working only with Fighters
                 quantity = int(math.ceil(temp_mp / float(one_fighter_mp)))
                 if quantity == 0:
                     continue
                 ships_left, mil_pwrSend = tool.orderFromSystem(self.data, self.client, self.db,
                     {self.designs["fighter"]:quantity}, temp_id, Const.FLACTION_MOVE, system_id, None)
                 mil_pwr += mil_pwrSend
                 self.data.myMPPerSystem[temp_id] -= mil_pwrSend
                 if mil_pwr > 0: break
示例#4
0
 def _followup_attack(self, fleet):
     max_range = tool.subfleetMaxRange(self.client, self.db, None, fleet.oid)
     nearest_sys_ids = tool.findNearest(self.db, fleet, self.data.enemySystems & self.data.relevantSystems, max_range)
     if len(nearest_sys_ids):
         nearest_sys_id = nearest_sys_ids[0]
         tool.orderFleet(self.client, self.db, fleet.oid, Const.FLACTION_MOVE, nearest_sys_id, None)
     else:
         self._return_fleet(fleet)
示例#5
0
 def _followup_attack(self, fleet):
     max_range = tool.subfleetMarange(self.client, self.db, None, fleet.oid)
     nearest_sys_ids = tool.findNearest(self.db, fleet, self.data.enemySystems & self.data.relevantSystems, max_range)
     if len(nearest_sys_ids):
         nearest_sys_id = nearest_sys_ids[0]
         tool.orderFleet(self.client, self.db, fleet.oid, Const.FLACTION_MOVE, nearest_sys_id, None)
     else:
         self._return_fleet(fleet)
示例#6
0
 def _retreat_fleet(self, fleet):
     max_range = tool.subfleetMaxRange(self.client, self.db, None, fleet.oid)
     nearest_sys_ids = tool.findNearest(self.db, fleet, self.data.mySystems)
     if len(nearest_sys_ids):
         nearest_sys_id = nearest_sys_ids[0]
         target = self.db[nearest_sys_id]
         distance = math.hypot(target.x-fleet.x, target.y-fleet.y)
         if distance >= max_range:
             tool.orderFleet(self.client, self.db, fleet.oid, Const.FLACTION_MOVE, nearest_sys_id, None)
示例#7
0
 def _return_strays(self):
     for fleetID in self.data.idleFleets:
         fleet = self.db[fleetID]
         # fleets orbiting in systems not belonging to the self.player
         if fleet.orbiting and fleet.orbiting not in self.data.mySystems:
             nearest = tool.findNearest(self.db, fleet, self.data.mySystems, 99999, 1)
             if len(nearest):
                 targetID = nearest[0]
                 tool.orderFleet(self.client, self.db, fleetID, Const.FLACTION_MOVE, targetID, None)
示例#8
0
 def _retreat_fleet(self, fleet):
     max_range = tool.subfleetMarange(self.client, self.db, None, fleet.oid)
     nearest_sys_ids = tool.findNearest(self.db, fleet, self.data.mySystems)
     if len(nearest_sys_ids):
         nearest_sys_id = nearest_sys_ids[0]
         target = self.db[nearest_sys_id]
         distance = math.hypot(target.x-fleet.x, target.y-fleet.y)
         if distance >= max_range:
             tool.orderFleet(self.client, self.db, fleet.oid, Const.FLACTION_MOVE, nearest_sys_id, None)
示例#9
0
 def _recall_to_upgrade(self, service_centers, outdated_fleets, obsolete_designs):
     for fleet in outdated_fleets:
         if fleet.orbiting in service_centers: continue
         subfleet_sheet = {}.fromkeys(obsolete_designs, 0)
         max_range = tool.subfleetMaxRange(self.client, self.db, subfleet_sheet, fleet.oid)
         nearest = tool.findNearest(self.db, fleet, service_centers, max_range)
         if not nearest: continue
         nearest_service = nearest[0]
         fleet, new_fleet, my_fleets = tool.orderPartFleet(self.client, self.db,
             subfleet_sheet, True, fleet.oid, Const.FLACTION_MOVE, nearest_service, None)
示例#10
0
 def _return_strays(self):
     for fleetID in self.data.idleFleets:
         fleet = self.db[fleetID]
         # fleets orbiting in systems not belonging to the self.player
         if fleet.orbiting and fleet.orbiting not in self.data.mySystems:
             nearest = tool.findNearest(self.db, fleet, self.data.mySystems,
                                        99999, 1)
             if len(nearest):
                 targetID = nearest[0]
                 tool.orderFleet(self.client, self.db, fleetID,
                                 Const.FLACTION_MOVE, targetID, None)
示例#11
0
 def _commence_attack(self, fleet):
     sheet = tool.getFleetSheet(fleet)
     ships = {}
     ships[3] = min(sheet[1], sheet[2], sheet[3])
     ships[1] = ships[2] = ships[3]
     ships[4] = 1
     max_range = tool.subfleetMarange(self.client, self.db, ships, fleet.oid)
     nearest_sys_ids = tool.findNearest(self.db, fleet, self.data.enemySystems & self.data.relevantSystems, max_range * 0.45)
     if len(nearest_sys_ids):
         nearestSys = nearest_sys_ids[0]
         tool.orderPartFleet(self.client, self.db, ships, False, fleet.oid, Const.FLACTION_MOVE, nearestSys, None)
示例#12
0
 def _commence_attack(self, fleet):
     sheet = tool.getFleetSheet(fleet)
     ships = {}
     ships[3] = min(sheet[1], sheet[2], sheet[3])
     ships[1] = ships[2] = ships[3]
     ships[4] = 1
     max_range = tool.subfleetMaxRange(self.client, self.db, ships, fleet.oid)
     nearest_sys_ids = tool.findNearest(self.db, fleet, self.data.enemySystems & self.data.relevantSystems, max_range * 0.45)
     if len(nearest_sys_ids):
         nearestSys = nearest_sys_ids[0]
         tool.orderPartFleet(self.client, self.db, ships, False, fleet.oid, Const.FLACTION_MOVE, nearestSys, None)
示例#13
0
 def _recall_to_upgrade(self, service_centers, outdated_fleets,
                        obsolete_designs):
     for fleet in outdated_fleets:
         if fleet.orbiting in service_centers: continue
         subfleet_sheet = {}.fromkeys(obsolete_designs, 0)
         max_range = tool.subfleetMarange(self.client, self.db,
                                          subfleet_sheet, fleet.oid)
         nearest = tool.findNearest(self.db, fleet, service_centers,
                                    max_range)
         if not nearest: continue
         nearest_service = nearest[0]
         fleet, new_fleet, my_fleets = tool.orderPartFleet(
             self.client, self.db, subfleet_sheet, True, fleet.oid,
             Const.FLACTION_MOVE, nearest_service, None)
示例#14
0
    def _attack_manager(self):
        for fleet_id in self._get_attack_fleets():
            fleet = self.db[fleet_id]
            # send the attack fleet, if in range
            sheet = tool.getFleetSheet(fleet)
            sowers = sheet[4]
            swarmers = min(sheet[1], math.ceil(sowers * 1.5))
            max_range = 0.8 * tool.subfleetMarange(self.client, self.db, {1:swarmers, 4:sowers}, fleet_id)
            # four nearest systems are considered, with probability to be chosen based on order
            nearest = tool.findNearest(self.db, fleet, self.data.enemySystems, max_range, 4)
            if len(nearest):
                # range is adjusted to flatten probabilities a bit
                probability_map = map(lambda x: x ** 2, range(2 + len(nearest), 2, -1))
                target = Utils.weightedRandom(nearest, probability_map)

                fleet, new_fleet, my_fleets = tool.orderPartFleet(self.client, self.db,
                    {1:swarmers, 4:sowers}, True,
                    fleet_id, Const.FLACTION_MOVE, target, None)
示例#15
0
 def _explore(self, explorer_design_id):
     should_repeat = False
     explorer_fleets = self.data.myFleetsWithDesign.get(explorer_design_id, set())
     for fleet_id in copy.copy(explorer_fleets & self.data.idleFleets):
         max_range = tool.subfleetMaxRange(self.client, self.db, {explorer_design_id:1}, fleet_id)
         nearest = tool.findNearest(self.db, self.db[fleet_id], self.data.unknownSystems, max_range)
         if len(nearest) > 0:
             system_id = nearest[0]
             # send the fleet
             fleet, new_fleet, my_fleets = tool.orderPartFleet(self.client, self.db,
                 {explorer_design_id:1}, True, fleet_id, Const.FLACTION_MOVE, system_id, None)
             self.data.myFleetSheets[fleet_id][explorer_design_id] -= 1
             if self.data.myFleetSheets[fleet_id][explorer_design_id] == 0:
                 del self.data.myFleetSheets[fleet_id][explorer_design_id]
                 explorer_fleets.remove(fleet_id)
             else:
                 should_repeat = True
             self.data.unknownSystems.remove(system_id)
     return should_repeat
示例#16
0
 def _colonize_free_systems(self, valid_systems, colony_design_id):
     should_repeat = False
     colony_fleets = self.data.myFleetsWithDesign.get(colony_design_id, set())
     for fleet_id in copy.copy(colony_fleets & self.data.idleFleets):
         max_range = tool.subfleetMaxRange(self.client, self.db, {colony_design_id:1}, fleet_id)
         nearest = tool.findNearest(self.db, self.db[fleet_id], valid_systems, max_range)
         if len(nearest) > 0:
             system_id = nearest[0]
             system = self.db[system_id]
             target_id = self._find_best_planet(system.planets)
             fleet, new_fleet, my_fleets = tool.orderPartFleet(self.client, self.db,
                 {colony_design_id:1}, True, fleet_id, Const.FLACTION_DEPLOY, target_id, colony_design_id)
             self.data.myFleetSheets[fleet_id][colony_design_id] -= 1
             if self.data.myFleetSheets[fleet_id][colony_design_id] == 0:
                 del self.data.myFleetSheets[fleet_id][colony_design_id]
                 colony_fleets.remove(fleet_id)
             else:
                 should_repeat = True
             self.data.freeSystems.remove(system_id)
             valid_systems.remove(system_id)
     return should_repeat
示例#17
0
 def _help_system(self):
     tool.doDanger(self.data, self.client, self.db)
     pirate_influenced_systems = tool.findInfluence(
         self.data, self.client, self.db, Rules.pirateInfluenceRange,
         self.data.pirateSystems)
     one_fighter_mp = self.player.shipDesigns[
         self.designs["fighter"]].combatPwr
     for system_id in set(
             self.data.endangeredSystems) - set(pirate_influenced_systems):
         mil_pwr, shipQuantity = self.data.endangeredSystems[system_id]
         mil_pwr = -mil_pwr
         if system_id in self.data.myMPPerSystem:
             mil_pwr += self.data.myMPPerSystem[system_id]
         if mil_pwr < 0:
             system = self.db[system_id]
             nearest = tool.findNearest(self.db, system,
                                        self.data.mySystems, 99999, 20)[1:]
             for temp_id in nearest:
                 if temp_id in self.data.myMPPerSystem:
                     temp_mp = self.data.myMPPerSystem[temp_id]
                 else:
                     temp_mp = 0
                     self.data.myMPPerSystem[temp_id] = 0
                 if temp_id in self.data.endangeredSystems:
                     a, b = self.data.endangeredSystems[temp_id]
                     temp_mp -= a * 1.5
                     if temp_mp <= 0: continue
                 orig = temp_mp = min(-mil_pwr, temp_mp) * 1.25
                 # this is just prototype, working only with Fighters
                 quantity = int(math.ceil(temp_mp / float(one_fighter_mp)))
                 if quantity == 0:
                     continue
                 ships_left, mil_pwrSend = tool.orderFromSystem(
                     self.data, self.client, self.db,
                     {self.designs["fighter"]: quantity}, temp_id,
                     Const.FLACTION_MOVE, system_id, None)
                 mil_pwr += mil_pwrSend
                 self.data.myMPPerSystem[temp_id] -= mil_pwrSend
                 if mil_pwr > 0: break
示例#18
0
文件: ai.py 项目: taislin/outerspace
 def _explore(self, explorer_design_id):
     should_repeat = False
     explorer_fleets = self.data.myFleetsWithDesign.get(
         explorer_design_id, set())
     for fleet_id in copy.copy(explorer_fleets & self.data.idleFleets):
         max_range = tool.subfleetMarange(self.client, self.db,
                                          {explorer_design_id: 1}, fleet_id)
         nearest = tool.findNearest(self.db, self.db[fleet_id],
                                    self.data.unknownSystems, max_range)
         if len(nearest) > 0:
             system_id = nearest[0]
             # send the fleet
             fleet, new_fleet, my_fleets = tool.orderPartFleet(
                 self.client, self.db, {explorer_design_id: 1}, True,
                 fleet_id, Const.FLACTION_MOVE, system_id, None)
             self.data.myFleetSheets[fleet_id][explorer_design_id] -= 1
             if self.data.myFleetSheets[fleet_id][explorer_design_id] == 0:
                 del self.data.myFleetSheets[fleet_id][explorer_design_id]
                 explorer_fleets.remove(fleet_id)
             else:
                 should_repeat = True
             self.data.unknownSystems.remove(system_id)
     return should_repeat
示例#19
0
 def _return_fleet(self, fleet):
     nearest_sys_ids = tool.findNearest(self.db, fleet, self.data.mySystems)
     if len(nearest_sys_ids):
         nearest_sys_id = nearest_sys_ids[0]
         tool.orderFleet(self.client, self.db, fleet.oid, Const.FLACTION_MOVE, nearest_sys_id, None)
示例#20
0
 def _return_fleet(self, fleet):
     nearest_sys_ids = tool.findNearest(self.db, fleet, self.data.mySystems)
     if len(nearest_sys_ids):
         nearest_sys_id = nearest_sys_ids[0]
         tool.orderFleet(self.client, self.db, fleet.oid,
                         Const.FLACTION_MOVE, nearest_sys_id, None)