diff --git a/projects/mtg/Android/libs/json-simple-1.1.jar b/projects/mtg/Android/libs/json-simple-1.1.jar new file mode 100644 index 000000000..f395f4147 Binary files /dev/null and b/projects/mtg/Android/libs/json-simple-1.1.jar differ diff --git a/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java b/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java index 9b20ab690..9b8b5639d 100644 --- a/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java +++ b/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java @@ -6,6 +6,10 @@ import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.jsoup.nodes.Node; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.Enumeration; @@ -142,6 +146,125 @@ public class ImgDownloader { return true; } + public static JSONObject findCardJsonById(String multiverseId) { + try{ + String apiUrl = "https://api.scryfall.com/cards/multiverse/" + multiverseId; + + URL url = new URL(apiUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + JSONParser jsonParser = new JSONParser(); + JSONObject jsonObject = (JSONObject) jsonParser.parse(response.toString()); + return jsonObject; + } catch(Exception e){ + return null; + } + } + + public static String findCardImageUrl(JSONObject jsonObject, String primitiveCardName, String format){ + Map imageUris = new HashMap(); + if (jsonObject.get("image_uris") != null) { + JSONObject imageUrisObject = (JSONObject) jsonObject.get("image_uris"); + if(imageUrisObject != null && jsonObject.get("name").equals(primitiveCardName)) + imageUris = (HashMap) imageUrisObject; + } else if (jsonObject.get("card_faces") != null) { + JSONArray faces = (JSONArray) jsonObject.get("card_faces"); + if(faces != null){ + for (Object o : faces) { + JSONObject imageUrisObject = (JSONObject) o; + if(imageUrisObject != null && imageUrisObject.get("name").equals(primitiveCardName)){ + if (imageUrisObject.get("image_uris") != null) { + imageUrisObject = (JSONObject) imageUrisObject.get("image_uris"); + if(imageUrisObject != null) + imageUris = (HashMap) imageUrisObject; + } + } + } + } + } else { + System.err.println("Cannot retrieve image url for card: " + primitiveCardName); + return ""; + } + String imageUrl = imageUris.get(format); + if(imageUrl.indexOf(".jpg") < imageUrl.length()) + imageUrl = imageUrl.substring(0, imageUrl.indexOf(".jpg")+4); + return imageUrl; + } + + public static String findTokenImageUrl(JSONObject jsonObject, String format){ + String imageUrl = ""; + try { + Document document = Jsoup.connect((String )jsonObject.get("scryfall_uri")).get(); + if (document != null) { + Element printsTable = document.selectFirst("table.prints-table"); + if (printsTable != null) { + Element tokenRow = null; + Elements rows = printsTable.select("tr"); + for (Element row : rows) { + if (row.text().contains(" Token,") && !row.text().contains("Faces,")) { + tokenRow = row; + } + } + if (tokenRow != null) { + Element aElement = tokenRow.selectFirst("td > a"); + if (aElement != null) { + String tokenName = aElement.text(); + tokenName = tokenName.substring(0, tokenName.indexOf(" Token,")); + System.out.println("Token found: " + tokenName); + imageUrl = aElement.attr("data-card-image-front"); + if(imageUrl.indexOf(".jpg") < imageUrl.length()) + imageUrl = imageUrl.substring(0, imageUrl.indexOf(".jpg")+4); + } + } + } + } + } catch (IOException e) { + System.err.println("There was an error while retrieving token image..."); + return null; + } + return imageUrl.replace("large", format); + } + + public static String findTokenName(JSONObject jsonObject){ + String tokenName = ""; + try { + Document document = Jsoup.connect((String) jsonObject.get("scryfall_uri")).get(); + if (document != null) { + Element printsTable = document.selectFirst("table.prints-table"); + if (printsTable != null) { + Element tokenRow = null; + Elements rows = printsTable.select("tr"); + for (Element row : rows) { + if (row.text().contains(" Token,") && !row.text().contains("Faces,")) { + tokenRow = row; + } + } + if (tokenRow != null) { + Element aElement = tokenRow.selectFirst("td > a"); + if (aElement != null) { + tokenName = aElement.text(); + tokenName = tokenName.substring(0, tokenName.indexOf(" Token,")); + System.out.println("Token found: " + tokenName); + } + } + } + } + } catch (IOException e) { + System.err.println("There was an error while retrieving the token image..."); + return null; + } + return tokenName; + } + public static boolean fastDownloadCard(String set, String id, String name, String imgPath, String thumbPath, int ImgX, int ImgY, int ThumbX, int ThumbY, int Border, int BorderThumb) { if (database == null) return false; @@ -3701,7 +3824,7 @@ public class ImgDownloader { set.equals("UNH") || set.equals("XLN") || set.equals("SOI") || set.equals("SOK") || set.equals("BOK") || set.equals("CHK") || set.equals("ZNR") || set.equals("KHM") || set.equals("STX") || set.equals("MID") || set.equals("CC2") || set.equals("VOW") || - set.equals("DBL") || set.equals("Y22") || set.equals("MOM")) + set.equals("DBL") || set.equals("Y22") || set.equals("MOM") || set.equals("NEO")) rarity = ""; if(id != null && !rarity.equals("t") && (negativeId || id.equals("209162") || id.equals("209163") || id.equals("401721") || id.equals("401722") || id.equals("999902"))) @@ -3838,6 +3961,9 @@ public class ImgDownloader { if (fastDownloadCard(set, id, mappa.get(id), imgPath.getAbsolutePath(), thumbPath.getAbsolutePath(), ImgX, ImgY, ThumbX, ThumbY, Border, BorderThumb)) continue; String specialcardurl = getSpecialCardUrl(id, set); + JSONObject card = findCardJsonById(id); + if(specialcardurl.isEmpty() && card != null) + specialcardurl = findCardImageUrl(card, mappa.get(id), "large"); if (!specialcardurl.isEmpty()) { URL url = new URL(specialcardurl); HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); @@ -3942,10 +4068,126 @@ public class ImgDownloader { res = mappa.get(id) + " - " + set + File.separator + "thumbnails" + File.separator + id + ".jpg\n" + res; break; } + if(card != null && hasToken(id)) { + String text = (String) card.get("oracle_text"); + if (text != null && !text.isEmpty() && !text.trim().toLowerCase().contains("nontoken") && ((text.trim().toLowerCase().contains("create") && text.trim().toLowerCase().contains("creature token")) || + (text.trim().toLowerCase().contains("put") && text.trim().toLowerCase().contains("token")))) { + System.out.println("The card: " + mappa.get(id) + " (" + id + ".jpg) can create a token, i will try to download that image too as " + id + "t.jpg"); + + String specialtokenurl = findTokenImageUrl(card, "large"); + String nametoken = findTokenName(card); + URL urltoken = null; + if (!specialtokenurl.isEmpty()) + urltoken = new URL(specialtokenurl); + + HttpURLConnection httpcontoken = (HttpURLConnection) urltoken.openConnection(); + if (httpcontoken == null) { + System.err.println("Error: Problem downloading token: " + nametoken + " (" + id + "t.jpg), i will not download it..."); + res = nametoken + " - " + set + File.separator + id + "t.jpg\n" + res; + break; + } + httpcontoken.addRequestProperty("User-Agent", "Mozilla/4.76"); + httpcontoken.setConnectTimeout(5000); + httpcontoken.setReadTimeout(5000); + httpcontoken.setAllowUserInteraction(false); + httpcontoken.setDoInput(true); + httpcontoken.setDoOutput(false); + InputStream intoken = null; + try { + intoken = new BufferedInputStream(httpcontoken.getInputStream()); + } catch (IOException ex) { + System.out.println("Warning: Problem downloading token: " + nametoken + " (" + id + "t.jpg), i will retry 2 times more..."); + try { + intoken = new BufferedInputStream(httpcontoken.getInputStream()); + } catch (IOException ex2) { + System.out.println("Warning: Problem downloading token: " + nametoken + " (" + id + "t.jpg), i will retry 1 time more..."); + try { + intoken = new BufferedInputStream(httpcontoken.getInputStream()); + } catch (IOException ex3) { + System.err.println("Error: Problem downloading token: " + nametoken + " (" + id + "t.jpg), i will not retry anymore..."); + res = nametoken + " - " + set + File.separator + id + "t.jpg\n" + res; + break; + } + } + } + ByteArrayOutputStream outtoken = new ByteArrayOutputStream(); + byte[] buftoken = new byte[1024]; + int ntoken = 0; + millis = System.currentTimeMillis(); + timeout = false; + while (-1 != (ntoken = intoken.read(buftoken)) && !timeout) { + outtoken.write(buftoken, 0, ntoken); + if (System.currentTimeMillis() - millis > 10000) + timeout = true; + } + if (timeout) { + System.out.println("Warning: Problem downloading token: " + id + "t.jpg from, i will retry 2 times more..."); + buftoken = new byte[1024]; + ntoken = 0; + millis = System.currentTimeMillis(); + timeout = false; + while (-1 != (ntoken = intoken.read(buftoken)) && !timeout) { + outtoken.write(buftoken, 0, ntoken); + if (System.currentTimeMillis() - millis > 10000) + timeout = true; + } + if (timeout) { + System.out.println("Warning: Problem downloading token: " + id + "t.jpg from, i will retry 1 time more..."); + buftoken = new byte[1024]; + ntoken = 0; + millis = System.currentTimeMillis(); + timeout = false; + while (-1 != (ntoken = intoken.read(buftoken)) && !timeout) { + outtoken.write(buftoken, 0, ntoken); + if (System.currentTimeMillis() - millis > 10000) + timeout = true; + } + } + } + outtoken.close(); + intoken.close(); + if (timeout) { + System.err.println("Error: Problem downloading token: " + id + "t.jpg from, i will not retry anymore..."); + break; + } + byte[] responsetoken = outtoken.toByteArray(); + String tokenimage = imgPath + File.separator + id + "t.jpg"; + String tokenthumbimage = thumbPath + File.separator + id + "t.jpg"; + FileOutputStream fos2 = new FileOutputStream(tokenimage); + fos2.write(responsetoken); + fos2.close(); + try { + Bitmap yourBitmapToken = BitmapFactory.decodeFile(tokenimage); + Bitmap resizedToken = Bitmap.createScaledBitmap(yourBitmapToken, ImgX, ImgY, true); + if (Border > 0) + resizedToken = Bitmap.createBitmap(resizedToken, Border, Border, ImgX - 2 * Border, ImgY - 2 * Border); + FileOutputStream fout = new FileOutputStream(tokenimage); + resizedToken.compress(Bitmap.CompressFormat.JPEG, 100, fout); + fout.close(); + } catch (Exception e) { + System.err.println("Error: Problem resizing token: " + id + "t.jpg, image may be corrupted..."); + res = nametoken + " - " + set + File.separator + "thumbnails" + File.separator + id + "t.jpg\n" + res; + break; + } + try { + Bitmap yourBitmapTokenthumb = BitmapFactory.decodeFile(tokenimage); + Bitmap resizedThumbToken = Bitmap.createScaledBitmap(yourBitmapTokenthumb, ThumbX, ThumbY, true); + if (BorderThumb > 0) + resizedThumbToken = Bitmap.createBitmap(resizedThumbToken, BorderThumb, BorderThumb, ThumbX - 2 * BorderThumb, ThumbY - 2 * BorderThumb); + FileOutputStream fout = new FileOutputStream(tokenthumbimage); + resizedThumbToken.compress(Bitmap.CompressFormat.JPEG, 100, fout); + fout.close(); + } catch (Exception e) { + System.err.println("Error: Problem resizing token thumbnail: " + id + "t.jpg, image may be corrupted..."); + res = nametoken + " - " + set + File.separator + "thumbnails" + File.separator + id + "t.jpg\n" + res; + } + } + } continue; } if (id.endsWith("t")) continue; + Document doc = null; String cardname = mappa.get(id); Elements divs = new Elements(); @@ -3965,7 +4207,8 @@ public class ImgDownloader { || scryset.equals("SOI") || scryset.equals("UST") || scryset.equals("PLG21") || scryset.equals("J21") || scryset.equals("CC2") || scryset.equals("Q06") || scryset.equals("DBL") || scryset.equals("Y22") | scryset.equals("CLB") || scryset.equals("MOM") || scryset.equals("MOC") || scryset.equals("BRO") || scryset.equals("MAT") || scryset.equals("BRC") || scryset.equals("BRR") - || scryset.equals("NEO") || scryset.equals("ONE") || scryset.equals("ONC") || scryset.equals("DMR") || scryset.equals("NEC")){ + || scryset.equals("NEO") || scryset.equals("ONE") || scryset.equals("ONC") || scryset.equals("DMR") || scryset.equals("NEC") + || scryset.equals("J22")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); Elements outlinks = doc.select("body a"); @@ -4134,7 +4377,8 @@ public class ImgDownloader { && !scryset.equals("SOI") && !scryset.equals("UST") && !scryset.equals("PLG21") && !scryset.equals("J21") && !scryset.equals("CC2") && !scryset.equals("Q06") && !scryset.equals("DBL") && !scryset.equals("Y22") && !scryset.equals("CLB") && !scryset.equals("MOM") && !scryset.equals("MOC") && !scryset.equals("BRO") && !scryset.equals("MAT") && !scryset.equals("BRC") && !scryset.equals("BRR") - && !scryset.equals("NEO") && !scryset.equals("ONE") && !scryset.equals("ONC") && !scryset.equals("DMR") && !scryset.equals("NEC")){ + && !scryset.equals("NEO") && !scryset.equals("ONE") && !scryset.equals("ONC") && !scryset.equals("DMR") && !scryset.equals("NEC") + && !scryset.equals("J22")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); Elements outlinks = doc.select("body a"); @@ -4254,7 +4498,8 @@ public class ImgDownloader { && !scryset.equals("SOI") && !scryset.equals("UST") && !scryset.equals("PLG21") && !scryset.equals("J21") && !scryset.equals("CC2") && !scryset.equals("Q06") && !scryset.equals("DBL") && !scryset.equals("Y22") && !scryset.equals("CLB") && !scryset.equals("MOM") && !scryset.equals("MOC") && !scryset.equals("BRO") && !scryset.equals("MAT") && !scryset.equals("BRC") && !scryset.equals("BRR") - && !scryset.equals("NEO") && !scryset.equals("ONE") && !scryset.equals("ONC") && !scryset.equals("DMR") && !scryset.equals("NEC")){ + && !scryset.equals("NEO") && !scryset.equals("ONE") && !scryset.equals("ONC") && !scryset.equals("DMR") && !scryset.equals("NEC") + && !scryset.equals("J22")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); } catch (Exception e) { @@ -4426,7 +4671,7 @@ public class ImgDownloader { || scryset.equals("UST") || scryset.equals("PLG21") || scryset.equals("J21") || scryset.equals("CC2") || scryset.equals("Q06") || scryset.equals("DBL") || scryset.equals("Y22") || scryset.equals("CLB") || scryset.equals("MOM") || scryset.equals("MOC") || scryset.equals("BRO") || scryset.equals("MAT") || scryset.equals("BRC") || scryset.equals("BRR") || scryset.equals("NEO") - || scryset.equals("ONE") || scryset.equals("ONC") || scryset.equals("DMR") || scryset.equals("NEC")){ + || scryset.equals("ONE") || scryset.equals("ONC") || scryset.equals("DMR") || scryset.equals("NEC") || scryset.equals("J22")){ Elements metadata = doc.select("head meta"); if(metadata != null) { for (int j = 0; j < metadata.size(); j++){ @@ -4640,6 +4885,10 @@ public class ImgDownloader { String specialtokenurl = getSpecialTokenUrl(id + "t", set); if(specialtokenurl.isEmpty()) specialtokenurl = getSpecialCardUrl(id + "t", set); + if(specialtokenurl.isEmpty() && card != null) + specialtokenurl = findTokenImageUrl(card, "large"); + if(nametoken.isEmpty() && card != null) + nametoken = findTokenName(card); if (!specialtokenurl.isEmpty()) { try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); diff --git a/projects/mtg/CardImageLinks.csv b/projects/mtg/CardImageLinks.csv index 3e6f3bc1a..1a43cc3b5 100644 --- a/projects/mtg/CardImageLinks.csv +++ b/projects/mtg/CardImageLinks.csv @@ -64537,6 +64537,130 @@ GN3;582743;https://cards.scryfall.io/large/front/2/8/28294aef-eba7-4f20-bf81-c85 GN3;582744;https://cards.scryfall.io/large/front/5/8/586ad230-fb4b-4b34-8d5c-633726496634.jpg GN3;582745;https://cards.scryfall.io/large/front/2/f/2fd47e30-2ab0-452d-ac51-fa182c2b00fc.jpg GN3;582746;https://cards.scryfall.io/large/front/8/5/85a1b232-92ab-4829-9af3-26b280507dc0.jpg +J22;589563t;https://cards.scryfall.io/large/front/a/5/a5c325d9-6cfc-4e41-b73d-4a45454d9fad.jpg +J22;589568t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg +J22;589581t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;589583t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;589594t;https://www.mtgnexus.com/img/ccc/ren/7830/29125.jpg +J22;597043t;https://cards.scryfall.io/large/front/7/b/7b0b95ce-4821-4955-a27c-93471240f54b.jpg +J22;597049t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg +J22;597054t;https://cards.scryfall.io/large/front/2/0/209d3f3e-a41e-4d9b-a9bd-50d11e89b5ea.jpg +J22;597059t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;597063t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;597068t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;597078t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg +J22;597510t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;597518t;https://www.mtg.onl/static/987cd9d77ce79d4feb56788cabbb5dd0/4d406/PROXY_Spawn_2_2.jpg +J22;591418t;https://cards.scryfall.io/large/front/b/0/b0819e8e-fb7e-43c7-a7cf-d768f43193ac.jpg +J22;591428t;https://cards.scryfall.io/large/front/d/e/dee1c2ee-d92e-409a-995a-b4c91620c918.jpg +J22;591429t;https://cards.scryfall.io/large/front/5/f/5f458f39-27b6-4121-bda9-1a0d1b42f5fb.jpg +J22;591433t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg +J22;591443t;https://cards.scryfall.io/large/front/5/2/52cf8f6b-2334-4881-8f58-4e11745c8851.jpg +J22;591446t;https://cards.scryfall.io/large/front/1/7/1774c68a-3d76-4fe1-b741-e6acf6b9214c.jpg +J22;591450t;https://cards.scryfall.io/large/front/d/0/d0cc09a9-a21b-40ee-8b68-bc084f71737d.jpg +J22;591455t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg +J22;591461t;https://cards.scryfall.io/large/front/0/5/0537522a-1f4f-4a81-a678-6b280ebc29fc.jpg +J22;591463t;https://cards.scryfall.io/large/front/5/2/52cf8f6b-2334-4881-8f58-4e11745c8851.jpg +J22;591485t;https://cards.scryfall.io/large/front/d/7/d754e09c-efc0-4536-9f2a-6bd7e2f860ab.jpg +J22;591490t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg +J22;591496t;https://cards.scryfall.io/large/front/d/0/d0cc09a9-a21b-40ee-8b68-bc084f71737d.jpg +J22;591499t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg +J22;591509t;https://cards.scryfall.io/large/front/d/7/d754e09c-efc0-4536-9f2a-6bd7e2f860ab.jpg +J22;591517t;https://cards.scryfall.io/large/front/3/8/38476293-627e-44e6-a83e-24aaf3de8e9a.jpg +J22;591521t;https://cards.scryfall.io/large/front/6/6/663333ab-4e92-4290-b4e2-65f3f173e53f.jpg +J22;591532t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg +J22;591535t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg +J22;591538t;https://cards.scryfall.io/large/front/0/d/0dd269c7-1333-470d-b8ef-e54add09b350.jpg +J22;591541t;https://cards.scryfall.io/large/front/5/2/52cf8f6b-2334-4881-8f58-4e11745c8851.jpg +J22;595089t;https://cards.scryfall.io/large/front/9/0/90317f5e-d121-4c00-86cc-5bbee953f600.jpg +J22;595093t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg +J22;595107t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg +J22;595109t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg +J22;595112t;https://cards.scryfall.io/large/front/0/1/010ffef8-22ce-4d8f-80f0-6749f63ec4c2.jpg +J22;595118t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg +J22;595129t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg +J22;595137t;https://cards.scryfall.io/large/front/3/4/34db5e62-4792-4207-b008-7d62bae683a7.jpg +J22;595143t;https://cards.scryfall.io/large/front/3/d/3d0b9b88-705e-4df0-8a93-3e240b81355b.jpg +J22;595155t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg +J22;595171t;https://cards.scryfall.io/large/front/0/1/010ffef8-22ce-4d8f-80f0-6749f63ec4c2.jpg +J22;595178t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg +J22;595179t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg +J22;593935t;https://cards.scryfall.io/large/front/c/7/c7bb00e4-7eb0-4f7d-b2c3-8995959a6e6a.jpg +J22;593942t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;593950t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;593956t;https://cards.scryfall.io/large/front/c/7/c7bb00e4-7eb0-4f7d-b2c3-8995959a6e6a.jpg +J22;593961t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;593973t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;593975t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;593978t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;593986t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;593988t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;593992t;https://cards.scryfall.io/large/front/1/3/13e4832d-8530-4b85-b738-51d0c18f28ec.jpg +J22;593997t;https://cards.scryfall.io/large/front/1/d/1db0ae89-74fb-4865-99d0-31e3e19f1480.jpg +J22;594007t;https://cards.scryfall.io/large/front/1/d/1db0ae89-74fb-4865-99d0-31e3e19f1480.jpg +J22;594009t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;594016t;https://cards.scryfall.io/large/front/2/c/2c0e7faf-43cb-4a96-ac3c-9533f957ee28.jpg +J22;590071t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590079t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590082t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590092t;https://cards.scryfall.io/large/front/8/9/895df6af-6799-4ec6-b8f4-912b06f30ed2.jpg +J22;590095t;https://cards.scryfall.io/large/front/6/5/6592849a-3875-42e6-bab8-f1c04b5f58bf.jpg +J22;590096t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;590111t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590118t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;590119t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;590123t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590125t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;590127t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;590131t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590135t;https://cards.scryfall.io/large/front/5/c/5cd9a145-86cc-4591-b64b-c003eaa926eb.jpg +J22;590137t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg +J22;590139t;https://cards.scryfall.io/large/front/3/1/312ea78e-a4e6-4c66-9fd7-62dc7822d89e.jpg +J22;590143t;https://cards.scryfall.io/large/front/2/0/209d3f3e-a41e-4d9b-a9bd-50d11e89b5ea.jpg +J22;590154t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590171t;https://cards.scryfall.io/large/front/c/4/c4052aed-981b-41d0-85f0-20c2599811ba.jpg +J22;590174t;https://cards.scryfall.io/large/front/c/b/cbafdfc0-380a-482b-b5f8-a7a00ecf8da6.jpg +J22;590183t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590189t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590190t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;590199t;https://cards.scryfall.io/large/front/4/6/462bb611-5a02-441c-ae8a-911b75436864.jpg +J22;592707t;https://cards.scryfall.io/large/front/f/7/f7164476-4a93-4295-9ac4-33e1677b09b8.jpg +J22;592710t;https://cards.scryfall.io/large/front/2/6/265b1462-dd9c-42af-8ba0-e840f8a651e2.jpg +J22;592715t;https://cards.scryfall.io/large/front/2/6/265b1462-dd9c-42af-8ba0-e840f8a651e2.jpg +J22;592720t;https://cards.scryfall.io/large/front/e/6/e662eefb-c454-44b9-8270-f2229e20024e.jpg +J22;592729t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg +J22;592730t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg +J22;592731t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg +J22;592732t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg +J22;592735t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;592737t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;592739t;https://cards.scryfall.io/large/front/e/4/e4b7e3b5-2f3c-4eb7-abc9-322a049a9e1a.jpg +J22;592744t;https://cards.scryfall.io/large/front/d/7/d7636957-f183-4f58-87a6-056cde657114.jpg +J22;592755t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg +J22;592756t;https://cards.scryfall.io/large/front/e/6/e662eefb-c454-44b9-8270-f2229e20024e.jpg +J22;592759t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;592764t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg +J22;592766t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;592774t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;592786t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;592787t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg +J22;592793t;https://cards.scryfall.io/large/front/d/2/d2bfef17-6e00-4097-b27a-4e3c7e19ca03.jpg +J22;592803t;https://cards.scryfall.io/large/front/2/6/265b1462-dd9c-42af-8ba0-e840f8a651e2.jpg +J22;592812t;https://cards.scryfall.io/large/front/e/6/e662eefb-c454-44b9-8270-f2229e20024e.jpg +J22;592818t;https://cards.scryfall.io/large/front/3/6/365b2234-c29d-42db-a8e0-80685a4b6434.jpg +J22;592819t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;592820t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg +J22;592821t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg +J22;592825t;https://cards.scryfall.io/large/front/5/d/5dc134da-51b8-452d-b515-54def56fe0c7.jpg +J22;596176t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg +J22;596185t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;596186t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg +J22;596189t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg +J22;596217t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg +J22;596225t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg +J22;596245t;https://cards.scryfall.io/large/front/e/7/e72daa68-0680-431c-a616-b3693fd58813.jpg +J22;597895t;https://www.mtgnexus.com/img/ccc/ren/7830/29125.jpg +J22;596204t;https://www.mtg.onl/static/9ce248147e36a52ccc388b3e642839aa/4d406/PROXY_Ape_G_2_2.jpg J22;589555;https://cards.scryfall.io/large/front/e/a/ea531418-6c7c-4e23-b681-6bfdd4a3eb79.jpg J22;589556;https://cards.scryfall.io/large/front/f/4/f45e1832-1070-4d12-aba9-dcad47a02eda.jpg J22;589557;https://cards.scryfall.io/large/front/9/4/94a1a840-bcdc-4d6f-a28d-9805578473f6.jpg diff --git a/projects/mtg/bin/Res/sets/J22/_cards.dat b/projects/mtg/bin/Res/sets/J22/_cards.dat index 3069f7f69..26c1042ed 100644 --- a/projects/mtg/bin/Res/sets/J22/_cards.dat +++ b/projects/mtg/bin/Res/sets/J22/_cards.dat @@ -2,9 +2,634 @@ author=Wagic Team name=Jumpstart 2022 year=2022-12-02 -total=835 +total=960 [/meta] [card] +primitive=Drake +id=-589563 +rarity=T +[/card] +[card] +primitive=Thopter +id=-589568 +rarity=T +[/card] +[card] +primitive=Zombie +id=-589581 +rarity=T +[/card] +[card] +primitive=Goblin +id=-589583 +rarity=T +[/card] +[card] +primitive=Pirate +id=-589587 +rarity=T +[/card] +[card] +primitive=Banana +id=-589594 +rarity=T +[/card] +[card] +primitive=Wizard +id=-597043 +rarity=T +[/card] +[card] +primitive=Thopter +id=-597049 +rarity=T +[/card] +[card] +primitive=Rat +id=-597054 +rarity=T +[/card] +[card] +primitive=Goblin +id=-597059 +rarity=T +[/card] +[card] +primitive=Treasure +id=-597063 +rarity=T +[/card] +[card] +primitive=Wolf +id=-597068 +rarity=T +[/card] +[card] +primitive=Clue +id=-597078 +rarity=T +[/card] +[card] +primitive=Zombie +id=-597510 +rarity=T +[/card] +[card] +primitive=Spawn +id=-597518 +rarity=T +[/card] +[card] +primitive=Ajani's Pridemate +id=-591418 +rarity=T +[/card] +[card] +primitive=Pegasus +id=-591428 +rarity=T +[/card] +[card] +primitive=Cat +id=-591429 +rarity=T +[/card] +[card] +primitive=Spirit +id=-591433 +rarity=T +[/card] +[card] +primitive=Knight +id=-591443 +rarity=T +[/card] +[card] +primitive=Soldier +id=-591446 +rarity=T +[/card] +[card] +primitive=Soldier +id=-591450 +rarity=T +[/card] +[card] +primitive=Spirit +id=-591455 +rarity=T +[/card] +[card] +primitive=Cat Beast +id=-591461 +rarity=T +[/card] +[card] +primitive=Knight +id=-591463 +rarity=T +[/card] +[card] +primitive=Cat +id=-591485 +rarity=T +[/card] +[card] +primitive=Spirit +id=-591490 +rarity=T +[/card] +[card] +primitive=Soldier +id=-591496 +rarity=T +[/card] +[card] +primitive=Spirit +id=-591499 +rarity=T +[/card] +[card] +primitive=Cat +id=-591509 +rarity=T +[/card] +[card] +primitive=Bird +id=-591517 +rarity=T +[/card] +[card] +primitive=Angel +id=-591521 +rarity=T +[/card] +[card] +primitive=Clue +id=-591532 +rarity=T +[/card] +[card] +primitive=Spirit +id=-591535 +rarity=T +[/card] +[card] +primitive=Angel +id=-591538 +rarity=T +[/card] +[card] +primitive=Knight +id=-591541 +rarity=T +[/card] +[card] +primitive=Merfolk +id=-595089 +rarity=T +[/card] +[card] +primitive=Thopter +id=-595093 +rarity=T +[/card] +[card] +primitive=Clue +id=-595107 +rarity=T +[/card] +[card] +primitive=Clue +id=-595109 +rarity=T +[/card] +[card] +primitive=Faerie +id=-595112 +rarity=T +[/card] +[card] +primitive=Clue +id=-595118 +rarity=T +[/card] +[card] +primitive=Clue +id=-595129 +rarity=T +[/card] +[card] +primitive=Marit Lage +id=-595137 +rarity=T +[/card] +[card] +primitive=Elemental +id=-595143 +rarity=T +[/card] +[card] +primitive=Clue +id=-595155 +rarity=T +[/card] +[card] +primitive=Faerie +id=-595171 +rarity=T +[/card] +[card] +primitive=Thopter +id=-595178 +rarity=T +[/card] +[card] +primitive=Thopter +id=-595179 +rarity=T +[/card] +[card] +primitive=Saproling +id=-593935 +rarity=T +[/card] +[card] +primitive=Zombie +id=-593942 +rarity=T +[/card] +[card] +primitive=Zombie +id=-593950 +rarity=T +[/card] +[card] +primitive=Saproling +id=-593956 +rarity=T +[/card] +[card] +primitive=Zombie +id=-593961 +rarity=T +[/card] +[card] +primitive=Zombie +id=-593973 +rarity=T +[/card] +[card] +primitive=Zombie +id=-593975 +rarity=T +[/card] +[card] +primitive=Zombie +id=-593978 +rarity=T +[/card] +[card] +primitive=Zombie +id=-593986 +rarity=T +[/card] +[card] +primitive=Zombie +id=-593988 +rarity=T +[/card] +[card] +primitive=Snake // Zombie +id=-593992 +rarity=T +[/card] +[card] +primitive=Demon +id=-593997 +rarity=T +[/card] +[card] +primitive=Demon +id=-594007 +rarity=T +[/card] +[card] +primitive=Goblin +id=-594009 +rarity=T +[/card] +[card] +primitive=Demon +id=-594016 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590071 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590079 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590082 +rarity=T +[/card] +[card] +primitive=Devil +id=-590092 +rarity=T +[/card] +[card] +primitive=Dragon +id=-590095 +rarity=T +[/card] +[card] +primitive=Goblin +id=-590096 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590111 +rarity=T +[/card] +[card] +primitive=Goblin +id=-590118 +rarity=T +[/card] +[card] +primitive=Goblin +id=-590119 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590123 +rarity=T +[/card] +[card] +primitive=Goblin +id=-590125 +rarity=T +[/card] +[card] +primitive=Goblin +id=-590127 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590131 +rarity=T +[/card] +[card] +primitive=Ragavan +id=-590135 +rarity=T +[/card] +[card] +primitive=Goblin +id=-590137 +rarity=T +[/card] +[card] +primitive=Dragon +id=-590139 +rarity=T +[/card] +[card] +primitive=Rat +id=-590143 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590154 +rarity=T +[/card] +[card] +primitive=Elemental +id=-590171 +rarity=T +[/card] +[card] +primitive=Construct +id=-590174 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590183 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590189 +rarity=T +[/card] +[card] +primitive=Treasure +id=-590190 +rarity=T +[/card] +[card] +primitive=Elemental +id=-590199 +rarity=T +[/card] +[card] +primitive=Plant +id=-592707 +rarity=T +[/card] +[card] +primitive=Eldrazi Scion +id=-592710 +rarity=T +[/card] +[card] +primitive=Eldrazi Scion +id=-592715 +rarity=T +[/card] +[card] +primitive=Insect +id=-592720 +rarity=T +[/card] +[card] +primitive=Elf Warrior +id=-592729 +rarity=T +[/card] +[card] +primitive=Elf Warrior +id=-592730 +rarity=T +[/card] +[card] +primitive=Elf Warrior +id=-592731 +rarity=T +[/card] +[card] +primitive=Elf Warrior +id=-592732 +rarity=T +[/card] +[card] +primitive=Wolf +id=-592735 +rarity=T +[/card] +[card] +primitive=Wolf +id=-592737 +rarity=T +[/card] +[card] +primitive=Food +id=-592739 +rarity=T +[/card] +[card] +primitive=Butterfly +id=-592744 +rarity=T +[/card] +[card] +primitive=Elf Warrior +id=-592755 +rarity=T +[/card] +[card] +primitive=Insect +id=-592756 +rarity=T +[/card] +[card] +primitive=Wolf +id=-592759 +rarity=T +[/card] +[card] +primitive=Elf Warrior +id=-592764 +rarity=T +[/card] +[card] +primitive=Wolf +id=-592766 +rarity=T +[/card] +[card] +primitive=Wolf +id=-592774 +rarity=T +[/card] +[card] +primitive=Wolf +id=-592786 +rarity=T +[/card] +[card] +primitive=Elf Warrior +id=-592787 +rarity=T +[/card] +[card] +primitive=Beast +id=-592793 +rarity=T +[/card] +[card] +primitive=Eldrazi Scion +id=-592803 +rarity=T +[/card] +[card] +primitive=Insect +id=-592812 +rarity=T +[/card] +[card] +primitive=Boar +id=-592818 +rarity=T +[/card] +[card] +primitive=Wolf +id=-592819 +rarity=T +[/card] +[card] +primitive=Wolf +id=-592820 +rarity=T +[/card] +[card] +primitive=Elf Warrior +id=-592821 +rarity=T +[/card] +[card] +primitive=Elemental +id=-592825 +rarity=T +[/card] +[card] +primitive=Zombie +id=-596176 +rarity=T +[/card] +[card] +primitive=Treasure +id=-596185 +rarity=T +[/card] +[card] +primitive=Treasure +id=-596186 +rarity=T +[/card] +[card] +primitive=Thopter +id=-596189 +rarity=T +[/card] +[card] +primitive=Monkey +id=-596204 +rarity=T +[/card] +[card] +primitive=Clue +id=-596217 +rarity=T +[/card] +[card] +primitive=Thopter +id=-596225 +rarity=T +[/card] +[card] +primitive=Assembly-Worker +id=-596245 +rarity=T +[/card] +[card] +primitive=Banana +id=-597895 +rarity=T +[/card] +[card] primitive=Agrus Kos, Eternal Soldier id=589555 rarity=R