Ejemplo n.º 1
0
        public DamageMove(long info)
        {
            _movetype = (AttackingMoveSecondary)((info & MoveTypeMask) >> MoveTypeShift);
            _status   = (StatusConditionInflicted)((info & StatusMask) >> StatusTypeShift);

            _stats = new List <StatBoostInfo>();
            GetStatList(_stats, info);
            _chance = (int)((info & ChanceMask) >> ChanceMaskSShift);
        }
Ejemplo n.º 2
0
        private void DamageTypeMove(RBYPokemon Attacker, RBYPokemon Defender, Attacks atk, AttackingMoveSecondary attacktype, bool nomiss = false)
        {
            bool crit_chance = CriticalChance(Attacker, false);

            Attacker.RecalcStats(crit_chance);
            Defender.RecalcStats(crit_chance);

            if (!HitOrMiss(Attacker.Accuracy, Defender.Evasion, atk.Accuracy) && !Unhittable(Defender) && !nomiss)
            {
                Displayer.AtkMissed();
                Defender.NonDmgHit();
                return;
            }

            ElementTypes type    = atk.MoveType;
            int          basepwr = atk.BasePower;
            bool         physpec = PhysicalSpecial(type);

            float  multipler = TypeMatrixCalc(atk.MoveType, Defender.Type1, Defender.Type2);
            double stab      = 1;


            int power   = physpec == true ? Attacker.InBattleAtk : Attacker.InBattleSpecialAtk;
            int defense = physpec == true ? Defender.InBattleDef : Defender.InBattleSpecialAtk;

            if (Attacker.Type1 == type || Attacker.Type2 == type)
            {
                stab = 1.5;
            }
            int dmg = 0;

            if (attacktype != AttackingMoveSecondary.Turn2 && attacktype != AttackingMoveSecondary.SpecialMech)
            {
                if (crit_chance)
                {
                    Displayer.RelayMessage("Critical Hit!");
                }
            }

            switch (attacktype)
            {
            case AttackingMoveSecondary.None:
                dmg = DamageCalculation(power, defense, Attacker.Level, basepwr, stab, multipler, crit_chance);
                Defender.TakeDamage(dmg, physpec, multipler);
                break;

            case AttackingMoveSecondary.MultiHit:
                MultiHitMove(atk.Name, power, defense, Attacker.Level, basepwr, stab, multipler, Defender, physpec, crit_chance);
                break;

            case AttackingMoveSecondary.Recoil:
                dmg = DamageCalculation(power, defense, Attacker.Level, basepwr, stab, multipler, crit_chance);
                Defender.TakeDamage(dmg, physpec, multipler);
                RecoilLogic(Defender, Attacker, dmg);
                break;

            case AttackingMoveSecondary.SpecialMech: CallSpecialMove(atk.Name, Attacker, Defender);
                break;

            case AttackingMoveSecondary.Trap:
                dmg = DamageCalculation(power, defense, Attacker.Level, basepwr, stab, multipler, crit_chance);
                Defender.TakeDamage(dmg, physpec, multipler);
                TrapLogic(Defender, Attacker);
                break;

            case AttackingMoveSecondary.Turn2:
                Attacker.ActivateTwoTurn(atk);
                break;

            case AttackingMoveSecondary.Absorbing:
                dmg = DamageCalculation(power, defense, Attacker.Level, basepwr, stab, multipler, crit_chance);
                Defender.TakeDamage(dmg, physpec, multipler);
                Attacker.HealDamage(dmg / 2);
                break;

            case AttackingMoveSecondary.Recharge:
                dmg = DamageCalculation(power, defense, Attacker.Level, basepwr, stab, multipler, crit_chance);
                Defender.TakeDamage(dmg, physpec, multipler);
                RechargeLogic(Defender, Attacker);
                break;
            }
            Defender.LastDmg = dmg;

            if (Defender.CurrentStatus == StatusConditionInflicted.Freeze && atk.MoveType == ElementTypes.FIRE)
            {
                Defender.UnFreez();
            }

            SecondaryAffects(Attacker, Defender, atk);
        }
Ejemplo n.º 3
0
        private void DeliverAttack(RBYPokemon Attacker, RBYPokemon Defender, Attacks TheAttack, AttackingMoveSecondary typeOfDamage)
        {
            if (Attacker.TwoTurnMove)
            {
                typeOfDamage = Attacker.FinishTwoTurn();
            }

            if (typeOfDamage != AttackingMoveSecondary.Turn2)
            {
                Displayer.ShoutAttack(Attacker.OwnerCall, TheAttack.Name, Attacker.Name);
            }
            else
            {
                Displayer.TwoTurn();
            }

            if (Attacker.Dancing)
            {
                typeOfDamage = AttackingMoveSecondary.None;
            }


            Defender.WasAttacked = true;
            Defender.OppPrevAtk  = TheAttack.Index;
            Attacker.MyPrevAtk   = TheAttack.Index;

            switch (TheAttack.MoveClass)
            {
            case 0:
                DamageTypeMove(Attacker, Defender, TheAttack, typeOfDamage);
                break;

            case 1:
                StatusTypeMove(Attacker, Defender, TheAttack);
                break;

            case 2:
                StatBoostTypeMove(Attacker, Defender, TheAttack.Attack, TheAttack.Accuracy);
                break;
            }
        }