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); GameServerPacket packet = new GameServerPacket(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); } }
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); using(GameServerPacket packet = new GameServerPacket(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((int)0); } Game.SendToAllBut(packet, cc); } if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc)) Game.RefreshSingle(cc, cl, cs); }
public void TpResult(GameSession player, bool result) { if (State != GameState.Starting) return; if (player.Type != m_startplayer) return; m_swapped = false; if (result && player.Type == (IsTag ? 2 : 1) || !result && player.Type == 0) { m_swapped = true; if (IsTag) { GameSession temp = Players[0]; Players[0] = Players[2]; Players[2] = temp; temp = Players[1]; Players[1] = Players[3]; Players[3] = temp; Players[0].Type = 0; Players[1].Type = 1; Players[2].Type = 2; Players[3].Type = 3; } else { GameSession temp = Players[0]; Players[0] = Players[1]; Players[1] = temp; Players[0].Type = 0; Players[1].Type = 1; } } CurPlayers[0] = Players[0]; CurPlayers[1] = Players[IsTag ? 3 : 1]; State = GameState.Duel; int seed = Environment.TickCount; m_duel = Duel.Create((uint)seed); Random rand = new Random(seed); m_duel.SetAnalyzer(m_analyser.Analyse); m_duel.SetErrorHandler(HandleError); m_duel.InitPlayers(Config.StartLp, Config.StartHand, Config.DrawCount); int opt = 0; if (Config.EnablePriority) opt += 0x08; if (Config.NoShuffleDeck) opt += 0x10; if (IsTag) opt += 0x20; Replay = new Replay(GetYrpFileName(this), Program.Config.ClientVersion, Config.Mode, (uint)seed, IsTag); Replay.Writer.WriteUnicode(Players[0].Name, 20); Replay.Writer.WriteUnicode(Players[1].Name, 20); if (IsTag) { Replay.Writer.WriteUnicode(Players[2].Name, 20); Replay.Writer.WriteUnicode(Players[3].Name, 20); } Replay.Writer.Write(Config.StartLp); Replay.Writer.Write(Config.StartHand); Replay.Writer.Write(Config.DrawCount); Replay.Writer.Write(opt); for (int i = 0; i < Players.Length; i++) { GameSession dplayer = Players[i == 2 ? 3 : (i == 3 ? 2 : i)]; int pid = i; if (IsTag) pid = i >= 2 ? 1 : 0; if (!Config.NoShuffleDeck) { IList<int> cards = ShuffleCards(rand, dplayer.Deck.Main); Replay.Writer.Write(cards.Count); foreach (int id in cards) { if (IsTag && (i == 1 || i == 3)) m_duel.AddTagCard(id, pid, CardLocation.Deck); else m_duel.AddCard(id, pid, CardLocation.Deck); Replay.Writer.Write(id); } } else { Replay.Writer.Write(dplayer.Deck.Main.Count); for (int j = dplayer.Deck.Main.Count - 1; j >= 0; j--) { int id = dplayer.Deck.Main[j]; if (IsTag && (i == 1 || i == 3)) m_duel.AddTagCard(id, pid, CardLocation.Deck); else m_duel.AddCard(id, pid, CardLocation.Deck); Replay.Writer.Write(id); } } Replay.Writer.Write(dplayer.Deck.Extra.Count); foreach (int id in dplayer.Deck.Extra) { if (IsTag && (i == 1 || i == 3)) m_duel.AddTagCard(id, pid, CardLocation.Extra); else m_duel.AddCard(id, pid, CardLocation.Extra); Replay.Writer.Write(id); } } using (GameServerPacket packet = new GameServerPacket(GameMessage.Start)) { packet.Write((byte)0); packet.Write(Config.StartLp); packet.Write(Config.StartLp); packet.Write((short)m_duel.QueryFieldCount(0, CardLocation.Deck)); packet.Write((short)m_duel.QueryFieldCount(0, CardLocation.Extra)); packet.Write((short)m_duel.QueryFieldCount(1, CardLocation.Deck)); packet.Write((short)m_duel.QueryFieldCount(1, CardLocation.Extra)); SendToTeam(packet, 0); // GameServerPacket packet2 = new GameServerPacket(GameMessage.Start); // packet2.Write((byte)1); // packet2.Write(Config.StartLp); // packet2.Write(Config.StartLp); // packet2.Write((short)m_duel.QueryFieldCount(0, CardLocation.Deck)); // packet2.Write((short)m_duel.QueryFieldCount(0, CardLocation.Extra)); // packet2.Write((short)m_duel.QueryFieldCount(1, CardLocation.Deck)); // packet2.Write((short)m_duel.QueryFieldCount(1, CardLocation.Extra)); // SendToTeam(packet2, 1); packet.SetPosition(2); packet.Write((byte)1); SendToTeam(packet, 1); // GameServerPacket packet3 = new GameServerPacket(GameMessage.Start); // if (m_swapped) // packet3.Write((byte)0x11); // else // packet3.Write((byte)0x10); // packet3.Write(Config.StartLp); // packet3.Write(Config.StartLp); // packet3.Write((short)m_duel.QueryFieldCount(0, CardLocation.Deck)); // packet3.Write((short)m_duel.QueryFieldCount(0, CardLocation.Extra)); // packet3.Write((short)m_duel.QueryFieldCount(1, CardLocation.Deck)); // packet3.Write((short)m_duel.QueryFieldCount(1, CardLocation.Extra)); // SendToObservers(packet3); packet.SetPosition(2); packet.Write((byte)(m_swapped ? 0x11 : 0x10)); SendToObservers(packet); } RefreshExtra(0); RefreshExtra(1); m_duel.Start(opt); TurnCount = 0; LifePoints[0] = Config.StartLp; LifePoints[1] = Config.StartLp; Process(); }