Dialog(会話文)を作成・追加する(1)




使うファイル

SoC
gamedata\config\
localization.ltx
system.ltx
gamedata\config\gameplay\
character_desc_XXX.xml
dialogs_XXX.xml
info_XXX.xml
gamedata\config\text\eng\
stable_dialogs_XXX.xml
※"XXX"の部分は任意。Cordon関係なら全部escapeになってる物を引っ張ればOK。

CS/CoP
保留。だいたい同じだと思う。

元になるテキストを用意する

まずは、"誰に"、"何を"喋らせるか考える。
今回のサンプルでは、みんなのアイドルNimble先生に、適当な会話をさせてみる。
上のファイルで言うと、stable_dialogs_XXX.xmlに該当部分を記述する。
新規にこの形式でファイルを作成してまとめておくとよりスマート。
但し、作った後に、localization.ltxのfilesにファイル名を追記しないと読んでくれない。ここ超大事。
既存のファイルに追記するなら、localization.ltxは弄らなくてもOK。

会話文サンプル
<string id="escape_nimble_tradejob_1">
	<text>よう!Marked One!ひとつ頼まれてもらってもいいか?</text>
</string>
<string id="escape_nimble_tradejob_2">
	<text>いきなりどうした?</text>
</string>
<string id="escape_nimble_tradejob_3">
	<text>ここしばらく、俺は Sidorovich の下で小遣い稼ぎをやってたが、今回のヤマはさすがに命の危険を感じたんだ。で、しばらくは腰を落ち着けて、Trader の真似事でもして小金を稼いでやろう、って思ったわけだ。</text>
</string>
<string id="escape_nimble_tradejob_4">
	<text>まあ、「捕らわれのお姫様」よりは安全だろうな。</text>
</string>
<string id="escape_nimble_tradejob_5">
	<text>ケッ、そこんところはアンタに感謝してるよ。… それはともかく、商売の話に戻ろうか。</text>
</string>
<string id="escape_nimble_tradejob_6">
	<text>Rookie 相手に商売か… 儲かりそうにないな。</text>
</string>
<string id="escape_nimble_tradejob_7">
	<text>俺だってそのくらいは分かってるし、あの Sid の目の前で派手に儲けるつもりなんてねえ。あくまで「小金」と商売のノウハウが残ればそれでいいんだ。</text>
</string>
<string id="escape_nimble_tradejob_8">
	<text>なるほどな。</text>
</string>
<string id="escape_nimble_tradejob_9">
	<text>まあ、手が空いてるときに一声掛けてくれ。いろいろ頼みたいことがあるんでな。</text>
</string>
<string id="escape_nimble_tradejob_10">
	<text>ああ。覚えとくよ。</text>
</string>

雑な会話で申し訳ないが、チュートリアルで軽くポマギったNimbleさんが、予定を早めてSoCでTrader修行を始める、という設定。
文章を読むとなんとなく分かるが、相手の台詞とまーくんの台詞が交互に書いてある。まーくんの台詞はもちろん選択肢として出る。


ここが一番楽しい作業になるかもしれないけど、気をつけるのは
  • 一つの文をやたら長くしない。チェックする方も疲れるので、「それで?」でも「…。」でもいいから入れて、タイミングよく切るとテンポよくなるかも。
  • 文章量そのものも少なくまとめる。あんまり掛け合いが長く続くと、この後の作業もものすごくめんどくさくなるし、読むほうも辛い。
  • どちらの台詞で始めて、どちらの台詞で終わるか意識して設定する。単に見た目上の問題なので、チェックしながら微調整を。

ダイアログを作成する

では、本番のクソめんどくさいダイアログの中身を設定する。
記述するのは、
新規にdialogs_XXX.xml系のファイルを作る場合は、system.ltxの[dialogs]に追記すること。

今回の会話は、特に選択肢もなく、1→2→3→…→10と流れて、まーくんの台詞で完結する。
以下、冗長な部分を除いた感じのサンプル。

会話文サンプル
  <dialog id="escape_nimble_tradejob_start">
     <has_info>tutorial_end</has_info>
     <dont_has_info>nimble_talked_tradejob</dont_has_info>
        <phrase_list>
           <phrase id="0">
              <text>escape_nimble_tradejob_1</text>
              <next>1</next>
           </phrase>
           <phrase id="1">
              <text>escape_nimble_tradejob_2</text>
              <next>2</next>
           </phrase>
                <!-- …中略… -->
             <phrase id="9">
              <text>escape_nimble_tradejob_10</text>
              <give_info>nimble_talked_tradejob</give_info>
              <action>dialogs.break_dialog</action>
           </phrase>
        </phrase_list>
  </dialog>

非常に乱雑になってきたので1つづつ解説。
まずは<dialog>~</dialog>。この間にダイアログ会話がまるまる1つ入る。
といっても、会話を始めてから終えるまでで1つの<dialog>。

<dialog>のすぐ下にある<has_info><dont_has_info>はダイアログ会話のキモになる部分。
<has_info>で設定された"情報"を持っていて、かつ<dont_has_info>で設定された"情報"を持っていないなら、以下の会話が展開される。
今回は、バニラで設定されているinfoの、"tutorial_end"(NimbleのFlashドライブを渡した時点で立つフラグっぽい)を持っていることが1つ目の条件。
助けたNimbleにいきなり商売の話されても困りますし。
2つ目は新規に設定するinfoで、"nimble_talked_tradejob"というのを作ってみる。
infoの作り方は後述するが、要するに"この話もうしたっけ?"フラグ的なもの。1回話せばもういい類の話には必須かも?
サンプルの最後で、<give_info>を使ってこのinfoを持たせている。
また、別のフラグ判定用タグとして、<precondition>というものもあるが、今回は割愛する。

<phrase_list>は会話1つ1つのリストを囲むタグ。
個々の会話は<phrase>の中に設定する。IDは数字で付けないと駄目かもしれない。
特に、最初のフレーズはIDが"0"じゃないと駄目なので注意。
また、先の<has_info>、<dont_has_info>、および<precondition>は<phrase>を表示する条件としても使える。
ミッション遂行中だと"あの仕事の件で来た。"と表示する、的な感じで使われる・・・と思う。

<text>の中に記述するのは、先ほどの会話文に付けた文章のID。localization.ltxに設定されてるファイルのテキストならだいたい読んでくれるはず。

<next>では、次の会話がどこに行くか指定する。ここに書くのはphraseのidで設定されている数字。

<action>は、外部のスクリプトから何かしらの関数を走らせる。
今回は特によく使うdialogs.break_dialogのみ使用した。
これが適用されると、そのphraseに入ったところで会話が終了する。
actor側(選択肢に出ている状態)なら、クリックしたところで終了するはず。

infoを定義する

ダイアログ会話に付き物のinfoを作ってやるなら、info_XXX.xmlを使う。
新規に作る場合は、system.ltxの[info_portions]に追記すること。

infoの定義は簡単。
  <game_information_portions>
     <info_portion id="nimble_talked_tradejob">
     </info_portion>
     …以下略
これだけでOK。ただのフラグなので、名前さえついてれば使えるらしい。
他にも設定項目はあるけどまだよく分からない。


NPCに作成した会話を追加する

ここまでの作業で、
1.会話文
2.会話の流れを設定したもの
が用意できたので、あとは、これを喋らせたいNPCに追記してやるだけ。
今回はNimbleさんにお願いするので、character_desc_escape.xmlに追記。
もし新規にcharacter_desc系のファイルを作る場合は、system.ltxの[profiles]に追記すること。
Nimbleさんの場合は、
<specific_character id="esc_shustryi" team_default = "1">
の中に追記する。ダイアログ会話を追加するには、<start_dialog>および<actor_dialog>で設定してやる必要がある。
この2つの違いは以下の通り。
<start_dialog>…会話を始めるのはNPCから(会話窓を開いた時点でスタートする)
<actor_dialog>…会話を始めるのはMarked Oneから(会話窓を開いたときの選択肢に追加される)
ここを取り違えると、全く逆の掛け合いが始まってしまうので注意。

さて、さらに大事なのが追記する場所。
Nimbleさんのデフォルト設定は以下の通り。
	<start_dialog>escape_shustryi_start</start_dialog>
	<start_dialog>dm_hello_dialog</start_dialog>
	<actor_dialog>dm_cool_info_dialog</actor_dialog>
	<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
	<actor_dialog>tm_shustriy_dialog</actor_dialog>
	<actor_dialog>tm_shustriy_reward</actor_dialog>
1つ目のstart_dialogがescape_shustryi_start。掴まっているときのもの。2つ目は通常の会話のときの挨拶(よう!みたいな感じの)。
あとの4つは選択肢。ここで大事なのは、条件付きで発生するdialogを、日常会話のdialogより"上"に書いてやること。
でないと、何を言っても挨拶しかされなくなる。たぶん。
今回のケースでは、一番上に追記して、
	<start_dialog>escape_nimble_tradejob_start</start_dialog>
	<start_dialog>escape_shustryi_start</start_dialog>
	<start_dialog>dm_hello_dialog</start_dialog>
	<actor_dialog>dm_cool_info_dialog</actor_dialog>
	<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
	<actor_dialog>tm_shustriy_dialog</actor_dialog>
	<actor_dialog>tm_shustriy_reward</actor_dialog>
としてやればとりあえずOK。この辺の判定は、まだ勉強中なので間違ってるかもしれない。
※<start_dialog>を複数(dm_hello_dialogを除いて2つ以上)設定すると、フラグ管理が怪しくなります。
今回は成功しましたが、頭にMarked Oneの台詞でも追加してactor_dialogにした方が無難です。

出来上がったものが

こちらになります。クリックで別窓。

とりあえずダイアログをいじる、という最初の目的は達成されました。
次は、やや高度なダイアログ制御をやっていきたい。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2011年02月24日 15:51