クエストのレコードには下記の項目がある。
(1) クエスト ID。他のファイルから このレコードを特定するために使われる。ID の手前に接頭子 qst_ が自動的に付加される。
(2) 名前。クエスト画面に表示される「題名」。
(3) フラグ群。指定可能なフラグは header_quests.py を参照のこと。
(4) 説明文。クエスト画面に表示される説明文。
注: setup_quest_text 命令を使うと、ゲーム実行中に「名前」と「説明文」を動的に変更できる。
module_quests.py は小さくて単純なファイルです。クエストと、それに関連するテキストが含まれています。ここに新しくクエストを追加するだけで、モジュール・システムを介して有効になります。クエストの状態は、命令を使って随時読み取ることができ、状態ごとに条件分岐することができます (訳注: 状態によって「説明文」を変えるには、{s#} のような「文字列レジスタの内容に置き換えられる場所」をいくつか含めておきます。)。また、各クエスト用のスロット(後述)を使うこともできます。
クエストのレコードの例を見てみましょう。
("deliver_message", "Deliver Message to {s13}", qf_random_quest,
"{!}{s9} asked you to take a message to {s13}. {s13} was at {s4} when you were given this quest."
),
これは、あちこちの王(や候伯)たちがプレイヤーに与えてくる、色々な「配達依頼」のうちの一つです [1]。各項目を詳しく見てみましょう。
(1) クエスト ID = "deliver_message"
(2) 名前 = "Deliver Message"(「伝文を届けよ」)
(3) フラグ群 = qf_random_quest
(4) 説明文 = "{s9} asked you to take a message to {s13}. {s13} was at {s4} when you were given this quest."
(「s9 は、s13 に伝文を届けるよう あなたに依頼した。このクエストを受けた時点で s13 は s4 にいた。」)
この配達クエストは文字列レジスタ {s9}、{s13}、{s4} を使っていて、依頼主が s9、受取人が s13、届ける場所が s4 で指定されます。他の似たようなクエストの行を見てみると、やはり常に s9 が依頼主、s13 が受取人(兵種や隊)、s4 が行先であるように見えます。
新しくクエストを作る場合、この web 文書の 定数モジュールのページで説明している「スロット」の一部をクエストに用いることになります。そうすることで、値を一ヶ所で管理でき、変更する必要が生じても一ヶ所の変更で済みます。もう一つの利点は、プレイヤーにとって複数のクエストが進行中の場合、(開発者のミスにより)変数が混線して上書きし合う心配が無くなることです。各クエストには(他のオブジェクトと同様)独立したスロットがあるからです。
新しいクエスト(のレコード)を作ること自体はほんの少しの手間で済みますが、それがゲームで機能するようにするには ずっと多くの作業が必要、ということは容易に想像がつくでしょう。プレイヤーがクエストを得る場所、クエストで役割を演じる「役者」、そしてクエストを面白いものにするための会話文、といったものが必要になります。
フラグ群
フラグ群に特に指定したいものが無ければ、0 を指定します。何か指定するとしたら、次の 2 つがあります。
| qf_show_progression |
このクエストの進行具合をパーセントで示す。 (訳注: Native では、シーンの中で、破壊可能な物が主人公の目の前にあるような場面で使っている。) |
| qf_random_quest | このクエストがランダムに発生するようにする。 |
クエスト追加の要点 [2]
独自のクエストを作る際の基本的なことをまとめます。まず、クエストを開始するための次のような命令を、どこかの「結果ブロック」(例えば「会話」(dialoge)のレコードの後半など)に置きます。
[[assign,"$do_stuff_quest_active",1],
[setup_quest_text,"qst_do_stuff"],
[start_quest,"qst_do_stuff"]]],
- [[assign,"$do_stuff_quest_active",1], 実際のクエストと直接は関係ありませんが、後でクエスト関連の「条件ブロック」と「結果ブロック」のコードを書く時に役立ちます。 (訳注: グローバル変数に 1 を代入。つまり、次行のような ID を持つ特定のクエストが開始したことを他のコードから知るための自作フラグ。)
- [setup_quest_text,"qst_do_stuff"], は qst_do_stuff というクエストの説明文をアクティブにします。経験上、これは厳密には必要ではなく、安全策です。
- [start_quest,"qst_do_stuff"]], 独自クエストを実際に発動します。
このような方法は、module_dialogs.py、module_game_menus.py、module_triggers.py 内で(あるいは他でも)使えます。
次に、module_quests.py の最後のほうにクエストのレコードを書きます。
("do_stuff", "Do some really amazing stuff", qf_show_progression,
"Some guy asked you to do some really amazing stuff, and he'll give you some gold."
),
- ("do_stuff", "Do some really amazing stuff", qf_show_progression, という部分が動作のほとんどを決めています。第 1 項目はクエストの ID(他ファイルから参照時は前述のように qst_ を付ける)、第 2 項目はクエスト画面の左上に表示される短い題名です。その後ろが進行具合を表示させるフラグです。
- "Some guy asked you to do some really amazing stuff, and he'll give you some gold." これは、クエスト画面の左の広い区画に表示される、長いクエスト説明文です。 (訳注: 「誰かが あなたに とても面白いことをするよう依頼した。彼は報酬を出すそうだ。」)
- そして括弧閉じとカンマ「),」が このレコードの終端と区切りですね。
ここまで できたら、このクエストに含めたい内容(会話、戦闘など)を記述します。
クエストを終わらせるには、例えば次のような命令列を実行します。
[[add_xp_as_reward,100],
[complete_quest,"do_stuff"],
[set_quest_progression,"qst_do_some_more_stuff",40],
[assign,"$quest_succeeded_do stuff",1]]],
- [[add_xp_as_reward,100], はクエストの報酬として経験値(XP)を追加しています。他に add_gold_to_troop、add_item_to_troop などでプレイヤーに報酬(金銭や物品)を与える方法もあります。
- [complete_quest,"do_stuff"], でクエストを完了させます。succeed_quest や fail_quest を使うこともできますが、(成否によって分岐しないような)単純な内容なら不要です。
- クエストに qf_show_progression フラグを指定している場合は、上の [set_quest_progression,"qst_do_some_more_stuff",40], のような命令で進行度(%)の表示を変更できます。この例では(最初の do_stuff とは別の)do_some_more_stuff というクエストが 40 % 完了したことを表示します。
- [assign,"$quest_succeeded_do stuff",1]]], は、プレイヤーが このクエストに成功したか、失敗したか、あるいは その他の終わり方をしたか、といったことを後続の「条件ブロック」などに伝えます。変数や値は自由です。
基本的なクエストに必要なのは以上です。もっと複雑なもの、特にヒーローが関与するクエストでは、より複雑な仕上げが必要になります。
その他の注意点
クエストとスロット(同ページの後ろの方も)。 Khamukkamu と kalarhan, Modding Q&A
クエスト。 kalarhan, Modding Q&A
- 脚注と出典:
- [1] そのレコードのすぐ上に書かれたのコメントにあるように、この特定のクエストは module_constants.py で為政者からのクエストとして定義されています。 繰り返しますが、コメントは読むようにして下さい。 ほとんどの場合、役立つ情報が含まれています。 (訳注: そのコメントは「# Note : This is defined as the first governer quest in module_constants.py:」。また、module_constants.py には「lord_quests_begin = "qst_deliver_message"」という行があります。)
- [2] 右の投稿より。 Winter, Modding Q&A。 ただし、古いバージョンのモジュール・システム向けなので、正しくないかも。要検証。