シナリオ作成 「d_scenario」

対応バージョン テキストゲームメーカー Version 0.9708

  ※ ここでは、テキストゲームにおいて、一番重要であるシナリオ記述について解説しています。
 なお、テキストで読みたい方向けに、このページのテキスト版も作ってあります。持って帰ってもらってかまいませんし、HTMLの方も、ほとんど単体で動きます。

目次

 1:シナリオについて

 1-1:シナリオ記述について

 1-2:シナリオの特徴

 1-3:プログラム動作におけるシナリオ処理について(中・上級者向け)

 2:シナリオの基本的な書き方

 2-1:まずはシナリオを動かしてみよう

 2-2:メッセージを出してみる

 2-3:シナリオ中で音を鳴らす

 2-4:シナリオナンバージャンプ

 2-5:シナリオ分岐をする

 2-6:お金・コイン・預金について

 2-7:条件分岐

 2-8:代入

 2-9:パーティメンバーの取り扱い

 2-10:装備品を操作する

 2-11:キャラのHPなどを操作する

 2-12:シナリオの装飾

 3:高度でうまいシナリオの書き方

 3-1:読みやすいシナリオの書き方

 3-2:サブルーチンについて

 3-3:シナリオジャンプに確率を設定する

 3-4:メッセージに変数を使う

 3-5:シナリオのファイルサイズと処理速度の問題について

 3-6:モードを活用する

 3-7:エクセルを活用する

 4:文法リファレンス

 5:サンプルシナリオ


 1:シナリオについて

 1-1:シナリオ記述について

  テキストゲームにおけるシナリオ記述は、中でも最も重要な部分です。なぜかと言うと、他の部分は省略しても表示や音がおかしくなる程度ですが、シナリオなしでは全く動きません(正確には動きますが、シナリオを無限探索するので、事実上フリーズします)。
 そのため、いかなる形態のゲームを作るにしても、シナリオを書かなければお話になりません。クイズにせよ、小説にせよ、何をするかは作成者が教えてあげるのがパソコンのルーツですからね。
 そして、ゲームのジャンルにもよりますが、シナリオ作成は、最も時間がかかる部分であり、なおかつ最も作成者が自由にいじくれる部分です。他の部分はある程度縛られているため、省略しても一応動きますが、シナリオは基本的に一切の省略を許しません。
 と、難しそうな事を連ねていますが、実際にやってみると、けっこう楽しいです。そしてそれが難しいかどうかは、実際に書いて動かしてみるのが手っ取り早いです。

目次に戻る

 1-2:シナリオの特徴

  シナリオ記述では、前節でも書いた通り、作成者が唯一、自由にデータを作成する事ができる部分です。嘘だと思うなら、シナリオだけ書いたデータを動かして下さいね。
 また、基本的に全ファイル中最も大きなファイルサイズになります。100KBを超える事が普通に起こるので、それに対応したエディタを準備しておくといいです。特にメモ帳では遅くてお話になりません。

目次に戻る

 1-3:プログラム動作におけるシナリオ処理について(中・上級者向け)

  ゲームを開始すると、プログラムカウンタは、シナリオナンバーを1ずつ増やしながら進みますが、独りでに動きが止まる事はありません。したがって、終了地点はこちらから指定する必要があります。
 一般のプログラムでは、コードは1行ずつ上から実行されるのに対し、テキストゲームでの動きはシナリオナンバーの低い順に動きます。そのため、シナリオ記述で、行を無視した記述が可能です。
 また、テキストゲームのコンパイラ(変換用.exe)において、コンパイル時に基本的なエラーメッセージは返しません。ただし、構文エラーなどはそれ自体が無視されるようになっているため、主なエラー修正は論理エラーとなります。

目次に戻る

 2:シナリオの基本的な書き方

 2-1:まずはシナリオを動かしてみよう

  いきなりこんなタイトルになっていて、少々驚いたかもしれません。が、ぐだぐだ説明するより、動かしてみる方が格段にわかりやすいのは事実です。
 というわけで、簡単なシナリオを作り、さっそく動かしてみましょう。下の内容をコピーし、シナリオデータに貼り付け、「変換用.exe」を実行して下さい。

ソース:

 動かしてみると、いきなりタイトル画面っぽいものが表示され、「開始」を選択すると、「こんにちわ。いいお天気ですね。」と画面に表示され、もう一度エンターキーを押すと終わりました。
 たった一言のメッセージを表示しただけのように見えますが、あなたはすでに、一つのプログラムを作ったのです。正確には、プロローグ部からタイトル画面へ飛び、メッセージを出し、プログラムを終了させるという3つの仕事をしています。
 プログラムというのは、正確な定義として、「何か一つでも仕事をすればプログラムになる」と言われています。ここでは、欲張って3つも仕事をしましたので、十分過ぎるかもしれません。
 というのは、だいたいどのプログラミングマニュアルにも書いてあります。マニュアルというのは、だいたい初めはこんなものです。それだけ、簡単にでき、難しい事は、やり込む中で覚えていきます。

目次に戻る

 2-2:メッセージを出してみる

  さて。2-1でいきなりシナリオを動かしたわけですが、ここからはそこで使った事柄について、詳しく説明したいと思います。
 まずは、最も基本となる、メッセージ表示です。以下のシナリオをコピーし、動かしてみましょう。

ソース:

 前回とほぼ同じようですが、エンターを押すごとに、メッセージが切り替わり、3つ表示して終わったはずです。
 ここで言う「s1m=」とか「s3m=」とかいうのが、メッセージを表示しろ!という命令です。初めにある「s1」とか「s2」はシナリオナンバーなので、実際の命令は「m=」だけなんですが。
 この命令を使えば、好きなメッセージを好きなだけ画面に表示させる事ができます。エンターを押すだけで進む小説を作るなら、基本的にこれだけを列挙すれば、片付いてしまいます。

 ただし、メッセージを表示できる画面の制約上、380バイト(日本語全角190文字)もしくは、6行を超えるメッセージでは、一度に出す事ができません。もしやってしまうと、メッセージが2つに分かれてしまい、少し変な事になります。
 尤も、380バイトにもなるメッセージを一度に出す事は、基本的にないと思います。実際に作ればわかると思いますが、見ても読んでも疲れます。また、小説からRPGを作る場合は、文体が会話長になるため、意識しなくても380バイト以下に収まります。
 先ほどのシナリオだって、無理やり3つにしなくても、十分収まります。下の部分をコピーし、動かしてみて下さい。一発で全部表示し、終わります。

ソース:

 文字数をかぞえたら、僅か153バイトでした。しかし、何か変な気がしたかもしれません。一気に聞いた場合はそうでもないですが、なぞり読みしてみると…
 どうやら、全部のメッセージが一行に繋がっているようです。いくら詰めてシナリオを書いても、全部繋がっているのは、なぞり読みに不向きですね。また、あえて開業してインデントを考えたいと思う事もあるでしょう?

 では、以下のようにすれば、開業されてめでたしめでたしになるのか?やってみましょう。見た感じ、開業されているので、うまくいきそうですよね。

ソース:

 アレレ?一行だけ出たけど、あとが出ませんでしたね。もしかして、ゲームが壊れているのかな?
 実は、改行するには、行を変えるのではなく、改行したい部分に半角ドル($)を付ける事になっているのです。これは、行頭がsで始まるものを命令とみなし、その他は切り捨てるというテキストゲームの使用です。
 なぜ半角ドルを改行と見なすのかですが、おそらく半角ドルは正規表現で行末を意味している事からだと推測しています。行末を指し示しているのですから、その次の文字は次の行に来るべきでしょう?ちなみに、そのような正規表現での検索・置換のできるソフトウェアを私は聞いた事がありません。
 ともかく、上野ものを半角ドルに直して動かしてみましょう。今度は正しく表示されるはずです。

ソース:

 これで正しく表示されました。が、なぜか「絶好の一日となるでしょう。」の最後の句点だけが次の行になってしまいました。これは、一行が67バイト(日本語全角33文字)で折り返す使用なので、どうしようもありません。
 というわけで、文章構成も少しは意識した方がいいと思います。でも、一々やっていると手間がかかるので、まずはシナリオを書いてしまい、動かした時に気になれば治す程度でよいでしょう。

目次に戻る

 2-3:シナリオ中で音を鳴らす

  テキストゲームでは、テキストと音で構成したゲームを作る事ができます。というわけで、この節では音を鳴らす方法について説明します。
 と言っても、特に難しい事はなく、鳴らしたい音を順番に書いていくだけです。下記の例を動かしてみましょう。

ソース:

 「s2音=」などの「音=」が、まさしく音を鳴らせ!という命令です。その後に、鳴らしたい音ファイル名を記述します。音ファイルは、「soundフォルダ」の中に入れた効果音です。
 Waveファイルでは1〜200および、1001〜2000、Midiファイルは201〜400、MP3は2001〜3000までの間でファイルを決めます。そして、-1を指定すると、その場で流れている全ての音を停止します。また、Midiを再生させると、その時に鳴っていた音全てが停止されます。

目次に戻る

 2-4:シナリオナンバージャンプ

  さて。さんざんメッセージを出して遊んだわけですが、前節で紹介したシナリオには、全く同じ命令が、もう一つ隠れています。二つあるように見えますが、実際には同じものです。
 この節で紹介するのは、「s-1000go=」とか「s2go=」などにある「go=」という命令です。これは、特定の部分へジャンプしろ!という命令で、メッセージと同じくらい多く使うと思います。
 下記は、シナリオジャンプを繰り返しながらメッセージを出し、そして終わるという例です。わからない人は、コピーして動かしてみて下さい。

ソース:

 動かしてみると、結局はメッセージが6つに分かれて表示されただけです。とても無駄そうですから、試しにジャンプ部分を削って最小限のものにしてみました。興味のある方は動かしてみてもかまいませんが…

ソース:

 動かしてしまった方はご愁傷様でした。だんだん操作時間が長くなり、最後の方はもはやフリーズ同然に待たされたと思います。シナリオ自体には何の問題もないのに、ジャンプを省いただけでそうなってしまったのです。
 このように、ジャンプをすると、途中の部分を省き、指定した所までジャンプします。こうする事によって、途中のシナリオを省いたり、シナリオとシナリオの間を通る時間を短くできるのです。

 えっ、途中に何もないのに、何でジャンプしないと遅くなるのか?ですか?それは、コンピュータが途中にシナリオがあるかないかを一々確認してから次へ進むからです。
 シナリオデータは、作成者が自由に命令を決め、動きを自由に決められるという特徴があります。が、その代償として、シナリオナンバーは常に連続していて、コンピュータは、任意のシナリオナンバーに命令があるかないかを一々調べる手間が生まれたのです。
 つまり、シナリオ1でメッセージを出してからシナリオ11のメッセージがあるまでの2から10までの部分は省略したのに、機械は2から10にも何かあるかもしれないと探索をするのです。その時間が、上の実行結果に出ます。
 一応、ゲームの処理速度は高速で、50とか動いてもほとんどわかりません。しかし、その間が大きければ大きいほど、時間はかかります。諸熊がたまに出すフリーズ現象も、ほぼこれが原因で、いずれは治りますが、30〜1時間は動けません。

 なお、「s-1000go=-1」というのは、プロローグ部として特別に用意された部分から、ゲームタイトル画面にジャンプする事を指しています。以後、プロローグからのジャンプは省く事にしますが、もし怖いなら「d_start」にある「stナンバー=-1000」を、「stナンバー=-1」に書き改めておくといいです。

 ところで、上野ようなシナリオを書くのなら、もともとジャンプをする必要はありません。なぜなら、メッセージを詰めて書けば、ジャンプなんかしなくてもまともに動くからです。
 では、下のシナリオを動かしてみましょう。ちょっと変わった動きをし、何となく市販されているプログラムっぽくなりそうな予感がします。

ソース:

 シナリオナンバーに従うとすると、普通なら下に記した順序でメッセージが表示されるはずです。しかし、そんな事にはならず、まともに終わってしまいました。


 皆さん、おはようございます。
 というわけで、授業を終わります。お疲れ様でした。
end


 これでは、いったいこの人は何をしたのかがわかりません。そもそも、授業をするなどというシナリオは、書かれているのに出てこないという不思議な事が起こるでしょう。
 このように、ジャンプを使えば、シナリオの順序を変えて表示する事もできます。さらに言うと、シナリオジャンプを使えば、シナリオナンバーの順にゲームが進むという制約を裏切ったシナリオが作れてしまいます。
 でも、上野ような例だったら、初めから順に表示されるようにした方がはるかに効率的です。ジャンプを使うため、無理やり書いたようなものです。

 シナリオジャンプの本当の使い方は、バトルや宿、倉庫などを使用する時や、ゲームを終わらせる時、あとは後に紹介する分岐命令と組み合わせる事で威力を発揮します。
 一応、下記にバトル・宿・店・宿屋・カジノ・銀行・倉庫を経由し、最後にセーブ画面を出して、シナリオが終わる例を記します。RPGを作る場合はどれもお世話になると思います。

ソース:

  ※ 「go=」で指定した所へジャンプする際、その確率も指定できます。が、それについては3-3節の部分で詳しく説明します。

目次に戻る

 2-5:シナリオ分岐をする

  前節では、さんざん意味のないジャンプを繰り返してきました。が、今度は意味のあるジャンプを使う事になります。まぁそれがこの節の本目的ではないのですが。
 ここでは、ついにシナリオの分岐について説明します。分岐を使えば、プレイヤーの選択によって、ストーリー進行などを変えたりする事ができます。
 下記は、出された質問に対し、はい か いいえ で答えるシナリオです。もちろん、答えによって、その後のメッセージが変わります。

ソース:

 コレを動かすと、「はい」と答えない限り永遠に終われません。朝ご飯をどうしても食べないというなら、F4などでリセットしたり、強制的に終わらせて下さいね。
 ここで出てきた「s2?=」とか「s8?」とかが、この節で取り上げる「分岐命令」です。と言っても、分岐命令は他にもいろいろあり、ここでは「はい いいえ」から選ぶ2択型の分岐命令です。
 分岐命令では、「はい」を選んだ時と「いいえ」を選んだ時、どのシナリオにジャンプするかを記述します。2つの内容を書くわりに、1つしか見られないので無駄が出るわけですが、プログラムなんてしょせんそんなものです。
 ところで、ジャンプ先のシナリオナンバーが、ここでは3と6になっていますが、もちろんコレは書き換えてもかまいませんし、両方とも同じでもかまいません。ただし、両方とも6にすると、無限ループになって、強制終了以外の方法では終われなくなるかもしれません。

 さて。はい と いいえ だけでは飽きるでしょう。今度は、選択肢の名前を自由に変えられ、なおかつ2択以上にもできるものをご紹介します。以下のシナリオを動かしてみましょう。

ソース:

 天気を聞かれますが、「知りません」と答えない限り無限ループになります。また、「知りません」と答えると、何も言われずに終わってしまいます。困った質問人ですね。
 ここで取り上げた「s2?6=」の部分が、選択肢を最大6つまで作り、分岐を作れ!という命令です。まず、分岐先となるシナリオナンバーをコンマを挟んで列挙し、半角アットマークを置いて、それぞれに対応する選択肢の名前を半角ドルで挟んで列挙します。
 このようにすれば、4択クイズなどは簡単に作れます。なお、選択肢が7個以上必要な場合は、「次へ」とか「前へ」などを置き、複数のシナリオを使って選択を行き来できるようにする事になります。

 ところで、諸熊のテキストゲームなどで見られる「話す調べる」とか「装備」などのある選択肢は、この方法で作っているのか?という質問がたまに来ます。が、実はこの方法では作れないのです。なぜなら、シナリオ中で装備変更などを出す命令そのものがないからです。
 その代わりになるものが、今から紹介する「コマンド」命令です。コレを使えば、諸熊が使っている例の選択画面を一度に出してくれるので、主にRPGを作る人にとって、なくてはならないものになると思います。

ソース:

 ここで使われた「s1選択=2」というのは、セーブ可能なコマンド選択画面を出せ!という命令です。もし、セーブさせたくない場合は「s1選択=1」というように書き改めます。
 そして、「s1話=」と「s1移=」と「s1save=」というのを、セットで使います。「s1話=」では、「話す調べる」を選んだ時の話し先、「s1移=」では、「移動」を選択した時の移動先を選択できるようにします。選択肢の作り方は「s2?6=」と全く同じです。
 「s1save=」では、そのデータをロードした時、どのシナリオナンバーから始めるかを記述します。これがないと、セーブする時、たまたまメモリにあった情報を書き出してしまいます。それをロードすると、恐ろしい事が起こりますので、注意して下さい。
 なお、「s1話=」とかは省略する事ができます。これを省略すると、その部分の選択ができないようになります。さらに、「s1移=」も省略すると、そこから進めなくなり、上記の場合は無限ループになります。
 通常、シナリオには1シナリオ1命令という規則があり、「s1m=おはよう」と「s1m=ヤッホー」と列挙する事はできません。しかし、コマンド選択画面の場合は例外で、同じシナリオナンバーで複数の指定ができます。これは、「s*選択=」が命令なのに対し、「s*話=」などはそれに付随する属性である事を表しています。

目次に戻る

 2-5:アイテム・スイッチ・倉庫アイテムについて

  この節では、やたらと紹介する内容が多いように見えます。が、実際にはそれほど多くありません。なぜなら、皆似たもの同士で、一つ覚えればほぼ全てが覚えられるからです。
 アイテムとは、ゲーム上では「d_item」のデータに記述した物を指します。アイテムにしろ道具にしろ、はたまた魔法にしろ、シナリオ上では全て「アイテム」として扱う事にしましょう。でも、解釈は自由にどうぞ。
 スイッチとは、シナリオの中だけで使う特殊な変数です。スイッチを使うシナリオは、主に後ほど紹介する条件分岐の部分で威力を発揮します。プログラム的には、この使い方がメインになると思います。
 倉庫とは、手持ちのアイテムを入れたり出したりできる所です。と言っても、ここで紹介するのは、その中にあるアイテムの取り扱いについてです。倉庫の中のアイテムも、通常のアイテムと同様に扱います。  以下の例では、アイテム1番を手持ちに入れます。なお、手持ちに入る前と後にコマンド選択画面を出すので、そこでアイテムが入っているかを確認できます。

ソース:

 「s3i+=」の「i+=」が、アイテムを増減させる命令です。まず、該当するアイテムのアイテムナンバーを記述し、続いてその加減個数を記述します。ここでは、アイテム1番を4個増やす事ができました。
 この命令では、アイテムの増減を列挙する事もできます。下のように記述すれば、一度に複数のアイテムを増減させる事ができます。


s5i+=1,2,11,29,18,4,27,-19,181,3,221,-4
アイテム1を2個、11を29個、18を4個、27を-19個、181を3個、221を-4個増やす。


 ここで、マイナス3個増やすという変な表現があるように見えます。が、これは正しくて、全てのアイテムが減るからといって、「s5i-=」という命令を書いてはいけません。
 皆さんが使っているコンピュータは、計算をする際に、加算機は持っていても、減算機を持っていないのです。つまり、数を引くという概念がないので、不の数を加算する事で減算を実現しています。
 また、乗算や除算も同様に加算で行えます。乗算では、指定の数を指定回数加算する事で行えますし、除算では、逆数を掛ける事で求まるので、結果は加算で片付いてしまいます。
 というわけで、当然テキストゲームでのアイテムの加減にも、乗算や除算は使えます。ただし、「s*i/=」などという命令は存在しないので、加減個数の部分に記号を付け足して現します。


s6i+=1,*5 アイテム1を5倍する
s7i+=11,/3 アイテム11を3分の1にする


 この節の初めに、一つ覚えると、あとはほぼ全て覚えたも同然と書きました。倉庫のアイテムやスイッチの取り扱いにおいても、上記の要領で記述する事が可能なのです。
 以下の例では、まずアイテムが手持ちに入り、続いてそのアイテムが倉庫の中に移り、最後にそのアイテムが消えてなくなる例です。

ソース:

 まず、手持ちにアイテムがあり、それが倉庫に移り、そして最後には消えてしまいました。これで全てが丸く収まりましたが、倉庫の中にあったアイテムは、いったいどこへ行ってしまったのでしょうね?
 さて、何気に見てみると、「s15倉=1,0」という不思議な命令がありました。コレは、倉庫の中のアイテム1の個数を強制的に0にしろ!という命令です。
 アイテムの個数を加減する時と同じように、指定したいアイテムナンバー、それに続いて固定する個数を記述します。またコレも、複数列挙する事ができます。
 「s15倉+=1,-4」と記述しても問題はありません。しかし、何かの手違いでアイテム1が5個以上になっていたとすると、1個残る事になります。それじゃさすがに気分が悪いですよね?

 最後に、スイッチについて説明します。と言っても、記述する方法や内容はほぼ同じで、該当するスイッチナンバーを加減したり、その値を固定する事ができます。
 しかし、スイッチナンバーというのはアイテムと違い、決して表面には現れません。そのため、アイテムや倉庫の中身のように使っても、あまり意味がありません。ここでは記述方法だけに止め、条件分岐の所で深く説明します。


s21/=1,1 スイッチ1に、1という値をセットする。
s100/+=21,-2 スイッチ21の値に-2を加算する。


目次に戻る

 2-6:お金・コイン・預金について

  この節も、2-5節同様、一つ覚えると全て覚えた事になります。それどころか、こっちはもっと純粋なので、何も迷う事がないと思います。
 お金とは、まさしくお金です。通常、戦闘で敵モンスターからお金を取得したり、店で道具などを売買する事で増減します。が、シナリオ中でも強制的にお金を増減させたりする事ができます。
 コインとは、カジノ(遊)の中で使う通貨のようなものです。普通は、カジノの中で増減させますが、ぜんぜん関係のない所でも増減させる事ができます。
 預金とは、手持ち残額が、所持金の最大値を超えた際、超えた分が自動的に入る所です。預金の出し入れは通常、銀行で行いますが、シナリオ中でも操作する事ができます。
 以下の例では、まず大金を握ってもらい、それを銀行やカジノでパーッと使ってもらいます。飽きたら終わって下さい。

ソース:

 楽しかったですか?初期設定だと、スロットだけがあると思います。もしそれに飽きたなら、高度なシナリオ技術を習得し、ゲームを作るか、新TSのヒルテクス、ALTERNATIVEのアリュアックカジノで遊んでて下さい。
 さて、あなたが握った100万という大金は、「s3金+=1000000」にて得たものです。「金+=」を使う事で、所持金を増減させる事ができ、増減値はその後に書きます。
 また、コインなら「c+=」、預金なら「預金+=」と書きます。試しに、上野シナリオのお金が入る部分を書き換え、遊んでみましょう。ただし、コインだけだと換金できないので、銀行にいっても無意味です。

 この部分でも、2-5節で紹介した乗算や助産はそのまま使えます。「s3金+=*10」などとすれば、お金が10倍になります。ドラクエなどに見られる「全滅後の金半分」は、「s*金+=/2」で実現します。
 なお、お金・コイン・預金ともに、0以下にはなりません。もし、お金を0にしたいなら、「s*金+=-2100000000」とでもして下さい。一瞬で終わります。

目次に戻る

 2-7:条件分岐

  たいへん長らくお待たせしました。いよいよゲームの醍醐味、条件分岐について説明します。プレイヤーが一定の条件を満たしているかどうかで、ストーリー進行などなどを変更する事ができます。
 まず、条件分岐にできる要素について説明します。条件分岐というくらいですから、何か判断できるものが必要です。もちろん、今までに紹介してきたほとんどの要素がこれに当てはまります。

- 条件分岐の種類 -

  1. アイテム個数… 一定個数以上持っているか?
  2. スイッチナンバー… 指定された値と一致するか?
  3. 倉庫内アイテム… 一定個数以上のアイテムが入っているか?
  4. 装備アイテム… 一定個数以上のアイテムを装備しているか?
  5. お金… 一定金額以上のお金を持っているか?
  6. コイン枚数… 一定金額以上のコインを持っているか?
  7. 預金… 一定金額以上の預金があるか?
  8. 戦闘勝利回数… 一定回数以上、戦闘に勝利しているか?
  9. 戦闘逃亡回数… 一定回数以上、戦闘で逃げているか?

- 条件分岐の種類ここまで -

 ほとんどが、「一定回数以上」という条件を満たしているかを判断しています。が、なぜかスイッチだけ仲間外れです。まぁともかく、これだけあるという事です、はい。
 ちなみに、「s*?6=」なども、一種の条件分岐である事には違いありません。指定された選択を選んだかどうかなのですから。ただし、統一感を優先するために、あえて2-4節の方で説明しています。
 なお、条件分岐って難しそうに見えますが、実は意外と簡単で、なじみ易いです。命令を見れば、いかにも条件分岐してるなぁって感じがすると思います。
 下記の例では、お金を1000円以上持っているかどうかを判断し、持っていなければお金が1000円になるまでもらい続け、そして終わる例を示します。

ソース:

 ずいぶん安いバイトですね。これが時給だったら、労働基準法違反で訴えられるでしょう。10分給だったならば、場所によってはかなりいいバイトかもしれませんが。
 さて、「s6もし金=1000,9」とありました。コレが、分岐命令です。もし、お金を1000円以上持っていたならば、シナリオ9へ飛べ!という命令です。持っていない場合は、そこが無視されて次へ進みます。
 コイン・預金・戦闘勝利回数などでも、ほぼ同様の記述で分岐する事ができます。なお、戦闘勝利回数は「もし全勝数=」、戦闘逃走回数は「もし全逃数=」と記述します。

 一方、アイテムなどの場合は、アイテムナンバー、個数、ジャンプ先という順で記述します。なお、「s*もしi=」での判断では、装備しているアイテムは除外されますので、装備アイテムは別に調べる必要があります。
 そして、スイッチを利用した分岐は、ここでようやく意味を持ちます。ストーリーを進める中で、一度しか起こらないイベントを書く時など、アイテムなどの個数で判断しているわけにはいきません。そんな時、コレを使います。
 以下、各書式の例です。わからない人は、これをコピーし、必要に応じて値を書き換えて使って下さい。


- 書式の種類 -

s*もしi=11,1,201 アイテム11を1個以上持っていたら、シナリオ201へジャンプする。
s*もし/=101,3,401 スイッチ101が3だったら、シナリオ401へジャンプ。
s*もし倉=4,99,1001 倉庫の中にアイテム4が99個あったら、シナリオ1001へ飛ぶ。
s*もし装備=281,1,251 防具アイテム281を、誰か1人でも装備していれば、シナリオ251へジャンプ。
s*もし金=10,51 お金を10以上持っていたら、シナリオ51へジャンプ。
s*もしc=130,1051 コインを130枚以上持っていたら、シナリオ1051へジャンプ。
s*もし預金=99999999,100001 預金が99999999以上あったら、シナリオ100001へ飛ぶ。
s*もし全勝数=300,750 300回以上、戦闘に勝利していたら、シナリオ750へジャンプ。
s*もし全逃数=50,137 50回以上、戦闘で逃げていたらシナリオ137へジャンプ。

- 書式の種類ここまで -

 ここで、プログラミング的な話をします。テキストゲームではIf文のみを使って、分岐命令を作る必要があります。また、論理和など、複数の条件を一度に判断する事ができません。
 もし、論理和を実現するなら、「s*もし〜〜=」を列挙し、一つでも合致すればジャンプというようにします。幸いに、Ifの入れ子の数は全く判断されないので、Breakなどを書き入れる必要はなく、ジャンプで抜けてしまいます。
 それから、1イベント1スイッチで物事を判断する場合、各スイッチにはどんなイベントを制御するのかを、専用にリストアップしておく事を推奨します。遠く離れた所で、同じスイッチを使うという不具合を減らす事ができますし、自分で後で読み返して、わかりやすいシナリオになります。

 スイッチを使うと、同じ事を何度も繰り返すような事もできます。以下の例では、同じ音を10回繰り返します。

ソース:

 まず、スイッチに繰り返す回数をセットしました。そして音が鳴った後に、スイッチの値を1ずつ減らしていき、回数が0になったら6へ飛んでend、飛ばなければ音の部分からやり直しという仕掛けです。
 このようにすれば、全く同じ事を何度もやる手間が省けます。コピペも疲れる時は、上記のように繰り返してみるのも手です。ただし、間違えると無限ループになるのでご注意下さい。
 続いての例は、宝箱を開ける例です。普通、宝箱は一度しか開かないので、まさにスイッチで判定します。

ソース:

 中には大きな飴玉が入っていました。しかし、今もし、飴玉を99個持っているために、持ち切れなかったら、どうなるのでしょうか?この場合は、闇に消えてしまいます。
 これではあまりにかわいそうです。せめて、持ちきれない時は箱を開けられないようにしてあげましょう。下記のようにします。

ソース:

 これで、まず手持ちの飴玉を処分すれば、箱が開けられるようになります。ちなみにもし、手持ちがいっぱいなら倉庫送りという事もできますが、要領は同じなので省きます。

目次に戻る

 2-8:代入

  シナリオを書いていくと、スイッチやアイテムの個数を交換したり、別のアイテム個数へ複写したりなど考える事があります。またRPGではキャラの名前を変えたくなります。
 そのような時には、本節で紹介する代入を利用します。代入とは一般的に、変数などに何か値もしくは、別の変数の中身を入れて保管しておく事を指します。

 ここでは例として、アイテムを一時的に没収し、最後に元に戻す事を考えます。新TSなどの闘技場を考えていただければピンと来るのではないでしょうか?
 単にアイテムを没収するだけなら「s*i+=」を使えば可能です。しかしこれでは、元に戻す時にどのくらい元に戻すかがわかりません。また途中でアイテムが増えたり減ったりする場合も影響が出ます。
 そこでまず、アイテム・スイッチの両方を監視して、アイテムを減らす一方でスイッチを増やし、アイテムがなくなったら抜けるというループを作ってみました。以下のようになります。

ソース:

 まずはアイテム1を20個、スイッチ51を0にします。そして処理を開始すると、アイテムが1個以上あればアイテム個数減、スイッチの値増を実施し、アイテム1が0個になった地点でs11に飛びます。
 s11で元に戻す処理を開始すると、スイッチ51の値が0でない場合はアイテム個数増、スイッチの値減を実施します。そして、スイッチ51が0になると初めに戻ります。終わる時はアイテム個数が0になっているんですね。
 これで代入処理と同じ事が実現できます。しかしこれには致命的な問題があります。それは、没収するアイテムが大量になると、上記シナリオを大量に書かなければならない事です。

 上のシナリオは限界まで詰めると、シナリオ9で作れます。が、アイテムが30個なら270、100個なら900のシナリオを要するため、時間もかかるし手間もかかります。
 そんな時、紹介する代入命令を使えば、上の処理を一発でやってくれます。以下の例をご覧下さい。

ソース:

 「s*代入=」というのが、今回紹介する代入命令です。代入元のアイテムかスイッチナンバー、代入先のアイテムかスイッチナンバー、代入する上限の順に記述します。アイテムとスイッチはナンバーの前にある「i」か「/」にて区別します。
 まず、「s6代入=i1,/51,99」にて、アイテム1の個数がスイッチ51に移動されます。アイテム1が0個になるか、スイッチ51の値が99になると、即座に処理は終了します。
 「s*8代入=/51,i1,99」では全く逆の事をやっています。ちなみに上限を10にすると、アイテム・スイッチの値が10ずつに落ち着くはずです。

 次の例として、アイテム1の個数をアイテム5の個数と同じにしたいと思います。この場合は、代入の上限個数を省略します。

ソース:

 「s3代入=i5,i1」により、アイテム5の個数がアイテム1の個数に複写されます。つまり、両方共に14個という状態になります。15個のアイテム1は「どこへ行ったんでしょうね?
 実は大量のアイテムやスイッチを移動する場合、移動の対象にするものを移動先に全て複写し、移動元の値を一気に0にする方が処理速度が速いです。これは、アイテムなどを移動する時に、内部的にループが使われているからだと思います。
 まずは、単純にアイテム1から10までの個数を、スイッチ1から10までに移動します。これは、けっこう時間がかかります。

ソース:

 続いて、アイテム1から10までの個数をスイッチ1から10までに複写し、アイテム個数をまとめて0にします。動きはほぼ同じになるはずですが、時間が違うはずです。

ソース:

 ただし、複写する場合には前の値は消えてしまいますので、スイッチ1から10の値が0である事が条件になります。闘技場など、一時的にぼっしゅうするためにスイッチを確保してある場合、素早く処理できる利点があります。
 最後に、いよいよ名前変更について触れたいと思います。名前変更には、作成者が任意で決める方法と、プレイヤーが任意で決める2通りの方法が取れます。
 以下の例では、まず作成者が任意で決めた名前にし、それでダメなら決め手もらうという形式を再現しています。

ソース:

 選択肢の名前で問題がなければ決定するとその名前になり、自分で決めたいならエディットボックスが出現します。ファミコンなどのゲームソフトと違い、名前の決定は文字入力によるものです。
 「s3代入=名1,諸熊」というのが、今回の代入の使い方です。これにより、キャラ1の名前を「諸熊」にします。
 書式は、変更したいキャラナンバー、続いて名前となります。名前は10バイトで決め手下さい。で、「名1」というのは、キャラの名前を示す変数です。変数については3-4節をご覧下さい。

 一方、「s9代入=名1,0」と記述すると、名前をプレイヤーが決められるようになります。名前を入力するエディットボックスが出現し、タブキーで決定します。
 ただし、文字入力がATOKに依存しているのか、IME環境で入力しなぞり読みをすると、正しく確認できない事がわかっています。入力は性格なので、行読みなどで確認するようにして下さい。
 最後に、念のためキャラ1を加える「s10pt=」がありますが、これについては次節で明らかにします。もう何をやっているかわかってる人もいると思いますが…

目次に戻る

 2-9:パーティメンバーの取り扱い

  この節では、製品版TXTGMに搭載されている、パーティメンバーの操作について説明します。なお製品版を購入していない方は、お試し版にて動かすようにして下さい。
 テキストゲームでは、最大9人までのキャラクターをゲームに設定し、登場させる事ができます。ちなみに、9人というのは、あくまで戦闘に参加できるという意味であって、戦ったりしないなら全く関係ありません。
 パーティキャラである各メンバーについては、そのキャラを加えたり外したり、存在有無を判定できます。本格的にいじりたいなら、ALTERNATIVE辺りで実感して下さい。
 以下、パーティキャラを一人ずつ増やし、そして減らし、最後にはやっぱり一人になりますが、残るキャラは異なるという例です。

ソース:

 まずは、「s1pts=1,0,0,0,0,0,0,0,0」の、「pts=」。これは、一度に指定したメンバーを指定した並び順でセットするという命令です。キャラは、イコールの右から順に、1 2 3 4 5 6 7 8 9 というようにセットします。
 まず、「pts」で、1か0を指定します。存在するなら1、外すなら0にします。全部1にすれば、豪勢な9人パーティも作れますが、ウィンドー幅が面白い表示になるので、できるだけ5人程度に抑えた方がいいです。
 次に「pts順=」で、並び順を決めます。これを指定しないと正しく表示されませんので、まずは「s*pts=」を書き、それをコピーして使います。並び順を、1から9までで順に記述します。

 並び順については、「s11pts順=」を見てもらえればわかると思います。記述は、2 3 5 1 4 6ですので、並び順は、キャラ4 キャラ1 キャラ2 キャラ5 キャラ3 キャラ6 というようになります。

 ここで、「s*pts=」と「s*pts順=」のシナリオナンバーが同じ事に気づくでしょう。これは「s*pts=」がメインの命令なのに対し、「s*pts順=」は付属する属性である事を指しています。
 通常、「s*pts=」でキャラをセットしたら「s*pts順=」で並び準も更新する必要があります。なお「s*pts順=」のシナリオナンバーはずらしてもかまいませんが、揃えた方が読みやすくなるでしょう。

 「s6pt=2,1」の「pt」は、特定のパーティメンバーを追加するという命令です。「pts=」で一度にセットするのと異なり、加わったキャラは必ず、パーティの最後尾に並び、抜けた場合は列が前に詰まります。
 まず、該当するキャラナンバー(1〜9)を指定し、続いて加えるか外すかを記述します。1だと加わり、0だと外れます。すでに加わっていたり外れていたりする場合は無視されます。

 最後に、キャラの存在有無の判定について説明します。と言っても、2-7の条件分岐を読まれた方は、何の問題もありません。
 「s*もしpt=1,1,101」というように、キャラナンバー、存在有無、ジャンプ先シナリオナンバーというように記述します。これは、スイッチナンバーとほとんど同じ扱いです。
 なお、なぜ条件分岐の部に入れなかったかですが、この機能は有料版に依存している点や、パーティキャラ関連の操作は別に設ける事にしていたからです。

目次に戻る

 2-10:装備品を操作する

  この節では、キャラが装備している武器防具に関する事について説明します。なお装備品に関する詳しい説明はここでは省略します。

 まず、「装備品」というのは、アイテムデータに記述した武器防具(i181〜i380まで)のアイテムを指し、装備する事で攻撃力・防御力などを上昇させます。わからない人は、TSなどのRPGを遊んで下さい。
 過去のバージョンでは、特定の装備品をチェックする機能しかありませんでした。が、最近はシナリオ中で強制的に武器防具の装備を変更する事ができるようになりました。
 そこで、この節では装備品チェックに関する事も含め、詳しく語っていきたいと言うのがねらいです。と書いても仕方ないので、さっそくまいりましょう。

  まずは、装備していた武器防具を別の物に変更してみましょう。そのためには、予め「d_start」に下記の記述をしておきます。

ソース:

 これにて、キャラ1は武器(i181)、防具1(i281)、防具2(i301)を装備した状態でゲームが始まります。別に無くてもいいですが、わかりやすいように、ね。
 これにて準備はOK。以下のシナリオを動かしてみましょう。

ソース:

 初めに出るコマンド選択画面で装備品を確認し、装備変更に進みます。すると、全ての装備が勝手に外されます。
 s2〜s4までにあった「s*装備=」というのが、今回取り上げる装備品変更の命令です。指定したキャラの指定した位置に、指定したアイテムを装備させます。ここでは、キャラ1の1番目〜3番目の装備欄にあった武器・防具を全て外すという事をしています。
 なお、s6〜s8までは直前と全く逆の事をしているので、外れていた装備品が元の位置に装備されます。装備変更において、予め装備品を持っていないといけないという規定がありますが、ここでは直前に持っていた物を外しているので大丈夫という仕掛けです。

 ところで、s5のコマンド選択画面、つまり装備を外された直後には、装備していた武器防具がアイテム欄に入っています。ここでもし、それらを勝手に装備させるとどうなるでしょうか?
 答えは、「該当の命令が来た時に、そのアイテムが無いので装備変更は行われない」です。持ってない物が勝手に装備される事は無いし、逆に装備している物が消える事も無いのです。
 ちなみに、防具2にi281を主導で装備させた状態でs6〜s8を通ってみましょう。s7の地点ではアイテム281が無いので無視され、s8ではi301と交換されるので、装備品は「user1装備=181,0,301」、アイテム欄に281が残る形になります。

 さて、今度は別の物を装備させてみましょう。予め装備品をアイテムに加えた上で、装備変更をします。下記サンプルです。

ソース:

 初めのサンプルと異なるのは、まずs1で装備させたいアイテムを予め準備している事と、s3〜s5の装備変更では、そのアイテムを装備させている事です。
 この命令は登場してからの歴史がかなり浅いので、実装上はどういう使われ方が多いのかが見えません。何となく、装備を固定するよりも外す方が可能性として多い気がしますが。
 ところで、この命令を使えば、本来は装備できない物を無理やり装備させる事ができます。武器欄に薬草を入れたり、防具欄に武器が何本も入る、挙句の果てには全身鎧を何個も付けるなどの珍現象もできます。

 続いては装備品チェックです。と言っても、2-7節でほとんど語り尽くした感は否めませんが。
 とりあえずここでは、i281を服、i291をズボン、i292をスカート、i301を靴下として進めます。ちなみに登場キャラ1は女の子って事で。

ソース:

 一応コマンド選択画面でも着替えはできます。が、デフォルトでは装備欄が2つしか無いため、普通に装備させていくとどれか1つが装着できないため、先に進めません。
 ここでさっそく、武器欄に服が装着されるという珍現象が起きていますが、ここでは触れない事にします。装備可能アイテム総数を増やしておけばいいのですが、デフォルトでも3枠あるので。

 「s*もし装備=」が、今回取り上げる装備品チェックです。装備していればシナリオジャンプが起きて先に進めるという仕掛けになっています。
 ここでは3段階のチェックを行っています。まず、服を装備していれば次のチェックへ。靴下を装備していればさらに次のチェックへ。ズボンかスカートどちらかを装備していれば、終われるという作り方です。もちろん、ズボンとスカートではメッセージが変わります。

 この装備品チェックの盲点は、装備しているキャラまでは特定できない事です。つまり、3人とかが一度に行動している時に、特定の装備品の組み合わせをチェックしても、別々に持っているだけで通ってしまうのです。
 もしこれを回避するなら、一人ずつに分けてチェックする事になります。しかし、一人ずつチェックするのには膨大なシナリオを食うので、今は妥協した方が良さそうですね。今後どうなるかに期待しましょう。

目次に戻る

 2-11:キャラのHPなどを操作する

  この節では、キャラの残りHP・MP・WPをシナリオ中で直接操作する方法について説明します。なおここもRPG向けです。

 HP(HitPoint)とは、いわゆる耐久力で、ダメージを受けると減少します。一般的なRPGではこの値が0になると戦闘不能、その場のパーティ全員が戦闘不能になると全滅というのが定則となっています。
 MP(MagicPoint)とは、魔法力です。MPが高いほど強大な魔法を使えますが、魔法を使う旅に残MPは減少します。MPが0になると魔法は使えなくなり、一般的なRPGでは大幅に戦力ダウンしてしまいます。
 WP(WazaPointもしくはWorkPoint)とは、技力です。技を使うためにはWPが必要で、この値が高いほど強力な技が出せたり、弱小の技を連発する事ができます。WPがなくなると、これまた一般的なRPGでは戦力ダウンします。
 ちなみに各RPGによってMPやWPの表現は異なりますが、ここではデフォルトであるこのHP・MP・WPを名称として使います。ちなみに私、MPはドラクエ、WPはロマサガから来た物だと判断しています。

 通常、HP・MP・WPは戦闘や魔法の使用で減少し、アイテムを使ったり宿で休む事で回復します。過去のTXTGMでも同様の状態になっていました。
 しかし、最新のバージョンでは、これらの値をシナリオ中に変更する事ができます。ドラクエなどで毒の沼地やバリアに苦しんだ方々なら、ピンと来ると思います。
 さっそくサンプルに入りますが、予めHP・MP・WPの初期値を設定しておきましょう。「d_start」に下記の設定を追加して下さい。

ソース:

 これで、4人のキャラができました。なおパーティは3人構成です。パーティについては2-9節をご覧下さい。
 ではまず、ドラクエにある毒の沼地を再現してもらいましょう。一歩歩く旅にHPが1ずつ減っていきます。ちなみにHP1の時に踏むと死に増すのでご注意下さい。

ソース:

 進み始めるとパーティの残りHPが1ずつ減っていき、以後は終わるを選択するまでは終われません。このまま沼地で絶命するも良しならそのままエンターキーを押していましょう。
 さて、ここで「s6hmp+=」とありますが、これこそが今回取り上げる、HP・MP・WPの変更命令です。まず対象にするキャラナンバー、次にメッセージや効果音の不要の許可、そしてHP・MP・WPの順に増減する値を記述します。
 まず対象キャラを0にすると、パーティ全員が対象になります。そして次のメッセージ・効果音付与を3にする事で、知らず知らず野内にHPだけが減るようにします。0にすると、メッセージが出るので少し親切ですね。
 残り3つですが、まずは「-20001」にて、どんなキャラもHPが1減ります。HPやMPなどの増減量については「d_item」と全く同じ書式となっています。残る二つの0は無関係って事で。

 以下、「s*hmp+=」で増減できるHPなどの数値の内容です。コレを見てわかりにくい方は、後に記述例をご覧下さい。

- s*hmp+=で記述できるHPなどの設定範囲 -

  1 〜 9999 → HP回復(即死耐性4のキャラは逆効果)
  -1 〜 -9999 → HP減少(即死耐性4のキャラは逆効果)
  10001 〜 19999 → 最大HP上昇。
 -10001 〜 -10010 → HP回復、残りHPの何割か()即死耐性4のキャラは逆効果)
 -10011 〜 -10020 → HP減少、残りHPの何割か()即死耐性4のキャラは逆効果)
 -10021 〜 -10030 → 最大HP上昇、最大HPの何割か
 -10031 〜 -10040 → HP回復、最大HPの何割か()即死耐性4のキャラは逆効果)
 -10041 〜 -10050 → HP減少、最大HPの何割か()即死耐性4のキャラは逆効果)
 -20001 〜 -29999 → 固定ダメージ。
 -30001 〜 -39999 → 固定ダメージ、ただし物理ダメージとなるので、クリティカルの対象になる。
 -50001 〜 -59999 → HP回復。

 ※ MP・WPの最大値は999なので、999以上の値は設定できません。
 ※ MP・WPは物理威力では減らないので、-30001〜-30999までの値は使えません。

- 設定範囲ここまで -

 以下、記述の具体例です。わからない方は、用途に合わせてコピーして使って下さい。

; キャラ2のHPを半分にする。メッセージや効果音も鳴らす。

s1hmp+=2,0,-10015,0,0

; 全員のHP・MP・WPを完全に回復する。効果音だけ鳴らす(宿とほぼ同じ)。

s2hmp+=0,1,-59999,-59999,-59999

; キャラ4のHP最大値を5、MP最大値を5増やす。メッセージだけ表示する。

s3hmp+=4,2,10005,10005,0

; 全員のMPを0にする。効果音もメッセージも出さない。

s4hmp+=0,3,0,-20999,0

 ちなみにこの命令に関する情報は不足している可能性があります。というのは、この命令が登場してからの歴史がかなり浅いため、私自身もまだ本格的に使っていないからです。

目次に戻る

 2-12:シナリオの装飾

  ここまで熱心に読まれた方なら、すでに簡単なシナリオは書けるようになったのではないでしょうか?あとは、ひたすら書いてみるのみに等しく、その中で新たな技術を習得できる事も多いです。
 ここでは、そんな記述を助けるさまざまな装飾系の命令を紹介します。なお、全く使わなくてもいいものが多いため、最後に回しました。

- 命令の一覧と簡単な説明 -

s20w=300 何もせず、3秒間待つ。キーが押されたら次へ進む。
s21t= ウィンドータイトル そのシナリオナンバーに限り、ウィンドータイトルを変更する(s*?6=などと組み合わせて使うと良い)。
s22エリア=20 「d_etc」で指定したエリアをセットする(エリアをセットする事で、現在地名や出現モンスターを変える事ができます)。
s23エリア+=10 現在のエリアナンバーに10を加算する(減算も可能)。
s24瞬間移動=1,1 瞬間移動を可能にするアイテムにて、瞬間移動先に該当ナンバーの示す場所を追加する。
s25モード=1 ゲームを高速処理モードにし、、代入などの連続処理を高速で行う(一部の命令が使用不能になる)。
s26代入=i1,/21 アイテム1のアイテム個数を、スイッチ21の中に複写する。
s27gosub=ジャンプ先ナンバー 指定したサブルーチンへ移動する。ジャンプ先を「return」とすると、元のシナリオに戻る。
; 行頭にセミコロンのある行はコメントです。コメントをシナリオ中に書く事で、シナリオが読みやすくなります。

- 命令の一覧と簡単な説明ここまで -


目次に戻る

 3:高度でうまいシナリオの書き方

  この章からは、やや中核的な事がらになっています。2章をそれなりに理解しており、なおかつ他の部分もそれなりに書けるという方向けですので、不慣れな方は、まず2章を参考にシナリオを書いて下さい。
 この章では、操作性に優れたシナリオおよび、質の高いシナリオを目指すために必要なさまざまな事柄を列挙していきたいと考えています。

 3-1:読みやすいシナリオの書き方

  シナリオは、ゲームにおいて最も中心的な部分です。そのため、シナリオナンバーも数戦・数万と使い、自然と巨大なファイルになります。
 当然そうなると、一日で全てが書き出せるわけではなく、何日、何週間と時間をかける事になります。もちろん、間にブランクが入る事もあります。
 そこで、シナリオの可読性を高め、時間が空いても読み返す操作を簡便に行えるようにする必要があります。特に、複数のゲームソフトを作る場合、要素が混じらないようにするという点でも重要です。

 @ 適度にコメントを付ける

  テキストゲームでは、行頭にセミコロンのある行をコメントとみなし、変換する時に無視するという特性があります。コメントは、プログラムの可読性を高めるため、わかりやすいように記述します。
 例えば、下記のようなスイッチ処理を考えてみます。コレはALTERNATIVEの時間軸の設定で用いるものの一部で、1日を24時間とし、何かあるごとに1時間ずつ動かすように設計されています。

ソース:

 これを読んで、いったい何をしているかた瞬時に読み取れた方は、おそらくプログラマー向けでしょう。もしくは、そうとうテキストゲームの動きを熟知しているのではないでしょうか?
 スイッチが複雑に絡み合っているため、コレを読んだだけでは、何が何なのか、全くわからないです。というわけで、コレにコメントを付けてみます。

ソース:

 これを読むと、何をやっているのかがはっきりわかります。また、一つずつ辿れば、各スイッチの意味もわかると思います。
 まず、スイッチ407(時間軸)に1を加算します。その後、その値が5ならスイッチ408(昼夜判別)を0に、17ならばスイッチ408を1に、24の場合は0に戻し、スイッチ406(週間軸)を1増やすという動きをします。
 また、読みやすくするために、作業と作業との間には改行が入っています。私としては、シナリオナンバーが開く時や、イベントが発生する時には改行を入れるようにしています。これも、シナリオを読みやすくするコツです。

 一つ注意しなければならない事は、コメント行は削除されても、改行は変換時にゴミとして残るという事です。シナリオのファイルサイズを極限まで絞るのなら、変換前にシナリオのコピーを取った上で、正規表現「^\n」で改行を削ぎ落としたシナリオを変換させるようにしましょう。

 A シナリオナンバーを詰め込み過ぎない

  複数のイベントや章から構成された本などでは、ある章が終わった時は改行し、次の章とのメリハリを付けるようになっています。
 これと同じように、シナリオでもメリハリを付ける事で、後から読みやすくする効果が得られます。また、バグ修正時の保険になります。

ソース:

 71の地点で、何かの物語が終わったというのに、いきなり次に入っています。いくら何でも、コレは読みにくいです。
 こういう時は少しもったいないですが、シナリオナンバーを少し開け、81から次を始めてみましょう。あとは途中に改行があれば、ずいぶん読みやすくなるのではないでしょうか?

 また、シナリオ記述にバグがあり、後のシナリオをずらす必要が出てきた際、上記のような空きがないシナリオでは、修正する量が膨大になってしまいます。メッセージだけならまだしも、分岐やジャンプが混じっていたら大変。新たなバグを生み出してしまうでしょう。
 そういう理由からも、シナリオには適度な空きが必要だと思います。イベントなどは1で始まるシナリオから初め、たとえ9の空きがあっても飛ばす。もっとある場合はgoで飛ぶなどをお奨めします。

 B 特別なリストを別に作っておく

  多くのシナリオでは、たくさんのスイッチナンバーを扱って処理を行う事があると思います。私の場合、新TSでは全部で700個、ALTERNATIVEでは300個のスイッチを並べて処理をしました。ちなみにこのスイッチの差は、旧アイテム倉庫の使用履歴に関係します。
 これらのスイッチには、いったい何が入っているのか?と突然尋ねられたとします。覚えていれば問題ありませんが、まず無理でしょうから、シナリオを探索する事になります。が、かなり時間がかかるはずです。
 また、新たなイベントを書き込もうとした時に、スイッチを置くわけです。が、今までに何番までスイッチを使ってきたかを思い出す必要があります。でないと、同じスイッチを使ってしまうと、せっかく書いたイベントが、すでに終わった事になってしまうからです。

 このような時のために、各スイッチは、何のために作ったものなのかを、別テキストにリストアップしてみる事をお奨めします。内容は主に、「スイッチの番号、その内容」というように記述すればいいです。あとは読めればいいのでご自由に。
 こうすれば、膨大なシナリオからスイッチを探す手間が省けます。また、サブルーチンが複数ある場合にも、同様の方法を用いておけば、間違ったサブルーチンを使わずに済みます。

目次に戻る

 3-2:サブルーチンについて

  2-12節でチラッと紹介しましたが、コレを使うと、同じ内容を複数の場面で共有する際にとても有効です。
 サブルーチンとは一般的に、特定の仕事を行うために、メインプログラムとは別に作られたプログラムです。そしてそれらは、主となるプログラムが必要に応じて呼び出して使います。そのため、通常、サブルーチンを単体で動かす事はありません。
 テキストゲームでも、このようなサブルーチンを作る事ができます。ただし、外部にファイルを設けるのではなく、シナリオ内に全て記述します。その方法は単純で、主となるシナリオとは縁のない値のシナリオナンバーから書き出せばいいのです。

ソース:

 ここでは、s1からシナリオが始まり、サブルーチン501へ飛びバトルなどの処理、その後returnで戻り、s3のジャンプで11に飛びます。その後、またサブルーチンへ飛び、同じ要領でシナリオが進み、終わります。
 通常、goでジャンプした場合は、戻り先は基本的に常に一定で、変える事ができません。それに対し、gosubでの移動では、return命令で戻ってきた際には、サブルーチンに飛んだシナリオナンバーの次に戻ります。そのため、好きなように戻る事ができるのです。
 なお、サブルーチンから別のサブルーチンへ移るには、gosubではなく、goを使うようにしましょう。gosubで記憶される戻り先は、常に最新の戻り先1箇所になるため、サブルーチンから戻れなくなります。
 また、サブルーチンの戻り先がないのにreturnが来ると、戻り先がないので無視されます。しかし、サブルーチンは基本的に、元のシナリオとは無縁の世界にあると思うので、多くの場合、そのままフリーズしてしまうかもしれません。

目次に戻る

 3-3:シナリオジャンプに確率を設定する

  2-4節にて、シナリオジャンプには確率をかけられると書きました。本節では、一定の確率でシナリオジャンプを起こす方法について説明します。
 と言っても、その方法はいたって簡単で、「s*go=〜〜」の後に、コンマで区切って確率を指定してやるのです。以下に、その例を示します。

ソース:

 50%の確率で、誰もいないんですね、この教室。人数がやたらと少ない学校でもまれな現象かもしれません。大丈夫なのでしょうか?
 さて。すでに3-2節でお気づきの方もいるかもしれませんが、このジャンプの確率指定には、シナリオナンバー以外のものも設定できます。つまり、50%の確率で宿が出たり出なかったりという珍現象も起こせます。
 これを用いれば、モンスターが出現する確率も作る事ができます。50%で出現するという設定を6つ連ねれば、0〜6回、平均3回のバトルを行う事ができます。
 なお、「s11go=save,11,50」というのは設定できないと思います。やる意味もあまりないですが、興味のある方はお試し下さい。ただし、サブルーチンの中でセーブできないよう、ご注意下さい。

目次に戻る

 3-4:メッセージに変数を使う

  シナリオを記述する際、メッセージに変数として、キャラの名前やアイテム名、所持金などさまざまな事を書き込む事ができます。
 変数というのは通常、特定のプログラムを実行するにおいて、計算機が一時的にその計算結果などを保持しておくための入れ物的存在です。もちろん、入れ物がなくても計算ができないわけではありませんが、たいていは変数を使います。
 テキストゲームでも、これら変数を利用する事で、シナリオ記述を簡便に済ませる事ができる場合があります。以下の例を使って考えてみましょう。

 (例1) スイッチに入れた24時間制の現在時刻を表示したい

  これを変数を使わないで実現すると、若干めんどくさい事を書かなければなりません。
 方法としては、スイッチに入っている値を「もし/=」の列挙で探し、メッセージを24個用意します。以下のように記述します。

ソース:

 これ手書きでやると物凄く疲れます。たかが時刻一つ表示するのに、これだけの事を毎回やっているようでは耐えられません。また、バグの原因にもなりそうです。
 では、これを変数を用いてしまいます。すると、恐ろしい事に、一瞬でシナリオが終わってしまいます。

ソース:

 なんと、80行近く注いで書き込んだシナリオが、僅か2行で片付いてしまいました。もちろん、スイッチ1の値を変えてやれば、どんな時刻にだって対応します。ただし、25以上の数が入っていると笑える減少になりますが。
 では、このシナリオを見てみます。すると、「%/1」という表記があります。これこそが、今回取り上げる「変数」というものです。そしてこの変数に入っているものは、スイッチ1が持っている値です。
 変数として使用できるものは、各キャラの名前・順序を考慮したキャラの名前、アイテム名、アイテムの所持個数、所持金、預金額、コイン枚数、スイッチナンバーとあります。以後、増えていくと思います。
 変数の書式は、決められた文字をパーセント(%)とアンダーライン(_)で区切る事で記述します。例えば、キャラ5の名前であれば「%名5_」とし、アイテム33の個数であれば「%i個33_」とします。

 さて、上の例を少しパワーアップさせましょう。時刻というくらいですから、現在の分単位の時刻も出したいところです。
 これを変数無しで書く事は大変です。なぜなら、まず時刻の分岐をし、さらに分単位での分岐を書かなければならず、シナリオ総数にして2500ほどの莫大な量を書かなければならないからです。
 しかし、変数を使うとあっという間です。メッセージ中にはいくつでも変数を指定できますので、時刻、分と列挙すればいいのです。下記の例では、スイッチ1をhour、スイッチ2をminuteとして扱います。

ソース:

 さて皆さん、2500も書けてシナリオを書くのと、僅か2で片付くシナリオ、どっちをやりますか?などと憎たらしい質問はやめましょう。と書くと、「だったら書くな!」と言われてしまいそうですね。

 (例2) 特定のアイテムを中心に扱うシナリオを書いた後、そのアイテム名を変えないといけなくなった時…

 ゲームを作っていくと、特別な事情でアイテム名などを変えなければならなくなる事はままあります。そんな時、変数なしの場合はシナリオ全てに目を通し、一つ一つ変えなければなりません。
 またここでは、名前入力を用いてあなたの名前を使ってシナリオを進めます。名前入力の方式については、2-8節をご覧下さい。

ソース:

 すでに変数が転がっている今回、プレイヤーが入力した名前でシナリオが進行しました。何かの名前のようなものは、スイッチで分岐しようものなら、今の計算機は簡単にハングアップしてしまうでしょう。
 さて、今回は「薬草」のお使いを頼まれたのですが、もしこれが、「漢方薬」に変わったらどうしますか?答えは簡単で、薬草」の部分を全部書き換えなければなりません。
 ここではシナリオが少ないのに、「薬草」という言葉だけで検索すると10個もありました。しかも、意味が異なる別物が存在しているので、まとめて置換するわけにもいきません。「恐ろしい漢方薬」なんて誰も頼んでいないでしょう?

 となると、頭から手書きで治す事になります。が、どう考えてもめんどくさいし、誤字・脱字が出る危険があります。ここではシナリオが僅か12しかないからいいですが、10000とか20000のシナリオを一つ一つ探すのは大変です。
 そこで、アイテムナンバー1が「薬草」である事にして、シナリオに変数を用いて書き治してみます。下記のようにします。

ソース:

 店の中で「いろいろな薬草が」とありますが、、これはアイテム1名の「薬草」を表しているわけではありません。なので、変数の対象外とします。
 さて、アイテム1の名前を「漢方薬」にした上で、画面に出してみましょう。

- 画面に出るメッセージここから -

 

 あなたの名前を教えて下さい。

タブキーを押すと次へ進みます。

 

(名前を入力する ここでは、諸熊 とする)

 

諸熊の母:

 諸熊、ちょっとお願いがあるんだけど。

 

 隣の店へ、漢方薬を買いに行って欲しいの。行ってきて。

 

 いらっしゃいませ。何が欲しいんですか?

 

諸熊:

 漢方薬を買いに来ました。

 

 おや、漢方薬かい?ウチにはいろんな薬草があるんだよ。

 

 %漢方薬

 いい薬草

 凄い薬草

 恐ろしい薬草

 

諸熊:

 じゃぁ、漢方薬を下さい。

 

店の人:

 まいどありぃ。

 

諸熊の母:

 漢方薬、買ってきてくれたんだね。ありがとう。

 

(終了)

 

- 画面に出るメッセージここまで -

 「薬草」の部分が「漢方薬」に変わりました。しかし、途中の部分が若干おかしな表現になっています。まぁ薬草と漢方薬ではギャップが激しいので仕方ないでしょう。
 このように、変数を利用する事で、急な変更に対応する簡便なシナリオが作成できます。これに慣れない方は、スイッチを使って勉強して下さいね。

 しかし、変数は便利ですが、使えば使うほど表現が中小的になります。そうなると、ある変数には何が入っているか?を意識しなければならず、結果として乱用すると可読性が激減してしまいます。
 例えば、前述の「いい薬草」、「凄い薬草」、「恐ろしい薬草」の名前も変数にしてしまうと、

s8m= %i名1$ %i名2$ %i名3$ %i名4

 というようになります。忘れた頃にこの文をいきなり見たら、何が入っているかを思い出すため、「d_item」を覗く事になるでしょう。特にここではアイテム名ですからいいですが、スイッチの値とかだとさらに煩雑です。
 そんな迷子になるのを防ぐためには、スイッチなどは専用のリストを作り、どのスイッチは何のために使われているかをリストアップしておくと良いです。その他でも、アイテム名リストやモンスター名リストなど、けっこう便利ですよ。

 最後に予断ですが、コイン枚数を表示する「%c」というのは、C言語では「一文字」を表す書式です。printfやputcharなどで使うと思いますので、お間違えのないように。

目次に戻る

 3-4:シナリオのファイルサイズと処理速度の問題について

  現在、シナリオのファイルサイズが大きくなればなるほど、ゲームそのものの処理速度が低下する事がわかっています。これは、シナリオデータをメモリに読み込む特性上、大きいほど多くのメモリを要する事が考えられます。
 一応、最近のテキストゲームメーカーではそれを考慮し、処理速度の向上策を転回中のようです。単純に処理速度を上げたり、シナリオナンバーを使う量を減らす事で、高速化を図れるようにしたりなどです。

 しかしながら、作る側もちょっとくらいはそれに貢献する必要はあると思います。特に、いかに優れた処理速度を備えていても、それをうまく生かした記述ができなければ、結局無駄が生じるのは事実です。
 というわけで、本節では、処理速度を高めるために用いるさまざまな手法について説明します。

 @ 二度ある処理は全てサブルーチンに

  同じ事をどこかで二度ある場合で、シナリオ数にして1で片付かないのであれば、全てサブルーチンに書いてしまい、それを使うようにするといいです。
 なぜなら、同じ事をコピペするよりも、サブルーチンで書いた事を二度利用した方が、ファイルサイズが小さくなる可能性が極めて高いからです。
 またその際、サブルーチンに例外対策として分岐命令を仕掛けておけば、少々の例外的名動きをも、同じサブルーチンに押し付けてしまう事ができます。こうすれば、ファイルサイズはもっと減るでしょう。

 A 代入処理を連ねる場合は、裏で少しずつ

  「s*代入=」で行う処理は、たいていの場合、一度にたくさんのアイテムを代入します。そのため、多くのシナリオナンバーを消費する事になり、結果として処理速度が低下してしまいます。
 そこで、可読性が落ちますが、メッセージなどの間に、少しずつ代入処理を行ってみましょう。メッセージを出しながら、裏で少しずつ荷物の運び出しをしておけば、本番の時にスムーズに作業ができるというわけです。

 B シナリオナンバーの低い部分には、よく使うシナリオを置く

  シナリオナンバーの低い部分に、よく使うシナリオを置くと、ファイルサイズが小さくなります。この理由は簡単で、シナリオナンバーが1桁増える事で、1バイト多く文字を打つ必要があるからです。
 特にお奨めなのは、よく使うサブルーチンを置く事です。何度も呼び出されるものを6桁のシナリオ部に置くのと4桁のシナリオ部に置くのとは、かなり大きく差が出る可能性があります。
 逆に、一度しか起こらないシナリオを、高いシナリオナンバーに置く事にします。と言っても、シナリオ10万使う事はほとんどないので、1万とか2万辺りが無難かと思います。
 ただしこの記述では、いきなりサブルーチンが来るため、シナリオの流れが辿りにくくなります。この場合は、3-1で紹介したようなリストに、イベントリストを設けておくといいかもしれません。

 C 変換前に空行を削り落とす

  3-1節で、空行があると、変換時にゴミとなると書きました。それは事実で、空行1つに付き2バイトのゴミが出る事になります。たかが2バイトですが、空行が3000行もあると、6KB近くもゴミが出ている事になります。
 このゴミを削り落とすには、正規表現での置換に対応したエディタが必要です。検索文字に「^\n」と入力、置換文字を空にして実行すると、空行が全て落とされます。ついでに、「^;.+\n」も対象にして、コメント行も落としてしまうといいかもしれません。
 一つ注意しなければならない事は、事前に元ファイルのコピーを用意しておく事です。空行やコメントのないシナリオデータは可読性がかなり悪いので、後の編集には不向きです。ですから、配布直前に変換する時だけ手をかけましょう。

 以上のように、シナリオファイルサイズを削るさまざまな手段があります。ただし、3-1節で述べた多くの事と相反するため、判断の別れる部分だと思います。この辺は、お好みで探索してみて下さい。

目次に戻る

 3-6:モードを活用する

  2-12節でチラッと紹介した「s*モード=」を利用すると、シナリオ1命令を実行するのにかかる時間を短縮できます。その代わり、特定の命令が使えなくなります。
 代入処理やスイッチ・アイテムのセットを一度に大量に行う時などにこの機能を使う事で、操作できない時間を減らす事ができます。また、使わない命令を省略させる事で、ゲームの基本速度も向上します。

 通常のシナリオ処理では、カウンタが該当するシナリオナンバーにある命令を参照する時、どの命令があるかをしらみ潰しに探します。そして該当する命令が見つかって、初めて処理を開始します。
 この時、高速処理モードでは一部の命令を確認せず無視します。そのため、確認する命令の量が減り、結果として速度が速くなります。
 なお、例として表すには大量の処理がなければあまりわからないので、ここでは省きます。その代わり、高速処理モードにすると、一部の命令が省かれる事を記します。

ソース:

 本来なら出るはずの選択肢が出ずにシナリオが進んでしまいました。つまり、選択画面を出す命令は省略されたのです。
 このように、モード切り替えを行う命令は、時にかなり危険です。処理が済んだら必ず「s*モード=0」にて元に戻すようにしましょう。簡単に無限ループになると思います。

 ところで、上記のシナリオでは使用しなかった命令が数多くあります。どうせ使わないのなら、それも省略すれば、さらに処理速度が速くなるかもしれません。最後に戻すのなら問題ないでしょ?
 というわけで、省略する命令をこちらで指定してしまいます。なお、この方法は「d_etc」の記述と連動して行いますので、「d_etc」も開いて下さい。

 まず、「d_etc」に下記の内容を追記します。場所はどこでもかまいませんが、店などの設定の直前などに置くのが無難かと思います。

ソース:

 これは、処理モード1を利用した時に、どの分類の命令を省略するか?を指定する命令です。処理モード1とあるように、実は処理モードはいくつでも決め、用途に合わせて使い分ける事ができます。
 今は0が13個列挙されていますが、この状態は全ての命令を使う事を指します。もし、全て省略するのなら、全部を1にします。ただし、「s*go=」および「s*gosub=」は省略できないようです。
 この13個の0ですが、それぞれがどの分類の命令であるかという属性を持っています。0で該当する命令を使用し、1ではそれを省略し、使わなくします。

 テキストゲームにおける論理演算では、1が真で0が偽という特性があります。今回は省略するかを決めるので、1で省略、0で非省略という事になります。
 各属性は以下のような順序で並んでいます。

- シナリオ命令の分類属性 -

  1. 選択系命令  s*選択= s*?= s*?6=
  2. WindowTitleおよびWait命令  s*w= s*エリア= s*エリア+= s*t=
  3. キャラメンバー命令  s*pt= s*pts= s*pts順= s*もしpt=
  4. 代入命令  s*代入=
  5. スイッチ命令  s*/= s*/+= s*もし/=
  6. 瞬間移動命令  s*瞬間移動=
  7. アイテム命令  s*i= s*i+= s*もしi=
  8. 倉庫命令  s*倉= s*倉+= s*もし倉=
  9. 装備品命令  s*装備 s*もし装備=
  10. 金・コイン命令  s*金+= s*もし金= s*預金+= s*もし預金= s*c+= s*もしc=
  11. 戦闘系命令  s*もし全勝数= s*もし全逃数=
  12. 基本命令  s*m= s*音=
  13. HP関連命令  s*hmp+=

- シナリオ命令の分類属性ここまで -

 過去バージョンまでの高速処理では、1番の選択系命令が省略されるようになっていました。が、今回からはそれも任意で決める事ができます。
 試しに、下記のようなモード設定を作ってみました。アイテム・スイッチ・代入処理だけを行い、あとは一切無視するという指定です。

ソース:

 4番目・5番目・7番目だけが0です。つまり、その位置の命令だけを使い、あとはばっさり切り捨てます。アイテムなどの処理を列挙する際に協力です。
 上記では、モード2をこれに当てました。また、わかりやすいようにコメントも付けています。0と1の羅列が嫌なら、上記のようにしっかりとコメントを付けておくと、必要な時にササッと使えます。

 さて。それでは前回のシナリオにおいて、不要な命令を省く専用のモードを作ってみましょう。

ソース:

 これで、メッセージ、ウェイトおよび、選択肢だけが出るようになりました。では、これをd_etcに書き込みセーブしたら、再びシナリオに戻ります。
 先ほどのシナリオでは、モードが1になっていたので、3に書き換えて実行します。物凄く敏感な方なら、速くなったと実感できるかもしれません。

ソース:

 これで、正しく選択肢も出るし、無駄もありません。なお、特性モードを作るのはかまいませんが、作り過ぎても、モード切り替えのオーバーフローがありますので、使う命令がわかっている時に使うようにしましょう。
 シナリオを書けばわかりますが、エリア設定やモードなどは、シナリオを書きながら決まってきます。したがって、ゲーム作成では、複数のファイルを行き来する事が普通になります。

目次に戻る

 3-7:エクセルを活用する

  シナリオ記述において、一部だけが異なり、残りは単なるシナリオナンバーのシフトという事はままります。そんな時、一々手書きしているのでは時間がかかりますし、ミスも出てきます。
 このような状況で大量の設定を裁くには、そういう操作が簡単にできるようなソフトなどを用いるといいです。途中がどうであれ、最終的にテキストゲーム用の書式が作れればいいのです。
 というわけで、本節では「Microsoft Excel」を利用してのシナリオ記述について説明します。なおExcelそのものの使い方を説明するものではありませんので、基本的な使い方などは調べておいて下さい。

 まずは下のソースを見て下さい。ちょっと長いですが、アイテム1から30までをスイッチ201から230までに代入する例です。

手書きして下さい。

 ふぅ、手書きだとかなりめんどうですね。さぁ皆さん、これを手書きでやって下さい。えっ、コピーしちゃダメに決まってるじゃないですか?
 ここではたかが30でしたが、例えばこれが60とか90、もしくは180ともなれば大変。全て手書きするのでは10分〜30分もかかってしまいます。これでは作成ペースが上がらない上、嫌気が差してしまいます。
 では、Excelを用いた記述について説明します。縦に30、横に6ほど用いる事になりますが、これで大量なデータも高速に裁けてしまいます。

- エクセルでの記述の仕様 -

 1:A1に「s」と入力する。
 2:B1に処理開始のシナリオナンバーを入力する。なお、sはA1にあるので付けない。
 3:C1に「代入=i」と入力する。
 4:D1に代入するアイテムナンバーの先頭、ここでは「1」と入力する。
 5:E1に「,/」と入力する。
 6:F1に代入先のスイッチナンバーの先頭、ここでは「201」と入力する。
 7:A1からF1までのセルを範囲指定しコピーする。
 8:7でコピーしたデータを、A2〜F2までの部分に貼り付ける。
 9:B2に「=B1+1」と入力する。
 10:D2に「=D1+1」と入力する。
 11:F2に「=F1+1」と入力する。
 12:A2〜F2までのセルを範囲選択しコピーする。
 13:12でコピーしたデータを、A2〜F30までの部分に貼り付ける。
 14:A1〜F30までのセルをコピーし、メモ帳などに貼り付ける。
 15:貼り付けたテキスト内にある「タブ( )」を置換して切り落とす。
 16:できたシナリオデータをコピーし、「d_scenario」の所定の位置に貼り付ける。

- エクセルでの記述の仕様ここまで -

 手順の数はやたらと多いように見えますが、実際に操作するとほぼ一瞬です。慣れてくると1分でほぼ全てが完了します。

 ここで重要なのは、まずA1〜F1までの部分です。ここではシナリオ1命令の内容を数値ごとに区切っています。区切りをタブで表すと下のようになります。

s 1 代入=i 1,/ 201

 このようにわざわざ数値だけを一つのセルに納めるのには理由があります。というよりも、コレをやらないとエクセルを使う意味が全くないに等しいのです。
 続いてA2〜F2のセルに注目します。ここでのA2・C2・E2は単なるコピーですが、B2・D2・F2のセルは変わった記述になっているはずです。
 例えばB2にある「=B1+1」というのは、B1のセルにある値に1を足し、それをB2に表示するという式なのです。B1にある値は1なので、「=1+1」となり、B2には2が表示されました。
 このような記述方式を利用する事で、仮にB1の値、ここでは処理開始のシナリオナンバーが変わっても、B2の値はそれに合わせて変わります。手書きだとシナリオを全て書き直す手間があり、バグの原因にもなるという点では、Excelは断然有利です。

 そして極めつけは、A2〜F2までのセルを下にコピーしていった事です。当然B2やD2にある式はコピーされますが、その時の式は下にシフトします。なので、B5のセルを見ると「=B4+1」となっているはずです。
 この結果、B1やD1の値一つで全てが決まるのです。またシナリオナンバーを一つ一つ手で治すわけでもないので、確実な記述ができます。

 こうしてできたエクセルのデータをメモ帳に張ると、テキストになります。ただし、区切りのタブが残っていますので、それを切り落として下さい。
 なお、通常のエディタでは検索画面でタブを押しても文字が入りません。そこで、正規表現での置換ができるエディタが有効なのですが、そんなものがなくても大丈夫です。タブ文字そのものをコピーして検索文字列に貼り付ければ、タブを切り落とす事ができます。

 ここからはエクセルでの注意事項です。

  1. エクセルにある「テキスト/タブ区切り」などでの保存は避けて下さい。画面の右端で次の行に折り返されてしまう事があり、後の処理が物凄くめんどうになります。
  2. データをコピーしたら、まずエディタに貼り付けをしてからエクセルを終了して下さい。エクセルはクリップボードに2次元のデータがあると、それを削除しなければ終了できません。
  3. 入力するデータにクォーテーションが含まれる場合は、それを何か特別な記号に変えてから記述し、エディタに貼り付けてから置換した方がいいです。特に数値と文字列の混合するセルでは、クォーテーションをそのままでは使えませんので。
  4. 少数を表示設定で桁数0にし、見た目上整数のようにしたデータをエディタに張ると、数字の横に半角スペースが現れます。数値を記述する部分での半角スペースの有無による動作は保障されていないので、念のために切落としておくとよいです。
  5. スクリーンリーダーのマクロによっては、エクセルや他のウィルスソフトと競合する場合があります。またマクロにはウィルスが含まれているようなものもありますので、人のエクセルデータを使っての記述にはご注意下さい。

 なおここでは縦にデータを記述しましたが、エクセルでは横に記述したり、絶対参照を用いたり関数を組み立てて式を作ったりなど、便利な機能が多数用意されています。
 また、データベースのようにも使えるので、数千行・数万行になるテキストデータを管理する秘密兵器にも使えるかもしれません。この辺は、実際にエクセルを使っていろいろお試しいただくといいでしょう。
 最後に、ALTERNATIVEの魔法袋の基盤を構成しているエクセルデータをここに置いておきました。自由に改変してもかまいませんが、二つのシートがリンクし合っている部分があるので、編集するセルに何が入っているかを確認して下さい。

「ALTERNATIVE」 魔法袋構成エクセルファイル 116KB
目次に戻る

 4:文法リファレンス

  シナリオ記述で使える命令の種類・概要です。
 s*はシナリオナンバー、s**は、直前のシナリオナンバーと同じにする事を示します。
 また、「ns*」は、コンマを繋げる事で、列挙する事が可能な事を示します。(ns*i=p1,p2,p1,p2,p1,p2…)

s*m=p1(表示するメッセージを380バイトまたは6行で記述)

s*音=p1,p2,p3,p4,p5(音ナンバー、最大5個)

s*w=p1(ウェイト時間 1秒は100)

s**t=p1(タイトルバーの文字 40バイトまで)

s*エリア=p1(エリアナンバー)

s*エリア+=p1(加減エリアナンバー)

s*go=p1(ジャンプ先シナリオナンバーまたは、戦・店・宿・遊・銀・倉の該当番号),p2(確率 省略時100%)

s*go=save,p1(ロード先シナリオナンバー)

s*gosub=p1(ジャンプ先サブルーチンナンバーもしくは、return)

s*?=p1(はい 選択後シナリオジャンプ先),p2(いいえ 選択後シナリオジャンプ先) 2-5

s*?6=p1(選択肢1 ジャンプ先シナリオナンバー),p2(選択肢2 以下 同じ)…p6(選択肢6 以下 同じ)@p7(選択肢1名)$p8(選択肢2名)…p12(選択肢6名)

 ※ 選択肢は、各26バイトまで

s*選択=p1(1か2、1ならセーブ不可)

s*話=p1(選択肢1 ジャンプ先シナリオナンバー),p2(選択肢2 以下 同じ)…p6(選択肢6 以下 同じ)@p7(選択肢1名)$p8(選択肢2名)…p12(選択肢6名)

s*移=p1(選択肢1 ジャンプ先シナリオナンバー),p2(選択肢2 以下 同じ)…p6(選択肢6 以下 同じ)@p7(選択肢1名)$p8(選択肢2名)…p12(選択肢6名)

s**save=p1(ロード先シナリオナンバー)

ns*/=p1(スイッチナンバー 1〜1000),p2(値 0〜99)

ns*/+=p1(加減対象のスイッチナンバー 1〜1000),p2(加減する値 -99〜99、または/10〜/2または、*2〜*10)

ns*i=p1(アイテムナンバー 1〜380),p2(値 0〜99)

ns*i+=p1(加減対象のアイテムナンバー 1〜380),p2(加減する値 -99〜99、または/10〜/2または、*2〜*10)

ns*倉=p1(倉庫内アイテムナンバー 1〜380),p2(値 0〜99)

ns*倉+=p1(加減対象の倉庫内アイテムナンバー 1〜380),p2(加減する値 -99〜99、または/10〜/2または、*2〜*10)

s*装備=p1(装備を変更するキャラナンバー 1〜9),p2(変更する位置 1〜9),p3(装備させるアイテム 1〜380)

s*hmp+=p1(HPなどを変更するキャラナンバー 0〜9 0はパーティ全員),p2(メッセージや効果音のスキップ 0〜3 1は効果音のみ、2はメッセージのみ、3は何も無し),p3(HPへの影響),p4(MPへの影響),p5(WPへの影響)

s*金+=p1(加減金額 -2100000000 〜 2100000000、または/10〜/2、または*2〜*10)

s*預金+=p1(加減金額 -2100000000 〜 2100000000、または/10〜/2、または*2〜*10)

s*c+=p1(加減枚数 -2100000000 〜 2100000000、または/10〜/2、または*2〜*10)

s*瞬間移動=p1(瞬間移動ナンバー),p2(登録有無 1で登録 0で解除)

s*もしi=p1(アイテムナンバー 1〜380),p2(値 0 〜 99),p3(一致時のシナリオジャンプ先)

s*もし倉=p1(倉庫内アイテムナンバー 1〜380),p2(値 0 〜 99),p3(一致時のシナリオジャンプ先)

s*もし装備=p1(装備アイテムナンバー 181〜380),p2(値 0 〜 99),p3(一致時のシナリオジャンプ先)

s*もし/=p1(スイッチナンバー 1〜1000),p2(値 0 〜 99),p3(一致時のシナリオジャンプ先)

s*もし金=p1(金額 0 〜 2100000000),p2(一致時のシナリオジャンプ先)

s*もし預金=p1(金額 0 〜 2100000000),p2(一致時のシナリオジャンプ先)

s*もしc=p1(枚数 0 〜 2100000000),p2(一致時のシナリオジャンプ先)

s*もし全勝数=p1(戦闘勝利回数 0 〜 2100000000?),p2(一致時のシナリオジャンプ先)

s*もし全逃数=p1(戦闘逃亡回数 0 〜 2100000000?),p2(一致時のシナリオジャンプ先)

s*pt=p1(キャラメンバー 1〜9),p2(加入有無 1で加入、0で外れる)

s*pts=p1(キャラ1加入有無 1で加入、0で非加入),p2(キャラ2 以下 同じ)…p9(キャラ9 以下 同じ)

s**pts順=p1(キャラ1配置 0〜9),p2(キャラ2 以下 同じ)…p9(キャラ9 以下 同じ)

s*もしpt=p1(キャラナンバー 1〜9),p2(存在有無 1で存在 0で非存在),p3(一致時のシナリオジャンプ先)

s*代入=p1(代入元アイテムもしくはスイッチナンバー i1〜i380または、/1〜/1000),p2(代入先アイテムもしくはスイッチナンバー i1〜i380または、/1〜/1000),p3(移動個数制限 省略時は複写、 1〜99で移動する数の制限をかける)

s*モード=p1(処理モード 0で通常、1〜で高速処理モード。省略する命令についてはd_etcにて指定。)。

メッセージ中に使える変数:

 %名1 キャラの名前(ここでは、キャラ1の名前)

 %順名1 指定した位置にいるキャラの名前(ここでは先頭)。

 %i名1 アイテム名(ここではアイテム1の名前)

 %i個1 アイテム個数(ここでは、アイテム1の個数)

 %/1 スイッチの中の値(ここではスイッチ1の値)

 %金 所持金

 %c 所持コイン枚数(charではありません)

 %預金 預金額

 %表記金 通貨の単位

目次に戻る

 5:サンプルシナリオ

  サンプルデータへのリンクです。ゲーム作成のサンプルとしてご利用下さい。
 このサンプルデータは改変しようが、引用しようが自由です。ただし、使った事によって何が起こっても責任を取りません。
 サンプルデータの中には、シナリオ以外のデータが混在している事があります。シナリオ以外のデータは、任意のファイルに移動してご使用下さい。

 サンプル1 シナリオ中で食堂を再現する

  店を利用する事で食品を注文する。シナリオというより店の改造が物を言う。

 サンプル2 シナリオ中でキャラの並び替えを行う

  自由なキャラの並び替えを動的に実現する。特にパーティを意識したRPGでは有用なルーチンになる。


ページのトップまで戻る
トップページに戻る

2008年 12月7日 By 諸熊