吉里吉里用のVisual Studio Codeプラグインを作った

Visual Studio Code用の拡張機能を作りました。
TJS用とKAG/KAGEX用があります。

TJS : プラグイン 説明書
KAG/KAGEX : プラグイン 説明書

今のところ以下の機能が使えます。

1.シンタックスハイライト

tjsのソースコードやタグを色分け表示できます。

2.定義へジャンプ・定義をここに表示

クラス、関数、変数やマクロの定義などにジャンプできます。
この機能を使うにはctagsとctagsxを入れる必要があります。詳しくは説明書を見てください。

※colorRectの定義を表示しているところ

3.リファレンスパレット

クラス名やタグ名からリファレンスを検索できます。

4.スニペット

forやfunctionなどのスニペットが使えます。

吉里吉里Zでのリリース

吉里吉里Zで作ったゲームを配布するにはリリース作業が必要です。吉里吉里Zにはリリーサなどの配布用ツールが同梱されていないため少し手間がかかります。

xp3にまとめる

吉里吉里2ではリリーサ(krkrrel.exe)を使いましたが吉里吉里Zには同梱されていません。吉里吉里2のリリーサをそのまま使えます。

アイコンを変える

吉里吉里2では吉里吉里設定ツール(krkrconf.exe)で変更できましたが吉里吉里Zでは使えません。

代わりに一般的なアイコン変更ツールが使えます。例えばResourceHackerなどが利用できます。

破損チェックツール

破損チェックツールを一緒に配布すると、ゲームが起動しないときにファイルが破損していないかチェックできます。
吉里吉里2のチェックツール(ファイル破損チェックツール.exe)と署名ツール(krkrsign.exe)がそのまま使えます。

エンジン設定ツール

吉里吉里2ではエンジン設定ツール(エンジン設定.exe)が使えましたが吉里吉里Zでは使えません。

代わりに、吉里吉里Z本体を起動する際に-userconfオプションを付けて起動すると設定ツールが開きます。配布する際は以下のようにするのが簡単です。

  1. ゲーム本体と同じフォルダに「ユーザ設定ツール.bat」というファイルを作成します。
  2. 作成したファイルをテキストエディタで開きます。
  3. 以下を書き込んで保存します。「tvpwin32.exe」の部分は自分のゲームのファイル名に書き換えてください。
    start "" %~dp0/tvpwin32.exe -userconf
    

以上で「ユーザ設定ツール.bat」を起動すると設定ツールが開くようになります。

吉里吉里のループチューナで開けないwavファイル

たまに吉里吉里本体では再生できるのにループチューナでは開けないwavファイルがあります。

どうやらループチューナでは最初のチャンクがfmtチャンクでないと読み込めないようです。
普通はそうなっているので問題ないのですが、Cubaseで書き出したwavファイルがjunkチャンクから始まるため読み込めません。
このようなファイルはAudacityなど他のソフトで開いて保存しなおせば読み込めるようになります。

たくさんある場合はSoXでコマンドラインで処理するのが楽だと思います。

吉里吉里のバージョンを調べる

吉里吉里の質問をする時は使用している吉里吉里のバージョンを最初に伝えましょう。
単に吉里吉里といっても吉里吉里2安定版/吉里吉里2開発版と吉里吉里Zの各種バージョンで様々な違いがあります。
さらにKAG3/KAGEX2/KAGEX3などKAGのバージョンの違いがあります。
これらを書かない場合、バージョンを質問し返すのが面倒なためにスルーされる確率が上がります。

吉里吉里のバージョン

吉里吉里を起動してCtrl+F12を押すと以下のような画面が表示されます。
一番最初の行の「吉里吉里[きりきり] 2 実行コア version 2.31.2012.831 ( TJS version 2.4.28 )」が吉里吉里のバージョンになります。
自分の吉里吉里の同じ部分をコピーして送れば大体わかります。
krkr-version

KAGのバージョン

KAGのバージョンは簡単に調べる方法がありません。
しかし最後に更新されたのが5年前になるので普通は最新版だと思います。
KAGとだけ分かれば十分です。

KAGEXの場合は以下の3つのどこからダウンロードしたかでバージョンが変わります。
kag3ex3が最新版です。自分がどれを使っているかくらいは覚えておきましょう。
https://sv.kikyou.info/svn/kirikiri2/branches/kag3ex3/
https://sv.kikyou.info/svn/kirikiri2/branches/kag3ex2/
https://sv.kikyou.info/svn/kirikiri2/branches/kag3ex1/

吉里吉里でフォルダ/アーカイブの選択を省略する方法

吉里吉里を普通に起動すると以下のようなウィンドウが表示されます。
フォルダ/アーカイブの選択

ゲーム開発中は、この画面でプロジェクトフォルダを選択してOKをクリックしてゲームを起動します。
起動するたびに毎回選択するのは面倒です。
自動的にプロジェクトフォルダを選択する方法を紹介します。
2つあるので好きな方を使ってください。

方法1.フォルダ名をdataにする

プロジェクトフォルダをdataという名前にして、krkr.exeと同じ場所に置きます。
そうするとdataフォルダを自動的に選択してゲームを起動してくれます。

dataの代わりにcontent-dataという名前でも大丈夫です。
好きな方を使ってください。

方法2.コマンドライン引数を使う

フォルダの名前を変えずに「コマンドライン引数」でも設定できます。
実際に以下の手順でコマンド引数を指定できます。

1.krkr.exeを右クリックしてショートカットを作成します。

2.作成されたショートカットを右クリックしてプロパティを開きます。

3.ショートカットタブのリンク先の欄に、krkr.eXeの場所が書かれています。
その直後に半角スペースを付けて、さらに””で囲んだプロジェクトフォルダのパスを書き込みます。

下の画像の赤矢印の部分です。
ここでは”F:\project”フォルダをプロジェクトフォルダとして使っています。
shortcut-property

あとはOKをクリックして、設定したショートカットをダブルクリックすればゲームが起動します。

吉里吉里LanczosフィルタをGPU化した

吉里吉里ZではLanczos2,Lanczos3による画像の拡大縮小ができるのですが枚数が多いと非常に時間がかかります。
なのでGPU上で動作するように書き換えて高速化しました。
ソースコード(github)

現在の最新バージョンの吉里吉里Z本体にはLanczos拡縮の機能が含まれていません。(コードはdev_lanczosブランチにありますがマージされていません)
このdllにはCPU版も同梱されているので単純にLanczosを使いたいだけの場合にも便利だと思います。

何も考えずにPhotoShop等でリサイズするよりかなり画質よくなるので出来るなら使った方がいいです。

速度的にはGTX770上でCPU版に比べて3~8倍速まで確認しています。
画像サイズが大きくなるほど差が広がっていくと思われます。
頑張ればもっと速くなりそうですが動作したので一区切り。
それよりpng保存で時間かかるのが何とかならんものか・・・・・・。

吉里吉里からC#を使うメモ

C++/CLIのdllを作ってそこからC#を呼ぶ。それだけ。ncbindも問題なく動作します。
サンプルコード

吉里吉里のウィンドウ(左上)とC#のウィンドウ(右下)の間でメッセージのやりとりができます。
krkr-cli-test

吉里吉里でもkwidgetsを利用するとUI含めて結構作れますが、本格的な物ならC#と.NETが使えると便利です。試してないですがVisualBasicやF#, IronPythonなども同じく使えると思います。

吉里吉里とC#のアプリを別々にするとプロセスが分かれて面倒くさかったのが色々解消される・・・・・・といいなあ。

inno setupでデータを分ける方法

inno setupを使うと簡単にインストーラが作れます。詳しい説明は以下のページを参照してください。
吉里吉里/KAGゲームのインストーラの作り方(Windows 7対応)
今回の記事はこのページの説明を前提としています。

Flags: external

「おわりに」の部分に

同人レベルだったら、できればゲームファイルは纏めずにそのままCD-ROM上に配置して おけた方が、「最後の手段で手でコピーする」というのが使えてハッピーだと 思うが、まぁうん…そのくらいはいいか。

という記述がありますがinno setupでもファイルを纏めずにインストーラと別々にできます。KAICHOさんが知らなかったのか説明を省いたのか分かりませんが、特に理由がない限り別々にした方がいいです。

setup.exeのサイズが大きければ大きいほどインストーラの起動時間が長くなります。ひどい例だとsetup.exeをダブルクリックしてから一分待たないとインストール画面が出てこないこともあるようです。理由はsetup.exeにセキュリティソフトのウィルススキャンが入ったりするためです。他にもwindows側でも何かやっていた気がしますが詳細は忘れました。誰か知ってたら教えてください・・・・・・。

setup.exeとゲームデータを分ける方法はこのページに日本語で書いてあります。

前提の記事では[Files]が以下のようになっています。

[Files]
Source: "D:\同人ゲーム\我輩ゲーム\我輩ゲーム.eXe"; DestDir: "{app}";
Source: "D:\同人ゲーム\我輩ゲーム\data.xp3"; DestDir: "{app}";
Source: "D:\同人ゲーム\我輩ゲーム\plugin\*"; DestDir: "{app}\plugin";
Source: "D:\同人ゲーム\我輩ゲーム\savedata\*"; DestDir: "{app}\savedata";
Source: "D:\同人ゲーム\我輩ゲーム\readme.txt"; DestDir: "{app}";

これを例えば以下のようにします。Flags: external; を付けるのと、ファイルの場所を{src}を使ってsetup.exeからの相対パスで指定するのがポイントです。

[Files]
Source: "{src}\data\我輩ゲーム.eXe"; DestDir: "{app}"; Flags: external;
Source: "{src}\data\data.xp3"; DestDir: "{app}"; Flags: external;
Source: "{src}\data\我輩ゲーム\plugin\*"; DestDir: "{app}\plugin"; Flags: external;
Source: "{src}\data\我輩ゲーム\savedata\*"; DestDir: "{app}\savedata"; Flags: external;
Source: "{src}\data\我輩ゲーム\readme.txt"; DestDir: "{app}"; Flags: external;

この例の場合は、setup.exeと同じフォルダにdataフォルダを作り、その中に我輩ゲーム.eXeなどを入れておけばいいです。インストール時にはそれらのファイルがインストール先フォルダにコピーされます。

この記事で言いたいことはここまでです。以下はお好みでどうぞ。

AppId

[Setup]でAppIdを指定した方がいいかもしれません。アプリケーションごとの固有のIDを指定します。デフォルトではAppNameと同じになっています。ゲーム名だけでは他と被る可能性が0ではありません。どこかに表示されたりはしないので適当に被らなそうな物を指定しましょう。ホームページがあればそのURLを使うのがいいです。
例えば以下のようにすると良いと思います。http://www.biscrat.com/の部分は自分のサイトのURLを使ってください。
AppId=http://www.biscrat.com/我輩ゲーム/

AllowRootDirectory

デフォルトの状態ではC:\やD:\にはインストールできないようになっています。[Setup]にAllowRootDirectory=yesという行を書いておくとできるようになります。

AllowNoIcons

[Setup]でAllowNoIcons=yesとすると、インストーラの中で「プログラムグループを作成しない」というチェックボックスが出てくるようになります。このチェックボックスにチェックを入れるとスタートメニューにショートカットが作られません。つまり、[Icons]のなかで{group}から始まるショートカットが無視されます。

デスクトップのショートカット

少し手間がかかりますが、デスクトップのショートカットの有無も選べるようにできます。

まず以下を追加します。これでインストーラの中で「デスクトップにショートカットを作成」というチェックボックスが出てくるようになります。

[Tasks]
Name: DesktopShortcut; Description: デスクトップにショートカットを作成;

さらに、[Tasks]の中のデスクトップにショートカットを作る行にはTasks: DesktopShortcut;を付けます。前提の記事の例では、以下のようになっている行です。

Name: "{commondesktop}\我輩ゲーム"; Filename: "{app}\我輩ゲーム.eXe";

これを以下に変更します。

Name: "{commondesktop}\我輩ゲーム"; Filename: "{app}\我輩ゲーム.eXe"; Tasks: DesktopShortcut; 

UninstallDelete

アンインストール時にはインストール時にコピーしたファイルのみが削除されます。よってゲーム起動後に新規作成されたセーブデータや吉里吉里設定ツールが作成するcfuファイルなどが削除されません。アンインストール時にそれらも削除するには[UninstallDelete]で削除するファイルを登録しなければなりません。

以下はセーブデータの保存先を %APPDATA%我輩ゲーム とした場合の例です。

[UninstallDelete]
Name: {commonappdata}\我輩ゲーム\krkr.console.log; Type: files;
Name: {commonappdata}\我輩ゲーム\krenvprf.kep; Type: files;
Name: {commonappdata}\我輩ゲーム\savecheck; Type: files;
Name: {commonappdata}\我輩ゲーム\*.bmp; Type: files;
Name: {commonappdata}\我輩ゲーム\*.ksd; Type: files;
Name: {commonappdata}\我輩ゲーム\*.kdt; Type: files;     
Name: {commonappdata}\我輩ゲーム\我輩ゲーム.cfu; Type: files;
Name: {commonappdata}\我輩ゲーム; Type: dirifempty;
Name: {userappdata}\我輩ゲーム\krkr.console.log; Type: files;
Name: {userappdata}\我輩ゲーム\krenvprf.kep; Type: files;
Name: {userappdata}\我輩ゲーム\savecheck; Type: files;
Name: {userappdata}\我輩ゲーム\*.bmp; Type: files;
Name: {userappdata}\我輩ゲーム\*.ksd; Type: files;
Name: {userappdata}\我輩ゲーム\*.kdt; Type: files;               
Name: {userappdata}\我輩ゲーム\我輩ゲーム.cfu; Type: files;
Name: {userappdata}\我輩ゲーム; Type: dirifempty;
Name: {app}\我輩ゲーム.cfu; Type: files; 

これでも削除されないファイルを見つけたら教えてください。

吉里吉里2は画面解像度2048pxまで?

吉里吉里2で描画領域の横幅または縦幅が2048を超えると拡大時のスムージングができず表示が汚くなるようです。

吉里吉里の画像の描画にはDirect3D, DirectDraw, GDIの3種類があります。
このうちDirect3Dは2048pxを超えると使えません。おそらくDirectX7のテクスチャサイズ限界。
DirectDrawは環境依存問題があり、Vista以降では結構な環境でスムージングがききません。
参考)Vista さんの罠
参考)吉里吉里 DirectDraw 環境依存問題のメモ
よって2048pxを超える場合にGDIが使われます。GDIのスムージングは非常に低品質で、補完されているのかされてないのかほとんどわかりません。

2048px以上のゲームはなかなかありませんが、高解像度ディスプレイでWindowResizableやKAGEXなどの機能で拡大すると発現します。4Kや8Kのディスプレイが出てくる中ではちょっと厳しそうです。

なお吉里吉里Zは少し試した限り問題ないようです。

windows8でquakeを使うとバグるやつ

Windows8で吉里吉里/KAGの[quake]タグを使うとフルスクリーン時に画面が乱れます。(以前の記事参照)

これは吉里吉里設定ツールで「フルスクリーン切り替え方法」の部分を”ddraw”から”cds”に変更すると防げるようです。詳しいことは調べていませんがお手軽に直せるので設定してしまってもいいかもしれません。

ゲームにエンジン設定ツールが同梱されていればプレイヤー側でも変更できます。フルスクリーンで遊ぶとおかしくなる場合はお試しください。