1인치에서 맞붙고, 4분 동안 처치 수로 겨루는 근접 액션 게임.
Three.js + TypeScript로 실행하는 정적 브라우저 게임입니다. 혼자는 1인 + 5봇, 둘이서는 화면 분할 2인 + 4봇으로 총 6명이 싸웁니다. 계정, 게임 서버, 결제, 원격 저장, 온라인 대전은 없습니다.
npm install
npm run dev빌드/실행:
npm run check
npm run test
npm run audit:simulation
npm run build
npm run preview첫 화면의 시작은 캐릭터 선택으로, 조작 연습은 실제 입력을 익히는 연습장으로 이동합니다. 연습에서는 이동, 최대 차지 공격, 방어막, 건틀릿 기술을 순서대로 사용합니다. 방어 단계에서만 고정 표적이 손으로 예고한 뒤 실제로 공격합니다. 우클릭 또는 LT로 공격을 막아야 다음 단계로 넘어갑니다. 위치 다시 잡기로 재시도할 수 있고, 다른 단계에서는 표적이 공격하지 않습니다.
| 동작 | 1인: 키보드/마우스 | 2인: 나 | 2인: 친구 | 1인: 게임패드 |
|---|---|---|---|---|
| 이동 | WASD | WASD | 방향키 | 왼쪽 스틱 |
| 방향 | 마우스 | 마지막 이동 방향 | 마지막 이동 방향 | 오른쪽 스틱 |
| Punch | LMB 탭 / 홀드 / 놓기 | F 탭 / 홀드 / 놓기 | J 탭 / 홀드 / 놓기 | RT |
| 방어막 | RMB | G | K | LT |
| 주먹 기술 | Space | H | L | A / LB |
| 모루 선택 | 숫자 1 / 2 / 3 또는 클릭 | F / G / H | J / K / L | X / A / B |
| 메뉴 | Esc | Esc | Esc | Start |
로컬 2인은 두 사람 모두 키보드만 사용합니다. 이동 방향으로 공격하며 멈추면 마지막 방향을 유지합니다. 마우스와 게임패드는 2인 전투 입력에 관여하지 않고 마우스 조준점도 숨깁니다. 메뉴 버튼과 모루 카드는 클릭할 수도 있습니다. 1인의 키보드/마우스 및 게임패드 조작은 유지합니다. 창 포커스를 잃으면 전투를 일시정지하고 입력을 해제합니다.
- 경기 시간은 4분입니다. 한 명만 살아 있어도 끝나지 않으며, 처치할 때마다 1점을 얻습니다.
- 순위는 처치 수, 적은 사망 수, 많은 명중 수 순서로 정합니다. 모두 같으면 고정 참가 순서로 결정합니다.
- 쓰러지면 해당 화면을 어둡게 표시하고 3초 뒤 안전한 지면에서 부활합니다. 체력·기력·쿨타임은 초기화되며 장비·강화·등급·누적 점수는 유지됩니다.
- 부활 후 2초 동안 보호되며 금색 바닥 원호로 표시합니다. 공격이나 장비 기술을 쓰면 보호가 끝납니다.
- 마지막 8초 안에 타격한 상대가 있으면 낙하/외곽 피해로 쓰러져도 그 상대에게 처치가 기록됩니다. 기여자가 없으면 점수가 생기지 않습니다.
- 결과 화면과 일시정지에서 전체 순위, 처치, 사망 수를 확인할 수 있습니다.
- 경기 중에는 오른쪽에 6명 순위를 계속 표시하고, 순위나 점수가 바뀐 행을 강조합니다. 처치하면 상대 이름과
처치 +1알림이 따로 나옵니다. - 부활 위치는 상대와 최소 8m 거리를 두되 약 14m 근처를 우선해 다시 전투에 들어가기 쉽게 정합니다.
- 1 world unit = 1m,
ONE_INCH = 0.0254. 피해는 두 충돌 표면의 간격이 2.54cm 이하일 때만 발생합니다. 충돌체가 주먹 접촉 면을 포함하는 단순화된 전투 실루엣입니다. - 놓으면 최대 4.2m를 접근하는 짧은 돌진이 시작됩니다. 이는 이동이며 원거리 공격 판정이 아닙니다. 첫 접촉에서 멈추고, 벽을 관통하지 않습니다. 공중에서도 높이가 맞으면 타격합니다.
- 모든 Fist와 모든 강화 단계의 접촉 사거리와 최대 접근 거리가 같습니다. 사거리 강화는 없습니다.
- 기본 최대 차지는 0.72초입니다. 공격 속도 강화는 충전, 공격 준비, 재장전, 빗나간 뒤 회복까지 단축합니다. 충전 중 이동은 기본 속도의 80%에서 58%까지 줄어들며 최대 차지는 놓을 때까지 유지합니다.
- 최대 차지 피해는 기본의 3.1배입니다. 손 주변 압력 장치와 밝아지는 주먹으로 충전을 표시합니다.
- 방어막은 방향과 무관하게 1.15초 동안 공격과 넉백을 막고, 재사용은 4.5초입니다. 켠 채로 이동/충전/공격할 수 있지만 자기장 피해는 막지 않습니다. 성공 시 상대를 기절시키지 않습니다.
- HP 100, 기력 100. 펀치 시작 12, 충전 중 초당 16, 방어막 18, 주먹 기술 24의 기력을 사용합니다. 마지막 사용 0.45초 후 초당 26 회복합니다.
- 머리 위 체력바와 실제 HP 숫자, 하단 중앙에는 큰 체력 수치와 체력/기력 막대, 공격/막기/주먹 기술 아이콘만 표시합니다. 상세 능력치는 일시정지에서 확인합니다.
| Fist | 주먹 기술 |
|---|---|
| 기본 주먹 | 회피: 이동 방향 회피/접근 |
| 가벼운 주먹 | 은신: 2.2초 빠른 은신 이동, 공격/패링 시 해제 |
| 무거운 주먹 | 버티기: 이동 속도 70%, 넉백 감소 |
| 추격 주먹 | 접근: 조준 방향/상대에게 접근 |
| 반동 주먹 | 후퇴: 조준 반대 방향 이탈 |
차지는 주먹 기술로 취소할 수 있습니다. 방어막은 차지를 유지합니다. 풀숲 안에서 느리게 움직이거나 멈추면 은폐되지만 무적은 아닙니다.
바닥과 보급의 모루에는 등급이 없습니다. 모두 같은 외형/빛기둥/모루 이름표입니다. 실제 획득 시 등급을 추첨한 다음, 세 능력치 중 하나를 선택합니다. 선택 전에는 스펙이 오르지 않습니다. 필드와 보급의 추첨 확률도 같습니다.
| 획득 시 등급 | 확률 | 첫 피해량 선택 | 첫 공격 속도 선택 | 첫 기력 소모 감소 |
|---|---|---|---|---|
| 브론즈 | 52% | +20% | +25% | 약 16.7% |
| 실버 | 30% | +40% | +50% | 약 28.6% |
| 골드 | 15% | +60% | +75% | 약 37.5% |
| 프리즘 | 3% | +80% | +100% | 약 44.4% |
선택 중에는 전투와 경기 시간이 멈춥니다. 로컬 2인 모두 선택 대기 중이면 둘 다 골라야 재개합니다. 등급은 한 번만 정해지며 선택 화면을 다시 열어 재추첨할 수 없습니다.
피해량, 공격 속도, 기력 효율, 방어막 지속, 방어막 충전 중 서로 다른 세 항목이 나옵니다. 기존 능력치 상한을 없애 모루를 계속 얻을 수 있습니다. 카드에는 피해, 충전 시간, 기력, 방어 시간의 실제 전→후 값을 표시하며 선택 후에도 무엇이 바뀌었는지 알려줍니다. 기력 소모/재사용 시간은 항상 양수이고, 방어막 사이에는 반드시 빈틈이 남습니다. 지속 강화는 유지 시간과 전체 재사용 시간을 함께 늘리며 카드에 둘 다 표시합니다.
코어와 주먹은 장비 기술을 3단계까지 강화합니다. 이후에는 가장 덜 올린 능력을 보강합니다(동률은 피해→공격 속도→기력 효율→방어 지속→방어 충전 순서). 처치 보상이 피해 한쪽에만 쌓이지 않으면서 모든 코어를 계속 쓸 수 있습니다. 강화는 사망해도 유지되며 경기 종료 시 초기화합니다. 건틀릿의 금속 광택과 등급띠도 강화 횟수에 따라 변합니다.
- 카메라 흔들림, 반동, 자동 줌, 조준/낙하에 따른 시점 이동과 화면 전체 타격 정지를 제거했습니다. 기존 저장 설정도 이 효과를 다시 켜지 않습니다.
- 고정 높이/각도로 지면만 추적하며 짧은 이동은 2.4m 완충 구간 안에 둡니다. 죽으면 다른 캐릭터로 자동 전환하지 않으며 관전 대상은 직접 고릅니다.
- 동적 점광원을 제거하고 재질 발광과 손 주변 효과를 사용합니다. 3D는 최대 약1920×1080 픽셀, DPR1.25까지, 그림자는1024로 제한합니다. 글자와 버튼은 원래 화면 해상도로 표시합니다.
- 시작 버튼을 켜기 전에 전투 효과, 파편 풀과 로비 모델의 셰이더를 컴파일하고 작은 비표시 화면에 실제로 그려 준비합니다. 최초 로딩은 조금 더 필요하지만 첫 효과에서 준비 작업이 몰리지 않게 합니다.
- 반경 70m 지면과 고정된 52m 자기장. 밖에서는 초당 4~19 HP가 줄며 경계 통과 자체로 즉사하지 않습니다. 연습에서는 외곽 피해가 없습니다.
- 네 고지대와 계단, 낙하/착지, 낙하 중 펀치, 엄폐 풀숲, 기둥, 파괴 벽, 상자, 폭발통.
- 중앙 교전장, 네 고지대, 측면 우회로, 남쪽 창고와 엄폐 마당에 모루 9개와 초기 힐팩 5개를 배치했습니다. 계단/루팅 위치의 겹침 검사를 유지하며 길과 구역을 바닥 표식으로 구분합니다.
- 12초부터 28초마다 보급 예고, 6초 뒤 착륙. 초기 힐팩과 별도로 18초부터 22초마다 힐팩 3개가 등장합니다. 힐팩은 최대 35 HP를 회복하고 체력이 가득 차면 소비하지 않습니다.
- 봇은 초반 성장, 보급 경쟁, 회복 후 재진입, 측면 접근, 방어막 대기와 짧은 차지를 상황에 따라 선택합니다.
- 건틀릿 관리에서는 캐릭터 없이 건틀릿만 회전 표시합니다. 다섯 모델의 장치가 다르며 선택하면 기술 효과, 재사용, 기력과 지속 시간이 나옵니다. 부활 대기 중 관전 대상은 좌우 버튼으로 고릅니다.
- 로비의 실제 3D 캐릭터 세 명 중 클릭으로 선택합니다. 주먹 기술 5종과 옷/주먹 각각 색 프리셋 6종을 고릅니다. 드롭다운과 색상 피커는 없습니다. 외형 선택은 새로고침 전까지 유지됩니다.
- 주먹은 실제 오른팔 본에 붙어 걷기/차지/공격/막기/낙하를 따라 움직입니다. 옷 색상은 피부와 얼굴을 유지하며 상의에만 적용합니다.
- 로컬 MapleStory/SUIT 글꼴, 큰 게이지와 아이콘을 사용합니다. 제작 원칙과 공식 참고 자료는 게임 UI 구성과 참고 자료에 있습니다.
- Kenney CC0 캐릭터와 환경 모델을 로컬에 포함했습니다. 출처/원본 라이선스는 Asset Licenses에 있습니다.
- 바닥 압흔은 직접 그린 주먹 벡터 도형이며 최대 8개, 5초 후 사라집니다. 긴 손바닥 도장은 사용하지 않습니다.
- 타이틀은 사용자가 제공한 PNG 원본입니다. 교체 출처와 이전 생성 기록은 라이선스 문서에 포함했습니다.
- BGM은 전투에
Steel and Bone, 시작/선택/연습에Bouncy Block Party를 사용합니다. 버튼 선택/확인/돌아가기에는 짧은 효과음이 나며 기존 효과음 음량 설정을 따릅니다. 첫 클릭이나 키 입력 후 소리가 시작됩니다.
플레이 주소: ONE INCH PUNCH
.github/workflows/pages.yml에서 기본 브랜치 main의 변경을 빌드하고 Pages에 배포합니다. 작업 브랜치의 PR을 main에 병합하면 배포가 시작됩니다. 문서만 바꾸면 자동 배포하지 않습니다. 하위 경로에도 맞는 빌드:
npm run build -- --base=./dist/ 전체를 정적 호스팅합니다. 저장소는 사용자가 공개로 전환했습니다. 배포 워크플로는 npm ci와 빌드만 실행하며 요청에 따라 게임 테스트는 다시 실행하지 않습니다. GitHub Pages 자체가 게임 서버를 실행하지는 않으므로 온라인 대전에는 별도 통신/동기화 구성이 필요합니다. 현재는 혼자 플레이와 한 PC의 로컬 2인만 제공합니다.
F3은 런타임 진단 화면입니다. ?qaSpeed=8&qaBot=1&qaMuted=1은 무음 8배속 자동 플레이 점검 모드입니다. qaMuted=1은 점검 탭의 모든 소리를 끄며 일반 플레이 설정은 바꾸지 않습니다. QA 자동 봇의 결과는 사람이 직접 조작한 경기와 구분합니다.
경기 종료 후 EXPORT REPORT는 최근 20개 로컬 요약을 JSON으로 내려받습니다. 저장소가 차단되면 오류를 표시하고 해당 세션 메모리에만 유지합니다.
최신 증거와 남은 제약은 Current Status, QA Report에 기록합니다.