@@ -1,4 +1,13 @@
|
||||
<pre style="font-size:80%">
|
||||
<b>Most recent update</b>
|
||||
- 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
|
||||
|
||||
<b>18 Apr. 2018</b>
|
||||
- Draft play is now available!
|
||||
- The Deckbuilder now filters out sites which are not legal for the selected format.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -32,7 +32,8 @@ public class Card12_009 extends AbstractPermanent {
|
||||
|
||||
@Override
|
||||
protected List<? extends Action> 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(
|
||||
|
||||
@@ -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<Effect> possibleCosts = new LinkedList<Effect>();
|
||||
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<Effect> possibleCosts = new LinkedList<Effect>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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<? extends Modifier> getAlwaysOnModifiers(LotroGame game, PhysicalCard self);
|
||||
|
||||
Reference in New Issue
Block a user