示例#1
0
    private IEnumerator RoundPlaying()
    {
        m_resultText.text = string.Empty;                       // 1. Очистить информационное сообщение

        while (!OneHeroLeft())                                  // 2. Играем раунд (пропускаем такты), пока кто-то не умрет
        {
            //a. Разблокировать кнопки управления игроку        // А как-нибудь через событие??
            m_Player.m_PlayersControlsCanvas.enabled = true;

            //b. Ожидать действие игрока: удара или смены оружия
            if (m_Player.decision == Decision.No)
            {
                MakeEnemyDesition(HeroManager.player_countRoundsWon);
                yield return(null);   // Решения еще нет - заканчиваем этот такт (и почему-то не переходим сразу к началу корутины, а проходим её тело до конца...)
                //Debug.Log("Why am I displaying?");
            }
            // иначе рассчитать урон. (Плюс посмотреть, не умер ли кто. Если умер - идем на конец раунда)
            else
            {
                // c. Сперва рассчитаем предварительные коэффициенты на основе текущего набора оружия и решения
                m_Player.CalculatePreCoeffs();
                m_Enemy.CalculatePreCoeffs();
                m_Player.preCoeffs[0].blockVs2Handed = (m_Player.weaponSet == WeaponSet.SwordShield) && (m_Player.preCoeffs[0].block) && (m_Enemy.decision == Decision.Attack) && (m_Enemy.weaponSet == WeaponSet.TwoHandedSword);
                m_Enemy.preCoeffs[0].blockVs2Handed  = (m_Enemy.weaponSet == WeaponSet.SwordShield) && (m_Enemy.preCoeffs[0].block) && (m_Player.decision == Decision.Attack) && (m_Player.weaponSet == WeaponSet.TwoHandedSword);

                //d. Теперь определим, какой нанести урон, на основе предварительных коэффицентов и решения. Удар 1.
                if (m_Player.decision == Decision.Attack)
                {
                    m_Enemy.preCoeffs[0].exchangeResult = m_Enemy.CalculateExchangeResult(1);


                    if (m_Enemy.preCoeffs[0].exchangeResult == ExchangeResult.BlockVs2Handed)
                    {
                        m_Player.preCoeffs[0].damage *= m_Player.m_Tweakers.Part2HandedThroughShield;
                    }
                }


                if (m_Enemy.decision == Decision.Attack)
                {
                    m_Player.preCoeffs[0].exchangeResult = m_Player.CalculateExchangeResult(1);


                    if (m_Player.preCoeffs[0].exchangeResult == ExchangeResult.BlockVs2Handed)
                    {
                        m_Enemy.preCoeffs[0].damage *= m_Enemy.m_Tweakers.Part2HandedThroughShield;
                    }
                }

                m_Enemy.preCoeffs[0].damage  = Mathf.Round(m_Enemy.preCoeffs[0].damage - m_Enemy.preCoeffs[0].damage * m_Enemy.defencePart);    // уберём часть урона, потраченную на парирование, и округлим
                m_Player.preCoeffs[0].damage = Mathf.Round(m_Player.preCoeffs[0].damage - m_Player.preCoeffs[0].damage * m_Player.defencePart); // уберём часть урона, потраченную на парирование, и округлим

                m_Enemy.gotDamage  = m_Player.preCoeffs[0].damage;
                m_Player.gotDamage = m_Enemy.preCoeffs[0].damage;

                // e. Определяем переменные для рассчета коэффициентов серий (серия блоков внутри предыдушего пункта). Удар 1.
                // е1. коэфф. сильных ударов
                // игрок
                if ((m_Enemy.preCoeffs[0].exchangeResult == ExchangeResult.GetHit) || (m_Enemy.preCoeffs[0].exchangeResult == ExchangeResult.BlockVs2Handed))
                {
                    m_Player.AddStrongSeries(1);
                }
                // враг
                if ((m_Player.preCoeffs[0].exchangeResult == ExchangeResult.GetHit) || (m_Player.preCoeffs[0].exchangeResult == ExchangeResult.BlockVs2Handed))
                {
                    m_Enemy.AddStrongSeries(1);
                }

                // е2. коэффициент серии ударов
                // игрок
                if ((m_Enemy.preCoeffs[0].exchangeResult == ExchangeResult.GetHit) || (m_Enemy.preCoeffs[0].exchangeResult == ExchangeResult.BlockVs2Handed))
                {
                    m_Player.AddStrikesSeries();
                }
                // враг
                if ((m_Player.preCoeffs[0].exchangeResult == ExchangeResult.GetHit) || (m_Player.preCoeffs[0].exchangeResult == ExchangeResult.BlockVs2Handed))
                {
                    m_Enemy.AddStrikesSeries();
                }

                // I. Удар1 состоялся  - запустить событие.
                ExchangeEvent1?.Invoke();       // эта запись равносильна такой: if (ExchangeEvent1 != null) ExchangeEvent1 ();

                //f. Урон. Удар 2.
                if ((m_Player.decision == Decision.Attack) && (m_Player.preCoeffs[1].damage != 0f))
                {
                    m_Enemy.preCoeffs[1].exchangeResult = m_Enemy.CalculateExchangeResult(2);


                    if (m_Enemy.preCoeffs[0].exchangeResult == ExchangeResult.BlockVs2Handed)
                    {
                        m_Player.preCoeffs[0].damage *= m_Player.m_Tweakers.Part2HandedThroughShield;
                    }
                }

                if ((m_Enemy.decision == Decision.Attack) && (m_Enemy.preCoeffs[1].damage != 0f))
                {
                    m_Player.preCoeffs[1].exchangeResult = m_Player.CalculateExchangeResult(2);


                    if (m_Player.preCoeffs[0].exchangeResult == ExchangeResult.BlockVs2Handed)
                    {
                        m_Enemy.preCoeffs[0].damage *= m_Enemy.m_Tweakers.Part2HandedThroughShield;
                    }
                }

                m_Enemy.preCoeffs[1].damage  = Mathf.Round(m_Enemy.preCoeffs[1].damage - m_Enemy.preCoeffs[1].damage * m_Enemy.defencePart);    // уберём часть урона, потраченную на парирование, и округлим
                m_Player.preCoeffs[1].damage = Mathf.Round(m_Player.preCoeffs[1].damage - m_Player.preCoeffs[1].damage * m_Player.defencePart); // уберём часть урона, потраченную на парирование, и округлим

                m_Enemy.gotDamage  = m_Player.preCoeffs[1].damage;
                m_Player.gotDamage = m_Enemy.preCoeffs[1].damage;

                // h. Определяем переменные для рассчета коэффициентов серий (серия блоков внутри предыдушего пункта)
                // h1. коэфф. сильных ударов
                // игрок
                if (m_Enemy.preCoeffs[1].exchangeResult == ExchangeResult.GetHit)
                {
                    m_Player.AddStrongSeries(2);
                }
                // враг
                if (m_Player.preCoeffs[1].exchangeResult == ExchangeResult.GetHit)
                {
                    m_Enemy.AddStrongSeries(2);
                }

                // h2. коэффициент серии ударов
                // игрок
                if ((m_Enemy.preCoeffs[0].exchangeResult != ExchangeResult.GetHit) && (m_Enemy.preCoeffs[1].exchangeResult != ExchangeResult.GetHit) && (m_Enemy.preCoeffs[0].exchangeResult != ExchangeResult.BlockVs2Handed))
                {
                    m_Player.ResetStrikesSeries();
                }

                if (m_Enemy.preCoeffs[1].exchangeResult == ExchangeResult.GetHit)
                {
                    m_Player.AddStrikesSeries();
                }

                // враг
                if ((m_Player.preCoeffs[0].exchangeResult != ExchangeResult.GetHit) && (m_Player.preCoeffs[1].exchangeResult != ExchangeResult.GetHit) && (m_Player.preCoeffs[0].exchangeResult != ExchangeResult.BlockVs2Handed))
                {
                    m_Enemy.ResetStrikesSeries();
                }

                if (m_Player.preCoeffs[1].exchangeResult == ExchangeResult.GetHit)
                {
                    m_Enemy.AddStrikesSeries();
                }

                //i. Смена оружия врага
                if (m_Enemy.decision != Decision.Attack)
                {
                    switch (m_Enemy.decision)
                    {
                    case Decision.ChangeSwordShield:
                        m_Enemy.SetSwordShield();
                        break;

                    case Decision.ChangeSwordSword:
                        m_Enemy.SetSwordSword();
                        break;

                    case Decision.ChangeTwoHandedSword:
                        m_Enemy.SetTwoHandedSword();
                        break;
                    }
                }

                // II. Удар2 состоялся  - запустить событие
                ExchangeEvent2?.Invoke();

                //j. Блокировка кнопок управления игрока и задержка на анимацию (атаки или смены)
                if (m_Player.decision == Decision.Attack)
                {
                    if (m_Enemy.decision == Decision.Attack)
                    {
                        yield return(m_AttackWait);
                    }
                    else
                    {
                        yield return(m_ChangeWait);
                    }
                }
                else //  точно какая-то смена
                {
                    yield return(m_ChangeWait);
                }

                //k. Уменьшить или обнулить задержку на тупизну
                if ((m_Enemy.decision == Decision.Attack) && (m_Player.decision == Decision.Attack))
                {
                    stupitidyChangeDelay -= 1;
                }
                else if (m_Enemy.decision != Decision.Attack)
                {
                    stupitidyChangeDelay = m_NumRoundsToWin - HeroManager.player_countRoundsWon - 1;
                }

                // III. Сход закончен  - запустить событие
                ExchangeEndedEvent?.Invoke();

                yield return(null);  // заканчиваем этот такт (и не переходим к концу корутины)
            }
        }
    }