Пример #1
0
        private void ProcessMovementFromCardDir(ICardDir cardDir, MovementResultModel movementResultModel)
        {
            if (!(_roomMachine.CanFire(cardDir.FetchRoomTrigger)))
            {
                // No exit that way
                if (cardDir.GetDirExitBlockedDisp != null)
                {
                    Console.WriteLine(cardDir.GetDirExitBlockedDisp);
                }
                else
                {
                    Console.WriteLine(cardDir.GetUnavailableDirDisp);
                }
                return;
            }

            if (!cardDir.GetExitAllowedMod)
            {
                // exit that way, but is currently blocked off
                if (cardDir.GetDirExitBlockedDisp != null)
                {
                    Console.WriteLine(cardDir.GetDirExitBlockedDisp);
                }
                else
                {
                    Console.WriteLine(cardDir.GetUnavailableDirDisp);
                }
                return;
            }

            // Check if the movement speed is suitable to exit

            var speedIsSuitable = false;

            if (cardDir.GetFastExitRequiredMod && !cardDir.GetSlowExitRequiredMod)
            {
                if (movementResultModel.Speed.ToLower() == "fast")
                {
                    speedIsSuitable = true;
                }
                else
                {
                    // not fast enough
                    if (cardDir.GetExitNotFastEnoughDisp != null)
                    {
                        Console.WriteLine(cardDir.GetExitNotFastEnoughDisp, movementResultModel.BaseActionVerb);
                    }
                }
            }
            else if (!cardDir.GetFastExitRequiredMod && cardDir.GetSlowExitRequiredMod)
            {
                if (movementResultModel.Speed.ToLower() == "slow")
                {
                    speedIsSuitable = true;
                }
                else
                {
                    // not slow enough
                    if (cardDir.GetExitNotSlowEnoughDisp != null)
                    {
                        Console.WriteLine(cardDir.GetExitNotSlowEnoughDisp, movementResultModel.BaseActionVerb);
                    }
                }
            }
            else if (cardDir.GetFastExitRequiredMod && cardDir.GetSlowExitRequiredMod)
            {
                if (movementResultModel.Speed.ToLower() == "slow" || movementResultModel.Speed.ToLower() == "fast")
                {
                    speedIsSuitable = true;
                }
                else
                {
                    // not slow or fast enough
                    Console.WriteLine(cardDir.GetNormalSpeedNotAllowedDisp, movementResultModel.BaseActionVerb);
                }
            }
            else if (!cardDir.GetFastExitRequiredMod && !cardDir.GetSlowExitRequiredMod)
            {
                speedIsSuitable = true;
            }

            if (!speedIsSuitable)
            {
                return;
            }

            // check if the movement method is suitable to exit

            var methodIsSuitable = false;

            if (cardDir.GetJumpExitRequiredMod && !cardDir.GetCrawlExitRequiredMod)
            {
                if (movementResultModel.Method.ToLower() == "jump")
                {
                    methodIsSuitable = true;
                }
                else
                {
                    // must jump
                    if (cardDir.GetExitMustJumpDisp != null)
                    {
                        Console.WriteLine(cardDir.GetExitMustJumpDisp, movementResultModel.BaseActionVerb);
                    }
                }
            }
            else if (!cardDir.GetJumpExitRequiredMod && cardDir.GetCrawlExitRequiredMod)
            {
                if (movementResultModel.Method.ToLower() == "crawl")
                {
                    methodIsSuitable = true;
                }
                else
                {
                    // must crawl
                    if (cardDir.GetExitMustCrawlDisp != null)
                    {
                        Console.WriteLine(cardDir.GetExitMustCrawlDisp, movementResultModel.BaseActionVerb);
                    }
                }
            }
            else if (cardDir.GetJumpExitRequiredMod && cardDir.GetCrawlExitRequiredMod)
            {
                if (movementResultModel.Method.ToLower() == "jump" || movementResultModel.Method.ToLower() == "crawl")
                {
                    methodIsSuitable = true;
                }
                else
                {
                    // must either jump or crawl
                    if (cardDir.GetWalkingMethodNotAllowedDisp != null)
                    {
                        Console.WriteLine(cardDir.GetWalkingMethodNotAllowedDisp, movementResultModel.BaseActionVerb);
                    }
                }
            }
            else if (!cardDir.GetJumpExitRequiredMod && !cardDir.GetCrawlExitRequiredMod)
            {
                methodIsSuitable = true;
            }

            if (!methodIsSuitable)
            {
                return;
            }


            if (speedIsSuitable && methodIsSuitable)
            {
                if (cardDir.GetExitOpenDisp != null)
                {
                    Console.WriteLine(cardDir.GetExitOpenDisp, movementResultModel.BaseActionVerb);
                }
                _roomMachine.TryFire(cardDir.FetchRoomTrigger);
                return;
            }
        }
Пример #2
0
        public void Execute()
        {
            if (AnyNullReferences())
            {
                throw new NullReferenceException("ERROR: One or more required references haven't been injected into MovementCommand");
            }

            var movementResultModel = (MovementResultModel)_resultModel;

            var currentRoomDetails = _roomsStates.rooms.Single(r => r.id == _roomMachine.State.FetchIdentifier());

            ICardDir cardDir = null;

            var stopLoopFlag             = false;
            var somethingWrittenToScreen = false;

            // If player specifies both a cardinal direction and a location (e.g. command: "go south to the hallway") and both the cardinal direction and location matches the same direction, process it as valid
            if (_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.CardinalDirection)) &&
                _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirection)) &&
                _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirectionRoomIds)) &&
                !(_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.UnknownLocationDirection))))
            {
                foreach (var locationDirectionRoomId in movementResultModel.LocationDirectionRoomIds)
                {
                    if (!stopLoopFlag)
                    {
                        if (movementResultModel.CardinalDirection.ToLower() == "south")
                        {
                            if (locationDirectionRoomId == currentRoomDetails.south)
                            {
                                cardDir      = new SouthCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                                stopLoopFlag = true;
                            }
                        }
                        else if (movementResultModel.CardinalDirection.ToLower() == "north")
                        {
                            if (locationDirectionRoomId == currentRoomDetails.north)
                            {
                                cardDir      = new NorthCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                                stopLoopFlag = true;
                            }
                        }
                        else if (movementResultModel.CardinalDirection.ToLower() == "east")
                        {
                            if (locationDirectionRoomId == currentRoomDetails.east)
                            {
                                cardDir      = new EastCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                                stopLoopFlag = true;
                            }
                        }
                        else if (movementResultModel.CardinalDirection.ToLower() == "west")
                        {
                            if (locationDirectionRoomId == currentRoomDetails.west)
                            {
                                cardDir      = new WestCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                                stopLoopFlag = true;
                            }
                        }
                        else if (movementResultModel.CardinalDirection.ToLower() == "up")
                        {
                            if (locationDirectionRoomId == currentRoomDetails.up)
                            {
                                cardDir      = new UpCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                                stopLoopFlag = true;
                            }
                        }
                        else if (movementResultModel.CardinalDirection.ToLower() == "down")
                        {
                            if (locationDirectionRoomId == currentRoomDetails.down)
                            {
                                cardDir      = new DownCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                                stopLoopFlag = true;
                            }
                        }
                    }
                }
                if (!stopLoopFlag)
                {
                    Console.WriteLine(_displayablesRepo.GetADisplayables <DefaultsDisplayables>().GetDisplayable <DefaultsDisplayables.MovementDefaults>().differentDirections);
                    somethingWrittenToScreen = true;
                }
            }

            // If player specifies just a a location (e.g. command: "go to the hallway"), but this location has no game room id associated with it (i.e. this "location" is within the same room as the player)
            // WARNING: This should never actually happen, as any "locations" not associated with a room should be instead put into the POI lex.
            else if (!_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.CardinalDirection)) &&
                     _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirection)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirectionRoomIds)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.UnknownLocationDirection)))
            {
                Console.WriteLine(_displayablesRepo.GetADisplayables <DefaultsDisplayables>().GetDisplayable <DefaultsDisplayables.MovementDefaults>().locationWithNoRoomIdDefault, movementResultModel.LocationDirection);
                somethingWrittenToScreen = true;
            }

            // If player specifies just a a location with an associated room id (e.g. command: "go to the hallway"), then process this as valid.
            else if (!_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.CardinalDirection)) &&
                     _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirection)) &&
                     _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirectionRoomIds)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.UnknownLocationDirection)))
            {
                foreach (var locationDirectionRoomId in movementResultModel.LocationDirectionRoomIds)
                {
                    if (!stopLoopFlag)
                    {
                        if (currentRoomDetails.south == locationDirectionRoomId)
                        {
                            cardDir      = new SouthCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                            stopLoopFlag = true;
                        }
                        else if (currentRoomDetails.north == locationDirectionRoomId)
                        {
                            cardDir      = new NorthCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                            stopLoopFlag = true;
                        }
                        else if (currentRoomDetails.east == locationDirectionRoomId)
                        {
                            cardDir      = new EastCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                            stopLoopFlag = true;
                        }
                        else if (currentRoomDetails.west == locationDirectionRoomId)
                        {
                            cardDir      = new WestCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                            stopLoopFlag = true;
                        }
                        else if (currentRoomDetails.up == locationDirectionRoomId)
                        {
                            cardDir      = new UpCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                            stopLoopFlag = true;
                        }
                        else if (currentRoomDetails.down == locationDirectionRoomId)
                        {
                            cardDir      = new DownCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                            stopLoopFlag = true;
                        }
                        // The player is trying to move to the room that the player is already currently within
                        else if (currentRoomDetails.id == locationDirectionRoomId)
                        {
                            Console.WriteLine(_displayablesRepo.GetADisplayables <DefaultsDisplayables>().GetDisplayable <DefaultsDisplayables.MovementDefaults>().sameLocation);
                            somethingWrittenToScreen = true;
                            stopLoopFlag             = true;
                        }
                    }
                }
            }


            else if (_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.CardinalDirection)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirection)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirectionRoomIds)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.UnknownLocationDirection)))
            {
                switch (movementResultModel.CardinalDirection.ToLower())
                {
                case "south":
                    cardDir = new SouthCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                    break;

                case "north":
                    cardDir = new NorthCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                    break;

                case "east":
                    cardDir = new EastCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                    break;

                case "west":
                    cardDir = new WestCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                    break;

                case "up":
                    cardDir = new UpCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                    break;

                case "down":
                    cardDir = new DownCardDir(_displayablesRepo, currentRoomDetails, _roomsTriggers);
                    break;
                }
            }

            else if (!_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.CardinalDirection)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirection)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirectionRoomIds)) &&
                     _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.UnknownLocationDirection)))
            {
                Console.WriteLine(_displayablesRepo.GetADisplayables <DefaultsDisplayables>().GetDisplayable <DefaultsDisplayables.MovementDefaults>().unknownLocationDirection, movementResultModel.UnknownLocationDirection);
                somethingWrittenToScreen = true;
            }

            else if (_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.CardinalDirection)) &&
                     _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirection)) &&
                     _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirectionRoomIds)) &&
                     _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.UnknownLocationDirection)))
            {
                Console.WriteLine(_displayablesRepo.GetADisplayables <DefaultsDisplayables>().GetDisplayable <DefaultsDisplayables.MovementDefaults>().differentDirections);
                somethingWrittenToScreen = true;
            }

            else if (_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.CardinalDirection)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirection)) &&
                     !_resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.LocationDirectionRoomIds)) &&
                     _resultModelPropsChanged.Contains(ReflectionHelper.GetPropertyName((MovementResultModel m) => m.UnknownLocationDirection)))
            {
                Console.WriteLine(_displayablesRepo.GetADisplayables <DefaultsDisplayables>().GetDisplayable <DefaultsDisplayables.MovementDefaults>().differentDirections);
                somethingWrittenToScreen = true;
            }


            if (cardDir != null)
            {
                ProcessMovementFromCardDir(cardDir, movementResultModel);
            }
            else if (!somethingWrittenToScreen)
            {
                Console.WriteLine(_displayablesRepo.GetADisplayables <DefaultsDisplayables>().GetDisplayable <DefaultsDisplayables.MovementDefaults>().misunderstoodDirection);
            }
        }