feat: P15 — 로비를 전용 맵 + 월드 NPC로 (근접·클릭 상호작용, 로비 한정 이동·공격) #54

Merged
gahusb merged 9 commits from feature/p15-lobby-map-npc into main 2026-06-14 13:04:19 +09:00
Owner

요약

UI 패널 로비(P14-8 LobbyHud 색칠 버튼 4개)를 폐기하고, 전용 물리 맵 lobby(헤네시스 마을 배경)에 공식 메이플 NPC 4종을 월드 엔티티로 배치했습니다. NPC에 다가가 키 또는 직접 클릭으로 기능을 열며, 플레이어 이동·공격 모션은 로비 맵에서만 풀립니다(전투/런 맵은 기존대로 잠김).

요청: "로비를 UI로 만들지 말고, map을 추가해서 로비에 각각 기능을 할 수 있는 npc를 추가하고, 그 npc를 누르면 각 기능을 할 수 있도록 추가. 플레이어는 반드시 로비맵에서만 이동과 공격 모션을 풀어줘."

변경 내용

신규 생성기

  • tools/map/gen-lobby-map.mjsmap01 클론 → map/lobby.map(마을 배경, 몬스터 제거). NPC 4종(공식 maplestory NPC 스프라이트)+머리 위 마크(balloon) 배치, 각 NPC에 TouchReceiveComponent+script.LobbyNpc(NpcId), 루트에 script.LobbyMobility(PlayerLock 제거). SectorConfigmap://lobby 등록.
  • tools/player/gen-lobby-npc.mjsLobbyNpc(거리 폴링→마크 토글, TouchEvent/UpArrow→Interact→컨트롤러 OnLobbyNpcInteract), LobbyMobility(진입 시 이동 해제) codeblock emit.

기존 생성기 수정

  • tools/deck/gen-slaydeck.mjsOnBeginPlay/EndRun→로비 맵 텔레포트(GoLobbyMap), OnLobbyNpcInteract(id)→기존 기능 패널(직업선택/도감/영혼상점/게시판) 디스패치, StartRun에 1막 map01 물리 텔레포트 추가(BuildMonstersCurrentMapName 필터 대응), 공격 키(Ctrl, 로비 한정) 바인딩, LobbyHud를 투명·비레이캐스트 미니 정보바(영혼/승천)로 슬림화 — 버튼 행 제거.
  • tools/player/gen-player-lock.mjs — 전투맵 PlayerLockInputSpeed/JumpForce/WalkAcceleration=0 런타임 재잠금(로비 해제값 누설 방어).

이동 해제 메커니즘 (메이커 실측)

freeze-turn-player가 0으로 만든 값 중 RigidbodyComponent.WalkAccelerationMovementComponent.InputSpeed가 둘 다 양수여야 걷고 점프함(둘 중 하나만으론 안 됨). LobbyMobility가 로비 진입 시 pc.Enable=true, WalkAcceleration=0.7, InputSpeed=5, JumpForce=5 복원. 전투맵 텔레포트 시 모델 기본값(0)+PlayerLock 재잠금으로 자동 재동결 → "로비맵에서만"을 구조적으로 보장.

검증 (메이커 플레이테스트)

전 시나리오 통과 (실측 로그+스크린샷):

  1. 월드 시작 → 로비 맵 스폰, ←→ 이동·점프 정상
  2. NpcCodex 근접(d=1.10<임계 1.2) → 머리 위 마크 표시 → 키 → 카드 도감 오픈
  3. 런 시작(모험가) → map01 텔레포트 + 이동 잠금(InputSpeed=0, WalkAccel=0, pcEnable=false), StS 노드 트리 정상
  4. 런 종료 → 로비 맵 복귀 + 이동 재해제(InputSpeed=5, WalkAccel=0.7)
  5. 미러 회귀 테스트 sim-balance/rogue-map 44/44 PASS
  6. 빌드 콘솔 에러 0(기능 관련)

알려진 비치명적 lint (게임플레이 무영향)

  • MonsterAttack.OnBeginPlay AnimationClip 에러 / DuplicateComponent 경고: NPC가 유일한 스프라이트 템플릿인 chasemonster 모델을 상속해 script.Monster/MonsterAttack가 따라옴. 로비엔 전투 컨텍스트가 없어 휴면이고, 전투맵 몬스터와 공유되는 기존 lint. 향후 전용 NPC 모델로 교체 가능.

산출물 재생성

node tools/map/gen-lobby-map.mjs
node tools/player/gen-lobby-npc.mjs
node tools/player/gen-player-lock.mjs
node tools/deck/gen-slaydeck.mjs

설계: docs/superpowers/specs/2026-06-14-lobby-map-npc-design.md · 계획: docs/superpowers/plans/2026-06-14-lobby-map-npc.md

🤖 Generated with Claude Code

## 요약 UI 패널 로비(P14-8 `LobbyHud` 색칠 버튼 4개)를 폐기하고, **전용 물리 맵 `lobby`**(헤네시스 마을 배경)에 **공식 메이플 NPC 4종을 월드 엔티티**로 배치했습니다. NPC에 다가가 `↑`키 또는 **직접 클릭**으로 기능을 열며, 플레이어 **이동·공격 모션은 로비 맵에서만** 풀립니다(전투/런 맵은 기존대로 잠김). > 요청: "로비를 UI로 만들지 말고, map을 추가해서 로비에 각각 기능을 할 수 있는 npc를 추가하고, 그 npc를 누르면 각 기능을 할 수 있도록 추가. 플레이어는 반드시 로비맵에서만 이동과 공격 모션을 풀어줘." ## 변경 내용 **신규 생성기** - `tools/map/gen-lobby-map.mjs` — `map01` 클론 → `map/lobby.map`(마을 배경, 몬스터 제거). NPC 4종(공식 maplestory NPC 스프라이트)+머리 위 마크(balloon) 배치, 각 NPC에 `TouchReceiveComponent`+`script.LobbyNpc(NpcId)`, 루트에 `script.LobbyMobility`(PlayerLock 제거). `SectorConfig`에 `map://lobby` 등록. - `tools/player/gen-lobby-npc.mjs` — `LobbyNpc`(거리 폴링→마크 토글, `TouchEvent`/`UpArrow`→Interact→컨트롤러 `OnLobbyNpcInteract`), `LobbyMobility`(진입 시 이동 해제) codeblock emit. **기존 생성기 수정** - `tools/deck/gen-slaydeck.mjs` — `OnBeginPlay`/`EndRun`→로비 맵 텔레포트(`GoLobbyMap`), `OnLobbyNpcInteract(id)`→기존 기능 패널(직업선택/도감/영혼상점/게시판) 디스패치, **`StartRun`에 1막 map01 물리 텔레포트 추가**(`BuildMonsters`의 `CurrentMapName` 필터 대응), 공격 키(Ctrl, 로비 한정) 바인딩, `LobbyHud`를 투명·비레이캐스트 미니 정보바(영혼/승천)로 슬림화 — 버튼 행 제거. - `tools/player/gen-player-lock.mjs` — 전투맵 `PlayerLock`에 `InputSpeed/JumpForce/WalkAcceleration=0` 런타임 재잠금(로비 해제값 누설 방어). ## 이동 해제 메커니즘 (메이커 실측) freeze-turn-player가 0으로 만든 값 중 **`RigidbodyComponent.WalkAcceleration`과 `MovementComponent.InputSpeed`가 둘 다 양수**여야 걷고 점프함(둘 중 하나만으론 안 됨). `LobbyMobility`가 로비 진입 시 `pc.Enable=true`, `WalkAcceleration=0.7`, `InputSpeed=5`, `JumpForce=5` 복원. 전투맵 텔레포트 시 모델 기본값(0)+`PlayerLock` 재잠금으로 자동 재동결 → "로비맵에서만"을 구조적으로 보장. ## 검증 (메이커 플레이테스트) 전 시나리오 통과 (실측 로그+스크린샷): 1. 월드 시작 → 로비 맵 스폰, `←→` 이동·점프 정상 2. NpcCodex 근접(d=1.10<임계 1.2) → 머리 위 마크 표시 → `↑`키 → **카드 도감 오픈** 3. 런 시작(모험가) → **map01 텔레포트 + 이동 잠금**(`InputSpeed=0, WalkAccel=0, pcEnable=false`), StS 노드 트리 정상 4. 런 종료 → **로비 맵 복귀 + 이동 재해제**(`InputSpeed=5, WalkAccel=0.7`) 5. 미러 회귀 테스트 `sim-balance`/`rogue-map` 44/44 PASS 6. 빌드 콘솔 에러 0(기능 관련) ## 알려진 비치명적 lint (게임플레이 무영향) - `MonsterAttack.OnBeginPlay` AnimationClip 에러 / `DuplicateComponent` 경고: NPC가 유일한 스프라이트 템플릿인 `chasemonster` 모델을 상속해 `script.Monster`/`MonsterAttack`가 따라옴. 로비엔 전투 컨텍스트가 없어 휴면이고, 전투맵 몬스터와 공유되는 기존 lint. 향후 전용 NPC 모델로 교체 가능. ## 산출물 재생성 ``` node tools/map/gen-lobby-map.mjs node tools/player/gen-lobby-npc.mjs node tools/player/gen-player-lock.mjs node tools/deck/gen-slaydeck.mjs ``` 설계: `docs/superpowers/specs/2026-06-14-lobby-map-npc-design.md` · 계획: `docs/superpowers/plans/2026-06-14-lobby-map-npc.md` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gahusb added 8 commits 2026-06-14 12:52:26 +09:00
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
map01 클론→lobby.map(헤네시스 배경), 몬스터 제거, NPC 4종(공식 메이플 NPC 스프라이트)+머리위 마크 배치. 각 NPC에 TouchReceiveComponent+script.LobbyNpc, 루트에 script.LobbyMobility(PlayerLock 제거). SectorConfig map://lobby 등록.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
LobbyNpc: 거리 폴링→머리위 마크 토글, TouchEvent/UpArrow→Interact→컨트롤러 OnLobbyNpcInteract. LobbyMobility: 진입 시 pc.Enable·WalkAcceleration=0.7 복원(정찰 확정). 공격 키는 컨트롤러에서 처리.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
로비에서 푼 이동(WalkAcceleration)이 텔레포트 후 전투맵에 누설돼도 PlayerLock이 맵 로드 시 0으로 재설정해 확실히 잠금. 정찰로 WalkAcceleration이 실제 이동 레버임을 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- OnBeginPlay: 공격 키(Ctrl, 로비 한정) 바인딩
- ShowLobby→GoLobbyMap: 월드 시작·런 종료 시 로비 맵 텔레포트
- OnLobbyNpcInteract(id): 월드 NPC→기존 기능 패널 디스패치
- StartRun: 1막 진입 시 map01 물리 텔레포트(BuildMonsters CurrentMapName 필터 대응)
- LobbyHud: 버튼-행 제거, 투명·비레이캐스트화(맵 노출·클릭 통과), 영혼/승천 미니 정보바만 유지
- BindLobbyButtons: NPC 바인딩 제거

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
메이커 실측으로 확인:
- 이동에는 RigidbodyComponent.WalkAcceleration과 MovementComponent.InputSpeed가 둘 다 양수여야 함(WalkAccel만으론 안 걸림). LobbyMobility에 InputSpeed=5·JumpForce=5 추가.
- pc.FixedLookAt은 boolean이 아니라 int32 → false→0 (빌드 에러 해소).
- PlayerLock에 InputSpeed/JumpForce=0 대칭 재잠금 추가(전투맵 누설 방어).
- NPC 베이스 모델 inheritance 경고는 비치명적이라 proven-good(모델 유지) 결정 주석화.

검증: 로비 이동·점프, NpcCodex 근접(d=1.10<1.2)·↑키→카드 도감, 런 시작→map01 텔레포트+이동 잠금(InputSpeed=0), 로비 복귀→이동 재해제 전부 정상.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb added 1 commit 2026-06-14 13:02:37 +09:00
기존 5/5는 보행 ~9u/s·점프 상승 14u로 과함. freeze가 안 건드린 intact RigidbodyComponent.WalkSpeed(1.4)/WalkJump(1.23) 기본값에 맞춤. 실측: 보행 2.5u/s, 점프 상승 1.79u로 정상화.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb requested review from maple 2026-06-14 13:03:59 +09:00
gahusb merged commit 6cc008e894 into main 2026-06-14 13:04:19 +09:00
gahusb deleted branch feature/p15-lobby-map-npc 2026-06-14 13:04:27 +09:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gahusb/maplecontest#54