追加案:全CWXスクリプトの書き出し

Issue #121 resolved
req created an issue

状態変数マクロ #120 のところで、長月さんにご指摘受けていて、自分が更に先に実現していたほうがいいと思ったことがあります。

それが、全CWXスクリプトの書き出しです。

CWXスクリプトはイベントビューを開いて貼り付ければ反映できます。

ということは、大仰にマクロを組むより先に、全CWXスクリプト書き出しを実現したほうが、スマホなどのテキストエディタでシナリオを作るという夢の実現と、シナリオ作者の為になると思われます。そこで、

このコメント のマクロ例を修正したので見てください。

これは後に想定している area , battle , package マクロと その中に入れ子になっている イベントビュー操作マクロ script の例ですが、この script の第1引数が、area|battle|package の時には、後にはイベントビューをそのエリア・バトル・パッケージ指定で操作するようにするとして、その書き出しだけ先に実装しようというのがこの案です。

script area,1,"到着"
CWXスクリプト・・・
script end
script area,1,"到着"
CWXスクリプト・・・
script end
script area,1,"[攻撃]"
CWXスクリプト・・・
script end
script area,1,"[治療]"
CWXスクリプト・・・
script end
・・・
script area,2,"到着"
CWXスクリプト・・・
script end
・・・
script battle,1,"戦闘"
CWXスクリプト・・・
script end
・・・
script battle,2,"[攻撃]"
CWXスクリプト・・・
script end
script battle,2,"毎ラウンド"
CWXスクリプト・・・
script end
・・・
script package,"パッケージイベント"
CWXスクリプト・・・
script end
・・・

といった感じで、テーブルビューの右クリックのメニューに 全CWXスクリプト書き出し か何かを追加し、それが押されたらクリップボードに上記のようにCWXスクリプトを全出力するというのが案です。

Comments (11)

  1. k4nagatsuki repo owner

    エリアにはメニューカードがあり、バトルにはエネミーカードがあります。特殊技能などのカードには使用時イベントがあります。また、貼り付けてエリア全体のイベントを作れるのであれば、メニューカードや背景のパラメータを書けなければ大変ややこしい事になりますし、使用時イベントはカード効果と切り離せなかったりします。キャストカードは使用時イベントを持つカードを所持しますから、それも表現できる必要があります。

    ですから、イベントより上のレベルをCWXスクリプトで表現するという事は、CWシナリオのほとんどの部分を表現するに等しいです。残るのは概略・状態変数・情報カードくらいでしょうか。そこまで来ればシナリオ全体をテキストで表現する新しい形式を作成する事になるかと思います。

    CWXスクリプトの文法は、ほとんどがイベントのプロセスの記述のために設計されています。データを記述するために用意した文法は複合パラメータくらいですが、あれは大きなデータを表現するには向いていない上拡張性も無い記法なので、データを表現する新しい文法を考えた方がいいでしょう。

    全体としては、データを表現する記法の中に、イベントを表現するCWXスクリプトが含まれる、という形になるかと思います。

  2. req reporter

    マクロについては、上で見てもわかってもらえるかと思いますが、慣れていて尊敬しているCWXスクリプトの文法に近い感じで書けたほうが、ユーザーが使いやすいと思っています。

    ですが、カンマはスペース・全角スペース・Tab・改行などと同様、キーワード・命令を見つけるまで読み飛ばし、step "a" "b" のようにも書けるようにするとか、キーワード add mod delとかも設定し、 step add "a"とかこういう書き方も出来ないか(ということは同じ引数が文字列やキーワードに変わったりする場合や、可変引数になったりする場合がある)とか、そういうことを今模索して考えていて、CWXスクリプト リファレンスマニュアルを真似て html を作ってみようかなと思っているところです。

    エリアにはメニューカードがあり、バトルにはエネミーカードがあります。特殊技能などのカードには使用時イベントがあります。

    おおうまだ失念していました。ご指摘ありがとうございます。ですが、それを加えて考慮に入れればいいだけです。メニューカードのクリックイベント、キーコードイベント、エネミーカードの死亡時イベント、キーコードイベントとスキル・アイテム・召喚獣の使用時イベントも出力できるように修正します。

    CWXスクリプトにイベントより上のレベルの記述をさせようなどとはもう思っていません。それはマクロの仕事です。

  3. k4nagatsuki repo owner

    CWXスクリプトにイベントより上のレベルの記述をさせようなどとはもう思っていません。それはマクロの仕事です。

    すいません、私がマクロについて書いた事が上手く伝わっていなさそうな気がしてきたので、念のために別の書き方で書きます。

    マクロは、アプリケーションに任意の仕事をさせるために、アプリケーションへの命令を書くものです。例えばcwxeditorに「こういう名前の状態変数を作れ」「この状態変数の名前を変更しろ」と命令するプログラムを書き、その操作を実行させる、という仕組をマクロと呼びます。

    前のIssueの文章を読むと状態変数名の変更などの操作を自動的に行いたいようでしたので、「それはマクロではないか」と私は言ったのです。

    そのマクロで出せる命令として、「ここのエリアのこのカードにこういうイベントを作れ。イベントの内容はこのCWXスクリプトだ」というものがあれば、必然的に1つのマクロで状態変数の操作とCWXスクリプトの貼り付けが同時に行える事にもなります。


    もう一度このIssueを読み直してみたのですが、やりたい事は「一連のイベントを生成するマクロを作る」「そのマクロを自動生成する機能を作る」という事のように思えます。

    そうなると、cwxeditor用マクロ言語を開発する事になります。

    という事でよろしいでしょうか。

    そういう事であれば、全データを表現できるようにする必要があるという話は私の誤解に基づくものだった事になりますので、撤回したいと思います。


    CWXスクリプトと似た文法にした方がよさそうというのは、私もそう思います。ただ、マクロとCWXスクリプトは役割として別物なので、こんがらがらないかという点だけがちょっと心配です。たぶん書き始めたらすぐ慣れるという気もしますが。

    step add ...のように、対象のタイプと命令を組み合わせるやり方はうまいと思います。作成する時はaddよりcreateの方がやる事が明確になっていいかもしれません。その流れでいくと、改名はstep rename ...step alter ...のようになりそうな感じです。

  4. req reporter

    自分の意図が大分長月さんに伝わってきたようで嬉しいです。説明下手で申し訳ないです。

    script マクロというより event マクロにしたほうが意味が伝わる気がしてきました。

    「ここのエリアのこのカードにこういうイベントを作れ。イベントの内容はこのCWXスクリプトだ」 イベントを生成するマクロを作る

    そうですね、そういうマクロを最終的には作りたいのですが、自分がここでやりたいことは、とりあえずそのマクロの仕様を決めてしまって、#120 の状態変数マクロのときに、状態変数ビューで現在の状態変数全てをマクロで全書き出し というのがあったと思うのですが、

    それと同じように、今開いている シナリオの現在のイベント全書き出し をイベントマクロとその中にCWXスクリプトを記述することで行うということです。これを先にやっておけば、イベントを編集するマクロの実装が手間取ってかなり後になったとしても、シナリオ作者は全書き出ししたもののうち必要な部分のCWXスクリプトだけをつかうことが出来ます。

  5. req reporter

    ただ気になっているのは、書き出す方はあるだけ書き出せば良さそうなのですが、編集とかしたいときにエリアに2個以上到着イベントがあるとかそういう場合に指定できるのかという問題があります。

  6. k4nagatsuki repo owner

    マクロは小さな操作を行えるようにしておき、それを組み合わせて大きな結果を出せるような設計にした方がいいと思います。そうする事で、様々な操作に応用する事ができるようになります。

    例えば「シナリオの現在のイベントの全書き出し」には、

    • 全てのエリアを列挙する
    • 全てのカードを列挙する
    • エリアやカードに属するイベントを列挙する
    • 任意のエリアを選択する
    • 任意のカードを選択する
    • 任意のイベントツリーを選択する
    • イベントツリーを文字列(CWXスクリプト)化する
    • 任意の文字列をテキストファイル(やクリップボード)へ書き出す
    • ……

    といった機能が一揃いあればいいはずです。得られた結果を書き戻す際には、テキストファイル等から文字列を読み出す機能や、任意の文字列をCWXスクリプトとしてイベントツリーに貼り付けるような機能が必要です。

    このあたりの設計は、すでにマクロ機能を持つアプリケーションが参考になると思います。

  7. req reporter

    なるほど、そういえば ティラノビルダー(ティラノスクリプトのノベルゲーム作成ツール)もマクロを別マクロで定義したり、ユーザーに公開しないマクロは_が先頭に付いたマクロがあったりしてました。

    なんか先に状態変数で慣れたほうがいいような気がしてきました。

    もっとd言語読めるようになって、エディタの内部動作知らないとダメですね。

    ・イベントツリーを文字列(CWXスクリプト)化する ・任意の文字列をクリップボードへ書き出す

    この辺は良くわかりませんが、cwx\script.d でやってるんじゃないですか?って他の機能もそうですね。

    まだそれらのメソッドは public になってなくて、外から実行出来ないかもしれませんね。

    cwx/macro.d か何か追加してみたほうがいいのでしょうか?

    あと、自分は結局 IDE は入れずに、(暗黒騎士さんもおすすめしてた)サクラエディタを使っているのですが、d言語はTabインデントで、ブロック文が{}で書けるからいいんですけど、pythonってスペース4文字インデントでブロック文表わしますよね?そこら辺って切替できないものなんですかね?

  8. k4nagatsuki repo owner

    この辺は良くわかりませんが、cwx\script.d でやってるんじゃないですか?って他の機能もそうですね。

    ユーザがメニューやキーボードショートカットを通じてcwxeditorを操作すると、それらの処理を実行できます。マクロをつけた場合、実行の大元がメニューの操作などではなくマクロに書かれた命令になるという事です。

    処理の実装はすでに存在しています。マクロは、その処理を自動的に実行させる手段です。

    cwx/macro.d か何か追加してみたほうがいいのでしょうか?

    macroはD言語の隠し予約語だったような……将来構文木マクロを追加するための布石だったと思うんですが、何年経っても追加される気配がありません。

    それはさておき、実装を始める前に、文法や各マクロ命令のパラメータなど、仕様をしっかり考えておいた方がいいです。マクロの実装は、エディタそのものを実装するのと同じくらい大きな仕事です。焦らずにじっくり練っていきましょう。

    pythonってスペース4文字インデントでブロック文表わしますよね?そこら辺って切替できないものなんですかね?

    見た感じ、なさそうですね。「その他のインデント対象文字」がそうかと思いましたが、これは指定した文字をスペースやタブ文字などの扱いにするというもののようです。

  9. req reporter

    サクラエディタの設定ータイプ別設定一覧にもPythonというのはないですしね!ということはタイプ別設定一覧にPythonを誰かが追加してくれれば・・・・

    あと、シナリオ作者にとってみたら、まだ使えもしないマクロスクリプトの一部が書かれているのも困ると思うので、

    /* エリア :”宿エリア” メニュー:”宿” クリック */
    

    のようなコメントを各CWXスクリプトの前に1行付ける案に修正します。

  10. Log in to comment