internal PBESpecialMessagePacket(PBESpecialMessage message, params object[] parameters)
        {
            using (var ms = new MemoryStream())
                using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16))
                {
                    w.Write(Code);
                    w.Write(Message = message);
                    var par = new List <object>();
                    switch (Message)
                    {
                    case PBESpecialMessage.DraggedOut:
                    case PBESpecialMessage.Endure:
                    case PBESpecialMessage.HPDrained:
                    case PBESpecialMessage.Recoil:
                    case PBESpecialMessage.Struggle:
                    {
                        var p0 = (PBEBattlePokemon)parameters[0];
                        par.Add(p0.Trainer);
                        par.Add(p0.FieldPosition);
                        w.Write(p0.Trainer.Id);
                        w.Write(p0.FieldPosition);
                        break;
                    }

                    case PBESpecialMessage.Magnitude:
                    case PBESpecialMessage.MultiHit:
                    {
                        byte p0 = (byte)parameters[0];
                        par.Add(p0);
                        w.Write(p0);
                        break;
                    }

                    case PBESpecialMessage.PainSplit:
                    {
                        var p0 = (PBEBattlePokemon)parameters[0];
                        var p1 = (PBEBattlePokemon)parameters[1];
                        par.Add(p0.Trainer);
                        par.Add(p0.FieldPosition);
                        par.Add(p1.Trainer);
                        par.Add(p1.FieldPosition);
                        w.Write(p1.Trainer.Id);
                        w.Write(p1.FieldPosition);
                        w.Write(p1.Trainer.Id);
                        w.Write(p1.FieldPosition);
                        break;
                    }
                    }
                    Params = new ReadOnlyCollection <object>(par);
                    Data   = new ReadOnlyCollection <byte>(ms.GetBuffer());
                }
        }
Ejemplo n.º 2
0
        internal PBESpecialMessagePacket(PBESpecialMessage message, params object[] parameters)
        {
            var bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(Code));
            bytes.Add((byte)(Message = message));
            var par = new List <object>();

            switch (Message)
            {
            case PBESpecialMessage.DraggedOut:
            case PBESpecialMessage.Endure:
            case PBESpecialMessage.HPDrained:
            case PBESpecialMessage.Recoil:
            case PBESpecialMessage.Struggle:
            {
                par.Add(((PBEPokemon)parameters[0]).FieldPosition);
                par.Add(((PBEPokemon)parameters[0]).Team);
                bytes.Add((byte)((PBEPokemon)parameters[0]).FieldPosition);
                bytes.Add(((PBEPokemon)parameters[0]).Team.Id);
                break;
            }

            case PBESpecialMessage.Magnitude:
            {
                par.Add(parameters[0]);
                bytes.Add((byte)parameters[0]);
                break;
            }

            case PBESpecialMessage.PainSplit:
            {
                par.Add(((PBEPokemon)parameters[0]).FieldPosition);
                par.Add(((PBEPokemon)parameters[0]).Team);
                par.Add(((PBEPokemon)parameters[1]).FieldPosition);
                par.Add(((PBEPokemon)parameters[1]).Team);
                bytes.Add((byte)((PBEPokemon)parameters[0]).FieldPosition);
                bytes.Add(((PBEPokemon)parameters[0]).Team.Id);
                bytes.Add((byte)((PBEPokemon)parameters[1]).FieldPosition);
                bytes.Add(((PBEPokemon)parameters[1]).Team.Id);
                break;
            }
            }
            Params = new ReadOnlyCollection <object>(par);
            bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count));
            Buffer = new ReadOnlyCollection <byte>(bytes);
        }
Ejemplo n.º 3
0
        public static bool VerifySpecialMessageHappened(this PBEBattle battle, PBESpecialMessage message, params object[] p)
        {
            foreach (IPBEPacket packet in battle.Events)
            {
                if (packet is PBESpecialMessagePacket smp &&
                    smp.Message == message &&
                    p.Length == smp.Params.Count)
                {
                    for (int i = 0; i < p.Length; i++)
                    {
                        if (!p[i].Equals(smp.Params[i]))
                        {
                            goto nope;
                        }
                    }
                    return(true);
                }
nope:
                ;
            }
            return(false);
        }