# 맵 개선: 다양한 preset 몬스터 + 맵별 타일셋 + StS2 배치 설계 - 날짜: 2026-06-06 - 브랜치: feature/maps-batch (기존 맵 작업 이어서) - 대상: `tools/gen-maps.mjs`, `map/map02.map`~`map11.map` (재생성) ## 목표 map02~map11 각 맵에서: 1. **다양한 몬스터** 2마리를 배치하되, 기존 map01의 4종(StaticMonster/MoveMonster/ChaseMonster/monster-43) **스프라이트를 재사용하지 않고**, 공식 맵에서 수확한 다양한 몬스터로 채운다. 2. 몬스터를 **Slay the Spire 2 배치**(플레이어 좌측, 몬스터 우측 전투 포메이션)로 둔다. 3. 맵마다 **다른 타일셋**(TileSetRUID)을 적용한다(같은 바닥 지형, 다른 타일 텍스처). 4. 배경은 기존에 수확한 10종(맵별 상이) 유지. ## 범위 ### 포함 - 공식 맵 import로 **몬스터 변형 세트 + 타일셋 RUID** 수확 - 생성기에 `MONSTER_VARIANTS`(수확 변형), `TILESETS`(타일셋 풀) 반영 - 맵당 서로 다른 몬스터 2종, StS2 우측 배치 - 맵당 다른 TileSetRUID - map02~map11 재생성 ### 제외 (YAGNI) - 지형(Tiles/Foothold) 통째 교체 — 타일셋(텍스처)만 교체 - 포털 연결, 카드-전투 로직 연동 - map01 변경 ## 수확 (공식 맵 import 기법) 배경 수확과 동일: `maker_import_maplestory_map(id)`가 현재 맵을 그 공식 맵으로 교체 → `maker_save` → `map/.map`에서 데이터 추출. - **몬스터 변형** `{ sprite, stand, hit, die }`(RUID): 몬스터가 있는 **필드/사냥맵**을 import해 몬스터 엔티티의 `SpriteRendererComponent.SpriteRUID` + `StateAnimationComponent.ActionSheet`(stand/hit/die)를 추출. ≥12종 distinct 목표. (타운맵은 몬스터 없을 수 있어 필드맵 선택) - **타일셋** `TileSetRUID`: import한 맵의 `TileMapComponent.TileSetRUID` 추출. 10종 distinct (map01의 `9dfea380…`과 겹치지 않게). > **스파이크 선행**: 필드맵 1개를 import해 몬스터 엔티티 구조가 `{sprite, stand, hit, die}` 추출 가능한지 먼저 확인. 구조가 다르면 폴백(아래). ## 생성기 변경 (`tools/gen-maps.mjs`) - `MONSTER_VARIANTS = [ {sprite, stand, hit, die}, ... ]` — 수확 결과로 채움(≥12종). - `TILESETS = [ ruid, ... ]` — 수확한 타일셋 10종. - `buildMap(nn)`: - 몬스터 2마리: `MONSTER_VARIANTS`에서 **서로 다른 2종**을 맵 시드로 선택(맵 내 중복 금지). 클론 몬스터 엔티티의 `SpriteRUID` + `ActionSheet`를 변형으로 덮어씀. (기존 map01 스프라이트 미사용 보장 — 항상 변형으로 덮어쓰므로) - 위치: **StS2 배치** — 화면 우측에 2자리 고정(예: Position.x ≈ +3.5, +5.5; y는 map01 몬스터 y값). map01 전투 구도를 기준으로 우측 포메이션. - 타일셋: `TileMap` 엔티티의 `TileMapComponent.TileSetRUID.DataId`를 `TILESETS[(nn-2)%len]`로 설정. - 배경: 기존 `BACKGROUNDS` 유지. - GUID 재발급·경로 치환·SectorConfig 로직은 그대로. ## 검증 1. **스파이크**(map02): reload→play→screenshot + Lua로 - 몬스터 2마리의 `SpriteRUID`가 수확 변형과 일치(= map01 4종 아님), 우측 배치 - `TileMap.TileSetRUID`가 새 타일셋 - 화면상 몬스터 외형·타일 텍스처가 바뀌어 보임 2. 전체: 맵별 몬스터 2종 distinct, 타일셋 distinct, 배경 distinct, 엔티티 id 중복 없음 3. Maker 표본 맵 시각 확인 ## 리스크/폴백 - 몬스터 엔티티 구조가 `{sprite,stand,hit,die}`로 안 맞으면 → `SpriteRUID`만 교체하고 `ActionSheet`는 map01 템플릿 유지(최소 시각 변화 보장). - 타일셋 교체 시 tileIndex 의미 차이로 타일이 어색하면 → 스파이크에서 확인 후 호환 타일셋만 선별하거나 사용자와 상의. - 수확 시 import는 현재 맵(map02, 재생성 가능)에 적용 → 수확 후 generator로 map02 재생성하여 정리. ## 산출물/형상관리 - `tools/gen-maps.mjs` 갱신, `map/map02.map`~`map11.map` 재생성을 커밋. 수확 RUID는 문자열만 포함(공식 콘텐츠).