Card: add Table for SwitchPT

This commit is contained in:
Hans Mackowiak
2023-07-29 12:21:17 +02:00
parent 137d87c3df
commit ac0087a2ef
27 changed files with 78 additions and 49 deletions

View File

@@ -1735,6 +1735,11 @@ public class ComputerUtilCard {
pumped.setPTBoost(c.getPTBoostTable());
pumped.addPTBoost(power + berserkPower, toughness, timestamp, 0);
pumped.setSwitchPTTable(c.getSwitchPTTable());
if (sa.hasParam("SwitchPT")) {
pumped.addSwitchPT(timestamp, 0);
}
if (!kws.isEmpty()) {
pumped.addChangedCardKeywords(kws, null, false, timestamp, null, false);
}

View File

@@ -57,12 +57,6 @@ public class PumpAi extends PumpAiBase {
return SpecialAiLogic.doAristocratLogic(ai, sa);
} else if (aiLogic.startsWith("AristocratCounters")) {
return SpecialAiLogic.doAristocratWithCountersLogic(ai, sa);
} else if (aiLogic.equals("SwitchPT")) {
// Some more AI would be even better, but this is a good start to prevent spamming
if (sa.isActivatedAbility() && sa.getActivationsThisTurn() > 0 && !sa.usesTargeting()) {
// Will prevent flipping back and forth
return false;
}
}
return super.checkAiLogic(ai, sa, aiLogic);
@@ -83,11 +77,6 @@ public class PumpAi extends PumpAiBase {
if (!ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS) && !isThreatened) {
return false;
}
} else if (logic.equals("SwitchPT")) {
// Some more AI would be even better, but this is a good start to prevent spamming
if (ph.getPhase().isAfter(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE) || !ph.inCombat()) {
return false;
}
}
return super.checkPhaseRestrictions(ai, sa, ph);
}
@@ -104,6 +93,12 @@ public class PumpAi extends PumpAiBase {
return false;
}
}
if (sa.hasParam("SwitchPT")) {
// Some more AI would be even better, but this is a good start to prevent spamming
if (ph.getPhase().isAfter(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE) || !ph.inCombat()) {
return false;
}
}
if (game.getStack().isEmpty() && (ph.getPhase().isBefore(PhaseType.COMBAT_BEGIN)
|| ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS))) {
// Instant-speed pumps should not be cast outside of combat when the
@@ -248,6 +243,14 @@ public class PumpAi extends PumpAiBase {
}
}
if (sa.hasParam("SwitchPT")) {
// Some more AI would be even better, but this is a good start to prevent spamming
if (sa.isActivatedAbility() && sa.getActivationsThisTurn() > 0 && !sa.usesTargeting()) {
// Will prevent flipping back and forth
return false;
}
}
if (ComputerUtil.preventRunAwayActivations(sa)) {
return false;
}
@@ -356,7 +359,7 @@ public class PumpAi extends PumpAiBase {
} // pumpPlayAI()
private boolean pumpTgtAI(final Player ai, final SpellAbility sa, final int defense, final int attack, final boolean mandatory,
boolean immediately) {
boolean immediately) {
final List<String> keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & "))
: Lists.newArrayList();
final Game game = ai.getGame();

View File

@@ -356,6 +356,7 @@ public class GameCopier {
newCard.setPTCharacterDefiningTable(c.getSetPTCharacterDefiningTable());
newCard.setPTBoost(c.getPTBoostTable());
newCard.setSwitchPTTable(c.getSwitchPTTable());
// TODO copy by map
newCard.setDamage(c.getDamage());
newCard.setDamageReceivedThisTurn(c.getDamageReceivedThisTurn());

View File

@@ -45,7 +45,11 @@ public class PumpAllEffect extends SpellAbilityEffect {
continue;
}
boolean redrawPT = false;
boolean redrawPT = sa.hasParam("SwitchPT");
if (sa.hasParam("SwitchPT")) {
tgtC.addSwitchPT(timestamp, 0);
}
if (a != 0 || d != 0) {
if (perpetual) {
@@ -89,6 +93,7 @@ public class PumpAllEffect extends SpellAbilityEffect {
@Override
public void run() {
tgtC.removeSwitchPT(timestamp, 0);
tgtC.removePTBoost(timestamp, 0);
tgtC.removeChangedCardKeywords(timestamp, 0);
tgtC.removeHiddenExtrinsicKeywords(timestamp, 0);

View File

@@ -47,16 +47,19 @@ public class PumpEffect extends SpellAbilityEffect {
final List<String> kws = Lists.newArrayList();
final List<String> hiddenKws = Lists.newArrayList();
boolean redrawPT = false;
boolean redrawPT = sa.hasParam("SwitchPT");
for (String kw : keywords) {
if (kw.startsWith("HIDDEN")) {
hiddenKws.add(kw.substring(7));
redrawPT |= kw.contains("CARDNAME's power and toughness are switched");
} else {
kws.add(kw);
}
}
if (sa.hasParam("SwitchPT")) {
gameCard.addSwitchPT(timestamp, 0);
}
if (a != 0 || d != 0) {
if (perpetual) {
Map <String, Object> params = new HashMap<>();
@@ -113,6 +116,7 @@ public class PumpEffect extends SpellAbilityEffect {
host.removeGainControlTargets(gameCard);
gameCard.removePTBoost(timestamp, 0);
gameCard.removeSwitchPT(timestamp, 0);
boolean updateText = gameCard.removeCanBlockAny(timestamp);
updateText |= gameCard.removeCanBlockAdditional(timestamp);

View File

@@ -265,6 +265,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
private Table<Long, Long, Pair<Integer,Integer>> newPTCharacterDefining = TreeBasedTable.create(); // Layer 7a
private Table<Long, Long, Pair<Integer,Integer>> newPT = TreeBasedTable.create(); // Layer 7b
private Table<Long, Long, Pair<Integer,Integer>> boostPT = TreeBasedTable.create(); // Layer 7c
private Table<Long, Long, Boolean> switchPT = TreeBasedTable.create(); // Layer 7d
private CardDamageHistory damageHistory = new CardDamageHistory();
private final Map<Card, Integer> assignedDamageMap = Maps.newTreeMap();
@@ -4641,13 +4642,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
}
public final StatBreakdown getNetPowerBreakdown() {
if (getAmountOfKeyword("CARDNAME's power and toughness are switched") % 2 != 0) {
if (isSwitchPT()) {
return getUnswitchedToughnessBreakdown();
}
return getUnswitchedPowerBreakdown();
}
public final int getNetPower() {
if (getAmountOfKeyword("CARDNAME's power and toughness are switched") % 2 != 0) {
if (isSwitchPT()) {
return getUnswitchedToughness();
}
return getUnswitchedPower();
@@ -4705,7 +4706,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
}
public final StatBreakdown getNetToughnessBreakdown() {
if (getAmountOfKeyword("CARDNAME's power and toughness are switched") % 2 != 0) {
if (isSwitchPT()) {
return getUnswitchedPowerBreakdown();
}
return getUnswitchedToughnessBreakdown();
@@ -4856,6 +4857,26 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
}
}
public boolean isSwitchPT() {
return switchPT.values().size() % 2 != 0;
}
public void addSwitchPT(final long timestamp, final long staticId) {
switchPT.put(timestamp, staticId, Boolean.TRUE);
}
public void removeSwitchPT(final long timestamp, final long staticId) {
switchPT.remove(timestamp, staticId);
}
public Table<Long, Long, Boolean> getSwitchPTTable() {
return ImmutableTable.copyOf(switchPT);
}
public void setSwitchPTTable(Table<Long, Long, Boolean> table) {
switchPT.clear();
switchPT.putAll(table);
}
public final boolean isUntapped() {
return !tapped;
}

View File

@@ -301,6 +301,7 @@ public class CardCopyService {
// extra copy PT boost
newCopy.setPTBoost(copyFrom.getPTBoostTable());
newCopy.setSwitchPTTable(copyFrom.getSwitchPTTable());
newCopy.setCounters(Maps.newHashMap(copyFrom.getCounters()));

View File

@@ -1,6 +1,5 @@
Name:About Face
ManaCost:R
Types:Instant
A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn.
AI:RemoveDeck:All
A:SP$ Pump | ValidTgts$ Creature | SwitchPT$ True | SpellDescription$ Switch target creature's power and toughness until end of turn.
Oracle:Switch target creature's power and toughness until end of turn.

View File

@@ -3,5 +3,5 @@ ManaCost:3 U
Types:Creature Elemental Beast
PT:2/4
K:Flying
A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | SwitchPT$ True | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
Oracle:Flying\nDiscard a card: Switch Aeromoeba's power and toughness until end of turn.

View File

@@ -2,6 +2,5 @@ Name:Aquamoeba
ManaCost:1 U
Types:Creature Elemental Beast
PT:1/3
A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
AI:RemoveDeck:All
A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | SwitchPT$ True | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
Oracle:Discard a card: Switch Aquamoeba's power and toughness until end of turn.

View File

@@ -4,6 +4,5 @@ Types:Creature Turtle
PT:1/4
K:Shroud
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land you control enters, you may switch CARDNAME power and toughness until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME's power and toughness are switched
AI:RemoveDeck:All
SVar:TrigPump:DB$ Pump | Defined$ Self | SwitchPT$ True
Oracle:Shroud (This creature can't be the target of spells or abilities.)\nLandfall — Whenever a land you control enters, you may switch Calcite Snapper's power and toughness until end of turn.

View File

@@ -2,6 +2,6 @@ Name:Crag Puca
ManaCost:UR UR UR
Types:Creature Shapeshifter
PT:2/4
A:AB$ Pump | Cost$ UR | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
A:AB$ Pump | Cost$ UR | Defined$ Self | SwitchPT$ True | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
AI:RemoveDeck:All
Oracle:{U/R}: Switch Crag Puca's power and toughness until end of turn.

View File

@@ -5,6 +5,5 @@ PT:3/1
K:Flash
K:Flying
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters, switch target creature's power and toughness until end of turn.
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched
AI:RemoveDeck:All
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | SwitchPT$ True
Oracle:Flash\nFlying\nWhen Crookclaw Transmuter enters, switch target creature's power and toughness until end of turn.

View File

@@ -2,6 +2,6 @@ Name:Dwarven Thaumaturgist
ManaCost:2 R
Types:Creature Dwarf Shaman
PT:1/2
A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | TgtPrompt$ Select target creature. | SpellDescription$ Switch target creature's power and toughness until end of turn.
A:AB$ Pump | Cost$ T | ValidTgts$ Creature | SwitchPT$ True | SpellDescription$ Switch target creature's power and toughness until end of turn.
AI:RemoveDeck:All
Oracle:{T}: Switch target creature's power and toughness until end of turn.

View File

@@ -4,7 +4,6 @@ Types:Creature Weird
PT:1/5
K:Flying
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangePT | OptionalDecider$ You | TriggerDescription$ Whenever you cast a instant or sorcery spell, you may switch CARDNAME's power and toughness until end of turn.
SVar:TrigChangePT:DB$ Pump | KW$ HIDDEN CARDNAME's power and toughness are switched | Defined$ Self
AI:RemoveDeck:All
SVar:TrigChangePT:DB$ Pump | Defined$ Self | SwitchPT$ True
DeckHints:Type$Instant|Sorcery
Oracle:Flying\nWhenever you cast an instant or sorcery spell, you may switch Fluxcharger's power and toughness until end of turn.

View File

@@ -1,7 +1,6 @@
Name:Inside Out
ManaCost:1 UR
Types:Instant
A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. | SubAbility$ DBDraw
A:SP$ Pump | ValidTgts$ Creature | SwitchPT$ True | SubAbility$ DBDraw | SpellDescription$ Switch target creature's power and toughness until end of turn.
SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
AI:RemoveDeck:All
Oracle:Switch target creature's power and toughness until end of turn.\nDraw a card.

View File

@@ -1,7 +1,7 @@
Name:Invert
ManaCost:UR
Types:Instant
A:SP$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch the power and toughness of each of up to two target creatures until end of turn.
A:SP$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | SwitchPT$ True | SpellDescription$ Switch the power and toughness of each of up to two target creatures until end of turn.
AlternateMode:Split
Oracle:Switch the power and toughness of each of up to two target creatures until end of turn.

View File

@@ -2,6 +2,5 @@ Name:Mannichi, the Fevered Dream
ManaCost:2 R
Types:Legendary Creature Spirit
PT:1/2
A:AB$ PumpAll | Cost$ 1 R | ValidCards$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch each creature's power and toughness until end of turn.
AI:RemoveDeck:All
A:AB$ PumpAll | Cost$ 1 R | ValidCards$ Creature | SwitchPT$ True | SpellDescription$ Switch each creature's power and toughness until end of turn.
Oracle:{1}{R}: Switch each creature's power and toughness until end of turn.

View File

@@ -2,6 +2,5 @@ Name:Merfolk Thaumaturgist
ManaCost:2 U
Types:Creature Merfolk Wizard
PT:1/2
A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | TgtPrompt$ Select target creature. | SpellDescription$ Switch target creature's power and toughness until end of turn.
AI:RemoveDeck:All
A:AB$ Pump | Cost$ T | ValidTgts$ Creature | SwitchPT$ True | SpellDescription$ Switch target creature's power and toughness until end of turn.
Oracle:{T}: Switch target creature's power and toughness until end of turn.

View File

@@ -2,6 +2,6 @@ Name:Myr Quadropod
ManaCost:4
Types:Artifact Creature Myr
PT:1/4
A:AB$ Pump | Cost$ 3 | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
A:AB$ Pump | Cost$ 3 | Defined$ Self | SwitchPT$ True | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
AI:RemoveDeck:All
Oracle:{3}: Switch Myr Quadropod's power and toughness until end of turn.

View File

@@ -3,5 +3,5 @@ ManaCost:3 B
Types:Creature Illusion
PT:1/5
A:AB$ Pump | Cost$ B | Defined$ Self | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn.
A:AB$ Pump | Cost$ 1 U | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
A:AB$ Pump | Cost$ 1 U | Defined$ Self | SwitchPT$ True | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
Oracle:{B}: Phantasmal Fiend gets +1/-1 until end of turn.\n{1}{U}: Switch Phantasmal Fiend's power and toughness until end of turn.

View File

@@ -2,7 +2,6 @@ Name:Strange Inversion
ManaCost:2 R
Types:Instant Arcane
K:Splice:Arcane:1 R
A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn.
AI:RemoveDeck:All
A:SP$ Pump | ValidTgts$ Creature | SwitchPT$ True | SpellDescription$ Switch target creature's power and toughness until end of turn.
DeckHints:Type$Arcane
Oracle:Switch target creature's power and toughness until end of turn.\nSplice onto Arcane {1}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.)

View File

@@ -1,6 +1,5 @@
Name:Transmutation
ManaCost:1 B
Types:Instant
A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn.
AI:RemoveDeck:All
A:SP$ Pump | ValidTgts$ Creature | SwitchPT$ True | SpellDescription$ Switch target creature's power and toughness until end of turn.
Oracle:Switch target creature's power and toughness until end of turn.

View File

@@ -3,6 +3,5 @@ ManaCost:3 U
Types:Creature Shapeshifter
PT:1/4
K:Changeling
A:AB$ Pump | Cost$ 1 U | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
AI:RemoveDeck:All
A:AB$ Pump | Cost$ 1 U | Defined$ Self | SwitchPT$ True | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
Oracle:Changeling (This card is every creature type.)\n{1}{U}: Switch Turtleshell Changeling's power and toughness until end of turn.

View File

@@ -3,6 +3,6 @@ ManaCost:4 R
Types:Creature Elemental Boar
PT:1/7
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, switch its power and toughness until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME's power and toughness are switched
SVar:TrigPump:DB$ Pump | Defined$ Self | SwitchPT$ True
AI:RemoveDeck:Random
Oracle:Whenever Valakut Fireboar attacks, switch its power and toughness until end of turn.

View File

@@ -5,5 +5,5 @@ R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementRe
SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True
A:AB$ Mana | Cost$ T | Produced$ Combo U R | SpellDescription$ Add {U} or {R}.
A:AB$ Animate | Cost$ 2 U R | Defined$ Self | Power$ 1 | Toughness$ 4 | Types$ Creature,Elemental | Colors$ Blue,Red | OverwriteColors$ True | Abilities$ ABPump | SpellDescription$ Until end of turn, CARDNAME becomes a 1/4 blue and red Elemental creature with "{0}: Switch this creature's power and toughness until end of turn." It's still a land.
SVar:ABPump:AB$ Pump | Cost$ 0 | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch this creature's power and toughness until end of turn.
SVar:ABPump:AB$ Pump | Cost$ 0 | Defined$ Self | SwitchPT$ True | SpellDescription$ Switch this creature's power and toughness until end of turn.
Oracle:Wandering Fumarole enters tapped.\n{T}: Add {U} or {R}.\n{2}{U}{R}: Until end of turn, Wandering Fumarole becomes a 1/4 blue and red Elemental creature with "{0}: Switch this creature's power and toughness until end of turn." It's still a land.

View File

@@ -5,6 +5,6 @@ PT:1/3
K:Flying
A:AB$ Pump | Cost$ W | Defined$ Self | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn.
A:AB$ Pump | Cost$ W | Defined$ Self | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn.
A:AB$ Pump | Cost$ U | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
A:AB$ Pump | Cost$ U | Defined$ Self | SwitchPT$ True | SpellDescription$ Switch CARDNAME's power and toughness until end of turn.
A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand.
Oracle:Flying\n{W}: Windreaver gains vigilance until end of turn.\n{W}: Windreaver gets +0/+1 until end of turn.\n{U}: Switch Windreaver's power and toughness until end of turn.\n{U}: Return Windreaver to its owner's hand.