From cbd8af755c86523ff12f90dcb381ad6f99a77099 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Thu, 6 Oct 2011 20:03:25 +0000 Subject: [PATCH] "Fereveldir" --- .../lotro/cards/set4/elven/Card4_067.java | 65 +++++++++++++++++++ .../com/gempukku/lotro/filters/Filters.java | 9 +++ .../lotro/game/LotroCardBlueprintLibrary.java | 31 ++++++++- .../com/gempukku/lotro/game/LotroServer.java | 20 +----- .../game/formats/DefaultLotroFormat.java | 23 +++++++ .../lotro/game/formats/FotRBlockFormat.java | 3 + ...edFotRBlockFormat.java => FreeFormat.java} | 4 +- .../com/gempukku/lotro/hall/HallServer.java | 6 +- 8 files changed, 135 insertions(+), 26 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/elven/Card4_067.java rename gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/{ModifiedFotRBlockFormat.java => FreeFormat.java} (66%) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/elven/Card4_067.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/elven/Card4_067.java new file mode 100644 index 000000000..97a5b5160 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/elven/Card4_067.java @@ -0,0 +1,65 @@ +package com.gempukku.lotro.cards.set4.elven; + +import com.gempukku.lotro.cards.AbstractCompanion; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.ExertCharactersEffect; +import com.gempukku.lotro.cards.effects.RemoveTokenEffect; +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.effects.ChooseAndWoundCharactersEffect; +import com.gempukku.lotro.logic.timing.Action; + +import java.util.Collections; +import java.util.List; + +/** + * Set: The Two Towers + * Side: Free + * Culture: Elven + * Twilight Cost: 2 + * Type: Companion • Elf + * Strength: 5 + * Vitality: 3 + * Resistance: 6 + * Game Text: To play, spot an Elf. + * Skirmish: Exert Fereveldir and discard an [ELVEN] token from your condition to wound a minion Fereveldir + * is skirmishing. + */ +public class Card4_067 extends AbstractCompanion { + public Card4_067() { + super(2, 5, 3, Culture.ELVEN, Race.ELF, null, "Fereveldir", true); + } + + @Override + public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, int twilightModifier) { + return super.checkPlayRequirements(playerId, game, self, twilightModifier) + && Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.race(Race.ELF)); + } + + @Override + protected List getExtraInPlayPhaseActions(String playerId, LotroGame game, final PhysicalCard self) { + if (PlayConditions.canUseFPCardDuringPhase(game.getGameState(), Phase.SKIRMISH, self) + && PlayConditions.canExert(self, game.getGameState(), game.getModifiersQuerying(), self) + && Filters.countActive(game.getGameState(), game.getModifiersQuerying(), Filters.owner(playerId), Filters.type(CardType.CONDITION), Filters.hasToken(Token.ELVEN)) > 0) { + final ActivateCardAction action = new ActivateCardAction(self, Keyword.SKIRMISH); + action.appendCost( + new ExertCharactersEffect(self, self)); + action.appendCost( + new ChooseActiveCardEffect(self, playerId, "Choose condition", Filters.owner(playerId), Filters.type(CardType.CONDITION), Filters.hasToken(Token.ELVEN)) { + @Override + protected void cardSelected(PhysicalCard card) { + action.insertCost( + new RemoveTokenEffect(self, card, Token.ELVEN)); + } + }); + action.appendEffect( + new ChooseAndWoundCharactersEffect(action, playerId, 1, 1, Filters.type(CardType.MINION), Filters.inSkirmishAgainst(Filters.sameCard(self)))); + return Collections.singletonList(action); + } + 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 d31324295..6c939212d 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 @@ -57,6 +57,15 @@ public class Filters { // Filters available + public static Filter hasToken(final Token token) { + return new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return gameState.getTokenCount(physicalCard, token) > 0; + } + }; + } + public static Filter canBeAssignedToSkirmish() { return new Filter() { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprintLibrary.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprintLibrary.java index c69598ee5..4bd11080d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprintLibrary.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprintLibrary.java @@ -4,6 +4,8 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; public class LotroCardBlueprintLibrary { @@ -14,6 +16,7 @@ public class LotroCardBlueprintLibrary { private Map _blueprintMap = new HashMap(); private Map _blueprintMapping = new HashMap(); + private Map> _fullBlueprintMapping = new HashMap>(); public LotroCardBlueprintLibrary() { try { @@ -24,6 +27,7 @@ public class LotroCardBlueprintLibrary { while ((line = bufferedReader.readLine()) != null) { String[] split = line.split(","); _blueprintMapping.put(split[0], split[1]); + addAlternatives(split[0], split[1]); } } finally { bufferedReader.close(); @@ -31,7 +35,30 @@ public class LotroCardBlueprintLibrary { } catch (IOException exp) { throw new RuntimeException("Problem loading blueprint mapping", exp); } + } + private void addAlternatives(String blueprint1, String blueprint2) { + addAlternative(blueprint1, blueprint2); + addAlternative(blueprint2, blueprint1); + } + + private void addAlternative(String from, String to) { + List list = _fullBlueprintMapping.get(from); + if (list == null) { + list = new LinkedList(); + _fullBlueprintMapping.put(from, list); + } + list.add(to); + } + + public boolean hasAlternateInSet(String blueprintId, int setNo) { + List alternatives = _fullBlueprintMapping.get(blueprintId); + if (alternatives != null) + for (String alternative : alternatives) + if (alternative.startsWith(setNo + "_")) + return true; + + return false; } public LotroCardBlueprint getLotroCardBlueprint(String blueprintId) { @@ -61,7 +88,9 @@ public class LotroCardBlueprintLibrary { // public Collection getAllLoadedBlueprints() { // return _blueprintMap.values(); // } -// + + // + private LotroCardBlueprint getBlueprint(String blueprintId) { if (_blueprintMapping.containsKey(blueprintId)) return getBlueprint(_blueprintMapping.get(blueprintId)); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroServer.java index 74974ca49..08675130b 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroServer.java @@ -37,7 +37,7 @@ public class LotroServer extends AbstractServer { _lotroCardBlueprintLibrary = library; _chatServer = chatServer; _defaultCollection = new DefaultCardCollection(); - for (int i = 1; i <= 3; i++) { + for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 365; j++) { String blueprintId = i + "_" + j; try { @@ -53,24 +53,6 @@ public class LotroServer extends AbstractServer { } } - if (test) { - for (int i = 4; i <= 4; i++) { - for (int j = 1; j <= 365; j++) { - String blueprintId = i + "_" + j; - try { - LotroCardBlueprint cardBlueprint = _lotroCardBlueprintLibrary.getLotroCardBlueprint(blueprintId); - CardType cardType = cardBlueprint.getCardType(); - if (cardType == CardType.SITE || cardType == CardType.THE_ONE_RING) - _defaultCollection.addCards(blueprintId, cardBlueprint, 1); - else - _defaultCollection.addCards(blueprintId, cardBlueprint, 4); - } catch (IllegalArgumentException exp) { - - } - } - } - } - _playerDao = new PlayerDAO(dbAccess); _deckDao = new DeckDAO(dbAccess); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/DefaultLotroFormat.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/DefaultLotroFormat.java index ce3128bb3..a2e2e4f7b 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/DefaultLotroFormat.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/DefaultLotroFormat.java @@ -21,6 +21,7 @@ public abstract class DefaultLotroFormat implements LotroFormat { private int _maximumSameName = 4; private int _minimumDeckSize = 60; private Set _restrictedCard = new HashSet(); + private Set _validSets = new HashSet(); public DefaultLotroFormat(LotroCardBlueprintLibrary library, Block siteBlock, boolean validateShadowFPCount, int minimumDeckSize, int maximumSameName) { _library = library; @@ -34,6 +35,19 @@ public abstract class DefaultLotroFormat implements LotroFormat { _restrictedCard.add(name); } + protected void addValidSet(int setNo) { + _validSets.add(setNo); + } + + private void validateSet(String blueprintId) throws DeckInvalidException { + for (int validSet : _validSets) + if (blueprintId.startsWith(validSet + "_") + || _library.hasAlternateInSet(blueprintId, validSet)) + return; + + throw new DeckInvalidException("Deck contains card not valid for this format: " + _library.getLotroCardBlueprint(blueprintId).getName()); + } + @Override public void validateDeck(LotroDeck deck) throws DeckInvalidException { try { @@ -64,6 +78,15 @@ public abstract class DefaultLotroFormat implements LotroFormat { throw new DeckInvalidException("One of the sites is from a different block than the format allows"); } + if (_validSets != null) { + validateSet(deck.getRingBearer()); + validateSet(deck.getRing()); + for (String site : deck.getSites()) + validateSet(site); + for (String card : deck.getAdventureCards()) + validateSet(card); + } + if (isOrderedSites()) { boolean[] sites = new boolean[9]; for (String site : deck.getSites()) { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/FotRBlockFormat.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/FotRBlockFormat.java index 1c2a05dab..0ca977f11 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/FotRBlockFormat.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/FotRBlockFormat.java @@ -7,6 +7,9 @@ public class FotRBlockFormat extends DefaultLotroFormat { public FotRBlockFormat(LotroCardBlueprintLibrary library) { super(library, Block.FELLOWSHIP, true, 60, 4); addRestrictedCard("Forces of Mordor"); + addValidSet(1); + addValidSet(2); + addValidSet(3); } @Override diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/ModifiedFotRBlockFormat.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/FreeFormat.java similarity index 66% rename from gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/ModifiedFotRBlockFormat.java rename to gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/FreeFormat.java index 06f05291c..54437c01d 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/ModifiedFotRBlockFormat.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/FreeFormat.java @@ -3,8 +3,8 @@ package com.gempukku.lotro.game.formats; import com.gempukku.lotro.common.Block; import com.gempukku.lotro.game.LotroCardBlueprintLibrary; -public class ModifiedFotRBlockFormat extends DefaultLotroFormat { - public ModifiedFotRBlockFormat(LotroCardBlueprintLibrary library) { +public class FreeFormat extends DefaultLotroFormat { + public FreeFormat(LotroCardBlueprintLibrary library) { super(library, Block.FELLOWSHIP, false, 0, Integer.MAX_VALUE); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java index 09f99533b..7e8e95be3 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java @@ -7,8 +7,8 @@ import com.gempukku.lotro.db.vo.League; import com.gempukku.lotro.db.vo.Player; import com.gempukku.lotro.game.*; import com.gempukku.lotro.game.formats.FotRBlockFormat; +import com.gempukku.lotro.game.formats.FreeFormat; import com.gempukku.lotro.game.formats.LotroFormat; -import com.gempukku.lotro.game.formats.ModifiedFotRBlockFormat; import com.gempukku.lotro.league.LeagueService; import com.gempukku.lotro.logic.vo.LotroDeck; @@ -43,9 +43,7 @@ public class HallServer extends AbstractServer { _chatServer.createChatRoom("Game Hall"); addFormat("fotr_block", "Fellowship block", "default", new FotRBlockFormat(_lotroServer.getLotroCardBlueprintLibrary())); - if (test) { - addFormat("m_fotr_block", "Modified Fellowship block", "default", new ModifiedFotRBlockFormat(_lotroServer.getLotroCardBlueprintLibrary())); - } + addFormat("whatever", "Format for testing", "default", new FreeFormat(_lotroServer.getLotroCardBlueprintLibrary())); } private void addFormat(String formatCode, String formatName, String formatCollectionId, LotroFormat format) {