/// <summary> /// Resolves card playing, then spawns unit of given type /// </summary> /// <param name="message"></param> private void CardPlayed(MatchMessageCardPlayed message) { if (_connection.BattleConnection.HostId == _connection.Session.UserId) { MatchMessageUnitSpawned unitSpawned = null; switch (message.Card.CardData.type) { case CardType.BigShip: case CardType.AoEShip: case CardType.Boats: int id = _nextId + 1; PlayerColor color = message.PlayerId == _connection.BattleConnection.HostId ? PlayerColor.Black : PlayerColor.Red; unitSpawned = new MatchMessageUnitSpawned(message.PlayerId, color, id, message.Card.CardData, message.NodeX, message.NodeY); break; default: break; } if (unitSpawned != null) { _nextId += 1; _stateManager.SendMatchStateMessage(MatchMessageType.UnitSpawned, unitSpawned); _stateManager.SendMatchStateMessageSelf(MatchMessageType.UnitSpawned, unitSpawned); } } }
/// <summary> /// Activates spell object of type given in message on node given in message /// </summary> /// <param name="message"></param> private void ActivateSpell(MatchMessageCardPlayed message) { if (message.Card.CardData.type == CardType.Fireball) { GetNonactiveSpellOfType(SpellType.Fireball).Activate(Scene02BattleController.Instance.Nodes[message.NodeX, message.NodeY], message.PlayerId); } }
/// <summary> /// Removes played card grabber from the game. /// </summary> public void ResolveCardPlay(MatchMessageCardPlayed message) { CardGrabber grabber = _cardsInHand[message.CardSlotIndex]; grabber.Resolve(message); _cardsInHand.RemoveAt(message.CardSlotIndex); Destroy(grabber.gameObject); }
/// <summary> /// Reads match messages sent by other players, and fires locally events basing on opCode. /// </summary> /// <param name="opCode"></param> /// <param name="messageJson"></param> public void ReceiveMatchStateHandle(long opCode, string messageJson) { //Choosing which event should be invoked basing on opCode, then parsing json to MatchMessage class and firing event switch ((MatchMessageType)opCode) { //UNITS case MatchMessageType.UnitSpawned: MatchMessageUnitSpawned matchMessageUnitSpawned = MatchMessageUnitSpawned.Parse(messageJson); OnUnitSpawned?.Invoke(matchMessageUnitSpawned); break; case MatchMessageType.UnitMoved: MatchMessageUnitMoved matchMessageUnitMoved = MatchMessageUnitMoved.Parse(messageJson); OnUnitMoved?.Invoke(matchMessageUnitMoved); break; case MatchMessageType.UnitAttacked: MatchMessageUnitAttacked matchMessageUnitAttacked = MatchMessageUnitAttacked.Parse(messageJson); OnUnitAttacked?.Invoke(matchMessageUnitAttacked); break; //SPELLS case MatchMessageType.SpellActivated: MatchMessageSpellActivated matchMessageSpellActivated = MatchMessageSpellActivated.Parse(messageJson); OnSpellActivated?.Invoke(matchMessageSpellActivated); break; //CARDS case MatchMessageType.CardPlayRequest: if (_connection.BattleConnection.HostId == _connection.Account.User.Id) { MatchMessageCardPlayRequest matchMessageCardPlayRequest = MatchMessageCardPlayRequest.Parse(messageJson); OnCardRequested?.Invoke(matchMessageCardPlayRequest); } break; case MatchMessageType.CardPlayed: MatchMessageCardPlayed matchMessageCardPlayed = MatchMessageCardPlayed.Parse(messageJson); OnCardPlayed?.Invoke(matchMessageCardPlayed); break; case MatchMessageType.CardCanceled: MatchMessageCardCanceled matchMessageCardCancelled = MatchMessageCardCanceled.Parse(messageJson); OnCardCancelled?.Invoke(matchMessageCardCancelled); break; case MatchMessageType.StartingHand: MatchMessageStartingHand matchMessageStartingHand = MatchMessageStartingHand.Parse(messageJson); OnStartingHandReceived?.Invoke(matchMessageStartingHand); break; } }
/// <summary> /// Invoked whenever a card is played and it wan't canceled. /// Removes that card from its owner's hand and reduces their gold count by <see cref="CardInfo.Cost"/>. /// Card owner draws a new card from their deck. /// </summary> /// <param name="message"></param> private void OnCardPlayed(MatchMessageCardPlayed message) { if (message.PlayerId == _connection.Session.UserId) { SoundManager.Instance.PlayAudioClip(SoundConstants.CardDrop01); _localHandPanel.ResolveCardPlay(message); _localHandPanel.DrawCard(message.Card, message.CardSlotIndex); _localGold.ChangeGoldCount(-message.Card.CardData.GetCardInfo().Cost); } else if (_connection.BattleConnection.HostId == _connection.Session.UserId) { _opponentGold.ChangeGoldCount(-message.Card.CardData.GetCardInfo().Cost); } }
/// <summary> /// Requests card play. /// </summary> private void SendCardPlayedMessage(MatchMessageCardPlayRequest message, Hand userHand, Vector2Int nodePosition) { Card newCard = userHand.DrawCard(); var matchMessageCardPlayed = new MatchMessageCardPlayed( message.PlayerId, message.Card, message.CardSlotIndex, newCard, nodePosition.x, nodePosition.y); _stateManager.SendMatchStateMessage(MatchMessageType.CardPlayed, matchMessageCardPlayed); _stateManager.SendMatchStateMessageSelf(MatchMessageType.CardPlayed, matchMessageCardPlayed); }