added epic cards, fixed maxcast bug

maxcast(*)0 - checks for the current action player of that turn, but
when you passes the turn to the opponent, you can cast instant or cards
with flash instead because you are not the current player, it mustcheck
the controller of the card with play restriction if he can play it or
not whether it your turn or the opponents turn.
This commit is contained in:
Anthony Calosa
2015-09-07 10:09:34 +08:00
parent 45b880ef76
commit 022a15a5e9
8 changed files with 113 additions and 46 deletions
+49 -15
View File
@@ -16398,10 +16398,10 @@ type=Land
[/card] [/card]
[card] [card]
name=City of Solitude name=City of Solitude
auto=this(variable{controllerturn}) maxCast(*)0 opponent auto=this(variable{controllerturn}>0) maxCast(*)0 opponent
auto=this(variable{controllerturn}) lord(*|opponentbattlefield) noactivatedability auto=this(variable{controllerturn}>0) lord(*|opponentbattlefield) noactivatedability
auto=this(variable{opponentturn}) maxCast(*)0 controller auto=this(variable{opponentturn}>0) maxCast(*)0 controller
auto=this(variable{opponentturn}) lord(*|mybattlefield) noactivatedability auto=this(variable{opponentturn}>0) lord(*|mybattlefield) noactivatedability
text=Players can cast spells and activate abilities only during their own turns. text=Players can cast spells and activate abilities only during their own turns.
mana={2}{G} mana={2}{G}
type=Enchantment type=Enchantment
@@ -24860,8 +24860,8 @@ type=Land
[/card] [/card]
[card] [card]
name=Dosan the Falling Leaf name=Dosan the Falling Leaf
auto=this(variable{controllerturn}) maxCast(*)0 opponent auto=this(variable{controllerturn}>0) maxCast(*)0 opponent
auto=this(variable{opponentturn}) maxCast(*)0 controller auto=this(variable{opponentturn}>0) maxCast(*)0 controller
text=Players can cast spells only during their own turns. text=Players can cast spells only during their own turns.
mana={1}{G}{G} mana={1}{G}{G}
type=Legendary Creature type=Legendary Creature
@@ -29061,6 +29061,14 @@ type=Enchantment
subtype=Aura subtype=Aura
[/card] [/card]
[card] [card]
name=Endless Swarm
auto=token(Snake,Creature Snake,1/1,green)*phandcount
auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Endless Swarm:!)])) forever dontremove
text=Put a 1/1 green Snake creature token onto the battlefield for each card in your hand. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.)
mana={5}{G}{G}{G}
type=Sorcery
[/card]
[card]
name=Endless Whispers name=Endless Whispers
auto=@each endofturn:moveto(mybattlefield) all(creature[fresh]|opponentgraveyard) auto=@each endofturn:moveto(mybattlefield) all(creature[fresh]|opponentgraveyard)
auto=@each endofturn:moveto(opponentbattlefield) all(creature[fresh]|mygraveyard) auto=@each endofturn:moveto(opponentbattlefield) all(creature[fresh]|mygraveyard)
@@ -29113,6 +29121,14 @@ mana={3}{W}{W}
type=Instant type=Instant
[/card] [/card]
[card] [card]
name=Enduring Ideal
auto=moveto(mybattlefield) notatarget(enchantment|mylibrary) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )!
auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Enduring Ideal:!)])) forever dontremove
text=Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.)
mana={5}{W}{W}
type=Sorcery
[/card]
[card]
name=Enemy of the Guildpact name=Enemy of the Guildpact
auto=protection from(*[multicolor]) auto=protection from(*[multicolor])
text=Protection from multicolored text=Protection from multicolored
@@ -29981,6 +29997,15 @@ power=0
toughness=0 toughness=0
[/card] [/card]
[card] [card]
name=Eternal Dominion
target=opponent
auto=target(*[artifact;creature;enchantment;land]|targetedpersonslibrary) moveto(mybattlefield)
auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Eternal Dominion:!)])) forever dontremove
text=Search target opponent's library for an artifact, creature, enchantment, or land card. Put that card onto the battlefield under your control. Then that player shuffles his or her library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.)
mana={7}{U}{U}{U}
type=Sorcery
[/card]
[card]
name=Eternal Dragon name=Eternal Dragon
abilities=flying abilities=flying
autohand={2}{cycle}:name(plainscycling) moveTo(myhand) target(plains|mylibrary) autohand={2}{cycle}:name(plainscycling) moveTo(myhand) target(plains|mylibrary)
@@ -38047,8 +38072,8 @@ toughness=3
[/card] [/card]
[card] [card]
name=Glory of Warfare name=Glory of Warfare
auto=this(variable{controllerturn}) lord(creature|mybattlefield) 2/0 auto=this(variable{controllerturn}>0) lord(creature|mybattlefield) 2/0
auto=this(variable{opponentturn}) lord(creature|mybattlefield) 0/2 auto=this(variable{opponentturn}>0) lord(creature|mybattlefield) 0/2
text=As long as it's your turn, creatures you control get +2/+0. -- As long as it's not your turn, creatures you control get +0/+2. text=As long as it's your turn, creatures you control get +2/+0. -- As long as it's not your turn, creatures you control get +0/+2.
mana={2}{R}{W} mana={2}{R}{W}
type=Enchantment type=Enchantment
@@ -39827,8 +39852,8 @@ type=Artifact
[/card] [/card]
[card] [card]
name=Grand Abolisher name=Grand Abolisher
auto=this(variable{controllerturn}) maxCast(*)0 opponent auto=this(variable{controllerturn}>0) maxCast(*)0 opponent
auto=this(variable{controllerturn}) lord(*[artifact;enchantment;creature]|opponentbattlefield) noactivatedability auto=this(variable{controllerturn}>0) lord(*[artifact;enchantment;creature]|opponentbattlefield) noactivatedability
text=During your turn, your opponents can't cast spells or activate abilities of artifacts, creatures, or enchantments. text=During your turn, your opponents can't cast spells or activate abilities of artifacts, creatures, or enchantments.
mana={W}{W} mana={W}{W}
type=Creature type=Creature
@@ -64511,6 +64536,15 @@ mana={1}{U}
type=Instant type=Instant
[/card] [/card]
[card] [card]
name=Neverending Torment
target=player
auto=moveto(exile) target(<phandcount>*|targetedpersonslibrary)
auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Neverending Torment:!)])) forever dontremove
text=Search target player's library for X cards, where X is the number of cards in your hand, and exile them. Then that player shuffles his or her library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.)
mana={4}{B}{B}
type=Sorcery
[/card]
[card]
name=Nevermaker name=Nevermaker
abilities=flying abilities=flying
other={3}{U} name(Evoke) other={3}{U} name(Evoke)
@@ -65912,7 +65946,7 @@ subtype=Equipment
[/card] [/card]
[card] [card]
name=Oak Street Innkeeper name=Oak Street Innkeeper
auto=this(variable{opponentturn}) lord(creature[tapped]|mybattlefield) opponentshroud auto=this(variable{opponentturn}>0) lord(creature[tapped]|mybattlefield) opponentshroud
text=As long as it's not your turn, tapped creatures you control have hexproof. text=As long as it's not your turn, tapped creatures you control have hexproof.
mana={2}{G} mana={2}{G}
type=Creature type=Creature
@@ -66036,7 +66070,7 @@ type=Artifact
[/card] [/card]
[card] [card]
name=Ob Nixilis, the Fallen name=Ob Nixilis, the Fallen
auto=@movedTo(land|myBattlefield):may counter(1/1,3) && life:-3 opponent auto=@movedTo(land|myBattlefield):may life:-3 target(player) && counter(1/1,3) all(this)
text=Landfall - Whenever a land enters the battlefield under your control, you may have target player lose 3 life. If you do, put three +1/+1 counters on Ob Nixilis, the Fallen. text=Landfall - Whenever a land enters the battlefield under your control, you may have target player lose 3 life. If you do, put three +1/+1 counters on Ob Nixilis, the Fallen.
mana={3}{B}{B} mana={3}{B}{B}
type=Legendary Creature type=Legendary Creature
@@ -104694,8 +104728,8 @@ toughness=4
[/card] [/card]
[card] [card]
name=Vibrating Sphere name=Vibrating Sphere
auto=this(variable{controllerturn}) lord(creature|mybattlefield) 2/0 auto=this(variable{controllerturn}>0) lord(creature|mybattlefield) 2/0
auto=this(variable{opponentturn}) lord(creature|mybattlefield) 0/-2 auto=this(variable{opponentturn}>0) lord(creature|mybattlefield) 0/-2
text=As long as it's your turn, creatures you control get +2/+0. -- As long as it's not your turn, creatures you control get -0/-2. text=As long as it's your turn, creatures you control get +2/+0. -- As long as it's not your turn, creatures you control get -0/-2.
mana={4} mana={4}
type=Artifact type=Artifact
@@ -111952,7 +111986,7 @@ toughness=1
[card] [card]
name=Zurgo Helmsmasher name=Zurgo Helmsmasher
abilities=haste,mustattack abilities=haste,mustattack
auto=this(variable{controllerturn}) indestructible auto=this(variable{controllerturn}>0) indestructible
auto=@vampired(creature) from(this):counter(1/1,1) all(this) auto=@vampired(creature) from(this):counter(1/1,1) all(this)
text=Haste. -- Zurgo Helmsmasher attacks each combat if able. -- Zurgo Helmsmasher has indestructible as long as it is your turn. -- Whenever a creature dealt damage by Zurgo Helmsmasher dies, put a +1/+1 counter on Zurgo Helmsmasher. text=Haste. -- Zurgo Helmsmasher attacks each combat if able. -- Zurgo Helmsmasher has indestructible as long as it is your turn. -- Whenever a creature dealt damage by Zurgo Helmsmasher dies, put a +1/+1 counter on Zurgo Helmsmasher.
mana={2}{R}{W}{B} mana={2}{R}{W}{B}
@@ -4509,24 +4509,12 @@ mana={3}{W}
type=Enchantment type=Enchantment
[/card] [/card]
[card] [card]
name=Endless Swarm
text=Put a 1/1 green Snake creature token onto the battlefield for each card in your hand. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.)
mana={5}{G}{G}{G}
type=Sorcery
[/card]
[card]
name=Endoskeleton name=Endoskeleton
text=You may choose not to untap Endoskeleton during your untap step. -- {2}, {T}: Target creature gets +0/+3 for as long as Endoskeleton remains tapped. text=You may choose not to untap Endoskeleton during your untap step. -- {2}, {T}: Target creature gets +0/+3 for as long as Endoskeleton remains tapped.
mana={2} mana={2}
type=Artifact type=Artifact
[/card] [/card]
[card] [card]
name=Enduring Ideal
text=Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.)
mana={5}{W}{W}
type=Sorcery
[/card]
[card]
name=Enduring Renewal name=Enduring Renewal
text=Play with your hand revealed. -- If you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card. -- Whenever a creature is put into your graveyard from the battlefield, return it to your hand. text=Play with your hand revealed. -- If you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card. -- Whenever a creature is put into your graveyard from the battlefield, return it to your hand.
mana={2}{W}{W} mana={2}{W}{W}
@@ -4707,12 +4695,6 @@ type=Enchantment
subtype=Aura subtype=Aura
[/card] [/card]
[card] [card]
name=Eternal Dominion
text=Search target opponent's library for an artifact, creature, enchantment, or land card. Put that card onto the battlefield under your control. Then that player shuffles his or her library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.)
mana={7}{U}{U}{U}
type=Sorcery
[/card]
[card]
name=Etherium-Horn Sorcerer name=Etherium-Horn Sorcerer
text={1}{U}{R}: Return Etherium-Horn Sorcerer to its owner's hand. -- Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) text={1}{U}{R}: Return Etherium-Horn Sorcerer to its owner's hand. -- Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={4}{U}{R} mana={4}{U}{R}
@@ -10798,12 +10780,6 @@ power=2
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Neverending Torment
text=Search target player's library for X cards, where X is the number of cards in your hand, and exile them. Then that player shuffles his or her library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.)
mana={4}{B}{B}
type=Sorcery
[/card]
[card]
name=New Benalia name=New Benalia
text=New Benalia enters the battlefield tapped. -- When New Benalia enters the battlefield, scry 1. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.) -- {T}: Add {W} to your mana pool. text=New Benalia enters the battlefield tapped. -- When New Benalia enters the battlefield, scry 1. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.) -- {T}: Add {W} to your mana pool.
type=Land type=Land
+14
View File
@@ -599,6 +599,10 @@ private:
{ {
intValue = target->controller()->opponent()->drawCounter; intValue = target->controller()->opponent()->drawCounter;
} }
else if (s == "epicactivated")
{
intValue = target->controller()->epic;
}
else if (s == "p" || s == "power") else if (s == "p" || s == "power")
{ {
intValue = target->getPower(); intValue = target->getPower();
@@ -1335,6 +1339,16 @@ public:
AAFakeAbility * clone() const; AAFakeAbility * clone() const;
}; };
class AAEPIC: public ActivatedAbility
{
public:
string named;
AAEPIC(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target,string _newName, ManaCost * cost = NULL);
int resolve();
const string getMenuText();
AAEPIC * clone() const;
};
class AAFizzler: public ActivatedAbility class AAFizzler: public ActivatedAbility
{ {
public: public:
+1
View File
@@ -42,6 +42,7 @@ public:
int skippingTurn; int skippingTurn;
int extraTurn; int extraTurn;
int drawCounter; int drawCounter;
int epic;
vector<string> prowledTypes; vector<string> prowledTypes;
vector<MTGCardInstance*>curses; vector<MTGCardInstance*>curses;
Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL); Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL);
+25
View File
@@ -1328,6 +1328,31 @@ AAFakeAbility * AAFakeAbility::clone() const
return NEW AAFakeAbility(*this); return NEW AAFakeAbility(*this);
} }
//EPIC
AAEPIC::AAEPIC(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, string _named,ManaCost * cost):
ActivatedAbility(observer, id, source, cost, 0),named(_named)
{
this->target = _target;
}
int AAEPIC::resolve()
{
MTGCardInstance * _target = (MTGCardInstance *)target;
_target->controller()->epic = 1;
return 1;
}
const string AAEPIC::getMenuText()
{
if(named.size())
return named.c_str();
return "EPIC";
}
AAEPIC * AAEPIC::clone() const
{
return NEW AAEPIC(*this);
}
// Fizzler // Fizzler
AAFizzler::AAFizzler(GameObserver* observer, int _id, MTGCardInstance * card, Spell * _target, ManaCost * _cost) : AAFizzler::AAFizzler(GameObserver* observer, int _id, MTGCardInstance * card, Spell * _target, ManaCost * _cost) :
ActivatedAbility(observer, _id, card, _cost, 0) ActivatedAbility(observer, _id, card, _cost, 0)
+11 -1
View File
@@ -2408,7 +2408,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; return a;
} }
//Reset damages on cards //Do nothing
found = s.find("donothing"); found = s.find("donothing");
if (found != string::npos) if (found != string::npos)
{ {
@@ -2418,6 +2418,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; return a;
} }
//Epic
found = s.find("epic");
if (found != string::npos)
{
MTGAbility * a = NEW AAEPIC(observer, id, card, target,newName);
a->oneShot = 1;
return a;
}
//Damage //Damage
vector<string> splitDamage = parseBetween(s, "damage:", " ", false); vector<string> splitDamage = parseBetween(s, "damage:", " ", false);
if (splitDamage.size()) if (splitDamage.size())
+12 -6
View File
@@ -318,13 +318,15 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
} }
} }
else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH)
|| (player == currentPlayer && !game->isInterrupting || (player == card->controller() && !game->isInterrupting
&& (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN
|| game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN))
) )
{ {
if(card->controller()->epic)
return 0;
if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY) if (card->controller()->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY)
return 0; return 0;
ManaCost * playerMana = player->getManaPool(); ManaCost * playerMana = player->getManaPool();
ManaCost * cost = card->getManaCost(); ManaCost * cost = card->getManaCost();
@@ -650,12 +652,14 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *
return 1; return 1;
} }
else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH)
|| (player == currentPlayer && !game->isInterrupting || (player == card->controller() && !game->isInterrupting
&& (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN
|| game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN))
) )
{ {
if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY) if(card->controller()->epic)
return 0;
if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY)
return 0; return 0;
ManaCost * playerMana = player->getManaPool(); ManaCost * playerMana = player->getManaPool();
@@ -1035,14 +1039,16 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
return 0; return 0;
if(!allowedToAltCast(card,player)) if(!allowedToAltCast(card,player))
return 0; return 0;
if(card->controller()->epic)//zoetic cavern... morph is casted for a cost...
return 0;
//note lands can morph too, this is different from other cost types. //note lands can morph too, this is different from other cost types.
if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (player == currentPlayer if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (player == card->controller()
&& !game->isInterrupting && !game->isInterrupting
&& (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN
|| game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN))
) )
{ {
if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY) if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY)
return 0; return 0;
ManaCost * playerMana = player->getManaPool(); ManaCost * playerMana = player->getManaPool();
ManaCost * morph = card->getManaCost()->getMorph(); ManaCost * morph = card->getManaCost()->getMorph();
+1
View File
@@ -33,6 +33,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck *
skippingTurn = 0; skippingTurn = 0;
extraTurn = 0; extraTurn = 0;
drawCounter = 0; drawCounter = 0;
epic = 0;
prowledTypes.clear(); prowledTypes.clear();
doesntEmpty = NEW ManaCost(); doesntEmpty = NEW ManaCost();
poolDoesntEmpty = NEW ManaCost(); poolDoesntEmpty = NEW ManaCost();