Honor finite deck copy limits across printings and deck zones [skip ci] (#7719)

This commit is contained in:
Bryce! 2026-11-09 07:57:39 -05:00 • committed by GitHub
parent 18388d9994
commit 16455c9fd5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 440 additions and 48 deletions

View file

@ -45,12 +45,23 @@ bool exceptionAppliesToCard(const CardInfo &card, const ExceptionRule &rule)
return true;
}
bool cardHasAnyException(const CardInfo &card, const FormatRules &format)
std::optional<int> cardCopyLimitException(const CardInfo &card, const FormatRules &format)
{
std::optional<int> limit;
for (const ExceptionRule &rule : format.exceptions) {
if (exceptionAppliesToCard(card, rule)) {
return true;
if (rule.maxCopies == -1) {
return -1;
}
if (rule.maxCopies >= 0 && (!limit || rule.maxCopies > *limit)) {
limit = rule.maxCopies;
}
}
}
return false;
}
return limit;
}
bool cardHasAnyException(const CardInfo &card, const FormatRules &format)
{
return cardCopyLimitException(card, format).has_value();
}

View file

@ -4,6 +4,7 @@
#include <QList>
#include <QSharedPointer>
#include <QString>
#include <optional>
class CardInfo;
@ -74,6 +75,9 @@ bool cardMatchesCondition(const CardInfo &card, const CardCondition &cond);
bool exceptionAppliesToCard(const CardInfo &card, const ExceptionRule &rule);
/** @brief Most permissive matching copy-count exception, or no value when none applies. */
std::optional<int> cardCopyLimitException(const CardInfo &card, const FormatRules &format);
bool cardHasAnyException(const CardInfo &card, const FormatRules &format);
#endif // COCKATRICE_FORMAT_LEGALITY_RULES_H