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); // заканчиваем этот такт (и не переходим к концу корутины) } } }