ミッションの作成
NPCはプレイヤーにミッションを依頼することができます。ミッションは通常、以下のような構造で定義されます:
{
"id": "MISSION_GET_BLACK_BOX_TRANSCRIPT",
"type": "mission_definition",
"name": "Retrieve Black Box Transcript",
"description": "Decrypt the contents of the black box using a terminal from a nearby lab.",
"goal": "MGOAL_FIND_ITEM",
"difficulty": 2,
"value": 150000,
"item": "black_box_transcript",
"start": {
"effect": { "u_buy_item": "black_box" },
"assign_mission_target": { "om_terrain": "lab", "reveal_radius": 3 }
},
"origins": ["ORIGIN_SECONDARY"],
"followup": "MISSION_EXPLORE_SARCOPHAGUS",
"dialogue": {
"describe": "With the black box in hand, we need to find a lab.",
"offer": "Thanks to your searching we've got the black box but now we need to have a look'n-side her. Now, most buildings don't have power anymore but there are a few that might be of use. Have you ever seen one of those science labs that have popped up in the middle of nowhere? Them suckers have a glowing terminal out front so I know they have power somewhere inside'em. If you can get inside and find a computer lab that still works you ought to be able to find out what's in the black box.",
"accepted": "Fuck ya, America!",
"rejected": "Do you have any better ideas?",
"advice": "When I was play'n with the terminal for the one I ran into it kept asking for an ID card. Finding one would be the first order of business.",
"inquire": "How 'bout that black box?",
"success": "America, fuck ya! I was in the guard a few years back so I'm confident I can make heads-or-tails of these transmissions.",
"success_lie": "What?! I out'ta whip you're ass.",
"failure": "Damn, I maybe we can find an egg-head to crack the terminal."
}
}
type
必須項目です。常に "mission_definition" である必要があります。
id
ミッションIDは必須です。新規ミッションの場合は任意の名前を付けられますが、慣例として "MISSION_" で始め、内容が分かりやすい名前にします。
name (ミッション名)
必須項目です。ミッションメニュー 'm'キーでプレイヤーに表示される名前です。
description (ミッションの説明)
必須ではありませんが、ミッションに関する関連情報を要約して記述することを強く推奨します。プレイヤーに実害がない場合に限り、報酬として "u_buy_item" 形式でアイテムを指定して言及することも可能です (以下の例を参照):
"id": "MISSION_EXAMPLE_TOKENS",
"type": "mission_definition",
"name": "Murder Money",
"description": "Whack the target in exchange for <reward_item:FMCNote> c-notes and <reward_item:cig> cigarettes.",
"goal": "MGOAL_ASSASSINATE",
"end": {
"effect": [
{ "u_buy_item": "FMCNote", "count": 999 },
{ "u_buy_item": "cig", "count": 666 } ]
}
このシステムは将来的に、他のミッションパラメータや効果を参照できるよう拡張される可能性があります。
goal (目的)
必須項目です。以下のいずれかの文字列を指定します:
| goal 文字列 | 達成条件 |
|---|---|
MGOAL_GO_TO |
指定された広域マップ(Overmap)のタイルに到達する |
MGOAL_GO_TO_TYPE |
指定された種類の広域マップタイルのいずれかに到達する |
MGOAL_COMPUTER_TOGGLE |
正しい端末を起動すると完了 |
MGOAL_FIND_ITEM |
指定された種類のアイテムを1つ以上見つける |
MGOAL_FIND_ITEM_GROUP |
指定されたアイテムグループからアイテムを1つ以上見つける |
MGOAL_FIND_ANY_ITEM |
このミッション用にタグ付けされた特定のアイテムを見つける |
MGOAL_FIND_MONSTER |
友好的なモンスターを見つけて連れ帰る |
MGOAL_FIND_NPC |
特定のNPCを見つける |
MGOAL_TALK_TO_NPC |
特定のNPCと話す |
MGOAL_RECRUIT_NPC |
特定のNPCを仲間に加える |
MGOAL_RECRUIT_NPC_CLASS |
特定のクラスのNPCを仲間に加える |
MGOAL_ASSASSINATE |
特定のNPCを殺害する |
MGOAL_KILL_MONSTER |
特定の敵対モンスターを殺害する |
MGOAL_KILL_MONSTER_TYPE |
特定の種類のモンスターを規定数殺害する |
MGOAL_KILL_MONSTER_SPEC |
特定の種族のモンスターを規定数殺害する |
MGOAL_CONDITION |
動的に作成された条件を満たし、依頼主と話す |
monster_species
"MGOAL_KILL_MONSTER_SPEC" (特定種族の殺害)を使用する場合に、対象となるモンスターの種族を指定します。
monster_type
"MGOAL_KILL_MONSTER_TYPE" (特定種類の殺害)を使用する場合に、対象となるモンスターの種類IDを指定します。
monster_kill_goal
"MGOAL_KILL_MONSTER_SPEC"および"MGOAL_KILL_MONSTER_TYPE"において、ミッション完了までに必要な殺害数を指定します。
goal_condition
"MGOAL_CONDITION" (特殊条件)を使用する場合に、ミッション完了と判定されるための条件を定義します。条件の記述方法については NPCs.mdで詳しく解説されており、ミッションでも全く同じ構文を使用します。
dialogue
NPCがミッションの依頼時や報告時に話すテキストです。ミッションで使われない項目であっても、以下の全てのIDを定義する必要があります。
| 文字列 ID | 用途 |
|---|---|
describe |
ミッションの概要説明 |
offer |
プレイヤーが検討のためにミッションを選択した際の詳細説明 |
accepted |
プレイヤーがミッションを引き受けた時の反応 |
rejected |
プレイヤーが依頼を断った時の反応 |
advice |
プレイヤーが攻略のヒントを求めた時の台詞 |
inquire |
進行状況を尋ねる時の台詞(NPC側から聞く場合) |
success |
成功報告を受けた時の反応 |
success_lie |
成功したと嘘をつき、それを見破った時の反応 |
failure |
失敗報告を受けた時の反応 |
start (開始時処理)
任意項目です。文字列として記述する場合、それは mission_start::内にある関数の名前である必要があります。この関数はミッションポインタを受け取り、開始時のコードを実行します。これにより、標準的なミッションタイプ以外の特殊な挙動をさせることが可能です。※現在"MGOAL_COMPUTER_TOGGLE" (端末操作)を伴うミッションを設定するには、ハードコードされた関数が必要です。
また、文字列の代わりに、以下で説明する「オブジェクト形式」で記述することもできます。
start / end / fail effects (開始・終了・失敗時のエフェクト)
これらの任意項目が設定されている場合、以下のフィールドを含むオブジェクトとして記述できます:
effect
NPCs.mdで定義されているものと全く同じ形式の「エフェクト配列」です。ここに含まれるすべての値を使用できます。どの場合においても、対象となるNPCは「ミッションの依頼主」となります。
reveal_om_ter (地形の開示)
広域マップ (Overmap)の地形IDを、文字列または文字列のリストで指定します。指定されたID (リストの場合はその中からランダムに1つ) に一致する広域マップ上のタイルが1ヵ所探索済みになり、さらに3分の1の確率で、その地点までの道路ルートも開示されます。
assign_mission_target (ミッション目標地点の指定)
assign_mission_target オブジェクトは、特定の地形を探索 (あるいは必要に応じて生成)し、それをミッションの「目標地点」として指定するための条件を定義します。このパラメータによって、地点の選定方法や、選定後のエフェクト(周辺エリアの視界確保など)を制御できます。om_terrain フィールドのみが必須項目です。
| 識別子 | 説明 |
|---|---|
om_terrain |
目標として選択される広域マップ(Overmap)地形のID。必須項目です。 |
om_terrain_match_type |
om_terrainの照合ルールを指定します。デフォルトは TYPE です。詳細は後述します。 |
om_special |
対象の地形が含まれる「広域マップスペシャル(Overmap Special)」のID。 |
om_terrain_replace |
om_terrain が見つからなかった場合に探索・置換の対象となる地形のID。 |
reveal_radius |
地図上で視界を確保する (霧を晴らす) 半径(広域マップ座標単位)。 |
must_see |
trueの場合、すでに探索済みの地形からのみ om_terrain を探します。 |
cant_see |
trueの場合、まだ探索されていない地形からのみ om_terrain を探します。 |
random |
trueの場合、条件に合う地形om_terrainからランダムに選択します。falseの場合は最も近い地点を選択します。 |
search_range |
om_terrainを探索する範囲 (広域マップ座標単位)。 |
min_distance |
指定した範囲内にある om_terrain を無視します(近すぎる場所を避ける際に使用)。 |
origin_npc |
プレイヤーの現在位置ではなく、NPCの現在位置を中心に探索を開始します。 |
z |
指定した場合、プレイヤーやNPCの階層に関わらず、このZレベル(階層)を探索します。 |
offset_x,<br>offset_y,<br>offset_z |
om_terrain地形を発見・生成した後、ミッション目標地点を指定した座標分だけオフセット(移動)させます。 |
example
{
"assign_mission_target": {
"om_terrain": "necropolis_c_44",
"om_special": "Necropolis",
"reveal_radius": 1,
"must_see": false,
"random": true,
"search_range": 180,
"z": -2
}
}
もし om_terrain が「広域マップスペシャル(Overmap Special)」の一部であるなら、 om_special の値も併せて指定することが不可欠です。そうしないと、ゲーム側がそのスペシャル全体をどのように生成すればよいか判断できなくなります。
om_terrain_match_type は、未指定の場合はデフォルトで TYPEに設定されます。以下の値を指定可能です:
-
EXACT- 指定した文字列が、広域マップ地形IDと完全に一致する必要があります。これには、直線状の地形を示す方向サ フィックスや、回転済みの地形を示す回転サフィックスも含まれます。 -
TYPE- 指定した文字列が、広域マップ地形IDの基本タイプIDと完全に一致する必要があります。つまり、回転や直線地形 に関するサフィックスは無視されます。 -
PREFIX- 指定した文字列が、広域マップ地形IDの完全な接頭辞(アンダースコアで区切られた最初の部分)である必要が あります。例えば、"forest" は "forest" や "forest_thick" には一致しますが、"forestcabin" には一致しません。 -
CONTAINS- 指定した文字列が広域マップ地形IDの中に含まれている必要があります。位置(先頭・中間・末尾) は問わ ず、アンダースコアの区切りルールも適用されません。
om_special を新たに配置する必要がある場合、そのスペシャルの定義で定められた配置ルール (配置可能な地形、都市からの距離、道路接続など)に従います。そのため、配置ルールが厳格であればあるほど、配置に失敗する可能性が高くなります(すでに生成済みの他のスペシャルとの場所の取り合いになるためです)。
om_terrain_replace は、om_terrainが広域マップスペシャルの一部ではない場合にのみ関係します。この値は om_terrainが見つからなかった場合に使用され、代替のターゲットとして探し出された後、その場所が om_terrain の値に置き換えられます。
must_see を true に設定した場合、対象の地形が見つからなくても、ゲーム側で新しく地形を生成することはありません。これは、プレイヤーがすでに探索したエリアに新しい地形が魔法のように突然現れるのを避けるための仕様です。
reveal_radius (視界確保半径)、min_distance (最小距離)、search_range (探索範囲)はすべて広域マップ座標(OMT:Overmap Terrain単位)で指定します(現在、1つの広域マップは 180x180 OMTユニットで構成されています)。探索は通常プレイヤーを中心に計算されますが、origin_npcが設定されている場合はNPCを中心とします。現状、この両者に差が出ることは稀ですが、無線越しにミッションを受注する場合などに影響します。探索処理は既存の広域マップを優先し(既存マップで見つからない場合のみ、新しいマップを生成します)、プレイヤーと同じZレベル(階層)でのみ実行されます。z 属性を使用すると、これを上書きしてプレイヤーとは別の階層を探索できます。この値は相対値ではなく絶対値です。
offset_x、offset_y、offset_z は、ミッション目標の最終的な位置を指定した値だけ移動させます。これにより、ミッションの目的地がom_terrainで指定した地形そのものではなくなる (隣のマスにずれる等) 場合があります。
update_mapgen (マップ生成情報の更新)
update_mapgen オブジェクト(または配列)を使用すると、既存の広域マップタイル("assign_mission_target"で作成されたものを含む) を修正して、ミッション固有のモンスター、NPC、コンピュータ、アイテムなどを追加できます。
配列として使用する場合: update_mapgen は2つ以上の update_mapgenオブジェクトで構成されます。
オブジェクトとして使用する場合: 任意の有効なJSON形式の「mapgenオブジェクト」を記述できます。これらの要素は、"assign_mission_target"で指定された目標地点、あるいはom_terrain and om_special フィールドで指定された最も近い広域マップ地形に配置されます。もしmapgen_update_idが指定されている場合は、一致するIDを持つ mapgen_update オブジェクトが実行されます。
JSON形式のmapgenおよびupdate_mapgenに関する詳細は、doc/MAPGEN.mdを参照してください。
update_mapgenを使って配置されたNPC、モンスター、コンピュータをミッションの「直接のターゲット」にするには、
update_mapgen内のplaceオブジェクトにあるtargetフラグ (bool値)を true に設定してください。
Adding new missions to NPC dialogue (NPCの会話に新しいミッションを追加する)
NPCにミッションを割り当てるための第一歩は、そのNPCの定義を見つけることです。ユニークNPCの場合、通常はNPC用JSONファイルの冒頭に記述されており、以下のようになっています:
{
"type": "npc",
"id": "refugee_beggar2",
"//": "Schizophrenic beggar in the refugee center.",
"name_unique": "Dino Dave",
"gender": "male",
"name_suffix": "beggar",
"class": "NC_BEGGAR_2",
"attitude": 0,
"mission": 7,
"chat": "TALK_REFUGEE_BEGGAR_2",
"faction": "lobby_beggars"
},
ここに、NPCが最初に提示するミッションを定義する行を追加します。 例:
"mission_offered": "MISSION_BEGGAR_2_BOX_SMALL"
ミッションを持つNPCは、プレイヤーが最初のミッションを開始できるように、TALK_MISSION_LISTへ繋がる会話選択肢を持っている必要があります。さらに、以下のいずれかの設定を行ってください。
- data/json/npcs/TALK_COMMON_MISSION.json の最初の talk_topicにある「汎用ミッション応答IDリスト」に、そのNPCの talk_topic IDを追加する。
- あるいは、同様の talk_topic を自作し、TALK_MISSION_INQUIRE (進行状況の確認) や TALK_MISSION_LIST_ASSIGNED (受注済みミッション一覧) へ繋がる応答を設定する。
これらのいずれかを行うことで、プレイヤーはそのNPCと通常のミッション管理に関する会話ができるようになります。
以下は、カスタムミッションの問い合わせがどのように表示されるかの例です。これはプレイヤーがすでにミッションを受注している場合にのみ、NPCの会話肢に表示されます。
{
"type": "talk_topic",
"//": "Generic responses for Old Guard Necropolis NPCs that can have missions",
"id": [ "TALK_OLD_GUARD_NEC_CPT", "TALK_OLD_GUARD_NEC_COMMO" ],
"responses": [
{
"text": "About the mission...",
"topic": "TALK_MISSION_INQUIRE",
"condition": { "and": [ "has_assigned_mission", { "u_is_wearing": "badge_marshal" } ] }
},
{
"text": "About one of those missions...",
"topic": "TALK_MISSION_LIST_ASSIGNED",
"condition": { "and": [ "has_many_assigned_missions", { "u_is_wearing": "badge_marshal" } ] }
}
]
},