From 9ed30fa0ae79e50ab984ff8b1467f863b5abd3ae Mon Sep 17 00:00:00 2001 From: magenoxx Date: Thu, 20 Jan 2011 16:27:42 +0300 Subject: [PATCH] Last known information. Fixed Razor Hippogriff. --- .../sets/scarsofmirrodin/RazorHippogriff.java | 5 ++- Mage/src/mage/cards/CardImpl.java | 1 + Mage/src/mage/game/Game.java | 3 ++ Mage/src/mage/game/GameImpl.java | 34 +++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/RazorHippogriff.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/RazorHippogriff.java index 947f49cc2f9..8bb2d334c17 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/RazorHippogriff.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/RazorHippogriff.java @@ -108,7 +108,10 @@ public class RazorHippogriff extends CardImpl { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - MageObject card = game.getObject(source.getFirstTarget()); + Card card = player.getGraveyard().get(source.getFirstTarget(), game); + if (card == null) { + card = game.getLastKnownInformation(source.getFirstTarget(), Zone.GRAVEYARD); + } if (card != null) { player.gainLife(card.getManaCost().convertedManaCost(), game); } diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index 0bf8a67a4a8..28d7cb70d08 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -209,6 +209,7 @@ public abstract class CardImpl> extends MageObjectImpl default: logger.warning("moveToZone, not fully implemented: from="+event.getFromZone() + ", to="+event.getToZone()); } + game.rememberLKI(objectId, event.getFromZone(), this); } switch (event.getToZone()) { case GRAVEYARD: diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java index 20bab07f05f..adffe549a41 100644 --- a/Mage/src/mage/game/Game.java +++ b/Mage/src/mage/game/Game.java @@ -106,6 +106,9 @@ public interface Game extends MageItem, Serializable { public GameStates getGameStates(); public void loadGameStates(GameStates states); public Game copy(); + public Card getLastKnownInformation(UUID objectId, Zone zone); + public void rememberLKI(UUID objectId, Zone zone, Card card); + public void resetLKI(); //client event methods public void addTableEventListener(Listener listener); diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 785fcb3ab08..5a48ea624cd 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -108,6 +108,7 @@ public abstract class GameImpl> implements Game, Serializa protected transient PlayerQueryEventSource playerQueryEventSource = new PlayerQueryEventSource(); protected Map gameCards = new HashMap(); + protected Map lki = new HashMap(); protected GameState state; protected UUID startingPlayerId; protected UUID winnerId; @@ -486,6 +487,7 @@ public abstract class GameImpl> implements Game, Serializa player.priority(this); if (isGameOver()) return; applyEffects(); + resetLKI(); } if (isGameOver()) return; if (allPassed()) { @@ -905,4 +907,36 @@ public abstract class GameImpl> implements Game, Serializa gameStates = new GameStates(); } + /** + * Gets last known information about object in the zone. + * At the moment doesn't take into account zone (it is expected that it doesn't really matter, if not, then Map> should be used instead). + * + * Can return null. + * + * @param objectId + * @param zone + * @return + */ + public Card getLastKnownInformation(UUID objectId, Zone zone) { + return lki.get(objectId); + } + + /** + * Remembers object state to be used as Last Known Information. + * + * @param objectId + * @param zone + * @param card + */ + public void rememberLKI(UUID objectId, Zone zone, Card card) { + Card copy = card.copy(); + lki.put(objectId, copy); + } + + /** + * Reset objects stored for Last Known Information. + */ + public void resetLKI() { + lki.clear(); + } }