[STX] Implemented Dramatic Finale

This commit is contained in:
Evan Kranzler 2021-04-08 18:56:18 -04:00
parent 79b23d3292
commit 6ff3ca5c1e
7 changed files with 107 additions and 71 deletions

View file

@ -2,8 +2,6 @@
package mage.abilities;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import mage.MageObject;
import mage.constants.Zone;
import mage.game.Game;
@ -13,6 +11,9 @@ import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
import org.apache.log4j.Logger;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author BetaSteward_at_googlemail.com
* <p>
@ -39,7 +40,7 @@ public class TriggeredAbilities extends ConcurrentHashMap<String, TriggeredAbili
}
public void checkStateTriggers(Game game) {
for (Iterator<TriggeredAbility> it = this.values().iterator(); it.hasNext();) {
for (Iterator<TriggeredAbility> it = this.values().iterator(); it.hasNext(); ) {
TriggeredAbility ability = it.next();
if (ability instanceof StateTriggeredAbility && ((StateTriggeredAbility) ability).canTrigger(game)) {
checkTrigger(ability, null, game);
@ -48,7 +49,7 @@ public class TriggeredAbilities extends ConcurrentHashMap<String, TriggeredAbili
}
public void checkTriggers(GameEvent event, Game game) {
for (Iterator<TriggeredAbility> it = this.values().iterator(); it.hasNext();) {
for (Iterator<TriggeredAbility> it = this.values().iterator(); it.hasNext(); ) {
TriggeredAbility ability = it.next();
if (ability.checkEventType(event, game)) {
checkTrigger(ability, event, game);
@ -90,7 +91,7 @@ public class TriggeredAbilities extends ConcurrentHashMap<String, TriggeredAbili
}
}
if (ability.checkTrigger(event, game)) {
if (ability.checkTrigger(event, game) && ability.checkTriggeredAlready(game)) {
NumberOfTriggersEvent numberOfTriggersEvent = new NumberOfTriggersEvent(ability, event);
if (!game.replaceEvent(numberOfTriggersEvent)) {
for (int i = 0; i < numberOfTriggersEvent.getAmount(); i++) {
@ -105,8 +106,8 @@ public class TriggeredAbilities extends ConcurrentHashMap<String, TriggeredAbili
/**
* Adds a by sourceId gained triggered ability
*
* @param ability - the gained ability
* @param sourceId - the source that assigned the ability
* @param ability - the gained ability
* @param sourceId - the source that assigned the ability
* @param attachedTo - the object that gained the ability
*/
public void add(TriggeredAbility ability, UUID sourceId, MageObject attachedTo) {

View file

@ -1,12 +1,12 @@
package mage.abilities;
import java.util.UUID;
import mage.game.Game;
import mage.game.events.GameEvent;
import java.util.UUID;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public interface TriggeredAbility extends Ability {
@ -37,6 +37,10 @@ public interface TriggeredAbility extends Ability {
*/
boolean checkTrigger(GameEvent event, Game game);
boolean checkTriggeredAlready(Game game);
TriggeredAbility setTriggersOnce(boolean triggersOnce);
boolean checkInterveningIfClause(Game game);
boolean isOptional();

View file

@ -8,13 +8,13 @@ import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.PermanentToken;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.Locale;
import java.util.UUID;
import mage.game.permanent.Permanent;
import mage.game.permanent.PermanentToken;
/**
* @author BetaSteward_at_googlemail.com
@ -23,6 +23,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
protected boolean optional;
protected boolean leavesTheBattlefieldTrigger;
private boolean triggersOnce = false;
public TriggeredAbilityImpl(Zone zone, Effect effect) {
this(zone, effect, false);
@ -48,16 +49,43 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
super(ability);
this.optional = ability.optional;
this.leavesTheBattlefieldTrigger = ability.leavesTheBattlefieldTrigger;
this.triggersOnce = ability.triggersOnce;
}
@Override
public void trigger(Game game, UUID controllerId) {
//20091005 - 603.4
if (checkInterveningIfClause(game)) {
addthing(game);
game.addTriggeredAbility(this);
}
}
private final void addthing(Game game) {
if (!triggersOnce) {
return;
}
game.getState().setValue(CardUtil.getCardZoneString(
"lastTurnTriggered" + originalId, sourceId, game
), game.getTurnNum());
}
@Override
public boolean checkTriggeredAlready(Game game) {
if (!triggersOnce) {
return true;
}
Integer lastTurnTriggered = (Integer) game.getState().getValue(
CardUtil.getCardZoneString("lastTurnTriggered" + originalId, sourceId, game)
);
return lastTurnTriggered == null || lastTurnTriggered != game.getTurnNum();
}
public TriggeredAbility setTriggersOnce(boolean triggersOnce) {
this.triggersOnce = triggersOnce;
return this;
}
@Override
public boolean checkInterveningIfClause(Game game) {
return true;
@ -130,6 +158,9 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
}
sb.append(superRule);
if (triggersOnce) {
sb.append(" This abilities triggers only once each turn.");
}
}
return sb.toString();
@ -247,7 +278,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
if (!source.hasSourceObjectAbility(game, sourceObject, event)) {
return false; // the permanent does currently not have or before it dies the ability so no trigger
}
// check now it is in graveyard (only if it is no token and was the target itself)
if (source.getSourceId().equals(event.getTargetId()) // source is also the target
&& !(sourceObject instanceof PermanentToken) // it's no token