Merge pull request #2112 from fwannmacher/master

Converted cardNumber from int to String. Now card number with "a" or "b" can be used.
This commit is contained in:
Derek M 2016-07-25 16:24:01 -04:00 committed by GitHub
commit 86e7ace06e
11427 changed files with 13206 additions and 11464 deletions

View file

@ -43,6 +43,7 @@ import mage.client.util.audio.AudioManager;
import mage.client.util.Command;
import mage.client.util.Config;
import mage.client.util.ImageHelper;
import mage.client.util.NaturalOrderCardNumberComparator;
import mage.client.util.sets.ConstructedFormats;
import mage.components.ImagePanel;
import mage.constants.Rarity;
@ -267,13 +268,18 @@ public class MageBook extends JComponent {
private List<CardInfo> getCards(int page, String set) {
CardCriteria criteria = new CardCriteria();
criteria.setCodes(set).start((long) page * conf.CARDS_PER_PAGE).count((long) conf.CARDS_PER_PAGE + 1);
criteria.setOrderBy("cardNumber");
criteria.setCodes(set);
List<CardInfo> cards = CardRepository.instance.findCards(criteria);
if (cards.size() > conf.CARDS_PER_PAGE) {
cards.sort(new NaturalOrderCardNumberComparator());
int start = page * conf.CARDS_PER_PAGE;
int end = page * conf.CARDS_PER_PAGE + conf.CARDS_PER_PAGE;
if (end > cards.size()) {
end = cards.size();
}
if (cards.size() > end) {
pageRight.setVisible(true);
}
return cards;
return cards.subList(start, end);
}
private ImagePanel getImagePanel(String filename, int type) {

View file

@ -0,0 +1,44 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.client.util;
import mage.cards.repository.CardInfo;
/**
*
* @author fwannmacher
*/
public class NaturalOrderCardNumberComparator extends NaturalOrderComparator {
@Override
public int compare(Object o1, Object o2) {
CardInfo cardInfo1 = (CardInfo) o1;
CardInfo cardInfo2 = (CardInfo) o2;
return super.compare(cardInfo1.getCardNumber(), cardInfo2.getCardNumber());
}
}

View file

@ -0,0 +1,188 @@
/*
NaturalOrderComparator.java -- Perform 'natural order' comparisons of strings in Java.
Copyright (C) 2003 by Pierre-Luc Paour <natorder@paour.com>
Based on the C version by Martin Pool, of which this is more or less a straight conversion.
Copyright (C) 2000 by Martin Pool <mbp@humbug.org.au>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
package mage.client.util;
import java.util.*;
public class NaturalOrderComparator implements Comparator
{
int compareRight(String a, String b)
{
int bias = 0;
int ia = 0;
int ib = 0;
// The longest run of digits wins. That aside, the greatest
// value wins, but we can't know that it will until we've scanned
// both numbers to know that they have the same magnitude, so we
// remember it in BIAS.
for (;; ia++, ib++)
{
char ca = charAt(a, ia);
char cb = charAt(b, ib);
if (!Character.isDigit(ca) && !Character.isDigit(cb))
{
return bias;
}
else if (!Character.isDigit(ca))
{
return -1;
}
else if (!Character.isDigit(cb))
{
return +1;
}
else if (ca < cb)
{
if (bias == 0)
{
bias = -1;
}
}
else if (ca > cb)
{
if (bias == 0)
bias = +1;
}
else if (ca == 0 && cb == 0)
{
return bias;
}
}
}
@Override
public int compare(Object o1, Object o2)
{
String a = o1.toString();
String b = o2.toString();
int ia = 0, ib = 0;
int nza = 0, nzb = 0;
char ca, cb;
int result;
while (true)
{
// only count the number of zeroes leading the last number compared
nza = nzb = 0;
ca = charAt(a, ia);
cb = charAt(b, ib);
// skip over leading spaces or zeros
while (Character.isSpaceChar(ca) || ca == '0')
{
if (ca == '0')
{
nza++;
}
else
{
// only count consecutive zeroes
nza = 0;
}
ca = charAt(a, ++ia);
}
while (Character.isSpaceChar(cb) || cb == '0')
{
if (cb == '0')
{
nzb++;
}
else
{
// only count consecutive zeroes
nzb = 0;
}
cb = charAt(b, ++ib);
}
// process run of digits
if (Character.isDigit(ca) && Character.isDigit(cb))
{
if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0)
{
return result;
}
}
if (ca == 0 && cb == 0)
{
// The strings compare the same. Perhaps the caller
// will want to call strcmp to break the tie.
return nza - nzb;
}
if (ca < cb)
{
return -1;
}
else if (ca > cb)
{
return +1;
}
++ia;
++ib;
}
}
static char charAt(String s, int i)
{
if (i >= s.length())
{
return 0;
}
else
{
return s.charAt(i);
}
}
public static void main(String[] args)
{
String[] strings = new String[] { "1-2", "1-02", "1-20", "10-20", "fred", "jane", "pic01",
"pic2", "pic02", "pic02a", "pic3", "pic4", "pic 4 else", "pic 5", "pic05", "pic 5",
"pic 5 something", "pic 6", "pic 7", "pic100", "pic100a", "pic120", "pic121",
"pic02000", "tom", "x2-g8", "x2-y7", "x2-y08", "x8-y8" };
List orig = Arrays.asList(strings);
System.out.println("Original: " + orig);
List scrambled = Arrays.asList(strings);
Collections.shuffle(scrambled);
System.out.println("Scrambled: " + scrambled);
Collections.sort(scrambled, new NaturalOrderComparator());
System.out.println("Sorted: " + scrambled);
}
}

View file

@ -148,7 +148,7 @@ public class MagicCardsImageSource implements CardImageSource {
@Override
public String generateURL(CardDownloadData card) throws Exception {
Integer collectorId = card.getCollectorId();
String collectorId = card.getCollectorId();
String cardSet = card.getSet();
if (collectorId == null || cardSet == null) {
throw new Exception("Wrong parameters for image: collector id: " + collectorId + ",card set: " + cardSet);

View file

@ -57,7 +57,7 @@ public class MtgImageSource implements CardImageSource {
@Override
public String generateURL(CardDownloadData card) throws Exception {
Integer collectorId = card.getCollectorId();
String collectorId = card.getCollectorId();
String cardSet = card.getSet();
if (collectorId == null || cardSet == null) {
throw new Exception("Wrong parameters for image: collector id: " + collectorId + ",card set: " + cardSet);

View file

@ -202,7 +202,7 @@ public class MythicspoilerComSource implements CardImageSource {
@Override
public String generateURL(CardDownloadData card) throws Exception {
Integer collectorId = card.getCollectorId();
String collectorId = card.getCollectorId();
String cardSet = card.getSet();
if (collectorId == null || cardSet == null) {
throw new Exception("Wrong parameters for image: collector id: " + collectorId + ",card set: " + cardSet);

View file

@ -413,7 +413,7 @@ public class WizardCardsImageSource implements CardImageSource {
@Override
public String generateURL(CardDownloadData card) throws Exception {
Integer collectorId = card.getCollectorId();
String collectorId = card.getCollectorId();
String cardSet = card.getSet();
if (collectorId == null || cardSet == null) {
throw new Exception("Wrong parameters for image: collector id: " + collectorId + ",card set: " + cardSet);
@ -430,12 +430,20 @@ public class WizardCardsImageSource implements CardImageSource {
}
String link = setLinks.get(card.getDownloadName().toLowerCase());
if (link == null) {
if (setLinks.size() >= collectorId) {
link = setLinks.get(Integer.toString(collectorId - 1));
int length = collectorId.length();
if (Character.isLetter(collectorId.charAt(length -1))) {
length -= 1;
}
int number = Integer.parseInt(collectorId.substring(0, length));
if (setLinks.size() >= number) {
link = setLinks.get(Integer.toString(number - 1));
} else {
link = setLinks.get(Integer.toString(collectorId - 21));
link = setLinks.get(Integer.toString(number - 21));
if (link != null) {
link = link.replace(Integer.toString(collectorId - 20), (Integer.toString(collectorId - 20) + "a"));
link = link.replace(Integer.toString(number - 20), (Integer.toString(number - 20) + "a"));
}
}
}

View file

@ -12,7 +12,7 @@ public class CardDownloadData {
private String downloadName;
private String set;
private String tokenSetCode;
private Integer collectorId;
private String collectorId;
private Integer type;
private boolean token;
private boolean twoFacedCard;
@ -23,15 +23,15 @@ public class CardDownloadData {
private boolean usesVariousArt;
private boolean isType2;
public CardDownloadData(String name, String set, Integer collectorId, boolean usesVariousArt, Integer type, String tokenSetCode) {
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode) {
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, false);
}
public CardDownloadData(String name, String set, Integer collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, boolean token) {
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, boolean token) {
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, token, false, false);
}
public CardDownloadData(String name, String set, Integer collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, boolean token, boolean twoFacedCard, boolean secondSide) {
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, boolean token, boolean twoFacedCard, boolean secondSide) {
this.name = name;
this.set = set;
this.collectorId = collectorId;
@ -102,7 +102,7 @@ public class CardDownloadData {
return hash;
}
public Integer getCollectorId() {
public String getCollectorId() {
return collectorId;
}

View file

@ -238,7 +238,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
public static boolean checkForNewCards(List<CardInfo> allCards) {
TFile file;
for (CardInfo card : allCards) {
if (card.getCardNumber() > 0 && !card.getSetCode().isEmpty()) {
if (!card.getCardNumber().isEmpty() && !"0".equals(card.getCardNumber()) && !card.getSetCode().isEmpty()) {
CardDownloadData url = new CardDownloadData(card.getName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", false, card.isDoubleFaced(), card.isNightCard());
file = new TFile(CardImageUtils.generateImagePath(url));
if (!file.exists()) {
@ -281,7 +281,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
offlineMode = true;
for (CardInfo card : allCards) {
if (card.getCardNumber() > 0 && !card.getSetCode().isEmpty()
if (!card.getCardNumber().isEmpty() && !"0".equals(card.getCardNumber()) && !card.getSetCode().isEmpty()
&& !ignoreUrls.contains(card.getSetCode())) {
String cardName = card.getName();
boolean isType2 = type2SetsFilter.contains(card.getSetCode());
@ -313,7 +313,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
url.setType2(isType2);
allCardsUrls.add(url);
}
} else if (card.getCardNumber() < 1) {
} else if (card.getCardNumber().isEmpty() || "0".equals(card.getCardNumber())) {
System.err.println("There was a critical error!");
logger.error("Card has no collector ID and won't be sent to client: " + card);
} else if (card.getSetCode().isEmpty()) {
@ -385,19 +385,19 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
}
if (params[1].toLowerCase().equals("generate") && params[2].startsWith("TOK:")) {
String set = params[2].substring(4);
CardDownloadData card = new CardDownloadData(params[3], set, 0, false, type, "", true);
CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", true);
list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM:")) {
String set = params[2].substring(7);
CardDownloadData card = new CardDownloadData("Emblem " + params[3], set, 0, false, type, "", true);
CardDownloadData card = new CardDownloadData("Emblem " + params[3], set, "0", false, type, "", true);
list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM-:")) {
String set = params[2].substring(8);
CardDownloadData card = new CardDownloadData(params[3] + " Emblem", set, 0, false, type, "", true);
CardDownloadData card = new CardDownloadData(params[3] + " Emblem", set, "0", false, type, "", true);
list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM!:")) {
String set = params[2].substring(8);
CardDownloadData card = new CardDownloadData(params[3], set, 0, false, type, "", true);
CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", true);
list.add(card);
}
} else {
@ -483,7 +483,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
String url;
if (ignoreUrls.contains(card.getSet()) || card.isToken()) {
if (card.getCollectorId() != 0) {
if (!"0".equals(card.getCollectorId())) {
continue;
}
url = cardImageSource.generateTokenUrl(card);

View file

@ -73,13 +73,13 @@ public class ImageCache {
String name = m.group(1);
String set = m.group(2);
Integer type = Integer.parseInt(m.group(3));
Integer collectorId = Integer.parseInt(m.group(4));
String collectorId = m.group(4);
String tokenSetCode = m.group(5);
CardDownloadData info = new CardDownloadData(name, set, collectorId, usesVariousArt, type, tokenSetCode);
String path;
if (collectorId == 0) {
if (collectorId.isEmpty() || "0".equals(collectorId)) {
info.setToken(true);
path = CardImageUtils.generateTokenImagePath(info);
if (path == null) {
@ -153,7 +153,7 @@ public class ImageCache {
}
public static BufferedImage getMorphImage() {
CardDownloadData info = new CardDownloadData("Morph", "KTK", 0, false, 0, "KTK");
CardDownloadData info = new CardDownloadData("Morph", "KTK", "0", false, 0, "KTK");
info.setToken(true);
String path = CardImageUtils.generateTokenImagePath(info);
if (path == null) {
@ -164,7 +164,7 @@ public class ImageCache {
}
public static BufferedImage getManifestImage() {
CardDownloadData info = new CardDownloadData("Manifest", "FRF", 0, false, 0, "FRF");
CardDownloadData info = new CardDownloadData("Manifest", "FRF", "0", false, 0, "FRF");
info.setToken(true);
String path = CardImageUtils.generateTokenImagePath(info);
if (path == null) {