package forge; import java.util.ArrayList; import java.util.Arrays; import java.util.Observable; /** * <p>DefaultPlayerZone class.</p> * * @author Forge * @version $Id: $ */ public class DefaultPlayerZone extends PlayerZone implements java.io.Serializable { /** Constant <code>serialVersionUID=-5687652485777639176L</code> */ private static final long serialVersionUID = -5687652485777639176L; private ArrayList<Card> cards = new ArrayList<Card>(); private String zoneName; private Player player; private boolean update = true; private CardList cardsAddedThisTurn = new CardList(); private ArrayList<String> cardsAddedThisTurnSource = new ArrayList<String>(); /** * <p>Constructor for DefaultPlayerZone.</p> * * @param zone a {@link java.lang.String} object. * @param inPlayer a {@link forge.Player} object. */ public DefaultPlayerZone(String zone, Player inPlayer) { zoneName = zone; player = inPlayer; } //************ BEGIN - these methods fire updateObservers() ************* /** * * @param o a {@link java.lang.Object} object. */ public void add(Object o) { Card c = (Card) o; if (!c.isImmutable()) //Immutable cards are usually emblems,effects and the mana pool and we don't want to log those. { cardsAddedThisTurn.add(c); if (AllZone.getZone(c) != null) { cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); } else { cardsAddedThisTurnSource.add("None"); } } if (is("Graveyard") && c.hasKeyword("When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and shuffle it into its owner's library instead.")) { PlayerZone lib = AllZone.getZone(Constant.Zone.Library, c.getOwner()); lib.add(c); c.getOwner().shuffle(); return; } //slight difference from above I guess, the card gets put into the grave first, then shuffled into library. //key is that this would trigger abilities that trigger on cards hitting the graveyard else if (is("Graveyard") && c.hasKeyword("When CARDNAME is put into a graveyard from anywhere, shuffle it into its owner's library.")) { PlayerZone lib = AllZone.getZone(Constant.Zone.Library, c.getOwner()); PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, c.getOwner()); grave.addOnce(c); grave.remove(c); lib.add(c); c.getOwner().shuffle(); return; } if (is("Graveyard") && c.hasKeyword("When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and its owner shuffles his or her graveyard into his or her library.")) { PlayerZone lib = AllZone.getZone(Constant.Zone.Library, c.getOwner()); PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, c.getOwner()); lib.add(c); for (Card gc : AllZoneUtil.getPlayerGraveyard(c.getOwner())) lib.add(gc); grave.reset(); c.getOwner().shuffle(); return; } if (c.isUnearthed() && (is("Graveyard") || is("Hand") || is("Library"))) { PlayerZone removed = AllZone.getZone(Constant.Zone.Exile, c.getOwner()); removed.add(c); c.setUnearthed(false); return; } c.addObserver(this); c.setTurnInZone(AllZone.getPhase().getTurn()); cards.add((Card) c); update(); } //hack... use for adding Dread / Serra Avenger to grave /** * * @param o a {@link java.lang.Object} object. */ public void addOnce(Object o) { Card c = (Card) o; if (!c.isImmutable()) //Immutable cards are usually emblems,effects and the mana pool and we don't want to log those. { cardsAddedThisTurn.add(c); if (AllZone.getZone(c) != null) { cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); } else { cardsAddedThisTurnSource.add("None"); } } c.addObserver(this); cards.add((Card) c); update(); } /** * * @param ob * @param object */ public void update(Observable ob, Object object) { this.update(); } /** * * @param c a {@link forge.Card} object. * @param index a int. */ public void add(Card c, int index) { if (!c.isImmutable()) //Immutable cards are usually emblems,effects and the mana pool and we don't want to log those. { cardsAddedThisTurn.add(c); if (AllZone.getZone(c) != null) { cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); } else { cardsAddedThisTurnSource.add("None"); } } cards.add(index, c); c.setTurnInZone(AllZone.getPhase().getTurn()); update(); } /** * * @param c */ public void remove(Object c) { cards.remove((Card) c); update(); } /** * <p>Setter for the field <code>cards</code>.</p> * * @param c an array of {@link forge.Card} objects. */ public void setCards(Card c[]) { cards = new ArrayList<Card>(Arrays.asList(c)); update(); } //removes all cards /** * <p>reset.</p> */ public void reset() { cardsAddedThisTurn.clear(); cardsAddedThisTurnSource.clear(); cards.clear(); update(); } //************ END - these methods fire updateObservers() ************* /** * * @param zone a {@link java.lang.String} object. * @return a boolean */ public boolean is(String zone) { return zone.equals(zoneName); } /** * * @param zone a {@link java.lang.String} object. * @param player a {@link forge.Player} object. * @return a boolean */ public boolean is(String zone, Player player) { return (zone.equals(zoneName) && player.isPlayer(player)); } /** * <p>Getter for the field <code>player</code>.</p> * * @return a {@link forge.Player} object. */ public Player getPlayer() { return player; } /** * <p>Getter for the field <code>zoneName</code>.</p> * * @return a {@link java.lang.String} object. */ public String getZoneName() { return zoneName; } /** * <p>size.</p> * * @return a int. */ public int size() { return cards.size(); } /** * * @param index a int. * @return a int */ public Card get(int index) { return (Card) cards.get(index); } /** * <p>Getter for the field <code>cards</code>.</p> * * @return an array of {@link forge.Card} objects. */ public Card[] getCards() { Card c[] = new Card[cards.size()]; cards.toArray(c); return c; } /** * <p>update.</p> */ public void update() { if (update) updateObservers(); } /** * * @param b a boolean. */ public void setUpdate(boolean b) { update = b; } /** * <p>Getter for the field <code>update</code>.</p> * * @return a boolean. */ public boolean getUpdate() { return update; } /** * <p>toString.</p> * * @return a {@link java.lang.String} object. */ public String toString() { StringBuilder sb = new StringBuilder(); if (player != null) sb.append(player.toString()).append(" "); sb.append(zoneName); return sb.toString(); } /** * <p>Getter for the field <code>cardsAddedThisTurn</code>.</p> * * @param origin a {@link java.lang.String} object. * @return a {@link forge.CardList} object. */ public CardList getCardsAddedThisTurn(String origin) { System.out.print("Request cards put into " + getZoneName() + " from " + origin + ".Amount: "); CardList ret = new CardList(); for (int i = 0; i < cardsAddedThisTurn.size(); i++) { if (origin.equals(cardsAddedThisTurnSource.get(i)) || origin.equals("Any")) { ret.add(cardsAddedThisTurn.get(i)); } } System.out.println(ret.size()); return ret; } /** * <p>resetCardsAddedThisTurn.</p> */ public void resetCardsAddedThisTurn() { cardsAddedThisTurn.clear(); cardsAddedThisTurnSource.clear(); } }