Cockatrice 2026-04-21-Development-2.11.0-beta.61
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
interface_json_deck_parser.h
Go to the documentation of this file.
1
6
7#ifndef INTERFACE_JSON_DECK_PARSER_H
8#define INTERFACE_JSON_DECK_PARSER_H
9
11
12#include <QJsonArray>
13#include <QJsonObject>
16
18{
19public:
20 virtual ~IJsonDeckParser() = default;
21
22 virtual DeckList parse(const QJsonObject &obj) = 0;
23};
24
26{
27public:
28 DeckList parse(const QJsonObject &obj) override
29 {
30 DeckList deckList;
31
32 QString deckName = obj.value("name").toString();
33 QString deckDescription = obj.value("description").toString();
34
35 deckList.setName(deckName);
36 deckList.setComments(deckDescription);
37
38 QString outputText;
39 QTextStream outStream(&outputText);
40
41 for (auto entry : obj.value("cards").toArray()) {
42 auto quantity = entry.toObject().value("quantity").toInt();
43
44 auto card = entry.toObject().value("card").toObject();
45 auto oracleCard = card.value("oracleCard").toObject();
46 QString cardName = oracleCard.value("name").toString();
47 QString setName = card.value("edition").toObject().value("editioncode").toString().toUpper();
48 QString collectorNumber = card.value("collectorNumber").toString();
49
50 outStream << quantity << ' ' << cardName << " (" << setName << ") " << collectorNumber << '\n';
51 }
52
53 deckList.loadFromStream_Plain(outStream, false, CardNameNormalizer());
55
56 return deckList;
57 }
58};
59
61{
62public:
63 DeckList parse(const QJsonObject &obj) override
64 {
65 DeckList deckList;
66
67 QString deckName = obj.value("name").toString();
68 QString deckDescription = obj.value("description").toString();
69
70 deckList.setName(deckName);
71 deckList.setComments(deckDescription);
72
73 QString outputText;
74 QTextStream outStream(&outputText);
75
76 for (auto entry : obj.value("mainboard").toObject()) {
77 auto quantity = entry.toObject().value("quantity").toInt();
78
79 auto card = entry.toObject().value("card").toObject();
80 QString cardName = card.value("name").toString();
81 QString setName = card.value("set").toString().toUpper();
82 QString collectorNumber = card.value("cn").toString();
83
84 outStream << quantity << ' ' << cardName << " (" << setName << ") " << collectorNumber << '\n';
85 }
86
87 outStream << '\n';
88
89 for (auto entry : obj.value("sideboard").toObject()) {
90 auto quantity = entry.toObject().value("quantity").toInt();
91
92 auto card = entry.toObject().value("card").toObject();
93 QString cardName = card.value("name").toString();
94 QString setName = card.value("set").toString().toUpper();
95 QString collectorNumber = card.value("cn").toString();
96
97 outStream << quantity << ' ' << cardName << " (" << setName << ") " << collectorNumber << '\n';
98 }
99
100 deckList.loadFromStream_Plain(outStream, false, CardNameNormalizer());
102
103 QJsonObject commandersObj = obj.value("commanders").toObject();
104 if (!commandersObj.isEmpty()) {
105 for (auto it = commandersObj.begin(); it != commandersObj.end(); ++it) {
106 QJsonObject cardData = it.value().toObject().value("card").toObject();
107 QString commanderName = cardData.value("name").toString();
108 QString setName = cardData.value("set").toString().toUpper();
109 QString collectorNumber = cardData.value("cn").toString();
110 QString providerId = cardData.value("scryfall_id").toString();
111
112 deckList.setBannerCard({commanderName, providerId});
113 deckList.addCard(commanderName, DECK_ZONE_MAIN, -1, setName, collectorNumber, providerId);
114 }
115 }
116
117 return deckList;
118 }
119};
120
121#endif // INTERFACE_JSON_DECK_PARSER_H
Definition interface_json_deck_parser.h:26
DeckList parse(const QJsonObject &obj) override
Definition interface_json_deck_parser.h:28
Represents a complete deck, including metadata, zones, cards, and sideboard plans.
Definition deck_list.h:63
void setBannerCard(const CardRef &_bannerCard={})
Definition deck_list.h:114
void forEachCard(const std::function< void(InnerDecklistNode *, DecklistCardNode *)> &func) const
Apply a function to every card in the deck tree.
Definition deck_list.cpp:498
void setComments(const QString &_comments=QString())
Definition deck_list.h:98
DecklistCardNode * addCard(const QString &cardName, const QString &zoneName, int position=-1, const QString &cardSetName=QString(), const QString &cardSetCollectorNumber=QString(), const QString &cardProviderId=QString(), const bool formatLegal=true)
Definition deck_list.cpp:457
bool loadFromStream_Plain(QTextStream &stream, bool preserveMetadata, const std::function< QString(const QString &)> &cardNameNormalizer)
Definition deck_list.cpp:205
void setName(const QString &_name=QString())
Definition deck_list.h:94
Definition interface_json_deck_parser.h:18
virtual ~IJsonDeckParser()=default
virtual DeckList parse(const QJsonObject &obj)=0
Definition interface_json_deck_parser.h:61
DeckList parse(const QJsonObject &obj) override
Definition interface_json_deck_parser.h:63
Defines the DeckList class, which manages a full deck structure including cards, zones,...
#define DECK_ZONE_MAIN
Constant for the "main" deck zone name.
Definition inner_deck_list_node.h:22
Definition card_name_normalizer.h:11
Sets the providerId of the card based on its set name and collector number.
Definition card_node_function.h:33