diff --git a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Block.java b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Block.java index 9078bd1d3..dfce632ae 100644 --- a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Block.java +++ b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Block.java @@ -1,7 +1,7 @@ package com.gempukku.lotro.common; public enum Block { - FELLOWSHIP("Fellowship"), TWO_TOWERS("Towers"), KING("King"), SHADOWS("Shadows and onwards"); + FELLOWSHIP("Fellowship"), TWO_TOWERS("Towers"), KING("King"), SHADOWS("Shadows and onwards"), SPECIAL("Special"); private String _humanReadable; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java index 07b09ae9a..968913796 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java @@ -22,5 +22,7 @@ public interface LotroFormat { public List getRestrictedCards(); + public List getValidCards(); + public Block getSiteBlock(); } 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 ed9545f3f..0139b2ce3 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 @@ -24,6 +24,7 @@ public class DefaultLotroFormat implements LotroFormat { private int _minimumDeckSize = 60; private List _bannedCards = new ArrayList(); private List _restrictedCards = new ArrayList(); + private List _validCards = new ArrayList(); private List _validSets = new ArrayList(); public DefaultLotroFormat(LotroCardBlueprintLibrary library, String name, Block siteBlock, boolean validateShadowFPCount, int minimumDeckSize, int maximumSameName, boolean mulliganRule, boolean canCancelRingBearerSkirmish) { @@ -72,6 +73,11 @@ public class DefaultLotroFormat implements LotroFormat { return Collections.unmodifiableList(_restrictedCards); } + @Override + public List getValidCards() { + return Collections.unmodifiableList(_validCards); + } + @Override public Block getSiteBlock() { return _siteBlock; @@ -101,12 +107,26 @@ public class DefaultLotroFormat implements LotroFormat { _restrictedCards.add(baseBlueprintId); } + protected void addValidCard(String baseBlueprintId) { + if (baseBlueprintId.contains("-")) { + String[] parts = baseBlueprintId.split("_"); + String set = parts[0]; + int from = Integer.parseInt(parts[1].split("-")[0]); + int to = Integer.parseInt(parts[1].split("-")[1]); + for (int i = from; i <= to; i++) + _validCards.add(set + "_" + i); + } else + _validCards.add(baseBlueprintId); + } + protected void addValidSet(int setNo) { _validSets.add(setNo); } private void validateSet(String blueprintId) throws DeckInvalidException { blueprintId = _library.getBaseBlueprintId(blueprintId); + if (_validCards.contains(blueprintId)) + return; for (int validSet : _validSets) if (blueprintId.startsWith(validSet + "_") || _library.hasAlternateInSet(blueprintId, validSet)) @@ -141,8 +161,21 @@ public class DefaultLotroFormat implements LotroFormat { LotroCardBlueprint siteBlueprint = _library.getLotroCardBlueprint(site); if (siteBlueprint.getCardType() != CardType.SITE) throw new DeckInvalidException("Card assigned as Site is not really a site"); - if (siteBlueprint.getSiteBlock() != _siteBlock) + if (siteBlueprint.getSiteBlock() != _siteBlock && _siteBlock != Block.SPECIAL) throw new DeckInvalidException("Invalid site: " + GameUtils.getFullName(siteBlueprint)); + if (_siteBlock == Block.SPECIAL && siteBlueprint.getSiteBlock() == Block.SHADOWS) + throw new DeckInvalidException("Invalid site: " + GameUtils.getFullName(siteBlueprint)); + } + if (_siteBlock == Block.SPECIAL) { + Block usedBlock = null; + for (String site : deck.getSites()) { + LotroCardBlueprint siteBlueprint = _library.getLotroCardBlueprint(site); + Block block = siteBlueprint.getSiteBlock(); + if (usedBlock == null) + usedBlock = block; + else if (usedBlock != block) + throw new DeckInvalidException("All your sites have to be from the same block"); + } } if (_validSets.size() > 0) { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/LotroFormatLibrary.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/LotroFormatLibrary.java index c6348337a..a9de7ab6f 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/LotroFormatLibrary.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/LotroFormatLibrary.java @@ -52,6 +52,12 @@ public class LotroFormatLibrary { format.addRestrictedCard((String) restricted); } + JSONArray validCards = (JSONArray) formatDef.get("valid"); + if (validCards != null) + for (Object valid : validCards) { + format.addValidCard((String) valid); + } + _allFormats.put(formatCode, format); Boolean hallFormat = (Boolean) formatDef.get("hall"); diff --git a/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json b/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json index 4df1fc52a..fc8c547ed 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json +++ b/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json @@ -222,5 +222,13 @@ "restricted":["11_132", "11_100"], "set":[10, 11, 12, 13, 14], "hall":false + }, + { + "name":"Pre-Shadows Multipath", + "code":"multipath", + "sites":"SPECIAL", + "banned":["8_1", "3_38", "3_106", "1_40", "2_32", "1_248", "3_108", "1_45", "10_11", "7_96", "3_42", "4_73", "10_2", "10_91", "1_108", "1_80", "3_67", "1_195", "1_311", "3_68", "1_139", "7_49", "1_313", "1_234"], + "valid":["0_56-60"], + "set":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } ] \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/HallResource.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/HallResource.java index e177ce6ff..f368eff8e 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/HallResource.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/HallResource.java @@ -68,6 +68,12 @@ public class HallResource extends AbstractResource { if (lotroFormat.getRestrictedCards().size() == 0) result.append("none,"); result.append(""); + result.append("
  • Additional valid: "); + for (String blueprintId : lotroFormat.getValidCards()) + result.append(GameUtils.getCardLink(blueprintId, _library.getLotroCardBlueprint(blueprintId)) + ", "); + if (lotroFormat.getValidCards().size() == 0) + result.append("none,"); + result.append("
  • "); result.append(""); } @@ -105,6 +111,12 @@ public class HallResource extends AbstractResource { if (lotroFormat.getRestrictedCards().size() == 0) result.append("none,"); result.append(""); + result.append("
  • Additional valid: "); + for (String blueprintId : lotroFormat.getValidCards()) + result.append(GameUtils.getCardLink(blueprintId, _library.getLotroCardBlueprint(blueprintId)) + ", "); + if (lotroFormat.getValidCards().size() == 0) + result.append("none,"); + result.append("
  • "); result.append(""); return result.toString(); 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 0a1a1c4b9..d37cc9c77 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 @@ -1,4 +1,7 @@
    +28 Aug. 2012
    +- Added support for the Pre-shadow Multipath format.
    +
     11 Aug. 2012
     - "Watch and Wait" can't be attached to Ring-bearer anymore.