Пример #1
0
 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");
        }
    }
Пример #3
0
 public void RemoveOnTowerSellCallback(Cell cell, OnTowerSell callback)
 {
     onTowerSellCallbacks[cell].Remove(callback);
 }