例の赤帽Linux機のカーネルをアップデートしておきました。aptって便利ですねえ。楽ちん楽ちん。
さて、こいつに何をさせようか。
五月雨を買ってきました。
あと、AGP接続のビデオカードが欲しかったのですが、手頃なのが見つかりませんでした。背が低い(コネクタエッジからの丈が短い)、ってのが絶対条件で、性能的にはVGAが映れば十分なんですが。千円くらいで転がってないかなー。
Ultimate(Reminisce)で1300万(リプレイ ver.1.02用)。道中での稼ぎはダメダメですが、ステージ8とボス6でフォローしてます。
道中でちゃんと稼げば、1400万くらいいけそうですね。
プラグイン。メモリリークや、ほか、細かいバグを修正。TJSCreateArrayObject、TJSCreateDictionaryObjectで取得したものはちゃんと解放しましょう、ということ。あと、微妙に仕様変更とか。
そろそろ晒してもいいかな。
プラグイン。ver. 0.6β1として(弱気に)リリース。2.24RC3用です。
吉里吉里本体が2.24になったらリリースし直します。多分。
なんだそれは。
書籍版が出版された頃、本屋でぱらぱらと3秒ほど眺めましたが、買ってまで読むほどの価値はないと思いました。
そういえば、逆境ナインも映画化されるんですよね、実写で。
アキバでビデオカードを買ってきました。背の低いやつです。チップはATI Rage XLで、VRAMが4MBも搭載されています。しかもAGPx2対応です。ややオーバースペック気味ですが、まあいいでしょう。安かったし。
サーバ機用なんて、VGAが映りゃいいんですよ。
吉里吉里Ver.2.25からは、プラグインからネイティブ実装されたクラスを提供
できるようになりました。2.24まではできなかったわけです、公式には。
私の環境では、当社【何】のインチキ・テクノロジ【謎】により、2.24でも似非ネイティブクラスを提供できるようにしてあります。new SQLite3()
とかnew Socket()
とか、OKです。もちろん、本体改造はしていません。無修正です。でもちょっとインチキくさいです。完全なネイティブになっていなかったり、クラス定義部が「なんじゃそりゃー」だったり、「テクノロジ」でも何でもない辺りが、インチキ・クォリティ。
インチキはさておき、Ver.2.25ではβ版とはいえ公式に(?)サポートされたのですから、使わない手はありません。サンプルである nativeclasstest を読みながら、一つクラスを書いてみました。
…うーん、これはやりにくそうですね。というのは、自動生成のことです。当社【だから何】では、インチキ・テクノロジにより、コーディングが面倒な部分は自分で書かずに済むようにしています。V2Link()、V2Unlink()、TJSメンバのクラス定義などは、Perlによるソースコード自動生成です。C++クラス名とTJS関数名の対応表を書いておくだけで、記述量の多いあのV2Link()、V2Unlink()諸々がさくっとできあがります。楽ちんです。しかし、今回の公式の手法では、これが通用しないように思えます。
通常の関数は今までのやり方を踏襲する予定ですが、クラスに関してはどうしたものでしょう。できれば公式の手法を採用したいところですが。どうやって自動生成させようかなあ…
プラグインでネイティブクラス。
nativeclasstest の通りに書くと、同じ記述(クラス名とかメンバ名)が何度も出てくることになります。プリプロセッサマクロでかなり簡素化されてはいますが、それでも記述量はそれなりです。これでは書くのが面倒なのはもちろん、記述ミスも多くなりそうですし、メンテも大変そうです。そこで、楽に記述できるような仕組みを作ってみました。nativeclasstest の Main.cpp は、おおよそ以下のようになります。
@comment このソースは、そのままではコンパイルできません。 /* C++ source code ... class TJSNI_Test { ... }; */ // TJS Native Class @begin Test // 空の finalize メソッド TJS_DECL_EMPTY_FINALIZE_METHOD // (TJSの) コンストラクタ @constructor // ここでは何もしない return TJS_S_OK; @; // print メソッド @method print _this->Print(); return TJS_S_OK; @; // add メソッド @method add if(numparams < 1) return TJS_E_BADPARAMCOUNT; _this->Add((tjs_int)*param[0]); return TJS_S_OK; @; // value プロパティ @property value @getter *result = (tTVInteger)_this->GetValue(); return TJS_S_OK; @; @setter _this->SetValue((tjs_int)*param); return TJS_S_OK; @; @; // square プロパティ (read only) @property square @getter *result = (tTVInteger)_this->GetSquare(); return TJS_S_OK; @; TJS_DENY_NATIVE_PROP_SETTER @; @end
これを通常のC++ソースファイルに埋め込んでおきます。中途半端にコンパイルされると困るので、C++言語レベルでは、コンパイルエラーになるような仕様にしてあります。こいつをスクリプトで処理すると、
のコードが吐き出されます。これはC++コンパイル可能です。TJSネイティブインスタンスの実装用クラス(ややこしいな)である TJSNI_Test は、自分で書くしかありません(当たり前)。
V2Link()とV2Unlink()は、今までの仕組みで自動生成できます。必要なのはこのファイル一つだけです。
# Native class 'Test' tTestClass Test@class:()
奇妙奇天烈な書式ですが、ほかの文法との兼ね合いでこんなふうになってしまいました。こいつをスクリプトで処理すると、V2Link()やV2Unlink()諸々を含んだ Main.cpp と、ヘッダファイルが作成されます。
なんだ、スクリプトで処理するのが面倒じゃないか、と思われがちですが、Makefile に依存関係と生成規則を書いてあるので、実際には make 一発で済んでしまいます。楽ちんです。make ばんざーい。