forked from External/mage
Tokens and command objects reworked (part 1 of 2):
- fixed that copy effect doesn't restore original image after effect's end; - removed outdated availableImageSetCodes (all images auto-selected from tokens database now, related to #10139); - refactor command objects to use CommandObjectImpl; - refactor planes/emblems/etc objects to use MageObjectImpl, added copyable support; - refactor another game objects to remove some duplicated fields;
This commit is contained in:
parent
46f6593da8
commit
5f55c7c667
45 changed files with 517 additions and 477 deletions
|
|
@ -18,8 +18,4 @@ public interface CommandObject extends MageObject, Controllable {
|
|||
|
||||
@Override
|
||||
CommandObject copy();
|
||||
|
||||
String getExpansionSetCodeForImage();
|
||||
|
||||
void setExpansionSetCodeForImage(String expansionSetCodeForImage);
|
||||
}
|
||||
|
|
|
|||
92
Mage/src/main/java/mage/game/command/CommandObjectImpl.java
Normal file
92
Mage/src/main/java/mage/game/command/CommandObjectImpl.java
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
package mage.game.command;
|
||||
|
||||
import mage.game.permanent.token.TokenImpl;
|
||||
import mage.util.GameLog;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author JayDi85
|
||||
*/
|
||||
public abstract class CommandObjectImpl implements CommandObject {
|
||||
|
||||
private UUID id;
|
||||
private String name = "";
|
||||
|
||||
private String expansionSetCode;
|
||||
private String cardNumber;
|
||||
private int imageNumber;
|
||||
|
||||
public CommandObjectImpl(String name) {
|
||||
this.id = UUID.randomUUID();
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
protected CommandObjectImpl(final CommandObjectImpl object) {
|
||||
this.id = object.id;
|
||||
this.name = object.name;
|
||||
this.expansionSetCode = object.expansionSetCode;
|
||||
this.cardNumber = object.cardNumber;
|
||||
this.imageNumber = object.imageNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExpansionSetCode() {
|
||||
return expansionSetCode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setExpansionSetCode(String expansionSetCode) {
|
||||
this.expansionSetCode = expansionSetCode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCardNumber() {
|
||||
return cardNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCardNumber(String cardNumber) {
|
||||
this.cardNumber = cardNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getImageNumber() {
|
||||
return imageNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setImageNumber(Integer imageNumber) {
|
||||
this.imageNumber = imageNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assignNewId() {
|
||||
this.id = UUID.randomUUID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdName() {
|
||||
return getName() + " [" + getId().toString().substring(0, 3) + ']';
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLogName() {
|
||||
return GameLog.getColoredObjectIdName(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -23,7 +23,7 @@ import java.util.List;
|
|||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class Commander implements CommandObject {
|
||||
public class Commander extends CommandObjectImpl {
|
||||
|
||||
private final Card sourceObject;
|
||||
private boolean copy;
|
||||
|
|
@ -31,6 +31,7 @@ public class Commander implements CommandObject {
|
|||
private final Abilities<Ability> abilities = new AbilitiesImpl<>();
|
||||
|
||||
public Commander(Card card) {
|
||||
super(card.getName());
|
||||
this.sourceObject = card;
|
||||
|
||||
// All abilities must be added to the game before usage. It adding by addCard and addCommandObject calls
|
||||
|
|
@ -106,6 +107,7 @@ public class Commander implements CommandObject {
|
|||
}
|
||||
|
||||
private Commander(final Commander commander) {
|
||||
super(commander);
|
||||
this.sourceObject = commander.sourceObject.copy();
|
||||
this.copy = commander.copy;
|
||||
this.copyFrom = (commander.copyFrom != null ? commander.copyFrom.copy() : null);
|
||||
|
|
@ -127,10 +129,6 @@ public class Commander implements CommandObject {
|
|||
return sourceObject.getOwnerId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assignNewId() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandObject copy() {
|
||||
return new Commander(this);
|
||||
|
|
@ -162,15 +160,6 @@ public class Commander implements CommandObject {
|
|||
return sourceObject.getName() + " [" + sourceObject.getId().toString().substring(0, 3) + ']';
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLogName() {
|
||||
return GameLog.getColoredObjectIdName(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String name) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CardType> getCardType(Game game) {
|
||||
return sourceObject.getCardType(game);
|
||||
|
|
@ -289,21 +278,6 @@ public class Commander implements CommandObject {
|
|||
return sourceObject.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImageName() {
|
||||
return sourceObject.getImageName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExpansionSetCodeForImage() {
|
||||
return sourceObject.getExpansionSetCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setExpansionSetCodeForImage(String expansionSetCodeForImage) {
|
||||
throw new IllegalStateException("Can't change a set code of the commander, source card already has it");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZoneChangeCounter(Game game) {
|
||||
return sourceObject.getZoneChangeCounter(game);
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ import java.util.*;
|
|||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class Dungeon implements CommandObject {
|
||||
public class Dungeon extends CommandObjectImpl {
|
||||
|
||||
private static final Set<String> dungeonNames = new HashSet<>();
|
||||
|
||||
|
|
@ -49,31 +49,24 @@ public class Dungeon implements CommandObject {
|
|||
private static final ObjectColor emptyColor = new ObjectColor();
|
||||
private static final ManaCosts<ManaCost> emptyCost = new ManaCostsImpl<>();
|
||||
|
||||
private final String name;
|
||||
private UUID id;
|
||||
private UUID controllerId;
|
||||
private boolean copy;
|
||||
private MageObject copyFrom; // copied card INFO (used to call original adjusters)
|
||||
private FrameStyle frameStyle;
|
||||
private final Abilities<Ability> abilites = new AbilitiesImpl<>();
|
||||
private String expansionSetCodeForImage;
|
||||
private final List<DungeonRoom> dungeonRooms = new ArrayList<>();
|
||||
private DungeonRoom currentRoom = null;
|
||||
|
||||
public Dungeon(String name, String expansionSetCodeForImage) {
|
||||
this.id = UUID.randomUUID();
|
||||
this.name = name;
|
||||
this.expansionSetCodeForImage = expansionSetCodeForImage;
|
||||
public Dungeon(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
public Dungeon(final Dungeon dungeon) {
|
||||
this.id = dungeon.id;
|
||||
this.name = dungeon.name;
|
||||
super(dungeon);
|
||||
this.frameStyle = dungeon.frameStyle;
|
||||
this.controllerId = dungeon.controllerId;
|
||||
this.copy = dungeon.copy;
|
||||
this.copyFrom = (dungeon.copyFrom != null ? dungeon.copyFrom : null);
|
||||
this.expansionSetCodeForImage = dungeon.expansionSetCodeForImage;
|
||||
this.copyRooms(dungeon);
|
||||
}
|
||||
|
||||
|
|
@ -91,7 +84,7 @@ public class Dungeon implements CommandObject {
|
|||
|
||||
public void addRoom(DungeonRoom room) {
|
||||
this.dungeonRooms.add(room);
|
||||
room.getRoomTriggeredAbility().setSourceId(id);
|
||||
room.getRoomTriggeredAbility().setSourceId(this.getId());
|
||||
this.abilites.add(room.getRoomTriggeredAbility());
|
||||
}
|
||||
|
||||
|
|
@ -173,11 +166,6 @@ public class Dungeon implements CommandObject {
|
|||
return frameStyle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assignNewId() {
|
||||
this.id = UUID.randomUUID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MageObject getSourceObject() {
|
||||
return null;
|
||||
|
|
@ -214,30 +202,6 @@ public class Dungeon implements CommandObject {
|
|||
return this.copyFrom;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdName() {
|
||||
return getName() + " [" + getId().toString().substring(0, 3) + ']';
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLogName() {
|
||||
return GameLog.getColoredObjectIdName(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImageName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String name) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CardType> getCardType(Game game) {
|
||||
return emptyList;
|
||||
|
|
@ -326,26 +290,11 @@ public class Dungeon implements CommandObject {
|
|||
public void setStartingDefense(int startingDefense) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dungeon copy() {
|
||||
return new Dungeon(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExpansionSetCodeForImage() {
|
||||
return expansionSetCodeForImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setExpansionSetCodeForImage(String expansionSetCodeForImage) {
|
||||
this.expansionSetCodeForImage = expansionSetCodeForImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZoneChangeCounter(Game game) {
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -13,11 +13,14 @@ import mage.abilities.effects.ContinuousEffect;
|
|||
import mage.abilities.effects.Effect;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.FrameStyle;
|
||||
import mage.cards.repository.TokenInfo;
|
||||
import mage.cards.repository.TokenRepository;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.ZoneChangeEvent;
|
||||
import mage.game.permanent.token.TokenImpl;
|
||||
import mage.util.GameLog;
|
||||
import mage.util.RandomUtil;
|
||||
import mage.util.SubTypes;
|
||||
|
|
@ -27,40 +30,31 @@ import java.util.*;
|
|||
/**
|
||||
* @author nantuko
|
||||
*/
|
||||
public class Emblem implements CommandObject {
|
||||
public abstract class Emblem extends CommandObjectImpl {
|
||||
|
||||
private static final List<CardType> emptyList = Collections.unmodifiableList(new ArrayList<>());
|
||||
private static final ObjectColor emptyColor = new ObjectColor();
|
||||
private static final ManaCosts emptyCost = new ManaCostsImpl<>();
|
||||
|
||||
private String name = "";
|
||||
private UUID id;
|
||||
private UUID controllerId;
|
||||
private MageObject sourceObject;
|
||||
private boolean copy;
|
||||
private MageObject copyFrom; // copied card INFO (used to call original adjusters)
|
||||
private FrameStyle frameStyle;
|
||||
private Abilities<Ability> abilites = new AbilitiesImpl<>();
|
||||
private String expansionSetCodeForImage = "";
|
||||
|
||||
// list of set codes emblem images are available for
|
||||
protected List<String> availableImageSetCodes = new ArrayList<>();
|
||||
|
||||
public Emblem() {
|
||||
this.id = UUID.randomUUID();
|
||||
public Emblem(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
public Emblem(final Emblem emblem) {
|
||||
this.id = emblem.id;
|
||||
this.name = emblem.name;
|
||||
super(emblem);
|
||||
this.frameStyle = emblem.frameStyle;
|
||||
this.controllerId = emblem.controllerId;
|
||||
this.sourceObject = emblem.sourceObject;
|
||||
this.copy = emblem.copy;
|
||||
this.copyFrom = (emblem.copyFrom != null ? emblem.copyFrom : null);
|
||||
this.abilites = emblem.abilites.copy();
|
||||
this.expansionSetCodeForImage = emblem.expansionSetCodeForImage;
|
||||
this.availableImageSetCodes = emblem.availableImageSetCodes;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -68,25 +62,18 @@ public class Emblem implements CommandObject {
|
|||
return frameStyle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assignNewId() {
|
||||
this.id = UUID.randomUUID();
|
||||
}
|
||||
|
||||
public void setSourceObject(MageObject sourceObject) {
|
||||
this.sourceObject = sourceObject;
|
||||
if (sourceObject instanceof Card) {
|
||||
if (name.isEmpty()) {
|
||||
name = sourceObject.getSubtype().toString();
|
||||
}
|
||||
if (expansionSetCodeForImage.isEmpty()) {
|
||||
expansionSetCodeForImage = ((Card) sourceObject).getExpansionSetCode();
|
||||
}
|
||||
if (!availableImageSetCodes.isEmpty()) {
|
||||
if (expansionSetCodeForImage.equals("") || !availableImageSetCodes.contains(expansionSetCodeForImage)) {
|
||||
expansionSetCodeForImage = availableImageSetCodes.get(RandomUtil.nextInt(availableImageSetCodes.size()));
|
||||
}
|
||||
}
|
||||
|
||||
// choose set code due source
|
||||
TokenInfo foundInfo = TokenRepository.instance.generateTokenInfoBySetCode(this.getClass().getName(), sourceObject.getExpansionSetCode());
|
||||
if (foundInfo != null) {
|
||||
this.setExpansionSetCode(foundInfo.getSetCode());
|
||||
this.setCardNumber("");
|
||||
this.setImageNumber(foundInfo.getImageNumber());
|
||||
} else {
|
||||
// how-to fix: add emblem to the tokens-database
|
||||
throw new IllegalArgumentException("Wrong code usage: can't find token info for the emblem: " + this.getClass().getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -113,6 +100,9 @@ public class Emblem implements CommandObject {
|
|||
this.abilites.setControllerId(controllerId);
|
||||
}
|
||||
|
||||
@Override
|
||||
abstract public Emblem copy();
|
||||
|
||||
@Override
|
||||
public void setCopy(boolean isCopy, MageObject copyFrom) {
|
||||
this.copy = isCopy;
|
||||
|
|
@ -129,31 +119,6 @@ public class Emblem implements CommandObject {
|
|||
return this.copyFrom;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdName() {
|
||||
return getName() + " [" + getId().toString().substring(0, 3) + ']';
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLogName() {
|
||||
return GameLog.getColoredObjectIdName(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImageName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CardType> getCardType(Game game) {
|
||||
return emptyList;
|
||||
|
|
@ -242,26 +207,6 @@ public class Emblem implements CommandObject {
|
|||
public void setStartingDefense(int startingDefense) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Emblem copy() {
|
||||
return new Emblem(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExpansionSetCodeForImage() {
|
||||
return expansionSetCodeForImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setExpansionSetCodeForImage(String expansionSetCodeForImage) {
|
||||
this.expansionSetCodeForImage = expansionSetCodeForImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZoneChangeCounter(Game game) {
|
||||
return 1; // Emblems can't move zones until now so return always 1
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ import mage.abilities.effects.ContinuousEffect;
|
|||
import mage.abilities.effects.Effect;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.FrameStyle;
|
||||
import mage.cards.repository.TokenInfo;
|
||||
import mage.cards.repository.TokenRepository;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Planes;
|
||||
import mage.constants.SubType;
|
||||
|
|
@ -29,29 +31,28 @@ import java.util.*;
|
|||
/**
|
||||
* @author spjspj
|
||||
*/
|
||||
public class Plane implements CommandObject {
|
||||
public abstract class Plane extends CommandObjectImpl {
|
||||
|
||||
private static final List<CardType> emptyList = Collections.unmodifiableList(new ArrayList<>());
|
||||
private static final ObjectColor emptyColor = new ObjectColor();
|
||||
private static final ManaCosts emptyCost = new ManaCostsImpl<>();
|
||||
|
||||
private Planes planeType = null;
|
||||
private UUID id;
|
||||
|
||||
private UUID controllerId;
|
||||
private MageObject sourceObject;
|
||||
private boolean copy;
|
||||
private MageObject copyFrom; // copied card INFO (used to call original adjusters)
|
||||
private FrameStyle frameStyle;
|
||||
private Abilities<Ability> abilites = new AbilitiesImpl<>();
|
||||
private String expansionSetCodeForImage = "";
|
||||
|
||||
public Plane() {
|
||||
this.id = UUID.randomUUID();
|
||||
super("");
|
||||
this.frameStyle = FrameStyle.M15_NORMAL;
|
||||
}
|
||||
|
||||
public Plane(final Plane plane) {
|
||||
this.id = plane.id;
|
||||
super(plane);
|
||||
this.planeType = plane.planeType;
|
||||
this.frameStyle = plane.frameStyle;
|
||||
this.controllerId = plane.controllerId;
|
||||
|
|
@ -59,7 +60,6 @@ public class Plane implements CommandObject {
|
|||
this.copy = plane.copy;
|
||||
this.copyFrom = (plane.copyFrom != null ? plane.copyFrom.copy() : null);
|
||||
this.abilites = plane.abilites.copy();
|
||||
this.expansionSetCodeForImage = plane.expansionSetCodeForImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -67,17 +67,18 @@ public class Plane implements CommandObject {
|
|||
return frameStyle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assignNewId() {
|
||||
this.id = UUID.randomUUID();
|
||||
}
|
||||
public void setSourceObject() {
|
||||
this.sourceObject = null;
|
||||
|
||||
public void setSourceObject(MageObject sourceObject) {
|
||||
this.sourceObject = sourceObject;
|
||||
if (sourceObject instanceof Card) {
|
||||
if (expansionSetCodeForImage.isEmpty()) {
|
||||
expansionSetCodeForImage = ((Card) sourceObject).getExpansionSetCode();
|
||||
}
|
||||
// choose set code due source
|
||||
TokenInfo foundInfo = TokenRepository.instance.generateTokenInfoBySetCode(this.getClass().getName(), null);
|
||||
if (foundInfo != null) {
|
||||
this.setExpansionSetCode(foundInfo.getSetCode());
|
||||
this.setCardNumber("");
|
||||
this.setImageNumber(foundInfo.getImageNumber());
|
||||
} else {
|
||||
// how-to fix: add plane to the tokens-database
|
||||
throw new IllegalArgumentException("Wrong code usage: can't find token info for the plane: " + this.getClass().getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -104,6 +105,9 @@ public class Plane implements CommandObject {
|
|||
this.abilites.setControllerId(controllerId);
|
||||
}
|
||||
|
||||
@Override
|
||||
abstract public Plane copy();
|
||||
|
||||
@Override
|
||||
public void setCopy(boolean isCopy, MageObject copyFrom) {
|
||||
this.copy = isCopy;
|
||||
|
|
@ -125,21 +129,6 @@ public class Plane implements CommandObject {
|
|||
return planeType != null ? planeType.getFullName() : "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdName() {
|
||||
return getName() + " [" + getId().toString().substring(0, 3) + ']';
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLogName() {
|
||||
return GameLog.getColoredObjectIdName(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImageName() {
|
||||
return planeType != null ? planeType.getFullName() : "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String name) {
|
||||
throw new UnsupportedOperationException("Planes don't use setName, use setPlaneType instead");
|
||||
|
|
@ -241,29 +230,9 @@ public class Plane implements CommandObject {
|
|||
public void setStartingDefense(int startingDefense) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Plane copy() {
|
||||
return new Plane(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExpansionSetCodeForImage() {
|
||||
return expansionSetCodeForImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setExpansionSetCodeForImage(String expansionSetCodeForImage) {
|
||||
this.expansionSetCodeForImage = expansionSetCodeForImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZoneChangeCounter(Game game) {
|
||||
return 1; // Emblems can't move zones until now so return always 1
|
||||
return 1; // Planes can't move zones until now so return always 1
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -311,6 +280,7 @@ public class Plane implements CommandObject {
|
|||
Constructor<?> cons = c.getConstructor();
|
||||
Object plane = cons.newInstance();
|
||||
if (plane instanceof Plane) {
|
||||
// TODO: generate image for plane here?
|
||||
return (Plane) plane;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue