Mapgen
建物と地形の生成方法
Cataclysm は発見時に mapgen を使って建物と地形を生成します。オーバーマップ地形に固有の関数があり、[m] で見るタイルもオーバーマップ地形によって決まります。オーバーマップ地形(「oter」)は overmap_terrain.json に定義します。
デフォルトでは、oter には JSON エントリの id(例: house、bank)に一致する組み込み mapgen 関数が1つあります。複数の関数も定義できます。プレイヤーが地図上で家として示された場所に近づくと、ゲームは house の関数から半ランダムに1つを選び、壁を置き、アイテムやモンスターなどを追加します。追加されるものにはゴム製のニワトリなども含まれます。これは一瞬で行われます。後述する内容に関わるため、この点を覚えておいてください。
すべての mapgen 関数は、大きな建物でも 24x24 タイルの領域に構築されます。3x3 の巨大なホテルなども、巧妙な方法で組み立てられます。その方法は分かりにくいものの、驚くほど効果的です。
ランダムでありながら(ある程度)自然な世界を作るため、多くの規則と例外があります。以下ではそれらを説明します。
方法は3つあります:
- mapgen エントリを追加する
- JSON オブジェクトを定義する
- update_mapgen を使用する
mapgen エントリの追加
建物の新しいバリエーションを作るために、新しい overmap_terrain を作成する必要はありません。独自のガソリンスタンドなら、mapgen エントリを定義して s_gas の mapgen リストに追加することで、ワールド内のガソリンスタンドのランダムなバリエーションに加えられます。
既存の overmap_terrain を使用し、そのファイルに屋根や別の Z レベルが関連付けられている場合は、地上階と一緒にほかの階層も生成されます。これを避ける場合、または独自の複数 Z レベルを追加する場合は、似た名前(s_gas_1 など)の overmap_terrain を作成してください。
方法
mapgen を C++ 関数として追加する方法は、手続き型の地形をその場で生成する最速(かつ最も汎用的)な方法の1つですが、ゲームの再コンパイルが必要です。
既存の C++ 製建物の大半は JSON に移行済みで、現在はコンテンツと MOD のどちらを追加する場合も JSON マッピングが推奨されます。
-
JSON: さまざまなものを定義する JSON の配列とオブジェクトの集合です。長所: 適用が最も速く、ほぼ完全に対応しています。短所: プログラミング言語ではないため、if 文や変数がなく、特定の JSON mapgen 定義から作られるものはすべて似た形になります。サードパーティー製マップエディターは現在の仕様に追従していません。
-
JSON では、リンク先 mapgen の一部を上書きする小さな mapgen チャンクである、ネストした mapgen も使用できます。これにより、1つの mapgen ファイル内で家具、地形、スポーンに多様性を持たせられます。複数 Z レベルの建物や複数タイルの建物について、mapgen ファイル同士をリンクすることもできます。
-
Lua: Lua 対応では、
luamethodフィールドで定義した Lua メソッドを使用します。MOD の読み込み中に、そのメソッドをgame.mapgen_functions[id]に配置します。ここでidはluamethodに指定した文字列です。これにより、ハードコードされた研究所と同様の手続き型オーバーマップタイルを作成できます。
Mapgen 定義の配置場所
Mapgen 定義は3か所に追加できます。
Lua mapgen
別の場所で Lua により定義されたマップは、次のように定義します。
[
{
"type": "mapgen",
"method": "lua",
"om_terrain": ["slimepit", "slimepit_down"],
"luamethod": "slimepit"
}
]
埋め込み mapgen
"mapgen": { ... } 形式は builtin メソッドとの組み合わせでのみ使用します。
"mapgen": [ { "method": "builtin", "name": "parking_lot" } ]
この形式は使用せず、代わりにスタンドアロン形式を使用してください。
スタンドアロン mapgen
data/json 内の .json ファイルに、スタンドアロンの { "type": "mapgen", ... } オブジェクトとして記述します。次の例はファストフード店です。
[
{
"type": "mapgen",
"om_terrain": "s_restaurant_fast",
"weight": 250,
"method": "json",
"object": {
"//": "(see below)"
}
}
]
om_terrain がオーバーマップの id と一致している点に注意してください。スタンドアロンの mapgen エントリでは om_terrain が必須です。
形式と変数
上の例は mapgen エントリのみを示したもので、建物などを構築する実際の形式ではありません。ただし、次の変数は、どこに、どの程度の頻度で内容が適用されるかに影響します。
- method
- om_terrain
- weight
mapgen の method を定義する
必須 値: json - 必須
"object": { (more json here) }
値、配列、ネストした配列の om_terrain でオーバーマップ地形を定義する
スタンドアロンでは必須
om_terrain の値は、単一のオーバーマップ地形 ID、ID のリスト、または ID のネストしたリスト(リストのリスト)の3形式のいずれかで宣言できます。
1つ目の形式では、overmap_terrain.json にあるオーバーマップ地形の ID を指定するだけです。
"om_terrain": "oter_id"
2つ目の形式では、ID のリストを指定します。
"om_terrain": [ "house", "house_base" ]
同じ JSON mapgen を列挙した各オーバーマップ地形 ID に適用し、重複するオーバーマップ地形を作成します。
3つ目はネストしたリストです。
"om_terrain": [ [ "oter_id_1a", "oter_id_1b", ... ], [ "oter_id_2a", "oter_id_2b", ... ], ... ]
この形式では、単一の JSON オブジェクトで複数のオーバーマップ地形を定義できます。rows プロパティは、ここに列挙したオーバーマップ地形の数に合わせて 24x24 文字のブロック単位で拡張されます。地形 ID は、オーバーマップ地形 ID(overmap_terrain.json にあります)の行と列を表す文字列のネストした配列で指定し、この文書の 2.1 節で説明する rows プロパティに対応付けます。
terrain、furniture、または特殊マッピング(items、monsters など)でマッピングした文字は、列挙したすべてのオーバーマップ地形に共通して適用されます。
X/Y 座標(place_monsters、place_loot、place_item など)を使う配置では、24x24 を超える拡張後の座標全体を使用できます。重要な制限として、範囲指定したランダム座標("x": [ 10, 18 ] など)は 24x24 の地形境界をまたいではいけません。[ 0, 23 ] と [ 50, 70 ] は有効ですが、[ 0, 47 ] と [ 15, 35 ] は単一の 24x24 ブロックを越えるため無効です。
例:
"om_terrain": [
[ "apartments_mod_tower_NW", "apartments_mod_tower_NE" ],
[ "apartments_mod_tower_SW", "apartments_mod_tower_SE" ]
]
この例では rows プロパティを 48x48 にし、4つの 24x24 象限を、指定した4つの apartments_mod_tower オーバーマップ地形 ID にそれぞれ対応させます。
線形地形の om_terrain
一部のオーバーマップ地形は_線形_です。これは道路やトンネルなど、さまざまな形で接続する線を形成するものに使用します。このような地形は overmap_terrain 定義の LINEAR フラグで定義します(OVERMAP 文書を参照)。
このような地形の JSON mapgen を定義するときは、接続しうる種類ごとに複数のインスタンスを定義する必要があります。それぞれの overmap_terrain ID には接尾辞が追加されます。接尾辞は _end、_straight、_curved、_tee、_four_way です。例として、ants.json の ants 定義を参照してください。
mapgen の weight を定義する
(任意)ゲームが mapgen 関数をランダムに選ぶとき、各関数の weight 値によって出現頻度が決まります。デフォルトは 1000 なので、weight が 500 のものを追加すると、ほかに関数が追加されていない限り3回に1回出現します(10000000 のような極端に大きい値はテストに便利です)。
値: 数値 - 0 で無効化
デフォルト: 1000
overmap_terrain の変数が mapgen に与える影響
スタンドアロンで必要な om_terrain ID は id から決まります。ただし、overmap_terrain に次の変数が設定されている場合は例外です。
extras- mapgen 後に、ヘリコプター墜落などのまれなランダムシーンを適用します。mondensity-"place_groups": [ { "monster": ...(JSON)のデフォルトdensity値を決定します。これを設定しない場合、place_monstersは独自のdensity引数を明示しないと動作しません。
制限事項 / TODO
- JSON: 特定のモンスターのスポーン追加は、まだ作業中です。
- 旧
mapgen.cppシステムには、人類史上最大の「if / else if / else if / ...」文(tm) があり、builtinmapgen クラスへの変換は半分しか終わっていません。このため、独自の mapgen 関数を追加することはできますが、追加するとゲームはデフォルトの関数を平然と忘れてしまいます。 - TODO: このリストに項目を追加する。
JSON オブジェクトの定義
mapgen エントリの JSON オブジェクトには、"fill_ter"、または "rows" と "terrain" の組み合わせのどちらかを含める必要があります。それ以外のフィールドはすべて任意です。
fill_ter で地形を埋める
rows が未設定の場合は必須 指定した地形で埋めます。
値: "string": data/json/terrain.json にある有効な地形 ID
例: "fill_ter": "t_grass"
rows 配列を使った ASCII マップ
fill_ter が未設定の場合は必須
24(または48)個の文字列からなるネストした配列です。各文字列は24(または48)文字で、各文字を terrain と、必要に応じて後述する furniture などのエントリで定義します。
使用法:
"rows": [ "row1...", "row2...", ..., "row24..." ]
このマップにはほかの要素も関連付けられます。たとえば、文字で指定したマスに、ガソリン入りのガスポンプ、水入りのトイレ、アイテムグループのアイテム、フィールドなどを配置できます。
ここで使用する文字はすべて、その用途を示す定義を別の場所に持つ必要があります。定義がなければエラーとなり、テストで検出されます。ゲームに新しいマップを追加するプルリクエストを作成すると、テストは自動的に実行されます。fill_ter を定義している場合、またはネストした mapgen を記述している場合には、いくつか例外があります。空白とピリオド(`` と .)は定義なしでも使用でき、rows の「背景」として扱われます。
キーには、全角幅でない任意の Unicode 文字を使用できます。たとえば欧州言語の文字の大半は使用できますが、漢字は使用できません。これを利用する場合は、エディターがファイルを UTF-8 エンコーディングで保存することを確認してください。結合文字を含め、アクセント記号付き文字も使用できます。正規化は行われず、生のバイト列(コード単位)で比較されます。したがって、mapgen のキーに使える文字は文字どおり無限にあります。見た目では区別できない別々の文字や、ほかの開発者の環境で正しく表示されそうにないほど珍しい文字を使って、この仕組みを悪用しないでください。
例:
"rows": [
",_____ssssssssssss_____,",
",__,__#### ss ####__,__,",
",_,,,_#ssssssssss#__,__,",
",__,__#hthsssshth#__,__,",
",__,__#ssssssssss#_,,,_,",
",__,__|-555++555-|__,__,",
",_____|.hh....hh.%_____,",
",_____%.tt....tt.%_____,",
",_____%.tt....tt.%_____,",
",_____%.hh....hh.|_____,",
",_____|..........%_____,",
",,,,,,|..........+_____,",
",_____|ccccxcc|..%_____,",
",_____w.......+..|_____,",
",_____|e.ccl.c|+-|_____,",
",_____|O.....S|.S|_____,",
",_____||erle.x|T||_____,",
",_____#|----w-|-|#_____,",
",________,_____________,",
",________,_____________,",
",________,_____________,",
" ,_______,____________, ",
" ,,,,,,,,,,,,,,,,,,,, ",
" dd "
],
terrain の行地形
rows を使用する場合は必須
rows 用の地形 ID を定義します。各キーは1文字で、値は地形 ID の文字列です。
値: {object}: { "a", "t_identifier", ... }
例:
"terrain": {
" ": "t_grass",
"d": "t_floor",
"5": "t_wall_glass_h",
"%": "t_wall_glass_v",
"O": "t_floor",
",": "t_pavement_y",
"_": "t_pavement",
"r": "t_floor",
"6": "t_console",
"x": "t_console_broken",
"$": "t_shrub",
"^": "t_floor",
".": "t_floor",
"-": "t_wall_h",
"|": "t_wall_v",
"#": "t_shrub",
"t": "t_floor",
"+": "t_door_glass_c",
"=": "t_door_locked_alarm",
"D": "t_door_locked",
"w": "t_window_domestic",
"T": "t_floor",
"S": "t_floor",
"e": "t_floor",
"h": "t_floor",
"c": "t_floor",
"l": "t_floor",
"s": "t_sidewalk"
},
furniture 配列の家具シンボル
任意
rows 用の家具 ID を定義します(rows 内の各文字は、地形のみ、または地形と家具の組み合わせです)。f_null は家具なしを意味しますが、そのエントリ自体を省略することもできます。
例:
"furniture": {
"d": "f_dumpster",
"5": "f_null",
"%": "f_null",
"O": "f_oven",
"r": "f_rack",
"^": "f_indoor_plant",
"t": { "furn": "f_table" "palette": "wooden_furniture_palette" },
"T": "f_toilet",
"S": "f_sink",
"e": "f_fridge",
"h": "f_chair",
"c": "f_counter",
"l": "f_locker"
},
パレットを指定すると、そのパレットに基づいて家具がデフォルトで塗装されます。パレットはグローバルオーバーマップ上の位置に基づいて色をランダムに選びます。
別の選択肢として、インラインパレットも定義できます。
set 配列で地形、家具、トラップを設定する
任意 地形、家具、トラップ、放射線などを設定する個別の命令です。配列は順番に処理されます。
値: [ array of {objects} ]: [ { "point": .. }, { "line": .. }, { "square": .. }, ... ]
例:
"set": [
{ "point": "furniture", "id": "f_chair", "x": 5, "y": 10 },
{ "point": "radiation", "id": "f_chair", "x": 12, "y": 12, "amount": 20 },
{ "point": "trap", "id": "tr_beartrap", "x": [ 0, 23 ], "y": [ 5, 18 ], "chance": 10, "repeat": [ 2, 5 ] }
]
X と Y の値は、0 から 23 までの単一の整数、または2つの整数(それぞれ 0 から 23)の配列 [ n1, n2 ] にできます。X または Y を配列にすると、その範囲内(両端を含む)のランダムな数値になります。上の例では、家具 f_chair は常に座標 "x": 5, "y": 10 に置かれますが、トラップ tr_beartrap は領域 "x": [ 0, 23 ], "y": [ 5, 18 ] 内でランダムに繰り返し配置されます。
id 文字列については terrain.json、furniture.json、trap.json を参照してください。
point に配置する
pointの種類と座標x、yが必要です。pointの種類がradiationならamountが必要です。- それ以外の種類では、地形、家具、トラップの
idが必要です。
| フィールド | 説明 |
|---|---|
| point | 使用可能な値: "terrain"、"furniture"、"trap"、"radiation" |
| id | 地形、家具、トラップの ID。例: "id": "f_counter"、"id": "tr_beartrap"。radiation では省略します。 |
| x, y | X、Y 座標。0-23、またはその範囲からランダムに選ぶ範囲 [ 0-23, 0-23 ]。例: "x": 12, "y": [ 5, 15 ] |
| amount | 放射線量。0-100。 |
| chance | (任意)適用される確率を 1/N で指定します。 |
| repeat | (任意)値: [ n1, n2 ]。n1 回から n2 回の間でランダムな回数だけアイテムを生成します。座標がランダムな場合にのみ意味があります。例: [ 1, 3 ] - 1~3回繰り返します。 |
line 上に配置する
lineの種類と、端点x、y、x2、y2が必要です。lineの種類がradiationならamountが必要です。- それ以外の種類では、地形、家具、トラップの
idが必要です。
例:
{ "line": "terrain", "id": "t_lava", "x": 5, "y": 5, "x2": 20, "y2": 20 }
| フィールド | 説明 |
|---|---|
| line | 使用可能な値: "terrain"、"furniture"、"trap"、"radiation" |
| id | 地形、家具、トラップの ID。例: "id": "f_counter"、"id": "tr_beartrap"。radiation では省略します。 |
| x, y | 始点の X、Y 座標。0-23、またはその範囲からランダムに選ぶ範囲 [ 0-23, 0-23 ]。例: "x": 12, "y": [ 5, 15 ] |
| x2, y2 | 終点の X、Y 座標。0-23、またはその範囲からランダムに選ぶ範囲 [ 0-23, 0-23 ]。例: "x": 22, "y": [ 15, 20 ] |
| amount | 放射線量。0-100。 |
| chance | (任意)適用される確率を 1/N で指定します。 |
| repeat | (任意)値: [ n1, n2 ]。n1 回から n2 回の間でランダムな回数だけアイテムを生成します。座標がランダムな場合にのみ意味があります。例: [ 1, 3 ] - 1~3回繰り返します。 |
square 内に配置する
squareの種類と、対角にある角のx、y、x2、y2が必要です。squareの種類がradiationならamountが必要です。- それ以外の種類では、地形、家具、トラップの
idが必要です。
square の引数は line と同じですが、x、y と x2、y2 は対角にある角を定義します。
例:
{ "square": "radiation", "amount": 10, "x": [0, 5], "y": [0, 5], "x2": [18, 23], "y2": [18, 23] }
| フィールド | 説明 |
|---|---|
| square | 使用可能な値: "terrain"、"furniture"、"trap"、"radiation" |
| id | 地形、家具、トラップの ID。例: "id": "f_counter"、"id": "tr_beartrap"。radiation では省略します。 |
| x, y | 四角形の左上隅。 |
| x2, y2 | 四角形の右下隅。 |
place_groups でアイテムまたはモンスターのグループを生成する
任意 item_groups.json と monster_groups.json のアイテムまたはモンスターを生成します。
値: [ array of {objects} ]: [ { "monster": ... }, { "item": ... }, ... ]
monster でグループからモンスターを生成する
| フィールド | 説明 |
|---|---|
| monster | (必須)値: "MONSTER_GROUP"。リストからランダムなクリーチャーを選ぶモンスターグループ ID。 |
| x, y | (必須)生成座標。0-23、またはその範囲からランダムに選ぶ範囲 [ 0-23, 0-23 ]。 |
| density | (任意)chance に掛ける浮動小数点数(下記参照)。 |
| chance | (任意)生成される確率を 1/N で指定します。 |
例:
{ "monster": "GROUP_ZOMBIE", "x": [13, 15], "y": 15, "chance": 10 }
x または y に範囲を使う場合、最小値と最大値から map::place_spawns が使用する長方形座標を作ります。モンスターグループから生成された各モンスターは、その長方形内の別々のランダムな位置に配置されます。上の例の値は、(13, 15) から (15, 15) までを両端を含む map::place_spawns 用の長方形にします。
任意の density は chance 値に掛ける浮動小数点数です。結果が 100% を超えると、100% ごとに1つのスポーン地点が保証され、残りは確率で評価されます(1つ追加されるか、されないか)。その後、モンスターグループで定義されたスポーン地点コスト cost_multiplier に従ってモンスターが生成されます。さらに、半径3の正方形内にあるすべてのオーバーマップ密度(プレイヤーを中心とする 7x7。正確な値は mapgen.cpp の MON_RADIUS マクロ)も加算されます。monstergroups の pack_size 修飾子は、抽選されたスポーン地点数に対するランダムな乗数です。
item でグループからアイテムを生成する
| フィールド | 説明 |
|---|---|
| item | (必須)値: ITEM_GROUP。リストからランダムなものを選ぶアイテムグループ ID。 |
| x, y | (必須)生成座標。0-23、またはその範囲からランダムに選ぶ範囲 [ 0-23, 0-23 ]。 |
| chance | (必須)生成される確率(パーセント)。 |
例:
{ "item": "livingroom", "x": 12, "y": [5, 15], "chance": 50 }
x または y に範囲を使う場合、最小値と最大値から map::place_items が使用する長方形座標を作ります。アイテムグループの各アイテムは、その長方形内の別々のランダムな位置に配置されます。上の例の値は、(12, 5) から (12, 15) までを両端を含む map::place_items 用の長方形にします。
place_monster で単一のモンスターを生成する
任意 単一のモンスターを生成します。特定のモンスター、またはモンスターグループからランダムに選んだモンスターを指定できます。ゲーム設定のスポーン密度の影響を受けます。
値: [ array of {objects} ]: [ { "monster": ... } ]
| フィールド | 説明 |
|---|---|
| monster | 生成するモンスターの ID。 |
| group | 生成するモンスターを選ぶモンスターグループの ID。monster と group は同時に使用しないでください。group は monster より優先されます。 |
| x, y | 生成座標(特定の点または長方形の領域)。値: 0-23、または [ a, b ] の間からランダムに選ぶ [ 0-23, 0-23 ]。 |
| chance | 生成する確率(パーセント)。repeat を使用した場合、各反復で個別に判定します。 |
| repeat | 指定した回数だけ生成を繰り返します。数値または範囲を指定できます。 |
| pack_size | 生成するモンスター数。単一の数値または [1-4] のような範囲を指定できます。chance とスポーン密度の影響を受けます。グループから生成する場合は無視されます。 |
| one_or_none | スポーン密度が高くても、複数の生成を許可しません。repeat が未定義、または pack_size が定義されている場合のデフォルトは true、それ以外のデフォルトは false です。グループから生成する場合は無視されます。 |
| friendly | true にするとモンスターを友好的にします。デフォルトは false です。 |
| name | モンスターに表示する追加の名前。 |
| target | true にするとミッション目標にします。ミッションからモンスターを生成する場合にのみ機能します。 |
monster を使用する場合、ゲーム設定のスポーン密度が高いと追加のモンスターが生成されることがあります。group を使用する場合は1体だけ生成されます。
x または y に範囲を使う場合、最小値と最大値から map::place_spawns が使用する長方形座標を作ります。モンスターグループから生成された各モンスターは、その長方形内の別々のランダムな位置に配置されます。例: "x": 12, "y": [ 5, 15 ] は、(12, 5) から (12, 15) までを両端を含む map::place_spawns 用の長方形にします。
例:
"place_monster": [
{ "group": "GROUP_REFUGEE_BOSS_ZOMBIE", "name": "Sean McLaughlin", "x": 10, "y": 10, "target": true }
]
これはグループ GROUP_REFUGEE_BOSS_ZOMBIE からランダムなモンスターを1体配置し、名前を Sean McLaughlin に設定して、座標 (10, 10) に生成します。また、そのモンスターをこのミッションの目標に設定します。
例:
"place_monster": [
{ "monster": "mon_secubot", "x": [ 7, 18 ], "y": [ 7, 18 ], "chance": 30, "repeat": [1, 3] }
]
これは mon_secubot をランダムな座標 (7~18, 7~18) に配置します。モンスターは 30% の確率で配置されます。この配置を [1-3] の間からランダムに選んだ回数だけ繰り返します。
place_monsters でモンスターグループ全体を生成する
place_monsters によるモンスターグループの生成は place_monster と似ています。主な違いは、place_monsters ではグループ内の有効な各エントリが必ず生成されることです。スポーン総数の制御が非常に難しいため、大きなモンスターグループにこのフラグを使用しないことを強く推奨します。
| フィールド | 説明 |
|---|---|
| monster | 生成するモンスターグループの ID。 |
| x, y | 生成座標(特定の点または長方形の領域)。値: 0-23、または [ a, b ] の間からランダムに選ぶ [ 0-23, 0-23 ]。 |
| chance | グループ全体が生成される確率を 1/N で表します。反復ごとに1回判定します。この判定に失敗すると、指定したグループ全体が生成されません。必ず生成する場合は空欄にします。 |
| repeat | 指定した回数だけ生成を繰り返します。数値または範囲を指定できます。ここでも、グループを生成する回数を表します。 |
| density | この数値にプレイヤーのいるワールドのスポーン密度を掛け、確率的に丸めてグループの生成回数を決めます。生成の各反復でこの処理を行います。たとえば、この計算の最終的な乗数が 2、repeat が 6 なら、グループは 2 * 6、つまり12回生成されます。 |
place_item 配列で特定のアイテムを生成する
任意 追加する_特定_のもののリストです。作業中: モンスターと車両もここに追加される予定です。
値: [ array of {objects} ]: [ { "item", ... }, ... ]
例:
"place_item": [
{ "item": "weed", "x": 14, "y": 15, "amount": [ 10, 20 ], "repeat": [1, 3], "chance": 20 }
]
| フィールド | 説明 |
|---|---|
| item | (必須)生成するアイテムの ID。 |
| x, y | (必須)生成座標。0-23、またはその範囲からランダムに選ぶ範囲 [ 0-23, 0-23 ]。 |
| amount | (必須)生成するアイテム数。単一の整数、またはその範囲からランダムに選ぶ [ a, b ]。 |
| chance | (任意)アイテムが生成される確率を 1/N で指定します。 |
| repeat | (任意)値: [ n1, n2 ]。n1 回から n2 回の間でランダムな回数だけアイテムを生成します。座標がランダムな場合にのみ意味があります。例: [ 1, 3 ] - 1~3回繰り返します。 |
place_artifact 配列でアーティファクトを生成する
任意 生成するアーティファクトのリストです。自然生成のアーティファクトを生成するには natural: true を使用し、任意で property を指定します。それ以外の場合はランダムなアーティファクトを作成します。マッピング形式で使用する特殊タイプは artifact(または artifacts)です。
例:
"place_artifact": [
{ "x": 12, "y": 10 },
{ "x": [ 4, 18 ], "y": [ 4, 18 ], "repeat": [ 1, 2 ], "natural": true, "property": "ARTPROP_GLOWING" }
]
| フィールド | 説明 |
|---|---|
| x, y | (必須)生成座標。0-23、またはその範囲からランダムに選ぶ範囲 [ 0-23, 0-23 ]。 |
| repeat | (任意)値: [ n1, n2 ]。n1 回から n2 回の間でランダムな回数だけアーティファクトを生成します。座標がランダムな場合にのみ意味があります。例: [ 1, 3 ] - 1~3回繰り返します。 |
| chance | (任意)アーティファクトを生成する確率(パーセント)。 |
| natural | (任意)true なら自然生成のアーティファクトを生成します。 |
| property | (任意)自然生成アーティファクトの特性を表す ARTPROP_* 値。省略するとランダムな特性を選びます。 |
specials による追加のマップ機能
任意 家具や地形を配置するだけではない、特殊なマップ機能です。
特殊機能は、前述の rows エントリを使った地形や家具と同様のマッピング、または正確な座標のどちらでも定義できます。
マッピングは次のような JSON オブジェクトで定義します。
"<type-of-special>" : {
"A" : { <data-of-special> },
"B" : { <data-of-special> },
"C" : { <data-of-special> },
...
}
<type-of-special> は後述する種類のいずれかです。<data-of-special> は、その特殊機能の種類に固有の内容を持つ JSON オブジェクトです。データが一切不要、またはすべてのデータが任意である種類では、空のオブジェクトで十分です。マッピングはいくつでも定義できます。
各マッピングは配列にもできます。タイル上に複数回現れうるもの(アイテムやフィールドなど)では、配列の各エントリを順番に適用します。トラップ、家具、地形では、1つのエントリをランダムに選び(すべて同じ確率)、適用します。
例(すべての . マスの 2/3 に草、1/3 に土を配置):
"terrain" : {
".": [ "t_grass", "t_grass", "t_dirt" ]
}
インスタンス数(したがって出現確率)を直接指定することもできます。これは、一般的な値を何度も繰り返す代わりに、まれな出現を指定する場合に特に便利です。
"terrain" : {
".": [ [ "t_grass", 2 ], "t_dirt" ]
}
適用するカラーパレットも指定できます。パレットは mapgen_color_palette です。
別の選択肢として、インラインパレットも定義できます。
"terrain": {
"|": { "ter": "t_wall_paintable", "palette": "plaster_wall_palette" }
}
例(各 . マスに血液と胆汁のフィールドを配置):
"fields" : {
".": [ { "field": "fd_blood" }, { "field": "fd_bile" } ]
}
1文字に対するマッピングを一度に定義することもできます。
"mapping" : {
".": {
"traps": "tr_beartrap",
"field": { "field": "fd_blood" },
"item": { "item": "corpse" },
"terrain": { "t_dirt" }
}
}
1か所にさまざまな種類のものを多数配置したい場合に便利です。
特定の位置を使って特殊機能を定義する形式は次のとおりです。
"place_<type-of-special>" : {
{ "x": <x>, "y": <y>, <data-of-special> },
...
}
<x> と <y> は特殊機能を配置する場所を定義します(X は水平方向、Y は垂直方向)。有効な値は 0~23 で、最小値と最大値による範囲も使用できます。"x": [ 0, 23 ], "y": [ 0, 23 ] はマップ上のどこかに特殊機能を配置します。
マッピングによる例(特殊機能を置く場所では、rows 配列に文字 O と ; が現れる必要があります):
"gaspumps": {
"O": { "amount": 1000 }
},
"toilets": {
";": { }
}
トイレに配置する水量は任意なので、空のエントリも完全に有効です。
座標による例:
"place_gaspumps": [
{ "x": 14, "y": 15, "amount": [ 1000, 2000 ] }
],
"place_toilets": [
{ "x": 19, "y": 22 }
]
地形、家具、トラップは JSON オブジェクトではなく、単一の文字列でも指定できます。
"traps" : {
".": "tr_beartrap"
}
これは次と同じです。
"traps" : {
".": { "trap": "tr_beartrap" }
}
fields で煙、ガス、血液を配置する
| フィールド | 説明 |
|---|---|
| field | (必須、文字列)フィールドの種類(例: "fd_blood"、"fd_smoke")。 |
| density | (任意、整数)フィールド密度。デフォルトは1です。指定可能な値は1、2、3です。 |
| intensity | (任意、整数)フィールドの濃度。1から3以上。data/json/field_type.json を参照してください。 |
| age | (任意、整数)フィールドの経過時間。デフォルトは0です。 |
npcs で NPC を配置する
例:
"npcs": { "A": { "class": "NC_REFUGEE", "target": true, "add_trait": "ASTHMA" } }
| フィールド | 説明 |
|---|---|
| class | (必須、文字列)NPC クラス ID。data/json/npcs/npc.json を参照するか、独自の NPC クラスを定義してください。 |
| target | (任意、真偽値)この NPC をミッション目標にします。update_mapgen でのみ有効です。 |
| add_trait | (任意、文字列または文字列の配列)クラス定義によるものに加えて、この NPC に付与する特性。 |
signs で標識を配置する
メッセージが書かれた標識(家具 f_sign)を配置します。signage または snippet のどちらかを定義する必要があります。メッセージには、ランダムに生成した名前を挿入する <full_name>、<given_name>、<family_name> や、最寄りの都市名を挿入する <city> などのタグを含められます。
例:
"signs": { "P": { "signage": "Subway map: <city> stop" } }
| フィールド | 説明 |
|---|---|
| signage | (任意、文字列)標識に表示するメッセージ。 |
| snippet | (任意、文字列)標識に表示できるスニペットのカテゴリ。 |
vendingmachines で自動販売機とアイテムを配置する
自動販売機(家具)を配置し、アイテムグループのアイテムを中に入れます。壊れた自動販売機として生成される場合もあります。
| フィールド | 説明 |
|---|---|
| item_group | (任意、文字列)自動販売機内のアイテム生成に使うアイテムグループ。デフォルトでは vending_food または vending_drink をランダムに選びます。 |
toilets で水の入ったトイレを配置する
トイレ(家具)を配置し、水を追加します。
| フィールド | 説明 |
|---|---|
| amount | (任意、整数または最小値/最大値の配列)トイレに配置する水の量。 |
gaspumps で燃料の入ったガソリンまたはディーゼルポンプを配置する
ガソリン(場合によってはディーゼル燃料)の入ったガスポンプを配置します。
| フィールド | 説明 |
|---|---|
| amount | (任意、整数または最小値/最大値の配列)ポンプに配置する燃料の量。 |
| fuel | (任意、文字列: gasoline または diesel)ポンプに配置する燃料の種類。 |
items でアイテムグループからアイテムを配置する
| フィールド | 説明 |
|---|---|
| item | (必須、文字列または itemgroup オブジェクト)使用するアイテムグループ / itype_id。 |
| chance | (任意、整数または最小値/最大値の配列)グループからアイテムを生成し続ける確率を 100 分の X で指定します(グループ自体が複数のアイテムを生成するか、まったく生成しないこともあります。種類については ITEM_SPAWN.md を参照)。ただし、chance が100の場合は、アイテムグループの生成をちょうど1回実行します(map::place_items を参照)。 |
| repeat | (任意、整数または最小値/最大値の配列)この配置を繰り返す回数。デフォルトは1です。 |
monsters でモンスターグループからモンスターを配置する
実際のモンスターはマップ読み込み時に生成されます。フィールドは次のとおりです。
| フィールド | 説明 |
|---|---|
| monster | (必須、文字列)モンスターグループ ID。マップ読み込み時に、そのグループからランダムなモンスターが生成されます。 |
| density | (任意、浮動小数点数)定義すると、その場所のデフォルトのモンスター密度を上書きします(モンスター密度は都市中心部に近いほど高くなります)。map::place_spawns を参照してください。 |
| chance | (任意、整数または最小値/最大値の配列)スポーン地点が作成される確率を 1/X で指定します。map::place_spawns を参照してください。 |
vehicles で種類またはグループから車両を配置する
| フィールド | 説明 |
|---|---|
| vehicle | (必須、文字列)車両の種類、または車両グループの ID。 |
| chance | (任意、整数または最小値/最大値の配列)車両自体が生成される確率を 100 分の X で指定します。デフォルトは1(生成確率 1%)なので、通常はもっと大きな値が必要です。 |
| rotation | (任意、整数)車両が向く方向。 |
| fuel | (任意、整数)燃料の状態。デフォルトは -1 で、タンクを 1~7% 満たします。正の値は車両のタンクを満たす割合(パーセント)として解釈されます(例: 100 なら満タン)。 |
| status | (任意、整数)デフォルトは -1(軽い損傷)。0 は完全な状態、1 は重大な損傷を意味します。 |
| place_beyond_bounds | (任意、整数)24x24 OMT の外にあるすべての衝突を無視して、大きな車両を生成できるようにする、多少危険な値です。 |
item で特定のアイテムを配置する
| フィールド | 説明 |
|---|---|
| item | (必須、文字列)新しいアイテムのアイテムタイプ ID。 |
| chance | (任意、整数または最小値/最大値の配列)アイテムが生成される確率を 1/X で指定します。デフォルトは1で、必ず生成されます。 |
| amount | (任意、整数または最小値/最大値の配列)生成するアイテム数。デフォルトは1です。 |
| repeat | (任意、整数または最小値/最大値の配列)この配置を繰り返す回数。デフォルトは1です。 |
この種類を明示的な座標で使用する場合は、後方互換性のため place_item という名前を次のように使用します。
"item": {
"x": { "item": "rock" }
},
"place_item": [
{ "x": 10, "y": 1, "item": "rock" }
]
monster で特定のモンスターを配置する
| フィールド | 説明 |
|---|---|
| monster | (必須、文字列)モンスターのタイプ ID(例: mon_zombie)。 |
| friendly | (任意、真偽値)モンスターが友好的かどうか。デフォルトは false です。 |
| name | (任意、文字列)モンスターの名前。デフォルトでは名前なしのモンスターを作成します。 |
| target | (任意、真偽値)このモンスターをミッション目標にします。update_mapgen でのみ有効です。 |
traps でトラップを配置する
| フィールド | 説明 |
|---|---|
| trap | (必須、文字列)トラップのタイプ ID(例: tr_beartrap)。 |
furniture で家具を配置する
| フィールド | 説明 |
|---|---|
| furn | (必須、文字列)家具のタイプ ID(例: f_chair)。 |
terrain で地形を配置する
地形に roof 値が設定され、囲まれた空間にある場合、その場所は屋内になります。
| フィールド | 説明 |
|---|---|
| ter | (必須、文字列)地形のタイプ ID(例: t_floor)。 |
rubble で瓦礫を配置し、既存の地形を破壊する
瓦礫を作成して既存の地形を打ち壊します(この手順は、家具や地形などを設定した後、最後に適用されます)。瓦礫の作成時には、地形を破壊して構造物を崩壊させる可能性がある破壊関数を呼び出します。
| フィールド | 説明 |
|---|---|
| rubble_type | (任意、家具 ID、デフォルト: f_rubble)作成する瓦礫の種類。 |
| items | (任意、真偽値、デフォルト: false)構造物を破壊した結果生じるアイテムを配置します。 |
| floor_type | (任意、地形 ID、デフォルト: t_dirt)その場所に破壊不能な壁がある場合、または overwrite = true の場合にのみ使用します。 |
| overwrite | (任意、真偽値、デフォルト: false)true なら、現在存在するものの上にそのまま書き込みます。 |
この種類を明示的な座標で使用する場合は、次のように単数形の place_rubble を使用します。
"place_rubble": [
{ "x": 10, "y": 1 }
]
place_liquids でこぼれた液体を配置する
指定した場所に液体アイテムを作成します。現在、液体は拾えません(タンクやポンプ内のガソリンを除く)が、mapgen の雰囲気を演出するために使用できます。
| フィールド | 説明 |
|---|---|
| liquid | (必須、アイテム ID)アイテム(液体)。 |
| amount | (任意、整数/最小値-最大値の配列)配置する液体の量(0を指定すると、そのアイテムのデフォルト charge 数になります)。 |
| chance | (任意、整数/最小値-最大値の配列)液体が生成される確率を 1/X で指定します。デフォルト値は1(100%)です。 |
デフォルト量のガソリン(200単位)を地面に落とす例です(rows 配列内の文字または明示的な座標のどちらでも指定できます)。
"liquids": {
"g": { "liquid": "gasoline" }
},
"place_liquids": [
{ "liquid": "gasoline", "x": 3, "y": 5 }
],
loot で特定のアイテムまたはグループのアイテムを配置する
アイテムグループのアイテム、または個別のアイテムを配置します。place_item および item/items との重要な違いは、loot では distribution グループから単一のアイテムを(ループせずに)生成できることです。銃に適合する弾倉と弾薬を生成することもできます。
注意: group または item のどちらか一方を指定する必要があり、両方は指定できません。
| フィールド | 説明 |
|---|---|
| group | (文字列)使用するアイテムグループ(collection グループと distribution グループについては ITEM_SPAWN.md を参照)。 |
| item | (文字列)生成するアイテムのタイプ ID。 |
| chance | (任意、整数)アイテムが生成される確率を 100 分の X で指定します。デフォルトは100です。 |
| ammo | (任意、整数)アイテムをデフォルト量の弾薬入りで生成する確率を 100 分の X で指定します。デフォルトは0です。 |
| magazine | (任意、整数)アイテムをデフォルトの弾倉付きで生成する確率を 100 分の X で指定します。デフォルトは0です。 |
sealed_item でプランターに種を植える
アイテムを特別に扱う家具の内部に、アイテムまたはアイテムグループを配置します。
ほかの方法ではアイテムを配置できない(NOITEM フラグを持つため)PLANT フラグ付きの f_plant_harvest のような家具を想定しています。
このような家具には、植物の種を決定する単一の(非表示の)種アイテムがあるはずです。sealed_item を使い、家具と種アイテムを指定することで、そのような植物を作成できます。
注意: item または items のどちらか一方だけを指定する必要があります(両方は指定できません)。
| フィールド | 説明 |
|---|---|
| furniture | (文字列)選択する家具の ID。 |
| item | item 特殊機能としてアイテムを生成します。 |
| items | items 特殊機能としてアイテムグループを生成します。 |
例:
"sealed_item": {
"p": {
"items": { "item": "farming_seeds", "chance": 100 },
"furniture": "f_plant_harvest"
}
},
graffiti でメッセージを配置する
その場所に落書きのメッセージを配置します。text または snippet のどちらかを定義する必要があります。メッセージには、ランダムに生成した名前を挿入する <full_name>、<given_name>、<family_name> や、最寄りの都市名を挿入する <city> などのタグを含められます。
| フィールド | 説明 |
|---|---|
| text | (任意、文字列)配置するメッセージ。 |
| snippet | (任意、文字列)メッセージの取得元となるスニペットのカテゴリ。 |
zones で NPC 派閥用のゾーンを配置する
その派閥の NPC は、AI の行動を決める際にゾーンを使用します。
| フィールド | 説明 |
|---|---|
| type | (必須、文字列)値: "NPC_RETREAT"、"NPC_NO_INVESTIGATE"、"NPC_INVESTIGATE_ONLY"。 |
| faction | (必須、文字列)ゾーンを使用する NPC 派閥の派閥 ID。 |
| name | (任意、文字列)ゾーンの名前。 |
type フィールドの値は NPC の行動に次のように影響します。
NPC_RETREATゾーンへ向かって退却することを優先します。NPC_NO_INVESTIGATEゾーンから発生した、発生源が見えない音を調べに移動しません。NPC_INVESTIGATE_ONLYゾーンの外から発生した、発生源が見えない音を調べに移動しません。
translate_ter で地形タイプを変換する
ある種類の地形を別の種類の地形に変換します。通常の mapgen でこれを行う理由はありませんが、update_mapgen で基準となる状態を設定する場合に便利です。
| フィールド | 説明 |
|---|---|
| from | (必須、文字列)変換元となる地形の地形 ID。 |
| to | (必須、文字列)from の地形を変換する先の地形 ID。 |
ter_furn_transforms で mapgen 変換を適用する
指定した場所で ter_furn_transform を実行します。通常の mapgen では地形を直接指定できるため、主に update_mapgen の一部として変換を適用する場合に役立ちます。
transform: (必須、文字列)実行するter_furn_transformの ID。
place_nested で隣接するオーバーマップに基づくネストしたチャンクを生成する
place_nested を使うと、隣接するオーバーマップの id と、可変オーバーマップスペシャルの配置に使用した join に基づいて、チャンクを限定的に条件付き生成できます。バイオーム間の遷移をより滑らかにしたり、可変構造物の端に動的に壁を作ったりする場合に便利です。
| フィールド | 説明 |
|---|---|
| chunks/else_chunks | (必須、文字列)条件付きで配置するチャンクの nested_mapgen_id。指定した隣接地形が一致する場合は chunks、それ以外の場合は else_chunks を配置します。 |
| x and y | (必須、整数)チャンクを配置する基本方位上の位置。 |
| neighbors | (任意)チャンクを配置する前に確認する隣接オーバーマップ。各方向に、オーバーマップ id の部分文字列リストを関連付けます。 |
| joins | (任意)チャンクを配置する前に確認する可変オーバーマップスペシャルの join。各方向に、join の id 文字列リストを関連付けます。 |
| connections | (任意)チャンクを配置する前に、このオーバーマップへ向ける必要がある connection。各方向に、connection の id 文字列リストを関連付けます。 |
| rotation | (任意)マップを回転する回数。1回につき90度です。 |
この方法で確認できる隣接オーバーマップは次のとおりです。
- 基本方位で直接隣接するもの(
"north"、"east"、"south"、"west") - 斜めに隣接するもの(
"north_east"、"north_west"、"south_east"、"south_west") - 垂直方向に直接隣接するもの(
"above"、"below")
join を確認できるのは、基本方位、above、below のみです。
例:
"place_nested": [
{ "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": [ "empty_rock", "field" ] }, "rotation": 0 },
{ "chunks": [ "gate_north" ], "x": 0, "y": 0, "joins": { "north": [ "interior_to_exterior" ] } },
{ "else_chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "north_west": [ "field", "microlab" ] } }
],
上のコードは、次のようにチャンクを配置します。
- 北側の隣接地形が平原または硬い岩なら
concrete_wall_ew - 可変オーバーマップの配置時に北側へ
interior_to_exteriorという join が使用されたならgate_north - 北西側の隣接地形が平原でも、いずれかの microlab オーバーマップでもないなら
concrete_wall_ns
配置前に領域を消去する
ネストしたセクション全体なら、次を指定します。
"flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN" ]
それ以外の場合は place_remove_all で XY 座標を指定するか、パレット内の文字に remove_all を使用します。この処理は常にほかのすべての処理より先に実行されます。
Mapgen 値
_mapgen 値_は、特定の ID が求められるさまざまな場所で使用できます。たとえば、パラメーターのデフォルト値や、terrain オブジェクト内の地形 ID です。mapgen 値には次の形式があります。
- リテラル ID を表す単純な文字列。例:
"t_flat_roof"。 - キー
distributionを含む JSON オブジェクト。対応する値はリストのリストで、各リストは文字列 ID と整数の重みの組です。例:
{ "distribution": [ [ "t_flat_roof", 2 ], [ "t_tar_flat_roof", 1 ], [ "t_shingle_flat_roof", 1 ] ] }
-
キー
paramを含む JSON オブジェクト。対応する値は、Mapgen パラメーターで説明するパラメーター名の文字列です。例:{ "param": "roof_type" }。{ "param": "roof_type", "fallback": "t_flat_roof" }のように、フォールバック値も指定する必要がある場合があります。フォールバックは、進行中のゲームを壊さずに mapgen 定義を変更できるようにするために必要です。同じオーバーマップスペシャルの異なる部分が異なる時点で生成されることがあり、生成途中で定義に新しいパラメーターを追加すると、そのパラメーターの値が存在しないため、フォールバックが使用されます。 -
ほかの mapgen 値に応じて異なる値を選ぶ switch 文。通常は mapgen パラメーターの値を条件に切り替え、mapgen の2つの部分で一貫性を保つために使用します。たとえば、次の switch は、mapgen パラメーター
fence_typeで選んだフェンスの種類に門の種類を一致させます。
{
"switch": { "param": "fence_type", "fallback": "t_splitrail_fence" },
"cases": {
"t_splitrail_fence": "t_splitrail_fencegate_c",
"t_chainfence": "t_chaingate_c",
"t_fence_barbed": "t_gate_metal_c",
"t_privacy_fence": "t_privacy_fencegate_c"
}
}
Mapgen パラメーター
(この機能は開発中であり、機能が文書の記述と完全には一致しない場合があります。)
mapgen 定義またはパレット内の別のエントリとして、parameters キーを使用できます。例:
"parameters": {
"roof_type": {
"type": "ter_str_id",
"default": { "distribution": [ [ "t_flat_roof", 2 ], [ "t_tar_flat_roof", 1 ], [ "t_shingle_flat_roof", 1 ] ] }
}
},
parameters JSON オブジェクトの各エントリがパラメーターを定義します。キーはパラメーター名です。各キーには JSON オブジェクトを関連付けます。そのオブジェクトでは型(cata_variant と同様の型文字列)を必ず指定し、任意でデフォルト値を指定できます。デフォルト値は、前述した mapgen 値である必要があります。
執筆時点では、パラメーターが値を得る方法は default だけなので、通常は常に指定することになります。
パラメーターの主な用途は、distribution mapgen 値でランダムに値を選び、そのパラメーターを使用するすべての場所に同じ値を適用することです。上の例では、屋根の地形をランダムに選びます。param mapgen 値を通じて、いずれかの terrain キーでパラメーターを使用すると、マップ全体でランダムでありながら一貫した屋根地形を使用できます。対照的に、distribution を terrain オブジェクト内に直接配置すると、mapgen は屋根タイルごとに地形をランダムに選び、さまざまな屋根地形が混在します。
デフォルトでは、パラメーターのスコープは生成中の overmap_special です。つまり、overmap_special 全体でパラメーターが同じ値になります。デフォルト値が必要になると、そのスペシャルの最初のチャンクを生成するときに選択され、後続のチャンクで再利用するために保存されます。
必要なら "scope": "omt" を指定し、スコープを単一のオーバーマップタイルだけに制限できます。この場合、各 OMT でデフォルト値を個別に選びます。利点は、mapgen でそのパラメーターを使用するときに fallback 値を選ぶ必要がなくなることです。
3つ目のスコープは "scope": "nest" です。これはネストした mapgen でのみ意味があります(ただし、ほかの場所で使用してもエラーにはならないため、ネストした mapgen とネストしていない mapgen で同じパレットを使用できます)。スコープが nest の場合、特定のネストしたチャンクごとにパラメーターの値を選びます。たとえば、ある nest が複数のタイルにわたるカーペットを定義しているとします。パラメーターを使えば、その nest 内のすべてのタイルでカーペットを同じ色にできますが、同じ OMT 内の別の場所にある同じ nested_mapgen_id のインスタンスでは、異なる色を選べます。
mapgen パラメーターとそれが mapgen に及ぼす影響のデバッグに役立つよう、オーバーマップエディター(デバッグメニューからアクセス可能)では、overmap_special スコープのパラメーターに選ばれた値を確認できます。
rotation でマップを回転する
ほかのすべての mapgen 処理が完了した後、生成したマップを回転します。値には単一の整数または範囲(その中からランダムに値を選択)を指定できます。例: "rotation": [ 0, 3 ]
値は90度単位です。
predecessor_mapgen で基になる mapgen を事前に読み込む
ここにオーバーマップ地形 ID を指定すると、この場所で定義した残りの mapgen を適用する前に、そのオーバーマップ地形タイプの mapgen 全体を実行します。主な用途は、森林、湿地、湖岸などの自然地形内にある場所の mapgen です。既存の JSON mapgen の多くは、配置先の種類の mapgen を模倣しようとしています(たとえば、森の小屋では、小屋を周囲になじませるために森の木、草、散乱物を配置しています)。その結果、その種類の生成方法が変わると同期しなくなります。predecessor_mapgen を指定すれば、既存の場所の種類に追加するものだけに集中できます。
例: "predecessor_mapgen": "forest"
パレット
パレットを使うと、異なる mapgen 部品で同じシンボル定義を使用できます。たとえば、CDDA で定義された家の大半は standard_domestic_palette を使用します。このパレットでは、たとえば h を f_chair として定義しているため、すべての家の mapgen は、あらゆる場所で定義を繰り返さずに rows 配列で h を使用できます。必要なのはパレットへの参照だけで、各家の定義に次を追加します。
"palettes": [ "standard_domestic_palette" ]
各 mapgen 部品は複数のパレットを参照できます。2つのパレットが同じシンボルに意味を定義している場合、両方を適用します。アイテム生成など、一部の場合は最終結果に両方の結果が現れます。地形や家具の設定など、ほかの場合は一方の結果がもう一方を上書きする必要があります。このときは、リストで後にあるパレットが前のパレットを上書きし、外側の mapgen にある定義はパレット内のすべての定義を上書きします。
パレット定義には、シンボルの意味を定義する JSON オブジェクトの定義として前述した任意の JSON を含められます。特定の場所(x と y 座標を使用)に対して何かを指定することはできません。
パレット自体も palettes キーを使ってほかのパレットを含められます。2つ以上のパレットに同じ意味を持つ同じシンボルが多数ある場合、その共通部分を新しいパレットに分離し、各パレットから取り込むことで、定義を繰り返さずに済みます。
Mapgen 値としてのパレット ID
palettes リストの値は単純な文字列でなくてもかまいません。前述の任意の mapgen 値を使用できます。特に、distribution を使ってパレットの集合からランダムに選択できます。
この選択は、overmap_special スコープの mapgen パラメーターと同様に機能します。したがって、1つのスペシャル内のすべての OMT で同じパレットが使用されます。また、オーバーマップエディター(デバッグメニューからアクセス可能)に表示されるオーバーマップスペシャルの引数を見ると、どのパレットが選ばれたか確認できます。
たとえば、小屋の mapgen 定義で次の JSON を使用するとします。
"palettes": [ { "distribution": [ [ "cabin_palette", 1 ], [ "cabin_palette_abandoned", 1 ] ] } ],
生成される小屋の半分では通常の cabin_palette を使用し、残りの半分では cabin_palette_abandoned を使用します。
update_mapgen の使用
update_mapgen は通常の JSON mapgen の一種です。新しいオーバーマップタイルを作成する代わりに、既存のオーバーマップタイルを特定の変更内容で更新します。現在は NPC ミッションのインターフェース内でのみ機能しますが、今後は既存のマップを変更する汎用ツールへ拡張される予定です。
update_mapgen は、一部の例外を除いて通常の JSON mapgen と同じフィールドを使用します。ミッション対応のための新しいフィールドと、更新するオーバーマップタイルを指定する方法がいくつか追加されています。
オーバーマップタイルの指定
update_mapgen は既存のオーバーマップタイルを更新します。次のフィールドで、更新するタイルを指定できます。
assign_mission_target
assign_mission_target は、オーバーマップタイルをミッション目標に割り当てます。同じスコープ内のすべての update_mapgen が、そのオーバーマップタイルを更新します。必要な地形 ID を持つ最も近いオーバーマップ地形を使用します。一致する地形がない場合は、om_special タイプのオーバーマップスペシャルを作成してから、そのスペシャル内の om_terrain を使用します。
| フィールド | 説明 |
|---|---|
| om_terrain | (必須、文字列)ミッション目標のオーバーマップ地形 ID。 |
| om_special | (必須、文字列)ミッション目標のオーバーマップスペシャル ID。 |
om_terrain
om_special タイプの最も近いオーバーマップスペシャル内にある、om_terrain タイプの最も近いオーバーマップタイルを使用します。オーバーマップタイルは更新されますが、ミッション目標には設定されません。
| フィールド | 説明 |
|---|---|
| om_terrain | (必須、文字列)ミッション目標のオーバーマップ地形 ID。 |
| om_special | (必須、文字列)ミッション目標のオーバーマップスペシャル ID。 |
ミッション用の特殊機能
update_mapgen は、一部の mapgen JSON アイテムに新しい任意キーワードを追加します。
target
place_npc、place_monster、place_computer には、任意の真偽値 target を指定できます。"target": true が設定され、有効なミッションを伴う update_mapgen から呼び出された場合、その NPC、モンスター、コンピューターがミッション目標として設定されます。