}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
Card card = game.getCard(source.getSourceId());
if (player != null && card != null) {
// remove temporary suspend ability (used e.g. for Epochrasite)
List<Ability> abilitiesToRemove = new ArrayList<>();
for (Ability ability : card.getAbilities()) {
if (ability instanceof SuspendAbility) {
if (((SuspendAbility)ability).isGainedTemporary()) {
abilitiesToRemove.add(ability);
}
}
}
if (!abilitiesToRemove.isEmpty()) {
for (Ability ability : card.getAbilities()) {
if (ability instanceof SuspendBeginningOfUpkeepTriggeredAbility || ability instanceof SuspendPlayCardAbility ) {
abilitiesToRemove.add(ability);
}
}
// remove the triggered abilities from the game
game.getState().resetTriggersForSourceId(card.getId());
// remove the continious effects from the game
game.getState().getContinuousEffects().removeGainedEffectsForSource(card.getId());
// remove the abilities from the card
card.getAbilities().removeAll(abilitiesToRemove);
}
// cast the card for free
return player.cast(card.getSpellAbility(), game, true);
}
return false;
}