private void OnTriggerEnter(Collider other)
 {
     currentTowerPlatform = other.GetComponentInParent <TowerPlatform>();
     towerExists          = other.GetComponentInChildren <TowerCheck>();
     currentTower         = other.GetComponentInChildren <TowerCheck>();
     if (other.GetComponentInChildren <TowerType>())
     {
         upgradePriceText.text = "$" + other.GetComponentInChildren <TowerType>().upgradeCost;
     }
     towerManager.SetupTowerPrices();
 }
    public void PurchaseTower(string towerTypeName)
    {
        TowerTypes towerType = RecognizeTowerType(towerTypeName);
        // true - if enough money, false - if not enough money
        bool towerWasBought = TowerManager.instance.PurchaseTower(currentTowerPlatform, towerType);

        if (towerWasBought)
        {
            towerExists = true;
            towerBuyMenu.gameObject.SetActive(false);
            towerUpgradeMenu.gameObject.SetActive(true);
            currentTower = currentTowerPlatform.GetComponentInChildren <TowerCheck>();
            currentTower.GetComponent <TowerType>().upgradeCost = currentTower.GetComponent <TowerType>().initialUpgradeCost;
            upgradePriceText.text = "$" + currentTower.GetComponentInChildren <TowerType>().upgradeCost;
        }
    }
    private void OnTriggerStay(Collider other)
    {
        currentTower = other.GetComponentInChildren <TowerCheck>();
        if (other.GetComponentInChildren <TowerType>())
        {
            upgradePriceText.text = "$" + other.GetComponentInChildren <TowerType>().upgradeCost;
        }

        if (other.gameObject.tag == "TowerPlatform")
        {
            if (!towerExists)
            {
                if (Input.GetKeyDown(KeyCode.E) && !towerBuyMenu.gameObject.activeSelf)
                {
                    Cursor.visible   = (true);
                    Cursor.lockState = CursorLockMode.None;
                    towerBuyMenu.gameObject.SetActive(true);
                }
                else if (Input.GetKeyDown(KeyCode.E) && towerBuyMenu.gameObject.activeSelf)
                {
                    Cursor.visible   = (false);
                    Cursor.lockState = CursorLockMode.Locked;
                    towerBuyMenu.gameObject.SetActive(false);
                }
            }
            else
            {
                if (Input.GetKeyDown(KeyCode.E) && !towerUpgradeMenu.gameObject.activeSelf)
                {
                    Cursor.visible   = (true);
                    Cursor.lockState = CursorLockMode.None;
                    towerUpgradeMenu.gameObject.SetActive(true);
                }
                else if (Input.GetKeyDown(KeyCode.E) && towerUpgradeMenu.gameObject.activeSelf)
                {
                    Cursor.visible   = (false);
                    Cursor.lockState = CursorLockMode.Locked;
                    towerUpgradeMenu.gameObject.SetActive(false);
                }
            }
        }
    }
    public void UpgradeTower()
    {
        if (Player.instance.money >= currentTower.GetComponent <TowerType>().upgradeCost)
        {
            Player.instance.money -= currentTower.GetComponent <TowerType>().upgradeCost;

            // save tower type and all stats related to the tower type
            TowerType  towerStats             = currentTower.GetComponent <TowerType>();
            TowerTypes towerType              = towerStats.towerType;
            float      maxHealth              = towerStats.maxHealth;
            float      damageToGive           = towerStats.damageToGive;
            float      fireRange              = towerStats.fireRange;
            float      rechargeTime           = towerStats.rechargeTime;
            bool       canHitMultipleEnemies  = towerStats.canHitMultipleEnemies;
            int        initialUpgradeCost     = towerStats.initialUpgradeCost;
            float      positiveStatMultiplier = towerStats.positiveStatMultiplier;
            float      negativeStatMultiplier = towerStats.negativeStatMultiplier;
            GameObject bloodSplat             = towerStats.bloodSplat;
            // save upgraded tower level
            int level = currentTower.GetComponent <TowerType>().level + 1;

            // destroy existing tower to build an upgraded one
            Destroy(currentTower.gameObject);

            // create empty gameObject which will hold all parts of the tower (one/multiple bases and top of the tower)
            GameObject towerHolder = new GameObject("Tower");
            towerHolder.AddComponent <TowerCheck>();
            // make the empty gameObject child of the current platform
            towerHolder.transform.SetParent(currentTowerPlatform.GetComponent <Transform>().Find("Tower Holder"));
            // set up position of the empty gameObject (just in case)
            towerHolder.transform.localPosition = Vector3.zero;

            // assign current tower and upgrade it to a new level
            currentTower = towerHolder.GetComponent <TowerCheck>();
            // add tower type script to the tower and update its stats
            towerHolder.AddComponent <TowerType>();
            currentTower.GetComponent <TowerType>().level                 = level;
            currentTower.GetComponent <TowerType>().towerType             = towerType;
            currentTower.GetComponent <TowerType>().maxHealth             = maxHealth * positiveStatMultiplier;
            currentTower.GetComponent <TowerType>().damageToGive          = damageToGive * positiveStatMultiplier;
            currentTower.GetComponent <TowerType>().fireRange             = fireRange * positiveStatMultiplier;
            currentTower.GetComponent <TowerType>().rechargeTime          = rechargeTime * negativeStatMultiplier;
            currentTower.GetComponent <TowerType>().canHitMultipleEnemies = canHitMultipleEnemies;
            currentTower.GetComponent <TowerType>().upgradeCost           = level * initialUpgradeCost;
            currentTower.GetComponent <TowerType>().initialUpgradeCost    = initialUpgradeCost;
            currentTower.GetComponent <TowerType>().bloodSplat            = bloodSplat;
            upgradePriceText.text = "$" + currentTower.GetComponentInChildren <TowerType>().upgradeCost;

            float towerTopHeight = 0;
            // build required number of base levels
            for (int i = 0; i < level - 1; i++)
            {
                Transform towerBase = Instantiate(GetTowerBase(towerType));
                towerBase.SetParent(towerHolder.transform);
                towerTopHeight          = towerBase.GetComponent <Collider>().bounds.size.y / 4 + towerBase.GetComponent <Collider>().bounds.size.y *i;
                towerBase.localPosition = new Vector3(0, towerTopHeight, 0);
            }

            // build the tower top
            Transform towerTop = Instantiate(GetTowerTop(towerType));
            // Y position of the tower top
            towerTopHeight += towerTop.GetComponent <Collider>().bounds.size.y;
            towerTop.SetParent(towerHolder.transform);
            towerTop.localPosition = new Vector3(0, towerTopHeight, 0);
        }
    }