Beispiel #1
0
    // Use to process your families.
    protected override void onProcess(int familiesUpdateCount)
    {
        if (!levelInit)
        {
            // Pause all game system during initialisation
            foreach (FSystem system in SystemHolder.pausableSystems)
            {
                if (system == this)
                {
                    continue;
                }
                system.Pause = true;
            }

            foreach (GameObject go in _mapSpawnerGO)
            {
                Factory factory = go.GetComponent <Factory>();
                Tilemap tilemap = go.GetComponent <Tilemap>();

                //factory.reloadProgress += Time.deltaTime;
                if (factory.reloadProgress >= factory.reloadTime)
                {
                    foreach (var pos in tilemap.cellBounds.allPositionsWithin)
                    {
                        Vector3Int localPos = new Vector3Int(pos.x, pos.y, pos.z);

                        if (tilemap.HasTile(localPos))
                        {
                            Vector3 worldPos = tilemap.CellToWorld(localPos);

                            //Instantiate and bind to FYFY a new instance of antibodies drift (factory prefab)
                            GameObject mySpawn = Object.Instantiate <GameObject>(factory.prefab, worldPos, Quaternion.Euler(0f, 0f, Random.Range(0f, 360f)));
                            GameObjectManager.bind(mySpawn);
                        }
                    }

                    factory.reloadProgress = 0f;
                }
            }

            foreach (GameObject go in _playerGO)
            {
                Player player = go.GetComponent <Player>();

                foreach (GameObject buyableGO in player.levelBuyablePrefabs)
                {
                    Buyable buyable = buyableGO.GetComponent <Buyable>();

                    //Create a new visual
                    GameObject myUI = Object.Instantiate <GameObject>(player.unitUIVisual, player.unitContainer.transform);
                    GameObjectManager.bind(myUI);

                    //Add height to container (each new element is 100px height here)
                    RectTransform rt = player.unitContainer.GetComponent <RectTransform>();
                    rt.sizeDelta = new Vector2(rt.sizeDelta.x, rt.sizeDelta.y + 100);

                    SpriteRenderer sr   = buyableGO.GetComponentInChildren <SpriteRenderer>();
                    Info           info = buyableGO.GetComponent <Info>();

                    //Update UI image and text
                    UIUnit ui = myUI.GetComponent <UIUnit>();
                    ui.image.sprite = sr.sprite;
                    ui.image.color  = sr.color;

                    ui.text.text = info.myName.Replace("\\n", "\n");;
                    if (buyable != null)
                    {
                        ui.text.text += "\nCost : " + buyable.energyPrice.ToString("F0") + " energy";
                    }

                    ui.prefab = buyableGO;
                }
            }

            levelInit = true;

            // Resume systems
            foreach (FSystem system in SystemHolder.pausableSystems)
            {
                system.Pause = false;
            }
        }
        else
        {
            foreach (GameObject go in _playerGO)
            {
                Health playerHealth = go.GetComponent <Health>();
                Energy playerEnergy = go.GetComponent <Energy>();

                //Update health
                if (playerHealth != null && !gamePaused)
                {
                    bool init = false;

                    if (playerHealth.maxHealthPoints == 0)
                    {
                        init = true;
                    }
                    playerHealth.healthPoints = 0;

                    foreach (GameObject cellGO in _cellsGO)
                    {
                        Health cellHealth = cellGO.GetComponent <Health>();

                        if (init)
                        {
                            playerHealth.maxHealthPoints += cellHealth.maxHealthPoints;
                        }

                        playerHealth.healthPoints += cellHealth.healthPoints;
                    }
                }

                //Update energy
                if (playerEnergy != null && !gamePaused)
                {
                    foreach (GameObject energizerGO in _energizerGO)
                    {
                        Energizer energizer = energizerGO.GetComponent <Energizer>();

                        energizer.reloadProgress += Time.deltaTime;

                        if (energizer.reloadProgress >= energizer.reloadTime)
                        {
                            playerEnergy.energyPoints += energizer.recoverPoints;

                            energizer.reloadProgress = 0f;
                        }
                    }

                    //Cap at max
                    if (playerEnergy.energyPoints > playerEnergy.maxEnergyPoints)
                    {
                        playerEnergy.energyPoints = playerEnergy.maxEnergyPoints;
                    }

                    if (playerEnergy.energyPoints < 0)
                    {
                        playerEnergy.energyPoints = 0f;
                    }
                }
            }

            //Check cell spawn position of cell is dead
            foreach (GameObject go in _mapSpawnerGO)
            {
                Tilemap tilemap = go.GetComponent <Tilemap>();

                //Remove cell tile position when cell is dead
                foreach (var pos in tilemap.cellBounds.allPositionsWithin)
                {
                    Vector3Int localPos = new Vector3Int(pos.x, pos.y, pos.z);

                    if (tilemap.HasTile(localPos))
                    {
                        bool    cellFound = false;
                        Vector3 worldPos  = tilemap.CellToWorld(localPos);

                        Collider2D[] colliders = Physics2D.OverlapCircleAll(worldPos, 1f, LayerMask.GetMask("Ignore Raycast"));

                        foreach (Collider2D collider in colliders)
                        {
                            GameObject collidedGO = collider.gameObject;

                            if (_cellsGO.contains(collidedGO.GetInstanceID()))
                            {
                                //There is a cell at position
                                cellFound = true;
                                break;
                            }
                        }

                        if (!cellFound)
                        {
                            tilemap.SetTile(localPos, null);
                        }
                    }
                }
            }

            //Spawn waves
            if (!gamePaused)
            {
                foreach (GameObject go in _levelSpawnerGO)
                {
                    FactoryLevel factory = go.GetComponent <FactoryLevel>();

                    factory.reloadProgress += Time.deltaTime;

                    if (factory.reloadProgress >= factory.reloadTime)
                    {
                        if (factory.currentWave < factory.waves.Count)
                        {
                            Wave wave = factory.waves[factory.currentWave];

                            List <Vector3> spawnArea  = TilemapUtils.getAllWorldPosition(factory.spawnArea);
                            List <Vector3> targetArea = TilemapUtils.getAllWorldPosition(factory.spawnTargetArea);

                            //Spawn each group of entity
                            foreach (Group g in wave.groups)
                            {
                                int i = 0;

                                while (i < g.nbSpawn)
                                {
                                    Vector3 position = Vector3.zero;
                                    if (spawnArea.Count > 0)
                                    {
                                        position = spawnArea[Random.Range(0, spawnArea.Count)];
                                    }

                                    GameObject mySpawn = Object.Instantiate <GameObject>(g.prefab, position, Quaternion.Euler(0f, 0f, Random.Range(0f, 360f)));
                                    GameObjectManager.bind(mySpawn);

                                    //Init first target move
                                    Vector3 target = Vector3.zero;
                                    if (targetArea.Count > 0)
                                    {
                                        target = targetArea[Random.Range(0, targetArea.Count)];
                                    }

                                    Move mv = mySpawn.GetComponent <Move>();
                                    if (mv != null)
                                    {
                                        mv.targetPosition    = target;
                                        mv.targetObject      = null;
                                        mv.newTargetPosition = true;
                                        mv.forcedTarget      = true;
                                    }

                                    i++;
                                }
                            }

                            factory.reloadTime     = wave.timeBeforeNext;
                            factory.reloadProgress = 0f;

                            factory.currentWave += 1;
                        }
                    }



                    //Destroy level wave factory if last wave was released (for victory condition)
                    if (factory.currentWave >= factory.waves.Count)
                    {
                        if (factory.waveIndicator != null)
                        {
                            StringBuilder sb = new StringBuilder();

                            sb.AppendLine("Wave : " + factory.currentWave + " / " + factory.waves.Count);
                            sb.AppendLine("Final Wave");

                            factory.waveIndicator.text = sb.ToString();
                        }

                        GameObjectManager.removeComponent <FactoryLevel>(go);
                        //GameObjectManager.unbind(go);
                        //Object.Destroy(go);
                    }
                    else
                    {
                        if (factory.waveIndicator != null)
                        {
                            StringBuilder sb = new StringBuilder();

                            sb.AppendLine("Wave : " + factory.currentWave + " / " + factory.waves.Count);
                            float time = factory.reloadTime - factory.reloadProgress;
                            sb.AppendLine("Time remain : " + time.ToString("F0"));

                            factory.waveIndicator.text = sb.ToString();
                        }
                    }
                }
            }

            //Check level status
            if (_attackersGO.Count == 0)
            {
                levelStatus = "Victory";
            }
            else
            {
                int nbHealth     = 0;
                int nbHealthZero = 0;

                foreach (GameObject go in _playerGO)
                {
                    Health playerHealth = go.GetComponent <Health>();

                    if (playerHealth != null)
                    {
                        nbHealth += 1;

                        if (playerHealth.healthPoints == 0)
                        {
                            nbHealthZero += 1;
                        }
                    }
                }

                if (nbHealthZero == nbHealth)
                {
                    levelStatus = "Defeat";
                }
            }
        }

        GameObject playerGO = _playerGO.First();

        if (playerGO != null)
        {
            Player player = playerGO.GetComponent <Player>();

            string title, descr;
            switch (levelStatus)
            {
            case "Victory":
                title = "Victoire !";
                descr = "Vous avez réussi à vous protéger de la menace pathogène.";
                endGame(player, title, descr);
                break;

            case "Defeat":
                title = "Défaite.";
                descr = "La menace pathogène s'est trop répandue et est maintenant hors de contrôle.";
                endGame(player, title, descr);
                break;

            case "Pending":
            default:
                break;
            }
        }
    }
    // Use to process your families.
    protected override void onProcess(int familiesUpdateCount)
    {
        GameObject go = _selectorGO.First();

        if (go != null)
        {
            SelectorEntity selector = go.GetComponent <SelectorEntity>();

            bool isOnBuyable = false;
            foreach (GameObject buyable in _buyableSelectableGO)
            {
                if (Input.GetMouseButtonDown(0))
                {
                    unSelectAll(selector);

                    SelectableEntity selectable = buyable.GetComponent <SelectableEntity>();

                    selectable.isSelected = true;
                    GameObjectManager.setGameObjectTag(buyable, "Selected");

                    isOnBuyable = true;
                    break;
                }
            }

            if (!isOnBuyable)
            {
                // If we press the right mouse button, move selected units or buy unit
                if (Input.GetMouseButtonDown(1) && !selector.isSelecting && _selectedGO.Count > 0)
                {
                    foreach (GameObject selectedObject in _selectedGO)
                    {
                        Move move = null;

                        if (selector.hasSelected)
                        {
                            //Case : unit selected -> move the unit
                            move = selectedObject.GetComponent <Move>();
                        }
                        else
                        {
                            //Case : buyable object selected -> buy
                            UIUnit     ui       = selectedObject.GetComponent <UIUnit>();
                            GameObject playerGO = _playerGO.First();

                            if (ui != null && ui.prefab != null && playerGO != null)
                            {
                                Player player = playerGO.GetComponent <Player>();

                                Energy  playerEnergy = playerGO.GetComponent <Energy>();
                                Buyable buyable      = ui.prefab.GetComponent <Buyable>();

                                //Check if we have enough "money"
                                if (buyable != null && buyable.energyPrice <= playerEnergy.energyPoints)
                                {
                                    playerEnergy.energyPoints -= buyable.energyPrice;

                                    //Spawn
                                    List <Vector3> spawnArea = TilemapUtils.getAllWorldPosition(player.spawnArea);
                                    Vector3        position  = Vector3.zero;
                                    if (spawnArea.Count > 0)
                                    {
                                        position = spawnArea[Random.Range(0, spawnArea.Count)];
                                    }

                                    GameObject myNewUnit = Object.Instantiate <GameObject>(ui.prefab, position, Quaternion.Euler(0f, 0f, Random.Range(0f, 360f)));
                                    GameObjectManager.bind(myNewUnit);

                                    move = myNewUnit.GetComponent <Move>();
                                }

                                //unSelectAll();
                            }
                        }

                        //Move the unit
                        if (move != null)
                        {
                            move.targetPosition    = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                            move.newTargetPosition = true;
                            move.forcedTarget      = true;
                        }
                    }
                }

                // If we press the left mouse button, begin selection and remember the location of the mouse
                if (Input.GetMouseButtonDown(0))
                {
                    selector.isSelecting    = true;
                    selector.mousePosition1 = Input.mousePosition;

                    unSelectAll(selector);
                }

                // If we let go of the left mouse button, end selection
                if (Input.GetMouseButtonUp(0))
                {
                    List <GameObject> selectedObjects = new List <GameObject>();

                    foreach (GameObject selectableObject in _selectableGO)
                    {
                        if (IsWithinSelectionBounds(selectableObject, selector))
                        {
                            SelectableEntity selectable = selectableObject.GetComponent <SelectableEntity>();
                            selectable.isSelected = false;
                            GameObjectManager.setGameObjectTag(selectableObject, "Selected");

                            selectedObjects.Add(selectableObject);
                        }
                    }

                    var sb = new StringBuilder();
                    sb.AppendLine(string.Format("Selecting [{0}] Units", selectedObjects.Count));
                    foreach (GameObject selectedObject in selectedObjects)
                    {
                        sb.AppendLine("-> " + selectedObject.name);
                    }
                    Debug.Log(sb.ToString());

                    selector.isSelecting = false;
                    if (selectedObjects.Count > 0)
                    {
                        selector.hasSelected = true;
                    }
                }

                // Highlight all objects within the selection box
                foreach (GameObject selectableObject in _selectableGO)
                {
                    Renderer r = selectableObject.GetComponentInChildren <Renderer>();
                    if (IsWithinSelectionBounds(selectableObject, selector))
                    {
                        if (r != null)
                        {
                            r.material.color = Color.green;
                        }
                    }
                    else
                    {
                        if (r != null)
                        {
                            r.material.color = Color.white;
                        }
                    }
                }
            }

            if (Input.GetMouseButtonDown(0))
            {
                //Update infos
                Ray          ray   = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit2D hit2d = Physics2D.GetRayIntersection(ray, Mathf.Infinity, LayerMask.GetMask("Ignore Raycast"));

                if (hit2d.collider != null)
                {
                    GameObject collideGO = hit2d.collider.gameObject;

                    if (collideGO != null)
                    {
                        Info infos = collideGO.GetComponent <Info>();

                        if (infos != null)
                        {
                            foreach (GameObject infoPanelGo in _infoPanelGO)
                            {
                                UIUnit ui = infoPanelGo.GetComponent <UIUnit>();

                                if (ui.image != null)
                                {
                                    SpriteRenderer sr = collideGO.GetComponentInChildren <SpriteRenderer>();

                                    if (sr != null)
                                    {
                                        ui.image.sprite = sr.sprite;
                                        ui.image.color  = sr.color;
                                    }
                                    else
                                    {
                                        ui.image.sprite = Resources.Load <Sprite>("Icons/placeholder");
                                        ui.image.color  = Color.white;
                                    }
                                }

                                if (ui.text != null)
                                {
                                    ui.text.text = infos.myName.Replace("\\n", "\n");;
                                }

                                if (ui.description != null)
                                {
                                    StringBuilder sb = new StringBuilder();

                                    Prey prey = collideGO.GetComponent <Prey>();
                                    if (prey != null)
                                    {
                                        sb.AppendLine("Type : " + prey.myType);
                                    }

                                    Predator predator = collideGO.GetComponent <Predator>();
                                    if (predator != null)
                                    {
                                        sb.AppendLine("Targets : " + string.Join(" / ", predator.myPreys) + "\n");
                                    }

                                    sb.AppendLine(infos.myDescription);

                                    ui.description.text = sb.ToString().Replace("\\n", "\n");;

                                    RectTransform rtInfoPanel       = (RectTransform)ui.gameObject.transform;
                                    RectTransform rtDescriptionText = (RectTransform)ui.description.GetComponent <ContentSizeFitter>().transform;
                                    LayoutRebuilder.ForceRebuildLayoutImmediate(rtDescriptionText);

                                    float posy = -10 - rtDescriptionText.rect.height / 2;

                                    rtDescriptionText.anchoredPosition = new Vector2(rtDescriptionText.anchoredPosition.x, posy);
                                    rtInfoPanel.sizeDelta = new Vector2(rtInfoPanel.sizeDelta.x, rtDescriptionText.rect.height);
                                }

                                if (ui.button != null)
                                {
                                    ui.button.onClick.RemoveAllListeners();
                                    ButtonSystem_wrapper b = Object.FindObjectOfType <ButtonSystem_wrapper>();

                                    if (infos.moreInfoUrl != null && infos.moreInfoUrl != "" && b != null)
                                    {
                                        ui.button.onClick.AddListener(delegate { b.openURL(infos.moreInfoUrl); });
                                        GameObjectManager.setGameObjectState(ui.button.gameObject, true);
                                    }
                                    else
                                    {
                                        GameObjectManager.setGameObjectState(ui.button.gameObject, false);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }