Fix commander damage record and view, also other bugs

This commit is contained in:
Lyu Zong-Hong
2021-02-12 22:25:47 +09:00
parent 8128aba4f8
commit 58f27c4466
11 changed files with 60 additions and 14 deletions

View File

@@ -239,7 +239,7 @@ public class GameAction {
CardCollectionView comCards = c.getOwner().getCardsIn(ZoneType.Command); CardCollectionView comCards = c.getOwner().getCardsIn(ZoneType.Command);
for (final Card effCard : comCards) { for (final Card effCard : comCards) {
for (final ReplacementEffect re : effCard.getReplacementEffects()) { for (final ReplacementEffect re : effCard.getReplacementEffects()) {
if (re.getMode() == ReplacementType.Moved && "Card.EffectSource+YouOwn".equals(re.getParam("ValidCard"))) { if (re.hasSVar("CommanderMoveReplacement")) {
commanderEffect = effCard; commanderEffect = effCard;
break; break;
} }
@@ -315,15 +315,17 @@ public class GameAction {
java.util.Collections.reverse(cards); java.util.Collections.reverse(cards);
} }
mergedCards = cards; mergedCards = cards;
final SpellAbility saTargeting = cause.getSATargetingCard(); if (cause != null) {
if (saTargeting != null) { final SpellAbility saTargeting = cause.getSATargetingCard();
saTargeting.getTargets().replaceTargetCard(c, cards); if (saTargeting != null) {
} saTargeting.getTargets().replaceTargetCard(c, cards);
// Replace host rememberd cards }
Card hostCard = cause.getHostCard(); // Replace host rememberd cards
if (hostCard.isRemembered(c)) { Card hostCard = cause.getHostCard();
hostCard.removeRemembered(c); if (hostCard.isRemembered(c)) {
hostCard.addRemembered(cards); hostCard.removeRemembered(c);
hostCard.addRemembered(cards);
}
} }
} }

View File

@@ -1286,6 +1286,12 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
source.addRemembered(meld); source.addRemembered(meld);
} }
} }
if (c.hasMergedCard()) {
for (final Card card : c.getMergedCards()) {
if (card == c) continue;
source.addRemembered(card);
}
}
} }
if (forget) { if (forget) {
source.removeRemembered(movedCard); source.removeRemembered(movedCard);

View File

@@ -14,6 +14,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.Localizer;
public class MutateEffect extends SpellAbilityEffect { public class MutateEffect extends SpellAbilityEffect {
@@ -37,7 +38,7 @@ public class MutateEffect extends SpellAbilityEffect {
final Card topCard = host.getController().getController().chooseSingleEntityForEffect( final Card topCard = host.getController().getController().chooseSingleEntityForEffect(
view, view,
sa, sa,
"Choose which creature to be on top", Localizer.getInstance().getMessage("lblChooseCreatureToBeTop"),
false, false,
new HashMap<>() new HashMap<>()
); );
@@ -81,8 +82,8 @@ public class MutateEffect extends SpellAbilityEffect {
target.setTimesMutated(target.getTimesMutated() + 1); target.setTimesMutated(target.getTimesMutated() + 1);
target.updateTokenView(); target.updateTokenView();
if (host.isCommander()) { if (host.isCommander()) {
host.getOwner().updateMergedCommanderInfo(target, host);
target.updateCommanderView(); target.updateCommanderView();
host.getOwner().updateMergedCommanderCast(target, host);
} }
game.getTriggerHandler().runTrigger(TriggerType.Mutates, AbilityKey.mapFromCard(target), false); game.getTriggerHandler().runTrigger(TriggerType.Mutates, AbilityKey.mapFromCard(target), false);

View File

@@ -6257,6 +6257,17 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
public void updateCommanderView() { public void updateCommanderView() {
view.updateCommander(this); 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() { public boolean canMoveToCommandZone() {
return canMoveToCommandZone; return canMoveToCommandZone;

View File

@@ -610,8 +610,14 @@ public class Player extends GameEntity implements Comparable<Player> {
&& !this.getGame().getRules().hasAppliedVariant(GameType.Oathbreaker) && !this.getGame().getRules().hasAppliedVariant(GameType.Oathbreaker)
&& !this.getGame().getRules().hasAppliedVariant(GameType.TinyLeaders) && !this.getGame().getRules().hasAppliedVariant(GameType.TinyLeaders)
&& !this.getGame().getRules().hasAppliedVariant(GameType.Brawl)) { && !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); view.updateCommanderDamage(this);
if (realCommander != source) {
view.updateMergedCommanderDamage(source, realCommander);
}
} }
int old = assignedDamage.containsKey(source) ? assignedDamage.get(source) : 0; int old = assignedDamage.containsKey(source) ? assignedDamage.get(source) : 0;
@@ -2886,8 +2892,9 @@ public class Player extends GameEntity implements Comparable<Player> {
getGame().fireEvent(new GameEventPlayerStatsChanged(this, false)); 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().updateMergedCommanderCast(this, target, commander);
getView().updateMergedCommanderDamage(target, commander);
} }
public int getTotalCommanderCast() { public int getTotalCommanderCast() {

View File

@@ -334,6 +334,15 @@ public class PlayerView extends GameEntityView {
} }
set(TrackableProperty.CommanderDamage, map); 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<Integer, Integer> 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) { public int getCommanderCast(CardView commander) {
Map<Integer, Integer> map = get(TrackableProperty.CommanderCast); Map<Integer, Integer> map = get(TrackableProperty.CommanderCast);

View File

@@ -1863,6 +1863,8 @@ lblChooseCardToMeld=Wähle Karte zum Verschmelzen mit
lblDoYouWantPutLibraryCardsTo=Lege Karte(n) von der Bibliothek nach lblDoYouWantPutLibraryCardsTo=Lege Karte(n) von der Bibliothek nach
#MultiplePilesEffect.java #MultiplePilesEffect.java
lblChooseCardsInTargetPile=Wähle Karten in Stapel {0}? lblChooseCardsInTargetPile=Wähle Karten in Stapel {0}?
#MutateEffect.java
lblChooseCreatureToBeTop=Choose which creature to be the top
#PeekAndRevealEffect.java #PeekAndRevealEffect.java
lblRevealingCardFrom=Zeige Karten von lblRevealingCardFrom=Zeige Karten von
lblRevealCardToOtherPlayers=Zeige die Karten den anderen Spielern? lblRevealCardToOtherPlayers=Zeige die Karten den anderen Spielern?

View File

@@ -1863,6 +1863,8 @@ lblChooseCardToMeld=Choose card to meld with
lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}?
#MultiplePilesEffect.java #MultiplePilesEffect.java
lblChooseCardsInTargetPile=Choose cards in Pile {0}? lblChooseCardsInTargetPile=Choose cards in Pile {0}?
#MutateEffect.java
lblChooseCreatureToBeTop=Choose which creature to be the top
#PeekAndRevealEffect.java #PeekAndRevealEffect.java
lblRevealingCardFrom=Revealing cards from lblRevealingCardFrom=Revealing cards from
lblRevealCardToOtherPlayers=Reveal cards to other players? lblRevealCardToOtherPlayers=Reveal cards to other players?

View File

@@ -1863,6 +1863,8 @@ lblChooseCardToMeld=Elige una carta para fundirla con
lblDoYouWantPutLibraryCardsTo=¿Quieres poner la(s) carta(s) de la biblioteca a {0}? lblDoYouWantPutLibraryCardsTo=¿Quieres poner la(s) carta(s) de la biblioteca a {0}?
#MultiplePilesEffect.java #MultiplePilesEffect.java
lblChooseCardsInTargetPile=¿Elegir las cartas en la Pila {0}? lblChooseCardsInTargetPile=¿Elegir las cartas en la Pila {0}?
#MutateEffect.java
lblChooseCreatureToBeTop=Choose which creature to be the top
#PeekAndRevealEffect.java #PeekAndRevealEffect.java
lblRevealingCardFrom=Mostrando las cartas de lblRevealingCardFrom=Mostrando las cartas de
lblRevealCardToOtherPlayers=¿Mostrar las cartas a otros jugadores? lblRevealCardToOtherPlayers=¿Mostrar las cartas a otros jugadores?

View File

@@ -1863,6 +1863,8 @@ lblChooseCardToMeld=Choose card to meld with
lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}?
#MultiplePilesEffect.java #MultiplePilesEffect.java
lblChooseCardsInTargetPile=Choose cards in Pile {0}? lblChooseCardsInTargetPile=Choose cards in Pile {0}?
#MutateEffect.java
lblChooseCreatureToBeTop=Choose which creature to be the top
#PeekAndRevealEffect.java #PeekAndRevealEffect.java
lblRevealingCardFrom=Revealing cards from lblRevealingCardFrom=Revealing cards from
lblRevealCardToOtherPlayers=Reveal cards to other players? lblRevealCardToOtherPlayers=Reveal cards to other players?

View File

@@ -1863,6 +1863,8 @@ lblChooseCardToMeld=选择要融合的牌
lblDoYouWantPutLibraryCardsTo=你想要从牌库中把牌放入{0}吗? lblDoYouWantPutLibraryCardsTo=你想要从牌库中把牌放入{0}吗?
#MultiplePilesEffect.java #MultiplePilesEffect.java
lblChooseCardsInTargetPile=选择堆{0}中的牌? lblChooseCardsInTargetPile=选择堆{0}中的牌?
#MutateEffect.java
lblChooseCreatureToBeTop=Choose which creature to be the top
#PeekAndRevealEffect.java #PeekAndRevealEffect.java
lblRevealingCardFrom=展示牌自 lblRevealingCardFrom=展示牌自
lblRevealCardToOtherPlayers=向其他玩家展示牌? lblRevealCardToOtherPlayers=向其他玩家展示牌?