예제 #1
0
 public void OnPacket(GamePacketReader packet)
 {
     StocMessage id = packet.ReadStoc();
     if (id == StocMessage.GameMsg)
     {
         GameMessage msg = (GameMessage) packet.ReadByte();
         if (_messages.ContainsKey(msg))
             _messages[msg](packet);
         return;
     }
     if (_packets.ContainsKey(id))
         _packets[id](packet);
 }
예제 #2
0
 private void OnNewTurn(GamePacketReader packet)
 {
     _duel.Turn++;
     _duel.Player = GetLocalPlayer(packet.ReadByte());
     _ai.OnNewTurn();
 }
예제 #3
0
 private void OnAnnounceRace(GamePacketReader packet)
 {
     IList<CardRace> races = new List<CardRace>();
     packet.ReadByte(); // player
     int count = packet.ReadByte();
     int available = packet.ReadInt32();
     int filter = 0x1;
     for (int i = 0; i < 23; ++i)
     {
         if ((available & filter) != 0)
             races.Add((CardRace)filter);
         filter <<= 1;
     }
     races = _ai.OnAnnounceRace(count, races);
     int reply = 0;
     for (int i = 0; i < count; ++i)
         reply += (int)races[i];
     Connection.Send(CtosMessage.Response, reply);
 }
예제 #4
0
 private void OnAnnounceCard(GamePacketReader packet)
 {
     Connection.Send(CtosMessage.Response, _ai.OnAnnounceCard());
 }
예제 #5
0
 private void OnSelectTribute(GamePacketReader packet)
 {
     InternalOnSelectCard(packet, _ai.OnSelectTribute);
 }
예제 #6
0
 private void OnSelectPosition(GamePacketReader packet)
 {
     packet.ReadByte(); // player
     int cardId = packet.ReadInt32();
     int pos = packet.ReadByte();
     if (pos == 0x1 || pos == 0x2 || pos == 0x4 || pos == 0x8)
     {
         Connection.Send(CtosMessage.Response, pos);
         return;
     }
     IList<CardPosition> positions = new List<CardPosition>();
     if ((pos & (int)CardPosition.FaceUpAttack) != 0)
         positions.Add(CardPosition.FaceUpAttack);
     if ((pos & (int)CardPosition.FaceDownAttack) != 0)
         positions.Add(CardPosition.FaceDownAttack);
     if ((pos & (int)CardPosition.FaceUpDefence) != 0)
         positions.Add(CardPosition.FaceUpDefence);
     if ((pos & (int)CardPosition.FaceDownDefence) != 0)
         positions.Add(CardPosition.FaceDownDefence);
     Connection.Send(CtosMessage.Response, (int)_ai.OnSelectPosition(cardId, positions));
 }
예제 #7
0
 private void OnSelectOption(GamePacketReader packet)
 {
     IList<int> options = new List<int>();
     packet.ReadByte(); // player
     int count = packet.ReadByte();
     for (int i = 0; i < count; ++i)
         options.Add(packet.ReadInt32());
     Connection.Send(CtosMessage.Response, _ai.OnSelectOption(options));
 }
예제 #8
0
        private void OnSelectEffectYn(GamePacketReader packet)
        {
            packet.ReadByte(); // player

            int cardId = packet.ReadInt32();
            int player = GetLocalPlayer(packet.ReadByte());
            CardLocation loc = (CardLocation)packet.ReadByte();
            int seq = packet.ReadByte();
            packet.ReadByte();

            ClientCard card = _duel.GetCard(player, loc, seq);
            if (card == null)
            {
                Connection.Send(CtosMessage.Response, 0);
                return;
            }

            if (card.Id == 0) card.SetId(cardId);

            int reply = _ai.OnSelectEffectYn(card) ? (1) : (0);
            Connection.Send(CtosMessage.Response, reply);
        }
예제 #9
0
 private void OnChainEnd(GamePacketReader packet)
 {
     _ai.OnChainEnd();
 }
예제 #10
0
 private void OnChaining(GamePacketReader packet)
 {
     packet.ReadInt32(); // card id
     int pcc = GetLocalPlayer(packet.ReadByte());
     int pcl = packet.ReadByte();
     int pcs = packet.ReadSByte();
     int subs = packet.ReadSByte();
     ClientCard card = _duel.GetCard(pcc, pcl, pcs, subs);
     int cc = GetLocalPlayer(packet.ReadByte());
     _ai.OnChaining(card, cc);
 }
예제 #11
0
 private void OnPosChange(GamePacketReader packet)
 {
     packet.ReadInt32(); // card id
     int pc = GetLocalPlayer(packet.ReadByte());
     int pl = packet.ReadByte();
     int ps = packet.ReadSByte();
     packet.ReadSByte(); // pp
     int cp = packet.ReadSByte();
     ClientCard card = _duel.GetCard(pc, (CardLocation)pl, ps);
     if (card != null)
         card.Position = cp;
 }
예제 #12
0
        private void OnMove(GamePacketReader packet)
        {
            int cardId = packet.ReadInt32();
            int pc = GetLocalPlayer(packet.ReadByte());
            int pl = packet.ReadByte();
            int ps = packet.ReadSByte();
            packet.ReadSByte(); // pp
            int cc = GetLocalPlayer(packet.ReadByte());
            int cl = packet.ReadByte();
            int cs = packet.ReadSByte();
            int cp = packet.ReadSByte();
            packet.ReadInt32(); // reason

            ClientCard card = _duel.GetCard(pc, (CardLocation)pl, ps);

            if ((pl & (int)CardLocation.Overlay) != 0)
            {
                pl = pl & 0x7f;
                card = _duel.GetCard(pc, (CardLocation)pl, ps);
                if (card != null)
                    card.Overlays.Remove(cardId);
            }
            else
                _duel.RemoveCard((CardLocation)pl, card, pc, ps);

            if ((cl & (int)CardLocation.Overlay) != 0)
            {
                cl = cl & 0x7f;
                card = _duel.GetCard(cc, (CardLocation)cl, cs);
                if (card != null)
                    card.Overlays.Add(cardId);
            }
            else
            {
                _duel.AddCard((CardLocation)cl, cardId, cc, cs, cp);
                if ((pl & (int)CardLocation.Overlay) == 0 && card != null)
                {
                    ClientCard newcard = _duel.GetCard(cc, (CardLocation)cl, cs);
                    if (newcard != null)
                        newcard.Overlays.AddRange(card.Overlays);
                }
            }
        }
예제 #13
0
 private void OnLpUpdate(GamePacketReader packet)
 {
     int player = GetLocalPlayer(packet.ReadByte());
     _duel.LifePoints[player] = packet.ReadInt32();
 }
예제 #14
0
 private void OnDamage(GamePacketReader packet)
 {
     int player = GetLocalPlayer(packet.ReadByte());
     int final = _duel.LifePoints[player] - packet.ReadInt32();
     if (final < 0) final = 0;
     _duel.LifePoints[player] = final;
 }
예제 #15
0
 private void OnNewPhase(GamePacketReader packet)
 {
     _duel.Phase = (DuelPhase)packet.ReadInt16();
     _ai.OnNewPhase();
 }
예제 #16
0
        private void OnSelectCounter(GamePacketReader packet)
        {
            packet.ReadByte(); // player
            int type = packet.ReadInt16();
            int quantity = packet.ReadByte();

            IList<ClientCard> cards = new List<ClientCard>();
            IList<int> counters = new List<int>();
            int count = packet.ReadByte();
            for (int i = 0; i < count; ++i)
            {
                packet.ReadInt32(); // card id
                int player = GetLocalPlayer(packet.ReadByte());
                CardLocation loc = (CardLocation) packet.ReadByte();
                int seq = packet.ReadByte();
                int num = packet.ReadByte();
                cards.Add(_duel.GetCard(player, loc, seq));
                counters.Add(num);
            }

            IList<int> used = _ai.OnSelectCounter(type, quantity, cards, counters);
            byte[] result = new byte[used.Count];
            for (int i = 0; i < quantity; ++i)
                result[i] = (byte) used[i];
            GamePacketWriter reply = new GamePacketWriter(CtosMessage.Response);
            reply.Write(result);
            Connection.Send(reply);
        }
예제 #17
0
 private void OnSelectDisfield(GamePacketReader packet)
 {
     OnSelectPlace(packet);
 }
예제 #18
0
 private void OnChainSorting(GamePacketReader packet)
 {
     GamePacketWriter writer = new GamePacketWriter(CtosMessage.Response);
     Connection.Send(CtosMessage.Response, -1);
 }
예제 #19
0
        private void OnSelectIdleCmd(GamePacketReader packet)
        {
            packet.ReadByte(); // player

            _duel.MainPhase = new MainPhase();
            MainPhase main = _duel.MainPhase;
            int count;
            for (int k = 0; k < 5; k++)
            {
                count = packet.ReadByte();
                for (int i = 0; i < count; ++i)
                {
                    packet.ReadInt32(); // card id
                    int con = GetLocalPlayer(packet.ReadByte());
                    CardLocation loc = (CardLocation)packet.ReadByte();
                    int seq = packet.ReadByte();
                    ClientCard card = _duel.GetCard(con, loc, seq);
                    if (card == null) continue;
                    card.ActionIndex[k] = i;
                    switch (k)
                    {
                        case 0:
                            main.SummonableCards.Add(card);
                            break;
                        case 1:
                            main.SpecialSummonableCards.Add(card);
                            break;
                        case 2:
                            main.ReposableCards.Add(card);
                            break;
                        case 3:
                            main.MonsterSetableCards.Add(card);
                            break;
                        case 4:
                            main.SpellSetableCards.Add(card);
                            break;
                    }
                }
            }
            count = packet.ReadByte();
            for (int i = 0; i < count; ++i)
            {
                packet.ReadInt32(); // card id
                int con = GetLocalPlayer(packet.ReadByte());
                CardLocation loc = (CardLocation)packet.ReadByte();
                int seq = packet.ReadByte();
                int desc = packet.ReadInt32();

                ClientCard card = _duel.GetCard(con, loc, seq);
                if (card == null) continue;
                card.ActionIndex[5] = i;
                if (card.ActionActivateIndex.ContainsKey(desc))
                    card.ActionActivateIndex.Remove(desc);
                card.ActionActivateIndex.Add(desc, i);
                main.ActivableCards.Add(card);
                main.ActivableDescs.Add(desc);
            }

            main.CanBattlePhase = packet.ReadByte() != 0;
            main.CanEndPhase = packet.ReadByte() != 0;
            packet.ReadByte(); // CanShuffle

            Connection.Send(CtosMessage.Response, _ai.OnSelectIdleCmd(main).ToValue());
        }
예제 #20
0
        private void OnUpdateCard(GamePacketReader packet)
        {
            int player = GetLocalPlayer(packet.ReadByte());
            int loc = packet.ReadByte();
            int seq = packet.ReadByte();

            packet.ReadInt32(); // ???

            ClientCard card = _duel.GetCard(player, (CardLocation)loc, seq);
            if (card == null) return;

            card.Update(packet,_duel);
        }
예제 #21
0
        private void OnSelectPlace(GamePacketReader packet)
        {
            packet.ReadByte(); // player
            packet.ReadByte(); // min
            int field = ~packet.ReadInt32();

            byte[] resp = new byte[3];

            bool pendulumZone = false;

            int filter;
            if ((field & 0x1f) != 0)
            {
                resp[0] = (byte)GetLocalPlayer(0);
                resp[1] = 0x4;
                filter = field & 0x1f;
            }
            else if ((field & 0x1f00) != 0)
            {
                resp[0] = (byte)GetLocalPlayer(0);
                resp[1] = 0x8;
                filter = (field >> 8) & 0x1f;
            }
            else if ((field & 0xc000) != 0)
            {
                resp[0] = (byte)GetLocalPlayer(0);
                resp[1] = 0x8;
                filter = (field >> 14) & 0x3;
                pendulumZone = true;
            }
            else if ((field & 0x1f0000) != 0)
            {
                resp[0] = (byte)GetLocalPlayer(1);
                resp[1] = 0x4;
                filter = (field >> 16) & 0x1f;
            }
            else if ((field & 0x1f000000) != 0)
            {
                resp[0] = (byte) GetLocalPlayer(1);
                resp[1] = 0x8;
                filter = (field >> 24) & 0x1f;
            }
            else
            {
                resp[0] = (byte) GetLocalPlayer(1);
                resp[1] = 0x8;
                filter = (field >> 30) & 0x3;
                pendulumZone = true;
            }

            if (!pendulumZone)
            {
                if ((filter & 0x4) != 0) resp[2] = 2;
                else if ((filter & 0x2) != 0) resp[2] = 1;
                else if ((filter & 0x8) != 0) resp[2] = 3;
                else if ((filter & 0x1) != 0) resp[2] = 0;
                else if ((filter & 0x10) != 0) resp[2] = 4;
            }
            else
            {
                if ((filter & 0x1) != 0) resp[2] = 6;
                if ((filter & 0x2) != 0) resp[2] = 7;
            }

            GamePacketWriter reply = new GamePacketWriter(CtosMessage.Response);
            reply.Write(resp);
            Connection.Send(reply);
        }
예제 #22
0
        private void OnUpdateData(GamePacketReader packet)
        {
            int player = GetLocalPlayer(packet.ReadByte());
            CardLocation loc = (CardLocation)packet.ReadByte();

            IList<ClientCard> cards = null;
            switch (loc)
            {
                case CardLocation.Hand:
                    cards = _duel.Fields[player].Hand;
                    break;
                case CardLocation.MonsterZone:
                    cards = _duel.Fields[player].MonsterZone;
                    break;
                case CardLocation.SpellZone:
                    cards = _duel.Fields[player].SpellZone;
                    break;
                case CardLocation.Grave:
                    cards = _duel.Fields[player].Graveyard;
                    break;
                case CardLocation.Removed:
                    cards = _duel.Fields[player].Banished;
                    break;
                case CardLocation.Deck:
                    cards = _duel.Fields[player].Deck;
                    break;
                case CardLocation.Extra:
                    cards = _duel.Fields[player].ExtraDeck;
                    break;
            }
            if (cards != null)
            {
                foreach (ClientCard card in cards)
                {
                    int len = packet.ReadInt32();
                    if (len == 4) continue;
                    long pos = packet.Position;
                    card.Update(packet, _duel);
                    packet.Position = pos + len - 4;
                }
            }
        }
예제 #23
0
        private void OnSelectSum(GamePacketReader packet)
        {
            packet.ReadByte(); // mode
            packet.ReadByte(); // player
            int sumval = packet.ReadInt32();
            int min = packet.ReadByte();
            int max = packet.ReadByte();

            // TODO mandatory cards
            int count = packet.ReadByte();
            packet.ReadBytes(count * 11);

            IList<ClientCard> cards = new List<ClientCard>();
            count = packet.ReadByte();
            for (int i = 0; i < count; ++i)
            {
                int cardId = packet.ReadInt32();
                int player = GetLocalPlayer(packet.ReadByte());
                CardLocation loc = (CardLocation)packet.ReadByte();
                int seq = packet.ReadByte();
                ClientCard card = _duel.GetCard(player, loc, seq);
                if (card != null)
                {
                    if (cardId != 0 && card.Id != cardId)
                        card.SetId(cardId);
                    cards.Add(card);
                }
                packet.ReadInt32();
            }

            IList<ClientCard> selected = _ai.OnSelectSum(cards, sumval, min, max);

            byte[] result = new byte[selected.Count + 1];
            result[0] = (byte)selected.Count;
            for (int i = 0; i < selected.Count; ++i)
            {
                int id = 0;
                for (int j = 0; j < count; ++j)
                {
                    if (cards[j] == null) continue;
                    if (cards[j].Equals(selected[i]))
                    {
                        id = j;
                        break;
                    }
                }
                result[i + 1] = (byte)id;
            }

            GamePacketWriter reply = new GamePacketWriter(CtosMessage.Response);
            reply.Write(result);
            Connection.Send(reply);
        }
예제 #24
0
        private void OnSelectBattleCmd(GamePacketReader packet)
        {
            packet.ReadByte(); // player
            _duel.BattlePhase = new BattlePhase();
            BattlePhase battle = _duel.BattlePhase;

            int count = packet.ReadByte();
            for (int i = 0; i < count; ++i)
            {
                packet.ReadInt32(); // card id
                int con = GetLocalPlayer(packet.ReadByte());
                CardLocation loc = (CardLocation)packet.ReadByte();
                int seq = packet.ReadByte();
                int desc = packet.ReadInt32();

                ClientCard card = _duel.GetCard(con, loc, seq);
                if (card != null)
                {
                    card.ActionIndex[0] = i;
                    battle.ActivableCards.Add(card);
                    battle.ActivableDescs.Add(desc);
                }
            }

            count = packet.ReadByte();
            for (int i = 0; i < count; ++i)
            {
                packet.ReadInt32(); // card id
                int con = GetLocalPlayer(packet.ReadByte());
                CardLocation loc = (CardLocation)packet.ReadByte();
                int seq = packet.ReadByte();
                packet.ReadByte(); // diratt

                ClientCard card = _duel.GetCard(con, loc, seq);
                if (card != null)
                {
                    card.ActionIndex[1] = i;
                    battle.AttackableCards.Add(_duel.GetCard(con, loc, seq));
                }
            }

            battle.CanMainPhaseTwo = packet.ReadByte() != 0;
            battle.CanEndPhase = packet.ReadByte() != 0;

            Connection.Send(CtosMessage.Response, _ai.OnSelectBattleCmd(battle).ToValue());
        }
예제 #25
0
 private void OnSelectYesNo(GamePacketReader packet)
 {
     packet.ReadByte(); // player
     int reply = _ai.OnSelectYesNo(packet.ReadInt32()) ? (1) : (0);
     Connection.Send(CtosMessage.Response, reply);
 }
예제 #26
0
        private void InternalOnSelectCard(GamePacketReader packet, Func<IList<ClientCard>, int, int, bool, IList<ClientCard>> func)
        {
            packet.ReadByte(); // player
            bool cancelable = packet.ReadByte() != 0;
            int min = packet.ReadByte();
            int max = packet.ReadByte();

            IList<ClientCard> cards = new List<ClientCard>();
            int count = packet.ReadByte();
            for (int i = 0; i < count; ++i)
            {
                int id = packet.ReadInt32();
                int player = GetLocalPlayer(packet.ReadByte());
                CardLocation loc = (CardLocation)packet.ReadByte();
                int seq = packet.ReadByte();
                packet.ReadByte(); // pos
                ClientCard card;
                if (((int)loc & (int)CardLocation.Overlay) != 0)
                    card = new ClientCard(id, CardLocation.Overlay);
                else
                    card = _duel.GetCard(player, loc, seq);
                if (card == null) continue;
                if (card.Id == 0)
                    card.SetId(id);
                cards.Add(card);
            }

            IList<ClientCard> selected = func(cards, min, max, cancelable);

            if (selected.Count == 0 && cancelable)
            {
                Connection.Send(CtosMessage.Response, -1);
                return;
            }

            byte[] result = new byte[selected.Count + 1];
            result[0] = (byte)selected.Count;
            for (int i = 0; i < selected.Count; ++i)
            {
                int id = 0;
                for (int j = 0; j < count; ++j)
                {
                    if (cards[j] == null) continue;
                    if (cards[j].Equals(selected[i]))
                    {
                        id = j;
                        break;
                    }
                }
                result[i + 1] = (byte)id;
            }

            GamePacketWriter reply = new GamePacketWriter(CtosMessage.Response);
            reply.Write(result);
            Connection.Send(reply);
        }
예제 #27
0
 private void OnAnnounceNumber(GamePacketReader packet)
 {
     IList<int> numbers = new List<int>();
     packet.ReadByte(); // player
     int count = packet.ReadByte();
     for (int i = 0; i < count; ++i)
         numbers.Add(packet.ReadInt32());
     Connection.Send(CtosMessage.Response, _ai.OnAnnounceNumber(numbers));
 }
예제 #28
0
        private void OnSelectChain(GamePacketReader packet)
        {
            packet.ReadByte(); // player
            int count = packet.ReadByte();
            packet.ReadByte(); // specount
            bool forced = packet.ReadByte() != 0;
            packet.ReadInt32(); // hint1
            packet.ReadInt32(); // hint2

            IList<ClientCard> cards = new List<ClientCard>();
            IList<int> descs = new List<int>();

            for (int i = 0; i < count; ++i)
            {
                packet.ReadInt32(); // card id
                int con = GetLocalPlayer(packet.ReadByte());
                int loc = packet.ReadByte();
                int seq = packet.ReadByte();
                int sseq = 0; //packet.ReadByte();

                int desc = packet.ReadInt32();
                cards.Add(_duel.GetCard(con, loc, seq, sseq));
                descs.Add(desc);
            }

            if (cards.Count == 0)
            {
                Connection.Send(CtosMessage.Response, -1);
                return;
            }

            if (cards.Count == 1 && forced)
            {
                Connection.Send(CtosMessage.Response, 0);
                return;
            }

            Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forced));
        }
예제 #29
0
 public void Update(GamePacketReader packet, Duel duel)
 {
     int flag = packet.ReadInt32();
     if ((flag & (int)Query.Code) != 0)
         SetId(packet.ReadInt32());
     if ((flag & (int)Query.Position) != 0)
     {
         Controller = duel.GetLocalPlayer(packet.ReadByte());
         packet.ReadByte();
         packet.ReadByte();
         Position = packet.ReadByte();
     }
     if ((flag & (int)Query.Alias) != 0)
         Alias = packet.ReadInt32();
     if ((flag & (int)Query.Type) != 0)
         Type = packet.ReadInt32();
     if ((flag & (int)Query.Level) != 0)
         Level = packet.ReadInt32();
     if ((flag & (int)Query.Rank) != 0)
         Rank = packet.ReadInt32();
     if ((flag & (int)Query.Attribute) != 0)
         Attribute = packet.ReadInt32();
     if ((flag & (int)Query.Race) != 0)
         Race = packet.ReadInt32();
     if ((flag & (int)Query.Attack) != 0)
         Attack = packet.ReadInt32();
     if ((flag & (int)Query.Defence) != 0)
         Defense = packet.ReadInt32();
     if ((flag & (int)Query.BaseAttack) != 0)
         BaseAttack = packet.ReadInt32();
     if ((flag & (int)Query.BaseDefence) != 0)
         BaseDefense = packet.ReadInt32();
     if ((flag & (int)Query.Reason) != 0)
         packet.ReadInt32();
     if ((flag & (int)Query.ReasonCard) != 0)
         packet.ReadInt32(); // Int8 * 4
     if ((flag & (int)Query.EquipCard) != 0)
         packet.ReadInt32(); // Int8 * 4
     if ((flag & (int)Query.TargetCard) != 0)
     {
         int count = packet.ReadInt32();
         for (int i = 0; i < count; ++i)
             packet.ReadInt32(); // Int8 * 4
     }
     if ((flag & (int)Query.OverlayCard) != 0)
     {
         Overlays.Clear();
         int count = packet.ReadInt32();
         for (int i = 0; i < count; ++i)
             Overlays.Add(packet.ReadInt32());
     }
     if ((flag & (int)Query.Counters) != 0)
     {
         int count = packet.ReadInt32();
         for (int i = 0; i < count; ++i)
             packet.ReadInt32(); // Int16 * 2
     }
     if ((flag & (int)Query.Owner) != 0)
         Owner = duel.GetLocalPlayer(packet.ReadInt32());
     if ((flag & (int)Query.IsDisabled) != 0)
         packet.ReadInt32();
     if ((flag & (int)Query.IsPublic) != 0)
         packet.ReadInt32();
     if ((flag & (int)Query.LScale) != 0)
         packet.ReadInt32();
     if ((flag & (int)Query.RScale) != 0)
         packet.ReadInt32();
 }
예제 #30
0
 private void OnShuffleHand(GamePacketReader packet)
 {
     int player = GetLocalPlayer(packet.ReadByte());
     packet.ReadByte();
     foreach (ClientCard card in _duel.Fields[player].Hand)
         card.SetId(packet.ReadInt32());
 }