기본 맵젠 가이드
이 가이드는 맵젠의 기본 사항, 편집해야 할 파일, 각 파일의 태그, 그리고 스페셜이나 일반 도시 건물을 생성하는 차이점을 다룹니다.
먼저 몇 가지 기본 개념과 추가하거나 편집할 파일을 다루겠습니다.
일반 주석:
CDDA 맵젠은 익숙해지면 놀라울 정도로 강력합니다. 많은 트릭을 사용하여 맵에 다양성과 흥미를 더할 수 있습니다. 대부분의 고급 맵젠 기술은 다른 튜토리얼에서 다룰 것입니다. 이 튜토리얼은 기본 개념과 기본 단일 OMT(오버맵 지형 타일) 크기 건물을 만드는 방법을 다룹니다. 팔레트 사용법과 지붕 추가 방법도 다룰 것입니다.
스페셜 vs. 도시 건물:
스페셜은 도시 외곽에 생성되는 건물로, 도시로부터의 거리와 유효한 OMT 지형 타입과 같은 추가 정보가 필요합니다. 또한 최근 변경으로 스페셜 타입 건물이 도시 내부에 생성될 수 있게 되기 전까지는 게임 내 유일한 다중 타일 건물이었습니다. 스페셜의 예: 농장, 오두막, LMOE 등.
도시 건물은 단일 또는 다중 타일 크기일 수 있으며 도시 경계 내에서만 생성됩니다. 건물은 도시 건물이자 스페셜일 수 있지만 두 타입 모두에 생성되려면 두 세트의 항목이 필요합니다. 일부 모텔이 이의 예입니다(참조: 2fmotel_city 및 2fmotel).
중요한 정책: 지붕 프로젝트 이후 모든 건물은 이제 z 레벨을 가로질러 다중 타일입니다. 모든 새 건물은 항상 JSON 지붕을 추가해야 합니다. 곧 모든 지하실도 1층 맵젠에 맞춤 제작될 것이므로, 지하실을 원한다면 전용 아래층을 포함하는 것이 좋은 관행입니다.
파일 및 목적:
-
data/json/mapgen 또는 하위 폴더 중 하나에 새 맵젠 파일을 추가합니다. 건물에 기존 기초 형태를 사용하는 경우 해당 건물의 파일에 추가할 수 있습니다.
- 이것은 건물의 청사진입니다. 가구와 전리품을 추가하기 위한 모든 건물 데이터를 포함할 수도 있습니다(대안으로 팔레트 참조).
-
적절한 overmap_terrain 파일(data/json/overmap/overmap_terrain)에서 생성하는 각 z 레벨에 대한 항목을 추가합니다.
- 이러한 항목은 오버맵에서 건물이 어떻게 보이는지, 심볼, 색상, 인도 추가와 같은 생성 요구사항을 정의하며, 일부 맵젠 기능에 대한 플래그도 제어합니다.
-
스페셜인지 도시 건물인지에 따라 specials.json 또는 multitile_city_buildings.json에 항목을 추가합니다.
- multitile_city_buildings의 경우 건물의 다양한 z 레벨 및/또는 여러 OMT를 연결합니다.
- 스페셜의 경우 건물의 다양한 z 레벨 또는 여러 OMT를 연결하고, 필요한 도로/지하철/등의 연결을 정의하며, 생성 매개변수를 정의합니다.
-
도시 건물의 경우 regional_settings.json에 항목을 추가합니다. 이렇게 하면 세계에 생성될 수 있습니다.
-
선택 사항이지만 대규모 프로젝트에 권장: mapgen_palettes 폴더에 새 팔레트 파일 추가(기존 팔레트도 사용 가능).
- 이것은 맵젠 파일 데이터의 일부를 보유하는 여러 맵 간에 공유할 수 있는 파일입니다. 일반적으로 지형과 가구를 정의하는 데 사용됩니다. 전리품, 차량, 몬스터 생성 및 맵젠 파일의
"object"태그에 일반적으로 들어가는 기타 데이터도 넣을 수 있습니다. - 기존 맵젠 팔레트를 편집하면 팔레트와 맵젠 파일의 조합을 사용하는 기존 맵에 영향을 줄 수 있으므로 피하세요.
- 이것은 맵젠 파일 데이터의 일부를 보유하는 여러 맵 간에 공유할 수 있는 파일입니다. 일반적으로 지형과 가구를 정의하는 데 사용됩니다. 전리품, 차량, 몬스터 생성 및 맵젠 파일의
맵젠 항목 시작:
새 맵 프로젝트를 시작할 때 일반적으로 처음부터 게임에 생성되는 데 필요한 모든 항목을 추가합니다. 이렇게 하면 작업하면서 테스트하고 필요에 따라 조정할 수 있습니다. 따라서 프로젝트를 시작할 때 필요한 모든 파일을 설정하는 것이 좋습니다.
시작하기 전에 몇 가지 결정을 내려야 합니다:
-
전체 크기는 얼마나 될까요(OMT가 몇 개인가요)?
-
어디에 생성될까요?
-
팔레트를 사용할까요, 아니면 맵젠 파일에 모든 것을 넣을까요?
- 팔레트를 사용하는 경우 처음부터 가능한 한 많이 정의하세요.
-
고급 질문:
- 중첩 맵을 사용할까요?
- 지하철이나 도로에 연결하고 싶나요?
- 팔레트와 결합하여 맵젠 객체 데이터를 사용할까요(둘 다의 결합 사용에 대한 마스터 클래스를 원하면 쇼핑몰 2층을 참조)?
맵젠 맵:
이것은 맵젠 파일 맵 플래그와 그것이 하는 일을 평이한 용어로 다룹니다. MAPGEN에서 더 광범위한 정보를 얻을 수 있습니다.
맵젠 파일에는 일부 메타데이터 태그와 맵을 만드는 모든 것을 정의하는 "object" 데이터가 있습니다.
메타데이터:
샘플:
"type": "mapgen",
"method": "json",
"om_terrain": "s_restaurant_coffee",
"weight": 250,
-
"type"은 항상 mapgen이고(나중 튜토리얼에서 다른 맵 타입을 다룰 것),"method"는 항상 JSON입니다. 이 데이터는 프로그램에 이 파일을 처리하는 방법을 알려줍니다. -
"om_terrain": 이것은 기본적으로 맵의 내부 이름입니다(오버맵에 표시되는 이름이 아님). 동일한 건물 기초 형태를 공유하는 동일한 맵의 여러 변형을 계획하지 않는 한 일반적으로 고유해야 합니다(참고: 실제 건물 기초의 형태를 의미함). -
"weight": 이 항목은 동일한 om_terrain 이름을 공유하는 다른 맵과 비교한 이 특정 맵의 가중치입니다. 집의 한 버전이 있고 다른 생성물이 있는 동일한 집을 만든다고 가정합시다(완전히 가구가 갖춰진 집과 버려진 버전처럼). 이 가중치는 각각이 다른 것과 관련하여 얼마나 자주 생성되는지 결정합니다. 가구가 있는 집이 100이고 버려진 집이 20이라고 가정합시다. 그러면 가구가 있는 집보다 5배 적게 생성됩니다.
객체 데이터:
이것은 맵, 지형, 가구 및 다양한 생성 타입을 정의하는 태그 섹션입니다. 아이템(및 중첩 맵)을 배치하는 여러 방법이 있습니다. 이들은 자체 튜토리얼이 필요합니다. 이 문서에서는 가장 사용하기 쉬운 전리품 생성을 위한 "명시적 심볼" 배치를 사용할 것입니다. 객체 섹션의 모든 것은 rows와 fill_ter을 제외하고 mapgen_palette에 배치할 수 있습니다.
샘플 객체 세그먼트: 객체의 모든 것은 객체의 {} 중괄호 내에 있어야 하며 그렇지 않으면 포함되지 않습니다. 끝 괄호를 잘못 배치하면 로딩 오류가 발생하지 않을 수 있습니다.
샘플:
"object": {
"fill_ter": "t_floor",
"rows": [
"S___________SSTzzzzzzzTS",
"S_____,_____SSzMbMbMbMzS",
"S_____,_____SSSSSSSS/MzS",
"S_____,_____SSSSSSSS/MzS",
"S_____,_____SSzzzSSS/MzS",
"S_____,_____SS||V{{{V||S",
"S_____,_____SS|D <|S",
"SSSSSSSSSSSSSS|r OS",
"SSSSSSSSSSSSSS|r |S",
"SVVVVVVVz./Mzz| #W##|S",
"SVD>>>>Vz./bMzV #ww%|S",
"SV BBB>Vz.b/..{ xwwF|S",
"SV B>Vz.Mb..{ flwl|S",
"SV B>Vz....zV flwU|S",
"SV B>Vzbbbzz|X #wwG|S",
"S|B ^||||||||||^ ||I||S",
"SO6 B|=;|;=|99 r|FwC|S",
"S|B 6|=A|A=|9 r|Fwc|S",
"S| B|+|||+|9 D|!ww|S",
"S|B |Lwl|S",
"SO6 6 6 6 B66B|Lwl|S",
"S|B ^???????^ B66B|Lwl|S",
"S|||||||||||||||||||3||S",
"S4SSSSSSSSSSSSSSSSSSSSSS"
],
"terrain": {
" ": "t_floor",
"!": "t_linoleum_white",
"#": "t_linoleum_white",
"%": "t_linoleum_white",
"+": "t_door_c",
",": "t_pavement_y",
".": "t_grass",
"/": "t_dirt",
"3": [ "t_door_locked", "t_door_locked_alarm" ],
";": "t_linoleum_white",
"=": "t_linoleum_white",
"A": "t_linoleum_white",
"C": "t_linoleum_white",
"F": "t_linoleum_white",
"G": "t_linoleum_white",
"I": "t_door_locked_interior",
"L": "t_linoleum_white",
"M": "t_dirt",
"O": "t_window",
"S": "t_sidewalk",
"U": "t_linoleum_white",
"V": "t_wall_glass",
"W": "t_fencegate_c",
"_": "t_pavement",
"b": "t_dirt",
"c": "t_linoleum_white",
"f": "t_linoleum_white",
"l": "t_linoleum_white",
"w": "t_linoleum_white",
"x": "t_console_broken",
"z": "t_shrub",
"{": "t_door_glass_c",
"|": "t_wall_b",
"<": "t_stairs_up",
"4": "t_gutter_downspout",
"T": "t_tree_coffee"
},
"furniture": {
"#": "f_counter",
"%": "f_trashcan",
"/": "f_bluebell",
"6": "f_table",
"9": "f_rack",
">": "f_counter",
"?": "f_sofa",
"A": "f_sink",
"B": "f_chair",
"C": "f_desk",
"D": "f_trashcan",
"F": "f_fridge",
"G": "f_oven",
"L": "f_locker",
"M": "f_dahlia",
"U": "f_sink",
"X": "f_rack",
"^": "f_indoor_plant",
"b": "f_dandelion",
"f": "f_glass_fridge",
"l": "f_rack",
"r": "f_rack"
},
"toilets": { ";": { } },
"items": {
"#": { "item": "coffee_counter", "chance": 10 },
"6": { "item": "coffee_table", "chance": 35 },
"9": { "item": "coffee_display_2", "chance": 85, "repeat": [ 1, 8 ] },
";": { "item": "coffee_bathroom", "chance": 15 },
"=": { "item": "coffee_bathroom", "chance": 35 },
">": { "item": "coffee_table", "chance": 25 },
"A": { "item": "coffee_bathroom", "chance": 35 },
"C": { "item": "office", "chance": 70 },
"D": { "item": "coffee_trash", "chance": 75 },
"F": { "item": "coffee_fridge", "chance": 80, "repeat": [ 1, 8 ] },
"G": { "item": "oven", "chance": 35 },
"L": { "item": "coffee_locker", "chance": 75 },
"U": { "item": "coffee_dishes", "chance": 75 },
"X": { "item": "coffee_newsstand", "chance": 90, "repeat": [ 1, 8 ] },
"f": { "item": "coffee_freezer", "chance": 85, "repeat": [ 1, 8 ] },
"l": { "item": "coffee_prep", "chance": 50 },
"r": { "item": "coffee_condiments", "chance": 80, "repeat": [ 1, 8 ] }
},
"monsters": { "!": { "monster": "GROUP_COFFEE_SHOP_ZOMBIE", "chance": 1 } },
"place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 3, 17 ], "y": [ 13, 18 ], "chance": 1 } ],
"vehicles": { "c": { "vehicle": "swivel_chair", "chance": 100, "status": 1 } }
}
-
"fill_ter": 이 태그는 가구 아래 및 rows의 정의되지 않은 심볼에 사용할 기본 지형/바닥을 정의합니다. 일반적으로 가장 많은 가구가 연결된 지형을 선택합니다. -
"rows": 이것은 건물의 실제 청사진입니다. 표준 OMT 타일(오버맵 타일)은 24x24 타일입니다. Rows는 맵의 왼쪽 상단 모서리인 0,0에서 x,y 좌표를 시작합니다.- 팁: 십자수를 하거나 십자수 패턴에 익숙하다면 이 모든 것이 매우 친숙해 보일 것입니다. 맵과 "범례" 영역이 있습니다.
-
"terrain": 이것은 rows의 모든 문자가 지형일 때 무엇을 의미하는지 정의합니다. 심볼은 단일 지형을 반환하거나 지형 선택에서 생성될 기회를 제공할 수 있습니다. 다음은 몇 가지 빠른 예입니다:
"*": "t_door_c",: 이것은 rows의 모든 *를 닫힌 나무 문으로 만듭니다.
"*": [ [ "t_door_locked_peep", 2 ], "t_door_locked_alarm", [ "t_door_locked", 10 ], "t_door_c" ],: 이 배열은 문 선택에서 무작위로 선택합니다. 일부는 다른 것보다 생성될 확률이 높도록 가중치가 부여됩니다. 잠긴 문이 가장 일반적이고, 그 다음 엿보기 구멍 문입니다. 마지막으로 닫힌 문과 잠긴/경보 문은 같은 기본 가중치를 가지며 가장 적게 생성됩니다.
참고: 제 예에서 fill_ter은 바닥용입니다. 따라서 다른 바닥으로 생성하려는 가구가 있는 경우, 가구에 부여한 동일한 심볼을 사용하고 새 바닥재에 대한 지형으로도 정의해야 합니다. 위의 예에서 여러 가구 심볼은 바닥재로 흰색 리놀륨을 사용하고 있습니다. 이 단계를 수행하지 않으면 가구가 잘못된 바닥재를 갖게 되며, 특히 부수면 눈에 띄게 됩니다. 저는 종종 최종 맵 체크를 하는데, 맵을 제출하기 전에 게임 내에서 가구를 부수며 돌아다니면서 지형을 확인합니다. 이것은 상당히 카타르시스가 될 수 있습니다.
-
"furniture"태그: 지형과 마찬가지로 이것은 가구 ID와 맵 심볼의 목록입니다. 지형과 같은 종류의 배열을 처리할 수 있습니다. -
"toilets"및 기타 특별히 정의된 가구: 더 쉬운 배치를 허용하는 일부 특별히 정의된 일반 가구를 접하게 될 것입니다. 샘플 맵에서 항목:"toilets": { ";": { } },은 심볼 항목을 정의하고 변기에 물을 자동으로 배치합니다. 몇 가지 다른 특수 가구 항목이 있습니다.
다른 가장 일반적인 것은:
"vendingmachines": { "D": { "item_group": "vending_drink" }, "V": { "item_group": "vending_food" } }
이것은 자동 판매기에 대한 두 심볼을 할당하고 하나는 음료용, 하나는 음식용으로 만듭니다. 참고: 총알 자판기처럼 기계에 모든 item_group을 넣을 수 있습니다.
- 아이템 생성: 아이템을 배치하는 방법은 많습니다. 이 튜토리얼은 가장 쉬운 명시적 심볼 배치만 다룹니다. 자세한 정보는 전리품 생성에 관한 모든 문서를 읽을 수 있습니다. 참조: ITEM_SPAWN.md.
샘플은 태그로 "items":를 사용합니다. 다른 것으로는: "place_item", "place_items", "place_loot"이 있습니다. 이들 중 일부는 개별 아이템 배치를 허용하고 다른 것은 그룹 또는 둘 다를 허용합니다. 이것은 다른 튜토리얼에서 다룰 것입니다.
지금은 이것을 분해해 봅시다:
"items": {
"a": { "item": "stash_wood", "chance": 30, "repeat": [ 2, 5 ] },
"d": [
{ "item": "SUS_dresser_mens", "chance": 50, "repeat": [ 1, 2 ] },
{ "item": "SUS_dresser_womens", "chance": 50, "repeat": [ 1, 2 ] }
]
}
이 경우 "a"는 맵에 정의된 대로 벽난로입니다. 그래서 벽난로에 stash_wood item_group을 추가하고 싶습니다. "a" 아래에 그룹을 정의하면 맵의 모든 벽난로가 이 그룹을 얻습니다. 이것은 모든 냉장고가 동일한 item_group을 얻는 집과 같은 일반 item_group에 특히 강력합니다. chance는 생성 확률이며 repeat는 해당 확률에 대한 롤을 2-5회 반복한다는 의미이므로 이 벽난로는 추가로 비축되거나 조금 있거나 확률 롤에 실패하면 아무것도 없을 수 있습니다.
"d" 항목은 dresser입니다. 저는 dresser가 두 가지 가능한 아이템 그룹에서 가져오기를 원했습니다. 하나는 남성용 선택이고 다른 하나는 여성용입니다. 따라서 이 심볼에 대한 모든 가능한 item_group을 포함하는 배열 [ ... ]이 있습니다.
배열에 원하는 만큼 많은 item_group을 추가할 수 있습니다. 이것은 일반 집 팔레트의 제 랙 중 하나입니다:
"q": [
{ "item": "tools_home", "chance": 40 },
{ "item": "cleaning", "chance": 30, "repeat": [ 1, 2 ] },
{ "item": "mechanics", "chance": 1, "repeat": [ 1, 2 ] },
{ "item": "camping", "chance": 10 },
{ "item": "tools_survival", "chance": 5, "repeat": [ 1, 2 ] }
],
참고: 명시적 심볼 배치를 사용할 때, 그룹이 해당 심볼을 사용하는 모든 가구에 생성될 기회가 있다는 것을 기억하세요. 따라서 상당히 후할 수 있습니다. 다른 아이템 생성이 있는 두 개의 책장을 원한다면, 각 책장에 고유한 심볼을 부여하거나 배치를 위해 x,y 좌표를 사용하는 대체 아이템 생성 형식을 사용하세요.
- 몬스터 생성: 예제에는 두 가지 유형의 몬스터 생성이 나열되어 있습니다.
"monsters": { "!": { "monster": "GROUP_COFFEE_SHOP_ZOMBIE", "chance": 1 } },
"place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 3, 17 ], "y": [ 13, 18 ], "chance": 1 } ],
첫 번째 항목은 명시적 심볼 배치 기술을 사용하고 있습니다. 끝 항목은 몬스터를 배치하기 위해 범위 x,y 좌표를 사용하고 있습니다. 참고: 우리는 overmap_terrain 항목을 선호하여 맵젠 파일에 몬스터를 넣는 것에서 멀어지고 있으므로, 특정 이유로 특정 몬스터 그룹을 생성하려는 경우에만 이것을 사용하세요. 자세한 정보는 overmap_terrain 섹션을 참조하세요.
- 차량 생성:
"vehicles": { "c": { "vehicle": "swivel_chair", "chance": 100, "status": 1 } }
우리의 차량은 명시적 심볼 배치를 사용하는 회전 의자입니다.
다음 예제는 vehicle_groups와 x,y 배치를 사용합니다. 회전과 상태도 포함합니다. 회전은 차량이 맵에서 생성될 방향이고, 상태는 전반적인 상태입니다. 연료는 꽤 자명합니다. 항상 게임 내에서 차량 생성을 테스트하세요. 배치에서 상당히 까다로울 수 있으며 회전은 숫자가 의미할 것으로 예상되는 것과 실제로 일치하지 않습니다. 차량의 0,0 지점은 다를 수 있으므로 특히 좁은 공간에서 올바른 위치에 생성하려면 실험해야 합니다.
"place_vehicles": [
{ "chance": 75, "fuel": 0, "rotation": 270, "status": 1, "vehicle": "junkyard_vehicles", "x": 12, "y": 18 },
{ "chance": 75, "fuel": 0, "rotation": 270, "status": 1, "vehicle": "junkyard_vehicles", "x": 19, "y": 18 },
{ "chance": 90, "fuel": 0, "rotation": 0, "status": -1, "vehicle": "engine_crane", "x": 28, "y": 3 },
{ "chance": 90, "fuel": 0, "rotation": 90, "status": -1, "vehicle": "handjack", "x": 31, "y": 3 },
{ "chance": 90, "fuel": 30, "rotation": 180, "status": -1, "vehicle": "welding_cart", "x": 34, "y": 3 },
{ "chance": 75, "fuel": 0, "rotation": 180, "status": -1, "vehicle": "junkyard_vehicles", "x": 31, "y": 9 },
{ "chance": 75, "fuel": 0, "rotation": 270, "status": 1, "vehicle": "junkyard_vehicles", "x": 28, "y": 18 },
{ "chance": 75, "fuel": 0, "rotation": 270, "status": 1, "vehicle": "junkyard_vehicles", "x": 35, "y": 18 }
]
- 가구 내 액체: 이 항목은 서 있는 탱크용입니다. 가구 항목에서 탱크를 "g"로 정의했습니다.
"liquids": { "g": { "liquid": "water_clean", "amount": [ 0, 100 ] } },
이것은 탱크에 깨끗한 물을 배치하고 생성할 양의 범위를 지정합니다.
- 다른 특수 배치 기술이 있으며 더 많은 맵을 보면서 익히게 될 것입니다. 제가 좋아하는 것 중 하나는 새로운 화분용입니다:
화분은 "봉인된 아이템"이므로 해당 컨테이너에 무엇이 들어갈지 정의합니다. 이 예제는 화분에 씨앗(수확 준비)을 배치합니다. 첫 번째 것은 묘목을 배치하고, 다른 것들은 수확 준비가 되어 있습니다. 더 빠른 배치를 위해 각 화분 타입에 명시적 심볼을 부여했습니다.
"sealed_item": {
"1": { "item": { "item": "seed_rose" }, "furniture": "f_planter_seedling" },
"2": { "item": { "item": "seed_chamomile" }, "furniture": "f_planter_harvest" },
"3": { "item": { "item": "seed_thyme" }, "furniture": "f_planter_harvest" },
"4": { "item": { "item": "seed_bee_balm" }, "furniture": "f_planter_harvest" },
"5": { "item": { "item": "seed_mugwort" }, "furniture": "f_planter_harvest" },
"6": { "item": { "item": "seed_tomato" }, "furniture": "f_planter_harvest" },
"7": { "item": { "item": "seed_cucumber" }, "furniture": "f_planter_harvest" },
"8": { "item": { "item": "soybean_seed" }, "furniture": "f_planter_harvest" },
"9": { "item": { "item": "seed_zucchini" }, "furniture": "f_planter_harvest" }
}
- 모범 사례:
- 새 집을 만드는 경우 이 팔레트를 사용하세요: "standard_domestic_palette". 전리품이 이미 할당되어 있으며 광범위한 가정용 가구를 다룹니다. 이렇게 하면 전리품 생성을 위해 집이 다른 모든 집과 동기화됩니다.
- 모든 건물은 지붕 항목도 가져야 합니다.
- JSON의 항목 배치는 실제로 중요하지 않지만, 대부분의 기존 맵처럼 맵젠 파일을 정리하려고 노력하세요. 미래의 기여자에게 친절하세요. 파일 상단에 메타 데이터를 추가하세요. 객체 항목은 두 번째입니다. 객체 항목 내에서 일반적으로: 팔레트, set_points, 지형, 가구, 변기와 같은 무작위 특수 항목, 아이템 생성, 차량 생성, 몬스터 생성 순서입니다.
- 모든 건물은 지붕 접근을 위해 최소한 하나의 "t_gutter_downspout"를 가져야 합니다. 플레이어는 최소 2개를 원할 것입니다. 다중 z 레벨 건물에 배수로를 추가하는 경우 중간 층을 잊지 마세요. 플레이어가 올라갈 수 있도록 낙수관을 엇갈리게 배치해야 합니다(사다리처럼).
- 지붕에 올라가기 어려운 물건을 놓는 경우 사다리와 계단을 통해 더 나은 지붕 접근을 제공해야 합니다.
- 밖의 기본 잔디 덮개에는 맵 경계를 넘어 일관성을 유지하기 위해
"t_region_groundcover_urban",을 사용하세요. 다음은 잔디, 관목 및 나무에 대한 제 표준 식물 항목입니다:
".": "t_region_groundcover_urban",
"A": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ],
"Z": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ],
마지막으로 꽃(가구임):
"p": "f_region_flower"
지붕 추가!
거의 모든 CDDA 건물이 이제 지붕이 가능하며 우리는 그것을 그렇게 유지하고 싶습니다. 건물과 함께 지붕 맵을 제출해야 합니다. 이것은 1층과 동일한 건물 형태/기초를 공유하는 다른 층과 같은 파일에 들어갈 수 있습니다.
그래서 이것은 방금 살펴본 건물에 비해 매우 쉽습니다. 모든 동일한 기본 구성 요소가 있습니다. 1층 맵의 rows를 사용하여 시작하고 "roof_palette" 심볼 세트로 변환하는 것이 좋습니다. 기본적으로 배수로로 윤곽을 추적하고, 아래의 t_gutter_spout 옆에 t_gutter_drop을 추가하고 거기에 일부 인프라를 던집니다. 저는 상업용 건물 지붕에 네스트를 광범위하게 사용했으며 고급 맵젠에서 다룰 것입니다.
샘플 지붕:
{
"type": "mapgen",
"method": "json",
"om_terrain": "house_01_roof",
"object": {
"fill_ter": "t_shingle_flat_roof",
"rows": [
" ",
" ",
" ",
" |222222222222222223 ",
" |.................3 ",
" |.................3 ",
" |.............N...3 ",
" 5.................3 ",
" |.................3 ",
" |.................3 ",
" |........&........3 ",
" |.................3 ",
" |......=..........3 ",
" |.................3 ",
" |----------------53 ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
],
"palettes": ["roof_palette"],
"terrain": { ".": "t_shingle_flat_roof" }
}
}
- 저는 항상 건물 ID에
_roof를 추가합니다. - 팔레트가 이전 예제의 모든 데이터를 대신하는 것을 보세요. 매우 깨끗하고 쉽습니다.
- 이것은 건물과 함께만 생성되므로(연결되면)
"weight"항목이 없습니다. - 제 팔레트는 기본 지붕으로 "t_flat_roof"를 사용합니다. 집의 경우 판자를 원했습니다. 따라서 이 맵젠에 "t_shingle_flat_roof"를 추가했으며 이것은
".": "t_flat_roof"에 대한 팔레트의 항목을 재정의합니다(고급 맵젠에서 더 자세히).
별도의 지붕 문서가 있습니다: JSON_ROOF_MAPGEN.
multitile_city_buildings.json을 사용하여 다양한 맵젠 맵 연결
이 파일은 다음 위치에 있습니다: data/json/overmap/multitile_city_buildings.json.
이 파일은 도시 건물 전용이며 스페셜이 아님을 기억하세요
표준 항목:
{
"type": "city_building",
"id": "house_dogs",
"locations": [ "land" ],
"overmaps": [
{ "point": [ 0, 0, 0 ], "overmap": "house_dogs_north" },
{ "point": [ 0, 0, 1 ], "overmap": "house_dogs_roof_north" },
{ "point": [ 0, 0, -1 ], "overmap": "basement" }
]
},
"type"은 변경되지 않습니다. 항상 "city_building"이어야 합니다."id": 이 ID는 종종 맵젠 ID와 같지만 같을 필요는 없습니다. "house"와 같이 더 일반적인 것을 사용할 수 있습니다. 이 ID는 생성을 위해 regional settings에서 사용되므로 ID를 사용하는 건물이 얼마나 많은지 염두에 두세요. 저는 디버그 생성을 훨씬 훨씬 더 쉽게 만들기 때문에 고유한 ID를 선호합니다."locations": 오버맵 지형 타입별로 이 건물이 배치될 수 있는 위치를 정의합니다. Land가 기본값입니다."overmaps": 이것은 맵이 어떻게 함께 맞는지 정의하는 부분이므로 분해해 봅시다:{ "point": [ 0, 0, 0 ], "overmap": "house_dogs_north" },point: 건물의 다른 맵젠 파일과 관련된 지점입니다. 좌표는[ x, y, z ]입니다. 이 예에서 x,y는 z 레벨당 하나의 맵만 있기 때문에 0입니다. y에 대해 0은 이것이 지상 레벨임을 의미합니다. 위의 지붕은 1에 있고 지하실은 -1에 있습니다.- ID에
_north추가:- 건물이 회전하는 경우 층이 올바르게 일치하도록 이 나침반 지점이 필요합니다. 이것은 일반 지하실 맵젠 그룹이므로
_north를 얻지 못합니다(집에 전용 계단을 추가하면서 변경될 것입니다).
- 건물이 회전하는 경우 층이 올바르게 일치하도록 이 나침반 지점이 필요합니다. 이것은 일반 지하실 맵젠 그룹이므로
regional_map_settings.json을 사용하여 오버맵 생성 설정
data/json/regional_map_settings.json
- 도시 건물과 집의 경우
"city":플래그로 스크롤합니다. - 적절한 하위 태그, 일반적으로
"houses"또는"shops"를 찾으세요. - multitile_city_buildings 항목에서 ID를 추가하세요. 이것은 맵젠 ID도 수락할 수 있으며 불평하지 않으므로 종종 같은 이름입니다.
- 건물에 적합한 가중치를 선택하세요.
스페셜 연결 및 생성:
다음 위치에 항목을 넣으세요: data/json/overmap/overmap_special/specials.json.
이 항목은 regional_map_settings와 multitile_city_buildings 및 기타 재미있는 오버맵 항목의 작업을 모두 수행합니다.
예제:
{
"type": "overmap_special",
"id": "pump_station",
"overmaps": [
{ "point": [0, 0, 0], "overmap": "pump_station_1_north" },
{ "point": [0, 0, 1], "overmap": "pump_station_1_roof_north" },
{ "point": [0, 1, 0], "overmap": "pump_station_2_north" },
{ "point": [0, 1, 1], "overmap": "pump_station_2_roof_north" },
{ "point": [0, -1, -1], "overmap": "pump_station_3_north" },
{ "point": [0, 0, -1], "overmap": "pump_station_4_north" },
{ "point": [0, 1, -1], "overmap": "pump_station_5_north" }
],
"connections": [
{ "point": [0, -1, 0], "connection": "local_road", "from": [0, 0, 0] },
{ "point": [1, -1, -1], "connection": "sewer_tunnel", "from": [0, -1, -1] },
{ "point": [-1, -1, -1], "connection": "sewer_tunnel", "from": [0, -1, -1] },
{ "point": [-1, 1, -1], "connection": "sewer_tunnel", "from": [0, 1, -1] }
],
"locations": ["land"],
"city_distance": [1, 4],
"city_sizes": [4, 12],
"occurrences": [0, 1],
"flags": ["CLASSIC"]
}
"type": overmap_special입니다."id"는 오버맵의 건물 ID입니다. 게임 내 오버맵에도 표시됩니다."overmaps"이것은 도시 건물 항목에서와 같은 방식으로 작동합니다. 펌프장은 지상에서 1 OMT보다 크므로 y 좌표도 변경됩니다."connections": 맵에 도로, 하수도, 지하철 연결을 배치합니다."locations": 이 건물이 배치될 수 있는 유효한 OMT 타입."city_distance","city_sizes"둘 다 도시와 관련하여 이것이 생성되는 위치에 대한 매개변수입니다."occurrences": [ 0, 1 ],: 발생은 "UNIQUE" 플래그를 사용하는지 여부에 따라 두 가지를 의미할 수 있습니다. 플래그가 없으면 이것은 단순히 이 스페셜이 오버맵당 생성될 수 있는 횟수로 해석됩니다. 이 경우 0에서 1까지입니다. UNIQUE 플래그를 사용하면 이것은 백분율이 되므로[ 1, 10 ]은 오버맵당 1에서 10번이 아니라 생성될 10% 확률의 1이 됩니다. 따라서 오버맵당 한 번 생성될 10% 확률입니다."flags": 스페셜을 더 정의하는 데 사용할 수 있는 플래그입니다. 플래그 목록은 다음을 참조하세요: json_flags.
자세한 내용은 OVERMAP을 읽으세요.
Overmap_terrain 항목:
다음 위치에서 건물 타입에 대한 파일을 선택하세요: data/json/overmap/overmap_terrain.
이 항목 세트는 오버맵에서 건물이 어떻게 보일지 정의합니다. copy-from을 지원합니다. 예제:
{
"type": "overmap_terrain",
"id": "s_music",
"copy-from": "generic_city_building",
"name": "music store",
"sym": "m",
"color": "brown",
"mondensity": 2,
"extend": { "flags": [ "SOURCE_LUXURY" ] }
},
{
"type": "overmap_terrain",
"id": "s_music_roof",
"copy-from": "generic_city_building",
"name": "music store roof",
"sym": "m",
"color": "brown"
}
맵젠 ID당 하나의 항목이 필요합니다:
"type"은 항상 overmap_terrain입니다."id"는 맵젠 파일에서 사용한 것과 동일한 ID가 됩니다."copy-from"이것은 여기서 정의하는 것을 제외하고 다른 항목의 모든 데이터를 복사합니다."name"오버맵에 이름이 표시되는 방법."sym"오버맵에 표시되는 심볼. 생략하면 꺾쇠 표시가 사용됩니다v<>^"color"오버맵 심볼의 색상."mondesntiy"이 오버맵 타일에 대한 기본 몬스터 밀도를 설정합니다. 일반 좀비 생성에 이것을 사용하고 해당 위치에 대한 특수 생성을 위해 맵젠 몬스터 항목을 예약합니다(예: 애완동물 가게의 애완동물)."extend"이러한 플래그 중 많은 것이 미래에 AI를 위해 NPC가 사용할 것이므로 위치에 적합한 플래그를 추가하려고 노력하세요. 다른 것들은 인도 생성과 같은 맵젠을 더 정의합니다.
자세한 정보는 다음을 참조하세요: OVERMAP의 Overmap Terrain 섹션.
팔레트:
앞서 언급했듯이 팔레트는 rows와 fill_ter을 제외하고 객체 항목에 포함된 거의 모든 정보를 보유할 수 있습니다. 주요 목적은 관련 맵에 동일한 기본 데이터를 추가할 필요성을 줄이고 심볼 일관성을 유지하는 것입니다.
맵젠 파일의 객체에 추가된 항목은 팔레트에서 사용된 동일한 심볼을 재정의합니다. 이렇게 하면 팔레트를 사용하고 필요에 따라 각 맵젠에 선택적 변경을 할 수 있습니다. 이것은 카펫, 콘크리트 등과 같은 여러 지상 지형에 특히 유용합니다.
지형은 맵젠 파일을 통해 대체할 때 매우 잘 작동합니다. 가구 재정의에는 덜 성공했지만 의도한 대로 작동하는 시기를 명확히 하려면 더 테스트해야 합니다. 최근에 팔레트 심볼이 값 배열을 사용하는 경우 맵젠 항목이 이를 재정의할 수 없다는 것을 발견했습니다.
예제: 맵젠 파일 객체에 대한 항목: "palettes": [ "roof_palette" ],
팔레트 메타데이터:
"type": "palette",
"id": "roof_palette",
다른 모든 것은 일련의 객체 항목처럼 보일 것입니다. 예를 들어 roof_palette:
{
"type": "palette",
"id": "roof_palette",
"terrain": {
".": "t_flat_roof",
" ": "t_open_air",
"o": "t_glass_roof",
"_": "t_floor",
"2": "t_gutter_north",
"-": "t_gutter_south",
"3": "t_gutter_east",
"4": "t_gutter_downspout",
"|": "t_gutter_west",
"5": "t_gutter_drop",
"#": "t_grate",
"&": "t_null",
":": "t_null",
"X": "t_null",
"=": "t_null",
"A": "t_null",
"b": "t_null",
"c": "t_null",
"t": "t_null",
"r": "t_null",
"L": "t_null",
"C": "t_null",
"Y": "t_null",
"y": "t_null"
},
"furniture": {
"&": "f_roof_turbine_vent",
"N": "f_TV_antenna",
":": "f_cellphone_booster",
"X": "f_small_satelitte_dish",
"~": "f_chimney",
"=": "f_vent_pipe",
"A": "f_air_conditioner",
"b": "f_bench",
"c": "f_counter",
"t": "f_table",
"r": "f_rack",
"L": "f_locker",
"C": ["f_crate_c", "f_cardboard_box"],
"Y": "f_stool",
"s": "f_sofa",
"S": "f_sink",
"e": "f_oven",
"F": "f_fridge",
"y": ["f_indoor_plant_y", "f_indoor_plant"]
},
"toilets": { "T": {} }
}
더 복잡한 팔레트를 보려면 data/json/mapgen_palettes/house_general_palette.json의 standard_domestic_palette가 모든 CDDA 집에서 작동하도록 설계된 팔레트를 잘 보여줍니다. 전리품 생성을 포함하고 집에서 사용될 대부분의 가구를 설명합니다. 또한 특정 위치 요구 사항을 위해 맵젠 파일에서 사용할 수 있도록 열어둔 심볼 목록을 남겼습니다.
마지막으로 data/json/mapgen_palettes/house_w_palette.json의 house_w 팔레트 시리즈는 중첩 맵젠을 사용하는 집을 위해 함께 작동하도록 설계되었습니다. 기초에 전념하는 팔레트가 있고, 네스트용 팔레트가 있으며, 마지막으로 가정용 야외 중첩 청크용으로 설계한 또 다른 팔레트가 있습니다.
최종 주석:
여기의 정보는 맵젠을 돌아다니고 맵을 만들기 시작하기에 충분해야 하지만 집중적으로 다룰 많은 변형이 있습니다.
이 문서에서 다루지 않은 것:
- 중첩 맵 및 배치.
- NPC 생성.
- 복잡한 바닥 옵션을 위한 고급 지형 트릭.
- 함정, 지형 및 당신.
- update_mapgen(NPC 및 플레이어가 트리거하는 맵 업데이트).
- 필드를 방출하는 가구.