/// <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> /// 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> /// Spawns new unit and adds it to dictionary. /// </summary> /// <param name="message"></param> private void SpawnUnit(MatchMessageUnitSpawned message) { CardType cardType = message.Card.GetCardInfo().CardType; Node node = Scene02BattleController.Instance.Nodes[message.NodeX, message.NodeY]; PlayerColor player = message.OwnerId == _connection.Session.UserId ? PlayerColor.Black : PlayerColor.Red; int id = message.UnitId; Quaternion rotation; if (_connection.BattleConnection.HostId == _connection.Session.UserId) { rotation = player == PlayerColor.Black ? Quaternion.Euler(0, 90, 0) : Quaternion.Euler(0, -90, 0); } else { rotation = player == PlayerColor.Black ? Quaternion.Euler(0, -90, 0) : Quaternion.Euler(0, 90, 0); } GameObject prefab = Resources.Load <GameObject>("Units/" + cardType.ToString() + "_" + player.ToString()); Unit unit = GameObject.Instantiate(prefab, node.transform.position, rotation).GetComponent <Unit>(); if (unit) { string ownerId = message.OwnerId; unit.Init(player, ownerId, id, node, message.Card); _units[player].Add(id, unit); unit.OnAfterDestroyed += HandleAfterUnitDestroyed; } UnitAI unitAI = unit.GetComponent <UnitAI>(); if (unitAI != null) { unitAI.Init(_stateManager, this, _connection.BattleConnection.HostId == _connection.Session.UserId); } else { Debug.LogWarning("Could not initialize null UnitAI"); } if (OnAfterUnitInstantiated != null) { OnAfterUnitInstantiated(unit); } }
/// <summary> /// Builds forts at the start of the game. /// </summary> /// <param name="userId"></param> public void BuildStartingStructures(string userId) { bool isHost = userId == _connection.BattleConnection.HostId; CardData fortCard = new CardData() { type = CardType.Fort, level = 1 }; CardData mainFortCard = new CardData() { type = CardType.MainFort, level = 1 }; int fortX = isHost ? 4 : 10; int mainFortX = isHost ? 2 : 12; var playerColor = isHost ? PlayerColor.Black : PlayerColor.Red; MatchMessageUnitSpawned fortTop = new MatchMessageUnitSpawned( userId, playerColor, _nextId++, fortCard, fortX, 10); MatchMessageUnitSpawned fortBot = new MatchMessageUnitSpawned( userId, playerColor, _nextId++, fortCard, fortX, 2); MatchMessageUnitSpawned fortMain = new MatchMessageUnitSpawned( userId, playerColor, _nextId++, mainFortCard, mainFortX, 6); _stateManager.SendMatchStateMessage(MatchMessageType.UnitSpawned, fortTop); _stateManager.SendMatchStateMessage(MatchMessageType.UnitSpawned, fortBot); _stateManager.SendMatchStateMessage(MatchMessageType.UnitSpawned, fortMain); _stateManager.SendMatchStateMessageSelf(MatchMessageType.UnitSpawned, fortTop); _stateManager.SendMatchStateMessageSelf(MatchMessageType.UnitSpawned, fortBot); _stateManager.SendMatchStateMessageSelf(MatchMessageType.UnitSpawned, fortMain); Unit tower2 = _units[playerColor][_nextId - 3]; Unit tower1 = _units[playerColor][_nextId - 2]; Unit castle = _units[playerColor][_nextId - 1]; }