deck improves:

* gui: removed public deck hash info;
* gui: improved xmage dck-file - now it correctly load a card's amount (related to files from third party services);
* server: fixed wrong cheating warning on deck construction (closes #11877);
* refactor: removed outdated hash code and calculations;
* other: added docs, added multiple deck hash tests;
This commit is contained in:
Oleg Agafonov 2024-04-10 22:18:07 +04:00
parent 889c1125e8
commit 7817a5cac6
32 changed files with 551 additions and 247 deletions

View file

@ -794,18 +794,14 @@ public class DeckEditorPanel extends javax.swing.JPanel {
dialog.showDialog();
if (!dialog.getTmpPath().isEmpty()) {
Deck deckToAppend = null;
StringBuilder errorMessages = new StringBuilder();
MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR));
try {
deckToAppend = Deck.load(DeckImporter.importDeckFromFile(dialog.getTmpPath(), errorMessages, false), true, true);
Deck deckToAppend = Deck.load(DeckImporter.importDeckFromFile(dialog.getTmpPath(), errorMessages, false), true, true);
processAndShowImportErrors(errorMessages);
if (deckToAppend != null) {
deck = Deck.append(deckToAppend, deck);
refreshDeck();
}
this.deck = Deck.append(deckToAppend, this.deck);
refreshDeck();
} catch (GameException e1) {
JOptionPane.showMessageDialog(MageFrame.getDesktop(), e1.getMessage(), "Error loading deck", JOptionPane.ERROR_MESSAGE);
} finally {
@ -864,7 +860,7 @@ public class DeckEditorPanel extends javax.swing.JPanel {
MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR));
try {
DeckFormats.writeDeck(needFileName, deck.getDeckCardLists());
DeckFormats.writeDeck(needFileName, deck.prepareCardsOnlyDeck());
try {
MageFrame.getPreferences().put("lastExportFolder", file.getCanonicalPath());
@ -1364,7 +1360,7 @@ public class DeckEditorPanel extends javax.swing.JPanel {
useDeckInfo = true;
}
MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR));
DeckCardLists cardLists = deck.getDeckCardLists();
DeckCardLists cardLists = deck.prepareCardsOnlyDeck();
cardLists.setCardLayout(deckArea.getCardLayout());
cardLists.setSideboardLayout(deckArea.getSideboardLayout());
if (!useDeckInfo) {
@ -1444,12 +1440,14 @@ public class DeckEditorPanel extends javax.swing.JPanel {
if (mode == DeckEditorMode.SIDEBOARDING
|| mode == DeckEditorMode.LIMITED_BUILDING
|| mode == DeckEditorMode.LIMITED_SIDEBOARD_BUILDING) {
// in game mode - move all to sideboard
for (Card card : deck.getCards()) {
deck.getSideboard().add(card);
}
deck.getCards().clear();
cardSelector.loadSideboard(new ArrayList<>(deck.getSideboard()), this.bigCard);
} else {
// in deck editor mode - clear all cards
deck = new Deck();
}
refreshDeck();
@ -1488,7 +1486,7 @@ public class DeckEditorPanel extends javax.swing.JPanel {
updateDeckTask.cancel(true);
}
if (SessionHandler.submitDeck(mode, tableId, deck.getDeckCardLists())) {
if (SessionHandler.submitDeck(mode, tableId, deck.prepareCardsOnlyDeck())) {
removeDeckEditor();
}
}//GEN-LAST:event_btnSubmitActionPerformed
@ -1504,7 +1502,7 @@ public class DeckEditorPanel extends javax.swing.JPanel {
updateDeckTask.cancel(true);
}
if (SessionHandler.submitDeck(mode, tableId, deck.getDeckCardLists())) {
if (SessionHandler.submitDeck(mode, tableId, deck.prepareCardsOnlyDeck())) {
SwingUtilities.invokeLater(this::removeDeckEditor);
}
return null;
@ -1617,7 +1615,7 @@ class UpdateDeckTask extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
while (!isCancelled()) {
SessionHandler.updateDeck(tableId, deck.getDeckCardLists());
SessionHandler.updateDeck(tableId, deck.prepareCardsOnlyDeck());
TimeUnit.SECONDS.sleep(5);
}
return null;

View file

@ -89,7 +89,7 @@ public class DeckExportClipboardDialog extends MageDialog {
DeckExporter exporter = formats.get(formatIndex).getExporter();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
exporter.writeDeck(baos, deck.getDeckCardLists());
exporter.writeDeck(baos, deck.prepareCardsOnlyDeck());
editData.setText(baos.toString());
editData.setCaretPosition(0);
}

View file

@ -135,7 +135,7 @@ public class DeckLegalityPanel extends javax.swing.JPanel {
} else {
// contains mock cards, e.g. it's a Deck Editor
try {
deckToValidate = Deck.load(deck.getDeckCardLists(), true, false);
deckToValidate = Deck.load(deck.prepareCardsOnlyDeck(), true, false);
} catch (Exception ex) {
logger.error("Can't load real deck cards for validate: " + ex.getMessage(), ex);
return;