Beispiel #1
0
    // Starts a push chain
    public override bool InitiatePush(TileElement[,,] board, Facet direction, Monocoord newOccupant)
    {
        LinkedList <TileElement> evaluatedTiles = new LinkedList <TileElement>();

        if (Push(board, direction, evaluatedTiles))
        {
            // Sets the newOccupant to its position if push is successful
            if (newOccupant != null)
            {
                board[newOccupant.GetPos().x, newOccupant.GetPos().y, newOccupant.GetPos().z] = newOccupant;
            }

            // All pushed elements are dropped and their physics helper properties are reset
            foreach (TileElement te in evaluatedTiles)
            {
                te.Fall(board);
                te.Checked = false;
                te.Moving  = false;
            }
            evaluatedTiles.Clear();

            // Executes movement animation
            LevelManager.current.StartCoroutine(LevelManager.current.AnimateTileStateChange());

            return(true);
        }
        return(false);
    }
Beispiel #2
0
 public override void Revert(TileElement[,,] board)
 {
     tileElement.model = GameObject.Instantiate(Resources.Load("Models/" + tileElement.TileName())) as GameObject;
     tileElement.BindDataToModel();
     tileElement.WarpToPos();
     tileElement.AdjustRender();
     if (tileElement is Monocoord)
     {
         Monocoord monoTile = (Monocoord)tileElement;
         board[monoTile.GetPos().x, monoTile.GetPos().y, monoTile.GetPos().z] = tileElement;
         if (tileElement is Vine)
         {
             LevelManager.current.AdjustAvailableVinesUI(((Vine)tileElement).GetColor(), -1);
         }
     }
     else
     {
         Dicoord diTile = (Dicoord)tileElement;
         for (int x = diTile.GetPos1().x; x <= diTile.GetPos2().x; x++)
         {
             for (int y = diTile.GetPos1().y; y <= diTile.GetPos2().y; y++)
             {
                 for (int z = diTile.GetPos1().z; z <= diTile.GetPos2().z; z++)
                 {
                     board[x, y, z] = tileElement;
                 }
             }
         }
     }
 }
Beispiel #3
0
 // PHYSICS
 public abstract bool InitiatePush(TileElement[,,] board, Facet direction, Monocoord newOccupant);
Beispiel #4
0
    public override void Revert(TileElement[,,] board)
    {
        if (tileElement is Monocoord)
        {
            Monocoord monocoord = (Monocoord)tileElement;

            if (board[monocoord.GetPos().x, monocoord.GetPos().y, monocoord.GetPos().z] is IMonoSpacious)
            {
                ((IMonoSpacious)board[monocoord.GetPos().x, monocoord.GetPos().y, monocoord.GetPos().z]).Expecting = true;
            }
            else
            {
                board[monocoord.GetPos().x, monocoord.GetPos().y, monocoord.GetPos().z] = null;
            }

            monocoord.SetCoords(new int[]
            {
                oldPos.x,
                oldPos.y,
                oldPos.z
            });

            if (board[monocoord.GetPos().x, monocoord.GetPos().y, monocoord.GetPos().z] != null && board[monocoord.GetPos().x, monocoord.GetPos().y, monocoord.GetPos().z] is IMonoSpacious)
            {
                ((IMonoSpacious)board[monocoord.GetPos().x, monocoord.GetPos().y, monocoord.GetPos().z]).Helper.Inhabitant = monocoord;
                ((IMonoSpacious)board[monocoord.GetPos().x, monocoord.GetPos().y, monocoord.GetPos().z]).TileEnters(monocoord);
            }
            else
            {
                board[monocoord.GetPos().x, monocoord.GetPos().y, monocoord.GetPos().z] = monocoord;
            }
        }
        else
        {
            Dicoord dicoord = ((Dicoord)tileElement);

            for (int x = dicoord.GetPos1().x; x <= dicoord.GetPos2().x; x++)
            {
                for (int y = dicoord.GetPos1().y; y <= dicoord.GetPos2().y; y++)
                {
                    for (int z = dicoord.GetPos1().z; z <= dicoord.GetPos2().z; z++)
                    {
                        if (board[x, y, z] is IMonoSpacious)
                        {
                            ((IMonoSpacious)board[x, y, z]).Expecting = true;
                        }
                        else
                        {
                            board[x, y, z] = null;
                        }
                    }
                }
            }

            dicoord.SetCoords(new int[]
            {
                oldPos.x,
                oldPos.y,
                oldPos.z
            },
                              new int[] {
                oldPos.x + (dicoord.GetPos2().x - dicoord.GetPos1().x),
                oldPos.y + (dicoord.GetPos2().y - dicoord.GetPos1().y),
                oldPos.z + (dicoord.GetPos2().z - dicoord.GetPos1().z)
            });

            for (int x = dicoord.GetPos1().x; x <= dicoord.GetPos2().x; x++)
            {
                for (int y = dicoord.GetPos1().y; y <= dicoord.GetPos2().y; y++)
                {
                    for (int z = dicoord.GetPos1().z; z <= dicoord.GetPos2().z; z++)
                    {
                        if (board[x, y, z] != null && board[x, y, z] is IMonoSpacious)
                        {
                            ((IMonoSpacious)board[x, y, z]).Helper.Inhabitant = dicoord;
                            ((IMonoSpacious)board[x, y, z]).TileEnters(dicoord);
                        }
                        else
                        {
                            board[x, y, z] = dicoord;
                        }
                    }
                }
            }
        }
        tileElement.WarpToPos();
    }
Beispiel #5
0
    public void LoadLevel(string levelPath, bool playing)
    {
        // Load LevelData and initialize the lists
        levelData = (LevelData)SerializationManager.LoadData(levelPath);
        TileElement tileModel = Constants.TILE_MODELS[(int)TileElementNames.Ground];

        availableVines = levelData.availableVines;

        // Create the Grounds
        board = new TileElement[levelData.grounds.GetLength(0), levelData.grounds.GetLength(1), levelData.grounds.GetLength(2)];
        for (int x = 0; x < board.GetLength(0); x++)
        {
            for (int y = 0; y < board.GetLength(1); y++)
            {
                for (int z = 0; z < board.GetLength(2); z++)
                {
                    if (levelData.grounds[x, y, z] != null)
                    {
                        board[x, y, z] = tileModel.LoadTileElement(new object[] {
                            new Vector3Int(x, y, z),
                            levelData.grounds[x, y, z]
                        });
                        board[x, y, z].model = Instantiate(Resources.Load("Models/Ground")) as GameObject;
                        board[x, y, z].BindDataToModel();
                        board[x, y, z].WarpToPos();
                        ((Ground)board[x, y, z]).ColorFacets(litBases);
                    }
                }
            }
        }

        // Create Bramble and save his position
        bramble = (Bramble)Constants.TILE_MODELS[(int)TileElementNames.Bramble].LoadTileElement(new object[]
        {
            new Vector3Int(levelData.brambleCoords[0], levelData.brambleCoords[1], levelData.brambleCoords[2]),
            levelData.brambleDirection
        });
        bramble.model = Instantiate(Resources.Load("Models/Bramble")) as GameObject;
        bramble.BindDataToModel();
        bramble.WarpToPos();
        board[bramble.GetPos().x, bramble.GetPos().y, bramble.GetPos().z] = bramble;

        // Create the Sigil
        board[levelData.sigilCoords[0], levelData.sigilCoords[1], levelData.sigilCoords[2]] = (Sigil)Constants.TILE_MODELS[(int)TileElementNames.Sigil].LoadTileElement(new object[]
        {
            new Vector3Int(levelData.sigilCoords[0], levelData.sigilCoords[1], levelData.sigilCoords[2]),
        });
        board[levelData.sigilCoords[0], levelData.sigilCoords[1], levelData.sigilCoords[2]].model = Instantiate(Resources.Load("Models/Sigil")) as GameObject;
        board[levelData.sigilCoords[0], levelData.sigilCoords[1], levelData.sigilCoords[2]].BindDataToModel();
        board[levelData.sigilCoords[0], levelData.sigilCoords[1], levelData.sigilCoords[2]].WarpToPos();

        // Convert the data arrays to Queues
        Queue <int> intQueue = new Queue <int>();

        for (int i = 0; i < levelData.dataInts.Length; i++)
        {
            intQueue.Enqueue(levelData.dataInts[i]);
        }
        Queue <Shade> shadeQueue = new Queue <Shade>();

        for (int i = 0; i < levelData.dataShades.Length; i++)
        {
            shadeQueue.Enqueue(levelData.dataShades[i]);
        }

        // Decompile all of the non-essential elements
        for (int i = 0; i < levelData.tileTypes.Length; i++)
        {
            TileElement tileBase       = Constants.TILE_MODELS[(int)levelData.tileTypes[i]];
            TileElement decompiledTile = tileBase.DecompileTileElement(ref intQueue, ref shadeQueue);
            decompiledTile.model = Instantiate(Resources.Load("Models/" + tileBase.TileName())) as GameObject;
            decompiledTile.BindDataToModel();
            decompiledTile.WarpToPos();
            decompiledTile.AdjustRender();
            if (tileBase is Monocoord)
            {
                Monocoord monoTile = (Monocoord)decompiledTile;
                board[monoTile.GetPos().x, monoTile.GetPos().y, monoTile.GetPos().z] = decompiledTile;
            }
            else
            {
                Dicoord diTile = (Dicoord)decompiledTile;
                for (int x = diTile.GetPos1().x; x <= diTile.GetPos2().x; x++)
                {
                    for (int y = diTile.GetPos1().y; y <= diTile.GetPos2().y; y++)
                    {
                        for (int z = diTile.GetPos1().z; z <= diTile.GetPos2().z; z++)
                        {
                            board[x, y, z] = decompiledTile;
                        }
                    }
                }
            }
        }

        CameraManager.current.CalibrateCamera(board);
    }