From ec01b99b3e11e611b60ca99d9db8bd912ba7d833 Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Fri, 13 Apr 2018 07:42:09 -0700 Subject: [PATCH] Ironed out the solo-draft definitions --- .../lotro/draft2/DefaultSoloDraft.java | 25 ++- .../lotro/draft2/DraftChoiceDefinition.java | 9 + .../com/gempukku/lotro/draft2/SoloDraft.java | 10 +- .../lotro/draft2/SoloDraftDefinitions.java | 34 +++- .../gempukku/lotro/draft2/SoloDraftPicks.java | 13 -- .../builder/CardCollectionProducer.java | 7 + .../draft2/builder/DraftChoiceBuilder.java | 169 ++++++++++++++++++ .../draft2/builder/StartingPoolBuilder.java | 47 +++++ .../src/main/resources/draft/hobbit.json | 109 +++++------ 9 files changed, 333 insertions(+), 90 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/DraftChoiceDefinition.java delete mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraftPicks.java create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/CardCollectionProducer.java create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/DraftChoiceBuilder.java create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/StartingPoolBuilder.java diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/DefaultSoloDraft.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/DefaultSoloDraft.java index 11b66cb17..48892aa47 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/DefaultSoloDraft.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/DefaultSoloDraft.java @@ -1,30 +1,39 @@ package com.gempukku.lotro.draft2; +import com.gempukku.lotro.draft2.builder.CardCollectionProducer; import com.gempukku.lotro.game.CardCollection; -import com.gempukku.lotro.game.DefaultCardCollection; + +import java.util.List; public class DefaultSoloDraft implements SoloDraft { private String _format; - private SoloDraftPicks _picks; + private CardCollectionProducer _newCollection; + private List _draftChoiceDefinitions; - public DefaultSoloDraft(String format, SoloDraftPicks picks) { + public DefaultSoloDraft(String format, CardCollectionProducer newCollection, List draftChoiceDefinitions) { _format = format; - _picks = picks; + _newCollection = newCollection; + _draftChoiceDefinitions = draftChoiceDefinitions; } @Override public CardCollection initializeNewCollection(long seed) { - return new DefaultCardCollection(); + return (_newCollection != null) ? _newCollection.getCardCollection(seed) : null; } @Override - public CardCollection getAvailableChoices(long seed, int stage) { - return _picks.getChoices(seed, stage); + public Iterable getAvailableChoices(long seed, int stage) { + return _draftChoiceDefinitions.get(stage).getDraftChoice(seed, stage); + } + + @Override + public CardCollection getCardsForChoiceId(String choiceId, long seed, int stage) { + return _draftChoiceDefinitions.get(stage).getCardsForChoiceId(choiceId, seed, stage); } @Override public boolean hasNextStage(long seed, int stage) { - return _picks.hasNextStage(seed, stage); + return stage + 1 < _draftChoiceDefinitions.size(); } @Override diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/DraftChoiceDefinition.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/DraftChoiceDefinition.java new file mode 100644 index 000000000..fbd544e25 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/DraftChoiceDefinition.java @@ -0,0 +1,9 @@ +package com.gempukku.lotro.draft2; + +import com.gempukku.lotro.game.CardCollection; + +public interface DraftChoiceDefinition { + Iterable getDraftChoice(long seed, int stage); + + CardCollection getCardsForChoiceId(String choiceId, long seed, int stage); +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraft.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraft.java index d12fd2396..7a12587f0 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraft.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraft.java @@ -5,9 +5,17 @@ import com.gempukku.lotro.game.CardCollection; public interface SoloDraft { CardCollection initializeNewCollection(long seed); - CardCollection getAvailableChoices(long seed, int stage); + Iterable getAvailableChoices(long seed, int stage); + + CardCollection getCardsForChoiceId(String choiceId, long seed, int stage); boolean hasNextStage(long seed, int stage); String getFormat(); + + interface DraftChoice { + String getChoiceId(); + String getBlueprintId(); + String getChoiceUrl(); + } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraftDefinitions.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraftDefinitions.java index 991f86125..748320a0b 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraftDefinitions.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraftDefinitions.java @@ -1,6 +1,8 @@ package com.gempukku.lotro.draft2; -import com.gempukku.lotro.game.LotroCardBlueprintLibrary; +import com.gempukku.lotro.draft2.builder.CardCollectionProducer; +import com.gempukku.lotro.draft2.builder.DraftChoiceBuilder; +import com.gempukku.lotro.draft2.builder.StartingPoolBuilder; import com.gempukku.lotro.game.formats.LotroFormatLibrary; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -9,11 +11,12 @@ import org.json.simple.parser.ParseException; import java.io.IOException; import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class SoloDraftDefinitions { private Map draftTypes = new HashMap(); + private StartingPoolBuilder startingPoolBuilder = new StartingPoolBuilder(); + private DraftChoiceBuilder draftChoiceBuilder = new DraftChoiceBuilder(); public SoloDraftDefinitions() { try { @@ -22,7 +25,7 @@ public class SoloDraftDefinitions { JSONParser parser = new JSONParser(); JSONArray object = (JSONArray) parser.parse(reader); for (Object draftDefObj : object) { - String type = (String)((JSONObject) draftDefObj).get("type"); + String type = (String) ((JSONObject) draftDefObj).get("type"); String location = (String) ((JSONObject) draftDefObj).get("location"); draftTypes.put(type, loadDraft(location)); } @@ -41,12 +44,29 @@ public class SoloDraftDefinitions { JSONParser parser = new JSONParser(); JSONObject object = (JSONObject) parser.parse(reader); String format = (String) object.get("format"); - return null; + + CardCollectionProducer cardCollectionProducer = null; + JSONObject startingPool = (JSONObject) object.get("startingPool"); + if (startingPool != null) + cardCollectionProducer = startingPoolBuilder.buildCardCollectionProducer(startingPool); + + List draftChoiceDefinitions = new ArrayList(); + JSONArray choices = (JSONArray) object.get("choices"); + Iterator choicesIterator = choices.iterator(); + while (choicesIterator.hasNext()) { + JSONObject choice = choicesIterator.next(); + DraftChoiceDefinition draftChoiceDefinition = draftChoiceBuilder.buildDraftChoiceDefinition(choice); + int repeatCount = ((Number) choice.get("repeat")).intValue(); + for (int i = 0; i < repeatCount; i++) + draftChoiceDefinitions.add(draftChoiceDefinition); + } + + return new DefaultSoloDraft(format, cardCollectionProducer, draftChoiceDefinitions); } catch (ParseException exp) { - throw new RuntimeException("Problem loading solo draft "+file, exp); + throw new RuntimeException("Problem loading solo draft " + file, exp); } } catch (IOException exp) { - throw new RuntimeException("Problem loading solo draft "+file, exp); + throw new RuntimeException("Problem loading solo draft " + file, exp); } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraftPicks.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraftPicks.java deleted file mode 100644 index 609831594..000000000 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/SoloDraftPicks.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gempukku.lotro.draft2; - -import com.gempukku.lotro.game.CardCollection; - -public class SoloDraftPicks { - public CardCollection getChoices(long seed, int stage) { - return null; - } - - public boolean hasNextStage(long seed, int stage) { - return false; - } -} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/CardCollectionProducer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/CardCollectionProducer.java new file mode 100644 index 000000000..ccc31089b --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/CardCollectionProducer.java @@ -0,0 +1,7 @@ +package com.gempukku.lotro.draft2.builder; + +import com.gempukku.lotro.game.CardCollection; + +public interface CardCollectionProducer { + CardCollection getCardCollection(long seed); +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/DraftChoiceBuilder.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/DraftChoiceBuilder.java new file mode 100644 index 000000000..8bd86c591 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/DraftChoiceBuilder.java @@ -0,0 +1,169 @@ +package com.gempukku.lotro.draft2.builder; + +import com.gempukku.lotro.draft2.DraftChoiceDefinition; +import com.gempukku.lotro.draft2.SoloDraft; +import com.gempukku.lotro.game.CardCollection; +import com.gempukku.lotro.game.DefaultCardCollection; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.util.*; + +public class DraftChoiceBuilder { + public DraftChoiceDefinition buildDraftChoiceDefinition(JSONObject choiceDefinition) { + return constructDraftChoiceDefinition(choiceDefinition); + } + + private DraftChoiceDefinition constructDraftChoiceDefinition(JSONObject choiceDefinition) { + String choiceDefinitionType = (String) choiceDefinition.get("type"); + JSONObject data = (JSONObject) choiceDefinition.get("data"); + if (choiceDefinitionType.equals("singleCollectionPick")) + return buildSingleCollectionPickDraftChoiceDefinition(data); + else if (choiceDefinitionType.equals("multipleCardPick")) + return buildMultipleCardPickDraftChoiceDefinition(data); + else if (choiceDefinitionType.equals("randomSwitch")) + return buildRandomSwitchDraftChoiceDeifinition(data); + else + throw new RuntimeException("Unknown choiceDefinitionType: " + choiceDefinitionType); + } + + private DraftChoiceDefinition buildSingleCollectionPickDraftChoiceDefinition(JSONObject data) { + JSONArray switchResult = (JSONArray) data.get("possiblePicks"); + + final Map> cardsMap = new HashMap>(); + final List draftChoices = new ArrayList(); + + for (JSONObject pickDefinition : (Iterable) switchResult) { + final String choiceId = (String) pickDefinition.get("choiceId"); + final String url = (String) pickDefinition.get("url"); + JSONArray cards = (JSONArray) pickDefinition.get("cards"); + + List cardIds = new ArrayList(); + for (String card : (Iterable) cards) + cardIds.add(card); + + draftChoices.add( + new SoloDraft.DraftChoice() { + @Override + public String getChoiceId() { + return choiceId; + } + + @Override + public String getBlueprintId() { + return null; + } + + @Override + public String getChoiceUrl() { + return url; + } + }); + cardsMap.put(choiceId, cardIds); + } + + return new DraftChoiceDefinition() { + @Override + public Iterable getDraftChoice(long seed, int stage) { + return draftChoices; + } + + @Override + public CardCollection getCardsForChoiceId(String choiceId, long seed, int stage) { + List cardIds = cardsMap.get(choiceId); + DefaultCardCollection cardCollection = new DefaultCardCollection(); + for (String cardId : cardIds) + cardCollection.addItem(cardId, 1); + + return cardCollection; + } + }; + } + + private DraftChoiceDefinition buildMultipleCardPickDraftChoiceDefinition(JSONObject data) { + final long selectionSeed = ((Number) data.get("seed")).longValue(); + final int count = ((Number) data.get("count")).intValue(); + JSONArray availableCards = (JSONArray) data.get("availableCards"); + + final List cards = new ArrayList(); + for (String availableCard : (Iterable) availableCards) + cards.add(availableCard); + + return new DraftChoiceDefinition() { + @Override + public Iterable getDraftChoice(long seed, int stage) { + final List shuffledCards = getShuffledCards(seed, stage); + + List draftableCards = new ArrayList(count); + for (int i=0; i shuffledCards = getShuffledCards(seed, stage); + + for (int i=0; i getShuffledCards(long seed, int stage) { + Random rnd = new Random(seed + selectionSeed + stage); + final List shuffledCards = new ArrayList(cards); + Collections.shuffle(shuffledCards, rnd); + return shuffledCards; + } + }; + } + + private DraftChoiceDefinition buildRandomSwitchDraftChoiceDeifinition(JSONObject data) { + final long selectionSeed = ((Number) data.get("seed")).longValue(); + JSONArray switchResult = (JSONArray) data.get("switchResult"); + + final List draftChoiceDefinitionList = new ArrayList(); + Iterator switchResultIterator = switchResult.iterator(); + while (switchResultIterator.hasNext()) { + JSONObject switchResultObject = switchResultIterator.next(); + draftChoiceDefinitionList.add(constructDraftChoiceDefinition(switchResultObject)); + } + + return new DraftChoiceDefinition() { + @Override + public Iterable getDraftChoice(long seed, int stage) { + Random rnd = new Random(seed + selectionSeed); + return draftChoiceDefinitionList.get(rnd.nextInt(draftChoiceDefinitionList.size())).getDraftChoice(seed, stage); + } + + @Override + public CardCollection getCardsForChoiceId(String choiceId, long seed, int stage) { + Random rnd = new Random(seed + selectionSeed); + return draftChoiceDefinitionList.get(rnd.nextInt(draftChoiceDefinitionList.size())).getCardsForChoiceId(choiceId, seed, stage); + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/StartingPoolBuilder.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/StartingPoolBuilder.java new file mode 100644 index 000000000..030a905fe --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/draft2/builder/StartingPoolBuilder.java @@ -0,0 +1,47 @@ +package com.gempukku.lotro.draft2.builder; + +import com.gempukku.lotro.game.CardCollection; +import com.gempukku.lotro.game.DefaultCardCollection; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +public class StartingPoolBuilder { + public CardCollectionProducer buildCardCollectionProducer(JSONObject startingPool) { + String cardCollectionProducerType = (String) startingPool.get("type"); + if (cardCollectionProducerType.equals("randomCardPool")) { + return buildRandomCardPool((JSONObject) startingPool.get("data")); + } + throw new RuntimeException("Unknown cardCollectionProducer type: "+cardCollectionProducerType); + } + + private CardCollectionProducer buildRandomCardPool(JSONObject randomCardPool) { + final long selectionSeed = ((Number) randomCardPool.get("seed")).longValue(); + JSONArray cardPools = (JSONArray) randomCardPool.get("randomResult"); + + final List cardCollections = new ArrayList(); + Iterator iterator = cardPools.iterator(); + while (iterator.hasNext()) { + JSONArray cards = iterator.next(); + + DefaultCardCollection cardCollection = new DefaultCardCollection(); + Iterator cardIterator = cards.iterator(); + while (cardIterator.hasNext()) { + cardCollection.addItem(cardIterator.next(), 1); + } + cardCollections.add(cardCollection); + } + + return new CardCollectionProducer() { + @Override + public CardCollection getCardCollection(long seed) { + Random rnd = new Random(seed+selectionSeed); + return cardCollections.get(rnd.nextInt(cardCollections.size())); + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/resources/draft/hobbit.json b/gemp-lotr/gemp-lotr-server/src/main/resources/draft/hobbit.json index e66451ccc..ff0d335a3 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/resources/draft/hobbit.json +++ b/gemp-lotr/gemp-lotr-server/src/main/resources/draft/hobbit.json @@ -1,71 +1,58 @@ { "format": "limited_hobbit", - "startingPool": [ - { - "type": "random", - "data": [ - { - "type": "cardPool", - "data": [ - "card1", "card2" - ] - }, - { - "type": "cardPool", - "data": [ - "card1", "card2" - ] - } + "startingPool": { + "type": "randomCardPool", + "data": { + "seed": 0, + "randomResult": [ + ["card1", "card2"], + ["card1", "card2"] ] } - ], - "picks": [ + }, + "choices": [ { - "type": "random", - "data": [ - { - "type": "sequence", - "data": [ - { - "type": "multiple", - "data": { - "count": 10, - "type": "randomPick", - "data": ["card1", "card2"] - } - }, - { - "type": "multiple", - "data": { - "count": 5, - "type": "randomPick", - "data": ["card1", "card2"] - } + "type": "singleCollectionPick", + "repeat": 1, + "data": { + "possiblePicks": [ + { + "choiceId": "starter1", + "url": "/images/draft1_starter1.jpg", + "cards": ["card1", "card2"] + }, + { + "choiceId": "starter2", + "url": "/images/draft1_starter2.jpg", + "cards": ["card1", "card2"] + } + ] + } + }, + { + "type": "randomSwitch", + "repeat": 10, + "data": { + "seed": 0, + "switchResult": [ + { + "type": "multipleCardPick", + "data": { + "seed": 2, + "count": 3, + "availableCards": ["card1", "card2", "card3", "card4"] } - ] - }, - { - "type": "sequence", - "data": [ - { - "type": "multiple", - "data": { - "count": 10, - "type": "randomPick", - "data": ["card1", "card2"] - } - }, - { - "type": "multiple", - "data": { - "count": 5, - "type": "randomPick", - "data": ["card1", "card2"] - } + }, + { + "type": "multipleCardPick", + "data": { + "seed": 2, + "count": 3, + "availableCards": ["card1", "card2", "card3", "card4"] } - ] - } - ] + } + ] + } } ] }