Exemple #1
0
        /// <summary>
        /// Create a callback function to process if the player chooses to have a character attack. This callback will display the targetting grid
        /// and bind _aimAbility to a function that queues an attack command from the character onto the target.
        /// </summary>
        /// <param name="character">The character whose attack is being chosen.</param>
        /// <param name="ability">The ability currently being aimed.</param>
        /// <returns></returns>
        private void SelectAbilityTarget(Combatant character, Ability ability)
        {
            _state = BattleState.AimingAbility;
            Gui.Screen.Desktop.Children.Remove(_radialMenuControl);


            _battleBoardLayer.SetTargettingGrid(
                ability.Name == "Move" ?
                character.GetMovementGrid(BattleBoard.GetAccessibleGrid(character.Faction)) :
                ability.GenerateTargetGrid(BattleBoard.Sandbag.Clone()),
                ability.GenerateImpactGrid()
                );

            _battleBoardLayer.AbilityAim = true;

            _aimAbility = (x, y) =>
            {
                // only target enemies with angry spells and allies with friendly spells
                if (!ability.CanTarget(BattleBoard.IsOccupied(new Point(x, y))))
                {
                    return(false);
                }

                character.Avatar.UpdateVelocity(x - character.Avatar.Location.X, y - character.Avatar.Location.Y);
                character.Avatar.UpdateVelocity(0, 0);

                // make sure the ability knows who is casting it. this probably shouldn't
                // be done here, but there are issues doing it elsewhere.
                ability.Character = character;

                var command = new Command
                {
                    Character = character,
                    Target    = new Point(x, y),
                    Ability   = ability
                };

                if (ability.Name == "Move")
                {
                    ExecuteCommand(command);
                    return(true);
                }

                character.CanAct = false;
                QueuedCommands.Add(command);
                _queuedCommands.UpdateControls();
                _state      = BattleState.Delay;
                _delayState = BattleState.PlayerTurn;
                _delayTimer = 0.05F;
                ResetState();

                return(true);
            };
        }