/// <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); }; }