refactor: simplify BeginningOfUpkeepTriggeredAbility (#13046)

* remove superfluous zone.battlefield

* remove redundant TargetController.YOU

* remove unneeded param

* simpler constructor with default optional false

* move to inheritance structure

remove setTargetPointer

* adjust

* align trigger phrase text

* add comments, fix param

* fix params and text

* fix params to fix text

* simplify

* package reorg
This commit is contained in:
xenohedron 2024-10-28 00:15:59 -04:00 committed by GitHub
parent eee0fee79e
commit 587a68a837
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
944 changed files with 2188 additions and 3009 deletions

View file

@ -1,127 +0,0 @@
package mage.abilities.common;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
/**
* @author Loki
*/
public class BeginningOfUpkeepTriggeredAbility extends TriggeredAbilityImpl {
private final TargetController targetController;
private final boolean setTargetPointer;
public BeginningOfUpkeepTriggeredAbility(Effect effect, TargetController targetController, boolean isOptional) {
this(Zone.BATTLEFIELD, effect, targetController, isOptional);
}
public BeginningOfUpkeepTriggeredAbility(Zone zone, Effect effect, TargetController targetController, boolean isOptional) {
this(zone, effect, targetController, isOptional, true);
}
public BeginningOfUpkeepTriggeredAbility(Zone zone, Effect effect, TargetController targetController, boolean isOptional, boolean setTargetPointer) {
super(zone, effect, isOptional);
this.targetController = targetController;
this.setTargetPointer = setTargetPointer;
setTriggerPhrase(generateTriggerPhrase());
}
protected BeginningOfUpkeepTriggeredAbility(final BeginningOfUpkeepTriggeredAbility ability) {
super(ability);
this.targetController = ability.targetController;
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public BeginningOfUpkeepTriggeredAbility copy() {
return new BeginningOfUpkeepTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours && setTargetPointer && getTargets().isEmpty()) {
this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return yours;
case NOT_YOU:
boolean notYours = !event.getPlayerId().equals(this.controllerId);
if (notYours && setTargetPointer && getTargets().isEmpty()) {
this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return notYours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (setTargetPointer && getTargets().isEmpty()) {
this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
break;
case ANY:
case ACTIVE:
case EACH_PLAYER:
if (setTargetPointer && getTargets().isEmpty()) {
this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.isControlledBy(event.getPlayerId())) {
if (setTargetPointer && getTargets().isEmpty()) {
this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
}
break;
case ENCHANTED:
Permanent permanent = getSourcePermanentIfItStillExists(game);
if (permanent == null || !game.isActivePlayer(permanent.getAttachedTo())) {
break;
}
if (setTargetPointer && getTargets().isEmpty()) {
this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
default:
throw new UnsupportedOperationException("Value for targetController not supported: " + targetController);
}
return false;
}
private String generateTriggerPhrase() {
switch (targetController) {
case YOU:
return "At the beginning of your upkeep, ";
case OPPONENT:
return "At the beginning of each opponent's upkeep, ";
case ANY:
case ACTIVE:
return "At the beginning of each player's upkeep, ";
case EACH_PLAYER:
return "At the beginning of each upkeep, ";
case CONTROLLER_ATTACHED_TO:
return "At the beginning of the upkeep of enchanted creature's controller, ";
case ENCHANTED:
return "At the beginning of enchanted player's upkeep, ";
}
return "";
}
}

View file

@ -10,7 +10,7 @@ import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.constants.TargetController;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate;
@ -41,7 +41,7 @@ public class SanctuaryInterveningIfTriggeredAbility extends ConditionalInterveni
private static TriggeredAbility makeTrigger(OneShotEffect effect1, OneShotEffect effect2, ObjectColor color1, ObjectColor color2) {
TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(
new ConditionalOneShotEffect(effect1, new InvertCondition(makeAndCondition(color1, color2))), TargetController.YOU, false
new ConditionalOneShotEffect(effect1, new InvertCondition(makeAndCondition(color1, color2)))
);
ability.addEffect(new ConditionalOneShotEffect(effect2, makeAndCondition(color1, color2)));
return ability;

View file

@ -2,6 +2,7 @@ package mage.abilities.common;
import mage.abilities.condition.common.TwoOrMoreSpellsWereCastLastTurnCondition;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.constants.TargetController;
import mage.game.Game;
@ -11,7 +12,7 @@ import mage.game.Game;
public class WerewolfBackTriggeredAbility extends BeginningOfUpkeepTriggeredAbility {
public WerewolfBackTriggeredAbility() {
super(new TransformSourceEffect(), TargetController.ANY, false);
super(TargetController.ANY, new TransformSourceEffect(), false);
}
private WerewolfBackTriggeredAbility(final WerewolfBackTriggeredAbility ability) {

View file

@ -2,6 +2,7 @@ package mage.abilities.common;
import mage.abilities.condition.common.NoSpellsWereCastLastTurnCondition;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.constants.TargetController;
import mage.game.Game;
@ -11,7 +12,7 @@ import mage.game.Game;
public class WerewolfFrontTriggeredAbility extends BeginningOfUpkeepTriggeredAbility {
public WerewolfFrontTriggeredAbility() {
super(new TransformSourceEffect(), TargetController.ANY, false);
super(TargetController.ANY, new TransformSourceEffect(), false);
}
private WerewolfFrontTriggeredAbility(final WerewolfFrontTriggeredAbility ability) {

View file

@ -1,7 +1,7 @@
package mage.abilities.keyword;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.costs.Cost;
import mage.abilities.costs.CostsImpl;
import mage.abilities.costs.OrCost;
@ -10,7 +10,6 @@ import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
@ -28,7 +27,7 @@ public class CumulativeUpkeepAbility extends BeginningOfUpkeepTriggeredAbility {
private final Cost cumulativeCost;
public CumulativeUpkeepAbility(Cost cumulativeCost) {
super(new AddCountersSourceEffect(CounterType.AGE.createInstance()), TargetController.YOU, false);
super(new AddCountersSourceEffect(CounterType.AGE.createInstance()));
this.addEffect(new CumulativeUpkeepEffect(cumulativeCost));
this.cumulativeCost = cumulativeCost;
}

View file

@ -1,14 +1,13 @@
package mage.abilities.keyword;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.Card;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
@ -30,7 +29,7 @@ public class FadingAbility extends EntersBattlefieldAbility {
public FadingAbility(int fadeCounter, Card card, boolean shortRuleText) {
super(new AddCountersSourceEffect(CounterType.FADE.createInstance(fadeCounter)), "with");
Ability ability = new BeginningOfUpkeepTriggeredAbility(new FadingEffect(), TargetController.YOU, false);
Ability ability = new BeginningOfUpkeepTriggeredAbility(new FadingEffect());
ability.setRuleVisible(false);
addSubAbility(ability);
String cardTypeName;

View file

@ -2,7 +2,7 @@ package mage.abilities.keyword;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect;
@ -31,7 +31,7 @@ public class RepairAbility extends DiesSourceTriggeredAbility {
super(new AddCountersSourceEffect(
CounterType.REPAIR.createInstance(), StaticValue.get(count), false, true));
addSubAbility(new BeginningOfUpkeepTriggeredAbility(Zone.GRAVEYARD,
new RemoveCounterSourceEffect(CounterType.REPAIR.createInstance()), TargetController.YOU, false)
TargetController.YOU, new RemoveCounterSourceEffect(CounterType.REPAIR.createInstance()), false)
.setRuleVisible(false));
addSubAbility(new RepairCastFromGraveyardTriggeredAbility());
this.count = count;

View file

@ -5,7 +5,7 @@ import mage.MageIdentifier;
import mage.abilities.Ability;
import mage.abilities.SpecialAction;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.condition.common.SuspendedCondition;
import mage.abilities.costs.VariableCostType;
import mage.abilities.costs.mana.ManaCost;
@ -430,8 +430,8 @@ class GainHasteEffect extends ContinuousEffectImpl {
class SuspendBeginningOfUpkeepInterveningIfTriggeredAbility extends ConditionalInterveningIfTriggeredAbility {
SuspendBeginningOfUpkeepInterveningIfTriggeredAbility() {
super(new BeginningOfUpkeepTriggeredAbility(Zone.EXILED, new RemoveCounterSourceEffect(CounterType.TIME.createInstance()),
TargetController.YOU, false),
super(new BeginningOfUpkeepTriggeredAbility(Zone.EXILED, TargetController.YOU, new RemoveCounterSourceEffect(CounterType.TIME.createInstance()),
false),
SuspendedCondition.instance,
"At the beginning of your upkeep, if {this} is suspended, remove a time counter from it.");
this.setRuleVisible(false);

View file

@ -1,7 +1,7 @@
package mage.abilities.keyword;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
@ -9,7 +9,6 @@ import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
@ -30,8 +29,7 @@ public class VanishingAbility extends EntersBattlefieldAbility {
this.amount = amount;
this.addSubAbility(new ConditionalInterveningIfTriggeredAbility(
new BeginningOfUpkeepTriggeredAbility(
new RemoveCounterSourceEffect(CounterType.TIME.createInstance()),
TargetController.YOU, false
new RemoveCounterSourceEffect(CounterType.TIME.createInstance()), false
), condition, "At the beginning of your upkeep, if this permanent " +
"has a time counter on it, remove a time counter from it."
).setRuleVisible(false));

View file

@ -0,0 +1,73 @@
package mage.abilities.triggers;
import mage.abilities.effects.Effect;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
/**
* @author Loki
*/
public class BeginningOfUpkeepTriggeredAbility extends AtStepTriggeredAbility {
/**
* At the beginning of your upkeep (optional = false)
*/
public BeginningOfUpkeepTriggeredAbility(Effect effect) {
this(effect, false);
}
/**
* At the beginning of your upkeep
*/
public BeginningOfUpkeepTriggeredAbility(Effect effect, boolean optional) {
this(TargetController.YOU, effect, optional);
}
public BeginningOfUpkeepTriggeredAbility(TargetController targetController, Effect effect, boolean optional) {
this(Zone.BATTLEFIELD, targetController, effect, optional);
}
public BeginningOfUpkeepTriggeredAbility(Zone zone, TargetController targetController, Effect effect, boolean optional) {
super(zone, targetController, effect, optional);
}
protected BeginningOfUpkeepTriggeredAbility(final BeginningOfUpkeepTriggeredAbility ability) {
super(ability);
}
@Override
public BeginningOfUpkeepTriggeredAbility copy() {
return new BeginningOfUpkeepTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE;
}
@Override
protected String generateTriggerPhrase() {
switch (targetController) {
case YOU:
return "At the beginning of your upkeep, ";
case NOT_YOU:
return "At the beginning of each other player's upkeep, ";
case OPPONENT:
return "At the beginning of each opponent's upkeep, ";
case ANY:
return "At the beginning of each upkeep, ";
case EACH_PLAYER:
return "At the beginning of each player's upkeep, ";
case CONTROLLER_ATTACHED_TO:
return "At the beginning of the upkeep of enchanted creature's controller, ";
case ENCHANTED:
return "At the beginning of enchanted player's upkeep, ";
default:
throw new UnsupportedOperationException("Unsupported TargetController in BeginningOfUpkeepTriggeredAbility: " + targetController);
}
}
}

View file

@ -1,6 +1,6 @@
package mage.game.command.emblems;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.common.DamageControllerEffect;
import mage.constants.TargetController;
import mage.constants.Zone;
@ -19,8 +19,8 @@ public final class ChandraAwakenedInfernoEmblem extends Emblem {
public ChandraAwakenedInfernoEmblem() {
super("Emblem Chandra");
this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(
Zone.COMMAND, new DamageControllerEffect(1, "this emblem"),
TargetController.YOU, false, true
Zone.COMMAND, TargetController.YOU, new DamageControllerEffect(1, "this emblem"),
false
));
}

View file

@ -1,6 +1,6 @@
package mage.game.command.emblems;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.constants.TargetController;
@ -21,7 +21,7 @@ public final class ChandraRoaringFlameEmblem extends Emblem {
super("Emblem Chandra");
Effect effect = new DamageTargetEffect(3);
effect.setText("this emblem deals 3 damage to you");
this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, effect, TargetController.YOU, false, true));
this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, TargetController.YOU, effect, false));
}
private ChandraRoaringFlameEmblem(final ChandraRoaringFlameEmblem card) {

View file

@ -1,7 +1,7 @@
package mage.game.command.emblems;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Cards;
import mage.cards.CardsImpl;
@ -31,8 +31,8 @@ public class KayaTheInexorableEmblem extends Emblem {
super("Emblem Kaya");
this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(
Zone.COMMAND, new KayaTheInexorableEmblemEffect(),
TargetController.YOU, true, false
Zone.COMMAND, TargetController.YOU, new KayaTheInexorableEmblemEffect(),
true
));
}

View file

@ -1,7 +1,7 @@
package mage.game.command.emblems;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.common.SacrificeEffect;
import mage.constants.TargetController;
import mage.constants.Zone;
@ -19,7 +19,7 @@ public final class SorinSolemnVisitorEmblem extends Emblem {
*/
public SorinSolemnVisitorEmblem() {
super("Emblem Sorin");
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "that player"), TargetController.OPPONENT, false, true);
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, TargetController.OPPONENT, new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "that player"), false);
this.getAbilities().add(ability);
}

View file

@ -2,7 +2,7 @@ package mage.game.command.planes;
import mage.abilities.Ability;
import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.MainPhaseStackEmptyCondition;
import mage.abilities.costs.mana.GenericManaCost;
@ -30,7 +30,7 @@ public class LetheLakePlane extends Plane {
this.setPlaneType(Planes.PLANE_LETHE_LAKE);
// At the beginning of your upkeep, put the top ten cards of your libary into your graveyard
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, new MillCardsTargetEffect(10).setText("that player mills 10 cards"), TargetController.ANY, false, true);
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, TargetController.ANY, new MillCardsTargetEffect(10).setText("that player mills 10 cards"), false);
this.getAbilities().add(ability);
// Active player can roll the planar die: Whenever you roll {CHAOS}, target player puts the top ten cards of their library into their graveyard

View file

@ -2,7 +2,7 @@ package mage.game.permanent.token;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.SacrificeControllerEffect;
@ -11,7 +11,6 @@ import mage.abilities.keyword.TrampleAbility;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
@ -32,7 +31,7 @@ public final class BelzenlokDemonToken extends TokenImpl {
toughness = new MageInt(6);
addAbility(FlyingAbility.getInstance());
addAbility(TrampleAbility.getInstance());
addAbility(new BeginningOfUpkeepTriggeredAbility(new BelzenlokDemonTokenEffect(), TargetController.YOU, false));
addAbility(new BeginningOfUpkeepTriggeredAbility(new BelzenlokDemonTokenEffect()));
}
private BelzenlokDemonToken(final BelzenlokDemonToken token) {

View file

@ -2,7 +2,7 @@ package mage.game.permanent.token;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
@ -25,7 +25,7 @@ public final class RekindlingPhoenixToken extends TokenImpl {
power = new MageInt(0);
toughness = new MageInt(1);
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new SacrificeSourceEffect(), TargetController.YOU, false);
Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect());
ability.addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect().setText("and return target card named Rekindling Phoenix from your graveyard to the battlefield"));
ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn).setText("It gains haste until end of turn"));
FilterCard filter = new FilterCard("card named Rekindling Phoenix from your graveyard");

View file

@ -1,14 +1,13 @@
package mage.game.permanent.token;
import mage.MageInt;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.DamageControllerEffect;
import mage.abilities.effects.common.combat.CantBlockSourceEffect;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.TargetController;
public final class RelicRobberToken extends TokenImpl {
@ -26,7 +25,7 @@ public final class RelicRobberToken extends TokenImpl {
));
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(
1, "this creature"
), TargetController.YOU, false));
)));
}
private RelicRobberToken(final RelicRobberToken token) {