Example #1
0
        private void ShowItemDialog(ItemDialogUsage usage)
        {
            var itemDialog = new ItemDialog(_gameState.Game);

            switch (usage)
            {
            case ItemDialogUsage.Drop:
            {
                itemDialog.Drop();
                break;
            }

            case ItemDialogUsage.PickUp:
            {
                itemDialog.PickUp();
                break;
            }

            case ItemDialogUsage.Toss:
            {
                itemDialog.Toss();
                break;
            }

            case ItemDialogUsage.Use:
            {
                itemDialog.Use();
                break;
            }

            default:
            {
                throw new ApplicationException("Invalid/Unhandled ItemDialogUsage");
            }
            }

            itemDialog.Process();
            var result = itemDialog.DialogResult;

            if (result == null)
            {
                return;
            }

            if (result.RequiresTargetDialog)
            {
                // This will clear the screen of anything the dialog overwrote.
                Draw();
                var targetDialog = new TargetDialog(result.Item.type.tossAttack.Range, (target) => result.Command.SelectItem(_gameState.Game, result.Item, result.Location, result.ItemIndex, target), _gameState.Game);
                targetDialog.Process();
            }
            else
            {
                result.Command.SelectItem(_gameState.Game, result.Item, result.Location, result.ItemIndex, null);
            }
        }
Example #2
0
        /// <summary>
        ///     The return is to exit the Game
        /// </summary>
        /// <returns></returns>
        public override bool HandleInput()
        {
            var originalColor = Console.ForegroundColor;

            Console.ForegroundColor = ConsoleColor.Black;

            var inputs = Inputs.Instance;

            var lastInput = GetPlayerInput();

            Console.ForegroundColor = originalColor;

            var exitGameLoop = false;

            Action action = null;

            //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            // Player Actions.
            //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            if (lastInput == inputs.forfeit)
            {
                var dialog = new ForfeitDialog(_gameState.Game);
                dialog.Process();
                var result = dialog.DialogResult;
                if (result == ForfeitDialogResult.Yes)
                {
                    ScreenResult = new ScreenTransitionResult {
                        FromScreen = ScreenType.InGame, ToScreen = ScreenType.MainMenu, Result = null
                    };
                    Storage.Heroes.RemoveAll(x => x.Name == _gameState.Game.Hero.Name);
                    Storage.Save();
                    exitGameLoop = true;
                }
            } // Input.forfeit,
            else if (lastInput == inputs.quit)
            {
                var dialog = new ConfirmDialog("Are you sure you want to quit the game?");
                dialog.Process();
                var result = dialog.DialogResult;
                if (result == ConfirmDialogResult.Yes)
                {
                    ScreenResult = new ScreenTransitionResult {
                        FromScreen = ScreenType.InGame, ToScreen = ScreenType.MainMenu, Result = null
                    };
                    Storage.Update(_gameState);

                    Storage.Save();
                    exitGameLoop = true;
                }
            } // Input.quit,
            else if (lastInput == inputs.closeDoor)
            {
                // See how many adjacent open doors there are.
                var doors = new List <VectorBase>();
                foreach (var direction in Direction.All)
                {
                    var pos = _gameState.Game.Hero.Position + direction;
                    if (_gameState.Game.CurrentStage[pos].Type.ClosesTo != null)
                    {
                        doors.Add(pos);
                    }
                }

                if (doors.Count == 0)
                {
                    _gameState.Game.Log.Error("You are not next to an open door.");
                }
                else if (doors.Count == 1)
                {
                    _gameState.Game.Hero.SetNextAction(new CloseDoorAction(doors[0]));
                }
                else
                {
                    var closeDoorDialog = new CloseDoorDialog(_gameState.Game);
                    closeDoorDialog.Process();
                }
            } // Input.closeDoor,
            else if (lastInput == inputs.drop)
            {
                ShowItemDialog(ItemDialogUsage.Drop);
            } // Input.drop,
            else if (lastInput == inputs.use)
            {
                ShowItemDialog(ItemDialogUsage.Use);
            } // Input.use,
            else if (lastInput == inputs.pickUp)
            {
                var items = _gameState.Game.CurrentStage.itemsAt(_gameState.Game.Hero.Position);

                if (items.Count > 1)
                {
                    // Show item dialog if there are multiple things to pick up.
                    ShowItemDialog(ItemDialogUsage.PickUp);
                }
                else
                {
                    // Otherwise attempt to pick up any available item.
                    _gameState.Game.Hero.SetNextAction(new PickUpAction(items.Count - 1));
                }
            } // Input.pickUp,
            else if (lastInput == inputs.swap)
            {
                if (_gameState.Game.Hero.Inventory.lastUnequipped == -1)
                {
                    _gameState.Game.Log.Error("You aren't holding an unequipped item to swap.");
                }
                else
                {
                    action = new EquipAction(ItemLocations.Inventory, _gameState.Game.Hero.Inventory.lastUnequipped);
                }
            } // Input.swap,
            else if (lastInput == inputs.toss)
            {
                ShowItemDialog(ItemDialogUsage.Toss);
            } // Input.toss,
            else if (lastInput == inputs.selectCommand)
            {
                var commands = _gameState.Game.Hero.HeroClass.Commands.Where(cmd => cmd.CanUse(_gameState.Game));

                if (!commands.Any())
                {
                    _gameState.Game.Log.Error("You don't have any commands you can perform.");
                }
                else
                {
                    Command commandToProcess = null;
                    if (commands.Count() > 1)
                    {
                        var dialog = new SelectCommandDialog(_gameState.Game);
                        dialog.Process();
                        commandToProcess = dialog.DialogResult;
                    }
                    else
                    {
                        commandToProcess = commands.First();
                    }

                    if (commandToProcess is TargetCommand)
                    {
                        var targetCommand = commandToProcess as TargetCommand;

                        // If we still have a visible target, use it.
                        if (_gameState.Game.Target != null && _gameState.Game.Target.IsAlive && _gameState.Game.CurrentStage[_gameState.Game.Target.Position].Visible)
                        {
                            _gameState.Game.Hero.SetNextAction(targetCommand.GetTargetAction(_gameState.Game, _gameState.Game.Target.Position));
                        }
                        else
                        {
                            // No current target, so ask for one.
                            var targetDialog = new TargetDialog(targetCommand.GetRange(_gameState.Game), (target) => _gameState.Game.Hero.SetNextAction(targetCommand.GetTargetAction(_gameState.Game, target)), _gameState.Game);
                            targetDialog.Process();
                        }
                    }
                    else if (commandToProcess is DirectionCommand)
                    {
                        var directionCommand = commandToProcess as DirectionCommand;
                        var directionDialog  = new DirectionDialog(directionCommand, _gameState.Game);
                        directionDialog.Process();
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                }
            } // Input.selectCommand,

            else if (lastInput == inputs.stats)
            {
                ShowHeroStatisticsDialog();
            } // Input.HeroStatistics,
            else if (lastInput.Key == ConsoleKey.Z)
            {
                ShowStorageDialog();
            } // Storage
            else if (lastInput.Key == ConsoleKey.Oem3)
            {
                ShowConsoleDialog();
            } // Storage

            //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            // Running Options
            //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            else if (lastInput == inputs.runNW)
            {
                _gameState.Game.Hero.Run(Direction.NorthWest);
            }                                                                                      // Input.runNW,
            else if (lastInput == inputs.runN)
            {
                _gameState.Game.Hero.Run(Direction.North);
            }                                                                                 // Input.runN,
            else if (lastInput == inputs.runNE)
            {
                _gameState.Game.Hero.Run(Direction.NorthEast);
            }                                                                                      // Input.runNE,
            else if (lastInput == inputs.runW)
            {
                _gameState.Game.Hero.Run(Direction.West);
            }                                                                                // Input.runW,
            else if (lastInput == inputs.runE)
            {
                _gameState.Game.Hero.Run(Direction.East);
            }                                                                                // Input.runE, SemiColon
            else if (lastInput == inputs.runSW)
            {
                _gameState.Game.Hero.Run(Direction.SouthWest);
            }                                                                                      // Input.runSW,
            else if (lastInput == inputs.runS)
            {
                _gameState.Game.Hero.Run(Direction.South);
            }                                                                                 // Input.runS,
            else if (lastInput == inputs.runSE)
            {
                _gameState.Game.Hero.Run(Direction.SouthEast);
            }                                                                                      // Input.runSE, Slash (FWD)

            //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            // Firing Options
            //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            else if (lastInput == inputs.fireNW)
            {
                FireTowards(Direction.NorthWest);
            }                                                                          // Input.fireNW,
            else if (lastInput == inputs.fireN)
            {
                FireTowards(Direction.North);
            }                                                                     // Input.fireN,
            else if (lastInput == inputs.fireNE)
            {
                FireTowards(Direction.NorthEast);
            }                                                                          // Input.fireNE,
            else if (lastInput == inputs.fireW)
            {
                FireTowards(Direction.West);
            }                                                                    // Input.fireW,
            else if (lastInput == inputs.fireE)
            {
                FireTowards(Direction.East);
            }                                                                    // Input.fireE,
            else if (lastInput == inputs.fireSW)
            {
                FireTowards(Direction.SouthWest);
            }                                                                          // Input.fireSW,
            else if (lastInput == inputs.fireS)
            {
                FireTowards(Direction.South);
            }                                                                     // Input.fireS,
            else if (lastInput == inputs.fireSE)
            {
                FireTowards(Direction.SouthEast);
            }                                                                          // Input.fireSE,

            //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            // directions.
            //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            else if (lastInput == inputs.nw)
            {
                action = new WalkAction(Direction.NorthWest);
            }                                                                                  // Input.nw,
            else if (lastInput == inputs.n)
            {
                action = new WalkAction(Direction.North);
            }                                                                             // Input.n,
            else if (lastInput == inputs.ne)
            {
                action = new WalkAction(Direction.NorthEast);
            }                                                                                  // Input.ne,
            else if (lastInput == inputs.w)
            {
                action = new WalkAction(Direction.West);
            }                                                                            // Input.w,
            else if (lastInput == inputs.rest)
            {
                action = new RestAction();
            }                                                                 // Input.l,
            else if (lastInput == inputs.e)
            {
                action = new WalkAction(Direction.East);
            }                                                                            // Input.e,
            else if (lastInput == inputs.sw)
            {
                action = new WalkAction(Direction.SouthWest);
            }                                                                                  // Input.sw,
            else if (lastInput == inputs.s)
            {
                action = new WalkAction(Direction.South);
            }                                                                             // Input.s,
            else if (lastInput == inputs.se)
            {
                action = new WalkAction(Direction.SouthEast);
            }                                                                                  // Input.se,

            //Check if we have a non-zero value for horizontal or vertical
            if (action != null)
            {
                //UnityEngine.Debugger.Log("Adding action for Hero");
                GameState.Instance.Game.Hero.SetNextAction(action);
            }

            return(exitGameLoop);
        }