xtext で include

DSLを作ってて、共通的な定義は、ファイルを別にして、include して使うような感じで、そのモデルを参照しつつ…とかしたい。

いろいろ探したけど、まだ無いぽい。
include は、DSLでパースする前に、その場所にテキストを入れ込むような(まさにインクルードする)感じにして、プリコンパイルする様にするほうが良いってどっかに書いてあった。

確かにそうなんだけど…それを含めた、DSLにしないとだし…
xtext のエディタ的には、なかなか重そう。(やったとしたら)
そうでもないのかね~?

これとは別に、DSLを派生させて作るみたいなことは出来るから
それはそれで良いのかも?(インクルードできれば…)

とりあえず、したいのはコンテンツアシスト時に別ファイルに定義している内容からリストアップ。
なので、プリコンパイルの制御はちょっと大変そうだし、単にプロジェクトにある別のDSLモデルから情報を引っ張ってこれるようにしようと考えた。

モデルは、EMFのEObjectとかになってるので、ResourceSetとかで、URIを指定すれば
必要なモデルを読み込めるみたい。

ただ、EMFのURIの使い方がいまいち理解しきれなくて…とりあえず、Stringにはなるので
適当に、編集中のファイルと同じ位置にある、特定のファイルから読めるようにしてみた。
(URIのファイル名の部分だけ置き換え)

TestDSL2ProposalProvider.java

で、とりあえず読めるみたいです。

これは、毎回読むのかな~?とか思ったり思わなかったりですが、とりあえず今はこのままやっておこう…

カテゴリー: RPGMKDT, イベントエディタ | タグ: , | コメントする

xtext で ContentAssist の実装

コンテンツアシストはエクリプスのエディタでは、コントロール+スペースで表示されるその場で入力するべき候補の事(だと福山は思ってます)

xtextで、作ったエディタも対応していて、uiプロジェクトの中にMyDSLProposalProvider.java みたいな形で用意されてます。
ここにメソッドとか追加すると、自分の好きな候補をコンテンツアシストとして追加で表示してくれる。

あと、テンプレートを用意しておくことも出来る。(この辺は、チュートリアルとかにもあったと思う。また後で書くかも)

今回は、それ以外のキーワードの表示について

DSLの構文で出てくるキーワードがデフォルトの実装ではコンテンツアシストとして出てきます。
これは、このままで、普通に使えるのだけど、問題はその並び順。
キーワードの文字列でソートされてるぽい…
DSLのグラマーに書いた順には表示されないので意味があって順番に並べてると少し微妙です。

ツクールのイベントコマンドのキーワードが100個ほどあるんだけど、イベントコマンド入力位置でアシストしたらばらばらに表示されてとても微妙でした。

で、これを自分の好きなように並べる方法について
(前置き長いな…汗)

ソート用のComparatorとかも実装できて、Injectできるしbindもできるのでこれかな~?って思ったけど、実際には、各コンテンツのプライオリティを設定できて、このプライオリティを元にソートするみたい。
プライオリティが同じだと、キーワード文字列でソート。

で、プライオリティは、その場で表示する場合に変更される事があるので単純にComparatorでのソートをしてしまうより、このプライオリティをちゃんと設定したほうがいいみたい。

具体的にはIContentProposalPrioritiesインタフェースを実装したクラスを、bind すればOK。

福山はいつもどおり、UIModuleに

public class EventDSLUiModule ...

public Class<? extends IContentProposalPriorities> bindIContentProposalPriorities() {
  return EventDSLContentProposalPriorities.class;
}

こんなのを追加

で、プライオリティをつけるクラスは、以下のような感じ

public class EventDSLContentProposalPriorities extends ContentProposalPriorities {
	
  public EventDSLContentProposalPriorities() {
    crossReferencePriority = 900;
    keywordPriority = 300;
    defaultPriority = 600;
  }
	
  @Override
  public void adjustKeywordPriority(ICompletionProposal proposal, String prefix) {
    adjustPriority(proposal, prefix, keywordPriority);
    if (proposal == null || !(proposal instanceof ConfigurableCompletionProposal))
      return;
    ConfigurableCompletionProposal castedProposal = (ConfigurableCompletionProposal) proposal;
    String keyword = proposal.getDisplayString();
    int p = castedProposal.getPriority() + EventDSLUtils.getPrioryty(keyword);
    castedProposal.setPriority(p);
  }
}

ContentProposalPriorities はもともと用意してある、デフォルトの実装で、アシスト時の並び順をプレフィックスとかを元に優先度をつけるようになってるので、それをそのまま利用してしてます。
コンストラクタで、設定している値は、ContentProposalPriorities にあるインスタンス変数で、基本になるプライオリティ。
キーワードだと300ってプライオリティなのだけど、ContentProposalPriorities だと、それ以上の adjust をしないので、キーワードは全部300って言うプライオリティになって、同じ優先度なので、最終的に文字列でソートされちゃう。
で、adjust した後に、改めてキーワード毎にプライオリティをずらすようにしました。

これがまだなかなか…キーワード文字列を書かなくちゃならないので、なかなか大変。う~ん。もう少しどうにかしたいけど、グラマーでキーワード変えたときとか、増えた時とか、またUtilsのキーワード一覧を修正しないとならないし、ちょっとびみょうかな~?とか思ったり思わなかったり。

ま、とりあえず、思うようにキーワードのソートは出来たのでOKとする。

カテゴリー: RPGMKDT, イベントエディタ | タグ: | コメントする

xtext で Syntax Coloring の実装

DSLのエディタプラグインで欲しい機能の1つと言うことで、
キーワード文字列のカラー設定(Syntax Coloring:シンタックス、カラーリング)について書きます。
xtextのサイトのドキュメントを見てもなかなか難しかった…

ポイントは、binding

xtest内部では、GoogleのInjectとかを使って、各モジュールの依存関係をInjectしつつ動いてる様で…ハイライト用のクラスとか用意した時に、どうやって関連つければいいんだろう?って思ったら bind でした。

元々Injectしてるから、後からユーザが作った機能でInjectすれば、モジュールの変更が容易ってことですね。
全然使ったこと無かったから理解するのに苦労した(汗
でも、これ便利だねぇ~。

実際に行ったのは、3つのクラスの作成と、それをbindするためのメソッドをUIモジュールに追加したのみ。

作成する3つのクラスは、xtextのサイトの通りで、以下の3つ。

  • ハイライトの設定項目を決めるクラス(IHighlightingConfigurationの実装)
  • 設定ページの「項目ID」と「項目名」と「デフォルトカラー」の組み合わせを設定する。

  • 意味を元にハイライトを行うためのクラス(ISemanticHighlightingCalculatorの実装)
  • キーワードでは設定できない意味を元にしたカラーを抽出するクラスで、テキストの何処から何処までが、どの様な意味なのか抽出する。
    具体的には、何処から何処までが、どのカラー設定の「項目ID」となるか設定。このクラスは必要なければ作らなくてもOKだと思う。

  • キーワードを抽出するためのAntlrトークンのマッピング用クラス(AbstractAntlrTokenToAttributeIdMapperの派生)
  • どのキーワードがどのカラー設定の「項目ID」になるかのマッピングを行うクラスで、xtextで生成されたantlrのparserを元にキーワードを抽出する。

で、作ったクラスをどうやってエディタと関連付けるか?がbind。

xtextでコードを生成すると、uiのプロジェクトに MyDSLUiModule.java (MyDSL部分はDSL毎にさまざま)みたいなクラスがあって、ここにクラスを設定する。

EventDSLUiModule.java

public Class<? extends IHighlightingConfiguration>
    bindIHighlightingConfiguration() {
    return EventDSLHighlightingConfiguration.class;
}

こんな感じに、”bind” で始まるメソッドで、関連付けるクラスを返すと、それをインスタンス化して使ってくれる。

カテゴリー: RPGMKDT, イベントエディタ | タグ: , | コメントする

JavaからRubyオブジェクト操作

イベントエディタはEclipsePluginで、RGSSのデータはRubyのオブジェクト
なので、DSLで読み込んだデータからRGSSで読めるイベントデータにするために
JavaからRubyオブジェクトを作らないとなりません。

いろいろ探すと、JRubyを使う場合に、JavaProxyとかで、ruby世界からJavaライブラリを読んだり操作するのは、結構あるんだけど逆があまり無いみたい。
基本的には、RubyObjectを作って、call系のメソッドを呼べば、Rubyのオブジェクトのメソッドとかも呼べるので、JavaからRuby世界のデータの操作もできるけど…イベントエディタで作るデータ量が多いので、なんとか楽したい。
JavaProxyみたいに、オブジェクトのメソッドがそのまま同じ様に呼べるといいよねぇ~。

前置きが長くなった。
簡単にありそうなんだけど、見つからないので作ってみることに(自転車の車輪作ってた嫌だな~とか思いつつ)。
作ってみると無い理由もなんとなくわかるけど、制限ありであってもいいかも?

RubyProxyと言う感じで、Javaのjava.lang.reflect.Proxyを使って、JavaBeanぽいインタフェースのプロキシクラスを作って…
メソッドを横取りしつつ、RubyObjectのメソッドを呼ぶようなものです。

jp.sourceforge.rgsslib.tools.j2rlib

まぁまぁ、良い感じに出来た。
RGSSに対応したイベントデータのインタフェースが必要だけど、Ruby操作がJavaから簡単にできそうなのはわかった。
たぶん問題ないと思うけど、これで作ったデータをRGSSで実際に読めるように試さないとなぁ~

もう1つ進めて…RGSSのRubyデータから自動的にインタフェースが出来ると楽かも?
インタフェースを用意するのが結構大変そうなので(汗

この辺は…xtextがつかえるかもしれない?

カテゴリー: RPGMKDT, イベントエディタ | タグ: , | コメントする

EclipseCon2012 に行って来て xtext を使ってみようかと思った。

去年あたりに少し目にして気になってた xtext のチュートリアルをやってみて、RPGツクールのEclipse Pluginをつくれるな~って思った。

もともとRPGXPDTとかRPGVXDTとか作ってたけど VXAce では、rake を使って同じ様な事ができるから作って無かったです。

ただ、イベントの作成をツクールのエディタでやるのは、Eclipseとかの統合環境になれた福山的にはやっぱりちょっと面倒で…テキストエディタでできないかな~?と、XP/VX の時は、イベントコマンドの書かれたテキストファイルから、イベントを作成するコンパイラとかも作ってたんですよね。

これはこれで使えるんだけど、エディタの方は普通のテキストエディタなので、xtextを使ってRPGツクール用のイベントコマンドDSLを、作ればエディタもEclipse Pluing化できる!ってことで、またプラグイン作成熱があがってきてます。

まずはインストール

Eclipseは、いまのところの最新、INDIGO(JUNOでも良いんだけど…)とりあえずこれに、Subclipse と、DLTK rubyと、xtext を追加した状態。
もともとRGSSの開発に使ってるのに xtext を追加した感じ。(シンプルに)

これから少しづつ作っていってみよう。
いまのところのイメージ

event 001 (0,0) EV001
page
    condition
        switch1     1
        switch2     1
        variable    1
        self_switch A
        item        1
        actor       1
    end
    image test.png
        tile_id   0
        index     0
        direction 上
        pattern   2
    end
end
カテゴリー: RPGMKDT, イベントエディタ | タグ: , | コメントする

ActiveRubyのrake

たまには、Rubyのバージョンをアップさせようと、ActiveRubyを再インストールとりあえず1.8.7。RGSSが1.8系なので、同じ系統にしてるけど、いつまでもつのかな~?と…

で、入れたけど、rakeが動かなかった。

ruby.exe: No such file or directory -- C:/Program Files/ruby-1.8/bin/rake (LoadError)

とか言われる。
う~ん。たしかに、そんなファイル無いけど…rake.rb を読みたいんじゃないかね?
ってことで、bin/rake.rbを bin/rakeにコピー。

ふむ、とりあえず動くぽい。なんだろう?(特に検索してないけど…まいっか。うごいてるぽいから)

今は、テンプレートプロジェクトを作るために、ゲーム内のデータベースを修正する必要があって
とても大変だから、LibreOffice のスプレッドシートからxmlを吐かせて、そこから rxdata を作る様なコンパイラを作成中。
RPGツクールXPの基本的なデータは作れるようになった。アクターとかエネミー、システム情報とかアイテム、武器、防具、スキル等々…とりあえずね。
編集しやすいかどうかはあるけど、スプレッドシートで全体をみつつ簡単に編集できるので楽だ。
rakeで使えるようになる予定…

これ進めていくと、ツクールいらなくなるかもね~?

カテゴリー: 未分類 | タグ: | コメントする

DQScripts

活動は、続けていますが…リリースがまったくされてないですね。
デモを、久々にダウンロードしたら、ちゃんと動かなかった(汗
RGSS100J.dllとか、古すぎ!作っていたデモ 0.3.1 は、えたーなってしまいました。

あと、ライセンス違反の連絡があって確かめたら公開されてるデモは、LGPLでしたね。
これも初期の頃の物で、RGSS的には、LGPLが合わないと指摘があって、BSDライセンスに変更したけど、それから1度も出してなかったみたい。
う~ん、ダメすぎる。

やっぱりデモをゲームの形で出すポリシーはあきらめ。
ゲームが完成しないと出せなくなくなってしまうってことで、つぎはテンプレートみたいな形にテストとサンプルのプロジェクトで出すことにしよう。
これも時間がかかりそうなので…まずは、前のプロジェクトをリメイクしようかな。

カテゴリー: DQScripts | タグ: | コメントする

SourceForge.jp ブログを開始

いろいろ機能が追加されてるので、一通り設定中…
でも、ブログって他にもいっぱい似たようなのあるし困るよねSNSとか
ここのは…やっぱりRGSS-LIB関連のってことになるのかな~?

カテゴリー: 未分類 | コメントする