/* * =========================================================== * 対象キャラクターの選択 * =========================================================== */ // ターゲットの選択を行う // ┗ 呼出元: PlayActionNoRamble // ┗ 条件: selectedCommand selectedLeader が決定済 IEnumerator SelectTarget(Vector2 countActionCharacterInfo) { // 味方キャラが行動できないなら処理終了( 敵キャラの値を設定 ) if (countActionCharacterInfo.x == 0) { for (int i = 0; i < 10000; i++) { selectedTarget = UnityEngine.Random.Range(0, cd.Length); if (cd[selectedTarget].cs != null && !cd[selectedTarget].isknockout) { break; } } yield break; } // ノックバック値の和を求める int knockback = OpeCharaList.GetSumKnockback(cd); // 攻撃コマンドの場合のみターゲット選択を行う if (selectedCommand == (int)Command.Attack) { yield return(DoSelectTarget2(knockback)); } else { selectedTarget = 0; // 攻撃コマンドでない場合、決定済として扱う } }
// コマンド内容をもとに // 動けるキャラクターすべての行動(攻撃・ユニゾン・詠唱)を行う // ( 吹き飛び処理もこの中で処理する ) // ┗ 呼出元: PlayActionNoRamble // ┗ 条件: selectedCommand selectedLeader selectedTarget が決定済 IEnumerator CallCharacterAction() { // 詠唱中キャラの平均待機値を求めておく int avePlayerMagWait = OpeCharaList.GetAverageMagWait(cd); int aveEnemyMagWait = OpeCharaList.GetAverageMagWait(enemyCd); int actionCharacterNum = 0; bool isPlayerTurn = true; BaseCharacter targetChara = null; for (int i = 0; i < cd.Length; i++) { // 味方キャラクター。CTB ゲージが 0 の場合。 if (cd[i].ctbNum <= 0 && !cd[i].isWaitUnison) { // コマンドに応じた行動を行う if (selectedCommand == (int)Command.Attack) { targetChara = enemyCd[selectedTarget]; actionCharacterNum++; isPlayerTurn = true; mCombo.AddPlayerCombo(); yield return(cd[i].PlayAction( selectedTarget, enemyCd, mCombo)); } else if (selectedCommand == (int)Command.Unison) { cd[i].StartUnison(); } else if (selectedCommand == (int)Command.Magic) { cd[i].StartMagic(avePlayerMagWait); } } } for (int i = 0; i < enemyCd.Length; i++) { // 敵キャラクター。CTB ゲージが 0 の場合。 if (enemyCd[i].ctbNum <= 0 && !enemyCd[i].isWaitUnison) { if (selectedCommand == (int)Command.Attack) { targetChara = cd[selectedTarget]; actionCharacterNum++; isPlayerTurn = false; mCombo.AddEnemyCombo(); yield return(enemyCd[i].PlayAction( selectedTarget, cd, mCombo)); } else if (selectedCommand == (int)Command.Unison) { enemyCd[i].StartUnison(); } else if (selectedCommand == (int)Command.Magic) { enemyCd[i].StartMagic(aveEnemyMagWait); } } } // 複数人が攻撃に参加している場合はユニゾンの追撃処理を行う if (actionCharacterNum >= 2) { // あらかじめコンボの値を増やしておく // ( どちらが攻撃したかをUnison内で知る術はないので ) if (isPlayerTurn) { mCombo.AddPlayerCombo(); } else { mCombo.AddEnemyCombo(); } // ユニゾンの処理を呼び出す if (isPlayerTurn) { yield return(Unison.DoUnison(cd, enemyCd[selectedTarget], mCombo)); } else { yield return(Unison.DoUnison(enemyCd, cd[selectedTarget], mCombo)); } } // 対象キャラを吹き飛ばす if (targetChara != null) // 対象キャラがいない(≒詠唱・ユニゾン)なら無視 { int sumKnockback; if (isPlayerTurn) { sumKnockback = OpeCharaList.GetSumKnockback(cd); } else { sumKnockback = OpeCharaList.GetSumKnockback(enemyCd); } int knockback = PredictObject.CalcBlowNum(targetChara, sumKnockback, actionCharacterNum); targetChara.ctbNum += knockback; } }