public bool HandleCardPlay(Player p, ISkill skill, List<Card> cards, List<Player> targets)
{
Trace.Assert(cards != null);
CardsMovement m = new CardsMovement();
ICard result;
bool status = CommitCardTransform(p, skill, cards, out result, targets, true);
if (!status)
{
return false;
}
if (skill != null)
{
var r = result as CompositeCard;
Trace.Assert(r != null);
cards.Clear();
cards.AddRange(r.Subcards);
}
m.Cards = new List<Card>(cards);
m.To = new DeckPlace(null, DeckType.Discard);
Player isDoingAFavor = p;
foreach (var checkFavor in m.Cards)
{
if (checkFavor.Owner != p)
{
Trace.TraceInformation("Acting on behalf of others");
isDoingAFavor = checkFavor.Owner;
break;
}
}
result.Type.TagAndNotify(p, targets, result, GameAction.Play);
List<Card> backup = new List<Card>(m.Cards);
if (isDoingAFavor != p)
{
PlayerAboutToDiscardCard(isDoingAFavor, m.Cards, DiscardReason.Play);
MoveCards(m, false, GameDelays.PlayerAction);
PlayerLostCard(p, m.Cards);
PlayerPlayedCard(isDoingAFavor, targets, result);
PlayerPlayedCard(p, targets, result);
PlayerDiscardedCard(isDoingAFavor, backup, DiscardReason.Play);
}
else
{
PlayerAboutToDiscardCard(p, m.Cards, DiscardReason.Play);
MoveCards(m, false, GameDelays.PlayerAction);
PlayerLostCard(p, m.Cards);
PlayerPlayedCard(p, targets, result);
PlayerDiscardedCard(p, backup, DiscardReason.Play);
}
Game.CurrentGame.LastAction = skill;
return true;
}