Merge remote-tracking branch 'upstream/master' into adventureupdatee

This commit is contained in:
Simisays
2023-03-25 08:51:17 +01:00
58 changed files with 252 additions and 104 deletions

View File

@@ -35,16 +35,11 @@ import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
public class AiCostDecision extends CostDecisionMakerBase {
private final SpellAbility ability;
private final Card source;
private final CardCollection discarded;
private final CardCollection tapped;
public AiCostDecision(Player ai0, SpellAbility sa, final boolean effect) {
super(ai0, effect);
ability = sa;
source = ability.getHostCard();
super(ai0, effect, sa, sa.getHostCard());
discarded = new CardCollection();
tapped = new CardCollection();

View File

@@ -26,7 +26,7 @@ public class CharmAi extends SpellAbilityAi {
@Override
protected boolean checkApiLogic(Player ai, SpellAbility sa) {
final Card source = sa.getHostCard();
List<AbilitySub> choices = CharmEffect.makePossibleOptions(sa, false);
List<AbilitySub> choices = CharmEffect.makePossibleOptions(sa);
final int num;
final int min;

View File

@@ -943,7 +943,6 @@ public class Game {
public GameStage getAge() {
return age;
}
public void setAge(GameStage value) {
age = value;
}

View File

@@ -20,7 +20,7 @@ import forge.util.collect.FCollection;
public class CharmEffect extends SpellAbilityEffect {
public static List<AbilitySub> makePossibleOptions(final SpellAbility sa, boolean forDesc) {
public static List<AbilitySub> makePossibleOptions(final SpellAbility sa) {
final Card source = sa.getHostCard();
List<String> restriction = null;
@@ -30,7 +30,7 @@ public class CharmEffect extends SpellAbilityEffect {
List<AbilitySub> choices = Lists.newArrayList(sa.getAdditionalAbilityList("Choices"));
if (!forDesc) {
if (source.getZone() != null) {
List<AbilitySub> toRemove = Lists.newArrayList();
for (AbilitySub ch : choices) {
// 603.3c If one of the modes would be illegal, that mode can't be chosen.
@@ -55,7 +55,7 @@ public class CharmEffect extends SpellAbilityEffect {
public static String makeFormatedDescription(SpellAbility sa) {
Card source = sa.getHostCard();
List<AbilitySub> list = CharmEffect.makePossibleOptions(sa, true);
List<AbilitySub> list = CharmEffect.makePossibleOptions(sa);
final int num;
boolean additionalDesc = sa.hasParam("AdditionalDescription");
boolean optional = sa.hasParam("Optional");
@@ -169,7 +169,7 @@ public class CharmEffect extends SpellAbilityEffect {
//this resets all previous choices
sa.setSubAbility(null);
List<AbilitySub> choices = makePossibleOptions(sa, false);
List<AbilitySub> choices = makePossibleOptions(sa);
// Entwine does use all Choices
if (sa.isEntwine()) {

View File

@@ -176,7 +176,6 @@ public class CountersPutEffect extends SpellAbilityEffect {
final Player activator = sa.getActivatingPlayer();
final PlayerController pc = activator.getController();
final boolean etbcounter = sa.hasParam("ETB");
final int max = sa.hasParam("MaxFromEffect") ? Integer.parseInt(sa.getParam("MaxFromEffect")) : -1;
boolean existingCounter = sa.hasParam("CounterType") && sa.getParam("CounterType").equals("ExistingCounter");
boolean eachExistingCounter = sa.hasParam("EachExistingCounter");
@@ -453,10 +452,6 @@ public class CountersPutEffect extends SpellAbilityEffect {
}
counterAmount = sa.usesTargeting() && sa.isDividedAsYouChoose() ? sa.getDividedValue(gameCard)
: counterAmount;
if (max != -1) {
counterAmount = Math.max(Math.min(max - gameCard.getCounters(counterType), counterAmount),
0);
}
if (sa.hasParam("UpTo")) {
int min = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("UpToMin", "0"), sa);
Map<String, Object> params = Maps.newHashMap();

View File

@@ -526,7 +526,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
if (state == CardStateName.FaceDown) {
view.updateHiddenId(game.nextHiddenCardId());
}
game.fireEvent(new GameEventCardStatsChanged(this, true)); //ensure stats updated for new characteristics
game.fireEvent(new GameEventCardStatsChanged(this)); //ensure stats updated for new characteristics
}
}
return true;
@@ -1427,6 +1427,10 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
@Override
public void addCounterInternal(final CounterType counterType, final int n, final Player source, final boolean fireEvents, GameEntityCounterTable table, Map<AbilityKey, Object> params) {
int addAmount = n;
// Rules say it is only a SBA, but is it checked there too?
if (counterType.is(CounterEnumType.DREAM) && hasKeyword("CARDNAME can't have more than seven dream counters on it.")) {
addAmount = Math.min(addAmount, 7 - getCounters(CounterEnumType.DREAM));
}
if (addAmount <= 0 || !canReceiveCounters(counterType)) {
// As per rule 107.1b
return;
@@ -7115,8 +7119,12 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
}
public void resetChosenModeTurn() {
boolean updateView = !chosenModesTurn.isEmpty() || !chosenModesTurnStatic.isEmpty();
chosenModesTurn.clear();
chosenModesTurnStatic.clear();
if (updateView) {
updateAbilityTextForView();
}
}
public int getPlaneswalkerAbilityActivated() {

View File

@@ -984,11 +984,24 @@ public class CardProperty {
if (card.getTurnInZone() <= sourceController.getLastTurnNr()) {
return false;
}
} else if (property.equals("ThisTurnEntered")) {
} else if (property.startsWith("ThisTurnEntered")) {
// only check if it entered the Zone this turn
if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) {
return false;
}
if (!property.equals("ThisTurnEntered")) { // to confirm specific zones / player
final boolean your = property.contains("Your");
final ZoneType where = ZoneType.smartValueOf(property.substring(your ? 19 : 15));
final Zone z = sourceController.getZone(where);
if (!z.getCardsAddedThisTurn(null).contains(card)) {
return false;
}
if (your) { // for corner cases of controlling other player
if (!card.getOwner().equals(sourceController)) {
return false;
}
}
}
} else if (property.equals("NotThisTurnEntered")) {
// only check if it entered the Zone this turn
if (card.getTurnInZone() == game.getPhaseHandler().getTurn()) {

View File

@@ -1,15 +1,23 @@
package forge.game.cost;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
public abstract class CostDecisionMakerBase implements ICostVisitor<PaymentDecision> {
protected final Player player;
protected final SpellAbility ability;
protected final Card source;
private boolean effect;
public CostDecisionMakerBase(Player player0, boolean effect0) {
public CostDecisionMakerBase(Player player0, boolean effect0, SpellAbility ability0, Card source0) {
player = player0;
effect = effect0;
ability = ability0;
source = source0;
}
public Player getPlayer() { return player; }
public abstract boolean paysRightAfterDecision();
public boolean isEffect() {

View File

@@ -22,7 +22,9 @@ public class GameEventCardStatsChanged extends GameEvent {
public GameEventCardStatsChanged(Card affected, boolean isTransform) {
cards = Arrays.asList(affected);
transform = isTransform;
//the transform should only fire once so the flip effect sound will trigger once every transformation...
// disable for now
transform = false;
}
public GameEventCardStatsChanged(Collection<Card> affected) {

View File

@@ -57,7 +57,7 @@
<dependency>
<groupId>com.github.tommyettinger</groupId>
<artifactId>textratypist</artifactId>
<version>0.7.9</version>
<version>0.8.1</version>
</dependency>
<dependency>
<groupId>com.badlogicgames.gdx-controllers</groupId>

View File

@@ -2,6 +2,7 @@ package forge.adventure.scene;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
@@ -55,6 +56,7 @@ public class ArenaScene extends UIScene implements IAfterMatch {
final Sprite edgeM;
final Sprite edgeWin;
final Sprite edgeWinM;
boolean enable = true;
boolean arenaStarted = false;
private ArenaScene() {
@@ -76,6 +78,8 @@ public class ArenaScene extends UIScene implements IAfterMatch {
goldLabel = ui.findActor("gold");
ui.onButtonPress("done", () -> {
if (!enable)
return;
if (!arenaStarted)
ArenaScene.this.done();
else
@@ -107,6 +111,8 @@ public class ArenaScene extends UIScene implements IAfterMatch {
}
private void startButton() {
if (!enable)
return;
if (roundsWon == 0) {
Dialog startDialog = prepareDialog(Forge.getLocalizer().getMessage("lblStart"), ButtonYes | ButtonNo, () -> startArena());
startDialog.text("Do you want to go into the Arena?");
@@ -119,6 +125,7 @@ public class ArenaScene extends UIScene implements IAfterMatch {
int roundsWon = 0;
private void startArena() {
enable = false;
goldLabel.setVisible(false);
arenaStarted = true;
startButton.setText("[%80]" + Forge.getLocalizer().getMessage("lblContinue"));
@@ -132,6 +139,7 @@ public class ArenaScene extends UIScene implements IAfterMatch {
@Override
public void setWinner(boolean winner) {
enable = false;
Array<ArenaRecord> winners = new Array<>();
Array<EnemySprite> winnersEnemies = new Array<>();
for (int i = 0; i < fighters.size - 2; i += 2) {
@@ -189,7 +197,15 @@ public class ArenaScene extends UIScene implements IAfterMatch {
}
if (Forge.isLandscapeMode()) {
actor.toFront();
actor.addAction(Actions.sequence(Actions.moveBy(0f, gridSize * 2f, 1), Actions.moveBy((float) (gridSize * stepsToTheSide * (leftPlayer ? 1 : -1)), 0f, 1)));
actor.addAction(Actions.sequence(Actions.moveBy(0f, gridSize * 2f, 1), Actions.moveBy((float) (gridSize * stepsToTheSide * (leftPlayer ? 1 : -1)), 0f, 1), new Action() {
@Override
public boolean act(float v) {
enable = true;
return true;
}
}));
} else {
enable = true;
}
}

View File

@@ -8,15 +8,9 @@ import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.*;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.ui.Button;
import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Touchpad;
import com.badlogic.gdx.scenes.scene2d.ui.*;
import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
@@ -48,20 +42,11 @@ public class GameHUD extends Stage {
static public GameHUD instance;
private final GameStage gameStage;
private final Image avatar;
private final Image miniMapPlayer;
private final TextraLabel lifePoints;
private final TextraLabel money;
private final TextraLabel shards;
private final Image avatar, miniMapPlayer;
private final TextraLabel lifePoints, money, shards, keys;
private final Image miniMap, gamehud, mapborder, avatarborder, blank;
private final InputEvent eventTouchDown;
private final InputEvent eventTouchUp;
private final TextraButton deckActor;
private final TextraButton openMapActor;
private final TextraButton menuActor;
private final TextraButton statsActor;
private final TextraButton inventoryActor;
private final TextraButton exitToWorldMapActor;
private final InputEvent eventTouchDown, eventTouchUp;
private final TextraButton deckActor, openMapActor, menuActor, statsActor, inventoryActor, exitToWorldMapActor;
public final UIActor ui;
private final Touchpad touchpad;
private final Console console;
@@ -73,8 +58,10 @@ public class GameHUD extends Stage {
private final Dialog dialog;
private boolean dialogOnlyInput;
private final Array<TextraButton> dialogButtonMap = new Array<>();
private final Array<String> questKeys = new Array<>();
private String lifepointsTextColor = "";
TextraButton selectedKey;
private TextraButton selectedKey;
private final ScrollPane scrollPane;
private GameHUD(GameStage gameStage) {
super(new ScalingViewport(Scaling.stretch, Scene.getIntendedWidth(), Scene.getIntendedHeight()), gameStage.getBatch());
@@ -137,6 +124,11 @@ public class GameHUD extends Stage {
shards.setText("[%95][+Shards] 0");
money.setText("[%95][+Gold] ");
lifePoints.setText("[%95][+Life] 20/20");
keys = Controls.newTextraLabel("");
scrollPane = new ScrollPane(keys);
scrollPane.setPosition(2, 2);
scrollPane.setStyle(Controls.getSkin().get("transluscent", ScrollPane.ScrollPaneStyle.class));
addActor(scrollPane);
AdventurePlayer.current().onLifeChange(() -> lifePoints.setText("[%95][+Life]" + lifepointsTextColor + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()));
AdventurePlayer.current().onShardsChange(() -> shards.setText("[%95][+Shards] " + AdventurePlayer.current().getShards()));
@@ -291,6 +283,7 @@ public class GameHUD extends Stage {
Pixmap miniMapToolTipPixmap;
public void enter() {
questKeys.clear();
if (miniMapTexture != null)
miniMapTexture.dispose();
miniMapTexture = new Texture(WorldSave.getCurrentSave().getWorld().getBiomeImage());
@@ -304,6 +297,28 @@ public class GameHUD extends Stage {
miniMap.setDrawable(new TextureRegionDrawable(miniMapTexture));
avatar.setDrawable(new TextureRegionDrawable(Current.player().avatar()));
Deck deck = AdventurePlayer.current().getSelectedDeck();
if (AdventurePlayer.current().hasItem("Red Key"))
questKeys.add("[+RedKey]");
if (AdventurePlayer.current().hasItem("Green Key"))
questKeys.add("[+GreenKey]");
if (AdventurePlayer.current().hasItem("Blue Key"))
questKeys.add("[+BlueKey]");
if (AdventurePlayer.current().hasItem("Black Key"))
questKeys.add("[+BlackKey]");
if (AdventurePlayer.current().hasItem("White Key"))
questKeys.add("[+WhiteKey]");
if (AdventurePlayer.current().hasItem("Strange Key"))
questKeys.add("[+StrangeKey]");
if (!questKeys.isEmpty()) {
keys.setText(String.join("\n", questKeys));
scrollPane.setSize(keys.getWidth() + 8, keys.getHeight() + 5);
scrollPane.layout();
keys.layout();
scrollPane.getColor().a = opacity;
} else {
keys.setText("");
scrollPane.getColor().a = 0;
}
if (deck == null || deck.isEmpty() || deck.getMain().toFlatList().size() < 30) {
deckActor.setColor(Color.RED);
} else {

View File

@@ -306,7 +306,7 @@ public class MapStage extends GameStage {
dialog.getContentTable().add(group).height(100).width(100).center();
dialog.getContentTable().add().row();
} else {
TypingLabel label = Controls.newTypingLabel("[%125]"+Controls.colorIdToTypingString(DeckProxy.getColorIdentity(deck)).toUpperCase()+"\n[%]"+deck.getName());
TypingLabel label = Controls.newTypingLabel("[%120]"+Controls.colorIdToTypingString(DeckProxy.getColorIdentity(deck)).toUpperCase()+"\n[%]"+deck.getName());
label.skipToTheEnd();
label.setAlignment(Align.center);
dialog.getContentTable().add(label).align(Align.center);

View File

@@ -8,6 +8,7 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.utils.Align;
import com.github.tommyettinger.textra.TextraLabel;
/*
Class to draw directly on a pixmap
@@ -26,7 +27,6 @@ public abstract class DrawOnPixmap {
on.drawPixmap(textureData.consumePixmap(), x, y, from.getRegionX(), from.getRegionY(), from.getRegionWidth(), from.getRegionHeight());
}
public static void drawText(Pixmap drawingMap, String itemText, int x, int y, float width, boolean bigText, Color color) {
//used for big numbers on Gold/Life for reward...
BitmapFont font = bigText ? Controls.getBitmapFont("big") : Controls.getBitmapFont("default");
@@ -59,4 +59,37 @@ public abstract class DrawOnPixmap {
if (bigText) //don't know why this is needed to circumvent bug getting default size for the same pixelfont
Controls.getBitmapFont("default");
}
public static void drawText(Pixmap drawingMap, TextraLabel itemText, int modX, int modY) {
FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, drawingMap.getWidth(), drawingMap.getHeight(), false);
SpriteBatch batch = new SpriteBatch();
frameBuffer.begin();
Gdx.gl.glClearColor(0, 0, 0, 0);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
Matrix4 matrix = new Matrix4();
matrix.setToOrtho2D(0, drawingMap.getHeight(), drawingMap.getWidth(), -drawingMap.getHeight());
batch.setProjectionMatrix(matrix);
batch.begin();
//Rendering ends here. Create a new Pixmap to Texture with mipmaps, otherwise will render as full black.
Texture texture = new Texture(drawingMap);
batch.draw(texture, 0, 0);
itemText.setWrap(true);
itemText.setAlignment(1);
itemText.setWidth(texture.getWidth());
itemText.setHeight(texture.getHeight());
itemText.setX(itemText.getX()+modX);
itemText.setY(itemText.getY()+modY);
itemText.draw(batch, 1);
batch.end();
Pixmap pixmap = Pixmap.createFromFrameBuffer(0, 0, drawingMap.getWidth(), drawingMap.getHeight());
drawingMap.drawPixmap(pixmap, 0, 0);
frameBuffer.end();
texture.dispose();
batch.dispose();
pixmap.dispose();
}
}

View File

@@ -44,13 +44,13 @@ public enum KeyBinding {
public String getLabelText(boolean pressed) {
if(Controllers.getCurrent()!=null)
{
return "[%125][+"+controllerPrefix+Input.Keys.toString(bindingController).replace(" Button","")+(pressed?"_pressed]":"]");
return "[%120][+"+controllerPrefix+Input.Keys.toString(bindingController).replace(" Button","")+(pressed?"_pressed]":"]");
}
else
{
if(GuiBase.isAndroid())
return "";
return "[%125][+"+Input.Keys.toString(binding)+(pressed?"_pressed]":"]");
return "[%120][+"+Input.Keys.toString(binding)+(pressed?"_pressed]":"]");
}
}

View File

@@ -305,7 +305,8 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
DrawOnPixmap.draw(drawingMap, backSprite);
Sprite item = atlas.createSprite(reward.type.toString());
DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - item.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1f), item);
DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getCount()), 0, (int) ((backSprite.getHeight() / 4f) * 2f) - 1, backSprite.getWidth(), true, Color.WHITE);
//DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getCount()), 0, (int) ((backSprite.getHeight() / 4f) * 2f) - 1, backSprite.getWidth(), true, Color.WHITE);
DrawOnPixmap.drawText(drawingMap, Controls.newTextraLabel("[%200]"+reward.getCount()), 0, -10);
setItemTooltips(item, backSprite, atlas);
image = new Texture(drawingMap);

View File

@@ -339,8 +339,10 @@ public class Assets implements Disposable {
textrafonts = new ObjectMap<>();
if (!textrafonts.containsKey("textrafont")) {
Font font = new Font(bitmapFont, 0f, 2f, 0f, 0f);
font.addAtlas(item_atlas, 0f, 0f, 0f);
font.addAtlas(pixelmana_atlas, 0f, -12f, 0f);
font.addAtlas(item_atlas, 0f, 4f, 0f);
//problematic atlas since some buttons are small, and this is too big for some buttons, need a way to enable
//this via property
//font.addAtlas(pixelmana_atlas, -90f, 20f, 0f);
font.integerPosition = false;
textrafonts.put("textrafont", font);
}
@@ -352,7 +354,7 @@ public class Assets implements Disposable {
textrafonts = new ObjectMap<>();
if (!textrafonts.containsKey("keysfont")) {
Font font = new Font(bitmapFont);
font.addAtlas(keys_atlas);
font.addAtlas(keys_atlas, 0f, 4f, 0f);
font.integerPosition = false;
textrafonts.put("keysfont", font);
}
@@ -364,7 +366,7 @@ public class Assets implements Disposable {
textrafonts = new ObjectMap<>();
if (!textrafonts.containsKey(name)) {
Font font = new Font(bitmapFont);
font.addAtlas(items_atlas);
font.addAtlas(items_atlas, 0f, 4f, 0f);
font.integerPosition = false;
textrafonts.put(name, font);
}

View File

@@ -239,7 +239,10 @@ public class SplashScreen extends FContainer {
}
void drawTransition(Graphics g, boolean openAdventure, float percentage) {
TextureRegion tr = new TextureRegion(Forge.getAssets().fallback_skins().get("title"));
Texture t = Forge.getAssets().fallback_skins().get("title");
TextureRegion tr = null;
if (t != null)
tr = new TextureRegion(t);
float oldAlpha = g.getfloatAlphaComposite();
g.setAlphaComposite(percentage);
if (openAdventure) {

View File

@@ -3,7 +3,7 @@ ManaCost:no cost
Types:Enchantment
S:Mode$ Continuous | EffectZone$ Command | Affected$ Card.Self | AffectedZone$ Command | RemoveAllAbilities$ True | IsPresent$ Card.namedGarruk's Boss Effect Phase One | PresentZone$ Command | PresentCompare$ EQ1
S:Mode$ Continuous | EffectZone$ Command | Affected$ Forest.YouCtrl | AddType$ Swamp | Description$ Each Forest you control is a Swamp in addition to its other land types.
S:Mode$ Continuous | Affected$ Beast.YouCtrl | AddPower$ 3 | AddToughness 3 | AddKeyword$ Trample & Deathtouch | Description$ Beast creatures you control get +3/+3 and have trample and Deathtouch
S:Mode$ Continuous | Affected$ Beast.YouCtrl | AddPower$ 3 | AddToughness$ 3 | AddKeyword$ Trample & Deathtouch | Description$ Beast creatures you control get +3/+3 and have trample and Deathtouch
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | PresentZone$ Command | Execute$ TrigConjure | TriggerDescription$ At the beginning of your upkeep, conjure a card of Garruk Phase 2's Spellbook into your hand.
SVar:TrigConjure:DB$ MakeCard | Conjure$ True | Zone$ Hand | AtRandom$ True | Spellbook$ Garruk; Apex Predator,Garruk; Cursed Huntsman,Garruk Relentless,In Garruk's Wake,Rampaging Baloths,Manglehorn,Elder Gargaroth,Gemrazer,Thragtusk,Sawtusk Demolisher,Avenger of Zendikar,Soul of the Harvest,Kogla; the Titan Ape, Terastodon, Bane of Progress
T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Player.Opponent | Execute$ DBEffect | TriggerZones$ Command | TriggerDescription$ Whenever an opponent casts a noncreature spell,perpetually increase the power and toughness of creatures you control and creature cards in your hand, library, and graveyard by 1.
@@ -13,4 +13,4 @@ SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True |
SVar:DBUpdate:DB$ UpdateRemember
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigReanimate | TriggerDescription$ At the beginning of your end step, return a random creature card from your graveyard to the battlefield. It gains "If this creature would leave the battlefield, exile it instead".
SVar:TrigReanimate:DB$ ChangeZone | ChangeType$ Creature.YouOwn | ChangeNum$ 1 | Hidden$ True | Origin$ Graveyard | AtRandom$ True | Destination$ Battlefield | LeaveBattlefield$ Exile
Oracle:Each Forest you control is a Swamp in addition to its other land types.\nBeast creatures you control get +3/+3 and have trample and Deathtouch\nAt the beginning of your upkeep, conjure a card of Garruk spellbook into your hand.\nWhenever an opponent casts a noncreature spell, perpetually increase the power and toughness of creatures you control and creature cards in your hand, library, and graveyard by 1. At the beginning of your end step, return a random creature card from your graveyard to the battlefield. That creature gains "If this creature would leave the battlefield, exile it instead".
Oracle:Each Forest you control is a Swamp in addition to its other land types.\nBeast creatures you control get +3/+3 and have trample and Deathtouch\nAt the beginning of your upkeep, conjure a card of Garruk spellbook into your hand.\nWhenever an opponent casts a noncreature spell, perpetually increase the power and toughness of creatures you control and creature cards in your hand, library, and graveyard by 1. At the beginning of your end step, return a random creature card from your graveyard to the battlefield. That creature gains "If this creature would leave the battlefield, exile it instead".

View File

@@ -9,8 +9,8 @@ SVar:TrigRollDice:DB$ RollDice | Sides$ 20 | ResultSubAbilities$ 1-5:DBConjureSm
SVar:DBConjureSmall:DB$ MakeCard | Conjure$ True | AtRandom$ True | Spellbook$ Chained Brute,Big Spender,Devilish Valet,Gibbering Fiend,Hobblefiend,Footlight Fiend,Forge Devil,Festival Crasher,Hulking Devil,Mayhem Devil,Spiteful Prankster,Vexing Devil,Wildfire Devil | Zone$ Battlefield | SpellDescription$ Conjure a random Devil unto the battlefield.
SVar:DBRandomLoot:DB$ Draw | Defined$ Player | NumCards$ 3 | SubAbility$ DBDiscard3 | SpellDescription$ Each player draws three cards, then discards three cards at random.
SVar:DBDiscard3:DB$ Discard | Defined$ Player | Mode$ Random | NumCards$ 3
SVar:DBDamage:DB$ DealDamage | NumDmg$ 7 | ValidTgts$ Creature | TargetsAtRandom$ True | SubAbility$ DBChangeZone | SpellDescription$ Tibalt deals seven damage to a creature chosen at random. Then Tibalt returns a random creature card to the battlefield
SVar:DBChangeZone:DB$ ChangeZone | ChangeType$ Creature | ChangeNum$ 1 | Hidden$ True | Origin$ Graveyard | AtRandom$ True | Destination$ Battlefield
SVar:DBDamage:DB$ DealDamage | NumDmg$ 7 | ValidTgts$ Creature,Player,Planeswalker | TargetsAtRandom$ True | SubAbility$ DBChangeZone | SpellDescription$ Tibalt deals seven damage to a creature chosen at random. Then Tibalt returns a random creature card to the battlefield
SVar:DBChangeZone:DB$ ChangeZone | ChangeType$ Creature | ChangeNum$ 1 | GainControl$ True | Hidden$ True | Origin$ Graveyard | AtRandom$ True | Destination$ Battlefield
SVar:DBCast:DB$ Play | AnySupportedCard$ Names:Hellion Eruption,Insurrection,Warp World,Shahrazad,Possibility Storm,Scrambleverse | RandomCopied$ True | CopyCard$ True | WithoutManaCost$ True | SpellDescription$ Cast a copy of one of the following cards chosen at random—Hellion Eruption, Insurrection, Warp World, Shahrazad, Possibility Storm, Scrambleverse.
SVar:DBWheel:DB$ Discard | Mode$ Hand | Defined$ Player | SubAbility$ DBEachDraw | SpellDescription$ Each player discards their hand, then draws seven cards.
SVar:DBEachDraw:DB$ Draw | Defined$ Player | NumCards$ 7

View File

@@ -2,7 +2,7 @@ Name:Xira's Boss Effect
ManaCost:no cost
Colors:black,green,red
Types:Enchantment
S:Mode$ Continuous | Affected$ Insect.YouCtrl | EffectZone$ Command | AddPower$ 1 | AddToughness 1 | AddKeyword$ Double Team | Description$ Nontoken insects you control have +1/+1 and Double Team.
S:Mode$ Continuous | Affected$ Insect.YouCtrl | EffectZone$ Command | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double Team | Description$ Nontoken insects you control have +1/+1 and Double Team.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ PutCounterAll | TriggerDescription$ At the beginning of your upkeep, put an egg counter on each nontoken creature.
SVar:PutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.nonToken | CounterType$ EGG | CounterNum$ 1
T:Mode$ ChangesZone | Origin$ Battlefield | TriggerZones$ Command | Destination$ Graveyard | ValidCard$ Creature.counters_GE1_EGG+OppCtrl | Execute$ TrigDraw | TriggerDescription$ Whenever a creature with an egg counter on it dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature.

View File

@@ -5,7 +5,7 @@ Types:Creature Insect
PT:0/2
K:Defender
K:Reach
S:Mode$ Continuous | Affected$ Insect.YouCtrl+nonToken | EffectZone$ Battlefield | AddPower$ 1 | AddToughness 1 | AddKeyword$ Double Team | Description$ Nontoken Insects you control have +1/+1 and double team.
S:Mode$ Continuous | Affected$ Insect.YouCtrl+nonToken | EffectZone$ Battlefield | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double Team | Description$ Nontoken Insects you control have +1/+1 and double team.
T:Mode$ DamageDone | ActivationLimit$ 1 | ValidSource$ Card.OppCtrl,Emblem.OppCtrl | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ When a source an opponent controls deals damage to you for the first time each turn, put an egg counter on CARDNAME.
SVar:TrigCounter:DB$ PutCounter | CounterType$ EGG | CounterNum$ 1
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies, create X 1/1 black Insect tokens for each egg counter on CARDNAME.

View File

@@ -136,7 +136,7 @@
<object id="194" template="../obj/collision.tx" x="-16.4079" y="346.105" width="527.5" height="16"/>
<object id="195" template="../obj/collision.tx" x="492.342" y="-22.9362" width="16" height="387.083"/>
<object id="196" template="../obj/collision.tx" x="-17.6579" y="-19.9362" width="16" height="382.083"/>
<object id="197" template="../obj/door_up.tx" x="290.342" y="104.105">
<object id="197" template="../obj/door_up.tx" x="284.842" y="71.105">
<properties>
<property name="teleport" value="maps/map/tibalt_f1.tmx"/>
<property name="teleportObjectId" value="114"/>
@@ -144,10 +144,5 @@
</object>
<object id="198" template="../obj/waypoint.tx" x="225.342" y="221.105"/>
<object id="199" template="../obj/waypoint.tx" x="202.342" y="251.605"/>
<object id="200" template="../obj/entry_up.tx" x="142.342" y="327.105">
<properties>
<property name="teleport" value="maps/map/tibalt_f2.tmx"/>
</properties>
</object>
</objectgroup>
</map>

View File

@@ -93,7 +93,7 @@
<property name="waypoints" value="183,181,182,181"/>
</properties>
</object>
<object id="161" template="../obj/entry_up.tx" x="464.012" y="105.236">
<object id="161" template="../obj/entry_up.tx" x="460.679" y="88.9027" width="31.6667" height="16">
<properties>
<property name="teleport" value="maps/map/tibalt_f2.tmx"/>
</properties>

View File

@@ -260,6 +260,15 @@ thinwindow
orig: 16, 16
offset: 0, 0
index: -1
transwindow
rotate: false
xy: 305, 415
size: 16, 16
split: 2, 2, 2, 2
pad: 0, 0, 0, 0
orig: 16, 16
offset: 0, 0
index: -1
uncheck
rotate: false
xy: 293, 375

View File

@@ -166,6 +166,26 @@
"playMode": 2,
"crushMode": 0
},
"transwindow10Patch": {
"region": "transwindow",
"horizontalStretchAreas": [ 2, 13 ],
"verticalStretchAreas": [ 2, 13 ],
"tiling": true,
"minWidth": 16,
"minHeight": 16,
"rightWidth": 4,
"leftWidth": 4,
"bottomHeight": 4,
"topHeight": 4,
"offsetX": 0,
"offsetY": 0,
"offsetXspeed": 0,
"offsetYspeed": 0,
"frameDuration": 0.03,
"regions": [],
"playMode": 2,
"crushMode": 0
},
"pressed10Patch": {
"region": "pressed",
"horizontalStretchAreas": [ 3, 10 ],
@@ -443,6 +463,9 @@
"gold": {
"background": "9patch4"
},
"transluscent": {
"background": "transwindow10Patch"
},
"nobg": {
"background": "transparent"
}
@@ -549,6 +572,11 @@
"background": "paper10Patch",
"titleFont": "default"
},
"transluscent": {
"parent": "default",
"background": "transwindow10Patch",
"titleFont": "default"
},
"gold": {
"background": "TenPatchGold",
"titleFont": "default"

View File

@@ -86,7 +86,7 @@
"type": "TextButton",
"name": "exittoworldmap",
"style":"menu",
"text": "[%125][+ExitToWorldMap]",
"text": "[%120][+ExitToWorldMap]",
"binding": "ExitToWorldMap",
"width": 48,
"height": 36,
@@ -97,7 +97,7 @@
"type": "TextButton",
"name": "deck",
"style":"menu",
"text": "[%125][+Deck]",
"text": "[%120][+Deck]",
"binding": "Deck",
"width": 48,
"height": 36,
@@ -108,7 +108,7 @@
"type": "TextButton",
"name": "inventory",
"style":"menu",
"text": "[%125][+Item]",
"text": "[%120][+Item]",
"binding": "Inventory",
"width": 48,
"height": 36,
@@ -120,7 +120,7 @@
"type": "TextButton",
"name": "statistic",
"style":"menu",
"text": "[%125][+Status]",
"text": "[%120][+Status]",
"binding": "Status",
"width": 48,
"height": 36,
@@ -131,7 +131,7 @@
"type": "TextButton",
"name": "menu",
"style":"menu",
"text": "[%125][+Menu]",
"text": "[%120][+Menu]",
"binding": "Menu",
"width": 48,
"height": 36,

View File

@@ -86,7 +86,7 @@
"type": "TextButton",
"name": "deck",
"style":"menu",
"text": "[%125][+Deck]",
"text": "[%120][+Deck]",
"binding": "Deck",
"width": 64,
"height": 36,
@@ -97,7 +97,7 @@
"type": "TextButton",
"name": "inventory",
"style":"menu",
"text": "[%125][+Item]",
"text": "[%120][+Item]",
"binding": "Inventory",
"width": 64,
"height": 36,
@@ -109,7 +109,7 @@
"type": "TextButton",
"name": "statistic",
"style":"menu",
"text": "[%125][+Status]",
"text": "[%120][+Status]",
"binding": "Status",
"width": 64,
"height": 36,
@@ -120,7 +120,7 @@
"type": "TextButton",
"name": "menu",
"style":"menu",
"text": "[%125][+Menu]",
"text": "[%120][+Menu]",
"binding": "Menu",
"width": 64,
"height": 36,
@@ -141,7 +141,7 @@
"type": "TextButton",
"name": "exittoworldmap",
"style":"menu",
"text": "[%125][+ExitToWorldMap]",
"text": "[%120][+ExitToWorldMap]",
"binding": "ExitToWorldMap",
"width": 64,
"height": 32,

View File

@@ -85,7 +85,7 @@
"type": "TextButton",
"name": "deck",
"style":"menu",
"text": "[%125][+Deck]",
"text": "[%120][+Deck]",
"binding": "Deck",
"width": 64,
"height": 32,
@@ -96,7 +96,7 @@
"type": "TextButton",
"name": "inventory",
"style":"menu",
"text": "[%125][+Item]",
"text": "[%120][+Item]",
"binding": "Inventory",
"width": 64,
"height": 32,
@@ -108,7 +108,7 @@
"type": "TextButton",
"name": "statistic",
"style":"menu",
"text": "[%125][+Status]",
"text": "[%120][+Status]",
"binding": "Status",
"width": 64,
"height": 32,
@@ -119,7 +119,7 @@
"type": "TextButton",
"name": "menu",
"style":"menu",
"text": "[%125][+Menu]",
"text": "[%120][+Menu]",
"binding": "Menu",
"width": 64,
"height": 32,
@@ -140,7 +140,7 @@
"type": "TextButton",
"name": "exittoworldmap",
"style":"menu",
"text": "[%125][+ExitToWorldMap]",
"text": "[%120][+ExitToWorldMap]",
"binding": "ExitToWorldMap",
"width": 64,
"height": 32,

View File

@@ -130,7 +130,7 @@
{
"type": "TextButton",
"name": "toggleAward",
"text": "[%125][+AWARD]",
"text": "[%120][+AWARD]",
"width": 30,
"height": 30,
"x": 315,

View File

@@ -121,7 +121,7 @@
{
"type": "TextButton",
"name": "toggleAward",
"text": "[%125][+AWARD]",
"text": "[%120][+AWARD]",
"width": 30,
"height": 30,
"x": 5,

View File

@@ -2,7 +2,7 @@ Name:Cruel Grimnarch
ManaCost:5 B
Types:Creature Phyrexian Cleric
PT:5/5
K:Deatchtouch
K:Deathtouch
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each opponent discards a card. For each opponent who can't, you gain 4 life.
SVar:TrigDiscard:DB$ Discard | Mode$ TgtChoose | Defined$ Player.Opponent | NumCards$ 1 | RememberDiscarded$ True | SubAbility$ DBRepeat
SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBGainLife | SubAbility$ DBCleanup
@@ -10,4 +10,4 @@ SVar:DBGainLife:DB$ GainLife | LifeAmount$ 4 | ConditionCheckSVar$ X | Conditio
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$Valid Card.nonLand+RememberedPlayerOwn
DeckHas:Ability$Discard
Oracle:Deathtouch\nWhen Cruel Grimnarch enters the battlefield, each opponent discards a card. For each opponent who can't, you gain 4 life
Oracle:Deathtouch\nWhen Cruel Grimnarch enters the battlefield, each opponent discards a card. For each opponent who can't, you gain 4 life

View File

@@ -3,6 +3,6 @@ ManaCost:U U B B
Types:Legendary Creature Shapeshifter
PT:3/3
K:Hexproof
T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ LazavCopy | OptionalDecider$ You | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ LazavCopy | OptionalDecider$ You | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from anywhere, you may have CARDNAME become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability.
SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True | Optional$ True | AddSVars$ LazavCopy | AILogic$ IfDefinedCreatureIsBetter
Oracle:Hexproof\nWhenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability.

View File

@@ -4,9 +4,9 @@ Types:Legendary Creature Human Wizard
PT:4/1
K:etbCounter:DREAM:7
K:CARDNAME can't have more than seven dream counters on it.
A:AB$ Mana | Cost$ SubCounter<1/DREAM> | Produced$ C | SpellDescription$ Add {C}.
A:AB$ PreventDamage | Cost$ SubCounter<1/DREAM> | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to CARDNAME this turn.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | IsPresent$ Card.Self+startedTheTurnUntapped | TriggerDescription$ At the beginning of your upkeep, if CARDNAME started the turn untapped, put a dream counter on it.
A:AB$ Mana | Cost$ SubCounter<1/DREAM/NICKNAME> | Produced$ C | SpellDescription$ Add {C}.
A:AB$ PreventDamage | Cost$ SubCounter<1/DREAM/NICKNAME> | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to NICKNAME this turn.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | IsPresent$ Card.Self+startedTheTurnUntapped | TriggerDescription$ At the beginning of your upkeep, if NICKNAME started the turn untapped, put a dream counter on it.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ DREAM | CounterNum$ 1
DeckHas:Ability$Counters
Oracle:Rasputin Dreamweaver enters the battlefield with seven dream counters on it.\nRemove a dream counter from Rasputin: Add {C}.\nRemove a dream counter from Rasputin: Prevent the next 1 damage that would be dealt to Rasputin this turn.\nAt the beginning of your upkeep, if Rasputin started the turn untapped, put a dream counter on it.\nRasputin can't have more than seven dream counters on it.

View File

@@ -5,7 +5,7 @@ PT:3/4
K:Reach
T:Mode$ ChangesZoneAll | ValidCards$ Land.YouOwn+nonToken | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigLifegain | TriggerDescription$ Whenever one or more land cards are put into your graveyard from anywhere, you gain 2 life.
SVar:TrigLifegain:DB$ GainLife | LifeAmount$ 2
T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ GE4 | IsPresent$ Card.Self+YouOwn | IsPresent2$ Land.YouCtrl+YouOwn+namedArgoth; Sanctum of Nature | ValidPlayer$ You | Execute$ Meld | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if you both own and control CARDNAME and a land named Argoth, Sanctum of Nature, exile them, then meld them into Titania, Gaea Incarnate.
T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ GE4 | IsPresent$ Card.Self+YouOwn | IsPresent2$ Land.YouCtrl+YouOwn+namedArgoth; Sanctum of Nature | ValidPlayer$ You | Execute$ Meld | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if there are four or more land cards in your graveyard and you both own and control CARDNAME and a land named Argoth, Sanctum of Nature, exile them, then meld them into Titania, Gaea Incarnate.
SVar:Meld:DB$ Meld | Name$ Titania, Gaea Incarnate | Primary$ Titania, Voice of Gaea | Secondary$ Argoth, Sanctum of Nature | SecondaryType$ Land
DeckHints:Name$Argoth, Sanctum of Nature
MeldPair:Argoth, Sanctum of Nature

View File

@@ -0,0 +1,10 @@
Name:Archangel Elspeth
ManaCost:2 W W
Types:Legendary Planeswalker Elspeth
Loyalty:4
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenScript$ w_1_1_soldier_lifelink | SpellDescription$ Create a 1/1 white Soldier creature token with lifelink.
A:AB$ PutCounter | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | CounterType$ P1P1 | CounterNum$ 2 | ValidTgts$ Creature | SubAbility$ DBAnimate | SpellDescription$ Put two +1/+1 counters on target creature.
SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Angel | Keywords$ Flying | Duration$ Permanent | StackDescription$ SpellDescription | SpellDescription$ It becomes an Angel in addition to its other types and gains flying.
A:AB$ ChangeZoneAll | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Permanent.nonLand+YouOwn+cmcLE3 | SpellDescription$ Return all nonland permanent cards with mana value 3 or less from your graveyard to the battlefield.
DeckHas:Ability$Token|LifeGain|Counters|Graveyard & Type$Soldier|Angel
Oracle:[+1]: Create a 1/1 white Soldier creature token with lifelink.\n[-2]: Put two +1/+1 counters on target creature. It becomes an Angel in addition to its other types and gains flying.\n[-6]: Return all nonland permanent cards with mana value 3 or less from your graveyard to the battlefield.

View File

@@ -0,0 +1,10 @@
Name:Quicksilver Servitor
ManaCost:2 U
Types:Creature Phyrexian Cleric
PT:3/3
K:Ward:2
T:Mode$ SpellCast | ValidCard$ Card.ThisTurnEnteredYourHand | ValidActivatingPlayer$ You | Execute$ TrigProliferate | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell from among cards put into your hand this turn, proliferate.
SVar:TrigProliferate:DB$ Proliferate
DeckHas:Ability$Proliferate
DeckNeeds:Ability$Counters
Oracle:Ward {2}\nWhenever you cast a spell from among cards put into your hand this turn, proliferate.

View File

@@ -3,7 +3,7 @@ ManaCost:G
Types:Creature Phyrexian Druid
PT:1/2
K:Toxic:1
T:Mode$ BecomesTarget | ValidTarget$ Creature.YouCtrl | ValidSource$ Spell | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever a creature you control becomes the target of a spell, target opponent gets a poison counter.
T:Mode$ BecomesTarget | ValidTarget$ Creature.YouCtrl+inZoneBattlefield | ValidSource$ Spell | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever a creature you control becomes the target of a spell, target opponent gets a poison counter.
SVar:TrigPoison:DB$ Poison | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Num$ 1
DeckHas:Ability$Counters
DeckHints:Type$Aura

View File

@@ -12,6 +12,7 @@ ScryfallCode=MOM
67 C Moment of Truth @Rovina Cai
94 R Breach the Multiverse @Liiga Smilshkalne
134 M Chandra, Hope's Beacon @Kieran Yanner
217 M Wrenn and Realmbreaker @Cristi Balanescu
222 R Drana and Linvala @Raluca Marinescu
225 R Ghalta and Mavren @Zezhou Chen
249 R Omnath, Locus of All @Bryan Sola
@@ -33,7 +34,9 @@ ScryfallCode=MOM
313 R Omnath, Locus of All @Jessica Rossier
316 M Thalia and The Gitrog Monster @Sami Makkonen
317 R Yargle and Multani @Lisa Heidhoff
320 M Archangel Elspeth @Denys Tsiperko
321 M Chandra, Hope's Beacon @Randy Vargas
322 M Wrenn and Realmbreaker @Jehan Choo
339 M Jin-Gitaxias @Julian Kok Joon Wen
352 R Faerie Mastermind @Joshua Raphael
358 R Breach the Multiverse @Liiga Smilshkalne

View File

@@ -896,6 +896,12 @@ ScryfallCode=SLD
1234 R Azusa, Lost but Seeking @Tsubonari
1235 R Teysa Karlov @Tsubonari
1236 R Paradise Mantle @Tsubonari
1237 R Xenk, Paladin Unbroken @Tatiana Vetrova & Jason Li
1238 R Simon, Wild Magic Sorcerer @Shuangcheng Leng
1239 R Forge, Neverwinter Charlatan @Liangliang Zhang
1240 R Holga, Relentless Rager @Yang Luo
1241 R Doric, Nature's Warden @Oiya Zhang & Liangliang Zhang
1242 R Edgin, Larcenous Lutenist @Wenfei Ye
1243 R Ugin, the Ineffable @Sansyu
1244 M Sorin, Imperious Bloodlord @Showichi Furumi
1245 M Sarkhan, Dragonsoul @Miyuki Aramaki

View File

@@ -11,7 +11,7 @@ ScryfallCode=SCH
3 R Dark Confidant @Livia Prima
4 R Spell Pierce @Andrew Mar
5 R Gilded Goose @Chris Seaman
6 C Omnath, Locus of Creation @John Tedrick
6 M Omnath, Locus of Creation @John Tedrick
7 R Annex Sentry @Sam Guay
8 R Memory Deluge @Sam Guay
9 M Koth, Fire of Resistance @Kieran Yanner
9 R Koth, Fire of Resistance @Kieran Yanner

View File

@@ -32,6 +32,7 @@ public final class ForgeConstants {
public static final String RES_DIR = ASSETS_DIR + "res" + PATH_SEPARATOR;
public static final String ADVENTURE_DIR = RES_DIR + "adventure" + PATH_SEPARATOR;
public static final String ADVENTURE_DEFAULT_PLANE_DIR = ADVENTURE_DIR + "Shandalar" + PATH_SEPARATOR;
public static final String LISTS_DIR = RES_DIR + "lists" + PATH_SEPARATOR;
public static final String SETLOOKUP_DIR = RES_DIR + "setlookup" + PATH_SEPARATOR;
public static final String KEYWORD_LIST_FILE = LISTS_DIR + "NonStackingKWList.txt";
@@ -84,7 +85,7 @@ public final class ForgeConstants {
public static final String AI_PROFILE_DIR = RES_DIR + "ai" + PATH_SEPARATOR;
public static final String SOUND_DIR = RES_DIR + "sound" + PATH_SEPARATOR;
public static final String MUSIC_DIR = RES_DIR + "music" + PATH_SEPARATOR;
public static final String ADVENTURE_MUSIC_DIR = ADVENTURE_DIR + "music" + PATH_SEPARATOR;
public static final String ADVENTURE_MUSIC_DIR = ADVENTURE_DEFAULT_PLANE_DIR + "music" + PATH_SEPARATOR;
public static final String LANG_DIR = RES_DIR + "languages" + PATH_SEPARATOR;
public static final String EFFECTS_DIR = RES_DIR + "effects" + PATH_SEPARATOR;
public static final String PUZZLE_DIR = RES_DIR + "puzzle" + PATH_SEPARATOR;

View File

@@ -47,20 +47,16 @@ import forge.util.collect.FCollectionView;
public class HumanCostDecision extends CostDecisionMakerBase {
private final PlayerControllerHuman controller;
private final SpellAbility ability;
private final Card source;
private String orString = null;
private boolean mandatory;
public HumanCostDecision(final PlayerControllerHuman controller, final Player p, final SpellAbility sa, final boolean effect, final Card source) {
this(controller, p, sa, effect, source, null);
public HumanCostDecision(final PlayerControllerHuman controller, final Player p, final SpellAbility sa, final boolean effect) {
this(controller, p, sa, effect, sa.getHostCard(), null);
}
public HumanCostDecision(final PlayerControllerHuman controller, final Player p, final SpellAbility sa, final boolean effect, final Card source, final String orString) {
super(p, effect);
super(p, effect, sa, source);
this.controller = controller;
ability = sa;
mandatory = sa.getPayCosts().isMandatory();
this.source = source;
this.orString = orString;
}

View File

@@ -165,7 +165,7 @@ public class HumanPlaySpellAbility {
&& ability.canCastTiming(human)
&& ability.checkRestrictions(human)
&& ability.isLegalAfterStack()
&& (isFree || payment.payCost(new HumanCostDecision(controller, human, ability, false, ability.getHostCard())));
&& (isFree || payment.payCost(new HumanCostDecision(controller, human, ability, false)));
game.clearTopLibsCast(ability);