示例#1
0
        // ReSharper disable once CyclomaticComplexity
        public Option <ICommand> HandleKeyInput(int key)
        {
            Player player = Game.Player;

            switch (InputMapping.GetNormalInput(key))
            {
            case NormalInput.None:
                return(Option.None <ICommand>());

                #region Movement Keys
            case NormalInput.MoveW:
                return(Option.Some <ICommand>(new MoveCommand(player, player.Pos + Direction.W)));

            case NormalInput.MoveS:
                return(Option.Some <ICommand>(new MoveCommand(player, player.Pos + Direction.S)));

            case NormalInput.MoveN:
                return(Option.Some <ICommand>(new MoveCommand(player, player.Pos + Direction.N)));

            case NormalInput.MoveE:
                return(Option.Some <ICommand>(new MoveCommand(player, player.Pos + Direction.E)));

            case NormalInput.MoveNW:
                return(Option.Some <ICommand>(new MoveCommand(player, player.Pos + Direction.NW)));

            case NormalInput.MoveNE:
                return(Option.Some <ICommand>(new MoveCommand(player, player.Pos + Direction.NE)));

            case NormalInput.MoveSW:
                return(Option.Some <ICommand>(new MoveCommand(player, player.Pos + Direction.SW)));

            case NormalInput.MoveSE:
                return(Option.Some <ICommand>(new MoveCommand(player, player.Pos + Direction.SE)));

            case NormalInput.Wait:
                return(Option.Some <ICommand>(new WaitCommand(player)));

                #endregion

            case NormalInput.Cast:
                int spellnum = key - BearLib.Terminal.TK_1;
                if (spellnum >= player.SpellList.Count)
                {
                    return(Option.None <ICommand>());
                }

                Spell.ISpell spell = player.SpellList[spellnum];
                return(CastSpell(player, spellnum, spell));

            case NormalInput.Get:
                return(Game.MapHandler.GetItem(player.Pos)
                       .FlatMap(item => Option.Some <ICommand>(new PickupCommand(player, item))));

            case NormalInput.OpenMenu:
                Game.Exit();
                return(Option.None <ICommand>());
            }

            return(Option.None <ICommand>());
        }
示例#2
0
        private static Option <ICommand> CastSpell(Player player, int spellnum, Spell.ISpell spell)
        {
            int mainMana    = spell.Cost.MainManaUsed();
            int altMana     = spell.Cost.AltManaUsed();
            int minMainCost = spell.Cost.MainCost.Item1;
            int minAltCost  = spell.Cost.AltCost.Item1;

            if (mainMana < minMainCost || mainMana < minAltCost)
            {
                Game.MessagePanel.AddMessage("Not enough mana");
                return(Option.None <ICommand>());
            }

            if (spell.Instant)
            {
                // TODO: multi-hitting instants
                return(spell.Zone.GetAllValidTargets(player.Pos)
                       .Random(Game.Rand)
                       .FlatMap(cursor =>
                {
                    IEnumerable <Loc> targets = spell.Zone.GetTilesInRange(player.Pos, cursor);
                    PaySpellCost(player, spell, mainMana, altMana);

                    return Option.Some(spell.Evoke(player, targets, (mainMana, altMana)));
                }));
            }
            else
            {
                Game.StateHandler.PushState(
                    new TargettingState(player, spell.Zone, spellnum, targets =>
                {
                    if (!targets.Any())
                    {
                        return(Option.None <ICommand>());
                    }

                    PaySpellCost(player, spell, mainMana, altMana);
                    Game.StateHandler.PopState();

                    return(Option.Some(spell.Evoke(player, targets, (mainMana, altMana))));
                }));