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); }
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); }
public Cell GetFreeAdjacentCell() { var cell = Fighter.Position.Point.GetAdjacentCells(CellInformationProvider.IsCellWalkable).FirstOrDefault(); return(cell != null?CellInformationProvider.GetCellInformation(cell.CellId).Cell : null); }