diff --git a/Mage.Client/src/main/java/mage/client/cards/CardIconsPanelFactory.java b/Mage.Client/src/main/java/mage/client/cards/CardIconsPanelFactory.java index 7fee0c658b1..e8da3ebe24f 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardIconsPanelFactory.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardIconsPanelFactory.java @@ -38,7 +38,7 @@ public class CardIconsPanelFactory { CardIconPosition.TOP, CardIconOrder.CENTER, CardIconColor.RED, - 1, + 3, 30 * 2 // TODO: big size doesn't work due icons same size limits, see CardIconsPanel ); } diff --git a/Mage.Client/src/main/resources/card/icons/original/fontawesome/ring.svg b/Mage.Client/src/main/resources/card/icons/original/fontawesome/ring.svg new file mode 100644 index 00000000000..2d8374544c5 --- /dev/null +++ b/Mage.Client/src/main/resources/card/icons/original/fontawesome/ring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Mage.Client/src/main/resources/card/icons/prepared/ring.svg b/Mage.Client/src/main/resources/card/icons/prepared/ring.svg new file mode 100644 index 00000000000..67bbdbb287f --- /dev/null +++ b/Mage.Client/src/main/resources/card/icons/prepared/ring.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Mage.Common/src/main/java/mage/view/CardView.java b/Mage.Common/src/main/java/mage/view/CardView.java index 3d8ebb890eb..8ae3254f503 100644 --- a/Mage.Common/src/main/java/mage/view/CardView.java +++ b/Mage.Common/src/main/java/mage/view/CardView.java @@ -435,13 +435,17 @@ public class CardView extends SimpleCardView { if (permanent.isFaceDown(game)) { this.cardIcons.add(CardIconImpl.FACE_DOWN); } - // commander if (game != null) { Player owner = game.getPlayer(game.getOwnerId(permanent)); + // commander if (owner != null && game.isCommanderObject(owner, permanent)) { this.cardIcons.add(CardIconImpl.COMMANDER); } } + // Ring-bearer + if (permanent.isRingBearer()) { + this.cardIcons.add(CardIconImpl.RINGBEARER); + } } else { if (card.isCopy()) { this.mageObjectType = MageObjectType.COPY_CARD; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/ltr/WitchKingOfAngmarTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/ltr/WitchKingOfAngmarTest.java index 2a1d4f79b6d..bcb53908499 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/ltr/WitchKingOfAngmarTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/ltr/WitchKingOfAngmarTest.java @@ -29,9 +29,6 @@ public class WitchKingOfAngmarTest extends CardTestPlayerBase { // Choose which creature to sacrifice addTarget(playerB, watchwolf); - // The ring tempts you choice: - setChoice(playerA, witchKing); - setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index a5576902366..c4f031877af 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -53,6 +53,7 @@ import mage.util.RandomUtil; import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Ignore; +import static org.mage.test.serverside.base.impl.CardTestPlayerAPIImpl.*; import java.io.Serializable; import java.util.*; @@ -60,8 +61,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static org.mage.test.serverside.base.impl.CardTestPlayerAPIImpl.*; - /** * @author BetaSteward_at_googlemail.com * @author Simown @@ -4427,11 +4426,6 @@ public class TestPlayer implements Player { return computerPlayer.getPhyrexianColors(); } - @Override - public UUID getRingBearerId() { - return computerPlayer.getRingBearerId(); - } - @Override public Permanent getRingBearer(Game game) { return computerPlayer.getRingBearer(game); diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java index d434e329a66..5ad32770b25 100644 --- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java +++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java @@ -1419,11 +1419,6 @@ public class PlayerStub implements Player { return (new FilterMana()); } - @Override - public UUID getRingBearerId() { - return null; - } - @Override public Permanent getRingBearer(Game game) { return null; diff --git a/Mage/src/main/java/mage/abilities/condition/common/SourceIsRingBearerCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SourceIsRingBearerCondition.java index 045998c2a47..d62a85053cb 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/SourceIsRingBearerCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/SourceIsRingBearerCondition.java @@ -19,7 +19,7 @@ public enum SourceIsRingBearerCondition implements Condition { .ofNullable(source.getSourcePermanentIfItStillExists(game)) .filter(Objects::nonNull) .filter(permanent -> permanent.isControlledBy(source.getControllerId())) - .map(permanent -> permanent.isRingBearer(game)) + .map(permanent -> permanent.isRingBearer()) .orElse(false); } diff --git a/Mage/src/main/java/mage/abilities/icon/CardIconCategory.java b/Mage/src/main/java/mage/abilities/icon/CardIconCategory.java index 3b329805599..c17dc401766 100644 --- a/Mage/src/main/java/mage/abilities/icon/CardIconCategory.java +++ b/Mage/src/main/java/mage/abilities/icon/CardIconCategory.java @@ -10,5 +10,5 @@ public enum CardIconCategory { ABILITY, // example: flying (on left side) PLAYABLE_COUNT, // on bottom left corner SYSTEM, // example: too many icons combines in the one icon (on left side) - COMMANDER // example: commander (on top center icon) + COMMANDER, // example: commander (on top center icon) } diff --git a/Mage/src/main/java/mage/abilities/icon/CardIconColor.java b/Mage/src/main/java/mage/abilities/icon/CardIconColor.java index e01cc3a6d8d..034a98acc19 100644 --- a/Mage/src/main/java/mage/abilities/icon/CardIconColor.java +++ b/Mage/src/main/java/mage/abilities/icon/CardIconColor.java @@ -16,7 +16,8 @@ public enum CardIconColor { DEFAULT(), YELLOW(new Color(231, 203, 18), new Color(76, 76, 76), new Color(0, 0, 0)), - RED(new Color(255, 31, 75), new Color(76, 76, 76), new Color(229, 228, 228)); + RED(new Color(255, 31, 75), new Color(76, 76, 76), new Color(229, 228, 228)), + GOLD(new Color(186, 105, 19), new Color(76, 76, 76), new Color(229, 228, 228)); private final Color fillColor; private final Color strokeColor; diff --git a/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java b/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java index df045b630f7..e0c6d7d091e 100644 --- a/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java +++ b/Mage/src/main/java/mage/abilities/icon/CardIconImpl.java @@ -14,6 +14,7 @@ public class CardIconImpl implements CardIcon, Serializable { // Utility Icons public static final CardIconImpl FACE_DOWN = new CardIconImpl(CardIconType.OTHER_FACEDOWN, "Card is face down"); public static final CardIconImpl COMMANDER = new CardIconImpl(CardIconType.COMMANDER, "Card is commander"); + public static final CardIconImpl RINGBEARER = new CardIconImpl(CardIconType.RINGBEARER, "Ring-bearer"); // Ability Icons public static final CardIconImpl ABILITY_CREW = new CardIconImpl(CardIconType.ABILITY_CREW, diff --git a/Mage/src/main/java/mage/abilities/icon/CardIconType.java b/Mage/src/main/java/mage/abilities/icon/CardIconType.java index 433dc6f8a17..ce25f79b00c 100644 --- a/Mage/src/main/java/mage/abilities/icon/CardIconType.java +++ b/Mage/src/main/java/mage/abilities/icon/CardIconType.java @@ -35,6 +35,7 @@ public enum CardIconType { OTHER_FACEDOWN("prepared/reply-fill.svg", CardIconCategory.ABILITY, 100), OTHER_COST_X("prepared/square-fill.svg", CardIconCategory.ABILITY, 100), // + RINGBEARER("prepared/ring.svg", CardIconCategory.COMMANDER, 100), COMMANDER("prepared/crown.svg", CardIconCategory.COMMANDER, 100), // TODO: fix big size, see CardIconsPanel // SYSTEM_COMBINED("prepared/square-fill.svg", CardIconCategory.SYSTEM, 1000), // inner usage, must use last order diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index aecd86f8eb3..6d002d114b2 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -11,6 +11,7 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.*; import mage.filter.predicate.other.AnotherTargetPredicate; import mage.filter.predicate.permanent.AttachedOrShareCreatureTypePredicate; +import mage.filter.predicate.permanent.RingBearerPredicate; import mage.filter.predicate.permanent.TappedPredicate; import mage.filter.predicate.permanent.TokenPredicate; @@ -664,6 +665,13 @@ public final class StaticFilters { FILTER_CONTROLLED_PERMANENT_NON_LAND.setLockedFilter(true); } + public static final FilterControlledPermanent FILTER_CONTROLLED_RINGBEARER = new FilterControlledPermanent("the controlled Ring-bearer"); + + static { + FILTER_CONTROLLED_RINGBEARER.add(RingBearerPredicate.instance); + FILTER_CONTROLLED_RINGBEARER.setLockedFilter(true); + } + public static final FilterLandPermanent FILTER_LAND = new FilterLandPermanent(); static { diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/RingBearerPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/RingBearerPredicate.java index 58cb8df0ecf..7987ca901ff 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/RingBearerPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/RingBearerPredicate.java @@ -12,6 +12,6 @@ public enum RingBearerPredicate implements Predicate { @Override public boolean apply(Permanent input, Game game) { - return input.isRingBearer(game); + return input.isRingBearer(); } } diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index f9797517d0f..0fda1982749 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -589,7 +589,10 @@ public abstract class GameImpl implements Game { } player.chooseRingBearer(this); getOrCreateTheRing(playerId).addNextAbility(this); - fireEvent(GameEvent.getEvent(GameEvent.EventType.TEMPTED_BY_RING, player.getRingBearerId(), null, playerId)); + + Permanent ringbearer = player.getRingBearer(this); + UUID ringbearerId = ringbearer == null ? null : ringbearer.getId(); + fireEvent(GameEvent.getEvent(GameEvent.EventType.TEMPTED_BY_RING, ringbearerId, null, playerId)); } @Override diff --git a/Mage/src/main/java/mage/game/command/emblems/TheRingEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TheRingEmblem.java index 1d28512f7f2..ac28e791bdf 100644 --- a/Mage/src/main/java/mage/game/command/emblems/TheRingEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/TheRingEmblem.java @@ -20,6 +20,7 @@ import mage.game.Game; import mage.game.command.Emblem; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.targetpointer.FixedTarget; import mage.watchers.common.TemptedByTheRingWatcher; @@ -53,15 +54,16 @@ public final class TheRingEmblem extends Emblem { } public void addNextAbility(Game game) { + String logText; Ability ability; switch (TemptedByTheRingWatcher.getCount(this.getControllerId(), game)) { case 0: - // Your Ring-bearer is legendary and can't be blocked by creatures with greater power. + logText = "Your Ring-bearer is legendary and can't be blocked by creatures with greater power."; ability = new SimpleStaticAbility(Zone.COMMAND, new TheRingEmblemLegendaryEffect()); ability.addEffect(new TheRingEmblemEvasionEffect()); break; case 1: - // Whenever your Ring-bearer attacks, draw a card, then discard a card. + logText = "Whenever your Ring-bearer attacks, draw a card, then discard a card."; ability = new AttacksCreatureYouControlTriggeredAbility( Zone.COMMAND, new DrawDiscardControllerEffect(1, 1), @@ -69,11 +71,11 @@ public final class TheRingEmblem extends Emblem { ).setTriggerPhrase("Whenever your Ring-bearer attacks, "); break; case 2: - // Whenever your Ring-bearer becomes blocked by a creature, that creature's controller sacrifices it at end of combat. + logText ="Whenever your Ring-bearer becomes blocked by a creature, that creature's controller sacrifices it at end of combat."; ability = new TheRingEmblemTriggeredAbility(); break; case 3: - // Whenever your Ring-bearer deals combat damage to a player, each opponent loses 3 life. + logText = "Whenever your Ring-bearer deals combat damage to a player, each opponent loses 3 life."; ability = new DealsDamageToAPlayerAllTriggeredAbility( Zone.COMMAND, new LoseLifeOpponentsEffect(3), filter, false, SetTargetPointer.NONE, true, false @@ -82,10 +84,20 @@ public final class TheRingEmblem extends Emblem { default: return; } + UUID controllerId = this.getControllerId(); this.getAbilities().add(ability); ability.setSourceId(this.getId()); - ability.setControllerId(this.getControllerId()); + ability.setControllerId(controllerId); game.getState().addAbility(ability, this); + + String name = ""; + if(controllerId != null){ + Player player = game.getPlayer(controllerId); + if(player != null){ + name = player.getLogName(); + } + } + game.informPlayers(name + " gains a new Ring ability: \"" + logText + "\""); } } @@ -94,7 +106,7 @@ enum TheRingEmblemPredicate implements Predicate { @Override public boolean apply(Permanent input, Game game) { - return input.isRingBearer(game); + return input.isRingBearer(); } } @@ -148,7 +160,7 @@ class TheRingEmblemEvasionEffect extends RestrictionEffect { @Override public boolean applies(Permanent permanent, Ability source, Game game) { return permanent.isControlledBy(source.getControllerId()) - && permanent.isRingBearer(game); + && permanent.isRingBearer(); } @Override @@ -184,7 +196,7 @@ class TheRingEmblemTriggeredAbility extends TriggeredAbilityImpl { if (attacker == null || blocker == null || attacker.isControlledBy(getControllerId()) - || !attacker.isRingBearer(game)) { + || !attacker.isRingBearer()) { return false; } this.getEffects().setTargetPointer(new FixedTarget(blocker, game)); diff --git a/Mage/src/main/java/mage/game/permanent/Permanent.java b/Mage/src/main/java/mage/game/permanent/Permanent.java index 1223235e5c7..463af7368c1 100644 --- a/Mage/src/main/java/mage/game/permanent/Permanent.java +++ b/Mage/src/main/java/mage/game/permanent/Permanent.java @@ -420,7 +420,9 @@ public interface Permanent extends Card, Controllable { boolean isManifested(); - boolean isRingBearer(Game game); + boolean isRingBearer(); + + void setRingBearer(Game game, boolean value); @Override Permanent copy(); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 700dfc8da36..177354a4063 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -72,6 +72,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { protected boolean renowned; protected boolean manifested = false; protected boolean morphed = false; + protected boolean ringBearerFlag = false; protected int classLevel = 1; protected final Set goadingPlayers = new HashSet<>(); protected UUID originalControllerId; @@ -165,6 +166,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { this.transformed = permanent.transformed; this.monstrous = permanent.monstrous; this.renowned = permanent.renowned; + this.ringBearerFlag = permanent.ringBearerFlag; this.classLevel = permanent.classLevel; this.goadingPlayers.addAll(permanent.goadingPlayers); this.pairedPermanent = permanent.pairedPermanent; @@ -801,11 +803,24 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { return true; } + // Losing control of a ring bearer clear its status. + public void removeUncontrolledRingBearer(Game game){ + if(isRingBearer()) { + UUID controllerId = beforeResetControllerId; + Player controller = controllerId == null ? null : game.getPlayer(controllerId); + String controllerName = controller == null ? "" : controller.getLogName(); + game.informPlayers(controllerName + " has lost control of " + getLogName() + ". It is no longer a Ring-bearer."); + + this.setRingBearer(game, false); + } + } + @Override public boolean checkControlChanged(Game game) { if (!controllerId.equals(beforeResetControllerId)) { this.removeFromCombat(game); this.controlledFromStartOfControllerTurn = false; + this.removeUncontrolledRingBearer(game); this.getAbilities(game).setControllerId(controllerId); game.getContinuousEffects().setController(objectId, controllerId); @@ -1656,6 +1671,41 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { this.renowned = value; } + // Used as key for the ring bearer info. + private static final String ringbearerInfoKey = "IS_RINGBEARER"; + + @Override + public void setRingBearer(Game game, boolean value) { + if(value == this.ringBearerFlag){ + return; + } + + if(value) { + // The player may have another Ringbearer. We need to clear it if so. + // + // 701.52a Certain spells and abilities have the text “the Ring tempts you.” + // Each time the Ring tempts you, choose a creature you control. + // That creature becomes your Ring-bearer until another creature + // becomes your Ring-bearer or another player gains control of it. + Player player = game.getPlayer(getControllerId()); + String playername = ""; + if(player != null){ + playername = player.getLogName(); + Permanent existingRingbearer = player.getRingBearer(game); + if(existingRingbearer != null && existingRingbearer.getId() != this.getId()){ + existingRingbearer.setRingBearer(game, false); + } + } + + addInfo(ringbearerInfoKey, CardUtil.addToolTipMarkTags("Is " + playername + "'s Ring-bearer"), game); + } + else { + addInfo(ringbearerInfoKey, null, game); + } + + this.ringBearerFlag = value; + } + @Override public int getClassLevel() { return classLevel; @@ -1811,10 +1861,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { } @Override - public boolean isRingBearer(Game game) { - Player player = game.getPlayer(getControllerId()); - return player != null && this.equals(player.getRingBearer(game)); - } + public boolean isRingBearer() { return ringBearerFlag; } @Override public boolean fight(Permanent fightTarget, Ability source, Game game) { diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index 16de75751f1..d8005c14ede 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -1080,8 +1080,6 @@ public interface Player extends MageItem, Copyable { */ FilterMana getPhyrexianColors(); - UUID getRingBearerId(); - Permanent getRingBearer(Game game); void chooseRingBearer(Game game); diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 5d8fd146ed1..72a630aeffc 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -177,8 +177,6 @@ public abstract class PlayerImpl implements Player, Serializable { // mana colors the player can handle like Phyrexian mana protected FilterMana phyrexianColors; - protected UUID ringBearerId = null; - // Used during available mana calculation to give back possible available net mana from triggered mana abilities (No need to copy) protected final List> availableTriggeredManaList = new ArrayList<>(); @@ -288,7 +286,6 @@ public abstract class PlayerImpl implements Player, Serializable { } this.payManaMode = player.payManaMode; this.phyrexianColors = player.getPhyrexianColors() != null ? player.phyrexianColors.copy() : null; - this.ringBearerId = player.ringBearerId; for (Designation object : player.designations) { this.designations.add(object.copy()); } @@ -376,8 +373,6 @@ public abstract class PlayerImpl implements Player, Serializable { this.phyrexianColors = player.getPhyrexianColors() != null ? player.getPhyrexianColors().copy() : null; - this.ringBearerId = player.getRingBearerId(); - this.designations.clear(); for (Designation object : player.getDesignations()) { this.designations.add(object.copy()); @@ -5140,59 +5135,87 @@ public abstract class PlayerImpl implements Player, Serializable { return this.phyrexianColors; } - @Override - public UUID getRingBearerId() { - return ringBearerId; - } - @Override public Permanent getRingBearer(Game game) { - if (ringBearerId == null) { - return null; - } - Permanent bearer = game.getPermanent(ringBearerId); - if (bearer != null && bearer.isControlledBy(getId())) { - return bearer; - } - ringBearerId = null; - return null; + return game.getBattlefield() + .getActivePermanents( + StaticFilters.FILTER_CONTROLLED_RINGBEARER, + getId(),null, game) + .stream() + .filter(p -> p != null) + .findFirst() + .orElse(null); } + // 701.52a Certain spells and abilities have the text “the Ring tempts you.” Each time the Ring tempts + // you, choose a creature you control. That creature becomes your Ring-bearer until another + // creature becomes your Ring-bearer or another player gains control of it. @Override public void chooseRingBearer(Game game) { Permanent currentBearer = getRingBearer(game); - int creatureCount = game.getBattlefield().count( - StaticFilters.FILTER_CONTROLLED_CREATURE, getId(), null, game - ); - boolean mustChoose; - if (currentBearer == null) { - if (creatureCount > 0) { - mustChoose = true; - } else { - return; - } - } else if (currentBearer.isCreature(game)) { - if (creatureCount > 1) { - mustChoose = false; - } else { - return; - } - } else if (creatureCount > 0) { - mustChoose = false; + UUID currentBearerId = currentBearer == null ? null : currentBearer.getId(); + + List ids = game.getBattlefield() + .getActivePermanents(StaticFilters.FILTER_CONTROLLED_CREATURE, getId(), null, game) + .stream() + .filter(p -> p != null) + .map(p -> p.getId()) + .collect(Collectors.toList()); + + if(ids.isEmpty()) { + game.informPlayers(getLogName() + " has no creature to be Ring-bearer."); + return; + } + + // There should always be a creature at the end. + UUID newBearerId; + if(ids.size() == 1){ + // Only one creature, it will be the Ring-bearer. + // The player does not have to make any choice. + newBearerId = ids.get(0); } else { - return; + // Multiple possible Ring-bearer. + // Asking first if the player wants to change Ring-bearer. + boolean mustChoose = currentBearer == null || !(currentBearer.isCreature(game)); + boolean choosing = mustChoose; + if (!mustChoose) { + choosing = chooseUse(Outcome.Neutral, "Choose a new Ring-bearer?", null, game); + } + + if (choosing) { + TargetPermanent target = new TargetControlledCreaturePermanent(); + target.setNotTarget(true); + target.withChooseHint("to be your Ring-bearer"); + choose(Outcome.Neutral, target, null, game); + + newBearerId = target.getFirstTarget(); + } + else { + newBearerId = currentBearerId; + } } - if (!mustChoose && !chooseUse(Outcome.Neutral, "Choose a new Ring-bearer?", null, game)) { - return; - } - TargetPermanent target = new TargetControlledCreaturePermanent(); - target.setNotTarget(true); - target.withChooseHint("to be your Ring-bearer"); - choose(Outcome.Neutral, target, null, game); - UUID newBearerId = target.getFirstTarget(); - if (game.getPermanent(newBearerId) != null) { - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.RING_BEARER_CHOSEN, newBearerId, null, getId())); - this.ringBearerId = newBearerId; + + if(currentBearerId != null && currentBearerId == newBearerId) { + // Oracle Ruling for Call of the Ring + // + // If the creature you choose as your Ring-bearer was already your Ring-bearer, + // that still counts as choosing that creature as your Ring-bearer for the purpose + // f abilities that trigger "whenever you choose a creature as your Ring-bearer" + // or abilities that care about which creature was chosen as your Ring-bearer. + // (2023-06-16) + game.informPlayers(getLogName() + " did not choose a new Ring-bearer. " + + "It is still " + (currentBearer == null ? "" : currentBearer.getLogName()) + "."); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.RING_BEARER_CHOSEN, currentBearerId, null, getId())); + } else { + Permanent ringBearer = game.getPermanent(newBearerId); + if(ringBearer != null){ + // The setRingBearer method is taking care of removing + // the status from the current ring bearer, if existing. + ringBearer.setRingBearer(game, true); + + game.informPlayers(getLogName() + " has chosen " + ringBearer.getLogName() + " as Ring-bearer."); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.RING_BEARER_CHOSEN, newBearerId, null, getId())); + } } }