Esempio n. 1
0
 public void SetAIDestinations(List <GameObject> aiUnits)
 {
     if (myMap.isDrawn == true)
     {
         foreach (GameObject unit in aiUnits)
         {
             List <Tile> newList = new List <Tile>();
             if (unit.GetType().BaseType == typeof(Mobile) && ((Mobile)unit).isMoving == false)
             {
                 //System.Console.WriteLine("Test");
                 Random random  = new Random();
                 int    randomX = random.Next(10, 700);
                 int    randomY = random.Next(10, 350);
                 MovementManager.changeDestination(aiUnits, new Vector2(randomX, randomY));
                 //((Mobile)unit).setDestination(new Vector2(randomX, randomY));
                 //((Mobile)unit).pathList.Clear();
                 //((Mobile)unit).pathList.AddRange(myMap.GetPath(unit.position, ((Mobile)unit).destination, newList));
                 //((Mobile)unit).isMoving = true;
             }
         }
     }
     else
     {
         return;
     }
 }
Esempio n. 2
0
 public static MovementManager getInstance()
 {
     if (instance == null)
     {
         instance = new MovementManager();
         return instance;
     }
     else
         return instance;
 }
Esempio n. 3
0
 public static MovementManager getInstance()
 {
     if (instance == null)
     {
         instance = new MovementManager();
         return(instance);
     }
     else
     {
         return(instance);
     }
 }
Esempio n. 4
0
        public override void Attack(GameObject target, ContentManager content, ProjectileManager projMan)
        {
            Vector2 corrected = Vector2.Add(position, new Vector2(16, 16));

            for (int x = 0; x < 4; x++)
            {
                Fireball projectile = new Fireball(corrected, 0, this, 1, 0);
                Vector2  direction  = MovementManager.getNormalizedVector(projectile.position, circleFire(x));
                projectile.setDestination(direction, circleFire(x));
                projectile.LoadContent(content);
                projMan.proj.Add(projectile);
            }
        }
Esempio n. 5
0
        public override void Attack(GameObject target, ContentManager content, ProjectileManager projMan)
        {
            attackSound(content);
            Vector2    corrected  = Vector2.Add(position, new Vector2(16, 16));
            Projectile projectile = new Arrow(corrected, 100, target, 100, 0);

            projectile.damage = this.damage;
            Vector2 direction = MovementManager.getNormalizedVector(projectile.position, target.position);

            projectile.setDestination(direction, target.position);
            projectile.LoadContent(content);
            projMan.proj.Add(projectile);
        }
Esempio n. 6
0
        public override void Attack(GameObject target, ContentManager content, ProjectileManager projMan)
        {
            //attackSound(content);
            Vector2    corrected  = Vector2.Add(position, new Vector2(16, 16));
            Projectile projectile = new Rocktile(corrected, 100, target, 100, 0);
            Vector2    direction  = MovementManager.getNormalizedVector(projectile.position, target.position);

            projectile.setDestination(direction, target.position);
            projectile.LoadContent(content);
            projMan.proj.Add(projectile);
            this.animateState = "attack";
            this.animateTime  = 0;
        }
Esempio n. 7
0
        //  TyDo: Create a new projectile that deals less damage than an arrow, but for now just make it the fireball
        //  Attack the target (not homing). Create a new object projectile sent in the direction of target
        //  The new attack code
        public override void Attack(GameObject target, ContentManager content, ProjectileManager projMan)
        {
            this.soundEffect = content.Load <SoundEffect>("fireball.wav");
            soundEffect.Play();
            Vector2    corrected  = Vector2.Add(position, new Vector2(16, 16));
            Projectile projectile = new Iceball(corrected, 0, target, 1, 0);
            Vector2    direction  = MovementManager.getNormalizedVector(projectile.position, target.position);

            projectile.setDestination(direction, target.position);
            projectile.LoadContent(content);
            projMan.proj.Add(projectile);
            this.animateState = "attack";
            this.animateTime  = 0;
        }
Esempio n. 8
0
 public void rally()
 {
     if (!rallyTimer.Enabled)
     {
         rallyTimer.Start();
         specialAttack = true;
         List <GameObject> rallied = new List <GameObject>();
         if (ModelManager.player.Contains(this))
         {
             foreach (GameObject unit in ModelManager.player)
             {
                 if (unit.GetType().BaseType == typeof(Mobile))
                 {
                     if (!((Mobile)unit).isMoving)
                     {
                         rallied.Add(unit);
                         unit.selected = true;
                         if (unit.basehealth - unit.health >= 3)
                         {
                             unit.health += 3;
                         }
                     }
                 }
             }
             MovementManager.changeDestination(rallied, this.position);
         }
         if (ModelManager.artificial.Contains(this))
         {
             foreach (GameObject unit in ModelManager.artificial)
             {
                 if (unit.GetType().BaseType == typeof(Mobile))
                 {
                     if (!((Mobile)unit).isMoving)
                     {
                         rallied.Add(unit);
                         unit.selected = true;
                         if (unit.basehealth - unit.health >= 3)
                         {
                             unit.health += 3;
                         }
                     }
                 }
             }
             MovementManager.changeDestination(rallied, this.position);
         }
     }
 }
Esempio n. 9
0
        //  On skill key press, conjur a fireball and send it to target location
        //  TyNote: Create a fireball unit and set destination to target location (not homing). Dies on first collision or at end of path.
        //  TyDo: Fireball has a life timer
        //  TyDo: Make this a spell. For now, it's implemented as the autoattack
        public void fireball(ProjectileManager projMan, ContentManager content, GameObject target, Vector2 destination)
        {
            Fireball fireballTest = null;

            if (!fireballTimer.Enabled)
            {
                fireballTimer.Start();
                fireballTest = new Fireball(this.position, 10, target, 1, 0);
                this.myArrow = fireballTest;
                Vector2 direction = MovementManager.getNormalizedVector(this.position, destination);
                fireballTest.setDestination(direction, destination);
                fireballTest.LoadContent(content);
                projMan.proj.Add(fireballTest);
                this.animateState = "attack";
                this.animateTime  = 0;
            }
        }
Esempio n. 10
0
        //  The new attack code
        public override void Attack(GameObject target, ContentManager content, ProjectileManager projMan)
        {
            //if (!rapidFireTimer.Enabled)
            //{
            //    specialAttack = false;
            //    attackSpeed = 180;
            //}
            attackSound(content);
            Vector2    corrected  = Vector2.Add(position, new Vector2(16, 16));
            Projectile projectile = new Arrow(corrected, 100, target, 100, 0);

            myArrow = projectile;
            Vector2 direction = MovementManager.getNormalizedVector(projectile.position, target.position);

            projectile.setDestination(direction, target.position);
            projectile.LoadContent(content);
            projMan.proj.Add(projectile);
            this.animateState = "attack";
            this.animateTime  = 0;
        }
Esempio n. 11
0
        public void pursue(GameObject unit)
        {
            //Unit is the AI unit set to pursue
            List <GameObject> attackParty = new List <GameObject>();

            unit.selected = true;
            attackParty.Add(unit);
            int size = random.Next(1, aiUnits.Count);

            if (String.Compare(unit.type, "COMMANDER", true) == 0)
            {
                size = aiUnits.Count;
            }
            special(unit);
            for (int x = 0; x < size; x++) // "Count/3" was breaking the game once a user got the enemy units to less than 3
            {
                GameObject gunit = aiUnits[x];
                if (gunit.aiTarget == null && gunit.GetType().BaseType == typeof(Mobile))//if doesn't have target already and can move
                {
                    special(gunit);
                    gunit.aiTarget = unit.aiTarget;
                    gunit.selected = true;
                    attackParty.Add(gunit);//band with this guy
                }
            }
            MovementManager.changeDestination(attackParty, unit.aiTarget.position);
            //foreach (GameObject cunit in attackParty)
            //{
            //    if (cunit.GetType().BaseType == typeof(Mobile))
            //    {
            //        ((Mobile)cunit).setDestination( unit.aiTarget.position);
            //        List<Tile> newList = new List<Tile>();

            //        ((Mobile)cunit).pathList.Clear();
            //        ((Mobile)cunit).pathList.AddRange(myMap.GetPath(unit.position, ((Mobile)cunit).destination, newList));
            //        ((Mobile)cunit).isMoving = true;
            //        ((Mobile)cunit).isPaused=false;
            //    }
            //}
        }
Esempio n. 12
0
        public void explore(GameObject unit)
        {
            //if (random.NextDouble()*100<=4)
            //{
            List <GameObject> searchParty = new List <GameObject>();

            unit.selected = true;
            searchParty.Add(unit);
            int randpull = random.Next(0, aiUnits.Count);

            for (int x = 0; x < randpull; x++)
            {
                GameObject gunit = aiUnits[x];

                if (gunit.aiTarget == null && gunit.GetType().BaseType == typeof(Mobile))
                {
                    searchParty.Add(gunit);
                    gunit.selected = true;
                }
            }
            Vector2 explore = new Vector2(random.Next(0, 704), random.Next(600, 1024));

            MovementManager.changeDestination(searchParty, explore);
            //foreach (GameObject cunit in searchParty)
            //{

            //((Mobile)cunit).setDestination(MovementManager.getNormalizedVector(cunit.position,explore), explore);
            //((Mobile)cunit).setDestination(explore);
            //List<Tile> newList = new List<Tile>();

            //((Mobile)cunit).pathList.Clear();
            //((Mobile)cunit).pathList.AddRange(myMap.GetPath(cunit.position, ((Mobile)cunit).destination, newList));
            //((Mobile)cunit).isMoving = true;

            // }
            //}
        }
Esempio n. 13
0
 public void pound()
 {
     if (!poundTimer.Enabled && !poundCD.Enabled)
     {
         poundTimer.Start();
         specialAttack = true;
         foreach (GameObject unit in ModelManager.player)
         {
             if (unit.GetType().BaseType == typeof(Mobile))
             {
                 if (this.IsInRange(unit) && unit != this)
                 {
                     List <GameObject> filler = new List <GameObject>();
                     filler.Add(unit);
                     Vector2 debug  = Vector2.Normalize(Vector2.Subtract(unit.position, this.position));
                     Vector2 debug2 = Vector2.Multiply(debug, this.attackRange);
                     Vector2 pvec   = Vector2.Add(this.position, debug2);
                     int     temp   = ((Mobile)unit).moveSpeed;
                     ((Mobile)unit).moveSpeed = 900;
                     bool mov  = ((Mobile)unit).isMoving;
                     bool paus = ((Mobile)unit).isPaused;
                     ((Mobile)unit).isMoving = true;
                     ((Mobile)unit).isPaused = false;
                     bool sel = unit.selected;
                     unit.selected = true;
                     MovementManager.changeDestination(filler, pvec);
                     unit.selected            = sel;
                     ((Mobile)unit).isMoving  = mov;
                     ((Mobile)unit).moveSpeed = temp;
                     ((Mobile)unit).isPaused  = paus;
                     unit.health--;
                 }
             }
         }
     }
 }
Esempio n. 14
0
        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            try
            {
                Window.AllowUserResizing = true;
                //graphics.CreateDevice();
                graphics.PreferredBackBufferHeight = 704;
                graphics.PreferredBackBufferWidth = 1024;
                graphics.IsFullScreen = false;
             //   graphics.ToggleFullScreen();
                graphics.ApplyChanges();
            }
            catch
            {
            }
            // Create a new SpriteBatch, which can be used to draw textures.
            ClickTimer = 0;
            groupedUnits = new Dictionary<Keys, List<GameObject>>();
            spriteBatch = new SpriteBatch(GraphicsDevice);
            // TODO: Add your initialization logic here
            defeatScreen = new Map("Content/defeatScreen.txt");
            mainScreen = new Map("Content/MainScreen.txt");
            levelSelect = new Map("Content/levelSelect.txt");
            castleDefense = new Map("Content/castleDefense.txt");
            riverDefense = new Map("Content/riverDefense.txt");
            castleSiege = new Map("Content/castleSiege.txt");
            victoryScreen = new Map("Content/victoryScreen.txt");
            mainScreenSelector = new Selector(new Rectangle(448, 0, 128, 64), mainScreen, levelSelect, true);
            castleDefenseSelector = new Selector(new Rectangle(96, 320, 192, 96), levelSelect, castleDefense, false);
            riverDefenseSelector = new Selector(new Rectangle(416, 320, 192, 96), levelSelect, riverDefense, false);
            castleSiegeSelector = new Selector(new Rectangle(736, 320, 192, 96), levelSelect, castleSiege, false);
            defeatScreenSelector = new Selector(new Rectangle(448, 256, 128, 64), defeatScreen, mainScreen, false);
            victoryScreenSelector = new Selector(new Rectangle(448, 288, 128, 64), victoryScreen, mainScreen, false);
            modMan = ModelManager.getInstance(ref mainScreen);
            loadMan = LoadManager.getInstance();
            projMan = ProjectileManager.getInstance();
            screenManager = ScreenManager.getInstance();
            // Add all maps to screenManager.allMaps
            screenManager.allMaps.Add(defeatScreen);
            screenManager.allMaps.Add(mainScreen);
            screenManager.allMaps.Add(levelSelect);
            screenManager.allMaps.Add(castleDefense);
            screenManager.allMaps.Add(riverDefense);
            screenManager.allMaps.Add(castleSiege);
            screenManager.allMaps.Add(victoryScreen);
            // Add all selectors to screenManager.allSelectors
            screenManager.allSelectors.Add(defeatScreenSelector);
            screenManager.allSelectors.Add(mainScreenSelector);
            screenManager.allSelectors.Add(castleDefenseSelector);
            screenManager.allSelectors.Add(riverDefenseSelector);
            screenManager.allSelectors.Add(castleSiegeSelector);
            screenManager.allSelectors.Add(victoryScreenSelector);
            // Set initial maps; These will always be defeatScreen, mainScreen and levelSelect,
            // since the user spawns on mainScreen
            screenManager.prevMap = defeatScreen;
            screenManager.currentMap = mainScreen;
            screenManager.nextMap = levelSelect;
            healthChecker = new HealthSystem(ModelManager.player, ModelManager.artificial);
            attackChecker = new AttackSystem(ref ModelManager.player, ref ModelManager.artificial);
            attackChecker.linkSystem(projMan);
            attackChecker.linkContent(Content);
            movementManager = MovementManager.getInstance();
            movementManager.setMap(mainScreen);
            inputManager = new InputManager(ref modMan);
            aiManager = AIManager.getInstance(ref mainScreen);
            mBar = new MoraleBar(ref modMan);
            gui = new GUIButtons(ref modMan);
            info = new InfoCard(ref modMan);
            inputManager.linkGUI(gui);
            MoraleBar.resourceVal(buildResources);
            mousePrev = Mouse.GetState();
            //Create Player's units
            //testInitialization();
           


            testCommander();
            base.Initialize();
            this.IsMouseVisible = true;
           
           
        }
Esempio n. 15
0
        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            try
            {
                Window.AllowUserResizing = true;
                //graphics.CreateDevice();
                graphics.PreferredBackBufferHeight = 704;
                graphics.PreferredBackBufferWidth  = 1024;
                graphics.IsFullScreen = false;
                //   graphics.ToggleFullScreen();
                graphics.ApplyChanges();
            }
            catch
            {
            }
            // Create a new SpriteBatch, which can be used to draw textures.
            ClickTimer   = 0;
            groupedUnits = new Dictionary <Keys, List <GameObject> >();
            spriteBatch  = new SpriteBatch(GraphicsDevice);
            // TODO: Add your initialization logic here
            defeatScreen          = new Map("Content/defeatScreen.txt");
            mainScreen            = new Map("Content/MainScreen.txt");
            levelSelect           = new Map("Content/levelSelect.txt");
            castleDefense         = new Map("Content/castleDefense.txt");
            riverDefense          = new Map("Content/riverDefense.txt");
            castleSiege           = new Map("Content/castleSiege.txt");
            victoryScreen         = new Map("Content/victoryScreen.txt");
            mainScreenSelector    = new Selector(new Rectangle(448, 0, 128, 64), mainScreen, levelSelect, true);
            castleDefenseSelector = new Selector(new Rectangle(96, 320, 192, 96), levelSelect, castleDefense, false);
            riverDefenseSelector  = new Selector(new Rectangle(416, 320, 192, 96), levelSelect, riverDefense, false);
            castleSiegeSelector   = new Selector(new Rectangle(736, 320, 192, 96), levelSelect, castleSiege, false);
            defeatScreenSelector  = new Selector(new Rectangle(448, 256, 128, 64), defeatScreen, mainScreen, false);
            victoryScreenSelector = new Selector(new Rectangle(448, 288, 128, 64), victoryScreen, mainScreen, false);
            modMan        = ModelManager.getInstance(ref mainScreen);
            loadMan       = LoadManager.getInstance();
            projMan       = ProjectileManager.getInstance();
            screenManager = ScreenManager.getInstance();
            // Add all maps to screenManager.allMaps
            screenManager.allMaps.Add(defeatScreen);
            screenManager.allMaps.Add(mainScreen);
            screenManager.allMaps.Add(levelSelect);
            screenManager.allMaps.Add(castleDefense);
            screenManager.allMaps.Add(riverDefense);
            screenManager.allMaps.Add(castleSiege);
            screenManager.allMaps.Add(victoryScreen);
            // Add all selectors to screenManager.allSelectors
            screenManager.allSelectors.Add(defeatScreenSelector);
            screenManager.allSelectors.Add(mainScreenSelector);
            screenManager.allSelectors.Add(castleDefenseSelector);
            screenManager.allSelectors.Add(riverDefenseSelector);
            screenManager.allSelectors.Add(castleSiegeSelector);
            screenManager.allSelectors.Add(victoryScreenSelector);
            // Set initial maps; These will always be defeatScreen, mainScreen and levelSelect,
            // since the user spawns on mainScreen
            screenManager.prevMap    = defeatScreen;
            screenManager.currentMap = mainScreen;
            screenManager.nextMap    = levelSelect;
            healthChecker            = new HealthSystem(ModelManager.player, ModelManager.artificial);
            attackChecker            = new AttackSystem(ref ModelManager.player, ref ModelManager.artificial);
            attackChecker.linkSystem(projMan);
            attackChecker.linkContent(Content);
            movementManager = MovementManager.getInstance();
            movementManager.setMap(mainScreen);
            inputManager = new InputManager(ref modMan);
            aiManager    = AIManager.getInstance(ref mainScreen);
            mBar         = new MoraleBar(ref modMan);
            gui          = new GUIButtons(ref modMan);
            info         = new InfoCard(ref modMan);
            inputManager.linkGUI(gui);
            MoraleBar.resourceVal(buildResources);
            mousePrev = Mouse.GetState();
            //Create Player's units
            //testInitialization();



            testCommander();
            base.Initialize();
            this.IsMouseVisible = true;
        }
Esempio n. 16
0
        public void Update(MouseState newcurrent, MouseState newprevious, ref double ClickTimer, KeyboardState keyPress,
                           ref Dictionary <Keys, List <GameObject> > groupedUnits, ref List <GameObject> units, ref List <GameObject> aunits,
                           ref LoadManager loadManager, ref ProjectileManager projMan, ContentManager theContent, ref int playerResources, bool dbuildPhase)

        {
            Rectangle holder = mouseRec;

            mouseRec = new Rectangle(newcurrent.X, newcurrent.Y, 2, 2);
            if (!loaded)
            {
                loadMouseOvers(theContent);
                loaded = true;
            }
            mouseOver();
            mouseRec = holder;
            bool singleClick = false;

            current    = newcurrent;
            previous   = newprevious;
            buildPhase = dbuildPhase;
            if (keyPress.IsKeyDown(Keys.S) && current.LeftButton == ButtonState.Pressed && previous.LeftButton == ButtonState.Released)
            {
                int      x             = Convert.ToInt32(current.X);
                int      y             = Convert.ToInt32(current.Y);
                Vector2  mousePosition = new Vector2(x, y);
                ClickBox temp          = new ClickBox(mousePosition);
                //temp.LoadContent(theContent);
                foreach (GameObject unit in units)
                {
                    if (unit.selected && unit.GetType() == typeof(Tower))
                    {
                        if (!((Tower)unit).placed)
                        {
                            ((Tower)unit).placed = true;
                            unit.position        = mousePosition;
                        }
                    }
                }
            }
            // Select units after releasing mouse and clear rectangle:
            if (current.LeftButton == ButtonState.Released &&
                previous.LeftButton == ButtonState.Pressed
                )
            {
                for (int i = 0; i < units.Count; i++)
                {
                    if (!selectSimilar)
                    {
                        units[i].selected = false;
                    }
                    if (units[i].Bounds.Intersects(mouseRec))
                    {
                        units[i].selected = true;
                    }
                }

                mouseRec = Rectangle.Empty;
            }

            if (current.LeftButton == ButtonState.Pressed && previous.LeftButton == ButtonState.Released && prevclick)
            {
                if (ClickTimer < TimerDelay)
                {
                    selectSimilar = true;
                }
                else
                {
                    ClickTimer    = 0;
                    selectSimilar = false;
                }
            }

            // Select with a single mouse click:
            if (current.LeftButton == ButtonState.Pressed &&
                previous.LeftButton == ButtonState.Released
                )
            {
                mouseRec       = new Rectangle((int)current.X, (int)current.Y, 0, 0);
                mouseRecOrigin = new Vector2(current.X, current.Y);
                GameObject selectedUnit = null;

                for (int i = 0; i < units.Count; i++)
                {
                    units[i].selected = false;
                    if (units[i].isSelectable(current) == true)
                    {
                        units[i].selected = true;
                        selectedUnit      = units[i];
                        InfoCard.info(units[i]);
                        break;
                    }
                }

                if (selectSimilar && selectedUnit != null)
                {
                    for (int i = 0; i < units.Count; i++)
                    {
                        if (units[i].GetType() == selectedUnit.GetType())
                        {
                            units[i].selected = true;
                        }
                    }
                }

                singleClick = true;
                prevclick   = true;
            }


            // Move selected units or attack:
            if (current.RightButton == ButtonState.Pressed &&
                previous.RightButton == ButtonState.Released
                )
            {
                Vector2    testvec        = new Vector2(current.X, current.Y);
                GameObject selectedTarget = null;

                for (int i = 0; i < aunits.Count; i++)
                {
                    if (aunits[i].isLoaded)
                    {
                        if (aunits[i].isSelectable(current))
                        {
                            selectedTarget = aunits[i];
                            break;
                        }
                    }
                }

                for (int i = 0; i < units.Count; i++)
                {
                    if (units[i].selected == true)
                    {
                        units[i].aiTarget = selectedTarget;
                    }
                }
                MovementManager.changeDestination(units, testvec);
            }

            if (keyPress.GetPressedKeys().Length > 0 && IsKeyADigit(keyPress.GetPressedKeys()[0]))
            {
                Keys pressedKey = keyPress.GetPressedKeys()[0];
                if (previousKeyboard.IsKeyDown(Keys.LeftControl) && keyPress.IsKeyDown(pressedKey))
                {
                    List <GameObject> groupList = new List <GameObject>();

                    foreach (GameObject gobj in units)
                    {
                        if (gobj.selected)
                        {
                            groupList.Add(gobj);
                        }
                    }

                    if (groupList.Count > 0)
                    {
                        if (!groupedUnits.ContainsKey(pressedKey))
                        {
                            groupedUnits.Add(pressedKey, groupList);
                        }
                        else
                        {
                            groupedUnits[pressedKey] = groupList;
                        }
                    }
                }


                if (!previousKeyboard.IsKeyDown(pressedKey) && keyPress.IsKeyDown(pressedKey))
                {
                    if (groupedUnits.ContainsKey(pressedKey))
                    {
                        deselect(ref groupedUnits, pressedKey);
                        List <GameObject> groupList = groupedUnits[pressedKey];
                        foreach (GameObject gobj in groupList)
                        {
                            gobj.selected = true;
                        }
                    }
                }
            }

            if (!previousKeyboard.IsKeyDown(Keys.Delete) && keyPress.IsKeyDown(Keys.Delete) && units.Count > 0)
            {
                if (dbuildPhase) // complete refund
                {
                    int refund = getCost(units[units.Count - 1]);
                    playerResources += refund;
                }
                if (units.Count == 1)
                {
                    if (units[0].GetType() == typeof(Warrior))
                    {
                        if (((Warrior)(units[0])).moveSpeed == 7)
                        {
                            return;
                        }
                    }
                }
                units.RemoveAt(units.Count - 1);
                offset -= 50;
                if (offset < 0 && default_player_y > 608)
                {
                    offset            = 300;
                    default_player_y -= 32;
                }

                // what to do when not in build phase? partial refund? currently can't undo build in play phase
            }

            if (!previousKeyboard.IsKeyDown(Keys.Back) && keyPress.IsKeyDown(Keys.Back))
            {
                foreach (GameObject gobj in units)
                {
                    if (gobj.selected)
                    {
                        if (gobj.GetType() == typeof(Warrior))
                        {
                            if (((Warrior)(gobj)).moveSpeed == 7)
                            {
                                return;
                            }
                        }
                        int refund = getCost(gobj);
                        playerResources += refund;
                    }
                }
                units.RemoveAll(gobj => gobj.selected);
            }


            Rectangle rect;

            //  Purchase Archer
            gui.buttonCols.TryGetValue("ARCHER", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.Z) && keyPress.IsKeyDown(Keys.Z) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Archer.cost)
                {
                    modelManager.addUnit("PLAYER", "ARCHER", placementUtil());
                    playerResources -= Archer.cost;
                }
            }

            //  Purchase tower
            gui.buttonCols.TryGetValue("TOWER", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.X) && keyPress.IsKeyDown(Keys.X) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Tower.cost)
                {
                    modelManager.addUnit("PLAYER", "TOWER", placementUtil());
                    playerResources -= Tower.cost;
                }
            }

            //  Purchase warrior
            gui.buttonCols.TryGetValue("WARRIOR", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.C) && keyPress.IsKeyDown(Keys.C) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Warrior.cost)
                {
                    modelManager.addUnit("PLAYER", "WARRIOR", placementUtil());
                    playerResources -= Warrior.cost;
                }
            }

            //  Spawn Pawn For Free!!!! Yay
            gui.buttonCols.TryGetValue("PAWN", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.V) && keyPress.IsKeyDown(Keys.V) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Pawn.cost)
                {
                    modelManager.addUnit("PLAYER", "PAWN", placementUtil());
                    playerResources -= Pawn.cost;
                }
            }

            //  Spawn Apprentice For Free!!!! Yay
            gui.buttonCols.TryGetValue("APPRENTICE", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.B) && keyPress.IsKeyDown(Keys.B) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Apprentice.cost)
                {
                    modelManager.addUnit("PLAYER", "APPRENTICE", placementUtil());
                    playerResources -= Apprentice.cost;
                }
            }

            //  Spawn Commander For Free!!!! Yay
            gui.buttonCols.TryGetValue("COMMANDER", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.N) && keyPress.IsKeyDown(Keys.N) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Commander.cost)
                {
                    modelManager.addUnit("PLAYER", "COMMANDER", placementUtil());
                    playerResources -= Commander.cost;
                }
            }

            //  Spawn Catapult For Free!!!! Yay
            gui.buttonCols.TryGetValue("CATAPULT", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.M) && keyPress.IsKeyDown(Keys.M) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Catapult.cost)
                {
                    modelManager.addUnit("PLAYER", "CATAPULT", placementUtil());
                    playerResources -= Catapult.cost;
                }
            }

            //  Spawn Catapult For Free!!!! Yay
            gui.buttonCols.TryGetValue("ROGUE", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.J) && keyPress.IsKeyDown(Keys.J) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Rogue.cost)
                {
                    modelManager.addUnit("PLAYER", "ROGUE", placementUtil());
                    playerResources -= Rogue.cost;
                }
            }
            gui.buttonCols.TryGetValue("CLERIC", out rect);
            if (!previousKeyboard.IsKeyDown(Keys.K) && keyPress.IsKeyDown(Keys.K) || (buttonClick(rect) && singleClick))
            {
                if (playerResources >= Cleric.cost)
                {
                    modelManager.addUnit("PLAYER", "CLERIC", placementUtil());
                    playerResources -= Cleric.cost;
                }
            }

            //  Skill - When F is pressed, units selected will perform skill
            foreach (GameObject unit in units)
            {
                //  Skill - Apprentice Fireball
                if (unit.selected && unit.GetType() == typeof(Apprentice) &&
                    !previousKeyboard.IsKeyDown(Keys.F) && keyPress.IsKeyDown(Keys.F))
                {
                    ((Apprentice)unit).fireball(projMan, theContent, unit, new Vector2(current.X, current.Y));
                }
                if (unit.selected && unit.GetType() == typeof(Archer) &&
                    !previousKeyboard.IsKeyDown(Keys.F) && keyPress.IsKeyDown(Keys.F))
                {
                    ((Archer)unit).rapidFire();
                }
                if (unit.selected && unit.GetType() == typeof(Warrior) &&
                    !previousKeyboard.IsKeyDown(Keys.F) && keyPress.IsKeyDown(Keys.F))
                {
                    ((Warrior)unit).juggernaut();
                }
                if (unit.selected && unit.GetType() == typeof(Rogue) &&
                    !previousKeyboard.IsKeyDown(Keys.F) && keyPress.IsKeyDown(Keys.F))
                {
                    ((Rogue)unit).stealth();
                }
                if (unit.selected && unit.GetType() == typeof(Commander) &&
                    !previousKeyboard.IsKeyDown(Keys.F) && keyPress.IsKeyDown(Keys.F))
                {
                    ((Commander)unit).rally();
                }
                if (unit.selected && unit.GetType() == typeof(Tower) &&
                    !previousKeyboard.IsKeyDown(Keys.F) && keyPress.IsKeyDown(Keys.F))
                {
                    ((Tower)unit).entrench();
                }
                if (unit.selected && unit.GetType() == typeof(BossUnit) &&
                    !previousKeyboard.IsKeyDown(Keys.F) && keyPress.IsKeyDown(Keys.F))
                {
                    ((BossUnit)unit).pound();
                }
                //  Skill - Rogue stealth

                //  SKill - etc.
            }



            //  Update mouse rectangle:
            if (current.LeftButton == ButtonState.Pressed &&
                previous.LeftButton == ButtonState.Pressed
                )
            {
                if (current.X > mouseRecOrigin.X)
                {
                    mouseRec.Width = current.X - mouseRec.X;
                }
                else
                {
                    mouseRec.Width = (int)mouseRecOrigin.X - current.X;
                    mouseRec.X     = current.X;
                }

                if (current.Y > mouseRecOrigin.Y)
                {
                    mouseRec.Height = current.Y - mouseRec.Y;
                }
                else
                {
                    mouseRec.Height = (int)mouseRecOrigin.Y - current.Y;
                    mouseRec.Y      = current.Y;
                }
            }


            previousKeyboard = keyPress;
            //MoraleBar.resourceVal(playerResources);
        }