From c34c13f7b767cdd78de67b82dd3c7f23810e50a2 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 25 Aug 2018 07:49:32 +0400 Subject: [PATCH] * Fixed battlebond boosters (sometime it's can gen wrong booster without partners/cards) --- .../mage/test/sets/BoosterGenerationTest.java | 44 +++--- .../main/java/mage/cards/ExpansionSet.java | 144 ++++++++++-------- 2 files changed, 107 insertions(+), 81 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java b/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java index 62e5807b343..d282dbc1a9f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; + import mage.abilities.Ability; import mage.abilities.keyword.PartnerWithAbility; import mage.cards.Card; @@ -23,7 +24,6 @@ import org.junit.Test; import org.mage.test.serverside.base.MageTestBase; /** - * * @author nigelzor, JayDi85 */ public class BoosterGenerationTest extends MageTestBase { @@ -32,33 +32,38 @@ public class BoosterGenerationTest extends MageTestBase { public void setUp() { CardScanner.scan(); } - + private static final List basics = Arrays.asList("Plains", "Island", "Swamp", "Mountain", "Forest"); - - @Test - public void testBattlebond(){ + + private void checkOnePartnerBoost() { List booster = Battlebond.getInstance().createBooster(); boolean foundPartner = false; - String Partner = ""; - - for (Card card : booster){ - for (Ability ability : card.getAbilities()){ + String Partner = ""; + + for (Card card : booster) { + for (Ability ability : card.getAbilities()) { if (ability instanceof PartnerWithAbility) { - if (foundPartner){ - Assert.assertEquals(Partner, card.getName()); - } - else{ + if (foundPartner) { + Assert.assertEquals(Partner, card.getName()); + } else { foundPartner = true; Partner = ((PartnerWithAbility) ability).getPartnerName(); } - } + } } } - } + } + + @Test + public void testBattlebondPartnerBoosters() { + for (int i = 0; i < 10; i++) { + checkOnePartnerBoost(); + } + } @Test public void testFateReforged() { - + List tapland = Arrays.asList( "Bloodfell Caves", "Blossoming Sands", "Dismal Backwater", "Jungle Hollow", "Rugged Highlands", "Scoured Barrens", "Swiftwater Cliffs", "Thornwood Falls", "Tranquil Cove", "Wind-Scarred Crag"); @@ -70,6 +75,7 @@ public class BoosterGenerationTest extends MageTestBase { || contains(booster, basics, null)); // assertFalse(str(booster), contains(booster, basics, null)); } + @Test public void testMastersEditionII() { List snowCoveredLand = Arrays.asList( @@ -97,12 +103,12 @@ public class BoosterGenerationTest extends MageTestBase { Assert.assertEquals("Urza special lands must have 4 variation for each of 3 card", 3 * 4, setOrzaList.size()); List foundedUrzaList = new ArrayList<>(); - for (CardInfo cardInfo: setOrzaList) { + for (CardInfo cardInfo : setOrzaList) { Assert.assertTrue("card " + cardInfo.getName() + " must be in urza's list", needUrzaList.contains(cardInfo.getName())); foundedUrzaList.add(cardInfo.getName()); } - for (String needName: needUrzaList) { + for (String needName : needUrzaList) { Assert.assertTrue("can't find need card " + needName + " in special land list", foundedUrzaList.contains(needName)); } } @@ -117,7 +123,7 @@ public class BoosterGenerationTest extends MageTestBase { "Urza's Tower" ); - for(int i = 1; i <= 5; i++) { + for (int i = 1; i <= 5; i++) { List booster = MastersEditionIV.getInstance().createBooster(); assertTrue(str(booster), contains(booster, urzaLand, "ME4")); assertFalse(str(booster), contains(booster, basics, null)); diff --git a/Mage/src/main/java/mage/cards/ExpansionSet.java b/Mage/src/main/java/mage/cards/ExpansionSet.java index 0333c47f689..15e4b052d3b 100644 --- a/Mage/src/main/java/mage/cards/ExpansionSet.java +++ b/Mage/src/main/java/mage/cards/ExpansionSet.java @@ -14,17 +14,20 @@ import mage.util.RandomUtil; import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; + import mage.abilities.keyword.PartnerWithAbility; +import org.apache.log4j.Logger; /** * @author BetaSteward_at_googlemail.com */ public abstract class ExpansionSet implements Serializable { + private static final Logger logger = Logger.getLogger(ExpansionSet.class); public final static CardGraphicInfo NON_FULL_USE_VARIOUS = new CardGraphicInfo(null, true); public final static CardGraphicInfo FULL_ART_BFZ_VARIOUS = new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true); - - + + public class SetCardInfo implements Serializable { private final String name; @@ -181,36 +184,33 @@ public abstract class ExpansionSet implements Serializable { return theBooster; } - - protected int PartnerCheck(List booster, boolean partnerAllowed, int max, int i){ - for (Ability ability:booster.get(booster.size() - 1).getAbilities()){ - //Check if fetched card has the PartnerWithAbility - if (ability instanceof PartnerWithAbility) { - //Check if the pack already contains a partner pair - if (partnerAllowed){ - //Added card always replaces an uncommon card - Card card = CardRepository.instance.findCard(((PartnerWithAbility) ability).getPartnerName()).getCard(); - if (i booster, boolean partnerAllowed, int max, int i) { - else{ - //If partner already exists, remove card and loop again - booster.remove(booster.size() - 1); - return 0; - } + for (Ability ability : booster.get(booster.size() - 1).getAbilities()) { + //Check if fetched card has the PartnerWithAbility + if (ability instanceof PartnerWithAbility) { + //Check if the pack already contains a partner pair + if (partnerAllowed) { + //Added card always replaces an uncommon card + Card card = CardRepository.instance.findCard(((PartnerWithAbility) ability).getPartnerName()).getCard(); + if (i < max) { + booster.add(card); + } else { + booster.set(0, card); } + //2 return value indicates found partner + return 2; + } else { + //If partner already exists, remove card and loop again + booster.remove(booster.size() - 1); + return 0; + } } + } return 1; } - + protected void addToBooster(List booster, List cards) { if (!cards.isEmpty()) { CardInfo cardInfo = cards.remove(RandomUtil.nextInt(cards.size())); @@ -226,19 +226,24 @@ public abstract class ExpansionSet implements Serializable { public List createBooster() { for (int i = 0; i < 100; i++) {//don't want to somehow loop forever - List booster = tryBooster(); + + List booster; + if (hasPartnerMechanic) { + // battlebond's partners cards + booster = createPartnerBooster(); + } else { + // all other sets + booster = tryBooster(); + } + if (boosterIsValid(booster)) { return booster; } } - - //Battlebond packs alway contain both partners - if (hasPartnerMechanic){ - List booster = createPartnerBooster(); - return booster; - } + + // return random booster if can't do valid + logger.error(String.format("Can't generate valid booster for set [%s - %s]", this.getCode(), this.getName())); return tryBooster(); - } protected boolean boosterIsValid(List booster) { @@ -254,6 +259,8 @@ public abstract class ExpansionSet implements Serializable { } } + // TODO: add partner check + // TODO: add booster size check? return true; } @@ -310,60 +317,73 @@ public abstract class ExpansionSet implements Serializable { return true; } - - public List createPartnerBooster(){ - + + public List createPartnerBooster() { + List booster = new ArrayList<>(); - - boolean partnerAllowed = true; - + + boolean partnerAllowed = true; + List uncommons = getCardsByRarity(Rarity.UNCOMMON); for (int i = 0; i < numBoosterUncommon; i++) { - while (true){ + while (true) { addToBooster(booster, uncommons); - int check = PartnerCheck(booster, partnerAllowed, numBoosterUncommon - 1, i); - if (check == 1){break;} - if (check == 2){ + int check = AddMissingPartner(booster, partnerAllowed, numBoosterUncommon - 1, i); + if (check == 1) { + break; + } + if (check == 2) { partnerAllowed = false; //Be sure to account for the added card - if (i != numBoosterUncommon - 1){i+=1;} - break;} + if (i != numBoosterUncommon - 1) { + i += 1; + } + break; } + } } - + int numSpecialCommons = getNumberOfSpecialCommons(); int numCommonsToGenerate = numBoosterCommon - numSpecialCommons; - + List commons = getCardsByRarity(Rarity.COMMON); for (int i = 0; i < numCommonsToGenerate; i++) { addToBooster(booster, commons); - } - + } + List rares = getCardsByRarity(Rarity.RARE); List mythics = getCardsByRarity(Rarity.MYTHIC); for (int i = 0; i < numBoosterRare; i++) { if (ratioBoosterMythic > 0 && RandomUtil.nextInt(ratioBoosterMythic) == 0) { - while (true){ + while (true) { addToBooster(booster, mythics); - int check = PartnerCheck(booster, partnerAllowed, -1, 1); - if (check == 1){break;} - if (check == 2){partnerAllowed = false; break;} + int check = AddMissingPartner(booster, partnerAllowed, -1, 1); + if (check == 1) { + break; + } + if (check == 2) { + partnerAllowed = false; + break; + } } - } - - else { - while (true){ + } else { + while (true) { addToBooster(booster, rares); - int check = PartnerCheck(booster, partnerAllowed, -1, 1); - if (check == 1){break;} - if (check == 2){partnerAllowed = false; break;} + int check = AddMissingPartner(booster, partnerAllowed, -1, 1); + if (check == 1) { + break; + } + if (check == 2) { + partnerAllowed = false; + break; + } } } } return booster; } - + public List tryBooster() { List booster = new ArrayList<>(); if (!hasBoosters) {