mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Merge branch 'Card-Forge:master' into XIRAA
This commit is contained in:
@@ -65,27 +65,27 @@ public class DamageDealAi extends DamageAiBase {
|
|||||||
return SpecialCardAi.SarkhanTheMad.considerDig(ai, sa);
|
return SpecialCardAi.SarkhanTheMad.considerDig(ai, sa);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (damage.equals("X") && sa.getSVar(damage).equals("Count$ChosenNumber")) {
|
|
||||||
int energy = ai.getCounters(CounterEnumType.ENERGY);
|
|
||||||
for (SpellAbility s : source.getSpellAbilities()) {
|
|
||||||
if ("PayEnergy".equals(s.getParam("AILogic"))) {
|
|
||||||
energy += AbilityUtils.calculateAmount(source, s.getParam("CounterNum"), sa);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (; energy > 0; energy--) {
|
|
||||||
if (damageTargetAI(ai, sa, energy, false)) {
|
|
||||||
dmg = ComputerUtilCombat.getEnoughDamageToKill(sa.getTargetCard(), energy, source, false, false);
|
|
||||||
if (dmg > energy || dmg < 1) {
|
|
||||||
continue; // in case the calculation gets messed up somewhere
|
|
||||||
}
|
|
||||||
root.setSVar("EnergyToPay", "Number$" + dmg);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (damage.equals("X")) {
|
if (damage.equals("X")) {
|
||||||
|
if (sa.getSVar(damage).equals("Count$ChosenNumber")) {
|
||||||
|
int energy = ai.getCounters(CounterEnumType.ENERGY);
|
||||||
|
for (SpellAbility s : source.getSpellAbilities()) {
|
||||||
|
if ("PayEnergy".equals(s.getParam("AILogic"))) {
|
||||||
|
energy += AbilityUtils.calculateAmount(source, s.getParam("CounterNum"), sa);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (; energy > 0; energy--) {
|
||||||
|
if (damageTargetAI(ai, sa, energy, false)) {
|
||||||
|
dmg = ComputerUtilCombat.getEnoughDamageToKill(sa.getTargetCard(), energy, source, false, false);
|
||||||
|
if (dmg > energy || dmg < 1) {
|
||||||
|
continue; // in case the calculation gets messed up somewhere
|
||||||
|
}
|
||||||
|
root.setSVar("EnergyToPay", "Number$" + dmg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (sa.getSVar(damage).equals("Count$xPaid")) {
|
if (sa.getSVar(damage).equals("Count$xPaid")) {
|
||||||
// Life Drain
|
// Life Drain
|
||||||
if ("XLifeDrain".equals(logic)) {
|
if ("XLifeDrain".equals(logic)) {
|
||||||
@@ -111,7 +111,7 @@ public class DamageDealAi extends DamageAiBase {
|
|||||||
final String damage = sa.getParam("NumDmg");
|
final String damage = sa.getParam("NumDmg");
|
||||||
int dmg = AbilityUtils.calculateAmount(source, damage, sa);
|
int dmg = AbilityUtils.calculateAmount(source, damage, sa);
|
||||||
|
|
||||||
if (damage.equals("X")) {
|
if (damage.equals("X") || sourceName.equals("Crater's Claws")) {
|
||||||
if (sa.getSVar(damage).equals("Count$xPaid") || sourceName.equals("Crater's Claws")) {
|
if (sa.getSVar(damage).equals("Count$xPaid") || sourceName.equals("Crater's Claws")) {
|
||||||
dmg = ComputerUtilCost.getMaxXValue(sa, ai, sa.isTrigger());
|
dmg = ComputerUtilCost.getMaxXValue(sa, ai, sa.isTrigger());
|
||||||
|
|
||||||
@@ -542,13 +542,6 @@ public class DamageDealAi extends DamageAiBase {
|
|||||||
sa.getTargets().add(enemy);
|
sa.getTargets().add(enemy);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if ("DamageAfterPutCounter".equals(logic)
|
|
||||||
&& sa.getParent() != null
|
|
||||||
&& "P1P1".equals(sa.getParent().getParam("CounterType"))) {
|
|
||||||
// assuming the SA parent is of PutCounter type. Perhaps it's possible to predict counter multipliers here somehow?
|
|
||||||
final String amountStr = sa.getParent().getParamOrDefault("CounterNum", "1");
|
|
||||||
final int amount = AbilityUtils.calculateAmount(source, amountStr, sa);
|
|
||||||
dmg += amount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssumeAtLeastOneTarget is used for cards with funky targeting implementation like Fight with Fire which would
|
// AssumeAtLeastOneTarget is used for cards with funky targeting implementation like Fight with Fire which would
|
||||||
@@ -557,11 +550,7 @@ public class DamageDealAi extends DamageAiBase {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
immediately = immediately || ComputerUtil.playImmediately(ai, sa);
|
sa.resetTargets();
|
||||||
|
|
||||||
if (!(sa.getParent() != null && sa.getParent().isTargetNumberValid())) {
|
|
||||||
sa.resetTargets();
|
|
||||||
}
|
|
||||||
|
|
||||||
// target loop
|
// target loop
|
||||||
TargetChoices tcs = sa.getTargets();
|
TargetChoices tcs = sa.getTargets();
|
||||||
@@ -622,6 +611,8 @@ public class DamageDealAi extends DamageAiBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
immediately = immediately || ComputerUtil.playImmediately(ai, sa);
|
||||||
|
|
||||||
int totalTargetedSoFar = -1;
|
int totalTargetedSoFar = -1;
|
||||||
while (sa.canAddMoreTarget()) {
|
while (sa.canAddMoreTarget()) {
|
||||||
if (totalTargetedSoFar == tcs.size()) {
|
if (totalTargetedSoFar == tcs.size()) {
|
||||||
|
|||||||
@@ -61,6 +61,8 @@ public enum CounterEnumType {
|
|||||||
|
|
||||||
BRICK("BRICK", 226, 192, 164),
|
BRICK("BRICK", 226, 192, 164),
|
||||||
|
|
||||||
|
BURDEN("BURDEN", 135, 62, 35),
|
||||||
|
|
||||||
CAGE("CAGE", 155, 155, 155),
|
CAGE("CAGE", 155, 155, 155),
|
||||||
|
|
||||||
CARRION("CRRON", 255, 163, 222),
|
CARRION("CRRON", 255, 163, 222),
|
||||||
|
|||||||
@@ -208,7 +208,10 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
|||||||
for (SpellAbility sa : sas) {
|
for (SpellAbility sa : sas) {
|
||||||
// reset in case a trigger stopped it on a previous activation
|
// reset in case a trigger stopped it on a previous activation
|
||||||
sa.setUndoable(true);
|
sa.setUndoable(true);
|
||||||
undoStack.remove(undoStack.lastIndexOf(sa));
|
int idx = undoStack.lastIndexOf(sa);
|
||||||
|
if (idx != -1) {
|
||||||
|
undoStack.remove(idx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (undoStack.isEmpty()) {
|
if (undoStack.isEmpty()) {
|
||||||
undoStackOwner = null;
|
undoStackOwner = null;
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import forge.adventure.world.WorldSave;
|
|||||||
import forge.assets.FImageComplex;
|
import forge.assets.FImageComplex;
|
||||||
import forge.assets.FSkinImage;
|
import forge.assets.FSkinImage;
|
||||||
import forge.card.CardRenderer;
|
import forge.card.CardRenderer;
|
||||||
|
import forge.card.ColorSet;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckProxy;
|
import forge.deck.DeckProxy;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
@@ -280,28 +281,29 @@ public class MapStage extends GameStage {
|
|||||||
FImageComplex cardArt = CardRenderer.getCardArt(dp.getHighestCMCCard());
|
FImageComplex cardArt = CardRenderer.getCardArt(dp.getHighestCMCCard());
|
||||||
if (cardArt != null) {
|
if (cardArt != null) {
|
||||||
Image art = new Image(cardArt.getTextureRegion());
|
Image art = new Image(cardArt.getTextureRegion());
|
||||||
art.setWidth(50);
|
art.setWidth(58);
|
||||||
art.setHeight(40);
|
art.setHeight(46);
|
||||||
art.setPosition(8, 40);
|
art.setPosition(25, 43);
|
||||||
Image image = new Image(FSkinImage.ADV_DECKBOX.getTextureRegion());
|
Image image = new Image(FSkinImage.ADV_DECKBOX.getTextureRegion());
|
||||||
image.setWidth(59);
|
image.setWidth(60);
|
||||||
image.setHeight(80);
|
image.setHeight(80);
|
||||||
image.setPosition(4, 7);
|
image.setPosition(24, 10);
|
||||||
TypingLabel deckColors = Controls.newTypingLabel(Controls.colorIdToTypingString(DeckProxy.getColorIdentity(deck), true).toUpperCase());
|
ColorSet colorSet = DeckProxy.getColorIdentity(deck);
|
||||||
|
TypingLabel deckColors = Controls.newTypingLabel(Controls.colorIdToTypingString(colorSet, true).toUpperCase());
|
||||||
deckColors.skipToTheEnd();
|
deckColors.skipToTheEnd();
|
||||||
deckColors.setAlignment(Align.left);
|
deckColors.setAlignment(Align.center);
|
||||||
deckColors.setPosition(58, 40);
|
deckColors.setPosition(14, 44);
|
||||||
TextraLabel deckname = Controls.newTextraLabel(deck.getName());
|
TextraLabel deckname = Controls.newTextraLabel(deck.getName());
|
||||||
deckname.setAlignment(Align.center);
|
deckname.setAlignment(Align.center);
|
||||||
deckname.setWrap(true);
|
deckname.setWrap(true);
|
||||||
deckname.setWidth(70);
|
deckname.setWidth(80);
|
||||||
deckname.setPosition(0, 30);
|
deckname.setPosition(14, 28);
|
||||||
Group group = new Group();
|
Group group = new Group();
|
||||||
group.addActor(art);
|
group.addActor(art);
|
||||||
group.addActor(image);
|
group.addActor(image);
|
||||||
group.addActor(deckColors);
|
group.addActor(deckColors);
|
||||||
group.addActor(deckname);
|
group.addActor(deckname);
|
||||||
dialog.getContentTable().add(group).height(100).width(65).center();
|
dialog.getContentTable().add(group).height(100).width(100).center();
|
||||||
dialog.getContentTable().add().row();
|
dialog.getContentTable().add().row();
|
||||||
} else {
|
} else {
|
||||||
TypingLabel label = Controls.newTypingLabel("[%125]"+Controls.colorIdToTypingString(DeckProxy.getColorIdentity(deck)).toUpperCase()+"\n[%]"+deck.getName());
|
TypingLabel label = Controls.newTypingLabel("[%125]"+Controls.colorIdToTypingString(DeckProxy.getColorIdentity(deck)).toUpperCase()+"\n[%]"+deck.getName());
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
package forge.adventure.util;
|
package forge.adventure.util;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.Gdx;
|
||||||
|
import com.badlogic.gdx.audio.Music;
|
||||||
|
import com.badlogic.gdx.files.FileHandle;
|
||||||
import com.badlogic.gdx.scenes.scene2d.InputEvent;
|
import com.badlogic.gdx.scenes.scene2d.InputEvent;
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
|
import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
|
||||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
|
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
|
||||||
@@ -16,8 +19,9 @@ import forge.adventure.stage.MapStage;
|
|||||||
import forge.card.ColorSet;
|
import forge.card.ColorSet;
|
||||||
import forge.localinstance.properties.ForgePreferences;
|
import forge.localinstance.properties.ForgePreferences;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.sound.AudioClip;
|
import forge.sound.SoundSystem;
|
||||||
import forge.util.Localizer;
|
import forge.util.Localizer;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MapDialog
|
* MapDialog
|
||||||
@@ -26,7 +30,7 @@ import forge.util.Localizer;
|
|||||||
|
|
||||||
public class MapDialog {
|
public class MapDialog {
|
||||||
private final MapStage stage;
|
private final MapStage stage;
|
||||||
private Array<DialogData> data;
|
private Array<DialogData> data;
|
||||||
private final int parentID;
|
private final int parentID;
|
||||||
private final static float WIDTH = 250f;
|
private final static float WIDTH = 250f;
|
||||||
static private final String defaultJSON = "[\n" +
|
static private final String defaultJSON = "[\n" +
|
||||||
@@ -45,8 +49,7 @@ public class MapDialog {
|
|||||||
public MapDialog(String S, MapStage stage, int parentID) {
|
public MapDialog(String S, MapStage stage, int parentID) {
|
||||||
this.stage = stage;
|
this.stage = stage;
|
||||||
this.parentID = parentID;
|
this.parentID = parentID;
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
|
|
||||||
if (S.isEmpty()) {
|
if (S.isEmpty()) {
|
||||||
System.err.print("Dialog error. Dialog property is empty.\n");
|
System.err.print("Dialog error. Dialog property is empty.\n");
|
||||||
@@ -54,31 +57,80 @@ public class MapDialog {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.data = JSONStringLoader.parse(Array.class, DialogData.class, S, defaultJSON);
|
this.data = JSONStringLoader.parse(Array.class, DialogData.class, S, defaultJSON);
|
||||||
}
|
} catch (Exception exception) {
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static AudioClip audio=null;
|
|
||||||
|
Pair<FileHandle, Music> audio = null;
|
||||||
|
float fade = 1f;
|
||||||
|
|
||||||
|
void unload() {
|
||||||
|
if (audio != null) {
|
||||||
|
audio.getRight().setOnCompletionListener(null);
|
||||||
|
audio.getRight().stop();
|
||||||
|
Forge.getAssets().manager().unload(audio.getLeft().path());
|
||||||
|
audio = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void disposeAudio() {
|
||||||
|
disposeAudio(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void disposeAudio(boolean fadeout) {
|
||||||
|
if (fadeout) {
|
||||||
|
final float[] v = {1f};
|
||||||
|
for (int i = 10; i > 1; i--) {
|
||||||
|
float delay = i * 0.1f;
|
||||||
|
float j = i;
|
||||||
|
Timer.schedule(new Timer.Task() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
v[0] -= 0.1f;
|
||||||
|
if (v[0] < 0.1f)
|
||||||
|
v[0] = 0.1f;
|
||||||
|
if (audio != null && j == 2) {
|
||||||
|
unload();
|
||||||
|
} else if (audio != null && j == 10) {
|
||||||
|
audio.getRight().setVolume(v[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, delay);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
unload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void loadDialog(DialogData dialog) { //Displays a dialog with dialogue and possible choices.
|
private void loadDialog(DialogData dialog) { //Displays a dialog with dialogue and possible choices.
|
||||||
setEffects(dialog.action);
|
setEffects(dialog.action);
|
||||||
Dialog D = stage.getDialog();
|
Dialog D = stage.getDialog();
|
||||||
Localizer L = Forge.getLocalizer();
|
Localizer L = Forge.getLocalizer();
|
||||||
D.getContentTable().clear(); D.getButtonTable().clear(); //Clear tables to start fresh.
|
D.getContentTable().clear();
|
||||||
|
D.getButtonTable().clear(); //Clear tables to start fresh.
|
||||||
D.clearListeners();
|
D.clearListeners();
|
||||||
String text; //Check for localized string (locname), otherwise print text.
|
String text; //Check for localized string (locname), otherwise print text.
|
||||||
if(dialog.loctext != null && !dialog.loctext.isEmpty()) text = L.getMessage(dialog.loctext);
|
if (dialog.loctext != null && !dialog.loctext.isEmpty()) text = L.getMessage(dialog.loctext);
|
||||||
else text = dialog.text;
|
else text = dialog.text;
|
||||||
if(audio!=null)
|
disposeAudio();
|
||||||
audio.stop();
|
if (dialog.voiceFile != null) {
|
||||||
if(dialog.voiceFile!=null)
|
FileHandle file = Gdx.files.absolute(Config.instance().getFilePath(dialog.voiceFile));
|
||||||
{
|
if (file.exists()) {
|
||||||
audio = AudioClip.createClip(Config.instance().getFilePath(dialog.voiceFile));
|
audio = Pair.of(file, Forge.getAssets().getMusic(file));
|
||||||
if(audio!=null)
|
}
|
||||||
audio.play(FModel.getPreferences().getPrefInt(ForgePreferences.FPref.UI_VOL_SOUNDS)/100f);
|
if (audio != null) {
|
||||||
|
int vol = FModel.getPreferences().getPrefInt(ForgePreferences.FPref.UI_VOL_MUSIC);
|
||||||
|
if (vol > 0) {
|
||||||
|
fadeOut();
|
||||||
|
audio.getRight().play();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fadeIn();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fadeIn();
|
||||||
}
|
}
|
||||||
TypingLabel A = Controls.newTypingLabel(text);
|
TypingLabel A = Controls.newTypingLabel(text);
|
||||||
A.setWrap(true);
|
A.setWrap(true);
|
||||||
@@ -99,14 +151,14 @@ public class MapDialog {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
D.getContentTable().add(A).width(WIDTH); //Add() returns a Cell, which is what the width is being applied to.
|
D.getContentTable().add(A).width(WIDTH); //Add() returns a Cell, which is what the width is being applied to.
|
||||||
if(dialog.options != null) {
|
if (dialog.options != null) {
|
||||||
int i=0;
|
int i = 0;
|
||||||
for(DialogData option:dialog.options) {
|
for (DialogData option : dialog.options) {
|
||||||
if( isConditionOk(option.condition) ) {
|
if (isConditionOk(option.condition)) {
|
||||||
String name; //Get localized label if present.
|
String name; //Get localized label if present.
|
||||||
if(option.locname != null && !option.locname.isEmpty()) name = L.getMessage(option.locname);
|
if (option.locname != null && !option.locname.isEmpty()) name = L.getMessage(option.locname);
|
||||||
else name = option.name;
|
else name = option.name;
|
||||||
TextraButton B = Controls.newTextButton(name,() -> loadDialog(option));
|
TextraButton B = Controls.newTextButton(name, () -> loadDialog(option));
|
||||||
B.getTextraLabel().setWrap(true); //We want this to wrap in case it's a wordy choice.
|
B.getTextraLabel().setWrap(true); //We want this to wrap in case it's a wordy choice.
|
||||||
buttons.add(B);
|
buttons.add(B);
|
||||||
B.setVisible(false);
|
B.setVisible(false);
|
||||||
@@ -116,84 +168,116 @@ public class MapDialog {
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
D.addListener(new ClickListener(){
|
D.addListener(new ClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void clicked(InputEvent event, float x, float y) {
|
public void clicked(InputEvent event, float x, float y) {
|
||||||
A.skipToTheEnd();
|
A.skipToTheEnd();
|
||||||
super.clicked(event, x, y);
|
super.clicked(event, x, y);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if(i==0)
|
if (i == 0)
|
||||||
stage.hideDialog();
|
stage.hideDialog();
|
||||||
else
|
else
|
||||||
stage.showDialog();
|
stage.showDialog();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
stage.hideDialog();
|
stage.hideDialog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fadeIn() {
|
||||||
|
disposeAudio(true);
|
||||||
|
if (fade >= 1f)
|
||||||
|
return;
|
||||||
|
for (int i = 10; i > 1; i--) {
|
||||||
|
float delay = i * 0.1f;
|
||||||
|
Timer.schedule(new Timer.Task() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
fade += 0.1f;
|
||||||
|
if (fade > 1f)
|
||||||
|
fade = 1f;
|
||||||
|
SoundSystem.instance.fadeModifier(fade);
|
||||||
|
}
|
||||||
|
}, delay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fadeOut() {
|
||||||
|
for (int i = 10; i > 1; i--) {
|
||||||
|
float delay = i * 0.1f;
|
||||||
|
Timer.schedule(new Timer.Task() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
fade -= 0.1f;
|
||||||
|
if (fade < 0.1f)
|
||||||
|
fade = 0.1f;
|
||||||
|
SoundSystem.instance.fadeModifier(fade);
|
||||||
|
}
|
||||||
|
}, delay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void activate() { //Method for actors to show their dialogues.
|
public void activate() { //Method for actors to show their dialogues.
|
||||||
for(DialogData dialog:data) {
|
for (DialogData dialog : data) {
|
||||||
if(isConditionOk(dialog.condition)) {
|
if (isConditionOk(dialog.condition)) {
|
||||||
loadDialog(dialog);
|
loadDialog(dialog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setEffects(DialogData.ActionData[] data) {
|
void setEffects(DialogData.ActionData[] data) {
|
||||||
if(data==null) return;
|
if (data == null) return;
|
||||||
for(DialogData.ActionData E:data) {
|
for (DialogData.ActionData E : data) {
|
||||||
if(E.removeItem != null){ //Removes an item from the player's inventory.
|
if (E.removeItem != null) { //Removes an item from the player's inventory.
|
||||||
Current.player().removeItem(E.removeItem);
|
Current.player().removeItem(E.removeItem);
|
||||||
}
|
}
|
||||||
if(E.addItem != null){ //Gives an item to the player.
|
if (E.addItem != null) { //Gives an item to the player.
|
||||||
Current.player().addItem(E.addItem);
|
Current.player().addItem(E.addItem);
|
||||||
}
|
}
|
||||||
if(E.addLife != 0){ //Gives (positive or negative) life to the player. Cannot go over max health.
|
if (E.addLife != 0) { //Gives (positive or negative) life to the player. Cannot go over max health.
|
||||||
Current.player().heal(E.addLife);
|
Current.player().heal(E.addLife);
|
||||||
}
|
}
|
||||||
if(E.addGold != 0){ //Gives (positive or negative) gold to the player.
|
if (E.addGold != 0) { //Gives (positive or negative) gold to the player.
|
||||||
if(E.addGold > 0) Current.player().giveGold(E.addGold);
|
if (E.addGold > 0) Current.player().giveGold(E.addGold);
|
||||||
else Current.player().takeGold(-E.addGold);
|
else Current.player().takeGold(-E.addGold);
|
||||||
}
|
}
|
||||||
if(E.deleteMapObject != 0){ //Removes a dummy object from the map.
|
if (E.deleteMapObject != 0) { //Removes a dummy object from the map.
|
||||||
if(E.deleteMapObject < 0) stage.deleteObject(parentID);
|
if (E.deleteMapObject < 0) stage.deleteObject(parentID);
|
||||||
else stage.deleteObject(E.deleteMapObject);
|
else stage.deleteObject(E.deleteMapObject);
|
||||||
}
|
}
|
||||||
if(E.battleWithActorID != 0){ //Starts a battle with the given enemy ID.
|
if (E.battleWithActorID != 0) { //Starts a battle with the given enemy ID.
|
||||||
if(E.battleWithActorID < 0) stage.beginDuel(stage.getEnemyByID(parentID));
|
if (E.battleWithActorID < 0) stage.beginDuel(stage.getEnemyByID(parentID));
|
||||||
else stage.beginDuel(stage.getEnemyByID(E.battleWithActorID));
|
else stage.beginDuel(stage.getEnemyByID(E.battleWithActorID));
|
||||||
}
|
}
|
||||||
if(E.giveBlessing != null) { //Gives a blessing for your next battle.
|
if (E.giveBlessing != null) { //Gives a blessing for your next battle.
|
||||||
Current.player().addBlessing(E.giveBlessing);
|
Current.player().addBlessing(E.giveBlessing);
|
||||||
}
|
}
|
||||||
if(E.setColorIdentity != null && !E.setColorIdentity.isEmpty()){ //Sets color identity (use sparingly)
|
if (E.setColorIdentity != null && !E.setColorIdentity.isEmpty()) { //Sets color identity (use sparingly)
|
||||||
Current.player().setColorIdentity(E.setColorIdentity);
|
Current.player().setColorIdentity(E.setColorIdentity);
|
||||||
}
|
}
|
||||||
if(E.setQuestFlag != null && !E.setQuestFlag.key.isEmpty()){ //Set a quest to given value.
|
if (E.setQuestFlag != null && !E.setQuestFlag.key.isEmpty()) { //Set a quest to given value.
|
||||||
Current.player().setQuestFlag(E.setQuestFlag.key, E.setQuestFlag.val);
|
Current.player().setQuestFlag(E.setQuestFlag.key, E.setQuestFlag.val);
|
||||||
}
|
}
|
||||||
if(E.advanceQuestFlag != null && !E.advanceQuestFlag.isEmpty()){ //Increase a given quest flag by 1.
|
if (E.advanceQuestFlag != null && !E.advanceQuestFlag.isEmpty()) { //Increase a given quest flag by 1.
|
||||||
Current.player().advanceQuestFlag(E.advanceQuestFlag);
|
Current.player().advanceQuestFlag(E.advanceQuestFlag);
|
||||||
}
|
}
|
||||||
if(E.setMapFlag != null && !E.setMapFlag.key.isEmpty()){ //Set a local quest to given value.
|
if (E.setMapFlag != null && !E.setMapFlag.key.isEmpty()) { //Set a local quest to given value.
|
||||||
stage.setQuestFlag(E.setMapFlag.key, E.setMapFlag.val);
|
stage.setQuestFlag(E.setMapFlag.key, E.setMapFlag.val);
|
||||||
}
|
}
|
||||||
if(E.advanceMapFlag != null && !E.advanceMapFlag.isEmpty()){ //Increase a given local quest flag by 1.
|
if (E.advanceMapFlag != null && !E.advanceMapFlag.isEmpty()) { //Increase a given local quest flag by 1.
|
||||||
stage.advanceQuestFlag(E.advanceMapFlag);
|
stage.advanceQuestFlag(E.advanceMapFlag);
|
||||||
}
|
}
|
||||||
if(E.setEffect != null){ //Replace current effects.
|
if (E.setEffect != null) { //Replace current effects.
|
||||||
EnemySprite EN = stage.getEnemyByID(parentID);
|
EnemySprite EN = stage.getEnemyByID(parentID);
|
||||||
EN.effect = E.setEffect;
|
EN.effect = E.setEffect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canShow(){
|
public boolean canShow() {
|
||||||
if( data == null) return false;
|
if (data == null) return false;
|
||||||
for(DialogData dialog:data) {
|
for (DialogData dialog : data) {
|
||||||
if(isConditionOk(dialog.condition)) {
|
if (isConditionOk(dialog.condition)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,80 +285,97 @@ public class MapDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isConditionOk(DialogData.ConditionData[] data) {
|
public boolean isConditionOk(DialogData.ConditionData[] data) {
|
||||||
if( data==null ) return true;
|
if (data == null) return true;
|
||||||
AdventurePlayer player = Current.player();
|
AdventurePlayer player = Current.player();
|
||||||
for(DialogData.ConditionData condition:data) {
|
for (DialogData.ConditionData condition : data) {
|
||||||
//TODO:Check for card in inventory.
|
//TODO:Check for card in inventory.
|
||||||
if(condition.item != null && !condition.item.isEmpty()) { //Check for an item in player's inventory.
|
if (condition.item != null && !condition.item.isEmpty()) { //Check for an item in player's inventory.
|
||||||
if(!player.hasItem(condition.item)) {
|
if (!player.hasItem(condition.item)) {
|
||||||
if(!condition.not) return false; //Only return on a false.
|
if (!condition.not) return false; //Only return on a false.
|
||||||
} else if(condition.not) return false;
|
} else if (condition.not) return false;
|
||||||
}
|
}
|
||||||
if(condition.colorIdentity != null && !condition.colorIdentity.isEmpty()) { //Check for player's color ID.
|
if (condition.colorIdentity != null && !condition.colorIdentity.isEmpty()) { //Check for player's color ID.
|
||||||
if(player.getColorIdentity().hasAllColors(ColorSet.fromNames(condition.colorIdentity.toCharArray()).getColor()))
|
if (player.getColorIdentity().hasAllColors(ColorSet.fromNames(condition.colorIdentity.toCharArray()).getColor())) {
|
||||||
{
|
if (!condition.not) return false;
|
||||||
if(!condition.not) return false;
|
} else if (condition.not) return false;
|
||||||
} else if(condition.not) return false;
|
|
||||||
}
|
}
|
||||||
if(condition.hasGold != 0){ //Check for at least X gold.
|
if (condition.hasGold != 0) { //Check for at least X gold.
|
||||||
if(player.getGold() < condition.hasGold){
|
if (player.getGold() < condition.hasGold) {
|
||||||
if(!condition.not) return false;
|
if (!condition.not) return false;
|
||||||
} else if(condition.not) return false;
|
} else if (condition.not) return false;
|
||||||
}
|
}
|
||||||
if(condition.hasLife != 0){ //Check for at least X life..
|
if (condition.hasLife != 0) { //Check for at least X life..
|
||||||
if(player.getLife() < condition.hasLife + 1){
|
if (player.getLife() < condition.hasLife + 1) {
|
||||||
if(!condition.not) return false;
|
if (!condition.not) return false;
|
||||||
} else if(condition.not) return false;
|
} else if (condition.not) return false;
|
||||||
}
|
}
|
||||||
if(condition.hasBlessing != null && !condition.hasBlessing.isEmpty()){ //Check for a named blessing.
|
if (condition.hasBlessing != null && !condition.hasBlessing.isEmpty()) { //Check for a named blessing.
|
||||||
if(!player.hasBlessing(condition.hasBlessing)){
|
if (!player.hasBlessing(condition.hasBlessing)) {
|
||||||
if(!condition.not) return false;
|
if (!condition.not) return false;
|
||||||
} else if(condition.not) return false;
|
} else if (condition.not) return false;
|
||||||
}
|
}
|
||||||
if(condition.actorID != 0) { //Check for actor ID.
|
if (condition.actorID != 0) { //Check for actor ID.
|
||||||
if(!stage.lookForID(condition.actorID)){
|
if (!stage.lookForID(condition.actorID)) {
|
||||||
if(!condition.not) return false; //Same as above.
|
if (!condition.not) return false; //Same as above.
|
||||||
} else if(condition.not) return false;
|
} else if (condition.not) return false;
|
||||||
}
|
}
|
||||||
if(condition.getQuestFlag != null){
|
if (condition.getQuestFlag != null) {
|
||||||
String key = condition.getQuestFlag.key;
|
String key = condition.getQuestFlag.key;
|
||||||
String cond = condition.getQuestFlag.op;
|
String cond = condition.getQuestFlag.op;
|
||||||
int val = condition.getQuestFlag.val;
|
int val = condition.getQuestFlag.val;
|
||||||
int QF = player.getQuestFlag(key);
|
int QF = player.getQuestFlag(key);
|
||||||
if(!player.checkQuestFlag(key)) return false; //If the quest is not ongoing, stop.
|
if (!player.checkQuestFlag(key)) return false; //If the quest is not ongoing, stop.
|
||||||
if(!checkFlagCondition(QF, cond, val)) { if(!condition.not) return false; }
|
if (!checkFlagCondition(QF, cond, val)) {
|
||||||
else { if(condition.not) return false; }
|
if (!condition.not) return false;
|
||||||
|
} else {
|
||||||
|
if (condition.not) return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(condition.checkQuestFlag != null && !condition.checkQuestFlag.isEmpty()){
|
if (condition.checkQuestFlag != null && !condition.checkQuestFlag.isEmpty()) {
|
||||||
if(!player.checkQuestFlag(condition.checkQuestFlag)){
|
if (!player.checkQuestFlag(condition.checkQuestFlag)) {
|
||||||
if(!condition.not) return false;
|
if (!condition.not) return false;
|
||||||
} else if(condition.not) return false;
|
} else if (condition.not) return false;
|
||||||
}
|
}
|
||||||
if(condition.getMapFlag != null){
|
if (condition.getMapFlag != null) {
|
||||||
String key = condition.getMapFlag.key;
|
String key = condition.getMapFlag.key;
|
||||||
String cond = condition.getMapFlag.op;
|
String cond = condition.getMapFlag.op;
|
||||||
int val = condition.getMapFlag.val;
|
int val = condition.getMapFlag.val;
|
||||||
int QF = stage.getQuestFlag(key);
|
int QF = stage.getQuestFlag(key);
|
||||||
if(!stage.checkQuestFlag(key)) return false; //If the quest is not ongoing, stop.
|
if (!stage.checkQuestFlag(key)) return false; //If the quest is not ongoing, stop.
|
||||||
if(!checkFlagCondition(QF, cond, val)) { if(!condition.not) return false; }
|
if (!checkFlagCondition(QF, cond, val)) {
|
||||||
else { if(condition.not) return false; }
|
if (!condition.not) return false;
|
||||||
|
} else {
|
||||||
|
if (condition.not) return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(condition.checkMapFlag != null && !condition.checkMapFlag.isEmpty()){
|
if (condition.checkMapFlag != null && !condition.checkMapFlag.isEmpty()) {
|
||||||
if(!stage.checkQuestFlag(condition.checkMapFlag)){
|
if (!stage.checkQuestFlag(condition.checkMapFlag)) {
|
||||||
if(!condition.not) return false;
|
if (!condition.not) return false;
|
||||||
} else if(condition.not) return false;
|
} else if (condition.not) return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
private boolean checkFlagCondition(int flag, String condition, int value){
|
|
||||||
switch(condition.toUpperCase()){
|
private boolean checkFlagCondition(int flag, String condition, int value) {
|
||||||
default: case "EQUALS": case"EQUAL": case "=":
|
switch (condition.toUpperCase()) {
|
||||||
if(flag == value) return true;
|
default:
|
||||||
case "LESSTHAN": case "<": if(flag < value) return true;
|
case "EQUALS":
|
||||||
case "MORETHAN": case ">": if(flag > value) return true;
|
case "EQUAL":
|
||||||
case "LE_THAN": case "<=": if(flag <= value) return true;
|
case "=":
|
||||||
case "ME_THAN": case ">=": if(flag >= value) return true;
|
if (flag == value) return true;
|
||||||
|
case "LESSTHAN":
|
||||||
|
case "<":
|
||||||
|
if (flag < value) return true;
|
||||||
|
case "MORETHAN":
|
||||||
|
case ">":
|
||||||
|
if (flag > value) return true;
|
||||||
|
case "LE_THAN":
|
||||||
|
case "<=":
|
||||||
|
if (flag <= value) return true;
|
||||||
|
case "ME_THAN":
|
||||||
|
case ">=":
|
||||||
|
if (flag >= value) return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class FSkin {
|
|||||||
public static Texture getLogo() {
|
public static Texture getLogo() {
|
||||||
if (Forge.isMobileAdventureMode)
|
if (Forge.isMobileAdventureMode)
|
||||||
return Forge.getAssets().getTexture(getDefaultSkinFile("adv_logo.png"));
|
return Forge.getAssets().getTexture(getDefaultSkinFile("adv_logo.png"));
|
||||||
return Forge.getAssets().getTexture(getSkinFile("hd_logo.png"));
|
return Forge.getAssets().getTexture(getSkinFile("hd_logo.png"), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void changeSkin(final String skinName) {
|
public static void changeSkin(final String skinName) {
|
||||||
@@ -150,7 +150,7 @@ public class FSkin {
|
|||||||
Forge.getAssets().loadTexture(f2);
|
Forge.getAssets().loadTexture(f2);
|
||||||
splashScreen.setSplashTexture(new TextureRegion(Forge.getAssets().getTexture(f2)));
|
splashScreen.setSplashTexture(new TextureRegion(Forge.getAssets().getTexture(f2)));
|
||||||
} else {
|
} else {
|
||||||
splashScreen.setSplashTexture(new TextureRegion(Forge.getAssets().getTexture(f2), 0, 0, w, h - 100));
|
splashScreen.setSplashTexture(new TextureRegion(Forge.getAssets().getTexture(f), 0, 0, w, h - 100));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Pixmap pxSplash = new Pixmap(f);
|
Pixmap pxSplash = new Pixmap(f);
|
||||||
|
|||||||
@@ -202,8 +202,9 @@ public enum FSkinTexture implements FImage {
|
|||||||
FileHandle preferredFile = isPlanechaseBG ? FSkin.getCachePlanechaseFile(filename) : FSkin.getSkinFile(filename);
|
FileHandle preferredFile = isPlanechaseBG ? FSkin.getCachePlanechaseFile(filename) : FSkin.getSkinFile(filename);
|
||||||
if (preferredFile.exists()) {
|
if (preferredFile.exists()) {
|
||||||
try {
|
try {
|
||||||
texture = Forge.getAssets().getTexture(preferredFile);
|
texture = Forge.getAssets().getTexture(preferredFile, false);
|
||||||
isloaded = true;
|
if (texture != null)
|
||||||
|
isloaded = true;
|
||||||
}
|
}
|
||||||
catch (final Exception e) {
|
catch (final Exception e) {
|
||||||
System.err.println("Failed to load skin file: " + preferredFile);
|
System.err.println("Failed to load skin file: " + preferredFile);
|
||||||
@@ -242,7 +243,8 @@ public enum FSkinTexture implements FImage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (repeat) {
|
if (repeat) {
|
||||||
texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
|
if (texture != null)
|
||||||
|
texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
Name:Domri's Ambush
|
Name:Domri's Ambush
|
||||||
ManaCost:R G
|
ManaCost:R G
|
||||||
Types:Sorcery
|
Types:Sorcery
|
||||||
A:SP$ PutCounter | Cost$ R G | ValidTgts$ Creature.YouCtrl | CounterType$ P1P1 | TgtPrompt$ Select target creature you control to put a +1/+1 counter | SubAbility$ DBDamage | SpellDescription$ Put a +1/+1 counter on target creature you control. Then that creature deals damage equal to its power to target creature or planeswalker you don't control.
|
A:SP$ PutCounter | Cost$ R G | ValidTgts$ Creature.YouCtrl | CounterType$ P1P1 | TgtPrompt$ Select target creature you control to put a +1/+1 counter | SubAbility$ DBDamage | AILogic$ PowerDmg | SpellDescription$ Put a +1/+1 counter on target creature you control. Then that creature deals damage equal to its power to target creature or planeswalker you don't control.
|
||||||
SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl,Planeswalker.YouDontCtrl | TgtPrompt$ Select target creature or planeswalker you don't control | NumDmg$ X | DamageSource$ ParentTarget | AILogic$ DamageAfterPutCounter
|
SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl,Planeswalker.YouDontCtrl | TgtPrompt$ Select target creature or planeswalker you don't control | NumDmg$ X | DamageSource$ ParentTarget | AILogic$ PowerDmg
|
||||||
SVar:X:ParentTargeted$CardPower
|
SVar:X:ParentTargeted$CardPower
|
||||||
DeckHas:Ability$Counters
|
DeckHas:Ability$Counters
|
||||||
Oracle:Put a +1/+1 counter on target creature you control. Then that creature deals damage equal to its power to target creature or planeswalker you don't control.
|
Oracle:Put a +1/+1 counter on target creature you control. Then that creature deals damage equal to its power to target creature or planeswalker you don't control.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:3 G
|
|||||||
Types:Instant
|
Types:Instant
|
||||||
A:SP$ PutCounter | CounterType$ P1P1 | CounterNum$ 2 | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl,Land.YouCtrl | TgtPrompt$ Select target artifact, creature, or land you control | SubAbility$ DBUntap | SpellDescription$ Put two +1/+1 counters on target artifact, creature, or land you control.
|
A:SP$ PutCounter | CounterType$ P1P1 | CounterNum$ 2 | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl,Land.YouCtrl | TgtPrompt$ Select target artifact, creature, or land you control | SubAbility$ DBUntap | SpellDescription$ Put two +1/+1 counters on target artifact, creature, or land you control.
|
||||||
SVar:DBUntap:DB$ Untap | Defined$ Targeted | SubAbility$ DBAnimate | SpellDescription$ Untap that permanent.
|
SVar:DBUntap:DB$ Untap | Defined$ Targeted | SubAbility$ DBAnimate | SpellDescription$ Untap that permanent.
|
||||||
SVar:DBAnimate:DB$ Animate | Defined$ Targeted | ConditionDefined$ Targeted | ConditionPresent$ Card.nonCreature | Power$ 0 | Toughness$ 0 | Types$ Creature | StackDescription$ SpellDescription | SpellDescription$ If it isn't a creature, it becomes a 0/0 creature in addition to its other types.
|
SVar:DBAnimate:DB$ Animate | Defined$ Targeted | ConditionDefined$ Targeted | ConditionPresent$ Card.nonCreature | Power$ 0 | Toughness$ 0 | Types$ Creature | Duration$ Permanent | StackDescription$ SpellDescription | SpellDescription$ If it isn't a creature, it becomes a 0/0 creature in addition to its other types.
|
||||||
DeckHas:Ability$Counters
|
DeckHas:Ability$Counters
|
||||||
DeckHints:Type$Artifact
|
DeckHints:Type$Artifact
|
||||||
Oracle:Put two +1/+1 counters on target artifact, creature, or land you control. Untap that permanent. If it isn't a creature, it becomes a 0/0 creature in addition to its other types.
|
Oracle:Put two +1/+1 counters on target artifact, creature, or land you control. Untap that permanent. If it isn't a creature, it becomes a 0/0 creature in addition to its other types.
|
||||||
|
|||||||
12
forge-gui/res/cardsfolder/upcoming/gandalf_the_grey.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/gandalf_the_grey.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
Name:Gandalf the Grey
|
||||||
|
ManaCost:3 U R
|
||||||
|
Types:Legendary Creature Avatar Wizard
|
||||||
|
PT:3/4
|
||||||
|
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCharm | TriggerDescription$ Whenever you cast an instant or sorcery spell, ABILITY
|
||||||
|
SVar:TrigCharm:DB$ Charm | Choices$ DBTapUntap,DBDamage,DBCopy,DBChangeZone | ChoiceRestriction$ ThisGame | CharmNum$ 1
|
||||||
|
SVar:DBTapUntap:DB$ TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent to tap or untap | SpellDescription$ You may tap or untap target permanent.
|
||||||
|
SVar:DBDamage:DB$ DealDamage | Defined$ Opponent | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to each opponent.
|
||||||
|
SVar:DBCopy:DB$ CopySpellAbility | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TgtPrompt$ Select target instant or sorcery spell you control | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||||
|
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put NICKNAME on top of its owner's library.
|
||||||
|
DeckNeeds:Type$Instant|Sorcery
|
||||||
|
Oracle:Whenever you cast an instant or sorcery spell, choose one that hasn't been chosen —\n• You may tap or untap target permanent.\n• Gandalf the Grey deals 3 damage to each opponent.\n• Copy target instant or sorcery spell you control. You may choose new targets for the copy.\n• Put Gandalf on top of its owner's library.
|
||||||
12
forge-gui/res/cardsfolder/upcoming/the_one_ring.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/the_one_ring.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
Name:The One Ring
|
||||||
|
ManaCost:4
|
||||||
|
Types:Legendary Artifact
|
||||||
|
K:Indestructible
|
||||||
|
T:Mode$ ChangesZone | ValidCard$ Card.wasCastByYou+Self | Destination$ Battlefield | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it, you gain protection from everything until your next turn.
|
||||||
|
SVar:TrigPump:DB$ Pump | Defined$ You | Duration$ UntilYourNextTurn | KW$ Protection from everything
|
||||||
|
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you lose 1 life for each burden counter on CARDNAME.
|
||||||
|
SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ X
|
||||||
|
A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ BURDEN | CounterNum$ 1 | SubAbility$ DBDraw | SpellDescription$ Put a burden counter on CARDNAME, then draw a card for each burden counter on CARDNAME.
|
||||||
|
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X
|
||||||
|
SVar:X:Count$CardCounters.BURDEN
|
||||||
|
Oracle:Indestructible\nWhen The One Ring enters the battlefield, if you cast it, you gain protection from everything until your next turn.\nAt the beginning of your upkeep, you lose 1 life for each burden counter on The One Ring.\n{T}: Put a burden coutner on The One Ring, then draw a card for each burden counter on The One Ring.
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[metadata]
|
||||||
|
Code=LTR
|
||||||
|
Date=2023-06-23
|
||||||
|
Name=The Lord of the Rings: Tales of Middle-earth
|
||||||
|
Type=Draft
|
||||||
|
ScryfallCode=LTR
|
||||||
|
|
||||||
|
[cards]
|
||||||
|
207 R Gandalf the Grey @Aaron Miller
|
||||||
|
246 M The One Ring @Veli Nystrom
|
||||||
|
273 L Plains @Deven Rue
|
||||||
|
275 L Island @Deven Rue
|
||||||
|
277 L Swamp @Deven Rue
|
||||||
|
279 L Mountain @Deven Rue
|
||||||
|
281 L Forest @Deven Rue
|
||||||
|
322 R Gandalf the Grey @Anato Finnstark
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2017-09-07)
|
Name:Arena Standard (2017-09-07)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2017-09-07
|
Effective:2017-09-07
|
||||||
Sets:XLN
|
Sets:XLN
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (RIX)
|
Name:Arena Standard (RIX)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2018-01-18
|
Effective:2018-01-18
|
||||||
Sets:XLN, RIX
|
Sets:XLN, RIX
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (AKH/HOU)
|
Name:Arena Standard (AKH/HOU)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2018-03-22
|
Effective:2018-03-22
|
||||||
Sets:XLN, RIX, AKH, HOU
|
Sets:XLN, RIX, AKH, HOU
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (DOM)
|
Name:Arena Standard (DOM)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2018-04-26
|
Effective:2018-04-26
|
||||||
Sets:XLN, RIX, AKH, HOU, DOM
|
Sets:XLN, RIX, AKH, HOU, DOM
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (KLD/AER)
|
Name:Arena Standard (KLD/AER)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2018-06-07
|
Effective:2018-06-07
|
||||||
Sets:XLN, RIX, AKH, HOU, DOM, KLD, AER, W17
|
Sets:XLN, RIX, AKH, HOU, DOM, KLD, AER, W17
|
||||||
Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter
|
Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (M19)
|
Name:Arena Standard (M19)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2018-07-12
|
Effective:2018-07-12
|
||||||
Sets:XLN, RIX, AKH, HOU, DOM, KLD, AER, W17, M19, ANA, PANA
|
Sets:XLN, RIX, AKH, HOU, DOM, KLD, AER, W17, M19, ANA, PANA
|
||||||
Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter
|
Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (GRN)
|
Name:Arena Standard (GRN)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2018-09-27
|
Effective:2018-09-27
|
||||||
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN
|
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN
|
||||||
Banned:Rampaging Ferocidon
|
Banned:Rampaging Ferocidon
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (G18)
|
Name:Arena Standard (G18)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2018-11-15
|
Effective:2018-11-15
|
||||||
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18
|
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18
|
||||||
Banned:Rampaging Ferocidon
|
Banned:Rampaging Ferocidon
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (RNA)
|
Name:Arena Standard (RNA)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2019-01-17
|
Effective:2019-01-17
|
||||||
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA
|
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA
|
||||||
Banned:Rampaging Ferocidon
|
Banned:Rampaging Ferocidon
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2019-02-14)
|
Name:Arena Standard (2019-02-14)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2019-02-14
|
Effective:2019-02-14
|
||||||
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA
|
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA
|
||||||
Banned:Nexus of Fate; Rampaging Ferocidon
|
Banned:Nexus of Fate; Rampaging Ferocidon
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (WAR)
|
Name:Arena Standard (WAR)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2019-04-25
|
Effective:2019-04-25
|
||||||
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR
|
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR
|
||||||
Banned:Nexus of Fate; Rampaging Ferocidon
|
Banned:Nexus of Fate; Rampaging Ferocidon
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (M20)
|
Name:Arena Standard (M20)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2019-07-02
|
Effective:2019-07-02
|
||||||
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20
|
Sets:XLN, RIX, DOM, M19, ANA, PANA, GRN, G18, RNA, WAR, M20
|
||||||
Banned:Nexus of Fate; Rampaging Ferocidon
|
Banned:Nexus of Fate; Rampaging Ferocidon
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (ELD)
|
Name:Arena Standard (ELD)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2019-09-26
|
Effective:2019-09-26
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2019-10-24)
|
Name:Arena Standard (2019-10-24)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2019-10-24
|
Effective:2019-10-24
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD
|
||||||
Banned:Field of the Dead
|
Banned:Field of the Dead
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2019-11-18)
|
Name:Arena Standard (2019-11-18)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2019-11-18
|
Effective:2019-11-18
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD
|
||||||
Banned:Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
Banned:Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (THB)
|
Name:Arena Standard (THB)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-01-16
|
Effective:2020-01-16
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB
|
||||||
Banned:Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
Banned:Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (IKO)
|
Name:Arena Standard (IKO)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-04-16
|
Effective:2020-04-16
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO
|
||||||
Banned:Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
Banned:Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2020-06-04)
|
Name:Arena Standard (2020-06-04)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-06-04
|
Effective:2020-06-04
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO
|
||||||
Banned:Agent of Treachery; Field of the Dead; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
Banned:Agent of Treachery; Field of the Dead; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (M21)
|
Name:Arena Standard (M21)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-06-25
|
Effective:2020-06-25
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO, M21
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO, M21
|
||||||
Banned:Agent of Treachery; Field of the Dead; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
Banned:Agent of Treachery; Field of the Dead; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2020-08-03)
|
Name:Arena Standard (2020-08-03)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-08-03
|
Effective:2020-08-03
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO, M21
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO, M21
|
||||||
Banned:Agent of Treachery; Cauldron Familiar; Field of the Dead; Fires of Invention; Growth Spiral; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation
|
Banned:Agent of Treachery; Cauldron Familiar; Field of the Dead; Fires of Invention; Growth Spiral; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (ANB)
|
Name:Arena Standard (ANB)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-08-12
|
Effective:2020-08-12
|
||||||
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO, M21, ANB
|
Sets:ANA, PANA, GRN, RNA, WAR, M20, ELD, THB, IKO, M21, ANB
|
||||||
Banned:Agent of Treachery; Cauldron Familiar; Field of the Dead; Fires of Invention; Growth Spiral; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation
|
Banned:Agent of Treachery; Cauldron Familiar; Field of the Dead; Fires of Invention; Growth Spiral; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (ZNR)
|
Name:Arena Standard (ZNR)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-09-17
|
Effective:2020-09-17
|
||||||
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR
|
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR
|
||||||
Banned:Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time
|
Banned:Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2020-09-28)
|
Name:Arena Standard (2020-09-28)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-09-28
|
Effective:2020-09-28
|
||||||
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR
|
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR
|
||||||
Banned:Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Uro, Titan of Nature's Wrath
|
Banned:Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Uro, Titan of Nature's Wrath
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2020-10-12)
|
Name:Arena Standard (2020-10-12)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2020-10-12
|
Effective:2020-10-12
|
||||||
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR
|
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR
|
||||||
Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath
|
Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (KHM)
|
Name:Arena Standard (KHM)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2021-01-28
|
Effective:2021-01-28
|
||||||
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR, KHM
|
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR, KHM
|
||||||
Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath
|
Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (STX)
|
Name:Arena Standard (STX)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2021-04-15
|
Effective:2021-04-15
|
||||||
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR, KHM, STX
|
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR, KHM, STX
|
||||||
Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath
|
Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (AFR)
|
Name:Arena Standard (AFR)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2021-07-08
|
Effective:2021-07-08
|
||||||
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR, KHM, STX, AFR
|
Sets:ANA, PANA, ELD, THB, IKO, M21, ANB, ZNR, KHM, STX, AFR
|
||||||
Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath
|
Banned:Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (MID)
|
Name:Arena Standard (MID)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2021-09-16
|
Effective:2021-09-16
|
||||||
Sets:ANA, PANA, ANB, ZNR, KHM, STX, AFR, MID
|
Sets:ANA, PANA, ANB, ZNR, KHM, STX, AFR, MID
|
||||||
Banned:Omnath, Locus of Creation
|
Banned:Omnath, Locus of Creation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (VOW)
|
Name:Arena Standard (VOW)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2021-11-17
|
Effective:2021-11-17
|
||||||
Sets:ANA, PANA, ANB, ZNR, KHM, STX, AFR, MID, VOW
|
Sets:ANA, PANA, ANB, ZNR, KHM, STX, AFR, MID, VOW
|
||||||
Banned:Omnath, Locus of Creation
|
Banned:Omnath, Locus of Creation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2022-01-27)
|
Name:Arena Standard (2022-01-27)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2022-01-27
|
Effective:2022-01-27
|
||||||
Sets:ANA, PANA, ANB, ZNR, KHM, STX, AFR, MID, VOW
|
Sets:ANA, PANA, ANB, ZNR, KHM, STX, AFR, MID, VOW
|
||||||
Banned:Alrund's Epiphany; Divide by Zero; Faceless Haven; Omnath, Locus of Creation
|
Banned:Alrund's Epiphany; Divide by Zero; Faceless Haven; Omnath, Locus of Creation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (NEO)
|
Name:Arena Standard (NEO)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2022-02-10
|
Effective:2022-02-10
|
||||||
Sets:ANA, PANA, ANB, ZNR, KHM, STX, AFR, MID, VOW, NEO
|
Sets:ANA, PANA, ANB, ZNR, KHM, STX, AFR, MID, VOW, NEO
|
||||||
Banned:Alrund's Epiphany; Divide by Zero; Faceless Haven; Omnath, Locus of Creation
|
Banned:Alrund's Epiphany; Divide by Zero; Faceless Haven; Omnath, Locus of Creation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2022-03-17)
|
Name:Arena Standard (2022-03-17)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2022-03-17
|
Effective:2022-03-17
|
||||||
Sets:ZNR, KHM, STX, AFR, MID, VOW, NEO
|
Sets:ZNR, KHM, STX, AFR, MID, VOW, NEO
|
||||||
Banned:Alrund's Epiphany; Divide by Zero; Faceless Haven; Omnath, Locus of Creation
|
Banned:Alrund's Epiphany; Divide by Zero; Faceless Haven; Omnath, Locus of Creation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (SNC)
|
Name:Arena Standard (SNC)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2022-04-28
|
Effective:2022-04-28
|
||||||
Sets:ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
Sets:ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
||||||
Banned:Alrund's Epiphany; Divide by Zero; Faceless Haven; Omnath, Locus of Creation
|
Banned:Alrund's Epiphany; Divide by Zero; Faceless Haven; Omnath, Locus of Creation
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (DMU)
|
Name:Arena Standard (DMU)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2022-09-01
|
Effective:2022-09-01
|
||||||
Sets:MID, VOW, NEO, SNC, DMU
|
Sets:MID, VOW, NEO, SNC, DMU
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (2022-10-13)
|
Name:Arena Standard (2022-10-13)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2022-10-13
|
Effective:2022-10-13
|
||||||
Sets:MID, VOW, NEO, SNC, DMU
|
Sets:MID, VOW, NEO, SNC, DMU
|
||||||
Banned:The Meathook Massacre
|
Banned:The Meathook Massacre
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (BRO)
|
Name:Arena Standard (BRO)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2022-11-15
|
Effective:2022-11-15
|
||||||
Sets:MID, VOW, NEO, SNC, DMU, BRO
|
Sets:MID, VOW, NEO, SNC, DMU, BRO
|
||||||
Banned:The Meathook Massacre
|
Banned:The Meathook Massacre
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Arena Standard (ONE)
|
Name:Arena Standard (ONE)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Standard
|
||||||
Effective:2023-02-07
|
Effective:2023-02-07
|
||||||
Sets:MID, VOW, NEO, SNC, DMU, BRO, ONE
|
Sets:MID, VOW, NEO, SNC, DMU, BRO, ONE
|
||||||
Banned:The Meathook Massacre
|
Banned:The Meathook Massacre
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (2022-04-28)
|
Name:Explorer (2022-04-28)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2022-04-28
|
Effective:2022-04-28
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
||||||
Banned:Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation
|
Banned:Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (2022-05-12)
|
Name:Explorer (2022-05-12)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2022-05-12
|
Effective:2022-05-12
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
||||||
Banned:Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
Banned:Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (2022-06-09)
|
Name:Explorer (2022-06-09)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2022-06-09
|
Effective:2022-06-09
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
||||||
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (2022-07-07)
|
Name:Explorer (2022-07-07)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2022-07-07
|
Effective:2022-07-07
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC
|
||||||
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (EA1)
|
Name:Explorer (EA1)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2022-07-28
|
Effective:2022-07-28
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1
|
||||||
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (DMU)
|
Name:Explorer (DMU)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2022-09-01
|
Effective:2022-09-01
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU
|
||||||
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (BRO)
|
Name:Explorer (BRO)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2022-11-15
|
Effective:2022-11-15
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU, BRO
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU, BRO
|
||||||
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (EA2)
|
Name:Explorer (EA2)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2022-12-13
|
Effective:2022-12-13
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU, BRO, EA2
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU, BRO, EA2
|
||||||
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[format]
|
[format]
|
||||||
Name:Explorer (ONE)
|
Name:Explorer (ONE)
|
||||||
Type:Archived
|
Type:Archived
|
||||||
Subtype:Arena
|
Subtype:Pioneer
|
||||||
Effective:2023-02-07
|
Effective:2023-02-07
|
||||||
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU, BRO, EA2, ONE
|
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX, AFR, MID, VOW, NEO, SNC, EA1, DMU, BRO, EA2, ONE
|
||||||
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
Banned:Expressive Iteration; Field of the Dead; Kethis, the Hidden Hand; Leyline of Abundance; Lurrus of the Dream-Den; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Tibalt's Trickery; Underworld Breach; Uro, Titan of Nature's Wrath; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 71 KiB |
@@ -60,7 +60,7 @@ public class InputLondonMulligan extends InputSyncronizedBase {
|
|||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
getController().getGui().updateButtons(getOwner(), localizer.getMessage("lblOk"), "", cardsLeft == 0, false, true);
|
getController().getGui().updateButtons(getOwner(), localizer.getMessage("lblOk"), localizer.getMessage("lblAuto"), cardsLeft == 0, cardsLeft != 0, true);
|
||||||
|
|
||||||
sb.append(String.format(localizer.getMessage("lblReturnForLondon"), cardsLeft));
|
sb.append(String.format(localizer.getMessage("lblReturnForLondon"), cardsLeft));
|
||||||
|
|
||||||
@@ -79,6 +79,25 @@ public class InputLondonMulligan extends InputSyncronizedBase {
|
|||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final void onCancel() {
|
||||||
|
int cardsLeft = toReturn - selected.size();
|
||||||
|
int count = 0;
|
||||||
|
for(Card c : player.getZone(ZoneType.Hand).getCards()) {
|
||||||
|
if (selected.contains(c)) { continue; }
|
||||||
|
|
||||||
|
selected.add(c);
|
||||||
|
setCardHighlight(c, selected.contains(c));
|
||||||
|
count++;
|
||||||
|
|
||||||
|
if (cardsLeft == count) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onOk();
|
||||||
|
}
|
||||||
|
|
||||||
private void done() {
|
private void done() {
|
||||||
resetCardHighlights();
|
resetCardHighlights();
|
||||||
getController().getGame().getView().updateIsMulligan(false);
|
getController().getGame().getView().updateIsMulligan(false);
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ public enum FSkinProp {
|
|||||||
//adventure icons
|
//adventure icons
|
||||||
ICO_MANASHARD (new int[] {2, 304, 100, 100}, PropType.ADVENTURE),
|
ICO_MANASHARD (new int[] {2, 304, 100, 100}, PropType.ADVENTURE),
|
||||||
ICO_ADVLOGO (new int[] {2, 2, 300, 300}, PropType.ADVENTURE),
|
ICO_ADVLOGO (new int[] {2, 2, 300, 300}, PropType.ADVENTURE),
|
||||||
ICO_ADVDECKBOX (new int[] {108, 356, 189, 242}, PropType.ADVENTURE),
|
ICO_ADVDECKBOX (new int[] {111, 365, 192, 240}, PropType.ADVENTURE),
|
||||||
|
|
||||||
//menu icon
|
//menu icon
|
||||||
ICO_MENU_GALAXY (new int[] {0, 1520, 80, 80}, PropType.ICON),
|
ICO_MENU_GALAXY (new int[] {0, 1520, 80, 80}, PropType.ICON),
|
||||||
|
|||||||
Reference in New Issue
Block a user