Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
기차로 더 멀리: 첫 화면의 초록색 배너에서 리옹·보르도·스트라스부르·낭트·렌·마르세유·니스·디종으로 떠납니다. 기존 여행 수첩의 19개 도시와 별도로 8개 도시를 추가해 총 27개 도시를 다룹니다. 새 도시들은 기차 여행 화면에서 플레이하며 기존 세계지도·예산 미션에는 아직 통합되지 않았습니다. 탑승 준비 → 8초의 사진 여행(일시정지·건너뛰기 가능) → 환승 또는 도착 → 도시별 산책 3장면 → 추억 엽서·여권 도장·발견 퀴즈로 이어집니다. 니스 코스는 마르세유에서 직접 환승을 확인합니다. 24개 산책 장면과 48개 추억 선택, 8개 발견 배지, 4개 도장 목표를 제공합니다. 도장과 배지는 재여행해도 유지되고 진행 위치와 선택은 이 기기에 자동 저장됩니다. 한국어·영어를 함께 지원합니다. 실제 도시 사진 16장을 추가해 총 116장입니다. 기차 화면은 여행지 사진을 활용한 체험이며 실제 차창 영상이나 모든 중간 정차역의 시간표가 아닙니다. 각 코스에서 SNCF Connect의 실제 기차편과 공식 관광 안내로 연결합니다. 새 콘텐츠·경로는 src/data/rail.ts, 진행·저장 복원은 src/game/railJourney.ts에서 관리합니다.README 전문 보기 ↗
기차로 더 멀리: 첫 화면의 초록색 배너에서 리옹·보르도·스트라스부르·낭트·렌·마르세유·니스·디종으로 떠납니다. 기존 여행 수첩의 19개 도시와 별도로 8개 도시를 추가해 총 27개 도시를 다룹니다. 새 도시들은 기차 여행 화면에서 플레이하며 기존 세계지도·예산 미션에는 아직 통합되지 않았습니다.
탑승 준비 → 8초의 사진 여행(일시정지·건너뛰기 가능) → 환승 또는 도착 → 도시별 산책 3장면 → 추억 엽서·여권 도장·발견 퀴즈로 이어집니다. 니스 코스는 마르세유에서 직접 환승을 확인합니다. 24개 산책 장면과 48개 추억 선택, 8개 발견 배지, 4개 도장 목표를 제공합니다. 도장과 배지는 재여행해도 유지되고 진행 위치와 선택은 이 기기에 자동 저장됩니다. 한국어·영어를 함께 지원합니다.
실제 도시 사진 16장을 추가해 총 116장입니다. 기차 화면은 여행지 사진을 활용한 체험이며 실제 차창 영상이나 모든 중간 정차역의 시간표가 아닙니다. 각 코스에서 SNCF Connect의 실제 기차편과 공식 관광 안내로 연결합니다. 새 콘텐츠·경로는 src/data/rail.ts, 진행·저장 복원은 src/game/railJourney.ts에서 관리합니다.
최신 검증: 64가지 기차 여행의 전체 선택 경로, 필수 환승, 저장 복원·손상 대응·중복 도장 방지와 총 1,353개 영문 화면·미션 단계. 실제 브라우저·휴대전화 시각 검수는 미완료입니다.
첫 화면은 실제 파리 지하철 노선을 따라가는 여행입니다. 루브르→에펠탑(1→6호선), 루브르→몽마르트르(1→12호선), 트로카데로→비르아켐(6호선) 세 코스를 제공합니다. 모든 정차역과 종점 방향을 표시하고 환승역에서는 명시적으로 갈아탑니다. 역당 3.5초의 압축 체험이며 실제 운행 영상·실시간 길찾기가 아닙니다.
실제 역과 여행지 사진, 하차 후 도보 안내, 여행 메모, 로컬 사진 엽서 저장을 제공합니다. 2026년 공식 교통권 안내와 성인·공항 제외 1회권/1일권 비교 계산기를 포함합니다. 요금 확인일은 2026-09-07이며 출발 전 공식 앱에서 운행 상황을 확인해야 합니다. src/data/metro.ts에서 코스와 출처를 관리합니다.
기존 19개 도시 콘텐츠는 상단 여행 수첩에서 이어갑니다. 기존 세이브를 읽을 때 현재 게임에 필요한 필드만 복원하며, 여행 진행·예산·앨범은 유지합니다. 지하철 코스는 무료 미리보기로 기존 미션 예산과 분리되어 있습니다. 정밀 노선이 없는 기존 도시 내 이동은 장소 지도와 현지 이동 안내로 진행합니다.
검증: Node 22.12 이상에서 npm run build, npm test, npm run lint. 지하철 정차역·환승 연결, 교통권 비교, 사진 파일·저작권 정보, 이전 저장 호환성을 검사합니다.
Carnet_게임개발계획서_v0.9.md의 6장(샘플 콘텐츠·MVP)을 플레이 가능한 웹 프로토타입으로 옮긴 것입니다.
일드프랑스 6개 도시 + 프랑스 북부·중부 6개 도시, 그리고 국경 너머 7개 도시(런던·브뤼셀·쾰른·베를린·제네바·바르셀로나·마드리드)까지 총 19개 도시. 이야기 13개 + 국경 도시 이야기 7개 + 도시별 사진 취재·미식 체험 38개를 더해 총 58개 미션을 제공합니다.
지금 어디까지 구현됐고 뭐가 남았는지는
ROADMAP.md에서 기획서 섹션별로 추적합니다. 이 저장소를 다시 열 때는 그 문서를 먼저 읽고, 완료한 항목은 지우고, 새로 한 일을 적어 넣습니다.
여행 수첩에서는 세계지도로 도시를 탐색합니다. 지도는 두 겹입니다. 도시 간 이동은 세계지도(핀·노선·안개·범례)가 무대이고, 도시 안으로 들어가면 그 도시의 내부 지도(CityMap)가 무대가 됩니다. 여행 수첩을 시작하면 세계지도가 열립니다 — 여행의 본체는 지도 위에서 핀을 고르고 노선을 잇는 것입니다. 지도에는 티어(S/A/H)·잠긴 지역의 "안개"·진행률·지역 바로가기를 보여주는 범례가 떠 있고, 잠긴 지역은 각 도시 주변에 반투명한 안개로 표시되다가 해금되면 걷힙니다(기획서 §3.1). 진행 중인 미션이 있으면 지도 위에 떠 있는 "다음 취재" 카드로 바로 이어갈 수 있습니다. 줌아웃해서 유럽 전체를 보면 번잡함을 줄이려고 메인 무대(S) 도시 이름만 남고 거점·유산 도시는 점으로만 표시되며, 확대하면 다시 전체 이름이 나타납니다.
도시 하나를 열면(도시 카드 › "사진 산책" 탭) 그 도시의 실제 장소들이 좌표를 가진 핀으로 지도 위에 놓입니다. 파리는 20개 구(1구 루브르부터 20구 메닐몽탕까지) 라벨도 함께 떠 있습니다. 미션 중 "방문" 스텝에 들어서면 사진 대신 이 내부 지도가 장면의 배경이 되어, 지금 찾아가야 할 장소가 지도 위에서 크게 펄스로 강조됩니다 — 지도가 사진 뒤에 숨는 장식이 아니라 미션이 실제로 벌어지는 무대가 되도록 한 것입니다.
큰 현장 사진과 도시 엽서 목록에서 여행을 시작하고, 지도 보기로 동선을 확인합니다. 사진 산책에서 장소를 방문하거나 현지 음식을 맛보면 사진과 방문 기록이 앨범에 쌓입니다. 사진은 확대할 수 있으며 촬영자·라이선스·원본 링크를 함께 표시합니다.
가격 맞추기는 직접 입력 없이 네 가지 가격표 중 하나를 고르는 방식입니다. 영수증에서 실제 가격, 자국 통화 환산액, 예상가와의 차이를 확인합니다. 답안·구매·기사 결과는 저장되므로 잠시 접거나 새로고침해도 결제와 보상이 중복되지 않습니다. 기존 carnet-save-v1 저장을 유지합니다.
라이벌 테오와 국경 너머. 불로뉴비양쿠르의 메인 미션 「지구의 기록」을 마치면, 라이벌 작가 테오가 끼어들어 런던·브뤼셀·쾰른·베를린·제네바·바르셀로나·마드리드로 먼저 떠났다고 선언합니다. 이 순간 프랑스 북부·중부의 소도시들과 함께 일곱 국경 도시가 한꺼번에 지도에서 열리고, 테오와의 경주가 시작됩니다 — 테오는 도시마다 정해진 날짜에 "도착"하고, 그 전에 플레이어가 먼저 그 도시의 스탬프를 찍으면 특종 보너스(원고료 +€20, 평판 +2)를, 늦으면 특종 없이 기록만 남습니다. 각 도시 카드와 수첩 › 여권 탭에 테오와의 거리(D-day 또는 이미 도착했는지)가 표시되므로, 아미앵·랭스 같은 소도시부터 걸을지 국경으로 서두를지는 이 정보를 보고 플레이어가 정합니다. 런던(파운드)과 제네바(스위스 프랑)는 진짜 환전이 필요한 국경이고, 브뤼셀·쾰른·베를린·마드리드는 국경을 넘어도 유로를 그대로 쓰는 "화폐가 같은 국경"입니다(기획서 §3.3). 쾰른↔베를린, 바르셀로나↔마드리드처럼 파리를 거치지 않고 국경 지역 안에서 바로 이동하는 노선도 있습니다.
한국어·English. 첫 지하철 화면과 게임 HUD의 KO/EN 버튼으로 전환합니다. 58개 미션의 대사·퀴즈·편지, 역사 카드, 음식 설명, 사진 제목·확대 화면, 지도 핀, 교통권 안내와 계산기를 모두 번역합니다. 언어는 저장되고, 표시할 때만 번역하므로 미션 정답·수집품·기존 저장 데이터는 바뀌지 않습니다. src/data/english.json과 src/i18n.ts가 번역 사전이며, npm test는 전체 콘텐츠와 1,353개 영문 화면·미션 단계를 렌더링해 한국어 누락을 검사합니다. 사용자 입력 이름과 사진 원본 속 글자는 번역 대상이 아닙니다.
걷기 화면(index.html)은 원신처럼 파리를 누비는 3인칭 오픈월드 모험입니다. 에펠탑 앞 샹드마르스에서 시작해 거리를 걷고, 벽을 타고, 지붕에서 글라이더로 내려오고, 요괴와 싸우고, 랜드마크 사람들의 부탁을 들어줍니다.
| 조작 | 키보드·마우스 | 게임패드(스위치 배치) | 터치 |
|---|---|---|---|
| 걷기·달리기 | WASD (Shift 전력질주) | 왼쪽 스틱 (B 전력질주) | 왼쪽 아래를 끌기 · 달리기 버튼 누르고 있기 |
| 시점 | 마우스 끌기 · ←→↑↓ · 휠 거리 · Z 정렬 | 오른쪽 스틱 | 오른쪽을 끌기 |
| 점프 · 글라이더 | Space (공중에서 한 번 더 = 펼치기/접기) | X | 점프 버튼 |
| 벽타기 · 상승 | 벽 쪽으로 계속 밀면 붙는다 · Space 도약 · X 놓기 · T 상승 | 같음 · Y 놓기 | 같음 · 놓기 버튼 · ⤒ |
| 구르기 · 낙법 | V (착지 직전에 누르면 다치지 않는다) | L | 달리기 버튼을 톡 |
| 공격 · 강공격 · 스킬 · 폭발 | 마우스 톡 · 길게 눌렀다 떼기 · E · Q | Y · ZL · ZR | ⚔️ · 🌀 · 🌪️ |
| 행동 | F | A | 화면의 안내를 누른다 |
| 몸짓 | 1 인사 · 2 춤 · 3 사진 · 4 앉기 | 십자 ← 인사 · → 춤 · + 앉기 | 🧚 메뉴의 📷 |
| 메뉴 · 지도 · 수첩 · 옷장 · 리리 | Esc · M · J · I · G | − | 오른쪽 위 🧚 · 미니맵 누르기 · 📖 · 🎒 |
화면 배치(원신 그대로): 왼쪽 위 미니맵(누르면 큰 지도), 그 아래 지금 할 일. 오른쪽 위엔 ✨ 기원 · 📖 수첩 · 🎒 옷장 · 🧚 리리의 메뉴(원신의 파이몬 메뉴 — 모험 등급·별조각·€·시각, 리리에게 묻기·지도·사진·소리·조작 안내) 넷뿐. 오른쪽 아래 원소 스킬(E)·원소 폭발(Q), 쓸 수 있을 때만 ⤒ 상승(T). F 행동 안내는 화면 가운데 오른쪽, 피는 아래 가운데. 휴대폰은 왼쪽 떠 있는 조이스틱, 오른쪽 아래 한 무리(⚔️ 공격 · 점프 · 달리기 · 🌀 · 🌪️ · 벽에선 놓기). 봇 검사(scripts/e2e/uicheck.mjs)가 데스크톱 1280×720 · 휴대폰 844×390에서 단추가 겹치거나 화면 밖으로 나가지 않는지 본다.
정리(2026-09): 여행 계획 게임 시절의 것 중 원신식 모험과 맞지 않는 것을 뺐다 — 가게·카페 카드와 메뉴판, 허기·지침, 지하철·버스 타기와 목적지 고르기, 숙소, 하루 마치기 요약, 헬기, 길 묻는 관광객, 가판대·테라스·크레프·초상화·유람선·회전목마·기념품 장수, 걷는 화면 위의 가게 핀(지도에서만 보인다), 조작 안내 상자(메뉴로). 시각은 1초 = 1분으로 흐르고(앉아 있으면 10배 — 밤을 기다릴 때), 장소는 가까이 가면 발견해 지도에 표시되고 경험치를 준다.
src/walk/prologue.ts): 헬기에서 뛰어내려 어디 있는지 모르는 채 시작하던 것을 바꿨다 — 할 거리가 가장 많은 에펠탑 앞(탑을 바라보며)에서, 발밑 지도와 거리만 지으면 바로 시작한다(다른 동네 거리는 뒤에서 받는다). 처음이면 🌱 첫걸음 8단계를 요정 리리가 하나씩 알려 준다(왼쪽 위 판: 할 일 한 줄 · 진행 점 · 건너뛰기, 빛기둥이 늘 다음 자리): ① 🔷 샹드마르스 순간이동 포인트 켜기 → ② 🎁 옆의 보물상자 열기(F) → ③ ❓ 가이드 쥘리의 퀴즈 → ④ ⚔️ 봉인된 상자를 지키는 슬라임 둘(공격·E·Q·V를 처음 써 본다) → 봉인이 풀린 상자 → ⑤ ⤒ 탑 한가운데 아래에서 상승(T)으로 1층(58 m) → ⑥ 🪂 뛰어내려 글라이더(Space)로 잔디밭에 → ⑦ ✨ 기원 1번(모자라면 리리가 별조각을 채워 준다, 단추가 반짝인다) → ⑧ 📖 파리 수첩(J). 단계마다 별조각·경험치, 끝나면 ⭐100 · €20 · 경험치 200, 그리고 메인 이벤트 "철의 귀부인"(귀스타브)으로 안내가 넘어간다. 첫걸음 동안엔 거리 사건·발견 알림·리리의 잡담을 멈춰 한 가지에만 집중하게 한다. 이미 한 것은 저절로 넘어가고 진행은 localStorage['carnet-prologue-v1']에 남는다. (헬기 src/walk/heli.ts는 남아 있지만 시작에 쓰지 않는다.)START_WAYPOINTS, 예전 저장에도 한 번 준다). 첫걸음 1단계는 "미니맵을 눌러(M) 지도를 열고 켜진 🔷를 보고 닫기". 첫걸음은 이제 열 단계: 지도 → 보물상자 → 쥘리 퀴즈 → 쥐 기사·슬라임 야영지 → 📷 사진 → 👑 쥐왕 만나기 → 상승 → 글라이더 → 기원 → 수첩.src/walk/sky.ts): 🎈 열기구 여섯 채가 바람 따라 흘러가며 버너를 켰다 껐다 오르내린다 — 바구니에 내려앉으면 올라타(승객이 "Bienvenue à bord !") 바람 따라 흘러가고 점프로 뛰어내린다, 풍선 꼭대기에 떨어지면 통 튀어 오른다. 🐦 새 떼(기러기 V 대형 · 찌르레기 떼)는 날개를 치며 떠돌다 열기구와 비행기를 피해 가고, 낙하산이나 글라이더로 천천히 다가가면 곁에서 함께 날고(18초), 빠르게 들이받으면 흩어진다. 🪂 낙하산 타는 사람들이 빙빙 돌며 내려온다 — 다가가면 손을 흔들며 "Salut !", 바짝 붙으면 공중 하이파이브(기력 가득). ✈️ 1src/walk/progress.ts, explore.ts, wish.ts): 🔷 순간이동 포인트 14곳(랜드마크 앞마당·다섯 동네 가운데) — 가까이 가면 켜지고 둘레 장소가 지도에 드러난다, 지도(M)에서 누르면 그리로 순간이동(다른 동네면 그 동네를 읽는다). 🗽 잔 다르크 성상(피라미드 광장의 금빛 기마상)에 🪶 바람 깃털(랜드마크 꼭대기·높은 지붕 스무 곳 남짓)을 바치면 기력이 커진다(4개마다 한 단계, 소모 −9%씩). 🎁 보물상자는 약 180 m 칸마다 해시로 정해진 자리에 — 평범(길가) · 정교(높은 지붕 위) · 진귀(🐈⬛ 검은 고양이를 따라가면 · ⏱ 빛 구슬을 시간 안에 모으면) · 화려(에펠탑·노트르담·사크레쾨르·개선문 꼭대기), 한 번 연 것은 다시 나오지 않는다. 🌟 모험 등급(1~30): 상자·포인트·깃털·새 장소·부탁·메인/서브 이벤트·의뢰로 경험치, 오를 때마다 별조각과 €. 📜 오늘의 의뢰 넷(날마다 바뀐다 — 사진·봉주르·상자·걷기·벽 오르기·글라이더 등), 하나마다 ⭐10, 넷 모두 ⭐60. ✨ 기원: 별조각 ⭐160으로 한 번(10번 ⭐1600) — 5★ 1.6%(50번째엔 반드시: 🎩 오페라 실크해트 경험치+15% · 🎖 나폴레옹 코트 질주 기력−30% · 🦋 나비 글라이더 글라이더 기력−40%), 4★ 13%(10번마다 반드시: 옷장의 얻는 장비들), 3★ 기념품(€). 이미 있는 장비는 별조각으로 돌려준다. 📖 수첩 맨 위에 모험 등급·별조각·기력 단계·오늘의 의뢰·탐험 현황. 걷기·달리기·벽타기·활공도 원신처럼 빨라졌다(달리기 5.6 · 질주 8.6 · 벽타기 2.2 · 글라이더 9 m/s). 진행은 판이 끝나도 남는다. 다시 들어오면 첫 화면에 🔷 이어서 단추가 헬기 노선을 다 받기 전(몇 초)부터 켜진다 — 누르면 헬기 없이 마지막 순간이동 포인트에서 바로 시작한다.src/walk/companion.ts, 파이몬처럼): 흰 머리에 빨간 베레모, 별 망토와 별 왕관의 작은 요정이 어깨 곁에 떠서 따라다닌다. 둘레를 보고 먼저 말한다 — 보물상자("저기 보물상자다! 반짝반짝!" 하며 그쪽으로 날아가 가리킨다)·안 켠 순간이동 포인트·바람 깃털·검은 고양이·빛 구슬 받침·요괴 야영지, 싸움 중엔 "온다! V로 굴러!"·"빨간 원! 피해!"·피가 적으면 물러나라고, 모험 등급이 오르면 축하, 랜드마크의 메인 이벤트, 배고프면 "크레프 먹자! 리리는 비상식량 아니야!", 밤엔 가고일 조심. 한참 조용하면 요령 하나(오늘의 의뢰 남은 것 등). 같은 이야기는 한동안 되풀이하지 않는다. (또는 🧚 단추)를 누르면 다음에 할 일을 알려 주고 그쪽으로 날아간다 — 싸움 중이면 싸우는 법, 따라가는 이벤트가 있으면 그 할 일, 없으면 가까운 상자·안 켠 포인트·남은 의뢰. 처음 만나면 자기소개.nvm use # Node 22.12 이상 (.nvmrc: 22)
npm install
npm run dev # http://localhost:5173
npm run build # dist/ 정적 번들 (PWA/Capacitor/Electron의 입력)
npm test # 데이터·사진·선택지·저장 호환·결제/보상 검증
npm run lint
public/photos/의 WebP 사진과 작은 썸네일을 배포에 포함합니다. 플레이 중 Wikimedia에 사진 요청을 보내지 않습니다. 다운로드 재현은 Python 3 + Pillow 환경에서 python scripts/fetch_photos.py로 가능합니다. 기존 파일은 건너뛰며, 교체는 --refresh 사진ID를 사용합니다.
지도 타일은 OpenFreeMap(무료 공개 스타일)을 쓰고, 네트워크가 막히면 내장된 프랑스 윤곽 폴백 스타일로 자동 전환합니다.
실서비스에서는 기획서 §3.1대로 PMTiles 자체 호스팅으로 교체하면 됩니다(src/ui/MapView.tsx의 STYLE_PRIMARY).
src/
game/
types.ts 도시·POI·음식·이동 엣지·사실 카드·미션 스텝 타입 (기획서 §4 스키마 축약). City.currency로 도시별 실제 통화(GBP/CHF 등) 지정
economy.ts 환율(ECB 예시)·환전 경로 5종 스프레드·가격 산정(기준가×물가지수×판매처 계수)·기사 등급·통화 변환(convert/cityCurrency)
store.ts Zustand 게임 상태: 시간/요일·지갑(다중 통화+카드 수수료)·체력·평판·부채·미션 진행·저장(localStorage). pay()가 도시 통화로 결제, 부족분은 카드→편집장 선지급 순으로 처리
rival.ts 라이벌 테오의 국경 도시 도착 일정(THEO_ROUTE)과 theoArrivalDay() — 국경 해금일 기준으로 도시별 "테오 도착일"을 계산
data/
cities.ts 19개 도시 노드(프랑스 12 + 국경 너머 7: 런던·브뤼셀·쾰른·베를린·제네바·바르셀로나·마드리드) + 이동 그래프(§3.2 MVP 이동표: 수단·소요·요금[예약/당일]·편수·첫차/막차·차창 사실). 파리 허브 노선 외에 쾰른↔베를린·바르셀로나↔마드리드 같은 지역 내 횡단 노선도 있음
cards.ts 사실 카드 80여 장 — 문장마다 출처 ID
sources.ts 출처 목록(Wikipedia·Wikidata·기관 공식) — 수첩에서 '출처 보기'
missions.ts 미션 스크립트(오프닝 튜토리얼, 메인 「지구의 기록」, 아미앵 풀 미션 「80일의 첫 페이지」, 프랑스 도시 이야기 11개, 국경 도시 이야기 7개)
fallbackMap.ts 오프라인 폴백 지도
ui/
MapView.tsx MapLibre 세계지도(게임의 기본 진입 화면): 도시 핀(티어·잠김·현재·스탬프), 잠긴 지역 안개 오버레이, 좌상단 범례(티어·진행률·지역 바로가기), 노선, 이동 애니메이션
CityMap.tsx MapLibre 도시 내부 지도: 실제 좌표를 가진 장소 핀(방문 여부 표시), 파리 20구 라벨. 도시 카드 "사진 산책" 탭과 방문 미션 스텝의 배경 무대로 재사용
MetroJourney.tsx 실제 역 사진·환승·여행 엽서·교통권 안내
metro.css 지하철 여행 화면과 모바일 레이아웃
CityPanel.tsx 도시 카드 4탭(미션·장소·이동·음식) — "장소" 탭 상단에 CityMap, 핀을 누르면 아래 목록에서 해당 장소로 스크롤. 기차표 UI, 현지+자국 통화 병기, 파리 대비 태그, 국경 도시는 테오 경주 D-day 표시
Notebook.tsx 수첩·지갑(환율 보드·환전)·여권(스탬프·수집품·테오의 경주)·기사·편지
Hud.tsx, Intro.tsx, common.tsx Hud.tsx에 🔊/🔇 음소거 토글 포함
i18n.ts 표시용 번역과 동적 문구 처리. lang은 store.ts에 저장(게임 리셋과 무관하게 유지)
data/parisArrondissements.ts 파리 20개 구의 대표 좌표·이름 (CityMap의 라벨 레이어 전용, 정밀 경계 폴리곤은 아님)
12개 프랑스 도시는 모두 유로(EUR)를 쓰지만, 국경 너머 7개 도시는 실제 통화가 다릅니다: 런던은 파운드(GBP), 제네바는 스위스 프랑(CHF), 브뤼셀·쾰른·베를린·바르셀로나·마드리드는 프랑스와 같은 유로입니다. City.currency 필드로 지정하며, 입장료(feeEur)·음식 기준가(baseEur)·숙박비(hostelEur)·구역 1회권(transitFareEur)은 모두 그 도시의 실제 통화 기준 금액으로 입력합니다(필드 이름은 하위 호환을 위해 그대로 뒀습니다). 도시 간 열차·유로스타 요금(Edge.fareEur)만은 실제 국제선 관행대로 항상 유로로 판매되는 것으로 통일했습니다. 지갑 부족 시 카드 결제(자국 통화, 수수료 1.5%) → 편집장 선지급(€300 상당, 이자 10%) 순으로 처리되며, 어느 통화로 결제하든 동일한 로직(store.ts의 pay())을 씁니다.
외부 음원 파일은 하나도 쓰지 않습니다. 모든 효과음과 배경음은 src/audio.ts가 Web Audio API로 그 자리에서 합성합니다 — 라이선스 걱정이 없고, 인터넷 연결 없이도(지도 타일과 달리) 완전히 동작하며, 번들 용량도 늘지 않습니다.
store.ts의 muted). 브라우저의 자동재생 정책 때문에 페이지를 열자마자는 소리가 나지 않으며, 첫 클릭·키 입력 한 번으로 오디오가 깨어납니다.src/data/missions.ts의 steps 배열에 스텝을 넣으면 됩니다. 스텝 타입은 src/game/types.ts의 Step:
| 타입 | 설명 |
|---|---|
say | 대사. who: margot / guide / L / theo / echo / narrator. echo는 fiction 플래그로 창작/인용 표시 |
card | 사실 카드 수집 (cardId는 cards.ts에 있어야 함) |
quiz | 3지선다. 정답이든 오답이든 카드는 주고, 오답은 기사 정확도에 반영 |
photo | L.의 사진 ↔ 현재 장소 매칭 |
order | 순서 퍼즐. items는 정답 순서(UI에서 섞음) |
visit | 장소 방문: 입장료·소요 시간·휴관 요일(실제 데이터) 검사, 22시 이후 불가 |
buy | 음식 구매. guess: true면 가격 맞히기(오차가 KPI로 기록됨) |
exchange | 환전(환전 경로 선택). from/to 통화를 지정 — 런던·제네바처럼 실제 환전이 필요한 도시에서 쓴다 |
article | 사실 카드로 기사 조립 → 등급(C/B/A/S) → 원고료 |
letter / unlock / collect / stamp | L.의 편지 / 지역 해금 / 수집품 / 여권 스탬프 |
짧게 요약하면: 클라이언트 쪽 핵심 루프(지도·이동·환전·미식·미션·기사)는 기획서 §3 대부분을 구현했지만, §4(자동 콘텐츠 파이프라인)와 §5(백엔드·계정·모바일 패키징)는 사실상 없습니다 — 지금은 손으로 계속 도시를 늘려나가는 단계입니다. 섹션별 구현 현황표, 부족한 점, 그리고 다음에 할 일의 우선순위 백로그는 ROADMAP.md에 정리되어 있으며 개발이 진행될 때마다 갱신됩니다.
src/walk/ascend.ts, 젤다 왕국의 눈물처럼): T(터치 ⤒ 단추). 머리 위 70 m 안에 지붕·천장·전망대 바닥이 있으면 옥빛 고리가 그 밑에 돌고, 누르면 0.5초 웅크려 힘을 모았다가 두 팔을 들고 빙글 돌며 옥빛 기둥 속으로 솟아(점점 빨라져 36 m/s) 그 꼭대기(겹쳐 쌓인 층은 이어서 맨 위)로 튀어나와 불티와 함께 내려앉는다 — 다치지 않는다. 머리 위가 비었어도 건물 벽에 바짝 붙어 서면(벽을 타는 중에도) 벽을 타고 지붕 위로. 에펠탑: 한가운데 아래 → 1층(58 m), 1층 한가운데 → 꼭대기 전망대(277 m). 처음 쓸 수 있게 되면 리리가 알려 준다. 올라가는 동안 카메라는 밑에서 올려다보고, 꼭대기에 서면 내려다본다.src/walk/domain.ts, 원신처럼): 파리 땅 밑의 도전 던전 셋 — 🌫 안개의 수로(알마 다리 옆 하수도 박물관, 슬라임·쥐), 💀 뼈의 회랑(팡테옹 앞 카타콤, 쥐 기사), ⛏ 석고 채석장(몽마르트르, 돌 가고일). 거리엔 돌 아치 속 보랏빛 소용돌이(이름표·미니맵 🌀)가 둘레 40 m 안 탁 트인 땅에 선다. F로 들어가면 따로 그린 장면(하수도는 물길·관, 카타콤은 해골 벽, 채석장은 나무 버팀목, 횃불 빛)에서 시작 방 → 돌 받침에서 F = 도전 시작(문이 내려간다) → 복도 → 기둥 넷의 광장에서 적의 물결 셋. 제한 시간 3분, 남은 시간 2분↑ ★★★ · 1분↑ ★★ · 그 밖 ★. 난도는 모험 등급으로 I(AR 1src/walk/combat.ts): 샹드마르스 끝(에콜 밀리테르 쪽) 빨간 원 안에 쥐왕(Roi des Rats) Lv.40 — 모험 등급을 따라 세지지 않는 거대한 쥐 기사(금관·붉은 망토, 이름표가 멀리서도 보인다). 체력 7000, 내려치기(빨간 원)·돌진, 절반이면 쥐 기사 셋을 부른다. 처음엔 두 방이면 쓰러지고(모험 등급 1: 132 → 27 → 쓰러짐), 모험 등급이 오를수록 덜 아프다(쥐왕에게만 방어: 등급마다 2.5%, 최대 절반) — 봇 시험에서 등급 16은 절반까지 깎고 쓰러졌고, 등급 22는 67초 만에 잡았다. 잡으면 ⭐300 · €150 · 경험치 3000 · 없는 5★ 장비 하나, 다음 날 다시 나타난다. 첫걸음에서 한 번 만나 본다(멀리서도 달려든다 — 쓰러지거나 도망치면 리리: "지금은 절대 못 이겨, 등급 20쯤 올리고 다시 오자"). 요괴도 많아졌다: 칸마다 야영지(상자를 지킨다) 25% · 떠도는 무리(상자 없이) 18%, 에펠탑 둘레 1.1 km는 거의 쥐 기사 떼(탑 밑 하수도에서 올라온다).src/walk/combat.ts): 접은 파리 우산으로 싸운다 — 마우스 톡 = 공격(4단 콤보: 가로 베기 → 되베기 → 내려찍기 → 한 바퀴 도는 회오리 베기(둘레 전부 2.4배), 0.95초 안에 이어 눌러야 이어진다, 가까운 적 쪽으로 저절로 돈다, 한 박자 일찍 누른 것은 잠깐 기억했다가 나간다) · 강공격 = 끌지 않고 길게(0.4초) 눌렀다 떼기(기력 20%, 앞으로 내달리며 찔러 줄지어 선 적을 꿰뚫는다 2.8배) · 반격(구르기 끝나고 0.5초 안의 공격 — 구르는 중에 눌러도 된다 — 은 반드시 치명타 1.5배, "반격!") · 띄운 적 추가타 +25% · HIT 수(2.5초 안에 다음 타격이면 이어지고 화면 오른쪽에 표시, 5타마다 피해 +5% 최대 +30%, 8·15·25·40타에 Bien!·Très bien!·Magnifique!·Parisien!) · E = 원소 스킬 "바람 소용돌이"(둘레 5.5 m를 끌어당겨 띄운다, 6초) · Q = 원소 폭발 "센 강의 회오리"(때릴수록 원소 에너지가 차고, 60이면 6초 동안 앞으로 나아가며 끌어당기는 회오리) · 공중에서 공격 = 내려찍기(높을수록 세다, 떨어져도 안 다친다) · V = 구르기(무적, 공격 중에도 끊고 피한다, 4 m 넘는 낭떠러지 앞에선 멈춰 지붕·탑 위 싸움에서 굴러떨어지지 않는다 — 뛰어내리려면 점프). 상호작용은 원신처럼 F, 시점 정렬은 Z. 적은 사람이 아니라 파리의 요괴 — 🌫 센 강 안개 슬라임 · 🐀 하수도 쥐 기사(베레모) · 🗿 돌 가고일(날아와 들이받는다, 밤에 많다). 셋이 봉인된 보물상자를 지키는 야영지로 공원·광장에 있고(칸마다 해시), 모두 물리치면 봉인이 풀린다. 👑 노트르담의 큰 가고일(우두머리, 하루 한 번 노트르담 뒤뜰): 빨간 원으로 미리 보이는 내려치기·돌진, 절반이면 작은 가고일을 부른다 — ⭐60. 피(HP)는 모험 등급에 따라 오르고, 순간이동 포인트 곁에서 가득 차고, 싸움 밖에선 천천히, 먹으면 35% 찬다. 쓰러지면 가장 가까운 켠 순간이동 포인트에서 다시 일어난다. 적의 레벨·체력·힘도 모험 등급을 따라 오른다. 데미지 숫자(치명타 노랑·바람 청록)·적 머리 위 피 막대·우두머리 막대·맞으면 붉은 테두리. 오늘의 의뢰에 "요괴 6마리 물리치기"가 섞인다. 터치: ⚔️·🌀·🌪️ 단추.src/walk/street/story.ts, 수첩 UI src/walk/journal.ts): 📖 파리 수첩(J). 메인 이벤트는 대표 랜드마크마다 하나, 순서는 자유 — 🗼 에펠탑 「철의 귀부인」(꼭대기 276 m까지 올라가 파리를 찍어 오기) · 🏛 개선문 「꺼지지 않는 불꽃」(무명용사의 불꽃 앞에 서고, 옥상 50 m에서 샹젤리제 쪽으로 한 장) · 🔺 루브르 「유리 피라미드」(날아간 안내도 세 장 — 하나는 피라미드 꼭대기 — 을 찾고, 손끝으로 꼭짓점을 잡는 그 사진) · 🔔 노트르담 「종지기의 부탁」(푸앵 제로를 밟고 탑 69 m에 올라 가고일 너머로 한 장) · 🎨 사크레쾨르 「몽마르트르에서 내려다보기」(큰 계단 → 계단에 앉아 내려다보기 → 돔 위) — 다섯을 마치면 마지막 「빛의 도시」(밤 9시 이후 정시, 반짝이는 에펠탑). 랜드마크 300 m 안에 들어서면 알려 주고, 맡긴 사람(⭐)에게 말을 걸어 시작한다. 할 일은 위쪽 한 줄과 빛기둥·미니맵(⭐)이 안내하고, 수첩에서 다른 이벤트로 '안내'를 바꿀 수 있다. 끝낸 메인은 도장으로 남고 저장된다. 서브 이벤트는 랜드마크 둘레의 짧은 부탁(개선문 옥상에 걸린 장난감 비행기, 날아간 헌책, 몽마르트르 계단의 사진 조각, 루브르 앞 신혼부부 사진)과 ❓ 퀴즈(탑은 몇 년짜리였나, 별 광장, 피라미드는 언제, 푸앵 제로, 하얀 돌) — 틀리면 다시 풀 수 있다. 루브르 모형(유리 피라미드·작은 피라미드·물 웅덩이·ㄷ자 궁전 날개, 피라미드는 계단 모양 부딪힘이라 꼭대기까지 오를 수 있다)을 새로 세웠다. 다섯 메인 모두 봇이 진짜 키 입력으로 처음부터 끝까지 해 봤다(scripts/e2e/) — 그러다 노트르담·개선문·에펠탑이 턱 없는 한 면이라 기력으로 오를 수 없던 것을 찾아, 회랑·코니스·다리 단을 따라 10~15 m마다 쉬어 가는 턱을 냈다(에펠탑 꼭대기까지 약 5분).fight(그 자리에 무리가 나타나고 다 물리치면 다음, 빛기둥이 가리킨다). 사진은 오른쪽 위 📷 단추(키보드 3) — 사진이 필요한 단계에선 단추가 반짝이고 한 줄에 "오른쪽 위 📷 단추"라고 적힌다. 첫걸음에도 사진 단계가 있다. 앉기·인사는 🧚 메뉴에도.src/walk/minimap.ts): 왼쪽 위 동그란 지도(누르면 큰 지도). 보는 쪽이 늘 위로 카메라를 따라 돌고, 높이 오를수록 넓게 보인다(걸을 땐 170 m, 헬기에선 1.2 km쯤). 공원·강·길·건물 위에 헬기 노선, 사람들, 알게 된 곳·역, 열기구·낙하산·새·여객기, 빛기둥(밖이면 가장자리 표시), 내가 보는 쪽과 몸 방향이 찍힌다. 누르면 큰 지도.src/walk/skills.ts, 창 skillui.ts, K · 🧚 메뉴 → 📜 기술): 캐릭터마다 세 갈래 × 네 단계 = 열두 기술, 여덟 명이면 96가지. 기술 포인트는 캐릭터마다 따로(모험 등급 + 1점), 단계는 모험 등급 1 · 3 · 6 · 10에 열리고 위 칸을 한 점 찍어야 아래 칸이 열린다. 기술 레벨은 20까지(레벨마다 피해 +15%, 마나 +4%), 시너지: 같은 갈래 다른 기술 레벨마다 피해 +6%. 쓰는 기술(🔷 마나 · 재사용 시간)은 5 · 6 · 7 · 8 칸(화면 아래 가운데 단추, 휴대폰은 눌러서)에 올려 쓰고, 처음 배우면 빈 칸에 저절로 올라가며 가운데에 ✨ 새 기술 카드. 쓰면 머리 위에 기술 이름. 익히는 기술(공격력 · 치명타 · 체력 · 방어 · 공격 속도 · 마나 회복 · 흡혈)은 늘 켜져 있다. 마나(🔷)는 피 막대 아래 파란 막대 — 최대 50 + 등급×5, 초당 4씩 찬다. 기술은 틀 열셋을 저마다 다르게 조합한다 — 화살(여러 발 · 부채꼴 · 사방 · 꿰뚫기 · 맞으면 폭발) · 고리(내 둘레 / 적 발밑) · 부채꼴(여러 번) · 돌진(꿰뚫으며 내달림) · 도약(뛰어들어 내리찍기) · 비(메테오 · 번개 · 눈보라) · 궤도(몸 둘레를 도는 칼날·톱니·망치) · 사슬(적에서 적으로 튀는 번개) · 포탑(리벳 포탑 · 그림 새 · 그림자 분신 · 에펠 포대) · 덫(밟으면 터짐) · 불길(불의 벽 · 독 웅덩이) · 오라(가시 · 신성한 불꽃 · 회복) · 강화(방패 · 함성 · 만월). 상태 이상: 🔥 불태움 · 🟢 독(지속 피해) · ❄️ 느려짐(이동 40%, 푸르게) · 💫 기절 · 밀침 · 끌어당김 · 흡혈. 갈래 — 여행자 🗡 바람 검술 · 🌪 폭풍(번개 사슬 · 대폭풍) · 🧭 여행자의 지혜 / 쥘리 🌊 물채찍술 · ❄️ 얼음 마법(얼음 구슬 · 눈보라) · 💧 치유의 물 / 귀스타브 🔨 망치(도약 강타 · 대지진) · ⚙️ 기계 장치(포탑 · 덫 · 톱니 · 에펠 포대) · 🛡 강철 방어 / 마르셀 🔫 총검술 · 🔥 화염(화염구 · 불의 벽 · 메테오) · 📯 군인의 함성 / 아멜리 🖼 던지기(액자 폭풍) · ✨ 빛의 마법(빛의 망치) · 🎭 예술의 속임수 / 캉탱 🔔 종 울림 · 🕯 가호(오라) · 📢 소리 / 엘로디 🖌 붓놀림 · 🌈 색의 마법(독) · 🐦 그림 친구(소환 포탑) / 륀 🌑 그림자 무술 · 🌠 별의 마법(유성우) · 🌙 밤의 기운. 창 아래 칸을 누르면 지금 · 다음 레벨의 숫자(피해 · 마나 · 재사용 · 시너지)를 보여 준다. 공통 특성 레벨·재능 나무(🌟)는 이 창의 단추로. 첫걸음의 "첫 기술" 단계에서 하나 배우고 써 본다. 봇 검사 scripts/e2e/skills.mjs: 여덟 명 모두 창에서 진짜로 눌러 배우고, 쓰는 기술을 5번 키로 하나씩 써서 피해·마나를 잰다.src/walk/elements.ts, combat.ts, skills.ts): 원소 반응(원신처럼) — 캐릭터마다 원소(여행자 🌬 바람 · 쥘리 💧 물 · 귀스타브 ⚙️ 강철 · 마르셀 🔥 불 · 아멜리 ✨ 빛 · 캉탱 🔔 소리 · 엘로디 ☠️ 독 · 륀 🌙 달빛)가 있고, 기술은 상태 이상에 따라 원소가 바뀐다(불태움 → 불, 느려짐 → 얼음, 중독 → 독, 번개 사슬 · 번개 비 → 번개). 맞은 적 머리 위에 원소(오라)가 5초 남고, 다른 원소로 치면 터진다 — 증발(불+물 ×1.8) · 녹음(불+얼음 ×2) · 빙결(물+얼음, 얼어붙음) · 감전(번개+물, 곁의 적에게 번개) · 과부하(번개+불, 폭발 · 밀침) · 초전도(번개+얼음, 받는 피해 +30%) · 점화 폭발(독+불) · 번짐(독+물, 둘레로 퍼짐) · 일식(빛+달 ×2.5 · 기절) · 정화(빛+독) · 밀물(달+물, 얼어붙음) · 푸른 불꽃(달+불). 오라를 남기지 않는 원소는 남은 오라를 터뜨린다 — 🌬 확산(둘레로 퍼뜨림) · ⚙️ 결정화(6초 받는 피해 −25%) · 🔔 공명(기절). 반응은 큰 글자와 고리로 보이고 파티를 바꿔 가며 잇는 맛이 있다. 정예 접두어(디아블로처럼, 캠프 정예 · 밤 사냥꾼 정예에 한두 개) — 빠른(1.5배) · 단단한(받는 피해 −50%, 원소 반응으로 갑옷이 깨진다) · 불타는(맞으면 몸에 불 — 초당 3%) · 흡혈하는(때릴 때마다 10% 회복) · 분열하는(쓰러지면 작은 둘로) · 폭발하는(쓰러지면 빨간 원, 1초 뒤 체력 25%) · ○의 방패(한 원소 피해 20% — 다른 캐릭터로). 이름표에 ★ 접두어 · 원소 표시. 기술 각성: 쓰는 기술이 Lv 5 · Lv 10에 닿으면 둘 중 하나를 고른다(언제든 바꾼다, 기술 카드의 ✦ 각성) — 틀 열셋마다 넷, 예) 화살: 갈래(두 발 더) / 거대화(꿰뚫고 폭발) → 파편 / 부메랑, 고리: 메아리 / 끌어모으기 → 확장 / 약점 노출, 사슬: 긴 사슬 / 갈라지는 사슬 → 증폭 / 종착 폭발, 포탑: 쌍둥이 / 속사 → 자폭 / 냉기 탄, 덫: 연쇄 · 끌어들이기, 불길 · 오라: 따라오기 · 생명의 장 · 마나 오라 … 같은 기술이라도 고르는 대로 쓰는 법이 바뀐다. 봇 검사 scripts/e2e/depth.mjs: 쥘리로 물을 묻히고 마르셀로 바꿔 쳐서 증발, 반응표 아홉 쌍, 정예 스무 마리의 접두어, 단단함이 반응으로 깨지는지, 분열 · 폭발, K 창에서 Lv 6 기술의 각성을 눌러 고르고 5번 키로 쓰기.src/walk/foemodels.ts, icons.ts): 모델 파일 없이 도형을 빚고 캔버스로 무늬를 그려 입힌다(툰 3단 명암 + 검은 외곽선). 🐀 쥐 검객 — 서양배 몸에 파리의 마리니에르(흰 바탕 남색 줄) · 남색 바지와 허리띠 · 빨간 스카프 · 비스듬한 베레모 · 큰 둥근 귀(분홍 속) · 흰자와 반짝이는 눈동자 · 찌푸린 눈썹 · 앞니 두 개 · 수염 · 휘어 올라간 꼬리 · 금빛 손잡이 세이버(칼을 들어 올렸다 내려벤다) · 붓질 털 무늬. 👑 쥐왕은 금관(루비) · 털 깃 · 붉은 망토 · 황금 칼 · 빛나는 눈. 💧 슬라임 — 끝이 말린 물방울, 반투명 젤 속 핵과 기포, 반짝이는 큰 눈 · 볼터치 · 작은 입 · 윗면 반사광. 🗿 가고일 — 이끼 낀 노트르담 돌(얼룩 · 금 · 이끼를 그린 무늬), 굽은 등 · 사자 주둥이와 송곳니 · 굽은 뿔 · 뾰족 귀 · 갈퀴 발톱 · 창날 꼬리 · 뼈대와 가리비 막의 박쥐 날개 · 빛나는 눈. 우두머리는 가슴의 갈라진 틈에서 불빛 · 뿔 왕관 · 등 가시. 같은 재질 조각은 한 덩어리로 합쳐(종류마다 한 번만) 밤 습격처럼 수십 마리가 나와도 가볍다. 기술 아이콘 96개: 이모지 대신 원소 색의 어두운 바탕(빛 번짐 · 붓 결 · 반짝이) 위에 기술 모양을 빛나는 붓으로 — 꼬리 끄는 탄 · 퍼지는 고리 · 초승달 베기 · 속도선 돌진 · 내리꽂는 도약과 땅의 금 · 떨어지는 유성 · 몸을 도는 칼날 · 점에서 점으로 튀는 번개 · 포탑 · 이빨 덫 · 솟는 불길 · 빛의 오라 · 강화 화살표, 익히는 기술은 칼 · 과녁 · 별 · 심장 · 방패 · 깃털 · 물방울 · 송곳니. 기술 창 칸(다이아몬드 · 원), 카드, 소켓, 화면 아래 5~8 칸, 새 기술 카드에 쓴다. 타격 이펙트: 베기는 원소 색 초승달 궤적(앞이 짙고 꼬리가 사라지는 붓 무늬 + 흰 날), 충격파는 바깥이 밝은 부드러운 고리, 불티 · 조각은 둥근 빛, 기술의 탄은 빛 번짐, 바닥 범위는 또렷한 테두리의 원. 휴대폰 가로 화면에서 기술 칸이 피 · 마나 막대와 겹치면 그 위로 비킨다. 봇 사진 foes.mjs · icons.mjs · vfx.mjs.src/walk/party.ts, 창 partyui.ts, 생김새 hero/figure.ts setLook()): 첫걸음 맨 처음에 나를 만들기 — 이름, 피부(6), 머리 색(8), 머리 모양(짧게·단발·포니테일·올림머리·긴 머리), 눈(5), 키(작게·보통·크게), 목도리 색(6), 덧붙이기(안경·콧수염·턱수염), 🎲 무작위. 오른쪽 판에서 고르는 대로 왼쪽의 진짜 캐릭터가 바로 바뀐다(나중에 파티 창의 ✏️ 꾸미기로 고친다). 동료는 하나씩 열린다 — 💧 쥘리(가이드, 첫걸음에서 달빛 나비를 보여 주면 · E를 쓰면 체력 8% 회복 · 체력 +15%) · ⚙️ 귀스타브(「철의 귀부인」 · 공격력 +10% · 받는 피해 −15% · 강공격 기력 −30%) · 🔥 마르셀(「꺼지지 않는 불꽃」 · 체력 +25% · 맞힐 때 1% 회복) · 🖼 아멜리(「유리 피라미드」 · E 재사용 −1.5초 · 스킬 +20%) · 🔔 캉탱(「종지기의 부탁」 · Q +40% · 에너지 +25%) · 🎨 엘로디(「몽마르트르에서 내려다보기」 · 치명타 +12% · 치명타 피해 +30%) · 🌙 륀(🌗 파리의 두 얼굴을 끝까지 · 밤에 공격력 +30%). 사람마다 싸움이 통째로 다르다(src/walk/moves.ts, 자세·무기 hero/figure.ts stylePose()·setStyle(), 소리 sound.ts) — 보통 공격의 모양·닿는 곳·빠르기(동작 속도 ×0.8~1.4), 원소 스킬(E), 원소 폭발(Q), 손에 든 무기, 늘 입는 옷(모자·윗옷·색)까지: 🌬 여행자(우산 검술 4단 · 넷째는 회오리 베기 / 바람 소용돌이 / 센 강의 회오리) · 💧 쥘리(물채찍 — 4.6 m를 좁게 휘갈기고 넷째는 앞으로 뻗는 물줄기 / 물보라: 밀어내며 회복 / 밀물: 세 겹 파도 + 체력 30%) · ⚙️ 귀스타브(리벳 망치 — 느리고 넓고 묵직, 셋째·넷째는 뛰어올라 땅을 내리친다 / 리벳 방패: 6초 받는 피해 −60% + 발구르기 / 철의 귀부인: 빨간 원 뒤 하늘에서 쇠기둥) · 🔥 마르셀(총검 — 가장 빠른 찌르기, 넷째는 앞에서 터지는 불꽃·불태움 / 불씨 돌진: 7 m 꿰뚫고 불태움 / 꺼지지 않는 불꽃: 8초 둘레를 태우고 공격력 +20%) · 🖼 아멜리(액자 던지기 — 14 m 날아가 맞힌다, 넷째는 세 장 부채꼴 / 액자 번쩍: 9 m 부채꼴 기절 / 모나리자의 미소: 14 m 안 모두 기절) · 🔔 캉탱(종 — 둘레를 한꺼번에 울리고 넷째는 큰 고리로 기절 / 작은 종: 놓은 종이 적을 끌어당기며 세 번 울린다 / 에마뉘엘의 울림: 큰 충격파 셋) · 🎨 엘로디(큰 붓 — 가장 빠르고 넓게, 맞은 자리에 물감 / 물감 고리: 치명타 +30% 6초 / 파리의 색: 물감 폭탄 여섯) · 🌙 륀(달그림자 베기 — 칠 때마다 적 곁으로 순간 이동, 넷째는 적 뒤로 돌아가 한 바퀴 / 달그림자: 앞으로 6 m 순간 이동 + 다음 세 대 ×1.5 표식 / 별똥비: 4초 동안 별 열 개). 기절한 적은 제자리에서 비틀거리며 푸르게 물든다. 원소 색이 스킬 고리·불꽃에 입혀지고, 모험 등급·특성·스킬 트리·장비(무기·옷의 능력)는 함께 쓴다. 봇 검사 scripts/e2e/chars.mjs: 파티 창에서 여덟 명을 차례로 골라 4타·E·Q를 쓰고 피해·특수 효과를 잰다. 새 동료는 가운데 카드로 알리고, **👥 파티(P · 🧚 메뉴)**에서 카드를 눌러 바꾼다(잠긴 사람은 여는 법이 보인다). 피 막대 왼쪽 위에 지금 캐릭터 이름표.src/walk/prologue.ts): 👤 나를 만들기 → 🗺 지도 → 🎁 상자 → ❓ 퀴즈 → ⚔️ 야영지 → 싸움 연습(4단 콤보를 맞히기 · 강공격으로 꿰뚫기 · 구르기 반격 — 연습용 슬라임이 다 쓰러지면 다시 나온다) → 📷 사진 → 👑 쥐왕 → ⤒ 상승 → 🪂 글라이더 → ✨ 기원 → 🌟 스킬 트리(리리가 1점을 준다) → 📖 수첩 → 2장 🌗 낮과 밤: 🧚 메뉴에서 🌙 밤으로 → 첫 밤 습격 1물결 → 밤에만 나는 🦋 달빛 나비 잡기 → ☀️ 낮으로 → 쥘리에게 보여 주면 쥘리가 동료 → 👥 파티에서 쥘리로 바꿔 보기 → 🌗 파리의 두 얼굴 첫 실마리. 첫걸음은 늘 낮에 시작한다(밤을 골랐어도 도중에 배운다). 예전 10단계 저장은 이어서 한다. 봇 검사 scripts/e2e/pro2.mjs: 진짜로 시작 단추를 누르고, 이름을 치고 생김새를 골라, 22단계를 모두 입력·클릭으로 끝낸다.src/walk/horde.ts, 고르기는 시작 화면 · 🧚 메뉴 "🌙 밤 습격 / ☀️ 낮으로"): 시작 화면에서 둘 중 하나를 고른다(기억한다). 낮은 지금까지의 파리 여행(사람들·부탁·이벤트·첫걸음). 밤 습격은 거리의 사람을 모두 집에 보내고(부탁하는 사람만 남는다) 밤 11시에 머물며, 요괴가 물결마다 둘레 16combat.ts juice(), 소리 sound.ts 싸움 칸, 흔들림 hero/camera.ts shake()): 맞히는 순간 히트스톱(보통 0.05초 · 센 한 방 0.07 · 치명타 0.09 — 시간이 거의 멎는다), 카메라 흔들림, 재질마다 다른 맞는 소리(낮은 쿵 + 딱 + 🌫 젤리 찰싹 · 🐀 털 퍽 · 🗿 돌 딱, 치명타는 쨍), 콤보 단계마다 높아지는 휘두르는 바람 소리·회오리 베기·강공격·E·Q 소리, 맞은 자리의 별 번쩍 + 튀는 조각, 치명타는 화면 가장자리 번쩍과 크게 튀는 노란 숫자. 적은 맞으면 뒤로 밀리고 움찔하며(센 한 방은 멀리, 정예는 덜), 기합(공격 준비)을 끊을 수 있다("끊었다!" — 작은 녀석은 한 대로, 정예는 센 한 방·치명타로, 우두머리는 안 끊긴다). 쓰러뜨리면 묵직한 소리와 함께 날아가 돌며 쓰러진다, 무리·습격 물결의 마지막 하나는 느린 화면. 휴대폰은 맞힐 때 짧게 떨린다. 효과음은 압축기를 거쳐 여럿을 한꺼번에 때려도 찢어지지 않고, 다 쓴 효과·쓰러진 적은 GPU에서도 치운다(밤 습격 수백 마리).src/walk/tales.ts): 낮에 찾은 실마리가 밤에만 드러나는 것을 가리키고, 밤에 얻은 것이 다음 낮의 문을 연다 — ☀️ 샹드마르스 벤치의 📓 귀스타브 수첩 조각(F) → 🌙 샹드마르스 잔디의 "철의 유령"(정예 쥐 기사 둘이 지킨다) → 🗝 녹슨 열쇠 → ☀️ 루브르 나폴레옹 안뜰의 옛 표지석에 꽂기 → 🌙 노트르담 앞 광장, 밤에만 열리는 문(정예 가고일) → ☀️ 사크레쾨르 앞마당, 화가의 빈 캔버스에 별자리 그림 맞추기 → 🌙 몽마르트르 언덕의 떨어진 별(정예 셋). 자리마다 빛기둥(낮 단계 노랑 · 밤 단계 보라)이 서고, **맞지 않는 모드로 가면 기둥이 흐려지고 "밤(낮)에 다시 오자 — 🧚 메뉴에서 바꾸기"**라고 알려 준다. 왼쪽 할 일 아래에 🌗 한 줄(몇 번째인지 · 지금 모드로 풀 수 있는지). 밤이거나 400 m 안이면 빛기둥이 이쪽을 먼저 가리킨다. 보상은 갈수록 커진다(별조각·경험치·📘·🔹·€, 마지막은 🌟 스킬 포인트 +2 · 📘10 · 없는 5★ 장비). 봇 검사 scripts/e2e/tales.mjs: 여섯 단계를 순간이동·걷기·F·진짜 입력 싸움으로 풀고, 모드는 🧚 메뉴의 진짜 단추로 바꾼다.src/walk/growth.ts, 창 growthui.ts, K · 🧚 메뉴, 모험 등급 2에 열린다): 특성 레벨(원신처럼 셋) — ⚔️ 보통 공격(4단 콤보·강공격·내려찍기, 레벨마다 +10%) · 🌀 원소 스킬(+12%) · 🌪️ 원소 폭발(+12%), Lv.10까지, 한 번에 📘 2×Lv · €15×Lv, 한도는 모험 등급 1에 Lv.2, 3등급마다 하나씩. 스킬 트리(스킬 포인트: 모험 등급마다 1점 + 밤 습격 5물결마다 1점, 앞 칸을 찍어야 다음 칸이 열린다) — ⚔️ 검술: 날 벼리기(공격력 +6% ×3) → 급소 찌르기(치명타 +4% ×3) · 돌진 찌르기(강공격 기력 −50%·피해 +30%) → 회오리 마무리(4타 +50%) → 파리의 일격(치명타 피해 +20% ×2) / 🛡 생존: 튼튼한 다리(체력 +8% ×3) → 두꺼운 코트(받는 피해 −6% ×3) · 파리지앵 발놀림(반격 틈 +0.5초) → 크루아상 한 입(맞힐 때 체력 0.6% ×2) → 두 번째 숨(90초에 한 번 쓰러질 뻔하면 30%로 버틴다) / 🌪 바람: 산들바람(E 재사용 −0.6초 ×3) → 바람 모으기(에너지 +12% ×3) · 돌풍(E 범위 +1 m·피해 +15% ×2) → 폭풍의 눈(Q 피해 +25% ×2) → 순풍(Q 뒤 6초 공격력 +20%). 찍을 점수가 남으면 🧚에 빨간 점. 옷 강화: 옷장의 모자·윗옷·가방·신발 칸 아래 "⬆ 강화"(🔹(1+Lv) · €5×Lv, Lv.10까지, 한도 모험 등급+1) — 입은 옷 레벨마다 체력 +2.5% · 방어 +1%(받는 피해, 스킬 트리와 합쳐 최대 60%). 옷장 위 능력치에 🛡 방어. 봇 검사 scripts/e2e/night.mjs: 밤을 골라 시작 → 물결을 진짜 입력으로 싸워 넘기고 → K로 특성·트리 찍고 → 옷 강화 → 낮으로 돌아가면 사람이 돌아온다.src/walk/progress.ts FEATURES, banner.ts, feed.ts): 처음엔 미니맵·할 일·싸움·상승·글라이더·📷·📖·🎒·🧚만. 모험 등급이 오르면 하나씩 열린다 — 등급 2 ✨ 기원 · 🔹 무기·옷 강화 · 🌟 성장, 등급 3 📜 오늘의 의뢰, 등급 5 🌀 비경(그 전엔 입구에 "🔒 모험 등급 5"). 등급이 오르면 화면 가운데 모험 등급 UP 카드(⭐·€·🔹 보상, 체력 가득, 다음에 열리는 것과 무기 강화 한도), 이어서 🔓 새로 열림 카드가 한 장씩(누르면 넘어가고 몇 초 뒤 저절로). 얻은 것은 원신처럼 왼쪽에 한 줄씩(✦ 경험치 · 💶 € · ⭐ 별조각 · 🔹 연마석). 무기 강화: 요괴(쥐 1 · 가고일 2 · 슬라임 가끔 · 우두머리 10 · 쥐왕 25)와 보물상자(1·3·5·10), 등급 보상에서 🔹 연마석 — 옷장 무기 칸 아래 "⬆ 강화"(Lv 하나에 공격력 +6%, 비용 🔹(2+Lv) · €8×Lv), 한도는 모험 등급 × 2 + 2(최대 Lv.20, 원신의 돌파처럼 등급을 올려야 더). 옷장 위에 지금 능력치(모험 등급 · 공격력 · 체력 · 치명타 · 🔹 · €).src/walk/gear.ts WEAPONS, 모양 src/walk/hero/figure.ts, 능력은 combat.ts가 읽는다): 옷장 맨 위 무기 칸에서 바꿔 든다 — 손에 쥔 모양과 싸움 능력이 바뀌고, 휴대폰 공격 단추 그림도 그 무기가 된다. ☂️ 접은 파리 우산(처음, ×1.0 · 치명타 15%) · 🥖 바게트 검(×0.9 · 맞힐 때마다 체력 2% — 상자 3개) · 🦯 멋쟁이 지팡이 검(치명타 30% · 치명타 피해 ×2 — 기원 4★) · 🛶 센 강 뱃사공의 노(×1.3 · 사거리 +0.9 m — 모험 등급 5) · 🤺 삼총사의 레이피어(×1.15 · 치명타 25% · 스킬 +40% — 비경 ★★★) · 🚩 혁명의 깃발(×1.2 · 폭발 +60% · 에너지 +30% — 기원 5★) · ⚔️ 잔 다르크의 검(×1.45 · 치명타 25% · 치명타 피해 ×2 — 쥐왕을 쓰러뜨리면 가장 먼저, 기원 5★). 공격력 = (16 + 3·모험 등급) × 무기. 바꾸면 잠깐 손에 들어 보여 준다.src/walk/hero/figure.ts, src/walk/gear.ts, src/walk/closet.ts): 눈동자·반짝임·눈썹·웃는 입·볼·귀, 앞머리, 넓은 어깨. 🎒 옷장(I)에서 모자·윗옷·가방·신발·글라이더를 하나씩 골라 입으면 겉모습과 작은 능력이 바뀐다 — 🔴 베레모 · 👒 파나마(햇볕 아래 지침 −15%) · 🥽 비행 모자(1.6배 높이까지 안 다친다) · ⚓ 선원 모자(헤엄 기력 −40%) · 💇 맨머리 / 🧥 파랑 재킷 · 트렌치(글라이더 덜 가라앉음) · 👕 마리니에르(인사하면 더 반기고 더 알려 준다) · 🖤 가죽 재킷(안 휘청) / 🎒 배낭(기력 +12%) · 📷 카메라 가방(사진 한 장 +€2) · 💼 서류가방(10% 할인) / 🥾 부츠 · 👟 운동화(달리기 +8%) · 등산화(벽타기 기력 −20%) / 글라이더 천 네 가지. 처음엔 몇 가지뿐이고, 나머지는 에펠탑 둘레 부탁(모자 찾기 → 파나마, 2층 도전 → 비행 모자, 탑 사진 → 카메라 가방, 소풍 → 마리니에르), 유람선(선원 모자), 미니 에펠탑(삼색기 천), 1 km 걷기(등산화), 5곳 발견(트렌치), 봉주르 10번(가죽 재킷), 가게 3곳(서류가방)으로 생긴다. 숨은 금빛 낙하산도 옷장에 들어간다. 입은 것은 저장된다.src/walk/town/ground.ts, grass.ts, src/walk/hero/terrain.ts): 지도 엔진의 평평한 바닥 대신 여행자 둘레 640 m를 직접 깐다 — 높낮이를 따르는 격자에 '무엇이 깔렸나' 지도(잔디·공원 자갈길·포석 차도·판석 보도·강바닥)를 입혀 셰이더가 결을 만든다. 그 바깥 4 km는 성긴 먼 땅(하늘에서 내려다보면 길·공원·강·지붕이 보인다). 파리의 언덕이 있다 — 몽마르트르(사크레쾨르 +100 m), 벨빌·메닐몽탕 고개, 뷔트쇼몽, 팡테옹 언덕, 샤요 언덕(트로카데로 +35 m, 정원이 센 강으로 내려간다), 개선문 쪽 오르막. 강가로 갈수록 낮아져 센 강은 골짜기 바닥이다. 건물·가구·랜드마크·사람이 모두 비탈 위에 앉고, 비탈 아래쪽 건물엔 돌 기단이 드러난다. 공원 잔디밭은 그 위에서 완만하게 굽이치고(길·가장자리에선 평평), 센 강은 돌 둑 2 m 아래로 흐른다(물결·햇빛 반짝임, 뛰어들면 헤엄, 둑은 손 짚고 올라온다). 잔디 위엔 풀포기가 빽빽이 자라 바람 결을 따라 물결치고 돌풍이 훑고 지나가며, 발밑 풀은 옆으로 눕는다. 흰·노랑·보라·빨강 들꽃이 드문드문, 공원에선 꽃잎이 바람에 날린다. 느린 기기에선 풀 반경을 줄이고 가장 낮은 품질에선 결만 남긴다.src/walk/eiffel.ts, src/walk/street/eiffel.ts): 샹젤리제 지구에 강 건너 7·15·16구를 붙였다 — 샹드마르스 잔디밭, 이에나·비르아켐·알마 다리, 트로카데로 정원과 샤요 궁, 케 브랑리, 클레르 거리 시장 골목과 카페들, 탑 발밑의 도는 회전목마. 탑 둘레엔 관광객이 많고, 여기서만 생기는 일이 있다:
src/walk/town/): 지도와 같은 건물 모양 위에 캔버스로 그린 파사드를 입힌다. 오스만 석조·회벽과 덧창·벽돌·파스텔 벽, 칸마다 다른 1층 가게(카페·빵집·서점·약국·대문), 띠돌림·쇠 난간 발코니·처마, 함석 망사르드 지붕과 뤼카른·굴뚝. 동네마다 분위기가 다르다(마레 회벽, 생제르맹 석조, 몽마르트르 파스텔, 벨빌 벽돌·벽화, 샹젤리제 대형 오스만). 드러난 맞벽에는 옛 광고 그림이나 벽화.src/walk/town/landmarks.ts): 에펠탑·노트르담·사크레쾨르(큰 계단)·개선문·퐁피두 센터(색색 파이프)·파리 시청·팡테옹·물랭 루주(날개가 돈다)·생자크 탑·생제르맹데프레·몽파르나스 타워·뷔트쇼몽 신전·그랑 팔레를 실제 자리에 세운다. 진짜 설계도가 아니라 멀리서도 알아보는 모양이고, 7 km 안이면 지붕 너머 스카이라인에 보인다. 부딪힘이 있어 올라갈 수 있다 — 에펠탑은 층마다 발 디딜 턱이 있어 쉬어 가며 꼭대기까지 올라가 글라이더로 내려올 수 있다. 가까이 가거나 높은 데서 보이면 발견으로 기록되고, 사진(3)을 찍으면 그 이름이 붙는다.src/walk/street/): 사람에게 F로 말을 걸면 먼저 "봉주르" 하고, 파리 이야기를 들려준다(관광객은 가끔 사진을 부탁한다 — 3으로 찍어 준다). 걷다 보면 아이의 풍선이 지붕에 걸리거나(올라가 잡아 글라이더로 돌려준다) 강아지를 잃어버린 사람을 만난다(천천히 다가가 데려간다). 벤치에선 F로 앉는다(앉아 있으면 시간이 빨리 흐른다).src/walk/sound.ts, 전부 Web Audio 합성): 원곡 세 곡이 시간대·장소에 따라 바뀐다 — 아코디언 뮈제트 왈츠(3/4), 클라리넷과 기타 펌프의 마누슈 스윙, 아침의 첼레스타. 지하철·대화 중엔 음악이 물러난다. 거리 소음(웅성임·차 소리·비둘기·새·분수, 정각의 성당 종)과 높이 올라갈수록 커지는 바람. 발소리는 돌길·지붕·타일마다 다르고 구르기·슬라이딩·뛰어넘기·셔터·동전·문·박수·개 짖음·지하철 문 경고음까지 40여 가지. 사람에게 말을 걸면 브라우저의 프랑스어 음성(Web Speech)으로 "Bonjour !"와 대사를 읽는다(사람마다 목소리 높이가 다르다). 🔊로 끈다.docs/hero-walking.md에 있다.src/walk/view.ts) — 카메라, 구름이 흐르는 하늘과 해·별, 땅, 거리, 먼 도시(town/far.ts: 세계에 읽힌 모든 건물을 256 m 덩어리마다 창 난 상자로, 3 km까지), 사람들, 여행자. 그래서 발밑에서 하늘과 탑 꼭대기를 올려다볼 수 있다. 해 그림자가 있다(src/walk/shadow.ts) — 건물·탑·가로등·나무·사람이 거리와 잔디, 다른 건물 벽에 그림자를 드리우고, 아침·저녁엔 길게, 한낮엔 짧게, 밤엔 없다. 그늘에 들어가면 여행자도 어두워진다. 지하철·버스 장면도 같은 캔버스·렌더러로 그린다(WebGL 문맥 하나). 지도 엔진(MapLibre)은 지도 보기(M)·노선도와, 건물·길 타일 주소를 주는 데만 쓴다. 장소·역 핀은 걷는 동안 three.js 화면 위에 띄우고(src/walk/pins.ts), 지도 보기에선 지도 마커로 넘긴다.