Implemented Commander mode and rules, added Command Zone to game, added/fixed primitives, increased the major release version.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="0223" android:installLocation="preferExternal" android:versionName="@string/app_version" package="net.wagic.app">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="0231" android:installLocation="preferExternal" android:versionName="@string/app_version" package="net.wagic.app">
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Wagic</string>
|
||||
<string name="app_version">0.22.3</string>
|
||||
<string name="app_version">0.23.1</string>
|
||||
<string name="info_text">All Rights Reserved.</string>
|
||||
</resources>
|
||||
|
||||
BIN
projects/mtg/bin/Res/graphics/iconcommandzone.png
Normal file
BIN
projects/mtg/bin/Res/graphics/iconcommandzone.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
77
projects/mtg/bin/Res/rules/Commander.txt
Normal file
77
projects/mtg/bin/Res/rules/Commander.txt
Normal file
@@ -0,0 +1,77 @@
|
||||
name=Commander Format
|
||||
unlock=prx_commander
|
||||
[INIT]
|
||||
mode=mtg
|
||||
|
||||
#MTG Game specific rules
|
||||
auto=bonusrule
|
||||
auto=putinplayrule
|
||||
auto=kickerrule
|
||||
auto=alternativecostrule
|
||||
auto=buybackrule
|
||||
auto=flashbackrule
|
||||
auto=retracerule
|
||||
auto=suspendrule
|
||||
auto=morphrule
|
||||
auto=payzerorule
|
||||
auto=overloadrule
|
||||
auto=attackrule
|
||||
auto=attackcostrule
|
||||
auto=blockrule
|
||||
auto=blockcostrule
|
||||
auto=combattriggerrule
|
||||
auto=legendrule
|
||||
auto=planeswalkerrule
|
||||
auto=planeswalkerdamage
|
||||
auto=planeswalkerattack
|
||||
auto=tokencleanuprule
|
||||
auto=persistrule
|
||||
auto=vampirerule
|
||||
auto=unearthrule
|
||||
auto=lifelinkrule
|
||||
auto=deathtouchrule
|
||||
auto=soulbondrule
|
||||
auto=dredgerule
|
||||
auto=bestowrule
|
||||
|
||||
[PLAYERS]
|
||||
life:40
|
||||
offerinterruptonphase=draw
|
||||
|
||||
auto=shuffle
|
||||
auto=draw:7
|
||||
|
||||
auto=sethand:7
|
||||
auto=@each my draw:draw:1
|
||||
auto=maxPlay(land)1
|
||||
|
||||
#Lands Mana Rules
|
||||
auto=lord(Plains[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{W}
|
||||
auto=lord(Island[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{U}
|
||||
auto=lord(Swamp[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{B}
|
||||
auto=lord(Mountain[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{R}
|
||||
auto=lord(Forest[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{G}
|
||||
|
||||
|
||||
#Mana Empties from manapool at the end of each phase
|
||||
auto=@each untap:removeMana(*)
|
||||
auto=@each upkeep:removeMana(*)
|
||||
auto=@each draw:removeMana(*)
|
||||
auto=@each firstmain:removeMana(*)
|
||||
auto=@each combatbegins:removeMana(*)
|
||||
auto=@each attackers:removeMana(*)
|
||||
auto=@each blockers:removeMana(*)
|
||||
auto=@each combatdamage:removeMana(*)
|
||||
auto=@each combatEnds:removeMana(*)
|
||||
auto=@each secondmain:removeMana(*)
|
||||
auto=@each end:removeMana(*)
|
||||
auto=@each cleanup:removeMana(*)
|
||||
|
||||
#reset Creature damage at the cleanup phase
|
||||
auto=@each cleanup:all(*|myBattlefield) resetDamage
|
||||
|
||||
#Commander put back rule
|
||||
auto=@movedTo(*[iscommander]|mygraveyard) from(battlefield):may name(Put back to command zone) ability$!name(Put back to command zone) name(Put back to command zone) target(*[iscommander;fresh]|mygraveyard) moveto(mycommandzone)!$ controller
|
||||
auto=@movedTo(*[iscommander]|myexile) from(battlefield):may name(Put back to command zone) ability$!name(Put back to command zone) name(Put back to command zone) target(*[iscommander;fresh]|myexile) moveto(mycommandzone)!$ controller
|
||||
auto=@movedTo(*[iscommander]|mylibrary) from(battlefield):may name(Put back to command zone) ability$!name(Put back to command zone) name(Put back to command zone) target(*[iscommander]|mylibrary) moveto(mycommandzone)!$ controller
|
||||
auto=@movedTo(*[iscommander]|myhand) from(battlefield):may name(Put back to command zone) ability$!name(Put back to command zone) name(Put back to command zone) target(*[iscommander]|myhand) moveto(mycommandzone)!$ controller
|
||||
@@ -1765,6 +1765,18 @@ text={T}: Add {C} to your mana pool. -- {1}, {T}: Until end of turn, creatures y
|
||||
type=Land
|
||||
[/card]
|
||||
[card]
|
||||
name=Arcane Signet
|
||||
auto=if type(*[red]|myzones)~morethan~0 then transforms((,newability[{T}:add{R}])) forever
|
||||
auto=if type(*[white]|myzones)~morethan~0 then transforms((,newability[{T}:add{W}])) forever
|
||||
auto=if type(*[green]|myzones)~morethan~0 then transforms((,newability[{T}:add{G}])) forever
|
||||
auto=if type(*[blue]|myzones)~morethan~0 then transforms((,newability[{T}:add{U}])) forever
|
||||
auto=if type(*[black]|myzones)~morethan~0 then transforms((,newability[{T}:add{B}])) forever
|
||||
auto=if type(artifact|myzones)~morethan~0 then transforms((,newability[{T}:add{C}])) forever
|
||||
text={T}: Add one mana of any color in your commander's color identity.
|
||||
mana={2}
|
||||
type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Arcanist's Owl
|
||||
abilities=flying
|
||||
auto=name(look) reveal:4 optionone name(Get an artifact card) target(<1>*[artifact;enchantment]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<4>*|reveal) bottomoflibrary optiontwoend revealend
|
||||
@@ -4048,6 +4060,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Blaring Captain
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(blaring recruiter|mylibrary)
|
||||
auto=@combat(attacking) source(this):all(warrior[attacking]) 1/1
|
||||
text=Partner with Blaring Recruiter (When this creature enters the battlefield, target player may put Blaring Recruiter into their hand from their library, then shuffle.) -- Whenever Blaring Captain attacks, attacking Warriors get +1/+1 until end of turn.
|
||||
@@ -4059,6 +4072,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Blaring Recruiter
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(blaring captain|mylibrary)
|
||||
auto={2}{W}:create(warrior:creature warrior:1/1:white:)
|
||||
text=Partner with Blaring Captain (When this creature enters the battlefield, target player may put Blaring Captain into their hand from their library, then shuffle.) -- {2}{W}: Create a 1/1 white Warrior creature token.
|
||||
@@ -5154,12 +5168,12 @@ type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Brallin, Skyshark Rider
|
||||
abilities=hiddenface
|
||||
abilities=hiddenface,partner
|
||||
aicode=activate moveTo(myhand) target(Shabraz, the Skyshark|mylibrary)
|
||||
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(Shabraz, the Skyshark|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(Shabraz, the Skyshark|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend
|
||||
auto=@discarded(*|myHand):all(this) counter(1/1,1) && damage:1 opponent
|
||||
auto={R}:target(creature[Shark]) trample ueot
|
||||
text=Partner with Shabraz, the Skyshark (When this creature enters the battlefield, target player may put Shabraz into their hand from their library, then shuffle.) -- Whenever you discard a card, put a +1/+1 counter on Brallin, Skyshark Rider and it deals 1 damage to each opponent. / {R}: Target Shark gains trample until end of turn.
|
||||
text=Partner with Shabraz, the Skyshark (When this creature enters the battlefield, target player may put Shabraz into their hand from their library, then shuffle.) -- Whenever you discard a card, put a +1/+1 counter on Brallin, Skyshark Rider and it deals 1 damage to each opponent. -- {R}: Target Shark gains trample until end of turn.
|
||||
mana={3}{R}
|
||||
type=Legendary Creature
|
||||
subtype=Human Shaman
|
||||
@@ -6590,7 +6604,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Cazur, Ruthless Stalker
|
||||
abilities=hiddenface
|
||||
abilities=hiddenface,partner
|
||||
aicode=activate moveTo(myhand) target(Ukkima, Stalking Shadow|mylibrary)
|
||||
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(Ukkima, Stalking Shadow|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(Ukkima, Stalking Shadow|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend
|
||||
auto=@combatdamaged(player) from(creature|myBattlefield):all(trigger[from]) counter(1/1)
|
||||
@@ -6766,6 +6780,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Chakram Retriever
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(chakram slinger|mylibrary)
|
||||
auto=@movedTo(*|mystack) restriction{myturnonly}:untap target(creature)
|
||||
text=Partner with Chakram Slinger (When this creature enters the battlefield, target player may put Chakram Slinger into their hand from their library, then shuffle.) -- Whenever you cast a spell during your turn, untap target creature.
|
||||
@@ -6777,6 +6792,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Chakram Slinger
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(chakram retriever|mylibrary)
|
||||
auto={R}{T}:damage:2 target(player)
|
||||
text=Partner with Chakram Retriever (When this creature enters the battlefield, target player may put Chakram Retriever into their hand from their library, then shuffle.) -- {R}, {T}: Chakram Slinger deals 2 damage to target player or planeswalker.
|
||||
@@ -8200,7 +8216,12 @@ type=Land
|
||||
[/card]
|
||||
[card]
|
||||
name=Command Tower
|
||||
auto=chooseacolor transforms((,newability[{T}:add{chosencolor}])) forever chooseend
|
||||
auto=if type(*[red]|myzones)~morethan~0 then transforms((,newability[{T}:add{R}])) forever
|
||||
auto=if type(*[white]|myzones)~morethan~0 then transforms((,newability[{T}:add{W}])) forever
|
||||
auto=if type(*[green]|myzones)~morethan~0 then transforms((,newability[{T}:add{G}])) forever
|
||||
auto=if type(*[blue]|myzones)~morethan~0 then transforms((,newability[{T}:add{U}])) forever
|
||||
auto=if type(*[black]|myzones)~morethan~0 then transforms((,newability[{T}:add{B}])) forever
|
||||
auto=if type(artifact|myzones)~morethan~0 then transforms((,newability[{T}:add{C}])) forever
|
||||
text={T}: Add to your mana pool one mana of any color in your commander's color identity.
|
||||
type=Land
|
||||
[/card]
|
||||
@@ -8223,8 +8244,15 @@ type=Instant
|
||||
[card]
|
||||
name=Commander's Plate
|
||||
target=creature
|
||||
auto={3}:equip
|
||||
auto={5}:equip
|
||||
auto={3} restriction{type(creature[iscommander]|mybattlefield)~morethan~0}:name(equip commander) rehook target(creature[iscommander]|mybattlefield)
|
||||
auto=teach(creature) 3/3
|
||||
auto=if type(*[red]|myzones)~lessthan~1 then teach(creature) protection from red
|
||||
auto=if type(*[white]|myzones)~lessthan~1 then teach(creature) protection from white
|
||||
auto=if type(*[green]|myzones)~lessthan~1 then teach(creature) protection from green
|
||||
auto=if type(*[blue]|myzones)~lessthan~1 then teach(creature) protection from blue
|
||||
auto=if type(*[black]|myzones)~lessthan~1 then teach(creature) protection from black
|
||||
auto=if type(artifact|myzones)~lessthan~1 then teach(creature) protection from(artifact)
|
||||
text=Equipped creature gets +3/+3 and has protection from each color that's not in your commander's color identity. -- Equip commander {3} -- Equip {5}
|
||||
mana={1}
|
||||
type=Artifact
|
||||
@@ -8232,7 +8260,12 @@ subtype=Equipment
|
||||
[/card]
|
||||
[card]
|
||||
name=Commander's Sphere
|
||||
auto=chooseacolor transforms((,newability[{T}:add{chosencolor}])) forever chooseend
|
||||
auto=if type(*[red]|myzones)~morethan~0 then transforms((,newability[{T}:add{R}])) forever
|
||||
auto=if type(*[white]|myzones)~morethan~0 then transforms((,newability[{T}:add{W}])) forever
|
||||
auto=if type(*[green]|myzones)~morethan~0 then transforms((,newability[{T}:add{G}])) forever
|
||||
auto=if type(*[blue]|myzones)~morethan~0 then transforms((,newability[{T}:add{U}])) forever
|
||||
auto=if type(*[black]|myzones)~morethan~0 then transforms((,newability[{T}:add{B}])) forever
|
||||
auto=if type(artifact|myzones)~morethan~0 then transforms((,newability[{T}:add{C}])) forever
|
||||
auto={S}:draw:1 controller
|
||||
text={T}: Add to your mana pool one mana of any color in your commander's color identity. -- Sacrifice Commander's Sphere: Draw a card.
|
||||
mana={3}
|
||||
@@ -18560,7 +18593,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Gorm the Great
|
||||
abilities=vigilance,menace
|
||||
abilities=vigilance,menace,partner
|
||||
auto=may moveto(myhand) notatarget(Virtus the Veiled|mylibrary) and!(shuffle)!
|
||||
auto=@combat(attacking) source(this):all(creature|opponentbattlefield) mustblock ueot
|
||||
text=Partner with Virtus the Veiled (When this creature enters the battlefield, target player may put Virtus into their hand from their library, then shuffle.) -- Vigilance -- Gorm the Great must be blocked if able, and Gorm must be blocked by two or more creatures if able.
|
||||
@@ -19416,7 +19449,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Haldan, Avid Arcanist
|
||||
abilities=hiddenface,canplayfromexile
|
||||
abilities=hiddenface,canplayfromexile,partner
|
||||
aicode=activate moveTo(myhand) target(Pako, Arcane Retriever|mylibrary)
|
||||
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(Pako, Arcane Retriever|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(Pako, Arcane Retriever|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend
|
||||
auto=lord(*[-creature]|mycastingzone) transforms((,newability[anytypeofmana]))
|
||||
@@ -24029,7 +24062,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Khorvath Brightflame
|
||||
abilities=flying,haste
|
||||
abilities=flying,haste,partner
|
||||
auto=may moveto(myhand) notatarget(sylvia brightspear|mylibrary)
|
||||
auto=lord(knight|myBattlefield) flying
|
||||
auto=lord(knight|myBattlefield) haste
|
||||
@@ -25427,6 +25460,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Ley Weaver
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(lore weaver|mylibrary)
|
||||
auto={T}:untap <2>target(land)
|
||||
text=Partner with Lore Weaver (When this creature enters the battlefield, target player may put Lore Weaver into their hand from their library, then shuffle.) -- {T}: Untap two target lands.
|
||||
@@ -26256,6 +26290,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Lore Weaver
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(ley weaver|mylibrary)
|
||||
auto={5}{U}{U}:draw:2 target(player)
|
||||
text=Partner with Ley Weaver (When this creature enters the battlefield, target player may put Ley Weaver into their hand from their library, then shuffle.) -- {5}{U}{U}: Target player draws two cards.
|
||||
@@ -30120,7 +30155,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Nikara, Lair Scavenger
|
||||
abilities=menace
|
||||
abilities=menace,partner
|
||||
auto=may moveto(myhand) target(Yannik, Scavenging Sentinel|mylibrary)
|
||||
auto=@movedTo(other creature[counter{1/1<anyamount>}]|nonbattlezone) from(mybattlefield):draw:1 && life:-1 controller
|
||||
text=Partner with Yannik, Scavenging Sentinel (When this creature enters the battlefield, target player may put Yannik into their hand from their library, then shuffle.) -- Menace -- Whenever another creature you control leaves the battlefield, if it had one or more counters on it, you draw a card and you lose 1 life.
|
||||
@@ -32023,7 +32058,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Pako, Arcane Retriever
|
||||
abilities=hiddenface,haste
|
||||
abilities=hiddenface,haste,partner
|
||||
aicode=activate moveTo(myhand) target(Haldan, Avid Arcanist|mylibrary)
|
||||
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(Haldan, Avid Arcanist|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(Haldan, Avid Arcanist|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend
|
||||
auto=@combat(attacking) source(this):NOTCODED
|
||||
@@ -33755,6 +33790,7 @@ type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Proud Mentor
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(impetuous protege|mylibrary)
|
||||
auto={W}{T}:tap target(creature)
|
||||
text=Partner with Impetuous Protege (When this creature enters the battlefield, target player may put Impetuous Protege into their hand from their library, then shuffle.) -- {W}, {T}: Tap target creature.
|
||||
@@ -35434,7 +35470,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Regna, the Redeemer
|
||||
abilities=flying
|
||||
abilities=flying,partner
|
||||
auto=may moveto(myhand) notatarget(krav, the unredeemed|mylibrary)
|
||||
auto=@each endofturn restriction{compare(lifegain)~morethan~0}:create(warrior:creature warrior:1/1:white:)*2
|
||||
text=Partner with Krav, the Unredeemed (When this creature enters the battlefield, target player may put Krav into their hand from their library, then shuffle.) -- Flying -- At the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.
|
||||
@@ -39372,7 +39408,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Shabraz, the Skyshark
|
||||
abilities=hiddenface
|
||||
abilities=hiddenface,partner
|
||||
aicode=activate moveTo(myhand) target(Brallin, Skyshark Rider|mylibrary)
|
||||
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(Brallin, Skyshark Rider|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(Brallin, Skyshark Rider|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend
|
||||
auto=@drawof(player:all(this) counter(1/1,1) && life:1 controller
|
||||
@@ -40459,7 +40495,7 @@ type=Instant
|
||||
[/card]
|
||||
[card]
|
||||
name=Silvar, Devourer of the Free
|
||||
abilities=hiddenface,menace
|
||||
abilities=hiddenface,menace,partner
|
||||
aicode=activate moveTo(myhand) target(Trynn, Champion of Freedom|mylibrary)
|
||||
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(Trynn, Champion of Freedom|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(Trynn, Champion of Freedom|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend
|
||||
auto={S(Human|myBattlefield)}:all(this) counter(1/1) && indestructible ueot
|
||||
@@ -42131,7 +42167,7 @@ subtype=Aura
|
||||
[/card]
|
||||
[card]
|
||||
name=Soulblade Corrupter
|
||||
abilities=deathtouch
|
||||
abilities=deathtouch,partner
|
||||
auto=may moveto(myhand) notatarget(soulblade renewer|mylibrary)
|
||||
auto=@combat(attacking) source(creature[counter{1/1.1}]|mybattlefield):deathtouch ueot
|
||||
text=Partner with Soulblade Renewer (When this creature enters the battlefield, target player may put Soulblade Renewer into their hand from their library, then shuffle.) -- Deathtouch -- Whenever a creature with a +1/+1 counter on it attacks one of your opponents, that creature gains deathtouch until end of turn.
|
||||
@@ -42143,6 +42179,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Soulblade Renewer
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(soulblade corrupter|mylibrary)
|
||||
auto=target(<upto:2>other creature|battlefield) counter(1/1)
|
||||
text=Partner with Soulblade Corrupter (When this creature enters the battlefield, target player may put Soulblade Corrupter into their hand from their library, then shuffle.) -- When Soulblade Renewer enters the battlefield, support 2. (Put a +1/+1 counter on each of up to two other target creatures.)
|
||||
@@ -44878,7 +44915,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Sylvia Brightspear
|
||||
abilities=double strike
|
||||
abilities=double strike,partner
|
||||
auto=lord(dragon|myBattlefield) haste double strike
|
||||
auto=may moveto(myhand) notatarget(khorvath brightflame|mylibrary)
|
||||
text=Partner with Khorvath Brightflame (When this creature enters the battlefield, target player may put Khorvath into their hand from their library, then shuffle.) -- Double strike -- Dragons your team controls have double strike.
|
||||
@@ -47500,6 +47537,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Toothy, Imaginary Friend
|
||||
abilities=partner
|
||||
auto=may moveto(myhand) notatarget(pir, imaginative rascal|mylibrary)
|
||||
auto=@drawof(player):counter(1/1)
|
||||
auto=@movedTo(this|nonbattlezone) from(myBattlefield):thisforeach(counter{1/1,1}) draw:1 controller
|
||||
@@ -48261,7 +48299,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Trynn, Champion of Freedom
|
||||
abilities=hiddenface
|
||||
abilities=hiddenface,partner
|
||||
aicode=activate moveTo(myhand) target(Silvar, Devourer of the Free|mylibrary)
|
||||
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(Silvar, Devourer of the Free|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(Silvar, Devourer of the Free|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend
|
||||
auto=@each my endofturn:if raid then token(Soldier Try)
|
||||
@@ -48646,7 +48684,7 @@ toughness=0
|
||||
[/card]
|
||||
[card]
|
||||
name=Ukkima, Stalking Shadow
|
||||
abilities=hiddenface,unblockable
|
||||
abilities=hiddenface,unblockable,partner
|
||||
aicode=activate moveTo(myhand) target(Cazur, Ruthless Stalker|mylibrary)
|
||||
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(Cazur, Ruthless Stalker|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(Cazur, Ruthless Stalker|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend
|
||||
auto=@movedto(this|nonbattlezone):damage:storedpower target(opponent) && life:storedpower controller
|
||||
@@ -50284,7 +50322,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Virtus the Veiled
|
||||
abilities=deathtouch
|
||||
abilities=deathtouch,partner
|
||||
auto=may moveto(myhand) notatarget(gorm the great|mylibrary)
|
||||
auto=@combatdamaged(player) from(this):life:-halfdownopponentlifetotal opponent
|
||||
text=Partner with Gorm the Great (When this creature enters the battlefield, target player may put Gorm into their hand from their library, then shuffle.) -- Deathtouch -- Whenever Virtus the Veiled deals combat damage to a player, that player loses half their life, rounded up.
|
||||
@@ -50974,7 +51012,11 @@ type=Artifact
|
||||
[card]
|
||||
name=War Room
|
||||
auto={T}:add{C}
|
||||
auto={L:1}{3}{T}:draw:1 controller
|
||||
auto={L:1}{3}{T}:name(1 color in your identity) name(1 color in your identity) draw:1 controller
|
||||
auto={L:2}{3}{T}:name(2 colors in your identity) name(2 colors in your identity) draw:1 controller
|
||||
auto={L:3}{3}{T}:name(3 colors in your identity) name(3 colors in your identity) draw:1 controller
|
||||
auto={L:4}{3}{T}:name(4 colors in your identity) name(4 colors in your identity) draw:1 controller
|
||||
auto={L:5}{3}{T}:name(5 colors in your identity) name(5 colors in your identity) draw:1 controller
|
||||
text={T}: Add {C}. -- {3}, {T}, Pay life equal to the number of colors in your commanders' color identity: Draw a card.
|
||||
type=Land
|
||||
[/card]
|
||||
@@ -52374,7 +52416,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Yannik, Scavenging Sentinel
|
||||
abilities=vigilance
|
||||
abilities=vigilance,partner
|
||||
auto=may moveto(myhand) target(Nikara, Lair Scavenger|mylibrary)
|
||||
auto=(blink)forsrc target(other creature|mybattlefield) && target(creature) counter(1/1,storedpower)
|
||||
text=Partner with Nikara, Lair Scavenger -- Vigilance -- When Yannik, Scavenging Sentinel enters the battlefield, exile another creature you control until Yannik leaves the battlefield. When you do, distribute X +1/+1 counters among any number of target creatures, where X is the exiled creature's power.
|
||||
|
||||
@@ -181,6 +181,7 @@ subtype=Ajani
|
||||
[/card]
|
||||
[card]
|
||||
name=Aminatou, the Fateshifter
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,3,loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Draw a card and return a card on top) ability$!draw:1 controller _ choice target(*|myhand) moveTo(mylibrary)!$ controller
|
||||
auto={C(0/0,-3,Loyalty)}:name(-1: Exile other permanent and return it) moveTo(exile) target(other *|myBattlefield) and! moveTo(myBattlefield)!
|
||||
@@ -601,6 +602,7 @@ subtype=Daretti
|
||||
[/card]
|
||||
[card]
|
||||
name=Daretti, Scrap Savant
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,3,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Discard and Draw) reject notatarget(<upto:2>*|myhand) and!( draw:1 controller )!
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Sacrifice an Artifact) sacrifice notatarget(artifact|mybattlefield) and!( moveto(mybattlefield) target(artifact|mygraveyard) )!
|
||||
@@ -792,6 +794,7 @@ subtype=Elspeth
|
||||
[/card]
|
||||
[card]
|
||||
name=Estrid, the Masked
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,3,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Untap each enchanted permanent) untap all(*[geared]|myBattlefield)
|
||||
auto={C(0/0,-1,Loyalty)}:name(-1: Create an Aura Mask) token(Mask Est)
|
||||
@@ -803,6 +806,7 @@ subtype=Estrid
|
||||
[/card]
|
||||
[card]
|
||||
name=Freyalise, Llanowar's Fury
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,3,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Create a 1/1 Elf Druid) token(Elf Druid,Creature Elf Druid,1/1,green) and!(transforms((,newability[{T}:Add{G}])) forever)!
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Destroy target artifact or enchantment) target(artifact,enchantment) destroy
|
||||
@@ -1550,6 +1554,7 @@ subtype=Liliana
|
||||
[/card]
|
||||
[card]
|
||||
name=Lord Windgrace
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,5,Loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Discard and Draw) draw:1 controller && ability$!name(Choose one) choice name(Discard land) reject notatarget(*[land]|myhand) && draw:1 conroller _ choice name(Discard non-land) reject notatarget(*[-land]|myhand)!$ controller
|
||||
auto={C(0/0,-3,Loyalty)}:name(-3: Return up to two lands from graveyard) moveTo(myBattlefield) target(<upto:2>*[land]|myGraveyard)
|
||||
@@ -1648,6 +1653,7 @@ subtype=Nahiri
|
||||
[/card]
|
||||
[card]
|
||||
name=Nahiri, the Lithomancer
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,3,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Create a 1/1 Soldier and may equip) token(Kor Soldier,Creature Kor Soldier,1/1,white) and!(transforms((,newability[may target(equipment|mybattlefield) newhook])) oneshot)!
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Put an Equipment from hand or graveyard) notatarget(equipment|mygraveyard,myhand) moveto(ownerbattlefield)
|
||||
@@ -1866,6 +1872,7 @@ subtype=Nissa
|
||||
[/card]
|
||||
[card]
|
||||
name=Ob Nixilis of the Black Oath
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,3,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Each opponent loses 1 life...) life:-1 opponent && life:1 controller
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Create a 5/5 black Demon with flying...) token(Demon,Creature Demon,5/5,black,flying) && life:-2 controller
|
||||
@@ -1976,6 +1983,7 @@ subtype=Rowan
|
||||
[/card]
|
||||
[card]
|
||||
name=Rowan Kenrith
|
||||
abilities=partner,canbecommander
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Opponent creatures must attack) all(creature|opponentbattlefield) mustattack ueot
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Your creatures must attack) all(creature|mybattlefield) mustattack ueot
|
||||
@@ -2009,6 +2017,7 @@ subtype=Saheeli
|
||||
[/card]
|
||||
[card]
|
||||
name=Saheeli, the Gifted
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Create a 1/1 colorless Servo) token(Servo,Artifact Creature Servo,1/1)
|
||||
auto={C(0/0,-1,Loyalty)}:name(-1: The next spell has affinity for artifacts) lord(*|mycastingzone):affinityartifacts oneshot
|
||||
@@ -2303,6 +2312,7 @@ subtype=Teferi
|
||||
[/card]
|
||||
[card]
|
||||
name=Teferi, Temporal Archmage
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,5,loyalty)
|
||||
aicode=activate transforms((,newability[moveto(myhand) all(*[zpos=1]|mylibrary) && bottomoflibrary all(*[zpos=2]|mylibrary)])) ueot
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Look at the top two, one in hand other to bottom) name(Look) reveal:2 optionone name(Get a card) target(<1>*|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<2>*|reveal) bottomoflibrary optiontwoend revealend
|
||||
@@ -2348,7 +2358,7 @@ subtype=Teferi
|
||||
[/card]
|
||||
[card]
|
||||
name=Tevesh Szat, Doom of Fools
|
||||
abilities=partner
|
||||
abilities=partner,canbecommander
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Sacrifice and draw 2 cards) target(*[creature;planeswalker]|mybattlefield) sacrifice and!(draw:1)!
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Create two 0/1 black Thrull) token(Thrull,Creature Thrull,0/1,black)*2
|
||||
@@ -2696,9 +2706,10 @@ subtype=Vraska
|
||||
[/card]
|
||||
[card]
|
||||
name=Will Kenrith
|
||||
abilities=partner,canbecommander
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Up to two creatures 0/3 no abilities) target(<upto:2>creatures) transforms(setpower=0,settoughness=3,loseabilities) uynt
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Draw two cards and cost {2} less) target(player) draw:2 targetedplayer && emblem transforms((,newability[lord(*[instant;sorcery;planeswalker]|mycastingzone) altercost(colorless,-2)])) uynt
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Draw two cards and cost {2} less) target(player) draw:2 targetedplayer && all(this) transforms((,newability[lord(*[instant;sorcery;planeswalker]|mycastingzone) altercost(colorless,-2)])) uynt
|
||||
auto={C(0/0,-8,Loyalty)}:name(-8: Whenever cast instant or sorcery copy spell) emblem transforms((,newability[@movedTo(*[instant;sorcery]|myStack):may castcard(copied noevent) target(*[instant;sorcery]|mystack)])) forever dontremove
|
||||
text=+2: Until your next turn, up to two target creatures each have base power and toughness 0/3 and lose all abilities. -- −2: Target player draws two cards. Until your next turn, instant, sorcery, and planeswalker spells that player casts cost {2} less to cast. -- −8: Target player gets an emblem with "Whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy." -- Partner with Rowan Kenrith -- Will Kenrith can be your commander.
|
||||
mana={4}{U}{U}
|
||||
|
||||
@@ -478,12 +478,6 @@ power=3
|
||||
toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Arcane Signet
|
||||
text={T}: Add one mana of any color in your commander's color identity.
|
||||
mana={2}
|
||||
type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Arcanum Wings
|
||||
text=Enchant creature -- Enchanted creature has flying. -- Aura swap {2}{U} ({2}{U}: Exchange this Aura with an Aura card in your hand.)
|
||||
mana={1}{U}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#build.number.properties (normally this file is maintained by build.xml)
|
||||
#Sun, 20 May 2020 11:56:35 +0200
|
||||
build.major=0
|
||||
build.minor=22
|
||||
build.point=3
|
||||
build.minor=23
|
||||
build.point=1
|
||||
|
||||
|
||||
@@ -429,8 +429,8 @@ private:
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
Player * p = card->getObserver()->players[i];
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile, p->game->sideboard };//wish cards use sideboard
|
||||
for (int k = 0; k < 6; k++)
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile, p->game->sideboard, p->game->commandzone };//wish cards use sideboard
|
||||
for (int k = 0; k < 7; k++)
|
||||
{
|
||||
MTGGameZone * zone = zones[k];
|
||||
if (tc->targetsZone(zone, card))
|
||||
@@ -606,6 +606,10 @@ private:
|
||||
{
|
||||
intValue = card->controller()->game->stack->seenThisTurn("*[-creature]", Constants::CAST_ALL);
|
||||
}
|
||||
else if(s == "pnumofcommandcast" || s == "onumofcommandcast")
|
||||
{
|
||||
intValue = (s == "pnumofcommandcast")?card->controller()->numOfCommandCast:card->controller()->opponent()->numOfCommandCast;
|
||||
}
|
||||
else if (s == "evictg")
|
||||
{
|
||||
intValue = card->imprintG;
|
||||
|
||||
@@ -8,6 +8,7 @@ class GuiGraveyard;
|
||||
class GuiLibrary;
|
||||
class GuiOpponentHand;
|
||||
class GuiExile;
|
||||
class GuiCommandZone;
|
||||
class GuiAvatars: public GuiLayer
|
||||
{
|
||||
protected:
|
||||
@@ -16,6 +17,7 @@ protected:
|
||||
GuiLibrary* selfLibrary, *opponentLibrary;
|
||||
GuiOpponentHand *opponentHand;
|
||||
GuiExile* selfExile, *opponentExile;
|
||||
GuiCommandZone* selfCommandZone, *opponentCommandZone;
|
||||
GuiAvatar* active;
|
||||
|
||||
public:
|
||||
|
||||
@@ -98,4 +98,14 @@ public:
|
||||
virtual ostream& toString(ostream& out) const;
|
||||
};
|
||||
|
||||
class GuiCommandZone: public GuiGameZone
|
||||
{
|
||||
public:
|
||||
Player * player;
|
||||
GuiCommandZone(float _x, float _y, bool hasFocus, Player * player, GuiAvatars* parent);
|
||||
int receiveEventPlus(WEvent*);
|
||||
int receiveEventMinus(WEvent*);
|
||||
virtual ostream& toString(ostream& out) const;
|
||||
};
|
||||
|
||||
#endif // _GUISTATIC_H_
|
||||
|
||||
@@ -63,6 +63,8 @@ public:
|
||||
int sunburst;
|
||||
int equipment;
|
||||
int mutation;
|
||||
int damageInflictedAsCommander;
|
||||
int numofcastfromcommandzone;
|
||||
int auras;
|
||||
bool wasDealtDamage;
|
||||
bool combatdamageToOpponent;
|
||||
|
||||
@@ -215,6 +215,7 @@ public:
|
||||
string meta_name;
|
||||
vector<string> meta_AIHints;
|
||||
vector<string> Sideboard;
|
||||
vector<string> CommandZone;
|
||||
string meta_unlockRequirements;
|
||||
|
||||
int meta_id;
|
||||
|
||||
@@ -288,7 +288,9 @@ class Constants
|
||||
NOFIZZLEALTERNATIVE = 162,
|
||||
HASOTHERKICKER = 163,
|
||||
PARTNER = 164,
|
||||
NB_BASIC_ABILITIES = 165,
|
||||
CANBECOMMANDER = 165,
|
||||
ISCOMMANDER = 166,
|
||||
NB_BASIC_ABILITIES = 167,
|
||||
|
||||
RARITY_S = 'S', //Special Rarity
|
||||
RARITY_M = 'M', //Mythics
|
||||
|
||||
@@ -87,6 +87,14 @@ class MTGGameZone {
|
||||
SIDEBOARD = 85,
|
||||
OWNER_SIDEBOARD = 86,
|
||||
TARGETED_PLAYER_SIDEBOARD = 87,
|
||||
|
||||
MY_COMMANDZONE = 88,
|
||||
OPPONENT_COMMANDZONE = 89,
|
||||
TARGET_OWNER_COMMANDZONE = 90,
|
||||
TARGET_CONTROLLER_COMMANDZONE = 91,
|
||||
COMMANDZONE = 92,
|
||||
OWNER_COMMANDZONE = 93,
|
||||
TARGETED_PLAYER_COMMANDZONE = 94,
|
||||
};
|
||||
|
||||
Player * owner;
|
||||
@@ -214,6 +222,7 @@ public:
|
||||
MTGGameZone * garbageLastTurn;
|
||||
MTGGameZone * reveal;
|
||||
MTGGameZone * sideboard;
|
||||
MTGGameZone * commandzone;
|
||||
MTGGameZone * temp;
|
||||
|
||||
MTGPlayerCards();
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define GUI_LIBRARY 4
|
||||
#define GUI_OPPONENTHAND 5
|
||||
#define GUI_EXILE 6
|
||||
#define GUI_COMMANDZONE 7
|
||||
|
||||
#include <JGui.h>
|
||||
#include "WEvent.h"
|
||||
|
||||
@@ -44,6 +44,7 @@ public:
|
||||
int drawCounter;
|
||||
int energyCount;
|
||||
int yidaroCount;
|
||||
int numOfCommandCast;
|
||||
int monarch;
|
||||
int surveilOffset;
|
||||
int epic;
|
||||
|
||||
@@ -13,8 +13,8 @@ Mod by: Vitty85
|
||||
|
||||
/* Wagic versions */
|
||||
#define WAGIC_VERSION_MAJOR 0
|
||||
#define WAGIC_VERSION_MEDIUM 22
|
||||
#define WAGIC_VERSION_MINOR 3
|
||||
#define WAGIC_VERSION_MEDIUM 23
|
||||
#define WAGIC_VERSION_MINOR 1
|
||||
|
||||
#define VERSION_DOT(a, b, c) a ##.## b ##.## c
|
||||
#define VERSION_WITHOUT_DOT(a, b, c) a ## b ## c
|
||||
|
||||
@@ -1908,7 +1908,7 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
Player * p = observer->players[i];
|
||||
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay,p->game->stack,p->game->exile, p->game->reveal, p->game->sideboard };
|
||||
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay,p->game->stack,p->game->exile, p->game->reveal, p->game->sideboard, p->game->commandzone };
|
||||
if(a->getActionTc()->canTarget((Targetable*)p))
|
||||
{
|
||||
if(a->getActionTc()->maxtargets == 1)
|
||||
@@ -1919,7 +1919,7 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank
|
||||
else
|
||||
potentialTargets.push_back(p);
|
||||
}
|
||||
for (int j = 0; j < 6; j++)
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
MTGGameZone * zone = playerZones[j];
|
||||
for (int k = 0; k < zone->nb_cards; k++)
|
||||
@@ -2395,8 +2395,8 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
|
||||
}
|
||||
}
|
||||
MTGPlayerCards * playerZones = target->game;
|
||||
MTGGameZone * zones[] = { playerZones->hand, playerZones->library, playerZones->inPlay, playerZones->graveyard,playerZones->stack,playerZones->exile,playerZones->reveal, playerZones->sideboard };
|
||||
for (int j = 0; j < 8; j++)
|
||||
MTGGameZone * zones[] = { playerZones->hand, playerZones->library, playerZones->inPlay, playerZones->graveyard,playerZones->stack,playerZones->exile,playerZones->reveal, playerZones->sideboard, playerZones->commandzone };
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
MTGGameZone * zone = zones[j];
|
||||
for (int k = 0; k < zone->nb_cards; k++)
|
||||
@@ -3054,6 +3054,135 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
maxCost = pMana->getConvertedCost();
|
||||
}
|
||||
}
|
||||
//play from commandzone
|
||||
while ((card = cd.nextmatch(game->commandzone, card)))
|
||||
{
|
||||
if (!CanHandleCost(card->getManaCost(),card))
|
||||
continue;
|
||||
|
||||
if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY)
|
||||
continue;
|
||||
|
||||
if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name))
|
||||
continue;
|
||||
|
||||
if(hints && hints->HintSaysItsForCombo(observer,card))
|
||||
{
|
||||
if(hints->canWeCombo(observer,card,this))
|
||||
{
|
||||
AbilityFactory af(observer);
|
||||
int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions());
|
||||
if(!canPlay)
|
||||
continue;
|
||||
nextCardToPlay = card;
|
||||
gotPayments.clear();
|
||||
if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker()))
|
||||
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
||||
return activateCombo();
|
||||
}
|
||||
else
|
||||
{
|
||||
nextCardToPlay = NULL;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
int currentCost = card->getManaCost()->getConvertedCost();
|
||||
int hasX = card->getManaCost()->hasX();
|
||||
gotPayments.clear();
|
||||
if((!pMana->canAfford(card->getManaCost()) || card->getManaCost()->getKicker()))
|
||||
gotPayments = canPayMana(card,card->getManaCost());
|
||||
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
||||
if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost())))
|
||||
{
|
||||
TargetChooserFactory tcf(observer);
|
||||
TargetChooser * tc = tcf.createTargetChooser(card);
|
||||
int shouldPlayPercentage = 0;
|
||||
if (tc)
|
||||
{
|
||||
int hasTarget = chooseTarget(tc,NULL,NULL,true);
|
||||
if(
|
||||
(tc->maxtargets > hasTarget && tc->maxtargets > 1 && !tc->targetMin && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS) ||//target=<3>creature
|
||||
(tc->maxtargets == TargetChooser::UNLITMITED_TARGETS && hasTarget < 1)//target=creatures
|
||||
)
|
||||
hasTarget = 0;
|
||||
if (!hasTarget)//single target covered here.
|
||||
{
|
||||
SAFE_DELETE(tc);
|
||||
continue;
|
||||
}
|
||||
shouldPlayPercentage = 90;
|
||||
if(tc->targetMin && hasTarget < tc->maxtargets)
|
||||
shouldPlayPercentage = 0;
|
||||
if(tc->maxtargets > 1 && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS && hasTarget <= tc->maxtargets)
|
||||
{
|
||||
int maxA = hasTarget-tc->maxtargets;
|
||||
shouldPlayPercentage += (10*maxA);//reduce the chances of playing multitarget if we are not above max targets.
|
||||
}
|
||||
if(tc->maxtargets == TargetChooser::UNLITMITED_TARGETS)
|
||||
{
|
||||
shouldPlayPercentage = 40 + (10*hasTarget);
|
||||
int totalCost = pMana->getConvertedCost()-currentCost;
|
||||
int totalTargets = hasTarget+hasTarget;
|
||||
if(hasX && totalCost <= totalTargets)// {x} spell with unlimited targeting tend to divide damage, we want atleast 1 damage per target before casting.
|
||||
{
|
||||
shouldPlayPercentage = 0;
|
||||
}
|
||||
}
|
||||
SAFE_DELETE(tc);
|
||||
}
|
||||
else
|
||||
{
|
||||
int shouldPlay = effectBadOrGood(card);
|
||||
if (shouldPlay == BAKA_EFFECT_GOOD) {
|
||||
shouldPlayPercentage = 90;
|
||||
}
|
||||
else if (BAKA_EFFECT_DONTKNOW == shouldPlay) {
|
||||
//previously shouldPlayPercentage = 80;, I found this a little to high
|
||||
//for cards which AI had no idea how to use.
|
||||
shouldPlayPercentage = 60;
|
||||
}
|
||||
else {
|
||||
// shouldPlay == baka_effect_bad giving it a 10 for odd ball lottery chance.
|
||||
shouldPlayPercentage = 10;
|
||||
}
|
||||
}
|
||||
//Reduce the chances of playing a spell with X cost if available mana is low
|
||||
if (hasX)
|
||||
{
|
||||
int xDiff = pMana->getConvertedCost() - currentCost;
|
||||
if (xDiff < 0)
|
||||
xDiff = 0;
|
||||
shouldPlayPercentage = shouldPlayPercentage - static_cast<int> ((shouldPlayPercentage * 1.9f) / (1 + xDiff));
|
||||
}
|
||||
if(card->getManaCost() && card->getManaCost()->getKicker() && card->getManaCost()->getKicker()->isMulti)
|
||||
{
|
||||
shouldPlayPercentage = 10* size_t(gotPayments.size())/int(1+(card->getManaCost()->getConvertedCost()+card->getManaCost()->getKicker()->getConvertedCost()));
|
||||
if(shouldPlayPercentage <= 10)
|
||||
shouldPlayPercentage = shouldPlayPercentage/3;
|
||||
}
|
||||
DebugTrace("Should I play from commandzone" << (card ? card->name : "Nothing" ) << "?" << endl
|
||||
<<"shouldPlayPercentage = "<< shouldPlayPercentage);
|
||||
if(card->getRestrictions().size())
|
||||
{
|
||||
AbilityFactory af(observer);
|
||||
int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions());
|
||||
if(!canPlay)
|
||||
continue;
|
||||
}
|
||||
int randomChance = randomGenerator.random();
|
||||
int chance = randomChance % 100;
|
||||
if (chance > shouldPlayPercentage)
|
||||
continue;
|
||||
if(shouldPlayPercentage <= 10)
|
||||
{
|
||||
DebugTrace("shouldPlayPercentage was less than 10 this was a lottery roll on RNG");
|
||||
}
|
||||
nextCardToPlay = card;
|
||||
maxCost = currentCost;
|
||||
if (hasX)
|
||||
maxCost = pMana->getConvertedCost();
|
||||
}
|
||||
}
|
||||
if(nextCardToPlay)
|
||||
{
|
||||
if(!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker())
|
||||
|
||||
@@ -1152,10 +1152,10 @@ int AAAlterMonarch::resolve()
|
||||
{
|
||||
if(!pTarget->monarch){
|
||||
pTarget->monarch = 1;
|
||||
pTarget->opponent()->monarch = 0;
|
||||
pTarget->opponent()->monarch = 0;
|
||||
WEvent * e = NEW WEventplayerMonarch(pTarget);
|
||||
game->receiveEvent(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -256,6 +256,8 @@ int Damage::resolve()
|
||||
else
|
||||
{
|
||||
((MTGCardInstance*)source)->damageToOpponent = true;
|
||||
if(((MTGCardInstance*)source)->basicAbilities[Constants::ISCOMMANDER])
|
||||
((MTGCardInstance*)source)->damageInflictedAsCommander += damage;
|
||||
}
|
||||
target->lifeLostThisTurn += damage;
|
||||
if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes.
|
||||
@@ -271,6 +273,8 @@ int Damage::resolve()
|
||||
}
|
||||
WEvent * lifed = NEW WEventLife((Player*)target,-damage, source);
|
||||
observer->receiveEvent(lifed);
|
||||
if(((MTGCardInstance*)source)->damageInflictedAsCommander > 20) // if a Commander has dealt 21 or more damages to a player, he loose game.
|
||||
observer->setLoser(((MTGCardInstance*)source)->controller()->opponent());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1346,6 +1346,8 @@ void GameObserver::ButtonPressed(PlayGuiObject * target)
|
||||
graveyard->toggleDisplay();
|
||||
else if (GuiExile* exile = dynamic_cast<GuiExile*>(target))
|
||||
exile->toggleDisplay();
|
||||
else if (GuiCommandZone* commandzone = dynamic_cast<GuiCommandZone*>(target))
|
||||
commandzone->toggleDisplay();
|
||||
//opponenthand
|
||||
else if (GuiOpponentHand* opponentHand = dynamic_cast<GuiOpponentHand*>(target))
|
||||
if (opponentHand->showCards)
|
||||
|
||||
@@ -16,6 +16,8 @@ GuiAvatars::GuiAvatars(DuelLayers* duelLayers) :
|
||||
Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, mpDuelLayers->getRenderedPlayer(), this));
|
||||
//myexile
|
||||
Add(selfExile = NEW GuiExile(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 30, false, mpDuelLayers->getRenderedPlayer(), this));
|
||||
//mycommandZone
|
||||
Add(selfCommandZone = NEW GuiCommandZone(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 + 9, SCREEN_HEIGHT - GuiAvatar::Height - 30, false, mpDuelLayers->getRenderedPlayer(), this));
|
||||
|
||||
Add(opponent = NEW GuiAvatar(0, 0, false, mpDuelLayers->getRenderedPlayerOpponent(), GuiAvatar::TOP_LEFT, this));
|
||||
opponent->zoom = 0.9f;
|
||||
@@ -29,19 +31,24 @@ GuiAvatars::GuiAvatars(DuelLayers* duelLayers) :
|
||||
Add(opponentHand = NEW GuiOpponentHand(-15 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 43 + GuiGameZone::Height - 10, false,
|
||||
mpDuelLayers->getRenderedPlayerOpponent(), this));
|
||||
//opponentLibrary
|
||||
Add(opponentLibrary = NEW GuiLibrary(-30 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 43 + GuiGameZone::Height - 10,
|
||||
false, mpDuelLayers->getRenderedPlayerOpponent(), this));
|
||||
Add(opponentLibrary = NEW GuiLibrary(-30 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 43 + GuiGameZone::Height - 10, false,
|
||||
mpDuelLayers->getRenderedPlayerOpponent(), this));
|
||||
//opponentCommandZone
|
||||
Add(opponentCommandZone = NEW GuiCommandZone(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 43 + GuiGameZone::Height -10, false,
|
||||
mpDuelLayers->getRenderedPlayerOpponent(), this));
|
||||
|
||||
observer->getCardSelector()->Add(self);
|
||||
observer->getCardSelector()->Add(selfGraveyard);
|
||||
observer->getCardSelector()->Add(selfExile);
|
||||
observer->getCardSelector()->Add(selfCommandZone);
|
||||
observer->getCardSelector()->Add(selfLibrary);
|
||||
observer->getCardSelector()->Add(opponent);
|
||||
observer->getCardSelector()->Add(opponentGraveyard);
|
||||
observer->getCardSelector()->Add(opponentExile);
|
||||
observer->getCardSelector()->Add(opponentCommandZone);
|
||||
observer->getCardSelector()->Add(opponentLibrary);
|
||||
observer->getCardSelector()->Add(opponentHand);
|
||||
selfGraveyard->alpha = selfExile->alpha = opponentExile->alpha = selfLibrary->alpha = opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0;
|
||||
selfGraveyard->alpha = selfExile->alpha = selfCommandZone->alpha = opponentCommandZone->alpha = opponentExile->alpha = selfLibrary->alpha = opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0;
|
||||
}
|
||||
|
||||
float GuiAvatars::LeftBoundarySelf()
|
||||
@@ -58,15 +65,15 @@ void GuiAvatars::Activate(PlayGuiObject* c)
|
||||
c->zoom = 1.2f;
|
||||
c->mHasFocus = true;
|
||||
|
||||
if ((opponentGraveyard == c) || (opponentExile == c) || (opponentLibrary == c) || (opponent == c) || (opponentHand == c))
|
||||
if ((opponentGraveyard == c) || (opponentExile == c) || (opponentCommandZone == c) || (opponentLibrary == c) || (opponent == c) || (opponentHand == c))
|
||||
{
|
||||
opponentGraveyard->alpha = opponentExile->alpha = opponentLibrary->alpha = opponentHand->alpha = 128.0f;
|
||||
opponentGraveyard->alpha = opponentExile->alpha = opponentCommandZone->alpha = opponentLibrary->alpha = opponentHand->alpha = 128.0f;
|
||||
active = opponent;
|
||||
opponent->zoom = 1.2f;
|
||||
}
|
||||
else if ((selfGraveyard == c) || (selfExile == c) || (selfLibrary == c) || (self == c))
|
||||
else if ((selfGraveyard == c) || (selfExile == c) || (selfCommandZone == c) || (selfLibrary == c) || (self == c))
|
||||
{
|
||||
selfGraveyard->alpha = selfExile->alpha = selfLibrary->alpha = 128.0f;
|
||||
selfGraveyard->alpha = selfExile->alpha = selfCommandZone->alpha = selfLibrary->alpha = 128.0f;
|
||||
self->zoom = 1.0f;
|
||||
active = self;
|
||||
}
|
||||
@@ -77,15 +84,15 @@ void GuiAvatars::Deactivate(PlayGuiObject* c)
|
||||
{
|
||||
c->zoom = 1.0;
|
||||
c->mHasFocus = false;
|
||||
if ((opponentGraveyard == c) || (opponentExile == c) || (opponentLibrary == c) || (opponentHand == c) || (opponent == c))
|
||||
if ((opponentGraveyard == c) || (opponentExile == c) || (opponentCommandZone == c) || (opponentLibrary == c) || (opponentHand == c) || (opponent == c))
|
||||
{
|
||||
opponentGraveyard->alpha = opponentExile->alpha = opponentLibrary->alpha = opponentHand->alpha = 0;
|
||||
opponentGraveyard->alpha = opponentExile->alpha = opponentCommandZone->alpha = opponentLibrary->alpha = opponentHand->alpha = 0;
|
||||
opponent->zoom = 0.9f;
|
||||
active = NULL;
|
||||
}
|
||||
else if ((selfGraveyard == c) || (selfExile == c) || (selfLibrary == c) || (self == c))
|
||||
else if ((selfGraveyard == c) || (selfExile == c) || (selfCommandZone == c) || (selfLibrary == c) || (self == c))
|
||||
{
|
||||
selfGraveyard->alpha = selfExile->alpha = selfLibrary->alpha = 0;
|
||||
selfGraveyard->alpha = selfExile->alpha = selfCommandZone->alpha = selfLibrary->alpha = 0;
|
||||
self->zoom = 0.5f;
|
||||
active = NULL;
|
||||
}
|
||||
@@ -93,15 +100,17 @@ void GuiAvatars::Deactivate(PlayGuiObject* c)
|
||||
|
||||
int GuiAvatars::receiveEventPlus(WEvent* e)
|
||||
{
|
||||
return selfGraveyard->receiveEventPlus(e) | selfExile->receiveEventPlus(e) | opponentExile->receiveEventPlus(e) | opponentGraveyard->receiveEventPlus(e) | opponentHand->receiveEventPlus(e);
|
||||
return selfGraveyard->receiveEventPlus(e) | selfExile->receiveEventPlus(e) | selfCommandZone->receiveEventPlus(e) | opponentExile->receiveEventPlus(e) | opponentCommandZone->receiveEventPlus(e) | opponentGraveyard->receiveEventPlus(e) | opponentHand->receiveEventPlus(e);
|
||||
}
|
||||
|
||||
int GuiAvatars::receiveEventMinus(WEvent* e)
|
||||
{
|
||||
selfGraveyard->receiveEventMinus(e);
|
||||
selfExile->receiveEventMinus(e);
|
||||
selfCommandZone->receiveEventMinus(e);
|
||||
opponentGraveyard->receiveEventMinus(e);
|
||||
opponentExile->receiveEventMinus(e);
|
||||
opponentCommandZone->receiveEventMinus(e);
|
||||
opponentHand->receiveEventMinus(e);
|
||||
return 1;
|
||||
}
|
||||
@@ -116,10 +125,14 @@ bool GuiAvatars::CheckUserInput(JButton key)
|
||||
return true;
|
||||
if (selfExile->CheckUserInput(key))
|
||||
return true;
|
||||
if (selfCommandZone->CheckUserInput(key))
|
||||
return true;
|
||||
if (opponentGraveyard->CheckUserInput(key))
|
||||
return true;
|
||||
if (opponentExile->CheckUserInput(key))
|
||||
return true;
|
||||
if (opponentCommandZone->CheckUserInput(key))
|
||||
return true;
|
||||
if (opponentHand->CheckUserInput(key))
|
||||
return true;
|
||||
if (selfLibrary->CheckUserInput(key))
|
||||
@@ -135,9 +148,11 @@ void GuiAvatars::Update(float dt)
|
||||
opponent->Update(dt);
|
||||
selfGraveyard->Update(dt);
|
||||
selfExile->Update(dt);
|
||||
selfCommandZone->Update(dt);
|
||||
opponentHand->Update(dt);
|
||||
opponentGraveyard->Update(dt);
|
||||
opponentExile->Update(dt);
|
||||
opponentCommandZone->Update(dt);
|
||||
selfLibrary->Update(dt);
|
||||
opponentLibrary->Update(dt);
|
||||
}
|
||||
@@ -150,12 +165,12 @@ void GuiAvatars::Render()
|
||||
if (opponent == active)
|
||||
{
|
||||
r->FillRect(opponent->actX, opponent->actY, 40 * opponent->actZ, h+25 * opponent->actZ, ARGB(200,0,0,0));
|
||||
r->FillRect(opponent->actX, opponent->actY, w * opponent->actZ, h * opponent->actZ, ARGB(200,0,0,0));
|
||||
r->FillRect(opponent->actX, opponent->actY, w * opponent->actZ, h+25 * opponent->actZ, ARGB(200,0,0,0));
|
||||
}
|
||||
else if (self == active)
|
||||
{
|
||||
r->FillRect(self->actX - w * self->actZ - 4.5f, self->actY - h-28 * self->actZ, 24 * self->actZ, h+28 * self->actZ, ARGB(200,0,0,0));
|
||||
r->FillRect(self->actX - w * self->actZ - 4.5f, self->actY - h * self->actZ, w * self->actZ, h * self->actZ, ARGB(200,0,0,0));
|
||||
r->FillRect(self->actX - w * self->actZ - 4.5f, self->actY - h-28 * self->actZ, 24 * self->actZ + 19, h+28 * self->actZ, ARGB(200,0,0,0));
|
||||
//r->FillRect(self->actX - w * self->actZ - 4.5f, self->actY - h * self->actZ, w * self->actZ, h * self->actZ, ARGB(200,0,0,0));
|
||||
}
|
||||
GuiLayer::Render();
|
||||
|
||||
|
||||
@@ -207,7 +207,7 @@ void GuiGameZone::Render()
|
||||
bool showopponenttop = (zone && zone->owner->opponent()->game->battlefield->nb_cards && zone->owner->opponent()->game->battlefield->hasAbility(Constants::SHOWOPPONENTTOPLIBRARY))?true:false;
|
||||
|
||||
quad->SetColor(ARGB((int)(actA),255,255,255));
|
||||
if(type == GUI_EXILE)
|
||||
if(type == GUI_EXILE || type == GUI_COMMANDZONE)
|
||||
{
|
||||
quad->SetColor(ARGB((int)(actA),255,240,255));
|
||||
}
|
||||
@@ -217,7 +217,8 @@ void GuiGameZone::Render()
|
||||
JQuadPtr iconhand = WResourceManager::Instance()->RetrieveTempQuad("iconhand.png");
|
||||
JQuadPtr iconlibrary = WResourceManager::Instance()->RetrieveTempQuad("iconlibrary.png");
|
||||
JQuadPtr iconexile = WResourceManager::Instance()->RetrieveTempQuad("iconexile.png");
|
||||
|
||||
JQuadPtr iconcommandzone = WResourceManager::Instance()->RetrieveTempQuad("iconcommandzone.png");
|
||||
|
||||
if(iconlibrary && type == GUI_LIBRARY)
|
||||
{
|
||||
scale2 = defaultHeight / iconlibrary->mHeight;
|
||||
@@ -250,6 +251,14 @@ void GuiGameZone::Render()
|
||||
iconexile->SetColor(ARGB((int)(actA),255,255,255));
|
||||
quad = iconexile;
|
||||
}
|
||||
if(iconcommandzone && type == GUI_COMMANDZONE)
|
||||
{
|
||||
scale2 = defaultHeight / iconcommandzone->mHeight;
|
||||
modx = -0.f;
|
||||
mody = -2.f;
|
||||
iconcommandzone->SetColor(ARGB((int)(actA),255,255,255));
|
||||
quad = iconcommandzone;
|
||||
}
|
||||
//
|
||||
|
||||
if(type == GUI_LIBRARY && zone->nb_cards && !showCards)
|
||||
@@ -520,6 +529,52 @@ ostream& GuiExile::toString(ostream& out) const
|
||||
return out << "GuiExile :::";
|
||||
}
|
||||
|
||||
GuiCommandZone::GuiCommandZone(float x, float y, bool hasFocus, Player * player, GuiAvatars* parent) :
|
||||
GuiGameZone(x, y, hasFocus, player->game->commandzone, parent), player(player)
|
||||
{
|
||||
type = GUI_COMMANDZONE;
|
||||
}
|
||||
|
||||
int GuiCommandZone::receiveEventPlus(WEvent* e)
|
||||
{
|
||||
if (WEventZoneChange* event = dynamic_cast<WEventZoneChange*>(e))
|
||||
if (event->to == zone)
|
||||
{
|
||||
CardView* t;
|
||||
if (event->card->view)
|
||||
t = NEW CardView(CardView::nullZone, event->card, *(event->card->view));
|
||||
else
|
||||
t = NEW CardView(CardView::nullZone, event->card, x, y);
|
||||
t->x = x + Width / 2;
|
||||
t->y = y + Height / 2;
|
||||
t->zoom = 0.6f;
|
||||
t->alpha = 0;
|
||||
cards.push_back(t);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int GuiCommandZone::receiveEventMinus(WEvent* e)
|
||||
{
|
||||
if (WEventZoneChange* event = dynamic_cast<WEventZoneChange*>(e))
|
||||
if (event->from == zone)
|
||||
for (vector<CardView*>::iterator it = cards.begin(); it != cards.end(); ++it)
|
||||
if (event->card->previous == (*it)->card)
|
||||
{
|
||||
CardView* cv = *it;
|
||||
cards.erase(it);
|
||||
zone->owner->getObserver()->mTrash->trash(cv);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ostream& GuiCommandZone::toString(ostream& out) const
|
||||
{
|
||||
return out << "GuiCommandZone :::";
|
||||
}
|
||||
|
||||
//opponenthand begins
|
||||
GuiOpponentHand::GuiOpponentHand(float x, float y, bool hasFocus, Player * player, GuiAvatars* parent) :
|
||||
GuiGameZone(x, y, hasFocus, player->game->hand, parent), player(player)
|
||||
|
||||
@@ -6506,8 +6506,8 @@ void ListMaintainerAbility::updateTargets()
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
Player * p = game->players[i];
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile ,p->game->reveal, p->game->sideboard };
|
||||
for (int k = 0; k < 8; k++)
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile ,p->game->reveal, p->game->sideboard, p->game->commandzone };
|
||||
for (int k = 0; k < 9; k++)
|
||||
{
|
||||
MTGGameZone * zone = zones[k];
|
||||
if (canTarget(zone))
|
||||
@@ -6578,8 +6578,8 @@ void ListMaintainerAbility::checkTargets()
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
Player * p = game->players[i];
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile, p->game->reveal, p->game->sideboard };
|
||||
for (int k = 0; k < 8; k++)
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile, p->game->reveal, p->game->sideboard, p->game->commandzone };
|
||||
for (int k = 0; k < 9; k++)
|
||||
{
|
||||
MTGGameZone * zone = zones[k];
|
||||
if (canTarget(zone))
|
||||
|
||||
@@ -238,6 +238,8 @@ void MTGCardInstance::initMTGCI()
|
||||
sunburst = 0;
|
||||
equipment = 0;
|
||||
mutation = 0;
|
||||
damageInflictedAsCommander = 0;
|
||||
numofcastfromcommandzone = 0;
|
||||
auras = 0;
|
||||
combatdamageToOpponent = false;
|
||||
damageToOpponent = false;
|
||||
|
||||
@@ -887,10 +887,76 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
|
||||
meta_unlockRequirements = s.substr(found + 7);
|
||||
continue;
|
||||
}
|
||||
found = s.find("SB:");
|
||||
found = s.find("SB:"); // Now it's possible to add cards to Sideboard even using their Name instead of ID such as normal deck cards.
|
||||
if (found != string::npos)
|
||||
{
|
||||
Sideboard.push_back(s.substr(found + 3));
|
||||
s = s.substr(found + 3);
|
||||
s.erase(s.find_last_not_of("\t\n\v\f\r ") + 1);
|
||||
s.erase(0, s.find_first_not_of("\t\n\v\f\r "));
|
||||
std::string::const_iterator it = s.begin();
|
||||
while (it != s.end() && std::isdigit(*it)) ++it;
|
||||
if(!s.empty() && it == s.end())
|
||||
Sideboard.push_back(s);
|
||||
else {
|
||||
int numberOfCopies = 1;
|
||||
size_t found = s.find(" *");
|
||||
if (found != string::npos){
|
||||
numberOfCopies = atoi(s.substr(found + 2).c_str());
|
||||
s = s.substr(0, found);
|
||||
}
|
||||
MTGCard * card = database->getCardByName(s);
|
||||
if (card){
|
||||
for (int i = 0; i < numberOfCopies; i++){
|
||||
std::stringstream str_id;
|
||||
str_id << card->getId();
|
||||
Sideboard.push_back(str_id.str());
|
||||
}
|
||||
}else {
|
||||
DebugTrace("could not add to Sideboard any card with name: " << s);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
found = s.find("CMD:"); // Now it's possible to add a card to Command Zone even using their Name instead of ID such as normal deck cards.
|
||||
if (found != string::npos)
|
||||
{
|
||||
s = s.substr(found + 4);
|
||||
s.erase(s.find_last_not_of("\t\n\v\f\r ") + 1);
|
||||
s.erase(0, s.find_first_not_of("\t\n\v\f\r "));
|
||||
std::string::const_iterator it = s.begin();
|
||||
while (it != s.end() && std::isdigit(*it)) ++it;
|
||||
if(!s.empty() && it == s.end()){
|
||||
MTGCard * newcard = database->getCardById(atoi(s.c_str()));
|
||||
if(!CommandZone.size() && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])) // If no commander has been added you can add one.
|
||||
CommandZone.push_back(s);
|
||||
else if(CommandZone.size() == 1 && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])){ // If a commander has been added you can add a new one just if both have partner ability.
|
||||
if(newcard && newcard->data->basicAbilities[Constants::PARTNER]){
|
||||
MTGCard * oldcard = database->getCardById(atoi((CommandZone.at(0)).c_str()));
|
||||
if(oldcard && oldcard->data->basicAbilities[Constants::PARTNER] && oldcard->data->name != newcard->data->name)
|
||||
CommandZone.push_back(s);
|
||||
}
|
||||
}
|
||||
}else {
|
||||
size_t found = s.find(" *");
|
||||
if (found != string::npos)
|
||||
s = s.substr(0, found);
|
||||
MTGCard * newcard = database->getCardByName(s);
|
||||
if (newcard){
|
||||
std::stringstream str_id;
|
||||
str_id << newcard->getId();
|
||||
if(!CommandZone.size() && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])) // If no commander has been added you can add one.
|
||||
CommandZone.push_back(str_id.str());
|
||||
else if(CommandZone.size() == 1 && newcard->data->hasType("Legendary") && (newcard->data->hasType("Creature") || newcard->data->basicAbilities[Constants::CANBECOMMANDER])){ // If a commander has been added you can add a new one just if both have partner ability.
|
||||
if(newcard->data->basicAbilities[Constants::PARTNER]){
|
||||
MTGCard * oldcard = database->getCardById(atoi((CommandZone.at(0)).c_str()));
|
||||
if(oldcard && oldcard->data->basicAbilities[Constants::PARTNER] && oldcard->data->name != newcard->data->name)
|
||||
CommandZone.push_back(str_id.str());
|
||||
}
|
||||
}
|
||||
}else {
|
||||
DebugTrace("could not add to CommandZone any card with name: " << s);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
|
||||
@@ -194,8 +194,10 @@ const char* Constants::MTGBasicAbilities[] = {
|
||||
"mentor",
|
||||
"prowess",
|
||||
"nofizzle alternative", //No fizzle if card has been paid with alternative cost.
|
||||
"hasotherkicker", //Kicker cost is expressed with "other" keyword (es. not mana kicker such as life and/or tap a creature),
|
||||
"partner" //Has partner ability
|
||||
"hasotherkicker", //Kicker cost is expressed with "other" keyword (eg. not mana kicker such as life and/or tap a creature),
|
||||
"partner", //Has partner ability
|
||||
"canbecommander", //Can be a commander (eg. some planeswalkers can)
|
||||
"iscommander" //It's the current commander
|
||||
};
|
||||
|
||||
map<string,int> Constants::MTGBasicAbilitiesMap;
|
||||
|
||||
@@ -78,6 +78,22 @@ void MTGPlayerCards::initDeck(MTGDeck * deck)
|
||||
}
|
||||
}
|
||||
}
|
||||
//commander zone init
|
||||
if(deck->CommandZone.size())
|
||||
{
|
||||
for(unsigned int j = 0; j < deck->CommandZone.size(); j++)
|
||||
{
|
||||
string cardID = deck->CommandZone[j];
|
||||
MTGCard * card = MTGCollection()->getCardById(atoi(cardID.c_str()));
|
||||
if(card)
|
||||
{
|
||||
MTGCardInstance * newCard = NEW MTGCardInstance(card, this);
|
||||
//commander zone
|
||||
newCard->basicAbilities[Constants::ISCOMMANDER] = 1;
|
||||
commandzone->addCard(newCard);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MTGPlayerCards::~MTGPlayerCards()
|
||||
@@ -91,6 +107,7 @@ MTGPlayerCards::~MTGPlayerCards()
|
||||
SAFE_DELETE(garbage);
|
||||
SAFE_DELETE(reveal);
|
||||
SAFE_DELETE(sideboard);
|
||||
SAFE_DELETE(commandzone);
|
||||
SAFE_DELETE(temp);
|
||||
SAFE_DELETE(playRestrictions);
|
||||
}
|
||||
@@ -110,6 +127,7 @@ void MTGPlayerCards::beforeBeginPhase()
|
||||
garbage->beforeBeginPhase();
|
||||
reveal->beforeBeginPhase();
|
||||
sideboard->beforeBeginPhase();
|
||||
commandzone->beforeBeginPhase();
|
||||
temp->beforeBeginPhase();
|
||||
}
|
||||
|
||||
@@ -126,6 +144,7 @@ void MTGPlayerCards::setOwner(Player * player)
|
||||
garbageLastTurn->setOwner(player);
|
||||
reveal->setOwner(player);
|
||||
sideboard->setOwner(player);
|
||||
commandzone->setOwner(player);
|
||||
temp->setOwner(player);
|
||||
}
|
||||
|
||||
@@ -301,6 +320,7 @@ void MTGPlayerCards::init()
|
||||
garbageLastTurn = garbage;
|
||||
reveal = NEW MTGGameZone();
|
||||
sideboard = NEW MTGGameZone();
|
||||
commandzone = NEW MTGGameZone();
|
||||
temp = NEW MTGGameZone();
|
||||
|
||||
playRestrictions = NEW PlayRestrictions();
|
||||
@@ -393,7 +413,7 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone
|
||||
}
|
||||
|
||||
//close the currently open MAIN display.
|
||||
if (from == g->players[i]->game->library || from == g->players[i]->game->graveyard || from == g->players[i]->game->exile)
|
||||
if (from == g->players[i]->game->library || from == g->players[i]->game->graveyard || from == g->players[i]->game->exile || from == g->players[i]->game->commandzone)
|
||||
{
|
||||
if (g->guiOpenDisplay)
|
||||
{
|
||||
@@ -418,6 +438,12 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone
|
||||
inplaytoinplay = true;//try sending different event...
|
||||
}
|
||||
|
||||
//Increase the number of time this card has been casted from commandzone to recalculate cost.
|
||||
if(from == g->players[0]->game->commandzone || from == g->players[1]->game->commandzone){
|
||||
card->numofcastfromcommandzone++;
|
||||
card->controller()->numOfCommandCast++;
|
||||
}
|
||||
|
||||
if (!(copy = from->removeCard(card, doCopy)))
|
||||
return NULL; //ERROR
|
||||
|
||||
@@ -430,6 +456,12 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone
|
||||
}
|
||||
}
|
||||
|
||||
//Commander is going back to Command Zone, so we recalculate cost according to how many times it has been casted from there.
|
||||
if(to == g->players[0]->game->commandzone || to == g->players[1]->game->commandzone){
|
||||
for(int i = 0; i < copy->numofcastfromcommandzone; i++)
|
||||
copy->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT,2);
|
||||
}
|
||||
|
||||
if (card->miracle)
|
||||
{
|
||||
copy->miracle = true;
|
||||
@@ -713,6 +745,9 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy
|
||||
copy->storedSourceCard = card->storedSourceCard;
|
||||
copy->lastController = card->controller();
|
||||
copy->previousController = card->controller();
|
||||
copy->basicAbilities[Constants::ISCOMMANDER] = card->basicAbilities[Constants::ISCOMMANDER];
|
||||
copy->damageInflictedAsCommander = card->damageInflictedAsCommander;
|
||||
copy->numofcastfromcommandzone = card->numofcastfromcommandzone;
|
||||
for (int i = 0; i < ManaCost::MANA_PAID_WITH_BESTOW +1; i++)
|
||||
copy->alternateCostPaid[i] = card->alternateCostPaid[i];
|
||||
|
||||
@@ -1237,6 +1272,13 @@ MTGGameZone * MTGGameZone::intToZone(int zoneId, Player * p, Player * p2)
|
||||
case SIDEBOARD:
|
||||
return p->game->sideboard;
|
||||
|
||||
case MY_COMMANDZONE:
|
||||
return p->game->commandzone;
|
||||
case OPPONENT_COMMANDZONE:
|
||||
return p->opponent()->game->commandzone;
|
||||
case COMMANDZONE:
|
||||
return p->game->commandzone;
|
||||
|
||||
}
|
||||
if (!p2) return NULL;
|
||||
switch (zoneId)
|
||||
@@ -1265,6 +1307,9 @@ MTGGameZone * MTGGameZone::intToZone(int zoneId, Player * p, Player * p2)
|
||||
case TARGET_CONTROLLER_SIDEBOARD:
|
||||
return p2->game->sideboard;
|
||||
|
||||
case TARGET_CONTROLLER_COMMANDZONE:
|
||||
return p2->game->commandzone;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
@@ -1385,6 +1430,17 @@ MTGGameZone * MTGGameZone::intToZone(GameObserver *g, int zoneId, MTGCardInstanc
|
||||
return source->playerTarget->game->sideboard;
|
||||
else return source->controller()->game->sideboard;
|
||||
|
||||
case TARGET_OWNER_COMMANDZONE:
|
||||
return target->owner->game->commandzone;
|
||||
case COMMANDZONE:
|
||||
return target->owner->game->commandzone;
|
||||
case OWNER_COMMANDZONE:
|
||||
return target->owner->game->commandzone;
|
||||
case TARGETED_PLAYER_COMMANDZONE:
|
||||
if (source->playerTarget)
|
||||
return source->playerTarget->game->commandzone;
|
||||
else return source->controller()->game->commandzone;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
@@ -1416,6 +1472,8 @@ int MTGGameZone::zoneStringToId(string zoneName)
|
||||
|
||||
"mysideboard", "opponentsideboard", "targetownersideboard", "targetcontrollersideboard", "ownersideboard", "sideboard","targetedpersonssideboard",
|
||||
|
||||
"mycommandzone", "opponentcommandzone", "targetownercommandzone", "targetcontrollercommandzone", "ownercommandzone", "commandzone","targetedpersonscommandzone",
|
||||
|
||||
};
|
||||
|
||||
int values[] = { MY_GRAVEYARD, OPPONENT_GRAVEYARD, TARGET_OWNER_GRAVEYARD, TARGET_CONTROLLER_GRAVEYARD, OWNER_GRAVEYARD,
|
||||
@@ -1439,7 +1497,9 @@ int MTGGameZone::zoneStringToId(string zoneName)
|
||||
|
||||
MY_REVEAL, OPPONENT_REVEAL, TARGET_OWNER_REVEAL, TARGET_CONTROLLER_REVEAL, OWNER_REVEAL, REVEAL,TARGETED_PLAYER_REVEAL,
|
||||
|
||||
MY_SIDEBOARD, OPPONENT_SIDEBOARD, TARGET_OWNER_SIDEBOARD, TARGET_CONTROLLER_SIDEBOARD, OWNER_SIDEBOARD, SIDEBOARD,TARGETED_PLAYER_SIDEBOARD };
|
||||
MY_SIDEBOARD, OPPONENT_SIDEBOARD, TARGET_OWNER_SIDEBOARD, TARGET_CONTROLLER_SIDEBOARD, OWNER_SIDEBOARD, SIDEBOARD,TARGETED_PLAYER_SIDEBOARD,
|
||||
|
||||
MY_COMMANDZONE, OPPONENT_COMMANDZONE, TARGET_OWNER_COMMANDZONE, TARGET_CONTROLLER_COMMANDZONE, OWNER_COMMANDZONE, COMMANDZONE,TARGETED_PLAYER_COMMANDZONE };
|
||||
|
||||
int max = sizeof(values) / sizeof *(values);
|
||||
|
||||
|
||||
@@ -304,7 +304,7 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
||||
int cardsinhand = game->players[0]->game->hand->nb_cards;
|
||||
defaultPlayName = card->isLand()?"Play Land":"Cast Card Normally";
|
||||
Player * player = game->currentlyActing();
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->library->hasCard(card))
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->library->hasCard(card) && !player->game->commandzone->hasCard(card))
|
||||
return 0;
|
||||
if ((player->game->library->hasCard(card) && !card->canPlayFromLibrary()) || (player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
return 0;
|
||||
|
||||
@@ -36,6 +36,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck *
|
||||
drawCounter = 0;
|
||||
energyCount = 0;
|
||||
yidaroCount = 0;
|
||||
numOfCommandCast = 0;
|
||||
monarch = 0;
|
||||
surveilOffset = 0;
|
||||
epic = 0;
|
||||
|
||||
@@ -598,20 +598,22 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet)
|
||||
p->preventable = initState.playerData[i].player->preventable;
|
||||
p->energyCount = initState.playerData[i].player->energyCount;
|
||||
p->yidaroCount = initState.playerData[i].player->yidaroCount;
|
||||
p->numOfCommandCast = initState.playerData[i].player->numOfCommandCast;
|
||||
p->monarch = initState.playerData[i].player->monarch;
|
||||
p->surveilOffset = initState.playerData[i].player->surveilOffset;
|
||||
if (initState.playerData[i].player->mAvatarName.size())
|
||||
{
|
||||
p->mAvatarName = initState.playerData[i].player->mAvatarName;
|
||||
}
|
||||
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->exile , p->game->reveal, p->game->sideboard };
|
||||
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->exile , p->game->reveal, p->game->sideboard, p->game->commandzone };
|
||||
MTGGameZone * loadedPlayerZones[] = { initState.playerData[i].player->game->graveyard,
|
||||
initState.playerData[i].player->game->library,
|
||||
initState.playerData[i].player->game->hand,
|
||||
initState.playerData[i].player->game->inPlay,
|
||||
initState.playerData[i].player->game->exile,
|
||||
initState.playerData[i].player->game->reveal,
|
||||
initState.playerData[i].player->game->sideboard };
|
||||
initState.playerData[i].player->game->sideboard,
|
||||
initState.playerData[i].player->game->commandzone };
|
||||
for (int j = 0; j < 5; j++)
|
||||
{
|
||||
MTGGameZone * zone = playerZones[j];
|
||||
|
||||
@@ -175,6 +175,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
||||
zones[nbzones++] = MTGGameZone::MY_SIDEBOARD;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_SIDEBOARD;
|
||||
}
|
||||
else if (zoneName.compare("commandzone") == 0)
|
||||
{
|
||||
zones[nbzones++] = MTGGameZone::MY_COMMANDZONE;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_COMMANDZONE;
|
||||
}
|
||||
else if (zoneName.compare("reveal") == 0)
|
||||
{
|
||||
zones[nbzones++] = MTGGameZone::MY_REVEAL;
|
||||
@@ -210,6 +215,8 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_HAND;
|
||||
zones[nbzones++] = MTGGameZone::MY_EXILE;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_EXILE;
|
||||
zones[nbzones++] = MTGGameZone::MY_COMMANDZONE;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_COMMANDZONE;
|
||||
}
|
||||
else if (zoneName.compare("stack") == 0)
|
||||
{
|
||||
@@ -228,6 +235,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
||||
zones[nbzones++] = MTGGameZone::MY_HAND;
|
||||
zones[nbzones++] = MTGGameZone::MY_EXILE;
|
||||
zones[nbzones++] = MTGGameZone::MY_SIDEBOARD;
|
||||
zones[nbzones++] = MTGGameZone::MY_COMMANDZONE;
|
||||
}
|
||||
else if (zoneName.compare("opponentcastingzone") == 0)
|
||||
{
|
||||
@@ -235,18 +243,22 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_LIBRARY;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_HAND;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_EXILE;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_SIDEBOARD;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_COMMANDZONE;
|
||||
}
|
||||
else if (zoneName.compare("mynonplaynonexile") == 0)
|
||||
{
|
||||
zones[nbzones++] = MTGGameZone::MY_GRAVEYARD;
|
||||
zones[nbzones++] = MTGGameZone::MY_LIBRARY;
|
||||
zones[nbzones++] = MTGGameZone::MY_HAND;
|
||||
zones[nbzones++] = MTGGameZone::MY_COMMANDZONE;
|
||||
}
|
||||
else if (zoneName.compare("opponentnonplaynonexile") == 0)
|
||||
{
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_GRAVEYARD;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_LIBRARY;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_HAND;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_COMMANDZONE;
|
||||
}
|
||||
else if (zoneName.compare("myzones") == 0)
|
||||
{
|
||||
@@ -256,6 +268,8 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
||||
zones[nbzones++] = MTGGameZone::MY_LIBRARY;
|
||||
zones[nbzones++] = MTGGameZone::MY_HAND;
|
||||
zones[nbzones++] = MTGGameZone::MY_EXILE;
|
||||
zones[nbzones++] = MTGGameZone::MY_SIDEBOARD;
|
||||
zones[nbzones++] = MTGGameZone::MY_COMMANDZONE;
|
||||
}
|
||||
else if (zoneName.compare("opponentzones") == 0)
|
||||
{
|
||||
@@ -265,6 +279,8 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_LIBRARY;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_HAND;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_EXILE;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_SIDEBOARD;
|
||||
zones[nbzones++] = MTGGameZone::OPPONENT_COMMANDZONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1154,8 +1170,8 @@ bool TargetChooser::validTargetsExist(int maxTargets)
|
||||
int maxAmount = 0;
|
||||
Player *p = observer->players[i];
|
||||
if (canTarget(p)) return true;
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile, p->game->stack, p->game->reveal, p->game->sideboard };
|
||||
for (int k = 0; k < 8; k++)
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile, p->game->stack, p->game->reveal, p->game->sideboard, p->game->commandzone };
|
||||
for (int k = 0; k < 9; k++)
|
||||
{
|
||||
MTGGameZone * z = zones[k];
|
||||
if (targetsZone(z))
|
||||
@@ -1188,8 +1204,8 @@ int TargetChooser::countValidTargets(bool withoutProtections)
|
||||
Player *p = observer->players[i];
|
||||
if(canTarget(p))
|
||||
result++;
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile, p->game->stack, p->game->reveal, p->game->sideboard };
|
||||
for (int k = 0; k < 8; k++)
|
||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile, p->game->stack, p->game->reveal, p->game->sideboard, p->game->commandzone };
|
||||
for (int k = 0; k < 9; k++)
|
||||
{
|
||||
MTGGameZone * z = zones[k];
|
||||
if (targetsZone(z))
|
||||
|
||||
Reference in New Issue
Block a user