From cfee1a107b16b7f1304fb1871f8db3bef1526f37 Mon Sep 17 00:00:00 2001
From: Susan Yuen <susan_loves_cheese@hotmail.com>
Date: Fri, 4 Nov 2016 15:34:47 -0400
Subject: [PATCH] Attacking now works. Changed MenuButton class to Button
 class, incorporated attackConfirm button with other buttons. Wrote function
 determining whether enemy unit is in range. Fixed a lot of attacking logic.

---
 .../Blaze_Brigade/Blaze_Brigade.csproj        |   2 +-
 .../{MenuButton.cs => Button.cs}              |  10 +-
 src/Blaze-Brigade/Blaze_Brigade/Game.cs       |  20 +-
 .../Blaze_Brigade/GameFunction.cs             |  26 ++-
 .../Blaze_Brigade/MouseHandler.cs             | 120 ++++++------
 src/Blaze-Brigade/Blaze_Brigade/Unit.cs       |  18 +-
 src/Blaze-Brigade/Blaze_Brigade/Warrior.cs    | 178 +++++++++++-------
 7 files changed, 216 insertions(+), 158 deletions(-)
 rename src/Blaze-Brigade/Blaze_Brigade/{MenuButton.cs => Button.cs} (84%)

diff --git a/src/Blaze-Brigade/Blaze_Brigade/Blaze_Brigade.csproj b/src/Blaze-Brigade/Blaze_Brigade/Blaze_Brigade.csproj
index 4e5c91f..7fa8639 100644
--- a/src/Blaze-Brigade/Blaze_Brigade/Blaze_Brigade.csproj
+++ b/src/Blaze-Brigade/Blaze_Brigade/Blaze_Brigade.csproj
@@ -105,7 +105,7 @@
     <Compile Include="MainMenu.Designer.cs">
       <DependentUpon>MainMenu.cs</DependentUpon>
     </Compile>
-    <Compile Include="MenuButton.cs" />
+    <Compile Include="Button.cs" />
     <Compile Include="MouseHandler.cs" />
     <Compile Include="Node.cs" />
     <Compile Include="Player.cs" />
diff --git a/src/Blaze-Brigade/Blaze_Brigade/MenuButton.cs b/src/Blaze-Brigade/Blaze_Brigade/Button.cs
similarity index 84%
rename from src/Blaze-Brigade/Blaze_Brigade/MenuButton.cs
rename to src/Blaze-Brigade/Blaze_Brigade/Button.cs
index 7905d35..2ac56c0 100644
--- a/src/Blaze-Brigade/Blaze_Brigade/MenuButton.cs
+++ b/src/Blaze-Brigade/Blaze_Brigade/Button.cs
@@ -8,14 +8,14 @@ using Microsoft.Xna.Framework.Graphics;
 namespace View
 {
     // used for the drop down menu buttons when selecting units
-    class MenuButton
+    class Button
     {
-        private MenuButtonType buttonType;      // holds the button type
+        private ButtonType buttonType;      // holds the button type
         private Vector2 pixelCoordinates;       // holds the coordinates of the menu button in question
         private Texture2D buttonImage;
         private bool isActive;
 
-        public MenuButton(MenuButtonType type, Vector2 coordinates, Texture2D image)
+        public Button(ButtonType type, Vector2 coordinates, Texture2D image)
         {
             buttonType = type;
             pixelCoordinates = coordinates;
@@ -28,7 +28,7 @@ namespace View
             return pixelCoordinates;
         }
 
-        public MenuButtonType getButtonType()
+        public ButtonType getButtonType()
         {
             return buttonType;
         }
@@ -57,7 +57,7 @@ namespace View
         }
     }
 
-    enum MenuButtonType
+    enum ButtonType
     {
         Attack,
         AttackConfirm,
diff --git a/src/Blaze-Brigade/Blaze_Brigade/Game.cs b/src/Blaze-Brigade/Blaze_Brigade/Game.cs
index 6349f11..200b225 100644
--- a/src/Blaze-Brigade/Blaze_Brigade/Game.cs
+++ b/src/Blaze-Brigade/Blaze_Brigade/Game.cs
@@ -263,7 +263,6 @@ namespace Controller
                             #region Highlight nodes
                             if (GameState.beforeMove) // if unit has yet to move, display the overall move and attack range of unit
                             {
-                                
                                 // Highlight movable nodes in blue
                                 foreach (Node move in GameState.moveableNodes)
                                 {
@@ -294,16 +293,17 @@ namespace Controller
                             #region Drop Down menu
                             if (GameState.dropDownMenuOpen) // if dropDowMenu should be opened, draw dropDownMenu
                             {
-                                unit.setMenuButtonCoordinates(unit.PixelCoordinates);
-                                foreach (MenuButton button in unit.getMenuButtons())
+                                unit.setButtonCoordinates(unit.PixelCoordinates);
+                                foreach (Button button in unit.getButtons())
                                 {
-                                    if (button.getActive())
+                                    if (button.getActive() && button.getButtonType() != ButtonType.AttackConfirm)
                                     {
                                         spriteBatch.Draw(button.getImage(), button.getPixelCoordinates(), null, Color.White, 0, Vector2.Zero, 1f, SpriteEffects.None, 0f);
                                     }
                                 }
                             }
-                            MenuButton confirmButton = unit.getAttackConfirmButton();
+
+                            Button confirmButton = unit.getButtonOfType(ButtonType.AttackConfirm);
                             Vector2 attackInfoLocation2 = new Vector2(519, 0);
                             if (GameState.attackConfirmOpen)
                             {
@@ -372,11 +372,11 @@ namespace Controller
         //method to return a unit: takes in unit type (warrior/mage/ranger), unit position, and which player's unit (since different model/colors)
         private Unit getNewUnit(UnitType unitType, Vector2 unitPosition, int player)
         {
-            MenuButton attackButton = new MenuButton(MenuButtonType.Attack, unitPosition, Content.Load<Texture2D>("attack"));
-            MenuButton moveButton = new MenuButton(MenuButtonType.Move, unitPosition, Content.Load<Texture2D>("move"));
-            MenuButton itemButton = new MenuButton(MenuButtonType.Items, unitPosition, Content.Load<Texture2D>("items")); ;
-            MenuButton waitButton = new MenuButton(MenuButtonType.Wait, unitPosition, Content.Load<Texture2D>("wait")); ;
-            MenuButton attackConfirmButton = new MenuButton(MenuButtonType.AttackConfirm, unitPosition, Content.Load<Texture2D>("attack"));
+            Button attackButton = new Button(ButtonType.Attack, unitPosition, Content.Load<Texture2D>("attack"));
+            Button moveButton = new Button(ButtonType.Move, unitPosition, Content.Load<Texture2D>("move"));
+            Button itemButton = new Button(ButtonType.Items, unitPosition, Content.Load<Texture2D>("items")); ;
+            Button waitButton = new Button(ButtonType.Wait, unitPosition, Content.Load<Texture2D>("wait")); ;
+            Button attackConfirmButton = new Button(ButtonType.AttackConfirm, unitPosition, Content.Load<Texture2D>("attack"));
 
             if (player == 1)
             {
diff --git a/src/Blaze-Brigade/Blaze_Brigade/GameFunction.cs b/src/Blaze-Brigade/Blaze_Brigade/GameFunction.cs
index fc9782d..7d4b26b 100644
--- a/src/Blaze-Brigade/Blaze_Brigade/GameFunction.cs
+++ b/src/Blaze-Brigade/Blaze_Brigade/GameFunction.cs
@@ -18,17 +18,33 @@ namespace Controller
             return false;
         }
 
+        // returns whether or not the enemy unit is within attack range of unit
+        public static bool isEnemyUnitInRange(Graph graph, Unit unit, Unit enemyUnit)
+        {
+            Node attackNode = graph.getNode(enemyUnit.Position.Item1, enemyUnit.Position.Item2);
+            return isNodeAttackable(unit.getClass(), unit.Position.Item1, unit.Position.Item2, attackNode);
+        }
+
         // sets all units to "not moved" upon start of a turn
         public static void startTurn(Player player)
         {
+            // set all buttons to active
             foreach (Unit unit in player.getUnits())
             {
-                MenuButton[] menuButtons = unit.getMenuButtons();
-                for (int i = 0; i < menuButtons.Count(); i++)
+                Button[] buttons = unit.getButtons();
+                for (int i = 0; i < buttons.Count(); i++)
                 {
-                    menuButtons[i].setActive(true);
+                    buttons[i].setActive(true);
                 }
             }
+
+            // sets all game states
+            GameState.playableUnitSelected = false;
+            GameState.selectedUnit = null;
+            GameState.unitToAttack = null;
+            GameState.dropDownMenuOpen = false;
+            GameState.attackConfirmOpen = false;
+            GameState.beforeMove = true;
         }
 
         // returns all enemy units in range of the specified unit
@@ -42,11 +58,11 @@ namespace Controller
         // checks if specified unit can perform actions
         public static bool hasUnitFinishedActions(Unit unit)
         {
-            if (!unit.isButtonActive(MenuButtonType.Attack))
+            if (!unit.isButtonActive(ButtonType.AttackConfirm))
             {
                 return true;
             }
-            if (!unit.isButtonActive(MenuButtonType.Wait))
+            if (!unit.isButtonActive(ButtonType.Wait))
             {
                 return true;
             }
diff --git a/src/Blaze-Brigade/Blaze_Brigade/MouseHandler.cs b/src/Blaze-Brigade/Blaze_Brigade/MouseHandler.cs
index 91545f9..ebe7d76 100644
--- a/src/Blaze-Brigade/Blaze_Brigade/MouseHandler.cs
+++ b/src/Blaze-Brigade/Blaze_Brigade/MouseHandler.cs
@@ -32,7 +32,11 @@ namespace Controller
                 && currentMouseState.RightButton == ButtonState.Pressed
                 && validX && validY && GameState.playableUnitSelected)
             {
-                    setSelectedUnit(null, false);
+                setSelectedUnit(null, false);
+                turnState = TurnState.Wait;
+                GameState.unitToAttack = null;
+                GameState.attackConfirmOpen = false;
+                GameState.dropDownMenuOpen = false;
             }
 
             // checks for single mouse left click inside the game window
@@ -57,7 +61,7 @@ namespace Controller
                     // determine if player has clicked on a menu button; if so, change turnState
                     if (getMenuButtonClicked(mouseClickCoordinates) != null)
                     {
-                        MenuButton menuButton = getMenuButtonClicked(mouseClickCoordinates);
+                        Button menuButton = getMenuButtonClicked(mouseClickCoordinates);
                         Debug.WriteLine(getMenuButtonClicked(mouseClickCoordinates).getButtonType());
                         buttonAction(menuButton);
                         return;
@@ -76,18 +80,25 @@ namespace Controller
                         // if path finder returns a non-null path, then end node is valid
                         if (path != null)
                         {
+                            GameState.selectedUnit.getButtonOfType(ButtonType.Move).setActive(false);   // move button no longer active
                             updateUnitPosition(graph, mouseClickCoordinates, path);
+                            GameState.beforeMove = false;
+                        }
+                        else
+                        {
+                            setSelectedUnit(null, false);       // if user clicks on invalid end node, deselect it
+                            turnState = TurnState.Wait;
                         }
                     }
 
-                    if(turnState==TurnState.Attack) //if a unit is clicked after attack is clicked
+                    if (turnState == TurnState.Attack) // if a unit is clicked after attack is clicked
                     {
-                        Unit unit = getPlayableUnitOnNodeClicked(graph.getNode(mouseClickCoordinates), mouseClickCoordinates, GameState.currentPlayer);
-                        if (unit != null)
-                    {
-                            setAttackedUnit(unit, true);
-                            GameState.attackConfirmOpen = true; //opens attack confirm button
-                            unit.getAttackConfirmButton().setActive(true);
+                        // gets enemy unit where user clicked
+                        Unit unit = getUnitOnNodeClicked(graph.getNode(mouseClickCoordinates), mouseClickCoordinates, GameState.enemyPlayer);
+                        if (unit != null && GameFunction.isEnemyUnitInRange(graph, GameState.selectedUnit, unit))
+                        {
+                            GameState.unitToAttack = unit;      // set state of attacked unit
+                            GameState.attackConfirmOpen = true; // opens attack confirmation
                         }
                     }
                 }
@@ -96,13 +107,16 @@ namespace Controller
                 else
                 {
                     // if there is a playable, player-owned unit on position clicked, set selected unit status
-                    Unit unit = getPlayableUnitOnNodeClicked(graph.getNode(mouseClickCoordinates), mouseClickCoordinates, GameState.currentPlayer);
+                    Unit unit = getUnitOnNodeClicked(graph.getNode(mouseClickCoordinates), mouseClickCoordinates, GameState.currentPlayer);
                     if (unit != null)
                     {
                         setSelectedUnit(unit, true);
                         GameFunction.setMovableNodes(graph, unit);
-                        GameState.dropDownMenuOpen = (true);
-                        GameState.beforeMove = (true);
+                        GameState.dropDownMenuOpen = true;
+                        if (unit.getButtonOfType(ButtonType.Move).getActive())
+                        {
+                            GameState.beforeMove = true;
+                        }
                     }
                 }
 
@@ -117,18 +131,12 @@ namespace Controller
             GameState.selectedUnit = unit;
         }
 
-        //sets selection of unit to attack inside GameFunction 
-        private static void setAttackedUnit(Unit unit, bool selected)
-        {
-            GameState.unitToAttack = unit;
-        }
-
-        // if playable unit exists where user clicked, return it; else, return null
-        private static Unit getPlayableUnitOnNodeClicked(Node clickedNode, Vector2 positionClicked, Player currentPlayer)
+        // if unit exists where user clicked (that belongs to player), return it; else, return null
+        private static Unit getUnitOnNodeClicked(Node clickedNode, Vector2 positionClicked, Player player)
         {
-            for (int i = 0; i < currentPlayer.getNumOfUnits(); i++)
+            for (int i = 0; i < player.getNumOfUnits(); i++)
             {
-                Unit unit = currentPlayer.getUnits().ElementAt(i);
+                Unit unit = player.getUnits().ElementAt(i);
                 int unitX = unit.Position.Item1;
                 int unitY = unit.Position.Item2;
                 int clickedX = (int)Math.Floor(positionClicked.X / 32);
@@ -145,18 +153,17 @@ namespace Controller
         private static void updateUnitPosition(Graph graph, Vector2 position, LinkedList<Node> path)
         {
             Unit unit = GameState.selectedUnit;
-            GameState.isAnimating = (true);
+            GameState.isAnimating = true;
             // updates the unit's position to each node in the path (node by node)
             foreach (Node node in path)
             {
                 animateUnitPosition(graph, unit, node);
                 unit.Position = (new Tuple<int, int>(node.getPositionX(), node.getPositionY()));
                 node.unitOnNode = (unit);
-                GameState.dropDownMenuOpen = (true);
-                
+                GameState.dropDownMenuOpen = true;
+
             }
-            GameState.isAnimating = (false);
-            GameState.beforeMove = (false);
+            GameState.isAnimating = false;
         }
 
         private static void attackAnimation(int direction)
@@ -206,14 +213,14 @@ namespace Controller
             {
                 for (float i = originalLocationY; i <= originalLocationY + 8; i++)
                 {
-                    unit.PixelCoordinates = new Vector2(unit.PixelCoordinates.X , unit.PixelCoordinates.Y +1);
+                    unit.PixelCoordinates = new Vector2(unit.PixelCoordinates.X, unit.PixelCoordinates.Y + 1);
                     Game.Instance.Tick();
                     Thread.Sleep(10);
                 }
 
                 for (float i = unit.PixelCoordinates.Y; i > originalLocationY; i++)
                 {
-                    unit.PixelCoordinates = new Vector2(unit.PixelCoordinates.X , unit.PixelCoordinates.Y - 1);
+                    unit.PixelCoordinates = new Vector2(unit.PixelCoordinates.X, unit.PixelCoordinates.Y - 1);
                     Game.Instance.Tick();
                     Thread.Sleep(10);
                 }
@@ -286,55 +293,55 @@ namespace Controller
         }
 
         // returns a menu button that was clicked; if no menu button was clicked, returns null
-        private static MenuButton getMenuButtonClicked(Vector2 mouseCoordinates)
+        private static Button getMenuButtonClicked(Vector2 mouseCoordinates)
         {
             Unit unit = GameState.selectedUnit;
-            MenuButton[] menuButtons = unit.getMenuButtons();
-            int clickX = (int) mouseCoordinates.X;
-            int clickY = (int) mouseCoordinates.Y;
+            Button[] menuButtons = unit.getButtons();
+            int clickX = (int)mouseCoordinates.X;
+            int clickY = (int)mouseCoordinates.Y;
 
-            for (int i=0; i<menuButtons.Length; i++)
+            for (int i = 0; i < menuButtons.Length; i++)
             {
-                int buttonX = (int) menuButtons[i].getPixelCoordinates().X;
-                int buttonY = (int) menuButtons[i].getPixelCoordinates().Y;
-                if (buttonX <= clickX && clickX < buttonX+128 && buttonY <= clickY && clickY < buttonY+32)
+                int buttonX = (int)menuButtons[i].getPixelCoordinates().X;
+                int buttonY = (int)menuButtons[i].getPixelCoordinates().Y;
+                if (buttonX <= clickX && clickX < buttonX + 128 && buttonY <= clickY && clickY < buttonY + 32)
                 {
                     if (GameState.dropDownMenuOpen)
                     {
-                    return menuButtons[i];
+                        return menuButtons[i];
                     }
                 }
             }
-            int ButtonX = (int)unit.getAttackConfirmButton().getPixelCoordinates().X;
-            int ButtonY = (int)unit.getAttackConfirmButton().getPixelCoordinates().Y;
+
+            int ButtonX = (int)unit.getButtonOfType(ButtonType.AttackConfirm).getPixelCoordinates().X;
+            int ButtonY = (int)unit.getButtonOfType(ButtonType.AttackConfirm).getPixelCoordinates().Y;
             if (ButtonX <= clickX && clickX < ButtonX + 128 && ButtonY <= clickY && clickY < ButtonY + 32)
-            { 
+            {
                 if (GameState.attackConfirmOpen)
                 {
-                    return unit.getAttackConfirmButton();
+                    return unit.getButtonOfType(ButtonType.AttackConfirm);
                 }
             }
             return null;
         }
 
         // sets which menu option is selected
-        private static void buttonAction(MenuButton button)
+        private static void buttonAction(Button button)
         {
             // take action corresponding to which button was clicked
             Unit unit = GameState.selectedUnit;
             Unit unit2 = GameState.unitToAttack;
             switch (button.getButtonType())
             {
-                
-                case MenuButtonType.Attack:         // if attack clicked
+                case ButtonType.Attack:         // if attack clicked
                     turnState = TurnState.Attack;
                     GameState.dropDownMenuOpen = false;    // close the dropdownmenu when selecting who to attack
-                    button.setActive(false);  
                     break;
-                case MenuButtonType.AttackConfirm:         // if confirm attack clicked
+                case ButtonType.AttackConfirm:         // if confirm attack clicked
                     button.setActive(false);
-                    unit.getMenuButtonAt(1).setActive(false);
-                    int attackDirection=0;
+                    unit.getButtonOfType(ButtonType.Move).setActive(false);     // move button is no longer active
+                    unit.getButtonOfType(ButtonType.Attack).setActive(false);   // attack button is no longer active
+                    int attackDirection = 0;
                     if (unit.Position.Item1 < unit2.Position.Item1)
                     {
                         attackDirection = 0;
@@ -353,20 +360,21 @@ namespace Controller
                     }
                     attackAnimation(attackDirection);
                     GameState.attackConfirmOpen = false;
-                    GameState.dropDownMenuOpen = true;
+                    setSelectedUnit(null, false);
+                    turnState = TurnState.Wait;
                     break;
-                case MenuButtonType.Move:           // if moved is clicked
+                case ButtonType.Move:           // if moved is clicked
                     turnState = TurnState.Move;
                     GameState.dropDownMenuOpen = false;   // close the dropdownmenu when selecting where to move
-                    button.setActive(false);
                     break;
-                case MenuButtonType.Items:          // if item is clicked
+                case ButtonType.Items:          // if item is clicked
                     turnState = TurnState.Items;
                     GameState.dropDownMenuOpen = false;
                     break;
-                case MenuButtonType.Wait:           // if wait is clicked
+                case ButtonType.Wait:           // if wait is clicked
+                    turnState = TurnState.Wait;
                     GameState.dropDownMenuOpen = false;
-                    GameState.playableUnitSelected = false;
+                    setSelectedUnit(null, false);
                     button.setActive(false);
                     break;
 
@@ -375,4 +383,4 @@ namespace Controller
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/Blaze-Brigade/Blaze_Brigade/Unit.cs b/src/Blaze-Brigade/Blaze_Brigade/Unit.cs
index 7f9a1c9..5a6eaaa 100644
--- a/src/Blaze-Brigade/Blaze_Brigade/Unit.cs
+++ b/src/Blaze-Brigade/Blaze_Brigade/Unit.cs
@@ -23,27 +23,21 @@ namespace Model
         int getMovability();                    // returns the unit's movability (number of spaces the unit can move in one turn)
         int getStats(int i);                    // returns stat located at i (in order from 0-6: lvl, str, mag, skill, spd, def, res)
 
-
-       
-        
-        
-       
         void setEquippedWeapon(Weapon w);       // sets the unit's currently equipped weapon
         //void setEquipableWeapons(Weapon add);  // need to update the weapon array, put new weapon into it
-        bool isButtonActive(MenuButtonType buttonType);     // indicates whether a button has already been previously selected or not
-        void setMenuButtonCoordinates(Vector2 pixelCoordinates);    // sets the coordinates of menu buttons
+        bool isButtonActive(ButtonType buttonType);     // indicates whether a button has already been previously selected or not
+        void setButtonActive(ButtonType buttonType, bool active);
+        void setButtonCoordinates(Vector2 pixelCoordinates);    // sets the coordinates of menu buttons
         void animate(int direction);            // animate sprite walking the direction specified
         void setInitialStats();                 // sets initial unit stats upon creation
         Texture2D getSpriteImage();             // returns the sprite image of the unit
-        Texture2D getButtonImage(MenuButtonType buttonType);        // returns the button texture at index i
+        Texture2D getButtonImage(ButtonType buttonType);        // returns the button texture at index i
         Texture2D getCharInfo();                // returns the char info screen texture
         Texture2D getCharAttackInfo();          // returns the char attack info screen texture
         Tuple<int, int> Position { get; set;}   // gets and sets unit's position by tile
         Vector2 PixelCoordinates { get; set; }
-        MenuButton getMenuButtonAt(int i);
-        MenuButton getAttackConfirmButton();
-
-        MenuButton[] getMenuButtons();          // returns the dropdown menu buttons of the unit
+        Button[] getButtons();          // returns the dropdown menu buttons of the unit
+        Button getButtonOfType(ButtonType buttonType);
         Rectangle getCurrentFrame();            // returns the current sprite frame in animation sequence
         Weapon[] getEquipableWeapons();         // returns array of equipable weapons
         Weapon getEquippedWeapon();             // returns weapon the unit is currently equipping
diff --git a/src/Blaze-Brigade/Blaze_Brigade/Warrior.cs b/src/Blaze-Brigade/Blaze_Brigade/Warrior.cs
index f47d64e..3f1265b 100644
--- a/src/Blaze-Brigade/Blaze_Brigade/Warrior.cs
+++ b/src/Blaze-Brigade/Blaze_Brigade/Warrior.cs
@@ -20,28 +20,27 @@ namespace Model
         public int Speed { get; set; }
         public int Def { get; set; }
         public int Res { get; set; }
-        public int Level { get; set; }  
-        private readonly int movability = 4;    // all warriors will have 5 movability
+        public int Level { get; set; }
+        private readonly int movability = 4;    // all warriors will have 4 movability
         private Weapon[] equipableWeapons;
         private Weapon equippedWeapon;
         private Texture2D spriteImage;
         private Vector2 pixelCoordinates;
         private Tuple<int, int> position;
-        private MenuButton[] menuButtons = new MenuButton[4];
-        private MenuButton attackConfirm; 
+        private Button[] buttons = new Button[5];
         private Texture2D charInfo, charAttackInfo;
         private int currentFrame; //the current frame the sprite is on
         private int player; // which player this unit belongs to
 
-        public Warrior(Texture2D spriteImage, MenuButton attackButton, MenuButton moveButton,
-            MenuButton itemButton, MenuButton waitButton, MenuButton confirmButton, Texture2D charInfo, Texture2D charAttackInfo, Vector2 coordinates, int player)
+        public Warrior(Texture2D spriteImage, Button attackButton, Button moveButton,
+            Button itemButton, Button waitButton, Button confirmButton, Texture2D charInfo, Texture2D charAttackInfo, Vector2 coordinates, int player)
         {
             this.spriteImage = spriteImage;
-            menuButtons[0] = attackButton;
-            menuButtons[1] = moveButton;
-            menuButtons[2] = itemButton;
-            menuButtons[3] = waitButton;
-            attackConfirm = confirmButton;
+            buttons[0] = attackButton;
+            buttons[1] = moveButton;
+            buttons[2] = itemButton;
+            buttons[3] = waitButton;
+            buttons[4] = confirmButton;
             this.charInfo = charInfo;
             this.charAttackInfo = charAttackInfo;
             this.player = player;
@@ -50,7 +49,7 @@ namespace Model
             int positionY = (int)Math.Round(coordinates.Y / 32);
             position = new Tuple<int, int>(positionX, positionY);
             currentFrame = 1;
-            setMenuButtonCoordinates(pixelCoordinates);
+            setButtonCoordinates(pixelCoordinates);
             setInitialStats(); //sets initial warrior stats
         }
 
@@ -74,7 +73,7 @@ namespace Model
         }
 
         //returns each stat as an index for incrementing purposes
-        public int getStats(int i) 
+        public int getStats(int i)
         {
             int[] allStats = new int[7];
             allStats[0] = Level;
@@ -107,46 +106,71 @@ namespace Model
             return spriteImage;
         }
 
-        public Texture2D getButtonImage(MenuButtonType buttonType)
+        public Texture2D getButtonImage(ButtonType buttonType)
         {
             switch (buttonType)
             {
-                case MenuButtonType.Attack: // if attack clicked
-                    return menuButtons[0].getImage();
-                case MenuButtonType.Items: // if moved is clicked
-                    return menuButtons[2].getImage();
-                case MenuButtonType.Move: // if item is clicked
-                    return menuButtons[1].getImage();
-                case MenuButtonType.Wait: // if wait is clicked
-                    return menuButtons[3].getImage();
-                case MenuButtonType.AttackConfirm:
-                    return attackConfirm.getImage();
+                case ButtonType.Attack: // if attack clicked
+                    return buttons[0].getImage();
+                case ButtonType.Move: // if moved is clicked
+                    return buttons[1].getImage();
+                case ButtonType.Items: // if item is clicked
+                    return buttons[2].getImage();
+                case ButtonType.Wait: // if wait is clicked
+                    return buttons[3].getImage();
+                case ButtonType.AttackConfirm:
+                    return buttons[4].getImage();
                 default:
                     return null;
             }
         }
 
         // indicates whether a button has already been previously selected or not
-        public bool isButtonActive(MenuButtonType buttonType)
+        public bool isButtonActive(ButtonType buttonType)
         {
             switch (buttonType)
             {
-                case MenuButtonType.Attack:
-                    return menuButtons[0].getActive();
-                case MenuButtonType.Items:
-                    return menuButtons[2].getActive();
-                case MenuButtonType.Move:
-                    return menuButtons[1].getActive();
-                case MenuButtonType.Wait:
-                    return menuButtons[3].getActive();
-                case MenuButtonType.AttackConfirm:
-                    return attackConfirm.getActive();
+                case ButtonType.Attack:
+                    return buttons[0].getActive();
+                case ButtonType.Move:
+                    return buttons[1].getActive();
+                case ButtonType.Items:
+                    return buttons[2].getActive();
+                case ButtonType.Wait:
+                    return buttons[3].getActive();
+                case ButtonType.AttackConfirm:
+                    return buttons[4].getActive();
 
                 default:
                     return false;
             }
         }
 
+        public void setButtonActive(ButtonType buttonType, bool active)
+        {
+            switch (buttonType)
+            {
+                case ButtonType.Attack:
+                    buttons[0].setActive(active);
+                    return;
+                case ButtonType.Move:
+                    buttons[1].setActive(active);
+                    return;
+                case ButtonType.Items:
+                    buttons[2].setActive(active);
+                    return;
+                case ButtonType.Wait:
+                    buttons[3].setActive(active);
+                    return;
+                case ButtonType.AttackConfirm:
+                    buttons[4].setActive(active);
+                    return;
+
+                default:
+                    return;
+            }
+        }
+
         public Texture2D getCharInfo()
         {
             return charInfo;
@@ -154,35 +178,35 @@ namespace Model
 
         public Texture2D getCharAttackInfo()
         {
-            return charAttackInfo; 
+            return charAttackInfo;
         }
 
         public Tuple<int, int> Position
-            {
+        {
             get
-                {
-                    return position;
-                }
+            {
+                return position;
+            }
             set
-                {
-                    position = value;
-                    pixelCoordinates = new Vector2(value.Item1 * 32, value.Item2 * 32);
-                }
+            {
+                position = value;
+                pixelCoordinates = new Vector2(value.Item1 * 32, value.Item2 * 32);
             }
+        }
 
         public Vector2 PixelCoordinates
         {
             get
-                {
-                    return pixelCoordinates;
-                }
+            {
+                return pixelCoordinates;
+            }
             set
-                {
-                    pixelCoordinates = value;
-                    int positionX = (int)Math.Round(PixelCoordinates.X / 32);
-                    int positionY = (int)Math.Round(PixelCoordinates.Y / 32);
-                    position = new Tuple<int, int>(positionX, positionY);
-                }
+            {
+                pixelCoordinates = value;
+                int positionX = (int)Math.Round(PixelCoordinates.X / 32);
+                int positionY = (int)Math.Round(PixelCoordinates.Y / 32);
+                position = new Tuple<int, int>(positionX, positionY);
+            }
         }
 
         public void setEquippedWeapon(Weapon w)
@@ -190,34 +214,50 @@ namespace Model
             equippedWeapon = w;
         }
 
-        public MenuButton[] getMenuButtons()
+        public Button[] getButtons()
         {
-            return menuButtons;
+            return buttons;
         }
 
-        public MenuButton getMenuButtonAt(int i)
+        public Button getButtonOfType(ButtonType buttonType)
         {
-            return menuButtons[i];
-        }
+            switch (buttonType)
+            {
+                case ButtonType.Attack:
+                    return buttons[0];
+                case ButtonType.Move:
+                    return buttons[1];
+                case ButtonType.Items:
+                    return buttons[2];
+                case ButtonType.Wait:
+                    return buttons[3];
+                case ButtonType.AttackConfirm:
+                    return buttons[4];
 
-        public MenuButton getAttackConfirmButton()
-        {
-            return attackConfirm;
+                default:
+                    return null;
+            }
         }
-        
+
         // updates menu button positions
-        public void setMenuButtonCoordinates(Vector2 pixelCoordinates)
+        public void setButtonCoordinates(Vector2 pixelCoordinates)
         {
             int increment = 0;
-            foreach (MenuButton button in menuButtons)
+            foreach (Button button in buttons)
             {
                 if (button.getActive())
                 {
-                    button.setPixelCoordinates((int)(pixelCoordinates.X + 32), (int)(pixelCoordinates.Y + (increment * 32)));
-                    increment++;
+                    if (button.getButtonType() != ButtonType.AttackConfirm)
+                    {
+                        button.setPixelCoordinates((int)(pixelCoordinates.X + 32), (int)(pixelCoordinates.Y + (increment * 32)));
+                        increment++;
+                    }
+                    else if (GameState.attackConfirmOpen)
+                    {
+                        button.setPixelCoordinates((int)(pixelCoordinates.X + 32), (int)(pixelCoordinates.Y));
+                    }
                 }
             }
-            attackConfirm.setPixelCoordinates((int)(pixelCoordinates.X + 32), (int)(pixelCoordinates.Y));
         }
 
         public Rectangle getCurrentFrame() //return current frame the sprite is on
@@ -227,7 +267,7 @@ namespace Model
         }
 
         // animates the sprite by switching to the correct frame sequences
-        public void animate(int direction) 
+        public void animate(int direction)
         {
 
             #region Walking Down
@@ -252,7 +292,7 @@ namespace Model
             #endregion
 
             #region Walking Left
-            else if(direction == 1) // for going left
+            else if (direction == 1) // for going left
             {
                 if ((currentFrame < 3) || (currentFrame > 5)) // if unit isnt already going left, set the sprite to default facing left
                 {
-- 
GitLab