Esempio n. 1
0
        void UseAbilities(GameTime gameTime)
        {
            //USE ABILITIES
            if (playerAbility == null && enemyAbility == null)
            {
                SwitchState(BattleState.END_TURN);
                return;
            }
            else if (enemyAbility != null && ((playerAbility == null) ||
                                              (playerAbility.Priority < enemyAbility.Priority) ||
                                              (playerAbility.Priority == enemyAbility.Priority && playerMokepon.SPD < enemyMokepon.SPD)))
            {
                //Use enemy ability
                if (enemyAbility.UsedWithItem)
                {
                    Dialogues.AddText(enemy.Name + " uses " + enemyAbility.ItemName + "!");
                    if (!Dialogues.Displaying)
                    {
                        Dialogues.DisplayNext();
                    }
                }
                else
                {
                    Dialogues.AddText(enemyMokepon.Name + " uses " + enemyAbility.Name + "!");
                    if (!Dialogues.Displaying)
                    {
                        Dialogues.DisplayNext();
                    }
                }

                double hit = Managers.GameManager.Instance.random.NextDouble();

                if (hit >= (enemyAbility.UsedWithItem ? (enemyAbility.ACC / 100.0) :
                            (enemyAbility.ACC / 100.0 * enemyMokepon.ACC / 100.0)))
                {
                    Dialogues.AddText("It missed!");
                    enemyAbility = null;
                    return;
                }

                if (enemyAbility.Attack)
                {
                    Damage damage = GameManager.Instance.CalculateDamage(enemyMokepon, playerMokepon, enemyAbility);

                    if (damage.Critical)
                    {
                        Dialogues.AddText("Critical hit!");
                        if (!Dialogues.Displaying)
                        {
                            Dialogues.DisplayNext();
                        }
                    }

                    if (damage.Multipiler > 1)
                    {
                        Dialogues.AddText("It's super effective!");
                        if (!Dialogues.Displaying)
                        {
                            Dialogues.DisplayNext();
                        }
                    }
                    else if (damage.Multipiler < 1)
                    {
                        Dialogues.AddText("It's not very effective!");
                        if (!Dialogues.Displaying)
                        {
                            Dialogues.DisplayNext();
                        }
                    }

                    playerMokepon.ReceiveDamage(damage.DamageValue);
                }

                enemyAbility.Effect(ref enemyMokepon, ref playerMokepon, this);
                wait         = 3.0;
                enemyAbility = null;
                GC.Collect();
            }
            else
            {
                //Use player ability
                if (playerAbility.UsedWithItem)
                {
                    Dialogues.AddText(player.Name + " uses " + playerAbility.ItemName + "!");
                    if (!Dialogues.Displaying)
                    {
                        Dialogues.DisplayNext();
                    }
                }
                else
                {
                    Dialogues.AddText(playerMokepon.Name + " uses " + playerAbility.Name + "!");
                    if (!Dialogues.Displaying)
                    {
                        Dialogues.DisplayNext();
                    }
                }

                double hit = Managers.GameManager.Instance.random.NextDouble();

                if (hit >= (playerAbility.UsedWithItem ? (playerAbility.ACC / 100.0) :
                            (playerAbility.ACC / 100.0 * playerMokepon.ACC / 100.0)))
                {
                    Dialogues.AddText("It missed!");
                    playerAbility = null;
                    return;
                }

                if (playerAbility.Attack)
                {
                    Damage damage = GameManager.Instance.CalculateDamage(playerMokepon, enemyMokepon, playerAbility);

                    if (damage.Critical)
                    {
                        Dialogues.AddText("Critical hit!");
                        if (!Dialogues.Displaying)
                        {
                            Dialogues.DisplayNext();
                        }
                    }

                    if (damage.Multipiler > 1)
                    {
                        Dialogues.AddText("It's super effective!");
                        if (!Dialogues.Displaying)
                        {
                            Dialogues.DisplayNext();
                        }
                    }
                    else if (damage.Multipiler < 1)
                    {
                        Dialogues.AddText("It's not very effective!");
                        if (!Dialogues.Displaying)
                        {
                            Dialogues.DisplayNext();
                        }
                    }

                    enemyMokepon.ReceiveDamage(damage.DamageValue);
                }

                playerAbility.Effect(ref playerMokepon, ref enemyMokepon, this);
                wait          = 3.0;
                playerAbility = null;
                GC.Collect();

                if (EnemyMokeponCaught)
                {
                    Dialogues.AddText(player.Name + " has caught " + enemyMokepon.Name + "!");

                    if (player.Mokepons.Count < 6)
                    {
                        player.Mokepons.Add(enemyMokepon);

                        enemy.Mokepons.Remove(enemyMokepon);
                        enemyMokepon = null;
                        enemyStats.UnloadContent();
                        enemyMokeponImage.UnloadContent();
                        enemyStats        = null;
                        enemyMokeponImage = null;
                        GC.Collect();
                        SwitchState(BattleState.NAME_MOKEPON);
                        return;
                    }
                    else
                    {
                        Dialogues.AddText(player.Name + " has reached maximum number of Mokepons!");
                        enemyMokepon.HP = 0;
                    }

                    playerAbility = null;
                    enemyAbility  = null;
                }
            }

            if (playerMokepon.HP == 0)
            {
                Dialogues.AddText(playerMokepon.Name + " fainted!");
                if (!Dialogues.Displaying)
                {
                    Dialogues.DisplayNext();
                }
                playerMokepon = null;
                playerStats.UnloadContent();
                playerMokeponImage.UnloadContent();
                playerStats        = null;
                playerMokeponImage = null;
                GC.Collect();
                SwitchState(BattleState.END_TURN);
            }

            if (enemyMokepon.HP == 0)
            {
                int XP = GameManager.Instance.CalculateExperience(playerMokepon, enemyMokepon, enemy.Name.Length > 0);
                playerMokepon.GainXP(XP);
                Dialogues.AddText(playerMokepon.Name + " gained " + XP.ToString() + " experience points!");
                if (!Dialogues.Displaying)
                {
                    Dialogues.DisplayNext();
                }

                while (playerMokepon.XP >= playerMokepon.LVL_UP_XP)
                {
                    playerMokepon.LevelUp();
                    Dialogues.AddText(playerMokepon.Name + " grew to level " + playerMokepon.LVL + "!");
                }

                Dialogues.AddText(enemyMokepon.Name + " fainted!");

                enemyMokepon = null;
                enemyStats.UnloadContent();
                enemyMokeponImage.UnloadContent();
                enemyStats        = null;
                enemyMokeponImage = null;

                GC.Collect();
                SwitchState(BattleState.END_TURN);
            }
        }