It is currently 16 Sep 2025, 23:45
   
Text Size

Bug Reports (snapshot builds)

Post MTG Forge Related Programming Questions Here

Moderators: timmermac, Blacksmith, KrazyTheFox, Agetian, friarsol, CCGHQ Admins

Re: Bug Reports (snapshot builds)

Postby myk » 10 Mar 2013, 04:42

NetBeans actually has an excellent integrated profiler. You can check out the info for it here. Run Forge through it, and it will give you a nice breakdown on how much time the program spends in each function.
myk
 
Posts: 439
Joined: 17 Jan 2013, 02:39
Location: California
Has thanked: 38 times
Been thanked: 57 times

Re: Bug Reports (snapshot builds)

Postby Agetian » 10 Mar 2013, 05:53

Oh, thanks, myk! :)
OK, here's the breakdown of the information provided by the profiler, I'm including a picture snapshot of the "heaviest" function calls shown. I also have a (huge) html output from it featuring all the calls made, please let me know if I also need to post that.

Profile-Forge-r20215.png


- Agetian
Agetian
Programmer
 
Posts: 3489
Joined: 14 Mar 2011, 05:58
Has thanked: 684 times
Been thanked: 572 times

Re: Bug Reports (snapshot builds)

Postby swordshine » 10 Mar 2013, 08:52

Agetian wrote:EDIT: r20215: As a temporary measure, I applied the change per the original Max's suggestion (added ButtonUtil.disableAll() to the update part of InputProxy - seems to do the job and not have any side-effects). Didn't do anything with the performance aspect of changes yet. Feel free to expand on it and modify in any way that you think may be beneficial.
Flash is still not functional.
swordshine
 
Posts: 682
Joined: 11 Jul 2010, 02:37
Has thanked: 116 times
Been thanked: 87 times

Re: Bug Reports (snapshot builds)

Postby myk » 10 Mar 2013, 09:05

@Agetian: try restricting the monitored namespace to forge.* and ignoring sleeps -- that will coalesce the timing for calls we make to library functions into the functions that call them and will make it a little clearer which of /our/ functions is the time sink.
myk
 
Posts: 439
Joined: 17 Jan 2013, 02:39
Location: California
Has thanked: 38 times
Been thanked: 57 times

Re: Bug Reports (snapshot builds)

Postby RumbleBBU » 10 Mar 2013, 09:31

A different one:

AI casts Man-o'-War, the game goes into an infinite loop and crashes:
(slightly snipped redundancy in the following or it wouldn't post)

StackOverflowError | Open
Code: Select all
Forge Version:    SVN
Operating System: Windows XP 5.1 x86
Java Version:     1.6.0_21 Sun Microsystems Inc.

java.lang.StackOverflowError
   at java.util.regex.Pattern.sequence(Unknown Source)
   at java.util.regex.Pattern.expr(Unknown Source)
   at java.util.regex.Pattern.compile(Unknown Source)
   at java.util.regex.Pattern.<init>(Unknown Source)
   at java.util.regex.Pattern.compile(Unknown Source)
   at java.lang.String.split(Unknown Source)
   at java.lang.String.split(Unknown Source)
   at forge.util.FileSection.parseToMap(FileSection.java:69)
   at forge.card.ability.AbilityFactory.getMapParams(AbilityFactory.java:316)
   at forge.card.ability.AbilityFactory.getAbility(AbilityFactory.java:67)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:464)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
   at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
   at com.google.common.collect.Lists.newArrayList(Lists.java:144)
   at com.google.common.collect.Lists.newArrayList(Lists.java:125)
   at forge.CardLists.filter(CardLists.java:251)
   at forge.card.ability.ai.ChangeZoneAi.isPreferredTarget(ChangeZoneAi.java:749)
   at forge.card.ability.ai.ChangeZoneAi.knownOriginTriggerAI(ChangeZoneAi.java:1041)
   at forge.card.ability.ai.ChangeZoneAi.doTriggerAINoCost(ChangeZoneAi.java:127)
   at forge.card.ability.SpellAbilityAi.doTriggerNoCostWithSubs(SpellAbilityAi.java:35)
   at forge.card.ability.SpellAbilityAi.doTriggerAI(SpellAbilityAi.java:30)
   at forge.card.spellability.AbilitySub.doTrigger(AbilitySub.java:133)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:487)
   at forge.card.spellability.SpellPermanent.checkETBEffects(SpellPermanent.java:395)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:758)
   at forge.card.ability.ai.ChangeZoneAi$3.apply(ChangeZoneAi.java:1)
   at com.google.common.collect.Iterators$8.computeNext(Iterators.java:736)
   at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
Used to work before.
User avatar
RumbleBBU
 
Posts: 394
Joined: 18 Aug 2012, 04:24
Has thanked: 29 times
Been thanked: 66 times

Re: Bug Reports (snapshot builds)

Postby Agetian » 10 Mar 2013, 10:52

I tried including only forge.* in the profile run but for some reason it still shows some standard Java method calls... not sure how to make it ignore sleeps for now, I tried switching over to advanced mode and selecting "Exclude time spent in Thread.sleep" but that made the profiler fail to register any calls at all, not sure why... here's the second run.

Profile-Forge-r20215-v2.png


- Agetian
Agetian
Programmer
 
Posts: 3489
Joined: 14 Mar 2011, 05:58
Has thanked: 684 times
Been thanked: 572 times

Re: Bug Reports (snapshot builds)

Postby Agetian » 10 Mar 2013, 10:59

swordshine wrote:
Agetian wrote:EDIT: r20215: As a temporary measure, I applied the change per the original Max's suggestion (added ButtonUtil.disableAll() to the update part of InputProxy - seems to do the job and not have any side-effects). Didn't do anything with the performance aspect of changes yet. Feel free to expand on it and modify in any way that you think may be beneficial.
Flash is still not functional.
I guess it is a different bug with Flash, but I can confirm that I have issues with Flash as well. Please assist if possible, no idea how to fix this one. ;)

- Agetian
Agetian
Programmer
 
Posts: 3489
Joined: 14 Mar 2011, 05:58
Has thanked: 684 times
Been thanked: 572 times

Re: Bug Reports (snapshot builds)

Postby 7543021 » 10 Mar 2013, 11:22

I got a problem on totem armor.In this case,the Abbey Griffin is enchanted by Snake Umbra and Bear Umbra and i cast Dismember on it to make its toughness become 0.Then it pops up a selection window to let me chose which aura to be destroyed instead and it's a loop.when i cancel the window there will be a crash like this



NullPointerException | Open
Code: Select all
Forge Version:    1.3.10-SNAPSHOT-r20203
Operating System: Windows 7 6.1 x86
Java Version:     1.7.0_01 Oracle Corporation

java.lang.NullPointerException
   at forge.card.spellability.SpellAbility.setStackDescription(SpellAbility.java:941)
   at forge.game.GameAction.destroyNoRegeneration(GameAction.java:1278)
   at forge.game.GameAction.destroy(GameAction.java:1226)
   at forge.game.GameAction.checkStateEffects(GameAction.java:1057)
   at forge.game.zone.MagicStack.finishResolving(MagicStack.java:985)
   at forge.card.ability.AbilityUtils.resolveSubAbilities(AbilityUtils.java:1017)
   at forge.card.ability.AbilityUtils.resolveApiAbility(AbilityUtils.java:1211)
   at forge.card.ability.AbilityUtils.resolve(AbilityUtils.java:1008)
   at forge.game.zone.MagicStack.resolveStack(MagicStack.java:841)
   at forge.game.phase.PhaseHandler.passPriority(PhaseHandler.java:735)
   at forge.game.player.PlayerController.passPriority(PlayerController.java:70)
   at forge.game.ai.AiInputCommon.showMessage(AiInputCommon.java:110)
   at forge.gui.InputProxy.setInput(InputProxy.java:58)
   at forge.control.input.InputControl.setNewInput(InputControl.java:256)
   at forge.game.GameInputUpdatesThread.run(GameInputUpdatesThread.java:29)
Attachments
无标题.png
7543021
 
Posts: 14
Joined: 16 Feb 2013, 08:54
Has thanked: 0 time
Been thanked: 0 time

Re: Bug Reports (snapshot builds)

Postby myk » 10 Mar 2013, 12:04

Agetian wrote:EDIT: r20215: As a temporary measure, I applied the change per the original Max's suggestion (added ButtonUtil.disableAll() to the update part of InputProxy - seems to do the job and not have any side-effects).
I attempted to play a Druidic Satchel and AI countered with Miscalculation. The buttons were disabled and I was unable to continue. Interestingly enough, when I went to the lot panel and then back to the stack, Miscalculation had disappeared from the stack, though the UI was still stuck.
Screen Shot 2013-03-10 at 5.04.06 am.png
myk
 
Posts: 439
Joined: 17 Jan 2013, 02:39
Location: California
Has thanked: 38 times
Been thanked: 57 times

Re: Bug Reports (snapshot builds)

Postby Agetian » 10 Mar 2013, 12:11

@ myk: I guess that means that there should either be some enabling functions placed in the code or at least the ButtonUtil.disable call should be moved elsewhere :\ Can you try tweaking it to see if there's a better place for it? (I recall you had an idea about it but I wouldn't dare trying to implement it 'cause I'm afraid I don't quite understand where exactly everything needs to be placed).

- Agetian
Agetian
Programmer
 
Posts: 3489
Joined: 14 Mar 2011, 05:58
Has thanked: 684 times
Been thanked: 572 times

Re: Bug Reports (snapshot builds)

Postby myk » 10 Mar 2013, 13:24

@Agetian: could you try reverting to r19990 and testing to see if you have any issues? I just did some revision bisection to find where the performance problems began, and it looks like r19991 is where they were first introduced. I brought up the issue in the threaded input thread.
myk
 
Posts: 439
Joined: 17 Jan 2013, 02:39
Location: California
Has thanked: 38 times
Been thanked: 57 times

Re: Bug Reports (snapshot builds)

Postby Max mtg » 10 Mar 2013, 13:37

@myk, @Agetian, r20215 is fine

The problematic place is forge.game.GameActionUtil.payManaDuringAbilityResolve(String, ManaCost, Command, Command) for now. All interactive 'unless' costs cannot be paid (including Flash, chain lightning) - because

game wanted to get input from stack, called game.getStack().setResolving(false) for that, then sets new input then restores the old value. If it were syncronous, would work fine, but since the input is acquired from other thread at a different time, null was returned.

Will have to do something about that isResolving check in getActualInput
Single class for single responsibility.
Max mtg
Programmer
 
Posts: 1997
Joined: 02 Jul 2011, 14:26
Has thanked: 173 times
Been thanked: 334 times

Re: Bug Reports (snapshot builds)

Postby Agetian » 10 Mar 2013, 14:00

@ myk: I think you're right, r19990 does not give me the hard time that the latest revisions do (as far as lag goes). Also, the "empty dialog windows hanging randomly on Java 7" issue goes away in r19990.

- Agetian
Agetian
Programmer
 
Posts: 3489
Joined: 14 Mar 2011, 05:58
Has thanked: 684 times
Been thanked: 572 times

Re: Bug Reports (snapshot builds)

Postby Max mtg » 10 Mar 2013, 14:47

Are the aforementioned problems gone with r20224 ?
Single class for single responsibility.
Max mtg
Programmer
 
Posts: 1997
Joined: 02 Jul 2011, 14:26
Has thanked: 173 times
Been thanked: 334 times

Re: Bug Reports (snapshot builds)

Postby Agetian » 10 Mar 2013, 15:00

Max mtg wrote:Are the aforementioned problems gone with r20224 ?
Yesh the issues are indeed gone! :-) :-) Hello, smooth gameplay and non-hanging dialog windows! :-)

- Agetian
Agetian
Programmer
 
Posts: 3489
Joined: 14 Mar 2011, 05:58
Has thanked: 684 times
Been thanked: 572 times

PreviousNext

Return to Developer's Corner

Who is online

Users browsing this forum: No registered users and 50 guests

Main Menu

User Menu

Our Partners


Who is online

In total there are 50 users online :: 0 registered, 0 hidden and 50 guests (based on users active over the past 10 minutes)
Most users ever online was 7967 on 09 Sep 2025, 23:08

Users browsing this forum: No registered users and 50 guests

Login Form