示例#1
0
        public override ConfirmedDirection GetDirection()
        {
            IDirectionChosen directionTowardsPlayer = this.Monster.DetermineDirectionTowardsPlayer();

            if (!(directionTowardsPlayer is ConfirmedDirection))
            {
                bool notPossibleToGoInDirectionTowardsPlayer = !this.Monster.ConfirmDirectionToMoveIn(directionTowardsPlayer, out ConfirmedDirection feasibleDirection);
                if (notPossibleToGoInDirectionTowardsPlayer || feasibleDirection == Direction.None)
                {
                    return(feasibleDirection);
                }
            }

            // we know at this point that we could move in DirectionTowardsPlayer HOWEVER we don't want to actually step onto the same tile as the player
            TilePos potentiallyMovingTowards = this.Monster.TilePosition.GetPositionAfterOneMove(directionTowardsPlayer.Direction);

            if (potentiallyMovingTowards != GlobalServices.GameState.Player.TilePosition)
            {
                // it's okay. we'll be closer to the player without actually touching the player
                return(directionTowardsPlayer.Confirm());
            }

            var directionAwayFromPlayer = MonsterMovement.AlterDirectionByVeeringAway(directionTowardsPlayer.Direction);

            this.Monster.ConfirmDirectionToMoveIn(directionAwayFromPlayer, out ConfirmedDirection result);
            return(result);
        }
示例#2
0
        protected IDirectionChosen GetDesiredDirection()
        {
            if (this.CurrentDirection == Direction.None)
            {
                return(ShouldMonsterFollowPlayerIntoAnotherRoom()
                    ? this.Monster.DetermineDirectionTowardsPlayer()
                    : MonsterMovement.RandomDirection());
            }

            bool shouldChangeDirection = GlobalServices.Randomness.Test(7);

            if (shouldChangeDirection)
            {
                return(ShouldMonsterFollowPlayerIntoAnotherRoom()
                    ? this.Monster.DetermineDirectionTowardsPlayer()
                    : MonsterMovement.AlterDirectionByVeeringAway(this.CurrentDirection));
            }

            if (this.Monster.CanMoveInDirection(this.CurrentDirection))
            {
                return(new ConfirmedDirection(this.CurrentDirection));
            }

            var reversed = this.CurrentDirection.Reversed();

            return(new PossibleDirection(reversed));
        }
示例#3
0
        private static IDirectionChosen MoveAwayFromPlayer(Monster monster)
        {
            var  awayFromPlayer           = monster.DetermineDirectionAwayFromPlayer();
            bool shouldDodgeWhilstFleeing = GlobalServices.Randomness.Test(3);

            if (shouldDodgeWhilstFleeing)
            {
                var alteredDirection = MonsterMovement.AlterDirectionByVeeringAway(awayFromPlayer.Direction);
                return(alteredDirection);
            }

            return(awayFromPlayer);
        }