merged r15810-r15847 from the Trunk into CloneFix branch

This commit is contained in:
ArsenalNut
2012-06-09 06:56:51 +00:00
53 changed files with 548 additions and 179 deletions

9
.gitattributes vendored
View File

@@ -771,6 +771,7 @@ res/cardsfolder/b/beasts_of_bogardan.txt svneol=native#text/plain
res/cardsfolder/b/beckon_apparition.txt svneol=native#text/plain res/cardsfolder/b/beckon_apparition.txt svneol=native#text/plain
res/cardsfolder/b/bedlam.txt svneol=native#text/plain res/cardsfolder/b/bedlam.txt svneol=native#text/plain
res/cardsfolder/b/bee_sting.txt svneol=native#text/plain res/cardsfolder/b/bee_sting.txt svneol=native#text/plain
res/cardsfolder/b/beetleback_chief.txt -text
res/cardsfolder/b/befoul.txt svneol=native#text/plain res/cardsfolder/b/befoul.txt svneol=native#text/plain
res/cardsfolder/b/beguiler_of_wills.txt -text res/cardsfolder/b/beguiler_of_wills.txt -text
res/cardsfolder/b/behemoth_sledge.txt svneol=native#text/plain res/cardsfolder/b/behemoth_sledge.txt svneol=native#text/plain
@@ -994,6 +995,7 @@ res/cardsfolder/b/boartusk_liege.txt svneol=native#text/plain
res/cardsfolder/b/body_double.txt -text res/cardsfolder/b/body_double.txt -text
res/cardsfolder/b/body_of_jukai.txt svneol=native#text/plain res/cardsfolder/b/body_of_jukai.txt svneol=native#text/plain
res/cardsfolder/b/body_snatcher.txt -text svneol=unset#text/plain res/cardsfolder/b/body_snatcher.txt -text svneol=unset#text/plain
res/cardsfolder/b/bog_elemental.txt -text
res/cardsfolder/b/bog_glider.txt svneol=native#text/plain res/cardsfolder/b/bog_glider.txt svneol=native#text/plain
res/cardsfolder/b/bog_gnarr.txt svneol=native#text/plain res/cardsfolder/b/bog_gnarr.txt svneol=native#text/plain
res/cardsfolder/b/bog_hoodlums.txt svneol=native#text/plain res/cardsfolder/b/bog_hoodlums.txt svneol=native#text/plain
@@ -1150,6 +1152,7 @@ res/cardsfolder/b/brimstone_dragon.txt svneol=native#text/plain
res/cardsfolder/b/brimstone_mage.txt svneol=native#text/plain res/cardsfolder/b/brimstone_mage.txt svneol=native#text/plain
res/cardsfolder/b/brimstone_volley.txt -text res/cardsfolder/b/brimstone_volley.txt -text
res/cardsfolder/b/brindle_boar.txt svneol=native#text/plain res/cardsfolder/b/brindle_boar.txt svneol=native#text/plain
res/cardsfolder/b/brindle_shoat.txt -text
res/cardsfolder/b/brine_elemental.txt -text res/cardsfolder/b/brine_elemental.txt -text
res/cardsfolder/b/brine_shaman.txt svneol=native#text/plain res/cardsfolder/b/brine_shaman.txt svneol=native#text/plain
res/cardsfolder/b/bringer_of_the_black_dawn.txt svneol=native#text/plain res/cardsfolder/b/bringer_of_the_black_dawn.txt svneol=native#text/plain
@@ -2434,6 +2437,7 @@ res/cardsfolder/d/dragon_shadow.txt -text
res/cardsfolder/d/dragon_tyrant.txt svneol=native#text/plain res/cardsfolder/d/dragon_tyrant.txt svneol=native#text/plain
res/cardsfolder/d/dragon_whelp.txt svneol=native#text/plain res/cardsfolder/d/dragon_whelp.txt svneol=native#text/plain
res/cardsfolder/d/dragon_wings.txt -text res/cardsfolder/d/dragon_wings.txt -text
res/cardsfolder/d/dragonlair_spider.txt -text
res/cardsfolder/d/dragonmaster_outcast.txt svneol=native#text/plain res/cardsfolder/d/dragonmaster_outcast.txt svneol=native#text/plain
res/cardsfolder/d/dragons_claw.txt svneol=native#text/plain res/cardsfolder/d/dragons_claw.txt svneol=native#text/plain
res/cardsfolder/d/dragons_herald.txt -text res/cardsfolder/d/dragons_herald.txt -text
@@ -2479,6 +2483,7 @@ res/cardsfolder/d/dream_thrush.txt -text
res/cardsfolder/d/dream_twist.txt -text res/cardsfolder/d/dream_twist.txt -text
res/cardsfolder/d/dreamborn_muse.txt svneol=native#text/plain res/cardsfolder/d/dreamborn_muse.txt svneol=native#text/plain
res/cardsfolder/d/dreamcatcher.txt svneol=native#text/plain res/cardsfolder/d/dreamcatcher.txt svneol=native#text/plain
res/cardsfolder/d/dreampod_druid.txt -text
res/cardsfolder/d/dreams_grip.txt svneol=native#text/plain res/cardsfolder/d/dreams_grip.txt svneol=native#text/plain
res/cardsfolder/d/dreams_of_the_dead.txt -text res/cardsfolder/d/dreams_of_the_dead.txt -text
res/cardsfolder/d/dreamscape_artist.txt svneol=native#text/plain res/cardsfolder/d/dreamscape_artist.txt svneol=native#text/plain
@@ -4538,6 +4543,7 @@ res/cardsfolder/i/indomitable_ancients.txt svneol=native#text/plain
res/cardsfolder/i/indomitable_archangel.txt svneol=native#text/plain res/cardsfolder/i/indomitable_archangel.txt svneol=native#text/plain
res/cardsfolder/i/indomitable_will.txt svneol=native#text/plain res/cardsfolder/i/indomitable_will.txt svneol=native#text/plain
res/cardsfolder/i/indrik_stomphowler.txt svneol=native#text/plain res/cardsfolder/i/indrik_stomphowler.txt svneol=native#text/plain
res/cardsfolder/i/indrik_umbra.txt -text
res/cardsfolder/i/induce_despair.txt -text res/cardsfolder/i/induce_despair.txt -text
res/cardsfolder/i/induce_paranoia.txt -text svneol=unset#text/plain res/cardsfolder/i/induce_paranoia.txt -text svneol=unset#text/plain
res/cardsfolder/i/inertia_bubble.txt svneol=native#text/plain res/cardsfolder/i/inertia_bubble.txt svneol=native#text/plain
@@ -5061,6 +5067,7 @@ res/cardsfolder/k/krark_clan_shaman.txt svneol=native#text/plain
res/cardsfolder/k/krark_clan_stoker.txt svneol=native#text/plain res/cardsfolder/k/krark_clan_stoker.txt svneol=native#text/plain
res/cardsfolder/k/kresh_the_bloodbraided.txt svneol=native#text/plain res/cardsfolder/k/kresh_the_bloodbraided.txt svneol=native#text/plain
res/cardsfolder/k/kris_mage.txt svneol=native#text/plain res/cardsfolder/k/kris_mage.txt svneol=native#text/plain
res/cardsfolder/k/krond_the_dawn_clad.txt -text
res/cardsfolder/k/krosan_archer.txt svneol=native#text/plain res/cardsfolder/k/krosan_archer.txt svneol=native#text/plain
res/cardsfolder/k/krosan_avenger.txt svneol=native#text/plain res/cardsfolder/k/krosan_avenger.txt svneol=native#text/plain
res/cardsfolder/k/krosan_beast.txt svneol=native#text/plain res/cardsfolder/k/krosan_beast.txt svneol=native#text/plain
@@ -6954,6 +6961,7 @@ res/cardsfolder/p/presence_of_the_wise.txt svneol=native#text/plain
res/cardsfolder/p/pretenders_claim.txt svneol=native#text/plain res/cardsfolder/p/pretenders_claim.txt svneol=native#text/plain
res/cardsfolder/p/prey_upon.txt -text res/cardsfolder/p/prey_upon.txt -text
res/cardsfolder/p/preys_vengeance.txt -text res/cardsfolder/p/preys_vengeance.txt -text
res/cardsfolder/p/preyseizer_dragon.txt -text
res/cardsfolder/p/price_of_progress.txt svneol=native#text/plain res/cardsfolder/p/price_of_progress.txt svneol=native#text/plain
res/cardsfolder/p/prickly_boggart.txt svneol=native#text/plain res/cardsfolder/p/prickly_boggart.txt svneol=native#text/plain
res/cardsfolder/p/pride_guardian.txt svneol=native#text/plain res/cardsfolder/p/pride_guardian.txt svneol=native#text/plain
@@ -9482,6 +9490,7 @@ res/cardsfolder/t/thief_of_hope.txt svneol=native#text/plain
res/cardsfolder/t/thieves_fortune.txt -text res/cardsfolder/t/thieves_fortune.txt -text
res/cardsfolder/t/thieving_magpie.txt svneol=native#text/plain res/cardsfolder/t/thieving_magpie.txt svneol=native#text/plain
res/cardsfolder/t/thieving_sprite.txt -text res/cardsfolder/t/thieving_sprite.txt -text
res/cardsfolder/t/thing_from_the_deep.txt -text
res/cardsfolder/t/think_tank.txt svneol=native#text/plain res/cardsfolder/t/think_tank.txt svneol=native#text/plain
res/cardsfolder/t/think_twice.txt svneol=native#text/plain res/cardsfolder/t/think_twice.txt svneol=native#text/plain
res/cardsfolder/t/thirst.txt svneol=native#text/plain res/cardsfolder/t/thirst.txt svneol=native#text/plain

View File

@@ -377,6 +377,45 @@ Fixes/Features:
- Updated setdata.txt, mtg-data.txt and setInfoScript.py with Planechase 2012 info. - Updated setdata.txt, mtg-data.txt and setInfoScript.py with Planechase 2012 info.
- Fixed a bug in AF Reveal. - Fixed a bug in AF Reveal.
- Added the recent commit logs to changes.txt. Preparing for the snapshot build release. - Added the recent commit logs to changes.txt. Preparing for the snapshot build release.
- Added a fluff piece to the changes.txt file.
- Updated AF Pump AI.
- Fixed Dream Thief.
- Fixed Rats' Feast (was referencing the incorrect svar)
- AbilityWork: Added References$ parameter to scripted abilities of 'P-R' cards where necessary.
- Added a fluff piece to the changes.txt file.
- update plugins
- Fixed Lotus Bloom.
- merged r15782-r15810 from the Trunk into CloneFix branch
- Improved AI handling some HIDDEN keywords with AF Pump.
- Performance update in staticDamagePrevention.
- Little Performance update in hasSickness().
- Graft will no longer trigger if the card has no more +1/+1 counters.
- The AI will now be more careful when fetching legendary permanents.
- Added the recent commit logs to changes.txt. Preparing for the snapshot build release.
- Fixed Sever the Bloodline.
- Updated text of Hunting Grounds.
- Added unpairing to moveToLibrary.
- Fixed targeting in gainLifeDoTriggerAINoCost.
- CheckStyle.
- Improved AI of some cards using AF Charm.
- Creating branch for M13 Cards
- Changed delayed triggers of Pacts to abilities rather than spells; Summoner's Pact no longer shuffles into library
- Fixed Riders of Gavony.
- Added the recent commit logs to changes.txt.
- Added the recent commit logs to changes.txt. Preparing for the snapshot build release.
- Merged changes from trunk to AbilityWork: r15686-r15836
- Somehow missed some scripts in the merge...
- Cardshop UI tweaks:
* Removed Add/Remove 4-of.
* Relabeled As Buy/Sell.
* Added credits counter.
* Added Max Selling Percentage and Price.
* Fixed labels and buttons to return to normal for regular deck editor.
- Added the recent commit logs to changes.txt. Preparing for the snapshot build release.
- Removed AI column from card shop.
- Removed New Column from Cards for Sale.
- Fixed moveToLibrary bug.
- Added the recent commit logs to changes.txt. Preparing for the snapshot build release.
Many people helped with this version. A special thank you goes out to them. (Attempted to list names alphabetically): Many people helped with this version. A special thank you goes out to them. (Attempted to list names alphabetically):
@@ -468,6 +507,15 @@ Etherium-Horn Sorcerer
Maelstrom Wanderer Maelstrom Wanderer
Mass Mutiny Mass Mutiny
Shardless Agent Shardless Agent
Beetleback Chief
Brindle Shoat
Thing from the Deep
Bog Elemental
Krond the Dawn-Clad
Preyseizer Dragon
Indrik Umbra
Dragonlair Spider
Dreampod Druid
end end

View File

@@ -0,0 +1,12 @@
Name:Beetleback Chief
ManaCost:2 R R
Types:Creature Goblin Warrior
Text:no text
PT:2/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put two 1/1 red Goblin creature tokens onto the battlefield.
SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/beetleback_chief.jpg
SetInfo:PC2|Uncommon|http://magiccards.info/scans/en/pc2/40.jpg
Oracle:When Beetleback Chief enters the battlefield, put two 1/1 red Goblin creature tokens onto the battlefield.
End

View File

@@ -0,0 +1,17 @@
Name:Bog Elemental
ManaCost:3 B B
Types:Creature Elemental
Text:no text
PT:5/4
K:Protection from white
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, sacrifice CARDNAME unless you sacrifice a land.
SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | Amount$ 1 | SacValid$ Land | RememberSacrificed$ True | Optional$ True | SubAbility$ DBSacSelf
SVar:DBSacSelf:DB$ Sacrifice | Defined$ Self | SubAbility$ DBCleanup | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$Amount
SVar:RemAIDeck:True
SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_elemental.jpg
SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/57.jpg
Oracle:Protection from white\nAt the beginning of your upkeep, sacrifice Bog Elemental unless you sacrifice a land.
End

View File

@@ -0,0 +1,13 @@
Name:Brindle Shoat
ManaCost:1 G
Types:Creature Boar
Text:no text
PT:1/1
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, put a 3/3 green Boar creature token onto the battlefield.
SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Boar | TokenTypes$ Creature,Boar | TokenOwner$ TriggeredCardController | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3
SVar:SacMe:4
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/brindle_shoat.jpg
SetInfo:PC2|Uncommon|http://magiccards.info/scans/en/pc2/60.jpg
Oracle:When Brindle Shoat dies, put a 3/3 green Boar creature token onto the battlefield.
End

View File

@@ -4,7 +4,7 @@ Types:Creature Human Soldier
Text:no text Text:no text
PT:1/1 PT:1/1
K:Provoke K:Provoke
A:AB$ Pump | Cost$ 1 W | KW$ HIDDEN Prevent all damage that would be dealt to CARDNAME. & HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by CARDNAME this turn. A:AB$ Pump | Cost$ 1 W | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by CARDNAME this turn.
SVar:RemAIDeck:True SVar:RemAIDeck:True
SVar:Rarity:Common SVar:Rarity:Common
SVar:Picture:http://www.wizards.com/global/images/magic/general/deftblade_elite.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/deftblade_elite.jpg

View File

@@ -0,0 +1,13 @@
Name:Dragonlair Spider
ManaCost:2 R R G G
Types:Creature Spider
Text:no text
PT:5/6
K:Reach
T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent casts a spell, put a 1/1 green Insect creature token onto the battlefield.
SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1
SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonlair_spider.jpg
SetInfo:PC2|Rare|http://magiccards.info/scans/en/pc2/87.jpg
Oracle:Reach\nWhenever an opponent casts a spell, put a 1/1 green Insect creature token onto the battlefield.
End

View File

@@ -0,0 +1,12 @@
Name:Dreampod Druid
ManaCost:1 G
Types:Creature Human Druid
Text:no text
PT:2/2
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+enchanted | TriggerDescription$ At the beginning of each upkeep, if CARDNAME is enchanted, put a 1/1 green Saproling creature token onto the battlefield.
SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/dreampod_druid.jpg
SetInfo:PC2|Uncommon|http://magiccards.info/scans/en/pc2/64.jpg
Oracle:At the beginning of each upkeep, if Dreampod Druid is enchanted, put a 1/1 green Saproling creature token onto the battlefield.
End

View File

@@ -3,8 +3,8 @@ ManaCost:B
Types:Instant Types:Instant
Text:no text Text:no text
A:SP$ Charm | Cost$ B | Choices$ EbonyDrain,EbonyExile,EbonyFear | Defined$ You | SpellDescription$ Choose one - Target opponent loses 1 life and you gain 1 life; or exile up to three target cards from a single graveyard; or target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) A:SP$ Charm | Cost$ B | Choices$ EbonyDrain,EbonyExile,EbonyFear | Defined$ You | SpellDescription$ Choose one - Target opponent loses 1 life and you gain 1 life; or exile up to three target cards from a single graveyard; or target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.)
SVar:EbonyDrain:DB$LoseLife | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | LifeAmount$ 1 | SubAbility$ EbonyGain | SpellDescription$ Target opponent loses 1 life and you gain 1 life; SVar:EbonyDrain:DB$ LoseLife | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | LifeAmount$ 1 | SubAbility$ EbonyGain | SpellDescription$ Target opponent loses 1 life and you gain 1 life;
SVar:EbonyGain:DB$GainLife | Defined$ You | LifeAmount$ 1 SVar:EbonyGain:DB$ GainLife | Defined$ You | LifeAmount$ 1
SVar:EbonyExile:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 3 | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile up to three target cards from a single graveyard; SVar:EbonyExile:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 3 | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile up to three target cards from a single graveyard;
SVar:EbonyFear:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear | SpellDescription$ Target creature gains fear until end of turn. SVar:EbonyFear:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear | SpellDescription$ Target creature gains fear until end of turn.
SVar:RemAIDeck:True SVar:RemAIDeck:True

View File

@@ -2,7 +2,7 @@ Name:Hunting Grounds
ManaCost:G W ManaCost:G W
Types:Enchantment Types:Enchantment
Text:no text Text:no text
T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigChangeZone | OptionalDecider$ You | Threshold$ True | TriggerDescription$ Threshold - Whenever an opponent casts a spell, you may put a creature card from your hand onto the battlefield. T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigChangeZone | OptionalDecider$ You | Threshold$ True | TriggerDescription$ Threshold - As long as seven or more cards are in your graveyard, CARDNAME has "Whenever an opponent casts a spell, you may put a creature card from your hand onto the battlefield."
SVar:TrigChangeZone:AB$ ChangeZone | Cost$ 0 | ChangeType$ Creature | ChangeNum$ 1 | Origin$ Hand | Destination$ Battlefield SVar:TrigChangeZone:AB$ ChangeZone | Cost$ 0 | ChangeType$ Creature | ChangeNum$ 1 | Origin$ Hand | Destination$ Battlefield
SVar:Rarity:Rare SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_grounds.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_grounds.jpg

View File

@@ -0,0 +1,13 @@
Name:Indrik Umbra
ManaCost:4 G W
Types:Enchantment Aura
Text:no text
K:Enchant creature
K:Totem armor
A:SP$ Attach | Cost$ 4 G W | ValidTgts$ Creature | AILogic$ Pump
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 4 | AddToughness$ 4 | AddKeyword$ First Strike | AddHiddenKeyword$ HIDDEN All creatures able to block CARDNAME do so. | Description$ Enchanted creature gets +4/+4 and has first strike, and all creatures able to block it do so.
SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/indrik_umbra.jpg
SetInfo:PC2|Rare|http://magiccards.info/scans/en/pc2/96.jpg
Oracle:Enchant creature\nEnchanted creature gets +4/+4 and has first strike, and all creatures able to block it do so.\nTotem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.)
End

View File

@@ -0,0 +1,15 @@
Name:Krond the Dawn-Clad
ManaCost:G G G W W W
Types:Legendary Creature Archon
Text:no text
PT:6/6
K:Flying
K:Vigilance
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | IsPresent$ Card.Self+enchanted | TriggerDescription$ Whenever CARDNAME attacks, if it's enchanted, exile target permanent.
SVar:TrigExile:AB$ ChangeZone | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Exile
SVar:EnchantMe:Once
SVar:Rarity:Mythic
SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Second_Age/krond_the_dawn_clad.jpg
SetInfo:PC2|Mythic|http://magiccards.info/scans/en/pc2/99.jpg
Oracle:Flying, vigilance\nWhenever Krond the Dawn-Clad attacks, if it's enchanted, exile target permanent.
End

View File

@@ -5,7 +5,7 @@ Text:no text
Colors:blue Colors:blue
A:SP$ Counter | Cost$ 0 | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ DBDelTrig | SpellDescription$ Counter target spell. At the beginning of your next upkeep, pay 3 U U. If you don't, you lose the game. A:SP$ Counter | Cost$ 0 | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ DBDelTrig | SpellDescription$ Counter target spell. At the beginning of your next upkeep, pay 3 U U. If you don't, you lose the game.
SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 3 U U. If you don't, you lose the game. SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 3 U U. If you don't, you lose the game.
SVar:TrigLoseGame:SP$LosesGame | Cost$ 0 | UnlessCost$ 3 U U | UnlessPayer$ You | Defined$ You SVar:TrigLoseGame:AB$LosesGame | Cost$ 0 | UnlessCost$ 3 U U | UnlessPayer$ You | Defined$ You
SVar:RemAIDeck:True SVar:RemAIDeck:True
SVar:Rarity:Rare SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/pact_of_negation.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/pact_of_negation.jpg

View File

@@ -5,7 +5,7 @@ Text:no text
Colors:red Colors:red
A:SP$ Token | Cost$ 0| TokenAmount$ 1 | TokenName$ Giant | TokenTypes$ Creature,Giant | TokenOwner$ You | TokenColors$ Red | TokenPower$ 4 | TokenToughness$ 4 | SubAbility$ DBDelTrig | SpellDescription$ Put a 4/4 red Giant creature token onto the battlefield. At the beginning of your next upkeep, pay 4 R. If you don't, you lose the game. A:SP$ Token | Cost$ 0| TokenAmount$ 1 | TokenName$ Giant | TokenTypes$ Creature,Giant | TokenOwner$ You | TokenColors$ Red | TokenPower$ 4 | TokenToughness$ 4 | SubAbility$ DBDelTrig | SpellDescription$ Put a 4/4 red Giant creature token onto the battlefield. At the beginning of your next upkeep, pay 4 R. If you don't, you lose the game.
SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 4 R. If you don't, you lose the game. SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 4 R. If you don't, you lose the game.
SVar:TrigLoseGame:SP$LosesGame | Cost$ 0 | UnlessCost$ 4 R | UnlessPayer$ You | Defined$ You SVar:TrigLoseGame:AB$LosesGame | Cost$ 0 | UnlessCost$ 4 R | UnlessPayer$ You | Defined$ You
SVar:RemAIDeck:True SVar:RemAIDeck:True
SVar:Rarity:Rare SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/pact_of_the_titan.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/pact_of_the_titan.jpg

View File

@@ -0,0 +1,15 @@
Name:Preyseizer Dragon
ManaCost:4 R R
Types:Creature Dragon
Text:no text
PT:4/4
K:Flying
K:Devour:2
T:Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals damage to target creature or player equal to the number of +1/+1 counters on CARDNAME.
SVar:TrigDealDamage:AB$ DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ X
SVar:X:Count$CardCounters.P1P1
SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/preyseizer_dragon.jpg
SetInfo:PC2|Rare|http://magiccards.info/scans/en/pc2/50.jpg
Oracle:Flying\nDevour 2 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with twice that many +1/+1 counters on it.)\nWhenever Preyseizer Dragon attacks, it deals damage to target creature or player equal to the number of +1/+1 counters on Preyseizer Dragon.
End

View File

@@ -4,7 +4,7 @@ Types:Sorcery
Text:no text Text:no text
K:Flashback 5 B B K:Flashback 5 B B
A:SP$ ChangeZone | Cost$ 3 B | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBSearch | SpellDescription$ Exile target creature and all other creatures with the same name as that creature. A:SP$ ChangeZone | Cost$ 3 B | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBSearch | SpellDescription$ Exile target creature and all other creatures with the same name as that creature.
SVar:DBSearch:DB$ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | Defined$ TargetedController | ChangeType$ Remembered.sameName | Shuffle$ True | SubAbility$ DBCleanup SVar:DBSearch:DB$ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName | Shuffle$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True
SVar:Rarity:Rare SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/sever_the_bloodline.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/sever_the_bloodline.jpg

View File

@@ -5,7 +5,7 @@ Text:no text
Colors:black Colors:black
A:SP$ Destroy | Cost$ 0 | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SubAbility$ DBDelTrig | SpellDescription$ Destroy target nonblack creature. At the beginning of your next upkeep, pay 2 B. If you don't, you lose the game. A:SP$ Destroy | Cost$ 0 | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SubAbility$ DBDelTrig | SpellDescription$ Destroy target nonblack creature. At the beginning of your next upkeep, pay 2 B. If you don't, you lose the game.
SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 2 B. If you don't, you lose the game. SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 2 B. If you don't, you lose the game.
SVar:TrigLoseGame:SP$LosesGame | Cost$ 0 | UnlessCost$ 2 B | UnlessPayer$ You | Defined$ You SVar:TrigLoseGame:AB$LosesGame | Cost$ 0 | UnlessCost$ 2 B | UnlessPayer$ You | Defined$ You
SVar:RemAIDeck:True SVar:RemAIDeck:True
SVar:Rarity:Rare SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/slaughter_pact.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/slaughter_pact.jpg

View File

@@ -3,10 +3,9 @@ ManaCost:0
Types:Instant Types:Instant
Text:no text Text:no text
Colors:green Colors:green
A:SP$ ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Green+YouOwn | ChangeNum$ 1 | SubAbility$ DBShuffle | SpellDescription$ Search your library for a green creature card, reveal it, and put it into your hand. Then shuffle your library. At the beginning of your next upkeep, pay 2 G G. If you don't, you lose the game. A:SP$ ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Green+YouOwn | ChangeNum$ 1 | SubAbility$ DBDelTrig | SpellDescription$ Search your library for a green creature card, reveal it, and put it into your hand. Then shuffle your library. At the beginning of your next upkeep, pay 2 G G. If you don't, you lose the game.
SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True | SubAbility$ DBDelTrig
SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 2 G G. If you don't, you lose the game. SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 2 G G. If you don't, you lose the game.
SVar:TrigLoseGame:SP$LosesGame | Cost$ 0 | UnlessCost$ 2 G G | UnlessPayer$ You | Defined$ You SVar:TrigLoseGame:AB$LosesGame | Cost$ 0 | UnlessCost$ 2 G G | UnlessPayer$ You | Defined$ You
SVar:RemAIDeck:True SVar:RemAIDeck:True
SVar:Rarity:Rare SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/summoners_pact.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/summoners_pact.jpg

View File

@@ -0,0 +1,17 @@
Name:Thing from the Deep
ManaCost:6 U U U
Types:Creature Leviathan
Text:no text
PT:9/9
T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ DeepDooDoo | TriggerDescription$ Whenever CARDNAME attacks, sacrifice it unless you sacrifice an Island.
SVar:DeepDooDoo:AB$ Sacrifice | Cost$ 0 | Amount$ 1 | SacValid$ Island | RememberSacrificed$ True | Optional$ True | SubAbility$ DeepSink
SVar:DeepSink:DB$ Sacrifice | Defined$ Self | SubAbility$ DeepClean | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1
SVar:DeepClean:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$Amount
SVar:NeedsToPlay:Island.YouCtrl
SVar:RemAIDeck:True
SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/thing_from_the_deep.jpg
SetInfo:POR|Rare|http://magiccards.info/scans/en/po/74.jpg
Oracle:Whenever Thing from the Deep attacks, sacrifice it unless you sacrifice an Island.
End

View File

@@ -8,7 +8,7 @@ A:AB$ Charm | Cost$ SubCounter<1/CHARGE> | Choices$ JittePump,JitteCurse,JitteLi
SVar:JittePump:DB$ Pump | Defined$ Equipped | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Equipped creature gets +2/+2 until end of turn; SVar:JittePump:DB$ Pump | Defined$ Equipped | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Equipped creature gets +2/+2 until end of turn;
SVar:JitteCurse:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ or target creature gets -1/-1 until end of turn; SVar:JitteCurse:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ or target creature gets -1/-1 until end of turn;
SVar:JitteLife:DB$ GainLife | LifeAmount$ 2 | SpellDescription$ or you gain 2 life. SVar:JitteLife:DB$ GainLife | LifeAmount$ 2 | SpellDescription$ or you gain 2 life.
SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 2 SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 2
SVar:Rarity:Rare SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/umezawas_jitte.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/umezawas_jitte.jpg
SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/163.jpg SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/163.jpg

View File

@@ -11,10 +11,13 @@ Flying
Haste Haste
Hexproof Hexproof
Horsemanship Horsemanship
Indestructible
Infect Infect
Intimidate Intimidate
Lifelink Lifelink
Persist
Phasing Phasing
Prevent all combat damage that would be dealt by CARDNAME.
Reach Reach
Rebound Rebound
Shadow Shadow
@@ -22,5 +25,6 @@ Shroud
Split Second Split Second
Trample Trample
Unblockable Unblockable
Undying
Vigilance Vigilance
Wither Wither

View File

@@ -3653,7 +3653,7 @@ public class Card extends GameEntity implements Comparable<Card> {
* @return a boolean. * @return a boolean.
*/ */
public final boolean hasSickness() { public final boolean hasSickness() {
return !this.hasKeyword("Haste") && this.sickness; return this.sickness && !this.hasKeyword("Haste");
} }
/** /**
@@ -3663,7 +3663,7 @@ public class Card extends GameEntity implements Comparable<Card> {
* @return boolean * @return boolean
*/ */
public final boolean isSick() { public final boolean isSick() {
return !this.hasKeyword("Haste") && this.sickness && this.isCreature(); return this.sickness && this.isCreature() && !this.hasKeyword("Haste");
} }
/** /**
@@ -6385,15 +6385,15 @@ public class Card extends GameEntity implements Comparable<Card> {
* isType. * isType.
* </p> * </p>
* *
* @param cardType * @param type
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public final boolean isType(String cardType) { public final boolean isType(String type) {
cardType = this.toMixedCase(cardType); type = this.toMixedCase(type);
if (this.typeContains(cardType) if (this.typeContains(type)
|| ((this.isCreature() || this.isTribal()) && CardUtil.isACreatureType(cardType) && this || ((this.isCreature() || this.isTribal()) && CardUtil.isACreatureType(type) && this
.typeContains("AllCreatureTypes"))) { .typeContains("AllCreatureTypes"))) {
return true; return true;
} }
@@ -7943,48 +7943,52 @@ public class Card extends GameEntity implements Comparable<Card> {
return 0; return 0;
} }
if (isCombat) { for (String kw : source.getKeyword()) {
if (this.hasKeyword("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) { if (isCombat) {
if (kw.equals("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) {
return 0;
}
if (kw.equals("Prevent all combat damage that would be dealt by CARDNAME.")) {
return 0;
}
}
if (kw.equals("Prevent all damage that would be dealt to and dealt by CARDNAME.")) {
return 0; return 0;
} }
if (this.hasKeyword("Prevent all combat damage that would be dealt to CARDNAME.")) { if (kw.equals("Prevent all damage that would be dealt by CARDNAME.")) {
return 0;
}
if (source.hasKeyword("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) {
return 0;
}
if (source.hasKeyword("Prevent all combat damage that would be dealt by CARDNAME.")) {
return 0; return 0;
} }
} }
if (this.hasKeyword("Prevent all damage that would be dealt to CARDNAME.")) { for (String kw : this.getKeyword()) {
return 0; if (isCombat) {
} if (kw.equals("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) {
if (this.hasKeyword("Prevent all damage that would be dealt to and dealt by CARDNAME.")) { return 0;
return 0; }
} if (kw.equals("Prevent all combat damage that would be dealt to CARDNAME.")) {
if (source.hasKeyword("Prevent all damage that would be dealt to and dealt by CARDNAME.")) { return 0;
return 0; }
} }
if (source.hasKeyword("Prevent all damage that would be dealt by CARDNAME.")) { if (kw.equals("Prevent all damage that would be dealt to CARDNAME.")) {
return 0;
}
if (this.hasStartOfKeyword("Absorb")) {
final int absorbed = this.getKeywordMagnitude("Absorb");
if (restDamage > absorbed) {
restDamage = restDamage - absorbed;
} else {
return 0; return 0;
} }
} if (kw.equals("Prevent all damage that would be dealt to and dealt by CARDNAME.")) {
if (this.hasStartOfKeyword("PreventAllDamageBy")) {
String valid = this.getKeyword().get(this.getKeywordPosition("PreventAllDamageBy"));
valid = valid.split(" ", 2)[1];
if (source.isValid(valid, this.getController(), this)) {
return 0; return 0;
} }
if (kw.equals("Absorb")) {
final int absorbed = this.getKeywordMagnitude("Absorb");
if (restDamage > absorbed) {
restDamage = restDamage - absorbed;
} else {
return 0;
}
}
if (kw.startsWith("PreventAllDamageBy")) {
String valid = this.getKeyword().get(this.getKeywordPosition("PreventAllDamageBy"));
valid = valid.split(" ", 2)[1];
if (source.isValid(valid, this.getController(), this)) {
return 0;
}
}
} }
// Prevent Damage static abilities // Prevent Damage static abilities

View File

@@ -620,7 +620,14 @@ public final class CardUtil {
* @return a boolean. * @return a boolean.
*/ */
public static boolean isNonStackingKeyword(final String keyword) { public static boolean isNonStackingKeyword(final String keyword) {
return Constant.Keywords.NON_STACKING_LIST.contains(keyword); String kw = new String(keyword);
if (kw.startsWith("HIDDEN")) {
kw = kw.substring(7);
}
if (kw.startsWith("Protection")) {
return true;
}
return Constant.Keywords.NON_STACKING_LIST.contains(kw);
} }
/** /**

View File

@@ -666,19 +666,19 @@ public class GameAction {
AllZone.getTriggerHandler().clearSuppression(TriggerType.Transformed); AllZone.getTriggerHandler().clearSuppression(TriggerType.Transformed);
} }
Card lastKnownInfo = c;
if ((p != null) && p.is(ZoneType.Battlefield)) {
lastKnownInfo = CardUtil.getLKICopy(c);
c = AllZone.getCardFactory().copyCard(c);
}
c.clearCounters(); // remove all counters
if ((libPosition == -1) || (libPosition > library.size())) { if ((libPosition == -1) || (libPosition > library.size())) {
libPosition = library.size(); libPosition = library.size();
} }
library.add(c, libPosition); Card lastKnownInfo = c;
if (p != null && p.is(ZoneType.Battlefield)) {
lastKnownInfo = CardUtil.getLKICopy(c);
c.clearCounters(); // remove all counters
library.add(AllZone.getCardFactory().copyCard(c), libPosition);
} else {
c.clearCounters(); // remove all counters
library.add(c, libPosition);
}
final HashMap<String, Object> runParams = new HashMap<String, Object>(); final HashMap<String, Object> runParams = new HashMap<String, Object>();
runParams.put("Card", lastKnownInfo); runParams.put("Card", lastKnownInfo);
@@ -695,6 +695,12 @@ public class GameAction {
owner.updateLabelObservers(); owner.updateLabelObservers();
} }
// Soulbond unpairing
if (c.isPaired()) {
c.getPairedWith().setPairedWith(null);
c.setPairedWith(null);
}
return c; return c;
} }

View File

@@ -388,10 +388,10 @@ public class AbilityFactoryAlterLife {
final Target tgt = sa.getTarget(); final Target tgt = sa.getTarget();
if (tgt != null) { if (tgt != null) {
tgt.resetTargets(); tgt.resetTargets();
if (sa.canTarget(AllZone.getHumanPlayer())) { if (sa.canTarget(AllZone.getComputerPlayer())) {
tgt.addTarget(AllZone.getHumanPlayer());
} else if (mandatory && sa.canTarget(AllZone.getComputerPlayer())) {
tgt.addTarget(AllZone.getComputerPlayer()); tgt.addTarget(AllZone.getComputerPlayer());
} else if (mandatory && sa.canTarget(AllZone.getHumanPlayer())) {
tgt.addTarget(AllZone.getHumanPlayer());
} else { } else {
return false; return false;
} }

View File

@@ -166,6 +166,11 @@ public final class AbilityFactoryChangeZone {
AbilityFactoryChangeZone.changeZoneResolve(af, this); AbilityFactoryChangeZone.changeZoneResolve(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryChangeZone.changeZoneCanPlayAI(af, this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryChangeZone.changeZonePlayDrawbackAI(af, this); return AbilityFactoryChangeZone.changeZonePlayDrawbackAI(af, this);
@@ -1069,33 +1074,49 @@ public final class AbilityFactoryChangeZone {
c = CardUtil.getRandom(fetchList.toArray()); c = CardUtil.getRandom(fetchList.toArray());
} else if (defined) { } else if (defined) {
c = fetchList.get(0); c = fetchList.get(0);
} else if (type.contains("Basic")) {
c = AbilityFactoryChangeZone.basicManaFixing(fetchList);
} else if (AbilityFactoryChangeZone.areAllBasics(type)) {
c = AbilityFactoryChangeZone.basicManaFixing(fetchList, type);
} else if (fetchList.getNotType("Creature").size() == 0) {
c = CardFactoryUtil.getBestCreatureAI(fetchList); // if only
// creatures
// take the
// best
} else if (ZoneType.Battlefield.equals(destination) || ZoneType.Graveyard.equals(destination)) {
c = CardFactoryUtil.getMostExpensivePermanentAI(fetchList, sa, false);
} else if (ZoneType.Exile.equals(destination)) {
// Exiling your own stuff, if Exiling opponents stuff choose
// best
if (destZone.getPlayer().isHuman()) {
c = CardFactoryUtil.getMostExpensivePermanentAI(fetchList, sa, false);
} else {
c = CardFactoryUtil.getCheapestPermanentAI(fetchList, sa, false);
}
} else { } else {
// Don't fetch another tutor with the same name Card first = fetchList.get(0);
if (origin.contains(ZoneType.Library) && !fetchList.getNotName(card.getName()).isEmpty()) { fetchList = fetchList.filter(new CardListFilter() {
fetchList = fetchList.getNotName(card.getName()); @Override
public boolean addCard(final Card c) {
if (c.isType("Legendary")) {
if (!AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield, c.getName()).isEmpty()) {
return false;
}
}
return true;
}
});
if (type.contains("Basic")) {
c = AbilityFactoryChangeZone.basicManaFixing(fetchList);
} else if (AbilityFactoryChangeZone.areAllBasics(type)) {
c = AbilityFactoryChangeZone.basicManaFixing(fetchList, type);
} else if (fetchList.getNotType("Creature").size() == 0) {
c = CardFactoryUtil.getBestCreatureAI(fetchList); // if only
// creatures
// take the
// best
} else if (ZoneType.Battlefield.equals(destination) || ZoneType.Graveyard.equals(destination)) {
c = CardFactoryUtil.getMostExpensivePermanentAI(fetchList, sa, false);
} else if (ZoneType.Exile.equals(destination)) {
// Exiling your own stuff, if Exiling opponents stuff choose
// best
if (destZone.getPlayer().isHuman()) {
c = CardFactoryUtil.getMostExpensivePermanentAI(fetchList, sa, false);
} else {
c = CardFactoryUtil.getCheapestPermanentAI(fetchList, sa, false);
}
} else {
// Don't fetch another tutor with the same name
if (origin.contains(ZoneType.Library) && !fetchList.getNotName(card.getName()).isEmpty()) {
fetchList = fetchList.getNotName(card.getName());
}
fetchList.shuffle();
c = fetchList.get(0);
}
if (c == null) {
c = first;
} }
fetchList.shuffle();
c = fetchList.get(0);
} }
fetched.add(c); fetched.add(c);
@@ -2233,6 +2254,11 @@ public final class AbilityFactoryChangeZone {
AbilityFactoryChangeZone.changeZoneAllResolve(af, this); AbilityFactoryChangeZone.changeZoneAllResolve(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryChangeZone.changeZoneAllCanPlayAI(af, this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryChangeZone.changeZoneAllPlayDrawbackAI(af, this); return AbilityFactoryChangeZone.changeZoneAllPlayDrawbackAI(af, this);

View File

@@ -171,6 +171,11 @@ public class AbilityFactoryCounters {
AbilityFactoryCounters.putResolve(af, this); AbilityFactoryCounters.putResolve(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryCounters.putCanPlayAI(af, this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryCounters.putPlayDrawbackAI(af, this); return AbilityFactoryCounters.putPlayDrawbackAI(af, this);

View File

@@ -173,6 +173,11 @@ public class AbilityFactoryDealDamage {
return AbilityFactoryDealDamage.this.damageDrawback(this); return AbilityFactoryDealDamage.this.damageDrawback(this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryDealDamage.this.dealDamageCanPlayAI(this);
}
@Override @Override
public String getStackDescription() { public String getStackDescription() {
return AbilityFactoryDealDamage.this.dealDamageStackDescription( return AbilityFactoryDealDamage.this.dealDamageStackDescription(
@@ -959,6 +964,11 @@ public class AbilityFactoryDealDamage {
return AbilityFactoryDealDamage.this.damageAllStackDescription(this.af, this); return AbilityFactoryDealDamage.this.damageAllStackDescription(this.af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryDealDamage.this.damageAllCanPlayAI(this.af, this);
}
@Override @Override
public void resolve() { public void resolve() {
AbilityFactoryDealDamage.this.damageAllResolve(this.af, this); AbilityFactoryDealDamage.this.damageAllResolve(this.af, this);

View File

@@ -688,6 +688,11 @@ public class AbilityFactoryDestroy {
return AbilityFactoryDestroy.destroyAllStackDescription(af, this, this.noRegen); return AbilityFactoryDestroy.destroyAllStackDescription(af, this, this.noRegen);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryDestroy.destroyAllCanPlayAI(af, this, this.noRegen);
}
@Override @Override
public void resolve() { public void resolve() {
AbilityFactoryDestroy.destroyAllResolve(af, this, this.noRegen); AbilityFactoryDestroy.destroyAllResolve(af, this, this.noRegen);

View File

@@ -411,7 +411,11 @@ public class AbilityFactoryGainControl {
GameEntity newController; GameEntity newController;
if (controllers.size() == 0) { if (controllers.size() == 0) {
newController = this.hostCard; if (sa.isSpell()) {
newController = sa.getActivatingPlayer();
} else {
newController = this.hostCard;
}
} else { } else {
newController = controllers.get(0); newController = controllers.get(0);
} }
@@ -446,16 +450,16 @@ public class AbilityFactoryGainControl {
if (this.lose != null) { if (this.lose != null) {
if (this.lose.contains("LeavesPlay")) { if (this.lose.contains("LeavesPlay")) {
this.hostCard.addLeavesPlayCommand(this.getLoseControlCommand(tgtC, originalController)); this.hostCard.addLeavesPlayCommand(this.getLoseControlCommand(tgtC, originalController, newController));
} }
if (this.lose.contains("Untap")) { if (this.lose.contains("Untap")) {
this.hostCard.addUntapCommand(this.getLoseControlCommand(tgtC, originalController)); this.hostCard.addUntapCommand(this.getLoseControlCommand(tgtC, originalController, newController));
} }
if (this.lose.contains("LoseControl")) { if (this.lose.contains("LoseControl")) {
this.hostCard.addChangeControllerCommand(this.getLoseControlCommand(tgtC, originalController)); this.hostCard.addChangeControllerCommand(this.getLoseControlCommand(tgtC, originalController, newController));
} }
if (this.lose.contains("EOT")) { if (this.lose.contains("EOT")) {
AllZone.getEndOfTurn().addAt(this.getLoseControlCommand(tgtC, originalController)); AllZone.getEndOfTurn().addAt(this.getLoseControlCommand(tgtC, originalController, newController));
} }
} }
@@ -472,7 +476,7 @@ public class AbilityFactoryGainControl {
} }
this.hostCard.clearGainControlReleaseCommands(); this.hostCard.clearGainControlReleaseCommands();
this.hostCard.addGainControlReleaseCommand(this.getLoseControlCommand(tgtC, originalController)); this.hostCard.addGainControlReleaseCommand(this.getLoseControlCommand(tgtC, originalController, newController));
} // end foreach target } // end foreach target
} }
@@ -586,14 +590,15 @@ public class AbilityFactoryGainControl {
* a {@link forge.game.player.Player} object. * a {@link forge.game.player.Player} object.
* @return a {@link forge.Command} object. * @return a {@link forge.Command} object.
*/ */
private Command getLoseControlCommand(final Card c, final Player originalController) { private Command getLoseControlCommand(final Card c, final Player originalController, final GameEntity newController) {
final Command loseControl = new Command() { final Command loseControl = new Command() {
private static final long serialVersionUID = 878543373519872418L; private static final long serialVersionUID = 878543373519872418L;
@Override @Override
public void execute() { public void execute() {
AbilityFactoryGainControl.doLoseControl(c, AbilityFactoryGainControl.this.hostCard, AbilityFactoryGainControl.doLoseControl(c, AbilityFactoryGainControl.this.hostCard,
AbilityFactoryGainControl.this.bTapOnLose, AbilityFactoryGainControl.this.kws); AbilityFactoryGainControl.this.bTapOnLose, AbilityFactoryGainControl.this.kws,
newController);
} // execute() } // execute()
}; };
@@ -601,12 +606,12 @@ public class AbilityFactoryGainControl {
} }
private static void doLoseControl(final Card c, final Card host, final boolean tapOnLose, private static void doLoseControl(final Card c, final Card host, final boolean tapOnLose,
final ArrayList<String> addedKeywords) { final ArrayList<String> addedKeywords, final GameEntity newController) {
if (null == c) { if (null == c) {
return; return;
} }
if (AllZoneUtil.isCardInPlay(c)) { if (AllZoneUtil.isCardInPlay(c)) {
c.removeController(host); c.removeController(newController);
// Singletons.getModel().getGameAction().changeController(new CardList(c), // Singletons.getModel().getGameAction().changeController(new CardList(c),
// c.getController(), originalController); // c.getController(), originalController);

View File

@@ -150,6 +150,11 @@ public class AbilityFactoryPermanentState {
AbilityFactoryPermanentState.untapResolve(af, this); AbilityFactoryPermanentState.untapResolve(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryPermanentState.untapCanPlayAI(af, this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryPermanentState.untapPlayDrawbackAI(af, this); return AbilityFactoryPermanentState.untapPlayDrawbackAI(af, this);
@@ -714,6 +719,11 @@ public class AbilityFactoryPermanentState {
AbilityFactoryPermanentState.tapResolve(af, this); AbilityFactoryPermanentState.tapResolve(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapCanPlayAI(af, this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryPermanentState.tapPlayDrawbackAI(af, this); return AbilityFactoryPermanentState.tapPlayDrawbackAI(af, this);
@@ -1485,6 +1495,11 @@ public class AbilityFactoryPermanentState {
AbilityFactoryPermanentState.tapAllResolve(af, this); AbilityFactoryPermanentState.tapAllResolve(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryPermanentState.tapAllCanPlayAI(af, this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryPermanentState.tapAllPlayDrawbackAI(af, this); return AbilityFactoryPermanentState.tapAllPlayDrawbackAI(af, this);

View File

@@ -302,6 +302,18 @@ public class AbilityFactoryPump {
if (ph.getPhase().isBefore(PhaseType.MAIN2) || card.isUntapped() || ph.isPlayerTurn(human)) { if (ph.getPhase().isBefore(PhaseType.MAIN2) || card.isUntapped() || ph.isPlayerTurn(human)) {
return false; return false;
} }
} else if (keyword.endsWith("Prevent all combat damage that would be dealt by CARDNAME.")) {
if (ph.isPlayerTurn(computer) && (!CombatUtil.canBlock(card)
|| card.getNetCombatDamage() <= 0
|| ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)
|| ph.getPhase().isBefore(PhaseType.MAIN1)
|| AllZoneUtil.getCreaturesInPlay(computer).isEmpty())) {
return false;
}
if (ph.isPlayerTurn(human) && (!card.isAttacking()
|| card.getNetCombatDamage() <= 0)) {
return false;
}
} else if (keyword.endsWith("CARDNAME attacks each turn if able.")) { } else if (keyword.endsWith("CARDNAME attacks each turn if able.")) {
if (ph.isPlayerTurn(human) || !CombatUtil.canAttack(card) || !CombatUtil.canBeBlocked(card) if (ph.isPlayerTurn(human) || !CombatUtil.canAttack(card) || !CombatUtil.canBeBlocked(card)
|| ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
@@ -1373,6 +1385,11 @@ public class AbilityFactoryPump {
AbilityFactoryPump.this.pumpAllResolve(this); AbilityFactoryPump.this.pumpAllResolve(this);
} // resolve } // resolve
@Override
public boolean canPlayAI() {
return AbilityFactoryPump.this.pumpAllCanPlayAI(this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryPump.this.pumpAllChkDrawbackAI(this); return AbilityFactoryPump.this.pumpAllChkDrawbackAI(this);

View File

@@ -160,6 +160,11 @@ public final class AbilityFactoryReveal {
AbilityFactoryReveal.digResolve(af, this); AbilityFactoryReveal.digResolve(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryReveal.digCanPlayAI(af, this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return true; return true;

View File

@@ -152,6 +152,11 @@ public class AbilityFactoryZoneAffecting {
return AbilityFactoryZoneAffecting.drawStackDescription(af, this); return AbilityFactoryZoneAffecting.drawStackDescription(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.drawCanPlayAI(af, this);
}
@Override @Override
public void resolve() { public void resolve() {
AbilityFactoryZoneAffecting.drawResolve(af, this); AbilityFactoryZoneAffecting.drawResolve(af, this);
@@ -1121,6 +1126,11 @@ public class AbilityFactoryZoneAffecting {
AbilityFactoryZoneAffecting.discardResolve(af, this); AbilityFactoryZoneAffecting.discardResolve(af, this);
} }
@Override
public boolean canPlayAI() {
return AbilityFactoryZoneAffecting.discardCanPlayAI(af, this);
}
@Override @Override
public boolean chkAIDrawback() { public boolean chkAIDrawback() {
return AbilityFactoryZoneAffecting.discardCheckDrawbackAI(af, this); return AbilityFactoryZoneAffecting.discardCheckDrawbackAI(af, this);

View File

@@ -4862,11 +4862,12 @@ public class CardFactoryUtil {
card.setSVar("GraftTrig", abStr); card.setSVar("GraftTrig", abStr);
String trigStr = "Mode$ ChangesZone | ValidCard$ Creature.Other | " String trigStr = "Mode$ ChangesZone | ValidCard$ Creature.Other | "
+ "Origin$ Any | Destination$ Battlefield"; + "Origin$ Any | Destination$ Battlefield"
trigStr += " | TriggerZones$ Battlefield | OptionalDecider$ You | " + " | TriggerZones$ Battlefield | OptionalDecider$ You | "
+ "Execute$ GraftTrig | TriggerDescription$ "; + "IsPresent$ Card.Self+counters_GE1_P1P1 | "
trigStr += "Whenever another creature enters the battlefield, you " + "Execute$ GraftTrig | TriggerDescription$ "
+ "may move a +1/+1 counter from this creature onto it."; + "Whenever another creature enters the battlefield, you "
+ "may move a +1/+1 counter from this creature onto it.";
final Trigger myTrigger = TriggerHandler.parseTrigger(trigStr, card, true); final Trigger myTrigger = TriggerHandler.parseTrigger(trigStr, card, true);
card.addTrigger(myTrigger); card.addTrigger(myTrigger);

View File

@@ -128,6 +128,10 @@ public class StaticAbilityContinuous {
addKeywords[w] = addKeywords[w].replaceAll("ChosenColor", color.substring(0, 1).toUpperCase().concat(color.substring(1, color.length()))); addKeywords[w] = addKeywords[w].replaceAll("ChosenColor", color.substring(0, 1).toUpperCase().concat(color.substring(1, color.length())));
} }
} }
final String chosenType = hostCard.getChosenType();
for (int w = 0; w < addKeywords.length; w++) {
addKeywords[w] = addKeywords[w].replaceAll("ChosenType", chosenType);
}
} }
if (params.containsKey("AddHiddenKeyword")) { if (params.containsKey("AddHiddenKeyword")) {

View File

@@ -523,16 +523,21 @@ public class BoosterDraftAI {
for (ManaCostShard shard : mc.getShards()) { for (ManaCostShard shard : mc.getShards()) {
byte mask = shard.getColorMask(); byte mask = shard.getColorMask();
if ((mask & CardColor.WHITE) > 0 ) if ((mask & CardColor.WHITE) > 0) {
clrCnts[0].setCount(clrCnts[0].getCount() + 1); clrCnts[0].setCount(clrCnts[0].getCount() + 1);
if ((mask & CardColor.BLUE) > 0 ) }
if ((mask & CardColor.BLUE) > 0) {
clrCnts[1].setCount(clrCnts[1].getCount() + 1); clrCnts[1].setCount(clrCnts[1].getCount() + 1);
if ((mask & CardColor.BLACK) > 0 ) }
if ((mask & CardColor.BLACK) > 0) {
clrCnts[2].setCount(clrCnts[2].getCount() + 1); clrCnts[2].setCount(clrCnts[2].getCount() + 1);
if ((mask & CardColor.RED) > 0 ) }
if ((mask & CardColor.RED) > 0) {
clrCnts[3].setCount(clrCnts[3].getCount() + 1); clrCnts[3].setCount(clrCnts[3].getCount() + 1);
if ((mask & CardColor.GREEN) > 0 ) }
if ((mask & CardColor.GREEN) > 0) {
clrCnts[4].setCount(clrCnts[4].getCount() + 1); clrCnts[4].setCount(clrCnts[4].getCount() + 1);
}
} }
} }

View File

@@ -361,16 +361,21 @@ public class SealedDeck {
for (ManaCostShard shard : mc.getShards()) { for (ManaCostShard shard : mc.getShards()) {
byte mask = shard.getColorMask(); byte mask = shard.getColorMask();
if ((mask & CardColor.WHITE) > 0 ) if ((mask & CardColor.WHITE) > 0) {
clrCnts[0].setCount(clrCnts[0].getCount() + 1); clrCnts[0].setCount(clrCnts[0].getCount() + 1);
if ((mask & CardColor.BLUE) > 0 ) }
if ((mask & CardColor.BLUE) > 0) {
clrCnts[1].setCount(clrCnts[1].getCount() + 1); clrCnts[1].setCount(clrCnts[1].getCount() + 1);
if ((mask & CardColor.BLACK) > 0 ) }
if ((mask & CardColor.BLACK) > 0) {
clrCnts[2].setCount(clrCnts[2].getCount() + 1); clrCnts[2].setCount(clrCnts[2].getCount() + 1);
if ((mask & CardColor.RED) > 0 ) }
if ((mask & CardColor.RED) > 0) {
clrCnts[3].setCount(clrCnts[3].getCount() + 1); clrCnts[3].setCount(clrCnts[3].getCount() + 1);
if ((mask & CardColor.GREEN) > 0 ) }
if ((mask & CardColor.GREEN) > 0) {
clrCnts[4].setCount(clrCnts[4].getCount() + 1); clrCnts[4].setCount(clrCnts[4].getCount() + 1);
}
} }
} }

View File

@@ -391,7 +391,9 @@ public class ComputerUtilAttack {
final Player computer = AllZone.getComputerPlayer(); final Player computer = AllZone.getComputerPlayer();
for (int i = 0; i < this.attackers.size(); i++) { for (int i = 0; i < this.attackers.size(); i++) {
if (!CombatUtil.canBeBlocked(this.attackers.get(i), this.blockers)) { if (!CombatUtil.canBeBlocked(this.attackers.get(i), this.blockers)
|| this.attackers.get(i).hasKeyword("You may have CARDNAME assign its combat damage as though"
+ " it weren't blocked.")) {
blockableAttackers.remove(this.attackers.get(i)); blockableAttackers.remove(this.attackers.get(i));
} }
} }

View File

@@ -620,20 +620,22 @@ public abstract class Player extends GameEntity {
int restDamage = damage; int restDamage = damage;
if (isCombat) { for (String kw : source.getKeyword()) {
if (source.hasKeyword("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) { if (isCombat) {
if (kw.equals("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) {
return 0;
}
if (kw.equals("Prevent all combat damage that would be dealt by CARDNAME.")) {
return 0;
}
}
if (kw.equals("Prevent all damage that would be dealt to and dealt by CARDNAME.")) {
return 0; return 0;
} }
if (source.hasKeyword("Prevent all combat damage that would be dealt by CARDNAME.")) { if (kw.equals("Prevent all damage that would be dealt by CARDNAME.")) {
return 0; return 0;
} }
} }
if (source.hasKeyword("Prevent all damage that would be dealt to and dealt by CARDNAME.")) {
return 0;
}
if (source.hasKeyword("Prevent all damage that would be dealt by CARDNAME.")) {
return 0;
}
// Prevent Damage static abilities // Prevent Damage static abilities
final CardList allp = AllZoneUtil.getCardsIn(ZoneType.Battlefield); final CardList allp = AllZoneUtil.getCardsIn(ZoneType.Battlefield);

View File

@@ -195,7 +195,6 @@ public class DefaultPlayerZone extends PlayerZone implements java.io.Serializabl
return index; return index;
} }
/** /**
* Removes the. * Removes the.
* *

View File

@@ -41,6 +41,8 @@ import forge.gui.deckeditor.views.VCardCatalog;
import forge.gui.deckeditor.views.VCurrentDeck; import forge.gui.deckeditor.views.VCurrentDeck;
import forge.gui.home.quest.CSubmenuQuestDecks; import forge.gui.home.quest.CSubmenuQuestDecks;
import forge.gui.home.quest.SSubmenuQuestUtil; import forge.gui.home.quest.SSubmenuQuestUtil;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin;
import forge.item.BoosterPack; import forge.item.BoosterPack;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.FatPack; import forge.item.FatPack;
@@ -63,8 +65,13 @@ import forge.util.closures.Lambda1;
* @version $Id: CEditorQuestCardShop.java 15088 2012-04-07 11:34:05Z Max mtg $ * @version $Id: CEditorQuestCardShop.java 15088 2012-04-07 11:34:05Z Max mtg $
*/ */
public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, DeckBase> { public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, DeckBase> {
private final JLabel creditsLabel = new JLabel(); private final JLabel creditsLabel = new FLabel.Builder()
private final JLabel sellPercentageLabel = new JLabel(); .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_COINSTACK))
.fontSize(15).build();
private final JLabel sellPercentageLabel = new FLabel.Builder().text("0")
.fontSize(11)
.build();
private double multiplier; private double multiplier;
private final QuestController questData; private final QuestController questData;
@@ -73,6 +80,12 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
private final Map<String, Integer> mapPrices = this.r.getPriceList(); private final Map<String, Integer> mapPrices = this.r.getPriceList();
private Map<CardPrinted, Integer> decksUsingMyCards; private Map<CardPrinted, Integer> decksUsingMyCards;
// remember changed gui elements
private String CCTabLabel = new String();
private String CCAddLabel = new String();
private String CDTabLabel = new String();
private String CDRemLabel = new String();
/** /**
* Child controller for quest card shop UI. * Child controller for quest card shop UI.
* *
@@ -106,9 +119,10 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions( columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions(
this.fnPriceCompare, this.fnPriceGet); this.fnPriceCompare, this.fnPriceGet);
columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_NEW)); // card shop doesn't need "New" column
columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions( //columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_NEW));
this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); //columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions(
// this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_SALE_PRICE)); columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_SALE_PRICE));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
@@ -122,14 +136,27 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions( columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.fnDeckCompare, this.fnDeckGet); this.fnDeckCompare, this.fnDeckGet);
// don't need AI column for eaither table
columnsCatalog.remove(SColumnUtil.getColumn(ColumnName.CAT_AI));
columnsDeck.remove(SColumnUtil.getColumn(ColumnName.DECK_AI));
// Setup with current column set // Setup with current column set
this.getTableCatalog().setup(VCardCatalog.SINGLETON_INSTANCE, columnsCatalog); this.getTableCatalog().setup(VCardCatalog.SINGLETON_INSTANCE, columnsCatalog);
this.getTableDeck().setup(VCurrentDeck.SINGLETON_INSTANCE, columnsDeck); this.getTableDeck().setup(VCurrentDeck.SINGLETON_INSTANCE, columnsDeck);
SEditorUtil.resetUI(); SEditorUtil.resetUI();
CCTabLabel = VCardCatalog.SINGLETON_INSTANCE.getTabLabel().getText();
VCardCatalog.SINGLETON_INSTANCE.getTabLabel().setText("Cards for sale"); VCardCatalog.SINGLETON_INSTANCE.getTabLabel().setText("Cards for sale");
CCAddLabel = VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().getText();
VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setText("Buy Card");
CDTabLabel = VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().getText();
VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText("Your Cards"); VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText("Your Cards");
CDRemLabel = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().getText();
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().setText("Sell Card");
} }
// fills number of decks using each card // fills number of decks using each card
@@ -342,6 +369,8 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
this.getTableCatalog().setDeck(forSale); this.getTableCatalog().setDeck(forSale);
this.getTableDeck().setDeck(ownedItems); this.getTableDeck().setDeck(ownedItems);
VCurrentDeck.SINGLETON_INSTANCE.getPnlRemButtons().remove(VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4());
VCurrentDeck.SINGLETON_INSTANCE.getPnlRemButtons().add(creditsLabel);
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits()); this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
final double multiPercent = this.multiplier * 100; final double multiPercent = this.multiplier * 100;
@@ -352,6 +381,8 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
if (maxSellPrice < Integer.MAX_VALUE) { if (maxSellPrice < Integer.MAX_VALUE) {
maxSellingPrice = String.format("Maximum selling price is %d credits.", maxSellPrice); maxSellingPrice = String.format("Maximum selling price is %d credits.", maxSellPrice);
} }
VCardCatalog.SINGLETON_INSTANCE.getPnlAddButtons().remove(VCardCatalog.SINGLETON_INSTANCE.getBtnAdd4());
VCardCatalog.SINGLETON_INSTANCE.getPnlAddButtons().add(sellPercentageLabel);
this.sellPercentageLabel.setText("<html>Selling cards at " + formatter.format(multiPercent) this.sellPercentageLabel.setText("<html>Selling cards at " + formatter.format(multiPercent)
+ "% of their value.<br>" + maxSellingPrice + "</html>"); + "% of their value.<br>" + maxSellingPrice + "</html>");
} }
@@ -365,6 +396,19 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
AllZone.getQuest().save(); AllZone.getQuest().save();
CSubmenuQuestDecks.SINGLETON_INSTANCE.update(); CSubmenuQuestDecks.SINGLETON_INSTANCE.update();
// undo Card Shop Specifics
VCardCatalog.SINGLETON_INSTANCE.getPnlAddButtons().remove(sellPercentageLabel);
VCardCatalog.SINGLETON_INSTANCE.getPnlAddButtons().add(VCardCatalog.SINGLETON_INSTANCE.getBtnAdd4());
VCurrentDeck.SINGLETON_INSTANCE.getPnlRemButtons().remove(creditsLabel);
VCurrentDeck.SINGLETON_INSTANCE.getPnlRemButtons().add(VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4());
VCardCatalog.SINGLETON_INSTANCE.getTabLabel().setText(CCTabLabel);
VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText(CDTabLabel);
VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setText(CCAddLabel);
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().setText(CDRemLabel);
return true; return true;
} }
} }

View File

@@ -302,6 +302,11 @@ public enum VCardCatalog implements IVDoc, ITableContainer {
return pnlStats; return pnlStats;
} }
/** @return {@link javax.swing.JPanel} */
public JPanel getPnlAddButtons() {
return pnlAddButtons;
}
//========== Other methods //========== Other methods
private JLabel buildLabel(final ImageIcon icon0) { private JLabel buildLabel(final ImageIcon icon0) {

View File

@@ -407,6 +407,11 @@ public enum VCurrentDeck implements IVDoc, ITableContainer {
return pnlStats; return pnlStats;
} }
/** @return {@link javax.swing.JPanel} */
public JPanel getPnlRemButtons() {
return pnlRemoveButtons;
}
//========== Other methods //========== Other methods
private JLabel buildLabel(final ImageIcon icon0) { private JLabel buildLabel(final ImageIcon icon0) {

View File

@@ -138,7 +138,6 @@ public class CardFaceSymbols {
return; return;
} }
final int genericManaCost = manaCost.getGenericCost(); final int genericManaCost = manaCost.getGenericCost();
final boolean hasGeneric = (genericManaCost > 0) || manaCost.isPureGeneric(); final boolean hasGeneric = (genericManaCost > 0) || manaCost.isPureGeneric();
final List<ManaCostShard> shards = manaCost.getShards(); final List<ManaCostShard> shards = manaCost.getShards();
@@ -234,7 +233,7 @@ public class CardFaceSymbols {
*/ */
public static int getWidth(final CardManaCost manaCost) { public static int getWidth(final CardManaCost manaCost) {
int width = manaCost.getShards().size(); int width = manaCost.getShards().size();
if ( manaCost.getGenericCost() > 0 || ( manaCost.getGenericCost() == 0 && width == 0 ) ); if (manaCost.getGenericCost() > 0 || (manaCost.getGenericCost() == 0 && width == 0));
width++; width++;
/* /*

View File

@@ -35,7 +35,6 @@ public class SaveOpenDialog extends JPanel {
private JFileChooser fc; private JFileChooser fc;
/** /**
* Enum to contain information for filetype filtering in the open/save dialog. * Enum to contain information for filetype filtering in the open/save dialog.
* Add more entries to enum as needed. * Add more entries to enum as needed.
@@ -56,13 +55,12 @@ public class SaveOpenDialog extends JPanel {
/** /**
* *
* constructor for a save or open dialog * constructor for a save or open dialog.
*/ */
public SaveOpenDialog() { public SaveOpenDialog() {
fc = new JFileChooser(); fc = new JFileChooser();
} }
/** /**
* Shows the open dialog for files. If no file selected, returns null. Pass null * Shows the open dialog for files. If no file selected, returns null. Pass null
* to Type to allow all files to be viewed/opened. * to Type to allow all files to be viewed/opened.
@@ -74,13 +72,12 @@ public class SaveOpenDialog extends JPanel {
public File OpenDialog(final File defFileName, final Filetypes type) { public File OpenDialog(final File defFileName, final Filetypes type) {
fc.setCurrentDirectory(defFileName); fc.setCurrentDirectory(defFileName);
if (type!=null) { if (type != null) {
fc.setAcceptAllFileFilterUsed(false); fc.setAcceptAllFileFilterUsed(false);
final FileFilter filter = new FileNameExtensionFilter(type.TypeName, type.TypeExtension); final FileFilter filter = new FileNameExtensionFilter(type.TypeName, type.TypeExtension);
fc.addChoosableFileFilter(filter); fc.addChoosableFileFilter(filter);
} }
int RetValue = fc.showOpenDialog(getParent()); int RetValue = fc.showOpenDialog(getParent());
if (RetValue == JFileChooser.APPROVE_OPTION) { if (RetValue == JFileChooser.APPROVE_OPTION) {
final File RetFile = fc.getSelectedFile(); final File RetFile = fc.getSelectedFile();
@@ -102,7 +99,7 @@ public class SaveOpenDialog extends JPanel {
fc.setCurrentDirectory(defFileName); fc.setCurrentDirectory(defFileName);
/* set the file filter if desired */ /* set the file filter if desired */
if (type!=null) { if (type != null) {
fc.setAcceptAllFileFilterUsed(false); fc.setAcceptAllFileFilterUsed(false);
final FileFilter filter = new FileNameExtensionFilter(type.TypeName, type.TypeExtension); final FileFilter filter = new FileNameExtensionFilter(type.TypeName, type.TypeExtension);
fc.addChoosableFileFilter(filter); fc.addChoosableFileFilter(filter);
@@ -115,11 +112,10 @@ public class SaveOpenDialog extends JPanel {
RetFile = fc.getSelectedFile(); RetFile = fc.getSelectedFile();
/* Adds extension if it is known and not given */ /* Adds extension if it is known and not given */
if (type!=null & !(RetFile.getAbsolutePath().endsWith(type.TypeExtension))) { if (type != null & !(RetFile.getAbsolutePath().endsWith(type.TypeExtension))) {
RetFile = new File(RetFile.getAbsolutePath()+"."+type.TypeExtension); RetFile = new File(RetFile.getAbsolutePath() + "." + type.TypeExtension);
} }
return RetFile; return RetFile;
} }

View File

@@ -406,7 +406,7 @@ public class CardPanel extends JPanel implements CardContainer {
(this.cardYOffset + this.cardHeight) - (this.cardHeight / 8) - 16); (this.cardYOffset + this.cardHeight) - (this.cardHeight / 8) - 16);
} }
if (this.getCard().isCreature() && this.getCard().hasSickness() && AllZoneUtil.isCardInPlay(this.getCard())) { if (this.getCard().isSick() && AllZoneUtil.isCardInPlay(this.getCard())) {
CardFaceSymbols.drawSymbol("summonsick", g, (this.cardXOffset + (this.cardWidth / 2)) - 16, CardFaceSymbols.drawSymbol("summonsick", g, (this.cardXOffset + (this.cardWidth / 2)) - 16,
(this.cardYOffset + this.cardHeight) - (this.cardHeight / 8) - 16); (this.cardYOffset + this.cardHeight) - (this.cardHeight / 8) - 16);
} }