* Fixed problems of Yixlid Jailer that removed abilities from cards in graveyard permanently (fixes #1147).

This commit is contained in:
LevelX2 2020-01-03 15:23:52 +01:00
parent 893bcbb01f
commit 8854871c15
28 changed files with 248 additions and 180 deletions

View file

@ -1,6 +1,12 @@
package mage.cards;
import com.google.common.collect.ImmutableList;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import mage.MageObject;
import mage.MageObjectImpl;
import mage.Mana;
@ -26,13 +32,6 @@ import mage.util.SubTypeList;
import mage.watchers.Watcher;
import org.apache.log4j.Logger;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
public abstract class CardImpl extends MageObjectImpl implements Card {
private static final long serialVersionUID = 1L;
@ -240,19 +239,12 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
@Override
public List<String> getRules(Game game) {
try {
List<String> rules = getRules();
List<String> rules = getAbilities(game).getRules(getName());
if (game != null) {
// debug state
CardState cardState = game.getState().getCardState(objectId);
if (cardState != null) {
for (String data : cardState.getInfo().values()) {
rules.add(data);
}
for (Ability ability : cardState.getAbilities()) {
rules.add(ability.getRule());
}
for (String data : game.getState().getCardState(objectId).getInfo().values()) {
rules.add(data);
}
// ability hints
List<String> abilityHints = new ArrayList<>();
if (HintUtils.ABILITY_HINTS_ENABLE) {
@ -267,7 +259,6 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
}
// restrict hints only for permanents, not cards
// total hints
if (!abilityHints.isEmpty()) {
rules.add(HintUtils.HINT_START_MARK);
@ -301,21 +292,31 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
*/
@Override
public Abilities<Ability> getAbilities(Game game) {
Abilities<Ability> otherAbilities = game.getState().getAllOtherAbilities(objectId);
if (otherAbilities == null || otherAbilities.isEmpty()) {
CardState cardState = game.getState().getCardState(this.getId());
if (!cardState.hasLostAllAbilities() && (cardState.getAbilities() == null || cardState.getAbilities().isEmpty())) {
return abilities;
}
Abilities<Ability> all = new AbilitiesImpl<>();
all.addAll(abilities);
all.addAll(otherAbilities);
if (!cardState.hasLostAllAbilities()) {
all.addAll(abilities);
}
all.addAll(cardState.getAbilities());
return all;
}
@Override
public void looseAllAbilities(Game game) {
CardState cardState = game.getState().getCardState(this.getId());
cardState.setLostAllAbilities(true);
cardState.getAbilities().clear();
}
/**
* Public in order to support adding abilities to SplitCardHalf's
*
* @param ability
*/
@Override
public void addAbility(Ability ability) {
ability.setSourceId(this.getId());
abilities.add(ability);