public static void Construct(BlownUpStatus[,] blownUpStatus) { int row = blownUpStatus.GetLength(0); int col = blownUpStatus.GetLength(1); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { blownUpStatus[i, j] = new BlownUpStatus(); } } }
// Use this for initialization private void Start() { int i, j; GameObject tileObject = Resources.Load("InGame/Tile", typeof(GameObject)) as GameObject; for (i = 0; i < MAX_ROW_COUNT; i++) { for (j = 0; j < MAX_COL_COUNT; j++) { GameObject tileObjectClone = (GameObject)Instantiate(tileObject); tileObjectClone.name = "Tile(" + i + "," + j + ")"; TileScript tileScript = tileObjectClone.GetComponent <TileScript>(); tileScript.Init(i, j, new TileStatus()); mTiles[i, j] = tileScript; } } BlownUpStatus[,] blownUpStatusTemp = new BlownUpStatus[MAX_ROW_COUNT, MAX_COL_COUNT]; BlownUpStatus.Construct(blownUpStatusTemp); while (CheckBlowUpTiles(blownUpStatusTemp)) { for (i = 0; i < MAX_ROW_COUNT; i++) { for (j = 0; j < MAX_COL_COUNT; j++) { mTiles[i, j].SetTile(new TileStatus()); } } } mClickedTile = null; mIsSwapEnable = false; mIsReSwapNeeded = false; mIsEnemyActionDone = false; mIsBlownThisTurn = false; mTurn = 0; mBlownTileCount = 0; mBaseMP = 0; InGameUIManager.Instance.UpdateHP(UserManager.Instance.HP); InGameUIManager.Instance.UpdateMP(UserManager.Instance.MP); InGameUIManager.Instance.UpdateTurn(mTurn); }
private bool BlowUpTiles() { int i, j; BlownUpStatus[,] blownUpStatus = new BlownUpStatus[MAX_ROW_COUNT, MAX_COL_COUNT]; BlownUpStatus.Construct(blownUpStatus); mCheckToDestroyed = new bool[MAX_ROW_COUNT, MAX_COL_COUNT]; mTilesDestroyed = new bool[MAX_ROW_COUNT, MAX_COL_COUNT]; if (!CheckBlowUpTiles(blownUpStatus)) { return(false); } // delete for (i = 0; i < MAX_ROW_COUNT; i++) { for (j = 0; j < MAX_COL_COUNT; j++) { // add if (!mCheckToDestroyed[i, j] && blownUpStatus[i, j].IsBlownUp()) { mCheckToDestroyed[i, j] = true; if (blownUpStatus[i, j].mShape == BlownUpStatus.EffectShape.NONE) { mTiles[i, j].Status.CountToDestroy--; if (mTiles[i, j].Status.CountToDestroy <= 0) { //Tile Destroyed :: give exp, money and special effects mTilesDestroyed[i, j] = true; } } else { int[] notDestroyedTilePath = SearchSameShape(blownUpStatus, i, j); if (notDestroyedTilePath[0] != -1 && notDestroyedTilePath[1] != -1) { TileStatus nowStatus = mTiles[notDestroyedTilePath[0], notDestroyedTilePath[1]].Status; TileTypeManager.TileType madeSpecialType = TileTypeManager.TileType.NORMAL; mTilesDestroyed[notDestroyedTilePath[0], notDestroyedTilePath[1]] = false; mBlownTileCount++; if (blownUpStatus[i, j].mShape == BlownUpStatus.EffectShape.FOUR) { madeSpecialType = TileTypeManager.TileType.HEAL; } else if (blownUpStatus[i, j].mShape == BlownUpStatus.EffectShape.L) { madeSpecialType = TileTypeManager.TileType.CROSS; } else if (blownUpStatus[i, j].mShape == BlownUpStatus.EffectShape.FIVE) { madeSpecialType = TileTypeManager.TileType.SPECIAL; } mTiles[notDestroyedTilePath[0], notDestroyedTilePath[1]].SetTile(new TileStatus(madeSpecialType, nowStatus.Color)); } } } } } //Cross & heal & sepcial Effect. bool[,] isAlreadyBomb = new bool[MAX_ROW_COUNT, MAX_COL_COUNT]; bool isStop = false; while (!isStop) { isStop = true; for (i = 0; i < MAX_ROW_COUNT; i++) { for (j = 0; j < MAX_COL_COUNT; j++) { if (!isAlreadyBomb[i, j] && mTilesDestroyed[i, j]) { isAlreadyBomb[i, j] = true; if (mTiles[i, j].mStatus.Type == TileTypeManager.TileType.HEAL) { // Add Heal. UserManager.Instance.decreaseHP(-3); InGameUIManager.Instance.UpdateHP(UserManager.Instance.HP); } else if (mTiles[i, j].mStatus.Type == TileTypeManager.TileType.CROSS) { int k; for (k = 0; k < MAX_COL_COUNT; k++) { if (mTiles[i, k].IsBlowable) { mTilesDestroyed[i, k] = true; } } for (k = 0; k < MAX_ROW_COUNT; k++) { if (mTiles[k, j].IsBlowable) { mTilesDestroyed[k, j] = true; } } } else if (mTiles[i, j].mStatus.Type == TileTypeManager.TileType.SPECIAL) { // Special Effect. } isStop = false; } } } } //Real delete int row; for (j = 0; j < MAX_COL_COUNT; j++) { Queue <int> q = new Queue <int>(); for (i = MAX_ROW_COUNT - 1; i >= 0; i--) { if (mTilesDestroyed[i, j]) { q.Enqueue(i); mBlownTileCount++; } else { if (q.Count > 0) { row = q.Dequeue(); mTiles[row, j].IsBlowable = false; mTiles[row, j].SetPosition(mTiles[i, j].gameObject.transform.localPosition); mTiles[row, j].SetTile(mTiles[i, j].Status); StartCoroutine(InGameAnimationManager.Instance.TileMoveToOriginalPositionStart(mTiles[row, j])); q.Enqueue(i); } } } while (q.Count > 0) { row = q.Dequeue(); mTiles[row, j].IsBlowable = false; Vector3 topTilePosition = TileScript.GetTileVectorWithRowCol(0, j); if (q.Count + 1 < MAX_ROW_COUNT) { Vector3 lastFellingTilePosition = mTiles[q.Count + 1, j].gameObject.transform.localPosition; if (lastFellingTilePosition.y <= topTilePosition.y) { mTiles[row, j].SetPosition(new Vector3(topTilePosition.x, topTilePosition.y + TileScript.tileSize, 0)); } else { mTiles[row, j].SetPosition(new Vector3(lastFellingTilePosition.x, lastFellingTilePosition.y + TileScript.tileSize, 0)); } } else { mTiles[row, j].SetPosition(new Vector3(topTilePosition.x, topTilePosition.y + TileScript.tileSize, 0)); } mTiles[row, j].SetTile(new TileStatus()); StartCoroutine(InGameAnimationManager.Instance.TileMoveToOriginalPositionStart(mTiles[row, j])); } } UserManager.Instance.setMP(mBaseMP + MP_INCREASING_CONSTANT * mBlownTileCount); InGameUIManager.Instance.UpdateMP(UserManager.Instance.MP); return(true); }
private bool CheckBlowUpTiles(BlownUpStatus [,] blownUpStatus) { int i, j, k; bool isBlown = false; int serialCount = 0; TileTypeManager.TileColor startColor = mTiles[0, 0].Status.Color; //Right for (i = 0; i < MAX_ROW_COUNT; i++) { serialCount = 0; for (j = 0; j < MAX_COL_COUNT; j++) { if (!mTiles[i, j].IsBlowable) { serialCount = 0; continue; } if (serialCount == 0 || startColor != mTiles[i, j].Status.Color) { startColor = mTiles[i, j].Status.Color; serialCount = 1; } else { serialCount++; } if (serialCount == BLOW_MINIMUM_COUNT) { for (k = 1; k < BLOW_MINIMUM_COUNT; k++) { blownUpStatus[i, j - k].mHorizontal = true; blownUpStatus[i, j - k].mShape = BlownUpStatus.EffectShape.NONE; } isBlown = true; } if (serialCount >= BLOW_MINIMUM_COUNT) { blownUpStatus[i, j].mHorizontal = true; blownUpStatus[i, j].mShape = BlownUpStatus.EffectShape.NONE; } } } //Down for (j = 0; j < MAX_COL_COUNT; j++) { serialCount = 0; for (i = 0; i < MAX_ROW_COUNT; i++) { if (!mTiles[i, j].IsBlowable) { serialCount = 0; continue; } if (serialCount == 0 || startColor != mTiles[i, j].Status.Color) { startColor = mTiles[i, j].Status.Color; serialCount = 1; } else { serialCount++; } if (serialCount == BLOW_MINIMUM_COUNT) { for (k = 1; k < BLOW_MINIMUM_COUNT; k++) { blownUpStatus[i - k, j].mVertical = true; blownUpStatus[i - k, j].mShape = BlownUpStatus.EffectShape.NONE; } isBlown = true; } if (serialCount >= BLOW_MINIMUM_COUNT) { blownUpStatus[i, j].mVertical = true; blownUpStatus[i, j].mShape = BlownUpStatus.EffectShape.NONE; } } } int[,] fiveRightIndex = new int[5, 2] { { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 } }; int[,] fiveDownIndex = new int[5, 2] { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 } }; //five for (i = 0; i < MAX_ROW_COUNT; i++) { for (j = 0; j < MAX_COL_COUNT; j++) { // Horizontal if (TileScript.HasSameColor(mTiles, i, j, fiveRightIndex)) { BlownUpStatus.SetShape(blownUpStatus, i, j, fiveRightIndex, BlownUpStatus.EffectShape.FIVE); } // Vertical if (TileScript.HasSameColor(mTiles, i, j, fiveDownIndex)) { BlownUpStatus.SetShape(blownUpStatus, i, j, fiveDownIndex, BlownUpStatus.EffectShape.FIVE); } } } int[,] L1Index = new int[5, 2] { { 0, 0 }, { 0, -1 }, { 0, -2 }, { 1, 0 }, { 2, 0 } }; int[,] L2Index = new int[5, 2] { { 0, 0 }, { 0, -1 }, { 0, -2 }, { -1, 0 }, { -2, 0 } }; int[,] L3Index = new int[5, 2] { { 0, 0 }, { 0, 1 }, { 0, 2 }, { -1, 0 }, { -2, 0 } }; int[,] L4Index = new int[5, 2] { { 0, 0 }, { 0, 1 }, { 0, 2 }, { 1, 0 }, { 2, 0 } }; int[,] T1Index = new int[5, 2] { { 0, 0 }, { 0, 1 }, { 0, -1 }, { 1, 0 }, { 2, 0 } }; int[,] T2Index = new int[5, 2] { { 0, 0 }, { 0, 1 }, { 0, -1 }, { -1, 0 }, { -2, 0 } }; int[,] T3Index = new int[5, 2] { { 0, 0 }, { 0, -1 }, { 0, -2 }, { -1, 0 }, { 1, 0 } }; int[,] T4Index = new int[5, 2] { { 0, 0 }, { 0, 1 }, { 0, 2 }, { -1, 0 }, { 1, 0 } }; int[,] plusIndex = new int[5, 2] { { 0, 0 }, { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } }; //Giyeok for (i = 0; i < MAX_ROW_COUNT; i++) { for (j = 0; j < MAX_COL_COUNT; j++) { // Giyeok and right rotation //first Giyeok if (TileScript.HasSameColor(mTiles, i, j, L1Index)) { BlownUpStatus.SetShape(blownUpStatus, i, j, L1Index, BlownUpStatus.EffectShape.L); } //second Giyeok if (TileScript.HasSameColor(mTiles, i, j, L2Index)) { BlownUpStatus.SetShape(blownUpStatus, i, j, L2Index, BlownUpStatus.EffectShape.L); } // third Giyeok if (TileScript.HasSameColor(mTiles, i, j, L3Index)) { BlownUpStatus.SetShape(blownUpStatus, i, j, L3Index, BlownUpStatus.EffectShape.L); } //fourth Giyeok if (TileScript.HasSameColor(mTiles, i, j, L4Index)) { BlownUpStatus.SetShape(blownUpStatus, i, j, L4Index, BlownUpStatus.EffectShape.L); } //first T-shape if (TileScript.HasSameColor(mTiles, i, j, T1Index)) { BlownUpStatus.SetShape(blownUpStatus, i, j, T1Index, BlownUpStatus.EffectShape.L); } //second T-shape if (TileScript.HasSameColor(mTiles, i, j, T2Index)) { BlownUpStatus.SetShape(blownUpStatus, i, j, T2Index, BlownUpStatus.EffectShape.L); } //third T-shape if (TileScript.HasSameColor(mTiles, i, j, T3Index)) { BlownUpStatus.SetShape(blownUpStatus, i, j, T3Index, BlownUpStatus.EffectShape.L); } //fourth T-shape if (TileScript.HasSameColor(mTiles, i, j, T4Index)) { BlownUpStatus.SetShape(blownUpStatus, i, j, T4Index, BlownUpStatus.EffectShape.L); } //plus-shpae if (TileScript.HasSameColor(mTiles, i, j, plusIndex)) { BlownUpStatus.SetShape(blownUpStatus, i, j, plusIndex, BlownUpStatus.EffectShape.L); } } } int[,] fourRightIndex = new int[4, 2] { { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 } }; int[,] fourDownIndex = new int[4, 2] { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 } }; //Four for (i = 0; i < MAX_ROW_COUNT; i++) { for (j = 0; j < MAX_COL_COUNT; j++) { // Vertical if (TileScript.HasSameColor(mTiles, i, j, fourDownIndex)) { BlownUpStatus.SetShape(blownUpStatus, i, j, fourDownIndex, BlownUpStatus.EffectShape.FOUR); } // Horizontal if (TileScript.HasSameColor(mTiles, i, j, fourRightIndex)) { BlownUpStatus.SetShape(blownUpStatus, i, j, fourRightIndex, BlownUpStatus.EffectShape.FOUR); } } } //None return(isBlown); }