diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java
index fa6f57a42..53f97b245 100644
--- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java
+++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java
@@ -93,10 +93,15 @@ public class DeckRequestHandler extends LotroServerRequestHandler implements Uri
} catch (DeckInvalidException exp) {
if (!format.getErrataCardMap().isEmpty()) {
LotroDeck deckWithErrata = format.applyErrata(deck);
- format.validateDeck(deckWithErrata);
- valid.append("" + format.getName() + ": valid (with PC errata)
");
+ try {
+ format.validateDeck(deckWithErrata);
+ valid.append("" + format.getName() + ": valid (with errata automatically applied)
");
+ } catch (DeckInvalidException exp2) {
+ invalid.append("" + format.getName() + ": " + exp.getMessage() + "
");
+ }
+ } else {
+ invalid.append("" + format.getName() + ": " + exp.getMessage() + "
");
}
- invalid.append("" + format.getName() + ": " + exp.getMessage() + "
");
}
}
sb.append(valid);
diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set101/vpack1.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set101/vpack1.json
deleted file mode 100644
index 516757063..000000000
--- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set101/vpack1.json
+++ /dev/null
@@ -1,431 +0,0 @@
-{
- "101_1": {
- "side": "free_people",
- "culture": "Gondor",
- "title": "*The Lords of Gondor Have Returned",
- "type": "condition",
- "cost": 2,
- "keyword": "support area",
- "effects": [
- {
- "type": "activated",
- "phase": "skirmish",
- "condition": {
- "type": "canSpot",
- "filter": "bearer,inSkirmishAgainst(Nazgul)",
- },
- "cost": [
- {
- "type": "memorize",
- "filter": "bearer",
- "memory": "bearer"
- },
- {
- "type": "discard",
- "filter": "self"
- }
- ],
- "effect":[
- {
- "type": "modifyStrength",
- "filter": "memory(bearer)",
- "amount": 3
- },
- {
- "type": "addKeyword",
- "filter": "memory(bearer)",
- "keyword": "damage+1"
- }
- ]
- },
- ]
- },
-
- "101_2": {
- "side": "free_people",
- "culture": "Gondor",
- "title": "*I Will Not Let the White City Fall",
- "type": "condition",
- "cost": 2,
- "keyword": "support area",
- "effects": [
- {
- "type": "trigger",
- "trigger": {
- "type": "losesSkirmish",
- "filter": "name(Boromir)"
- },
- "effect": {
- "type": "modifyStrength",
- "filter": "choose(name(Aragorn))",
- "amount": 2,
- "until": "start(regroup)"
- },
- },
- {
- "type": "trigger",
- "trigger": {
- "type": "losesSkirmish",
- "filter": "name(Aragorn)"
- },
- "effect": {
- "type": "modifyStrength",
- "filter": "choose(name(Boromir))",
- "amount": 2,
- "until": "start(regroup)"
- },
- }
- ]
- },
-
- "101_3": {
- "side": "free_people",
- "culture": "Gondor",
- "title": "*Boromir",
- "subtitle": "The Redeemed",
- "type": "companion",
- "cost": 3,
- "race": "man",
- "strength": 7,
- "vitality": 3,
- "resistance": 6,
- "signet": "aragorn",
- "effects": [
- {
- "type": "modifier",
- "modifier": {
- "type": "addKeyword",
- "filter": "self",
- "keyword": "defender+1",
- "condition": {
- "type": "canSpot",
- "filter": "companion,culture(shire)",
- "count": 2
- }
- }
- },
- {
- "type": "modifier",
- "modifier": {
- "type": "modifyStrength",
- "filter": "self",
- "amount": 2,
- "condition": {
- "type": "canSpot",
- "filter": "companion,culture(shire)",
- "count": 4
- }
- }
- },
- {
- "type": "modifier",
- "modifier": {
- "type": "addKeyword",
- "filter": "self",
- "keyword": "damage+1",
- "condition": {
- "type": "canSpot",
- "filter": "companion,culture(shire)",
- "count": 4
- }
- }
- },
-
- ]
- },
-
- "101_4": {
- "side": "free_people",
- "culture": "Gondor",
- "title": "*Loud and Clear It Sounds",
- "type": "condition",
- "cost": 1,
- "keyword": "support area",
- "effects": [
- {
- "type": "trigger",
- "optional": true,
- "trigger": {
- "type": "assignedToSkirmish",
- "filter": "companion,culture(shire)",
- "side": "shadow",
- "memorizeAssigned": "assignedHobbit",
- "memorizeAgainst": "assignedMinion"
- },
- "cost": [
- {
- "type": "exert",
- "count": 1,
- "filter": "choose(companion,culture(gondor))",
- "memorize": "newAssignee"
- },
- {
- "type": "discard",
- "filter": "self"
- }
- ],
- "effect": {
- "type": "replaceInAssignment",
- "filter": "memory(assignedHobbit)",
- "with": "memory(newAssignee)"
- }
- }
- ]
- },
-
- "101_5": {
- "side": "free_people",
- "culture": "Gondor",
- "title": "Remnant of Numenor",
- "type": "condition",
- "cost": 1,
- "keyword": "support area",
- "condition": {
- "type": "canSpot",
- "filter": "companion,culture(gondor)"
- },
- "effects": {
- "type": "trigger",
- "optional": true,
- "trigger": {
- "type": "discardFromHand",
- "filter": "any",
- "player": "shadowPlayer"
- },
- "cost": {
- "type": "addTwilight",
- "amount": 1
- },
- "effect": {
- "type": "shuffleCardsFromDiscardIntoDrawDeck",
- "filter": "choose(culture(gondor))",
- "count": 1
- }
- }
- },
-
- "101_6": {
- "side": "shadow",
- "culture": "Sauron",
- "title": "*Great Wolf Chief",
- "type": "minion",
- "cost": 5,
- "race": "warg",
- "strength": 10,
- "vitality": 3,
- "site": 6,
- "keyword": [
- "tracker",
- "fierce"
- ],
- "effects": [
- {
- "type": "modifier",
- "modifier": {
- "type": "ModifySiteNumber",
- "filter": "self",
- "amount": {
- "type": "forEachYouCanSpot",
- "filter": "stealth",
- "multiplier": -1
- }
- }
- },
-
- {
- "type": "trigger",
- "optional": true,
- "trigger": {
- "type": "played",
- "filter": "another,culture(sauron),warg"
- },
- "effect": {
- "type": "exert",
- "player": "fp",
- "filter": "choose(companion)",
- "count": 1
- }
- }
- ]
- },
-
- "101_7": {
- "side": "shadow",
- "culture": "Sauron",
- "title": "Hollin Snarler",
- "type": "minion",
- "cost": 3,
- "race": "warg",
- "strength": 4,
- "vitality": 3,
- "site": 6,
- "keyword": [
- "tracker",
- "fierce"
- ],
- "effects": [
- {
- "type": "modifier",
- "modifier": {
- "type": "ModifySiteNumber",
- "filter": "self",
- "amount": {
- "type": "forEachYouCanSpot",
- "filter": "stealth",
- "multiplier": -1
- }
- }
- },
-
- {
- "type": "modifier",
- "modifier": {
- "type": "ModifyStrength",
- "filter": "self",
- "amount": {
- "type": "forEachYouCanSpot",
- "filter": "or(stealth,and(companion,wounded))",
-
- }
- }
- },
-
- ]
- },
-
- "101_8": {
- "side": "shadow",
- "culture": "Sauron",
- "title": "Hound of Sauron",
- "type": "minion",
- "cost": 2,
- "race": "warg",
- "strength": 6,
- "vitality": 2,
- "site": 6,
- "keyword": [
- "tracker",
- "fierce"
- ],
- "effects": [
- {
- "type": "activated",
- "phase": "skirmish",
- "condition": {
- "type": "canSpot",
- "filter": "bearer,inSkirmishAgainst(Nazgul)",
- },
- "cost": [
- {
- "type": "memorize",
- "filter": "bearer",
- "memory": "bearer"
- },
- {
- "type": "discard",
- "filter": "self"
- }
- ],
- "effect":[
- {
- "type": "modifyStrength",
- "filter": "memory(bearer)",
- "amount": 3
- },
- {
- "type": "addKeyword",
- "filter": "memory(bearer)",
- "keyword": "damage+1"
- }
- ]
- },
- ]
- },
-
- "101_9": {
- "side": "shadow",
- "culture": "Sauron",
- "title": "*The Hunt is Up!",
- "type": "condition",
- "cost": 1,
- "keyword": "support area",
- "effects": [
- {
- "type": "activated",
- "phase": "skirmish",
- "condition": {
- "type": "canSpot",
- "filter": "bearer,inSkirmishAgainst(Nazgul)",
- },
- "cost": [
- {
- "type": "memorize",
- "filter": "bearer",
- "memory": "bearer"
- },
- {
- "type": "discard",
- "filter": "self"
- }
- ],
- "effect":[
- {
- "type": "modifyStrength",
- "filter": "memory(bearer)",
- "amount": 3
- },
- {
- "type": "addKeyword",
- "filter": "memory(bearer)",
- "keyword": "damage+1"
- }
- ]
- },
- ]
- },
-
- "101_10": {
- "side": "shadow",
- "culture": "Sauron",
- "title": "I See You",
- "type": "event",
- "cost": 1,
- "keyword": "assignment",
- "effects": [
- {
- "type": "activated",
- "phase": "skirmish",
- "condition": {
- "type": "canSpot",
- "filter": "bearer,inSkirmishAgainst(Nazgul)",
- },
- "cost": [
- {
- "type": "memorize",
- "filter": "bearer",
- "memory": "bearer"
- },
- {
- "type": "discard",
- "filter": "self"
- }
- ],
- "effect":[
- {
- "type": "modifyStrength",
- "filter": "memory(bearer)",
- "amount": 3
- },
- {
- "type": "addKeyword",
- "filter": "memory(bearer)",
- "keyword": "damage+1"
- }
- ]
- },
- ]
- },
-
-
-
-}
\ No newline at end of file
diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/cardFilter.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/cardFilter.js
index 463168338..a59ab1ee0 100644
--- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/cardFilter.js
+++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/cardFilter.js
@@ -115,6 +115,7 @@ var CardFilter = Class.extend({
+ ""
+ ""
+ ""
+ + ""
+ ""
+ ""
+ ""
@@ -123,16 +124,14 @@ var CardFilter = Class.extend({
+ ""
+ ""
+ ""
+ + ""
+ ""
+ ""
+ ""
+ + ""
+ ""
+ ""
+ ""
- + ""
- + ""
- + ""
- + ""
+ ""
+ ""
+ ""
@@ -161,7 +160,7 @@ var CardFilter = Class.extend({
+ ""
+ ""
+ ""
- + ""
+ + ""
+ ""
+ ""
+ "");
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 51e7b28d5..55e76d2dc 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
@@ -238,6 +238,12 @@ public class DefaultLotroFormat implements LotroFormat {
throw new DeckInvalidException("Deck contains a copy of an X-listed card: " + GameUtils.getFullName(_library.getLotroCardBlueprint(bannedBlueprintId)));
}
+ // Errata
+ for (String originalBlueprintId : _errataCardMap.keySet()) {
+ if (originalBlueprintId.equals(blueprintId) || (allAlternates != null && allAlternates.contains(originalBlueprintId)))
+ throw new DeckInvalidException("Deck contains non-errata of an errata'd card: " + GameUtils.getFullName(_library.getLotroCardBlueprint(originalBlueprintId)));
+ }
+
} catch (CardNotFoundException e) {
// Ignore this card
}
@@ -328,8 +334,12 @@ public class DefaultLotroFormat implements LotroFormat {
@Override
public LotroDeck applyErrata(LotroDeck deck) {
LotroDeck deckWithErrata = new LotroDeck(deck.getDeckName());
- deckWithErrata.setRingBearer(_errataCardMap.getOrDefault(deck.getRingBearer(), deck.getRingBearer()));
- deckWithErrata.setRing(_errataCardMap.getOrDefault(deck.getRing(), deck.getRing()));
+ if (deck.getRingBearer() != null) {
+ deckWithErrata.setRingBearer(_errataCardMap.getOrDefault(deck.getRingBearer(), deck.getRingBearer()));
+ }
+ if (deck.getRing() != null) {
+ deckWithErrata.setRing(_errataCardMap.getOrDefault(deck.getRing(), deck.getRing()));
+ }
for (String card : deck.getAdventureCards()) {
deckWithErrata.addCard(_errataCardMap.getOrDefault(card, card));
}