improve DontUntapInControllersUntapStepAllEffect

This commit is contained in:
xenohedron 2023-10-12 22:35:18 -04:00
parent b3b2713ddf
commit 0081279d15
29 changed files with 67 additions and 141 deletions

View file

@ -1,9 +1,6 @@
package mage.abilities.effects.common;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.constants.Duration;
import mage.constants.Outcome;
@ -13,7 +10,6 @@ import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
* @author LevelX2
@ -21,13 +17,25 @@ import mage.players.Player;
public class DontUntapInControllersUntapStepAllEffect extends ContinuousRuleModifyingEffectImpl {
TargetController targetController;
FilterPermanent filter;
private final TargetController targetController;
private final FilterPermanent filter;
public DontUntapInControllersUntapStepAllEffect(Duration duration, TargetController targetController, FilterPermanent filter) {
super(duration, Outcome.Detriment, false, false);
this.targetController = targetController;
this.filter = filter;
String text = filter.getMessage() + " don't untap during ";
switch (targetController) {
case ANY:
text += "their controllers'";
break;
case YOU:
text += "your";
break;
default:
throw new IllegalArgumentException("TargetController not supported in DontUntapInControllersNextUntapStepAllEffect");
}
staticText = text + (duration == Duration.UntilYourNextTurn ? " next untap step" : " untap steps");
}
protected DontUntapInControllersUntapStepAllEffect(final DontUntapInControllersUntapStepAllEffect effect) {
@ -48,50 +56,23 @@ public class DontUntapInControllersUntapStepAllEffect extends ContinuousRuleModi
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (game.getTurnStepType() == PhaseStep.UNTAP) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null) {
switch (targetController) {
case YOU:
if (!permanent.isControlledBy(source.getControllerId())) {
return false;
}
break;
case OPPONENT:
Player controller = game.getPlayer(source.getControllerId());
if (controller != null && !game.isOpponent(controller, permanent.getControllerId())) {
return false;
}
break;
case ANY:
break;
default:
throw new RuntimeException("Type of TargetController not supported!");
}
if (game.isActivePlayer(permanent.getControllerId()) && // controller's untap step
filter.match(permanent, source.getControllerId(), source, game)) {
return true;
}
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (game.getTurnStepType() != PhaseStep.UNTAP || permanent == null) {
return false;
}
return false;
}
@Override
public String getText(Mode mode) {
if (!staticText.isEmpty()) {
return staticText;
}
StringBuilder sb = new StringBuilder(filter.getMessage()).append(" don't untap during ");
switch (targetController) {
case YOU:
if (!permanent.isControlledBy(source.getControllerId())) {
return false;
}
break;
case ANY:
sb.append("their controllers' ");
break;
default:
throw new RuntimeException("Type of TargetController not supported yet!");
throw new IllegalArgumentException("TargetController not supported in DontUntapInControllersNextUntapStepAllEffect");
}
sb.append("untap steps");
return sb.toString();
return game.isActivePlayer(permanent.getControllerId()) && // controller's untap step
filter.match(permanent, source.getControllerId(), source, game);
}
}