diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/includes/changeLog.html b/gemp-lotr/gemp-lotr-async/src/main/web/includes/changeLog.html index 5aebf9516..259bc5b2e 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/includes/changeLog.html +++ b/gemp-lotr/gemp-lotr-async/src/main/web/includes/changeLog.html @@ -1,4 +1,13 @@
+Most recent update
+- Added Draft for Fellowship block, The Two Towers block, and The Hobbit
+- Added prize support for Draft games
+- Users can now select what kind of foiling they want to see under the "Settings" tab in-game
+- The Free Peoples will now properly lose initiative when playing events
+- Allies with different home sites can no longer transfer possessions to one another
+- "Loud and Strong" can no longer be used while in hand
+- "Orkish Sneak" assignment ability now works as intended
+
 18 Apr. 2018
 - Draft play is now available!
 - The Deckbuilder now filters out sites which are not legal for the selected format.
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAlly.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAlly.java
index f96103ef3..3838f2e8a 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAlly.java
+++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAlly.java
@@ -71,6 +71,16 @@ public class AbstractAlly extends AbstractPermanent {
         return null;
     }
 
+    @Override
+    public int[] getAllyHomeSiteNumbers() {
+        return _siteNumbers;
+    }
+
+    @Override
+    public Block getAllyHomeSiteBlock() {
+        return _siteBlock;
+    }
+
     @Override
     public final boolean isAllyAtHome(int siteNumber, Block block) {
         if (block != _siteBlock)
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachableFPPossession.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachableFPPossession.java
index a17cb527d..a1e7ad095 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachableFPPossession.java
+++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAttachableFPPossession.java
@@ -44,7 +44,8 @@ public abstract class AbstractAttachableFPPossession extends AbstractAttachable
 
             Filter validTransferFilter;
 
-            LotroCardBlueprint attachedTo = self.getAttachedTo().getBlueprint();
+            PhysicalCard attachedToCard = self.getAttachedTo();
+            LotroCardBlueprint attachedTo = attachedToCard.getBlueprint();
             if (attachedTo.getCardType() == CardType.COMPANION) {
                 validTransferFilter = Filters.and(validTargetFilter,
                         Filters.or(
@@ -54,11 +55,10 @@ public abstract class AbstractAttachableFPPossession extends AbstractAttachable
                 validTransferFilter = Filters.and(validTargetFilter,
                         Filters.or(
                                 CardType.COMPANION,
-                                Filters.allyAtHome));
+                                Filters.allyWithSameHome(attachedToCard)));
             } else {
                 validTransferFilter = Filters.and(validTargetFilter,
-                        CardType.ALLY, Filters.allyAtHome
-                );
+                        Filters.allyWithSameHome(attachedToCard));
             }
 
             validTransferFilter = Filters.and(validTransferFilter,
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java
index 3d19d70c8..255b9d9e3 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java
+++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java
@@ -148,6 +148,16 @@ public abstract class AbstractLotroCardBlueprint implements LotroCardBlueprint {
         throw new UnsupportedOperationException("This method should not be called on this card");
     }
 
+    @Override
+    public int[] getAllyHomeSiteNumbers() {
+        throw new UnsupportedOperationException("This method should not be called on this card");
+    }
+
+    @Override
+    public Block getAllyHomeSiteBlock() {
+        throw new UnsupportedOperationException("This method should not be called on this card");
+    }
+
     @Override
     public boolean isAllyAtHome(int siteNumber, Block siteBlock) {
         throw new UnsupportedOperationException("This method should not be called on this card");
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set12/dwarven/Card12_009.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set12/dwarven/Card12_009.java
index 8f1954a94..88c3f9f8d 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set12/dwarven/Card12_009.java
+++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set12/dwarven/Card12_009.java
@@ -32,7 +32,8 @@ public class Card12_009 extends AbstractPermanent {
 
     @Override
     protected List getExtraPhaseActions(String playerId, LotroGame game, final PhysicalCard self) {
-        if (PlayConditions.canDiscardFromHand(game, playerId, 1, Culture.DWARVEN)
+        if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self)
+                && PlayConditions.canDiscardFromHand(game, playerId, 1, Culture.DWARVEN)
                 && PlayConditions.canSpot(game, CardType.MINION, Filters.inSkirmishAgainst(Race.DWARF))) {
             final ActivateCardAction action = new ActivateCardAction(self);
             action.appendCost(
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/orc/Card18_091.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/orc/Card18_091.java
index 4adbe9d22..53c104d14 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/orc/Card18_091.java
+++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set18/orc/Card18_091.java
@@ -16,7 +16,9 @@ import com.gempukku.lotro.game.PhysicalCard;
 import com.gempukku.lotro.game.state.LotroGame;
 import com.gempukku.lotro.logic.GameUtils;
 import com.gempukku.lotro.logic.actions.ActivateCardAction;
+import com.gempukku.lotro.logic.decisions.YesNoDecision;
 import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect;
+import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect;
 import com.gempukku.lotro.logic.effects.StackActionEffect;
 import com.gempukku.lotro.logic.timing.Action;
 import com.gempukku.lotro.logic.timing.Effect;
@@ -50,27 +52,32 @@ public class Card18_091 extends AbstractMinion {
             action.appendEffect(
                     new ChooseAndAssignCharacterToMinionEffect(action, playerId, self, Filters.ringBearer, Filters.not(Culture.SHIRE)));
 
-            String fpPlayer = game.getGameState().getCurrentPlayerId();
-            List possibleCosts = new LinkedList();
-            possibleCosts.add(
-                    new AddBurdenEffect(fpPlayer, self, 1));
-            possibleCosts.add(
-                    new ChooseAndExertCharactersEffect(action, fpPlayer, 1, 1, 2, Filters.ringBearer));
-            SubCostToEffectAction subAction = new SubCostToEffectAction(action);
-            action.appendCost(
-                    new ChoiceEffect(subAction, fpPlayer, possibleCosts));
+            final String fpPlayer = game.getGameState().getCurrentPlayerId();
+
             action.appendEffect(
-                    new DiscardCardsFromPlayEffect(playerId, self, self));
-            action.appendEffect(
-                    new OptionalEffect(action, game.getGameState().getCurrentPlayerId(),
-                            new StackActionEffect(subAction) {
-                                @Override
-                                public String getText(LotroGame game) {
-                                    return "Add burden or exert the Ring-bearer twice to discard " + GameUtils.getFullName(self);
-                                }
-                            }));
+                    new PlayoutDecisionEffect(fpPlayer,
+                    new YesNoDecision("Do you want to add burden or exert the Ring-bearer twice to discard " + GameUtils.getFullName(self) + "?") {
+                @Override
+                protected void yes() {
+                    List possibleCosts = new LinkedList();
+                    possibleCosts.add(
+                            new AddBurdenEffect(fpPlayer, self, 1));
+                    possibleCosts.add(
+                            new ChooseAndExertCharactersEffect(action, fpPlayer, 1, 1, 2, Filters.ringBearer) {
+                        @Override
+                        public String getText(LotroGame game) {
+                            return "Exert the Ring-bearer twice";
+                        }
+                    });
+                    SubCostToEffectAction subAction = new SubCostToEffectAction(action);
+                    action.appendCost(
+                            new ChoiceEffect(subAction, fpPlayer, possibleCosts));
+                    action.appendEffect(
+                            new DiscardCardsFromPlayEffect(playerId, self, self));
+                }
+            }));
             return Collections.singletonList(action);
-        }
-        return null;
+        };
+    return null;
     }
 }
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java
index 72314325b..a7db5ca36 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java
@@ -689,6 +689,27 @@ public class Filters {
                 }
             });
 
+    public static Filter allyWithSameHome(final PhysicalCard card) {
+        return Filters.and(
+                CardType.ALLY,
+                new Filter() {
+                    @Override
+                    public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
+                        LotroCardBlueprint blueprint = card.getBlueprint();
+                        if (blueprint.getCardType() == CardType.ALLY) {
+                            Block homeBlock = blueprint.getAllyHomeSiteBlock();
+                            int[] homeSites = blueprint.getAllyHomeSiteNumbers();
+                            for (int homeSite : homeSites) {
+                                if (physicalCard.getBlueprint().isAllyAtHome(homeSite, homeBlock)) {
+                                    return true;
+                                }
+                            }
+                        }
+                        return false;
+                    }
+                });
+    }
+
     public static final Filter currentSite = new Filter() {
         @Override
         public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java
index 2a335654b..7db40485a 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java
@@ -46,6 +46,10 @@ public interface LotroCardBlueprint {
 
     public int getResistance();
 
+    public int[] getAllyHomeSiteNumbers();
+
+    public Block getAllyHomeSiteBlock();
+
     public boolean isAllyAtHome(int siteNumber, Block siteBlock);
 
     public List getAlwaysOnModifiers(LotroGame game, PhysicalCard self);