From 4dce3aa459e25723a9adf8c0396153dc887ebc23 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Mon, 21 Nov 2011 23:27:57 +0000 Subject: [PATCH] - "Eomer, Keeper of Oaths" can play only ROHAN possessions from those revelead, rather than any cards. --- .../lotro/cards/packs/BoosterBox.java | 7 +++ .../lotro/cards/packs/DefaultPackBox.java | 21 +++++++ .../lotro/cards/packs/LeagueBoosterBox.java | 6 +- .../gempukku/lotro/cards/packs/PackBox.java | 7 +++ .../lotro/cards/set8/rohan/Card8_087.java | 5 +- .../lotro/cards/set9/elven/Card9_016.java | 5 ++ .../com/gempukku/lotro/db/CollectionDAO.java | 29 ++++----- .../lotro/game/DefaultCardCollection.java | 29 ++++++++- .../lotro/game/MutableCardCollection.java | 6 ++ .../gempukku/lotro/server/ServerResource.java | 60 ++++++++++++++++++- .../src/main/webapp/includes/changeLog.html | 1 + 11 files changed, 150 insertions(+), 26 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/BoosterBox.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/DefaultPackBox.java create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/PackBox.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/BoosterBox.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/BoosterBox.java new file mode 100644 index 000000000..91a65a5db --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/BoosterBox.java @@ -0,0 +1,7 @@ +package com.gempukku.lotro.cards.packs; + +import java.util.List; + +public interface BoosterBox { + public List getBooster(); +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/DefaultPackBox.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/DefaultPackBox.java new file mode 100644 index 000000000..4c15e1af4 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/DefaultPackBox.java @@ -0,0 +1,21 @@ +package com.gempukku.lotro.cards.packs; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DefaultPackBox implements PackBox { + private Map _boosterBoxes = new HashMap(); + + public void addBoosterBox(String packId, BoosterBox boosterBox) { + _boosterBoxes.put(packId, boosterBox); + } + + @Override + public List openPack(String packId) { + BoosterBox boosterBox = _boosterBoxes.get(packId); + if (boosterBox == null) + return null; + return boosterBox.getBooster(); + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/LeagueBoosterBox.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/LeagueBoosterBox.java index 176bd0f8e..c73ceb0c3 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/LeagueBoosterBox.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/LeagueBoosterBox.java @@ -6,7 +6,7 @@ import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import java.util.*; -public class LeagueBoosterBox { +public class LeagueBoosterBox implements BoosterBox { private Random _random = new Random(0); private LotroCardBlueprintLibrary _library; @@ -25,9 +25,7 @@ public class LeagueBoosterBox { _library = library; } - public synchronized List getBooster(String setNo) { - if (!setNo.equals("1")) - throw new IllegalArgumentException("Invalid setNo: " + setNo); + public synchronized List getBooster() { initializeFotR(); boolean hasFoil = _random.nextInt(6) == 0; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/PackBox.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/PackBox.java new file mode 100644 index 000000000..b3473d5ea --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/packs/PackBox.java @@ -0,0 +1,7 @@ +package com.gempukku.lotro.cards.packs; + +import java.util.List; + +public interface PackBox { + public List openPack(String packId); +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set8/rohan/Card8_087.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set8/rohan/Card8_087.java index 3431856a2..37592be36 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set8/rohan/Card8_087.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set8/rohan/Card8_087.java @@ -37,7 +37,7 @@ public class Card8_087 extends AbstractCompanion { } @Override - public List getOptionalAfterTriggers(final String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) { + public List getOptionalAfterTriggers(final String playerId, final LotroGame game, EffectResult effectResult, PhysicalCard self) { if (TriggerConditions.played(game, effectResult, self) && game.getGameState().getCurrentPhase() != Phase.PLAY_STARTING_FELLOWSHIP) { final OptionalTriggerAction action = new OptionalTriggerAction(self); @@ -45,8 +45,9 @@ public class Card8_087 extends AbstractCompanion { new RevealTopCardsOfDrawDeckEffect(self, playerId, 10) { @Override protected void cardsRevealed(List cards) { + Collection rohanPossessions = Filters.filter(cards, game.getGameState(), game.getModifiersQuerying(), Culture.ROHAN, CardType.POSSESSION); action.insertEffect( - new PlayAnyNumberOfCardsFromDeckEffect(action, playerId, cards)); + new PlayAnyNumberOfCardsFromDeckEffect(action, playerId, rohanPossessions)); } }); action.appendEffect( diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set9/elven/Card9_016.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set9/elven/Card9_016.java index 3dd626d98..01704df06 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set9/elven/Card9_016.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set9/elven/Card9_016.java @@ -57,6 +57,11 @@ public class Card9_016 extends AbstractCompanion { action.appendEffect( new OptionalEffect(action, playerId, new ChooseAndExertCharactersEffect(action, playerId, 1, 1, self) { + @Override + public String getText(LotroGame game) { + return "Exert Glorfindel to make a Nazgul he is skirmishing strength -X"; + } + @Override protected void forEachCardExertedCallback(PhysicalCard character) { action.appendEffect( diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CollectionDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CollectionDAO.java index f37255e4a..a7e70cd03 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CollectionDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CollectionDAO.java @@ -4,6 +4,7 @@ import com.gempukku.lotro.collection.CollectionSerializer; import com.gempukku.lotro.db.vo.Player; import com.gempukku.lotro.game.CardCollection; import com.gempukku.lotro.game.LotroCardBlueprintLibrary; +import com.gempukku.lotro.game.MutableCardCollection; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -15,32 +16,28 @@ import java.util.concurrent.ConcurrentHashMap; public class CollectionDAO { private DbAccess _dbAccess; - private CardCollection _defaultCollection; private CollectionSerializer _collectionSerializer; - private Map> _collections = new ConcurrentHashMap>(); + private Map> _collections = new ConcurrentHashMap>(); - public CollectionDAO(DbAccess dbAccess, LotroCardBlueprintLibrary library, CardCollection defaultCollection) { + public CollectionDAO(DbAccess dbAccess, LotroCardBlueprintLibrary library) { _dbAccess = dbAccess; - _defaultCollection = defaultCollection; _collectionSerializer = new CollectionSerializer(library); } - public CardCollection getCollectionForPlayer(Player player, String type) { - if (type == null || type.equals("default")) - return _defaultCollection; - Map playerCollections = _collections.get(player.getId()); + public MutableCardCollection getCollectionForPlayer(Player player, String type) { + Map playerCollections = _collections.get(player.getId()); if (playerCollections != null) { - CardCollection collection = playerCollections.get(type); + MutableCardCollection collection = playerCollections.get(type); if (collection != null) return collection; } - CardCollection collection = getCollectionFromDB(player, type); + MutableCardCollection collection = getCollectionFromDB(player, type); if (collection != null) { - Map collectionsByType = _collections.get(player.getId()); + Map collectionsByType = _collections.get(player.getId()); if (collectionsByType == null) { - collectionsByType = new ConcurrentHashMap(); + collectionsByType = new ConcurrentHashMap(); _collections.put(player.getId(), collectionsByType); } collectionsByType.put(type, collection); @@ -49,7 +46,7 @@ public class CollectionDAO { return null; } - private CardCollection getCollectionFromDB(Player player, String type) { + private MutableCardCollection getCollectionFromDB(Player player, String type) { try { Connection connection = _dbAccess.getDataSource().getConnection(); try { @@ -90,12 +87,12 @@ public class CollectionDAO { } } - public void setCollectionForPlayer(Player player, String type, CardCollection collection) { + public void setCollectionForPlayer(Player player, String type, MutableCardCollection collection) { if (!type.equals("default")) { storeCollectionToDB(player, type, collection); - Map collectionsByType = _collections.get(player.getId()); + Map collectionsByType = _collections.get(player.getId()); if (collectionsByType == null) { - collectionsByType = new ConcurrentHashMap(); + collectionsByType = new ConcurrentHashMap(); _collections.put(player.getId(), collectionsByType); } collectionsByType.put(type, collection); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java index de82cdc59..d6afaaab9 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java @@ -1,5 +1,6 @@ package com.gempukku.lotro.game; +import com.gempukku.lotro.cards.packs.PackBox; import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Keyword; @@ -114,7 +115,10 @@ public class DefaultCardCollection implements MutableCardCollection { public void addCards(String blueprintId, LotroCardBlueprint blueprint, int count) { if (blueprint == null) throw new IllegalArgumentException("blueprint == null"); - _counts.put(blueprintId, count); + Integer oldCount = _counts.get(blueprintId); + if (oldCount == null) + oldCount = 0; + _counts.put(blueprintId, oldCount + count); _cards.put(blueprintId, blueprint); } @@ -123,6 +127,29 @@ public class DefaultCardCollection implements MutableCardCollection { _counts.put(packId, count); } + @Override + public synchronized List openPack(String packId, PackBox packBox, LotroCardBlueprintLibrary library) { + Integer count = _counts.get(packId); + if (count == null) + return null; + if (count > 0) { + List packContents = packBox.openPack(packId); + if (packContents == null) + return null; + + List result = new LinkedList(); + for (String cardFromPack : packContents) { + LotroCardBlueprint cardBlueprint = library.getLotroCardBlueprint(cardFromPack); + addCards(cardFromPack, cardBlueprint, 1); + result.add(new Item(Item.Type.CARD, 1, cardFromPack, cardBlueprint)); + } + _counts.put(packId, count - 1); + + return result; + } + return null; + } + @Override public Map getAll() { return Collections.unmodifiableMap(_counts); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/MutableCardCollection.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/MutableCardCollection.java index 24d429a72..0a0e22b0d 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/MutableCardCollection.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/MutableCardCollection.java @@ -1,7 +1,13 @@ package com.gempukku.lotro.game; +import com.gempukku.lotro.cards.packs.PackBox; + +import java.util.List; + public interface MutableCardCollection extends CardCollection { public void addCards(String blueprintId, LotroCardBlueprint blueprint, int count); public void addPacks(String packId, int count); + + public List openPack(String packId, PackBox packBox, LotroCardBlueprintLibrary library); } diff --git a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerResource.java b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerResource.java index 2d759fd7e..7807e00a6 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerResource.java +++ b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerResource.java @@ -68,7 +68,7 @@ public class ServerResource { _lotroServer = new LotroServer(dbAccess, _library, _chatServer, _test); _lotroServer.startServer(); - _collectionDao = new CollectionDAO(dbAccess, _library, _lotroServer.getDefaultCollection()); + _collectionDao = new CollectionDAO(dbAccess, _library); _leagueService = new LeagueService(dbAccess, _collectionDao, _library); @@ -537,10 +537,14 @@ public class ServerResource { if (!_test) participantId = getLoggedUser(request); - Player player = _lotroServer.getPlayerDao().getPlayer(participantId); - CardCollection collection = _collectionDao.getCollectionForPlayer(player, collectionType); + CardCollection collection; + if (collectionType.equals("default")) + collection = _lotroServer.getDefaultCollection(); + else { + collection = _collectionDao.getCollectionForPlayer(player, collectionType); + } if (collection == null) sendError(Response.Status.NOT_FOUND); @@ -580,6 +584,56 @@ public class ServerResource { return doc; } + @Path("/collection/{collectionType}") + @POST + @Produces(MediaType.APPLICATION_XML) + public Document openPack( + @PathParam("collectionType") String collectionType, + @FormParam("participantId") String participantId, + @FormParam("pack") String packId, + @Context HttpServletRequest request) throws ParserConfigurationException { + if (!_test) + participantId = getLoggedUser(request); + + Player player = _lotroServer.getPlayerDao().getPlayer(participantId); + + MutableCardCollection collection = _collectionDao.getCollectionForPlayer(player, collectionType); + if (collection == null) + sendError(Response.Status.NOT_FOUND); + + List packContents = collection.openPack(packId, null, null); + if (packContents == null) + sendError(Response.Status.NOT_FOUND); + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + + Document doc = documentBuilder.newDocument(); + + Element collectionElem = doc.createElement("pack"); + doc.appendChild(collectionElem); + + for (CardCollection.Item item : packContents) { + String blueprintId = item.getBlueprintId(); + if (item.getType() == CardCollection.Item.Type.CARD) { + Element card = doc.createElement("card"); + card.setAttribute("count", String.valueOf(item.getCount())); + card.setAttribute("blueprintId", blueprintId); + Side side = item.getCardBlueprint().getSide(); + if (side != null) + card.setAttribute("side", side.toString()); + collectionElem.appendChild(card); + } else { + Element pack = doc.createElement("pack"); + pack.setAttribute("count", String.valueOf(item.getCount())); + pack.setAttribute("blueprintId", blueprintId); + collectionElem.appendChild(pack); + } + } + + return doc; + } + @Path("/chat/{room}") @GET @Produces(MediaType.APPLICATION_XML) diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html b/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html index 2590c3f89..399c3d803 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html @@ -5,6 +5,7 @@ - "Blood Runs Chill" now makes opponent to choose the shadow cards to discard. - "Eowyn, Lady of Ithilien" now makes opponent to wound minions. - "Three Monstrous Trolls" no longer freezes game, when systems adds twilight (for example for moving). +- "Eomer, Keeper of Oaths" can play only ROHAN possessions from those revelead, rather than any cards. 20 Nov. 2011 - "Sauron" no longer has his twilight cost reduced by the twilight pool size, instead of burdens spotted.