From 1ad521d340435684879462fb2cafa1bb4ce62034 Mon Sep 17 00:00:00 2001 From: Failure Date: Fri, 24 Oct 2025 23:36:05 -0700 Subject: [PATCH] add season 3 --- .../java/mage/client/constants/Constants.java | 13 ++++++ .../dl/sources/ScryfallImageSupportCards.java | 36 ++++++++++++++++ .../src/mage/sets/FoulMagicBlock3Extras.java | 43 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons3.java | 2 +- .../main/java/mage/cards/ExpansionSet.java | 29 +++++++++++++ .../mage/cards/repository/CardRepository.java | 2 +- 6 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/FoulMagicBlock3Extras.java diff --git a/Mage.Client/src/main/java/mage/client/constants/Constants.java b/Mage.Client/src/main/java/mage/client/constants/Constants.java index 5f30e4e6d8f..07a178920be 100644 --- a/Mage.Client/src/main/java/mage/client/constants/Constants.java +++ b/Mage.Client/src/main/java/mage/client/constants/Constants.java @@ -21,6 +21,19 @@ public final class Constants { } public static final ImmutableList> foulMagicsSets = ImmutableList.of( + new Pair("Set 3 - Old Fat Men", new String[] { + "Ninth Edition", + "Tenth Edition", + "* Time Spiral Block", + "* Lorwyn Block", + "* Shards of Alara Block", + "Scars of Mirrodin", + "Zendikar", + "Rise of the Eldrazi", + "Worldwake", + "* Innstrad Block", + "Foul Magic Block 3 Extras" + }), new Pair("Set 2.5 - Ravnica Cultural Exchange", new String[] { "* March of the Machine Block", "* Phyrexia: All Will Be One Block", diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java index 1c3b3767fca..09bd9293eaf 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java @@ -2,10 +2,16 @@ package org.mage.plugins.card.dl.sources; import org.tritonus.share.ArraySet; +import mage.cards.CardSetInfo; +import mage.cards.CardWithHalves; +import mage.cards.ExpansionSet; +import mage.cards.Sets; + import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -619,6 +625,9 @@ public class ScryfallImageSupportCards { // Custom sets using Scryfall images - must provide a direct link for each card in directDownloadLinks add("CALC"); // Custom Alchemized versions of existing cards + + // Foul Magics sets + add("FMB3E"); } }; @@ -758,6 +767,32 @@ public class ScryfallImageSupportCards { put("TDM/Scavenger Regent/379b", "https://api.scryfall.com/cards/tdm/379/en?format=image&face=back"); put("TDM/Ugin, Eye of the Storms/382b", "https://api.scryfall.com/cards/tdm/382/en?format=image&face=back"); + for (ExpansionSet set : Sets.getInstance().values()) { + for (Integer key : set.cardAliases.keySet()) { + var value = set.cardAliases.get(key); + + put( + String.format("%s/%s/%s", set.getCode(), value.cardInfo.getName(), value.cardInfo.getCardNumber()), + String.format("https://api.scryfall.com/cards/%s/%s/en?face=front&format=image", value.targetSet.toLowerCase(), value.targetSetNumber) + ); + if (CardWithHalves.class.isAssignableFrom(value.cardInfo.getCardClass())) { + try { + UUID uid = UUID.randomUUID(); + CardSetInfo info = new CardSetInfo(set.getName(), set.getCode(), value.targetSet, value.cardInfo.getRarity()); + CardWithHalves backCard = (CardWithHalves) value.cardInfo.getCardClass().getDeclaredConstructor(UUID.class, CardSetInfo.class).newInstance( + uid, info); + + put( + String.format("%s/%s/%s", set.getCode(), backCard.getRightHalfCard().getName(), value.cardInfo.getCardNumber()), + String.format("https://api.scryfall.com/cards/%s/%s/en?face=back", value.targetSet.toLowerCase(), value.targetSetNumber) + ); + } catch (Exception e) { + System.out.println(e); + } + } + } + } + } }; @@ -781,6 +816,7 @@ public class ScryfallImageSupportCards { if (directDownloadLinks.containsKey(linkCode2)) { return linkCode2; } + // default return null; diff --git a/Mage.Sets/src/mage/sets/FoulMagicBlock3Extras.java b/Mage.Sets/src/mage/sets/FoulMagicBlock3Extras.java new file mode 100644 index 00000000000..eaff513fcb3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/FoulMagicBlock3Extras.java @@ -0,0 +1,43 @@ +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.cards.ExpansionSet.SetCardInfo; +import mage.constants.Rarity; +import mage.constants.SetType; + +public class FoulMagicBlock3Extras extends ExpansionSet { + + + private static final FoulMagicBlock3Extras instance = new FoulMagicBlock3Extras(); + + public static FoulMagicBlock3Extras getInstance() { + return instance; + } + + private FoulMagicBlock3Extras() { + super("Foul Magic Block 3 Extras", "FMB3E", ExpansionSet.buildDate(2025, 10, 25), SetType.CUSTOM_SET); + this.hasBasicLands = false; + addDualAlias("MH3", "252", new SetCardInfo("Bloodsoaked Insight", 1, Rarity.UNCOMMON, mage.cards.b.BloodsoakedInsight.class)); + addDualAlias("MH3", "243", new SetCardInfo("Boggart Trawler", 2, Rarity.UNCOMMON, mage.cards.b.BoggartTrawler.class)); + addDualAlias("MH3", "249", new SetCardInfo("Bridgeworks Battle", 3, Rarity.UNCOMMON, mage.cards.b.BridgeworksBattle.class)); + addDualAlias("MH3", "250", new SetCardInfo("Disciple of Freyalise", 4, Rarity.UNCOMMON, mage.cards.d.DiscipleOfFreyalise.class)); + addDualAlias("MH3", "253", new SetCardInfo("Drowner of Truth", 5, Rarity.UNCOMMON, mage.cards.d.DrownerOfTruth.class)); + addDualAlias("MH3", "244", new SetCardInfo("Fell the Profane", 6, Rarity.UNCOMMON, mage.cards.f.FellTheProfane.class)); + addDualAlias("MH3", "254", new SetCardInfo("Glasswing Grace", 7, Rarity.UNCOMMON, mage.cards.g.GlasswingGrace.class)); + addDualAlias("MH3", "240", new SetCardInfo("Hydroelectric Specimen", 8, Rarity.UNCOMMON, mage.cards.h.HydroelectricSpecimen.class)); + addDualAlias("MH3", "255", new SetCardInfo("Legion Leadership", 9, Rarity.UNCOMMON, mage.cards.l.LegionLeadership.class)); + addDualAlias("MH3", "246", new SetCardInfo("Pinnacle Monk", 10, Rarity.UNCOMMON, mage.cards.p.PinnacleMonk.class)); + addDualAlias("MH3", "238", new SetCardInfo("Razorgrass Ambush", 11, Rarity.UNCOMMON, mage.cards.r.RazorgrassAmbush.class)); + addDualAlias("MH3", "256", new SetCardInfo("Revitalizing Repast", 12, Rarity.UNCOMMON, mage.cards.r.RevitalizingRepast.class)); + addDualAlias("MH3", "257", new SetCardInfo("Rush of Inspiration", 13, Rarity.UNCOMMON, mage.cards.r.RushOfInspiration.class)); + addDualAlias("MH3", "241", new SetCardInfo("Sink into Stupor", 14, Rarity.UNCOMMON, mage.cards.s.SinkIntoStupor.class)); + addDualAlias("MH3", "258", new SetCardInfo("Strength of the Harvest", 15, Rarity.UNCOMMON, mage.cards.s.StrengthOfTheHarvest.class)); + addDualAlias("MH3", "259", new SetCardInfo("Stump Stomp", 16, Rarity.UNCOMMON, mage.cards.s.StumpStomp.class)); + addDualAlias("MH3", "248", new SetCardInfo("Sundering Eruption", 17, Rarity.UNCOMMON, mage.cards.s.SunderingEruption.class)); + addDualAlias("MH3", "260", new SetCardInfo("Suppression Ray", 18, Rarity.UNCOMMON, mage.cards.s.SuppressionRay.class)); + addDualAlias("MH3", "261", new SetCardInfo("Waterlogged Teachings", 19, Rarity.UNCOMMON, mage.cards.w.WaterloggedTeachings.class)); + addDualAlias("MH3", "239", new SetCardInfo("Witch Enchanter", 20, Rarity.UNCOMMON, mage.cards.w.WitchEnchanter.class)); + + } + +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons3.java b/Mage.Sets/src/mage/sets/ModernHorizons3.java index b4afbf883c7..513ede80f78 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons3.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons3.java @@ -21,7 +21,7 @@ public final class ModernHorizons3 extends ExpansionSet { public static ModernHorizons3 getInstance() { return instance; } - + private ModernHorizons3() { super("Modern Horizons 3", "MH3", ExpansionSet.buildDate(2024, 6, 7), SetType.SUPPLEMENTAL_MODERN_LEGAL); this.blockName = "Modern Horizons 3"; diff --git a/Mage/src/main/java/mage/cards/ExpansionSet.java b/Mage/src/main/java/mage/cards/ExpansionSet.java index 88d5a506841..2bb5d252cf4 100644 --- a/Mage/src/main/java/mage/cards/ExpansionSet.java +++ b/Mage/src/main/java/mage/cards/ExpansionSet.java @@ -18,12 +18,41 @@ import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; + + /** * @author BetaSteward_at_googlemail.com */ public abstract class ExpansionSet implements Serializable { + + public class CardAlias { + public String targetSet; + public String targetSetNumber; + public boolean hasBack; + public SetCardInfo cardInfo; + public CardAlias(String targetSet, String targetSetNumber, boolean hasBack, SetCardInfo cardInfo) { + this.targetSet = targetSet; + this.targetSetNumber = targetSetNumber; + this.hasBack = hasBack; + this.cardInfo = cardInfo; + } + } private static final Logger logger = Logger.getLogger(ExpansionSet.class); + + // Foul magic alias tweaks + public final HashMap cardAliases = new HashMap(); + + public void addAlias(String setCode, String setNumber, SetCardInfo cardInfo) { + cards.add(cardInfo); + cardAliases.put(cardInfo.getCardNumberAsInt(), new CardAlias(setCode, setNumber, false, cardInfo)); + } + + public void addDualAlias(String setCode, String setNumber, SetCardInfo cardInfo) { + cards.add(cardInfo); + cardAliases.put(cardInfo.getCardNumberAsInt(), new CardAlias(setCode, setNumber, true, cardInfo)); + } + // TODO: remove all usage to default (see below), keep bfz/zen/ust art styles for specific sets only // the main different in art styles - full art lands can have big mana icon at the bottom diff --git a/Mage/src/main/java/mage/cards/repository/CardRepository.java b/Mage/src/main/java/mage/cards/repository/CardRepository.java index 3c9e0eac492..fd3fab74dfc 100644 --- a/Mage/src/main/java/mage/cards/repository/CardRepository.java +++ b/Mage/src/main/java/mage/cards/repository/CardRepository.java @@ -40,7 +40,7 @@ public enum CardRepository { private static final String VERSION_ENTITY_NAME = "card"; private static final long CARD_DB_VERSION = 55; // raise this if db structure was changed private static final long CARD_CONTENT_VERSION = 241; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION_FOUL = 1; // raise this if specifically foul magic patches changed things + private static final long CARD_CONTENT_VERSION_FOUL = 2; // raise this if specifically foul magic patches changed things private Dao cardsDao;