diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index aa35c2ffd71e..c40f4d195e24 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2920,6 +2920,9 @@ public static final List getSpellsFromPlayEffect(final Card tgtCar if (tgtCard.isModal() && tgtCard.hasState(CardStateName.Backside)) { collectSpellsForPlayEffect(list, tgtCard.getState(CardStateName.Backside), controller, withAltCost); } + if (tgtCard.hasState(CardStateName.Secondary)) { + collectSpellsForPlayEffect(list, tgtCard.getState(CardStateName.Secondary), controller, withAltCost); + } for (SpellAbility s : list) { if (s.isLandAbility()) { 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 b874a1e9a960..62a974601754 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -70,6 +70,7 @@ import java.util.*; import java.util.Map.Entry; +import java.util.function.Consumer; import java.util.function.Predicate; import static java.lang.Math.max; @@ -2999,24 +3000,7 @@ public String getAbilityText(final CardState state) { String sAbility = formatSpellAbility(sa); - // add Adventure to AbilityText - if (sa.isAdventure() && state.getStateName().equals(CardStateName.Original)) { - StringBuilder sbSA = new StringBuilder(); - sbSA.append(Localizer.getInstance().getMessage("lblAdventure")); - sbSA.append(" — ").append(CardTranslation.getTranslatedName(getState(CardStateName.Secondary))); - sbSA.append(" ").append(sa.getPayCosts().toSimpleString()); - sbSA.append(": "); - sbSA.append(sAbility); - sAbility = sbSA.toString(); - } else if (sa.isOmen() && state.getStateName().equals(CardStateName.Original)) { - StringBuilder sbSA = new StringBuilder(); - sbSA.append(Localizer.getInstance().getMessage("lblOmen")); - sbSA.append(" — ").append(CardTranslation.getTranslatedName(getState(CardStateName.Secondary))); - sbSA.append(" ").append(sa.getPayCosts().toSimpleString()); - sbSA.append(": "); - sbSA.append(sAbility); - sAbility = sbSA.toString(); - } else if (sa.isSpell() && sa.isBasicSpell()) { + if (sa.isSpell() && sa.isBasicSpell()) { continue; } else if (sa.hasParam("DescriptionFromChosenName") && !getNamedCard().isEmpty()) { String name = getNamedCard(); @@ -3438,16 +3422,13 @@ public boolean hasNoAbilities() { return false; } for (SpellAbility sa : getSpellAbilities()) { - // while Adventure and Omen are part of Secondary - if ((sa.isAdventure() || sa.isOmen()) && !getCurrentStateName().equals(sa.getCardStateName())) { - continue; - } if (sa.isLandAbility()) { continue; } - if (!(sa instanceof SpellPermanent && sa.isBasicSpell())) { - return false; + if (sa.isBasicSpell() && sa.getPayCosts().isOnlyManaCost()) { + continue; } + return false; } return true; } @@ -3457,11 +3438,6 @@ public void updateSpellAbilities(List list, CardState state) { ck.applySpellAbility(list); } - if (!isInPlay() && hasState(CardStateName.Secondary) && state.getStateName() == CardStateName.Original) { - // Adventure and Omen may only be cast not from Battlefield - list.addAll(getState(CardStateName.Secondary).getSpellAbilities()); - } - // keywords should already been cleanup by layers getUnhiddenKeywords(state).applySpellAbility(list); } @@ -7392,10 +7368,7 @@ public List getAllPossibleAbilities(final Player player, final boo public List getAllPossibleAbilities(final Player player, final boolean removeUnplayable, final Multimap unhiddenAltCost) { CardState oState = getOriginalState(CardStateName.Original); final List abilities = Lists.newArrayList(); - for (SpellAbility sa : getSpellAbilities()) { - if (sa.isAdventure() && isOnAdventure()) { - continue; // skip since it's already on adventure - } + Consumer consumer = sa -> { abilities.add(sa); //add alternative costs as additional spell abilities List altCost = GameActionUtil.getAlternativeCosts(sa, player, false); @@ -7403,6 +7376,12 @@ public List getAllPossibleAbilities(final Player player, final boo if (unhiddenAltCost != null) { unhiddenAltCost.putAll(sa, altCost); } + }; + for (SpellAbility sa : getSpellAbilities()) { + if (sa.isAdventure() && isOnAdventure()) { + continue; // skip since it's already on adventure + } + consumer.accept(sa); } if (isFaceDown() && isInZone(ZoneType.Exile)) { @@ -7423,12 +7402,19 @@ public List getAllPossibleAbilities(final Player player, final boo for (SpellAbility sa : getState(CardStateName.Backside).getSpellAbilities()) { // only add Spells there if (sa.isSpell() || sa.isLandAbility()) { - abilities.add(sa); - List altCost = GameActionUtil.getAlternativeCosts(sa, player, false); - abilities.addAll(altCost); - if (unhiddenAltCost != null) { - unhiddenAltCost.putAll(sa, altCost); - } + consumer.accept(sa); + } + } + } + + if (!isInPlay() && hasState(CardStateName.Secondary) && getCurrentStateName() == CardStateName.Original) { + for (SpellAbility sa : getState(CardStateName.Secondary).getSpellAbilities()) { + if (sa.isAdventure() && isOnAdventure()) { + continue; // skip since it's already on adventure + } + // only add Spells there + if (sa.isSpell() || sa.isLandAbility()) { + consumer.accept(sa); } } } diff --git a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java index 995b4d657f42..209c46031939 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java @@ -657,14 +657,30 @@ public static String composeCardText(final CardStateView state, final GameView g area.append("Owner: ").append(card.getOwner().toString()); } - if (card.hasPreparedSpell()) { - area.append("\n\n"); - area.append(Localizer.getInstance().getMessage("lblPrepared") + " — " - + card.getAlternateState().getName() + " " - + card.getAlternateState().getManaCost().toString() + ": " - + card.getAlternateState().getAbilityText() - ); + if (card.hasAlternateState() && state.getState() == CardStateName.Original) { + if (card.getAlternateState().getType().hasSubtype("Adventure")) { + area.append("\n\n"); + area.append(Localizer.getInstance().getMessage("lblAdventure") + " — " + getAlternateStateDesc(card)); + } + + if (card.getAlternateState().getType().hasSubtype("Omen")) { + area.append("\n\n"); + area.append(Localizer.getInstance().getMessage("lblOmen") + " — " + getAlternateStateDesc(card)); + } + + if (card.hasPreparedSpell()) { + area.append("\n\n"); + area.append(Localizer.getInstance().getMessage("lblPrepared") + " — " + getAlternateStateDesc(card)); + } } + return area.toString().trim(); } + + protected static String getAlternateStateDesc(CardView card) { + CardStateView state = card.getAlternateState(); + return state.getName() + " " + + state.getManaCost().toString() + ": " + + (card.getId() > 0 ? state.getAbilityText() : state.getOracleText()); + } }