2015/11/10
■ [変愚蛮怒/開発]クエスト情報の仕様(前編)(変愚蛮怒 ver2.1.5)
某所で質問があったことをさり気に教えられたので、久々のバリアント開発向け情報の解説記事をば。
ファイル構成
現在の所、変愚で実装されているクエストの情報は/lib/editのq*.txtで定義されている。ファイル名の文字は原則8文字、大半は数値のみになっているが、これは極めて古いOSの仕様上の問題なので今となっては遵守する必要はない。
変愚蛮怒のシステム側は、クエスト情報を参照する際は常に、q_info.txtから参照を開始する。q_info.txtはスクリプト処理による分岐が行われており、
# File: q_info.txt # Includes all the quest files # Quest feature preferences %:q_pref.txt # Thieves Hideout ?:[EQU $QUEST_NUMBER 1] %:q0000001.txt # Sever ?:[EQU $QUEST_NUMBER 2] %:q0000002.txt # Druid Shop ?:[EQU $QUEST_NUMBER 3] %:q0000003.txt # Vault ?:[EQU $QUEST_NUMBER 4] %:q0000004.txt # Tower ?:[EQU $QUEST_NUMBER 5] %:q0000005.txt
という形でクエストIDごとに参照するファイルを指定する形になる。新しくクエストを追加する時はまだ未使用のランダムクエストIDを一つ指定して、新しく作成したクエスト情報ファイルに飛ぶよう指定すればよい。
ただし、40~88は鉄獄のランダムクエストに使われているため、使用を避けた方が良い。(q_random.txt参照)
クエスト特性の記述
クエストの種別によっては特別にマップを記述する必要があるが、その方法は後日解説し、今回は各ファイル毎にクエストの性質そのものを指定する方法を解説する。
各ファイルのクエスト情報記述は必ず、"Q:[クエストID]:"をつけて行う、英文の情報ならば"Q:$[クエストID]:"とする。
そこから以下のように必要なヘッダをつけていくこと。例示は「エリックの要塞」や必要に応じて他のクエストから行う。
「N:」クエスト名
Q:[クエストID]:N:[クエスト名]
Q:$15:N:Eric's Stronghold Q:15:N:エリックの要塞
各クエスト情報で表示されるクエストの名称を指定する
「Q:」クエストの基本情報
Q:[クエストID]:[クエストタイプ]:[目標撃破数1]:[現在撃破数]: [目標撃破数2]:[目標階層]:[目標モンスターID]:[目標アイテムID]:[目標ダンジョンID]:[フラグ値]
Q:$15:Q:1:0:0:1:70:813:0:0:6 Q:15:Q:1:0:0:1:70:813:0:0:6
最も重要なのは[クエストタイプ]でクエストそのものの挙動を指定している値である。これを正しく指定しないとそもそもまともに動作しない。他の指定値は[フラグ値]を除いて、クエストタイプ毎に付随するものに過ぎないので、それに留意して[クエストタイプ]解説を進める。
[クエストタイプ]はハードコーディング上では以下のように定義されている。
/* * Quest type */ #define QUEST_TYPE_KILL_LEVEL 1 /*!< クエスト目的: 特定のユニークモンスターを倒す */ #define QUEST_TYPE_KILL_ANY_LEVEL 2 /*!< クエスト目的: イベント受託時点でランダムで選ばれた特定のユニークモンスターを倒す */ #define QUEST_TYPE_FIND_ARTIFACT 3 /*!< クエスト目的: 特定のアーティファクトを発見する */ #define QUEST_TYPE_FIND_EXIT 4 /*!< クエスト目的: 脱出する */ #define QUEST_TYPE_KILL_NUMBER 5 /*!< クエスト目的: モンスターを無差別に特定数倒す */ #define QUEST_TYPE_KILL_ALL 6 /*!< クエスト目的: エリア中のすべてのモンスターを全て倒す */ #define QUEST_TYPE_RANDOM 7 /*!< クエスト目的: ランダムクエストとして選ばれたユニーク1体を倒す */ #define QUEST_TYPE_TOWER 8 /*!< クエスト目的: 複数のエリアの全てのモンスターを倒す */
- タイプ1(QUEST_TYPE_KILL_LEVEL)は特定のダンジョンあるいはクエストフィールドに必ず生成される特定のモンスターを撃破対象にする。
- このタイプは「エリックの要塞」のように特定のマップので特定のユニーク(エリック)を撃破するタイプの他、「オベロン」、「混沌のサーペント」、「ワーグを殱滅せよ」のように「各ダンジョンの一定階層で必ず生成され、それより下にもぐろうとするのを阻む敵を倒せ」というタイプのクエストも指定できる。
- [目標撃破数1]は未使用。
- [現在撃破数]はデフォルトで既に撃破していることになっている数が指定できるようだが、あまり意味があるとは言えない。0で問題ない。
- [目標撃破数2]で倒さねばならない数を指定する
- [目標階層]でクエストマップの相当階数か、目標となるダンジョン階層を指定する
- [目標モンスターID]で目標モンスターのIDを指定する
- [目標アイテムID]は未使用
- [目標ダンジョンID]で目標モンスターが必ず生成されるダンジョンのIDを指定する。これが0ならば別途定義するクエストマップ上で倒すことになる。
- タイプ2(QUEST_TYPE_KILL_ANY_LEVEL)は受諾時点でターゲットとなったモンスターをどこででもよいので、指定数撃破するタイプのクエストである。昔は「海底都市」クエストで指定されていたが、現在その頃とは食い違う仕様になっており、今も動作保証できるか分からない。
- [目標撃破数1]は未使用。
- [現在撃破数]はクエスト開始時点で0になるため全く設定の意味を持たない。
- [目標撃破数2]で倒さねばならない数を指定する
- [目標階層]で撃破対象となるモンスターの対象階層を指定する。対象モンスターは受諾時点で[目標階層]+4+1d6階までに生成されるモンスターから選ばれる。
- [目標モンスターID]は前述の処理で上書きされるので無意味
- [目標アイテムID]は未使用
- [目標ダンジョンID]は未使用
- タイプ3(QUEST_TYPE_FIND_ARTIFACT)は特定のアーティファクトを拾った時点で達成となる。変愚実装で使われているのは固定マップの「宝物庫」クエストだが、ランダムマップ冒険中のどこかで拾った時点で達成とするタイプの実装もできる、かもしれない。
- [目標撃破数1]は未使用。
- [現在撃破数]は未使用。
- [目標撃破数2]は未使用。
- [目標階層]は固定マップを指定した場合の相当階層
- [目標モンスターID]は未使用
- [目標アイテムID]で発見対象となるアーティファクトのIDを指定するが、後述のランダム指定を行うとクエスト受諾時に変化させられる。
- [目標ダンジョンID]は常に0とするべき。
- 目標のアーティファクトは以下のようにランダムなID指定を行うこともできる。
Q:$4:R:88:76:90:93:98:101:102:103:105:106:110:113:114:116: 118:119:128:136:145:155:167:202:208:213:227:228
- タイプ4(QUEST_TYPE_FIND_EXIT)は特定のフロアを脱出した時点で達成となる。正確にはFF_QUEST_EXITフラグのついた昇降地形で移動を行った瞬間に達成となる。現在は「湖の洞窟」クエストで使われている。
- [目標撃破数1]は未使用。
- [現在撃破数]は未使用。
- [目標撃破数2]は未使用。
- [目標階層]は固定マップを指定した場合の相当階層、[目標ダンジョンID]を0以外にしたら、必要到達階層にできるかも知れないが未検証。
- [目標モンスターID]は未使用
- [目標アイテムID]は未使用
- [目標ダンジョンID]はQUEST_FLAG_PRESETがONならば、ダンジョンの指定ができるかも知れない。
- タイプ5(QUEST_TYPE_KILL_NUMBER)はともかく依頼を受けた時点でモンスターIDを指定せず、ひたすら敵を目標数倒せば達成できる模様。現在対応するクエスト実装はないので、動作は保証しきれない。
- このタイプのクエストは目標撃破数判定は1の欄で行うが、クエスト情報の表示では2を基準に表示する仕様になっている。明らかに不健全で意味不明な仕様さだが、ともかく現状はそうなっている。
- [目標撃破数1]は撃破判定基準値
- [現在撃破数]は現在の撃破数の初期値指定。勝手に初期化される形跡はないが、指定して意味のある感じではない。
- [目標撃破数2]は表示基準値。
- [目標階層]は未使用。
- [目標モンスターID]は未使用。
- [目標アイテムID]は未使用。
- [目標ダンジョンID]は未使用。
- タイプ6(QUEST_TYPE_KILL_ALL)はフロアのモンスターを皆殺しにするクエストで、盗賊クエスト、クローン地獄等大半の固定マップクエストがこれに当たる。クエスト中のマップはモンスターの自然生成が抑止されるので、ダンジョンの特定階層でもこれを指定できるかも知れない。
- [目標撃破数1]は未使用。
- [現在撃破数]は未使用
- [目標撃破数2]は未使用。
- [目標階層]は固定マップを指定した場合の相当階層、[目標ダンジョンID]を0以外にしたら、必要到達階層にできるかも知れないが未検証。
- [目標モンスターID]は未使用。
- [目標アイテムID]は未使用。
- [目標ダンジョンID]は後述のQUEST_FLAG_PRESETによりダンジョンの指定ができるかも知れない。
- タイプ7(QUEST_TYPE_RANDOM)はランダムクエスト用でゲーム開始時にユニークが撃破対象になる。
- [目標撃破数1]は未使用。
- [現在撃破数]は原則0とすべき、バグが発生するかも知れない。
- [目標撃破数2]はゲーム開始時に自動で1になる。
- [目標階層]は固定マップを指定した場合の相当階層、[目標ダンジョンID]を0以外にしたら、必要到達階層にできるかも知れないが未検証。
- [目標モンスターID]はゲーム開始時に勝手に上書きされるので指定の意味がない。
- [目標アイテムID]は未使用。
- [目標ダンジョンID]は現状1=鉄獄しか指定例がないが、他の値にすることで他のダンジョンにもランダムクエストを配置できるかも知れない。
- タイプ8(QUEST_TOWER)は「塔」のような複数のマップで全滅を行う必要があるマップで指定されるが、ハードコーディング上の処理が多数入り組んでおり、現在「塔」以外で指定してもバグが避けられないので割愛。
- [フラグ値]は各イベントに共通する性質をビット値で指定する。
- +1(QUEST_FLAG_SILENT)でクエスト情報での表示が抑止される。ランダムクエストなどで指定される。
- +2(QUEST_FLAG_PRESET)でクエストがダンジョンの外の昇降マスから突入できる形になる、そうでなければダンジョンIDが適用される可能性がある。
- +4(QUEST_FLAG_ONCE)は一部のクエストタイプでクエスト中のマップから離れると、その時点でクエストの成否判定が行われる。
- +8(QUEST_FLAG_TOWER)は「塔」クエスト向けの特殊なもので、他で指定するとバグが起こる可能性がある。