Merge branch 'master' into AI_ATTACK_TIMEOUT

This commit is contained in:
kevlahnota
2024-11-29 06:03:51 +08:00
committed by GitHub
125 changed files with 957 additions and 293 deletions

View File

@@ -54,7 +54,7 @@ public enum SpellApiToAi {
.put(ApiType.ChooseSource, ChooseSourceAi.class)
.put(ApiType.ChooseType, ChooseTypeAi.class)
.put(ApiType.Clash, ClashAi.class)
.put(ApiType.ClassLevelUp, AlwaysPlayAi.class)
.put(ApiType.ClassLevelUp, ClassLevelUpAi.class)
.put(ApiType.Cleanup, AlwaysPlayAi.class)
.put(ApiType.Cloak, CloakAi.class)
.put(ApiType.Clone, CloneAi.class)

View File

@@ -0,0 +1,36 @@
package forge.ai.ability;
import forge.ai.SpellAbilityAi;
import forge.ai.SpellApiToAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.staticability.StaticAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
public class ClassLevelUpAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
Card host = sa.getHostCard();
final int level = host.getClassLevel() + 1;
for (StaticAbility stAb : host.getStaticAbilities()) {
if (!stAb.hasParam("AddTrigger") || !stAb.isClassLevelNAbility(level)) {
continue;
}
for (String sTrig : stAb.getParam("AddTrigger").split(" & ")) {
Trigger t = host.getTriggerForStaticAbility(AbilityUtils.getSVar(stAb, sTrig), stAb);
if (t.getMode() != TriggerType.ClassLevelGained) {
continue;
}
SpellAbility effect = t.ensureAbility();
if (!SpellApiToAi.Converter.get(effect.getApi()).doTriggerAI(aiPlayer, effect, false)) {
return false;
}
}
}
return true;
}
}

View File

@@ -2320,6 +2320,11 @@ public class AbilityUtils {
return doXMath(player.getNumRollsThisTurn(), expr, c, ctb);
}
if (sq[0].startsWith("YouRolledThisTurn")) {
int n = calculateAmount(c, sq[0].substring(17), ctb);
return doXMath(Collections.frequency(player.getDiceRollsThisTurn(), n), expr, c, ctb);
}
if (sq[0].equals("YouSurveilThisTurn")) {
return doXMath(player.getSurveilThisTurn(), expr, c, ctb);
}
@@ -3004,7 +3009,7 @@ public class AbilityUtils {
sp.setCardState(original);
list.add(sp);
}
if (tgtCard.isModal()) {
if (tgtCard.isModal() && tgtCard.hasState(CardStateName.Modal)) {
collectSpellsForPlayEffect(list, tgtCard.getState(CardStateName.Modal), controller, withAltCost);
}
}

View File

@@ -143,6 +143,7 @@ public class RollDiceEffect extends SpellAbilityEffect {
StringUtils.join(ignored, ", ")));
}
player.getGame().getAction().notifyOfValue(sa, player, sb.toString(), null);
player.addDieRollThisTurn(naturalRolls);
}
List<Integer> rolls = Lists.newArrayList();

View File

@@ -67,7 +67,7 @@ public class SeekEffect extends SpellAbilityEffect {
pool = CardLists.getValidCards(pool, seekType, source.getController(), source, sa);
}
if (pool.isEmpty()) {
if (!notify.isEmpty()) notify.append("\r\n");
if (notify.length() != 0) notify.append("\r\n");
notify.append(Localizer.getInstance().getMessage("lblSeekFailed", seekType));
continue; // can't find if nothing to seek
}
@@ -88,7 +88,7 @@ public class SeekEffect extends SpellAbilityEffect {
}
}
if (!notify.isEmpty()) {
if (notify.length() != 0) {
game.getAction().notifyOfValue(sa, source, notify.toString(), null);
}
if (!soughtCards.isEmpty()) {

View File

@@ -526,64 +526,68 @@ public class CostAdjustment {
}
if (st.hasParam("Type")) {
final String type = st.getParam("Type");
if (type.equals("Spell")) {
if (!sa.isSpell()) {
return false;
}
if (st.hasParam("OnlyFirstSpell")) {
if (activator == null ) {
switch (st.getParam("Type")) {
case "Spell" -> {
if (!sa.isSpell()) {
return false;
}
List<Card> list;
if (st.hasParam("ValidCard")) {
list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard, st, controller);
} else {
list = game.getStack().getSpellsCastThisTurn();
}
if (st.hasParam("OnlyFirstSpell")) {
if (activator == null) {
return false;
}
List<Card> list;
if (st.hasParam("ValidCard")) {
list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard, st, controller);
} else {
list = game.getStack().getSpellsCastThisTurn();
}
if (st.hasParam("ValidSpell")) {
list = CardLists.filterAsList(list, CardPredicates.castSA(
SpellAbilityPredicates.isValid(st.getParam("ValidSpell").split(","), controller, hostCard, st))
);
}
if (st.hasParam("ValidSpell")) {
list = CardLists.filterAsList(list, CardPredicates.castSA(
SpellAbilityPredicates.isValid(st.getParam("ValidSpell").split(","), controller, hostCard, st))
);
}
if (CardLists.filterControlledBy(list, activator).size() > 0) {
if (!CardLists.filterControlledBy(list, activator).isEmpty()) return false;
}
}
case "Ability" -> {
if (!sa.isActivatedAbility() || sa.isReplacementAbility()) {
return false;
}
}
} else if (type.equals("Ability")) {
if (!sa.isActivatedAbility() || sa.isReplacementAbility()) {
return false;
}
if (st.hasParam("OnlyFirstActivation")) {
int times = 0;
for (IndividualCostPaymentInstance i : game.costPaymentStack) {
SpellAbility paymentSa = i.getPayment().getAbility();
if (paymentSa.isActivatedAbility() && st.matchesValidParam("ValidCard", paymentSa.getHostCard())) {
times++;
if (times > 1) {
return false;
if (st.hasParam("OnlyFirstActivation")) {
int times = 0;
for (IndividualCostPaymentInstance i : game.costPaymentStack) {
SpellAbility paymentSa = i.getPayment().getAbility();
if (paymentSa.isActivatedAbility() && st.matchesValidParam("ValidCard", paymentSa.getHostCard())) {
times++;
if (times > 1) {
return false;
}
}
}
}
}
} else if (type.equals("NonManaAbility")) {
if (!sa.isActivatedAbility() || sa.isManaAbility() || sa.isReplacementAbility()) {
return false;
case "NonManaAbility" -> {
if (!sa.isActivatedAbility() || sa.isManaAbility() || sa.isReplacementAbility()) {
return false;
}
}
} else if (type.equals("MorphDown")) {
if (!sa.isSpell() || !sa.isCastFaceDown()) {
return false;
case "MorphDown" -> {
if (!sa.isSpell() || !sa.isCastFaceDown()) {
return false;
}
}
} else if (type.equals("Foretell")) {
if (!sa.isForetelling()) {
return false;
}
if (st.hasParam("FirstForetell") && activator.getNumForetoldThisTurn() > 0) {
return false;
case "Foretell" -> {
if (!sa.isForetelling()) {
return false;
}
if (st.hasParam("FirstForetell") && activator.getNumForetoldThisTurn() > 0) {
return false;
}
}
}
}
if (st.hasParam("AffectedZone")) {
List<ZoneType> zones = ZoneType.listValueOf(st.getParam("AffectedZone"));

View File

@@ -100,6 +100,7 @@ public class Player extends GameEntity implements Comparable<Player> {
private int lifeGainedTimesThisTurn;
private int lifeGainedByTeamThisTurn;
private int committedCrimeThisTurn;
private List<Integer> diceRollsThisTurn = Lists.newArrayList();
private int expentThisTurn;
private int numManaShards;
private int numPowerSurgeLands;
@@ -2520,6 +2521,7 @@ public class Player extends GameEntity implements Comparable<Player> {
setNumManaConversion(0);
setCommitedCrimeThisTurn(0);
diceRollsThisTurn = Lists.newArrayList();
setExpentThisTurn(0);
damageReceivedThisTurn.clear();
@@ -3930,6 +3932,13 @@ public class Player extends GameEntity implements Comparable<Player> {
committedCrimeThisTurn = v;
}
public List<Integer> getDiceRollsThisTurn() {
return diceRollsThisTurn;
}
public void addDieRollThisTurn(List<Integer> rolls) {
diceRollsThisTurn.addAll(rolls);
}
public int getExpentThisTurn() {
return expentThisTurn;
}

View File

@@ -831,12 +831,7 @@ public final class StaticAbilityContinuous {
// add triggers
if (addTriggers != null) {
for (final String trigger : addTriggers) {
final Trigger actualTrigger = affectedCard.getTriggerForStaticAbility(trigger, stAb);
// if the trigger has Execute param, which most trigger gained by Static Abilties should have
// turn them into SpellAbility object before adding to card
// with that the TargetedCard does not need the Svars added to them anymore
// but only do it if the trigger doesn't already have a overriding ability
addedTrigger.add(actualTrigger);
addedTrigger.add(affectedCard.getTriggerForStaticAbility(trigger, stAb));
}
}

View File

@@ -595,7 +595,7 @@ public class Main extends AndroidApplication {
if (connManager != null) {
NetworkCapabilities capabilities = connManager.getNetworkCapabilities(connManager.getActiveNetwork());
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
result = connected;
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
result = connected && !wifiOnly;
@@ -607,7 +607,7 @@ public class Main extends AndroidApplication {
NetworkInfo activeNetwork = connManager.getActiveNetworkInfo();
if (activeNetwork != null) {
// connected to the internet
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI || activeNetwork.getType() == ConnectivityManager.TYPE_ETHERNET) {
result = true;
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
result = !wifiOnly;

View File

@@ -25,7 +25,6 @@ public class GameLauncher {
Configuration.GLFW_LIBRARY_NAME.set("glfw_async");
}
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setResizable(false);
ApplicationListener start = Forge.getApp(new Lwjgl3Clipboard(), new Main.DesktopAdapter(switchOrientationFile),//todo get totalRAM && isTabletDevice
assetsDir, false, false, 0, false, 0, "", "");
if (Config.instance().getSettingData().fullScreen) {
@@ -34,6 +33,7 @@ public class GameLauncher {
config.setHdpiMode(HdpiMode.Logical);
} else {
config.setWindowedMode(Config.instance().getSettingData().width, Config.instance().getSettingData().height);
config.setResizable(false);
}
config.setTitle("Forge - " + versionString);
config.setWindowListener(new Lwjgl3WindowAdapter() {

View File

@@ -177,7 +177,7 @@ public class TextRenderer {
needClip = true;
}
}
addPiece(new SymbolPiece(symbol, inReminderTextCount > 0), lineNum, x, y - font.getAscent() + (lineHeight - pieceWidth) / 2, pieceWidth, pieceWidth);
addPiece(new SymbolPiece(symbol, inReminderTextCount > 0), lineNum, x, y - lineHeight / 4, pieceWidth, pieceWidth);
x += pieceWidth;
pieceWidth = 0;
text.setLength(0);

View File

@@ -5,4 +5,5 @@ PT:1/1
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRoll | Host$ True | TriggerDescription$ When this creature enters, roll a six-sided die. You gain life equal to the result.
SVar:TrigRoll:DB$ RollDice | ResultSVar$ Result | SubAbility$ DBLife
SVar:DBLife:DB$ GainLife | LifeAmount$ Result
DeckHas:Ability$LifeGain
Oracle:When this creature enters, roll a six-sided die. You gain life equal to the result.

View File

@@ -1,4 +1,4 @@
Name:Anax and Cymede and Kynaios and Tiro
Name:Anax and Cymede & Kynaios and Tiro
ManaCost:1 W U R G
Types:Legendary Creature Human Soldier
PT:3/8
@@ -9,4 +9,4 @@ SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ EachPlayLand
SVar:EachPlayLand:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | DefinedPlayer$ Player | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ DrawAbstainers
SVar:DrawAbstainers:DB$ Draw | Defined$ OppNonRememberedOwner | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:First strike, vigilance\nHeroic — Whenever you cast a spell that targets Anax and Cymede and Kynaios and Tiro, draw a card. Each player may put a land card from their hand onto the battlefield, then each opponent who didn't draws a card.
Oracle:First strike, vigilance\nHeroic — Whenever you cast a spell that targets Anax and Cymede & Kynaios and Tiro, draw a card. Each player may put a land card from their hand onto the battlefield, then each opponent who didn't draws a card.

View File

@@ -0,0 +1,9 @@
Name:Eelectrocute
ManaCost:1 R
Types:Instant
A:SP$ DealDamage | ValidTgts$ Any | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target.
S:Mode$ Continuous | Affected$ Card.Self | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlay$ True | CheckSVar$ Count$YouRolledThisTurn6 | Description$ You may cast CARDNAME from your graveyard as long as you've rolled a 6 this turn. If you cast CARDNAME this way and it would be put into your graveyard, exile it instead.
R:Event$ Moved | ValidLKI$ Card.CastSa Spell.MayPlaySource | Origin$ Stack | Destination$ Graveyard | ReplaceWith$ MoveExile
SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Stack | Destination$ Exile
DeckHas:Ability$Graveyard
Oracle:Eelectrocute deals 2 damage to any target.\nYou may cast Eelectrocute from your graveyard as long as you've rolled a 6 this turn. If you cast Eelectrocute this way and it would be put into your graveyard, exile it instead.

View File

@@ -0,0 +1,10 @@
Name:Harrowing Swarm
ManaCost:1 G
Types:Sorcery
A:SP$ ManifestDread | SubAbility$ DBAnimate | SpellDescription$ Manifest dread.
SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Creature.faceDown+YouCtrl | Zone$ Battlefield | staticAbilities$ ReduceCost | Triggers$ TurnedFaceUp | Duration$ Permanent | StackDescription$ SpellDescription | SpellDescription$ Then each face-down creature you control gains "This permanent costs {2} less to turn face up" and "When this permanent is turned face up, if it's a creature, put a +1/+1 counter on it."
SVar:ReduceCost:Mode$ ReduceCost | Amount$ 2 | ValidSpell$ Static.isTurnFaceUp | ValidCard$ Card.Self | Activator$ You | EffectZone$ All | Description$ This permanent costs {2} less to turn face up.
SVar:TurnedFaceUp:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ When this permanent is turned face up, if it's a creature, put a +1/+1 counter on it.
SVar:TrigPump:DB$ PutCounter | Defined$ TriggeredCard | CounterType$ P1P1 | ConditionDefined$ TriggeredCard | ConditionPresent$ Creature
DeckHas:Ability$Counters
Oracle:Manifest dread. Then each face-down creature you control gains "This permanent costs {2} less to turn face up" and "When this permanent is turned face up, if it's a creature, put a +1/+1 counter on it."

View File

@@ -1,7 +1,7 @@
Name:Kayla's Reconstruction
ManaCost:X W W W
Types:Sorcery
A:SP$ Dig | DigNum$ 7 | ChangeNum$ X | Optional$ True | ChangeValid$ Creature.cmcLE3,Artifact.cmcLE3 | DestinationZone$ Battlefield | RestRandomOrder$ True | SpellDescription$ Look at the top seven cards of your library. Put up to X artifact and/or creature cards with mana value 3 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.
A:SP$ Dig | DigNum$ 7 | ChangeNum$ X | Optional$ True | ChangeValid$ Creature.cmcLE3,Artifact.cmcLE3 | DestinationZone$ Battlefield | RestRandomOrder$ True | AILogic$ PayX | SpellDescription$ Look at the top seven cards of your library. Put up to X artifact and/or creature cards with mana value 3 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.
SVar:X:Count$xPaid
DeckHints:Type$Artifact
Oracle:Look at the top seven cards of your library. Put up to X artifact and/or creature cards with mana value 3 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.

View File

@@ -1,6 +1,6 @@
Name:Lunar Insight
ManaCost:2 U
Types:Instant
Types:Sorcery
A:SP$ Draw | NumCards$ X | SpellDescription$ Draw a card for each different mana value among nonland permanents you control.
SVar:X:Count$Valid Card.YouCtrl+nonLand$DifferentCMC
Oracle:Draw a card for each different mana value among nonland permanents you control.

View File

@@ -1,4 +1,4 @@
Name:Myojin of Night's Reach Grim Betrayal
Name:Myojin of Night's Reach and Grim Betrayal
ManaCost:5 B B B
Types:Legendary Creature Spirit
PT:10/4
@@ -7,4 +7,4 @@ SVar:FromHand:Count$wasCastFromYourHandByYou.1.0
A:AB$ Discard | Cost$ SubCounter<1/Indestructible> | Defined$ Player.Opponent | Mode$ Hand | SubAbility$ DBReturn | SpellDescription$ Each opponent discards their hand. Put onto the battlefield under your control all creature cards in all graveyards that were put there from anywhere this turn.
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ ValidGraveyard Creature.ThisTurnEntered | GainControl$ True
DeckHas:Ability$Graveyard
Oracle:Myojin of Night's Reach Grim Betrayal enters the battlefield with an indestructible counter on it if you cast it from your hand.\nRemove an indestructible counter from Myojin of Night's Reach Grim Betrayal: Each opponent discards their hand. Put onto the battlefield under your control all creature cards in all graveyards that were put there from anywhere this turn.
Oracle:Myojin of Night's Reach and Grim Betrayal enters the battlefield with an indestructible counter on it if you cast it from your hand.\nRemove an indestructible counter from Myojin of Night's Reach and Grim Betrayal: Each opponent discards their hand. Put onto the battlefield under your control all creature cards in all graveyards that were put there from anywhere this turn.

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Cube March 2014
Name=MTGO Cube 2014-03
[main]
1 Academy Rector|UDS
1 Academy Ruins|2XM

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Grixis Cube September 2019 (540 cards)
Name=MTGO Grixis Cube 2019-09 (540 cards)
[main]
Abbot of Keral Keep|ORI
Abrade|HOU

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube March 2015
Name=MTGO Legacy Cube 2015-03
[main]
1 Accorder Paladin|MBS
1 Abrupt Decay|MM3

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube September 2015
Name=MTGO Legacy Cube 2015-09
[main]
1 Abbot of Keral Keep|ORI
1 Abhorrent Overlord|THS

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube January 2016
Name=MTGO Legacy Cube 2016-01
[main]
1 Abbot of Keral Keep|ORI
1 Abhorrent Overlord|THS

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube September 2016
Name=MTGO Legacy Cube 2016-09
[main]
1 Abbot of Keral Keep|ORI
1 Abhorrent Overlord|THS

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube January 2017
Name=MTGO Legacy Cube 2017-01
[main]
1 Abbot of Keral Keep|ORI
1 Abrupt Decay|MM3

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube April 2017
Name=MTGO Legacy Cube 2017-04
[main]
1 Abbot of Keral Keep|ORI
1 Abrupt Decay|MM3

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube February 2018
Name=MTGO Legacy Cube 2018-02
[main]
1 Abbot of Keral Keep|ORI
1 Abrade|AKR

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube July 2019
Name=MTGO Legacy Cube 2019-07
[main]
1 Abbot of Keral Keep|ORI
1 Abrade|AKR

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Legacy Cube May 2021
Name=MTGO Legacy Cube 2021-05
[main]
1 Abbot of Keral Keep|ORI
1 Abrade|AKR

View File

@@ -1,5 +1,5 @@
[metadata]
name=MTGO Legacy Cube August 2021
name=MTGO Legacy Cube 2021-08
[Main]
1 Abbot of Keral Keep|ORI
1 Abrade|HOU

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube June 2016
Name=MTGO Vintage Cube 2016-06
[main]
1 Abbot of Keral Keep|ORI
1 Abrupt Decay|MM3

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube November 2016
Name=MTGO Vintage Cube 2016-11
[main]
1 Abbot of Keral Keep|ORI
1 Abrupt Decay|MM3

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube June 2017
Name=MTGO Vintage Cube 2017-06
[main]
1 Abbot of Keral Keep|ORI
1 Abrupt Decay|MM3

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube December 2017
Name=MTGO Vintage Cube 2017-12
[main]
1 Mana Flare|5ED
1 Zurgo Bellstriker|DTK

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube June 2018
Name=MTGO Vintage Cube 2018-06
[main]
1 Abbot of Keral Keep|ORI
1 Abrade|AKR

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube December 2018
Name=MTGO Vintage Cube 2018-12
[main]
1 Dauntless Bodyguard|DOM
1 Kytheon, Hero of Akros|ORI

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube Summer 2019
Name=MTGO Vintage Cube 2019 Summer
[main]
1 Abbot of Keral Keep|ORI
1 Abrade|AKR

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube June 2019
Name=MTGO Vintage Cube 2019-06
[main]
1 Dauntless Bodyguard|DOM
1 Kytheon, Hero of Akros|ORI

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube December 2019
Name=MTGO Vintage Cube 2019-12
[main]
1 Kytheon, Hero of Akros|ORI
1 Mother of Runes|EMA

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube April 2020
Name=MTGO Vintage Cube 2020-04
[main]
1 Kytheon, Hero of Akros|ORI
1 Mother of Runes|EMA

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube July 2020
Name=MTGO Vintage Cube 2020-07
[main]
1 Kytheon, Hero of Akros|ORI
1 Mother of Runes|EMA

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube December 2020
Name=MTGO Vintage Cube 2020-12
[main]
1 Kytheon, Hero of Akros|ORI
1 Mother of Runes|EMA

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube July 2021
Name=MTGO Vintage Cube 2021-07
[main]
1 Abbot of Keral Keep|ORI
1 Abrade|AKR

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube February 2022
Name=MTGO Vintage Cube 2022-02
[main]
1 Abbot of Keral Keep|ORI
1 Abrade|DBL

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube May 2023
Name=MTGO Vintage Cube 2023-05
[main]
1 Abrade|VOW
1 Acidic Slime|M13

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube August 2023
Name=MTGO Vintage Cube 2023-08
[main]
1 Abrade|HOU
1 Acidic Slime|M10

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube October 2023
Name=MTGO Vintage Cube 2023-10
[Main]
1 Abrade|HOU
1 Adanto Vanguard|XLN

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube February 2024
Name=MTGO Vintage Cube 2024-02
[main]
1 Abrade|HOU
1 Adeline, Resplendent Cathar|MID

View File

@@ -1,5 +1,5 @@
[metadata]
Name=MTGO Vintage Cube June 2024
Name=MTGO Vintage Cube 2024-06
[Main]
1 Abrade|HOU|1
1 Adeline, Resplendent Cathar|MID|1

View File

@@ -0,0 +1,6 @@
Name:MTGO Cube 2014-03
DeckFile:MTGO Cube 2014-03
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Cube March 2014
DeckFile:MTGO Cube March 2014
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Grixis Cube 2019-09 (540 cards)
DeckFile:MTGO Grixis Cube 2019-09 (540 cards)
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Grixis Cube September 2019 (540 cards)
DeckFile:MTGO Grixis Cube September 2019 (540 cards)
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2015-03
DeckFile:MTGO Legacy Cube 2015-03
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2015-09
DeckFile:MTGO Legacy Cube 2015-09
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2016-01
DeckFile:MTGO Legacy Cube 2016-01
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2016-09
DeckFile:MTGO Legacy Cube 2016-09
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2017-01
DeckFile:MTGO Legacy Cube 2017-01
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2017-04
DeckFile:MTGO Legacy Cube 2017-04
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2018-02
DeckFile:MTGO Legacy Cube 2018-02
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2019-07
DeckFile:MTGO Legacy Cube 2019-07
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2021-05
DeckFile:MTGO Legacy Cube 2021-05
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Legacy Cube 2021-08
DeckFile:MTGO Legacy Cube 2021-08
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube April 2017
DeckFile:MTGO Legacy Cube April 2017
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube August 2021
DeckFile:MTGO Legacy Cube August 2021
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube February 2018
DeckFile:MTGO Legacy Cube February 2018
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube January 2016
DeckFile:MTGO Legacy Cube January 2016
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube January 2017
DeckFile:MTGO Legacy Cube January 2017
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube July 2019
DeckFile:MTGO Legacy Cube July 2019
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube March 2015
DeckFile:MTGO Legacy Cube March 2015
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube May 2021
DeckFile:MTGO Legacy Cube May 2021
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube September 2015
DeckFile:MTGO Legacy Cube September 2015
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Legacy Cube September 2016
DeckFile:MTGO Legacy Cube September 2016
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2016-06
DeckFile:MTGO Vintage Cube 2016-06
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2016-11
DeckFile:MTGO Vintage Cube 2016-11
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2017-06
DeckFile:MTGO Vintage Cube 2017-06
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2017-12
DeckFile:MTGO Vintage Cube 2017-12
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2018-06
DeckFile:MTGO Vintage Cube 2018-06
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2018-12
DeckFile:MTGO Vintage Cube 2018-12
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2019 Summer
DeckFile:MTGO Vintage Cube 2019 Summer
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2019-06
DeckFile:MTGO Vintage Cube 2019-06
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2019-12
DeckFile:MTGO Vintage Cube 2019-12
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2020-04
DeckFile:MTGO Vintage Cube 2020-04
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2020-07
DeckFile:MTGO Vintage Cube 2020-07
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2020-12
DeckFile:MTGO Vintage Cube 2020-12
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2021-07
DeckFile:MTGO Vintage Cube 2021-07
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2022-02
DeckFile:MTGO Vintage Cube 2022-02
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2023-05
DeckFile:MTGO Vintage Cube 2023-05
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2023-08
DeckFile:MTGO Vintage Cube 2023-08
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2023-10
DeckFile:MTGO Vintage Cube 2023-10
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2024-02
DeckFile:MTGO Vintage Cube 2024-02
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -0,0 +1,6 @@
Name:MTGO Vintage Cube 2024-06
DeckFile:MTGO Vintage Cube 2024-06
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Vintage Cube April 2020
DeckFile:MTGO Vintage Cube April 2020
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Vintage Cube August 2023
DeckFile:MTGO Vintage Cube August 2023
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Vintage Cube December 2017
DeckFile:MTGO Vintage Cube December 2017
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Vintage Cube December 2018
DeckFile:MTGO Vintage Cube December 2018
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Vintage Cube December 2019
DeckFile:MTGO Vintage Cube December 2019
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Vintage Cube December 2020
DeckFile:MTGO Vintage Cube December 2020
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Vintage Cube February 2022
DeckFile:MTGO Vintage Cube February 2022
Singleton:True
Booster: 15 Any
NumPacks: 3

View File

@@ -1,6 +0,0 @@
Name:MTGO Vintage Cube February 2024
DeckFile:MTGO Vintage Cube February 2024
Singleton:True
Booster: 15 Any
NumPacks: 3

Some files were not shown because too many files have changed in this diff Show More