//Pre: None //Post: Various tower upgrade updates are made //Description: Subprogram to hold update logic for upgrades public virtual void UpgradeLogic() { //Looping through each upgrade for (int i = 0; i < 2; i++) { //If user clicks on item and is eligible for purchase if (Driver.CollisionDetection.PointToRectangle(upgradeItems[i].rect, GUI.Cursor.circle.center) && Driver.Main.NewButtonPress(Driver.Main.newGamePadState.Buttons.A, Driver.Main.oldGamePadState.Buttons.A) && upgradeItems[i].PurchaseEligibility() && propertyLevel[i] < 4) { //Completing transaction and updatting appropriate property upgradeItems[i].CompleteTransaction(); if (i == 0) { Upgrade1(); } else { Upgrade2(); } //Updating or clearing shop item, depending on property level if (propertyLevel[i] < 4) { upgradeItems[i] = new GameData.ShopItem(upgradeItems[i].name, propertyLevel[i] * (priceGold) / 2, propertyLevel[i] * (priceWood) / 2, propertyLevel[i] * (priceSteel) / 2, upgradeItems[i].upgradeType, (int)(propertyValue[i] * 0.25), upgradeItems[i].img, upgradeItems[i].rect); } else { upgradeItems[i].Clear(); } } } }
//Constructor for Cannon object public Cannon(int x, int y) : base(x, y) { //Setting image and type of cannon img = cannonImg; towerType = "Cannon"; //Setting tower price priceGold = GOLD_PRICE; priceWood = WOOD_PRICE; priceSteel = STEEL_PRICE; //Setting damage, range, and shoot time of tower propertyValue[0] = DEFAULT_DAMAGE; propertyValue[1] = DEFAULT_RANGE; shootFrameMax = SHOOT_TIME; //Setting up defense tower range circles currentRangeCircle = new GUI.Circle(center, (int)propertyValue[1], Color.White * 0.25f); futureRangeCircle = new GUI.Circle(center, (int)Math.Round(propertyValue[1] * 1.25), Color.Green * 0.25f); //Setting up animation components sourceRect = new Rectangle(rect.X + 25, rect.Y + 25, 50, 50); origin = new Vector2(50, 50); rotation = (float)(Math.PI / 2.0); //Setting up shop item variables for possible upgrades upgradeItems[0] = new GameData.ShopItem("Damage +", GOLD_PRICE / 2, WOOD_PRICE / 2, STEEL_PRICE / 2, "Damage", (int)Math.Round(propertyValue[0] * 0.25), upgradeButtonImg, upgradeButtonRect[0]); upgradeItems[1] = new GameData.ShopItem("Range +", GOLD_PRICE / 2, WOOD_PRICE / 2, STEEL_PRICE / 2, "Range", (int)Math.Round(propertyValue[1] * 0.25), upgradeButtonImg, upgradeButtonRect[1]); }
//Overloaded constructor for defense tower class public Cannon(int x, int y, int propLevel1, int propLevel2, int total) : base(x, y, propLevel1, propLevel2, total) { //Setting image and type of archer img = cannonImg; towerType = "Cannon"; //Setting tower price priceGold = GOLD_PRICE; priceWood = WOOD_PRICE; priceSteel = STEEL_PRICE; //Setting damage, range, shoot time, and kills propertyValue[0] = (int)(DEFAULT_DAMAGE * Math.Pow(1.25, propLevel1)); propertyValue[1] = (int)(DEFAULT_RANGE * Math.Pow(1.25, propLevel2)); shootFrameMax = SHOOT_TIME; totalKills = total; //Setting up defense tower range circles currentRangeCircle = new GUI.Circle(center, propertyValue[1], Color.White * 0.25f); futureRangeCircle = new GUI.Circle(center, (int)Math.Round(propertyValue[1] * 1.25), Color.Green * 0.25f); //Setting up animation components sourceRect = new Rectangle(rect.X + 25, rect.Y + 25, 50, 50); origin = new Vector2(50, 50); rotation = (float)(Math.PI / 2.0); //Selection to either update 1st shop item or clear shop item, depending on level if (propertyLevel[0] < 4) { upgradeItems[0] = new GameData.ShopItem("Damage +", propertyLevel[0] * (priceGold) / 2, propertyLevel[0] * (priceWood) / 2, propertyLevel[0] * (priceSteel) / 2, "Damage", (int)(propertyValue[0] * 0.25), upgradeButtonImg, upgradeButtonRect[0]); } else { upgradeItems[0] = new GameData.ShopItem(0); upgradeItems[0].Clear(); } //Selection to either update 2nd shop item or clear shop item, depending on level if (propertyLevel[1] < 4) { upgradeItems[1] = new GameData.ShopItem("Range +", propertyLevel[1] * (priceGold) / 2, propertyLevel[1] * (priceWood) / 2, propertyLevel[1] * (priceSteel) / 2, "Range", (int)(propertyValue[1] * 0.25), upgradeButtonImg, upgradeButtonRect[1]); } else { upgradeItems[1] = new GameData.ShopItem(1); upgradeItems[1].Clear(); } }
//Pre: None //Post: Various shop updates are made regarding new item addition //Description: Subprogram to hold update logic for new item addition private static void NewItemAdditionLogic() { //If user clicks on a tile with a shop item if (Driver.Main.NewButtonPress(Driver.Main.newGamePadState.Buttons.A, Driver.Main.oldGamePadState.Buttons.A) && Cursor.gridLoc.X < 13 && Cursor.gridLoc.Y < 11 && isItemInHand) { //Logic to ensure placement is apprropriate if (((newItem.name == "Arrow Drop" || newItem.name == "Giant Bomb") && GameLevel.mapTiles[(int)Cursor.gridLoc.Y, (int)Cursor.gridLoc.X] == 1) || (newItem.name != "Arrow Drop" && newItem.name != "Giant Bomb" && !GameLevel.towerDictionary.ContainsKey(Cursor.gridLoc) && GameLevel.mapTiles[(int)Cursor.gridLoc.Y, (int)Cursor.gridLoc.X] == 0)) { //Completing transaction, and moving item from hand to game level newItem.CompleteTransaction(); GameLevel.AddItem(itemName); isItemInHand = false; } } //If user clicks 'A' on a shop item if (Driver.Main.NewButtonPress(Driver.Main.newGamePadState.Buttons.A, Driver.Main.oldGamePadState.Buttons.A)) { for (int i = 0; i < 8; i++) { if (Driver.CollisionDetection.PointToRectangle(shopItems[i].rect, Cursor.circle.center)) { //If user is elidigible for purchase if (shopItems[i].PurchaseEligibility()) { //Set data for current shop item in hand itemName = shopItems[i].name; itemImg = shopItems[i].img; newItem = shopItems[i]; itemRange = new Circle(new Vector2(), newItem.radius, Color.White * 0.25f); isItemInHand = true; } } } } else if (Driver.Main.NewButtonPress(Driver.Main.newGamePadState.Buttons.B, Driver.Main.oldGamePadState.Buttons.B)) { //If user clicks 'B', clear item in hand isItemInHand = false; } }
//Pre: 'Content', the content manager required to load content //Post: Various shop components are loaded and setup //Description: Subprogram to load and setup various shop components public static void Load(ContentManager Content) { //Importing and setting up shop background image and rectangle backImg = Content.Load <Texture2D>("Images/Backgrounds/ShopComponents/shopBackground"); backRect = new Rectangle(650, 0, 150, 550); //Importing and setting up resource images, rectangles, and message locations resourceImg[0] = Content.Load <Texture2D>("Images/Backgrounds/ShopComponents/heartResource"); resourceImg[1] = Content.Load <Texture2D>("Images/Backgrounds/ShopComponents/goldResource"); resourceImg[2] = Content.Load <Texture2D>("Images/Backgrounds/ShopComponents/woodResource"); resourceImg[3] = Content.Load <Texture2D>("Images/Backgrounds/ShopComponents/steelResource"); frameImg = Content.Load <Texture2D>("Images/Backgrounds/ShopComponents/woodenFrame"); for (int i = 0; i < 4; i++) { resourceRect[i] = new Rectangle(655, 5 + 40 * i, 35, 35); resourcesMsgLoc[i] = new Vector2(700, 3 + 40 * i); } //Setting up shop items GameData.ShopItem.informationBoxImg = Content.Load <Texture2D>("Images/Sprites/informationBoxImg"); shopItems[0] = new GameData.ShopItem("Cannon", Towers.Cannon.GOLD_PRICE, Towers.Cannon.WOOD_PRICE, Towers.Cannon.STEEL_PRICE, Towers.Cannon.DEFAULT_DAMAGE, Towers.Cannon.DEFAULT_RANGE, Towers.Cannon.cannonImg, new Rectangle(666, 180, 50, 50)); shopItems[1] = new GameData.ShopItem("Archer", Towers.Archer.GOLD_PRICE, Towers.Archer.WOOD_PRICE, Towers.Archer.STEEL_PRICE, Towers.Archer.DEFAULT_DAMAGE, Towers.Archer.DEFAULT_RANGE, Towers.Archer.archerImg, new Rectangle(734, 180, 50, 50)); shopItems[2] = new GameData.ShopItem("Bomber", Towers.Bomber.GOLD_PRICE, Towers.Bomber.WOOD_PRICE, Towers.Bomber.STEEL_PRICE, Towers.Bomber.DEFAULT_DAMAGE, Towers.Bomber.DEFAULT_RANGE, Towers.Bomber.bomberImg, new Rectangle(666, 240, 50, 50)); shopItems[3] = new GameData.ShopItem("Roaster", Towers.Roaster.GOLD_PRICE, Towers.Roaster.WOOD_PRICE, Towers.Roaster.STEEL_PRICE, Towers.Roaster.DEFAULT_DAMAGE, Towers.Roaster.DEFAULT_RANGE, Towers.Roaster.roasterImg, new Rectangle(734, 240, 50, 50)); shopItems[4] = new GameData.ShopItem("Steel Mine", Towers.SteelMine.GOLD_PRICE, Towers.SteelMine.WOOD_PRICE, Towers.SteelMine.STEEL_PRICE, Towers.SteelMine.steelMineImg, new Rectangle(666, 300, 50, 50)); shopItems[5] = new GameData.ShopItem("Forestry", Towers.Forestry.GOLD_PRICE, Towers.Forestry.WOOD_PRICE, Towers.Forestry.STEEL_PRICE, Towers.Forestry.forestryImg, new Rectangle(734, 300, 50, 50)); shopItems[6] = new GameData.ShopItem("Arrow Drop", Items.ArrowDrop.GOLD_PRICE, Items.ArrowDrop.WOOD_PRICE, Items.ArrowDrop.STEEL_PRICE, Items.ArrowDrop.DAMAGE, Items.ArrowDrop.RANGE, Items.ArrowDrop.arrowImg, new Rectangle(666, 360, 50, 50)); shopItems[7] = new GameData.ShopItem("Giant Bomb", Items.GiantBomb.GOLD_PRICE, Items.GiantBomb.WOOD_PRICE, Items.GiantBomb.STEEL_PRICE, Items.GiantBomb.DAMAGE, Items.GiantBomb.RANGE, Items.GiantBomb.giantBombImg, new Rectangle(734, 360, 50, 50)); //Importing fonts resourcesFont = Content.Load <SpriteFont>("Fonts/ResourceFont"); for (int i = 0; i < 2; i++) { GameData.ShopItem.resourceDataFont[i] = Content.Load <SpriteFont>("Fonts/ResourceDataFont" + (i + 1)); } //Importing soundeffects and setting up instances GameData.ShopItem.transactionSnd = Content.Load <SoundEffect>("Audio/SoundEffects/cashSound"); GameData.ShopItem.transactionSndInstance = GameData.ShopItem.transactionSnd.CreateInstance(); GameData.ShopItem.errorSnd = Content.Load <SoundEffect>("Audio/SoundEffects/errorSoundEffect"); GameData.ShopItem.errorSndInstance = GameData.ShopItem.errorSnd.CreateInstance(); }
//Constructor for Steel Mine object public SteelMine(int x, int y) : base(x, y) { //Setting image and type of steel mine img = steelMineImg; towerType = "Steel Mine"; //Setting tower price priceGold = GOLD_PRICE; priceWood = WOOD_PRICE; priceSteel = STEEL_PRICE; //Setting yield amount and speed amount propertyValue[0] = DEFAULT_YIELD; propertyValue[1] = DEFAULT_SPEED; yieldRate = propertyValue[0] * propertyValue[1]; //Setting up shop item variables for possible upgrades upgradeItems[0] = new GameData.ShopItem("Amount +", GOLD_PRICE / 2, WOOD_PRICE / 2, STEEL_PRICE / 2, "Amount", (int)Math.Round(propertyValue[0] * 0.25), upgradeButtonImg, upgradeButtonRect[0]); upgradeItems[1] = new GameData.ShopItem("Speed +", GOLD_PRICE / 2, WOOD_PRICE / 2, STEEL_PRICE / 2, "Speed", (int)Math.Round(propertyValue[1] * 0.25), upgradeButtonImg, upgradeButtonRect[1]); }
//Overloaded constructor for defense tower class public SteelMine(int x, int y, int propLevel1, int propLevel2, int total) : base(x, y, propLevel1, propLevel2, total) { //Setting image and type of archer img = steelMineImg; towerType = "Steel Mine"; //Setting tower price priceGold = GOLD_PRICE; priceWood = WOOD_PRICE; priceSteel = STEEL_PRICE; //Setting damage, range, shoot time, and kills propertyValue[0] = (int)(DEFAULT_YIELD * Math.Pow(1.25, propLevel1)); propertyValue[1] = (int)(DEFAULT_SPEED * Math.Pow(1.25, propLevel2)); yieldRate = propertyValue[0] * propertyValue[1]; totalYield = total; //Selection to either update 1st shop item or clear shop item, depending on level if (propertyLevel[0] < 4) { upgradeItems[0] = new GameData.ShopItem("Amount +", propertyLevel[0] * (priceGold) / 2, propertyLevel[0] * (priceWood) / 2, propertyLevel[0] * (priceSteel) / 2, "Amount", (int)(propertyValue[0] * 0.25), upgradeButtonImg, upgradeButtonRect[0]); } else { upgradeItems[0] = new GameData.ShopItem(0); upgradeItems[0].Clear(); } //Selection to either update 2nd shop item or clear shop item, depending on level if (propertyLevel[1] < 4) { upgradeItems[1] = new GameData.ShopItem("Speed +", propertyLevel[1] * (priceGold) / 2, propertyLevel[1] * (priceWood) / 2, propertyLevel[1] * (priceSteel) / 2, "Speed", (int)(propertyValue[1] * 0.25), upgradeButtonImg, upgradeButtonRect[1]); } else { upgradeItems[1] = new GameData.ShopItem(1); upgradeItems[1].Clear(); } }
//Constructor for Bomber object public Bomber(int x, int y) : base(x, y) { //Setting image and type of bomber img = bomberImg; towerType = "Bomber"; //Setting tower price priceGold = GOLD_PRICE; priceWood = WOOD_PRICE; priceSteel = STEEL_PRICE; //Setting damage, range, and shoot time of tower propertyValue[0] = DEFAULT_DAMAGE; propertyValue[1] = DEFAULT_RANGE; shootFrameMax = SHOOT_TIME; //Setting up defense tower range circles currentRangeCircle = new GUI.Circle(center, (int)propertyValue[1], Color.White * 0.25f); futureRangeCircle = new GUI.Circle(center, (int)Math.Round(propertyValue[1] * 1.25), Color.Green * 0.25f); //Setting up shop item variables for possible upgrades upgradeItems[0] = new GameData.ShopItem("Damage +", GOLD_PRICE / 2, WOOD_PRICE / 2, STEEL_PRICE / 2, "Damage", (int)Math.Round(propertyValue[0] * 0.25), upgradeButtonImg, upgradeButtonRect[0]); upgradeItems[1] = new GameData.ShopItem("Range +", GOLD_PRICE / 2, WOOD_PRICE / 2, STEEL_PRICE / 2, "Range", (int)Math.Round(propertyValue[1] * 0.25), upgradeButtonImg, upgradeButtonRect[1]); }