From 2eff0f08d8a7cc88d39c574213a3c48777c72887 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 5 Mar 2023 23:32:36 +0100 Subject: [PATCH 01/14] GameFormat: filter Rebalanced cards --- .../src/main/java/forge/card/CardEdition.java | 14 +++++++++++-- .../src/main/java/forge/item/IPaperCard.java | 14 +++++++++++++ .../main/java/forge/item/ItemPredicate.java | 1 - .../src/main/java/forge/item/PaperCard.java | 20 +++++++++++++++++++ .../src/main/java/forge/item/PaperToken.java | 4 ++++ .../src/main/java/forge/game/GameFormat.java | 7 +++++++ 6 files changed, 57 insertions(+), 3 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 743038d148a..f8672c74511 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -375,7 +375,8 @@ public final class CardEdition implements Comparable { public String getSheetReplaceCardFromSheet2() { return sheetReplaceCardFromSheet2; } public String[] getChaosDraftThemes() { return chaosDraftThemes; } - public List getCards() { return cardMap.get("cards"); } + public List getCards() { return cardMap.get(EditionSectionWithCollectorNumbers.CARDS.getName()); } + public List getRebalancedCards() { return cardMap.get(EditionSectionWithCollectorNumbers.REBALANCED.getName()); } public List getAllCardsInSet() { return cardsInSet; } @@ -401,6 +402,15 @@ public final class CardEdition implements Comparable { return this.cardsInSetLookupMap.get(cardName); } + public boolean isRebalanced(String cardName) { + for (CardInSet cis : getRebalancedCards()) { + if (cis.name.equals(cardName)) { + return true; + } + } + return false; + } + public boolean isModern() { return getDate().after(parseDate("2003-07-27")); } //8ED and above are modern except some promo cards and others public Map getTokens() { return tokenNormalized; } @@ -899,7 +909,7 @@ public final class CardEdition implements Comparable { } })); Iterator editionsIterator = editionsWithBasicLands.iterator(); - List selectedEditions = new ArrayList(); + List selectedEditions = new ArrayList(); while (editionsIterator.hasNext()) selectedEditions.add(editionsIterator.next()); if (selectedEditions.isEmpty()) diff --git a/forge-core/src/main/java/forge/item/IPaperCard.java b/forge-core/src/main/java/forge/item/IPaperCard.java index 5edece0287a..b130bda035d 100644 --- a/forge-core/src/main/java/forge/item/IPaperCard.java +++ b/forge-core/src/main/java/forge/item/IPaperCard.java @@ -223,6 +223,19 @@ public interface IPaperCard extends InventoryItem, Serializable { public static final Predicate IS_WHITE = Predicates.color(true, false, MagicColor.WHITE); public static final Predicate IS_COLORLESS = Predicates.color(true, true, MagicColor.COLORLESS); + public static final Predicate IS_UNREBALANCED = new Predicate() { + @Override + public boolean apply(PaperCard input) { + return input.isUnRebalanced(); + } + }; + public static final Predicate IS_REBALANCED = new Predicate() { + + @Override + public boolean apply(PaperCard input) { + return input.isRebalanced(); + } + }; } } @@ -246,4 +259,5 @@ public interface IPaperCard extends InventoryItem, Serializable { String getCardRSpecImageKey(); String getCardGSpecImageKey(); + public boolean isRebalanced(); } \ No newline at end of file diff --git a/forge-core/src/main/java/forge/item/ItemPredicate.java b/forge-core/src/main/java/forge/item/ItemPredicate.java index 8111ee845db..d6365e59070 100644 --- a/forge-core/src/main/java/forge/item/ItemPredicate.java +++ b/forge-core/src/main/java/forge/item/ItemPredicate.java @@ -51,7 +51,6 @@ public abstract class ItemPredicate { */ public static class Presets { /** The Item IsPack. */ - @SuppressWarnings("unchecked") public static final Predicate IS_PACK_OR_DECK = Predicates.or(IsBoosterPack, IsFatPack, IsTournamentPack, IsStarterDeck, IsPrebuiltDeck); } } diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index fd62fdefa34..eceb7d0628d 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -418,4 +418,24 @@ public class PaperCard implements Comparable, InventoryItemFromSet, public String getSortableName() { return sortableName; } + public boolean isUnRebalanced() { + if (this.getEdition() == null) { + return false; + } + CardEdition edition = StaticData.instance().getEditions().get(this.getEdition()); + if (edition == null) { + return false; + } + return edition.isRebalanced("A-" + this.name); + } + public boolean isRebalanced() { + if (this.getEdition() == null) { + return false; + } + CardEdition edition = StaticData.instance().getEditions().get(this.getEdition()); + if (edition == null) { + return false; + } + return edition.isRebalanced(this.name); + } } diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index 88a8a491b96..c190aa7bf00 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -13,6 +13,7 @@ import forge.card.ColorSet; import forge.util.MyRandom; public class PaperToken implements InventoryItemFromSet, IPaperCard { + private static final long serialVersionUID = 1L; private String name; private CardEdition edition; private ArrayList imageFileName = new ArrayList<>(); @@ -200,4 +201,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { public String getImageKey(int artIndex) { return ImageKeys.TOKEN_PREFIX + imageFileName.get(artIndex).replace(" ", "_"); } + public boolean isRebalanced() { + return false; + } } diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index e546f721cda..225bc651814 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -139,6 +139,13 @@ public class GameFormat implements Comparable { } protected Predicate buildFilter(boolean printed) { Predicate p = Predicates.not(IPaperCard.Predicates.names(this.getBannedCardNames())); + + if (FormatSubType.ARENA.equals(this.getFormatSubType())) { + p = Predicates.and(p, Predicates.not(IPaperCard.Predicates.Presets.IS_UNREBALANCED)); + } else { + p = Predicates.and(p, Predicates.not(IPaperCard.Predicates.Presets.IS_REBALANCED)); + } + if (!this.getAllowedSetCodes().isEmpty()) { p = Predicates.and(p, printed ? IPaperCard.Predicates.printedInSets(this.getAllowedSetCodes(), printed) : From cd880015dafe5f3855c46d37b2953f257ae694fd Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Tue, 7 Mar 2023 22:04:08 +0100 Subject: [PATCH 02/14] StaticData: check all Editions for rebalanced --- forge-core/src/main/java/forge/StaticData.java | 13 +++++++++++++ .../src/main/java/forge/item/PaperCard.java | 18 ++---------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 82d9929a20b..050fa97968a 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -900,4 +900,17 @@ public class StaticData { this.enableSmartCardArtSelection = isEnabled; } + public boolean isRebalanced(String name) + { + if (!name.startsWith("A-")) { + return false; + } + for(PaperCard pc : this.getCommonCards().getAllCards(name)) { + CardEdition e = this.editions.get(pc.getEdition()); + if (e != null && e.isRebalanced(name)) { + return true; + } + } + return false; + } } diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index eceb7d0628d..95f61461b80 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -419,23 +419,9 @@ public class PaperCard implements Comparable, InventoryItemFromSet, return sortableName; } public boolean isUnRebalanced() { - if (this.getEdition() == null) { - return false; - } - CardEdition edition = StaticData.instance().getEditions().get(this.getEdition()); - if (edition == null) { - return false; - } - return edition.isRebalanced("A-" + this.name); + return StaticData.instance().isRebalanced("A-" + name); } public boolean isRebalanced() { - if (this.getEdition() == null) { - return false; - } - CardEdition edition = StaticData.instance().getEditions().get(this.getEdition()); - if (edition == null) { - return false; - } - return edition.isRebalanced(this.name); + return StaticData.instance().isRebalanced(name); } } From e786b4bed52d5dc1d02389296ceddf39e555bc37 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 9 Mar 2023 08:28:51 +0100 Subject: [PATCH 03/14] Update kinzu_of_the_bleak_coven.txt Fix AddKeywords --- forge-gui/res/cardsfolder/k/kinzu_of_the_bleak_coven.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/k/kinzu_of_the_bleak_coven.txt b/forge-gui/res/cardsfolder/k/kinzu_of_the_bleak_coven.txt index 2d7ec481b10..1a955d563a9 100644 --- a/forge-gui/res/cardsfolder/k/kinzu_of_the_bleak_coven.txt +++ b/forge-gui/res/cardsfolder/k/kinzu_of_the_bleak_coven.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Phyrexian Vampire PT:5/4 K:Flying T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+Other+YouCtrl | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ Whenever another nontoken creature you control dies, you may pay 2 life and exile it. If you do, create a token that's a copy of that creature, except it's 1/1 and has toxic 1. (Players dealt combat damage by it also get a poison counter.) -SVar:TrigExile:AB$ CopyPermanent | Cost$ PayLife<2> ExileFromGrave<1/Card.TriggeredCard/Exile nontoken creature that just died> | PumpKeywords$ Toxic:1 | Defined$ TriggeredCardLKICopy | SetPower$ 1 | SetToughness$ 1 +SVar:TrigExile:AB$ CopyPermanent | Cost$ PayLife<2> ExileFromGrave<1/Card.TriggeredCard/Exile nontoken creature that just died> | AddKeywords$ Toxic:1 | Defined$ TriggeredCardLKICopy | SetPower$ 1 | SetToughness$ 1 DeckHas:Ability$Token -Oracle:Flying\nWhenever another nontoken creature you control dies, you may pay 2 life and exile it. If you do, create a token that's a copy of that creature, except it's 1/1 and has toxic 1. (Players dealt combat damage by it also get a poison counter.) \ No newline at end of file +Oracle:Flying\nWhenever another nontoken creature you control dies, you may pay 2 life and exile it. If you do, create a token that's a copy of that creature, except it's 1/1 and has toxic 1. (Players dealt combat damage by it also get a poison counter.) From 69272b963c19ae673f0a263fe432e783f2ecd688 Mon Sep 17 00:00:00 2001 From: Michael Kuenzli Date: Thu, 9 Mar 2023 10:40:55 +0100 Subject: [PATCH 04/14] Add alchemy draft formats (#2628) * Add new rarity slot used by Alchemy sets * Make Alchemy: New Capenna draftable * Make Alchemy: Phyrexia draftable * Make Alchemy: The Brothers' War draftable * Make Alchemy: Kamigawa draftable * Make Alchemy: Dominaria draftable --- .../java/forge/item/generation/BoosterGenerator.java | 11 +++++++++++ .../main/java/forge/item/generation/BoosterSlots.java | 1 + forge-gui/res/blockdata/blocks.txt | 5 +++++ forge-gui/res/editions/Alchemy Dominaria.txt | 1 + forge-gui/res/editions/Alchemy Kamigawa.txt | 1 + forge-gui/res/editions/Alchemy New Capenna.txt | 1 + forge-gui/res/editions/Alchemy Phyrexia.txt | 1 + forge-gui/res/editions/Alchemy The Brothers War.txt | 1 + 8 files changed, 22 insertions(+) diff --git a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java index f7e3eba181c..a0bebbacc47 100644 --- a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java +++ b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java @@ -596,6 +596,17 @@ public class BoosterGenerator { Predicate predicateRare = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred); ps.addAll(Iterables.filter(src, predicateRare), 2); + } else if (mainCode.equalsIgnoreCase(BoosterSlots.UNCOMMON_RARE_MYTHIC)) { + // Extended version of RARE_MYTHIC, used for Alchemy slots + + Predicate predicateMythic = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_MYTHIC_RARE, extraPred); + ps.addAll(Iterables.filter(src, predicateMythic)); + + Predicate predicateRare = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred); + ps.addAll(Iterables.filter(src, predicateRare), 2); + + Predicate predicateUncommon = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_UNCOMMON, extraPred); + ps.addAll(Iterables.filter(src, predicateUncommon), 4); } else { throw new IllegalArgumentException("Booster generator: operator could not be parsed - " + mainCode); } diff --git a/forge-core/src/main/java/forge/item/generation/BoosterSlots.java b/forge-core/src/main/java/forge/item/generation/BoosterSlots.java index 176580ef77c..07255c46027 100644 --- a/forge-core/src/main/java/forge/item/generation/BoosterSlots.java +++ b/forge-core/src/main/java/forge/item/generation/BoosterSlots.java @@ -6,6 +6,7 @@ public class BoosterSlots { public static final String COMMON = "Common"; public static final String UNCOMMON = "Uncommon"; public static final String UNCOMMON_RARE = "UncommonRare"; + public static final String UNCOMMON_RARE_MYTHIC = "UncommonRareMythic"; public static final String RARE = "Rare"; public static final String RARE_MYTHIC = "RareMythic"; public static final String MYTHIC = "Mythic"; diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index 4e25f1fb7a2..9ada9398861 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -102,15 +102,20 @@ Innistrad: Midnight Hunt, 3/6/MID, MID Innistrad: Crimson Vow, 3/6/VOW, VOW Innistrad: Double Feature, 3/6/MID, DBL Kamigawa: Neon Dynasty, 3/6/NEO, NEO +Alchemy: Kamigawa, 3/6/NEO, YNEO Streets of New Capenna, 3/6/SNC, SNC +Alchemy: New Capenna, 3/6/SNC, YSNC Alchemy Horizons: Baldur's Gate, 3/6/HBG, HBG Double Masters 2022, 3/6/2X2, 2X2 Dominaria United, 3/6/DMU, DMU Dominaria United Jumpstart, -/2/DMU, Meta-Choose(S(DMU Coalition Corps)Coaltion Corps;S(DMU Coalition Legion)Coaltion Legion;S(DMU Mystic Mischief)Mystic Mischief;S(DMU Arcane Mischief)Arcane Mischief;S(DMU Totally Ruthless)Totally Ruthless;S(DMU Totally Merciless)Totally Merciless;S(DMU Ready to Charge)Ready to Charge;S(DMU Ready to Attack)Ready to Attack;S(DMU Beast Territory)Beast Territory;S(DMU Monster Territory)Monster Territory)Themes +Alchemy: Dominaria, 3/6/DMU, YDMU The Brothers' War, 3/6/BRO, BRO The Brothers' War Jumpstart, -/2/BRO, Meta-Choose(S(BRO Infantry 1)Infantry 1;S(BRO Infantry 2)Infantry 2;S(BRO Powerstones 1)Powerstones 1;S(BRO Powerstones 2)Powerstones 2;S(BRO Unearthed 1)Unearthed 1;S(BRO Unearthed 2)Unearthed 1;S(BRO Welded 1)Welded 1;S(BRO Welded 2)Welded 1;S(BRO Titanic 1)Titanic 1;S(BRO Titanic 2)Titanic 2)Themes +Alchemy: The Brothers' War, 3/6/BRO, YBRO 30th Anniversary Edition, 3/6/30A, 30A Jumpstart 2022, -/2/J22, Meta-Choose(S(J22 Vehicles)Vehicles;S(J22 Knights)Knights;S(J22 Constellation 1)Constellation 1;S(J22 Constellation 2)Constellation 2;S(J22 Teamwork 1)Teamwork 1;S(J22 Teamwork 2)Teamwork 2;S(J22 Spirits 1)Spirits 1;S(J22 Spirits 2)Spirits 2;S(J22 Blink 1)Blink 1;S(J22 Blink 2)Blink 2;S(J22 Blink 3)Blink 3;S(J22 Blink 4)Blink 4;S(J22 Cats 1)Cats 1;S(J22 Cats 2)Cats 2;S(J22 Cats 3)Cats 3;S(J22 Cats 4)Cats 4;S(J22 Law 1)Law 1;S(J22 Law 2)Law 2;S(J22 Law 3)Law 3;S(J22 Law 4)Law 4;S(J22 Holy 1)Holy 1;S(J22 Holy 2)Holy 2;S(J22 Holy 3)Holy 3;S(J22 Holy 4)Holy 4;S(J22 Shapeshifters)Shapeshifters;S(J22 Snow)Snow;S(J22 Go to School 1)Go to School 1;S(J22 Go to School 2)Go to School 2;S(J22 Scrying 1)Scrying 1;S(J22 Scrying 2)Scrying 2;S(J22 Faeries 1)Faeries 1;S(J22 Faeries 2)Faeries 2;S(J22 Merfolk 1)Merfolk 1;S(J22 Merfolk 2)Merfolk 2;S(J22 Merfolk 3)Merfolk 3;S(J22 Merfolk 4)Merfolk 4;S(J22 Detective 1)Detective 1;S(J22 Detective 2)Detective 2;S(J22 Detective 3)Detective 3;S(J22 Detective 4)Detective 4;S(J22 Think Again 1)Think Again 1;S(J22 Think Again 2)Think Again 2;S(J22 Think Again 3)Think Again 3;S(J22 Think Again 4)Think Again 4;S(J22 Inventive 1)Inventive 1;S(J22 Inventive 2)Inventive 2;S(J22 Inventive 3)Inventive 3;S(J22 Inventive 4)Inventive 4;S(J22 Unlucky Thirteen)Unlucky Thirteen;S(J22 Rats)Rats;S(J22 Demons 1)Demons 1;S(J22 Demons 2)Demons 2;S(J22 Boneyard 1)Boneyard 1;S(J22 Boneyard 2)Boneyard 2;S(J22 Morbid 1)Morbid 1;S(J22 Morbid 2)Morbid 2;S(J22 Cruel 1)Cruel 1;S(J22 Cruel 2)Cruel 2;S(J22 Cruel 3)Cruel 3;S(J22 Cruel 4)Cruel 4;S(J22 Fangs 1)Fangs 1;S(J22 Fangs 2)Fangs 2;S(J22 Fangs 3)Fangs 3;S(J22 Fangs 4)Fangs 4;S(J22 Zombies 1)Zombies 1;S(J22 Zombies 2)Zombies 2;S(J22 Zombies 3)Zombies 3;S(J22 Zombies 4)Zombies 4;S(J22 Gross 1)Gross 1;S(J22 Gross 2)Gross 2;S(J22 Gross 3)Gross 3;S(J22 Gross 4)Gross 4;S(J22 Spicy)Spicy;S(J22 Speedy)Speedy;S(J22 Experimental 1)Experimental 1;S(J22 Experimental 2)Experimental 2;S(J22 Dragons 1)Dragons 1;S(J22 Dragons 2)Dragons 2;S(J22 Cycling 1)Cycling 1;S(J22 Cycling 2)Cycling 2;S(J22 Goblins 1)Goblins 1;S(J22 Goblins 2)Goblins 2;S(J22 Goblins 3)Goblins 3;S(J22 Goblins 4)Goblins 4;S(J22 Treasure 1)Treasure 1;S(J22 Treasure 2)Treasure 2;S(J22 Treasure 3)Treasure 3;S(J22 Treasure 4)Treasure 4;S(J22 Fiery 1)Fiery 1;S(J22 Fiery 2)Fiery 2;S(J22 Fiery 3)Fiery 3;S(J22 Fiery 4)Fiery 4;S(J22 Raid 1)Raid 1;S(J22 Raid 2)Raid 2;S(J22 Raid 3)Raid 3;S(J22 Raid 4)Raid 4;S(J22 Eldrazi)Eldrazi;S(J22 Primates)Primates;S(J22 Multi-Headed 1)Multi-Headed 1;S(J22 Multi-Headed 2)Multi-Headed 2;S(J22 Gigantic 1)Gigantic 1;S(J22 Gigantic 2)Gigantic 2;S(J22 Landfall 1)Landfall 1;S(J22 Landfall 2)Landfall 2;S(J22 Elves 1)Elves 1;S(J22 Elves 2)Elves 2;S(J22 Elves 3)Elves 3;S(J22 Elves 4)Elves 4;S(J22 Wolves 1)Wolves 1;S(J22 Wolves 2)Wolves 2;S(J22 Wolves 3)Wolves 3;S(J22 Wolves 4)Wolves 4;S(J22 Ferocious 1)Ferocious 1;S(J22 Ferocious 2)Ferocious 2;S(J22 Ferocious 3)Ferocious 3;S(J22 Ferocious 4)Ferocious 4;S(J22 Insects 1)Insects 1;S(J22 Insects 2)Insects 2;S(J22 Insects 3)Insects 3;S(J22 Insects 4)Insects 4;S(J22 Urza's)Urza's)Themes Dominaria Remastered, 3/6/DMR, DMR Phyrexia: All Will Be One, 3/6/ONE, ONE Phyrexia: All Will Be One Jumpstart, -/2/ONE, Meta-Choose(S(ONE Mite-y 1)Mite-y 1;S(ONE Mite-y 2)Mite-y 2;S(ONE Progress 1)Progress 1;S(ONE Progress 2)Progress 2;S(ONE Corruption 1)Corruption 1;S(ONE Corruption 2)Corruption 2;S(ONE Rebellious 1)Rebellious 1;S(ONE Rebellious 2)Rebellious 2;S(ONE Toxic 1)Toxic 1;S(ONE Toxic 2)Toxic 2)Themes +Alchemy: Phyrexia, 3/6/ONE, YONE diff --git a/forge-gui/res/editions/Alchemy Dominaria.txt b/forge-gui/res/editions/Alchemy Dominaria.txt index 99e08a648a3..fca98ec9860 100644 --- a/forge-gui/res/editions/Alchemy Dominaria.txt +++ b/forge-gui/res/editions/Alchemy Dominaria.txt @@ -3,6 +3,7 @@ Code=YDMU Date=2022-10-06 Name=Alchemy: Dominaria Type=Online +Booster=1 UncommonRareMythic, 9 Common:fromsheet("DMU cards"), 3 Uncommon:fromSheet("DMU cards"), 1 RareMythic:fromSheet("DMU cards"), 1 fromSheet("DMU lands") ScryfallCode=YDMU [cards] diff --git a/forge-gui/res/editions/Alchemy Kamigawa.txt b/forge-gui/res/editions/Alchemy Kamigawa.txt index 74222a5490a..273459b572f 100644 --- a/forge-gui/res/editions/Alchemy Kamigawa.txt +++ b/forge-gui/res/editions/Alchemy Kamigawa.txt @@ -3,6 +3,7 @@ Code=YNEO Date=2022-03-17 Name=Alchemy: Kamigawa Type=Online +Booster=1 UncommonRareMythic, 8 Common:!dfc:!fromSheet("NEO lands"):fromSheet("NEO cards"), 3 Uncommon:!dfc:!fromSheet("NEO lands"):fromSheet("NEO cards"), 1 dfc:!Rare:!Mythic:fromSheet("NEO cards"), 1 RareMythic:fromSheet("NEO cards"), 1 fromSheet("NEO lands") ScryfallCode=YNEO [cards] diff --git a/forge-gui/res/editions/Alchemy New Capenna.txt b/forge-gui/res/editions/Alchemy New Capenna.txt index 6126887dbd9..24013f3cf49 100644 --- a/forge-gui/res/editions/Alchemy New Capenna.txt +++ b/forge-gui/res/editions/Alchemy New Capenna.txt @@ -3,6 +3,7 @@ Code=YSNC Date=2022-06-02 Name=Alchemy: New Capenna Type=Online +Booster=1 UncommonRareMythic, 9 Common:fromsheet("SNC cards"), 3 Uncommon:fromSheet("SNC cards"), 1 RareMythic:fromSheet("SNC cards"), 1 fromSheet("SNC lands") ScryfallCode=YSNC [cards] diff --git a/forge-gui/res/editions/Alchemy Phyrexia.txt b/forge-gui/res/editions/Alchemy Phyrexia.txt index e0174839e1f..4bba7c821c4 100644 --- a/forge-gui/res/editions/Alchemy Phyrexia.txt +++ b/forge-gui/res/editions/Alchemy Phyrexia.txt @@ -3,6 +3,7 @@ Code=YONE Date=2023-02-28 Name=Alchemy: Phyrexia Type=Online +Booster=1 UncommonRareMythic, 9 Common:fromsheet("ONE cards"), 3 Uncommon:fromSheet("ONE cards"), 1 RareMythic:fromSheet("ONE cards"), 1 BasicLand:fromSheet("ONE cards") ScryfallCode=YONE [cards] diff --git a/forge-gui/res/editions/Alchemy The Brothers War.txt b/forge-gui/res/editions/Alchemy The Brothers War.txt index 9eebb65de85..2c28fea9719 100644 --- a/forge-gui/res/editions/Alchemy The Brothers War.txt +++ b/forge-gui/res/editions/Alchemy The Brothers War.txt @@ -3,6 +3,7 @@ Code=YBRO Date=2022-12-13 Name=Alchemy: The Brothers' War Type=Online +Booster=1 UncommonRareMythic, 8 Common:fromsheet("BRO cards"), 3 Uncommon:fromSheet("BRO cards"), 1 RareMythic:fromSheet("BRO cards"), 1 fromSheet("BRO lands"), 1 fromSheet("BRR cards") ScryfallCode=YBRO [cards] From 7018d415c2ef3692ebb0decc87b587136b567ce6 Mon Sep 17 00:00:00 2001 From: Simisays <67333662+Simisays@users.noreply.github.com> Date: Thu, 9 Mar 2023 15:42:07 +0100 Subject: [PATCH 05/14] update --- .../Shandalar/maps/main.tiled-session | 20 +++++++++---------- .../Shandalar/maps/map/kiora_island.tmx | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session index b48752f88ad..75a908aaedd 100644 --- a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session +++ b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session @@ -40,7 +40,7 @@ "scale": 3, "selectedLayer": 4, "viewCenter": { - "x": 240, + "x": 239.83333333333331, "y": 136.16666666666663 } }, @@ -51,7 +51,7 @@ "scale": 2, "selectedLayer": 4, "viewCenter": { - "x": 240, + "x": 239.75, "y": 136.25 } }, @@ -62,7 +62,7 @@ "scale": 2, "selectedLayer": 4, "viewCenter": { - "x": 400, + "x": 399.75, "y": 319.75 } }, @@ -2438,7 +2438,7 @@ "scale": 1.5, "selectedLayer": 5, "viewCenter": { - "x": 384, + "x": 383.66666666666663, "y": 383.66666666666663 } }, @@ -2449,7 +2449,7 @@ "scale": 3, "selectedLayer": 4, "viewCenter": { - "x": 240, + "x": 239.83333333333331, "y": 239.83333333333331 } }, @@ -2613,7 +2613,7 @@ "scale": 3, "selectedLayer": 4, "viewCenter": { - "x": 106, + "x": 106.16666666666669, "y": 253.83333333333331 } }, @@ -2624,7 +2624,7 @@ "scale": 1, "selectedLayer": 4, "viewCenter": { - "x": 368, + "x": 368.5, "y": 200.5 } }, @@ -2632,8 +2632,8 @@ "scale": 1, "selectedLayer": 1, "viewCenter": { - "x": 509, - "y": 282.5 + "x": 400.5, + "y": 216.5 } }, "map/nest_white_1.tmx": { @@ -2894,7 +2894,7 @@ "scale": 3, "selectedLayer": 4, "viewCenter": { - "x": 263.3333333333333, + "x": 263.8333333333333, "y": 191.83333333333331 } }, diff --git a/forge-gui/res/adventure/Shandalar/maps/map/kiora_island.tmx b/forge-gui/res/adventure/Shandalar/maps/map/kiora_island.tmx index e41245ea372..c3877982c4f 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/kiora_island.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/kiora_island.tmx @@ -7,12 +7,12 @@ - eJy9lb9OwzAQhw+J2kUQBiQegwHRgVeAp6mgLEwdgYmpa2f+SOQN8gDMwNhn4AUQd4p/snOxHUdFnPSpapK7z+ezkn1LdMBUzCFT/xNPzDPzwrwW5twYovs9ogfmjrk2472rCdFnhFxOLP7aG/4viW29OYa84bNL21KyZ+hPZjjkOVY1Ul59bnNe+RV36v6YfvW5TeUiX9dJcbLj895s33sxJbqcdr2xvUr5Uvfg1dfD+V6Zfr9yvoTG7ePCdPM3fP3H5Syq7nyxbtRcRvqNnStZ65o8X5O21ofyxuaa6zEk551bzznnn1beJV64hSMb3/d34/tduTWsKe/93u32DWqXK7Vmpn1+pt6NG1dnbr0LdWP9l8SZOg+Yp36fwofaj2oG8kxD5V4d4r2t/HwRtfJiz/X3bhtvGHCH/cAphN+7Mfs85A0DXsy5of4shF8B8frL + eJy9lTtOxDAQhgeJtRdBKJA4BgViC64Ap1nB0lBtCVRU227NQyI3yAGogXLPwAUQM4p/2ZnYjqNFjPQriu2Zz/NQsm+JDlgV65BV/5OeWM+sF9Zroc+NIbrfI3pg3bGuzXjuakL0GVHOJ2Z/zQ3fS2xbbk5D3PDs0rYqqRnykx4OcY5VjBRXz22OK09hp/bH5KvnNuULfx0npZMd7/dm+9yLKdHltMuN1SrFS+2Bq9fD/l6Zfr4yX6LG1XFhuv4bXv9xPouq21/cGzGXkXxjcyV3XZPX16SN9aG4sb7mcgyV486t1zn7n1aeJVyw5fyRjdf93fh8V+4Oa8pzv3e7eUO185VYM9Oen6lv48bFmVvPQtxY/iV2puYB/dTfU/AQ+9H2Z7Khcq424d5Wvr+wWnFRc/2/24YbGthhPmCKwv/dmDoPcUMDF31uqN8L0S8+a/oe - eJytlL9OwzAQxq8tidNMFMRaGACxABJi4BE6ULpXwFPACyAUmBgrAc8AiDdAwBqJAcTKDO+AuE+OZcdxwDE96VMT1+ffxfdnElGQXc0QLbWJFtvN/LYK3iSQe9HVamIvAdyjmOg4LjOVNlKizdT/LJO7mxA9WPcG1h6vX/O9Zl0tFxt68/yO7ViyIOQrM3xfI/n+lZSZ0+AuiPJ5PaH/mxVVns0e0HS4tp+Ljdjmhft7fev7Ly5sJyrrW8i843m/Q3TA6rNOW0QnrDtRPeM37lrqd0+oaewfJrLmoDHX3a3wY8JwX2Aj5sOOXMs45jPWeau6/z2S+5WQ30ERf8+TCUMfrVvnL3OOVlirjlzZXMQ7J6SaGLifls8j855YzzU10g9k2VzkRhnmri3T0O9jay3ERomu4/uafr0Rko+ZhV7Jix66/Adf1TNqc+SYS64ZlRu9CzZ6Cgrhmvog/aueTeXWzFD7fHuojmsybS7ec4cP+E24P6PWfGc= + eJytlMsuBEEUhs9ceqqnV4bYYoHYIBELjzALzF7wFLyASLOynATPgHgDwbYTC2JrzTuI86e60tWnq011ZU7yp29V9Z0+t3FEQXbTJVpqEy22m+3bynnjQO5Vv1ATewvgnvSITntlptFGQrSZ+J9lc3djoicRN7D2+f0txzXtF3KxoQ/P/9juaRaEfKXW3vdIP//EZeY0uPOqfN5AFd9mVJUn2UOaDlfuc7Hh25xy/69vfU/iwnaisn6VzjvuDztER6wF1nmL6Iz1oKpn/MddS/zihJrG+r1Y1xx0wHV3r/yYMMQLbPh83NHvUvb5gnXZqq7/jPR6I+R3mPs/8GTC0Efr4vxlztEKa9WRK8mFv7NKq4mB+y32PDPvhfVaUyPwM4QluciNMcxdKdvQ7zI+ITaKizp+rOnXO6X5mFnolSzvoevu5PPrzNQzanPkmEuuGZVZvQs2egoK4dr6ouJq7m1lYmaYdb49VMe1mZKL58yxB/wm3D9fB3xE @@ -20,7 +20,7 @@ - eJxjYGBgKOdloBuooJNdn1hoZ3YVHj9MYCXOjIXM5NtDSXzZI4VLCdScSizmVdMxTcAANn89YyDNLcSqhakrGQB/4gOv2MnXixx+rESkL3R7saUDUsFiPPZSK6yxhZEjEfmdXmUPDFASl5SYQy170QEbN4SmZ31BbH7GVyajA0rSIS6/w8SfUWAmstmkhDE56RoAwkMY7Q== + eJxjYGBgKOdloBuooJNdn1hoZ3YVHj9MYCXOjIXM5NtDSXzZI4VLCdScSizmVdMxTcAANn89YyDNLcSqhakrGQB/4gOv2MnXixx+rESkL3R7saUDUsFiPPZSK6yxhZEjEfmdXmUPDGBzpy4jdcwhRz05diMDNm4ITc/6gtj8jK9MRgeUpENcfoeJP6PATGSzSQljctI1AJToGUk= From 439cb39c96ce9c0916410f1d0b9ea200af7c376d Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 9 Mar 2023 15:34:31 +0000 Subject: [PATCH 06/14] Update zopandrel_hunger_dominus.txt --- forge-gui/res/cardsfolder/z/zopandrel_hunger_dominus.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/z/zopandrel_hunger_dominus.txt b/forge-gui/res/cardsfolder/z/zopandrel_hunger_dominus.txt index de03b3d57e0..1e2bf3c6f08 100644 --- a/forge-gui/res/cardsfolder/z/zopandrel_hunger_dominus.txt +++ b/forge-gui/res/cardsfolder/z/zopandrel_hunger_dominus.txt @@ -6,8 +6,8 @@ K:Reach T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigDouble | TriggerDescription$ At the beginning of each combat, double the power and toughness of each creature you control until end of turn. SVar:TrigDouble:DB$ RepeatEach | RepeatCards$ Creature.YouCtrl | RepeatSubAbility$ DBDouble SVar:DBDouble:DB$ Pump | Defined$ Remembered | NumAtt$ X | NumDef$ Y | Double$ True -A:AB$ PutCounter | Cost$ 1 GP GP Sac<2/Creature.Other/Other creature> | Defined$ Self | CounterType$ Indestructible | CounterNum$ 1 | SpellDescription$ Put an indestructible counter on CARDNAME. ({G/P} can be paid with either {G} or 2 life.) +A:AB$ PutCounter | Cost$ GP GP Sac<2/Creature.Other/Other creature> | Defined$ Self | CounterType$ Indestructible | CounterNum$ 1 | SpellDescription$ Put an indestructible counter on CARDNAME. ({G/P} can be paid with either {G} or 2 life.) SVar:X:Remembered$CardPower SVar:Y:Remembered$CardToughness DeckHas:Ability$Sacrifice|Counters -Oracle:Reach\nAt the beginning of each combat, double the power and toughness of each creature you control until end of turn.\n{G/P}{G/P}, Sacrifice two other creatures: Put an indestructible counter on Zopandrel, Hunger Dominus. ({G/P} can be paid with either {G} or 2 life.) \ No newline at end of file +Oracle:Reach\nAt the beginning of each combat, double the power and toughness of each creature you control until end of turn.\n{G/P}{G/P}, Sacrifice two other creatures: Put an indestructible counter on Zopandrel, Hunger Dominus. ({G/P} can be paid with either {G} or 2 life.) From d5a15fb14e2ea093c6cec285f04e12f44d910a7a Mon Sep 17 00:00:00 2001 From: Simisays <67333662+Simisays@users.noreply.github.com> Date: Thu, 9 Mar 2023 20:07:55 +0100 Subject: [PATCH 07/14] update --- .../res/adventure/Shandalar/custom_cards/nahiris_armory.txt | 3 ++- .../adventure/Shandalar/custom_cards/nahiris_boss_effect.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_armory.txt b/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_armory.txt index 4ae7057d5f0..427cf6e821b 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_armory.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_armory.txt @@ -3,5 +3,6 @@ ManaCost:no cost Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Activated.Equip | Activator$ You | Amount$ 1 | EffectZone$ Command | Description$ Equip costs you pay cost {1} less. T:Mode$ AttackersDeclared | ValidAttackers$ Creature.modified+YouCtrl | TriggerZones$ Command | Execute$ TrigConjure | TriggerDescription$ Whenever a modified creature you control attacks, you may pay {M}{M}, if you do conjure a random card from Nahiri's Armory's Spellbook into your hand. -SVar:TrigConjure:AB$ MakeCard | Cost$ PayShards<2> | Conjure$ True | AtRandom$ True | Zone$ Hand | Spellbook$ Stoneforge Mystic,Danitha; Benalia's Hope,Ardenn; Intrepid Archaeologist,Open the Armory,Stone Haven Outfitter,Argentum Armor,Sword of the Animist,Masterwork of Ingenuity,Kaldra Compleat,Armored Skyhunter,Lion Sash,Relic Seeker,Esper Sentinel,Forgeborn Phoenix,Foundry Beetle,Inchblade Companion,Komainu Battle Armor,Luxior; Giada's Gift,Mace of Disruption,Nettlecyst,Shadowspear,Seraphic Greatsword,Soulstealer Axe,Sword of Body and Mind,Sword of Fire and Ice,Junkyard Scrapper,Soulstealer AxeSword of Feast and Famine,Expedition Supplier,Foundry Beetle,Armory Automaton,Bladegraft Aspirant,Dancing Sword,Jor Kadeen; First Goldwarden,Akiri; Fearless Voyager,Acclaimed Contender,Embercleave,Puresteel Paladin,Champion of the Flame,Tiana; Ship's Caretaker,Reyav; Master Smith,Sigarda's Aid,Armored Skyhunter,Bruenor Battlehammer,Halvar; God of Battle,Wyleth; Soul of Steel,Koll; the Forgemaster,Valduk; Keeper of the Flame,Fervent Champion,Cloudsteel Kirin,Leonin Shikari,Balan; Wandering Knight,Kor Duelist,Leonin Abunas,Zamriel; Seraph of Steel,Auriok Steelshaper +SVar:TrigConjure:AB$ MakeCard | Cost$ PayShards<2> | Conjure$ True | AtRandom$ True | Zone$ Hand | Spellbook$ +Stoneforge Mystic,Danitha; Benalia's Hope,Ardenn; Intrepid Archaeologist,Open the Armory,Stone Haven Outfitter,Argentum Armor,Sword of the Animist,Masterwork of Ingenuity,Kaldra Compleat,Armored Skyhunter,Lion Sash,Relic Seeker,Esper Sentinel,Forgeborn Phoenix,Foundry Beetle,Inchblade Companion,Komainu Battle Armor,Luxior; Giada's Gift,Mace of Disruption,Nettlecyst,Shadowspear,Seraphic Greatsword,Soulstealer Axe,Sword of Body and Mind,Sword of Fire and Ice,Junkyard Scrapper,Soulstealer Axe,Sword of Feast and Famine,Expedition Supplier,Foundry Beetle,Armory Automaton,Bladegraft Aspirant,Dancing Sword,Jor Kadeen; First Goldwarden,Akiri; Fearless Voyager,Acclaimed Contender,Embercleave,Puresteel Paladin,Champion of the Flame,Tiana; Ship's Caretaker,Reyav; Master Smith,Sigarda's Aid,Armored Skyhunter,Bruenor Battlehammer,Halvar; God of Battle,Wyleth; Soul of Steel,Koll; the Forgemaster,Valduk; Keeper of the Flame,Fervent Champion,Cloudsteel Kirin,Leonin Shikari,Balan; Wandering Knight,Kor Duelist,Leonin Abunas,Zamriel; Seraph of Steel,Auriok Steelshaper Oracle:Equip costs you pay cost {1} less.\nWhenever a modified creature you control attacks, you may pay {M}{M}, if you do conjure a random card from Nahiri's Armory's Spellbook into your hand. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_boss_effect.txt b/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_boss_effect.txt index 41d868a7d31..215a2628956 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_boss_effect.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/nahiris_boss_effect.txt @@ -4,7 +4,7 @@ Types:Enchantment S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Activated.Equip | Activator$ You | Amount$ 1 | EffectZone$ Command | Description$ Equip costs you pay cost {1} less. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Secondary$ True | Execute $ TrigConjure | TriggerDescription$ At the beginning of your upkeep or when an equipped creature you control attacks, conjure a card from Nahiri's Spellbook into your hand. T:Mode$ Attacks | ValidCard$ Creature.YouCtrl+equipped | TriggerZones$ Command | Execute$ TrigConjure | TriggerDescription$ At the beginning of your upkeep or when an equipped creature you control attacks, conjure a card from Nahiri's Spellbook into your hand. -SVar:TrigConjure:DB$ MakeCard | Zone$ Hand | Conjure$ True | AtRandom$ True | Spellbook$ Stoneforge Mystic,Danitha; Benalia's Hope,Ardenn, Intrepid Archaeologist,Open the Armory,Stone Haven Outfitter,Argentum Armor,Sword of the Animist,Masterwork of Ingenuity,Kaldra Compleat,Armored Skyhunter,Lion Sash,Relic Seeker,Esper Sentinel,Forgeborn Phoenix,Foundry Beetle,Inchblade Companion,Komainu Battle Armor,Luxior;Giada's Gift,Mace of Disruption,Nettlecyst,Shadowspear,Seraphic Greatsword,Soulstealer Axe,Sword of Body and Mind,Sword of Fire and Ice,Junkyard Scrapper,Soulstealer Axe,Sword of Feast and Famine,Expedition Supplier,Foundry Beetle,Armory Automaton,Bladegraft Aspirant,Dancing Sword,Jor Kadeen; First Goldwarden,Akiri; Fearless Voyager,Acclaimed Contender,Embercleave,Puresteel Paladin,Champion of the Flame,Tiana; Ship's Caretaker,Reyav; Master Smith,Sigarda's Aid,Armored Skyhunter,Bruenor Battlehammer,Halvar; God of Battle,Wyleth; Soul of Steel,Koll; the Forgemaster,Valduk; Keeper of the Flame,Fervent Champion,Cloudsteel Kirin,Leonin Shikari,Balan, Wandering Knight,Kor Duelist,Leonin Abunas,Zamriel, Seraph of Steel,Auriok Steelshaper +SVar:TrigConjure:DB$ MakeCard | Zone$ Hand | Conjure$ True | AtRandom$ True | Spellbook$ Stoneforge Mystic,Danitha; Benalia's Hope,Ardenn, Intrepid Archaeologist,Open the Armory,Stone Haven Outfitter,Argentum Armor,Sword of the Animist,Masterwork of Ingenuity,Kaldra Compleat,Armored Skyhunter,Lion Sash,Relic Seeker,Esper Sentinel,Forgeborn Phoenix,Foundry Beetle,Inchblade Companion,Komainu Battle Armor,Luxior;Giada's Gift,Mace of Disruption,Nettlecyst,Shadowspear,Seraphic Greatsword,Soulstealer Axe,Sword of Body and Mind,Sword of Fire and Ice,Junkyard Scrapper,Soulstealer Axe,Sword of Feast and Famine,Expedition Supplier,Foundry Beetle,Armory Automaton,Bladegraft Aspirant,Dancing Sword,Jor Kadeen; First Goldwarden,Akiri; Fearless Voyager,Acclaimed Contender,Embercleave,Puresteel Paladin,Champion of the Flame,Tiana; Ship's Caretaker,Reyav; Master Smith,Sigarda's Aid,Armored Skyhunter,Bruenor Battlehammer,Halvar; God of Battle,Wyleth; Soul of Steel,Koll; the Forgemaster,Valduk; Keeper of the Flame,Fervent Champion,Cloudsteel Kirin,Leonin Shikari,Balan; Wandering Knight,Kor Duelist,Leonin Abunas,Zamriel;Seraph of Steel,Auriok Steelshaper T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, create a 1/1 white Kor Soldier creature token SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_kor_soldier Oracle:Equip costs you pay cost {1} less.\nAt the beginning of your upkeep or whenever an equipped creature you control attacks, conjure a card from Nahiri's Spellbook into your hand\nAt the beginning of your end step, create a 1/1 white Kor Soldier creature token. \ No newline at end of file From 791270575a95960dfb7c2d7fab0aeaaf3f4cd775 Mon Sep 17 00:00:00 2001 From: jjayers99 <56438137+jjayers99@users.noreply.github.com> Date: Thu, 9 Mar 2023 16:02:49 -0500 Subject: [PATCH 08/14] Adventure mode: new enemy sprite --- .../Shandalar/sprites/boss/chandra.atlas | 68 ++++++++++++++++++ .../Shandalar/sprites/boss/chandra.png | Bin 0 -> 19368 bytes .../adventure/Shandalar/world/enemies.json | 2 +- 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/chandra.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/chandra.png diff --git a/forge-gui/res/adventure/Shandalar/sprites/boss/chandra.atlas b/forge-gui/res/adventure/Shandalar/sprites/boss/chandra.atlas new file mode 100644 index 00000000000..8ff8fa07d63 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/boss/chandra.atlas @@ -0,0 +1,68 @@ +chandra.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 16, 16 +Idle + xy: 16, 16 + size: 16, 16 +Idle + xy: 32, 16 + size: 16, 16 +Idle + xy: 48, 16 + size: 16, 16 +Walk + xy: 0, 32 + size: 16, 16 +Walk + xy: 16, 32 + size: 16, 16 +Walk + xy: 32, 32 + size: 16, 16 +Walk + xy: 48, 32 + size: 16, 16 +Attack + xy: 0, 48 + size: 16, 16 +Attack + xy: 16, 48 + size: 16, 16 +Attack + xy: 32, 48 + size: 16, 16 +Attack + xy: 48, 48 + size: 16, 16 +Hit + xy: 0, 64 + size: 16, 16 +Hit + xy: 16, 64 + size: 16, 16 +Hit + xy: 32, 64 + size: 16, 16 +Hit + xy: 48, 64 + size: 16, 16 +Death + xy: 0, 80 + size: 16, 16 +Death + xy: 16, 80 + size: 16, 16 +Death + xy: 32, 80 + size: 16, 16 +Death + xy: 48, 80 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/boss/chandra.png b/forge-gui/res/adventure/Shandalar/sprites/boss/chandra.png new file mode 100644 index 0000000000000000000000000000000000000000..bedbae8d9d5acc090284b4667ad48708e7847944 GIT binary patch literal 19368 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

KVsm2 zr2N0x_5T}P$p3vaWoG|&1?2H|tMrH2fb#7&3*J~kRtoS6cmjys(>5-=Nst`nv|RuI z^xnU|P=gMorf)(7S9v9Agaa5PTx$B~8o#%fa3GAyONpy_E}ww)EWy&aFQ?|2?Tp;O zIVI!hhGHeTFZKi|sw?S*5;nM2C0MhK<|fr@54)1N%OZF>zNL6HUsU8&W~0$&-@{6> zXsMkQ{GMQCX+X0Y%afx;J3ggdIxi69t@VIRjOMhixURt{xF3x3TZ}&iY~&zSzrzKL z^%bSEo)%|%rhe^V{}Lt3`1E<{By;UVJ77-JlGJpGWmd7%x5u zv)x!npIYi|8?alGOC^+DjOJ({32{tFcINozQu-|rFTSR2*<=F-0KAZGO`T4g9Q*Yf z>b@qS;8cV3NHk=)2Fv$hjKDm+D53=l5b**1ixowV2tx0WniR&Q>J}l{AA1%#p{Gab zrz^-OK%hb^&(c@2BhgP-c$oIOZOA*5PLn01@xIQ)fKf5FVjHmwqLXPRQ@lt3!2AI9 zF9)|9-UR9Hc0FOPahb!cm4zBXPoAt=P>UI&-lZg*Gnv74(O+OV&Kc&|Ch%y?t6l(= zbZXU4bFvifPec34n1z~(aG??_1cqyfW8*|{nZ(3ymfVzY&2)Pzni#rZ4u=0y_R=Q+ z8qlFU9Xy|xIUdNmC${V%*(nrp4p!Jx3p6t2n*aPe=7UJ~Z?@dt;To<(RrKqR!4C}L zrY_%>B$>PeUquD@I`n9Zqa zNMHfGn&^z}Br9LuUhC5NOj}v?XJbrekr4(bZ3-K2pk4uQhcavj`zL9&L6lfQxb7ozeQ&ho`EDw`q_hLOp}Ta(h$1uzS8Gx&=}%jP+{s0CRgE$J zoj-DZ4#!~T++4daDVyrIyk!#c@W%!DM9iG&{+x~{1gsFN&2qVNZ9{5)oiqO~7DQgX zDLk=$(a!0+pWQmq&%#cB-kq#AZYa8-NJweYcy_*w%}*dOoAhRr5wIp0y7?yD8+Np# z160zpBUYxV%WP<5l?IFb8utgokCCa2C7Dabsf(}*XDCnjZMAiB85=|Gy~o$}Tm0Jf zZ~^X5o@7-YXt+grr072p`HjhEQg#Y15Qj2%SJ|uZJRM$=6u<)7CV3Jps!iRq?&F_k ziZd;`z5}3J9H%s|tBUi0Qr~J1BJQK8jFc>_^dG?%cXvmQ^C_)1d>fe98 zCM6(dW1I!|F=eb*1@MYc?W%p6CpM9>x3vjgNn1pVj$UT?93aR*#y|l?j*{jJ%YXK{ zzzRL&5?qzyJZCsLI^jsdWey}rO${nkPHahiY0s|{NW%~8(}#lXM&P@@4W14ASDT~#l~5ya6MgdSizI#7w>#Qn)-d> zX);x9w0A!JVUegBb~C&Q+nqwf)q8tZo6=AHm8auaq=AI;vb!6t>gVaS31Mb#%dU{J z+pSNx@?bEL%-4fnjGG%mnXj@^2K}9JY#$cEdoX3HpPA@Y1p2X;&W{A&qOR>#f-^%@ zNJdg~tj!< zWu^=D-U2su7#8-@e5-GVOoN7xPF}uuQV1LWy=IgMn*0> zqV#+x_w7o;5ixo`$(}<6xeQhtu5Q; zyU65qg2XKx4QPsjEC2Q1j=_LbG%17nr=V>ob&-N>U#ZU+rN5BFyAo6lh*HXN12J<{ z-}|`$-ajZim}f@XD?Z_N{YiLb(cRMT)I%9ZDMx(I*e2xB@PFMDM(X~0*@opz;8<#7sd0nk=%k$%%*|4UI=*m8~T?+ZlknA`PVk4xw z3@UAe6vmwiK{-1K0W2?~?`uAjngbLiVJXDt4(Ij<6!ZsVDnVq<3i=--dbQMmf__PG Z{C_vcg9Ary`icMm002ovPDHLkV1n7y7OwyR literal 0 HcmV?d00001 diff --git a/forge-gui/res/adventure/Shandalar/world/enemies.json b/forge-gui/res/adventure/Shandalar/world/enemies.json index 192888b00cb..310afb0c855 100644 --- a/forge-gui/res/adventure/Shandalar/world/enemies.json +++ b/forge-gui/res/adventure/Shandalar/world/enemies.json @@ -1605,7 +1605,7 @@ }, { "name": "Chandra", - "sprite": "sprites/red_wiz2.atlas", + "sprite": "sprites/boss/chandra.atlas", "deck": [ "decks/miniboss/Fire of Kaladesh.dck" ], From b7105e1ee9f8ae1519d928cc2d593814c725c1c0 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 9 Mar 2023 22:43:50 +0100 Subject: [PATCH 09/14] Some cleanup --- .../java/forge/ai/ability/ChangeZoneAi.java | 8 +-- .../java/forge/ai/ability/DamageDealAi.java | 2 +- .../forge/ai/ability/DamagePreventAi.java | 2 +- .../main/java/forge/ai/ability/DebuffAi.java | 13 ++--- .../main/java/forge/ai/ability/ProtectAi.java | 51 ++++++++----------- .../main/java/forge/ai/ability/PumpAi.java | 13 ++--- .../java/forge/ai/ability/SetStateAi.java | 4 +- .../java/forge/game/ability/AbilityUtils.java | 15 ++++-- .../game/ability/effects/PumpAllEffect.java | 2 +- .../game/ability/effects/PumpEffect.java | 5 +- .../ability/effects/RepeatEachEffect.java | 23 ++------- .../game/ability/effects/RepeatEffect.java | 16 ++---- forge-gui/res/cardsfolder/d/desolation.txt | 2 +- .../res/cardsfolder/w/wave_of_vitriol.txt | 2 +- 14 files changed, 59 insertions(+), 99 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 907d6438d88..fd02a6cb98e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1090,7 +1090,6 @@ public class ChangeZoneAi extends SpellAbilityAi { // Exile and bounce opponents stuff if (destination.equals(ZoneType.Exile) || origin.contains(ZoneType.Battlefield)) { - // don't rush bouncing stuff when not going to attack if (!immediately && game.getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && game.getPhaseHandler().isPlayerTurn(ai) @@ -1433,17 +1432,14 @@ public class ChangeZoneAi extends SpellAbilityAi { final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination")); final TargetRestrictions tgt = sa.getTargetRestrictions(); - CardCollection list = CardLists.getValidCards(ai.getGame().getCardsIn(tgt.getZone()), tgt.getValidTgts(), ai, source, sa); - list = CardLists.getTargetableCards(list, sa); - - list.removeAll(sa.getTargets().getTargetCards()); + CardCollection list = new CardCollection(CardUtil.getValidCardsToTarget(tgt, sa)); if (list.isEmpty()) { return false; } // target loop - while (sa.getTargets().size() < tgt.getMinTargets(sa.getHostCard(), sa)) { + while (!sa.isMinTargetChosen()) { // AI Targeting Card choice = null; diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index d6a2d2cbe30..4fbf12b2ae9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -757,7 +757,7 @@ public class DamageDealAi extends DamageAiBase { return false; } // TODO: Improve Damage, we shouldn't just target the player just because we can - if (sa.canTarget(enemy) && tcs.size() < tgt.getMaxTargets(source, sa)) { + if (sa.canTarget(enemy) && sa.canAddMoreTarget()) { if (((phase.is(PhaseType.END_OF_TURN) && phase.getNextTurn().equals(ai)) || (SpellAbilityAi.isSorcerySpeed(sa, ai) && phase.is(PhaseType.MAIN2)) || ("PingAfterAttack".equals(logic) && phase.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) && phase.isPlayerTurn(ai)) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java index 806c08fddfd..133fd5ce195 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java @@ -130,7 +130,7 @@ public class DamagePreventAi extends SpellAbilityAi { ComputerUtilCard.sortByEvaluateCreature(combatants); for (final Card c : combatants) { - if (ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat) && tcs.size() < tgt.getMaxTargets(hostCard, sa)) { + if (ComputerUtilCombat.combatantWouldBeDestroyed(ai, c, combat) && sa.canAddMoreTarget()) { tcs.add(c); chance = true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index 119d4cb3e5c..448b7d0443e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -17,6 +17,7 @@ import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; +import forge.game.card.CardUtil; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.phase.PhaseHandler; @@ -24,7 +25,6 @@ import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; -import forge.game.zone.ZoneType; public class DebuffAi extends SpellAbilityAi { @@ -195,16 +195,13 @@ public class DebuffAi extends SpellAbilityAi { */ private boolean debuffMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - CardCollection list = CardLists.getTargetableCards(ai.getGame().getCardsIn(ZoneType.Battlefield), sa); + List list = CardUtil.getValidCardsToTarget(tgt, sa); if (list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { sa.resetTargets(); return false; } - // Remove anything that's already been targeted - list.removeAll(sa.getTargets().getTargetCards()); - final CardCollection pref = CardLists.filterControlledBy(list, ai.getOpponents()); final CardCollection forced = CardLists.filterControlledBy(list, ai); final Card source = sa.getHostCard(); @@ -219,7 +216,7 @@ public class DebuffAi extends SpellAbilityAi { sa.getTargets().add(c); } - while (sa.getTargets().size() < tgt.getMinTargets(source, sa)) { + while (!sa.isMinTargetChosen()) { if (forced.isEmpty()) { break; } @@ -237,13 +234,13 @@ public class DebuffAi extends SpellAbilityAi { sa.getTargets().add(c); } - if (sa.getTargets().size() < tgt.getMinTargets(source, sa)) { + if (!sa.isMinTargetChosen()) { sa.resetTargets(); return false; } return true; - } // pumpMandatoryTarget() + } @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java index f27a3326521..8d21940b918 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java @@ -20,13 +20,13 @@ import forge.game.ability.effects.ProtectEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; +import forge.game.card.CardUtil; import forge.game.combat.Combat; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; -import forge.game.zone.ZoneType; import forge.util.MyRandom; public class ProtectAi extends SpellAbilityAi { @@ -168,23 +168,23 @@ public class ProtectAi extends SpellAbilityAi { @Override protected boolean checkApiLogic(final Player ai, final SpellAbility sa) { - if (!sa.usesTargeting()) { - final List cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); - if (cards.size() == 0) { - return false; - } else if (cards.size() == 1) { - // Affecting single card - return getProtectCreatures(ai, sa).contains(cards.get(0)); - } - /* - * when this happens we need to expand AI to consider if its ok - * for everything? for (Card card : cards) { // TODO if AI doesn't - * control Card and Pump is a Curse, than maybe use? - * } - */ - } else { + if (sa.usesTargeting()) { return protectTgtAI(ai, sa, false); } + + final List cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); + if (cards.size() == 0) { + return false; + } else if (cards.size() == 1) { + // Affecting single card + return getProtectCreatures(ai, sa).contains(cards.get(0)); + } + /* + * when this happens we need to expand AI to consider if its ok + * for everything? for (Card card : cards) { // TODO if AI doesn't + * control Card and Pump is a Curse, than maybe use? + * } + */ return false; } @@ -256,21 +256,15 @@ public class ProtectAi extends SpellAbilityAi { } // protectTgtAI() private static boolean protectMandatoryTarget(final Player ai, final SpellAbility sa) { - final Game game = ai.getGame(); - final TargetRestrictions tgt = sa.getTargetRestrictions(); - CardCollection list = CardLists.getTargetableCards(game.getCardsIn(ZoneType.Battlefield), sa); + final Card source = sa.getHostCard(); + final List list = CardUtil.getValidCardsToTarget(tgt, sa); - if (list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { + if (list.size() < tgt.getMinTargets(source, sa)) { sa.resetTargets(); return false; } - // Remove anything that's already been targeted - for (final Card c : sa.getTargets().getTargetCards()) { - list.remove(c); - } - CardCollection pref = CardLists.filterControlledBy(list, ai); pref = CardLists.filter(pref, new Predicate() { @Override @@ -286,7 +280,6 @@ public class ProtectAi extends SpellAbilityAi { } }); final List forced = CardLists.filterControlledBy(list, ai); - final Card source = sa.getHostCard(); while (sa.canAddMoreTarget()) { if (pref.isEmpty()) { @@ -308,13 +301,13 @@ public class ProtectAi extends SpellAbilityAi { sa.getTargets().add(c); } - while (sa.getTargets().size() < tgt.getMinTargets(source, sa)) { + while (!sa.isMinTargetChosen()) { if (forced.isEmpty()) { break; } Card c; - if (CardLists.getNotType(forced, "Creature").size() == 0) { + if (CardLists.getNotType(forced, "Creature").isEmpty()) { c = ComputerUtilCard.getWorstCreatureAI(forced); } else { c = ComputerUtilCard.getCheapestPermanentAI(forced, sa, false); @@ -323,7 +316,7 @@ public class ProtectAi extends SpellAbilityAi { sa.getTargets().add(c); } - if (sa.getTargets().size() < tgt.getMinTargets(source, sa)) { + if (!sa.isMinTargetChosen()) { sa.resetTargets(); return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 6d733072875..4f8e4f58f83 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -616,23 +616,16 @@ public class PumpAi extends PumpAiBase { } private boolean pumpMandatoryTarget(final Player ai, final SpellAbility sa) { - final Game game = ai.getGame(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - CardCollection list = CardLists.getTargetableCards(game.getCardsIn(ZoneType.Battlefield), sa); + List list = CardUtil.getValidCardsToTarget(tgt, sa); if (list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { sa.resetTargets(); return false; } - // Remove anything that's already been targeted - for (final Card c : sa.getTargets().getTargetCards()) { - list.remove(c); - } - CardCollection pref; CardCollection forced; - final Card source = sa.getHostCard(); if (sa.isCurse()) { pref = CardLists.filterControlledBy(list, ai.getOpponents()); @@ -652,7 +645,7 @@ public class PumpAi extends PumpAiBase { sa.getTargets().add(c); } - while (sa.getTargets().size() < tgt.getMinTargets(source, sa)) { + while (!sa.isMinTargetChosen()) { if (forced.isEmpty()) { break; } @@ -668,7 +661,7 @@ public class PumpAi extends PumpAiBase { sa.getTargets().add(c); } - if (sa.getTargets().size() < tgt.getMinTargets(source, sa)) { + if (!sa.isMinTargetChosen()) { sa.resetTargets(); return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index 5a8ac20146a..921a6d361d1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -97,13 +97,13 @@ public class SetStateAi extends SpellAbilityAi { for (final Card c : list) { if (shouldTransformCard(c, ai, ph) || "Always".equals(logic)) { sa.getTargets().add(c); - if (sa.getTargets().size() == tgt.getMaxTargets(source, sa)) { + if (sa.isMaxTargetChosen()) { break; } } } - return sa.getTargets().size() >= tgt.getMinTargets(source, sa); + return sa.isMinTargetChosen(); } } else if ("TurnFace".equals(mode)) { if (!sa.usesTargeting()) { diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 530d692c5b3..8c43e1ed456 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -96,6 +96,13 @@ public class AbilityUtils { final Game game = hostCard.getGame(); Card c = null; + Player player = null; + if (sa instanceof SpellAbility) { + player = ((SpellAbility)sa).getActivatingPlayer(); + } + if (player == null) { + player = hostCard.getController(); + } if (defined.equals("Self")) { c = hostCard; @@ -143,7 +150,7 @@ public class AbilityUtils { } } } else if (defined.equals("TopOfGraveyard")) { - final CardCollectionView grave = hostCard.getController().getCardsIn(ZoneType.Graveyard); + final CardCollectionView grave = player.getCardsIn(ZoneType.Graveyard); if (grave.size() > 0) { c = grave.getLast(); @@ -153,7 +160,7 @@ public class AbilityUtils { } } else if (defined.endsWith("OfLibrary")) { - final CardCollectionView lib = hostCard.getController().getCardsIn(ZoneType.Library); + final CardCollectionView lib = player.getCardsIn(ZoneType.Library); int libSize = lib.size(); if (libSize > 0) { // TopOfLibrary or BottomOfLibrary if (defined.startsWith("TopThird")) { @@ -354,7 +361,7 @@ public class AbilityUtils { candidates = game.getCardsIn(ZoneType.smartValueOf(zone)); validDefined = s[1]; } - cards.addAll(CardLists.getValidCards(candidates, validDefined, hostCard.getController(), hostCard, sa)); + cards.addAll(CardLists.getValidCards(candidates, validDefined, player, hostCard, sa)); return cards; } else if (defined.startsWith("ExiledWith")) { cards.addAll(hostCard.getExiledCards()); @@ -375,7 +382,7 @@ public class AbilityUtils { for (int i = 0; i < valids.length; i++) { valids[i] = "Card." + valids[i]; } - cards = CardLists.getValidCards(cards, valids, hostCard.getController(), hostCard, sa); + cards = CardLists.getValidCards(cards, valids, player, hostCard, sa); } return cards; diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index 5af4dbc37aa..12e5b52e0a7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -115,7 +115,7 @@ public class PumpAllEffect extends SpellAbilityEffect { sb.append(desc); return sb.toString(); - } // pumpAllStackDescription() + } @Override public void resolve(final SpellAbility sa) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 70d9e033171..6a04823abda 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -415,10 +415,7 @@ public class PumpEffect extends SpellAbilityEffect { final ZoneType pumpZone = sa.hasParam("PumpZone") ? ZoneType.smartValueOf(sa.getParam("PumpZone")) : ZoneType.Battlefield; - final int size = tgtCards.size(); - for (int j = 0; j < size; j++) { - final Card tgtC = tgtCards.get(j); - + for (Card tgtC : tgtCards) { // CR 702.26e if (tgtC.isPhasedOut()) { continue; diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java index 52488f3005e..d8d19721c2a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java @@ -32,14 +32,6 @@ public class RepeatEachEffect extends SpellAbilityEffect { final SpellAbility repeat = sa.getAdditionalAbility("RepeatSubAbility"); - if (repeat != null && !repeat.getHostCard().equalsWithTimestamp(source)) { - // TODO: for some reason, the host card of the original additional SA is set to the cloned card when - // the ability is copied (e.g. Clone Legion + Swarm Intelligence). Couldn't figure out why this happens, - // so this hack is necessary for now to work around this issue. - System.out.println("Warning: RepeatSubAbility had the wrong host set (potentially after cloning the root SA or changing zones), attempting to correct..."); - repeat.setHostCard(source); - } - final Player player = sa.getActivatingPlayer(); final Game game = player.getGame(); if (sa.hasParam("Optional") && sa.hasParam("OptionPrompt") && //for now, OptionPrompt is needed @@ -74,10 +66,6 @@ public class RepeatEachEffect extends SpellAbilityEffect { } else if (sa.hasParam("DefinedCards")) { repeatCards = AbilityUtils.getDefinedCards(source, sa.getParam("DefinedCards"), sa); - if (sa.hasParam("AdditionalRestriction")) { // lki cards might not be in game - repeatCards = CardLists.getValidCards(repeatCards, - sa.getParam("AdditionalRestriction"), source.getController(), source, sa); - } } boolean loopOverCards = repeatCards != null && !repeatCards.isEmpty(); @@ -125,13 +113,10 @@ public class RepeatEachEffect extends SpellAbilityEffect { // for a mixed list of target permanents and players, e.g. Soulfire Eruption if (sa.hasParam("RepeatTargeted")) { - final List tgts = getTargets(sa); - if (tgts != null) { - for (final Object o : tgts) { - source.addRemembered(o); - AbilityUtils.resolve(repeat); - source.removeRemembered(o); - } + for (final GameObject o : getTargets(sa)) { + source.addRemembered(o); + AbilityUtils.resolve(repeat); + source.removeRemembered(o); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java index 3438ee5aa8e..4c8465101bf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java @@ -26,17 +26,9 @@ public class RepeatEffect extends SpellAbilityEffect { // setup subability to repeat SpellAbility repeat = sa.getAdditionalAbility("RepeatSubAbility"); - if (repeat != null && !repeat.getHostCard().equals(source)) { - // TODO: for some reason, the host card of the original additional SA is set to the cloned card when - // the ability is copied (e.g. Clone Legion + Swarm Intelligence). Couldn't figure out why this happens, - // so this hack is necessary for now to work around this issue. - System.out.println("Warning: RepeatSubAbility had the wrong host set (potentially after cloning the root SA), attempting to correct..."); - repeat.setHostCard(source); - } - Integer maxRepeat = null; if (sa.hasParam("MaxRepeat")) { - maxRepeat = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("MaxRepeat"), sa); + maxRepeat = AbilityUtils.calculateAmount(source, sa.getParam("MaxRepeat"), sa); if (maxRepeat.intValue() == 0) return; // do nothing if maxRepeat is 0. the next loop will execute at least once } @@ -50,7 +42,7 @@ public class RepeatEffect extends SpellAbilityEffect { // Helm of Obedience vs Graveyard to Library replacement effect if (source.getName().equals("Helm of Obedience")) { - StringBuilder infLoop = new StringBuilder(sa.getHostCard().toString()); + StringBuilder infLoop = new StringBuilder(source.toString()); infLoop.append(" - To avoid an infinite loop, this repeat has been broken "); infLoop.append(" and the game will now continue in the current state, ending the loop early. "); infLoop.append("Once Draws are available this probably should change to a Draw."); @@ -84,7 +76,7 @@ public class RepeatEffect extends SpellAbilityEffect { } else { list = game.getCardsIn(ZoneType.Battlefield); } - list = CardLists.getValidCards(list, repeatPresent, sa.getActivatingPlayer(), sa.getHostCard(), sa); + list = CardLists.getValidCards(list, repeatPresent, activator, sa.getHostCard(), sa); final String rightString = repeatCompare.substring(2); int right = AbilityUtils.calculateAmount(sa.getHostCard(), rightString, sa); @@ -114,7 +106,7 @@ public class RepeatEffect extends SpellAbilityEffect { if (sa.hasParam("RepeatOptional")) { Player decider = sa.hasParam("RepeatOptionalDecider") ? AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("RepeatOptionalDecider"), sa).get(0) - : sa.getActivatingPlayer(); + : activator; return decider.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantRepeatProcessAgain"), null); } diff --git a/forge-gui/res/cardsfolder/d/desolation.txt b/forge-gui/res/cardsfolder/d/desolation.txt index 6cf3c555575..e95d45e7410 100644 --- a/forge-gui/res/cardsfolder/d/desolation.txt +++ b/forge-gui/res/cardsfolder/d/desolation.txt @@ -3,7 +3,7 @@ ManaCost:1 B B Types:Enchantment T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each end step, each player who tapped a land for mana this turn sacrifices a land. Desolation deals 2 damage to each player who sacrificed a Plains this way. SVar:TrigSac:DB$ Sacrifice | SacValid$ Land | Defined$ Player.TappedLandForManaThisTurn | RememberSacrificed$ True | SubAbility$ DBRepeat -SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ Remembered | AdditionalRestriction$ Plains | UseImprinted$ True | RepeatSubAbility$ DBDamage | SubAbility$ DBCleanup +SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ Remembered.Plains | UseImprinted$ True | RepeatSubAbility$ DBDamage | SubAbility$ DBCleanup SVar:DBDamage:DB$ DealDamage | Defined$ ImprintedController | NumDmg$ 2 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/w/wave_of_vitriol.txt b/forge-gui/res/cardsfolder/w/wave_of_vitriol.txt index 37d37b40b24..093b3353e5c 100644 --- a/forge-gui/res/cardsfolder/w/wave_of_vitriol.txt +++ b/forge-gui/res/cardsfolder/w/wave_of_vitriol.txt @@ -2,7 +2,7 @@ Name:Wave of Vitriol ManaCost:5 G G Types:Sorcery A:SP$ SacrificeAll | Cost$ 5 G G | ValidCards$ Artifact,Enchantment,Land.nonBasic | RememberSacrificed$ True | SubAbility$ DBRepeat | SpellDescription$ Each player sacrifices all artifacts, enchantments, and nonbasic lands they control. For each land sacrificed this way, its controller may search their library for a basic land card and put it onto the battlefield tapped. Then each player who searched their library this way shuffles. -SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ DirectRemembered | AdditionalRestriction$ Land | UseImprinted$ True | RepeatSubAbility$ DBSearch | ClearRemembered$ True | SubAbility$ DBShuffle +SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ DirectRemembered.Land | UseImprinted$ True | RepeatSubAbility$ DBSearch | ClearRemembered$ True | SubAbility$ DBShuffle SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | RememberChanged$ True | DefinedPlayer$ ImprintedController | Chooser$ ImprintedController | NoShuffle$ True | Optional$ True SVar:DBShuffle:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ ShuffleSearched | SubAbility$ DBCleanup SVar:ShuffleSearched:DB$ Shuffle | Defined$ Player.IsRemembered | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 From 5e1d6da8db4c325d63650e9e55db8532bca1a478 Mon Sep 17 00:00:00 2001 From: jjayers99 <56438137+jjayers99@users.noreply.github.com> Date: Thu, 9 Mar 2023 17:18:37 -0500 Subject: [PATCH 10/14] Adv: New enemies, sprite corrections --- .../decks/challenger_22_dimir_control.dck | 27 ++ .../decks/challenger_22_gruul_stompy.dck | 27 ++ .../decks/challenger_22_mono_white_aggro.dck | 20 ++ .../decks/challenger_22_rakdos_vampires.dck | 29 ++ .../maps/map/main_story/forest_capital.tmx | 4 + .../maps/map/main_story/island_capital.tmx | 4 + .../maps/map/main_story/mountain_capital.tmx | 4 + .../maps/map/main_story/plains_capital.tmx | 4 + .../maps/map/main_story/swamp_capital.tmx | 4 + .../adventure/Shandalar/sprites/items.atlas | 31 +- .../res/adventure/Shandalar/world/black.json | 4 + .../res/adventure/Shandalar/world/blue.json | 4 + .../adventure/Shandalar/world/enemies.json | 317 ++++++++++++++++++ .../res/adventure/Shandalar/world/green.json | 4 + .../res/adventure/Shandalar/world/items.json | 5 + .../res/adventure/Shandalar/world/red.json | 4 + .../res/adventure/Shandalar/world/waste.json | 4 + .../res/adventure/Shandalar/world/white.json | 4 + 18 files changed, 485 insertions(+), 15 deletions(-) create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_22_dimir_control.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_22_gruul_stompy.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_22_mono_white_aggro.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_22_rakdos_vampires.dck diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_22_dimir_control.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_22_dimir_control.dck new file mode 100644 index 00000000000..5f0d4cedd42 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_22_dimir_control.dck @@ -0,0 +1,27 @@ +[metadata] +Name=AI 22 Dimir Control +[Main] +2 Baleful Mastery|STX|1 +3 Blood on the Snow|KHM|1 +3 Crippling Fear|CLB|1 +2 Evolving Wilds|MID|1 +2 Field of Ruin|MID|1 +3 Graveyard Trespasser|MID|1 +2 Hall of Storm Giants|AFR|1 +2 Hero's Downfall|VOW|1 +1 Hullbreaker Horror|VOW|1 +4 Ice Tunnel|KHM|1 +1 Infernal Grasp|DBL|1 +2 Iymrith, Desert Doom|AFR|1 +2 Jwari Disruption|ZNR|1 +1 March of Wretched Sorrow|NEO|1 +4 Memory Deluge|MID|1 +2 Parasitic Grasp|VOW|1 +3 Power Word Kill|GDY|1 +3 Saw It Coming|KHM|1 +4 Shipwreck Marsh|MID|1 +5 Snow-Covered Island|J22|1 +7 Snow-Covered Swamp|KHM|1 +2 Thirst for Discovery|VOW|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_22_gruul_stompy.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_22_gruul_stompy.dck new file mode 100644 index 00000000000..1145707cc7c --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_22_gruul_stompy.dck @@ -0,0 +1,27 @@ +[metadata] +Name=AI 22 Gruul Stompy +[Main] +4 Abrade|SCD|1 +4 Briarbridge Tracker|DBL|1 +4 Forest|MID|1 +3 Forest|MID|2 +3 Forest|MID|3 +1 Goldspan Dragon|KHM|1 +2 Halana and Alena, Partners|DBL|1 +4 Jaspera Sentinel|KHM|1 +2 Lair of the Hydra|AFR|1 +1 Light Up the Night|DBL|1 +4 Magda, Brazen Outlaw|KHM|1 +4 Mountain|MID|1 +2 Mountain|MID|2 +2 Mountain|MID|3 +4 Ranger Class|AFR|1 +4 Rockfall Vale|DBL|1 +4 Snakeskin Veil|KHM|1 +1 Thundering Rebuke|ZNR|1 +2 Tovolar's Huntmaster|DBL|1 +1 Tovolar, Dire Overlord|DBL|1 +2 Twinshot Sniper|NEO|1 +2 Ulvenwald Oddity|DBL|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_22_mono_white_aggro.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_22_mono_white_aggro.dck new file mode 100644 index 00000000000..8d79435b531 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_22_mono_white_aggro.dck @@ -0,0 +1,20 @@ +[metadata] +Name=AI 22 Mono White Aggro +[Main] +4 Clarion Spirit|KHM|1 +4 Codespell Cleric|J21|1 +3 Elite Spellbinder|SLC|1 +3 Faceless Haven|PPRO|1 +2 Fateful Absence|MID|1 +1 Intrepid Adversary|DBL|1 +2 Kabira Takedown|ZNR|1 +4 Luminarch Aspirant|NCC|1 +4 Monk of the Open Hand|AFR|1 +3 Paladin Class|AFR|1 +2 Reidane, God of the Worthy|KHM|1 +2 Skyclave Apparition|ZNR|1 +20 Snow-Covered Plains|KHM|1 +2 Thalia, Guardian of Thraben|DKA|1 +4 Usher of the Fallen|KHM|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_22_rakdos_vampires.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_22_rakdos_vampires.dck new file mode 100644 index 00000000000..4fbe0c6fb1e --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_22_rakdos_vampires.dck @@ -0,0 +1,29 @@ +[metadata] +Name=AI 22 Rakdos Vampires +[Main] +2 Blightstep Pathway|KHM|1 +4 Bloodfell Caves|SCD|1 +4 Bloodtithe Harvester|VOW|1 +2 Den of the Bugbear|AFR|1 +2 Dominating Vampire|DBL|1 +2 Florian, Voldaren Scion|DBL|1 +1 Henrika Domnathi|DBL|1 +4 Immersturm Predator|KHM|1 +2 Infernal Grasp|DBL|1 +1 Mountain|VOW|1 +2 Mountain|VOW|2 +3 Mountain|VOW|4 +2 Mukotai Soulripper|NEO|1 +2 Oni-Cult Anvil|BRC|1 +2 Sokenzan Smelter|NEO|1 +5 Swamp|VOW|1 +1 Swamp|VOW|2 +1 Swamp|VOW|4 +2 Vampire Socialite|MID|1 +1 Village Rites|J22|1 +4 Voldaren Bloodcaster|VOW|1 +4 Voldaren Epicure|VOW|1 +3 Voldaren Estate|DBL|1 +4 Voltage Surge|NEO|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx index 821cf84d3a2..713a15abacb 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx @@ -148,6 +148,10 @@ "Bear", "Centaur", "Centaur Warrior", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Dino", "Eldraine Faerie", "Elf", diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx index 638e4bc681f..8bdd429a42b 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx @@ -131,6 +131,10 @@ "enemyPool":[ "Bird", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Djinn", "Elemental", "Merfolk", diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx index e2cfb1fb07a..8874d15a4a1 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/mountain_capital.tmx @@ -124,6 +124,10 @@ "Axgard Dwarf", "Berserker", "Boggart", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Cyclops", "Devil", "Dinosaur", diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx index 24640aaae3a..a2d4bdc4313 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx @@ -132,6 +132,10 @@ "Archer", "Cat", "Cathar", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Cleric", "Dawnhart Witch", "Eldraine Knight", diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx index 9d9df53923f..239cb932eb2 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx @@ -60,6 +60,10 @@ "Black Wiz1", "Black Wiz2", "Black Wiz3", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Dark Knight", "Death Knight", "Demon", diff --git a/forge-gui/res/adventure/Shandalar/sprites/items.atlas b/forge-gui/res/adventure/Shandalar/sprites/items.atlas index 5e7919db4cd..3c3fb6cce51 100644 --- a/forge-gui/res/adventure/Shandalar/sprites/items.atlas +++ b/forge-gui/res/adventure/Shandalar/sprites/items.atlas @@ -352,25 +352,26 @@ WhiteStaff xy: 352,160 size: 16, 16 GarrukAxe - xy: 303,273 - size: 19, 15 + xy: 304,272 + size: 16, 16 BlueRobes - xy: 272,63 - size: 16, 18 + xy: 272,64 + size: 16, 16 Armory - xy: 129,512 - size: 14, 17 + xy: 128,512 + size: 16, 16 HorseHoove xy: 80,496 - size: 17, 16 + size: 16, 16 PirateFlag - xy: 0,495 - size: 18, 17 + xy: 0,496 + size: 16, 16 Scythe - xy: 288,977 - size: 18, 14 + xy: 288,976 + size: 16, 16 ChickenEgg - xy: 306,800 - size: 13, 15 - - \ No newline at end of file + xy: 304,800 + size: 16, 16 +ChallengeCoin + xy: 32,512 + size: 16, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/world/black.json b/forge-gui/res/adventure/Shandalar/world/black.json index 0dd649d3b21..9c43cc2f5a5 100644 --- a/forge-gui/res/adventure/Shandalar/world/black.json +++ b/forge-gui/res/adventure/Shandalar/world/black.json @@ -40,6 +40,10 @@ "Black Wiz1", "Black Wiz2", "Black Wiz3", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Dark Knight", "Death Knight", "Demon", diff --git a/forge-gui/res/adventure/Shandalar/world/blue.json b/forge-gui/res/adventure/Shandalar/world/blue.json index 8c7bc8e7a08..3e2fc8d7fd3 100644 --- a/forge-gui/res/adventure/Shandalar/world/blue.json +++ b/forge-gui/res/adventure/Shandalar/world/blue.json @@ -30,6 +30,10 @@ "enemies": [ "Aether Channeler", "Bird", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Djinn", "Elemental", "Frost Titan", diff --git a/forge-gui/res/adventure/Shandalar/world/enemies.json b/forge-gui/res/adventure/Shandalar/world/enemies.json index 310afb0c855..c28ef878ac0 100644 --- a/forge-gui/res/adventure/Shandalar/world/enemies.json +++ b/forge-gui/res/adventure/Shandalar/world/enemies.json @@ -1603,6 +1603,318 @@ ], "colors": "GW" }, +{ + "name": "Challenger 1", + "sprite": "sprites/doppelganger.atlas", + "deck": [ + "decks/challenger_22_dimir_control.dck" + ], + "spawnRate": 0.0625, + "difficulty": 0.25, + "speed": 28, + "life": 22, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.1, + "count": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Land" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 210, + "addMaxCount": 90 + }, + { + "type": "item", + "probability": 1, + "count": 1, + "itemName": "Challenge Coin" + } + ], + "colors": "UB" +}, +{ + "name": "Challenger 2", + "sprite": "sprites/doppelganger.atlas", + "deck": [ + "decks/challenger_22_gruul_stompy.dck" + ], + "spawnRate": 0.0625, + "difficulty": 0.25, + "speed": 28, + "life": 22, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.1, + "count": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Land" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 210, + "addMaxCount": 90 + }, + { + "type": "item", + "probability": 1, + "count": 1, + "itemName": "Challenge Coin" + } + ], + "colors": "GR" +}, +{ + "name": "Challenger 3", + "sprite": "sprites/doppelganger.atlas", + "deck": [ + "decks/challenger_22_mono_white_aggro.dck" + ], + "spawnRate": 0.0625, + "difficulty": 0.25, + "speed": 28, + "life": 22, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.1, + "count": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Land" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 210, + "addMaxCount": 90 + }, + { + "type": "item", + "probability": 1, + "count": 1, + "itemName": "Challenge Coin" + } + ], + "colors": "W" +}, +{ + "name": "Challenger 4", + "sprite": "sprites/doppelganger.atlas", + "deck": [ + "decks/challenger_22_rakdos_vampires.dck" + ], + "spawnRate": 0.0625, + "difficulty": 0.25, + "speed": 28, + "life": 22, + "rewards": [ + { + "type": "deckCard", + "probability": 1, + "count": 2, + "addMaxCount": 4, + "rarity": [ + "common" + ] + }, + { + "type": "deckCard", + "probability": 0.5, + "count": 1, + "addMaxCount": 2, + "rarity": [ + "uncommon" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.25, + "count": 1, + "addMaxCount": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Creature", + "Artifact", + "Enchantment", + "Instant", + "Sorcery" + ] + }, + { + "type": "deckCard", + "probability": 0.1, + "count": 1, + "rarity": [ + "rare" + ], + "cardTypes": [ + "Land" + ] + }, + { + "type": "gold", + "probability": 0.3, + "count": 210, + "addMaxCount": 90 + }, + { + "type": "item", + "probability": 1, + "count": 1, + "itemName": "Challenge Coin" + } + ], + "colors": "BR" +}, { "name": "Chandra", "sprite": "sprites/boss/chandra.atlas", @@ -1680,6 +1992,11 @@ "probability": 1, "count": 1000, "addMaxCount": 9000 + }, + { + "type": "item", + "probability": 1, + "count": 1, "itemName": "Chandra's Stone" } ], diff --git a/forge-gui/res/adventure/Shandalar/world/green.json b/forge-gui/res/adventure/Shandalar/world/green.json index 7b78d6b732b..84a539d9905 100644 --- a/forge-gui/res/adventure/Shandalar/world/green.json +++ b/forge-gui/res/adventure/Shandalar/world/green.json @@ -38,6 +38,10 @@ "Beastmaster", "Centaur", "Centaur Warrior", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Dino", "Eldraine Faerie", "Elf", diff --git a/forge-gui/res/adventure/Shandalar/world/items.json b/forge-gui/res/adventure/Shandalar/world/items.json index 352ac6e8c1b..6ad55c8384c 100644 --- a/forge-gui/res/adventure/Shandalar/world/items.json +++ b/forge-gui/res/adventure/Shandalar/world/items.json @@ -1,4 +1,9 @@ [ + { + "name": "Challenge Coin", + "description": "A heavy coin made of unknown material.", + "iconName": "ChallengeCoin" + }, { "name": "Chandra's Tome", "description": "Draft a Chandra themed card that can be cast with mana of any color.", diff --git a/forge-gui/res/adventure/Shandalar/world/red.json b/forge-gui/res/adventure/Shandalar/world/red.json index 1ee4ebf3fa9..6229fec8041 100644 --- a/forge-gui/res/adventure/Shandalar/world/red.json +++ b/forge-gui/res/adventure/Shandalar/world/red.json @@ -34,6 +34,10 @@ "Axgard Dwarf", "Berserker", "Boggart", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Cyclops", "Devil", "Dinosaur", diff --git a/forge-gui/res/adventure/Shandalar/world/waste.json b/forge-gui/res/adventure/Shandalar/world/waste.json index e45e78b6444..031c87b8b0d 100644 --- a/forge-gui/res/adventure/Shandalar/world/waste.json +++ b/forge-gui/res/adventure/Shandalar/world/waste.json @@ -29,6 +29,10 @@ ], "enemies": [ "Bandit", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "ClayGolem", "Construct", "Eldrazi", diff --git a/forge-gui/res/adventure/Shandalar/world/white.json b/forge-gui/res/adventure/Shandalar/world/white.json index d5f4f952195..4af9fbf36a5 100644 --- a/forge-gui/res/adventure/Shandalar/world/white.json +++ b/forge-gui/res/adventure/Shandalar/world/white.json @@ -35,6 +35,10 @@ "Beastmaster", "Cat", "Cathar", + "Challenger 1", + "Challenger 2", + "Challenger 3", + "Challenger 4", "Cleric", "Dawnhart Witch", "Eldraine Knight", From 8675affd018c08168611a677786000982bd29f09 Mon Sep 17 00:00:00 2001 From: jjayers99 <56438137+jjayers99@users.noreply.github.com> Date: Thu, 9 Mar 2023 17:50:29 -0500 Subject: [PATCH 11/14] Sprite fix --- .../Shandalar/sprites/boss/chandra.png | Bin 19368 -> 19191 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/forge-gui/res/adventure/Shandalar/sprites/boss/chandra.png b/forge-gui/res/adventure/Shandalar/sprites/boss/chandra.png index bedbae8d9d5acc090284b4667ad48708e7847944..415f2e6327bca92cf5e82c3fff01bd99a32c7738 100644 GIT binary patch delta 15287 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 Ye>ca214nN9iU0rr07*qoM6N<$f-QvcZ2$lO From 5748d09b54a4183c4e54893b77753cf0006992cb Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 10 Mar 2023 09:18:43 +0800 Subject: [PATCH 12/14] fix particle effect initial position - move the offset calculation inside MapActor --- .../forge/adventure/character/MapActor.java | 20 ++++++++++++++++--- .../src/forge/adventure/stage/MapStage.java | 4 +--- .../src/forge/adventure/stage/WorldStage.java | 4 +--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/character/MapActor.java b/forge-gui-mobile/src/forge/adventure/character/MapActor.java index 304b8a2d52c..ffe50e1e676 100644 --- a/forge-gui-mobile/src/forge/adventure/character/MapActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/MapActor.java @@ -63,6 +63,7 @@ public class MapActor extends Actor { { ParticleEffect effect = new ParticleEffect(); effect.load(Config.instance().getFile(path),Config.instance().getFile(path).parent()); + effect.setPosition(getCenterX(), getCenterY()); effects.add(new CurrentEffect(path, effect, offset, overlay)); if(duration!=0)//ParticleEffect.setDuration uses an integer for some reason { @@ -147,16 +148,29 @@ public class MapActor extends Actor { effect.effect.draw(batch); } } + float getCenterX() { + float scale = 1f; + if (this instanceof EnemySprite) { + scale = ((EnemySprite) this).getData().scale; + } + return getX()+(getWidth()*scale)/2; + } + float getCenterY() { + float scale = 1f; + if (this instanceof EnemySprite) { + scale = ((EnemySprite) this).getData().scale; + } + return getY()+(getHeight()*scale)/2; + } + @Override public void act(float delta) { super.act(delta); - - for(int i=0;i Date: Thu, 9 Mar 2023 22:55:57 -0500 Subject: [PATCH 13/14] Adv: Additional Challenger enemy decks --- .../src/forge/adventure/data/EnemyData.java | 7 + .../decks/challenger_20_allied_fires.dck | 29 ++ .../decks/challenger_20_cavalcade_charge.dck | 18 + .../decks/challenger_20_final_adventure.dck | 24 ++ .../decks/challenger_20_flash_of_ferocity.dck | 23 ++ .../decks/challenger_21_azorius_control.dck | 26 ++ .../decks/challenger_21_dimir_rogue.dck | 22 ++ .../decks/challenger_21_mono-green_stompy.dck | 22 ++ .../decks/challenger_21_mono-red_aggro.dck | 19 + .../maps/map/main_story/forest_capital.tmx | 7 +- .../maps/map/main_story/island_capital.tmx | 7 +- .../maps/map/main_story/plains_capital.tmx | 7 +- .../maps/map/main_story/swamp_capital.tmx | 7 +- .../maps/map/main_story/templeofchandra.tmx | 32 +- .../maps/map/main_story/templeofliliana.tmx | 328 ++++++++++++++++++ .../res/adventure/Shandalar/world/black.json | 7 +- .../res/adventure/Shandalar/world/blue.json | 7 +- .../adventure/Shandalar/world/enemies.json | 115 ++---- .../res/adventure/Shandalar/world/green.json | 7 +- .../res/adventure/Shandalar/world/waste.json | 7 +- .../res/adventure/Shandalar/world/white.json | 7 +- 21 files changed, 597 insertions(+), 131 deletions(-) create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_20_allied_fires.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_20_cavalcade_charge.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_20_final_adventure.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_20_flash_of_ferocity.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_21_azorius_control.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_21_dimir_rogue.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_21_mono-green_stompy.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/challenger_21_mono-red_aggro.dck create mode 100644 forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofliliana.tmx diff --git a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java index 6bcce3e2296..669bf67ce2c 100644 --- a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java +++ b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java @@ -2,6 +2,7 @@ package forge.adventure.data; import forge.adventure.util.*; import forge.deck.Deck; +import forge.util.Aggregates; /** * Data class that will be used to read Json configuration files @@ -16,6 +17,7 @@ public class EnemyData { public String ai; public boolean boss = false; public boolean flying = false; + public boolean randomizeDeck = false; public float spawnRate; public float difficulty; public float speed; @@ -36,6 +38,7 @@ public class EnemyData { ai = enemyData.ai; boss = enemyData.boss; flying = enemyData.flying; + randomizeDeck = enemyData.randomizeDeck; spawnRate = enemyData.spawnRate; copyPlayerDeck = enemyData.copyPlayerDeck; difficulty = enemyData.difficulty; @@ -59,6 +62,10 @@ public class EnemyData { } public Deck generateDeck(boolean isFantasyMode, boolean useGeneticAI) { + if (randomizeDeck) + { + return CardUtil.getDeck(Aggregates.random(deck), true, isFantasyMode, colors, life > 13, life > 16 && useGeneticAI); + } return CardUtil.getDeck(deck[Current.player().getEnemyDeckNumber(this.name, deck.length)], true, isFantasyMode, colors, life > 13, life > 16 && useGeneticAI); } } diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_20_allied_fires.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_20_allied_fires.dck new file mode 100644 index 00000000000..a00f6b581ef --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_20_allied_fires.dck @@ -0,0 +1,29 @@ +[metadata] +Name=challenger_20_allied_fires +[Main] +2 Banishing Light|SCD|1 +3 Deafening Clarion|GRN|1 +2 Drawn from Dreams|NCC|1 +2 Fae of Wishes|ELD|1 +4 Fires of Invention|ELD|1 +4 Interplanar Beacon|WAR|1 +5 Island|MID|1 +3 Kasmina, Enigmatic Mentor|WAR|1 +1 Kenrith, the Returned King|ELD|1 +2 Mountain|MID|1 +4 Narset, Parter of Veils|SLD|1 +4 Omen of the Sea|J21|1 +2 Plains|MID|1 +2 Saheeli, Sublime Artificer|SLD|1 +3 Sarkhan the Masterless|SLD|1 +1 Steam Vents|GRN|1 +3 Swiftwater Cliffs|NEO|1 +1 Temple of Enlightenment|VOC|1 +1 Temple of Epiphany|NCC|1 +1 Temple of Triumph|NCC|1 +2 Time Wipe|DMC|1 +3 Tranquil Cove|NEO|1 +1 Ugin, the Ineffable|WAR|1 +4 Wind-Scarred Crag|NEO|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_20_cavalcade_charge.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_20_cavalcade_charge.dck new file mode 100644 index 00000000000..10fb8f53b9a --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_20_cavalcade_charge.dck @@ -0,0 +1,18 @@ +[metadata] +Name=challenger_20_cavalcade_charge +[Main] +4 Bonecrusher Giant|ELD|1 +3 Castle Embereth|ELD|1 +4 Cavalcade of Calamity|RNA|1 +3 Chandra, Acolyte of Flame|M20|1 +1 Embercleave|ELD|1 +4 Fervent Champion|ELD|1 +4 Light Up the Stage|PLIST|1 +18 Mountain|ELD|1 +4 Rimrock Knight|ELD|1 +4 Runaway Steam-Kin|GRN|1 +4 Scorch Spitter|M20|1 +3 Tin Street Dodger|RNA|1 +4 Torbran, Thane of Red Fell|ELD|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_20_final_adventure.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_20_final_adventure.dck new file mode 100644 index 00000000000..a8956bb50ac --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_20_final_adventure.dck @@ -0,0 +1,24 @@ +[metadata] +Name=challenger_20_final_adventure +[Main] +2 Blacklance Paragon|ELD|1 +2 Castle Locthwain|ELD|1 +2 Disfigure|BRO|1 +4 Edgewall Innkeeper|ELD|1 +1 Fabled Passage|ELD|1 +2 Find // Finality|C20|1 +7 Forest|ELD|1 +4 Foulmire Knight|ELD|1 +3 Jungle Hollow|IKO|1 +2 Knight of the Ebon Legion|M20|1 +4 Lovestruck Beast|ELD|1 +4 Lucky Clover|ELD|1 +2 Midnight Reaper|SLD|1 +2 Murderous Rider|ELD|1 +4 Order of Midnight|ELD|1 +4 Smitten Swordmaster|ELD|1 +8 Swamp|ELD|1 +2 Temple of Malady|M21|1 +1 Vraska, Golgari Queen|GRN|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_20_flash_of_ferocity.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_20_flash_of_ferocity.dck new file mode 100644 index 00000000000..50e1e7f2681 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_20_flash_of_ferocity.dck @@ -0,0 +1,23 @@ +[metadata] +Name=challenger_20_flash_of_ferocity +[Main] +1 Brazen Borrower|ELD|1 +4 Brineborn Cutthroat|M20|1 +2 Castle Vantress|ELD|1 +1 Fabled Passage|ELD|1 +8 Forest|M20|1 +4 Frilled Mystic|RNA|1 +8 Island|M20|1 +4 Nightpack Ambusher|M20|1 +4 Opt|ELD|1 +4 Quench|RNA|1 +2 Sinister Sabotage|SCD|1 +4 Spectral Sailor|M20|1 +2 Temple of Mystery|M20|1 +2 Thassa's Intervention|THB|1 +3 Thornwood Falls|M20|1 +2 Unsummon|M20|1 +1 Wavebreak Hippocamp|THB|1 +4 Wildborn Preserver|ELD|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_21_azorius_control.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_21_azorius_control.dck new file mode 100644 index 00000000000..75fa1bc0e72 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_21_azorius_control.dck @@ -0,0 +1,26 @@ +[metadata] +Name=Challenger_21_Azorius_Control +[Main] +2 Archon of Sun's Grace|J22|1 +2 Banishing Light|KHC|1 +2 Behold the Multiverse|KHM|1 +1 Doomskar|KHM|1 +2 Dream Trawler|THB|1 +3 Elspeth Conquers Death|THB|1 +1 Emeria's Call|ZNR|1 +2 Glass Casket|J21|1 +8 Island|KHM|1 +1 Negate|STA|1 +3 Neutralize|J21|1 +4 Omen of the Sea|J21|1 +8 Plains|KHM|1 +1 Saw It Coming|KHM|1 +1 Shark Typhoon|SLC|1 +2 Shatter the Sky|THB|1 +2 Skyclave Cleric|ZNR|1 +4 Temple of Enlightenment|VOC|1 +4 The Birth of Meletis|THB|1 +3 Thirst for Meaning|THB|1 +4 Tranquil Cove|KHC|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_21_dimir_rogue.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_21_dimir_rogue.dck new file mode 100644 index 00000000000..38791f6d723 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_21_dimir_rogue.dck @@ -0,0 +1,22 @@ +[metadata] +Name=Challenger_21_Dimir_Rogue +[Main] +2 Blackbloom Rogue|ZNR|1 +2 Bloodchief's Thirst|ZNR|1 +4 Dismal Backwater|MB1|1 +4 Drown in the Loch|ELD|1 +2 Eliminate|M21|1 +2 Heartless Act|IKO|1 +8 Island|ELD|1 +1 Malakir Rebirth|ZNR|1 +4 Merfolk Windrobber|ZNR|1 +3 Nighthawk Scavenger|ZNR|1 +1 Rankle, Master of Pranks|ELD|1 +4 Soaring Thought-Thief|ZNR|1 +9 Swamp|ELD|1 +4 Temple of Deceit|THB|1 +4 Thieves' Guild Enforcer|M21|1 +3 Vantress Gargoyle|ELD|1 +3 Zareth San, the Trickster|ZNR|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_21_mono-green_stompy.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_21_mono-green_stompy.dck new file mode 100644 index 00000000000..b7a9cc062f1 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_21_mono-green_stompy.dck @@ -0,0 +1,22 @@ +[metadata] +Name=challenger_21_mono-green_stompy +[Main] +19 Forest|ELD|1 +1 Garruk, Unleashed|M21|1 +2 Gemrazer|IKO|1 +3 Kazandu Mammoth|ZNR|1 +4 Lovestruck Beast|ELD|1 +3 Primal Might|M21|1 +4 Ram Through|IKO|1 +2 Scavenging Ooze|NCC|1 +2 Snakeskin Veil|KHM|1 +2 Stonecoil Serpent|ELD|1 +3 Swarm Shambler|ZNR|1 +2 Syr Faren, the Hengehammer|ELD|1 +3 Thrashing Brontodon|M21|1 +2 Turntimber Symbiosis|ZNR|1 +2 Wildborn Preserver|ELD|1 +4 Wildwood Tracker|ELD|1 +2 Yorvo, Lord of Garenbrig|ELD|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/decks/challenger_21_mono-red_aggro.dck b/forge-gui/res/adventure/Shandalar/decks/challenger_21_mono-red_aggro.dck new file mode 100644 index 00000000000..b5a4fb136a6 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/decks/challenger_21_mono-red_aggro.dck @@ -0,0 +1,19 @@ +[metadata] +Name=challenger_21_mono-red_aggro +[Main] +4 Akoum Hellhound|ZNR|1 +4 Anax, Hardened in the Forge|PLIST|1 +4 Bonecrusher Giant|PLIST|1 +2 Castle Embereth|NCC|1 +1 Embercleave|ELD|1 +4 Fervent Champion|ELD|1 +4 Kargan Intimidator|ZNR|1 +16 Mountain|ZNR|1 +4 Rimrock Knight|ELD|1 +4 Roil Eruption|ZNR|1 +2 Shatterskull Smashing|ZNR|1 +4 Shock|STA|1 +4 Spikefield Hazard|ZNR|1 +3 Torbran, Thane of Red Fell|ELD|1 +[Sideboard] + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx index 713a15abacb..61e233104ff 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/forest_capital.tmx @@ -148,10 +148,9 @@ "Bear", "Centaur", "Centaur Warrior", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "Dino", "Eldraine Faerie", "Elf", diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx index 8bdd429a42b..d2305cd13b4 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/island_capital.tmx @@ -131,10 +131,9 @@ "enemyPool":[ "Bird", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "Djinn", "Elemental", "Merfolk", diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx index a2d4bdc4313..dcf6c657a33 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/plains_capital.tmx @@ -132,10 +132,9 @@ "Archer", "Cat", "Cathar", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "Cleric", "Dawnhart Witch", "Eldraine Knight", diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx index 239cb932eb2..189e522e957 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/swamp_capital.tmx @@ -60,10 +60,9 @@ "Black Wiz1", "Black Wiz2", "Black Wiz3", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "Dark Knight", "Death Knight", "Demon", diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx index ac810a5bf50..ec32f373d84 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx @@ -1,5 +1,5 @@ - + { @@ -708,7 +708,7 @@ { - "startBattleWithCardInCommandZone": [ "Chandra, Supreme Pyromancer" ] + "startBattleWithCardInCommandZone": [ "Fire of Kaladesh" ] } @@ -782,7 +782,7 @@ - [ + [ { "type": "item", "probability": 0.01, @@ -832,9 +832,7 @@ "startBattleWithCard": [ "Lightning Coils" ] } - - - [ + [ { "type": "item", "probability": 0.01, @@ -843,6 +841,8 @@ } ] + + @@ -1511,6 +1511,26 @@ + + + { + "startBattleWithCardInCommandZone": [ "Chandra, Supreme Pyromancer" ] +} + + + [ + { + "type": "item", + "probability": 0.01, + "count": 1, + "itemName": "Phoenix Charm" + } +] + + + + + diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofliliana.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofliliana.tmx new file mode 100644 index 00000000000..d51555302a8 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofliliana.tmx @@ -0,0 +1,328 @@ + + + + + { + "startBattleWithCard": [ "Hall of Flame" ], +} + + + + + + + +4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107, +4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107, +4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107, +4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107,4107, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,240,240,240,240,240,240,240,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,240,240,240,240,240,240,240,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,240,240,240,240,240,240,240,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,1352,1352,1824,240,1823,1826,1826,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,1984,1984,1985,240,1983,1984,1984,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,1984,1984,1985,240,1983,1984,1984,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,1984,1984,1985,240,1983,1984,1984,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,1984,1984,1985,240,1983,1984,1984,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2142,2142,1982,240,1981,2142,2142,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,240,240,240,240,240,240,240,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,240,240,240,240,240,240,240,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,6488,6489,6489,6489,6489,6490,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,6646,6647,6647,6647,6647,6648,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,6646,6647,6647,6647,6647,6648,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,6646,6647,6647,6647,6647,6648,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,6646,6647,6647,6647,6647,6648,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,6804,6805,6805,6805,6805,6806,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904, +2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904,2904 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2946,2946,2946,2946,2946,2946,2946,2946,2471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2946,2946,2946,2946,2946,2946,2946,2946,2471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2314,2315,2946,2946,2946,2946,2313,2314,3105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2473,2946,2946,2946,2946,2471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3103,2315,2946,2946,2313,3105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2945,2946,2946,2471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3103,2315,2313,3105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2945,2947,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3103,3105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4355,4355,4355,4355,4355,4355,4355,4037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,4194,4195,0,6014,5857,5857,6015,6014,5857,5857,6015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,4194,4195,0,5700,5387,0,0,0,0,5544,5698,0,0,0,0,0,0,605,448,448,607,0,605,606,606,607,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4355,4355,4355,4355,4355,4355,4356,4194,4194,4194,4194,4194,4194,4038,4353,0,5700,7756,0,0,0,0,5544,5698,0,0,0,605,607,0,291,764,764,289,0,291,764,764,765,0,605,607, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,3568,4194,4194,4194,4194,4194,4194,4196,0,0,5700,5387,0,0,0,0,5544,5698,0,0,0,921,1074,606,449,764,764,447,606,449,764,764,447,606,1078,923, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,3568,4194,4194,4194,4194,4194,4038,4353,0,0,5700,5230,0,0,0,0,5544,5698,0,0,0,0,291,764,764,764,764,764,764,764,764,764,764,764,765,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,3568,4194,4194,4194,4194,4194,4195,0,0,0,5700,7755,0,5869,0,0,0,5698,0,0,0,0,291,764,764,764,764,764,764,764,764,764,764,764,765,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,3568,3568,4194,4194,4194,4038,4353,0,0,0,5700,0,0,0,0,0,0,5698,0,0,0,0,291,764,764,764,764,764,764,764,764,764,764,764,765,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,4194,4194,4194,4194,4194,4196,0,0,0,0,6172,5541,5541,5541,5541,5541,5541,6173,0,0,0,0,763,764,764,764,764,764,764,764,764,764,764,764,765,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,4194,4194,4194,4194,4194,4196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,921,922,132,132,132,132,132,132,132,132,132,132,923,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4351,4040,4194,4194,4194,4194,4194,4194,4194,4194,4194,4194,4196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,4194,4194,4194,4194,4196,1208,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1210, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4351,4039,4040,4194,4194,4194,4194,4194,4194,4194,4038,4353,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4351,4039,4040,4194,4038,4039,4039,4039,4353,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4351,4352,4353,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +3057,3057,3057,3057,2739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +2422,2422,2422,2422,2897,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +2422,2422,2422,2422,3056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,3454,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +2422,2422,2422,2422,2422,2897,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +2741,0,3054,2742,2422,2897,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1523,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3454,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2900,2422,2897,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2900,2422,2897,0,0,0,4035,4036,4036,4036,4036,4036,4037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2900,2422,2897,0,0,0,4193,4194,4194,4194,4194,4194,4195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,3058,2422,2897,0,0,0,4193,4194,4194,4038,4039,4040,4195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,2900,2422,2422,2897,0,0,4035,4356,4194,4038,4353,0,4198,4195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,2900,2422,2422,2897,0,0,4193,4194,4194,4196,0,0,4198,4195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2742,2422,2897,0,4035,4356,4194,4038,4353,0,0,4198,4195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5701,0,0,0,0,0,0,0,0,1365, +0,0,0,2895,2422,2897,0,4193,3882,4194,4195,0,0,0,4198,4195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2895,2422,2897,0,4351,4040,4194,4195,0,0,0,4198,4195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2895,2422,2897,0,0,4193,4194,4195,4035,4037,0,4198,4195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2895,2422,2897,0,0,4193,4194,4354,4356,4354,4355,4356,4195,0,0,2271,2272,2273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2895,2422,2897,0,0,4351,4040,4194,4194,4194,4194,4038,4353,0,0,2429,2430,2431,0,0,2271,2272,2273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,2895,2422,2897,0,0,0,0,4040,4194,4194,4038,4353,0,0,0,2587,2588,2589,0,0,2429,2430,2431,0,0,0,0,0,0,0,5701,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1365, +0,0,0,3053,3054,3055,0,0,0,0,4351,4352,4352,4353,0,0,0,4034,0,0,0,0,0,2587,2588,2589,0,0,0,0,0,1051,1051,1051,1051,1051,1051,1051,1051,1052,0,0,0,1050,1051,1051,1051,1051,1051,1051,1051,1051,1052,0,1050,1051,1051,1051,1051,1526, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4355,4355,4355,4355,4355,4355,4355,4037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4194,4194,4195,0,0,0,0,0,0,0,0,0,2271,2272,2273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4035,4036,4036,4036,4036,4037,0,0,0,0,0,4034,0,2271,2272,2273,4193,4194,4194,4194,4194,4194,4194,4194,4195,0,0,0,0,0,0,0,0,0,2429,2430,2431,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4198,4194,4194,4194,4194,4354,0,0,0,0,0,0,0,2429,2430,2431,4193,4194,4194,4194,4194,4194,4194,4038,4353,0,0,0,0,0,0,0,0,0,2587,2588,2589,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4198,4194,4194,4194,4194,4194,4354,4036,4037,0,0,0,0,2587,2588,2589,4193,4194,4194,4194,4194,4194,4194,4196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2271,2272,2273,0,0,0, +0,0,0,4351,4040,4194,4194,4194,4194,4194,4194,4195,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4038,4353,0,0,2271,2272,2273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2429,2430,2431,0,0,0, +0,0,0,0,4351,4040,4194,4194,4194,4194,4194,4195,0,0,0,0,0,0,0,4193,4194,4194,4194,4194,4194,4195,0,0,0,2429,2430,2431,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2587,2588,2589,0,0,0, +0,0,0,0,0,4351,4039,4039,4039,4039,4039,4353,0,2271,2272,2273,0,0,0,4351,4040,4194,4194,4194,4038,4353,0,0,0,2587,2588,2589,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,2429,2430,2431,0,0,0,0,4193,4194,4194,4038,4353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,2587,2588,2589,0,0,0,0,4351,4039,4039,4353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + +2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374, +2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374, +2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374, +2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374,2374, +0,0,0,0,0,0,0,0,1365,0,0,0,0,0,0,0,0,532,0,12625,12626,0,0,0,0,0,0,12625,12626,0,534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3654,3811,3809,3812,3809,3811,3653,3176,3176,3652,0, +0,0,0,12515,12516,0,0,0,1365,0,0,0,0,0,0,0,0,532,0,12653,12654,0,0,0,0,0,0,12653,12654,0,534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,3969,3970,3971,0,3650,3176,3176,3652,0, +1051,1210,0,12543,12544,0,1208,1051,1526,0,0,0,0,0,0,0,0,690,691,691,691,691,691,691,691,691,691,691,691,691,692,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,4285,4133,4287,0,3650,3176,3176,3652,0, +0,1365,12428,0,0,12428,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,0,4130,0,0,3650,3176,3176,3652,0, +0,1524,1210,0,0,1208,1526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,0,4130,0,0,3650,3176,3176,3652,0, +0,0,1365,0,0,1365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,0,4130,0,0,3650,3176,3176,3652,0, +0,0,1523,0,0,1523,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,0,4130,0,0,3650,3176,3176,3652,0, +0,0,12428,0,0,12428,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,0,4130,0,0,3650,3176,3176,3652,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,0,4288,0,0,3650,3176,3176,3652,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3652,0,0,12436,0,0,3650,3176,3176,3652,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3650,3176,3176,3496,3493,3493,3493,3493,3493,3495,3176,3176,3652,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10493,10494,0,0,0,0,0,0,0,0,0,0,3808,3809,3809,3812,3809,3809,3812,3809,3809,3812,3809,3809,3810,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10493,10494,0,0,0,2345,0,2345,0,0,0,2345,0,2345,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2345,0,2345,0,0,0,2345,0,2345,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2345,0,2345,0,2345,0,2345,0,2345,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2345,0,2345,0,2345,0,2345,0,2345,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2345,0,2345,0,2345,0,2345,0,2345,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2345,0,2345,0,2345,0,2345,0,2345,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2345,0,0,0,2345,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3313,3309,3314,3315, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3474,3467,3475,3476, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3925,3927,0,0,0,0,0,11557,0,0,0,11557,0,0,3471,3467,3470,3631, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12625,12626,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3924,0,0,0,0,0,4241,4243,0,0,0,0,0,11585,0,0,0,11585,0,3307,3629,3630,3631,0, +0,0,0,0,0,0,10491,10492,0,0,0,0,0,0,0,0,0,12653,12654,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10825,11585,10825,10825,9066,0,0,0,0,0,0,0,0,11529,0,0,0,0,0,0,0,0, +375,375,375,375,376,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10825,10825,10881,10881,10825,0,10825,0,0,0,10825,0,0,0,0,0,0,0,0,0,0,0,0,3307,0,0,0,0, +0,0,0,0,534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10825,0,0,0,10825,0,9066,0,0,0,11613,10825,10825,10304,10305,10306,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,694,376,0,0,0,0,0,0,0,12625,12626,0,0,0,0,0,0,0,0,0,0,0,0,10591,10592,0,0,0,10825,0,0,0,11557,10825,10825,10825,0,0,11557,0,10825,10332,10333,10334,0,0,0,0,0,3308,3309,3309,3309,3309,3314,3315, +0,0,0,0,0,534,0,0,0,0,0,0,0,12653,12654,0,0,0,0,0,0,0,0,0,0,0,0,10619,10620,0,0,0,10825,0,10825,0,0,0,0,0,0,0,10825,0,10881,0,0,0,0,10825,10881,0,3308,3309,3467,3467,3467,3467,3475,3476, +853,0,852,537,533,534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8908,0,0,0,1383,0,0,0,0,0,0,0,3307,0,0,9067,10825,10825,10825,0,9066,0,0,0,0,0,0,0,3466,3467,3470,3625,3466,3467,3470,3631, +0,0,0,532,0,534,0,0,0,0,0,0,0,0,0,0,0,0,1227,1069,1069,1069,1069,1069,1069,1069,1069,1069,1226,1069,1069,1070,0,0,0,0,10825,10825,0,10825,0,0,0,0,10825,0,0,0,10881,0,0,3308,3623,3464,3626,0,3629,3630,3631,0, +0,0,9065,532,0,534,0,0,0,0,0,0,0,0,0,0,0,0,1383,0,0,0,0,0,0,0,0,0,0,0,0,10825,10825,10825,0,0,9067,10825,0,11557,0,10941,10942,0,10825,0,0,11557,0,0,10825,3466,3467,3468,0,0,0,0,0,0, +0,0,0,532,0,534,0,0,0,0,0,0,0,0,0,0,0,0,1383,0,3925,3926,3927,0,0,0,3925,3926,3927,0,0,10825,9066,10825,0,0,9065,9066,0,10882,0,10969,10970,0,10881,0,0,10826,0,0,10825,3624,3625,3626,10703,10704,0,3306,0,0, +0,0,374,695,0,534,0,0,0,0,0,0,0,0,0,0,0,0,1383,0,4083,4084,4085,0,0,0,4083,4084,4085,0,0,0,0,0,0,0,10825,10825,0,10825,0,0,0,0,10825,0,0,0,0,0,10853,3313,3315,0,10731,10732,0,0,0,0, +0,0,532,0,0,534,0,0,0,0,0,0,5701,0,0,0,1227,1069,1386,0,4241,4242,4243,0,0,0,4241,4242,4243,0,0,10825,10825,11585,0,0,0,0,0,10853,11613,0,0,10825,10854,0,0,10825,10825,10882,10825,3466,3312,3310,0,0,0,0,3307,0, +0,0,532,0,0,534,0,0,0,0,0,0,0,0,0,0,1383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10825,0,0,0,0,0,0,0,0,0,0,0,10881,10825,0,0,3629,3465,3473,0,0,0,0,0,0, +0,0,690,537,0,534,0,0,0,8693,0,0,0,0,0,0,1383,0,0,0,0,0,0,3925,3926,3927,0,0,0,0,3933,3934,3935,10881,10882,10826,0,0,0,10853,3924,10825,10826,0,0,0,10854,0,10825,0,0,3313,3623,3473,0,0,0,1232,3307,0, +0,0,9065,532,0,534,0,0,0,0,0,4743,4744,0,1711,1713,1540,0,0,0,0,0,0,4083,4084,4085,0,0,0,0,4091,4092,4093,11613,0,0,0,0,10825,10882,0,0,0,0,0,0,10825,9065,0,0,0,3629,3630,3626,10825,10825,10825,1390,0,0, +0,0,0,532,0,534,0,0,0,0,0,4901,4902,0,0,0,1383,0,0,3925,3926,3927,0,4241,4242,4243,0,0,0,0,4249,4250,4251,0,11529,0,0,0,10825,10826,0,0,0,10825,11585,0,0,0,0,0,0,10853,10825,10825,0,0,0,1390,0,0, +0,0,0,532,0,534,0,0,0,0,0,0,0,0,0,0,1383,0,0,4083,4084,4085,0,0,0,0,0,0,0,0,0,0,0,10825,0,11585,10825,0,0,0,0,0,0,0,0,0,10825,10881,10825,0,10826,0,10825,0,10825,10881,0,1390,0,0, +0,0,0,532,0,534,0,0,0,0,0,0,0,0,0,0,1383,0,0,4241,4242,4243,0,0,0,0,0,0,0,0,1523,0,0,0,0,0,10825,0,9067,10825,10826,1232,0,10825,0,0,10825,0,0,0,0,0,10881,1233,1076,1076,1076,1551,10854,0, +0,0,0,532,0,534,0,0,0,0,0,5547,0,8695,0,0,1383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11557,0,10825,0,0,1390,0,10881,10882,0,10826,9065,9065,10826,10825,10825,3307,1390,0,0,0,0,0,0, +0,0,0,532,533,534,0,0,0,0,0,5547,5547,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1207,0,0,0,0,0,0,11557,10825,10826,0,1390,0,0,10825,10854,10853,0,0,0,0,0,0,1390,0,11557,11585,11557,0,0, +0,0,0,690,691,692,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1524,3925,3926,3926,3927,0,0,0,0,0,10608,1390,10608,0,0,0,0,0,0,0,0,0,0,1390,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4083,4081,4082,4085,0,0,0,0,0,0,1390,0,3308,3309,3310,0,0,0,0,0,0,0,1390,0,0,0,0,0,3308, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4083,4239,4240,4085,0,0,0,0,0,0,1390,0,3466,3467,3468,0,3308,3309,3310,1233,1076,1076,1551,0,0,0,0,3313,3311, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9071,0,0,0,0,0,0,4241,4087,4242,4243,0,0,0,0,0,0,1390,0,3624,3625,3626,0,3466,3467,3468,1390,0,0,3316,3317,3317,3309,3309,3311,3467, +0,0,0,0,0,9333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5547,0,0,0,0,0,0,0,0,0,4247,4248,0,0,0,0,0,0,0,0,1390,0,0,0,0,0,3624,3625,3626,1390,0,0,3629,3465,3475,3475,3475,3475,3475, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3930,3934,3928,4090,0,0,0,0,0,0,0,0,0,1390,0,3306,0,0,0,0,0,0,1390,3313,3315,0,3629,3633,3465,3475,3475,3475, +0,0,0,0,0,0,0,9333,9484,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5549,0,0,3925,4240,4089,4081,4248,0,0,0,1233,1076,1076,1076,1076,1076,1550,1076,1076,1076,1076,1076,1076,1076,1076,1393,3629,3628,3317,3315,0,3474,3475,3475,3475, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5547,0,0,0,3925,4240,4084,4087,4248,0,0,0,0,1390,0,3308,3309,3310,0,0,3308,3309,3310,0,0,0,0,0,1549,1235,3629,3630,3628,3317,3623,3475,3475,3475, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4083,4084,4084,4085,0,0,0,0,0,1390,0,3466,3467,3468,0,0,3466,3467,3468,0,0,0,0,0,3306,1390,0,0,3471,3475,3475,3475,3475,3470, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4083,4084,4084,4085,0,0,0,0,0,1390,0,3624,3625,3626,0,0,3624,3625,3626,0,0,3313,3314,3314,3315,1390,0,0,3632,3633,3630,3630,3633,3634, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3930,4240,4084,4084,4085,0,0,134,3122,2652,3282,2652,3123,134,0,0,0,0,0,0,0,0,3471,3467,3467,3473,1549,1076,1076,1076,1076,1077,0,3313,3314, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4083,4084,4084,4084,4085,0,0,3122,3126,2810,2810,2810,3127,3123,0,0,0,0,0,0,0,0,3471,3467,3467,3312,3314,3314,3314,3314,3314,3314,3314,3311,3475 + + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12436,0,0,0,12436,0,0,0,12436,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12436,0,0,0,12436,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12395,0,0,12401,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12428,12378,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/forge-gui/res/adventure/Shandalar/world/black.json b/forge-gui/res/adventure/Shandalar/world/black.json index 9c43cc2f5a5..50c34b51309 100644 --- a/forge-gui/res/adventure/Shandalar/world/black.json +++ b/forge-gui/res/adventure/Shandalar/world/black.json @@ -40,10 +40,9 @@ "Black Wiz1", "Black Wiz2", "Black Wiz3", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "Dark Knight", "Death Knight", "Demon", diff --git a/forge-gui/res/adventure/Shandalar/world/blue.json b/forge-gui/res/adventure/Shandalar/world/blue.json index 3e2fc8d7fd3..38d63411f8a 100644 --- a/forge-gui/res/adventure/Shandalar/world/blue.json +++ b/forge-gui/res/adventure/Shandalar/world/blue.json @@ -30,10 +30,9 @@ "enemies": [ "Aether Channeler", "Bird", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "Djinn", "Elemental", "Frost Titan", diff --git a/forge-gui/res/adventure/Shandalar/world/enemies.json b/forge-gui/res/adventure/Shandalar/world/enemies.json index c28ef878ac0..49a3e83430b 100644 --- a/forge-gui/res/adventure/Shandalar/world/enemies.json +++ b/forge-gui/res/adventure/Shandalar/world/enemies.json @@ -1604,12 +1604,17 @@ "colors": "GW" }, { - "name": "Challenger 1", + "name": "Challenger 20", + "nameOverride": "Challenger", "sprite": "sprites/doppelganger.atlas", "deck": [ - "decks/challenger_22_dimir_control.dck" + "decks/challenger_20_allied_fires.dck", + "decks/challenger_20_cavalcade_charge.dck", + "decks/challenger_20_final_adventure.dck", + "decks/challenger_20_flash_of_ferocity.dck" ], - "spawnRate": 0.0625, + "randomizeDeck": true + "spawnRate": 0.25, "difficulty": 0.25, "speed": 28, "life": 22, @@ -1679,15 +1684,20 @@ "itemName": "Challenge Coin" } ], - "colors": "UB" + "colors": "UBRWG" }, { - "name": "Challenger 2", + "name": "Challenger 21", + "nameOverride": "Challenger", "sprite": "sprites/doppelganger.atlas", "deck": [ - "decks/challenger_22_gruul_stompy.dck" + "decks/challenger_21_azorius_control.dck", + "decks/challenger_21_dimir_rogue.dck", + "decks/challenger_21_mono-green_stompy.dck", + "decks/challenger_21_mono-red_aggro.dck" ], - "spawnRate": 0.0625, + "randomizeDeck": true + "spawnRate": 0.25, "difficulty": 0.25, "speed": 28, "life": 22, @@ -1757,93 +1767,20 @@ "itemName": "Challenge Coin" } ], - "colors": "GR" + "colors": "UBRWG" }, { - "name": "Challenger 3", - "sprite": "sprites/doppelganger.atlas", - "deck": [ - "decks/challenger_22_mono_white_aggro.dck" - ], - "spawnRate": 0.0625, - "difficulty": 0.25, - "speed": 28, - "life": 22, - "rewards": [ - { - "type": "deckCard", - "probability": 1, - "count": 2, - "addMaxCount": 4, - "rarity": [ - "common" - ] - }, - { - "type": "deckCard", - "probability": 0.5, - "count": 1, - "addMaxCount": 2, - "rarity": [ - "uncommon" - ], - "cardTypes": [ - "Creature", - "Artifact", - "Enchantment", - "Instant", - "Sorcery" - ] - }, - { - "type": "deckCard", - "probability": 0.25, - "count": 1, - "addMaxCount": 1, - "rarity": [ - "rare" - ], - "cardTypes": [ - "Creature", - "Artifact", - "Enchantment", - "Instant", - "Sorcery" - ] - }, - { - "type": "deckCard", - "probability": 0.1, - "count": 1, - "rarity": [ - "rare" - ], - "cardTypes": [ - "Land" - ] - }, - { - "type": "gold", - "probability": 0.3, - "count": 210, - "addMaxCount": 90 - }, - { - "type": "item", - "probability": 1, - "count": 1, - "itemName": "Challenge Coin" - } - ], - "colors": "W" -}, -{ - "name": "Challenger 4", + "name": "Challenger 22", + "nameOverride": "Challenger", "sprite": "sprites/doppelganger.atlas", "deck": [ + "decks/challenger_22_dimir_control.dck", + "decks/challenger_22_gruul_stompy.dck", + "decks/challenger_22_mono_white_aggro.dck", "decks/challenger_22_rakdos_vampires.dck" ], - "spawnRate": 0.0625, + "randomizeDeck": true + "spawnRate": 0.25, "difficulty": 0.25, "speed": 28, "life": 22, @@ -1913,7 +1850,7 @@ "itemName": "Challenge Coin" } ], - "colors": "BR" + "colors": "UBRWG" }, { "name": "Chandra", diff --git a/forge-gui/res/adventure/Shandalar/world/green.json b/forge-gui/res/adventure/Shandalar/world/green.json index 84a539d9905..2b1fbff71c5 100644 --- a/forge-gui/res/adventure/Shandalar/world/green.json +++ b/forge-gui/res/adventure/Shandalar/world/green.json @@ -38,10 +38,9 @@ "Beastmaster", "Centaur", "Centaur Warrior", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "Dino", "Eldraine Faerie", "Elf", diff --git a/forge-gui/res/adventure/Shandalar/world/waste.json b/forge-gui/res/adventure/Shandalar/world/waste.json index 031c87b8b0d..771d29f0802 100644 --- a/forge-gui/res/adventure/Shandalar/world/waste.json +++ b/forge-gui/res/adventure/Shandalar/world/waste.json @@ -29,10 +29,9 @@ ], "enemies": [ "Bandit", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "ClayGolem", "Construct", "Eldrazi", diff --git a/forge-gui/res/adventure/Shandalar/world/white.json b/forge-gui/res/adventure/Shandalar/world/white.json index 4af9fbf36a5..3c92e3f67a9 100644 --- a/forge-gui/res/adventure/Shandalar/world/white.json +++ b/forge-gui/res/adventure/Shandalar/world/white.json @@ -35,10 +35,9 @@ "Beastmaster", "Cat", "Cathar", - "Challenger 1", - "Challenger 2", - "Challenger 3", - "Challenger 4", + "Challenger 20", + "Challenger 21", + "Challenger 22", "Cleric", "Dawnhart Witch", "Eldraine Knight", From 3991b6d081d3fe20d58653c2351e5007156e410f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 10 Mar 2023 14:12:02 +0800 Subject: [PATCH 14/14] fix EnemyData loading issues --- .../src/forge/adventure/data/EnemyData.java | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java index 669bf67ce2c..4237be00b35 100644 --- a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java +++ b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java @@ -11,6 +11,7 @@ import forge.util.Aggregates; */ public class EnemyData { public String name; + public String nameOverride; public String sprite; public String[] deck; public boolean copyPlayerDeck = false; @@ -28,42 +29,44 @@ public class EnemyData { public String colors = ""; public EnemyData nextEnemy; - public int teamNumber=-1; + public int teamNumber = -1; + + public EnemyData() { + } - public EnemyData() { } public EnemyData(EnemyData enemyData) { - name = enemyData.name; - sprite = enemyData.sprite; - deck = enemyData.deck; - ai = enemyData.ai; - boss = enemyData.boss; - flying = enemyData.flying; - randomizeDeck = enemyData.randomizeDeck; - spawnRate = enemyData.spawnRate; - copyPlayerDeck = enemyData.copyPlayerDeck; - difficulty = enemyData.difficulty; - speed = enemyData.speed; - scale = enemyData.scale; - life = enemyData.life; - equipment = enemyData.equipment; - colors = enemyData.colors; - teamNumber = enemyData.teamNumber; - nextEnemy =enemyData.nextEnemy==null?null: new EnemyData(enemyData.nextEnemy); - if(enemyData.scale == 0.0f) { - scale =1.0f; + name = enemyData.name; + sprite = enemyData.sprite; + deck = enemyData.deck; + ai = enemyData.ai; + boss = enemyData.boss; + flying = enemyData.flying; + randomizeDeck = enemyData.randomizeDeck; + spawnRate = enemyData.spawnRate; + copyPlayerDeck = enemyData.copyPlayerDeck; + difficulty = enemyData.difficulty; + speed = enemyData.speed; + scale = enemyData.scale; + life = enemyData.life; + equipment = enemyData.equipment; + colors = enemyData.colors; + teamNumber = enemyData.teamNumber; + nextEnemy = enemyData.nextEnemy == null ? null : new EnemyData(enemyData.nextEnemy); + nameOverride = enemyData.nameOverride == null ? "" : enemyData.nameOverride; + if (enemyData.scale == 0.0f) { + scale = 1.0f; } - if(enemyData.rewards == null) { - rewards=null; + if (enemyData.rewards == null) { + rewards = null; } else { rewards = new RewardData[enemyData.rewards.length]; - for(int i=0; i 13, life > 16 && useGeneticAI); } return CardUtil.getDeck(deck[Current.player().getEnemyDeckNumber(this.name, deck.length)], true, isFantasyMode, colors, life > 13, life > 16 && useGeneticAI);