diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 6ef4b64b7..58dc353d2 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -16398,10 +16398,10 @@ type=Land [/card] [card] name=City of Solitude -auto=this(variable{controllerturn}) maxCast(*)0 opponent -auto=this(variable{controllerturn}) lord(*|opponentbattlefield) noactivatedability -auto=this(variable{opponentturn}) maxCast(*)0 controller -auto=this(variable{opponentturn}) lord(*|mybattlefield) noactivatedability +auto=this(variable{controllerturn}>0) maxCast(*)0 opponent +auto=this(variable{controllerturn}>0) lord(*|opponentbattlefield) noactivatedability +auto=this(variable{opponentturn}>0) maxCast(*)0 controller +auto=this(variable{opponentturn}>0) lord(*|mybattlefield) noactivatedability text=Players can cast spells and activate abilities only during their own turns. mana={2}{G} type=Enchantment @@ -24860,8 +24860,8 @@ type=Land [/card] [card] name=Dosan the Falling Leaf -auto=this(variable{controllerturn}) maxCast(*)0 opponent -auto=this(variable{opponentturn}) maxCast(*)0 controller +auto=this(variable{controllerturn}>0) maxCast(*)0 opponent +auto=this(variable{opponentturn}>0) maxCast(*)0 controller text=Players can cast spells only during their own turns. mana={1}{G}{G} type=Legendary Creature @@ -29061,6 +29061,14 @@ type=Enchantment subtype=Aura [/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 auto=@each endofturn:moveto(mybattlefield) all(creature[fresh]|opponentgraveyard) auto=@each endofturn:moveto(opponentbattlefield) all(creature[fresh]|mygraveyard) @@ -29113,6 +29121,14 @@ mana={3}{W}{W} type=Instant [/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 auto=protection from(*[multicolor]) text=Protection from multicolored @@ -29981,6 +29997,15 @@ power=0 toughness=0 [/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 abilities=flying autohand={2}{cycle}:name(plainscycling) moveTo(myhand) target(plains|mylibrary) @@ -38047,8 +38072,8 @@ toughness=3 [/card] [card] name=Glory of Warfare -auto=this(variable{controllerturn}) lord(creature|mybattlefield) 2/0 -auto=this(variable{opponentturn}) lord(creature|mybattlefield) 0/2 +auto=this(variable{controllerturn}>0) lord(creature|mybattlefield) 2/0 +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. mana={2}{R}{W} type=Enchantment @@ -39827,8 +39852,8 @@ type=Artifact [/card] [card] name=Grand Abolisher -auto=this(variable{controllerturn}) maxCast(*)0 opponent -auto=this(variable{controllerturn}) lord(*[artifact;enchantment;creature]|opponentbattlefield) noactivatedability +auto=this(variable{controllerturn}>0) maxCast(*)0 opponent +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. mana={W}{W} type=Creature @@ -64511,6 +64536,15 @@ mana={1}{U} type=Instant [/card] [card] +name=Neverending Torment +target=player +auto=moveto(exile) target(*|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 abilities=flying other={3}{U} name(Evoke) @@ -65912,7 +65946,7 @@ subtype=Equipment [/card] [card] 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. mana={2}{G} type=Creature @@ -66036,7 +66070,7 @@ type=Artifact [/card] [card] 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. mana={3}{B}{B} type=Legendary Creature @@ -104694,8 +104728,8 @@ toughness=4 [/card] [card] name=Vibrating Sphere -auto=this(variable{controllerturn}) lord(creature|mybattlefield) 2/0 -auto=this(variable{opponentturn}) lord(creature|mybattlefield) 0/-2 +auto=this(variable{controllerturn}>0) lord(creature|mybattlefield) 2/0 +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. mana={4} type=Artifact @@ -111952,7 +111986,7 @@ toughness=1 [card] name=Zurgo Helmsmasher 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) 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} diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 9b1b81fb3..345ecc823 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -4509,24 +4509,12 @@ mana={3}{W} type=Enchantment [/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 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} type=Artifact [/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 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} @@ -4707,12 +4695,6 @@ type=Enchantment subtype=Aura [/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 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} @@ -10798,12 +10780,6 @@ power=2 toughness=2 [/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 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 diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 476c670b3..77671fe5e 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -599,6 +599,10 @@ private: { intValue = target->controller()->opponent()->drawCounter; } + else if (s == "epicactivated") + { + intValue = target->controller()->epic; + } else if (s == "p" || s == "power") { intValue = target->getPower(); @@ -1335,6 +1339,16 @@ public: 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 { public: diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 589e8766a..938f6d80a 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -42,6 +42,7 @@ public: int skippingTurn; int extraTurn; int drawCounter; + int epic; vector prowledTypes; vectorcurses; Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 1b2612e1a..e868654bb 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1328,6 +1328,31 @@ AAFakeAbility * AAFakeAbility::clone() const 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 AAFizzler::AAFizzler(GameObserver* observer, int _id, MTGCardInstance * card, Spell * _target, ManaCost * _cost) : ActivatedAbility(observer, _id, card, _cost, 0) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index e8d6c34ed..fca67f710 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2408,7 +2408,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } - //Reset damages on cards + //Do nothing found = s.find("donothing"); if (found != string::npos) { @@ -2418,6 +2418,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG 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 vector splitDamage = parseBetween(s, "damage:", " ", false); if (splitDamage.size()) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 0c6e9ec10..b174b612b 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -318,13 +318,15 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *) } } 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_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; ManaCost * playerMana = player->getManaPool(); ManaCost * cost = card->getManaCost(); @@ -650,12 +652,14 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * return 1; } 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_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; ManaCost * playerMana = player->getManaPool(); @@ -1035,14 +1039,16 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *) return 0; if(!allowedToAltCast(card,player)) 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. - 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->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || 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; ManaCost * playerMana = player->getManaPool(); ManaCost * morph = card->getManaCost()->getMorph(); diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 2003d0b83..c55d7b9c3 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -33,6 +33,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * skippingTurn = 0; extraTurn = 0; drawCounter = 0; + epic = 0; prowledTypes.clear(); doesntEmpty = NEW ManaCost(); poolDoesntEmpty = NEW ManaCost();