Evidence abilities - added improved card hint with available evidence to collect

This commit is contained in:
Oleg Agafonov 2024-06-25 10:30:50 +04:00
parent e507627dae
commit e7b8eecd64
4 changed files with 53 additions and 7 deletions

View file

@ -47,14 +47,21 @@ public class CollectEvidenceCost extends CostImpl {
@Override @Override
public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) {
return getAvailableEvidence(controllerId, game) >= amount;
}
public static int getAvailableEvidence(UUID controllerId, Game game) {
Player player = game.getPlayer(controllerId); Player player = game.getPlayer(controllerId);
return player != null && player if (player == null) {
return 0;
}
return player
.getGraveyard() .getGraveyard()
.getCards(game) .getCards(game)
.stream() .stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)
.mapToInt(MageObject::getManaValue) .mapToInt(MageObject::getManaValue)
.sum() >= amount; .sum();
} }
@Override @Override

View file

@ -0,0 +1,39 @@
package mage.abilities.hint.common;
import mage.abilities.Ability;
import mage.abilities.condition.common.CollectedEvidenceCondition;
import mage.abilities.costs.common.CollectEvidenceCost;
import mage.abilities.hint.ConditionHint;
import mage.game.Game;
/**
* @author JayDi85
*/
public class EvidenceHint extends ConditionHint {
private final int needAmount;
public EvidenceHint(int needAmount) {
super(CollectedEvidenceCondition.instance, "evidence was collected");
this.needAmount = needAmount;
}
private EvidenceHint(final EvidenceHint hint) {
super(hint);
this.needAmount = hint.needAmount;
}
@Override
public String getText(Game game, Ability ability) {
return String.format("%s (need: %d, can collect: %d)",
super.getText(game, ability),
this.needAmount,
CollectEvidenceCost.getAvailableEvidence(ability.getControllerId(), game)
);
}
@Override
public EvidenceHint copy() {
return new EvidenceHint(this);
}
}

View file

@ -3,11 +3,9 @@ package mage.abilities.keyword;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.SpellAbility; import mage.abilities.SpellAbility;
import mage.abilities.StaticAbility; import mage.abilities.StaticAbility;
import mage.abilities.condition.common.CollectedEvidenceCondition;
import mage.abilities.costs.*; import mage.abilities.costs.*;
import mage.abilities.costs.common.CollectEvidenceCost; import mage.abilities.costs.common.CollectEvidenceCost;
import mage.abilities.hint.ConditionTrueHint; import mage.abilities.hint.common.EvidenceHint;
import mage.abilities.hint.Hint;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
@ -28,7 +26,7 @@ public class CollectEvidenceAbility extends StaticAbility implements OptionalAdd
protected OptionalAdditionalCost additionalCost; protected OptionalAdditionalCost additionalCost;
private static final Hint hint = new ConditionTrueHint(CollectedEvidenceCondition.instance, "evidence was collected"); //private static final Hint hint = new ConditionHint(CollectedEvidenceCondition.instance, "evidence was collected");
public static OptionalAdditionalCost makeCost(int amount) { public static OptionalAdditionalCost makeCost(int amount) {
OptionalAdditionalCost cost = new OptionalAdditionalCostImpl( OptionalAdditionalCost cost = new OptionalAdditionalCostImpl(
@ -43,12 +41,13 @@ public class CollectEvidenceAbility extends StaticAbility implements OptionalAdd
public CollectEvidenceAbility(int amount) { public CollectEvidenceAbility(int amount) {
this(amount, null); this(amount, null);
} }
public CollectEvidenceAbility(int amount, String extraInfoText) { public CollectEvidenceAbility(int amount, String extraInfoText) {
super(Zone.STACK, null); super(Zone.STACK, null);
this.additionalCost = makeCost(amount); this.additionalCost = makeCost(amount);
this.rule = additionalCost.getName() + ". " + (extraInfoText == null ? "" : extraInfoText + ". ") + additionalCost.getReminderText(); this.rule = additionalCost.getName() + ". " + (extraInfoText == null ? "" : extraInfoText + ". ") + additionalCost.getReminderText();
this.setRuleAtTheTop(true); this.setRuleAtTheTop(true);
this.addHint(hint); this.addHint(new EvidenceHint(amount));
this.amount = amount; this.amount = amount;
} }

View file

@ -1241,6 +1241,7 @@ public final class CardUtil {
} }
// restrict hints only for permanents, not cards // restrict hints only for permanents, not cards
// total hints // total hints
if (!abilityHints.isEmpty()) { if (!abilityHints.isEmpty()) {
rules.add(HintUtils.HINT_START_MARK); rules.add(HintUtils.HINT_START_MARK);