ここでは実例を使って独自の特殊項目を作る方法について説明します。
まずは設定を参照して拡張スクリプトを使用するように設定します。 設定したスクリプトファイルにプログラムを書いていきます。
まずは最初に「カラム名」を表示する項目を作ります。
まずは SpecialEntry を継承したクラスを作ります。名前は ColumnNameEntry とします。
class ColumnNameEntry extends SpecialEntry { }
コンストラクタを作り基底クラスに引数を指定します。 並び替えた時に、土地より上に表示するために土地カードタイプより少ない値をカートタイプとします。 またボードはメインボード固定でいいでしょう。
class ColumnNameEntry extends SpecialEntry { constructor() { base.constructor( Card.Type.Land - 100, "Column Name", "カラム名", Board.Type.Mainboard ); } }
次に、セルの内容の処理になります。 通常は Processor の方(例えばデッキのカードの枚数等)の処理でセルの内容が決まりますが、 ColumnNameEntry は通常の Processor にとっては未知の Entry になりますので、 処理が出来ずこちらの ColumnNameEntry に処理が移ります。 その際に呼ばれる関数は case_of_cannot_process 関数になるのでその関数を実装します。
class ColumnNameEntry extends SpecialEntry { constructor() { base.constructor( Card.Type.Land - 100, "Column Name", "カラム名", Board.Type.Mainboard ); } function case_of_cannot_process( processor ) { return processor.name; } }
クラスが完成しましたので、次に Orgnizer にこのインスタンスを登録します。 Organizer の special_entries は配列なのでそこに append します。
class ColumnNameEntry extends SpecialEntry { constructor() { base.constructor( Card.Type.Land - 100, "Column Name", "カラム名", Board.Type.Mainboard ); } function case_of_cannot_process( processor ) { return processor.name; } } ::Organizer.special_entries.append( ColumnNameEntry() );
これで Sylvan Analyzer を起動すると、特殊項目にカラム名が追加されているはずです。
次に独自の特殊項目として「点数でみたマナコストが X と等しいカードの合計枚数」という項目を作ります。
Sylvan Analyzer ではデッキ中に「ある条件を満たすカード」が合計何枚なのかの 項目を作る際に便利なクラスが用意されています。 そのクラスである CardCountTotalEntry クラスを継承します。
class TotalOfConvertedManaCostIsXEntry extends CardCountTotalEntry { }
コンストラクタでそのマナコストを指定出来るようにします。 引数で指定したマナコストはプロパティで保持しておくようにします。 また、ボードタイプも指定できるようにします。 表示する位置は全合計の後にします。
class TotalOfConvertedManaCostIsXEntry extends CardCountTotalEntry { constructor( cmc, board_type ) { local name = "CMC = " + cmc + " Total"; local name_jp = "CMC = " + cmc + " 合計"; base.constructor( Card.Type.MainTotal + 100, name, name, board_type ); this.cmc = cmc; } cmc = null; }
次に、「各カードの枚数を数えるのかどうか」を判定する関数を実装します。 should_count 関数では card を引数に呼び出されますので、 そのカードを集計する場合は true 、そうでない場合は false を返すようにします。
class TotalOfConvertedManaCostIsXEntry extends CardCountTotalEntry { constructor( cmc, board_type ) { local name = "CMC = " + cmc + " Total"; local name_jp = "CMC = " + cmc + " 合計"; base.constructor( Card.Type.MainTotal + 100, name, name_jp, board_type ); this.cmc = cmc; } function should_count( card ) { return card.converted_mana_cost == this.cmc; } cmc = null; }
クラスが完成しましたので、次に Orgnizer にこのインスタンスを登録します。 今回は複数追加してみます。
class TotalOfConvertedManaCostIsXEntry extends CardCountTotalEntry { // 省略 } ::Organizer.special_entries.append( TotalOfConvertedManaCostIsXEntry( 1, Board.Type.Mainboard ) ); ::Organizer.special_entries.append( TotalOfConvertedManaCostIsXEntry( 2, Board.Type.Mainboard ) ); ::Organizer.special_entries.append( TotalOfConvertedManaCostIsXEntry( 1, Board.Type.Sideboard ) );
これで Sylvan Analyzer を起動すると、特殊項目に 2 項目が追加されているはずです。 また、この項目はデッキのカラムだけではなく合計や平均のカラムでも有効になるようになっています。
細かい解説は省略して要点の説明とソースコードだけ表示します。
この場合、ボード中の値を集計した値を出力する為のクラスである TotalEntry クラスを使います。 count_total 関数はボード毎に計算して値を返す関数として実装します。 この場合、ボードの各カードの CMC を求め、それに枚数を掛けた値の 合計を返すようにしています。
class ConvertedManaCostTotalEntry extends TotalEntry { constructor( board_type ) { base.constructor( Card.Type.MainTotal + 200, "CMC Total", "CMC 合計", board_type ); } // 引数( Board のインスタンス ) 戻り値 integer の関数 function count_total( board ) { local sum = 0; foreach ( card_name, count in board.table ) { sum += ::Organizer.card_database.fetch( card_name ).converted_mana_cost * count; } return sum; } } ::Organizer.special_entries.append( ConvertedManaCostTotalEntry( Board.Type.Mainboard ) );
これで Sylvan Analyzer を起動すると、特殊項目に CMC 合計が追加されているはずです。 また、この項目もデッキのカラムだけではなく合計や平均のカラムでも有効になるようになっています。
これらのコードは同梱してある tutorial.nut にあります。