def resolve(self): res = [] enemies = self.c.get_enemies() allies = self.c.get_allies() if self.c.me.type == TrooperType.FIELD_MEDIC: # Medic shouldn't run too far max_dist = max([self.c.distance_to(a.x, a.y)] for a in allies) if max_dist > 4: return [] for t in enemies: dangerous = False for a in allies: if t.get_distance_to_unit(a) <= t.shooting_range: dangerous = True self.c.log('Enemy %s at (%d, %d) : %s' % (trooper_type_string(t.type), t.x, t.y, str(dangerous))) if dangerous: if not self.c.can_shoot(self.c.me, t): res.append(MoveOrder(self.c, self.priority + 100 - 10*self.c.distance_to(t.x, t.y), t.x, t.y)) return res
def make_move(self, c): self.c = c self.c.log('\n=== TURN %d === ' % self.c.world.move_index) self.c.log('Current player: %10s (%d, %d) AP: %d HP: %d' % (trooper_type_string(self.c.me.type), self.c.me.x, self.c.me.y, self.c.me.action_points, self.c.me.hitpoints) ) self.c.log('enemies: ', new_line=False) for e in self.c.get_enemies(): self.c.log(str((e.x, e.y)), new_line=False) self.c.log('') orders = self.init_orders() while True: orders = filter( lambda o: o.min_cost <= self.c.me.action_points, orders ) if not orders: break cur_order = max(orders, key=operator.attrgetter('priority')) orders = filter(lambda o: o != cur_order, orders) self.c.log('= Chosen: %s' % cur_order) if isinstance(cur_order, IntentOrder): new_orders = cur_order.resolve() for order in new_orders: self.c.log('\t%d %s' % (order.priority, order)) orders.extend(new_orders) else: if cur_order.make_move(): break self.c.log('RESULT MOVE: %s direction: %s x: %s y: %s' % (action_type_string(self.c.move.action), direction_type_string(self.c.move.direction), self.c.move.x, self.c.move.y))