トップページへ戻る


リプレイさせよう!
 
「んねーねー」

「またそれか。今度は何だ?」

「すきゃんてぃ、思ったんだけど」

「何をだ?」

「んとねー、たとえば『かまいたちの夜』でわ、我孫子ちゃんの隠しメッセージを見んと、不思議のペンションに行けんよねー!」

「そうだったっけ?」

「そーだもん! んでもって、すきゃんてぃも、『1999ChristmasEve』で、とあーる『えんぢんぐ』を見んと、不思議の教会に行けんよーにしたいんだなーこれが」

「なるほどね。それじゃ、やってごらん」

「んもー! やり方がわっかんないから聞ーてんぢゃんよもー! あんたってば、いぢわるぢゃんよもーばかー! でやー!」

「少しは自分で考えたかい?」

「考えたもん! 変数を使うんだもん! んでもって、とあーる『えんぢんぐ』を見んと、変数が1になって、フラグが立つんだもん!」

「お、いい線行ってるぞ」

「んでもって、次にゲームを始めんと、フラグが1だから、不思議の教会に行けんだなーこれが」

「それで? 行けたのか?」

「行けなかったんだもんねー! なんでかとゆーと、フラグを覚えさせとく場所がないんだもん! んだから、『えんぢんぐ』見てフラグ立てても、もっかいゲームを始めるとフラグが消えちゃってんだもん!」

「うん、その通りだ。それはどうしてかと言うと、フラグにゲーム変数を使っているからだ」

「なんなのかなー? それ」

「4日目の#1で、名前を入力させる時に文字変数をやったろ? あの時にちらっと説明したはずだよ。ゲーム変数とシステム変数があるって」

「あー! 思い出したもん! f. ではぢまるのがゲーム変数で、sf. ではぢまるのがシステム変数だったっけかなー? んでも、システム変数は教えてくんなかったぢゃんよもー!」

「ゲーム内の処理をする時は、全てゲーム変数で事足りるからだよ。システム変数は、さっきお前が言っていたように、見たエンディングと見ていないエンディングを記録したり、それによって分岐処理をさせる時に使うものなんだ。だから説明しなかった」

「ふーん」

「ゲームのシナリオを離れ、シナリオの外で働く変数が、システム変数だ」

「んで? 使い方わ?」

「ゲーム変数と全く同じだ。ただ名前の頭に f. じゃなくて sf. がつく」

「ふーん」

「システム変数は、ゲームを終了しても、ゲームをやり直しても消えない。一番よく使うのは、正にお前が言ったように、見たエンディングと見ていないエンディングを区別することだろうな」

「ほらーほらーやっぱそーぢゃんよもー! んでも、すきゃんてぃ、さっぱーりわかんないんだなーこれが。あんで覚えておく場所がないのにフラグが覚えてられんのかなー?」

「場所はちゃんとあるよ。それじゃ先に、KAGの変数の格納方法について説明しておこうか」

「それがいーもん」

「KAGのセーブデータは、こんなふうになる」

「これらのファイル群は、Config.tjs の下記の部分で設定した内容によって、名前と保管場所が決まる」


// 栞ファイルの前につくプレフィクス
// ここで指定した名前 + 栞番号 で、拡張子が .dat と .datg の
// ファイルが栞ファイルとなります。
// また、ここで指定した名前 + "g.dat" がシステム変数ファイルとなります。
// 栞ファイルは、吉里吉里実行可能ファイルと同じ場所に置かれます。
dataName="1999ChristmasEve";


// セーブデータ保存場所
// 吉里吉里の実行可能ファイル ( krkr.eXe ) からの相対パスで指定します。
// 無指定の場合は実行可能ファイルと同じ場所に作成されます。
// たとえば "savedata" とすると吉里吉里の実行可能ファイルの下の
// savedata というフォルダに作成されます。
// フォルダはあらかじめ存在する必要がありますので注意してください。
// 特に配布するときに、アーカイバの中には空のフォルダを展開しない物が
// あるので・・・
saveDataLocation="savedat"; // 1.5

「ふーん」

「で、ファイル群の末尾に0〜5の数字がついているものは、単純なセーブデータだ。吉里吉里のメニューから『栞をはさむ』を選ぶと生成される」

「んでも、.dat.datg の2こあんよ?」

.dat には、セーブした場所の主にシステム的な情報が記録される。マクロ定義情報なんかもここに書かれる」

「それでー?」

.datg の方は、ゲーム変数のみが記憶される」

「ふーん」

「さて、もう一度ファイルリストを見てみよう。他にもいくつかファイルがあるよね」

「んと、999と、1000ってやつが2こづづあんもん!」

「それじゃまずは999番のセーブデータから説明しよう。これは自動保存された栞だ。Config.tjs の以下の部分で自動保存を true にしておくと、最後に通過したセーブポイントで自動的にデータがセーブされる」


// 自動栞保存
// autoStore=true; とすると、
// セーブ場所となるラベルの箇所で栞を自動保存します。
// true とすると、[栞をたどる] メニュー内に
// [つづきからはじめる] という項目が増えます。
// 栞は栞番号 999 番に保存されます。
// readOnlyMode を true にした場合は、autoStore は true に
// はしないでください。
autoStore=true; // 1.3

「ふーん。んでも、ここにもシステム変数は書かれてないねー」

「うん。このセーブファイルは、0〜5のファイルと同じ内容で、自動セーブされた点だけが違う」

「わかったー! それぢゃー、シナリオの外でもシステム変数を覚えてんのわ、1000番のやつぢゃんよもー!」

「いや、違う。1000番のファイルには、ゲームの『最初に戻る』というメニューコマンドが実行されたときに戻るべき場所のデータが書いてあるんだ。Config.tjs の下記の部分を true にし、ゲームスクリプト内に [startanchor] というタグを記述すると生成される」


// 「最初に戻る」メニューの表示・非表示
// true に設定すると
// [システム|最初に戻る] メニューが表示されます。
// このメニューが選択されると、
// [startanchor] タグのあるラベルの位置に移動します。
// その栞において、[startanchor] タグをまだ通過していない場合は
// このメニューは使用不可になります。
// startanchor 位置の情報は栞番号 1000 番に保存されます。
// [startanchor] タグはセーブ可能なラベルの直後に記入してください。
// readOnlyMode を true にした場合は、showGotoStartMenu は true に
// はしないでください。
showGotoStartMenu=true; // 1.2

「そんな [すたーとあんちょる] なんてタグ知んないもん!」

「ゲームの最初に戻りたくなった時に、どこが最初なのかわからないと戻れないだろ? だからアンカーを打つんだ。もし使うならスクリプトの一番最初にあるセーブポイントラベルの直後に書いておくといい」

「んー、そーすんと、システム変数を覚えてんのわ、どれかなー?」

「残された最後の一つだ」

「わかったー! 一番最後の 1999ChristmasEveg.dat だねー!」

「その通り。……って、最後の一つだから当たり前だけど」

「むー!」

「たとえば、これをエディタで開いてみるとこんな記述がある」

「5行目から9行目の dend**aend** に注目だ。これが実はシステム変数なんだ」

「んー、そこを作ったのわすきゃんてぃぢゃないから、ぜんっぜんっわかんないもん」

「これは、元のスクリプトを見るとこんなふうに書いてある」

(前略)

「一晩中、守ってくれて、ありがとう。[emb exp=f.name1]」[p]
[wait time=2000]\
[scenechange storage="00"]\
[eval exp="sf.aend17=1"]\
[jump storage="xmaseve_credit.ks" target=*ending02]\
[s]
;---------------------------------------------------

(中略)

「帰ろう[emb exp=f.name1]! あたし達の町へ!」[p]
[wait time=2000]\
[scenechange storage="00"]\
[eval exp="sf.aend13=1"]\
[jump storage="xmaseve_credit.ks" target=*ending04]\
[s]
;---------------------------------------------------

(中略)

「遠い西の国に」[p]
[wait time=2000]\
[scenechange storage="00"]\
[eval exp="sf.aend04=1"]\
[jump storage="xmaseve_credit.ks" target=*ending07]\
[s]
;---------------------------------------------------

(中略)

[emb exp=f.name2]……君だけは、逃げてくれ……[p]
[eval exp="sf.dend18=1"]\
[eval exp="f.stories=10"]\
[jump target=*deathend]\
[s]
;---------------------------------------------------

(以下略)

「『1999ChristmasEve』には、生還するアライブエンドと、死亡するデスエンドが、合計で30種類近くあるが、どのエンディングを見たかは、上のスクリプトの黄色い部分でシステム変数に覚え込ませているんだ」

「なるほどねー」

「これらの情報は、さっきの 1999ChristmasEveg.dat の中に書き込まれる。ちなみにこのファイルは、ゲームを起動すると真っ先に読み込まれる。つまり、セーブデータをどこからロードしようが、最初からやろうが、システム変数はきちんと全体に影響を与えられる状態で存在できるってわけだ」

「わかったもん! ゲーム変数もシステム変数も使い方わ一緒だけど、記録される『はいる』が違うんだねー。んで、その『はいる』が読み込まれるタイミングも違うんだねー。ゲーム変数の記録されたやつわ、セーブデータをロードすんと読み込まれんけど、システム変数の記録されたやつわ、ゲームを起動すんと読み込まれんだねー!」

「そういうこと」

「それぢゃー、それで不思議の教会に行けんかなー?」

「行けるよ。sf.end みたいなシステム変数を作っておいて、それをエンディング後に1なり指定の数にしてやればいい。あとは、ゲームのイントロ部で、そのシステム変数が1なり指定の数だったら、隠しシナリオにジャンプするようにIF条件分岐を書くだけだ」

「あんで『1なり指定の数』なんてゆーのかなー?」

「これは嫌らしい考えに基づくインチキ防止策だから、ここで詳しくは説明しない。気になる人は、『横浜かまいたちファンクラブ』のゲームの部屋から『1999ChristmasEve』の中に進み、『製作総指揮PIA少尉はかく語りき』の『変数制御』の項を見てくれ」

「ふーん」

「システム変数を上手に使えば、こんなこともできるってことを最後に見せておこう」

「誰が作ったのかなー? すきゃんてぃこんなの知んないよー!」

「それはどうでもいい。とにかくこんなふうに、エンディング到達度をシステム変数を使って表示することもできるわけだ。見たエンディングは白で表示され、まだ見ていないエンディングは灰色で表示される」

「ふーん」

「『1999ChristmasEve』が成功したとは言えないけど、システム変数を使えばプレイヤーに『もう一回やってみよう』と思わせることもできると思うよ。KAGを使ってゲームを制作する皆さんは、ここで勉強したシステム変数を駆使してもらって、何度でもプレイしたくなるような楽しいゲームを作ってもらいたいよね」

「そーだねー」

練習日記 8日目 まとめへ


トップページへ戻る