From 68dd8c578f8ac52239b4c881aa633e295560ced8 Mon Sep 17 00:00:00 2001
From: Adam Whitehurst <Adam.Whitehurst@live.com>
Date: Thu, 12 Mar 2020 07:36:02 -0700
Subject: [PATCH] Add some ability costs

---
 common/src/comp/ability.rs | 14 ++++++++++----
 common/src/states/utils.rs | 25 +++++++++++++++----------
 2 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index bc10cc31d0..dc6b793961 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -2,14 +2,20 @@ use specs::{Component, DenseVecStorage, FlaggedStorage, HashMapStorage};
 
 #[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
 pub enum AbilityState {
-    BasicAttack,
+    BasicAttack {
+        /// Amount of energy required to use ability
+        cost: i32,
+    },
     BasicBlock,
     Roll,
     ChargeAttack,
-    TimedCombo,
+    TimedCombo {
+        /// Amount of energy required to use ability
+        cost: i32,
+    },
 }
 impl Default for AbilityState {
-    fn default() -> Self { Self::BasicAttack }
+    fn default() -> Self { Self::BasicAttack { cost: -100 } }
 }
 
 impl Component for AbilityState {
@@ -27,7 +33,7 @@ pub struct AbilityPool {
 impl Default for AbilityPool {
     fn default() -> Self {
         Self {
-            primary: Some(AbilityState::BasicAttack),
+            primary: Some(AbilityState::default()),
             // primary: Some(AbilityState::TimedCombo),
             secondary: Some(AbilityState::BasicBlock),
             block: None,
diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs
index 0859b83114..7c02539108 100644
--- a/common/src/states/utils.rs
+++ b/common/src/states/utils.rs
@@ -192,7 +192,7 @@ pub fn handle_primary_input(data: &JoinData, update: &mut StateUpdate) {
 /// Attempts to go into `ability_pool.primary` if is `Some()` on `AbilityPool`
 pub fn attempt_primary_ability(data: &JoinData, update: &mut StateUpdate) {
     if let Some(ability_state) = data.ability_pool.primary {
-        update.character = ability_to_character_state(data, ability_state);
+        update.character = ability_to_character_state(data, update, ability_state);
     }
 }
 
@@ -209,7 +209,7 @@ pub fn handle_secondary_input(data: &JoinData, update: &mut StateUpdate) {
 /// Attempts to go into `ability_pool.secondary` if is `Some()` on `AbilityPool`
 pub fn attempt_seconday_ability(data: &JoinData, update: &mut StateUpdate) {
     if let Some(ability_state) = data.ability_pool.secondary {
-        update.character = ability_to_character_state(data, ability_state);
+        update.character = ability_to_character_state(data, update, ability_state);
     }
 }
 
@@ -233,7 +233,7 @@ pub fn handle_dodge_input(data: &JoinData, update: &mut StateUpdate) {
 
 pub fn attempt_dodge_ability(data: &JoinData, update: &mut StateUpdate) {
     if let Some(ability_state) = data.ability_pool.dodge {
-        update.character = ability_to_character_state(data, ability_state);
+        update.character = ability_to_character_state(data, update, ability_state);
     }
 }
 
@@ -242,17 +242,22 @@ pub fn attempt_dodge_ability(data: &JoinData, update: &mut StateUpdate) {
 
 /// Maps from `AbilityState`s to `CharacterStates`s. Also handles intializing
 /// the new `CharacterState`
-pub fn ability_to_character_state(data: &JoinData, ability_state: AbilityState) -> CharacterState {
+pub fn ability_to_character_state(
+    data: &JoinData,
+    update: &mut StateUpdate,
+    ability_state: AbilityState,
+) -> CharacterState {
     match ability_state {
-        AbilityState::BasicAttack { .. } => {
-            if let Some(tool) = unwrap_tool_data(data) {
-                CharacterState::BasicAttack {
+        AbilityState::BasicAttack { cost, .. } => {
+         if let Some(tool) = unwrap_tool_data(data) {
+             if update.energy.try_change_by(cost, EnergySource::HitEnemy).is_ok() {
+                return CharacterState::BasicAttack {
                     exhausted: false,
                     remaining_duration: tool.attack_duration(),
-                }
-            } else {
-                *data.character
+                };
             }
+        }
+                *data.character
         },
         AbilityState::BasicBlock { .. } => CharacterState::BasicBlock {},
         AbilityState::Roll { .. } => CharacterState::Roll {