int getInitialActionPoints(Trooper tr) { var points = tr.InitialActionPoints; if (CommanderId != -1 && tr.GetDistanceTo(state.Position[CommanderId].X, state.Position[CommanderId].Y) <= game.CommanderAuraRange) points += game.CommanderAuraBonusActionPoints; return points; }
// Основной метод public void Move(Trooper self, World world, Game game, Move move) { if (self.ActionPoints == 0) return; cnt_invoke = 0; m_self = self; m_game = game; m_world = world; m_cells = world.Cells; // Определение игрока-цели Player nearToCentr = null; foreach (Player p in world.Players) if (p.Id != self.PlayerId && p.ApproximateX >= 0 && p.ApproximateY >= 0) if (nearToCentr == null || FindNextStep(self.X, self.Y, nearToCentr.ApproximateX, nearToCentr.ApproximateY, 3).dist > FindNextStep(self.X, self.Y, p.ApproximateX, p.ApproximateY, 3).dist ) nearToCentr = p; if (nearToCentr != null) { targetX = nearToCentr.ApproximateX; targetY = nearToCentr.ApproximateY; } if (m_cellDangerous == null) CellDangerous(); if (targetX == -1 && targetY == -1) { targetX = self.X; targetY = self.Y; } // Запрос цели const double stageDist = 2.5; if (self.GetDistanceTo(targetX, targetY) <= stageDist || world.MoveIndex - moveWithoutEnemy >= 4) { bool CommanderAlive = false; foreach (Trooper tr in world.Troopers) if (tr.IsTeammate && tr.Type == TrooperType.Commander) CommanderAlive = true; if (!CommanderAlive) { targetX = random.Next(world.Width); targetY = random.Next(world.Height); moveWithoutEnemy = world.MoveIndex; } else if (self.Type == TrooperType.Commander && self.ActionPoints >= game.CommanderRequestEnemyDispositionCost) { move.Action = ActionType.RequestEnemyDisposition; moveWithoutEnemy = world.MoveIndex; return; } } // Заполнение списка солдат, определение отсутствия врагов if (self.ActionPoints >= self.InitialActionPoints) m_troopers = new ArrayList(); foreach (Trooper trooper in m_world.Troopers) { if (trooper.IsTeammate == false) moveWithoutEnemy = m_world.MoveIndex; bool isExist = false; for (int i = 0; i < m_troopers.Count; i++) { MyTrooper mt = (MyTrooper)m_troopers[i]; if (mt.Id == trooper.Id && mt.PlayerId == trooper.PlayerId) { isExist = true; m_troopers[i] = new MyTrooper(trooper); break; } } if (!isExist) m_troopers.Add(new MyTrooper(trooper)); } // Выбор оптимального действия Move m = FindNextMove(new MyTrooper(self), new ArrayList(m_world.Players), m_troopers, new ArrayList(m_world.Bonuses)).move; move.Action = m.Action; move.Direction = m.Direction; move.X = m.X; move.Y = m.Y; return; }