콘텐츠로 이동
GameDesign

맵 모듈 작성완료구현밸런싱미완료

본 문서는 한 런이 진행되는 무대인 과 그 위에 얹히는 모듈들이 어떻게 구성되어 인게임을 생성하는지를 정의한다.

flowchart LR
subgraph INIT [런 진입 시 초기화]
  I[MapModule.Initialize]
  MG[MonsterGroup 후보 확정]
  CG[ChestGroup 후보 확정]
  IG[ItemGroup 후보 확정]
end
subgraph RUN [런 중]
  EX[플레이어 탐색]
  LOOT[루팅 · 상자 개봉]
  ESC[탈출 지점 점유]
end
subgraph RESULT [결과]
  OK[탈출 성공]
  FAIL[시간 초과 · 사망]
end

I --> MG & CG & IG
MG & CG & IG --> EX
EX --> LOOT & ESC
ESC -->|n초 점유| OK
EX -->|타이머 만료 · HP 0| FAIL

classDef init fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95
classDef run fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f
classDef ok fill:#bbf7d0,stroke:#16a34a,stroke-width:2.5px,color:#14532d
classDef bad fill:#fecaca,stroke:#dc2626,stroke-width:2.5px,color:#7f1d1d
class I,MG,CG,IG init
class EX,LOOT,ESC run
class OK ok
class FAIL bad
원칙규칙의미
모듈 조립 방식맵은 베이스맵 + 모듈 단위 조립맵 구성을 데이터로 제어한다
그룹 = 배치 단위몹·상자·아이템은 그룹 단위로 묶어 관리그룹마다 ID·핀·드랍 규칙이 독립적
핀(Pin) = 후보 좌표스폰 위치는 ModulePin* 트랜스폼으로 사전 지정위치 디자인과 내용물 데이터가 분리
인게임 진입 시 1회 추첨모듈 내용물은 진입 시점에 전부 확정런 도중 재추첨 없음
탈출 지점 1곳세션당 탈출 모듈 1곳만 활성화시작 지점 가장 가까운 후보는 제외

코드 기준 4계층으로 정의된다.

Map (전체 맵, 예: Map01)
└─ MapModule (베이스맵 위에 얹히는 모듈 단위)
├─ MonsterGroup (몹 배치 단위)
│ └─ ModulePinMonster (개별 몹 핀)
├─ ItemGroup (낱개 아이템 배치 단위)
│ └─ ModulePinItem (개별 아이템 핀)
├─ ChestGroup (상자 배치 단위)
│ └─ ModulePinChest (개별 상자 핀)
└─ ModulePinPlayer (플레이어 시작 위치 핀 — 시작 모듈 한정)
flowchart TD
subgraph L1 [맵 단위]
  M[Map<br/>Map01 등]
end
subgraph L2 [모듈 단위]
  MM[MapModule<br/>맵 위 모듈]
end
subgraph L3 [그룹 단위]
  MG[MonsterGroup]
  IG[ItemGroup]
  CG[ChestGroup]
end
subgraph L4 [핀 좌표]
  PM[ModulePinMonster]
  PI[ModulePinItem]
  PC[ModulePinChest]
end

M --> MM
MM --> MG --> PM
MM --> IG --> PI
MM --> CG --> PC

classDef map fill:#e0f2fe,stroke:#0284c7,stroke-width:2px,color:#075985
classDef module fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95
classDef monster fill:#fecaca,stroke:#dc2626,stroke-width:2px,color:#7f1d1d
classDef item fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f
classDef chest fill:#fed7aa,stroke:#ea580c,stroke-width:2px,color:#7c2d12
classDef pin fill:#f1f5f9,stroke:#64748b,stroke-width:1.5px,color:#0f172a
class M map
class MM module
class MG monster
class IG item
class CG chest
class PM,PI,PC pin

코드(MapModuleType1) 기준 모듈 1차 분류는 7종 (None 제외 6종).

코드정의사용
Main메인 모듈 — 맵의 핵심 구역 단위BaseCamp, LumberYard, Hamlet 등
Sub서브 모듈 — 메인 모듈에 포함되는 부속 영역메인 모듈 내 부분 구역
Monster몬스터 배치 전용 모듈몹 그룹 컨테이너
Item아이템 배치 전용 모듈낱개 아이템 컨테이너
Chest상자 배치 전용 모듈상자 그룹 컨테이너
Escape탈출 지점 모듈세션당 1개 활성화

코드(MapType) 기준 현재 정의된 맵은 Map01 하나. Map02는 클래스 파일이 존재하지만 MapType.enum에 미등록 상태.

Map01의 메인 모듈 3종.

메인 모듈컨셉몹 그룹 수
BaseCamp군영·거점5
LumberYard벌목장5
Hamlet작은 마을17

상자 그룹: BaseCamp 1개(6핀), LumberYard 1개(3핀), Hamlet 1개(11핀).

4. 모듈 정의 테이블 (MapModuleTableData)

섹션 제목: “4. 모듈 정의 테이블 (MapModuleTableData)”
컬럼의미
moduleType11차 분류 (Main/Sub/Monster/Item/Chest/Escape)
moduleType22차 분류 (BaseCamp 등 인스턴스 식별)
monsterGroupIDs이 모듈에 포함된 몹 그룹 ID 배열
itemGroupIDs이 모듈에 포함된 아이템 그룹 ID 배열
chestGroupIDs이 모듈에 포함된 상자 그룹 ID 배열

5. 몬스터 그룹 (MonsterGroupTableData)

섹션 제목: “5. 몬스터 그룹 (MonsterGroupTableData)”

한 몹 그룹은 최대 3종의 몹 슬롯을 가진다.

컬럼의미
groupID그룹 식별자
isLinkedtrue면 한 명 어그로 시 그룹 전원 어그로 (추정)
name1, level1, count1슬롯 1의 몹 ID·레벨·마릿수
name2, level2, count2슬롯 2
name3, level3, count3슬롯 3
  • count 합이 핀 수보다 많으면 핀 좌표가 부족해진다. 핀 수와 일치하도록 관리한다.
  • isLinked true 그룹은 MapModule.GetLinkedMonsters로 어그로 연동 처리된다.

상자 그룹은 그룹 단위 드랍 규칙을 가진다. 아이템·루팅·드랍 §1.2에서 알고리즘 정의.

주요 컬럼: groupID, count, dropWorthValue, dropEquipKindsValue, dropPartsRateValue, dropMiscKindsValue, dropGradeValue, dropMoneyValue, dropStackCountValue, dropStackCountAlpha, weaponQueryTags, mainPartsQueryTags, subPartsQueryTags, armorQueryTags, miscQueryTags.

낱개 아이템 배치용 그룹. 상자 그룹과 동일한 컬럼 구조 (count 없음). ModulePinItem 핀에 배치된다.

존(지역)별로 등장할 모듈 종류와 개수를 Min–Max 범위로 정의해 런 진입 시 추첨한다.

ZoneTypeMinMax
1Move23
1Monster35
1Chest24
1Item01
1Patrol02
  • 시작 지점은 메인 모듈에서 최소 10 유닛(추정) 이상 떨어진 위치.
  • StartingZone 모듈이 시작 위치 영역에 대응한다.
  • 플레이어 시작 좌표는 ModulePinPlayer 핀에 정의된다.
  • 세션당 탈출 스팟 1곳.
  • 시작 지점에서 가장 가까운 탈출 후보는 제외 (의도적 동선 강제).
  • MapModuleEscape가 탈출 지점 컨테이너, EscapeInteractable이 상호작용 트리거.
  • 모듈 위치·탈출 지점·핀 좌표는 수동 배치.
  • 내용물(몹·상자·아이템)은 그룹 데이터로 자동 추첨.
런 시작
→ MapModule.Awake
→ 자식 컴포넌트 수집 (MonsterGroup / ItemGroup / ChestGroup)
→ MapModule.Initialize
→ MonsterGroup.Initialize × N → 핀 좌표 수집, 몹 생성 데이터 준비
→ ItemGroup.Initialize × N → 핀 좌표 수집, 후보 추첨, 배치
→ ChestGroup.Initialize × N → 핀 좌표 수집, 후보 추첨, 상자 배치

이 시점에 모든 그룹이 후보를 확정한 상태가 된다. 이후 루팅 시 등급·수량 보정이 적용된다 (아이템·루팅·드랍 §3).

시스템연결 지점
런 구조진입 시 모듈 초기화, 탈출 모듈 1곳 활성화.
아이템·루팅·드랍그룹 단위 후보 확정, 루팅 시 등급·수량 보정.
몬스터 AIMonsterGroup.isLinked 어그로 연동.
시스템 영역시트
맵 정의MapInfoTableSheet
모듈 정의MapModuleTableSheet
몹 그룹MonsterGroupTableSheet
상자 그룹ChestGroupTableSheet
아이템 그룹ItemGroupTableSheet
  • PDF “고정/이동(Fixed/Move)” 운영과 코드 Main/Sub 매핑 — Sub가 이동 모듈에 해당하는가.
  • 코드에 별도 Patrol 모듈 없음 — 정찰 루트가 MonsterGroup 내부에 어떻게 표현되는가.
  • PDF 존 모듈 관리 테이블의 Min–Max 추첨이 현재 코드에서 적용되는 위치.
  • MonsterGroup.isLinked의 정확한 어그로 전파 규칙 (거리·트리거·해제 조건).
  • Map02 향후 등록 계획 및 추가 맵 절차.
  • 모듈 사이 공간 확보 정확한 기준값.