Пример #1
0
    def handle_casual_combat(self):
        """
		Handles combat for ships wandering around the map (not assigned to any fleet/mission).
		"""
        filters = self.unit_manager.filtering_rules

        rules = (filters.not_in_fleet, filters.fighting(),
                 filters.ship_state(self.ships, self.shipStates.idle))
        for ship in self.unit_manager.get_ships(rules):
            # Turn into one-ship group, since reasoning is based around groups of ships
            ship_group = [
                ship,
            ]
            # TODO: create artificial groups by dividing ships that are nearby into groups based on their distance.
            # This may end up being costly, so postpone until we have more cpu resources to spare.

            ships_around = self.unit_manager.find_ships_near_group(
                ship_group, self.combat_range)
            pirate_ships = self.unit_manager.filter_ships(
                ships_around, (filters.pirate, ))
            fighting_ships = self.unit_manager.filter_ships(
                ships_around, (filters.fighting(), ))
            working_ships = self.unit_manager.filter_ships(
                ships_around, (filters.working(), ))
            environment = {'ship_group': ship_group}
            if fighting_ships:
                environment['enemies'] = fighting_ships
                environment[
                    'power_balance'] = UnitManager.calculate_power_balance(
                        ship_group, fighting_ships)
                self.log.debug("Player: %s vs Player: %s -> power_balance:%s",
                               self.owner.name, fighting_ships[0].owner.name,
                               environment['power_balance'])
                self.owner.behavior_manager.request_action(
                    BehaviorManager.action_types.offensive,
                    'fighting_ships_in_sight', **environment)
            elif pirate_ships:
                environment['enemies'] = pirate_ships
                environment[
                    'power_balance'] = UnitManager.calculate_power_balance(
                        ship_group, pirate_ships)
                self.log.debug("Player: %s vs Player: %s -> power_balance:%s",
                               self.owner.name, pirate_ships[0].owner.name,
                               environment['power_balance'])
                self.owner.behavior_manager.request_action(
                    BehaviorManager.action_types.offensive,
                    'pirate_ships_in_sight', **environment)
            elif working_ships:
                environment['enemies'] = working_ships
                self.owner.behavior_manager.request_action(
                    BehaviorManager.action_types.offensive,
                    'working_ships_in_sight', **environment)
            else:
                # execute idle action only if whole fleet is idle
                # we check for AIPlayer state here
                if all((self.owner.ships[ship] == self.owner.shipStates.idle
                        for ship in ship_group)):
                    self.owner.behavior_manager.request_action(
                        BehaviorManager.action_types.idle, 'no_one_in_sight',
                        **environment)
Пример #2
0
    def handle_mission_combat(self, mission):
        """
		Routine for handling combat in mission that requests for it.
		"""
        filters = self.unit_manager.filtering_rules
        fleet = mission.fleet

        ship_group = fleet.get_ships()
        ship_group = self.unit_manager.filter_ships(
            ship_group, (filters.ship_state(self.ships, self.shipStates.idle)))

        if not ship_group:
            mission.abort_mission()

        ships_around = self.unit_manager.find_ships_near_group(
            ship_group, self.combat_range)
        ships_around = self.unit_manager.filter_ships(ships_around,
                                                      (filters.hostile(), ))
        pirate_ships = self.unit_manager.filter_ships(ships_around,
                                                      (filters.pirate, ))
        fighting_ships = self.unit_manager.filter_ships(
            ships_around, (filters.fighting(), ))
        working_ships = self.unit_manager.filter_ships(ships_around,
                                                       (filters.working(), ))

        environment = {'ship_group': ship_group}

        # begin combat if it's still unresolved
        if fighting_ships:
            environment['enemies'] = fighting_ships
            environment['power_balance'] = UnitManager.calculate_power_balance(
                ship_group, fighting_ships)
            self.log.debug("Player: %s vs Player: %s -> power_balance:%s",
                           self.owner.name, fighting_ships[0].owner.name,
                           environment['power_balance'])
            self.owner.behavior_manager.request_action(
                BehaviorManager.action_types.offensive,
                'fighting_ships_in_sight', **environment)
        elif pirate_ships:
            environment['enemies'] = pirate_ships
            environment['power_balance'] = UnitManager.calculate_power_balance(
                ship_group, pirate_ships)
            self.log.debug("Player: %s vs Player: %s -> power_balance:%s",
                           self.owner.name, pirate_ships[0].owner.name,
                           environment['power_balance'])
            self.owner.behavior_manager.request_action(
                BehaviorManager.action_types.offensive,
                'pirate_ships_in_sight', **environment)
        elif working_ships:
            environment['enemies'] = working_ships
            self.owner.behavior_manager.request_action(
                BehaviorManager.action_types.offensive,
                'working_ships_in_sight', **environment)
        else:
            # no one else is around to fight -> continue mission
            mission.continue_mission()
Пример #3
0
	def handle_casual_combat(self):
		"""
		Combat with idle ships (not assigned to a mission)
		"""
		filters = self.unit_manager.filtering_rules

		rules = (filters.not_in_fleet, filters.pirate, filters.ship_state(self.ships, self.shipStates.idle))
		for ship in self.unit_manager.get_ships(rules):
			# Turn into one-ship group, since reasoning is based around groups of ships
			ship_group = [ship, ]

			ships_around = self.unit_manager.find_ships_near_group(ship_group, self.combat_range)
			fighting_ships = self.unit_manager.filter_ships(ships_around, (filters.fighting(), ))
			working_ships = self.unit_manager.filter_ships(ships_around, (filters.working(), ))
			environment = {'ship_group': ship_group}
			if fighting_ships:
				environment['enemies'] = fighting_ships
				environment['power_balance'] = UnitManager.calculate_power_balance(ship_group, fighting_ships)
				self.log.debug("Player: %s vs Player: %s -> power_balance:%s", self.owner.name, fighting_ships[0].owner.name, environment['power_balance'])
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
					'fighting_ships_in_sight', **environment)
			elif working_ships:
				environment['enemies'] = working_ships
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
					'working_ships_in_sight', **environment)
			else:
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.idle,
					'no_one_in_sight', **environment)
Пример #4
0
	def handle_mission_combat(self, mission):
		"""
		Routine for handling combat in mission that requests for it.
		"""
		filters = self.unit_manager.filtering_rules
		fleet = mission.fleet

		ship_group = fleet.get_ships()
		ship_group = self.unit_manager.filter_ships(ship_group, (filters.ship_state(self.ships, self.shipStates.idle)))

		if not ship_group:
			mission.abort_mission()

		ships_around = self.unit_manager.find_ships_near_group(ship_group, self.combat_range)
		ships_around = self.unit_manager.filter_ships(ships_around, (filters.hostile(), ))
		fighting_ships = self.unit_manager.filter_ships(ships_around, (filters.fighting(), ))
		working_ships = self.unit_manager.filter_ships(ships_around, (filters.working(), ))

		environment = {'ship_group': ship_group}

		# begin combat if it's still unresolved
		if fighting_ships:
			environment['enemies'] = fighting_ships
			environment['power_balance'] = UnitManager.calculate_power_balance(ship_group, fighting_ships)
			self.log.debug("Player: %s vs Player: %s -> power_balance:%s", self.owner.name, fighting_ships[0].owner.name, environment['power_balance'])
			self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
				'fighting_ships_in_sight', **environment)
		elif working_ships:
			environment['enemies'] = working_ships
			self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
				'working_ships_in_sight', **environment)
		else:
			# no one else is around to fight -> continue mission
			mission.continue_mission()
Пример #5
0
    def calculate_player_power_balance(self, other_player):
        """
		Calculates power balance between two players.
		Power balance of 1.2 means that self.owner is 1.2 times stronger than other_player

		@param other_player: other player who is matched against self.owner
		@type other_player: Player
		@return: power balance between self.owner and other_player
		@rtype: float
		"""

        min_balance = 10e-7
        max_balance = 1000.0

        ships = self.owner.ships.keys()
        ships = self.unit_manager.filter_ships(
            ships, (self.unit_manager.filtering_rules.fighting(), ))
        enemy_ships = self.unit_manager.get_player_ships(other_player)
        enemy_ships = self.unit_manager.filter_ships(
            enemy_ships, (self.unit_manager.filtering_rules.fighting(), ))

        # infinitely more powerful
        if ships and not enemy_ships:
            return max_balance

        # infinitely less powerful
        elif not ships and enemy_ships:
            return min_balance
        elif not ships and not enemy_ships:
            return 1.0

        return UnitManager.calculate_power_balance(ships, enemy_ships)
Пример #6
0
	def calculate_player_power_balance(self, other_player):
		"""
		Calculates power balance between two players.
		Power balance of 1.2 means that self.owner is 1.2 times stronger than other_player

		@param other_player: other player who is matched against self.owner
		@type other_player: Player
		@return: power balance between self.owner and other_player
		@rtype: float
		"""

		min_balance = 10e-7
		max_balance = 1000.0

		ships = self.owner.ships.keys()
		ships = self.unit_manager.filter_ships(ships, (self.unit_manager.filtering_rules.fighting(),))
		enemy_ships = self.unit_manager.get_player_ships(other_player)
		enemy_ships = self.unit_manager.filter_ships(enemy_ships, (self.unit_manager.filtering_rules.fighting(),))

		# infinitely more powerful
		if ships and not enemy_ships:
			return max_balance

		# infinitely less powerful
		elif not ships and enemy_ships:
			return min_balance
		elif not ships and not enemy_ships:
			return 1.0

		return UnitManager.calculate_power_balance(ships, enemy_ships)
Пример #7
0
	def handle_casual_combat(self):
		"""
		Combat with idle ships (not assigned to a mission)
		"""
		filters = self.unit_manager.filtering_rules

		rules = (filters.not_in_fleet, filters.pirate, filters.ship_state(self.ships, self.shipStates.idle))
		for ship in self.unit_manager.get_ships(rules):
			# Turn into one-ship group, since reasoning is based around groups of ships
			ship_group = [ship, ]

			ships_around = self.unit_manager.find_ships_near_group(ship_group, self.combat_range)
			fighting_ships = self.unit_manager.filter_ships(ships_around, (filters.fighting(), ))
			working_ships = self.unit_manager.filter_ships(ships_around, (filters.working(), ))
			environment = {'ship_group': ship_group}
			if fighting_ships:
				environment['enemies'] = fighting_ships
				environment['power_balance'] = UnitManager.calculate_power_balance(ship_group, fighting_ships)
				self.log.debug("Player: %s vs Player: %s -> power_balance:%s", self.owner.name, fighting_ships[0].owner.name, environment['power_balance'])
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
					'fighting_ships_in_sight', **environment)
			elif working_ships:
				environment['enemies'] = working_ships
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
					'working_ships_in_sight', **environment)
			else:
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.idle,
					'no_one_in_sight', **environment)
Пример #8
0
	def handle_casual_combat(self):
		"""
		Handles combat for ships wandering around the map (not assigned to any fleet/mission).
		"""
		filters = self.unit_manager.filtering_rules

		rules = (filters.not_in_fleet, filters.fighting(), filters.ship_state(self.ships, self.shipStates.idle))
		for ship in self.unit_manager.get_ships(rules):
			# Turn into one-ship group, since reasoning is based around groups of ships
			ship_group = [ship, ]
			# TODO: create artificial groups by dividing ships that are nearby into groups based on their distance.
			# This may end up being costly, so postpone until we have more cpu resources to spare.

			ships_around = self.unit_manager.find_ships_near_group(ship_group, self.combat_range)
			pirate_ships = self.unit_manager.filter_ships(ships_around, (filters.pirate, ))
			fighting_ships = self.unit_manager.filter_ships(ships_around, (filters.fighting(), ))
			working_ships = self.unit_manager.filter_ships(ships_around, (filters.working(), ))
			environment = {'ship_group': ship_group}
			if fighting_ships:
				environment['enemies'] = fighting_ships
				environment['power_balance'] = UnitManager.calculate_power_balance(ship_group, fighting_ships)
				self.log.debug("Player: %s vs Player: %s -> power_balance:%s", self.owner.name, fighting_ships[0].owner.name, environment['power_balance'])
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
					'fighting_ships_in_sight', **environment)
			elif pirate_ships:
				environment['enemies'] = pirate_ships
				environment['power_balance'] = UnitManager.calculate_power_balance(ship_group, pirate_ships)
				self.log.debug("Player: %s vs Player: %s -> power_balance:%s", self.owner.name, pirate_ships[0].owner.name, environment['power_balance'])
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
					'pirate_ships_in_sight', **environment)
			elif working_ships:
				environment['enemies'] = working_ships
				self.owner.behavior_manager.request_action(BehaviorManager.action_types.offensive,
					'working_ships_in_sight', **environment)
			else:
				# execute idle action only if whole fleet is idle
				# we check for AIPlayer state here
				if all((self.owner.ships[ship] == self.owner.shipStates.idle for ship in ship_group)):
					self.owner.behavior_manager.request_action(BehaviorManager.action_types.idle,
						'no_one_in_sight', **environment)