private static Direction DetermineDirectionAggressive(Monster m, World w, Func<bool> shouldMakeAnAggressiveMove) { var p = w.Player; if (p == null || !p.IsExtant) { return MonsterMovement.DetermineDirectionRolling(m, w); } TilePos tp = m.TilePosition; /* bool isCurrentlyMovingTowardsFreeSpace; if (this.Direction == Direction.None) isCurrentlyMovingTowardsFreeSpace = false; else { TilePos pp = TilePos.GetPositionAfterOneMove(tp, this.Direction); isCurrentlyMovingTowardsFreeSpace = this._world.IsTileUnoccupied(pp, true); if (isCurrentlyMovingTowardsFreeSpace) { Vector2 newPos = World.GetBounds(pp).GetCentre(); if (!IsInSameRoom(this.Position, newPos) && MonsterRandom.Next(4) != 0) isCurrentlyMovingTowardsFreeSpace = false; } } */ Direction newDirection = Direction.None; TilePos playerPosition = p.TilePosition; int yDiff = tp.Y - playerPosition.Y; int xDiff = tp.X - playerPosition.X; if (m.Direction == Direction.Left || m.Direction == Direction.Right) { if (Math.Abs(tp.X - playerPosition.X) == 1 && Math.Abs(yDiff) > 3 && Math.Abs(yDiff) <= 16 && shouldMakeAnAggressiveMove()) { newDirection = yDiff > 0 ? Direction.Up : Direction.Down; } else if ((tp.X - playerPosition.X) == 0 && Math.Abs(yDiff) <= 3 && shouldMakeAnAggressiveMove()) { newDirection = yDiff > 0 ? Direction.Up : Direction.Down; } } else if (m.Direction == Direction.Up || m.Direction == Direction.Down) { if (Math.Abs(tp.Y - playerPosition.Y) == 1 && Math.Abs(xDiff) > 3 && Math.Abs(xDiff) <= 16 && shouldMakeAnAggressiveMove()) { newDirection = xDiff > 0 ? Direction.Left : Direction.Right; } else if ((tp.Y - playerPosition.Y) == 0 && Math.Abs(xDiff) <= 3 && shouldMakeAnAggressiveMove()) { newDirection = xDiff > 0 ? Direction.Left : Direction.Right; } } if (newDirection != Direction.None) { TilePos pp = tp.GetPositionAfterOneMove(newDirection); if (w.CanTileBeOccupied(pp, true)) { return newDirection; } } return MonsterMovement.DetermineDirectionRolling(m, w); }
public static Direction DetermineDirectionStandardPatrolling(Monster m, World w) { if (m.Direction == Direction.None) throw new InvalidOperationException("Direction must be set for patrolling."); TilePos tp = m.TilePosition; TilePos pp = tp.GetPositionAfterOneMove(m.Direction); bool isCurrentlyMovingTowardsFreeSpace = w.CanTileBeOccupied(pp, true); Vector2 potentiallyMovingTowards = pp.ToPosition(); bool isInSameRoom = IsInSameRoom(m.Position, potentiallyMovingTowards); bool canContinueMovingInTheSameDirection = isCurrentlyMovingTowardsFreeSpace && isInSameRoom; var result = canContinueMovingInTheSameDirection ? m.Direction : m.Direction.Reversed(); System.Diagnostics.Trace.WriteLine(string.Format("{0} {1} {2} {3} {4}", tp, pp, isCurrentlyMovingTowardsFreeSpace, isInSameRoom, result)); return result; }
private static Direction DetermineDirectionAggressive(Monster m, World w) { TilePos tp = m.TilePosition; bool isCurrentlyMovingTowardsFreeSpace; if (m.Direction == Direction.None) isCurrentlyMovingTowardsFreeSpace = false; else { TilePos pp = tp.GetPositionAfterOneMove(m.Direction); isCurrentlyMovingTowardsFreeSpace = w.CanTileBeOccupied(pp, true); if (isCurrentlyMovingTowardsFreeSpace) { Vector2 newPos = pp.ToPosition(); if (!MonsterMovement.IsInSameRoom(m.Position, newPos) && MonsterRandom.Next(4) != 0) isCurrentlyMovingTowardsFreeSpace = false; } } Direction newDirection = Direction.None; if (w.Player != null) { TilePos playerPosition = w.Player.TilePosition; int yDiff = tp.Y - playerPosition.Y; int xDiff = tp.X - playerPosition.X; if (xDiff > 16 || yDiff > 16) { // player is out of sight } else if (m.Direction == Direction.Left || m.Direction == Direction.Right) { // Check if travelling on same row as player if (yDiff == 0 && ShouldMakeMove()) { // Move aside newDirection = MonsterRandom.Next(2) == 0 ? Direction.Up : Direction.Down; } else if ((m.Direction == Direction.Left && xDiff <= -5) || (m.Direction == Direction.Right && xDiff >= 5)) { newDirection = yDiff > 0 ? Direction.Up : Direction.Down; } } else if (m.Direction == Direction.Up || m.Direction == Direction.Down) { if (xDiff == 0 && ShouldMakeMove()) { // Move aside newDirection = MonsterRandom.Next(2) == 0 ? Direction.Left : Direction.Right; } else if ((m.Direction == Direction.Up && yDiff <= -5) || (m.Direction == Direction.Down && yDiff >= 5)) { newDirection = xDiff > 0 ? Direction.Left : Direction.Right; } } if (newDirection != Direction.None) { TilePos pp = tp.GetPositionAfterOneMove(newDirection); if (!w.CanTileBeOccupied(pp, true)) newDirection = Direction.None; } } if (newDirection == Direction.None) { if (m.Direction == Direction.None) { newDirection = MonsterMovement.RandomDirection(m, w); } else if (!isCurrentlyMovingTowardsFreeSpace) { // tend to bounce backwards newDirection = MonsterRandom.Next(5) == 0 ? MonsterMovement.GetRandomPerpendicularDirection(m.Direction) : m.Direction.Reversed(); } else if (MonsterRandom.Next(16) == 0) { newDirection = MonsterMovement.GetRandomPerpendicularDirection(m.Direction); } else { newDirection = m.Direction; } } return newDirection; }
public static Direction UpdateDirectionWhereMovementBlocked(Monster m, World w, Direction d) { Direction intendedDirection = d; TilePos tp = m.TilePosition; do { TilePos potentiallyMovingTowardsTile = tp.GetPositionAfterOneMove(d); Vector2 potentiallyMovingTowards = potentiallyMovingTowardsTile.ToPosition(); if (m.ChangeRooms == ChangeRooms.StaysWithinRoom && !IsInSameRoom(m.Position, potentiallyMovingTowards)) { d = GetNextDirection(d); continue; } if (w.CanTileBeOccupied(potentiallyMovingTowardsTile, true)) { return d; } d = GetNextDirection(d); } while (d != intendedDirection); return Direction.None; }