Beispiel #1
0
        private IEnumerator SwitchMonster(MonsterObj newMonster)
        {
            if (_playerMonster.Monster.CurrentHp > 0)
            {
                yield return(_dialogBox.TypeDialog($"{_playerMonster.Monster.Base.Name}, fall back!"));

                _playerMonster.PlayDownedAnimation(); //TODO - create animation for returning to party
                yield return(YieldHelper.TwoSeconds);
            }

            _playerMonster.Setup(newMonster);
            _dialogBox.SetMoveList(newMonster.Moves);
            yield return(_dialogBox.TypeDialog($"It's your turn now, {newMonster.Base.Name}!"));

            // Allow player to switch monsters after enemy replaces a downed monster.
            if (_prevState == null)
            {
                _state = BattleState.ExecutingTurn;
            }
            else if (_prevState == BattleState.ChoiceSelection)
            {
                _prevState = null;
                StartCoroutine(SwitchEnemyMonster());
            }
        }
Beispiel #2
0
        private IEnumerator HandleDownedMonster(BattleMonster downedMonster)
        {
            _isMonsterDown = true;
            if (downedMonster.IsPlayerMonster)
            {
                yield return(_dialogBox.TypeDialog($"{downedMonster.Monster.Base.Name} has been taken down!"));
            }
            else
            {
                yield return(_dialogBox.TypeDialog($"Enemy {downedMonster.Monster.Base.Name} has been taken down!"));
            }

            downedMonster.PlayDownedAnimation();
            yield return(YieldHelper.TwoSeconds);

            if (!downedMonster.IsPlayerMonster)
            {
                // Setup exp gain variables.
                int   expBase      = downedMonster.Monster.Base.ExpGiven;
                int   enemyLevel   = downedMonster.Monster.Level;
                float battlerBonus = _isCharBattle ? 1.5f : 1f;

                // Handle exp gain.
                int expGain = Mathf.FloorToInt(expBase * enemyLevel * battlerBonus / 7);
                _playerMonster.Monster.Exp += expGain;
                yield return(_dialogBox.TypeDialog($"{_playerMonster.Monster.Base.Name} has gained {expGain.ToString()} experience!"));

                yield return(_playerMonster.Hud.SlideExp());

                // While loop in case the monster gains more than 1 level.
                while (_playerMonster.Monster.CheckForLevelUp())
                {
                    _playerMonster.Hud.SetLevel();
                    yield return(_dialogBox.TypeDialog($"{_playerMonster.Monster.Base.Name} has leveled up, they are now level {_playerMonster.Monster.Level.ToString()}!"));

                    yield return(_playerMonster.Hud.SlideExp(true));

                    // Learn a new move.
                    LearnableMove newMove = _playerMonster.Monster.GetLearnableMove();
                    if (newMove == null)
                    {
                        continue;
                    }

                    if (_playerMonster.Monster.Moves.Count < MonsterBase.MaxNumberOfMoves)
                    {
                        _playerMonster.Monster.LearnMove(newMove);
                        _dialogBox.SetMoveList(_playerMonster.Monster.Moves);
                        yield return(_dialogBox.TypeDialog($"{_playerMonster.Monster.Base.Name} has learned {newMove.Base.Name}!"));
                    }
                    else
                    {
                        // Forget an existing move first.
                        yield return(ForgetMoveSelection(_playerMonster.Monster, newMove));
                    }
                }

                yield return(YieldHelper.OneSecond);
            }

            // Wait until move learning is finished before calling CheckIfBattleIsOver.
            yield return(new WaitUntil(() => _state == BattleState.ExecutingTurn));

            CheckIfBattleIsOver(downedMonster);
        }