Beispiel #1
0
    public int Heal(int damage, TargetableElement target, BattleElement source, EffectData effect)
    {
        if (this.currentEvent != null)
        {
            if (target == null)
            {
                target = this.currentEvent.target;
            }
            if (source == null)
            {
                source = this.currentEvent.source;
            }
            if (effect == null)
            {
                effect = this.effectInEvent;
            }
        }
        if (damage < 1)
        {
            damage = 1;
        }
        RelayVar relayVar = new RelayVar(integerValue: damage);

        relayVar = RunEvent("TryHeal", target, source, effect, relayVar);
        damage   = relayVar.integerValue;
        if (relayVar.getEndEvent())
        {
            return(0);
        }
        if (!(target.sourceElement is PokemonCharacter))
        {
            return(0);
        }
        Pokemon pokeData = ((PokemonCharacter)target.sourceElement).pokemonData;

        if (pokeData.hp <= 0 || !pokeData.isActive || pokeData.hp >= pokeData.maxhp)
        {
            return(0);
        }

        int finalDamage = pokeData.Heal(damage);

        relayVar = new RelayVar(integerValue: finalDamage);

        RunEvent("Heal", target, source, effect, relayVar);
        return(finalDamage);
    }
Beispiel #2
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));
    }