allow abilities to be added to cards in other zones

This commit is contained in:
BetaSteward 2011-10-02 21:23:40 -04:00
parent 900fde090f
commit da45bf8f8c
3 changed files with 37 additions and 1 deletions

View file

@ -45,7 +45,7 @@ import mage.target.Target;
*
* @author BetaSteward_at_googlemail.com
*/
public class GainAbilityTargetEffect extends ContinuousEffectImpl {
public class GainAbilityTargetEffect extends ContinuousEffectImpl<GainAbilityTargetEffect> {
protected Ability ability;

View file

@ -33,10 +33,14 @@ import mage.game.events.GameEvent;
import mage.game.stack.SpellStack;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import mage.Constants.Zone;
import mage.abilities.Abilities;
import mage.abilities.AbilitiesImpl;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.DelayedTriggeredAbilities;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.SpecialActions;
@ -89,6 +93,7 @@ public class GameState implements Serializable, Copyable<GameState> {
private TriggeredAbilities triggers;
private DelayedTriggeredAbilities delayed;
private SpecialActions specialActions;
private Map<UUID, Abilities<ActivatedAbility>> otherAbilities = new HashMap<UUID, Abilities<ActivatedAbility>>();
private Combat combat;
private TurnMods turnMods;
private Watchers watchers;
@ -144,6 +149,9 @@ public class GameState implements Serializable, Copyable<GameState> {
for (Map.Entry<UUID, Zone> entry: state.zones.entrySet()) {
zones.put(entry.getKey(), entry.getValue());
}
for (Map.Entry<UUID, Abilities<ActivatedAbility>> entry: state.otherAbilities.entrySet()) {
otherAbilities.put(entry.getKey(), entry.getValue().copy());
}
}
@Override
@ -274,6 +282,7 @@ public class GameState implements Serializable, Copyable<GameState> {
player.reset();
}
battlefield.reset(game);
resetOtherAbilities();
effects.apply(game);
battlefield.fireControlChangeEvents(game);
}
@ -409,6 +418,26 @@ public class GameState implements Serializable, Copyable<GameState> {
values.put(valueId, value);
}
public Abilities<ActivatedAbility> getOtherAbilities(UUID objectId, Zone zone) {
if (otherAbilities.containsKey(objectId)) {
return otherAbilities.get(objectId).getActivatedAbilities(zone);
}
return null;
}
public void addOtherAbility(UUID objectId, ActivatedAbility ability) {
if (!otherAbilities.containsKey(objectId)) {
otherAbilities.put(objectId, new AbilitiesImpl());
}
otherAbilities.get(objectId).add(ability);
}
private void resetOtherAbilities() {
for (Abilities<ActivatedAbility> abilities: otherAbilities.values()) {
abilities.clear();
}
}
public void clear() {
battlefield.clear();
effects.clear();
@ -422,6 +451,7 @@ public class GameState implements Serializable, Copyable<GameState> {
turnNum = 0;
gameOver = false;
specialActions.clear();
otherAbilities.clear();
combat.clear();
turnMods.clear();
watchers.clear();

View file

@ -689,6 +689,12 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
}
}
}
Abilities<ActivatedAbility> otherAbilities = game.getState().getOtherAbilities(object.getId(), zone);
if (otherAbilities != null) {
for (ActivatedAbility ability: otherAbilities) {
useable.put(ability.getId(), ability);
}
}
return useable;
}