mirror of
https://github.com/correl/mage.git
synced 2024-11-16 03:00:12 +00:00
* Kicker and Multikicker - Fixed a bug that the kicked status was not reset if needed (e.g. a Quag Vampires returning from exile of Fiend Hunter had again +1/+1 counters if he was kicked before).
This commit is contained in:
parent
1ab6b72e8a
commit
8259814afd
5 changed files with 42 additions and 14 deletions
|
@ -106,7 +106,7 @@ class RumblingAftershocksTriggeredAbility extends TriggeredAbilityImpl<RumblingA
|
||||||
int damageAmount = 0;
|
int damageAmount = 0;
|
||||||
for (Ability ability: (Abilities<Ability>) spell.getAbilities()) {
|
for (Ability ability: (Abilities<Ability>) spell.getAbilities()) {
|
||||||
if (ability instanceof KickerAbility) {
|
if (ability instanceof KickerAbility) {
|
||||||
damageAmount += ((KickerAbility) ability).getKickedCounter();
|
damageAmount += ((KickerAbility) ability).getKickedCounter(game);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (damageAmount > 0) {
|
if (damageAmount > 0) {
|
||||||
|
|
|
@ -64,7 +64,7 @@ public class BoldDefense extends CardImpl<BoldDefense> {
|
||||||
|
|
||||||
|
|
||||||
ContinuousEffect effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent(), false);
|
ContinuousEffect effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent(), false);
|
||||||
this.getSpellAbility().addEffect(new ConditionalContinousEffect(effect, KickedCondition.getInstance(), staticText));
|
this.getSpellAbility().addEffect(new ConditionalContinousEffect(effect, KickedCondition.getInstance(), staticText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
public BoldDefense(final BoldDefense card) {
|
public BoldDefense(final BoldDefense card) {
|
||||||
|
|
|
@ -59,7 +59,7 @@ public class KickedCondition implements Condition {
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
for (Ability ability: card.getAbilities()) {
|
for (Ability ability: card.getAbilities()) {
|
||||||
if (ability instanceof KickerAbility) {
|
if (ability instanceof KickerAbility) {
|
||||||
if(((KickerAbility) ability).isKicked()) {
|
if(((KickerAbility) ability).isKicked(game)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ public class MultikickerCount implements DynamicValue {
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
for (Ability ability: card.getAbilities()) {
|
for (Ability ability: card.getAbilities()) {
|
||||||
if (ability instanceof KickerAbility) {
|
if (ability instanceof KickerAbility) {
|
||||||
count += ((KickerAbility) ability).getKickedCounter();
|
count += ((KickerAbility) ability).getKickedCounter(game);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,8 @@ import mage.abilities.costs.OptionalAdditionalSourceCosts;
|
||||||
import mage.abilities.costs.mana.GenericManaCost;
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.costs.mana.VariableManaCost;
|
import mage.abilities.costs.mana.VariableManaCost;
|
||||||
|
import mage.cards.Card;
|
||||||
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
@ -90,6 +92,8 @@ public class KickerAbility extends StaticAbility<KickerAbility> implements Optio
|
||||||
protected String reminderText;
|
protected String reminderText;
|
||||||
protected List<OptionalAdditionalCost> kickerCosts = new LinkedList<OptionalAdditionalCost>();
|
protected List<OptionalAdditionalCost> kickerCosts = new LinkedList<OptionalAdditionalCost>();
|
||||||
private int xManaValue = 0;
|
private int xManaValue = 0;
|
||||||
|
// needed to reset kicked status, if card changes zone after casting it
|
||||||
|
private int zoneChangeCounter = 0;
|
||||||
|
|
||||||
public KickerAbility(String manaString) {
|
public KickerAbility(String manaString) {
|
||||||
this(KICKER_KEYWORD, KICKER_REMINDER_MANA);
|
this(KICKER_KEYWORD, KICKER_REMINDER_MANA);
|
||||||
|
@ -115,6 +119,7 @@ public class KickerAbility extends StaticAbility<KickerAbility> implements Optio
|
||||||
this.keywordText = ability.keywordText;
|
this.keywordText = ability.keywordText;
|
||||||
this.reminderText = ability.reminderText;
|
this.reminderText = ability.reminderText;
|
||||||
this.xManaValue = ability.xManaValue;
|
this.xManaValue = ability.xManaValue;
|
||||||
|
this.zoneChangeCounter = ability.zoneChangeCounter;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,25 +144,35 @@ public class KickerAbility extends StaticAbility<KickerAbility> implements Optio
|
||||||
for (OptionalAdditionalCost cost: kickerCosts) {
|
for (OptionalAdditionalCost cost: kickerCosts) {
|
||||||
cost.reset();
|
cost.reset();
|
||||||
}
|
}
|
||||||
|
zoneChangeCounter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getXManaValue() {
|
public int getXManaValue() {
|
||||||
return xManaValue;
|
return xManaValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getKickedCounter() {
|
public int getKickedCounter(Game game) {
|
||||||
int counter = 0;
|
if (isKicked(game)) {
|
||||||
for (OptionalAdditionalCost cost: kickerCosts) {
|
int counter = 0;
|
||||||
counter += cost.getActivateCount();
|
for (OptionalAdditionalCost cost: kickerCosts) {
|
||||||
|
counter += cost.getActivateCount();
|
||||||
|
}
|
||||||
|
return counter;
|
||||||
}
|
}
|
||||||
return counter;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isKicked() {
|
public boolean isKicked(Game game) {
|
||||||
for (OptionalAdditionalCost cost: kickerCosts) {
|
Card card = game.getCard(sourceId);
|
||||||
if(cost.isActivated()) {
|
// kicked status counts only if card not changed zone since it was kicked
|
||||||
return true;
|
if (card != null && card.getZoneChangeCounter() <= zoneChangeCounter +1) {
|
||||||
|
for (OptionalAdditionalCost cost: kickerCosts) {
|
||||||
|
if(cost.isActivated()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
this.resetKicker();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -166,6 +181,19 @@ public class KickerAbility extends StaticAbility<KickerAbility> implements Optio
|
||||||
return kickerCosts;
|
return kickerCosts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void activateKicker(OptionalAdditionalCost kickerCost, Game game) {
|
||||||
|
kickerCost.activate();
|
||||||
|
// remember zone change counter
|
||||||
|
if (zoneChangeCounter == 0) {
|
||||||
|
Card card = game.getCard(sourceId);
|
||||||
|
if (card != null) {
|
||||||
|
zoneChangeCounter = card.getZoneChangeCounter();
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Kicker source card not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addOptionalAdditionalCosts(Ability ability, Game game) {
|
public void addOptionalAdditionalCosts(Ability ability, Game game) {
|
||||||
if (ability instanceof SpellAbility) {
|
if (ability instanceof SpellAbility) {
|
||||||
|
@ -182,7 +210,7 @@ public class KickerAbility extends StaticAbility<KickerAbility> implements Optio
|
||||||
}
|
}
|
||||||
if (kickerCost.canPay(sourceId, controllerId, game) &&
|
if (kickerCost.canPay(sourceId, controllerId, game) &&
|
||||||
player.chooseUse(Outcome.Benefit, new StringBuilder("Pay ").append(times).append(kickerCost.getText(false)).append(" ?").toString(), game)) {
|
player.chooseUse(Outcome.Benefit, new StringBuilder("Pay ").append(times).append(kickerCost.getText(false)).append(" ?").toString(), game)) {
|
||||||
kickerCost.activate();
|
this.activateKicker(kickerCost, game);
|
||||||
for (Iterator it = ((Costs) kickerCost).iterator(); it.hasNext();) {
|
for (Iterator it = ((Costs) kickerCost).iterator(); it.hasNext();) {
|
||||||
Cost cost = (Cost) it.next();
|
Cost cost = (Cost) it.next();
|
||||||
if (cost instanceof ManaCostsImpl) {
|
if (cost instanceof ManaCostsImpl) {
|
||||||
|
|
Loading…
Reference in a new issue