Auto-apply errata when joining PC format table

This commit is contained in:
Troy Biesterfeld
2021-06-08 15:17:45 -05:00
parent 1638d9d106
commit 7dcaf377b6
4 changed files with 22 additions and 5 deletions

View File

@@ -91,6 +91,11 @@ public class DeckRequestHandler extends LotroServerRequestHandler implements Uri
format.validateDeck(deck);
valid.append("<b>" + format.getName() + "</b>: <font color='green'>valid</font><br/>");
} catch (DeckInvalidException exp) {
if (!format.getErrataCardMap().isEmpty()) {
LotroDeck deckWithErrata = format.applyErrata(deck);
format.validateDeck(deckWithErrata);
valid.append("<b>" + format.getName() + "</b>: <font color='yellow'>valid (with PC errata)</font><br/>");
}
invalid.append("<b>" + format.getName() + "</b>: <font color='red'>" + exp.getMessage() + "</font><br/>");
}
}

View File

@@ -27,6 +27,8 @@ public interface LotroFormat {
public void validateDeck(LotroDeck deck) throws DeckInvalidException;
public LotroDeck applyErrata(LotroDeck deck);
public List<Integer> getValidSets();
public List<String> getBannedCards();

View File

@@ -237,11 +237,6 @@ 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
@@ -330,6 +325,20 @@ 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()));
for (String card : deck.getAdventureCards()) {
deckWithErrata.addCard(_errataCardMap.getOrDefault(card, card));
}
for (String site : deck.getSites()) {
deckWithErrata.addSite(_errataCardMap.getOrDefault(site, site));
}
return deckWithErrata;
}
private void validateDeckStructure(LotroDeck deck) throws DeckInvalidException, CardNotFoundException {
if (deck.getAdventureCards().size() < _minimumDeckSize)
throw new DeckInvalidException("Deck contains below minimum number of cards: " + deck.getAdventureCards().size() + "<" + _minimumDeckSize);

View File

@@ -529,6 +529,7 @@ public class HallServer extends AbstractServer {
throw new HallException("You don't have a deck registered yet");
try {
lotroDeck = format.applyErrata(lotroDeck);
lotroDeck = validateUserAndDeck(format, player, collectionType, lotroDeck);
} catch (DeckInvalidException e) {
throw new HallException("Your selected deck is not valid for this format: " + e.getMessage());