Text() public method

Show msg at coordinates (x, y) with color color
public Text ( double x, double y, string msg, float r = 0f, float g = 0f, float b = 0f ) : void
x double
y double
msg string
r float
g float
b float
return void
示例#1
0
        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
        }
示例#2
0
        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;
        }
示例#3
0
        /// <summary>
        /// !!! НЕ РЕАЛИЗОВАНО !!! Возвращает координаты самой важной зоны (реализация Овсянникова)
        /// </summary>
        /// <param name="world">Игровой мир</param>
        /// <param name="game">Константы игры</param>
        /// <param name="self">Собственный маг</param>
        /// <returns>Точка на двухмерной карте</returns>
        public Point2D getHotZone2(World world, Game game, Wizard self, VisualClient vc)
        {
            //определяеам список возможных зон
            List <HotZone> hotZones = getZones(world, self);

            //если список возможных зон не пуст
            if (hotZones.Count > 0)
            {
                double  maxHot      = 0.0D;
                Point2D returnPoint = new Point2D(hotZones.ElementAt(0).getX(), hotZones.ElementAt(0).getY());

                //расставляем "температуру" каждой зоны
                foreach (HotZone hZ in hotZones)
                {
                    double distanceFactor = 0.0D;
                    double allyFactor     = 0.0D;
                    double enemyFactor    = 0.0D;
                    double allyHPFactor   = 0.0D;
                    double enemyHPFactor  = 0.0D;

                    //!!! НЕ РЕАЛИЗОВАНО ОПРЕДЕЛЕНИЕ ВЕЛИЧИН РАЗЛИЧНЫХ ФАКТОРОВ !!!
                    foreach (Wizard wz in world.Wizards)                      //перебираем всех магов
                    {
                        double dist = wz.GetDistanceTo(hZ.getX(), hZ.getY()); //определение дистанции между текущей зоной и магом
                        if (dist > 20 && dist < 600)
                        {
                            if (wz.Faction != self.Faction)
                            {
                                enemyFactor   += 216000000.0 * K_enemy - dist * dist * dist * K_enemy;
                                enemyHPFactor += K_enemyHP * (wz.MaxLife / wz.Life - 1);
                            }
                            else
                            {
                                allyFactor   -= 216000000.0 * K_ally - dist * dist * dist * K_ally;
                                allyHPFactor -= K_allyHP * (wz.MaxLife / (wz.MaxLife - wz.Life + 1) - 1);
                            }
                        }
                    }
                    foreach (Building build in world.Buildings)                  //перебираем все здания
                    {
                        double dist = build.GetDistanceTo(hZ.getX(), hZ.getY()); //определение дистанции между текущей зоной и зданием
                        if (dist > 20 && dist < 600)
                        {
                            if (build.Faction != self.Faction)
                            {
                                enemyFactor   += 2.0 * (216000000.0 * K_enemy - dist * dist * dist * K_enemy);
                                enemyHPFactor += 2.3 * K_enemyHP * (build.MaxLife / build.Life - 1);
                            }
                            else
                            {
                                allyFactor   -= 2.0 * (216000000.0 * K_ally - dist * dist * dist * K_ally);
                                allyHPFactor -= 2.3 * K_allyHP * (build.MaxLife / (build.MaxLife - build.Life + 1) - 1);
                            }
                        }
                    }
                    foreach (Minion minion in world.Minions)                      //перебираем всех миньонов
                    {
                        double dist = minion.GetDistanceTo(hZ.getX(), hZ.getY()); //определение дистанции между текущей зоной и миньоном
                        if (dist > 20 && dist < 600)
                        {
                            if (minion.Faction != self.Faction)
                            {
                                enemyFactor   += 0.05 * (216000000.0 * K_enemy - dist * dist * dist * K_enemy);
                                enemyHPFactor += 0.005 * K_enemyHP * (minion.MaxLife / minion.Life - 1);
                            }
                            else
                            {
                                allyFactor   -= 0.05 * (216000000.0 * K_ally - dist * dist * dist * K_ally);
                                allyHPFactor -= 0.005 * K_allyHP * (minion.MaxLife / (minion.MaxLife - minion.Life + 1) - 1);
                            }
                        }
                    }
                    double dist2 = self.GetDistanceTo(hZ.getX(), hZ.getY());
                    if (dist2 > 100)
                    {
                        distanceFactor = K_distance * (3000 / dist2);
                    }

                    hZ.hot = distanceFactor + allyFactor + enemyFactor + allyHPFactor + enemyHPFactor;
                    if (vc != null)
                    {
                        vc.Text(hZ.getX(), hZ.getY(), Convert.ToString(hZ.hot), 1.0f, 0.0f, 0.0f);
                    }
                }

                //выбираем зону с максимальной "температурой"
                foreach (HotZone hZ in hotZones)
                {
                    if (hZ.hot > maxHot)
                    {
                        maxHot      = hZ.hot;
                        returnPoint = new Point2D(hZ.getX(), hZ.getY());
                    }
                }

                if (vc != null)
                {
                    vc.Line(returnPoint.getX(), returnPoint.getY(), self.X, self.Y, 0.0f, 0.0f, 0.0f);
                }
                return(returnPoint);
            }
            else
            {
                //иначе, вызываем метод Литвинова
                return(getHotZone(world, game, self));
            }
        }