Ejemplo n.º 1
0
 public void StartBattle(InstancePokemonObject pokemon)
 {
     OnBattleStart.Invoke(pokemon);
     cameraSwitcher.EnterBattle();
     //messageText.PlayText(pokemon.name);
     // TODO make these 2 listeners to OnBattleStart
     enemyUI.InitializePanel(pokemon);
     enemyPokemon.SetPokemon(pokemon, false);
     pokeManager.SendPokemon();
 }
Ejemplo n.º 2
0
 public void StartBattle()
 {
     print("StartBattle()");
     OnBattleStart.Invoke(pkmn);
     anim.Play("Off");
 }
Ejemplo n.º 3
0
    IEnumerator BattleCoroutine(Hero _attacker, Hero _attacked)
    {
        DataManager.instance.gameState = GameState.Battle;
        onStartBattle.Invoke(_attacker, _attacked);

        continueBattle = false;
        yield return(new WaitUntil(() => continueBattle));

        // First the attacker attack
        onHeroAttack.Invoke(_attacker, _attacked);

        continueBattle = false;
        yield return(new WaitUntil(() => continueBattle));

        // If the attacked is alive, then attack
        if (_attacked.isAlive)
        {
            onHeroAttack.Invoke(_attacked, _attacker);

            continueBattle = false;
            yield return(new WaitUntil(() => continueBattle));
        }

        // Check for speed superiority :
        // if one of them has 5 more in speed than the other
        // then attack a second time in the turn
        if (_attacker.speed >= _attacked.speed + 5)
        {
            onHeroAttack.Invoke(_attacker, _attacked);

            continueBattle = false;
            yield return(new WaitUntil(() => continueBattle));
        }
        else if (_attacked.speed >= _attacker.speed + 5)
        {
            onHeroAttack.Invoke(_attacked, _attacker);

            continueBattle = false;
            yield return(new WaitUntil(() => continueBattle));
        }

        battleCoroutine = null;
        onEndCutscene.Invoke();

        // Wait the end of animation
        continueBattle = false;
        yield return(new WaitUntil(() => continueBattle));

        if (_attacker.isAlive && _attacker.expChanged)
        {
            HeroExpInfo info = _attacker.CheckCurrentLevel();
            onExpGain.Invoke(info);

            continueBattle = false;
            yield return(new WaitUntil(() => continueBattle));
        }

        if (_attacked.isAlive && _attacked.expChanged)
        {
            HeroExpInfo info = _attacked.CheckCurrentLevel();
            onExpGain.Invoke(info);

            continueBattle = false;
            yield return(new WaitUntil(() => continueBattle));
        }

        DataManager.instance.gameState = GameState.Playing;
        onEndBattle.Invoke();
    }
Ejemplo n.º 4
0
        IEnumerator ActPhase(BattleEvent playerEvent, BattleEvent enemyEvent)
        {
            for (int i = 0; i < 2; i++)
            {
                bool  isFriendlyTurn       = i == 0;
                float previousPlayerHealth = _myPokemon.Health;
                float previousEnemyHealth  = _enemyPokemon.Health;

                _dialogueController.ClearPages();

                if (isFriendlyTurn) // 아군의 턴
                {
                    playerEvent.Invoke(_myPokemon, _enemyPokemon);
                    // 상태 이상
                    if (_myPokemon._effectCount > 0)
                    {
                        _myPokemon._effectCount--;
                    }
                    else
                    {
                        _myPokemon._status = Pokemon.StatusEffect.None;
                    }
                }
                else // 적의 턴
                {
                    enemyEvent.Invoke(_enemyPokemon, _myPokemon);
                    // 상태 이상
                    if (_enemyPokemon._effectCount > 0)
                    {
                        _enemyPokemon._effectCount--;
                    }
                    else
                    {
                        _enemyPokemon._status = Pokemon.StatusEffect.None;
                    }
                }

                // 대사 1(데미지 판정 이전)
                _dialogueController.NextDialogue();
                yield return(_waitDialogueUpdating);

                _uiManager._effect.StartAnim(i);
                yield return(new WaitUntil(() => _uiManager._effect._isAnimating == false));

                _uiManager._effect.ResetAnim();

                if (_myPokemon.Health != previousPlayerHealth)
                {
                    if (_myPokemon.Health < previousPlayerHealth)
                    {
                        _uiManager._mainUI.HitPlayer();
                        StartCoroutine("PlayHitSound");
                    }
                    _uiManager._mainUI.UpdatePlayerHpUI(_myPokemon.Health, _myPokemon.MaxHealth, true);
                }

                if (_enemyPokemon.Health != previousEnemyHealth)
                {
                    if (_enemyPokemon.Health < previousEnemyHealth)
                    {
                        _uiManager._mainUI.HitEnemy();
                        StartCoroutine("PlayHitSound");
                    }
                    _uiManager._mainUI.UpdateEnemyHpUI(_enemyPokemon.Health, _enemyPokemon.MaxHealth, true);
                }

                yield return(0.1f);

                yield return(_waitUIUpdating);

                // 대사 2(데미지 판정 이후)
                _dialogueController.NextDialogue();
                yield return(_waitDialogueUpdating);

                yield return(_waitInputing);

                _dialogueController.EndDialogue();

                if (_isGameOver)
                {
                    break;
                }
            }

            // 게임 종료 체크
            if (_isGameOver)
            {
                StartCoroutine("EndBattle");
            }
            else
            {
                SelectAction();
            }
        }