Beispiel #1
0
    private IEnumerator SelectCommand(Vector2 countActionCharacterInfo)
    {
        // 味方キャラが行動できないなら処理終了
        if (countActionCharacterInfo.x == 0)
        {
            // 敵キャラクターの行動は通常攻撃のみ(仮)
            selectedCommand = 0;
            yield break;
        }

        // 基本的に全項目選択可能
        int isMagicEnable  = 1;
        int isUnisonEnable = 1;

        // ユニゾン状態の場合、ユニゾンを選択不可に
        if (countActionCharacterInfo.x >= 2)
        {
            isUnisonEnable = 0;
        }
        // 詠唱中キャラが含まれていたら 攻撃 のみ選択可
        if (OpeCharaList.CountActionableMagic(cd, enemyCd) != 0)
        {
            isMagicEnable  = 0;
            isUnisonEnable = 0;
        }
        // 選択肢表示処理実行
        yield return(DoSelectCommand(new Vector3(1, isUnisonEnable, isMagicEnable)));
    }
Beispiel #2
0
    public void SetParameter(PlayerCharacter[] _cd)
    {
        // cd を設定する
        cd = _cd;

        // ボタンオブジェクトのインスタンス化
        buttonObj = new GameObject[4];

        // ボタンオブジェクト取得
        buttonObj[0] = gameObject.transform.Find("RightButton").gameObject;
        buttonObj[1] = gameObject.transform.Find("LeftButton").gameObject;
        buttonObj[2] = gameObject.transform.Find("CharacterGraphic").gameObject;
        buttonObj[3] = gameObject.transform.Find("Text").gameObject;

        // 親オブジェクトに自分自身を設定(一緒に破棄されて欲しい)
        foreach (GameObject o in buttonObj)
        {
            o.transform.SetParent(this.transform);
        }

        // 初期値の設定
        do
        {
            selectId++;
            selectId %= cd.Length;
        } while (cd[selectId].ctbNum > 0);

        // 顔グラ初期セット
        SetFaceGraphic();

        // テキスト設定(魔力レベルの和)
        int sum = OpeCharaList.GetSumMoveableMag(_cd);

        buttonObj[3].GetComponent <Text>().text = "詠唱 LV" + sum + "!";
    }
Beispiel #3
0
    /*
     * ===========================================================
     *  対象キャラクターの選択
     * ===========================================================
     */
    // ターゲットの選択を行う
    //  ┗ 呼出元: 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; // 攻撃コマンドでない場合、決定済として扱う
        }
    }
Beispiel #4
0
 /* 戦闘終了時の処理 */
 // ( リザルト表示終了後 )
 private void BattleEnd()
 {
     // 詠唱終了
     OpeCharaList.AllCharaEndMagic(cd);
     OpeCharaList.AllCharaEndMagic(enemyCd);
     OpeCharaList.AllCharaEndWaitUnison(cd);
     OpeCharaList.AllCharaEndWaitUnison(enemyCd);
 }
Beispiel #5
0
 // 終了判定
 // 1 = プレイヤー勝利
 // -1 = 敵勝利
 // 0 = 続行
 private int CheckFinish()
 {
     if (OpeCharaList.isAllKnockout(enemyCd))
     {
         return(1);
     }
     if (OpeCharaList.isAllKnockout(cd))
     {
         return(-1);
     }
     return(0);
 }
Beispiel #6
0
    /* ボタンクリック式 */
    IEnumerator DoSelectTarget2(int sumKnockback)
    {
        // カーソルオブジェクトを作成
        GameObject cursorObj = MakeCursorObj();

        string     FilePath = "Prefabs\\Battle\\SelectTarget";
        GameObject tObj     = (GameObject)Instantiate(Resources.Load(FilePath),
                                                      new Vector3(400, 0, 0),
                                                      Quaternion.identity);

        tObj.GetComponent <SelectTarget>().SetParameter(enemyCd);
        tObj.GetComponent <SelectTarget>().SetEnableButtonFromKnockout(enemyCd);
        tObj.transform.SetParent(canvas.transform, false);

        // プレイヤの予測オブジェクトを表示
        OpeCharaList.SetPredictActionableCharacter(cd);
        int charaNum = OpeCharaList.CountActionableCharacter(cd);

        // コマンドを選ぶまでループ
        int _mouseOver = -1;
        int mouseOver  = 0;

        while (true)
        {
            // 予測表示
            mouseOver = tObj.GetComponent <SelectTarget>().mouseOverId;
            if (_mouseOver != mouseOver)
            {
                SetCursorObj(mouseOver, cursorObj); // カーソルオブジェクトの座標移動

                PredictObject.SetInactiveAllPredictObj(null, enemyCd);
                enemyCd[mouseOver].predictObj.SetFromCharacterStatus(enemyCd[mouseOver], sumKnockback, charaNum);
                _mouseOver = mouseOver;
            }

            // 終了判定
            if (tObj.GetComponent <SelectTarget>().selectId != -1)
            {
                selectedTarget = tObj.GetComponent <SelectTarget>().selectId;
                if (selectedTarget < 0)
                {
                    selectedTarget = -1;                      // キャンセルした
                }
                break;
            }
            yield return(0);
        }
        Destroy(tObj);
        Destroy(cursorObj);

        PredictObject.SetInactiveAllPredictObj(cd, enemyCd);
    }
Beispiel #7
0
    IEnumerator PlayActionRamble(Vector2 countActionCharacterInfo)
    {
        // 敵のリーダーキャラクターの選択( 1体でも発動 )
        int        enemyLeader    = SelectLeaderEnemy(countActionCharacterInfo);
        GameObject enemyLeaderObj = DrawEnemyLeader(enemyLeader);

        // 味方のリーダーキャラクター選択
        selectedLeader = -1;
        while (selectedLeader == -1)
        {
            yield return(SelectLeaderPlayer(countActionCharacterInfo));
        }
        DestroyObject(enemyLeaderObj);

        // 勝敗判定
        int isPlayerWin = JudgeRamble(enemyCd[enemyLeader].cs.element);

        if (isPlayerWin == 1)
        {
            mCombo.AddPlayerCombo();
        }
        else if (isPlayerWin == -1)
        {
            mCombo.AddEnemyCombo();
        }

        // 少ない方にスタン処理&ダメージ。
        int stunCtbNum = 7;

        if (isPlayerWin == 1)
        {
            OpeCharaList.CallStun(enemyCd, stunCtbNum);
        }
        else if (isPlayerWin == -1)
        {
            OpeCharaList.CallStun(cd, stunCtbNum);
        }

        //  エフェクト表示

        //  ユニゾン・詠唱を終了
        OpeCharaList.EndWaitUnison(cd);
        OpeCharaList.EndWaitUnison(enemyCd);
        OpeCharaList.EndMagic(cd);
        OpeCharaList.EndMagic(enemyCd);

        // CTB 値を再設定( waitAction の値を格納 )
        CtbManager.SetCtbNum(cd, enemyCd);
    }
Beispiel #8
0
    // 行動できるキャラクターが出るまでループを回す
    IEnumerator DecideNextActionCharacter()
    {
        Vector2 tmp = OpeCharaList.CountActionableCharacter(cd, enemyCd);
        int     isActionableChara = (int)tmp.x + (int)tmp.y;

        while (isActionableChara == 0)
        {
            Debug.Log("OK");
            // CTBメータを 1 つ進める
            isActionableChara += CtbManager.SubCtbNum(cd);
            isActionableChara += CtbManager.SubCtbNum(enemyCd);
            CtbManager.SubStun(cd, enemyCd); // メモ: CTB値の更新⇒スタン値の更新の順番である必要がある

            // 移動演出のコルーチンを呼び出す
            yield return(CtbMove()); // メモ: 処理終了後に CTB値・STUN値をもとにした位置に再描画
            // yield return Utility._Wait.WaitKey();
        }
    } // --- DecideNextActionCharacter()
Beispiel #9
0
    } // --- DecideNextActionCharacter()

    // 誰かが動ける状況になると呼ばれる処理
    // ( ランブル・通常アクション・ユニゾンに振り分ける )
    IEnumerator PlayAction()
    {
        // ランブル判定。( ユニゾン中のキャラは数えない )
        Vector2 countActionCharacterInfo =
            OpeCharaList.CountActionableCharacter(cd, enemyCd);

        // ランブル・ユニゾン・通常アクションの 3 パターンがありえる
        if (countActionCharacterInfo.x * countActionCharacterInfo.y == 0)
        {
            // ランブルでない場合の処理
            yield return(PlayActionNoRamble(countActionCharacterInfo));
        }
        else
        {
            // ランブル
            yield return(PlayActionRamble(countActionCharacterInfo));
        }
        yield return(0);
    }
Beispiel #10
0
    } // ---SetCursorObj

    /*
     * ================================================
     * コマンド選択 / リーダーキャラクター選択
     * ================================================
     */
    // 行動内容選択(アタック・ユニゾン・攻撃)
    //  設定方法: vec( int, int, int ) で選択肢を
    //             表示するか否かを示す
    private IEnumerator DoSelectCommand(Vector3 vec)
    {
        string     FilePath = "Prefabs\\Battle\\SelectAction";
        GameObject selObj   = (GameObject)Instantiate(Resources.Load(FilePath),
                                                      new Vector3(400, 0, 0),
                                                      Quaternion.identity);

        selObj.GetComponent <SelectAction>().SetParameter(vec);
        selObj.transform.SetParent(canvas.transform, false);

        // コマンドを選ぶまでループ
        int mouseOverId  = 0;
        int _mouseOverId = -1;

        while (true)
        {
            // マウスオーバーに基づく予測表示処理
            if (mouseOverId != _mouseOverId)
            {
                PredictObject.SetInactiveAllPredictObj(cd, null);
                if (mouseOverId == 0)
                {
                    OpeCharaList.SetPredictActionableCharacter(cd);
                }
                if (mouseOverId == 2)
                {
                    OpeCharaList.SetMagPredictActionableCharacter(cd);
                }
            }
            mouseOverId = selObj.GetComponent <SelectAction>().mouseOverId;

            // 決定処理
            if (selObj.GetComponent <SelectAction>().selectId >= 0)
            {
                selectedCommand = selObj.GetComponent <SelectAction>().selectId;
                break;
            }
            yield return(0);
        }
        Destroy(selObj);
        PredictObject.SetInactiveAllPredictObj(cd, null);
    }
Beispiel #11
0
    private GameObject DrawEnemyLeader(int elId)
    {
        // リーダーキャラクター選択処理
        string     FilePath = "Prefabs\\Battle\\EnemyLeader";
        GameObject eObj     = (GameObject)Instantiate(Resources.Load(FilePath),
                                                      new Vector3(-400, 0, 0),
                                                      Quaternion.identity);

        eObj.transform.SetParent(canvas.transform, false);

        GameObject ecObj = eObj.transform.Find("CharacterGraphic").gameObject;

        ecObj.GetComponent <Image>().sprite =
            enemyCd[elId].ctbFaceObj.faceObj.GetComponent <Image>().sprite;

        ecObj = eObj.transform.Find("Text").gameObject;
        ecObj.GetComponent <Text>().text =
            "詠唱 LV" + OpeCharaList.GetSumMoveableMag(enemyCd) + "!";

        return(eObj);
    }
Beispiel #12
0
    // プレイヤーが勝利する場合に 1 敗北する場合に -1 を返す
    private int JudgeRamble(int eEle)
    {
        int isPlayerWin = 1;

        // それぞれのサイドのMag値の和を求める
        int playerMagSum = OpeCharaList.GetSumMoveableMag(cd);
        int enemyMagSum  = OpeCharaList.GetSumMoveableMag(enemyCd);
        int pEle         = cd[selectedLeader].cs.element;

        // 魔力レベル合計値のよる勝敗判定
        if (playerMagSum < enemyMagSum)
        {
            isPlayerWin = -1;
            return(isPlayerWin);
        }

        // 属性による勝敗判定
        if (pEle == eEle)
        {
            isPlayerWin = 1;
        }
        return(isPlayerWin);
    }
Beispiel #13
0
    // 後処理
    IEnumerator AfterAction()
    {
        // ウェイトを挟む
        yield return(Utility._Wait.WaitFrame(30));

        // CTBが0のキャラかつユニゾンでないキャラにウェイトをセット
        // ( 詠唱の場合は、ここに来る前に値がセットされているので必要ない )
        for (int i = 0; i < cd.Length; i++)
        {
            cd[i].SetCtbNumFromWaitAction();
        }
        for (int i = 0; i < enemyCd.Length; i++)
        {
            enemyCd[i].SetCtbNumFromWaitAction();
        }

        // 戦闘不能判定
        OpeCharaList.KnockoutEffect(cd);
        OpeCharaList.KnockoutEffect(enemyCd);

        // 情報を再描画
        DrawCharacterData();
    }
Beispiel #14
0
    public static IEnumerator DoUnison(BaseCharacter[] actionCharas,
                                       BaseCharacter TargetChara,
                                       ComboManager cm)
    {
        // 演出を表示する(攻撃者の演出)
        GameObject        canvas = GameObject.Find("Canvas");
        List <GameObject> uniObj = new List <GameObject>();
        int unisonCount          = 0;
        int unisonSupport        = 0;

        for (int i = 0; i < actionCharas.Length; i++)
        {
            if (actionCharas[i].ctbNum == 0)
            {
                string str = actionCharas[i].cs.standGraphicPath;
                unisonSupport += actionCharas[i].cs.unisonSupport;
                GameObject obj = Utility._Object.MyGenerateImage(str, canvas, new Vector2(270, 540));
                obj.GetComponent <RectTransform>().localPosition = id2Pos(unisonCount);
                uniObj.Add(obj);

                unisonCount++;
                SoundManager.PlaySe(Variables.SE.SeName.battle_unison_chari);
                yield return(Utility._Wait.WaitFrame(10));
            }
        }

        // ウェイト
        yield return(Utility._Wait.WaitFrame(30));

        // ユニゾンのエフェクトを消す
        foreach (GameObject g in uniObj)
        {
            Destroy(g);
        }

        // 対象表示
        DamageEffect.TargetGraphicDraw(TargetChara);
        yield return(Utility._Wait.WaitFrame(10));

        // 戦闘アニメーション
        SoundManager.PlaySe(Variables.SE.SeName.battle_unison_effect);
        DamageEffect.AttackEffect(1);
        yield return(Utility._Wait.WaitFrame(45));

        // ダメージの算出
        SoundManager.PlaySe(Variables.SE.SeName.battle_unison_damage);
        int damage = OpeCharaList.GetAverageAtk(actionCharas);

        damage         *= (BCV.UNISON_DAMAGE_COEFFICIENT[unisonCount]);
        damage         /= 100;
        damage         *= cm.magnificationDamage;
        damage         /= 100;
        damage         *= (100 + unisonSupport); // ( 要調整 )
        damage         /= 100;
        TargetChara.hp -= damage;
        if (TargetChara.hp < 0)
        {
            TargetChara.hp = 0;
        }

        // ダメージの演出
        DamageEffect.DrawDamage(damage);
        DamageEffect.DrawCombo(cm);
        yield return(Utility._Wait.WaitFrame(45));

        DamageEffect.DestroyAllObject();


        yield return(0);
    }
Beispiel #15
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;
        }
    }
Beispiel #16
0
    /*
     * ================================================
     * PlayAction の内部処理
     * ================================================
     */
    // 通常攻撃・ユニゾンの場合に呼ばれる処理
    // ( コマンド入力を行い、処理を実行する )
    IEnumerator PlayActionNoRamble(Vector2 countActionCharacterInfo)
    {
        // 行動サイドのユニゾン待機を終了
        bool isPlayer = (countActionCharacterInfo.x >= 1);

        if (isPlayer)
        {
            OpeCharaList.EndWaitUnison(cd);
        }
        else
        {
            OpeCharaList.EndWaitUnison(enemyCd);
        }

        // 行動人数の情報を再度取得( コマンド選択前に )
        countActionCharacterInfo =
            OpeCharaList.CountActionableCharacter(cd, enemyCd);

        // コマンド選択・リーダー決定・ターゲット選択を行う
        selectedCommand = -1;
        selectedLeader  = -1;
        selectedTarget  = -1;

        while (true)
        {
            if (selectedCommand == -1)
            {
                // コマンド選択を行う( 攻撃・待機・詠唱など )
                yield return(SelectCommand(countActionCharacterInfo));

                continue;
            }

            if (selectedLeader == -1)
            {
                // リーダーキャラクターの選択
                yield return(SelectLeader(countActionCharacterInfo));

                if (selectedLeader == -1)
                {
                    selectedCommand = -1;
                }
                continue;
            }

            if (selectedTarget == -1)
            {
                // ターゲットキャラクターの選択
                yield return(SelectTarget(countActionCharacterInfo));

                if (selectedTarget == -1) // ターゲット選択でキャンセル
                {
                    selectedLeader = -1;
                    if (countActionCharacterInfo.x == 1 ||
                        countActionCharacterInfo.y == 1 ||
                        selectedCommand == (int)Command.Magic)
                    {
                        // リーダー選択が存在しないならば 2 ステップ戻す
                        // ( 単体攻撃・詠唱の場合 )
                        selectedCommand = -1;
                    }
                }
                continue;
            }

            break;
        }

        // 入力内容に応じて、処理を実行する
        yield return(CallCharacterAction());
    }