示例#1
0
        public Cell GetCellToFlee()
        {
            var rand           = new AsyncRandom();
            var movementsCells = GetMovementCells();
            var fighters       = Fight.GetAllFighters(entry => entry.IsEnnemyWith(Fighter));

            var  currentCellIndice = fighters.Sum(entry => entry.Position.Point.ManhattanDistanceTo(Fighter.Position.Point));
            Cell betterCell        = null;
            long betterCellIndice  = 0;

            foreach (var c in movementsCells)
            {
                if (!CellInformationProvider.IsCellWalkable(c.Id))
                {
                    continue;
                }

                var indice = fighters.Sum(entry => entry.Position.Point.ManhattanDistanceTo(new MapPoint(c)));

                if (betterCellIndice < indice)
                {
                    betterCellIndice = indice;
                    betterCell       = c;
                }
                else if (betterCellIndice == indice && rand.Next(2) == 0)
                // random factory
                {
                    betterCellIndice = indice;
                    betterCell       = c;
                }
            }

            return(currentCellIndice == betterCellIndice ? Fighter.Cell : betterCell);
        }
示例#2
0
        public Cell GetCellToCastSpell(TargetCell target, Spell spell, bool LoS, bool nearFirst = true)
        {
            var moveZone = GetMoveZone();
            Set castRange;

            if (spell.CurrentSpellLevel.CastInLine || spell.CurrentSpellLevel.CastInDiagonal)
            {
                castRange = new CrossSet(target.Point, Fighter.GetSpellRange(spell.CurrentSpellLevel),
                                         spell.CurrentSpellLevel.MinRange != 0 ? (int)spell.CurrentSpellLevel.MinRange : CellInformationProvider.IsCellWalkable(target.Cell.Id) ? 0 : 1)
                {
                    Diagonal      = spell.CurrentSpellLevel.CastInDiagonal,
                    AllDirections = spell.CurrentSpellLevel.CastInLine && spell.CurrentSpellLevel.CastInDiagonal
                }
            }
            ;
            else
            {
                castRange = new LozengeSet(target.Point, Fighter.GetSpellRange(spell.CurrentSpellLevel),
                                           spell.CurrentSpellLevel.MinRange != 0 ? (int)spell.CurrentSpellLevel.MinRange : CellInformationProvider.IsCellWalkable(target.Cell.Id) ? 0 : 1);
            }

            var intersection = castRange.EnumerateValidPoints().Intersect(moveZone);

            var closestPoint = intersection.Where(x => Fight.Cells[x.CellId].Walkable &&
                                                  (target.Direction == DirectionFlagEnum.ALL_DIRECTIONS || target.Direction == DirectionFlagEnum.NONE || (x.OrientationTo(target.Point).GetFlag() & target.Direction) != 0) &&
                                                  (!LoS || Fight.CanBeSeen(x, MapPoint.GetPoint(target.Cell), false, Fighter))).
                               OrderBy(x => (nearFirst ? 1 : -1) * x.ManhattanDistanceTo(Fighter.Position.Point)).FirstOrDefault();

            return(closestPoint != null ? Fighter.Fight.Cells[closestPoint.CellId] : null);
        }
示例#3
0
        public Cell GetFreeAdjacentCell()
        {
            var cell = Fighter.Position.Point.GetAdjacentCells(CellInformationProvider.IsCellWalkable).FirstOrDefault();

            return(cell != null?CellInformationProvider.GetCellInformation(cell.CellId).Cell : null);
        }