diff --git a/projects/mtg/bin/Res/missing_cards_by_sets/EVE.txt b/projects/mtg/bin/Res/missing_cards_by_sets/EVE.txt index 5b7a49dc4..851c48d53 100644 --- a/projects/mtg/bin/Res/missing_cards_by_sets/EVE.txt +++ b/projects/mtg/bin/Res/missing_cards_by_sets/EVE.txt @@ -62,15 +62,6 @@ power=2 toughness=2 [/card] [card] -name=Nucklavee -text=When Nucklavee enters the battlefield, you may return target red sorcery card from your graveyard to your hand. -- When Nucklavee enters the battlefield, you may return target blue instant card from your graveyard to your hand. -mana={4}{UR}{UR} -type=Creature -subtype=Beast -power=4 -toughness=4 -[/card] -[card] name=Phosphorescent Feast text=Chroma — Reveal any number of cards in your hand. You gain 2 life for each green mana symbol in those cards' mana costs. mana={2}{G}{G}{G} diff --git a/projects/mtg/bin/Res/missing_cards_by_sets/JUD.txt b/projects/mtg/bin/Res/missing_cards_by_sets/JUD.txt index 5507e3d1a..cf61fad29 100644 --- a/projects/mtg/bin/Res/missing_cards_by_sets/JUD.txt +++ b/projects/mtg/bin/Res/missing_cards_by_sets/JUD.txt @@ -129,11 +129,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Krosan Verge -text=Krosan Verge enters the battlefield tapped. -- {T}: Add {1} to your mana pool. -- {2}, {T}, Sacrifice Krosan Verge: Search your library for a Forest card and a Plains card and put them onto the battlefield tapped. Then shuffle your library. -type=Land -[/card] -[card] name=Laquatus's Disdain text=Counter target spell cast from a graveyard. -- Draw a card. mana={1}{U} diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index fafa79963..98474e8d0 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -98,6 +98,19 @@ power=2 toughness=2 [/card] [card] +name=Derevi, Empyrial Tactician +abilities=flying +auto=name(tap or untap) transforms((,newability[choice tap target(*)],newability[choice untap target(*)])) oneshot +auto=@combatdamaged(player) from(creature|myBattlefield):name(tap or untap) transforms((,newability[choice tap target(*)],newability[choice untap target(*)])) oneshot +#wagic doesn't have command zone +text=Flying -- Whenever Derevi, Empyrial Tactician enters the battlefield or a creature you control deals combat damage to a player, you may tap or untap target permanent. -- {1}{G}{W}{U}: Put Derevi onto the battlefield from the command zone. +mana={G}{W}{U} +type=Legendary Creature +subtype=Bird Wizard +power=2 +toughness=3 +[/card] +[card] name=Dimir Doppelganger auto={1}{U}{B}:target(creature|graveyard) moveto(exile) and!(copy)! text={1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability. @@ -150,6 +163,16 @@ power=2 toughness=1 [/card] [card] +name=Gahiji, Honored One +auto=@combat(attacking) source(creature|myBattlefield):all(trigger[to]) 2/0 ueot +text=Whenever a creature attacks one of your opponents or a planeswalker an opponent controls, that creature gets +2/+0 until end of turn. +mana={2}{R}{G}{W} +type=Legendary Creature +subtype=Beast +power=4 +toughness=4 +[/card] +[card] name=Goldmeadow Stalwart otherrestriction=type(*[kithkin]|myhand)~lessthan~2 other={3}{W} @@ -280,6 +303,18 @@ power=3 toughness=1 [/card] [card] +name=Oloro, Ageless Ascetic +auto=@each my upkeep:life:2 controller +auto=@lifeof(player):pay({1}) draw:1 controller && life:-1 opponent +#wagic doesn't have command zone +text=At the beginning of your upkeep, you gain 2 life. -- Whenever you gain life, you may pay {1}. If you do, draw a card and each opponent loses 1 life. -- At the beginning of your upkeep, if Oloro, Ageless Ascetic is in the command zone, you gain 2 life. +mana={3}{W}{U}{B} +type=Legendary Creature +subtype=Giant Soldier +power=4 +toughness=5 +[/card] +[card] name=Qasali Ambusher abilities=reach,spellmastery other={0} name(cast for free) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index b3222661a..309a43569 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -4080,8 +4080,7 @@ toughness=3 [/card] [card] name=Anvil of Bogardan -abilities=nomaxhand -auto=lord(*|opponentlibrary) nomaxhand +abilities=nomaxhand,oppnomaxhand auto=@each my draw:ability$!draw:1 _ choice name(discard) target(*|myhand) reject!$ controller auto=@each opponent draw:ability$!draw:1 _ choice name(discard) target(*|myhand) reject!$ opponent text=Players have no maximum hand size. -- At the beginning of each player's draw step, that player draws an additional card, then discards a card. @@ -6460,6 +6459,17 @@ power=2 toughness=2 [/card] [card] +name=Augury Owl +abilities=flying +auto=scry:3 scrycore delayed dontshow donothing scrycoreend scryend +text=Flying -- When Augury Owl enters the battlefield, scry 3. (To scry 3, look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) +mana={1}{U} +type=Creature +subtype=Bird +power=1 +toughness=1 +[/card] +[card] name=Auntie's Hovel auto=tap(noevent) auto=aslongas(goblin|myHand) untap @@ -61946,6 +61956,14 @@ power=6 toughness=5 [/card] [card] +name=Krosan Verge +auto=tap(noevent) +auto={T}:Add{1} +auto={2}{T}{S}:name(sacrifice to search) ability$! name(search forest) notatarget(forest|mylibrary) moveto(ownerbattlefield) and!(tap(noevent))! !$ controller && ability$! name(search plains) notatarget(plains|mylibrary) moveto(ownerbattlefield) and!(tap(noevent))! !$ controller +text=Krosan Verge enters the battlefield tapped. -- {T}: Add {1} to your mana pool. -- {2}, {T}, Sacrifice Krosan Verge: Search your library for a Forest card and a Plains card and put them onto the battlefield tapped. Then shuffle your library. +type=Land +[/card] +[card] name=Krosan Warchief auto={1}{G}:regenerate target(beast) auto=lord(beast|mycastingzone) altercost(colorless,-1) @@ -75573,6 +75591,18 @@ power=2 toughness=1 [/card] [card] +name=Nekusar, the Mindrazer +auto=@each my draw:draw:1 controller +auto=@each opponent draw:draw:1 opponent +auto=@drawfoeof(player):damage:1 opponent +text=At the beginning of each player's draw step, that player draws an additional card. -- Whenever an opponent draws a card, Nekusar, the Mindrazer deals 1 damage to that player. +mana={2}{U}{B}{R} +type=Legendary Creature +subtype=Zombie Wizard +power=2 +toughness=4 +[/card] +[card] name=Nema Siltlurker mana={4}{G} type=Creature @@ -77376,6 +77406,17 @@ power=4 toughness=4 [/card] [card] +name=Nucklavee +auto=ability$!name(return red sorcery) may moveto(ownerhand) target(sorcery[red]|mygraveyard)!$ controller +auto=ability$!name(return blue instant) may moveto(ownerhand) target(instant[blue]|mygraveyard)!$ controller +text=When Nucklavee enters the battlefield, you may return target red sorcery card from your graveyard to your hand. -- When Nucklavee enters the battlefield, you may return target blue instant card from your graveyard to your hand. +mana={4}{UR}{UR} +type=Creature +subtype=Beast +power=4 +toughness=4 +[/card] +[card] name=Nuisance Engine auto={2}{T}:token(Pest,artifact creature pest, 0/1, artifact) text={2}, {T}: Put a 0/1 colorless Pest artifact creature token onto the battlefield. @@ -79018,6 +79059,16 @@ power=1 toughness=3 [/card] [card] +name=Ophiomancer +text=At the beginning of each upkeep, if you control no Snakes, put a 1/1 black Snake creature token with deathtouch onto the battlefield. +auto=@each upkeep restriction{type(snake|mybattlefield)~lessthan~1}:token(Snake,Creature Snake,1/1,deathtouch,black) controller +mana={2}{B} +type=Creature +subtype=Human Shaman +power=2 +toughness=2 +[/card] +[card] name=Opportunist auto={t}:damage:1 target(creature[damaged]) text={T}: Opportunist deals 1 damage to target creature that was dealt damage this turn. @@ -84465,6 +84516,14 @@ mana={2}{R} type=Enchantment [/card] [card] +name=Price of Knowledge +abilities=nomaxhand,oppnomaxhand +auto=@each opponent upkeep:damage:type:*:opponenthand opponent +text=Players have no maximum hand size. -- At the beginning of each opponent's upkeep, Price of Knowledge deals damage to that player equal to the number of cards in that player's hand. +mana={6}{B} +type=Enchantment +[/card] +[card] name=Price of Progress auto=damage:twicetype:land[-basic]:mybattlefield controller auto=damage:twicetype:land[-basic]:opponentbattlefield opponent @@ -85296,6 +85355,18 @@ mana={X}{U} type=Sorcery [/card] [card] +name=Prossh, Skyraider of Kher +abilities=flying +auto=thisforeach(variable{manacost}>0) token(Kobolds of Kher Keep,Creature Kobold,0/1,Red) +auto={S(other creature|mybattlefield)}:1/0 ueot +text=Flying -- When you cast Prossh, Skyraider of Kher, put X 0/1 red Kobold creature tokens named Kobolds of Kher Keep onto the battlefield, where X is the amount of mana spent to cast Prossh. -- Sacrifice another creature: Prossh gets +1/+0 until end of turn. +mana={3}{B}{R}{G} +type=Legendary Creature +subtype=Dragon +power=5 +toughness=5 +[/card] +[card] name=Protean Hydra abilities=hydra auto=counter(1/1,X) @@ -90216,6 +90287,14 @@ power=3 toughness=4 [/card] [card] +name=Restore +target=land|graveyard +auto=moveto(mybattlefield) +text=Put target land card from a graveyard onto the battlefield under your control. +mana={1}{G} +type=Sorcery +[/card] +[card] name=Restore Balance auto=if type(land|mybattlefield)~morethan~type(land|opponentbattlefield) then ability$! sacrifice notatarget(land|mybattlefield) !$ controller auto=if type(land|opponentbattlefield)~morethan~type(land|mybattlefield) then ability$! sacrifice notatarget(land|mybattlefield) !$ opponent @@ -92238,6 +92317,17 @@ mana={5}{U} type=Enchantment [/card] [card] +name=Roon of the Hidden Realm +abilities=vigilance,trample +auto={2}{T}:name(exile) target(other creature) transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] moveto(ownerbattlefield)])) forever +text=Vigilance, trample -- {2}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step. +mana={2}{G}{W}{U} +type=Legendary Creature +subtype=Rhino Soldier +power=4 +toughness=4 +[/card] +[card] name=Root Cage auto=lord(mercenary) doesnotuntap text=Mercenaries don't untap during their controllers' untap steps. @@ -96470,6 +96560,17 @@ type=Artifact subtype=Equipment [/card] [card] +name=Scythe Specter +abilities=flying +auto=@combatdamaged(player) from(this):ability$!target(*|myhand) dynamicability reject!$ opponent +text=Flying -- Whenever Scythe Specter deals combat damage to a player, each opponent discards a card. Each player who discarded a card with the highest converted mana cost among cards discarded this way loses life equal to that converted mana cost. +mana={4}{B}{B} +type=Creature +subtype=Specter +power=4 +toughness=4 +[/card] +[card] name=Scythe Tiger abilities=shroud auto=aslongas(land|myBattlefield) moveTo(graveyard) notatarget(land|myBattlefield) oneshot @@ -99012,6 +99113,18 @@ mana={1}{R} type=Instant [/card] [card] +name=Shattergang Brothers +auto={2}{B}{S(creature|mybattlefield)}:name(sacrifice creature) ability$!sacrifice notatarget(creature|mybattlefield)!$ opponent +auto={2}{R}{S(artifact|mybattlefield)}:name(sacrifice artifact) ability$!sacrifice notatarget(artifact|mybattlefield)!$ opponent +auto={2}{G}{S(enchantment|mybattlefield)}:name(sacrifice enchantment) ability$!sacrifice notatarget(enchantment|mybattlefield)!$ opponent +text={2}{B}, Sacrifice a creature: Each other player sacrifices a creature. -- {2}{R}, Sacrifice an artifact: Each other player sacrifices an artifact. -- {2}{G}, Sacrifice an enchantment: Each other player sacrifices an enchantment. +mana={1}{B}{R}{G} +type=Legendary Creature +subtype=Goblin Artificer +power=3 +toughness=3 +[/card] +[card] name=Shattering Blow target=artifact auto=moveTo(exile) @@ -105479,6 +105592,15 @@ mana={1}{R} type=Instant [/card] [card] +name=Spawning Grounds +target=land +auto=teach(land) {T}:token(Beast,Creature Beast,5/5,trample,green) +text=Enchant land -- Enchanted land has "{T}: Put a 5/5 green Beast creature token with trample onto the battlefield." +mana={6}{G}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Spawning Pit auto={S(creature|myBattlefield)}:counter(0/0,1,Charge) auto={1}{C(0/0,-2,Charge)}:token(Spawn,artifact creature spawn, 2/2) @@ -114037,6 +114159,16 @@ mana={2}{W} type=Enchantment [/card] [card] +name=Terra Ravager +auto=@combat(attacking) source(this):type:land:opponentbattlefield/0 ueot +text=Whenever Terra Ravager attacks, it gets +X/+0 until end of turn, where X is the number of lands defending player controls. +mana={2}{R}{R} +type=Creature +subtype=Elemental Beast +power=0 +toughness=4 +[/card] +[card] name=Terra Stomper abilities=nofizzle,trample text=Terra Stomper can't be countered. -- Trample @@ -116189,6 +116321,16 @@ power=1 toughness=2 [/card] [card] +name=Tidal Force +auto=@each upkeep:name(tap or untap) transforms((,newability[choice tap target(*)],newability[choice untap target(*)])) oneshot +text=At the beginning of each upkeep, you may tap or untap target permanent. +mana={5}{U}{U}{U} +type=Creature +subtype=Elemental +power=7 +toughness=7 +[/card] +[card] name=Tidal Influence restriction=one of a kind auto=counter(0/0,1,Tide) @@ -122889,6 +123031,16 @@ power=2 toughness=2 [/card] [card] +name=Veteran Explorer +auto=@movedTo(this|graveyard) from(battlefield):name(fetch) transforms((,newability[ability$! moveto(ownerbattlefield) notatarget(land[basic]|mylibrary) !$ controller],newability[ability$! moveto(ownerbattlefield) notatarget(land[basic]|mylibrary) !$ opponent])) oneshot +text=When Veteran Explorer dies, each player may search his or her library for up to two basic land cards and put them onto the battlefield. Then each player who searched his or her library this way shuffles it. +mana={G} +type=Creature +subtype=Human Soldier Scout +power=1 +toughness=1 +[/card] +[card] name=Veteran of the Depths auto=@tapped(this):may counter(1/1,1) text=Whenever Veteran of the Depths becomes tapped, you may put a +1/+1 counter on it. diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index db25862ab..f218bc8b6 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -261,7 +261,8 @@ class Constants ASFLASH =139, CONDUITED = 140, CANBLOCKTAPPED = 141, - NB_BASIC_ABILITIES = 142, + OPPNOMAXHAND = 142, + NB_BASIC_ABILITIES = 143, RARITY_S = 'S', //Special Rarity RARITY_M = 'M', //Mythics diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index fe63f5c12..9fe6187b6 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -930,7 +930,10 @@ void GameObserver::gameStateBasedEffects() MTGGameZone * z = players[i]->game->inPlay; int nbcards = z->nb_cards; //------------------------------ - p->nomaxhandsize = (z->hasAbility(Constants::NOMAXHAND)); + if(z->hasAbility(Constants::NOMAXHAND)||p->opponent()->inPlay()->hasAbility(Constants::OPPNOMAXHAND)) + p->nomaxhandsize = true; + else + p->nomaxhandsize = false; ///////////////////////////////////////////////// //handle end of turn effects while we're at it.// diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index f84bde09e..8087fcb11 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -172,7 +172,8 @@ const char* Constants::MTGBasicAbilities[] = { "canttransform", "asflash", "conduited", - "canblocktapped" + "canblocktapped", + "oppnomaxhand" }; map Constants::MTGBasicAbilitiesMap;