Esempio n. 1
0
 public void SetData(float turnTime, TargetableElement target = null, BattleElement source = null, EffectData sourceEffect = null)
 {
     this.target          = target;
     this.source          = source;
     this.sourceEffect    = sourceEffect;
     this.volatileCounter = turnTime;
 }
Esempio n. 2
0
        //???? effectData
        //???? modifier
        //???? ceilModifier;

        public Event(string id, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
        {
            this.id     = id;
            this.target = target;
            this.source = source;
            this.effect = effect;
        }
Esempio n. 3
0
        private static BattleAction BattleAction(BattleElement unitX, BattleElement unitY, BattleElement attackUnit)
        {
            var newX = new BattleElement().CopyFrom(unitX);
            var newY = new BattleElement().CopyFrom(unitY);

            // XXX ダメージを算出する処理だけを切り出して仕様を再考、テストする
            var attacker   = attackUnit.IsSameElement(unitX) ? newX : newY;
            var diffrencer = attacker.IsSameElement(newX) ? newY : newX;
            var hitRand    = randomizer.NextDouble();
            var hitRatio   = ((double)attacker.Mobility / (double)diffrencer.Mobility) * hitRand;
            var damage     = Math.Max(10, (int)(attacker.Attack * Math.Min(1.0, hitRatio)));

            diffrencer.HP = Math.Max(0, diffrencer.HP - damage);
            var message       = $"{attacker.Name} -> {diffrencer.Name} ... {damage} damage. remaining HP {diffrencer.HP}.";
            var detailMessage = $"{hitRand} -> {hitRatio} * {attacker.Attack} -> {damage}";

            return(new BattleAction()
            {
                UnitX = newX,
                UnitY = newY,
                Attacker = attacker,
                HitRatio = hitRatio,
                Damage = damage,
                Message = message,
                Remark = detailMessage
            });
        }
Esempio n. 4
0
    bool SuppressingAttackEvents(BattleElement source)
    {
        if (source == null)
        {
            return(false);
        }

        return(source.ignoreAbility);
    }
Esempio n. 5
0
 TargetableElement GetPokemonSource(BattleElement source)
 {
     if (source == null)
     {
         return(null);
     }
     if (!(source is ActiveMove))
     {
         return(null);
     }
     return(((ActiveMove)source).source.targetScript);
 }
Esempio n. 6
0
    /*
     * if some targets
     *  damage = tryhitmove
     *  if damage stuff moveResult = true
     *  if(has selfboost && moveresult) moveHit
     *
     *
     */

    void MoveSuccessAfterEffects(TargetableElement target)
    {
        if (source.pokemonData.hp <= 0)
        {
            source.pokemonData.Faint(source, activeData.moveData);
        }

        if (!activeData.negateSecondary && !(activeData.hasSheerForce && source.pokemonData.HasAbilityActive(new string[] { "sheerforce" })))
        {
            BattleElement targetSource = (target == null) ? null : target.sourceElement;
            battle.SingleEvent("AfterMoveSecondarySelf", activeData.moveData, null, source.targetScript, targetSource, activeData.moveData);
            battle.RunEvent("AfterMoveSecondarySelf", source.targetScript, targetSource, activeData.moveData);
        }
    }
Esempio n. 7
0
    public bool Boost(Globals.BoostsTable boost, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
    {
        bool success = false;

        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 (target == null || !(target.sourceElement is PokemonCharacter) || ((PokemonCharacter)target.sourceElement).pokemonData.hp <= 0)
        {
            return(false);
        }
        if (!((PokemonCharacter)target.sourceElement).pokemonData.isActive)
        {
            return(false);
        }
        //if (this.gen > 5 && !target.side.foe.pokemonLeft) return false;
        RelayVar relayVar = new RelayVar(boosts: boost);

        boost = RunEvent("Boost", target, source, effect, relayVar).boosts;
        string[] boostedNames = boost.GetBoostedNames();
        foreach (string boostName in boostedNames)
        {
            int boostBy = ((PokemonCharacter)target.sourceElement).pokemonData.BoostBy(boostName, boost.GetBoostValue(boostName));

            if (boostBy != 0)
            {
                success  = true;
                relayVar = new RelayVar(integerValue: boostBy);
                RunEvent("AfterEachBoost", target, source, effect, relayVar);
            }
        }
        relayVar = new RelayVar(boosts: boost);
        RunEvent("AfterBoost", target, source, effect, relayVar);

        return(success);
    }
Esempio n. 8
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);
    }
Esempio n. 9
0
 //OnStart
 public static Battle.RelayVar ConfusionOnStart(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
 {
     battle.effectDataInEvent.time = RandomScript.RandomBetween(2, 6);
     return(relayVar);
 }
Esempio n. 10
0
    //OnTakeItem
    public static Battle.RelayVar MegaStoneOnTakeItem(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
    {
        ItemData item    = (ItemData)relayVar.effectValue;
        Pokemon  pSource = ((PokemonCharacter)source).pokemonData;

        if (item.megaEvolves == pSource.baseTemplate.baseSpecies)
        {
            relayVar.EndEventHere();
        }
        else
        {
            relayVar.booleanValue = true;
        }

        return(relayVar);
    }
Esempio n. 11
0
    //OnModifySpa
    public static Battle.RelayVar OvergrowOnModifySpA(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
    {
        MoveData move     = (MoveData)effect;
        Pokemon  attacker = ((PokemonCharacter)target.sourceElement).pokemonData;

        if (move.type == Globals.Type.Grass && attacker.hp <= attacker.maxhp / 3)
        {
            Debug.Log("Overgrow boost Spa");
            // this.chainModify(1.5); //TODO
        }
        return(relayVar);
    }
Esempio n. 12
0
 //OnModifyAtk
 public static Battle.RelayVar HustleOnModifyAtk(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
 {
     //battle.modify(relayVar.integerValue, 1.5);
     return(relayVar);
 }
Esempio n. 13
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. 14
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. 15
0
    public RelayVar SingleEvent(string eventId, EffectData effect, EffectData effectData = null, TargetableElement target = null, BattleElement source = null, EffectData sourceEffect = null, RelayVar relayVar = null)
    {
        if (eventDepth >= 8)
        {
            Debug.LogError("STACK LIMIT EXCEEDED");
        }

        if (relayVar == null)
        {
            relayVar = new RelayVar();
        }

        /*Effect has no callback with eventId*/
        if (!effect.eventMethods.HasCallback("on" + eventId))
        {
            return(relayVar);
        }

        Pokemon pokeTarget = (target == null || !(target.sourceElement is PokemonCharacter)) ? null : ((PokemonCharacter)target.sourceElement).pokemonData;

        //Status of target has changed, call it off
        if (effect.effectType == Globals.EffectTypes.Status && pokeTarget != null && pokeTarget.statusId != effect.id)
        {
            return(relayVar);
        }

        /*Suppressed by Embargo, Klutz or Magic Room*/
        if (effect.effectType == Globals.EffectTypes.Item && pokeTarget != null && pokeTarget.IgnoringItem() &&
            eventId != "Start" && eventId != "TakeItem" && eventId != "Primal")
        {
            return(relayVar);
        }

        /*Suppressed by Gastro Acid, ...*/
        if (effect.effectType == Globals.EffectTypes.Ability && pokeTarget != null && pokeTarget.IgnoringAbility() &&
            eventId != "End")
        {
            return(relayVar);
        }

        /*Suppressed by Air Lock, Cloud Nine*/
        if (effect.effectType == Globals.EffectTypes.Weather && SuppressingWeather() &&
            eventId != "Start" && eventId != "Residual" && eventId != "End")
        {
            return(relayVar);
        }

        /*Setting the current event we are dealing with*/
        EffectData        parentEffect     = effectInEvent;
        EffectData        parentEffectData = effectDataInEvent;
        TargetableElement parentTarget     = targetInEvent;
        Event             parentEvent      = currentEvent;

        effectInEvent     = effect;
        effectDataInEvent = effectData;
        targetInEvent     = target;
        currentEvent      = new Event(id: eventId, target: target, source: source, effect: sourceEffect);
        eventDepth++;

        /*Calling Callcack*/
        relayVar = effect.eventMethods.StartCallback("on" + eventId, this, relayVar, target, source, effect);

        /*Recovering last event info*/
        eventDepth--;
        effectInEvent     = parentEffect;
        effectDataInEvent = parentEffectData;
        targetInEvent     = parentTarget;
        currentEvent      = parentEvent;

        return(relayVar);
    }
Esempio n. 16
0
 public static Battle.RelayVar EndEventOnTakeItem(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
 {
     relayVar.EndEventHere();
     return(relayVar);
 }
Esempio n. 17
0
 public static Battle.RelayVar TestingStuff(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
 {
     relayVar.integerValue++;
     return(relayVar);
 }
Esempio n. 18
0
    public RelayVar RunEvent(string eventId, TargetableElement target = null, BattleElement source = null, EffectData effect = null, RelayVar relayVar = null, bool onEffect = false, bool fastExit = false)
    {
        if (eventDepth >= 8)
        {
            Debug.LogError("STACK LIMIT EXCEEDED");
        }

        //Get relevant effects and sort them
        List <EventStatus> statuses = getRelevantEffects(target, eventId, source);

        statuses.Sort(ComparePriority);


        if (relayVar == null)
        {
            relayVar = new RelayVar();
        }

        //Current event we are dealing with
        Event parentEvent = currentEvent;

        currentEvent = new Event(id: eventId, target: target, source: source, effect: effect);
        eventDepth++;

        /*Add the callback for our effect to the beginning if oneffect is true*/
        if (onEffect && effect.eventMethods.HasCallback("on" + eventId))
        {
            statuses.Insert(0, new EventStatus(status: effect, callback: "on" + eventId, thing: target));
        }

        /*
         * for (int i = 0; i < statuses.Count; ++i)
         * {
         *  Debug.Log(statuses[i].callback + " " + statuses[i].status);
         * }
         */

        /*Lets begin*/
        foreach (EventStatus currentStatus in statuses)
        {
            EffectData        currentEffect = currentStatus.status;
            TargetableElement thing         = currentStatus.thing;
            Pokemon           pokeThing     = (thing.sourceElement is PokemonCharacter) ? ((PokemonCharacter)thing.sourceElement).pokemonData : null;

            /*CurrentEffect has no callback with currentStatus.callback*/
            if (!currentEffect.eventMethods.HasCallback(currentStatus.callback))
            {
                continue;
            }

            //Status of target has changed, call it off
            if (currentEffect.effectType == Globals.EffectTypes.Status && pokeThing != null && pokeThing.statusId != currentEffect.id)
            {
                continue;
            }

            //Suppressed by Mold Breaker, Teravolt, Turboblaze,
            if (currentEffect.effectType == Globals.EffectTypes.Ability && !((AbilityData)currentEffect).isUnbreakable &&
                SuppressingAttackEvents(source) && thing != null && thing != GetPokemonSource(source))
            {
                if (MiscData.AttackingEvents.Contains(eventId))
                {
                    continue;
                }
                if (eventId == "Damage" && effect != null && effect.effectType == Globals.EffectTypes.Move)
                {
                    continue;
                }
            }

            /*Suppressed by Embargo, Klutz or Magic Room*/
            if (currentEffect.effectType == Globals.EffectTypes.Item && pokeThing != null && pokeThing.IgnoringItem() &&
                eventId != "Start" && eventId != "TakeItem" && eventId != "SwitchIn")
            {
                continue;
            }
            /*Suppressed by Gastro Acid, ...*/
            else if (currentEffect.effectType == Globals.EffectTypes.Ability && pokeThing != null && pokeThing.IgnoringAbility() &&
                     eventId != "End")
            {
                continue;
            }

            /*Suppressed by Air Lock, Cloud Nine*/
            if ((currentEffect.effectType == Globals.EffectTypes.Weather || eventId == "Weather") && SuppressingWeather() &&
                eventId != "Residual" && eventId != "End")
            {
                continue;
            }

            //Storing last event info
            EffectData        parentEffect     = effectInEvent;
            EffectData        parentEffectData = effectDataInEvent;
            TargetableElement parentTarget     = targetInEvent;
            effectInEvent     = currentEffect;
            effectDataInEvent = currentStatus.statusData;
            targetInEvent     = thing;

            /*Calling Callback*/
            relayVar = currentEffect.eventMethods.StartCallback(currentStatus.callback, this, relayVar, target, source, effect);

            /*Recovering last event info*/
            effectInEvent     = parentEffect;
            effectDataInEvent = parentEffectData;
            targetInEvent     = parentTarget;

            if (relayVar.getEndEvent())
            {
                break;                         //ENDING EVENT
            }
        }

        eventDepth--;
        currentEvent = parentEvent;

        return(relayVar);
    }
Esempio n. 19
0
 public static Battle.RelayVar FlinchOnBeforeMove(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
 {
     Debug.Log("You are not sup-POSED to be hia?");
     if (battle.RunEvent("Flinch", target).getEndEvent())
     {
         return(relayVar);
     }
     relayVar.EndEventHere();
     return(relayVar);
 }
Esempio n. 20
0
    public List <EventStatus> getRelevantEffects(TargetableElement thing, string eventId, BattleElement foeThing = null)
    {
        List <EventStatus> statuses = new List <EventStatus>();


        /* Stuff in Battle (not pokemons)  */
        getRelevantEffectsBattle(statuses, thing, "on" + eventId); //on + eventId for everything


        //AFTER HERE WE ONLY CHECK STUFF FOR POKEMONS and team moves
        /*TEAM ELEMENTS*/
        //The target is a pokemon and not other active stuff (the pokemons itself will react to that, its allies to, its foes too. Maybe other active elements too if they were the source?)
        if (thing == null || !(thing.sourceElement is PokemonCharacter))
        {
            return(statuses);
        }
        Pokemon pokeThing = ((PokemonCharacter)thing.sourceElement).pokemonData;


        Team thingTeam = pokeThing.team;

        //Active moves that are side conditions (team conditions)
        getRelevantEffectsTeam(statuses, thing, thingTeam, "on" + eventId); //on + eventId for the target TEAM

        for (int i = 0; i < teams.Length; ++i)
        {
            getRelevantEffectsTeam(statuses, thing, teams[i], "onAny" + eventId); //onAny + eventId  for all TEAMS
            if (teams[i] == thingTeam)
            {
                continue;
            }
            getRelevantEffectsTeam(statuses, thing, teams[i], "onFoe" + eventId); //onFoe + eventId  for enemy TEAMS
        }

        /*F*****G END TEAM ELEMENTS*/

        /*POKEMON ELEMENTS*/
        getRelevantEffectsPokemon(statuses, thing, "on" + eventId); //on + eventId for target pokemon

        if (foeThing is PokemonCharacter)
        {
            getRelevantEffectsPokemon(statuses, ((PokemonCharacter)foeThing).targetScript, "onSource" + eventId); //onsource + eventId for source pokemon
        }

        foreach (Team team in teams)
        {
            foreach (PokemonCharacter pokemon in team.pokemons)
            {
                if (!pokemon.pokemonData.isActive || pokemon.pokemonData.fainted)
                {
                    continue;
                }
                getRelevantEffectsPokemon(statuses, pokemon.targetScript, "onAny" + eventId); //onAny + eventId for all pokemons
                if (team == pokeThing.team)
                {
                    getRelevantEffectsPokemon(statuses, pokemon.targetScript, "onAlly" + eventId);                         //onAlly + eventId for all pokemons in target team
                }
                else
                {
                    getRelevantEffectsPokemon(statuses, pokemon.targetScript, "onFoe" + eventId);  //onFoe + eventId for all pokemons in enemy teams
                }
            }
        }
        /*End Pokemon elements*/

        return(statuses);
    }
Esempio n. 21
0
    //onBasePower
    public static Battle.RelayVar TechnicianOnBasePower(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
    {
        int basePower = relayVar.integerValue;

        if (basePower <= 60)
        {
            relayVar.integerValue = Mathf.FloorToInt(basePower * 1.5f);
        }
        return(relayVar);
    }
Esempio n. 22
0
    public int Damage(int damage, TargetableElement target = null, BattleElement source = null, EffectData effect = null, bool instafaint = false)
    {
        if (currentEvent != null)
        {
            if (target == null)
            {
                target = currentEvent.target;
            }
            if (source == null)
            {
                source = currentEvent.source;
            }
            if (effect == null)
            {
                effect = effectInEvent;
            }
        }
        if (target == null || !(target.sourceElement is PokemonCharacter))
        {
            return(0);
        }
        Pokemon poke = ((PokemonCharacter)target.sourceElement).pokemonData;

        if (poke.hp <= 0)
        {
            return(0);
        }
        if (damage <= 0)
        {
            return(0);
        }

        //// Struggle recoil is not affected by effects
        if (effect.id != "struggle-recoil")
        {
            if (effect.effectType == Globals.EffectTypes.Weather && poke.HasStatusImmunity(effect.id))
            {
                return(0);
            }
            RelayVar relayVar = new RelayVar(integerValue: damage);
            damage = RunEvent("Damage", target, source, effect, relayVar).integerValue;
            if (damage <= 0)
            {
                return(0);
            }
        }
        damage = poke.Damage(damage, source, effect);
        if (source is PokemonCharacter && effect != null && effect.effectType == Globals.EffectTypes.Move)
        {
            ((PokemonCharacter)source).pokemonData.lastDamage = damage;
        }

        if (effect != null && effect.drain != null && source is PokemonCharacter)
        {
            //this.heal(Math.ceil(damage * effect.drain[0] / effect.drain[1]), source, target, 'drain');
            Heal(Mathf.CeilToInt(damage * effect.drain[0] / effect.drain[1]), target, source, GetPureEffect("drain"));
        }

        if (!instafaint && poke.hp > 0)
        {
            RelayVar relayVar = new RelayVar(integerValue: damage);
            damage = RunEvent("AfterDamage", target, source, effect, relayVar).integerValue;
        }

        return(damage);
    }
Esempio n. 23
0
 public static Battle.RelayVar TestOnModifyAtk(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
 {
     relayVar.integerValue = 10;
     return(relayVar);
 }
Esempio n. 24
0
    //OnModifySpe
    public static Battle.RelayVar ParOnModifySpe(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
    {
        if (!(target.sourceElement is PokemonCharacter))
        {
            return(relayVar);
        }
        Pokemon pokemon = ((PokemonCharacter)target.sourceElement).pokemonData;

        if (pokemon.HasAbilityActive(new string[] { "quickfeet" }))
        {
            relayVar.integerValue = Mathf.FloorToInt(relayVar.integerValue * .5f);
        }
        return(relayVar);
    }
Esempio n. 25
0
    public static Battle.RelayVar PsnOnResidual(Battle battle, Battle.RelayVar relayVar, TargetableElement target = null, BattleElement source = null, EffectData effect = null)
    {
        Pokemon pokemon = ((PokemonCharacter)target.sourceElement).pokemonData;

        battle.Damage(pokemon.maxhp / 8);
        return(relayVar);
    }
Esempio n. 26
0
 public Battle.RelayVar StartCallback(string callbackName, Battle battle, Battle.RelayVar relayVar, TargetableElement target, BattleElement source, EffectData effect)
 {
     return(((Callbacks.EventCallback) this.GetType().GetField(callbackName).GetValue(this))(battle, relayVar, target, source, effect));
 }