Make the handling of counters more consistent.

This dramatically reduces the code duplication around counters handling.
This commit is contained in:
Samuel Sandeen 2016-09-03 16:52:41 -04:00
parent 148f633672
commit bec11804f5
11 changed files with 116 additions and 134 deletions

View file

@ -23,7 +23,7 @@ public class CountersSourceCount implements DynamicValue {
public int calculate(Game game, Ability sourceAbility, Effect effect) {
Permanent permanent = game.getPermanentOrLKIBattlefield(sourceAbility.getSourceId());
if (permanent != null) {
return permanent.getCounters().getCount(counter);
return permanent.getCounters(game).getCount(counter);
}
return 0;
}

View file

@ -145,7 +145,9 @@ public class AddCountersTargetEffect extends OneShotEffect {
sb.append("s");
}
sb.append(" on ");
Target target = mode.getTargets().get(0);
if (target.getNumberOfTargets() == 0) {
sb.append("up to ");

View file

@ -155,10 +155,6 @@ public interface Card extends MageObject {
Counters getCounters(GameState state);
boolean addCounters(String name, int amount, Game game);
boolean addCounters(String name, int amount, Game game, ArrayList<UUID> appliedEffects);
boolean addCounters(Counter counter, Game game);
boolean addCounters(Counter counter, Game game, ArrayList<UUID> appliedEffects);

View file

@ -664,31 +664,11 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
return state.getCardState(this.objectId).getCounters();
}
@Override
public boolean addCounters(String name, int amount, Game game) {
return addCounters(name, amount, game, null);
}
@Override
public boolean addCounters(String name, int amount, Game game, ArrayList<UUID> appliedEffects) {
boolean returnCode = true;
GameEvent countersEvent = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTERS, objectId, ownerId, name, amount);
countersEvent.setAppliedEffects(appliedEffects);
if (!game.replaceEvent(countersEvent)) {
for (int i = 0; i < countersEvent.getAmount(); i++) {
GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, ownerId, name, 1);
event.setAppliedEffects(appliedEffects);
if (!game.replaceEvent(event)) {
getCounters(game).addCounter(name, 1);
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, ownerId, name, 1));
} else {
returnCode = false;
}
}
} else {
returnCode = false;
}
return returnCode;
/**
* @return The controller if available otherwise the owner.
*/
protected UUID getControllerOrOwner() {
return ownerId;
}
@Override
@ -699,22 +679,27 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
@Override
public boolean addCounters(Counter counter, Game game, ArrayList<UUID> appliedEffects) {
boolean returnCode = true;
GameEvent countersEvent = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTERS, objectId, ownerId, counter.getName(), counter.getCount());
GameEvent countersEvent = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTERS, objectId, getControllerOrOwner(), counter.getName(), counter.getCount());
countersEvent.setAppliedEffects(appliedEffects);
if (!game.replaceEvent(countersEvent)) {
int amount = countersEvent.getAmount();
int finalAmount = amount;
for (int i = 0; i < amount; i++) {
Counter eventCounter = counter.copy();
eventCounter.remove(amount - 1);
GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, ownerId, counter.getName(), 1);
eventCounter.remove(eventCounter.getCount() - 1);
GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, getControllerOrOwner(), counter.getName(), 1);
event.setAppliedEffects(appliedEffects);
if (!game.replaceEvent(event)) {
getCounters(game).addCounter(eventCounter);
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, ownerId, counter.getName(), 1));
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, getControllerOrOwner(), counter.getName(), 1));
} else {
finalAmount--;
returnCode = false;
}
}
if(finalAmount > 0) {
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTERS_ADDED, objectId, getControllerOrOwner(), counter.getName(), amount));
}
} else {
returnCode = false;
}
@ -725,7 +710,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
public void removeCounters(String name, int amount, Game game) {
for (int i = 0; i < amount; i++) {
getCounters(game).removeCounter(name, 1);
GameEvent event = GameEvent.getEvent(GameEvent.EventType.COUNTER_REMOVED, objectId, ownerId);
GameEvent event = GameEvent.getEvent(GameEvent.EventType.COUNTER_REMOVED, objectId, getControllerOrOwner());
event.setData(name);
game.fireEvent(event);
}

View file

@ -346,21 +346,4 @@ public abstract class MeldCard extends CardImpl {
return returnState;
}
}
@Override
public boolean addCounters(String name, int amount, Game game, ArrayList<UUID> appliedEffects) {
if (this.isMelded()) {
return super.addCounters(name, amount, game, appliedEffects);
} else {
// can this really happen?
boolean returnState = true;
if (topLastZoneChangeCounter == topHalfCard.getZoneChangeCounter(game)) {
returnState |= topHalfCard.addCounters(name, amount, game, appliedEffects);
}
if (bottomLastZoneChangeCounter == bottomHalfCard.getZoneChangeCounter(game)) {
returnState |= bottomHalfCard.addCounters(name, amount, game, appliedEffects);
}
return returnState;
}
}
}

View file

@ -104,8 +104,6 @@ public interface Permanent extends Card, Controllable {
void setSecondCardFace(Card card);
Counters getCounters();
List<UUID> getAttachments();
UUID getAttachedTo();

View file

@ -323,11 +323,6 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
getAbilities().clear();
}
@Override
public Counters getCounters() {
return counters;
}
@Override
public Counters getCounters(Game game) {
return counters;
@ -339,44 +334,8 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
}
@Override
public boolean addCounters(Counter counter, Game game, ArrayList<UUID> appliedEffects) {
boolean returnCode = true;
GameEvent countersEvent = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTERS, objectId, controllerId, counter.getName(), counter.getCount());
countersEvent.setAppliedEffects(appliedEffects);
if (!game.replaceEvent(countersEvent)) {
int amount = countersEvent.getAmount();
for (int i = 0; i < amount; i++) {
Counter eventCounter = counter.copy();
eventCounter.remove(eventCounter.getCount() - 1);
GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, controllerId, counter.getName(), 1);
event.setAppliedEffects(appliedEffects);
if (!game.replaceEvent(event)) {
counters.addCounter(eventCounter);
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, controllerId, counter.getName(), 1));
} else {
returnCode = false;
}
}
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTERS_ADDED, objectId, controllerId, counter.getName(), amount));
} else {
returnCode = false;
}
return returnCode;
}
@Override
public void removeCounters(String name, int amount, Game game) {
for (int i = 0; i < amount; i++) {
counters.removeCounter(name, 1);
GameEvent event = GameEvent.getEvent(GameEvent.EventType.COUNTER_REMOVED, objectId, controllerId);
event.setData(name);
game.fireEvent(event);
}
}
@Override
public void removeCounters(Counter counter, Game game) {
removeCounters(counter.getName(), counter.getCount(), game);
protected UUID getControllerOrOwner() {
return controllerId;
}
@Override

View file

@ -159,18 +159,4 @@ public class PermanentMeld extends PermanentCard {
}
return false;
}
@Override
public boolean addCounters(String name, int amount, Game game, ArrayList<UUID> appliedEffects) {
MeldCard meldCard = (MeldCard) this.getCard();
if (meldCard.isMelded()) {
return super.addCounters(name, amount, game, appliedEffects);
} else {
// can this really happen?
boolean returnState = true;
returnState |= meldCard.getTopHalfCard().addCounters(name, amount, game, appliedEffects);
returnState |= meldCard.getBottomHalfCard().addCounters(name, amount, game, appliedEffects);
return returnState;
}
}
}

View file

@ -826,7 +826,6 @@ public class Spell extends StackObjImpl implements Card {
@Override
public Counters getCounters(Game game) {
return card.getCounters(game);
}
@ -835,16 +834,6 @@ public class Spell extends StackObjImpl implements Card {
return card.getCounters(state);
}
@Override
public boolean addCounters(String name, int amount, Game game) {
return card.addCounters(name, amount, game);
}
@Override
public boolean addCounters(String name, int amount, Game game, ArrayList<UUID> appliedEffects) {
return card.addCounters(name, amount, game, appliedEffects);
}
@Override
public boolean addCounters(Counter counter, Game game) {
return card.addCounters(counter, game);

View file

@ -1838,19 +1838,30 @@ public abstract class PlayerImpl implements Player, Serializable {
@Override
public boolean addCounters(Counter counter, Game game) {
boolean returnState = true;
int amount = counter.getCount();
for (int i = 0; i < amount; i++) {
Counter eventCounter = counter.copy();
eventCounter.remove(amount - 1);
if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, playerId, playerId, counter.getName(), counter.getCount()))) {
counters.addCounter(eventCounter);
game.fireEvent(GameEvent.getEvent(EventType.COUNTER_ADDED, playerId, playerId, counter.getName(), counter.getCount()));
} else {
returnState = false;
boolean returnCode = true;
GameEvent countersEvent = GameEvent.getEvent(EventType.ADD_COUNTERS, playerId, playerId, counter.getName(), counter.getCount());
if (!game.replaceEvent(countersEvent)) {
int amount = countersEvent.getAmount();
int finalAmount = amount;
for (int i = 0; i < amount; i++) {
Counter eventCounter = counter.copy();
eventCounter.remove(amount - 1);
GameEvent event = GameEvent.getEvent(EventType.ADD_COUNTER, playerId, playerId, counter.getName(), 1);
if (!game.replaceEvent(event)) {
getCounters().addCounter(eventCounter);
game.fireEvent(GameEvent.getEvent(EventType.COUNTER_ADDED, playerId, playerId, counter.getName(), 1));
} else {
finalAmount--;
returnCode = false;
}
}
if(finalAmount > 0) {
game.fireEvent(GameEvent.getEvent(EventType.COUNTERS_ADDED, playerId, playerId, counter.getName(), amount));
}
} else {
returnCode = false;
}
return returnState;
return returnCode;
}
@Override