Release remaining X-list errata and improve errata on format page

This commit is contained in:
Troy Biesterfeld
2021-05-28 22:53:55 -05:00
parent 19139e5d72
commit 6541aa7593
22 changed files with 651 additions and 605 deletions

View File

@@ -30,9 +30,7 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
public class HallRequestHandler extends LotroServerRequestHandler implements UriRequestHandler {
private CollectionsManager _collectionManager;
@@ -255,6 +253,11 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri
}
result.append("</li>");
}
if (!lotroFormat.getErrataCardMap().isEmpty()) {
result.append("<li>Errata: ");
appendCards(result, new ArrayList<>(lotroFormat.getErrataCardMap().values()));
result.append("</li>");
}
if (lotroFormat.getValidCards().size() > 0) {
result.append("<li>Additional valid: ");
List<String> additionalValidCards = lotroFormat.getValidCards();

View File

@@ -1,151 +1,2 @@
{
"74_73": {
"title": "*Legolas",
"subtitle": "Dauntless Hunter",
"culture": "elven",
"cost": 2,
"type": "companion",
"race": "elf",
"strength": 6,
"vitality": 3,
"resistance": 6,
"signet": "aragorn",
"keyword": "archer",
"effects": {
"type": "modifier",
"modifier": {
"type": "modifyCost",
"filter": "side(shadow),or(event,condition)",
"amount": {
"type": "forEachYouCanSpot",
"filter": "unbound,hobbit",
"limit": 2
}
}
}
},
"74_192": {
"side": "shadow",
"site": 5,
"cost": 3,
"race": "Uruk-Hai",
"strength": 8,
"culture": "Isengard",
"vitality": 2,
"title": "Uruk Regular",
"type": "minion",
"keyword": "Damage+1",
"effects": {
"type": "activated",
"phase": "shadow",
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "play",
"filter": "choose(uruk-hai)",
"cost": {
"type": "forEachYouCanSpot",
"filter": "not(self),uruk-hai",
"limit": 2,
"multiplier": -1
}
}
}
},
"74_276": {
"title": "*Fortress Never Fallen",
"culture": "rohan",
"cost": 2,
"type": "condition",
"keyword": "support area",
"effects": [
{
"type": "trigger",
"optional": true,
"trigger": {
"type": "winsSkirmish",
"filter": "culture(rohan),man"
},
"effect": {
"type": "addTokens",
"culture": "rohan",
"filter": "self"
}
},
{
"type": "activated",
"phase": "regroup",
"cost": [
{
"type": "memorizeNumber",
"memory": "numberOfTokens",
"amount": {
"type": "forEachToken",
"culture": "rohan",
"filter": "self"
}
}
],
"effect": [
{
"type": "discard",
"filter": "choose(side(shadow),condition)",
"count": {
"type": "fromMemory",
"memory": "numberOfTokens",
"limit": 4
}
},
{
"type": "discard",
"filter": "self"
}
]
}
]
},
"74_304": {
"title": "Get On and Get Away",
"culture": "shire",
"cost": 0,
"type": "event",
"keyword": "fellowship",
"condition": {
"type": "or",
"condition": [
{
"type": "canSpot",
"filter": "name(smeagol)"
},
{
"type": "canSpot",
"filter": "ring bound,hobbit",
"count": 2
}
]
},
"effects": {
"type": "event",
"cost": {
"type": "addBurdens",
"amount": 2
},
"effect": [
{
"type": "playSite",
"number": {
"type": "nextSiteNumber"
}
},
{
"type": "playSite",
"number": {
"type": "siteNumberAfterNext"
}
}
]
}
}
}

View File

@@ -0,0 +1,151 @@
{
"54_73": {
"title": "*Legolas",
"subtitle": "Dauntless Hunter",
"culture": "elven",
"cost": 2,
"type": "companion",
"race": "elf",
"strength": 6,
"vitality": 3,
"resistance": 6,
"signet": "aragorn",
"keyword": "archer",
"effects": {
"type": "modifier",
"modifier": {
"type": "modifyCost",
"filter": "side(shadow),or(event,condition)",
"amount": {
"type": "forEachYouCanSpot",
"filter": "unbound,hobbit",
"limit": 2
}
}
}
},
"54_192": {
"side": "shadow",
"site": 5,
"cost": 3,
"race": "Uruk-Hai",
"strength": 8,
"culture": "Isengard",
"vitality": 2,
"title": "Uruk Regular",
"type": "minion",
"keyword": "Damage+1",
"effects": {
"type": "activated",
"phase": "shadow",
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "play",
"filter": "choose(uruk-hai)",
"cost": {
"type": "forEachYouCanSpot",
"filter": "not(self),uruk-hai",
"limit": 2,
"multiplier": -1
}
}
}
},
"54_276": {
"title": "*Fortress Never Fallen",
"culture": "rohan",
"cost": 2,
"type": "condition",
"keyword": "support area",
"effects": [
{
"type": "trigger",
"optional": true,
"trigger": {
"type": "winsSkirmish",
"filter": "culture(rohan),man"
},
"effect": {
"type": "addTokens",
"culture": "rohan",
"filter": "self"
}
},
{
"type": "activated",
"phase": "regroup",
"cost": [
{
"type": "memorizeNumber",
"memory": "numberOfTokens",
"amount": {
"type": "forEachToken",
"culture": "rohan",
"filter": "self"
}
}
],
"effect": [
{
"type": "discard",
"filter": "choose(side(shadow),condition)",
"count": {
"type": "fromMemory",
"memory": "numberOfTokens",
"limit": 4
}
},
{
"type": "discard",
"filter": "self"
}
]
}
]
},
"54_304": {
"title": "Get On and Get Away",
"culture": "shire",
"cost": 0,
"type": "event",
"keyword": "fellowship",
"condition": {
"type": "or",
"condition": [
{
"type": "canSpot",
"filter": "name(smeagol)"
},
{
"type": "canSpot",
"filter": "ring bound,hobbit",
"count": 2
}
]
},
"effects": {
"type": "event",
"cost": {
"type": "addBurdens",
"amount": 2
},
"effect": [
{
"type": "playSite",
"number": {
"type": "nextSiteNumber"
}
},
{
"type": "playSite",
"number": {
"type": "siteNumberAfterNext"
}
}
]
}
}
}

View File

@@ -1,70 +1,2 @@
{
"77_49": {
"title": "*Steadfast Champion",
"culture": "gandalf",
"cost": 2,
"type": "condition",
"target": "name(gandalf)",
"effects": [
{
"type": "modifier",
"modifier": {
"type": "addActivated",
"filter": "minion",
"phase": "assignment",
"text": "Assign to Gandalf",
"effect": {
"type": "assignFpCharacterToSkirmish",
"fpCharacter": "choose(name(gandalf))",
"against": "self"
}
}
},
{
"type": "trigger",
"optional": true,
"trigger": {
"type": "startOfPhase",
"phase": "regroup"
},
"cost": {
"type": "discard",
"filter": "self"
},
"effect": [
{
"type": "discard",
"filter": "choose(minion)"
},
{
"type": "heal",
"filter": "choose(companion)",
"times": 3
}
]
}
]
},
"77_96": {
"title": "Gondorian Captain",
"culture": "gondor",
"cost": 2,
"type": "companion",
"race": "man",
"strength": 6,
"vitality": 3,
"resistance": 6,
"keyword": "knight",
"effects": {
"type": "activated",
"phase": "maneuver",
"cost": {
"type": "discard",
"filter": "choose(fortification)"
},
"effect": {
"type": "removeThreats"
}
}
}
}

View File

@@ -0,0 +1,70 @@
{
"57_49": {
"title": "*Steadfast Champion",
"culture": "gandalf",
"cost": 2,
"type": "condition",
"target": "name(gandalf)",
"effects": [
{
"type": "modifier",
"modifier": {
"type": "addActivated",
"filter": "minion",
"phase": "assignment",
"text": "Assign to Gandalf",
"effect": {
"type": "assignFpCharacterToSkirmish",
"fpCharacter": "choose(name(gandalf))",
"against": "self"
}
}
},
{
"type": "trigger",
"optional": true,
"trigger": {
"type": "startOfPhase",
"phase": "regroup"
},
"cost": {
"type": "discard",
"filter": "self"
},
"effect": [
{
"type": "discard",
"filter": "choose(minion)"
},
{
"type": "heal",
"filter": "choose(companion)",
"times": 3
}
]
}
]
},
"57_96": {
"title": "Gondorian Captain",
"culture": "gondor",
"cost": 2,
"type": "companion",
"race": "man",
"strength": 6,
"vitality": 3,
"resistance": 6,
"keyword": "knight",
"effects": {
"type": "activated",
"phase": "maneuver",
"cost": {
"type": "discard",
"filter": "choose(fortification)"
},
"effect": {
"type": "removeThreats"
}
}
}
}

View File

@@ -1,38 +1,2 @@
{
"78_1": {
"title": "Aggression",
"culture": "dwarven",
"cost": 1,
"type": "condition",
"keyword": "support area",
"effects": [
{
"type": "modifier",
"modifier": {
"type": "addKeyword",
"filter": "dwarf",
"keyword": "damage+1",
"condition": {
"type": "haveInitiative",
"side": "free_people"
}
}
},
{
"type": "activated",
"phase": "fellowship",
"condition": {
"type": "canSpot",
"filter": "dwarf"
},
"cost": {
"type": "discard",
"filter": "self"
},
"effect": {
"type": "drawCards"
}
}
]
}
}

View File

@@ -0,0 +1,38 @@
{
"58_1": {
"title": "Aggression",
"culture": "dwarven",
"cost": 1,
"type": "condition",
"keyword": "support area",
"effects": [
{
"type": "modifier",
"modifier": {
"type": "addKeyword",
"filter": "dwarf",
"keyword": "damage+1",
"condition": {
"type": "haveInitiative",
"side": "free_people"
}
}
},
{
"type": "activated",
"phase": "fellowship",
"condition": {
"type": "canSpot",
"filter": "dwarf"
},
"cost": {
"type": "discard",
"filter": "self"
},
"effect": {
"type": "drawCards"
}
}
]
}
}

View File

@@ -1,112 +1,2 @@
{
"80_2": {
"title": "*Memories of Darkness",
"culture": "dwarven",
"cost": 1,
"type": "condition",
"keyword": "support area",
"condition": {
"type": "canSpot",
"filter": "dwarf"
},
"effects": {
"type": "trigger",
"trigger": {
"type": "losesInitiative",
"side": "free people"
},
"condition": {
"type": "not",
"condition": {
"type": "phase",
"phase": "fellowship"
}
},
"effect": {
"type": "play",
"filter": "choose(culture(dwarven),or(condition,possession))"
}
}
},
"80_11": {
"title": "*Galadriel",
"subtitle": "Lady Redeemed",
"culture": "elven",
"cost": 3,
"type": "companion",
"race": "elf",
"strength": 3,
"vitality": 3,
"resistance": 6,
"effects": [
{
"type": "modifyOwnCost",
"condition": {
"type": "phase",
"phase": "play starting fellowship"
},
"amount": -3
},
{
"type": "trigger",
"optional": true,
"trigger": {
"type": "startOfPhase",
"phase": "regroup"
},
"cost": {
"type": "discardFromHand",
"count": 1,
"forced": false,
"filter": "choose(culture(elven),event)"
},
"effect": {
"type": "discard",
"filter": "choose(side(shadow),or(condition,possession))"
}
}
]
},
"80_91": {
"title": "Mordor Fiend",
"culture": "sauron",
"cost": 3,
"type": "minion",
"race": "orc",
"strength": 9,
"vitality": 3,
"site": 6,
"effects": {
"type": "trigger",
"trigger": {
"type": "played",
"filter": "self"
},
"condition": [
{
"type": "twilightPoolLessThan",
"amount": 4
},
{
"type": "not",
"condition": {
"type": "canSpot",
"filter": "not(self),minion"
}
}
],
"effect": {
"type": "addTwilight",
"amount": {
"type": "condition",
"condition": {
"type": "canSpot",
"filter": "self,roaming"
},
"true": 5,
"false": 3
}
}
}
}
}

View File

@@ -0,0 +1,112 @@
{
"60_2": {
"title": "*Memories of Darkness",
"culture": "dwarven",
"cost": 1,
"type": "condition",
"keyword": "support area",
"condition": {
"type": "canSpot",
"filter": "dwarf"
},
"effects": {
"type": "trigger",
"trigger": {
"type": "losesInitiative",
"side": "free people"
},
"condition": {
"type": "not",
"condition": {
"type": "phase",
"phase": "fellowship"
}
},
"effect": {
"type": "play",
"filter": "choose(culture(dwarven),or(condition,possession))"
}
}
},
"60_11": {
"title": "*Galadriel",
"subtitle": "Lady Redeemed",
"culture": "elven",
"cost": 3,
"type": "companion",
"race": "elf",
"strength": 3,
"vitality": 3,
"resistance": 6,
"effects": [
{
"type": "modifyOwnCost",
"condition": {
"type": "phase",
"phase": "play starting fellowship"
},
"amount": -3
},
{
"type": "trigger",
"optional": true,
"trigger": {
"type": "startOfPhase",
"phase": "regroup"
},
"cost": {
"type": "discardFromHand",
"count": 1,
"forced": false,
"filter": "choose(culture(elven),event)"
},
"effect": {
"type": "discard",
"filter": "choose(side(shadow),or(condition,possession))"
}
}
]
},
"60_91": {
"title": "Mordor Fiend",
"culture": "sauron",
"cost": 3,
"type": "minion",
"race": "orc",
"strength": 9,
"vitality": 3,
"site": 6,
"effects": {
"type": "trigger",
"trigger": {
"type": "played",
"filter": "self"
},
"condition": [
{
"type": "twilightPoolLessThan",
"amount": 4
},
{
"type": "not",
"condition": {
"type": "canSpot",
"filter": "not(self),minion"
}
}
],
"effect": {
"type": "addTwilight",
"amount": {
"type": "condition",
"condition": {
"type": "canSpot",
"filter": "self,roaming"
},
"true": 5,
"false": 3
}
}
}
}
}

View File

@@ -1,108 +1,2 @@
{
"81_31": {
"title": "Final Account",
"culture": "gandalf",
"cost": 1,
"type": "event",
"keyword": "fellowship",
"effects": {
"type": "event",
"cost": [
{
"type": "exert",
"filter": "choose(culture(gandalf),wizard)"
},
{
"type": "discardFromHand",
"forced": false
}
],
"effect": {
"type": "putCardsFromDiscardIntoHand",
"filter": "choose(side(shadow))"
}
}
},
"81_100": {
"title": "Strange-looking Men",
"culture": "men",
"cost": 4,
"type": "minion",
"race": "man",
"strength": 10,
"vitality": 2,
"site": 4,
"effects": {
"type": "trigger",
"optional": true,
"trigger": {
"type": "startOfPhase",
"phase": "maneuver"
},
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "transfer",
"filter": "choose(or(possession,condition),attachedTo(character))",
"where": "choose(any)",
"checkTarget": true
}
}
},
"81_114": {
"title": "*Demoralized",
"culture": "orc",
"cost": 1,
"type": "condition",
"keyword": "support area",
"condition": {
"type": "canSpot",
"filter": "culture(orc),minion"
},
"effects": {
"type": "trigger",
"trigger": {
"type": "exerts",
"filter": "companion"
},
"effect": {
"type": "addTwilight",
"amount": {
"type": "condition",
"condition": {
"type": "canSpot",
"filter": "companion",
"count": 6
},
"true": 2,
"false": 1
}
}
}
},
"81_132": {
"title": "Orkish Smith",
"culture": "orc",
"cost": 2,
"type": "minion",
"race": "orc",
"strength": 6,
"vitality": 1,
"site": 4,
"effects": {
"type": "trigger",
"optional": true,
"trigger": {
"type": "played",
"filter": "self"
},
"effect": {
"type": "shuffleCardsFromDiscardIntoDrawDeck",
"filter": "choose(culture(orc),condition)",
"count": "0-2"
}
}
}
}

View File

@@ -0,0 +1,108 @@
{
"61_31": {
"title": "Final Account",
"culture": "gandalf",
"cost": 1,
"type": "event",
"keyword": "fellowship",
"effects": {
"type": "event",
"cost": [
{
"type": "exert",
"filter": "choose(culture(gandalf),wizard)"
},
{
"type": "discardFromHand",
"forced": false
}
],
"effect": {
"type": "putCardsFromDiscardIntoHand",
"filter": "choose(side(shadow))"
}
}
},
"61_100": {
"title": "Strange-looking Men",
"culture": "men",
"cost": 4,
"type": "minion",
"race": "man",
"strength": 10,
"vitality": 2,
"site": 4,
"effects": {
"type": "trigger",
"optional": true,
"trigger": {
"type": "startOfPhase",
"phase": "maneuver"
},
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "transfer",
"filter": "choose(or(possession,condition),attachedTo(character))",
"where": "choose(any)",
"checkTarget": true
}
}
},
"61_114": {
"title": "*Demoralized",
"culture": "orc",
"cost": 1,
"type": "condition",
"keyword": "support area",
"condition": {
"type": "canSpot",
"filter": "culture(orc),minion"
},
"effects": {
"type": "trigger",
"trigger": {
"type": "exerts",
"filter": "companion"
},
"effect": {
"type": "addTwilight",
"amount": {
"type": "condition",
"condition": {
"type": "canSpot",
"filter": "companion",
"count": 6
},
"true": 2,
"false": 1
}
}
}
},
"61_132": {
"title": "Orkish Smith",
"culture": "orc",
"cost": 2,
"type": "minion",
"race": "orc",
"strength": 6,
"vitality": 1,
"site": 4,
"effects": {
"type": "trigger",
"optional": true,
"trigger": {
"type": "played",
"filter": "self"
},
"effect": {
"type": "shuffleCardsFromDiscardIntoDrawDeck",
"filter": "choose(culture(orc),condition)",
"count": "0-2"
}
}
}
}

View File

@@ -1,33 +1,3 @@
{
"83_188": {
"title": "Courtyard Parapet",
"type": "site",
"block": "Shadows",
"cost": 0,
"keyword": "Dwelling",
"direction": "left",
"effects": [
{
"type": "trigger",
"trigger": {
"type": "movesTo",
"filter": "self"
},
"condition": {
"type": "location",
"filter": "siteinregion2"
},
"cost": {
"type": "discardFromHand",
"hand": "shadowPlayer",
"player": "shadowPlayer",
"forced": false,
"count": 2
},
"effect": {
"type": "addBurdens"
}
}
]
}
}

View File

@@ -0,0 +1,33 @@
{
"63_188": {
"title": "Courtyard Parapet",
"type": "site",
"block": "Shadows",
"cost": 0,
"keyword": "Dwelling",
"direction": "left",
"effects": [
{
"type": "trigger",
"trigger": {
"type": "movesTo",
"filter": "self"
},
"condition": {
"type": "location",
"filter": "siteinregion2"
},
"cost": {
"type": "discardFromHand",
"hand": "shadowPlayer",
"player": "shadowPlayer",
"forced": false,
"count": 2
},
"effect": {
"type": "addBurdens"
}
}
]
}
}

View File

@@ -1,45 +1,2 @@
{
"85_64": {
"title": "*Madril",
"subtitle": "Defender of Osgiliath",
"culture": "gondor",
"cost": 2,
"type": "companion",
"race": "man",
"strength": 5,
"vitality": 3,
"resistance": 6,
"keyword": [
"Ranger",
"Hunter"
],
"effects": [
{
"type": "modifyOwnCost",
"condition": {
"type": "canSpot",
"count": 2,
"filter": "culture(gondor),ranger"
},
"amount": -2
},
{
"type": "trigger",
"optional": true,
"trigger": {
"type": "startOfPhase",
"phase": "maneuver"
},
"condition": {
"type": "canSpotThreats"
},
"effect": {
"type": "modifySiteNumber",
"filter": "all(minion)",
"amount": 1,
"until": "start(regroup)"
}
}
]
}
}

View File

@@ -0,0 +1,45 @@
{
"65_64": {
"title": "*Madril",
"subtitle": "Defender of Osgiliath",
"culture": "gondor",
"cost": 2,
"type": "companion",
"race": "man",
"strength": 5,
"vitality": 3,
"resistance": 6,
"keyword": [
"Ranger",
"Hunter"
],
"effects": [
{
"type": "modifyOwnCost",
"condition": {
"type": "canSpot",
"count": 2,
"filter": "culture(gondor),ranger"
},
"amount": -2
},
{
"type": "trigger",
"optional": true,
"trigger": {
"type": "startOfPhase",
"phase": "maneuver"
},
"condition": {
"type": "canSpotThreats"
},
"effect": {
"type": "modifySiteNumber",
"filter": "all(minion)",
"amount": 1,
"until": "start(regroup)"
}
}
]
}
}

View File

@@ -92,33 +92,32 @@ var PCCards = {
'53_106': 'https://i.lotrtcgpc.net/errata/xlist/53_106.jpg',
'53_108': 'https://i.lotrtcgpc.net/errata/xlist/53_108.jpg',
'53_113': 'https://i.lotrtcgpc.net/errata/xlist/53_113.jpg',
'54_73': 'https://i.lotrtcgpc.net/errata/xlist/54_073.jpg',
'54_192': 'https://i.lotrtcgpc.net/errata/xlist/54_192.jpg',
'54_276': 'https://i.lotrtcgpc.net/errata/xlist/54_276.jpg',
'54_304': 'https://i.lotrtcgpc.net/errata/xlist/54_304.jpg',
'57_49': 'https://i.lotrtcgpc.net/errata/xlist/57_049.jpg',
'57_96': 'https://i.lotrtcgpc.net/errata/xlist/57_096.jpg',
'58_1': 'https://i.lotrtcgpc.net/errata/xlist/58_001.jpg',
'60_2': 'https://i.lotrtcgpc.net/errata/xlist/60_002.jpg',
'60_11': 'https://i.lotrtcgpc.net/errata/xlist/60_011.jpg',
'60_91': 'https://i.lotrtcgpc.net/errata/xlist/60_091.jpg',
'61_100': 'https://i.lotrtcgpc.net/errata/xlist/61_100.jpg',
'61_114': 'https://i.lotrtcgpc.net/errata/xlist/61_114.jpg',
'61_132': 'https://i.lotrtcgpc.net/errata/xlist/61_132.jpg',
'61_31': 'https://i.lotrtcgpc.net/errata/xlist/61_031.jpg',
'63_188': 'https://i.lotrtcgpc.net/errata/xlist/63_188.jpg',
'65_64': 'https://i.lotrtcgpc.net/errata/xlist/65_064.jpg',
// Future Errata
'74_73': 'https://i.lotrtcgpc.net/errata/xlist/54_073.jpg',
'74_192': 'https://i.lotrtcgpc.net/errata/xlist/54_192.jpg',
'74_276': 'https://i.lotrtcgpc.net/errata/xlist/54_276.jpg',
'74_304': 'https://i.lotrtcgpc.net/errata/xlist/54_304.jpg',
'77_49': 'https://i.lotrtcgpc.net/errata/xlist/57_049.jpg',
'77_96': 'https://i.lotrtcgpc.net/errata/xlist/57_096.jpg',
'78_1': 'https://i.lotrtcgpc.net/errata/xlist/58_001.jpg',
'80_2': 'https://i.lotrtcgpc.net/errata/xlist/60_002.jpg',
'80_11': 'https://i.lotrtcgpc.net/errata/xlist/60_011.jpg',
'80_91': 'https://i.lotrtcgpc.net/errata/xlist/60_091.jpg',
'81_100': 'https://i.lotrtcgpc.net/errata/xlist/61_100.jpg',
'81_114': 'https://i.lotrtcgpc.net/errata/xlist/61_114.jpg',
'81_132': 'https://i.lotrtcgpc.net/errata/xlist/61_132.jpg',
'81_31': 'https://i.lotrtcgpc.net/errata/xlist/61_031.jpg',
'83_188': 'https://i.lotrtcgpc.net/errata/xlist/63_188.jpg',
'85_64': 'https://i.lotrtcgpc.net/errata/xlist/65_064.jpg',
/// Player's Council League Promos
// April 2021
'11_267': 'https://i.lotrtcgpc.net/promos/2021/04/PCPROMO_FA_11054.jpg',

View File

@@ -129,9 +129,9 @@ var CardFilter = Class.extend({
+ "<option value='hobbit_tsr'> The Hobbit: The Short Rest</option>"
+ "<option value='hobbit_tcb'> The Hobbit: The Clouds Burst</option>"
+ "<option disabled>----------</option>"
+ "<option value='pc_fotr_block'>PC Fellowship Block</option>"
+ "<option value='pc_movie'>PC Movie Block</option>"
+ "<option value='pc_expanded'>PC Expanded</option>"
+ "<option value='pc_fotr_block'>Fellowship block (PC)</option>"
+ "<option value='pc_movie'>Movie block (PC)</option>"
+ "<option value='pc_expanded'>Expanded (PC)</option>"
+ "<option disabled>----------</option>"
+ "<option value='0'>00 - Promo</option>"
+ "<option value='1'>01 - The Fellowship of the Ring</option>"
@@ -161,9 +161,9 @@ var CardFilter = Class.extend({
+ "<option value='31'>31 - The Hobbit: Expansion 1</option>"
+ "<option value='32'>32 - The Hobbit: Expansion 2</option>"
+ "<option disabled>----------</option>"
+ "<option value='71-73,101'>PLAYTEST - PC Fellowship Block</option>"
+ "<option value='71-80,101'>PLAYTEST - PC Movie Block</option>"
+ "<option value='70-89,101'>PLAYTEST - PC Expanded</option>"
+ "<option value='71-73'>PLAYTEST - Fellowship block (PC)</option>"
+ "<option value='71-80'>PLAYTEST - Movie Block (PC)</option>"
+ "<option value='70-89'>PLAYTEST - Expanded (PC)</option>"
+ "</select>");
this.nameInput = $("<input type='text' placeholder='Card name' value='' style='width: 110px; font-size: 70%;'>");
this.sortSelect = $("<select style='width: 80px; font-size: 80%;'>"

View File

@@ -293,6 +293,8 @@ var Card = Class.extend({
return (cardNo >= 55 && cardNo <= 58);
if (setNo == 40)
return (cardNo >= 273 && cardNo <= 309);
if (setNo == 63)
return (cardNo == 188);
return false;
},

View File

@@ -4,6 +4,7 @@ import com.gempukku.lotro.common.SitesBlock;
import com.gempukku.lotro.logic.vo.LotroDeck;
import java.util.List;
import java.util.Map;
public interface LotroFormat {
public boolean isOrderedSites();
@@ -40,6 +41,8 @@ public interface LotroFormat {
public List<String> getRestrictedCardNames();
public Map<String,String> getErrataCardMap();
public SitesBlock getSiteBlock();
public String getSurveyUrl();

View File

@@ -13,13 +13,7 @@ import com.gempukku.lotro.game.LotroFormat;
import com.gempukku.lotro.logic.GameUtils;
import com.gempukku.lotro.logic.vo.LotroDeck;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
public class DefaultLotroFormat implements LotroFormat {
private Adventure _adventure;
@@ -45,6 +39,7 @@ public class DefaultLotroFormat implements LotroFormat {
//Additional Hobbit Draft parameters
private List<String> _limit2Cards = new ArrayList<String>();
private List<String> _limit3Cards = new ArrayList<String>();
private Map<String,String> _errataCardMap = new TreeMap<String,String>();
public DefaultLotroFormat(Adventure adventure,
LotroCardBlueprintLibrary library, String name, String surveyUrl,
@@ -148,6 +143,11 @@ public class DefaultLotroFormat implements LotroFormat {
return Collections.unmodifiableList(_limit3Cards);
}
@Override
public Map<String,String> getErrataCardMap() {
return Collections.unmodifiableMap(_errataCardMap);
}
@Override
public SitesBlock getSiteBlock() {
return _siteBlock;
@@ -216,12 +216,16 @@ public class DefaultLotroFormat implements LotroFormat {
_restrictedCardNames.add(cardName);
}
public void addCardErrata(String baseBlueprintId, String errataBaseBlueprint) {
_errataCardMap.put(baseBlueprintId, errataBaseBlueprint);
}
@Override
public void validateCard(String blueprintId) throws DeckInvalidException {
blueprintId = _library.getBaseBlueprintId(blueprintId);
try {
_library.getLotroCardBlueprint(blueprintId);
if (_validCards.contains(blueprintId))
if (_validCards.contains(blueprintId) || _errataCardMap.containsValue(blueprintId))
return;
if (_validSets.size() > 0 && !isValidInSets(blueprintId))
@@ -233,6 +237,12 @@ public class DefaultLotroFormat implements LotroFormat {
if (bannedBlueprintId.equals(blueprintId) || (allAlternates != null && allAlternates.contains(bannedBlueprintId)))
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
}

View File

@@ -12,10 +12,7 @@ import org.json.simple.parser.ParseException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.*;
public class LotroFormatLibrary {
private Map<String, LotroFormat> _allFormats = new HashMap<String, LotroFormat>();
@@ -98,6 +95,15 @@ public class LotroFormatLibrary {
}
}
JSONObject errataMap = (JSONObject) formatDef.get("errata");
if (errataMap != null) {
for (Object key : errataMap.keySet()) {
String originalCardName = (String) key;
String errataCardName = (String) errataMap.get(key);
format.addCardErrata(originalCardName, errataCardName);
}
}
_allFormats.put(formatCode, format);
Boolean hallFormat = (Boolean) formatDef.get("hall");

View File

@@ -11,8 +11,11 @@
"code":"pc_fotr_block",
"sites":"FELLOWSHIP",
"cancelRingBearerSkirmish":true,
"set":[1, 2, 3, 51, 52, 53],
"banned":["1_40", "1_45", "1_80", "1_108", "1_138", "1_139", "1_195", "1_234", "1_248", "1_311", "1_313", "1_316", "2_32", "2_75", "2_101", "2_108", "2_121", "3_17", "3_38", "3_42", "3_67", "3_68", "3_106", "3_108", "3_113"]
"set":[1, 2, 3],
"errata":{"1_40":"51_40", "1_45":"51_45", "1_80":"51_80", "1_108":"51_108", "1_138":"51_138", "1_139":"51_139", "1_195":"51_195",
"1_234":"51_234", "1_248":"51_248", "1_311":"51_311", "1_313":"51_313", "1_316":"51_316", "2_32":"52_32", "2_75":"52_75",
"2_101":"52_101", "2_108":"52_108", "2_121":"52_121", "3_17":"53_17", "3_38":"53_38", "3_42":"53_42", "3_67":"53_67",
"3_68":"53_68", "3_106":"53_106", "3_108":"53_108", "3_113":"53_113"}
},
{
"name":"Movie block",
@@ -25,8 +28,12 @@
"name":"Movie block (PC)",
"code":"pc_movie",
"sites":"KING",
"set":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 51, 52, 53],
"banned":["1_40", "1_45", "1_80", "1_108", "1_138", "1_139", "1_195", "1_234", "1_248", "1_311", "1_313", "1_316", "2_32", "2_75", "2_101", "2_108", "2_121", "3_17", "3_38", "3_42", "3_67", "3_68", "3_106", "3_108", "3_113", "4_73", "4_192", "4_276", "4_304", "7_49", "7_96", "8_1", "10_2", "10_11", "10_91"]
"set":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"errata":{"1_40":"51_40", "1_45":"51_45", "1_80":"51_80", "1_108":"51_108", "1_138":"51_138", "1_139":"51_139", "1_195":"51_195",
"1_234":"51_234", "1_248":"51_248", "1_311":"51_311", "1_313":"51_313", "1_316":"51_316", "2_32":"52_32", "2_75":"52_75",
"2_101":"52_101", "2_108":"52_108", "2_121":"52_121", "3_17":"53_17", "3_38":"53_38", "3_42":"53_42", "3_67":"53_67",
"3_68":"53_68", "3_106":"53_106", "3_108":"53_108", "3_113":"53_113", "4_73":"54_73", "4_192":"54_192", "4_276":"54_276",
"4_304":"54_304", "7_49":"57_49", "7_96":"57_96", "8_1":"58_1", "10_2":"60_2", "10_11":"60_11", "10_91":"60_91"}
},
{
"name":"Expanded",
@@ -40,9 +47,13 @@
"name":"Expanded (PC)",
"code":"pc_expanded",
"sites":"SHADOWS",
"banned":["1_40", "1_45", "1_80", "1_108", "1_138", "1_139", "1_195", "1_234", "1_248", "1_311", "1_313", "1_316", "2_32", "2_75", "2_101", "2_108", "2_121", "3_17", "3_38", "3_42", "3_67", "3_68", "3_106", "3_108", "3_113", "4_73", "7_49", "8_1", "10_2", "10_11", "10_91", "11_31", "11_100", "11_132"],
"restricted":["4_276", "4_304"],
"set":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 51, 52, 53]
"set":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
"errata":{"1_40":"51_40", "1_45":"51_45", "1_80":"51_80", "1_108":"51_108", "1_138":"51_138", "1_139":"51_139", "1_195":"51_195",
"1_234":"51_234", "1_248":"51_248", "1_311":"51_311", "1_313":"51_313", "1_316":"51_316", "2_32":"52_32", "2_75":"52_75",
"2_101":"52_101", "2_108":"52_108", "2_121":"52_121", "3_17":"53_17", "3_38":"53_38", "3_42":"53_42", "3_67":"53_67",
"3_68":"53_68", "3_106":"53_106", "3_108":"53_108", "3_113":"53_113", "4_73":"54_73", "4_192":"54_192", "4_276":"54_276",
"4_304":"54_304", "7_49":"57_49", "7_96":"57_96", "8_1":"58_1", "10_2":"60_2", "10_11":"60_11", "10_91":"60_91",
"11_31":"61_31", "11_100":"61_100", "11_114":"61_114", "11_132":"61_132", "13_188":"63_188", "15_64":"65_64"}
},
{
"name":"Fellowship block - Set 1",
@@ -422,31 +433,28 @@
"hall":false
},
{
"name":"PLAYTEST - PC Fellowship Block",
"name":"PLAYTEST - Fellowship block (PC)",
"code":"test_pc_fotr_block",
"sites":"FELLOWSHIP",
"cancelRingBearerSkirmish":true,
"hall":true,
"playtest":true,
"set":[1, 2, 3, 51, 52, 53, 71, 72, 73, 101, 151],
"banned":["1_40", "1_45", "1_80", "1_108", "1_138", "1_139", "1_195", "1_234", "1_248", "1_311", "1_313", "1_316", "2_32", "2_75", "2_101", "2_108", "2_121", "3_17", "3_38", "3_42", "3_67", "3_68", "3_106", "3_108", "3_113"]
"set":[1, 2, 3]
},
{
"name":"PLAYTEST - PC Movie Block",
"name":"PLAYTEST - Movie block (PC)",
"code":"test_pc_movie",
"sites":"KING",
"hall":true,
"playtest":true,
"set":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 51, 52, 53, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80],
"banned":["1_40", "1_45", "1_80", "1_108", "1_138", "1_139", "1_195", "1_234", "1_248", "1_311", "1_313", "1_316", "2_32", "2_75", "2_101", "2_108", "2_121", "3_17", "3_38", "3_42", "3_67", "3_68", "3_106", "3_108", "3_113", "4_73", "4_192", "4_276", "4_304", "7_49", "7_96", "8_1", "10_2", "10_11", "10_91"]
"set":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
},
{
"name":"PLAYTEST - PC Expanded",
"name":"PLAYTEST - Expanded (PC)",
"code":"test_pc_expanded",
"sites":"SHADOWS",
"hall":true,
"playtest":true,
"set":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 51, 52, 53, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
"banned":["1_40", "1_45", "1_80", "1_108", "1_138", "1_139", "1_195", "1_234", "1_248", "1_311", "1_313", "1_316", "2_32", "2_75", "2_101", "2_108", "2_121", "3_17", "3_38", "3_42", "3_67", "3_68", "3_106", "3_108", "3_113", "4_73", "4_192", "4_276", "4_304", "7_49", "7_96", "8_1", "10_2", "10_11", "10_91", "11_31", "11_100", "11_114", "11_132", "13_188", "15_64"]
"set":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
}
]