From e979687544dee8792a90696711087439b1230bae Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Wed, 25 Jan 2012 17:39:34 +0000 Subject: [PATCH] "Controlled by the Ring" --- .../lotro/cards/set15/gollum/Card15_041.java | 65 ++++++ .../communication/GameStateListener.java | 2 + .../gempukku/lotro/game/state/GameEvent.java | 2 +- .../gempukku/lotro/game/state/GameState.java | 7 + ...heringParticipantCommunicationChannel.java | 8 +- .../src/main/webapp/js/gameAnimations.js | 199 ++++++++++-------- .../src/main/webapp/js/gameUi.js | 2 + 7 files changed, 194 insertions(+), 91 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/gollum/Card15_041.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/gollum/Card15_041.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/gollum/Card15_041.java new file mode 100644 index 000000000..b580b540c --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set15/gollum/Card15_041.java @@ -0,0 +1,65 @@ +package com.gempukku.lotro.cards.set15.gollum; + +import com.gempukku.lotro.cards.AbstractAttachable; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.SelfDiscardEffect; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.ActivateCardAction; +import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; + +import java.util.Collections; +import java.util.List; + +/** + * Set: The Hunters + * Side: Shadow + * Culture: Gollum + * Twilight Cost: 1 + * Type: Condition + * Game Text: Bearer must be Gollum. Skirmish: If Gollum is not assigned to a skirmish, discard this condition to have + * him replace a minion skirmishing a companion. + */ +public class Card15_041 extends AbstractAttachable { + public Card15_041() { + super(Side.SHADOW, CardType.CONDITION, 1, Culture.GOLLUM, null, "Controlled by the Ring"); + } + + @Override + protected Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) { + return Filters.gollum; + } + + @Override + protected List getExtraPhaseActions(String playerId, LotroGame game, final PhysicalCard self) { + if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.SKIRMISH, self, 0) + && PlayConditions.canSpot(game, Filters.hasAttached(self), Filters.notAssignedToSkirmish) + && PlayConditions.canSelfDiscard(self, game)) { + + final PhysicalCard gollum = self.getAttachedTo(); + + final ActivateCardAction action = new ActivateCardAction(self); + action.appendCost( + new SelfDiscardEffect(self)); + action.appendEffect( + new ChooseActiveCardEffect(self, playerId, "Choose minion to replace", CardType.MINION, Filters.inSkirmishAgainst(CardType.COMPANION)) { + @Override + protected void cardSelected(LotroGame game, final PhysicalCard minion) { + action.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + game.getGameState().replaceInSkirmishMinion(gollum, minion); + } + }); + } + }); + return Collections.singletonList(action); + } + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java index e1df1b037..751ae4d23 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java @@ -33,6 +33,8 @@ public interface GameStateListener { public void startSkirmish(PhysicalCard fp, Set minions); + public void addToSkirmish(PhysicalCard card); + public void removeFromSkirmish(PhysicalCard card); public void finishSkirmish(); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameEvent.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameEvent.java index d3f772e1e..71d1c0c00 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameEvent.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameEvent.java @@ -15,7 +15,7 @@ public class GameEvent { P, GPC, TC, PP, TP, PCIP, MCIP, RCFP, AA, RA, - SS, RFS, ES, + SS, RFS, ATS, ES, AT, RT, M, W, GS, diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java index b04ac0fb8..c1b32f22f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java @@ -326,6 +326,13 @@ public class GameState { } } + public void replaceInSkirmishMinion(PhysicalCard card, PhysicalCard removeMinion) { + removeFromSkirmish(removeMinion); + _skirmish.getShadowCharacters().add(card); + for (GameStateListener listener : getAllGameStateListeners()) + listener.addToSkirmish(card); + } + private void removeFromSkirmish(PhysicalCard card, boolean notify) { if (_skirmish.getFellowshipCharacter() == card) { _skirmish.setFellowshipCharacter(null); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GatheringParticipantCommunicationChannel.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GatheringParticipantCommunicationChannel.java index fce7b5337..7c8370da3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GatheringParticipantCommunicationChannel.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GatheringParticipantCommunicationChannel.java @@ -4,12 +4,13 @@ import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.common.Token; import com.gempukku.lotro.communication.GameStateListener; import com.gempukku.lotro.game.PhysicalCard; -import static com.gempukku.lotro.game.state.GameEvent.Type.*; import com.gempukku.lotro.logic.decisions.AwaitingDecision; import com.gempukku.lotro.logic.timing.GameStats; import java.util.*; +import static com.gempukku.lotro.game.state.GameEvent.Type.*; + public class GatheringParticipantCommunicationChannel implements GameStateListener { private List _events = new LinkedList(); private String _self; @@ -55,6 +56,11 @@ public class GatheringParticipantCommunicationChannel implements GameStateListen _events.add(gameEvent); } + @Override + public void addToSkirmish(PhysicalCard card) { + _events.add(new GameEvent(ATS).card(card)); + } + @Override public void removeFromSkirmish(PhysicalCard card) { _events.add(new GameEvent(RFS).card(card)); diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameAnimations.js b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameAnimations.js index c72ff97e6..c961bf2af 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameAnimations.js +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameAnimations.js @@ -70,40 +70,40 @@ var GameAnimations = Class.extend({ var cardWidth = card.getWidthForHeight(cardHeight); $(cardDiv).css( - { - position: "absolute", - left: (gameWidth / 2 - cardWidth / 4), - top: gameHeight * (3 / 8), - width: cardWidth / 2, - height: cardHeight / 2, - "z-index": 100, - opacity: 0}); + { + position: "absolute", + left: (gameWidth / 2 - cardWidth / 4), + top: gameHeight * (3 / 8), + width: cardWidth / 2, + height: cardHeight / 2, + "z-index": 100, + opacity: 0}); $(cardDiv).animate( - { - left: "-=" + cardWidth / 4, - top: "-=" + (gameHeight / 8), - width: "+=" + (cardWidth / 2), - height: "+=" + (cardHeight / 2), - opacity: 1}, - { - duration: that.getAnimationLength(that.playEventDuration / 8), - easing: "linear", - queue: false, - complete: next}); + { + left: "-=" + cardWidth / 4, + top: "-=" + (gameHeight / 8), + width: "+=" + (cardWidth / 2), + height: "+=" + (cardHeight / 2), + opacity: 1}, + { + duration: that.getAnimationLength(that.playEventDuration / 8), + easing: "linear", + queue: false, + complete: next}); }).queue( function(next) { setTimeout(next, that.getAnimationLength(that.playEventDuration * (5 / 8))); }).queue( function(next) { $(cardDiv).animate( - { - opacity: 0}, - { - duration: that.getAnimationLength(that.playEventDuration / 4), - easing: "easeOutQuart", - queue: false, - complete: next}); + { + opacity: 0}, + { + duration: that.getAnimationLength(that.playEventDuration / 4), + easing: "easeOutQuart", + queue: false, + complete: next}); }).queue( function(next) { $(cardDiv).remove(); @@ -157,26 +157,26 @@ var GameAnimations = Class.extend({ } $(cardDiv).css( - { - position: "absolute", - left: shadowStartPosX, - top: shadowStartPosY, - width: shadowWidth, - height: shadowHeight, - "z-index": 100, - opacity: 1}); + { + position: "absolute", + left: shadowStartPosX, + top: shadowStartPosY, + width: shadowWidth, + height: shadowHeight, + "z-index": 100, + opacity: 1}); $(cardDiv).animate( - { - opacity: 0, - left: "-=" + (shadowWidth / 2), - top: "-=" + (shadowHeight / 2), - width: "+=" + shadowWidth, - height: "+=" + shadowHeight}, - { - duration: that.getAnimationLength(that.cardAffectsCardDuration), - easing: "easeInQuart", - queue: false, - complete: null}); + { + opacity: 0, + left: "-=" + (shadowWidth / 2), + top: "-=" + (shadowHeight / 2), + width: "+=" + shadowWidth, + height: "+=" + shadowHeight}, + { + duration: that.getAnimationLength(that.cardAffectsCardDuration), + easing: "easeInQuart", + queue: false, + complete: null}); } } @@ -190,7 +190,7 @@ var GameAnimations = Class.extend({ $(this).remove(); } } - ); + ); next(); }); } @@ -266,29 +266,29 @@ var GameAnimations = Class.extend({ var cardWidth = card.getWidthForHeight(cardHeight); $(cardDiv).css( - { - position: "absolute", - left: (gameWidth / 2 - cardWidth / 4), - top: gameHeight * (3 / 8), - width: cardWidth / 2, - height: cardHeight / 2, - "z-index": 100, - opacity: 0}); + { + position: "absolute", + left: (gameWidth / 2 - cardWidth / 4), + top: gameHeight * (3 / 8), + width: cardWidth / 2, + height: cardHeight / 2, + "z-index": 100, + opacity: 0}); $(cardDiv).animate( - { - opacity: 1}, - { - duration: that.getAnimationLength(that.putCardIntoPlayDuration / 8), - easing: "linear", - step: function(now, fx) { - layoutCardElem(cardDiv, - (gameWidth / 2 - cardWidth / 4) - now * (cardWidth / 4), - gameHeight * (3 / 8) - now * (gameHeight / 8), - cardWidth / 2 + now * (cardWidth / 2), - cardHeight / 2 + now * (cardHeight / 2), 100); - }, - complete: next}); + { + opacity: 1}, + { + duration: that.getAnimationLength(that.putCardIntoPlayDuration / 8), + easing: "linear", + step: function(now, fx) { + layoutCardElem(cardDiv, + (gameWidth / 2 - cardWidth / 4) - now * (cardWidth / 4), + gameHeight * (3 / 8) - now * (gameHeight / 8), + cardWidth / 2 + now * (cardWidth / 2), + cardHeight / 2 + now * (cardHeight / 2), 100); + }, + complete: next}); }).queue( function(next) { setTimeout(next, that.getAnimationLength(that.putCardIntoPlayDuration * (5 / 8))); @@ -303,20 +303,20 @@ var GameAnimations = Class.extend({ var startHeight = cardDiv.height(); $(cardDiv).animate( - { - left: oldValues["left"]}, - { - duration: that.getAnimationLength(that.putCardIntoPlayDuration / 4), - easing: "linear", - step: function(now, fx) { - var state = fx.state; - layoutCardElem(cardDiv, - startLeft + (oldValues["left"] - startLeft) * state, - startTop + (oldValues["top"] - startTop) * state, - startWidth + (oldValues["width"] - startWidth) * state, - startHeight + (oldValues["height"] - startHeight) * state, 100); - }, - complete: next}); + { + left: oldValues["left"]}, + { + duration: that.getAnimationLength(that.putCardIntoPlayDuration / 4), + easing: "linear", + step: function(now, fx) { + var state = fx.state; + layoutCardElem(cardDiv, + startLeft + (oldValues["left"] - startLeft) * state, + startTop + (oldValues["top"] - startTop) * state, + startWidth + (oldValues["width"] - startWidth) * state, + startHeight + (oldValues["height"] - startHeight) * state, 100); + }, + complete: next}); }).queue( function(next) { var cardDiv = $(".card:cardId(" + cardId + ")"); @@ -352,7 +352,7 @@ var GameAnimations = Class.extend({ if (index != -1) cardData.attachedCards.splice(index, 1); } - ); + ); var card = $(".card:cardId(" + cardId + ")"); var cardData = card.data("card"); @@ -388,12 +388,12 @@ var GameAnimations = Class.extend({ function(next) { $(".card:cardId(" + cardRemovedIds + ")") .animate( - { - opacity: 0}, - { - duration: that.getAnimationLength(that.removeCardFromPlayDuration), - easing: "easeOutQuart", - queue: false}); + { + opacity: 0}, + { + duration: that.getAnimationLength(that.removeCardFromPlayDuration), + easing: "easeOutQuart", + queue: false}); setTimeout(next, that.getAnimationLength(that.removeCardFromPlayDuration)); }); } @@ -418,7 +418,7 @@ var GameAnimations = Class.extend({ if (index != -1) cardData.attachedCards.splice(index, 1); } - ); + ); } card.remove(); @@ -576,6 +576,27 @@ var GameAnimations = Class.extend({ } }, + addToSkirmish: function(element, animate) { + var that = this; + $("#main").queue( + function(next) { + var cardId = element.getAttribute("cardId"); + + $(".card:cardId(" + cardId + ")").each(function() { + $(this).data("card").skirmish = true; + }); + + next(); + }); + if (animate) { + $("#main").queue( + function(next) { + that.game.layoutUI(false); + next(); + }); + } + }, + removeFromSkirmish: function(element, animate) { var that = this; $("#main").queue( diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js index 4a7983c05..e191d5b5d 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js @@ -943,6 +943,8 @@ var GempLotrGameUI = Class.extend({ this.animations.removeAssignment(gameEvent, animate); } else if (eventType == "SS") { this.animations.startSkirmish(gameEvent, animate); + } else if (eventType == "ATS") { + this.animations.addToSkirmish(gameEvent, animate); } else if (eventType == "RFS") { this.animations.removeFromSkirmish(gameEvent, animate); } else if (eventType == "ES") {