パスの設定・パッチの適用

統一ストレージ名

吉里吉里ではファイルなどをストレージと呼びます。このストレージは大きく分けて2種類の方法で指定することができます。その1つ目が統一ストレージ名という方法です。この方法は、file://./c/program files/game/game.xp3>image/base.jpgのように、一番上位の場所からすべて記述する方法です。主に吉里吉里内部で使われ、フォルダの区切りにはスラッシュ記号が、アーカイブの区切りには大なり不等号記号が使われます。詳しくは(kr2doc)ストレージシステムを参照してください。

カレントフォルダ

統一ストレージ名とは別に、カレントフォルダに設定されているフォルダ内にあるファイルは、ファイル名のみで指定できます。カレントフォルダは、基本的にプロジェクトフォルダのことです。カレントフォルダはStorages.getFullPath('./')とすることでわかります。

krkr.eXe
project\
  startup.tjs
  nextstep.tjs
  system\
    init.tjs
    main.tjs
// project\startup.tjs
Scripts.execStorage('nextstep.tjs');
 
// project\nexestep.tjs
// カレントフォルダから見て、systemフォルダ内のinit.tjs
Scripts.execStorage('system/init.tjs');
 
// project\system\init.tjs
// やはりカレントフォルダから見て(system\init.tjsからではない)
Scripts.execStorage('system/main.tjs');
 
// project\system\main.tjs
var win = new Window();
win.visible = true;

このように、カレントフォルダからの相対パスで指定することができます。

自動検索パス

また、カレントフォルダと同じような方法で、カレントフォルダ以外のフォルダから検索することもできます。そのことを自動検索パスと呼びます。カレントフォルダで、目的のファイルが見当たらない場合は、自動検索パスのリストから順に検索していきます。

krkr.eXe
project\
  startup.tjs
  nextstep.tjs
  system\
    init.tjs
    main.tjs
// project\startup.tjs
Scripts.execStorage('nextstep.tjs');
 
// project\nexestep.tjs
// ここで自動検索パスにsystemフォルダを追加する
Storages.addAutoPath('system');
// カレントフォルダにないので、init.tjsを自動検索パスから探す
// system内でみつかったので、system\init.tjsが実行される
Scripts.execStorage('init.tjs');
 
// project\system\init.tjs
// 既に自動検索パスの設定は終えているので、これも直接main.tjsと指定
Scripts.execStorage('main.tjs');
 
// project\system\main.tjs
var win = new Window();
win.visible = true;

自動検索パスは後から追加した方が優先されます。そのため、同じ名前のファイルが複数の場所でみつかっても、後から追加した方のファイルしか開くことができません。

パスの設定

さて、KAGシステムのsystem/Initialize.tjsでも同じように自動検索パスの設定をしています。

// kag3/templete/system/Initialize.tjs
0042: /*
0043:   パスの設定
0044:   後に指定した物が、より優先されて使用される
0045: */
0046: 
0047: 
0048: function useArchiveIfExists(name)
0049: {
0050:   // name が存在していたらそのアーカイブを使う
0051:   var arcname;
0052:   if(Storages.isExistentStorage(arcname = System.exePath + name))
0053:     Storages.addAutoPath(arcname + ">");
0054: }
0055: 
0056: Storages.addAutoPath(System.exePath + "video/"); // exePath 以下の video/
0057: Storages.addAutoPath("video/"); // video フォルダ
0058: Storages.addAutoPath("others/"); // その他
0059: Storages.addAutoPath("rule/"); // ルール画像フォルダ
0060: Storages.addAutoPath("sound/"); // 効果音フォルダ
0061: Storages.addAutoPath("bgm/"); // BGM フォルダ
0062: Storages.addAutoPath("fgimage/"); // 前景画像フォルダ
0063: Storages.addAutoPath("bgimage/"); // 背景画像フォルダ
0064: Storages.addAutoPath("scenario/"); // シナリオフォルダ
0065: Storages.addAutoPath("image/"); // そのほかの画像フォルダ
0066: Storages.addAutoPath("system/"); // システムフォルダ
0067: 
0068: // パッチアーカイブの検索と使用
0069: // もしこれらの名前を持ったアーカイブが実行可能ファイルと
0070: // 同じ場所にあった場合、それを優先して使う
0071: useArchiveIfExists("video.xp3");
0072: useArchiveIfExists("others.xp3");
0073: useArchiveIfExists("rule.xp3");
0074: useArchiveIfExists("sound.xp3");
0075: useArchiveIfExists("bgm.xp3");
0076: useArchiveIfExists("fgimage.xp3");
0077: useArchiveIfExists("bgimage.xp3");
0078: useArchiveIfExists("scenario.xp3");
0079: useArchiveIfExists("image.xp3");
0080: useArchiveIfExists("system.xp3");

57行目から66行目までKAGシステムのテンプレートに最初から入っているフォルダを自動検索パスとして追加しています。このことにより、吉里吉里/KAGでのゲーム開発ではフォルダの存在を気にすることなくファイル名を指定できます。その代わり、自動検索パスは後に追加した方が優先されるため、同じ名前のファイルが存在した場合、なんらかの不具合がでてくる可能性があります。テンプレートで用意されているフォルダは、画像やシナリオを管理しやすいようにあらかじめ用意されていますが、実際はどのフォルダにいれても大丈夫です。もし、管理しやすいように新しいフォルダを作るときはこの場所で自動検索パスの設定を行います。

71行目からは、アーカイブ化したものが実行ファイル(krkr.eXe)と同じ位置にあれば追加検索パスに追加しています。フォルダよりも優先されます。また、56行目で実行ファイルの位置にあるvideoフォルダも追加しています。動画ファイルはファイル容量が大きいため、アーカイブ化しなくても直接読み込めるようにしています。

パッチの適用

さて、リリース後の作品に修正の必要があるときに、修正後の作品自体を配布するのではなく、修正点のみをまとめたものを配布することがあります。その修正点をまとめたものをパッチといいます。パッチは修正点のみなのでインターネットで配布しやすいのと、作品自体は有料のものもあり本体をまるごと配布することができないこともあるため、パッチが利用されることが多々あります。

// kag3/templete/system/Initialize.tjs
0082: useArchiveIfExists("patch.xp3");
0083: 
0084: // 追加のパッチ用アーカイブの検索
0085: for(var i = 2; ; i++)
0086: {
0087:   // パッチ用アーカイブ patch2.xp3, patch3.xp3 ... がある場合はそちらを
0088:   // 優先して読み込むように
0089:   if(Storages.isExistentStorage(System.exePath + "patch" + i + ".xp3"))
0090:     Storages.addAutoPath(System.exePath + "patch" + i + ".xp3>");
0091:   else
0092:     break;
0093: }

patch.xp3があれば自動検索パスに追加し、patchX.xp3があれば順に読み込んでいきます。

パッチはKAGシステムのフォルダより後に自動検索パスに追加しているため、より優先して検索されます。つまり、patch.xp3>first.ksがあれば、scenario.xp3>first.ksよりも先にpatch.xp3>first.ksが検索され適用されます。同様にpatch2.xp3>first.ksがあればより優先されて使われます。このようにKAGシステムにおけるパッチは、ファイルを上書きする形で修正していきます。

サブフォルダの作成

たまにファイルの管理のために、scenarioフォルダやfgimageフォルダの中にサブフォルダを作っている人もいるようです。開発時はさほど問題は生じませんが、あらかじめsystem/Initialize.tjsで適切に設定していないと、パッチをリリースする際に多少問題が生じます。(というよりこの方法は公式ドキュメントをはじめ、参考書などでも詳しく説明されていないので、後から問題が発覚するということが起こるようです。)

たしかにサブフォルダの作成にはメリットがあります。先ほどの述べたとおり開発者がファイルの管理がしやすいということが挙げられます。そして自動検索パスのデメリットである、同じ名前のファイルの指定ができないということを解決するからです。

project\
  scenario\
    first.ks
    risa\
      ending.ks
    maki\
      ending.ks
  test\
    first.ks

上記のようなファイル構成をとってあり、scenarioフォルダ以外は自動検索パスに登録されていないとします。そのときは、カレントフォルダ及び自動検索パスに登録されているscenarioフォルダから検索してみつかるように指定します。

; scenario/first.ks
[link storage="risa/ending.ks"]りさ編[endlink][r]
[link storage="maki/ending.ks"]まき編[endlink][r]
[r][r]
[link storage="test/firsk.ks"]テスト[endlink][s]

このとき、パッチをあてるにはpatch.xp3>risa/ending.ksが存在するようなパッチを作る必要があります。同様にpatch.xp3>test/first.ksのようにする必要があります。つまりパッチのアーカイブの中にrisaとtestというプロジェクトフォルダでは別の場所にあるものを同じ場所にもってくる必要があります。

さて、それではあらかじめsystem/Initialize.tjsで適切に自動検索パスに追加したときはどうなるでしょうか。位置としては、パッチの適用(82行目)よりも前に書く必要があります。そうすると、結局同じ名前のending.ksは後にパスを追加した方しか使えません。吉里吉里/KAGでの開発をする際は、ファイルの名前はフォルダに関わらず一致しないようにすることが、無難なようです。

また、サブフォルダの作成も控えた方がいいでしょう。もしサブフォルダを作りたいのならば、(たとえば)scenarioフォルダを削除して、プロジェクトフォルダの下にrisa_ksフォルダを作った方がよいです。そもそもscenarioフォルダなどはあらかじめ用意してくれていますが、そこにKAGシナリオファイルを入れる理由はありません。よって、フォルダを作りたいのならサブフォルダである理由もありません。

その際は、ちゃんとInitialize.tjsで設定しておくようにしてください。first.ksやAfterInit.tjsで記述していると、Initialize.tjsで自動検索パスに追加したpatch.xp3よりも後に追加していることになり、パッチの中のファイルが適用されなくなります。また、パッチを読み込んでいるのがInitialize.tjsなので、Initialize.tjs自身にパッチをあてることはできません。とまあ、いろいろな問題があります。公式のチュートリアルに書かれている以上のことを(よく言えば工夫して、悪く言えば勝手に)するのならば、自身でサポートできるレベルにしておきましょう。

 
inside/path.txt · 最終更新: 2009/03/08 18:14 by tohka