Beispiel #1
0
        private void CheckForDirtAndCleanIfPossible()
        {
            if (_currentCapacity == 0)
            {
                return;
            }

            // Check tile below me
            var realWorldPosition = transform.position;

            var vLocPos = _doodadsBackgroundTilemap.transform.InverseTransformPoint(realWorldPosition);
            var gridX   = BrushUtil.GetGridX(vLocPos, _doodadsBackgroundTilemap.CellSize);
            var gridY   = BrushUtil.GetGridY(vLocPos, _doodadsBackgroundTilemap.CellSize);


            var gridPosition = TilemapUtils.GetGridPosition(
                _doodadsBackgroundTilemap,
                new Vector2(realWorldPosition.x, realWorldPosition.y)
                );

            gridPosition = new Vector2(gridX, gridY);

            var tileData = _doodadsBackgroundTilemap.GetTileData(gridPosition);

            // Remove the tile below me!
            if (IsDirtTile(tileData))
            {
                _doodadsBackgroundTilemap.Erase(gridPosition);
                _doodadsBackgroundTilemap.UpdateMesh();
                _currentCapacity--;
            }
        }
        public override void OnSceneGUI()
        {
            base.OnSceneGUI();

            if (!m_tilemap && !m_tileset)
            {
                return;
            }

            Vector2 center = Vector2.zero;

            if ((ePositionType)m_action.positionType.Value == ePositionType.LocalPosition)
            {
                center = m_action.position.Value;
            }
            else// if ((ePositionType)positionType.Value == ePositionType.GridPosition)
            {
                if (m_tilemap)
                {
                    center = TilemapUtils.GetTileCenterPosition(m_tilemap, (int)m_action.position.Value.x, (int)m_action.position.Value.y);
                }
                else if (m_tileset)
                {
                    center = TilemapUtils.GetGridWorldPos((int)m_action.position.Value.x, (int)m_action.position.Value.y, m_tileset.TilePxSize / m_tileset.PixelsPerUnit);
                }
            }
            EditorCompatibilityUtils.CircleCap(0, center, Quaternion.identity, m_action.radius.Value);
        }
Beispiel #3
0
        protected void DoColorPaintAction()
        {
            var go = Fsm.GetOwnerDefaultTarget(gameObject);

            if (UpdateCache(go))
            {
                STETilemap tilemap = cachedComponent as STETilemap;
                Vector2    center;
                if ((ePositionType)positionType.Value == ePositionType.LocalPosition)
                {
                    center = position.Value;
                }
                else// if ((ePositionType)positionType.Value == ePositionType.GridPosition)
                {
                    center = TilemapUtils.GetTileCenterPosition(tilemap, (int)position.Value.x, (int)position.Value.y);
                }
                if (applyToTilemapGroup.Value && tilemap.ParentTilemapGroup)
                {
                    tilemap.ParentTilemapGroup.IterateTilemapWithAction(
                        (STETilemap tmap) =>
                    {
                        TilemapVertexPaintUtils.VertexPaintCircle(tmap, center, radius.Value, tileColor.Value, (eBlendMode)blendingMode.Value, (eTileColorPaintMode)tileColorPaintMode.Value == eTileColorPaintMode.Vertex, intensityCurve.curve);
                        tmap.UpdateMesh();
                    }
                        );
                }
                else
                {
                    TilemapVertexPaintUtils.VertexPaintCircle(tilemap, center, radius.Value, tileColor.Value, (eBlendMode)blendingMode.Value, (eTileColorPaintMode)tileColorPaintMode.Value == eTileColorPaintMode.Vertex, intensityCurve.curve);
                    tilemap.UpdateMesh();
                }
            }
        }
        protected virtual void RecalculateDebugPoints(Vector2 startPoint, Vector2 endPoint, DrawingFunction drawingFunc)
        {
            STETilemap tilemap = GetTargetTilemap();

            if (!tilemap)
            {
                return;
            }
            Vector2 cellSizeDiv2 = tilemap.CellSize / 2f;

            m_debugPoints.Clear();
            int x0, y0, x1, y1;

            if ((ePositionType)m_action.positionType.Value == ePositionType.LocalPosition)
            {
                x0 = TilemapUtils.GetGridX(tilemap, startPoint);
                y0 = TilemapUtils.GetGridY(tilemap, startPoint);
                x1 = TilemapUtils.GetGridX(tilemap, endPoint);
                y1 = TilemapUtils.GetGridY(tilemap, endPoint);
            }
            else //if ((ePositionType)m_action.positionType.Value == ePositionType.GridPosition)
            {
                x0 = (int)startPoint.x;
                y0 = (int)startPoint.y;
                x1 = (int)endPoint.x;
                y1 = (int)endPoint.y;
            }
            drawingFunc(x0, y0, x1, y1,
                        (x, y) =>
            {
                m_debugPoints.Add(new Vector2(x * tilemap.CellSize.x + cellSizeDiv2.x, y * tilemap.CellSize.y + cellSizeDiv2.y));
                return(true);
            });
        }
Beispiel #5
0
 public override void Reset()
 {
     base.Reset();
     material = new FsmMaterial()
     {
         Value = TilemapUtils.FindDefaultSpriteMaterial()
     };
 }
Beispiel #6
0
    public override void OnInspectorGUI()
    {
        base.DrawDefaultInspector();

        TilemapUtils tilemapUtils = (TilemapUtils)target;

        if (GUILayout.Button("Clear Tilemap"))
        {
            tilemapUtils.ClearTilemap();
        }
    }
Beispiel #7
0
        public static TilemapSerializedData SerializeTilemap(STETilemap tilemap)
        {
            TilemapSerializedData data = new TilemapSerializedData();

            System.Action <STETilemap, int, int, uint> action = (tmap, gridX, gridY, tileData) =>
            {
                data.tileDataList.Add(new TilemapSerializedData.TileData()
                {
                    gridX = gridX, gridY = gridY, tileData = tileData
                });
            };
            TilemapUtils.IterateTilemapWithAction(tilemap, action);
            return(data);
        }
Beispiel #8
0
 public override void Reset()
 {
     base.Reset();
     material = new FsmMaterial()
     {
         Value = TilemapUtils.FindDefaultSpriteMaterial()
     };
     tintColor      = Color.white;
     parallaxFactor = Vector2.one;
     pixelSnap      = false;
     sortingLayer   = "Default";
     orderInLayer   = 0;
     innerPadding   = 0f;
     visible        = true;
 }
Beispiel #9
0
 public override void Reset()
 {
     name    = "";
     tileset = null;
     //parentGameObject = new FsmOwnerDefault() { OwnerOption = OwnerDefaultOption.SpecifyGameObject,  GameObject = { UseVariable = true } };
     parentGameObject = null;
     material         = new FsmMaterial()
     {
         Value = TilemapUtils.FindDefaultSpriteMaterial()
     };
     sortingLayer = "Default";
     orderInLayer = 0;
     minGridX     = 0;
     minGridY     = 0;
     maxGridX     = 0;
     maxGridY     = 0;
 }
        public override void OnEnter()
        {
            var go = Fsm.GetOwnerDefaultTarget(gameObject);

            if (UpdateCache(go))
            {
                STETilemap tilemap = cachedComponent as STETilemap;
                int        gridX;
                int        gridY;
                if ((ePositionType)positionType.Value == ePositionType.LocalPosition)
                {
                    gridX = TilemapUtils.GetGridX(tilemap, startPaintingPosition.Value);
                    gridY = TilemapUtils.GetGridY(tilemap, startPaintingPosition.Value);
                }
                else// if ((ePositionType)positionType.Value == ePositionType.GridPosition)
                {
                    gridX = (int)startPaintingPosition.Value.x;
                    gridY = (int)startPaintingPosition.Value.y;
                }

                if (tileSelection.selectionData.Length == 1)
                {
                    tilemap.SetTileData(gridX, gridY, (uint)tileSelection.selectionData[0]);
                }
                else
                {
                    int w  = tileSelection.rowLength;
                    int h  = tileSelection.columnLength;
                    int xf = -(w >> 1) + 1 - (w & 1);
                    int yf = -(h >> 1) + 1 - (h & 1);
                    for (int y = h - 1, idx = 0; y >= 0; --y)
                    {
                        for (int x = 0; x < w; ++x, ++idx)
                        {
                            tilemap.SetTileData(gridX + x + xf, gridY + y + yf, (uint)tileSelection.selectionData[idx]);
                        }
                    }
                }


                tilemap.UpdateMesh();
            }

            Finish();
        }
        private void SetDirtiableTiles()
        {
            var data = new List <Vector2>();

            TilemapUtils.IterateTilemapWithAction(_shipBackgroundTilemap, (tilemap, x, y, tileData) =>
            {
                var tile = tilemap.GetTile(x, y);
                if (tile?.paramContainer == null)
                {
                    return;
                }
                if (tile.paramContainer.GetBoolParam("CanBeDirty"))
                {
                    data.Add(new Vector2(x, y));
                }
            });
            _dirtiableTiles = data;
        }
Beispiel #12
0
    protected override void OnTick()
    {
        Entities.ForEach((Entity intent, ref MoveIntentComponent movement) =>
        {
            var allGridPos = GetComponentDataFromEntity <GridPos>();
            if (allGridPos.HasComponent(movement.target))
            {
                var curGridPos    = allGridPos[movement.target];
                curGridPos.Value += movement.direction.ToInt2();

                if (TilemapUtils.IsValidPos(curGridPos.Value, EntityManager))
                {
                    PostUpdateCommands.SetComponent(movement.target, curGridPos);
                }
            }

            PostUpdateCommands.DestroyEntity(intent);
        });
    }
Beispiel #13
0
        private RoombaStationBehaviour FindNextRoombaStation()
        {
            RoombaStationBehaviour choosenStation = null;
            var lowestDist = float.MaxValue;

            TilemapUtils.IterateTilemapWithAction(_doodadsForegroundTilemap, (tilemap, gx, gy, data) =>
            {
                var tile = tilemap.GetTile(gx, gy);
                if (tile?.paramContainer == null)
                {
                    return;
                }
                if (!tile.paramContainer.GetBoolParam("IsRoombaStation"))
                {
                    return;
                }


                var roombaStation = tilemap.GetTileObject(gx, gy).GetComponent <RoombaStationBehaviour>();
                if (!roombaStation.CanRoombaDockHere(this))
                {
                    return;
                }

                var gridWorldPos = TilemapUtils.GetGridWorldPos(
                    _doodadsForegroundTilemap,
                    gx,
                    gy);
                var transformPosition = transform.position.magnitude - gridWorldPos.magnitude;
                if (transformPosition < lowestDist)
                {
                    System.Console.WriteLine("gridWorldPos " + gridWorldPos);
                    System.Console.WriteLine("roombaStation " + roombaStation.transform);
                    choosenStation = roombaStation;
                    lowestDist     = transformPosition;
                }
            });

            return(choosenStation);
        }
Beispiel #14
0
        public override void OnEnter()
        {
            if (!m_tilemap)
            {
                var go = Fsm.GetOwnerDefaultTarget(gameObject);
                if (UpdateCache(go))
                {
                    m_tilemap           = cachedComponent as STETilemap;
                    gridX.Value         = m_tilemap.MinGridX - 1; //NOTE: OnEnter will add 1 the first time
                    gridY.Value         = m_tilemap.MinGridY;
                    storePosition.Value = (ePositionType)positionType.Value == ePositionType.LocalPosition ?
                                          (Vector2)TilemapUtils.GetGridWorldPos(m_tilemap, gridX.Value, gridY.Value)
                    :
                                          new Vector2(gridX.Value, gridY.Value);
                }
            }

            if (gridX.Value < m_tilemap.MaxGridX)
            {
                ++gridX.Value;
            }
            else if (gridY.Value < m_tilemap.MaxGridY)
            {
                ++gridY.Value;
                gridX.Value = m_tilemap.MinGridX;
            }
            else
            {
                Finish();
                return;
            }

            storePosition.Value = (ePositionType)positionType.Value == ePositionType.LocalPosition?
                                  (Vector2)TilemapUtils.GetGridWorldPos(m_tilemap, gridX.Value, gridY.Value)
                :
                                  new Vector2(gridX.Value, gridY.Value);

            Fsm.Event(iterationNextElement);
        }
Beispiel #15
0
        private PF.Point ChooseDestination()
        {
            List <Vector3> targets = TilemapUtils.GetTargets(World.instance.tilemapInterests);

            float   closestDist = float.MaxValue;
            Vector3 closest     = character.transform.position;

            foreach (Vector3 target in targets)
            {
                float dist = (target - character.transform.position).magnitude;

                if (dist < closestDist)
                {
                    closestDist = dist;
                    closest     = target;
                }
            }

            Vector3Int pos = World.instance.GetGridPos(closest);

            return(new PF.Point((int)pos.x, (int)pos.y));
        }
Beispiel #16
0
        protected override void DoPaintAction()
        {
            var go = Fsm.GetOwnerDefaultTarget(gameObject);

            if (UpdateCache(go))
            {
                STETilemap tilemap = cachedComponent as STETilemap;
                int        gridX;
                int        gridY;
                if ((ePositionType)positionType.Value == ePositionType.LocalPosition)
                {
                    gridX = TilemapUtils.GetGridX(tilemap, startPaintingPosition.Value);
                    gridY = TilemapUtils.GetGridY(tilemap, startPaintingPosition.Value);
                }
                else// if ((ePositionType)positionType.Value == ePositionType.GridPosition)
                {
                    gridX = (int)startPaintingPosition.Value.x;
                    gridY = (int)startPaintingPosition.Value.y;
                }
                TilemapDrawingUtils.FloodFill(tilemap as STETilemap, gridX, gridY, tileSelection.Get2DTileDataArray(), randomizePattern.Value);
                tilemap.UpdateMesh();
            }
        }
Beispiel #17
0
        private void HandleSearchDirt()
        {
            if (!navMeshAgent2D.hasPath && _currentCapacity > 0)
            {
                // Find the nearest dirt tile
                _waitingTicks = 60;
                var choosenPosition = Vector2.positiveInfinity;
                var lowestDist      = float.MaxValue;

                TilemapUtils.IterateTilemapWithAction(_doodadsBackgroundTilemap, (tilemap, gx, gy, data) =>
                {
                    if (IsDirtTile(data))
                    {
                        var gridWorldPos = TilemapUtils.GetGridWorldPos(
                            _doodadsBackgroundTilemap,
                            gx,
                            gy);
                        var transformPosition = Vector2.Distance(transform.position, gridWorldPos);
                        if (transformPosition < lowestDist)
                        {
                            lowestDist      = transformPosition;
                            choosenPosition = new Vector2(gx, gy);
                        }
                    }
                });

                if (Math.Abs(lowestDist - float.MaxValue) > 0.01)
                {
                    var gridWorldPos = TilemapUtils.GetGridWorldPos(
                        _doodadsBackgroundTilemap,
                        (int)choosenPosition.x,
                        (int)choosenPosition.y);
                    // add 0.25f to y so the roomba is on top of dirt tiles
                    navMeshAgent2D.destination = gridWorldPos + new Vector3(0, 0.25f, 0);
                }
            }
        }
    // 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);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
Beispiel #19
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;
            }
        }
    }
Beispiel #20
0
 public void InitPathFindGrid()
 {
     bool[,] solids = TilemapUtils.GetWalkableMonster(tilemapLayout);
     pathFindGrid   = new PF.Grid(solids);
 }