Combine GoldenArgosyWatcher's function into CrewedVehicleWatcher to reduce duplicated code. Also refactor getCrewers to remove usage of deprecated MOR constructor.

This commit is contained in:
Grath 2024-09-08 12:45:36 -04:00
parent cbec029622
commit 624cb3fc30
2 changed files with 18 additions and 49 deletions

View file

@ -1,7 +1,6 @@
package mage.cards.g; package mage.cards.g;
import mage.MageInt; import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
@ -14,14 +13,12 @@ import mage.cards.Cards;
import mage.cards.CardsImpl; import mage.cards.CardsImpl;
import mage.constants.*; import mage.constants.*;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.targetpointer.FixedTargets; import mage.target.targetpointer.FixedTargets;
import mage.watchers.Watcher; import mage.watchers.common.CrewedVehicleWatcher;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* @author TheElk801 * @author TheElk801
@ -37,7 +34,7 @@ public final class GoldenArgosy extends CardImpl {
this.toughness = new MageInt(6); this.toughness = new MageInt(6);
// Whenever Golden Argosy attacks, exile each creature that crewed it this turn. Return them to the battlefield tapped under their owner's control at the beginning of the next end step. // Whenever Golden Argosy attacks, exile each creature that crewed it this turn. Return them to the battlefield tapped under their owner's control at the beginning of the next end step.
this.addAbility(new AttacksTriggeredAbility(new GoldenArgosyEffect()), new GoldenArgosyWatcher()); this.addAbility(new AttacksTriggeredAbility(new GoldenArgosyEffect()), new CrewedVehicleWatcher());
// Crew 1 // Crew 1
this.addAbility(new CrewAbility(1)); this.addAbility(new CrewAbility(1));
@ -73,10 +70,11 @@ class GoldenArgosyEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(source.getControllerId());
if (player == null) { Permanent vehicle = game.getPermanent(source.getSourceId());
if (player == null || vehicle == null) {
return false; return false;
} }
Cards cards = new CardsImpl(GoldenArgosyWatcher.getCrewers(source, game)); Cards cards = new CardsImpl(CrewedVehicleWatcher.getCrewers(vehicle, game));
if (cards.isEmpty()) { if (cards.isEmpty()) {
return false; return false;
} }
@ -90,45 +88,3 @@ class GoldenArgosyEffect extends OneShotEffect {
return true; return true;
} }
} }
class GoldenArgosyWatcher extends Watcher {
private final Map<MageObjectReference, Set<MageObjectReference>> crewMap = new HashMap<>();
GoldenArgosyWatcher() {
super(WatcherScope.GAME);
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() != GameEvent.EventType.CREWED_VEHICLE) {
return;
}
Permanent vehicle = game.getPermanent(event.getSourceId());
Permanent crewer = game.getPermanent(event.getTargetId());
if (vehicle == null) {
return;
}
crewMap.computeIfAbsent(
new MageObjectReference(vehicle, game), x -> new HashSet<>()
).add(new MageObjectReference(crewer, game));
}
@Override
public void reset() {
super.reset();
crewMap.clear();
}
static Set<Permanent> getCrewers(Ability source, Game game) {
return game
.getState()
.getWatcher(GoldenArgosyWatcher.class)
.crewMap
.getOrDefault(new MageObjectReference(source), Collections.emptySet())
.stream()
.map(mor -> mor.getPermanent(game))
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}
}

View file

@ -8,6 +8,7 @@ import mage.game.permanent.Permanent;
import mage.watchers.Watcher; import mage.watchers.Watcher;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* @author TheElk801 * @author TheElk801
@ -52,4 +53,16 @@ public class CrewedVehicleWatcher extends Watcher {
.getOrDefault(new MageObjectReference(vehicle, game), Collections.emptySet()) .getOrDefault(new MageObjectReference(vehicle, game), Collections.emptySet())
.size(); .size();
} }
public static Set<Permanent> getCrewers(Permanent vehicle, Game game) {
return game
.getState()
.getWatcher(CrewedVehicleWatcher.class)
.crewMap
.getOrDefault(new MageObjectReference(vehicle, game), Collections.emptySet())
.stream()
.map(mor -> mor.getPermanent(game))
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}
} }