GameObject InitializeGhost(Tower_V2 tower_to_ghost, Vector3 position)
    {
        //clean up old ghost if it hasn't already been done
        RemoveGhost();

        //new gameobjects
        ghost_tower = new GameObject();
        GameObject render_gameobject = new GameObject();

        //set transform parent
        render_gameobject.transform.SetParent(ghost_tower.transform);

        //init components + copy mesh filter and renderer data from prefab Tower_V2 to render_gameobject
        MeshFilter init_filter           = render_gameobject.AddComponent <MeshFilter>();
        MeshFilter tower_to_ghost_filter = tower_to_ghost.GetComponentInChildren <MeshFilter>();

        init_filter.mesh = tower_to_ghost_filter.sharedMesh;
        MeshRenderer init_renderer = render_gameobject.AddComponent <MeshRenderer>();

        //init origin worldspace location
        ghost_tower.transform.position = position;

        //init tower local transform
        render_gameobject.transform.localScale    = tower_to_ghost_filter.gameObject.transform.localScale;
        render_gameobject.transform.localRotation = tower_to_ghost_filter.gameObject.transform.localRotation;
        render_gameobject.transform.localPosition = tower_to_ghost_filter.gameObject.transform.localPosition;

        //we set material later
        return(ghost_tower);
    }
Example #2
0
 private void StartTowerPlacement(Tower_V2 tower)
 {
     if (CheckWaveStart()) //REMOVE THIS TO ALLOW TO TOWER PLACEMENT WHENEVER
     {
         OnStartTowerPlacement?.Invoke(this, new TowerPlacementEventArgs(tower.tower_name));
         RequestPlacementNodePing?.Invoke(this, System.EventArgs.Empty);
     }
 }
Example #3
0
    //starts the tower placement behavior
    void StartTowerPlacement(object caller, TowerPlacementEventArgs args)
    {
        flag_placement_in_progress = true;

        //Find a tower with the name matching our argument
        tower_to_place = Tower_Manager_V2.GetTowerPrefabList().Find(x => x.tower_name == args.tower_name); //fancy predicate using Linq!
        //Debug.Log("Tower to place is ID of: " + tower_to_place.gameObject.ToString());
    }
Example #4
0
 //Tries to attach tower to this node. Will return false if there is already a tower at this node.
 public bool TryAttachTower(Tower_V2 tow)
 {
     if (attached_tower == null)
     {
         attached_tower         = tow;
         tow.transform.position = transform.position;
         return(true);
     }
     else
     {
         return(false);
     }
 }
    void OnNodeSelect(object caller, TowerPlaceSelectEventArgs args)
    {
        //Debug.Log("node selected");

        //TODO: Have an actual, nonmagical cost
        //handle placing tower
        //Can only place if there is no tower already present and we are currently trying to place a tower
        if (flag_placement_in_progress)
        {
            if (!args.node.IsOccupied())
            {
                //Debug.Log("placement attempt");
                if (Resource_Inventory.TryTakeResources(tower_to_place.price_list))
                {
                    RemoveGhostFade();

                    Tower_V2 tower_instance = Instantiate(tower_to_place, new Vector3(0, 0, 0), Quaternion.identity);
                    //if the node can't attach the new tower instance, we destroy it
                    if (!args.node.TryAttachTower(tower_instance))
                    {
                        //Debug.Log("placement attempt failed! destroying instance...");
                        Destroy(tower_instance);
                    }
                    else
                    {
                        //Debug.Log("placement attempt successful!");
                        EndTowerPlacement();
                    }

                    TowerPlacedEvent?.Invoke(this, new TowerV2RefEventArgs(tower_instance));
                }
                else
                {
                    //Write tower construction failed! code here.
                    //Text bubble explains why placement cant happen. Make sure this isnt spammable!?

                    Text_Bubble.CreateTemporaryTextBubble("Not enough resources!", info_bubble_duration, args.node.gameObject.transform.position);
                }
            }
            else
            {
                //TODO: Tower failed! reason: space is already occupied!
                Text_Bubble.CreateTemporaryTextBubble("Space occuupied!", info_bubble_duration, args.node.gameObject.transform.position);
            }
        }
    }
Example #6
0
    void OnNodeSelect(object caller, TowerPlaceSelectEventArgs args)
    {
        //Debug.Log("node selected");

        //handle placing tower
        if (flag_placement_in_progress)
        {
            //Debug.Log("placement attempt");

            Tower_V2 tower_instance = Instantiate(tower_to_place, new Vector3(0, 0, 0), Quaternion.identity);
            //if the node can't attach the new tower instance, we destroy it
            if (!args.node.TryAttachTower(tower_instance))
            {
                //Debug.Log("placement attempt failed! destroying instance...");
                Destroy(tower_instance);
            }
            else
            {
                //Debug.Log("placement attempt successful!");
                flag_placement_in_progress = false;
            }
        }
    }
Example #7
0
 private void DetachTower(object caller, TowerV2RefEventArgs args)
 {
     attached_tower = null;
 }
Example #8
0
 public TowerV2RefEventArgs(Tower_V2 tow)
 {
     this.tower = tow;
 }