mirror of
https://github.com/magefree/mage.git
synced 2026-01-09 20:32:06 -08:00
Using unique/special new event type for taking special actions and special mana payment(fixes #6753).
This commit is contained in:
parent
08d9e8cfa0
commit
75c4ff7d8e
9 changed files with 45 additions and 6 deletions
|
|
@ -14,6 +14,7 @@ import mage.abilities.effects.common.CreateSpecialActionEffect;
|
||||||
import mage.abilities.effects.common.RemoveSpecialActionEffect;
|
import mage.abilities.effects.common.RemoveSpecialActionEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.AbilityType;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
|
@ -75,6 +76,7 @@ class ChannelSpecialAction extends SpecialAction {
|
||||||
|
|
||||||
ChannelSpecialAction() {
|
ChannelSpecialAction() {
|
||||||
super();
|
super();
|
||||||
|
this.abilityType = AbilityType.SPECIAL_MANA_PAYMENT;
|
||||||
this.addCost(new PayLifeCost(1));
|
this.addCost(new PayLifeCost(1));
|
||||||
this.addEffect(new BasicManaEffect(Mana.ColorlessMana(1)));
|
this.addEffect(new BasicManaEffect(Mana.ColorlessMana(1)));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,8 @@ public class DampingEngine extends CardImpl {
|
||||||
public DampingEngine(UUID ownerId, CardSetInfo setInfo) {
|
public DampingEngine(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
|
||||||
|
|
||||||
// A player who controls more permanents than each other player can't play lands or cast artifact, creature, or enchantment spells. That player may sacrifice a permanent for that player to ignore this effect until end of turn.
|
// A player who controls more permanents than each other player can't play lands or cast artifact, creature, or enchantment spells.
|
||||||
|
// That player may sacrifice a permanent for that player to ignore this effect until end of turn.
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DampingEngineEffect()));
|
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DampingEngineEffect()));
|
||||||
this.addAbility(new DampingEngineSpecialAction());
|
this.addAbility(new DampingEngineSpecialAction());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,7 @@ class AssistSpecialAction extends SpecialAction {
|
||||||
|
|
||||||
AssistSpecialAction(ManaCost unpaid, AlternateManaPaymentAbility manaAbility) {
|
AssistSpecialAction(ManaCost unpaid, AlternateManaPaymentAbility manaAbility) {
|
||||||
super(Zone.ALL, manaAbility);
|
super(Zone.ALL, manaAbility);
|
||||||
|
this.abilityType = AbilityType.SPECIAL_MANA_PAYMENT;
|
||||||
setRuleVisible(false);
|
setRuleVisible(false);
|
||||||
this.addEffect(new AssistEffect(unpaid));
|
this.addEffect(new AssistEffect(unpaid));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -173,6 +173,7 @@ class ConvokeSpecialAction extends SpecialAction {
|
||||||
|
|
||||||
public ConvokeSpecialAction(ManaCost unpaid, AlternateManaPaymentAbility manaAbility) {
|
public ConvokeSpecialAction(ManaCost unpaid, AlternateManaPaymentAbility manaAbility) {
|
||||||
super(Zone.ALL, manaAbility);
|
super(Zone.ALL, manaAbility);
|
||||||
|
this.abilityType = AbilityType.SPECIAL_MANA_PAYMENT;
|
||||||
setRuleVisible(false);
|
setRuleVisible(false);
|
||||||
this.addEffect(new ConvokeEffect(unpaid));
|
this.addEffect(new ConvokeEffect(unpaid));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,7 @@ class DelveSpecialAction extends SpecialAction {
|
||||||
|
|
||||||
public DelveSpecialAction(AlternateManaPaymentAbility manaAbility) {
|
public DelveSpecialAction(AlternateManaPaymentAbility manaAbility) {
|
||||||
super(Zone.ALL, manaAbility);
|
super(Zone.ALL, manaAbility);
|
||||||
|
this.abilityType = AbilityType.SPECIAL_MANA_PAYMENT;
|
||||||
this.addEffect(new DelveEffect());
|
this.addEffect(new DelveEffect());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,7 @@ class ImproviseSpecialAction extends SpecialAction {
|
||||||
|
|
||||||
public ImproviseSpecialAction(ManaCost unpaid, AlternateManaPaymentAbility manaAbility) {
|
public ImproviseSpecialAction(ManaCost unpaid, AlternateManaPaymentAbility manaAbility) {
|
||||||
super(Zone.ALL, manaAbility);
|
super(Zone.ALL, manaAbility);
|
||||||
|
this.abilityType = AbilityType.SPECIAL_MANA_PAYMENT;
|
||||||
setRuleVisible(false);
|
setRuleVisible(false);
|
||||||
this.addEffect(new ImproviseEffect(unpaid));
|
this.addEffect(new ImproviseEffect(unpaid));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,8 @@ public enum AbilityType {
|
||||||
TRIGGERED("Triggered", false),
|
TRIGGERED("Triggered", false),
|
||||||
EVASION("Evasion", false),
|
EVASION("Evasion", false),
|
||||||
LOYALTY("Loyalty", false),
|
LOYALTY("Loyalty", false),
|
||||||
SPECIAL_ACTION("Special Action", false);
|
SPECIAL_ACTION("Special Action", false),
|
||||||
|
SPECIAL_MANA_PAYMENT("Special Mana Payment", false); // No activated ability and no special action. (e.g. Improvise, Delve)
|
||||||
|
|
||||||
private final String text;
|
private final String text;
|
||||||
private final boolean playCardAbility;
|
private final boolean playCardAbility;
|
||||||
|
|
|
||||||
|
|
@ -156,12 +156,18 @@ public class GameEvent implements Serializable {
|
||||||
sourceId sourceId of the object with that ability
|
sourceId sourceId of the object with that ability
|
||||||
playerId player that tries to use this ability
|
playerId player that tries to use this ability
|
||||||
*/
|
*/
|
||||||
TAKE_SPECIAL_ACTION, TAKEN_SPECIAL_ACTION, // not used in implementation yet
|
TAKE_SPECIAL_ACTION, TAKEN_SPECIAL_ACTION,
|
||||||
/* TAKE_SPECIAL_ACTION, TAKEN_SPECIAL_ACTION,
|
/* TAKE_SPECIAL_ACTION, TAKEN_SPECIAL_ACTION,
|
||||||
targetId id of the ability to activate / use
|
targetId id of the ability to activate / use
|
||||||
sourceId sourceId of the object with that ability
|
sourceId sourceId of the object with that ability
|
||||||
playerId player that tries to use this ability
|
playerId player that tries to use this ability
|
||||||
*/
|
*/
|
||||||
|
TAKE_SPECIAL_MANA_PAYMENT, TAKEN_SPECIAL_MANA_PAYMENT,
|
||||||
|
/* TAKE_SPECIAL_MANA_PAYMENT, TAKEN_SPECIAL_MANA_PAYMENT
|
||||||
|
targetId id of the ability to activate / use
|
||||||
|
sourceId sourceId of the object with that ability
|
||||||
|
playerId player that tries to use this ability
|
||||||
|
*/
|
||||||
TRIGGERED_ABILITY,
|
TRIGGERED_ABILITY,
|
||||||
RESOLVING_ABILITY,
|
RESOLVING_ABILITY,
|
||||||
COPY_STACKOBJECT, COPIED_STACKOBJECT,
|
COPY_STACKOBJECT, COPIED_STACKOBJECT,
|
||||||
|
|
|
||||||
|
|
@ -1378,11 +1378,11 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
|
|
||||||
protected boolean specialAction(SpecialAction action, Game game) {
|
protected boolean specialAction(SpecialAction action, Game game) {
|
||||||
//20091005 - 114
|
//20091005 - 114
|
||||||
if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATE_ABILITY,
|
if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TAKE_SPECIAL_ACTION,
|
||||||
action.getId(), action.getSourceId(), getId()))) {
|
action.getId(), action.getSourceId(), getId()))) {
|
||||||
int bookmark = game.bookmarkState();
|
int bookmark = game.bookmarkState();
|
||||||
if (action.activate(game, false)) {
|
if (action.activate(game, false)) {
|
||||||
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATED_ABILITY,
|
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.TAKEN_SPECIAL_ACTION,
|
||||||
action.getId(), action.getSourceId(), getId()));
|
action.getId(), action.getSourceId(), getId()));
|
||||||
if (!game.isSimulation()) {
|
if (!game.isSimulation()) {
|
||||||
game.informPlayers(getLogName() + action.getGameLogMessage(game));
|
game.informPlayers(getLogName() + action.getGameLogMessage(game));
|
||||||
|
|
@ -1397,7 +1397,29 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean specialManaPayment(SpecialAction action, Game game) {
|
||||||
|
//20091005 - 114
|
||||||
|
if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TAKE_SPECIAL_MANA_PAYMENT,
|
||||||
|
action.getId(), action.getSourceId(), getId()))) {
|
||||||
|
int bookmark = game.bookmarkState();
|
||||||
|
if (action.activate(game, false)) {
|
||||||
|
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.TAKEN_SPECIAL_MANA_PAYMENT,
|
||||||
|
action.getId(), action.getSourceId(), getId()));
|
||||||
|
if (!game.isSimulation()) {
|
||||||
|
game.informPlayers(getLogName() + action.getGameLogMessage(game));
|
||||||
|
}
|
||||||
|
if (action.resolve(game)) {
|
||||||
|
game.removeBookmark(bookmark);
|
||||||
|
resetStoredBookmark(game);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
restoreState(bookmark, action.getRule(), game);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean activateAbility(ActivatedAbility ability, Game game) {
|
public boolean activateAbility(ActivatedAbility ability, Game game) {
|
||||||
if (ability == null) {
|
if (ability == null) {
|
||||||
|
|
@ -1445,6 +1467,9 @@ public abstract class PlayerImpl implements Player, Serializable {
|
||||||
case SPECIAL_ACTION:
|
case SPECIAL_ACTION:
|
||||||
result = specialAction((SpecialAction) ability.copy(), game);
|
result = specialAction((SpecialAction) ability.copy(), game);
|
||||||
break;
|
break;
|
||||||
|
case SPECIAL_MANA_PAYMENT:
|
||||||
|
result = specialManaPayment((SpecialAction) ability.copy(), game);
|
||||||
|
break;
|
||||||
case MANA:
|
case MANA:
|
||||||
result = playManaAbility((ActivatedManaAbilityImpl) ability.copy(), game);
|
result = playManaAbility((ActivatedManaAbilityImpl) ability.copy(), game);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue