@Override public String getRule() { StringBuilder sb = new StringBuilder(); switch (targetController) { case YOU: sb.append("At the beginning of your next end step, "); break; case OPPONENT: sb.append("At the beginning of an opponent's next end step, "); break; case ANY: sb.append("At the beginning of the next end step, "); break; case CONTROLLER_ATTACHED_TO: sb.append("At the beginning of the next end step of enchanted creature's controller, "); break; } sb.append(getEffects().getText(modes.getMode())); return sb.toString(); } }
@Override public String getRule() { StringBuilder sb = new StringBuilder(); switch (targetController) { case YOU: return sb.append("At the beginning of your untap step, ").append(generateZoneString()).append(getEffects().getText(modes.getMode())).toString(); case NOT_YOU: return sb.append(getEffects().getText(modes.getMode())).append(" during each other player's untap step").append(generateZoneString()).toString(); case OPPONENT: return sb.append("At the beginning of each opponent's untap step, ").append(generateZoneString()).append(getEffects().getText(modes.getMode())).toString(); case ANY: return sb.append("At the beginning of each player's untap step, ").append(generateZoneString()).append(getEffects().getText(modes.getMode())).toString(); } return "BeginningOfUntapTriggeredAbility: targetController value not supported"; }
@Override public Effects getEffects() { return getModes().getMode().getEffects(); }
@Override public String getRule() { StringBuilder sb = new StringBuilder(); switch (targetController) { case YOU: sb.append("At the beginning of your ").append(phaseSelection.toString()).append(", "); break; case OPPONENT: sb.append("At the beginning of an opponent's ").append(phaseSelection.toString()).append(", "); break; case ANY: sb.append("At the beginning of the ").append(phaseSelection.toString()).append(", "); break; case CONTROLLER_ATTACHED_TO: sb.append("At the beginning of the ").append(phaseSelection.toString()).append(" of enchanted creature's controller, "); break; } sb.append(getEffects().getText(modes.getMode())); return sb.toString(); } }
@Override public String getRule() { StringBuilder sb = new StringBuilder(getEffects().getText(modes.getMode())); if (this.optional) { if (sb.substring(0, 6).toLowerCase(Locale.ENGLISH).equals("target")) { sb.insert(0, "you may have "); } else if (!sb.substring(0, 4).toLowerCase(Locale.ENGLISH).equals("you ")) { sb.insert(0, "you may "); } } String abilityWordRule = ""; if (abilityWord != null) { abilityWordRule = "<i>" + abilityWord.toString() + "</i> &mdash "; } switch (targetController) { case YOU: return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of your end step, ").toString(); case NEXT: return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of the end step, ").toString(); case OPPONENT: return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of each opponent's end step, ").toString(); case ANY: return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of each end step, ").toString(); case EACH_PLAYER: return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of each player's end step, ").toString(); case CONTROLLER_ATTACHED_TO: return sb.insert(0, generateConditionString()).insert(0, abilityWordRule + "At the beginning of the end step of enchanted permanent's controller, ").toString(); } return ""; }
@Override public String getRule() { switch (targetController) { case YOU: return "At the beginning of your postcombat main phase, " + generateZoneString() + getEffects().getText(modes.getMode()); case OPPONENT: return "At the beginning of each opponent's postcombat main phase, " + generateZoneString() + getEffects().getText(modes.getMode()); case ANY: return "At the beginning of each player's postcombat main phase, " + generateZoneString() + getEffects().getText(modes.getMode()); } return ""; }
@Override public String getRule() { switch (targetController) { case YOU: return "At the beginning of your precombat main phase, " + generateZoneString() + getEffects().getText(modes.getMode()); case OPPONENT: return "At the beginning of each opponent's precombat main phase, " + generateZoneString() + getEffects().getText(modes.getMode()); case ANY: return "At the beginning of each player's precombat main phase, " + generateZoneString() + getEffects().getText(modes.getMode()); } return ""; }
@Override public String getRule() { switch (targetController) { case YOU: return "At the beginning of your draw step, " + generateZoneString() + getEffects().getText(modes.getMode()); case OPPONENT: return "At the beginning of each opponent's draw step, " + generateZoneString() + getEffects().getText(modes.getMode()); case NOT_YOU: return "At the beginning of each other player's draw step, " + generateZoneString() + getEffects().getText(modes.getMode()); case ANY: return "At the beginning of each player's draw step, " + generateZoneString() + getEffects().getText(modes.getMode()); case CONTROLLER_ATTACHED_TO: return "At the beginning of the draw step of enchanted creature's controller, " + generateZoneString() + getEffects().getText(modes.getMode()); } return ""; }
public Modes(final Modes modes) { for (Map.Entry<UUID, Mode> entry : modes.entrySet()) { this.put(entry.getKey(), entry.getValue().copy()); } for (Map.Entry<UUID, Mode> entry : modes.duplicateModes.entrySet()) { this.put(entry.getKey(), entry.getValue().copy()); } this.minModes = modes.minModes; this.maxModes = modes.maxModes; this.selectedModes.addAll(modes.getSelectedModes()); if (modes.getSelectedModes().isEmpty()) { this.currentMode = values().iterator().next(); } else { this.currentMode = get(modes.getMode().getId()); } this.modeChooser = modes.modeChooser; this.eachModeOnlyOnce = modes.eachModeOnlyOnce; this.eachModeMoreThanOnce = modes.eachModeMoreThanOnce; this.optionalAdditionalModeSourceCosts = modes.optionalAdditionalModeSourceCosts; this.maxModesFilter = modes.maxModesFilter; // can't change so no copy needed }
@Override public Mode chooseMode(Modes modes, Ability source, Game game) { log.debug("chooseMode"); if (modes.getMode() != null && modes.getMaxModes() == modes.getSelectedModes().size()) { // mode was already set by the AI return modes.getMode(); } //TODO: improve this; AvailableMode: for (Mode mode : modes.getAvailableModes(source, game)) { for (UUID selectedModeId : modes.getSelectedModes()) { Mode selectedMode = modes.get(selectedModeId); if (selectedMode.getId().equals(mode.getId())) { continue AvailableMode; } } if (mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { // and where targets are available return mode; } } return null; }
public ExertAbility(BecomesExertSourceTriggeredAbility ability, boolean exertOnlyOncePerTurn) { super(Zone.BATTLEFIELD, new ExertReplacementEffect(exertOnlyOncePerTurn)); ruleText = (exertOnlyOncePerTurn ? "If {this} hasn't been exerted this turn, you may exert it" : "You may exert {this}") + " as it attacks. "; if (ability != null) { this.addSubAbility(ability); ruleText += "When you do,"; ability.getEffects().forEach(effect -> { ruleText += " " + effect.getText(ability.getModes().getMode()); }); ruleText += ". "; ability.setRuleVisible(false); } ruleText += "<i>(An exerted creature won't untap during your next untap step.)</i>"; if (exertOnlyOncePerTurn) { getWatchers().add(new ExertedThisTurnWatcher()); } }
@Override public boolean activateAbility(ActivatedAbility ability, Game game) { if (!isTestMode()) { // Test player already sends target event as he selects the target for (Target target : ability.getModes().getMode().getTargets()) { for (UUID targetId : target.getTargets()) { game.fireEvent(GameEvent.getEvent(EventType.TARGETED, targetId, ability.getId(), ability.getControllerId())); } } } return super.activateAbility(ability, game); }
logger.debug("AbilityImpl.resolve: effect returned false -" + effect.getText(this.getModes().getMode()));
String message; if (chooseUseText == null) { String effectText = executingEffects.getText(source.getModes().getMode()); message = "Pay " + cost.getText() + " to prevent (" + effectText.substring(0, effectText.length() - 1) + ")?"; } else {
String message; if (chooseUseText == null) { String effectText = executingEffects.getText(source.getModes().getMode()); message = "Pay " + cost.getText() + " to prevent (" + effectText.substring(0, effectText.length() - 1) + ")?"; } else {
@Override public void adjustTargets(Ability ability, Game game) { // adjust targets is called for every selected mode Mode mode = ability.getModes().getMode(); int xValue = ability.getManaCostsToPay().getX(); for (Effect effect : mode.getEffects()) { if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) { mode.getTargets().clear(); FilterCard filter = new FilterCreatureCard("creature card with converted mana cost " + xValue + " or less from your graveyard"); filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1)); mode.addTarget(new TargetCardInYourGraveyard(filter)); } if (effect instanceof GainAbilityTargetEffect) { mode.getTargets().clear(); FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain fear until end of turn"); mode.addTarget(new TargetCreaturePermanent(0, xValue, filter, false)); } } } }
String effectText = executingEffects.getText(source.getModes().getMode()); message = "Pay " + costToPay.getText() + " to prevent (" + effectText.substring(0, effectText.length() - 1) + ")?"; } else {
@Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(targetPointer.getFirst(game, source)); MageObject mageObject = game.getObject(source.getSourceId()); if (player != null && mageObject != null) { String message = userMessage; if (message == null) { message = getCostText() + " to prevent " + executingEffect.getText(source.getModes().getMode()) + '?'; } message = CardUtil.replaceSourceName(message, mageObject.getLogName()); cost.clearPaid(); if (cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(executingEffect.getOutcome(), message, source, game)) { cost.pay(source, game, source.getSourceId(), player.getId(), false, null); } if (!cost.isPaid()) { executingEffect.setTargetPointer(this.targetPointer); return executingEffect.apply(game, source); } return true; } return false; }