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); } } }
internal PBEMoveEffectivenessPacket(ReadOnlyCollection <byte> buffer, BinaryReader r, PBEBattle battle) { Buffer = buffer; Victim = (PBEFieldPosition)r.ReadByte(); VictimTeam = battle.Teams[r.ReadByte()]; Effectiveness = (PBEEffectiveness)r.ReadByte(); }
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); }
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(); } }
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); }
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); }