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




使うファイル

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
gamedata\scripts\
dialogs.script
その他任意のスクリプトファイル
※"XXX"の部分は任意。Cordon関係なら全部escapeになってる物を引っ張ればOK。

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

ダイアログの制御

今回は、ただテキストを並べるだけではなく、もうちょっと高度なダイアログを作成する。
Nimbleシリーズの流れで、ちょっとしたミニクエスト形式でやってみたい。

会話文サンプル
  <string id="nimble_tradejob_bandage_start_1">
     <text>それで、「商売」の方はうまく行きそうか?</text>
  </string>
  <string id="nimble_tradejob_bandage_start_2">
     <text>ああ、それなりにな。で、頼みたいことがあるんだが、いいか?</text>
  </string>
  <string id="nimble_tradejob_bandage_start_3">
     <text>とりあえず話を聞こうか。</text>
  </string>
  <string id="nimble_tradejob_bandage_start_4">
     <text>まあ、難しいことじゃないし、何かのついでで構わないんだが、ちょっとした商品の「仕入れ」を手伝ってくれ。</text>
  </string>
  <string id="nimble_tradejob_bandage_start_5">
     <text>「仕入れ」ねえ…。で、何を「買い付け」ればいいんだ、オーナー?</text>
  </string>
  <string id="nimble_tradejob_bandage_start_6">
     <text>ハハッ、そうからかうなって。今回は包帯を10本手に入れてくれ。ちゃんとパッケージされてる品ならどこから手に入れても構わない。</text>
  </string>
  <string id="nimble_tradejob_bandage_start_7">
     <text>なるほど、医療品とは手堅い商売だな。Sidorovich から買ってもいいんだな?</text>
  </string>
  <string id="nimble_tradejob_bandage_start_8">
     <text>もちろん!だが、それで儲けが出る、なんて甘いことは考えてないよな?</text>
  </string>
  <string id="nimble_tradejob_bandage_start_81">
     <text>おっと、丁度持ち合わせがあるが、これでもいいか?</text>
  </string>
  <string id="nimble_tradejob_bandage_start_82">
     <text>分かってるさ。それじゃ、適当に集めてくるか…</text>
  </string>
これがサンプルクエスト。いわゆる包帯を10個持ってくればおk、というもの。
1~8までは普通に流れているが、そこから"包帯を持っている場合"と"包帯が足りない場合"の会話文に分岐している事が分かる。


  <string id="nimble_tradejob_bandage_end_1">
     <text>包帯を持ってきたぞ。確認してくれ。</text>
  </string>
  <string id="nimble_tradejob_bandage_end_2">
     <text>ひい、ふう、みい…よし、これなら問題ないぞ。報酬はこんなもんでいいだろ。</text>
  </string>
  <string id="nimble_tradejob_bandage_end_3">
     <text>毎度あり!</text>
  </string>
こちらが報告時に使うダイアログ。これは、先の受領時の"包帯を持っている場合"でも一部流用する。

これを踏まえて、ダイアログの"分岐"と"条件チェック"をやってみる。

ダイアログの分岐

まずは、記述のサンプルから。
Dialogサンプル
  <dialog id="escape_nimble_tradejob_bandage_start">
     <has_info>nimble_talked_tradejob</has_info>
     <dont_has_info>nimble_tradejob_bandage_start</dont_has_info>
     <phrase_list>
        <phrase id="0">
           <text>nimble_tradejob_bandage_start_1</text>
           <next>1</next>
        </phrase>
  …中略…
        <phrase id="7">
           <text>nimble_tradejob_bandage_start_8</text>
           <next>71</next>
           <next>72</next>
        </phrase>
        <phrase id="71">
           <precondition>rr_dialog.have_10bandage</precondition>
           <text>nimble_tradejob_bandage_start_81</text>
           <next>8</next>
        </phrase>
        <phrase id="72">
           <text>nimble_tradejob_bandage_start_82</text>
           <give_info>nimble_tradejob_bandage_start</give_info>
           <action>dialogs.break_dialog</action>
        </phrase>
        <phrase id="8">
           <text>nimble_tradejob_bandage_end_2</text>
           <action>rr_dialog.give_10bandage</action>
           <action>rr_dialog.pay_10bandage_task</action>
           <next>9</next>
        </phrase>
        <phrase id="9">
           <text>nimble_tradejob_bandage_end_3</text>
           <give_info>nimble_tradejob_bandage_start</give_info>
           <give_info>nimble_tradejob_bandage_end</give_info>
           <action>dialogs.break_dialog</action>
        </phrase>
     </phrase_list>
  </dialog>
(※IDとtextの番号が合わないのはご勘弁を。テキスト書くときにIDを1から振っちゃったせいです)
基本的には前回の流れと同じだが、id="7"のところで、nextを2つ記述している。
71は包帯を持っている場合、72はそうじゃない場合・・・ただし、バニラのダイアログがそうであるように、例え持っててもキャンセルできるように、72は特に条件無しで出す。

71の条件付けに使っているのが<precondition>タグ
前提条件として、それをパスすれば選択肢が表示される、というわけ。
この方法を使って、2つとも表示されない場合や、相手の会話文が2つ表示される場合、みたいなのは未検証。まあ、そんなものはやらないに越したことはないでしょう。

中身のrr_dialog.have_10bandageに関しては、次の項で。
要するに、包帯を持っていれば、71の選択肢を表示して、選択されたら8に進む。
持っていなくても、72の選択肢を表示して、選択されたときには"ミッションを受けました"フラグを立てて会話終了。
71にミッション受けましたフラグがないのは、すぐFキーで会話終了されるとフラグ管理が面倒になりそうなので・・・今回のケースでは必要ないだろうけど、出来るだけギリギリまでフラグは渡さない。

8では2つのアクションを呼んでいる。
1つ目は、10本のBandageを渡す関数。
2つ目は、それに対する報酬を渡す関数。
この2つの詳細も次項で。

最後の9では、ミッションの開始、および終了フラグを一気に渡して会話終了している。

また、同様の流れでescape_nimble_tradejob_bandage_endも作成しておく。ソースは省略。

スクリプトに記述した関数を呼び出す

今回は、<action>および<precondition>で呼び出す関数に幾つかバリエーションが出てきたのでそこを本項でちょっと突っ込んで説明。
前回出てきたのは、会話を切り上げるdialogs.break_dialog。これは、scripts\dialogs.script内の関数break_dialogを呼び出す、ということ。
つまり、このフォーマットでaction、もしくはpreconditionを追加してやれば、script関数で会話における細かい制御を行える。

サンプルで使用したのは、
  <precondition>rr_dialog.have_10bandage</precondition>
  <action>rr_dialog.give_10bandage</action>
  <action>rr_dialog.pay_10bandage_task</action>
この3つ。それぞれrr_dialog.scriptを作成して記述してある。

have_10bandageでは、手持ちの包帯が10個以上あるかどうか確認し、あれば"true"を返す。
give_10bandageは、包帯10個を渡す。
pay_10bandage_taskで、ミッションの報酬を渡す。
次項で、この3つの関数の中身について触れる。

dialog関数の例

デバッグ中。
have_10bandage

give_10bandage

pay_10bandage_task

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

今回もcharacter_desc_escape.xmlに追記。

今回のケースでは、<actor_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>escape_nimble_tradejob_bandage_start</actor_dialog>
  <actor_dialog>escape_nimble_tradejob_bandage_end</actor_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。<actor_dialog>の追記位置は、そのまま選択肢の位置になる。
<start_dialog>の場合と違って、特にフラグ管理で困ることはないので雑においてやって構わないはず。

出来上がったものは

まだ出来てません。


会話表示くらいは出来るのだけど、スクリプトのデバッグと、<start_dialog>で会話文追加する場合の問題が出てきているのでそれを治すまでSSはなし。
ついでにテキストも成形しなおし中。
たぶん、<start_dialog>を3つ4つ入れると、仕様的に想定してないのか、なんかの条件がおかしくなったのか、dm_hello_dialogが呼び出されて終わりになってしまう。

救出したNimbleさんが"よう!"しか言ってくれなくなったらそういう事になってるのかもしれない。

別の方法で回避する前に、その手の記述がどこかにないか捜索中・・・。この記事はそれまで未完成放置します。

タグ:

+ タグ編集
  • タグ:

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

最終更新:2012年02月14日 02:05