Esempio n. 1
0
        private void SendJoinGame(Player player)
        {
            BinaryWriter join = GamePacketFactory.Create(StocMessage.JoinGame);

            join.Write(Banlist == null ? 0U : Banlist.Hash);
            join.Write((byte)Region);
            join.Write((byte)Mode);
            join.Write((byte)MasterRule);
            join.Write(NoCheckDeck);
            join.Write(NoShuffleDeck);
            // C++ padding: 5 bytes + 3 bytes = 8 bytes
            for (int i = 0; i < 3; i++)
            {
                join.Write((byte)0);
            }
            join.Write(StartLp);
            join.Write((byte)StartHand);
            join.Write((byte)DrawCount);
            join.Write((short)Timer);
            player.Send(join);

            if (State != GameState.Lobby)
            {
                SendDuelingPlayers(player);
            }
        }
Esempio n. 2
0
        private void OnDraw(CoreMessage msg)
        {
            GamePacketWriter packet = GamePacketFactory.Create(msg.Message);
            int player = msg.Reader.ReadByte();
            int count  = msg.Reader.ReadByte();

            packet.Write((byte)player);
            packet.Write((byte)count);

            for (int i = 0; i < count; i++)
            {
                uint code = msg.Reader.ReadUInt32();
                if ((code & 0x80000000) != 0)
                {
                    packet.Write(code);
                }
                else
                {
                    packet.Write(0);
                }
            }

            SendToPlayer(msg, player);
            Game.SendToAllBut(packet, player);
        }
Esempio n. 3
0
        private void OnMove(CoreMessage msg)
        {
            byte[] raw = msg.Reader.ReadBytes(16);
            int    pc  = raw[4];
            int    pl  = raw[5];
            int    cc  = raw[8];
            int    cl  = raw[9];
            int    cs  = raw[10];
            int    cp  = raw[11];

            SendToPlayer(msg, cc);
            GamePacketWriter packet = GamePacketFactory.Create(msg.Message);

            packet.Write(raw);
            if (!Convert.ToBoolean((cl & ((int)CardLocation.Grave + (int)CardLocation.Overlay))) && Convert.ToBoolean((cl & ((int)CardLocation.Deck + (int)CardLocation.Hand))) ||
                Convert.ToBoolean((cp & (int)CardPosition.FaceDown)))
            {
                packet.SetPosition(2);
                packet.Write(0);
            }
            Game.SendToAllBut(packet, cc);

            if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc))
            {
                Game.RefreshSingle(cc, cl, cs);
            }
        }
Esempio n. 4
0
        private void InitNewSpectator(Player player)
        {
            BinaryWriter packet = GamePacketFactory.Create(GameMessage.Start);

            packet.Write((byte)0x10);
            packet.Write((byte)MasterRule);
            packet.Write(LifePoints[0]);
            packet.Write(LifePoints[1]);
            packet.Write((short)0); // deck
            packet.Write((short)0); // extra
            packet.Write((short)0); // deck
            packet.Write((short)0); // extra
            player.Send(packet);

            BinaryWriter turn = GamePacketFactory.Create(GameMessage.NewTurn);

            turn.Write((byte)0);
            player.Send(turn);
            if (CurrentPlayer == 1)
            {
                turn = GamePacketFactory.Create(GameMessage.NewTurn);
                turn.Write((byte)0);
                player.Send(turn);
            }

            BinaryWriter reload = GamePacketFactory.Create(GameMessage.ReloadField);

            byte[] fieldInfo = _duel.QueryFieldInfo();
            reload.Write(fieldInfo, 1, fieldInfo.Length - 1);
            player.Send(reload);

            RefreshAllObserver(player);
        }
Esempio n. 5
0
        public void MoveToObserver(Player player)
        {
            if (State != GameState.Lobby)
            {
                return;
            }
            if (player.Type == (int)PlayerType.Observer)
            {
                return;
            }
            if (IsReady[player.Type])
            {
                return;
            }

            int oldType = player.Type;

            Players[player.Type] = null;
            IsReady[player.Type] = false;
            Observers.Add(player);

            BinaryWriter change = GamePacketFactory.Create(StocMessage.HsPlayerChange);

            change.Write((byte)((player.Type << 4) + (int)PlayerChange.Observe));
            SendToAll(change);

            player.Type = (int)PlayerType.Observer;
            player.SendTypeChange();

            if (OnPlayerMove != null)
            {
                OnPlayerMove(this, new PlayerMoveEventArgs(player, oldType));
            }
        }
Esempio n. 6
0
        private void OnSelectCard(CoreMessage msg)
        {
            GamePacketWriter packet = GamePacketFactory.Create(msg.Message);

            int player = msg.Reader.ReadByte();

            packet.Write((byte)player);
            packet.Write(msg.Reader.ReadBytes(3));

            int count = msg.Reader.ReadByte();

            packet.Write((byte)count);

            for (int i = 0; i < count; i++)
            {
                int code = msg.Reader.ReadInt32();
                int pl   = msg.Reader.ReadByte();
                int loc  = msg.Reader.ReadByte();
                int seq  = msg.Reader.ReadByte();
                int pos  = msg.Reader.ReadByte();
                packet.Write(pl == player ? code : 0);
                packet.Write((byte)pl);
                packet.Write((byte)loc);
                packet.Write((byte)seq);
                packet.Write((byte)pos);
            }

            Game.WaitForResponse(player);
            Game.CurPlayers[player].Send(packet);
        }
Esempio n. 7
0
        public void StartDuel(Player player)
        {
            if (State != GameState.Lobby)
            {
                return;
            }
            if (!player.Equals(HostPlayer))
            {
                return;
            }
            for (int i = 0; i < Players.Length; i++)
            {
                if (!IsReady[i])
                {
                    return;
                }
                if (Players[i] == null)
                {
                    return;
                }
            }

            State = GameState.Hand;
            SendToAll(GamePacketFactory.Create(StocMessage.DuelStart));

            SendHand();

            if (OnGameStart != null)
            {
                OnGameStart(this, EventArgs.Empty);
            }
        }
Esempio n. 8
0
        public void SendTypeChange()
        {
            BinaryWriter packet = GamePacketFactory.Create(StocMessage.TypeChange);

            packet.Write((byte)((IsRecorder ? (int)PlayerType.Observer : Type) + (Game.HostPlayer.Equals(this) ? (int)PlayerType.Host : 0)));
            Send(packet);
        }
Esempio n. 9
0
        private void OnDraw(CoreMessage msg)
        {
            BinaryWriter packet = GamePacketFactory.Create(msg.Message);
            int          player = msg.Reader.ReadByte();
            int          count  = msg.Reader.ReadByte();

            packet.Write((byte)player);
            packet.Write((byte)count);

            for (int i = 0; i < count; i++)
            {
                uint code = msg.Reader.ReadUInt32();
                if ((code & 0x80000000) != 0)
                {
                    packet.Write(code);
                }
                else
                {
                    packet.Write(0);
                }
            }

            SendToTeam(msg, player);
            SendToOpponentTeam(packet, player);
            Game.SendToObservers(packet);
        }
Esempio n. 10
0
        public void Surrender(Player player, int reason, bool force = false)
        {
            if (State == GameState.End)
            {
                return;
            }
            if (!force && State != GameState.Duel)
            {
                return;
            }
            if (player.Type == (int)PlayerType.Observer)
            {
                return;
            }
            BinaryWriter win  = GamePacketFactory.Create(GameMessage.Win);
            int          team = player.Type;

            if (IsTag)
            {
                team = player.Type >= 2 ? 1 : 0;
            }
            else if (State == GameState.Hand)
            {
                team = 1 - team;
            }
            win.Write((byte)(1 - team));
            win.Write((byte)reason);
            SendToAll(win);

            MatchSaveResult(1 - team, reason);

            EndDuel(reason == 4);
        }
Esempio n. 11
0
        private void SendToCorrectDestination(int player, CardLocation location, byte[] result, Player observer)
        {
            BinaryWriter update;

            if (observer == null)
            {
                update = GamePacketFactory.Create(GameMessage.UpdateData);
                update.Write((byte)player);
                update.Write((byte)location);
                update.Write(result);
                SendToTeam(update, player);
            }

            update = GamePacketFactory.Create(GameMessage.UpdateData);
            update.Write((byte)player);
            update.Write((byte)location);
            WritePublicCards(update, result);

            if (observer == null)
            {
                SendToTeam(update, 1 - player);
                SendToObservers(update);
            }
            else
            {
                observer.Send(update);
            }
        }
Esempio n. 12
0
        public void RemovePlayer(Player player)
        {
            if (player.Equals(HostPlayer) && State == GameState.Lobby)
            {
                bool found = false;
                foreach (Player p in Players)
                {
                    if (p != null && !p.Equals(player))
                    {
                        HostPlayer = p;
                        found      = true;
                        break;
                    }
                }
                if (found)
                {
                    IsReady[HostPlayer.Type] = false;
                    HostPlayer.SendTypeChange();
                }
                else
                {
                    _server.Stop();
                    return;
                }
            }
            if (player.IsRecorder)
            {
                player.Disconnect();
            }
            if (player.Type == (int)PlayerType.Observer)
            {
                Observers.Remove(player);
                if (State == GameState.Lobby)
                {
                    BinaryWriter nwatch = GamePacketFactory.Create(StocMessage.HsWatchChange);
                    nwatch.Write((short)Observers.Count);
                    SendToAll(nwatch);
                }
                player.Disconnect();
            }
            else if (State == GameState.Lobby)
            {
                Players[player.Type] = null;
                IsReady[player.Type] = false;
                BinaryWriter change = GamePacketFactory.Create(StocMessage.HsPlayerChange);
                change.Write((byte)((player.Type << 4) + (int)PlayerChange.Leave));
                SendToAll(change);
                player.Disconnect();
            }
            else
            {
                Surrender(player, 4, true);
            }

            if (OnPlayerLeave != null)
            {
                OnPlayerLeave(this, new PlayerEventArgs(player));
            }
        }
Esempio n. 13
0
        private void SendToAll(CoreMessage msg)
        {
            byte[]           buffer = msg.CreateBuffer();
            GamePacketWriter packet = GamePacketFactory.Create(msg.Message);

            packet.Write(buffer);
            Game.SendToAll(packet);
        }
Esempio n. 14
0
        private void OnRetry()
        {
            int player = Game.WaitForResponse();

            Game.CurPlayers[player].Send(GamePacketFactory.Create(GameMessage.Retry));

            Game.Replay.End();
        }
Esempio n. 15
0
        private void SendToReplayRecorder(CoreMessage msg)
        {
            byte[]       buffer = msg.CreateBuffer();
            BinaryWriter packet = GamePacketFactory.Create(msg.Message);

            packet.Write(buffer);
            Game.SendToReplayRecorder(packet);
        }
Esempio n. 16
0
        private void OnRetry()
        {
            int player = Game.WaitForResponse();

            Game.CurPlayers[player].Send(GamePacketFactory.Create(GameMessage.Retry));

            Game.Replay.End();
            //File.WriteAllBytes("error_" + DateTime.UtcNow.ToString("yyyy-MM-dd_HH-mm-ss") + ".yrp", Game.Replay.GetFile());
        }
Esempio n. 17
0
        public void CustomMessage(Player player, string msg)
        {
            string       finalmsg = msg;
            BinaryWriter packet   = GamePacketFactory.Create(StocMessage.Chat);

            packet.Write((short)PlayerType.Yellow);
            packet.WriteUnicode(finalmsg, finalmsg.Length + 1);
            SendToAllBut(packet, player);
        }
Esempio n. 18
0
        public void RefreshExtra(int player, int flag = 0x81fff)
        {
            byte[]           result = _duel.QueryFieldCard(player, CardLocation.Extra, flag, false);
            GamePacketWriter update = GamePacketFactory.Create(GameMessage.UpdateData);

            update.Write((byte)player);
            update.Write((byte)CardLocation.Extra);
            update.Write(result);
            CurPlayers[player].Send(update);
        }
Esempio n. 19
0
        private void OnSet(CoreMessage msg)
        {
            msg.Reader.ReadBytes(4);
            byte[]           raw    = msg.Reader.ReadBytes(4);
            GamePacketWriter packet = GamePacketFactory.Create(GameMessage.Set);

            packet.Write(0);
            packet.Write(raw);
            Game.SendToAll(packet);
        }
Esempio n. 20
0
        private void HandleError(string error)
        {
            BinaryWriter packet = GamePacketFactory.Create(StocMessage.Chat);

            packet.Write((short)PlayerType.Observer);
            packet.WriteUnicode(error, error.Length + 1);
            SendToAll(packet);

            File.WriteAllText("lua_" + DateTime.UtcNow.ToString("yyyy-MM-dd_HH-mm-ss") + ".txt", error);
        }
Esempio n. 21
0
 private void SendToAll(CoreMessage msg, int length)
 {
     if (length == 0)
     {
         Game.SendToAll(GamePacketFactory.Create(msg.Message));
         return;
     }
     msg.Reader.ReadBytes(length);
     SendToAll(msg);
 }
Esempio n. 22
0
        public void SetReady(Player player, bool ready)
        {
            if (State != GameState.Lobby)
            {
                return;
            }
            if (player.Type == (int)PlayerType.Observer)
            {
                return;
            }
            if (IsReady[player.Type] == ready)
            {
                return;
            }

            if (ready)
            {
                bool ocg    = Region == 0 || Region == 2;
                bool tcg    = Region == 1 || Region == 2;
                int  result = 1;

                if (player.Deck != null)
                {
                    result = NoCheckDeck ? 0 : player.Deck.Check(Banlist, ocg, tcg);
                }
                if (result != 0)
                {
                    BinaryWriter rechange = GamePacketFactory.Create(StocMessage.HsPlayerChange);
                    rechange.Write((byte)((player.Type << 4) + (int)(PlayerChange.NotReady)));
                    player.Send(rechange);
                    BinaryWriter error = GamePacketFactory.Create(StocMessage.ErrorMsg);
                    error.Write((byte)2); // ErrorMsg.DeckError
                    // C++ padding: 1 byte + 3 bytes = 4 bytes
                    for (int i = 0; i < 3; i++)
                    {
                        error.Write((byte)0);
                    }
                    error.Write(result);
                    player.Send(error);
                    return;
                }
            }

            IsReady[player.Type] = ready;

            BinaryWriter change = GamePacketFactory.Create(StocMessage.HsPlayerChange);

            change.Write((byte)((player.Type << 4) + (int)(ready ? PlayerChange.Ready : PlayerChange.NotReady)));
            SendToAll(change);

            if (OnPlayerReady != null)
            {
                OnPlayerReady(this, new PlayerEventArgs(player));
            }
        }
Esempio n. 23
0
 public void MatchSide()
 {
     if (IsReady[0] && IsReady[1])
     {
         State      = GameState.Starting;
         IsTpSelect = true;
         TpTimer    = DateTime.UtcNow;
         TimeReset();
         Players[_startplayer].Send(GamePacketFactory.Create(StocMessage.SelectTp));
     }
 }
Esempio n. 24
0
        private void SendToTeam(CoreMessage msg, int player)
        {
            if (player != 0 && player != 1)
            {
                return;
            }
            byte[]       buffer = msg.CreateBuffer();
            BinaryWriter packet = GamePacketFactory.Create(msg.Message);

            packet.Write(buffer);
            Game.SendToTeam(packet, player);
        }
Esempio n. 25
0
 private void SendDuelingPlayers(Player player)
 {
     for (int i = 0; i < Players.Length; i++)
     {
         BinaryWriter enter = GamePacketFactory.Create(StocMessage.HsPlayerEnter);
         enter.WriteUnicode(Players[i].Name, 20);
         enter.Write((byte)i);
         //padding
         enter.Write((byte)0);
         player.Send(enter);
     }
 }
Esempio n. 26
0
        public void End()
        {
            State = GameState.End;

            SendToAll(GamePacketFactory.Create(StocMessage.DuelEnd));
            _server.StopDelayed();

            if (OnGameEnd != null)
            {
                OnGameEnd(this, EventArgs.Empty);
            }
        }
Esempio n. 27
0
        private void SendToPlayer(CoreMessage msg, int player)
        {
            if (player != 0 && player != 1)
            {
                return;
            }
            byte[]           buffer = msg.CreateBuffer();
            GamePacketWriter packet = GamePacketFactory.Create(msg.Message);

            packet.Write(buffer);
            Game.CurPlayers[player].Send(packet);
        }
Esempio n. 28
0
        private void OnTagSwap(CoreMessage msg)
        {
            BinaryWriter packet = GamePacketFactory.Create(GameMessage.TagSwap);

            int player = msg.Reader.ReadByte();

            packet.Write((byte)player);

            packet.Write(msg.Reader.ReadByte()); // mcount
            int ecount = msg.Reader.ReadByte();

            packet.Write((byte)ecount);
            packet.Write(msg.Reader.ReadByte()); // pcount
            int hcount = msg.Reader.ReadByte();

            packet.Write((byte)hcount);

            packet.Write(msg.Reader.ReadBytes(4)); // topcode

            for (int i = 0; i < hcount + ecount; i++)
            {
                uint code = msg.Reader.ReadUInt32();
                if ((code & 0x80000000) != 0)
                {
                    packet.Write(code);
                }
                else
                {
                    packet.Write(0);
                }
            }

            if (Game.CurPlayers[player].Equals(Game.Players[player * 2]))
            {
                Game.CurPlayers[player] = Game.Players[player * 2 + 1];
            }
            else
            {
                Game.CurPlayers[player] = Game.Players[player * 2];
            }

            SendToPlayer(msg, player);
            Game.SendToAllBut(packet, player);

            Game.RefreshExtra(player);
            Game.RefreshMonsters(0);
            Game.RefreshMonsters(1);
            Game.RefreshSpells(0);
            Game.RefreshSpells(1);
            Game.RefreshHand(0);
            Game.RefreshHand(1);
        }
Esempio n. 29
0
        public void RefreshSpells(int player, int flag = 0x681fff, Player observer = null)
        {
            byte[]           result = _duel.QueryFieldCard(player, CardLocation.SpellZone, flag, false);
            GamePacketWriter update = GamePacketFactory.Create(GameMessage.UpdateData);

            update.Write((byte)player);
            update.Write((byte)CardLocation.SpellZone);
            update.Write(result);
            if (observer == null)
            {
                SendToTeam(update, player);
            }

            update = GamePacketFactory.Create(GameMessage.UpdateData);
            update.Write((byte)player);
            update.Write((byte)CardLocation.SpellZone);

            MemoryStream ms     = new MemoryStream(result);
            BinaryReader reader = new BinaryReader(ms);

            for (int i = 0; i < 8; i++)
            {
                int len = reader.ReadInt32();
                if (len == 4)
                {
                    update.Write(4);
                    continue;
                }

                byte[] raw = reader.ReadBytes(len - 4);
                if ((raw[11] & (int)CardPosition.FaceDown) != 0)
                {
                    update.Write(8);
                    update.Write(0);
                }
                else
                {
                    update.Write(len);
                    update.Write(raw);
                }
            }

            if (observer == null)
            {
                SendToTeam(update, 1 - player);
                SendToObservers(update);
            }
            else
            {
                observer.Send(update);
            }
        }
Esempio n. 30
0
        public void WaitForResponse(int player)
        {
            _lastresponse            = player;
            CurPlayers[player].State = PlayerState.Response;
            SendToAllBut(GamePacketFactory.Create(GameMessage.Waiting), player);
            TimeStart();
            BinaryWriter packet = GamePacketFactory.Create(StocMessage.TimeLimit);

            packet.Write((byte)player);
            packet.Write((byte)0); // C++ padding
            packet.Write((short)_timelimit[player]);
            SendToPlayers(packet);
        }