public void Move(Wizard self, World world, Game game, Move move) { #if DEBUG // один раз вызвать Begin*() vc.BeginPost(); #endif move.Speed = game.WizardForwardSpeed; move.StrafeSpeed = game.WizardStrafeSpeed; move.Turn = game.WizardMaxTurnAngle; move.Action = ActionType.MagicMissile; #if DEBUG // вывод отладочной информации vc.Text(self.X - 35, self.Y - 37, string.Format("{0:D} | {1:F0} : {2:F0}", self.RemainingCooldownTicksByAction[(int)ActionType.MagicMissile], self.X, self.Y)); vc.Line(self.X, self.Y, self.X + Math.Cos(self.Angle - game.StaffSector / 2f) * self.CastRange, self.Y + Math.Sin(self.Angle - game.StaffSector / 2f) * self.CastRange, 1f, 0.7f, 0.7f); vc.Line(self.X, self.Y, self.X + Math.Cos(self.Angle + game.StaffSector / 2f) * self.CastRange, self.Y + Math.Sin(self.Angle + game.StaffSector / 2f) * self.CastRange, 1f, 0.7f, 0.7f); vc.Arc(self.X, self.Y, self.CastRange, self.Angle - game.StaffSector / 2f, game.StaffSector, 1f, 0.7f, 0.7f); #endif move.Turn = 0.01; move.Speed = 3; move.Action = ActionType.MagicMissile; #if DEBUG // в конце вызвать End*() vc.EndPost(); #endif }
public void Move(Wizard self, World world, Game game, Move move) { #region //1. Стратегическая составляющая. //Это выбор стратегии для всех участников (если мы - верховный) //Выбор стратегии из пожеланий верховного //Это выбор актуальной стратегии на данный момент //(рашить или обороняться, где именно рашить, куда отступать и т.д.) //по каим-то иипирическим коэффициентам учитывает: //количество врагов (и их уровень/здоровье) //колчество союзников (и их уровень/здоровье) //перспективность прорыва //критичность обороны //расстояние до этой точки //наличие близких бонусов // и т.д. //Выдает координаты (или точку), куда двигаться нашему магу (и союзным магам, если мы - верховный) //Ответственный - Литвинов Михаил //2. Прокладка маршрута до точки из стратегической составляющей //Берем текущие наши координаты и желаемые координаты (из стратегической сост). //Учитывая деревья, врагов и союзников, прокладываем оптимальный маршрут до точки назначения. //Работает до какого-то порога расстояния (если мы дальше порогового значения). //3. Тактическая составляющая //Поведение нашего мага в приоритетной зоне: //атака крипов или магов противника //атака на башню противника //тактическое отступление за спины союзников //выбор типа атаки //подбор бонуса //уворачивание от стрел противника //принятие стрелы соперника в себя, защита союзника //подсвет башням //и т.д. //Здесь необходимо просчитывать физику наперед //Здесь может быть полезно использовать генетические алгопритмы и другие приемы ИИ //Ответственный - Ткаченко Сергей //4. Просчет вариантов прокачки //Учитывание пожеланий верховного //Выбор пожеланий для прокачки всех союзников (если мы - верховный) // //5. Выполнение действий //Это может быть регулятор //Это выполнение атак //и т.д. #endregion if (world.TickIndex < 1) { setVisual(); } if (vc != null) { vc.BeginPre(); vc.FillRect(0, 0, 500, 500, 1.0f, 0.0f, 1.0f); vc.FillRect(3500, 3500, 4000, 4000, 1.0f, 1.0f, 0.0f); vc.FillRect(1650, 1650, 2350, 2350, 1.0f, 0.0f, 1.0f); vc.EndPre(); vc.BeginPost(); //начинаем отрисовку поверх всех объектов локал-раннера string str = Convert.ToString(self.X) + " : " + Convert.ToString(self.Y); vc.Text(self.X, self.Y, str, 0.0f, 0.0f, 1.0f); } if (game.IsSkillsEnabled == true) { if (self.Level != oldLevel) { move.SkillToLearn = myStrat.getSkill(move, self); } } hotZone = myStrat.getHotZone(world, game, self); //myStrat.getHotZone2(world, game, self, vc); if (vc != null) { if (hotZone != null) { vc.Line(self.X, self.Y, hotZone.getX(), hotZone.getY(), 1.0f, 0.0f, 0.0f); } vc.Circle(self.X, self.Y, HOT_ZONE_POROG, 1.0f, 1.0f, 0.0f); vc.Circle(self.X, self.Y, ENEMY_POROG, 1.0f, 0.0f, 1.0f); List <LinePoint> MapPoint = myTracer.getPointMap(world); foreach (LinePoint LP in MapPoint) { vc.FillCircle(LP.X, LP.Y, 5, 0.0f, 1.0f, 0.0f); //string str = Convert.ToString(LP.X)+" : " + Convert.ToString(LP.Y); //vc.Text(LP.X, LP.Y, str, 0.0f, 0.0f, 1.0f); } } int CD = self.RemainingCooldownTicksByAction[2]; double nearestTargetDistance = myTactic.getNearestTargetDistance(world, self); if (world.TickIndex > game.FactionMinionAppearanceIntervalTicks * 0.75D) { if /*((nearestTargetDistance<ENEMY_POROG*0.9D || (nearestTargetDistance < ENEMY_POROG && CD<10) || self.GetDistanceTo(hotZone.getX(), hotZone.getY()) < HOT_ZONE_POROG)&&*/ (!myTactic.TacticIsAll(world, self, game))//) { myTactic.getTacticMove(world, game, self, move); if (vc != null) { vc.Text(self.X, self.Y + 50, "TACTIC", 0.0f, 0.0f, 1.0f); } } else { if (vc == null) { myTracer.goTo(hotZone, world, game, self, move); } else { myTracer.goToVisual(hotZone, world, game, self, move, vc); vc.Text(self.X, self.Y + 50, "TRACER", 0.0f, 0.0f, 1.0f); } } } /*if(nearestTargetDistance < ENEMY_POROG-50 ||(isTactic && nearestTargetDistance < ENEMY_POROG) || self.GetDistanceTo(hotZone.getX(), hotZone.getY()) < HOT_ZONE_POROG) * { * myTactic.getTacticMove(world, game, self, move); * if (vc != null) vc.Text(self.X, self.Y + 50, "TACTIC", 0.0f, 0.0f, 1.0f); * isTactic = true; * } else * { * if (vc == null) * { * myTracer.goTo(hotZone, world, game, self, move); * } else * { * myTracer.goToVisual(hotZone, world, game, self, move, vc); * * vc.Text(self.X, self.Y + 50, "TRACER", 0.0f, 0.0f, 1.0f); * } * isTactic = false; * }*/ //вызываем метод getHotZone у объекта-стратегии if (vc != null) { vc.EndPost(); //заканчиваем отрисовку } oldLevel = self.Level; }