Merge pull request #48 from PhallenCassidy/Fixes

Various LotR fixes
This commit is contained in:
Marcin Sciesinski
2018-06-20 23:52:12 -07:00
committed by GitHub
8 changed files with 87 additions and 25 deletions

View File

@@ -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.

View File

@@ -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)

View File

@@ -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,

View File

@@ -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");

View File

@@ -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(

View File

@@ -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;
}
}

View File

@@ -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) {

View File

@@ -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);