怪盗王座ツールあれやこれや

怪盗・戦国用のツール群を提供しています。(フィルタ関係以外の)コメントは、内容にかかわらず、最新の記事にお願いします。

あれこれ実験室 - 戦国イベ精算(3:拡張書式)

2013-03-09 22:26:47 | 日記
 今回は、精算ツールに素晴らしい機能を … 全く追加していません。
 内部的に、一部機能を共通関数化した位です。
 今回の目玉は、設定ファイルの拡張書式です!!
 機能的な修正点としては、preload でロードしようとした js ファイルが存在しない場合に、停止していた(onload が呼ばれないため) のを、(エラーを表示してから) 継続するようにしました。

 売却3と売却4は必要なくなり削除しました。売却2も不要なのかも知れません。

[発端]
 あるパーツを追加するのに、設定ファイル中の preload とパーツ設定の2箇所を修正しなければならないというのは実用的ではない。せめて、『N~M行をアンコメントすれば良いよ』という具合になる必要がある。・・・ というのが発端です。
 そこで、まず preload の指定を複数の箇所で記述可能にする方法について考えました。
 次に、パーツの定義記述を省力化する方法について考えました。
 最後に、パーツの拡張書式を少し再拡張すれば、ブロックコメントが実現可能と気づいたのでそれを実装しました。
 これで、提供だ! と思って記事草稿を書いていたら、スクリプトパラメータのアイデアを思いついたので実装しました。URL ではなく param でも可能じゃんと思って拡張しました。いつになったら提供にこぎつけれるのだろうと思いつつ、insert_before のアイデアを思いついて実装し、拡張版も実装しました。
 これだけ書いたら、後々のために案内文章も必要と思って "使用方法_entry-ctrl.txt" を書きながら色々修正していたら、こんな時間になりました。

 パッケージには、たくさんのファイルが含まれていますが、拡張書式に対応するには、ファイル "entry-ctrl.js" を差し替えるだけです。・・・ のつもりでしたが、スクリプトパラメータの機能を使うには、新しい "common_func.js" が必要です。※ EntryPart の定義を "common_func.js" にしなければならない理由があったのですが、何でだったかな?
 『習うより慣れろ』という訳で、設定ファイルのサンプル "default_exp2e_conf.txt" を見てもらう方が早いと思います。

[拡張 preload 書式]
 従来の "preload" と書く代わりに、"preload__<順序><追加ワード>" と指定します。
例) "preload__110kuji":{"js":[{"file":"method_exec_exp7_sngkkuji.js" }]},

 <順序><追加ワード> は識別のための文字列であり、他と重複しなければ(文法上は) 何でも構いません。
 <順序><追加ワード> は、ロードを実行する順序に影響します。例では、<順序>に数字が記述されていますが、数値順に実行されるのではなく辞書順に実行される事に注意してください。即ち、
  "preload_4hoge" ...
  "preload_8hoge" ...
  "preload_10hoge" ...
とあった場合、"preload_10hoge" が最初に処理されます。解りますか?

 既定のプリロード指定を上書きまたは修正できるのは、<追加ワード> 無しの "preload" 指定だけだという事に注意してください。例では、既定の js ファイルの読み込みを全て無効にしています。

[拡張パーツ書式(1:基本動作)]
 書式は "[<順序>]part=[<パーツ名>]" です。
 <順序> は数字列でなければなりません。
例)
  "310part=sngkkoban1": { // 戦国/小判ガチャ1
    "preload":{"js":[{"file":"method_exec_exp7_sngkkoban1.js" }]},
	// ↑ "preload__310sngkkoban1" に展開される
    "param":{ // ← "sngkkoban1":{"param":{...}} に置換される
	//	---  動作  ---
	"to_empty_1st": true,		// 先頭BOX空で終了
	"to_empty_coef": false,		// 特効BOX空で終了
	"coef1_ignore": true,		// 通常BOXを無視
	//	---  デバッグ  ---
	"debug_gacha_once": false,	// ガチャ1回で復帰
    },
    "gacha_id": { "value_default": 41 },	// ガチャID
    // ↑ "sngkkoban1_gacha_id" に置換される
  },


 拡張パーツ書式は、実行時の動作を制御するのではなく、実行前に記述を書き換えるいわゆるプリプロセッサとして機能します。
 基本的には、記述内容のキー名の前に <パーツ名>+"_" を付加したものに置き換えます。

 キー名 "preload" と "param" は特別な置換が行われます。
 "preload" は前述の「拡張 preload 書式」に置換されます。
 "param" は "<パーツ名>":{"param": ...} に置換されます。
 "preload" を記述する場合、<順序> が読み込み順序に影響する事に注意してください。定義順に読み込まれるのではありません。

 書式の置換は、トップレベルキーの辞書順に行われます。(桁数が同じなら) <順序> 順に行われるという事です。

 書式の置換は、トップレベルキーに対してだけ行われます。ただし、置換の結果、トップレベルに移ったキーが書式に適合すれば、再置換が行われます。即ち、入れ子にする事ができます。

 置換の際、置換先に同名のキーが存在した場合、マージするのではなく単純に上書きします。この動作は将来変更するかも知れません。

[拡張パーツ書式(2:パーツ名の省略)]
 拡張パーツ書式でパーツ名を空にした場合、キー名を置換する際に <パーツ名>+"_" を前置しないで、そのまま置換(トップレベルに移動)されます。
 この場合、"preload" や "param" も特別扱いされません。
 この性質は、無意味なように見えますが、後述のプロックコメントとして活用できます。

[ブロックコメント]
 拡張パーツ書式で、<順序> の前に適当な英字等を入れる事で、拡張パーツ書式とみなされなく(置換が行われなく) なります。この性質は、ブロックコメントとして利用可能です。
 パーツ名を指定し "preload" を含んだ書式の場合、そのパーツ自体の取り込みを無効にする事ができます。
 パーツ名を省略した書式の場合、純粋なブロックコメントとして機能します。

[スクリプトパラメータ]
 パーツとして実装されているスクリプトの場合、スクリプトパラメータを指定して、その挙動を変更する事ができます。
 パラメーターの指定は、スクリプトファイルの URL パラメーターで指定(例1) するか、スクリプトオブジェクトの "param" パラメーターで指定(例2) します。
 指定されたパラメーターは pert オブジェクトに直接設定されます。スクリプトパラメーターは、EntryPart のコンストラクタに渡されたパラメーターより優先されます。
 パラメーター "id" でパーツIDを変更できます。
 パラメーター "insert_before" または "insert_after" で、部品の配置を変更する事ができます。
例1)
{"file":"method_exec_exp7_sngksale2.js?id=sngksale3&title=カード売却3" },
例2)
{"file":"method_exec_exp7_sngksale2.js",
"param":{ "id":"sngksale4", "title":"カード売却4",
"deep_2nd_show":true, "insert_before":"sngkkgacha_koban_top" }}
例3)
{"file":"method_exec_exp7_sngksale2.js",
"param":{ "id":"sngksale4", "title":"カード売却4",
"deep_2nd_show":true,
"insert_before":{
"dst_name":"sngkkgacha_koban_top",
"from":"sngksale4_user_conf_2",
"to":"sngksale4_condition"} }}

 これによって、1つのパーツを同じ画面に複数回ロードさせる事ができるようになりました。
 ちなみに、スクリプトの URL は window.script_location で、パラメーターは window.script_param_hash で参照できます。これらは、スクリプトのロード時にしか参照できないので注意してください。
 例2は、書き方が面倒ですが、キャッシュも効くし文字化けの心配もありません。ハッシュや配列を渡す事もできます。
 例1と例2の書式を混在させる事もできます。名前が重複する場合、例2の指定が優先されます。

 パラメーター "insert_before" または "insert_after" を指定する場合、値として移動先の名前を指定します。移動元は、パーツID+"_top" ~ パーツID+"_end" となります。移動の際のパーツIDは、スクリプトパラメータ "id" が指定されていればその値を、そうでなければ、スクリプトファイル名の最後のワードから取得します。
 別の方法として、パラメーター "insert_before" または "insert_after" の値としてハッシュを指定し、キー "dst_name" (省略名 "dst")、"from" (省略名 "fr")、"to" で、それぞれ移動先と、移動元(から,まで) を指定できます(例3)。
 移動は、そのスクリプトがロードされた直後に(onload の中で) 行われます。移動先が存在しないとエラーになるので、ロード順には注意してください。

以下から、どうぞ。
  akrekore-exp2e_sngkpayoff3.zip
  最新(過ぎる) ファイル
  怪盗王座ツールあれやこれや (案内ページ)

[余談1:FFBクエスト]
 パラメーター「■無幻獣のみ」を追加しました。クエスト前に、幻獣が未出現で、かつ、集計中でない事を確認します。誰かが幻獣を出しちゃっている場合に無駄に LP を消費しなくて済みます。チェックすると 1 Web要求を余分に消費します。
 done_url をログ出力するようにしました(結果が取得可能な場合)、ログに表示されたリンクをクリックする事で、(別タブで) 処理の継続(結果の表示) ができます。
 結果が取得不能な場合の turn 値がメッセージ数になるのか+1になるのかが未検証です。※ そもそも URL パラメーターの何が重要なのかが未検証です。