/// <summary> /// Allows the game component to update itself. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> public override void Update(GameTime gameTime) { MouseState mouse = Mouse.GetState(); if (gameState != GameStage.Shuffle && deckPile.ShuffleDeck(discardPile)) { nextState = gameState; gameState = GameStage.ReShuffle; } switch (gameState) { case GameStage.ReShuffle: case GameStage.Shuffle: if (deckPile.UpdateShuffleDeck(gameTime)) { gameState = nextState; } break; case GameStage.Start: if (numDraws > 0) { if (done) { done = false; SSEngine.Player1First = !SSEngine.Player1First; numDraws--; } else { gameState = GameStage.Drawing; } } else { AIOpponent.Init(SSEngine.VersionStage); gameState = GameStage.DeckToDiscard; } break; case GameStage.DeckToDiscard: bool finished; finished = deckPile.UpdateDeckPile(gameTime, discardPile); if (finished) { changedSuit = discardPile[0].CardSuit; gameState = GameStage.Run; if (discardPile[0].Rank == RankValue.Three || discardPile[0].Rank == RankValue.Four || discardPile[0].Rank == RankValue.Deuce || discardPile[0] == SSEngine.DeckSprites["QueenSpades"] || discardPile[0].Rank == RankValue.Eight) { SSEngine.Player1First = !SSEngine.Player1First; cardAblities(discardPile[0]); numExtraDraws = numTotalSets; } else { numTotalSets = 1; cardAblities(discardPile[0]); } } break; case GameStage.Drawing: if (SSEngine.Player1First == SSEngine.Player1) { done = deckPile.AddingCardsToHand(gameTime, discardPile, playerCards1); } else { done = deckPile.AddingCardsToHand(gameTime, discardPile, playerCards2); } if (done) { gameState = GameStage.Start; } break; case GameStage.DrawingCard: if (deckPile.AddingCardsToHand(gameTime, discardPile, playerCards2)) { gameState = GameStage.Run; } break; case GameStage.Draw: if (SSEngine.Player1First == SSEngine.Player1) { done = deckPile.AddingCardsToHand(gameTime, discardPile, playerCards2); } else { done = deckPile.AddingCardsToHand(gameTime, discardPile, playerCards1); } if (done && --numDraws == 0) { gameState = GameStage.Run; } break; case GameStage.Run: if ((playerCards1.Count == 0 || playerCards2.Count == 0) && numTotalSets == 0) { gameState = GameStage.End; break; } if (numDraws == 0 && numTotalSets == 0) { numTotalSets = 1; numExtraDraws = 1; numHaveSet = 0; cardAbility = String.Empty; SSEngine.Player1First = !SSEngine.Player1First; if (SSEngine.Player1SetThree == SSEngine.Player1First) { SSEngine.Player1SetThree = null; } } bool activate = false; if (SSEngine.Player1First == SSEngine.Player1) { activate = playerCards1.UpdateHand(gameTime, mouse, discardPile, changedSuit, ref cardAbility); } else if (SSEngine.VersionStage != MenuStage.LAN && SSEngine.VersionStage != MenuStage.Online) { if (selectedIndex == -1) { selectedIndex = AIOpponent.Opponent(playerCards2, discardPile, changedSuit); if (numExtraDraws > 0 && selectedIndex == -1) { gameState = GameStage.DrawingCard; } if (selectedIndex == -1 && numExtraDraws == 0) { numTotalSets = 0; } } if (selectedIndex != -1) { activate = playerCards2.UpdateHand(gameTime, selectedIndex, discardPile); } else if (numExtraDraws > 0) { numExtraDraws--; } } else if (selectedIndex != -1) { activate = playerCards2.UpdateHand(gameTime, selectedIndex, discardPile); } if (activate) { if (numTotalSets > 0) { numTotalSets--; } numHaveSet++; if (discardPile.Count > 1 && discardPile[discardPile.Count - 2].Rank == RankValue.Three && numExtraDraws == 1) { numExtraDraws++; } if (numExtraDraws > 0) { numExtraDraws--; } selectedIndex = -1; ability(discardPile[discardPile.Count - 1]); } if (numExtraDraws > 0) { activate = false; if (SSEngine.Player1First == SSEngine.Player1) { deckPile.ShuffleDeck(discardPile); activate = deckPile.UpdateDeckPile(gameTime, mouse, playerCards1); } if (activate) { numExtraDraws--; } } else { finished = endTurnButton.UpdateButton(mouse, gameTime); if (finished) { numTotalSets = 0; if (SSEngine.VersionStage == MenuStage.LAN) { SSEngine.LANClient.Send((byte)NetGame.EndTurn); } else if (SSEngine.VersionStage == MenuStage.Online) { NetOutgoingMessage msg = SSEngine.Peer.CreateMessage(); msg.Write((byte)NetGame.EndTurn); SSEngine.Peer.SendMessage(msg, SSEngine.Peer.Connections[0], NetDeliveryMethod.ReliableOrdered); } } } finished = backButton.UpdateButton(mouse, gameTime); if (finished) { if (SSEngine.VersionStage == MenuStage.LAN) { SSEngine.LANClient.Send((byte)NetGame.Back); SSEngine.LANClient = null; } else if (SSEngine.VersionStage == MenuStage.Online) { NetOutgoingMessage msg = SSEngine.Peer.CreateMessage(); msg.Write((byte)NetGame.Back); SSEngine.Peer.SendMessage(msg, SSEngine.Peer.Connections[0], NetDeliveryMethod.ReliableOrdered); System.Threading.Thread.Sleep(1000); SSEngine.Peer.Shutdown("Lost Connection."); SSEngine.Peer = null; } SSEngine.VersionStage = MenuStage.Play; } break; case GameStage.EightAbility: if (!SSEngine.Player1First && SSEngine.VersionStage != MenuStage.LAN && SSEngine.VersionStage != MenuStage.Online) { switch (SSEngine.VersionStage) { case MenuStage.VeryEasy: AIOpponent.EightAbilityVE(ref changedSuit); break; case MenuStage.Easy: case MenuStage.Medium: AIOpponent.EightAbilityEM(ref changedSuit, playerCards2); break; case MenuStage.Hard: case MenuStage.VeryHard: AIOpponent.EightAbilityHVH(ref changedSuit, playerCards2); break; } if (numSameRank < 3) { gameState = GameStage.Run; } else { gameState = GameStage.Draw; } } else { eightAbilityP(gameTime, mouse); } break; case GameStage.End: // Implement end game mechanics. if (Keyboard.GetState().IsKeyDown(Keys.Enter)) { SSEngine.VersionStage = MenuStage.Play; SSEngine.Disconnected = false; SSEngine.LANClient = null; SSEngine.Peer = null; } cardAbility = String.Empty; break; } if (SSEngine.VersionStage == MenuStage.LAN && SSEngine.LANClient.HasMessage() && !(deckPile.Deck.Count != 3 && (NetGame)SSEngine.LANClient.PeekMessage().Bytes[0] == NetGame.Shuffle) && gameState != GameStage.ReShuffle) { Message msg = SSEngine.LANClient.ReceiveMessage(); switch ((NetGame)msg.Bytes[0]) { case NetGame.SuitChanged: if (msg.Bytes.Length == 3) { gameState = (GameStage)msg.Bytes[2]; } else { gameState = GameStage.Run; } changedSuit = (Suit)msg.Bytes[1]; break; case NetGame.Draw: gameState = GameStage.DrawingCard; break; case NetGame.EndTurn: numTotalSets = 0; break; case NetGame.Back: gameState = GameStage.End; SSEngine.Disconnected = true; break; case NetGame.Shuffle: if (discardPile.Count > 1) { discardPile.DiscardList.RemoveRange(0, discardPile.Count - 1); } for (int j = 1; j < msg.Bytes.Length - 1; j += 2) { deckPile.Deck.Add(SSEngine.DeckSprites[(RankValue)msg.Bytes[j] + "" + (Suit)msg.Bytes[j + 1]]); } if (gameState != GameStage.Shuffle) { nextState = gameState; gameState = GameStage.ReShuffle; } break; case NetGame.Set: selectedIndex = msg.Bytes[1]; break; default: break; } } else if (SSEngine.VersionStage == MenuStage.Online) { NetIncomingMessage inc = SSEngine.Peer.PeekMessage(); if (inc != null && !(deckPile.Deck.Count != 3 && (NetGame)inc.PeekByte() == NetGame.Shuffle) && gameState != GameStage.ReShuffle) { inc = SSEngine.Peer.ReadMessage(); switch (inc.MessageType) { case NetIncomingMessageType.Data: switch ((NetGame)inc.ReadByte()) { case NetGame.SuitChanged: changedSuit = (Suit)inc.ReadByte(); if (inc.LengthBytes == 1) { gameState = (GameStage)inc.ReadByte(); } else { gameState = GameStage.Run; } break; case NetGame.Draw: gameState = GameStage.DrawingCard; break; case NetGame.EndTurn: numTotalSets = 0; break; case NetGame.Back: gameState = GameStage.End; SSEngine.Disconnected = true; break; case NetGame.Shuffle: if (discardPile.Count > 1) { discardPile.DiscardList.RemoveRange(0, discardPile.Count - 1); } byte numBytes = inc.ReadByte(); byte[] data = inc.ReadBytes(numBytes); for (int j = 0; j < data.Length; j += 2) { deckPile.Deck.Add(SSEngine.DeckSprites[(RankValue)data[j] + "" + (Suit)data[j + 1]]); } if (gameState != GameStage.Shuffle) { nextState = gameState; gameState = GameStage.ReShuffle; } break; case NetGame.Set: selectedIndex = inc.ReadByte(); break; default: break; } break; case NetIncomingMessageType.StatusChanged: switch (inc.SenderConnection.Status) { case NetConnectionStatus.Disconnected: break; } break; default: break; } } } base.Update(gameTime); }
/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { // Allows the game to exit if (Keyboard.GetState().IsKeyDown(Keys.Escape)) { this.Exit(); } MouseState mouse = Mouse.GetState(); switch (menuStage) { case MenuStage.SplashScreen: if (gameTime.TotalGameTime.Seconds > 2) { menuStage = MenuStage.MainMenu; } break; case MenuStage.MainMenu: UpdateButtons(mainButtons, gameTime, mouse); break; case MenuStage.Play: UpdateButtons(playButtons, gameTime, mouse); for (int i = 0; i < playButtons.Length - 1; i++) { if (playButtons[i].IsClicked && playButtons[i].Stage != MenuStage.TwoPlayer) { SSEngine.VersionStage = playButtons[i].Stage; selectedStage = MenuStage.RockPaperScissors; SSEngine.Player1 = true; } } break; case MenuStage.TwoPlayer: UpdateButtons(twoPlayerBtns, gameTime, mouse); if (twoPlayerBtns[0].IsClicked) // Online Button. { SSEngine.Player1 = true; SSEngine.VersionStage = twoPlayerBtns[0].Stage; selectedStage = MenuStage.Connect; if (SSEngine.Peer == null) { Client.MainClient(); } } else if (twoPlayerBtns[1].IsClicked) // LAN Button. { SSEngine.Player1 = true; SSEngine.VersionStage = twoPlayerBtns[1].Stage; selectedStage = MenuStage.Connect; if (SSEngine.LANClient == null) { SSEngine.LANClient = new BroadcastClient(); if (SSEngine.LANClient.IsListening) { SSEngine.LANClient.Send((byte)MenuStage.Connect); } } } break; case MenuStage.Connect: if (SSEngine.VersionStage == MenuStage.LAN && SSEngine.LANClient.HasMessage()) { Message msg = SSEngine.LANClient.ReceiveMessage(); if (msg.Bytes[0] == (byte)MenuStage.Connect) { SSEngine.Player1 = true; SSEngine.LANClient.Send((byte)MenuStage.Connected); menuStage = MenuStage.Connected; } else if (msg.Bytes[0] == (byte)MenuStage.Connected) { SSEngine.LANClient.Send((byte)MenuStage.Connected); SSEngine.Player1 = false; menuStage = MenuStage.RockPaperScissors; } } else if (SSEngine.VersionStage == MenuStage.Online && SSEngine.IsHost.HasValue) { if (Server.ConForm.cbClient.Checked && Server.ConForm.cbHost.Checked) // Is a host or client. { SSEngine.Player1 = SSEngine.IsHost.Value; menuStage = MenuStage.RockPaperScissors; System.Threading.Thread.Sleep(1000); Server.ConForm.Close(); } } if (SSEngine.VersionStage == MenuStage.LAN && backButton.UpdateButton(mouse, gameTime)) { menuStage = MenuStage.Play; } break; case MenuStage.Connected: if (SSEngine.LANClient.HasMessage()) { Message msg = SSEngine.LANClient.ReceiveMessage(); if (msg.Bytes[0] == (byte)MenuStage.Connected) { menuStage = MenuStage.RockPaperScissors; } } break; case MenuStage.RockPaperScissors: UpdateButtons(rocPapSciBtns, gameTime, mouse); UpdateRockPaperScissors(); break; case MenuStage.RockPaperScissorsWait: if (SSEngine.VersionStage == MenuStage.LAN && SSEngine.LANClient.HasMessage()) { Message msg = SSEngine.LANClient.ReceiveMessage(); if (SSEngine.Player1.Value) { playerTwo = msg.Bytes[0]; } else { playerOne = msg.Bytes[0]; } RockPaperScissorsGame(playerOne, playerTwo); menuStage = MenuStage.RockPaperScissorsPlaced; } else if (SSEngine.VersionStage == MenuStage.Online && SSEngine.Peer.PeekMessage() != null) { NetIncomingMessage msg = SSEngine.Peer.ReadMessage(); if (SSEngine.Player1.Value) { playerTwo = msg.ReadByte(); } else { playerOne = msg.ReadByte(); } RockPaperScissorsGame(playerOne, playerTwo); menuStage = MenuStage.RockPaperScissorsPlaced; } if (backButton.UpdateButton(mouse, gameTime)) { menuStage = MenuStage.Play; } break; case MenuStage.RockPaperScissorsPlaced: if (Keyboard.GetState().IsKeyDown(Keys.Enter)) { if (playerOne != playerTwo) { if (SSEngine.VersionStage == MenuStage.LAN && !SSEngine.LANClient.HasMessage()) { menuStage = MenuStage.WaitToPlay; SSEngine.LANClient.Send((byte)menuStage); } else if (SSEngine.VersionStage == MenuStage.LAN && SSEngine.LANClient.HasMessage()) { Message msg = SSEngine.LANClient.ReceiveMessage(); if ((MenuStage)msg.Bytes[0] == MenuStage.WaitToPlay) { SSEngine.LANClient.Send((byte)MenuStage.WaitToPlay); menuStage = MenuStage.InGame; game = new SSGame(this); Components.Add(game); game.Enabled = true; game.Visible = true; } } else if (SSEngine.VersionStage == MenuStage.Online && SSEngine.Peer.PeekMessage() == null) { menuStage = MenuStage.WaitToPlay; NetOutgoingMessage msg = SSEngine.Peer.CreateMessage(); msg.Write((byte)MenuStage.WaitToPlay); SSEngine.Peer.SendMessage(msg, SSEngine.Peer.Connections[0], NetDeliveryMethod.ReliableOrdered); } else if (SSEngine.VersionStage == MenuStage.Online && SSEngine.Peer.PeekMessage() != null) { NetIncomingMessage inc = SSEngine.Peer.ReadMessage(); if ((MenuStage)inc.ReadByte() == MenuStage.WaitToPlay) { NetOutgoingMessage msg = SSEngine.Peer.CreateMessage(); msg.Write((byte)MenuStage.WaitToPlay); SSEngine.Peer.SendMessage(msg, SSEngine.Peer.Connections[0], NetDeliveryMethod.ReliableOrdered); menuStage = MenuStage.InGame; game = new SSGame(this); Components.Add(game); game.Enabled = true; game.Visible = true; } } if (SSEngine.VersionStage != MenuStage.LAN && SSEngine.VersionStage != MenuStage.Online) { menuStage = MenuStage.InGame; game = new SSGame(this); Components.Add(game); game.Enabled = true; game.Visible = true; } } else { menuStage = MenuStage.RockPaperScissors; } playerOne = -1; playerTwo = -1; } break; case MenuStage.WaitToPlay: if (SSEngine.VersionStage == MenuStage.LAN && SSEngine.LANClient.HasMessage()) { Message msg = SSEngine.LANClient.ReceiveMessage(); if ((MenuStage)msg.Bytes[0] == MenuStage.WaitToPlay) { menuStage = MenuStage.InGame; game = new SSGame(this); Components.Add(game); game.Enabled = true; game.Visible = true; } } else if (SSEngine.VersionStage == MenuStage.Online && SSEngine.Peer.PeekMessage() != null) { NetIncomingMessage inc = SSEngine.Peer.ReadMessage(); if ((MenuStage)inc.ReadByte() == MenuStage.WaitToPlay) { NetOutgoingMessage msg = SSEngine.Peer.CreateMessage(); msg.Write((byte)MenuStage.WaitToPlay); SSEngine.Peer.SendMessage(msg, SSEngine.Peer.Connections[0], NetDeliveryMethod.ReliableOrdered); menuStage = MenuStage.InGame; game = new SSGame(this); Components.Add(game); game.Enabled = true; game.Visible = true; } } break; case MenuStage.InGame: if (SSEngine.VersionStage == MenuStage.Play) { Components.Remove(game); menuStage = MenuStage.Play; } break; case MenuStage.GameRules: UpdateButtons(gameRulesBtns, gameTime, mouse); break; case MenuStage.Settings: UpdateButtons(settingsBtns, gameTime, mouse); break; } base.Update(gameTime); }