public void AddOnTowerSellCallback(Cell cell, OnTowerSell callback) { onTowerSellCallbacks[cell].Add(callback); }
private void Raycasting() { RaycastHit hit; Ray pointingRay = new Ray(transform.position, transform.forward); lineRenderer.SetPosition(0, transform.position); lineRenderer.SetPosition(1, transform.forward * rayRange); lineRenderer.startColor = new Color(255, 0, 0, 50); towerGhosts[(int)towerIndex].SetActive(false); //disable ghost tower if (Physics.Raycast(pointingRay, out hit) && lineRenderer.enabled) //if spawn tower button is held pressed { if (hit.collider.transform.CompareTag("TowerBase")) //if raycast hits hitbox of TowerBase { //TSL == TowerBase Spawn Location, a Game object inside TowerBase tree structure GameObject TSL = hit.collider.transform.Find("TowerSpawnLocation").gameObject; if (TSL.GetComponent <TowerBuiltOnTowerBase>().towerBuilt == false && //if tower has not been built yet in this TSL sellingTower == false) // and if not selling tower { lineRenderer.startColor = new Color(0, 255, 0, 50); //make line renderer GREEN. //UpdateParticleSystem("green"); towerGhosts[(int)towerIndex].transform.position = TSL.transform.position; //set position of ghost to TSL towerGhosts[(int)towerIndex].SetActive(true); //enable ghost tower if (towerUp.GetStateUp(handByInput) && //if spawn tower button is released (gameManager.GetComponent <GameManager>().TowerGoldCost[towers[(int)towerIndex].tower.name] <= gameManager.GetComponent <GameManager>().gold)) //and if player has enough gold { GameObject instantiatedTower = Instantiate(towers[(int)towerIndex].tower, TSL.transform.position, towers[(int)towerIndex].tower.transform.rotation); //spawn tower OnTowerBuilt?.Invoke(towers[(int)towerIndex].tower.name, false, instantiatedTower.GetInstanceID()); //send notification of tower built in order to lose gold gameManager.GoldPopup(TSL.transform.position + upgradeIconOffset, "-" + gameManager.GPLoseGoldByTowerBuild(GetTowerNameByIndexForDictionaries((int)towerIndex, true), false)); //gold popup based on each tower's build cost TSL.GetComponent <TowerBuiltOnTowerBase>().towerBuilt = true; //mark this TSL as built instantiatedTower.transform.parent = TSL.transform; //set the parent of the instantiated tower to the towerbase spawn location towerBuiltSource.PlayOneShot(sm.towerBuilt, sm.volume[sm.towerBuilt]); //play sound for building tower Instantiate(buildEffect, TSL.transform.position, buildEffect.transform.rotation); //smoke effect for building tower } else if (gameManager.GetComponent <GameManager>().TowerGoldCost[towers[(int)towerIndex].tower.name] //not enough money for tower build >= gameManager.GetComponent <GameManager>().gold&& towerUp.GetStateUp(handByInput)) { gameManager.GoldPopup(TSL.transform.position + upgradeIconOffset, (gameManager.GetComponent <GameManager>().TowerGoldCost[towers[(int)towerIndex].tower.name] - gameManager.GetComponent <GameManager>().gold).ToString(), false, true); //display no gold OnNoGold?.Invoke(); //notify subscribers of no gold } } else //we are raycasting on an already built tower { if (sellingTower) //if button for sell tower was pressed { lineRenderer.startColor = new Color(255, 255, 0, 50); //make line renderer YELLOW as tower is already built and will be sold //UpdateParticleSystem("yellow"); if (towerSell.GetStateUp(handByInput)) //if sell tower button is released { if (TSL.GetComponent <TowerBuiltOnTowerBase>().towerUpgraded == true) //here we sell upgraded tower { if (TSL.transform.childCount > 1) //error check { string towerName = TSL.transform.GetChild(0).name; //get tower name in order to award gold based on it Destroy(TSL.transform.GetChild(1).gameObject); //destroy upgrade icon Destroy(TSL.transform.GetChild(0).gameObject); //destroy tower TSL.GetComponent <TowerBuiltOnTowerBase>().towerBuilt = false; //mark this TSL as free TSL.GetComponent <TowerBuiltOnTowerBase>().towerUpgraded = false; //mark this TSL as free OnTowerSell?.Invoke(towerName, true); //send notification of tower sold. gameManager.GoldPopup(TSL.transform.position + upgradeIconOffset, "+" + gameManager.GPGetGoldByTowerSell(GetTowerNameByIndexForDictionaries((int)towerIndex, false), true)); //gold popup based on each tower's upgrade sell amount towerSoldSource.PlayOneShot(sm.towerSold, sm.volume[sm.towerSold]); //play sound for selling tower Instantiate(sellEffect, TSL.transform.position + upgradeIconOffset, sellEffect.transform.rotation); //coin effect for selling tower } } else if (TSL.GetComponent <TowerBuiltOnTowerBase>().towerBuilt == true) //here we sell non-upgraded tower { if (TSL.transform.childCount > 0) //error check { string towerName = TSL.transform.GetChild(0).name; //get tower name in order to award gold based on it Destroy(TSL.transform.GetChild(0).gameObject); //destroy tower TSL.GetComponent <TowerBuiltOnTowerBase>().towerBuilt = false; //mark this TSL as free OnTowerSell?.Invoke(towerName, false); //send notification of tower sold. gameManager.GoldPopup(TSL.transform.position + upgradeIconOffset, "+" + gameManager.GPGetGoldByTowerSell(GetTowerNameByIndexForDictionaries((int)towerIndex, false), false)); //gold popup based on each tower's sell amount towerSoldSource.PlayOneShot(sm.towerSold, sm.volume[sm.towerSold]); //play sound for selling tower Instantiate(sellEffect, TSL.transform.position + upgradeIconOffset, sellEffect.transform.rotation); //coin effect for selling tower } } } } else //button for upgrade was pressed and we proceed with upgrade { lineRenderer.startColor = new Color32(255, 140, 0, 255); //make line renderer ORANGE as tower is already built and will be upgraded string selectedTowerName = GetTowerNameStrippedOfClone(TSL.transform.GetChild(0).name); if (towerUp.GetStateUp(handByInput) && //if tower up button is released, we have to upgrade tower since it is already built (gameManager.GetComponent <GameManager>().TowerUpgradeCost[selectedTowerName] <= gameManager.GetComponent <GameManager>().gold) && //and if player has enough gold TSL.GetComponent <TowerBuiltOnTowerBase>().towerUpgraded == false) //and if tower was not already upgraded { GameObject instantiatedUpgrade = Instantiate(towerUpgrade, TSL.transform.position + upgradeIconOffset, transform.rotation); //spawn upgrade icon OnTowerBuilt?.Invoke(selectedTowerName, true, TSL.transform.GetChild(0).gameObject.GetInstanceID()); //send notification of tower upgrade in order to lose gold gameManager.GoldPopup(TSL.transform.position + upgradeIconOffset, "-" + gameManager.GPLoseGoldByTowerBuild(selectedTowerName, true)); //gold popup based on each tower's upgrade build cost TSL.GetComponent <TowerBuiltOnTowerBase>().towerUpgraded = true; //mark this TSL as upgraded instantiatedUpgrade.transform.parent = TSL.transform; //set the parent of the upgrade icon to the towerbase spawn location towerBuiltSource.PlayOneShot(sm.towerBuilt, sm.volume[sm.towerBuilt]); //play sound for upgrading tower Instantiate(buildEffect, TSL.transform.position, buildEffect.transform.rotation); //smoke effect for upgrading tower } else if (towerUp.GetStateUp(handByInput) && TSL.GetComponent <TowerBuiltOnTowerBase>().towerUpgraded == true) //if tower is fully upgraded { gameManager.GoldPopup(TSL.transform.position + upgradeIconOffset, "ALREADY UPGRADED", false); //display fully upgraded message } else if (gameManager.GetComponent <GameManager>().TowerUpgradeCost[selectedTowerName] //if not enough money for upgrade >= gameManager.GetComponent <GameManager>().gold&&towerUp.GetStateUp(handByInput)) { gameManager.GoldPopup(TSL.transform.position + upgradeIconOffset, (gameManager.GetComponent <GameManager>().TowerUpgradeCost[selectedTowerName] - gameManager.GetComponent <GameManager>().gold).ToString(), false, true); //display no gold OnNoGold?.Invoke(); //notify subscribers of no gold } } } } else if (!hit.collider.transform.CompareTag("TowerBase")) //else if raycast does not hit any TowerBase hitboxes { lineRenderer.startColor = new Color(255, 0, 0, 50); //make line renderer RED //UpdateParticleSystem("red"); } } else { //UpdateParticleSystem("none"); } }
public void RemoveOnTowerSellCallback(Cell cell, OnTowerSell callback) { onTowerSellCallbacks[cell].Remove(callback); }