public void TeamProtection_Works(PBEMove move, PBEMove move2, PBETeamStatus teamStatus) { #region Setup PBERandom.SetSeed(0); PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPokemonCollection(1); p0[0] = new TestPokemon(settings, PBESpecies.Mienshao, 0, 100, move); var p1 = new TestPokemonCollection(1); p1[0] = new TestPokemon(settings, PBESpecies.Lucario, 0, 100, move2); var battle = new PBEBattle(PBEBattleFormat.Single, settings, new PBETrainerInfo(p0, "Trainer 0"), new PBETrainerInfo(p1, "Trainer 1")); battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler; battle.Begin(); PBETrainer t0 = battle.Trainers[0]; PBETrainer t1 = battle.Trainers[1]; PBEBattlePokemon mienshao = t0.Party[0]; PBEBattlePokemon lucario = t1.Party[0]; #endregion #region Use move and check Assert.True(PBEBattle.SelectActionsIfValid(t0, new PBETurnAction(mienshao, move, PBETurnTarget.AllyCenter))); Assert.True(PBEBattle.SelectActionsIfValid(t1, new PBETurnAction(lucario, move2, PBETurnTarget.FoeCenter))); battle.RunTurn(); Assert.True(battle.VerifyTeamStatusHappened(t0.Team, teamStatus, PBETeamStatusAction.Damage, damageVictim: mienshao) && !t0.Team.TeamStatus.HasFlag(teamStatus)); #endregion #region Cleanup battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler; #endregion }
private void SelectMoveForTurn(PBEMove move) { PBEBattlePokemon pkmn = _pkmn.Pkmn; PBEMoveTarget possibleTargets = pkmn.GetMoveTargets(move); // Single battle only PBETurnTarget targets; switch (possibleTargets) { case PBEMoveTarget.All: targets = PBETurnTarget.AllyCenter | PBETurnTarget.FoeCenter; break; case PBEMoveTarget.AllFoes: case PBEMoveTarget.AllFoesSurrounding: case PBEMoveTarget.AllSurrounding: case PBEMoveTarget.RandomFoeSurrounding: case PBEMoveTarget.SingleFoeSurrounding: case PBEMoveTarget.SingleNotSelf: case PBEMoveTarget.SingleSurrounding: targets = PBETurnTarget.FoeCenter; break; case PBEMoveTarget.AllTeam: case PBEMoveTarget.Self: case PBEMoveTarget.SelfOrAllySurrounding: case PBEMoveTarget.SingleAllySurrounding: targets = PBETurnTarget.AllyCenter; break; default: throw new ArgumentOutOfRangeException(nameof(possibleTargets)); } pkmn.TurnAction = new PBETurnAction(pkmn, move, targets); _parent.ActionsLoop(false); }
public PBETransformPacket(byte[] buffer, PBEBattle battle) { Buffer = buffer; using (var r = new BinaryReader(new MemoryStream(buffer))) { r.ReadInt16(); // Skip Code User = (PBEFieldPosition)r.ReadByte(); UserTeam = battle.Teams[r.ReadByte()]; Target = (PBEFieldPosition)r.ReadByte(); TargetTeam = battle.Teams[r.ReadByte()]; TargetAttack = r.ReadUInt16(); TargetDefense = r.ReadUInt16(); TargetSpAttack = r.ReadUInt16(); TargetSpDefense = r.ReadUInt16(); TargetSpeed = r.ReadUInt16(); TargetAttackChange = r.ReadSByte(); TargetDefenseChange = r.ReadSByte(); TargetSpAttackChange = r.ReadSByte(); TargetSpDefenseChange = r.ReadSByte(); TargetSpeedChange = r.ReadSByte(); TargetAccuracyChange = r.ReadSByte(); TargetEvasionChange = r.ReadSByte(); TargetAbility = (PBEAbility)r.ReadByte(); TargetSpecies = (PBESpecies)r.ReadUInt16(); TargetType1 = (PBEType)r.ReadByte(); TargetType2 = (PBEType)r.ReadByte(); TargetWeight = r.ReadDouble(); var moves = new PBEMove[r.ReadByte()]; for (int i = 0; i < moves.Length; i++) { moves[i] = (PBEMove)r.ReadUInt16(); } TargetMoves = Array.AsReadOnly(moves); } }
// Stats & PP are set from the shell info public PBEPokemon(PBETeam team, byte id, PBEPokemonShell shell) { Team = team; SelectedAction.PokemonId = Id = id; Shell = shell; VisualGender = Shell.Gender; VisualNickname = Shell.Nickname; VisualShiny = Shell.Shiny; VisualSpecies = Shell.Species; Ability = Shell.Ability; Item = Shell.Item; CalculateStats(); HP = MaxHP; HPPercentage = 1.0; Moves = Shell.Moves; PP = new byte[Moves.Length]; MaxPP = new byte[Moves.Length]; for (int i = 0; i < Moves.Length; i++) { PBEMove move = Shell.Moves[i]; if (move != PBEMove.None) { byte tier = PBEMoveData.Data[move].PPTier; PP[i] = MaxPP[i] = (byte)Math.Max(1, (tier * Team.Battle.Settings.PPMultiplier) + (tier * Shell.PPUps[i])); } } PBEPokemonData pData = PBEPokemonData.Data[Shell.Species]; Type1 = pData.Type1; Type2 = pData.Type2; Weight = pData.Weight; Team.Party.Add(this); }
internal PBETransformPacket(byte[] data, EndianBinaryReader r, PBEBattle battle) { Data = new ReadOnlyCollection <byte>(data); UserTrainer = battle.Trainers[r.ReadByte()]; User = r.ReadEnum <PBEFieldPosition>(); TargetTrainer = battle.Trainers[r.ReadByte()]; Target = r.ReadEnum <PBEFieldPosition>(); TargetAttack = r.ReadUInt16(); TargetDefense = r.ReadUInt16(); TargetSpAttack = r.ReadUInt16(); TargetSpDefense = r.ReadUInt16(); TargetSpeed = r.ReadUInt16(); TargetAttackChange = r.ReadSByte(); TargetDefenseChange = r.ReadSByte(); TargetSpAttackChange = r.ReadSByte(); TargetSpDefenseChange = r.ReadSByte(); TargetSpeedChange = r.ReadSByte(); TargetAccuracyChange = r.ReadSByte(); TargetEvasionChange = r.ReadSByte(); TargetAbility = r.ReadEnum <PBEAbility>(); TargetSpecies = r.ReadEnum <PBESpecies>(); TargetForm = r.ReadEnum <PBEForm>(); TargetType1 = r.ReadEnum <PBEType>(); TargetType2 = r.ReadEnum <PBEType>(); TargetWeight = r.ReadSingle(); var moves = new PBEMove[battle.Settings.NumMoves]; for (int i = 0; i < moves.Length; i++) { moves[i] = r.ReadEnum <PBEMove>(); } TargetMoves = new ReadOnlyCollection <PBEMove>(moves); }
public PBEExecutedMove(ushort turnNumber, PBEMove move, PBEFailReason failReason, IList <PBETargetSuccess> targets) { TurnNumber = turnNumber; Move = move; FailReason = failReason; Targets = new ReadOnlyCollection <PBETargetSuccess>(targets); }
/// <summary> /// Transforms into <paramref name="target"/> and sets <see cref="PBEStatus2.Transformed"/>. /// </summary> /// <param name="target">The Pokémon to transform into.</param> /// <remarks>Frees the Pokémon of its <see cref="ChoiceLockedMove"/>.</remarks> public void Transform(PBEPokemon target) { VisualSpecies = target.Shell.Species; VisualShiny = target.Shell.Shiny; VisualGender = target.Shell.Gender; Ability = target.Ability; Type1 = target.Type1; Type2 = target.Type2; Weight = target.Weight; Attack = target.Attack; Defense = target.Defense; SpAttack = target.SpAttack; SpDefense = target.SpDefense; Speed = target.Speed; AttackChange = target.AttackChange; DefenseChange = target.DefenseChange; SpAttackChange = target.SpAttackChange; SpDefenseChange = target.SpDefenseChange; SpeedChange = target.SpeedChange; AccuracyChange = target.AccuracyChange; EvasionChange = target.EvasionChange; Moves = (PBEMove[])target.Moves.Clone(); if (Id != byte.MaxValue) { for (int i = 0; i < Moves.Length; i++) { PP[i] = MaxPP[i] = (byte)(Moves[i] == PBEMove.None ? 0 : PBEMoveData.Data[Moves[i]].PPTier == 0 ? 1 : Team.Battle.Settings.PPMultiplier); } } if (!Moves.Contains(ChoiceLockedMove)) { ChoiceLockedMove = PBEMove.None; } Status2 |= PBEStatus2.Transformed; }
private void CheckForLearnMoves() { if (_learningMoves.Count != 0) { int index = _pkmn.Moveset.GetFirstEmptySlot(); if (index == -1) { SetWantsToLearnMove(); } else { Moveset.MovesetSlot slot = _pkmn.Moveset[index]; PBEMove move = _learningMoves.Dequeue(); // Remove from queue string moveStr = PBELocalizedString.GetMoveName(move).English; slot.Move = move; PBEMoveData mData = PBEMoveData.Data[move]; slot.PP = PBEDataUtils.CalcMaxPP(mData.PPTier, 0, PkmnConstants.PBESettings); slot.PPUps = 0; CreateMessage(string.Format("{0} learned {1}!", _pkmn.Nickname, moveStr)); _state = State.LearnMove_ForgotMsg; } } else { SetFadeOut(); } }
private void CheckPartyHasMoveCommand() { PBEMove move = ReadVarOrEnum <PBEMove>(); Overworld.GetNonEggPartyMonWithMove(move, out _, out int index); Game.Instance.Save.Vars[Var.SpecialVar_Result] = (short)index; }
internal PBETransformPacket(ReadOnlyCollection <byte> buffer, BinaryReader r, PBEBattle battle) { Buffer = buffer; User = (PBEFieldPosition)r.ReadByte(); UserTeam = battle.Teams[r.ReadByte()]; Target = (PBEFieldPosition)r.ReadByte(); TargetTeam = battle.Teams[r.ReadByte()]; TargetAttack = r.ReadUInt16(); TargetDefense = r.ReadUInt16(); TargetSpAttack = r.ReadUInt16(); TargetSpDefense = r.ReadUInt16(); TargetSpeed = r.ReadUInt16(); TargetAttackChange = r.ReadSByte(); TargetDefenseChange = r.ReadSByte(); TargetSpAttackChange = r.ReadSByte(); TargetSpDefenseChange = r.ReadSByte(); TargetSpeedChange = r.ReadSByte(); TargetAccuracyChange = r.ReadSByte(); TargetEvasionChange = r.ReadSByte(); TargetAbility = (PBEAbility)r.ReadByte(); TargetSpecies = (PBESpecies)r.ReadUInt16(); TargetType1 = (PBEType)r.ReadByte(); TargetType2 = (PBEType)r.ReadByte(); TargetWeight = r.ReadDouble(); var moves = new PBEMove[battle.Settings.NumMoves]; for (int i = 0; i < moves.Length; i++) { moves[i] = (PBEMove)r.ReadUInt16(); } TargetMoves = new ReadOnlyCollection <PBEMove>(moves); }
public PBETurnAction(byte pokemonId, PBEMove fightMove, PBETurnTarget fightTargets) { PokemonId = pokemonId; Decision = PBETurnDecision.Fight; FightMove = fightMove; FightTargets = fightTargets; }
// This constructor is to define a remote Pokémon public PBEPokemon(PBETeam team, PBEPkmnSwitchInPacket.PBESwitchInInfo info) { Team = team; Id = info.PokemonId; FieldPosition = info.FieldPosition; HP = info.HP; MaxHP = info.MaxHP; HPPercentage = info.HPPercentage; Status1 = info.Status1; Level = info.Level; KnownAbility = Ability = OriginalAbility = PBEAbility.MAX; KnownGender = Gender = info.Gender; KnownItem = Item = (PBEItem)ushort.MaxValue; Moves = new PBEMove[Team.Battle.Settings.NumMoves]; KnownMoves = new PBEMove[Team.Battle.Settings.NumMoves]; for (int i = 0; i < Team.Battle.Settings.NumMoves; i++) { KnownMoves[i] = Moves[i] = PBEMove.MAX; } PP = new byte[Team.Battle.Settings.NumMoves]; MaxPP = new byte[Team.Battle.Settings.NumMoves]; KnownNickname = Nickname = info.Nickname; KnownShiny = Shiny = info.Shiny; KnownSpecies = Species = OriginalSpecies = info.Species; var pData = PBEPokemonData.GetData(KnownSpecies); KnownType1 = Type1 = pData.Type1; KnownType2 = Type2 = pData.Type2; KnownWeight = Weight = pData.Weight; Team.Party.Add(this); }
public static PBELocalizedString GetMoveName(PBEMove move) { if (move >= PBEMove.MAX) { throw new ArgumentOutOfRangeException(nameof(move)); } return(new PBELocalizedString(PBEUtils.QueryDatabase <SearchResult>(string.Format(QueryId, "MoveNames", (ushort)move))[0])); }
private void SetGiveUpLearningMove() { PBEMove move = _learningMoves.Peek(); string str = PBELocalizedString.GetMoveName(move).English; CreateMessage(string.Format("Give up on learning {0}?", str)); _state = State.LearnMove_GiveUpLearningMsg; }
private void SetWantsToLearnMove() { PBEMove move = _learningMoves.Peek(); string str = PBELocalizedString.GetMoveName(move).English; CreateMessage(string.Format("{0} wants to learn {1},\nbut {0} already knows {2} moves.\fForget a move and learn {1}?", _pkmn.Nickname, str, PkmnConstants.NumMoves)); _state = State.LearnMove_WantsToLearnMoveMsg; }
public static PBELocalizedString GetMoveDescription(PBEMove move) { if (move >= PBEMove.MAX || !Enum.IsDefined(typeof(PBEMove), move)) { throw new ArgumentOutOfRangeException(nameof(move)); } return(new PBELocalizedString(PBEUtils.QueryDatabase <SearchResult>(string.Format(queryId, "MoveDescriptions", (ushort)move))[0])); }
private ushort CalculateDamage(PBEPokemon user, PBEPokemon target, PBEMove move, PBEType moveType, PBEMoveCategory moveCategory, double basePower, bool criticalHit) { ushort damage; double a = 0, d = 0; bool unawareA = user != target && target.Ability == PBEAbility.Unaware && !user.HasCancellingAbility(); bool unawareD = user != target && user.Ability == PBEAbility.Unaware && !target.HasCancellingAbility(); // Verified: A target with Mold Breaker will accept more damage from a user with Unaware switch (move) { case PBEMove.FoulPlay: { double aMod = unawareA ? 1 : GetStatChangeModifier(criticalHit ? Math.Max((sbyte)0, target.AttackChange) : target.AttackChange, false); a = CalculateAttack(user, target, moveType, target.Attack * aMod); double dMod = unawareD ? 1 : GetStatChangeModifier(criticalHit ? Math.Min((sbyte)0, target.DefenseChange) : target.DefenseChange, false); d = CalculateDefense(user, target, target.Defense * dMod); break; } case PBEMove.Psyshock: case PBEMove.Psystrike: case PBEMove.SecretSword: { double aMod = unawareA ? 1 : GetStatChangeModifier(criticalHit ? Math.Max((sbyte)0, user.SpAttackChange) : user.SpAttackChange, false); a = CalculateSpAttack(user, target, moveType, user.SpAttack * aMod); double dMod = unawareD ? 1 : GetStatChangeModifier(criticalHit ? Math.Min((sbyte)0, target.DefenseChange) : target.DefenseChange, false); d = CalculateDefense(user, target, target.Defense * dMod); break; } default: { if (moveCategory == PBEMoveCategory.Physical) { double aMod = unawareA ? 1 : GetStatChangeModifier(criticalHit ? Math.Max((sbyte)0, user.AttackChange) : user.AttackChange, false); a = CalculateAttack(user, target, moveType, user.Attack * aMod); double dMod = unawareD ? 1 : GetStatChangeModifier(criticalHit ? Math.Min((sbyte)0, target.DefenseChange) : target.DefenseChange, false); d = CalculateDefense(user, target, target.Defense * dMod); } else if (moveCategory == PBEMoveCategory.Special) { double aMod = unawareA ? 1 : GetStatChangeModifier(criticalHit ? Math.Max((sbyte)0, user.SpAttackChange) : user.SpAttackChange, false); a = CalculateSpAttack(user, target, moveType, user.SpAttack * aMod); double dMod = unawareD ? 1 : GetStatChangeModifier(criticalHit ? Math.Min((sbyte)0, target.SpDefenseChange) : target.SpDefenseChange, false); d = CalculateSpDefense(user, target, target.SpDefense * dMod); } break; } } damage = (ushort)((2 * user.Level / 5) + 2); damage = (ushort)(damage * a * basePower / d); damage /= 50; damage += 2; return((ushort)(damage * (100 - PBEUtils.RandomInt(0, 15)) / 100)); }
public void PushMove(PBEMove move, PBETurnTarget targets) { PBEBattlePokemon pkmn = _pkmn[_index]; var a = new PBETurnAction(pkmn, move, targets); pkmn.TurnAction = a; _actions[_index] = a; _standBy[_index] = null; _index++; ActionsLoop(); }
// Wild Pokémon always select a random usable move (unless they are forced to use a move) // They will flee randomly based on their PBEPokemonData.FleeRate only if it's a single battle and they are allowed to flee public static void CreateWildAIActions(this PBETrainer trainer) { if (trainer is null) { throw new ArgumentNullException(nameof(trainer)); } if (trainer.Battle.BattleState != PBEBattleState.WaitingForActions) { throw new InvalidOperationException($"{nameof(trainer.Battle.BattleState)} must be {PBEBattleState.WaitingForActions} to create actions."); } // Try to flee if it's a single wild battle and the Pokémon is a runner if (trainer.IsWild && trainer.Battle.BattleFormat == PBEBattleFormat.Single && trainer.IsFleeValid() is null) { PBEBattlePokemon user = trainer.ActionsRequired[0]; IPBEPokemonData pData = PBEDataProvider.Instance.GetPokemonData(user); if (PBEDataProvider.GlobalRandom.RandomBool(pData.FleeRate, 255)) { string valid = trainer.SelectFleeIfValid(); if (valid != null) { throw new Exception("Wild AI tried to flee but couldn't. - " + valid); } return; } } var actions = new PBETurnAction[trainer.ActionsRequired.Count]; for (int i = 0; i < actions.Length; i++) { PBEBattlePokemon user = trainer.ActionsRequired[i]; // If a Pokémon is forced to struggle, it must use Struggle if (user.IsForcedToStruggle()) { actions[i] = new PBETurnAction(user, PBEMove.Struggle, PBEBattleUtils.GetPossibleTargets(user, user.GetMoveTargets(PBEMove.Struggle))[0]); continue; } // If a Pokémon has a temp locked move (Dig, Dive, ShadowForce) it must be used if (user.TempLockedMove != PBEMove.None) { actions[i] = new PBETurnAction(user, user.TempLockedMove, user.TempLockedTargets); continue; } // The Pokémon is free to fight PBEMove[] usableMoves = user.GetUsableMoves(); PBEMove move = PBEDataProvider.GlobalRandom.RandomElement(usableMoves); actions[i] = new PBETurnAction(user, move, PBEBattle.GetRandomTargetForMetronome(user, move, PBEDataProvider.GlobalRandom)); } string valid2 = trainer.SelectActionsIfValid(actions); if (valid2 != null) { throw new Exception("Wild AI created bad actions. - " + valid2); } }
public PBEMoveUsedPacket(PBEPokemon moveUser, PBEMove move) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move))); bytes.Add((byte)((OwnsMove = moveUser.Moves.Contains(Move)) ? 1 : 0)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
public int IndexOf(PBEMove move) { for (int i = 0; i < PkmnConstants.NumMoves; i++) { if (_slots[i].Move == move) { return(i); } } return(-1); }
public PBEMoveLockPacket(PBEPokemon moveUser, PBEMove lockedMove, PBETarget lockedTargets, PBEMoveLockType moveLockType) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(LockedMove = lockedMove))); bytes.Add((byte)(LockedTargets = lockedTargets)); bytes.Add((byte)(MoveLockType = moveLockType)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
internal PBEMoveUsedPacket(PBEPokemon moveUser, PBEMove move, bool reveal) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move))); bytes.Add((byte)((Reveal = reveal) ? 1 : 0)); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
internal PBEMovePPChangedPacket(PBEFieldPosition moveUser, PBETeam moveUserTeam, PBEMove move, int amountReduced) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser)); bytes.Add((MoveUserTeam = moveUserTeam).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move))); bytes.AddRange(BitConverter.GetBytes(AmountReduced = amountReduced)); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
//[InlineData(PBEMove.SkyDrop, PBEStatus2.Airborne)] public void HelpingHand_HitsSemiInvulnerable(PBEMove move, PBEStatus2 status2) { #region Setup PBEDataProvider.GlobalRandom.Seed = 0; PBESettings settings = PBESettings.DefaultSettings; var p0 = new TestPokemonCollection(2); p0[0] = new TestPokemon(settings, PBESpecies.Minun, 0, 100, PBEMove.HelpingHand, PBEMove.Splash); p0[1] = new TestPokemon(settings, PBESpecies.Giratina, 0, 1, move); var p1 = new TestPokemonCollection(1); p1[0] = new TestPokemon(settings, PBESpecies.Magikarp, 0, 100, PBEMove.Splash); var battle = PBEBattle.CreateTrainerBattle(PBEBattleFormat.Double, settings, new PBETrainerInfo(p0, "Trainer 0", false), new PBETrainerInfo(p1, "Trainer 1", false)); battle.OnNewEvent += PBEBattle.ConsoleBattleEventHandler; PBETrainer t0 = battle.Trainers[0]; PBETrainer t1 = battle.Trainers[1]; PBEBattlePokemon minun = t0.Party[0]; PBEBattlePokemon giratina = t0.Party[1]; PBEBattlePokemon magikarp = t1.Party[0]; battle.Begin(); #endregion #region Use Shadow Force Assert.True(t0.SelectActionsIfValid(out _, new PBETurnAction(minun, PBEMove.Splash, PBETurnTarget.AllyLeft), new PBETurnAction(giratina, move, PBETurnTarget.FoeLeft))); Assert.True(t1.SelectActionsIfValid(out _, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyLeft))); battle.RunTurn(); Assert.True(giratina.Status2.HasFlag(status2)); #endregion #region Use Helping Hand and check Assert.True(t0.SelectActionsIfValid(out _, new PBETurnAction(minun, PBEMove.HelpingHand, PBETurnTarget.AllyRight), new PBETurnAction(giratina, move, PBETurnTarget.FoeLeft))); Assert.True(t1.SelectActionsIfValid(out _, new PBETurnAction(magikarp, PBEMove.Splash, PBETurnTarget.AllyLeft))); battle.RunTurn(); Assert.True(battle.VerifyStatus2Happened(giratina, minun, PBEStatus2.HelpingHand, PBEStatusAction.Added)); #endregion #region Cleanup battle.OnNewEvent -= PBEBattle.ConsoleBattleEventHandler; #endregion }
public PBEMovePPChangedPacket(PBEFieldPosition moveUser, PBETeam moveUserTeam, PBEMove move, byte oldValue, byte newValue) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser)); bytes.Add((MoveUserTeam = moveUserTeam).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move))); bytes.Add(OldValue = oldValue); bytes.Add(NewValue = newValue); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
internal PBEMovePPChangedPacket(PBEPokemon moveUser, PBEMove move, int amountReduced) { using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16)) { w.Write(Code); w.Write(MoveUser = moveUser.FieldPosition); w.Write((MoveUserTeam = moveUser.Team).Id); w.Write(Move = move); w.Write(AmountReduced = amountReduced); Data = new ReadOnlyCollection <byte>(ms.ToArray()); } }
internal PBEMoveUsedPacket(PBEBattlePokemon moveUser, PBEMove move, bool owned) { using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16)) { w.Write(Code); w.Write((MoveUserTrainer = moveUser.Trainer).Id); w.Write(MoveUser = moveUser.FieldPosition); w.Write(Move = move); w.Write(Owned = owned); Data = new ReadOnlyCollection <byte>(ms.ToArray()); } }
internal PBEMoveLockPacket(PBEPokemon moveUser, PBEMove lockedMove, PBETurnTarget lockedTargets, PBEMoveLockType moveLockType) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(LockedMove = lockedMove))); bytes.Add((byte)(LockedTargets = lockedTargets)); bytes.Add((byte)(MoveLockType = moveLockType)); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
internal PBEReadOnlyMoveset(JArray jArray) { int count = jArray.Count; _list = new PBEReadOnlyMovesetSlot[count]; for (int i = 0; i < count; i++) { JToken jToken = jArray[i]; PBEMove move = PBELocalizedString.GetMoveByName(jToken[nameof(IPBEMovesetSlot.Move)].Value <string>()).Value; byte ppUps = jToken[nameof(IPBEMovesetSlot.PPUps)].Value <byte>(); _list[i] = new PBEReadOnlyMovesetSlot(move, ppUps); } }