コード例 #1
0
        private void TypeCheck(PBEPokemon user, PBEPokemon target, PBEType moveType, out PBEEffectiveness moveEffectiveness, ref double moveEffectivenessMultiplier, bool ignoreWonderGuard)
        {
            double m = PBEPokemonData.TypeEffectiveness[moveType][target.Type1];

            m *= PBEPokemonData.TypeEffectiveness[moveType][target.Type2];

            if (m <= 0) // (-infinity, 0]
            {
                moveEffectiveness = PBEEffectiveness.Ineffective;
            }
            else if (m < 1) // (0, 1)
            {
                moveEffectiveness = PBEEffectiveness.NotVeryEffective;
            }
            else if (m == 1.0) // [1, 1]
            {
                moveEffectiveness = PBEEffectiveness.Normal;
            }
            else // (1, infinity)
            {
                moveEffectiveness = PBEEffectiveness.SuperEffective;
            }
            moveEffectivenessMultiplier *= m;

            if (moveEffectiveness != PBEEffectiveness.Ineffective)
            {
                if ((target.Ability == PBEAbility.Levitate && moveType == PBEType.Ground) ||
                    (!ignoreWonderGuard && target.Ability == PBEAbility.WonderGuard && moveEffectiveness != PBEEffectiveness.SuperEffective))
                {
                    moveEffectiveness           = PBEEffectiveness.Ineffective;
                    moveEffectivenessMultiplier = 0;
                    BroadcastAbility(target, target, target.Ability, PBEAbilityAction.Damage);
                }
            }
        }
コード例 #2
0
 internal PBEMoveEffectivenessPacket(ReadOnlyCollection <byte> buffer, BinaryReader r, PBEBattle battle)
 {
     Buffer        = buffer;
     Victim        = (PBEFieldPosition)r.ReadByte();
     VictimTeam    = battle.Teams[r.ReadByte()];
     Effectiveness = (PBEEffectiveness)r.ReadByte();
 }
コード例 #3
0
        public PBEMoveEffectivenessPacket(PBEPokemon victim, PBEEffectiveness effectiveness)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(Victim = victim.FieldPosition));
            bytes.Add((VictimTeam = victim.Team).Id);
            bytes.Add((byte)(Effectiveness = effectiveness));
            Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes);
        }
コード例 #4
0
 public PBEMoveEffectivenessPacket(byte[] buffer, PBEBattle battle)
 {
     Buffer = buffer;
     using (var r = new BinaryReader(new MemoryStream(buffer)))
     {
         r.ReadInt16(); // Skip Code
         Victim        = (PBEFieldPosition)r.ReadByte();
         VictimTeam    = battle.Teams[r.ReadByte()];
         Effectiveness = (PBEEffectiveness)r.ReadByte();
     }
 }
コード例 #5
0
        internal PBEMoveEffectivenessPacket(PBEPokemon victim, PBEEffectiveness effectiveness)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(Victim = victim.FieldPosition));
            bytes.Add((VictimTeam = victim.Team).Id);
            bytes.Add((byte)(Effectiveness = effectiveness));
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
コード例 #6
0
        private double CalculateDamageMultiplier(PBEPokemon user, PBEPokemon target, PBEMove move, PBEType moveType, PBEEffectiveness moveEffectiveness, bool criticalHit)
        {
            PBEMoveData mData            = PBEMoveData.Data[move];
            double      damageMultiplier = 1;

            switch (move)
            {
            case PBEMove.Gust:
                if (target.Status2.HasFlag(PBEStatus2.Airborne))
                {
                    damageMultiplier *= 2.0;
                }
                break;

            case PBEMove.Earthquake:
            case PBEMove.Magnitude:
                if (target.Status2.HasFlag(PBEStatus2.Underground))
                {
                    damageMultiplier *= 2.0;
                }
                break;

            case PBEMove.Steamroller:
            case PBEMove.Stomp:
                if (target.ExecutedMoves.Any(m => m.Move == PBEMove.Minimize))     // TODO: Could minimize ever fail?
                {
                    damageMultiplier *= 2.0;
                }
                break;

            case PBEMove.Surf:
                if (target.Status2.HasFlag(PBEStatus2.Underwater))
                {
                    damageMultiplier *= 2.0;
                }
                break;
            }

            if (criticalHit)
            {
                damageMultiplier *= Settings.CritMultiplier;
                if (user.Ability == PBEAbility.Sniper)
                {
                    damageMultiplier *= 1.5;
                }
            }
            else
            {
                if ((target.Team.TeamStatus.HasFlag(PBETeamStatus.Reflect) && mData.Category == PBEMoveCategory.Physical) ||
                    (target.Team.TeamStatus.HasFlag(PBETeamStatus.LightScreen) && mData.Category == PBEMoveCategory.Special))
                {
                    if (target.Team.NumPkmnOnField == 1)
                    {
                        damageMultiplier *= 0.5;
                    }
                    else
                    {
                        damageMultiplier *= 0.66;
                    }
                }
            }

            switch (moveEffectiveness)
            {
            case PBEEffectiveness.NotVeryEffective:
                if (user.Ability == PBEAbility.TintedLens)
                {
                    damageMultiplier *= 2.0;
                }
                break;

            case PBEEffectiveness.SuperEffective:
                if (target.Ability == PBEAbility.Filter || target.Ability == PBEAbility.SolidRock)
                {
                    damageMultiplier *= 0.75;
                }
                if (user.Item == PBEItem.ExpertBelt)
                {
                    damageMultiplier *= 1.2;
                }
                break;
            }
            if (user.HasType(moveType))
            {
                if (user.Ability == PBEAbility.Adaptability)
                {
                    damageMultiplier *= 2.0;
                }
                else
                {
                    damageMultiplier *= 1.5;
                }
            }
            if (mData.Category == PBEMoveCategory.Physical && user.Status1 == PBEStatus1.Burned && user.Ability != PBEAbility.Guts)
            {
                damageMultiplier *= 0.5;
            }
            if (moveType == PBEType.Fire && target.Ability == PBEAbility.Heatproof)
            {
                damageMultiplier *= 0.5;
            }

            return(damageMultiplier);
        }