Skip to content

Commit f023b87

Browse files
authored
Emerge: refactor keyword (Card-Forge#9480)
* Emerge: refactor keyword
1 parent 79e9ae4 commit f023b87

File tree

5 files changed

+55
-31
lines changed

5 files changed

+55
-31
lines changed

forge-game/src/main/java/forge/game/card/Card.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2575,14 +2575,8 @@ public final String keywordsToText(final Collection<KeywordInterface> keywords)
25752575
}
25762576
}
25772577
sbLong.append("\r\n");
2578-
} else if (keyword.startsWith("Emerge")) {
2579-
final String[] k = keyword.split(":");
2580-
sbLong.append(k[0]);
2581-
if (k.length > 2) {
2582-
sbLong.append(" from ").append(k[2].toLowerCase());
2583-
}
2584-
sbLong.append(" ").append(ManaCostParser.parse(k[1]));
2585-
sbLong.append(" (").append(inst.getReminderText()).append(")");
2578+
} else if (keyword.startsWith("Emerge") && inst instanceof Emerge emerge) {
2579+
sbLong.append(emerge.getTitle()).append(" (").append(inst.getReminderText()).append(")");
25862580
sbLong.append("\r\n");
25872581
} else if (inst.getKeyword().equals(Keyword.COMPANION)) {
25882582
sbLong.append("Companion — ");

forge-game/src/main/java/forge/game/card/CardFactoryUtil.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import forge.game.event.GameEventCardForetold;
3434
import forge.game.event.GameEventCardPlotted;
3535
import forge.game.keyword.Devour;
36+
import forge.game.keyword.Emerge;
3637
import forge.game.keyword.Keyword;
3738
import forge.game.keyword.KeywordInterface;
3839
import forge.game.player.Player;
@@ -2896,20 +2897,13 @@ else if (part instanceof CostCollectEvidence) {
28962897
newSA.getRestrictions().setZone(ZoneType.Graveyard);
28972898
newSA.setIntrinsic(intrinsic);
28982899
inst.addSpellAbility(newSA);
2899-
} else if (keyword.startsWith("Emerge")) {
2900-
final String[] kw = keyword.split(":");
2901-
String costStr = kw[1];
2902-
String validStr = kw.length > 2 ? kw[2] : "Creature";
2903-
String desc = "(Emerge";
2904-
if (kw.length > 2) {
2905-
desc += " from " + kw[2].toLowerCase();
2906-
}
2907-
desc += ")";
2900+
} else if (keyword.startsWith("Emerge") && inst instanceof Emerge emerge) {
2901+
String desc = "(" + emerge.getTitleWithoutCost() + ")";
29082902

29092903
final SpellAbility sa = card.getFirstSpellAbilityWithFallback();
2910-
final SpellAbility newSA = sa.copyWithDefinedCost(new Cost(costStr, false));
2904+
final SpellAbility newSA = sa.copyWithDefinedCost(emerge.getCost());
29112905

2912-
newSA.getRestrictions().setIsPresent(validStr + ".YouCtrl+CanBeSacrificedBy");
2906+
newSA.getRestrictions().setIsPresent(emerge.getValidType() + ".YouCtrl+CanBeSacrificedBy");
29132907
newSA.putParam("Secondary", "True");
29142908
newSA.setAlternativeCost(AlternativeCost.Emerge);
29152909

forge-game/src/main/java/forge/game/cost/CostAdjustment.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import forge.game.ability.AbilityKey;
1313
import forge.game.ability.AbilityUtils;
1414
import forge.game.card.*;
15+
import forge.game.keyword.Emerge;
1516
import forge.game.keyword.Keyword;
1617
import forge.game.keyword.KeywordInterface;
1718
import forge.game.mana.ManaCostBeingPaid;
@@ -245,8 +246,8 @@ else if (stAb.checkMode(StaticAbilityMode.SetCost)) {
245246
if (sa.isSpell() && sa.isOffering()) {
246247
adjustCostByOffering(cost, sa);
247248
}
248-
if (sa.isSpell() && sa.isEmerge()) {
249-
adjustCostByEmerge(cost, sa);
249+
if (sa.isSpell() && sa.isEmerge() && sa.getKeyword() instanceof Emerge emerge) {
250+
adjustCostByEmerge(cost, sa, emerge);
250251
}
251252

252253
// Set cost (only used by Trinisphere) is applied last
@@ -398,10 +399,8 @@ private static void adjustCostByOffering(final ManaCostBeingPaid cost, final Spe
398399
toSac.setUsedToPay(true); //stop it from interfering with mana input
399400
}
400401

401-
private static void adjustCostByEmerge(final ManaCostBeingPaid cost, final SpellAbility sa) {
402-
String kw = sa.getKeyword().getOriginal();
403-
String k[] = kw.split(":");
404-
String validStr = k.length > 2 ? k[2] : "Creature";
402+
private static void adjustCostByEmerge(final ManaCostBeingPaid cost, final SpellAbility sa, final Emerge emerge) {
403+
String validStr = emerge.getValidType();
405404
Player p = sa.getActivatingPlayer();
406405
CardCollectionView canEmerge = CardLists.filter(p.getCardsIn(ZoneType.Battlefield),
407406
CardPredicates.restriction(validStr, p, sa.getHostCard(), sa),
Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,48 @@
11
package forge.game.keyword;
22

3-
public class Emerge extends KeywordWithCostAndType {
3+
import java.util.Locale;
4+
5+
import forge.card.CardType;
6+
import forge.game.cost.Cost;
7+
8+
public class Emerge extends KeywordWithCost {
9+
protected String type = null;
10+
protected String descType = null;
11+
12+
public String getValidType() { return type == null ? "Creature" : type; }
13+
public String getTypeDescription() { return descType; }
14+
15+
public String getTitle() {
16+
StringBuilder sb = new StringBuilder();
17+
sb.append(getTitleWithoutCost());
18+
sb.append(" ").append(cost.toSimpleString());
19+
return sb.toString();
20+
}
21+
22+
public String getTitleWithoutCost() {
23+
StringBuilder sb = new StringBuilder();
24+
sb.append(getKeyword());
25+
if (type != null) {
26+
sb.append(" from ").append(getTypeDescription());
27+
}
28+
return sb.toString();
29+
}
30+
31+
@Override
432
protected void parse(String details) {
533
final String[] k = details.split(":");
6-
if (k.length < 2) {
7-
super.parse("Creature:" + k[0]);
8-
} else {
9-
// Flip parameters
10-
super.parse(k[1] + ":" + k[0]);
34+
cost = new Cost(k[0], false);
35+
descType = "creature";
36+
if (k.length >= 2) {
37+
descType = type = k[1];
38+
if (CardType.isACardType(descType)) {
39+
descType = descType.toLowerCase(Locale.ENGLISH);
40+
}
1141
}
1242
}
43+
44+
@Override
45+
protected String formatReminderText(String reminderText) {
46+
return String.format(reminderText, cost.toSimpleString(), descType);
47+
}
1348
}

forge-game/src/main/java/forge/game/keyword/KeywordWithCost.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
public class KeywordWithCost extends KeywordInstance<KeywordWithCost> {
66
protected Cost cost;
77

8+
public Cost getCost() { return cost; }
9+
810
@Override
911
protected void parse(String details) {
1012
String[] allDetails = details.split(":");

0 commit comments

Comments
 (0)