# 상점/휴식 노드 (TODO E4) — 설계 > 작성: 2026-06-09 / 상태: 승인됨 / 근거: TODO E 분해(E4) + E3 맵 노드 구조. > 선행: E3(분기 맵) 완료. 후속: E5(유물)·E6(저장). 카드 제거는 덱 보기 UI 필요 → 후속 분리. ## 문제 E3로 분기 맵은 됐으나 모든 노드가 전투다. 골드는 적립만 되고 소비처가 없다. 상점(골드→카드)· 휴식(HP 회복) 노드가 필요하다. ## 범위 맵에 상점/휴식 노드 추가, 진입 시 전투 대신 상점/휴식 UI. 상점 = 카드 구매(골드). 휴식 = HP 회복. **카드 제거(덱 보기 UI 필요)·유물·저장·휴식 업그레이드는 범위 밖.** ## 설계 ### 데이터 (`data/map.json` 교체 — 4행) ```json { "start": ["A", "B"], "nodes": { "A": { "type": "combat", "enemy": "slime", "row": 1, "col": -1, "next": ["C", "D"] }, "B": { "type": "combat", "enemy": "slime", "row": 1, "col": 1, "next": ["C", "D"] }, "C": { "type": "rest", "row": 2, "col": -1, "next": ["E", "F"] }, "D": { "type": "shop", "row": 2, "col": 1, "next": ["E", "F"] }, "E": { "type": "elite", "enemy": "slime_elite", "row": 3, "col": -1, "next": ["BOSS"] }, "F": { "type": "combat", "enemy": "slime", "row": 3, "col": 1, "next": ["BOSS"] }, "BOSS": { "type": "boss", "enemy": "slime_boss", "row": 4, "col": 0, "next": [] } } } ``` - rest/shop 노드는 `enemy` 없음. 생성기 검증을 "`enemy` 있을 때만 ENEMIES 확인"으로 완화. Lua MapNodes 직렬화도 enemy 있을 때만 `enemy = "..."` 포함. ### 파라미터 (생성기 상수) - `CARD_PRICE = 30`, `REST_HEAL = 30`. ### 상태 추가 - `ShopChoices`(any) — 상점 제시 카드 id 3개. - `ShopBought`(any) — 슬롯별 구매 여부 {bool×3}. ### 메서드 - `PickNode`(수정): CurrentNodeId 세팅·맵 숨김 후 타입 분기 — `shop`→`ShowShop`, `rest`→`ShowRest`, 그 외→`CurrentEnemyId=node.enemy`·`StartCombat`. - `ShowShop`(신규): 카드 풀에서 3개 무작위→ShopChoices, ShopBought 초기화(false), 각 슬롯 비주얼·가격·골드 갱신, ShopHud 표시. - `BuyCard(slot)`(신규): ShopBought[slot]==true 또는 Gold