From 58f27c44668dd45f8967a0ed3a5ea6ba33752d3d Mon Sep 17 00:00:00 2001 From: Lyu Zong-Hong Date: Fri, 12 Feb 2021 22:25:47 +0900 Subject: [PATCH] Fix commander damage record and view, also other bugs --- .../src/main/java/forge/game/GameAction.java | 22 ++++++++++--------- .../ability/effects/ChangeZoneEffect.java | 6 +++++ .../game/ability/effects/MutateEffect.java | 5 +++-- .../src/main/java/forge/game/card/Card.java | 11 ++++++++++ .../main/java/forge/game/player/Player.java | 11 ++++++++-- .../java/forge/game/player/PlayerView.java | 9 ++++++++ forge-gui/res/languages/de-DE.properties | 2 ++ forge-gui/res/languages/en-US.properties | 2 ++ forge-gui/res/languages/es-ES.properties | 2 ++ forge-gui/res/languages/it-IT.properties | 2 ++ forge-gui/res/languages/zh-CN.properties | 2 ++ 11 files changed, 60 insertions(+), 14 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 0ae3ef9419d..403817ebec0 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -239,7 +239,7 @@ public class GameAction { CardCollectionView comCards = c.getOwner().getCardsIn(ZoneType.Command); for (final Card effCard : comCards) { for (final ReplacementEffect re : effCard.getReplacementEffects()) { - if (re.getMode() == ReplacementType.Moved && "Card.EffectSource+YouOwn".equals(re.getParam("ValidCard"))) { + if (re.hasSVar("CommanderMoveReplacement")) { commanderEffect = effCard; break; } @@ -315,15 +315,17 @@ public class GameAction { java.util.Collections.reverse(cards); } mergedCards = cards; - final SpellAbility saTargeting = cause.getSATargetingCard(); - if (saTargeting != null) { - saTargeting.getTargets().replaceTargetCard(c, cards); - } - // Replace host rememberd cards - Card hostCard = cause.getHostCard(); - if (hostCard.isRemembered(c)) { - hostCard.removeRemembered(c); - hostCard.addRemembered(cards); + if (cause != null) { + final SpellAbility saTargeting = cause.getSATargetingCard(); + if (saTargeting != null) { + saTargeting.getTargets().replaceTargetCard(c, cards); + } + // Replace host rememberd cards + Card hostCard = cause.getHostCard(); + if (hostCard.isRemembered(c)) { + hostCard.removeRemembered(c); + hostCard.addRemembered(cards); + } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 9edad52c0e1..8e9b7b01a37 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -1286,6 +1286,12 @@ public class ChangeZoneEffect extends SpellAbilityEffect { source.addRemembered(meld); } } + if (c.hasMergedCard()) { + for (final Card card : c.getMergedCards()) { + if (card == c) continue; + source.addRemembered(card); + } + } } if (forget) { source.removeRemembered(movedCard); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MutateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MutateEffect.java index 28d1da70390..f5096db29cf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MutateEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MutateEffect.java @@ -14,6 +14,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; +import forge.util.Localizer; public class MutateEffect extends SpellAbilityEffect { @@ -37,7 +38,7 @@ public class MutateEffect extends SpellAbilityEffect { final Card topCard = host.getController().getController().chooseSingleEntityForEffect( view, sa, - "Choose which creature to be on top", + Localizer.getInstance().getMessage("lblChooseCreatureToBeTop"), false, new HashMap<>() ); @@ -81,8 +82,8 @@ public class MutateEffect extends SpellAbilityEffect { target.setTimesMutated(target.getTimesMutated() + 1); target.updateTokenView(); if (host.isCommander()) { + host.getOwner().updateMergedCommanderInfo(target, host); target.updateCommanderView(); - host.getOwner().updateMergedCommanderCast(target, host); } game.getTriggerHandler().runTrigger(TriggerType.Mutates, AbilityKey.mapFromCard(target), false); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index dfef4b6dad9..c5e695f178e 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6257,6 +6257,17 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public void updateCommanderView() { view.updateCommander(this); } + public Card getRealCommander() { + if (isCommander) + return this; + if (this.getMeldedWith() != null && this.getMeldedWith().isCommander()) + return this.getMeldedWith(); + if (isInZone(ZoneType.Battlefield) && hasMergedCard()) { + for (final Card c : getMergedCards()) + if (c.isCommander) return c; + } + return null; + } public boolean canMoveToCommandZone() { return canMoveToCommandZone; diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index c1a483c68c9..6acd4c553a4 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -610,8 +610,14 @@ public class Player extends GameEntity implements Comparable { && !this.getGame().getRules().hasAppliedVariant(GameType.Oathbreaker) && !this.getGame().getRules().hasAppliedVariant(GameType.TinyLeaders) && !this.getGame().getRules().hasAppliedVariant(GameType.Brawl)) { - commanderDamage.put(source, getCommanderDamage(source) + amount); + // In case that commander is merged permanent, get the real commander card + final Card realCommander = source.getRealCommander(); + int damage = getCommanderDamage(realCommander) + amount; + commanderDamage.put(realCommander, damage); view.updateCommanderDamage(this); + if (realCommander != source) { + view.updateMergedCommanderDamage(source, realCommander); + } } int old = assignedDamage.containsKey(source) ? assignedDamage.get(source) : 0; @@ -2886,8 +2892,9 @@ public class Player extends GameEntity implements Comparable { getGame().fireEvent(new GameEventPlayerStatsChanged(this, false)); } - public void updateMergedCommanderCast(Card target, Card commander) { + public void updateMergedCommanderInfo(Card target, Card commander) { getView().updateMergedCommanderCast(this, target, commander); + getView().updateMergedCommanderDamage(target, commander); } public int getTotalCommanderCast() { diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 164ff4a92cb..36805905d79 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -334,6 +334,15 @@ public class PlayerView extends GameEntityView { } set(TrackableProperty.CommanderDamage, map); } + void updateMergedCommanderDamage(Card card, Card commander) { + // Add commander damage to top card for card view panel info + for (final PlayerView p : Iterables.concat(Collections.singleton(this), getOpponents())) { + Map map = p.get(TrackableProperty.CommanderDamage); + if (map == null) continue; + Integer damage = map.get(commander.getId()); + map.put(card.getId(), damage); + } + } public int getCommanderCast(CardView commander) { Map map = get(TrackableProperty.CommanderCast); diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index b7f7aca9161..f1a256b9a09 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1863,6 +1863,8 @@ lblChooseCardToMeld=Wähle Karte zum Verschmelzen mit lblDoYouWantPutLibraryCardsTo=Lege Karte(n) von der Bibliothek nach #MultiplePilesEffect.java lblChooseCardsInTargetPile=Wähle Karten in Stapel {0}? +#MutateEffect.java +lblChooseCreatureToBeTop=Choose which creature to be the top #PeekAndRevealEffect.java lblRevealingCardFrom=Zeige Karten von lblRevealCardToOtherPlayers=Zeige die Karten den anderen Spielern? diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index ca6ebdf77a0..1b4b7103f69 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1863,6 +1863,8 @@ lblChooseCardToMeld=Choose card to meld with lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? #MultiplePilesEffect.java lblChooseCardsInTargetPile=Choose cards in Pile {0}? +#MutateEffect.java +lblChooseCreatureToBeTop=Choose which creature to be the top #PeekAndRevealEffect.java lblRevealingCardFrom=Revealing cards from lblRevealCardToOtherPlayers=Reveal cards to other players? diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 79a6699534d..a93c31c04bc 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1863,6 +1863,8 @@ lblChooseCardToMeld=Elige una carta para fundirla con lblDoYouWantPutLibraryCardsTo=¿Quieres poner la(s) carta(s) de la biblioteca a {0}? #MultiplePilesEffect.java lblChooseCardsInTargetPile=¿Elegir las cartas en la Pila {0}? +#MutateEffect.java +lblChooseCreatureToBeTop=Choose which creature to be the top #PeekAndRevealEffect.java lblRevealingCardFrom=Mostrando las cartas de lblRevealCardToOtherPlayers=¿Mostrar las cartas a otros jugadores? diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 2618c426f9e..f9e8aed6cd0 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -1863,6 +1863,8 @@ lblChooseCardToMeld=Choose card to meld with lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? #MultiplePilesEffect.java lblChooseCardsInTargetPile=Choose cards in Pile {0}? +#MutateEffect.java +lblChooseCreatureToBeTop=Choose which creature to be the top #PeekAndRevealEffect.java lblRevealingCardFrom=Revealing cards from lblRevealCardToOtherPlayers=Reveal cards to other players? diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index cf7afebeca8..8c4a73a9d57 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1863,6 +1863,8 @@ lblChooseCardToMeld=选择要融合的牌 lblDoYouWantPutLibraryCardsTo=你想要从牌库中把牌放入{0}吗? #MultiplePilesEffect.java lblChooseCardsInTargetPile=选择堆{0}中的牌? +#MutateEffect.java +lblChooseCreatureToBeTop=Choose which creature to be the top #PeekAndRevealEffect.java lblRevealingCardFrom=展示牌自 lblRevealCardToOtherPlayers=向其他玩家展示牌?