mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Fix commander damage record and view, also other bugs
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
@@ -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=向其他玩家展示牌?
|
||||||
|
|||||||
Reference in New Issue
Block a user