Choose one card - aharalabMeiji/fireplaceAharaLab GitHub Wiki

概要

Choose oneカードはドルイド属性に限定されたカードであり、だいたいは

   メインのカード(例:CORE_EX1_164)と選択カード(例:EX1_164a, EX1_164b)

から構成される。ほとんどの場合はこの3枚のカードはスペルカードである。

  1. メインのカードをハンドからプレイすると、EX1_164a, EX1_164bの2択をユーザーにさせる。
  2. たとえばEX1_164aを選ぶと、スペルとしてEX1_164aカードを実行する。
  3. ただし、「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で一文追加しておいた。