private void OnHint(CoreMessage msg) { int type = msg.Reader.ReadByte(); int player = msg.Reader.ReadByte(); msg.Reader.ReadInt32(); byte[] buffer = msg.CreateBuffer(); using (GameServerPacket packet = new GameServerPacket(msg.Message)){ packet.Write(buffer); switch (type) { case 1: case 2: case 3: case 4: case 5: Game.CurPlayers[player].Send(packet); break; case 6: case 7: case 8: case 9: Game.SendToAllBut(packet, player); break; case 10: if (Game.IsTag) { Game.CurPlayers[player].Send(packet); } else { Game.SendToAll(packet); } break; } } }
private void OnTagSwap(CoreMessage msg) { GameServerPacket packet = new GameServerPacket(GameMessage.TagSwap); int player = msg.Reader.ReadByte(); packet.Write((byte)player); packet.Write(msg.Reader.ReadBytes(2)); int count = msg.Reader.ReadByte(); packet.Write((byte)count); packet.Write(msg.Reader.ReadBytes(4)); 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); Game.RefreshExtra(player); Game.RefreshMonsters(0, 0x81fff, false); Game.RefreshMonsters(1, 0x81fff, false); Game.RefreshSpells(0, 0x681fff, false); Game.RefreshSpells(1, 0x681fff, false); Game.RefreshHand(0, 0x181fff, false); Game.RefreshHand(1, 0x181fff, false); }
private void OnNewTurn(CoreMessage msg) { Game.TimeReset(); if (!Game.IsTag) { Game.RefreshAll(); } Game.CurrentPlayer = msg.Reader.ReadByte(); SendToAll(msg); if (Game.IsTag && Game.TurnCount > 0) { if (Game.TurnCount % 2 == 0) { if (Game.CurPlayers[0].Equals(Game.Players[0])) { Game.CurPlayers[0] = Game.Players[1]; } else { Game.CurPlayers[0] = Game.Players[0]; } } else { if (Game.CurPlayers[1].Equals(Game.Players[2])) { Game.CurPlayers[1] = Game.Players[3]; } else { Game.CurPlayers[1] = Game.Players[2]; } } } Game.TurnCount++; }
private void OnAnnounceNumber(CoreMessage msg) { int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 4); Game.WaitForResponse(player); SendToPlayer(msg, player); }
private void OnTossCoin(CoreMessage msg) { msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count); SendToAll(msg); }
private void OnLpUpdate(CoreMessage msg) { int player = msg.Reader.ReadByte(); int value = msg.Reader.ReadInt32(); switch (msg.Message) { case GameMessage.LpUpdate: Game.LifePoints[player] = value; break; case GameMessage.PayLpCost: case GameMessage.Damage: Game.LifePoints[player] -= value; if (Game.LifePoints[player] < 0) Game.LifePoints[player] = 0; break; case GameMessage.Recover: Game.LifePoints[player] += value; break; } SendToAll(msg); }
private void OnBecomeTarget(CoreMessage msg) { int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 4); SendToAll(msg); }
private void OnCardSelected(CoreMessage msg) { msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 4); }
private void OnSet(CoreMessage msg) { msg.Reader.ReadBytes(4); byte[] raw = msg.Reader.ReadBytes(4); using(GameServerPacket packet = new GameServerPacket(GameMessage.Set)){ packet.Write(0); packet.Write(raw); Game.SendToAll(packet); } }
public int Analyse(GameMessage msg, BinaryReader reader, byte[] raw) { LastMessage = msg; CoreMessage cmsg = new CoreMessage(msg, reader, raw); //Logger.WriteLine(msg); switch (msg) { case GameMessage.Retry: OnRetry(); return(1); case GameMessage.Hint: OnHint(cmsg); break; case GameMessage.Win: OnWin(cmsg); return(2); case GameMessage.SelectBattleCmd: OnSelectBattleCmd(cmsg); return(1); case GameMessage.SelectIdleCmd: OnSelectIdleCmd(cmsg); return(1); case GameMessage.SelectEffectYn: OnSelectEffectYn(cmsg); return(1); case GameMessage.SelectYesNo: OnSelectYesNo(cmsg); return(1); case GameMessage.SelectOption: OnSelectOption(cmsg); return(1); case GameMessage.SelectCard: case GameMessage.SelectTribute: OnSelectCard(cmsg); return(1); case GameMessage.SelectChain: return(OnSelectChain(cmsg)); case GameMessage.SelectPlace: case GameMessage.SelectDisfield: case GameMessage.SelectPosition: OnSelectPlace(cmsg); return(1); case GameMessage.SelectCounter: OnSelectCounter(cmsg); return(1); case GameMessage.SelectSum: OnSelectSum(cmsg); return(1); case GameMessage.SortCard: case GameMessage.SortChain: OnSortCard(cmsg); return(1); case GameMessage.ConfirmDecktop: OnConfirmDecktop(cmsg); break; case GameMessage.ConfirmCards: OnConfirmCards(cmsg); break; case GameMessage.ShuffleDeck: case GameMessage.RefreshDeck: SendToAll(cmsg, 1); break; case GameMessage.ShuffleHand: OnShuffleHand(cmsg); break; case GameMessage.SwapGraveDeck: OnSwapGraveDeck(cmsg); break; case GameMessage.ReverseDeck: SendToAll(cmsg, 0); break; case GameMessage.DeckTop: SendToAll(cmsg, 6); break; case GameMessage.ShuffleSetCard: OnShuffleSetCard(cmsg); break; case GameMessage.NewTurn: OnNewTurn(cmsg); break; case GameMessage.NewPhase: OnNewPhase(cmsg); break; case GameMessage.Move: OnMove(cmsg); break; case GameMessage.PosChange: OnPosChange(cmsg); break; case GameMessage.Set: OnSet(cmsg); break; case GameMessage.Swap: SendToAll(cmsg, 16); break; case GameMessage.FieldDisabled: SendToAll(cmsg, 4); break; case GameMessage.Summoned: case GameMessage.SpSummoned: case GameMessage.FlipSummoned: SendToAll(cmsg, 0); Game.RefreshMonsters(0); Game.RefreshMonsters(1); Game.RefreshSpells(0); Game.RefreshSpells(1); break; case GameMessage.Summoning: case GameMessage.SpSummoning: SendToAll(cmsg, 8); break; case GameMessage.FlipSummoning: OnFlipSummoning(cmsg); break; case GameMessage.Chaining: SendToAll(cmsg, 16); break; case GameMessage.Chained: SendToAll(cmsg, 1); Game.RefreshAll(); break; case GameMessage.ChainSolving: SendToAll(cmsg, 1); break; case GameMessage.ChainSolved: SendToAll(cmsg, 1); Game.RefreshAll(); break; case GameMessage.ChainEnd: SendToAll(cmsg, 0); Game.RefreshAll(); break; case GameMessage.ChainNegated: case GameMessage.ChainDisabled: SendToAll(cmsg, 1); break; case GameMessage.CardSelected: OnCardSelected(cmsg); break; case GameMessage.RandomSelected: OnRandomSelected(cmsg); break; case GameMessage.BecomeTarget: OnBecomeTarget(cmsg); break; case GameMessage.Draw: OnDraw(cmsg); break; case GameMessage.Damage: case GameMessage.Recover: case GameMessage.LpUpdate: case GameMessage.PayLpCost: OnLpUpdate(cmsg); break; case GameMessage.Equip: SendToAll(cmsg, 8); break; case GameMessage.Unequip: SendToAll(cmsg, 4); break; case GameMessage.CardTarget: case GameMessage.CancelTarget: SendToAll(cmsg, 8); break; case GameMessage.AddCounter: case GameMessage.RemoveCounter: SendToAll(cmsg, 6); break; case GameMessage.Attack: SendToAll(cmsg, 8); break; case GameMessage.Battle: SendToAll(cmsg, 26); break; case GameMessage.AttackDiabled: SendToAll(cmsg, 0); break; case GameMessage.DamageStepStart: case GameMessage.DamageStepEnd: SendToAll(cmsg, 0); Game.RefreshMonsters(0); Game.RefreshMonsters(1); break; case GameMessage.MissedEffect: OnMissedEffect(cmsg); break; case GameMessage.TossCoin: case GameMessage.TossDice: OnTossCoin(cmsg); break; case GameMessage.AnnounceRace: OnAnnounceRace(cmsg); return(1); case GameMessage.AnnounceAttrib: OnAnnounceAttrib(cmsg); return(1); case GameMessage.AnnounceCard: OnAnnounceCard(cmsg); return(1); case GameMessage.AnnounceNumber: OnAnnounceNumber(cmsg); return(1); case GameMessage.CardHint: SendToAll(cmsg, 9); break; case GameMessage.MatchKill: OnMatchKill(cmsg); break; case GameMessage.TagSwap: OnTagSwap(cmsg); break; default: throw new Exception("[GameAnalyser] Unhandled packet id: " + msg); } Game.BonusTime(msg); return(0); }
private void OnSelectPlace(CoreMessage msg) { int player = msg.Reader.ReadByte(); msg.Reader.ReadBytes(5); Game.WaitForResponse(player); SendToPlayer(msg, player); }
private int OnSelectChain(CoreMessage msg) { int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(10 + count * 12); if (count > 0) { Game.WaitForResponse(player); SendToPlayer(msg, player); return 1; } Game.SetResponse(-1); return 0; }
private void OnSelectCard(CoreMessage msg) { using(GameServerPacket packet = new GameServerPacket(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); } }
private void OnFlipSummoning(CoreMessage msg) { byte[] raw = msg.Reader.ReadBytes(8); Game.RefreshSingle(raw[4], raw[5], raw[6]); SendToAll(msg); }
private void OnNewPhase(CoreMessage msg) { msg.Reader.ReadByte(); SendToAll(msg); Game.RefreshAll(); }
private void OnTagSwap(CoreMessage msg) { int player = msg.Reader.ReadByte(); int mcount = msg.Reader.ReadByte(); int ecount = msg.Reader.ReadByte(); int epcount = msg.Reader.ReadByte(); int hcount = msg.Reader.ReadByte(); using(GameServerPacket packet = new GameServerPacket(GameMessage.TagSwap)){ packet.Write((byte)player); packet.Write((byte)mcount); packet.Write((byte)ecount); packet.Write((byte)epcount); packet.Write((byte)hcount); uint id = msg.Reader.ReadUInt32(); packet.Write(id); for (int i = 0; i < hcount; i++) { uint code = msg.Reader.ReadUInt32(); if ((code & 0x80000000) != 0) packet.Write(code); else packet.Write(0); } for (int i = 0; i < ecount; i++) { uint code = msg.Reader.ReadUInt32(); if ((code & 0x80000000) != 0) packet.Write(code); else packet.Write(0); } SendToPlayer(msg, player); Game.SendToAllBut(packet, player); } Game.RefreshExtra(player); Game.RefreshMonsters(0, 0x81fff, false); Game.RefreshMonsters(1, 0x81fff, false); Game.RefreshSpells(0, 0x681fff, false); Game.RefreshSpells(1, 0x681fff, false); Game.RefreshHand(0, 0x181fff, false); Game.RefreshHand(1, 0x181fff, false); }
private void SendToAll(CoreMessage msg, int length) { if (length == 0) { using(GameServerPacket p = new GameServerPacket(msg.Message)){ Game.SendToAll(p); } return; } msg.Reader.ReadBytes(length); SendToAll(msg); }
private void OnSelectSum(CoreMessage msg) { msg.Reader.ReadByte(); int player = msg.Reader.ReadByte(); msg.Reader.ReadBytes(6); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 11); Game.WaitForResponse(player); SendToPlayer(msg, player); }
private void OnPosChange(CoreMessage msg) { byte[] raw = msg.Reader.ReadBytes(9); SendToAll(msg); int cc = raw[4]; int cl = raw[5]; int cs = raw[6]; int pp = raw[7]; int cp = raw[8]; if ((pp & (int)CardPosition.FaceDown) != 0 && (cp & (int)CardPosition.FaceUp) != 0) Game.RefreshSingle(cc, cl, cs); }
private void OnSortCard(CoreMessage msg) { int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 7); Game.WaitForResponse(player); SendToPlayer(msg, player); }
private void OnConfirmDecktop(CoreMessage msg) { msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 7); SendToAll(msg); }
private void OnRandomSelected(CoreMessage msg) { msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 4); SendToAll(msg); }
private void OnConfirmCards(CoreMessage msg) { int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 7); byte[] buffer = msg.CreateBuffer(); using(GameServerPacket packet = new GameServerPacket(msg.Message)){ packet.Write(buffer); if ((CardLocation)buffer[7] == CardLocation.Hand) Game.SendToAll(packet); else Game.CurPlayers[player].Send(packet); } }
private void OnDraw(CoreMessage msg) { using(GameServerPacket packet = new GameServerPacket(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); } }
private void OnShuffleHand(CoreMessage msg) { int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); using(GameServerPacket packet = new GameServerPacket(msg.Message)){ packet.Write((byte)player); packet.Write((byte)count); msg.Reader.ReadBytes(count * 4); for (int i = 0; i < count; i++) packet.Write(0); SendToPlayer(msg, player); Game.SendToAllBut(packet, player); } Game.RefreshHand(player, 0x181fff, false); }
private void OnMissedEffect(CoreMessage msg) { int player = msg.Reader.ReadByte(); msg.Reader.ReadBytes(7); SendToPlayer(msg, player); }
private void OnSwapGraveDeck(CoreMessage msg) { int player = msg.Reader.ReadByte(); SendToAll(msg); Game.RefreshGrave(player); }
private void OnAnnounceCard(CoreMessage msg) { int player = msg.Reader.ReadByte(); Game.WaitForResponse(player); SendToPlayer(msg, player); }
private void OnShuffleSetCard(CoreMessage msg) { int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 8); SendToAll(msg); Game.RefreshMonsters(0, 0x181fff, false); Game.RefreshMonsters(1, 0x181fff, false); }
private void OnMatchKill(CoreMessage msg) { msg.Reader.ReadInt32(); if (Game.IsMatch) { Game.MatchKill(); SendToAll(msg); } }
private void OnNewTurn(CoreMessage msg) { Game.TimeReset(); if (!Game.IsTag) Game.RefreshAll(); Game.CurrentPlayer = msg.Reader.ReadByte(); SendToAll(msg); if (Game.IsTag && Game.TurnCount > 0) { if (Game.TurnCount % 2 == 0) { if (Game.CurPlayers[0].Equals(Game.Players[0])) Game.CurPlayers[0] = Game.Players[1]; else Game.CurPlayers[0] = Game.Players[0]; } else { if (Game.CurPlayers[1].Equals(Game.Players[2])) Game.CurPlayers[1] = Game.Players[3]; else Game.CurPlayers[1] = Game.Players[2]; } } Game.TurnCount++; }
private void SendToAll(CoreMessage msg) { byte[] buffer = msg.CreateBuffer(); using(GameServerPacket packet = new GameServerPacket(msg.Message)){ packet.Write(buffer); Game.SendToAll(packet); } }
private void SendToPlayer(CoreMessage msg, int player) { if (player != 0 && player != 1) return; byte[] buffer = msg.CreateBuffer(); using(GameServerPacket packet = new GameServerPacket(msg.Message)){ packet.Write(buffer); Game.CurPlayers[player].Send(packet); } }
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); }