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.ChooseSource, ChooseSourceAi.class)
.put(ApiType.ChooseType, ChooseTypeAi.class) .put(ApiType.ChooseType, ChooseTypeAi.class)
.put(ApiType.Clash, ClashAi.class) .put(ApiType.Clash, ClashAi.class)
.put(ApiType.ClassLevelUp, AlwaysPlayAi.class) .put(ApiType.ClassLevelUp, ClassLevelUpAi.class)
.put(ApiType.Cleanup, AlwaysPlayAi.class) .put(ApiType.Cleanup, AlwaysPlayAi.class)
.put(ApiType.Cloak, CloakAi.class) .put(ApiType.Cloak, CloakAi.class)
.put(ApiType.Clone, CloneAi.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); 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")) { if (sq[0].equals("YouSurveilThisTurn")) {
return doXMath(player.getSurveilThisTurn(), expr, c, ctb); return doXMath(player.getSurveilThisTurn(), expr, c, ctb);
} }
@@ -3004,7 +3009,7 @@ public class AbilityUtils {
sp.setCardState(original); sp.setCardState(original);
list.add(sp); list.add(sp);
} }
if (tgtCard.isModal()) { if (tgtCard.isModal() && tgtCard.hasState(CardStateName.Modal)) {
collectSpellsForPlayEffect(list, tgtCard.getState(CardStateName.Modal), controller, withAltCost); collectSpellsForPlayEffect(list, tgtCard.getState(CardStateName.Modal), controller, withAltCost);
} }
} }

View File

@@ -143,6 +143,7 @@ public class RollDiceEffect extends SpellAbilityEffect {
StringUtils.join(ignored, ", "))); StringUtils.join(ignored, ", ")));
} }
player.getGame().getAction().notifyOfValue(sa, player, sb.toString(), null); player.getGame().getAction().notifyOfValue(sa, player, sb.toString(), null);
player.addDieRollThisTurn(naturalRolls);
} }
List<Integer> rolls = Lists.newArrayList(); 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); pool = CardLists.getValidCards(pool, seekType, source.getController(), source, sa);
} }
if (pool.isEmpty()) { 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)); notify.append(Localizer.getInstance().getMessage("lblSeekFailed", seekType));
continue; // can't find if nothing to seek 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); game.getAction().notifyOfValue(sa, source, notify.toString(), null);
} }
if (!soughtCards.isEmpty()) { if (!soughtCards.isEmpty()) {

View File

@@ -526,13 +526,13 @@ public class CostAdjustment {
} }
if (st.hasParam("Type")) { if (st.hasParam("Type")) {
final String type = st.getParam("Type"); switch (st.getParam("Type")) {
if (type.equals("Spell")) { case "Spell" -> {
if (!sa.isSpell()) { if (!sa.isSpell()) {
return false; return false;
} }
if (st.hasParam("OnlyFirstSpell")) { if (st.hasParam("OnlyFirstSpell")) {
if (activator == null ) { if (activator == null) {
return false; return false;
} }
List<Card> list; List<Card> list;
@@ -548,11 +548,10 @@ public class CostAdjustment {
); );
} }
if (CardLists.filterControlledBy(list, activator).size() > 0) { if (!CardLists.filterControlledBy(list, activator).isEmpty()) return false;
return false;
} }
} }
} else if (type.equals("Ability")) { case "Ability" -> {
if (!sa.isActivatedAbility() || sa.isReplacementAbility()) { if (!sa.isActivatedAbility() || sa.isReplacementAbility()) {
return false; return false;
} }
@@ -568,15 +567,18 @@ public class CostAdjustment {
} }
} }
} }
} else if (type.equals("NonManaAbility")) { }
case "NonManaAbility" -> {
if (!sa.isActivatedAbility() || sa.isManaAbility() || sa.isReplacementAbility()) { if (!sa.isActivatedAbility() || sa.isManaAbility() || sa.isReplacementAbility()) {
return false; return false;
} }
} else if (type.equals("MorphDown")) { }
case "MorphDown" -> {
if (!sa.isSpell() || !sa.isCastFaceDown()) { if (!sa.isSpell() || !sa.isCastFaceDown()) {
return false; return false;
} }
} else if (type.equals("Foretell")) { }
case "Foretell" -> {
if (!sa.isForetelling()) { if (!sa.isForetelling()) {
return false; return false;
} }
@@ -585,6 +587,8 @@ public class CostAdjustment {
} }
} }
} }
}
if (st.hasParam("AffectedZone")) { if (st.hasParam("AffectedZone")) {
List<ZoneType> zones = ZoneType.listValueOf(st.getParam("AffectedZone")); List<ZoneType> zones = ZoneType.listValueOf(st.getParam("AffectedZone"));
if (sa.isSpell() && card.wasCast()) { if (sa.isSpell() && card.wasCast()) {

View File

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

View File

@@ -831,12 +831,7 @@ public final class StaticAbilityContinuous {
// add triggers // add triggers
if (addTriggers != null) { if (addTriggers != null) {
for (final String trigger : addTriggers) { for (final String trigger : addTriggers) {
final Trigger actualTrigger = affectedCard.getTriggerForStaticAbility(trigger, stAb); addedTrigger.add(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);
} }
} }

View File

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

View File

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

View File

@@ -177,7 +177,7 @@ public class TextRenderer {
needClip = true; 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; x += pieceWidth;
pieceWidth = 0; pieceWidth = 0;
text.setLength(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. 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:TrigRoll:DB$ RollDice | ResultSVar$ Result | SubAbility$ DBLife
SVar:DBLife:DB$ GainLife | LifeAmount$ Result 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. 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 ManaCost:1 W U R G
Types:Legendary Creature Human Soldier Types:Legendary Creature Human Soldier
PT:3/8 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: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:DrawAbstainers:DB$ Draw | Defined$ OppNonRememberedOwner | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True 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 Name:Kayla's Reconstruction
ManaCost:X W W W ManaCost:X W W W
Types:Sorcery 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 SVar:X:Count$xPaid
DeckHints:Type$Artifact 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. 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 Name:Lunar Insight
ManaCost:2 U 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. 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 SVar:X:Count$Valid Card.YouCtrl+nonLand$DifferentCMC
Oracle:Draw a card for each different mana value among nonland permanents you control. 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 ManaCost:5 B B B
Types:Legendary Creature Spirit Types:Legendary Creature Spirit
PT:10/4 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. 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 SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ ValidGraveyard Creature.ThisTurnEntered | GainControl$ True
DeckHas:Ability$Graveyard 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] [metadata]
Name=MTGO Cube March 2014 Name=MTGO Cube 2014-03
[main] [main]
1 Academy Rector|UDS 1 Academy Rector|UDS
1 Academy Ruins|2XM 1 Academy Ruins|2XM

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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