private void SendTurnResultsToClients(AcePlayer attacker, AcePlayer defender, TurnResultMessage message) { //Send stuff back to clients var players = lobbyManager.GetParticipatingPlayers(); for (int i = 0; i < players.Count; i++) { var currPlayer = players[i]; if (currPlayer.playerName == attacker.playerName || currPlayer.playerName == defender.playerName) { NetworkServer.SendToClient(currPlayer.connectionID, AceMsgTypes.BattlePhase_TurnResult, message); } } message.attackerCard = -1; //If it's 0, leave it at 0 to make it clear to clients that there was no card if (message.defenderCard != 0) { message.defenderCard = -1; } for (int j = 0; j < players.Count; j++) { var currPlayer = players[j]; if (currPlayer.playerName != attacker.playerName && currPlayer.playerName != defender.playerName) { NetworkServer.SendToClient(currPlayer.connectionID, AceMsgTypes.BattlePhase_TurnResult, message); } } }
public void handleDownStreamMessage(string messageType, string message) { Debug.Log("Got message: " + messageType + "\n" + message); addToActivityStream("Received message: " + messageType); switch (messageType) { case MsgTypes.TURN_RESULT: var turnResultMsg = TurnResultMessage.FromJson(message); Debug.Log("Animations: " + turnResultMsg.currentState.Animations); applyAnimations(turnResultMsg.previousState, turnResultMsg.currentState, () => { nextState(turnResultMsg.currentState); }); break; case MsgTypes.GAME_START: var gameStartMessage = JsonUtility.FromJson <GameStartMessage>(message); nextState(gameStartMessage.gameState); break; default: addToActivityStream("Message unhandled: " + messageType); break; } }
private void ProcessTurn(PlayerTurnFinishMessage turn) { var attacker = lobbyManager.GetPlayerByName(turn.attackerName); var defender = lobbyManager.GetPlayerByName(turn.enemyName); var message = new TurnResultMessage(); int cardAttacking = GetCardAtPosition(attacker, turn.attackCardPosition, true); message.attackerCard = cardAttacking; message.attackerName = attacker.playerName; message.defenderName = defender.playerName; if (turn.attackingAce) { message.attackingAce = turn.attackingAce; defender.GameOver(); if (gameManager.PlayersAlive() == 1) { message.gameEnder = true; observer.ShowEndScreen(attacker.playerName); } SendTurnResultsToClients(attacker, defender, message); return; } message.attackCardPosition = turn.attackCardPosition; message.defenseCardPosition = turn.defenseCardPosition; message.bonusCardPosition = turn.bonusCardPosition; //atm hard-coded to be -7, cause it looks like a J if (turn.attackCardPosition == -7) { defender.discardPile.Add(defender.bonusField[turn.bonusCardPosition, 0]); defender.bonusField[turn.bonusCardPosition, 0] = 0; defender.bonusField[turn.bonusCardPosition, 1] = 0; attacker.discardPile.Add(attacker.GetAssassin()); attacker.RemoveAssassin(); } /*else if (turn.defenseCardPosition == -1 && turn.bonusCardPosition == -1) { * if (!defender.HasAnyDefenseCards()) { * defender.GameOver(); * } else { * gameManager.LogInfo("HEY HEY, NO CHEATERS AROUND HERE, OK?"); * //attacker.GameOver(); * } * }*/ else { //Regular attack on defense card int cardDefending = GetCardAtPosition(defender, turn.defenseCardPosition, false); message.defenderCard = cardDefending; message.attackerWon = (GetCardStrength(attacker, turn.attackCardPosition, true) > GetCardStrength(defender, turn.defenseCardPosition, false)); //gameManager.LogInfo(GetCardStrength(attacker, turn.attackCardPosition, true) + " == " + GetCardStrength(defender, turn.defenseCardPosition, false)); message.tie = (GetCardStrength(attacker, turn.attackCardPosition, true) == GetCardStrength(defender, turn.defenseCardPosition, false)); if (AceRules.Two_Kills_All) { if (cardAttacking == 2) { if (AceRules.Two_Suicide_Effect) { message.tie = true; } message.attackerWon = true; } else if (cardDefending == 2) { if (AceRules.Two_Suicide_Effect) { message.tie = true; } message.attackerWon = false; } } else { if (cardAttacking == 2 && cardDefending == 10) { message.attackerWon = true; if (AceRules.Two_Suicide_Effect) { message.tie = true; } } else if (cardDefending == 2 && cardAttacking == 10) { message.attackerWon = false; if (AceRules.Two_Suicide_Effect) { message.tie = true; } } } if (message.tie) { attacker.discardPile.Add(attacker.attackField[turn.attackCardPosition]); attacker.attackField[turn.attackCardPosition] = 0; defender.discardPile.Add(defender.defenseField[turn.defenseCardPosition]); defender.defenseField[turn.defenseCardPosition] = 0; } else if (defender.hasAce) { if (message.attackerWon) { defender.discardPile.Add(defender.defenseField[turn.defenseCardPosition]); defender.defenseField[turn.defenseCardPosition] = 0; } else { attacker.discardPile.Add(attacker.attackField[turn.attackCardPosition]); attacker.attackField[turn.attackCardPosition] = 0; } } } SendTurnResultsToClients(attacker, defender, message); }
public void ProcessBattleTurn(TurnResultMessage msg, string ourName) { //We divide this up in two parts, as the mobile variant can't witness the complete battle between two enemies if (msg.attackerName == ourName || msg.defenderName == ourName) { //Make sure the defender is looking at the attacker if (msg.defenderName == ourName) { battleField.DisplayEnemy(msg.attackerName); } if (msg.attackingAce) { if (msg.attackerName == ourName) { //Destroy(battleField.enemyAce.transform.GetChild(0)); CancelTurn(); if (msg.gameEnder) { gameOverText.text = "GOTTEM! You've offically {i}saved your ace{/i}!"; gameOver.SetActive(true); OnGameLoss.Invoke(); } else { waitingTurn.SetActive(true); skipTurn.SetActive(false); } } else { gameOverText.text = "Too bad! " + msg.attackerName + " de_stroyed your ace! \n\nF in chat boys"; gameOver.SetActive(true); OnGameLoss.Invoke(); } return; } //Display the relevant cards with the info List <CardDisplay> losingCards = new List <CardDisplay>(); //Sequence if we're the attacker if (msg.attackerName == ourName) { //Check whether we've just used a Joker/Boer/Assassin if (msg.attackCardPosition == -7) { //Get both bonus cards and flag them for removal losingCards.Add(GetAssassin(false)); losingCards.Add(battleField.GetBonusCard(msg.bonusCardPosition)); } else { //Otherwise check for both cards, removing both if its a tie OR only the losing one var defCard = battleField.GetDefenseCard(msg.defenseCardPosition); defCard.SetCard(msg.defenderCard); if (msg.tie) { losingCards.Add(defCard); losingCards.Add(attackField.transform.GetChild(msg.attackCardPosition).GetComponent <CardDisplay>()); } else { losingCards.Add(msg.attackerWon ? defCard : attackField.transform.GetChild(msg.attackCardPosition).GetComponent <CardDisplay>()); } } } else { if (msg.attackCardPosition == -7) { losingCards.Add(GetAssassin(true)); losingCards.Add(bonusField.transform.GetChild(msg.bonusCardPosition).GetComponent <CardDisplay>()); } else { var attCard = battleField.GetAttackCard(msg.attackCardPosition); attCard.SetCard(msg.attackerCard); if (msg.tie) { losingCards.Add(attCard); losingCards.Add(defenseField.transform.GetChild(msg.defenseCardPosition).GetComponent <CardDisplay>()); } else { losingCards.Add(msg.attackerWon ? defenseField.transform.GetChild(msg.defenseCardPosition).GetComponent <CardDisplay>() : attCard); } } } //Let the player see the relevant cards before removing them StartCoroutine(DelayedBattleResults(losingCards)); } else { //TODO: Process the actual changes into the OtherPlayers classes? //TODO: Make a logger if (msg.attackerWon) { Debug.Log(msg.attackerName + " attacked " + msg.defenderName + " and won! " + msg.defenderName + " loses their card in position " + msg.defenseCardPosition + "!"); } else { Debug.Log(msg.attackerName + " attacked " + msg.defenderName + " and lost! " + msg.attackerName + " loses their card in position " + msg.attackCardPosition + "!"); } } }