Beispiel #1
0
        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;
        }
Beispiel #3
0
        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;
        }