private WordTile setTileBlastDirection(List <Tile> tiles) { WordTile t = (WordTile)tiles[tiles.Count - 1]; WordTile lastTile = (WordTile)tiles[tiles.Count - 2]; if (Mathf.Abs(lastTile.getRow() - t.getRow()) + Math.Abs(lastTile.getCol() - t.getCol()) > 1) { if (tiles.Count == 5) { if ((lastTile.getRow() - t.getRow() == 1 && (lastTile.getCol() - t.getCol() == 1)) || (lastTile.getRow() - t.getRow() == -1 && (lastTile.getCol() - t.getCol() == -1))) { t.blasterDirection = 3; } else { t.blasterDirection = 4; } } else if (tiles.Count == 6) { t.blasterDirection = 6; } else { t.blasterDirection = 7; } } else { if (tiles.Count == 5) { if (Mathf.Abs(lastTile.getRow() - t.getRow()) > 0) { t.blasterDirection = 2; } else { t.blasterDirection = 1; } } else if (tiles.Count == 6) { t.blasterDirection = 5; } else { t.blasterDirection = 7; } } return(t); }
private void consumeCrown(WordTile tile) { if (tile.crown) { List <Anchor> anchors = getAnchors(); List <Ice> ice = getIce(); Ice iceAboveTile = (Ice)getIceTile(tile.getRow(), tile.getCol()); if (ice.Count > 0 && iceAboveTile != null) { ice.Remove(iceAboveTile); } if (anchors.Count > 0) // pop Tile below anchor { Anchor pickedAnchor = (anchors[UnityEngine.Random.Range(0, anchors.Count)]); for (int n = 0; n < pickedAnchor.getRow(); n++) { Tile t = getTile(n, pickedAnchor.getCol()); if (t is WordTile && t != tile) { popCrown(tile, t); break; } } } else if (ice.Count > 0) //pop tile with ice { int random = UnityEngine.Random.Range(0, ice.Count); Ice pickedIce = (ice[random]); WordTile abovePicked = (WordTile)getTile(pickedIce.getRow(), pickedIce.getCol()); popCrown(tile, abovePicked); } else //pop random tile { List <WordTile> wordTilesList = getWordTiles(); for (int a = 0; a < wordTilesList.Count; a++) { Tile t = wordTilesList[UnityEngine.Random.Range(0, wordTilesList.Count())]; if (t is WordTile && t != tile) { popCrown(tile, t); break; } } } } }
private void _popAndMoveDown(List <Tile> tiles) //all tiles should be wordtiles { if (tiles == null) { return; } for (int i = 0; i < tiles.Count; i++) { pop(tiles[i]); } if (tiles.Count > 4) { WordTile t = setTileBlastDirection(tiles); t.appear(); setTile(t, t.getRow(), t.getCol());//put back t } bool moved = true; while (moved) { moved = this.moveDown(); for (int c = 0; c < col; c++) { for (int r = row - 1; r >= 0; r--) { if (getTile(r, c) == null) { float n = UnityEngine.Random.Range(0, 100 * 100) / 100; Dictionary <string, object> anchorRule = level.getAnchorTargetRule(); if (!level.isTutorial) { if (anchorRule != null && getColWithoutWall().Contains(c) && n < (double)anchorRule["probability"] * 100) { Tile tile = Anchor.createGameObject(this.gameObject, r, c); setTile(tile, r, c); } else { Tile tile = WordTile.createGameObject(this.gameObject, r, c); setTile(tile, r, c); } } } } } } for (int r = 0; r < row; r++) { for (int c = 0; c < col; c++) { Tile tile = getTile(r, c); if (tile) { tile.gravity(); } } } this.InvokeCallback(1.0f, () => { bool popped = popAnchor(); //Debug.Log("sinkedAnchorCount: " + sinkedAnchorCount); if (popped) { _popAndMoveDown(new List <Tile>()); } else { //finally done. List <WordTile> specialPop = new List <WordTile>(); for (int i = 0; i < tilePoppedThisTurn.Count; i++) { if (!tiles.Contains(tilePoppedThisTurn[i])) { specialPop.Add(tilePoppedThisTurn[i]); } } int total = calculateScoreFromConnectedTiles(tiles.Cast <WordTile>().ToList()) + calculateScoreFromBlastedTiles(specialPop.Cast <WordTile>().ToList()); userScore += total; finishAllPopAndMoveDown(tiles.Cast <WordTile>().ToList(), specialPop.Cast <WordTile>().ToList(), total); } updateScore(); tilePoppedThisTurn.Clear(); }); }
private void pop(Tile t) { if (t == null) { return; } Ice iceAboveTile = (Ice)getIceTile(t.getRow(), t.getCol()); if (iceAboveTile != null && !iceAboveTile.isBreakable()) { iceTiles[t.getRow()][t.getCol()] = null; iceAboveTile.pop(); poppedIceCount += 1; } if (!(t is WordTile)) { return; } if (t is RootedTile) { RootedTile tile = (RootedTile)t; tile.pop(); if (!tile.isBreakable()) { return; } } WordTile k = (WordTile)t; if (k.crown) { consumeCrown(k); } k.disappear(); tilePoppedThisTurn.Add(k); setTile(null, k.getRow(), k.getCol()); if (k.blasterDirection == 1) //Horizontal { k.blasterAnimation(); for (int c = 0; c < col; c++) { pop(getTile(k.getRow(), c)); } } else if (k.blasterDirection == 2) //Vertical { k.blasterAnimation(); for (int r = 0; r < row; r++) { pop(getTile(r, k.getCol())); } } else if (k.blasterDirection == 3) //diagonalArrow1 { k.blasterAnimation(); for (int i = 0; i < row; i++) { pop(getTile((k.getRow() + i), (k.getCol() + i))); pop(getTile((k.getRow() - i), (k.getCol() - i))); } } else if (k.blasterDirection == 4) //diagonalArrow2 { k.blasterAnimation(); for (int i = 0; i < row; i++) { pop(getTile((k.getRow() + i), (k.getCol() - i))); pop(getTile((k.getRow() - i), (k.getCol() + i))); } } else if (k.blasterDirection == 5) //UpDown { k.blasterAnimation(); for (int c = 0; c < col; c++) { pop(getTile(k.getRow(), c)); } for (int r = 0; r < row; r++) { pop(getTile(r, k.getCol())); } } else if (k.blasterDirection == 6) //Corner { k.blasterAnimation(); for (int i = 0; i < row; i++) { pop(getTile((k.getRow() + i), (k.getCol() - i))); pop(getTile((k.getRow() - i), (k.getCol() + i))); pop(getTile((k.getRow() + i), (k.getCol() + i))); pop(getTile((k.getRow() - i), (k.getCol() - i))); } } else if (k.blasterDirection == 7) //allDirection { k.blasterAnimation(); for (int i = 0; i < row; i++) { pop(getTile((k.getRow() + i), (k.getCol() - i))); pop(getTile((k.getRow() - i), (k.getCol() + i))); pop(getTile((k.getRow() + i), (k.getCol() + i))); pop(getTile((k.getRow() - i), (k.getCol() - i))); } for (int c = 0; c < col; c++) { pop(getTile(k.getRow(), c)); } for (int r = 0; r < row; r++) { pop(getTile(r, k.getCol())); } } }