Trigger.whileKeywordCheck

This commit is contained in:
Northmoc
2023-11-29 12:12:58 -05:00
parent d0df73196b
commit b94a2868d8
3 changed files with 39 additions and 75 deletions

View File

@@ -27,11 +27,13 @@ import forge.game.ability.ApiType;
import forge.game.ability.effects.CharmEffect; import forge.game.ability.effects.CharmEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardState; import forge.game.card.CardState;
import forge.game.cost.IndividualCostPaymentInstance;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.OptionalCost; import forge.game.spellability.OptionalCost;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.CostPaymentStack;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.CardTranslation; import forge.util.CardTranslation;
import forge.util.Lang; import forge.util.Lang;
@@ -624,10 +626,33 @@ public abstract class Trigger extends TriggerReplacementBase {
overridingAbility0.setTrigger(this); overridingAbility0.setTrigger(this);
} }
boolean whileKeywordCheck(final String keyword, final SpellAbility sa) { boolean whileKeywordCheck(final String keyword, final Map<AbilityKey, Object> runParams) {
if (sa == null || sa.getHostCard() == null) return false; SpellAbility sa;
if (keyword.equals("Craft")) {
return sa.isAbility() && sa.isCraft(); IndividualCostPaymentInstance currentPayment =
} else return sa.isSpell() && sa.getHostCard().hasStartOfUnHiddenKeyword(keyword); (IndividualCostPaymentInstance) runParams.get(AbilityKey.IndividualCostPaymentInstance);
if (currentPayment != null) {
sa = currentPayment.getPayment().getAbility();
if (sa != null) {
if (whileKeywordSACheck(keyword, sa)) return true;
}
}
CostPaymentStack stack = (CostPaymentStack) runParams.get(AbilityKey.CostStack);
for (IndividualCostPaymentInstance individual : stack) {
sa = individual.getPayment().getAbility();
if (whileKeywordSACheck(keyword, sa)) return true;
}
return false;
} }
private boolean whileKeywordSACheck(final String keyword, final SpellAbility sa) {
if (sa == null || sa.getHostCard() == null) return false;
if (sa.isAbility()) {
if (keyword.equals("Craft") && sa.isCraft()) return true;
}
return sa.isSpell() && sa.getHostCard().hasStartOfUnHiddenKeyword(keyword);
}
} }

View File

@@ -19,8 +19,6 @@ package forge.game.trigger;
import java.util.Map; import java.util.Map;
import forge.game.cost.IndividualCostPaymentInstance;
import forge.game.zone.CostPaymentStack;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import forge.game.ability.AbilityKey; import forge.game.ability.AbilityKey;
@@ -79,33 +77,8 @@ public class TriggerExiled extends Trigger {
return false; return false;
} }
if (hasParam("WhileKeyword")) { if (hasParam("WhileKeyword") && !whileKeywordCheck(getParam("WhileKeyword"), runParams)) {
final String keyword = getParam("WhileKeyword"); return false;
boolean withKeyword = false;
IndividualCostPaymentInstance currentPayment = (IndividualCostPaymentInstance) runParams.get(AbilityKey.IndividualCostPaymentInstance);
SpellAbility sa;
if (currentPayment != null) {
sa = currentPayment.getPayment().getAbility();
if (whileKeywordCheck(keyword, sa)) withKeyword = true;
}
if (!withKeyword) {
CostPaymentStack stack = (CostPaymentStack) runParams.get(AbilityKey.CostStack);
for (IndividualCostPaymentInstance individual : stack) {
sa = individual.getPayment().getAbility();
if (whileKeywordCheck(keyword, sa)) {
withKeyword = true;
break;
}
}
}
if (!withKeyword) return false;
} }
return true; return true;
@@ -119,9 +92,7 @@ public class TriggerExiled extends Trigger {
@Override @Override
public String getImportantStackObjects(SpellAbility sa) { public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder(); return Localizer.getInstance().getMessage("lblExiled") + ": " + sa.getTriggeringObject(AbilityKey.Card);
sb.append(Localizer.getInstance().getMessage("lblExiled")).append(": ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
} }
} }

View File

@@ -17,15 +17,13 @@
*/ */
package forge.game.trigger; package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey; import forge.game.ability.AbilityKey;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.cost.IndividualCostPaymentInstance;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.CostPaymentStack;
import forge.util.Localizer; import forge.util.Localizer;
import java.util.Map;
/** /**
* <p> * <p>
* Trigger_Sacrificed class. * Trigger_Sacrificed class.
@@ -65,37 +63,8 @@ public class TriggerSacrificed extends Trigger {
if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) {
return false; return false;
} }
if (hasParam("WhileKeyword") && !whileKeywordCheck(getParam("WhileKeyword"), runParams)) {
if (hasParam("WhileKeyword")) { return false;
final String keyword = getParam("WhileKeyword");
boolean withKeyword = false;
// When cast with Emerge, the cost instance is there
IndividualCostPaymentInstance currentPayment = (IndividualCostPaymentInstance) runParams.get(AbilityKey.IndividualCostPaymentInstance);
SpellAbility sa;
if (currentPayment != null) {
sa = currentPayment.getPayment().getAbility();
if (whileKeywordCheck(keyword, sa)) withKeyword = true;
}
if (!withKeyword) {
// When done for another card to get the Mana, the Emerge card is there
CostPaymentStack stack = (CostPaymentStack) runParams.get(AbilityKey.CostStack);
for (IndividualCostPaymentInstance individual : stack) {
sa = individual.getPayment().getAbility();
if (whileKeywordCheck(keyword, sa)) {
withKeyword = true;
break;
}
}
}
if (!withKeyword)
return false;
} }
return true; return true;
@@ -109,9 +78,8 @@ public class TriggerSacrificed extends Trigger {
@Override @Override
public String getImportantStackObjects(SpellAbility sa) { public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder(); return Localizer.getInstance().getMessage("lblSacrificed") + ": " +
sb.append(Localizer.getInstance().getMessage("lblSacrificed")).append(": ").append(sa.getTriggeringObject(AbilityKey.Card)); sa.getTriggeringObject(AbilityKey.Card);
return sb.toString();
} }
} }