//------------------------------------------------------------------------- // 連鎖関連 /// <summary> /// 連鎖開始(肉球を消失させる) /// </summary> public void StartChain() { // 連鎖中に連鎖は開始できない if (IsInChain) { return; } // 連鎖スコアをリセット ChainScore.Reset(); // 選択中の肉球を解除 ReleasePaw(); this.state.SetState(State.Vanish); }
//------------------------------------------------------------------------- // デバッグ public void OnDebug() { ChainScore.OnDebug(); var paw = this.paws[IndexBy(this.cursorCoord)]; paw.OnDebug(); using (new GUILayout.VerticalScope(GUI.skin.box)) { GUILayout.Label("[Find Paw]"); using (new GUILayout.HorizontalScope()) { MyEnum.ForEach <Define.App.Attribute>((attribute) => { if (GUILayout.Button($"{attribute}")) { var pos = Vector2Int.zero; var found = FindNearPawCoord(attribute, ref pos); Debug.Logger.Log($"{found}:{pos}"); } }); } } }
/// <summary> /// 連鎖開始 /// </summary> private void OnVanishEnter() { // 消えてたり、動いてたりするのがあったら連鎖開始しない if (HasVanishingPaw) { return; } if (HasMovingPaw) { return; } // 消えた肉球があるか bool there_are_vanished_paws = false; for (int y = 0; y < Define.Versus.PAW_ROW; ++y) { // 連鎖モードがSingleで、消えた肉球がある場合は判定を抜ける if (ChainMode == Define.Versus.ChainMode.Single) { if (there_are_vanished_paws) { break; } } for (int x = 0; x < Define.Versus.PAW_COL; ++x) { // 評価対象の肉球 var paw = this.paws[IndexBy(x, y)]; // 既に評価済のパネルであればスキップ if (paw.IsEvaluated) { continue; } // 肉球のつながりを調べる int count = 0; LookUpPawConnectable(x, y, ref count); // 肉球の連結数が連鎖可能な数を超えている場合は肉球を消滅状態にする if (Define.Versus.CHAIN_PAW_COUNT <= count) { there_are_vanished_paws = true; // 消失の記録を更新 ChainScore.UpdateVanish(paw.Attribute, count); Vanish(x, y); // 連鎖モードがSingleならこの時点で連鎖判定を抜ける if (ChainMode == Define.Versus.ChainMode.Single) { break; } } } } // 評価済フラグを落とす ClearEvaluated(); // 消えるのがある場合は連鎖数をUP、ない場合は連鎖終了へ if (HasVanishingPaw) { ChainScore.UpdateChainCount(); } else { this.state.SetState(State.Finish); } }
/// <summary> /// 連鎖の終了 /// </summary> public void EndChain() { ChainScore.Reset(); this.state.SetState(State.Idle); }