Choose one card - aharalabMeiji/fireplaceAharaLab GitHub Wiki
概要
Choose oneカードはドルイド属性に限定されたカードであり、だいたいは
メインのカード(例:CORE_EX1_164)と選択カード(例:EX1_164a, EX1_164b)
から構成される。ほとんどの場合はこの3枚のカードはスペルカードである。
- メインのカードをハンドからプレイすると、EX1_164a, EX1_164bの2択をユーザーにさせる。
- たとえばEX1_164aを選ぶと、スペルとしてEX1_164aカードを実行する。
- ただし、「Feral Rage(CORE_OG_047)」を場に出している間は「choose oneカードは両方実行される」という状態になっている。
Playクラスでハンドからプレイされると、Play.doが実行されるが、ユーザが選んだ選択カードはchooseパラメータに格納されている。通常カードの場合にはchooseパラメータはNoneである。Play.doメソッド内で、これらの使い分けは行われている。
問題点
普通はこの枠組みで全く問題はないが、「爪のドルイドCORE_EX1_165」
Druid of the Claw
[Choose One -] Transform into a 5/4 with [Rush];or a 5/6 with [Taunt].
である。このカードに限り、メインのカードも選択カードはミニオンカードであり、また5/4rushカードや5/6tauntカードにはEX1_165t1,EX1_165t2が充てられている。
class EX1_165a:##minion
play = Morph(SELF, "EX1_165t1")
class EX1_165b:##minion
play = Morph(SELF, "EX1_165t2")
としてあるので、Play.doメソッド内で、「Ex1_165aのbattlecryが実行→EX1_165aがEX1_165t1へとmorphする」という作業が行われる。メインカードがスペルの場合にはこれで何ら問題ないが、CORE_EX1_165がミニオンであり、フィールドに出されてしまったまま残っている現状が観察される。このことは動作として不正であるので、Play.doを解析して適切な動作へと改める必要がある。
解決編
結局、Morph内の処理に問題があるということが分かった。Morph.doでは、targetをcardにMorphするのであるが、処理後にtarget.zone=Zone.SETASIDEとしている。(理由はよくわからないが、Morphしたものを再復活する可能性を見ているものと思われる。)しかし、現状ではZone.PLAY->Zone.SETASIDEではcontroller.fieldからの除去は行われない(ここの理由もはっきりとはわかっていない。)ので、Morphで一文追加しておいた。