package mage.game;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import mage.abilities.Abilities;
import mage.abilities.AbilitiesImpl;
import mage.abilities.Ability;
import mage.counters.Counters;
/**
*
* @author BetaSteward
*/
public class CardState implements Serializable {
protected boolean faceDown;
protected Map<String, String> info;
protected Counters counters;
protected Abilities<Ability> abilities;
private static final Map<String, String> emptyInfo = new HashMap<>();
private static final Abilities<Ability> emptyAbilities = new AbilitiesImpl<>();
public CardState() {
counters = new Counters();
}
public CardState(final CardState state) {
this.faceDown = state.faceDown;
if (state.info != null) {
info = new HashMap<>();
info.putAll(state.info);
}
counters = state.counters.copy();
if (state.abilities != null) {
abilities = new AbilitiesImpl<>();
for (Ability ability : state.abilities) {
abilities.add(ability.copy());
}
}
}
public CardState copy() {
return new CardState(this);
}
public void setFaceDown(boolean value) {
faceDown = value;
}
public boolean isFaceDown() {
return faceDown;
}
public Counters getCounters() {
return counters;
}
public void addInfo(String key, String value) {
if (info == null) {
info = new HashMap<>();
}
if (value == null || value.isEmpty()) {
info.remove(key);
} else {
info.put(key, value);
}
}
public Map<String, String> getInfo() {
if (info == null) {
return emptyInfo;
}
return info;
}
public Abilities<Ability> getAbilities() {
if (abilities == null) {
return emptyAbilities;
}
return abilities;
}
public void addAbility(Ability ability) {
if (abilities == null) {
abilities = new AbilitiesImpl<>();
}
abilities.add(ability);
abilities.addAll(ability.getSubAbilities());
}
public void clearAbilities() {
if (abilities != null) {
// for (Ability ability: abilities) { // Causes problems if temporary (gained) continuous effects are removed
// ability.setSourceId(null);
// ability.setControllerId(null);
// }
abilities = null;
}
}
public void clear() {
counters.clear();
info = null;
clearAbilities();
}
}