Esempio n. 1
0
 //OnBeforeMove
 public static Battle.RelayVar ParOnBeforeMove(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
 {
     if (RandomScript.RandomChance(1, 4))
     {
         relayVar.EndEventHere();
     }
     return(relayVar);
 }
Esempio n. 2
0
    public static Battle.RelayVar ConfusionOnBeforeMove(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
    {
        Pokemon poke = ((PokemonCharacter)target.sourceElement).pokemonData;

        //Discount time not here anymore

        if (!RandomScript.RandomChance(1, 3))
        {
            return(relayVar);
        }
        battle.Damage(battle.GetDamage(poke, poke, null, 40), poke.targetData, poke.myPokemon,
                      new MoveData(id: "confused",
                                   effectType: Globals.EffectTypes.Move,
                                   type: Globals.Type.Unknown));

        relayVar.EndEventHere();
        return(relayVar);
    }
Esempio n. 3
0
    //This has to be called after immunities, setting zbroke protect and all of the tryhit and movehit things
    int GetDamage(Pokemon target)
    {
        MoveData moveData = activeData.moveData;

        Battle.RelayVar relayVar;


        /*RETURN DIRECT DAMAGE*/
        if (moveData.ohko != Globals.OHKO.Null)
        {
            return(target.maxhp);                         //Fissure, Sheer cold
        }
        if (moveData.eventMethods.damageCallback != null) //mirro coat, naturesmaddnes, hyper fang...
        {
            relayVar = new Battle.RelayVar();
            moveData.eventMethods.StartCallback("damageCallback", battle, relayVar, target.targetData, source, null);
            return(relayVar.integerValue);
        }
        if (moveData.damageByLevel)
        {
            return(activeData.pokemonLevel);                        //nightshade, seismic toss
        }
        if (moveData.damage != -1)
        {
            return(moveData.damage);                       //Dragon rage, sonic boom
        }
        /*USING BASE POWER*/
        //Category
        Globals.MoveCategory category = (moveData.category == Globals.MoveCategory.Null) ? Globals.MoveCategory.Physical : moveData.category;
        if (moveData.defensiveCategory == Globals.MoveCategory.Null)
        {
            category = moveData.defensiveCategory;
        }

        //BasePower
        int basePower = activeData.basePower;

        if (moveData.eventMethods.basePowerCallback != null)
        {
            relayVar = new Battle.RelayVar();
            moveData.eventMethods.StartCallback("basePowerCallback", battle, relayVar, target.targetData, source, moveData);
            basePower = relayVar.integerValue;
        }
        if (basePower < 0)
        {
            return(-1);                      //Return -1 means no dealing damage
        }
        basePower = Mathf.Max(1, basePower); //Min value will be 1

        //CritRatio
        int[] critMultiplier = { 0, 24, 8, 2, 1 };
        relayVar = new Battle.RelayVar(integerValue: moveData.critRatio);
        relayVar = battle.RunEvent("ModifyCritRatio", source.targetScript, target.myPokemon, moveData, relayVar);
        int critRatio = Mathf.Clamp(relayVar.integerValue, 0, 4);

        //Set crit
        activeData.crit = moveData.willCrit;
        if (!activeData.crit)
        {
            activeData.crit = RandomScript.RandomChance(1, critMultiplier[critRatio]);
        }
        if (activeData.crit)
        {
            relayVar        = new Battle.RelayVar(booleanValue: activeData.crit);
            relayVar        = battle.RunEvent("CriticalHit", target.targetData, null, moveData);
            activeData.crit = relayVar.booleanValue;
        }

        //Happens after crit calculation
        relayVar = new Battle.RelayVar(integerValue: basePower);
        relayVar = battle.RunEvent("BasePower", source.targetScript, target.myPokemon, moveData, relayVar, true);
        if (relayVar.getEndEvent() && relayVar.integerValue != -1)
        {
            return(0);
        }
        basePower = Mathf.Max(1, relayVar.integerValue);

        //Starting?
        int     level       = activeData.pokemonLevel;
        Pokemon defender    = target;
        string  attackStat  = (category == Globals.MoveCategory.Physical) ? "Atk" : "SpA";
        string  defenseStat = (category == Globals.MoveCategory.Physical) ? "Def" : "SpD";

        //statTable
        int attack;
        int defense;

        int atkBoosts = (moveData.useTargetOffensive) ? defender.boosts.GetBoostValue(attackStat) : activeData.pokemonBoosts.GetBoostValue(attackStat);
        int defBoosts = (moveData.useSourceDefensive) ? activeData.pokemonBoosts.GetBoostValue(defenseStat) : defender.boosts.GetBoostValue(defenseStat);

        bool ignoreNegativeOffensive = moveData.ignoreNegativeOffensive;
        bool ignorePositiveDefensive = moveData.ignorePositiveDefensive;

        if (activeData.crit)
        {
            ignoreNegativeOffensive = true;
            ignorePositiveDefensive = true;
        }

        bool ignoreOffensive = moveData.ignoreOffensive || (ignoreNegativeOffensive && atkBoosts < 0);
        bool ignoreDefensive = moveData.ignoreDefensive || (ignorePositiveDefensive && defBoosts > 0);

        if (ignoreOffensive)
        {
            //this.debug('Negating (sp)atk boost/penalty.');
            atkBoosts = 0;
        }

        if (ignoreDefensive)
        {
            //this.debug('Negating (sp)def boost/penalty.');
            defBoosts = 0;
        }

        if (moveData.useTargetOffensive)
        {
            attack = defender.CalculateStat(attackStat, atkBoosts);
        }
        else
        {
            attack = CalculateMoveStat(attackStat, atkBoosts);
        }

        if (moveData.useSourceDefensive)
        {
            defense = CalculateMoveStat(defenseStat, defBoosts);
        }
        else
        {
            defense = defender.CalculateStat(defenseStat, defBoosts);
        }

        //Apply stat modifiers
        relayVar = new Battle.RelayVar(integerValue: attack);
        relayVar = battle.RunEvent("Modify" + attackStat, source.targetScript, defender.myPokemon, moveData, relayVar);
        attack   = relayVar.integerValue;

        relayVar = new Battle.RelayVar(integerValue: defense);
        relayVar = battle.RunEvent("Modify" + defenseStat, defender.targetData, source, moveData, relayVar);
        defense  = relayVar.integerValue;

        //int(int(int(2 * L / 5 + 2) * A * P / D) / 50);
        int baseDamage = Mathf.FloorToInt(Mathf.FloorToInt(Mathf.FloorToInt(2f * level / 5f + 2f) * basePower * attack / defense) / 50f);

        return(ModifyDamage(baseDamage, target));
    }
Esempio n. 4
0
    //I think it will be used for direct damages
    public int GetDamage(Pokemon pokemon, Pokemon target, ActiveMove activeMove, int directDamage = -1)//movedata comes from active move?? //DirectDamage for confusion and stuff
    {
        MoveData moveData = activeMove.activeData.moveData;
        RelayVar relayVar;

        if (moveData == null && directDamage == -1)
        {
            return(-1);                                        //No moveData and no directDamage
        }
        if (directDamage != -1)
        {
            moveData = new MoveData(basePower: directDamage,
                                    type: Globals.Type.Unknown,
                                    category: Globals.MoveCategory.Physical,
                                    willCrit: false);
        }

        //if not ignoreImmunity return false (do it before?

        /*RETURN DIRECT DAMAGE*/
        if (moveData.ohko != Globals.OHKO.Null)
        {
            return(target.maxhp);                         //Fissure, Sheer cold
        }
        if (moveData.eventMethods.damageCallback != null) //mirro coat, naturesmaddnes, hyper fang...
        {
            relayVar = new RelayVar();
            moveData.eventMethods.StartCallback("damageCallback", this, relayVar, target.targetData, pokemon.myPokemon, null);
            return(relayVar.integerValue);
        }
        if (moveData.damageByLevel)
        {
            return(pokemon.level);                        //nightshade, seismic toss
        }
        if (moveData.damage != -1)
        {
            return(moveData.damage);                       //Dragon rage, sonic boom
        }
        /*USING BASE POWER*/
        //Category
        Globals.MoveCategory category = (moveData.category == Globals.MoveCategory.Null) ? Globals.MoveCategory.Physical : moveData.category;
        if (moveData.defensiveCategory != Globals.MoveCategory.Null)
        {
            category = moveData.defensiveCategory;
        }

        //BasePower
        int basePower = moveData.basePower;

        if (moveData.eventMethods.basePowerCallback != null)
        {
            relayVar = new RelayVar();
            moveData.eventMethods.StartCallback("basePowerCallback", this, relayVar, target.targetData, pokemon.myPokemon, moveData);
            basePower = relayVar.integerValue;
        }
        if (basePower < 0)
        {
            return(-1);                      //Return -1 means no dealing damage
        }
        basePower = Mathf.Max(1, basePower); //Min value will be 1
        Debug.Log("Power after basePowerCallback: " + basePower);


        //CritRatio
        int[] critMultiplier = { 0, 24, 8, 2, 1 };
        relayVar = new RelayVar(integerValue: moveData.critRatio);
        relayVar = RunEvent("ModifyCritRatio", pokemon.targetData, target.myPokemon, moveData, relayVar);
        int critRatio = Mathf.Clamp(relayVar.integerValue, 0, 4);

        //Set crit
        activeMove.activeData.crit = moveData.willCrit;
        if (!activeMove.activeData.crit)
        {
            activeMove.activeData.crit = RandomScript.RandomChance(1, critMultiplier[critRatio]);
        }
        if (activeMove.activeData.crit)
        {
            relayVar = new RelayVar(booleanValue: activeMove.activeData.crit);
            relayVar = RunEvent("CriticalHit", target.targetData, null, moveData);
            activeMove.activeData.crit = relayVar.booleanValue;
        }

        //Happens after crit calculation
        relayVar = new RelayVar(integerValue: basePower);
        relayVar = RunEvent("BasePower", pokemon.targetData, target.myPokemon, moveData, relayVar, true);
        if (relayVar.getEndEvent() && relayVar.integerValue != -1)
        {
            return(-1);
        }
        basePower = Mathf.Max(1, relayVar.integerValue);

        Debug.Log("Power after basepower: " + basePower);


        //Starting?
        int     level       = pokemon.level;
        Pokemon attacker    = pokemon;
        Pokemon defender    = target;
        string  attackStat  = (category == Globals.MoveCategory.Physical) ? "Atk" : "SpA";
        string  defenseStat = (category == Globals.MoveCategory.Physical) ? "Def" : "SpD";
        //statTable
        int attack;
        int defense;

        int atkBoosts = (moveData.useTargetOffensive) ? defender.boosts.GetBoostValue(attackStat) : attacker.boosts.GetBoostValue(attackStat);
        int defBoosts = (moveData.useSourceDefensive) ? attacker.boosts.GetBoostValue(defenseStat) : defender.boosts.GetBoostValue(defenseStat);

        bool ignoreNegativeOffensive = moveData.ignoreNegativeOffensive;
        bool ignorePositiveDefensive = moveData.ignorePositiveDefensive;

        if (activeMove.activeData.crit)
        {
            ignoreNegativeOffensive = true;
            ignorePositiveDefensive = true;
        }

        bool ignoreOffensive = moveData.ignoreOffensive || (ignoreNegativeOffensive && atkBoosts < 0);
        bool ignoreDefensive = moveData.ignoreDefensive || (ignorePositiveDefensive && defBoosts > 0);

        if (ignoreOffensive)
        {
            //this.debug('Negating (sp)atk boost/penalty.');
            atkBoosts = 0;
        }

        if (ignoreDefensive)
        {
            //this.debug('Negating (sp)def boost/penalty.');
            defBoosts = 0;
        }

        if (moveData.useTargetOffensive)
        {
            attack = defender.CalculateStat(attackStat, atkBoosts);
        }
        else
        {
            attack = attacker.CalculateStat(attackStat, atkBoosts);
        }

        if (moveData.useSourceDefensive)
        {
            defense = attacker.CalculateStat(defenseStat, defBoosts);
        }
        else
        {
            defense = defender.CalculateStat(defenseStat, defBoosts);
        }

        Debug.Log("attack: " + attack + " defense: " + defense);

        //Apply stat modifiers
        relayVar = new RelayVar(integerValue: attack);
        relayVar = RunEvent("Modify" + attackStat, attacker.targetData, defender.myPokemon, moveData, relayVar);
        attack   = relayVar.integerValue;

        relayVar = new RelayVar(integerValue: defense);
        relayVar = RunEvent("Modify" + defenseStat, defender.targetData, attacker.myPokemon, moveData, relayVar);
        defense  = relayVar.integerValue;

        Debug.Log("After modifiers attack: " + attack + " defense: " + defense);


        //int(int(int(2 * L / 5 + 2) * A * P / D) / 50);
        int baseDamage = Mathf.FloorToInt(Mathf.FloorToInt(Mathf.FloorToInt(2f * level / 5f + 2f) * basePower * attack / defense) / 50f);

        Debug.Log("baseDamage: " + baseDamage);

        // Calculate damage modifiers separately (order differs between generations)
        return(ModifyDamage(baseDamage, pokemon, target, activeMove));
    }