private BoardCard CreateBoardCard(WorkingCard card) { GameObject go; BoardCard boardCard; switch (card.LibraryCard.CardKind) { case Enumerators.CardKind.CREATURE: go = Object.Instantiate(CreatureCardViewPrefab); boardCard = new UnitBoardCard(go); break; case Enumerators.CardKind.SPELL: go = Object.Instantiate(SpellCardViewPrefab); boardCard = new SpellBoardCard(go); break; default: throw new ArgumentOutOfRangeException(); } boardCard.Init(card); boardCard.CurrentTurn = _battlegroundController.CurrentTurn; HandBoardCard handCard = new HandBoardCard(go, boardCard); handCard.OwnerPlayer = card.Owner; handCard.BoardZone = _playerBoard; boardCard.HandBoardCard = handCard; handCard.CheckStatusOfHighlight(); boardCard.Transform.localScale = Vector3.one * .3f; _abilitiesController.CallAbilitiesInHand(boardCard, card); return(boardCard); }
public void CallAbility( Card libraryCard, BoardCard card, WorkingCard workingCard, Enumerators.CardKind kind, object boardObject, Action <BoardCard> action, bool isPlayer, Action onCompleteCallback, object target = null, HandBoardCard handCard = null) { ResolveAllAbilitiesOnUnit(boardObject, false); bool canUseAbility = false; ActiveAbility activeAbility = null; foreach (AbilityData item in libraryCard.Abilities) { // todo improve it bcoz can have queue of abilities with targets activeAbility = CreateActiveAbility(item, kind, boardObject, workingCard.Owner, libraryCard, workingCard); if (IsAbilityCanActivateTargetAtStart(item)) { canUseAbility = true; } else { activeAbility.Ability.Activate(); } } if (kind == Enumerators.CardKind.SPELL) { } else { workingCard.Owner.RemoveCardFromHand(workingCard); workingCard.Owner.AddCardToBoard(workingCard); } if (kind == Enumerators.CardKind.SPELL) { if (handCard != null && isPlayer) { handCard.GameObject.SetActive(false); } } if (canUseAbility) { AbilityData ability = libraryCard.Abilities.Find(x => IsAbilityCanActivateTargetAtStart(x)); if (ability.TargetCardType != Enumerators.CardType.NONE && !HasSpecialUnitOnBoard(workingCard, ability) || ability.TargetUnitStatusType != Enumerators.UnitStatusType.NONE && !HasSpecialUnitStatusOnBoard(workingCard, ability)) { CallPermanentAbilityAction(isPlayer, action, card, target, activeAbility, kind); onCompleteCallback?.Invoke(); ResolveAllAbilitiesOnUnit(boardObject); return; } if (CheckActivateAvailability(kind, ability, workingCard.Owner)) { activeAbility.Ability.Activate(); if (isPlayer) { activeAbility.Ability.ActivateSelectTarget( callback: () => { if (kind == Enumerators.CardKind.SPELL && isPlayer) { card.WorkingCard.Owner.Goo -= card.ManaCost; _tutorialManager.ReportAction(Enumerators.TutorialReportAction.MOVE_CARD); handCard.GameObject.SetActive(true); card.RemoveCardParticle.Play(); // move it when card should call hide action workingCard.Owner.RemoveCardFromHand(workingCard, true); workingCard.Owner.AddCardToBoard(workingCard); GameClient.Get <ITimerManager>().AddTimer(_cardsController.RemoveCard, new object[] { card }, 0.5f); GameClient.Get <ITimerManager>().AddTimer( creat => { workingCard.Owner.GraveyardCardsCount++; _actionsQueueController.PostGameActionReport( _actionsQueueController.FormatGameActionReport( Enumerators.ActionType.PLAY_SPELL_CARD, new object[] { workingCard.Owner, card })); }, null, 1.5f); } action?.Invoke(card); onCompleteCallback?.Invoke(); ResolveAllAbilitiesOnUnit(boardObject); }, failedCallback: () => { if (kind == Enumerators.CardKind.SPELL && isPlayer) { handCard.GameObject.SetActive(true); handCard.ResetToHandAnimation(); handCard.CheckStatusOfHighlight(); workingCard.Owner.CardsInHand.Add(card.WorkingCard); _battlegroundController.PlayerHandCards.Add(card); _battlegroundController.UpdatePositionOfCardsInPlayerHand(); _playerController.IsCardSelected = false; } else { Debug.Log("RETURN CARD TO HAND MAYBE.. SHOULD BE CASE !!!!!"); action?.Invoke(card); } onCompleteCallback?.Invoke(); ResolveAllAbilitiesOnUnit(boardObject); }); } else { switch (target) { case BoardUnit unit: activeAbility.Ability.TargetUnit = unit; break; case Player player: activeAbility.Ability.TargetPlayer = player; break; } activeAbility.Ability.SelectedTargetAction(true); _battlegroundController.UpdatePositionOfBoardUnitsOfPlayer(_gameplayManager.CurrentPlayer .BoardCards); _battlegroundController.UpdatePositionOfBoardUnitsOfOpponent(); onCompleteCallback?.Invoke(); ResolveAllAbilitiesOnUnit(boardObject); } } else { CallPermanentAbilityAction(isPlayer, action, card, target, activeAbility, kind); onCompleteCallback?.Invoke(); ResolveAllAbilitiesOnUnit(boardObject); } } else { CallPermanentAbilityAction(isPlayer, action, card, target, activeAbility, kind); onCompleteCallback?.Invoke(); ResolveAllAbilitiesOnUnit(boardObject); } }