using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
using UnityEngine;
public partial class CardEffectFactory
{
#region Trigger effect of Link
///
/// Linking 1 digimon in hand/field to another digimon
///
/// card being linked
/// cost for link
/// DP buff
/// condition for you to be able to link
/// Any permaent condtion for you to link to
/// Mike Bunch
public static ActivateClass LinkEffect(CardSource card, Func condition = null)
{
if (card == null) return null;
if (!CardEffectCommons.IsOwnerTurn(card)) return null;
if (!CardEffectCommons.IsExistOnHand(card) && !CardEffectCommons.IsExistOnBattleAreaDigimon(card)) return null;
if (!CardEffectCommons.HasMatchConditionPermanent(CanSelectPermanentCondition)) return null;
ActivateClass activateClass = new ActivateClass();
activateClass.SetUpICardEffect($"Link (Cost: {card.linkCondition.cost})", CanUseCondition, card);
activateClass.SetUpActivateClass(null, ActivateCoroutine, -1, true, DataBase.LinkEffectDiscription());
bool CanSelectPermanentCondition(Permanent permanent)
{
if (CardEffectCommons.IsPermanentExistsOnOwnerBattleArea(permanent, card))
{
if(permanent != card.PermanentOfThisCard())
{
if (permanent.IsDigimon)
{
if (card.linkCondition == null || card.linkCondition.digimonCondition(permanent))
{
return true;
}
}
}
}
return false;
}
bool CanUseCondition(Hashtable hashtable)
{
if (CardEffectCommons.IsExistOnHand(card) || (CardEffectCommons.IsExistOnBattleAreaDigimon(card) && !card.IsLinked))
{
if (CardEffectCommons.HasMatchConditionPermanent(CanSelectPermanentCondition))
{
if (condition == null || condition())
{
return true;
}
}
}
return false;
}
IEnumerator ActivateCoroutine(Hashtable _hashtable)
{
Permanent selectedPermanent = null;
int maxCount = Math.Min(1, CardEffectCommons.MatchConditionPermanentCount(CanSelectPermanentCondition));
SelectPermanentEffect selectPermanentEffect = GManager.instance.GetComponent();
selectPermanentEffect.SetUp(
selectPlayer: card.Owner,
canTargetCondition: CanSelectPermanentCondition,
canTargetCondition_ByPreSelecetedList: null,
canEndSelectCondition: null,
maxCount: maxCount,
canNoSelect: false,
canEndNotMax: false,
selectPermanentCoroutine: SelectPermanentCoroutine,
afterSelectPermanentCoroutine: null,
mode: SelectPermanentEffect.Mode.Custom,
cardEffect: activateClass);
selectPermanentEffect.SetUpCustomMessage("Select 1 Digimon to link.", "The opponent is selecting 1 Digimon to link.");
yield return ContinuousController.instance.StartCoroutine(selectPermanentEffect.Activate());
IEnumerator SelectPermanentCoroutine(Permanent permanent)
{
selectedPermanent = permanent;
yield return null;
}
if (selectedPermanent != null)
{
yield return ContinuousController.instance.StartCoroutine(new ILinkCard(true, card, selectedPermanent, activateClass).LinkCard());
}
}
return activateClass;
}
#endregion
#region Granted Link Cost Reduction
public static ChangeLinkCostClass GrantedReduceLinkCostClass(CardSource card, int reducedCost, Func cardSourceCondition, Func permanentCondition, Func rootCondition)
{
return ReduceLinkCostClass(card, _ => true, false, false, reducedCost, cardSourceCondition, permanentCondition, rootCondition);
}
#endregion
#region Get when would link granted cost reduction
public static ChangeLinkCostClass GrantedChangeLinkCostClass(CardSource card, string effectName, Func changeCostFunc, Func cardSourceCondition, Func permanentCondition, Func rootCondition, Func isUpDown)
{
return ChangeLinkCostClass(card, _ => true, effectName, false, false, changeCostFunc, cardSourceCondition, permanentCondition, rootCondition, isUpDown);
}
#endregion
#region GetChangeLinkCostClass
public static ChangeLinkCostClass ChangeLinkCostClass(CardSource card, Func canUseCondition, string effectName, bool isInheritedEffect, bool isOptional, Func changeCostFunc, Func cardSourceCondition, Func permanentCondition, Func rootCondition, Func isUpDown)
{
ChangeLinkCostClass changeLinkCostClass = new ();
changeLinkCostClass.SetUpICardEffect(effectName, canUseCondition, card);
changeLinkCostClass.SetUpChangeLinkCostClass(changeCostFunc, cardSourceCondition, permanentCondition, rootCondition, isUpDown);
changeLinkCostClass.SetNotShowUI(isOptional);
changeLinkCostClass.SetIsInheritedEffect(isInheritedEffect);
return changeLinkCostClass;
}
#endregion
#region GetChangeLinkCostClass for Cost Reduction
public static ChangeLinkCostClass ReduceLinkCostClass(CardSource card, Func canUseCondition, bool isInheritedEffect, bool isOptional, int reducedCost, Func cardSourceCondition, Func permanentCondition, Func rootCondition)
{
return ChangeLinkCostClass(card, canUseCondition, $"Link Cost -{reducedCost}", isInheritedEffect, isOptional, ChangeCost, cardSourceCondition, permanentCondition, rootCondition, () => true);
int ChangeCost(CardSource cardSource, Permanent targetPermanent, int Cost, SelectCardEffect.Root root)
{
if (cardSourceCondition(cardSource))
{
if (rootCondition(root))
{
if (permanentCondition(targetPermanent))
{
Cost -= reducedCost;
}
}
}
return Cost;
}
}
#endregion
}