2013/11/22
KAICHO: s_naray[at]yahoo[dot]co[dot]jp
※SPAM防止中

(勝手に)吉里吉里Z移行ガイド

■はじめに

本書では、吉里吉里2/KAG3で動作しているゲームを、 吉里吉里Zに移行する 際の注意点について述べる。
本書は超非公式(大御所からコメント頂いたりしたけどな!)なので、 間違ってる部分とか古い部分とかあるかもしれない。 発見したら是非お知らせ頂きたい。

■吉里吉里Zとは

まずリンク読んでよ! というのはさておき、古いコンパイラじゃないとコンパイルできなかった吉里吉里2を、 Micro$oftのVisual Studio 2012/2013(C++) Professionalでコンパイル できるようにしたもの。 あと細かい変更はあるけれど、大きな変更はソレだけと言えばソレだけ。 細かい変更点は…リンク読んでよ!

ナニがうれしいのん?とかそういうのは置いとく。リンク読んでよ!(三回目)。

なお、 吉里吉里2からの変更点一覧はこちら開発blogも、色々わかって 面白い。

■デフォルトの吉里吉里2/KAG3 templateを吉里吉里Zに移行する

ここで言う「デフォルトの吉里吉里2/KAG3」とは、 吉里吉里SDKのkag3/template/から 作成されるゲームの雛形。たぶんこれがもっとも単純な吉里吉里2/KAG3ゲームだから。 これを吉里吉里Zに移行する手順を確立しておけば、あとはその応用で、アナタの ゲームを吉里吉里Zに移行できるようになりますからな!

  1. 吉里吉里Zバイナリを追加・上書きする

  2. まずは、今のシステムを、吉里吉里Zで提供されている以下のバイナリで上書きする。

    実は、吉里吉里2が提供している既存のplugin/*.dll(=吉里吉里プラグイン)は、 殆どがそのまま吉里吉里Zでも動作可能。従って、 あまりお勧めしないけど、吉里吉里Zで提供されている menu.dll と KAGParser.dll だけを今の plugin ディレクトリに放り込めば、フツーに 吉里吉里Zも起動する。 ただ、吉里吉里2のwindowEx.dllだけは、吉里吉里Zで動作しなかった(後述)。

  3. 文字コードを変更する

  4. 吉里吉里ZはUTF-8を基本の文字コードに設定している。一方、吉里吉里2/KAG3は Shift-JISだった。そのため、Shift-JISで記述された*.tjsや*.ksなどの テキストファイルの文字コードを、UTF-8に変換する必要がある。 これが一番ハードル高い。

    手で変換(メモ帳で開いて一つ一つUTF-8でセーブ)してもいいが、我輩は Cygwin+nkf を使って以下のように一括変換した。nkf 超便利(iconv使えって?)。 あと、cygwinだとfindは絶対パスで指定しないとWindowsのfindの方が使用されちゃう ので注意。

    cd ゲームのトップディレクトリ
    for i in `/usr/bin/find ./ \( -name "*.ks" -or -name "*.tjs" \) -print`; do
        echo $i
        mv $i $i.org
        nkf -w $i.org > $i
    done
    

    このスクリプトでは*.ks.orgと*.tjs.orgが残るが、これらは最後には削除して 構わない。スクリプト中に rm -f $i.org を入れてもよい。

    実は、テストしたいだけなら、文字コードを変更しないでShift-JISのまま動かす方法もある。 tvpwin32.exeの起動オプション「-readencoding=Shift_JIS」を使えばいい。 以下のコマンドで起動すればO.K.。

    D:TestDir\Game1> tvpwin32.exe -readencoding=Shift_JIS
    

    吉里吉里Zでは、コンソールがなくなった変わりに、コマンドラインから起動すると ログメッセージがコマンドウィンドウ上に流れていくので、それはそれで助かる。 ただ、市販したゲームでも、コマンドラインから実行されると、 なんかプロテクトとか暗号化とかの見えちゃいけないメッセージまで 見えちゃうので怖い。メッセージ出さないようにするスイッチとかあるのかしら。 ないなら、こういうメッセージ出さない製品用のバイナリって必要なんじゃ ないかなぁ…。メッセージが見えると、暗号の復号化はこんなに楽チン、という例は こちら

    あと、実は文字コードは UTF-16LE でもよい。これだと、 吉里吉里2/吉里吉里Z両方が何のオプションも無く読み込めるため、両バージョンの テストをする時には便利かもしれない。どこにも書いてないから ずっと使えるかどうかわからんけれど。 また、UTF-16LE対応のテキストエディタでなければ編集できなくなっちゃうことにも 注意。

  5. data/startup.tjsに細工する

  6. 吉里吉里Zでは、いくつかのWindowクラスのメンバが削除されており、また メニューとKAGParserは吉里吉里プラグインとして作成されている。 従って、吉里吉里Zシステムではまずこれらの相違を吸収するように、 data/startup.tjs先頭に以下を追加する。

    // 吉里吉里Zの場合は細工する
    @if (kirikiriz)
    property _dummyProp { getter {} setter (v) {} }
    with(Window) {
        &.innerSunken    = &_dummyProp;
        &.showScrollBars = &_dummyProp;
    }
    Plugins.link("plugin/menu.dll");       // メニューを使わないなら不要
    Plugins.link("plugin/KAGParser.dll");  // KAGを使わない(!)なら不要
    @endif
    
    (この後、元からあった記述が続く)
    

    「@if (kirikiriz) 〜 @endif」という書き方については、 TJS2 スクリプトでの吉里吉里2と吉里吉里Zの判別方法参照。 これを駆使して、吉里吉里2/吉里吉里Z共通のスクリプト書くちうのも面白い かもしれない。 でもこの記述は吉里吉里Zだけのものなので、吉里吉里2との共存を考えるなら 使わないほうがいいと思う。 この書き方は吉里吉里2では使えないと思ってた(前に試した時に エラーになった記憶が…)けど、今試したら吉里吉里2でもちゃんと使えましたよ! あれー?

    …うーん、でもやっぱり我輩は、こういう書き方じゃなくて、 System.versionInformation.substr(11,1) (=吉里吉里2では '2' を、 吉里吉里Zでは 'Z' を返す)を判定する書き方の方が好き。 「定義されている・いないこと」を判定するよりは、 「双方で定義されていて明確に違うこと」を利用する方が、 定石だし間違いが無いから。

    なお、メニューについては、もともと こんな話とか こんな話があるため、最終的には無くすか、少なくともフルスクリーン時には 表示しないようにした方がいいみたい。

  7. data/system/YesNoDialog.tjsに細工する

  8. 吉里吉里Zβ4からPassThroughDrawDeviceが廃止されたため、data/system/YesNoDialog.tjsの先頭あたり、これを使用している行を以下のようにコメントアウトする。

    (snip)
            function YesNoDialogWindow(message, cap)
            {
                    super.Window();
    
                    // このウィンドウではもっとも基本的なdrawerを用いる
                    // drawDevice.preferredDrawer = global.Window.PassThroughDrawDevice.dtDrawDib;
                    // ↑この行をコメントアウト
    (snip)
    

  9. data/system/Config.tjsの変更

  10. MIDI/CDDAクラスが削除されたため、Config.tjsの「BGM再生メディア」として type="MIDI"とtype="CDDA"は利用できなくなった。デフォルトではtype="MIDI"と なっているが、ここは必ず type="Wave" に変更すること。

    // ◆ BGM再生メディア
    // type 変数に設定する文字列で、使用するサウンドバッファを決めることができ
    // ます。
    // "Wave"  : WaveSoundBuffer ( wav等(プラグインで再生できる物も含む) )
    // "MIDI"  : MIDISoundBuffer ( mid,smf )
    // "CDDA"  : CDDASoundBuffer ( cda )
    ;type = "Wave";
    

    当然、MIDIやCDDAは使用できなくなった。最近MIDIとかCDDA使ってるゲームは まずないけれど、これらを使用している古いゲームをそのまま移植することは できない、ということに注意。 まぁ…oggに変換すりゃいいじゃんという話はその通りなんだけど。

  11. data/system/UpdateConfig.tjsの変更

  12. これは、一番最初にdata/system/Config.~newからConfig.tjsを作成した直後のみ必要。 Padクラスが削除されたため、このファイルの末尾、Padクラスを利用する部分を 削除する。

    	// Pad の表示
    //	global.configPad = new Pad();
    //	global.configPad.text = lines;
    //	global.configPad.color = 0;
    //	global.configPad.title = "Config.tjs";
    //	global.configPad.fileName = Storages.getLocalName(Storages.getPlacedPath("Config.tjs"));
    //	global.configPad.visible = true;
    

    …ところで、controllerも削除されたから、Config.tjsをセーブすることもできなく なっちゃったんだけどどうすればいいのん…? Config.~newをConfig.tjsにコピー した直後は、Config.tjsの先頭のglobal.config_version=""に kagVersion("3.32 stable rev. 2"とか)を書き込んでおくと、UpdateConfig.tjsが そもそも実行されなくなるので、そもそも上の変更も不要になるとかそんな。

  13. セーブデータ削除

  14. 現在のところ、吉里吉里2と吉里吉里Zの間でセーブデータが共用できない。 ので、移行の前後でセーブデータは全て削除することをお勧めする。

    理由は不明。テキストで書き出しても(両方UTF-16LEで書き出すくせに)共用できない。 読み込もうとすると、「システム変数データを読み込めないか、あるいはシステム変数データが壊れています(文法エラーです(syntax error))」と報告されたり、 「文字コードが違います」と言われたりする。ただいま原因調査中(未報告)。

  15. windowEx.dllを使わない

  16. 前述の通り、殆どの吉里吉里プラグイン(.dll)は、吉里吉里2と吉里吉里Zとで共用可能。 なんだけど、試した範囲ではwindowEx.dllだけは吉里吉里Zで動かなかった。 読み込もうとすると、以下のようなエラーが出る。 だから、windowEx.dllは使えないと思ったほうがいい

    15:38:36 スクリプトで例外が発生しました
    (void) から Object へ型を変換できません。Object 型が要求される文脈で Object 型以外の値が渡されるとこのエラーが発生します
    15:38:36 trace : initialize.tjs(121)[(function) KAGLoadScript] <-- initialize.tjs(205)[(top level script) global] <-- startup.tjs(20)[(top level script) global] <-- startup
    

    (2014/05/15追記)
    ずっと、windowEx.dllは根本的に変えないと吉里吉里Zでは動かないものだとばかり 思ってた。のだが、どうやらwindoeEx.dll内にPadとConsole(とMenu)に関する拡張が 埋め込まれていて、これにアクセスしたために上のエラーになっていた模様。 だもんで、単純にこれらをソースコード中からコメントアウトしたバイナリを buildするだけで、windowEx.dllが吉里吉里Zでも使えることを確認した。 一応ソースコード込みでこちらに上げとく。 このdllでは、PadとCOnsole拡張は使えなくなっていること、Menuクラスの拡張を 含んでいるのでmenu.dllが必須なことに注意。

  17. [quake]を使わない

  18. 吉里吉里Zでは、Window.setLayerPos()が削除された。このため、この関数を使っていた KAGの[quake]は、利用できなくなってしまった(使うとエラーで止まる)。 正直、同人屋としてはかなりキツい。 吉里吉里の開発版の方覗いてみたら、KAGEXと同じような方法でプライマリレイヤを動かさないようにして対応しようとしてるみたい。カツモクして待て!

以上!基本的にはこれだけで、既存の吉里吉里2/KAG3のゲームを移行可能。 ほーら動かしてみたくなってきた…!

■KAGEXのゲームを吉里吉里Zに移行する

実はKAGEXだからといって特別な手順は不要。 上で述べた手順がそのまま利用できる。 もちろん、デフォルトから手を加えていて吉里吉里Zで引っかかるなら、 適宜修正必要だけれど。windowEx.dllが必要な場合が多いが、それも コレで動くようにできるし。

ちなみに我輩は、ソース付きで公開されている タリナイモノ (少し古いけれど)を入手し、上の手順に従った後、吉里吉里Zで動かして 致命的な問題はなさそうなことを確認した(分かった問題は報告済み)。 こういう形でゲームを公開してくれているのも、このように「ゲームを作る」以外の 目的で役立ったりするのでとても助かります助かります。

ただ…なんかこう…「異」「び」「ビ」をメッセージウィンドウに表示する時に、 なぜかその文字だけ薄い色になることがあったんだよね…。 再現性低すぎて報告できなかったんだけど。 コレだった模様

■正直なところ

現状で、フツーの「吉里吉里使ってゲーム作りたい人」が吉里吉里Zに移行する 意味はない。というか、そういう人は吉里吉里Zを使うべきではない。 今の吉里吉里2を使った方が、バグもないし、メニュー周りの問題とか デバッグコンソールが無いとかの問題がないので、作りやすいし使いやすい。

吉里吉里Zのメリットは、吉里吉里本体をばりばりつつく開発者が、コンパイル環境を 容易に用意できるという、ただその一点に尽きる。確かにいくつかのライブラリが 新しくなって高速になっている部分もあるが、そのあたりはフツーの吉里吉里2でも そうそう困るものじゃない。だから、特にメリットとかないけどあえて移行しよう、 とは思わぬが吉。

メニュー問題とデバッグコンソールがねぇ…それさえ真っ当に動けば、今の時点でも さっと乗り換えるべきだとお薦めできるんだけどなぁ…。

■おわりに

吉里吉里Zは 2013/12/31に1.0.0.1がリリースされたが、その後は少しおとなしいですな。 とはいえ、「作る側」としては色々便利になっているので、我輩はコレをベースに なんか書いてみようかなぁと思っている次第。吉里吉里2との互換性もまぁまぁだし、 無駄にはならないと期待する。

ここはイッパツ、アナタもお手持ちのゲームを吉里吉里Zで動かしてみて、 問題あれば積極的に報告(もちろんちゃんと切り分け実施した上で)してみては如何。 もしキミんトコで問題が起こってキミが切り分けできないなら、 再現環境送ってもらえれば我輩が切り分けしちゃうよ!くらいのイキオイ。 我輩は個人的に吉里吉里Zに期待してて応援中です故。

バグ報告方法は 吉里吉里Z SDK(リンクは1.0.0.1)の中のreadme.txtに書いてある。 さておき、バグ報告前に以下を確認しておくこと!

直して頂くのは先方の厚意であって、我々ユーザはそれに甘えてさせて頂いている ことを忘るるべからず。何度もやりとりさせて先方の時間を浪費するとか、そゆ 失礼のないように。

ところで吉里吉里ZってVisual Studio Expressでもbuildできるのかなぁ…。 我輩貧乏だから、Express(※無料)しか持ってないのであるよなぁ…(遠い目)。