Homarid Drake, reprints, and rewriting his or her to their

This commit is contained in:
igoudt 2018-03-22 16:52:26 +01:00
parent 03355aee37
commit 00f91391e9
805 changed files with 1553 additions and 1474 deletions

View file

@ -250,7 +250,7 @@ public abstract class AbilityImpl implements Ability {
/* 20130201 - 601.2b
* If the player wishes to splice any cards onto the spell (see rule 702.45), he
* or she reveals those cards in his or her hand.
* or she reveals those cards in their hand.
*/
if (this.abilityType == AbilityType.SPELL) {
game.getContinuousEffects().applySpliceEffects(this, game);
@ -313,7 +313,7 @@ public abstract class AbilityImpl implements Ability {
for (UUID modeId : this.getModes().getSelectedModes()) {
this.getModes().setActiveMode(modeId);
//20121001 - 601.2c
// 601.2c The player announces his or her choice of an appropriate player, object, or zone for
// 601.2c The player announces their choice of an appropriate player, object, or zone for
// each target the spell requires. A spell may require some targets only if an alternative or
// additional cost (such as a buyback or kicker cost), or a particular mode, was chosen for it;
// otherwise, the spell is cast as though it did not require those targets. If the spell has a

View file

@ -8,7 +8,7 @@ import mage.players.Player;
import mage.util.CardUtil;
/**
* Condition for - Controller has X or more cards in his or her graveyard
* Condition for - Controller has X or more cards in their graveyard
*
* @author LevelX2
*/

View file

@ -9,7 +9,7 @@ import java.util.UUID;
/**
* Condition for -
* Any opponent has X or more cards in his or her graveyard
* Any opponent has X or more cards in their graveyard
* @author Loki
*/
public class CardsInOpponentGraveCondition implements Condition {

View file

@ -63,7 +63,7 @@ public class PayLifeCost extends CostImpl {
@Override
public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) {
//118.4. If a cost or effect allows a player to pay an amount of life greater than 0,
//the player may do so only if his or her life total is greater than or equal to the
//the player may do so only if their life total is greater than or equal to the
//amount of the payment. If a player pays life, the payment is subtracted from his or
//her life total; in other words, the player loses that much life. (Players can always pay 0 life.)
int lifeToPayAmount = amount.calculate(game, ability, null);

View file

@ -58,7 +58,7 @@ public class ParleyCount implements DynamicValue, MageSingleton {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
// Each player reveals the top card of his or her library. For each nonland card revealed this way
// Each player reveals the top card of their library. For each nonland card revealed this way
int parleyValue = 0;
MageObject sourceObject = game.getObject(sourceAbility.getSourceId());
if (sourceObject != null) {

View file

@ -42,7 +42,7 @@ public class AddManaAnyColorAttachedControllerEffect extends ManaEffect {
public AddManaAnyColorAttachedControllerEffect() {
super();
staticText = "its controller adds one mana of any color to his or her mana pool";
staticText = "its controller adds one mana of any color to their mana pool";
}
public AddManaAnyColorAttachedControllerEffect(final AddManaAnyColorAttachedControllerEffect effect) {

View file

@ -15,7 +15,7 @@ public class AddManaOfAnyColorToManaPoolTargetPlayerEffect extends ManaEffect {
public AddManaOfAnyColorToManaPoolTargetPlayerEffect(String textManaPoolOwner) {
super();
this.staticText = (textManaPoolOwner.equals("his or her") ? "that player adds " : "add ") + "one mana of any color" + " to " + textManaPoolOwner + " mana pool";
this.staticText = (textManaPoolOwner.equals("their") ? "that player adds " : "add ") + "one mana of any color" + " to " + textManaPoolOwner + " mana pool";
}
public AddManaOfAnyColorToManaPoolTargetPlayerEffect(final AddManaOfAnyColorToManaPoolTargetPlayerEffect effect) {

View file

@ -43,7 +43,7 @@ public class AddManaOfAnyTypeProducedEffect extends ManaEffect {
public AddManaOfAnyTypeProducedEffect() {
super();
staticText = "that player adds one mana to his or her mana pool of any type that land produced";
staticText = "that player adds one mana to their mana pool of any type that land produced";
}
public AddManaOfAnyTypeProducedEffect(final AddManaOfAnyTypeProducedEffect effect) {

View file

@ -36,7 +36,7 @@ public class AddManaToManaPoolTargetControllerEffect extends ManaEffect {
super();
this.mana = mana;
this.emptyOnlyOnTurnsEnd = emptyOnTurnsEnd;
this.staticText = (textManaPoolOwner.equals("his or her")?"that player adds ":"add ") + mana.toString() + " to " + textManaPoolOwner + " mana pool";
this.staticText = (textManaPoolOwner.equals("their")?"that player adds ":"add ") + mana.toString() + " to " + textManaPoolOwner + " mana pool";
}
public AddManaToManaPoolTargetControllerEffect(final AddManaToManaPoolTargetControllerEffect effect) {

View file

@ -49,9 +49,9 @@ import mage.target.common.TargetOpponent;
/**
* 1. The controller of the spell or ability chooses an opponent. (This doesn't
* target the opponent.) 2. Each player involved in the clash reveals the top
* card of his or her library. 3. The converted mana costs of the revealed cards
* card of their library. 3. The converted mana costs of the revealed cards
* are noted. 4. In turn order, each player involved in the clash chooses to put
* his or her revealed card on either the top or bottom of his or her library.
* their revealed card on either the top or bottom of their library.
* (Note that the player whose turn it is does this first, not necessarily the
* controller of the clash spell or ability.) When the second player makes this
* decision, he or she will know what the first player chose. Then all cards are

View file

@ -141,6 +141,6 @@ public class DontUntapInPlayersNextUntapStepAllEffect extends ContinuousRuleModi
if (!staticText.isEmpty()) {
return staticText;
}
return filter.getMessage() + " target opponent controls don't untap during his or her next untap step.";
return filter.getMessage() + " target opponent controls don't untap during their next untap step.";
}
}

View file

@ -51,7 +51,7 @@ public class ExileCardYouChooseTargetOpponentEffect extends OneShotEffect {
public ExileCardYouChooseTargetOpponentEffect(FilterCard filter) {
super(Outcome.Discard);
staticText = new StringBuilder("Target opponent reveals his or her hand. You choose ")
staticText = new StringBuilder("Target opponent reveals their hand. You choose ")
.append(filter.getMessage()).append(" from it and exile that card").toString();
this.filter = filter;
}

View file

@ -33,7 +33,7 @@ public class ExileCardsFromTopOfLibraryTargetEffect extends OneShotEffect {
this.amount = amount;
this.staticText = (targetName == null ? "that player" : targetName) + " exiles the top "
+ CardUtil.numberToText(amount, "")
+ (amount == 1 ? "card" : " cards") + " of his or her library";
+ (amount == 1 ? "card" : " cards") + " of their library";
}
public ExileCardsFromTopOfLibraryTargetEffect(final ExileCardsFromTopOfLibraryTargetEffect effect) {

View file

@ -107,6 +107,6 @@ public class ExileFromZoneTargetEffect extends OneShotEffect {
}
private void setText() {
staticText = "target player exiles " + CardUtil.numberToText(amount, "a") + ' ' + filter.getMessage() + " from his or her " + zone.toString().toLowerCase(Locale.ENGLISH);
staticText = "target player exiles " + CardUtil.numberToText(amount, "a") + ' ' + filter.getMessage() + " from their " + zone.toString().toLowerCase(Locale.ENGLISH);
}
}

View file

@ -41,7 +41,7 @@ public class LoseHalfLifeTargetEffect extends OneShotEffect {
public LoseHalfLifeTargetEffect() {
super(Outcome.Damage);
staticText = "that player loses half his or her life, rounded up";
staticText = "that player loses half their life, rounded up";
}
public LoseHalfLifeTargetEffect(final LoseHalfLifeTargetEffect effect) {

View file

@ -99,7 +99,7 @@ public class PutLibraryIntoGraveTargetEffect extends OneShotEffect {
} else {
sb.append(" X cards ");
}
sb.append("of his or her library into his or her graveyard");
sb.append("of their library into their graveyard");
if (!message.isEmpty()) {
sb.append(", where X is the number of ");

View file

@ -75,7 +75,7 @@ public class PutPermanentOnBattlefieldEffect extends OneShotEffect {
}
if (useTargetController) {
return "that player may put " + filter.getMessage() + " from his or her hand onto the battlefield";
return "that player may put " + filter.getMessage() + " from their hand onto the battlefield";
} else {
return "you may put " + filter.getMessage() + " from your hand onto the battlefield";
}

View file

@ -129,7 +129,7 @@ public class PutTopCardOfLibraryIntoGraveEachPlayerEffect extends OneShotEffect
sb.append(CardUtil.numberToText(numberCards.toString()));
sb.append(" cards");
}
sb.append(" of his or her library into his or her graveyard");
sb.append(" of their library into their graveyard");
return sb.toString();
}
}

View file

@ -82,7 +82,7 @@ public class PutTopCardOfLibraryIntoGraveTargetEffect extends OneShotEffect {
sb.append(CardUtil.numberToText(numberCards.toString()));
sb.append(" cards");
}
sb.append(" of his or her library into his or her graveyard");
sb.append(" of their library into their graveyard");
return sb.toString();
}
}

View file

@ -47,7 +47,7 @@ public class ReplaceOpponentCardsInHandWithSelectedEffect extends OneShotEffect
public ReplaceOpponentCardsInHandWithSelectedEffect() {
super(Outcome.Detriment);
this.staticText = "Target opponent puts the cards from his or her hand on top of his or her library. Search that player's library for that many cards. The player puts those cards into his or her hand, then shuffles his or her library.";
this.staticText = "Target opponent puts the cards from their hand on top of their library. Search that player's library for that many cards. The player puts those cards into their hand, then shuffles their library.";
}
public ReplaceOpponentCardsInHandWithSelectedEffect(final ReplaceOpponentCardsInHandWithSelectedEffect effect) {

View file

@ -48,7 +48,7 @@ public class ReturnToHandFromGraveyardAllEffect extends OneShotEffect {
public ReturnToHandFromGraveyardAllEffect(FilterCard filter) {
super(Outcome.ReturnToHand);
this.filter = filter;
staticText = "Each player returns all " + filter.getMessage() + " from his or her graveyard to his or her hand";
staticText = "Each player returns all " + filter.getMessage() + " from their graveyard to their hand";
}
public ReturnToHandFromGraveyardAllEffect(final ReturnToHandFromGraveyardAllEffect effect) {

View file

@ -152,7 +152,7 @@ public class RevealCardsFromLibraryUntilEffect extends OneShotEffect {
}
case LIBRARY: {
if (shuffleRestInto) {
sb.append(", then shuffles the rest into his or her library.");
sb.append(", then shuffles the rest into their library.");
} else {
sb.append(" and the rest on the bottom of your library in ");
if (anyOrder) {

View file

@ -86,7 +86,7 @@ public class RevealHandTargetEffect extends OneShotEffect {
default:
break;
}
sb.append(" reveals his or her hand");
sb.append(" reveals their hand");
return sb.toString();
}
}

View file

@ -43,7 +43,7 @@ public class ShuffleIntoLibraryGraveOfSourceOwnerEffect extends OneShotEffect {
public ShuffleIntoLibraryGraveOfSourceOwnerEffect() {
super(Outcome.Benefit);
staticText = "its owner shuffles his or her graveyard into his or her library";
staticText = "its owner shuffles their graveyard into their library";
}
public ShuffleIntoLibraryGraveOfSourceOwnerEffect(final ShuffleIntoLibraryGraveOfSourceOwnerEffect effect) {

View file

@ -56,7 +56,7 @@ public class ShuffleIntoLibraryTargetEffect extends OneShotEffect {
if (staticText != null && !staticText.isEmpty()) {
return staticText;
} else {
return "choose target " + mode.getTargets().get(0).getTargetName() + ". Its owner shuffles it into his or her library";
return "choose target " + mode.getTargets().get(0).getTargetName() + ". Its owner shuffles it into their library";
}
}
}

View file

@ -42,7 +42,7 @@ public class ShuffleLibraryTargetEffect extends OneShotEffect {
public ShuffleLibraryTargetEffect() {
super(Outcome.Neutral);
this.staticText = "Target player shuffles his or her library";
this.staticText = "Target player shuffles their library";
}
public ShuffleLibraryTargetEffect(final ShuffleLibraryTargetEffect effect) {

View file

@ -21,7 +21,7 @@ public class SkipNextCombatEffect extends OneShotEffect {
public SkipNextCombatEffect() {
super(Outcome.Detriment);
staticText = "target opponent skips his or her next combat phase";
staticText = "target opponent skips their next combat phase";
}
public SkipNextCombatEffect(SkipNextCombatEffect effect) {

View file

@ -83,7 +83,7 @@ public class SkipNextPlayerUntapStepEffect extends OneShotEffect {
public String getText(Mode mode) {
StringBuilder sb = new StringBuilder();
if (!staticText.isEmpty()) {
sb.append(staticText).append(" player skips his or her next untap step");
sb.append(staticText).append(" player skips their next untap step");
} else {
sb.append("You skip your next untap step");
}

View file

@ -143,7 +143,7 @@ public class CommanderReplacementEffect extends ReplacementEffectImpl {
if (player != null && player.chooseUse(Outcome.Benefit, "Move commander to command zone?", source, game)) {
((ZoneChangeEvent) event).setToZone(Zone.COMMAND);
if (!game.isSimulation()) {
game.informPlayers(player.getLogName() + " has moved his or her commander to the command zone");
game.informPlayers(player.getLogName() + " has moved their commander to the command zone");
}
}
}
@ -163,7 +163,7 @@ public class CommanderReplacementEffect extends ReplacementEffectImpl {
if (player != null && player.chooseUse(Outcome.Benefit, "Move commander to command zone?", source, game)) {
((ZoneChangeEvent) event).setToZone(Zone.COMMAND);
if (!game.isSimulation()) {
game.informPlayers(player.getLogName() + " has moved his or her commander to the command zone");
game.informPlayers(player.getLogName() + " has moved their commander to the command zone");
}
}
}

View file

@ -38,7 +38,7 @@ import mage.game.Game;
import mage.players.Player;
/**
* Each player may play an additional land on each of his or her turns.
* Each player may play an additional land on each of their turns.
*
* @author nantuko
*/
@ -46,7 +46,7 @@ public class PlayAdditionalLandsAllEffect extends ContinuousEffectImpl {
public PlayAdditionalLandsAllEffect() {
super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit);
staticText = "Each player may play an additional land on each of his or her turns";
staticText = "Each player may play an additional land on each of their turns";
}
public PlayAdditionalLandsAllEffect(final PlayAdditionalLandsAllEffect effect) {

View file

@ -194,14 +194,14 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect {
throw new UnsupportedOperationException("target controller not supported");
}
if (revealAllCards) {
sb.append(" reveals his or her hand");
sb.append(" reveals their hand");
} else {
if (numberCardsToReveal instanceof StaticValue) {
sb.append(" reveals ");
sb.append(numberCardsToReveal.getMessage());
sb.append(" from his or her hand");
sb.append(" from their hand");
} else {
sb.append(" reveals a number of cards from his or her hand equal to ");
sb.append(" reveals a number of cards from their hand equal to ");
sb.append(numberCardsToReveal.getMessage());
}
}

View file

@ -43,7 +43,7 @@ public class DiscardHandAllEffect extends OneShotEffect {
public DiscardHandAllEffect() {
super(Outcome.Discard);
this.staticText = "Each player discards his or her hand";
this.staticText = "Each player discards their hand";
}
public DiscardHandAllEffect(final DiscardHandAllEffect effect) {

View file

@ -89,7 +89,7 @@ public class DiscardHandTargetEffect extends OneShotEffect {
} else {
sb.append("target ").append(mode.getTargets().get(0).getTargetName());
}
sb.append(" discards his or her hand");
sb.append(" discards their hand");
return sb.toString();
}
}

View file

@ -89,7 +89,7 @@ public class SearchLibraryPutInPlayTargetPlayerEffect extends SearchEffect {
private void setText() {
StringBuilder sb = new StringBuilder();
sb.append("target player searches his or her library for ");
sb.append("target player searches their library for ");
if (target.getNumberOfTargets() == 0 && target.getMaxNumberOfTargets() > 0) {
if (target.getMaxNumberOfTargets() == Integer.MAX_VALUE) {
sb.append("any number of ").append(' ');
@ -104,9 +104,9 @@ public class SearchLibraryPutInPlayTargetPlayerEffect extends SearchEffect {
sb.append(" tapped");
}
if (forceShuffle) {
sb.append(". Then that player shuffles his or her library");
sb.append(". Then that player shuffles their library");
} else {
sb.append(". If that player does, he or she shuffles his or her library");
sb.append(". If that player does, he or she shuffles their library");
}
staticText = sb.toString();
}

View file

@ -132,7 +132,7 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect
sb.append("search ").append(this.searchWhatText);
sb.append(" graveyard, hand, and library for ");
sb.append(this.searchForText);
sb.append(" and exile them. Then that player shuffles his or her library");
sb.append(" and exile them. Then that player shuffles their library");
return sb.toString();
}
}

View file

@ -112,11 +112,11 @@ public class ManifestTargetPlayerEffect extends OneShotEffect {
} else {
sb.append("card ");
}
sb.append("of his or her library. ");
sb.append("of their library. ");
if (amount > 1) {
sb.append("<i>(To manifest a card, put it onto the battlefield face down as a 2/2 creature. The controller may turn it face up at any time for its mana cost if it's a creature card.)</i>");
} else {
sb.append("<i>(That player puts the top card of his or her library onto the battlefield face down as a 2/2 creature. If it's a creature card, it can be turned face up any time for its mana cost.)</i>");
sb.append("<i>(That player puts the top card of their library onto the battlefield face down as a 2/2 creature. If it's a creature card, it can be turned face up any time for its mana cost.)</i>");
}
return sb.toString();
}

View file

@ -43,8 +43,8 @@ import mage.game.Game;
*
* 702.56b A forecast ability may be activated only during the upkeep step of
* the card's owner and only once each turn. The controller of the forecast
* ability reveals the card with that ability from his or her hand as the
* ability is activated. That player plays with that card revealed in his or her
* ability reveals the card with that ability from their hand as the
* ability is activated. That player plays with that card revealed in their
* hand until it leaves the player's hand or until a step or phase that isn't an
* upkeep step begins, whichever comes first.
*

View file

@ -31,7 +31,7 @@ public class IngestAbility extends DealsCombatDamageToAPlayerTriggeredAbility {
@Override
public String getRule() {
return "Ingest <i>(Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)</i>";
return "Ingest <i>(Whenever this creature deals combat damage to a player, that player exiles the top card of their library.)</i>";
}
@Override
@ -44,7 +44,7 @@ class IngestEffect extends OneShotEffect {
public IngestEffect() {
super(Outcome.Exile);
this.staticText = "that player exiles the top card of his or her library";
this.staticText = "that player exiles the top card of their library";
}
public IngestEffect(final IngestEffect effect) {

View file

@ -33,10 +33,10 @@ import mage.players.Player;
* first ability is applied.
*
* "Madness [cost]" means "If a player would discard this card, that player
* discards it, but may exile it instead of putting it into his or her
* discards it, but may exile it instead of putting it into their
* graveyard" and "When this card is exiled this way, its owner may cast it by
* paying [cost] rather than paying its mana cost. If that player doesn't, he or
* she puts this card into his or her graveyard.
* she puts this card into their graveyard.
*
* 702.33b. Casting a spell using its madness ability follows the rules for
* paying alternative costs in rules 601.2b and 601.2e-g.

View file

@ -52,7 +52,7 @@ import mage.watchers.common.MiracleWatcher;
* cost."
*
* 702.92b If a player chooses to reveal a card using its miracle ability, he or
* she plays with that card revealed until that card leaves his or her hand,
* she plays with that card revealed until that card leaves their hand,
* that ability resolves, or that ability otherwise leaves the stack.
*
* You can cast a card for its miracle cost only as the miracle triggered

View file

@ -120,7 +120,7 @@ import java.util.UUID;
* card involves an additional cost, the card's owner must pay that cost if
* able. If he or she can't, the card remains removed from the game. If the
* additional cost includes mana, the situation is more complex. If the player
* has enough mana in his or her mana pool to pay the cost, that player must do
* has enough mana in their mana pool to pay the cost, that player must do
* so. If the player can't possibly pay the cost, the card remains removed from
* the game. However, if the player has the means to produce enough mana to pay
* the cost, then he or she has a choice: The player may play the spell, produce

View file

@ -97,10 +97,10 @@ public abstract class GameCommanderImpl extends GameImpl {
//20130711
/*903.8. The Commander variant uses an alternate mulligan rule.
* Each time a player takes a mulligan, rather than shuffling his or her entire hand of cards into his or her library, that player exiles any number of cards from his or her hand face down.
* Each time a player takes a mulligan, rather than shuffling their entire hand of cards into their library, that player exiles any number of cards from their hand face down.
* Then the player draws a number of cards equal to one less than the number of cards he or she exiled this way.
* That player may look at all cards exiled this way while taking mulligans.
* Once a player keeps an opening hand, that player shuffles all cards he or she exiled this way into his or her library.
* Once a player keeps an opening hand, that player shuffles all cards he or she exiled this way into their library.
* */
//TODO implement may look at exile cards
@Override

View file

@ -41,12 +41,12 @@ import mage.target.common.TargetOpponent;
* @author spjspj
*/
public class JaceTelepathUnboundEmblem extends Emblem {
// You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard".
// You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of their library into their graveyard".
public JaceTelepathUnboundEmblem() {
this.setName("Emblem Jace");
Effect effect = new PutTopCardOfLibraryIntoGraveTargetEffect(5);
effect.setText("target opponent puts the top five cards of his or her library into his or her graveyard");
effect.setText("target opponent puts the top five cards of their library into their graveyard");
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false);
ability.addTarget(new TargetOpponent());
getAbilities().add(ability);

View file

@ -47,7 +47,7 @@ import mage.watchers.common.SpellsCastWatcher;
public class JaceUnravelerOfSecretsEmblem extends Emblem {
/**
* Emblem: "Whenever an opponent casts his or her first spell each turn,
* Emblem: "Whenever an opponent casts their first spell each turn,
* counter that spell."
*/
public JaceUnravelerOfSecretsEmblem() {
@ -93,6 +93,6 @@ class JaceUnravelerOfSecretsTriggeredAbility extends SpellCastOpponentTriggeredA
@Override
public String getRule() {
return "Whenever an opponent casts his or her first spell each turn, counter that spell.";
return "Whenever an opponent casts their first spell each turn, counter that spell.";
}
}

View file

@ -132,7 +132,7 @@ public class Turn implements Serializable {
}
if (game.getState().getTurnMods().skipTurn(activePlayer.getId())) {
game.informPlayers(activePlayer.getLogName() + " skips his or her turn.");
game.informPlayers(activePlayer.getLogName() + " skips their turn.");
return true;
}
logStartOfTurn(game, activePlayer);

View file

@ -2313,7 +2313,7 @@ public abstract class PlayerImpl implements Player, Serializable {
Library searchedLibrary = null;
String searchInfo = null;
if (targetPlayerId.equals(playerId)) {
searchInfo = getLogName() + " searches his or her library";
searchInfo = getLogName() + " searches their library";
searchedLibrary = library;
} else {
Player targetPlayer = game.getPlayer(targetPlayerId);
@ -3460,7 +3460,7 @@ public abstract class PlayerImpl implements Player, Serializable {
game.informPlayers(getLogName() + " puts "
+ (withName ? card.getLogName() : (card.isFaceDown(game) ? "a face down card" : "a card"))
+ " from " + fromZone.toString().toLowerCase(Locale.ENGLISH) + ' '
+ (card.getOwnerId().equals(this.getId()) ? "into his or her hand" : "into its owner's hand")
+ (card.getOwnerId().equals(this.getId()) ? "into their hand" : "into its owner's hand")
);
}
result = true;
@ -3555,7 +3555,7 @@ public abstract class PlayerImpl implements Player, Serializable {
.append(" puts ").append(card.getLogName()).append(' ').append(card.isCopy() ? "(Copy) " : "")
.append(fromZone != null ? "from " + fromZone.toString().toLowerCase(Locale.ENGLISH) + ' ' : "");
if (card.getOwnerId().equals(getId())) {
sb.append("into his or her graveyard");
sb.append("into their graveyard");
} else {
sb.append("it into its owner's graveyard");
}
@ -3587,7 +3587,7 @@ public abstract class PlayerImpl implements Player, Serializable {
}
sb.append("to the ").append(toTop ? "top" : "bottom");
if (card.getOwnerId().equals(getId())) {
sb.append(" of his or her library");
sb.append(" of their library");
} else {
Player player = game.getPlayer(card.getOwnerId());
if (player != null) {