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에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗주사위 5개로 족보를 맞추는 야추(Yacht) 게임. 혼자 하기와 온라인 같이 하기(1:1, 1:1:1, 2:2)를 지원합니다.
web/. https://yahchoo.github.io 는 새 주소로 넘어감)worker/)| 칸 | 점수 |
|---|---|
| 에이스 ~ 식스 | 해당 눈의 합 |
| 초이스 | 5개의 합 |
| 포 카드 | 같은 눈 4개 이상이면 5개의 합 |
| 풀하우스 | 같은 눈 3개 + 2개면 5개의 합 (5개가 모두 같은 경우는 인정 안 함) |
| S. 스트레이트 | 이어지는 눈 4개면 15점 |
| L. 스트레이트 | 이어지는 눈 5개면 30점 |
| 야추 | 5개가 모두 같으면 50점 |
| API | 설명 |
|---|---|
POST /api/solo/start | 새 판 → 게임 상태 |
GET /api/solo/{gameId} | 하던 판 불러오기 |
POST /api/solo/roll | {gameId, held: [bool×5]} 굴리기 |
POST /api/solo/score | {gameId, category} 칸에 적기 |
POST /api/rankings | {gameId, initials} 랭킹 등록 → 이번 주·전체 순위 |
GET /api/rankings?period=week|all | 랭킹 목록 (최대 50개) |
web/js/points.js (웹과 서버가 함께 씀)web/js/avatar.js (웹과 서버가 함께 씀)| API | 설명 |
|---|---|
POST /api/auth/google | {credential} 구글 ID 토큰 → {token, me} |
POST /api/auth/logout | 로그아웃 |
GET /api/me | 내 정보 (닉네임, 포인트, 아바타, 가진 아이템) |
POST /api/me/profile | {nickname?, avatar?} |
POST /api/shop/buy | {itemId} |
POST /api/solo/claim | {gameId} 로그인하지 않고 끝낸 판의 포인트 받기 |
요청에 Authorization: Bearer <token>을 붙이면 로그인한 사용자로 처리합니다. 같이 하기는 방에 들어간 뒤 {type: 'auth', token}을 보냅니다.
?room=CODE)로 입장| API | 설명 |
|---|---|
POST /api/rooms | {mode: "1v1" | "1v1v1" | "2v2"} → {code} |
GET /api/rooms/{code}/ws?name=닉네임[&playerId=…] | 방 WebSocket. 서버 → welcome, state, error / 웹 → team, start, roll, hold, score, rematch, leave |
GET /api/health | 상태 확인 |
web/ # 정적 웹 (빌드 과정 없음)
index.html
css/style.css
js/rules.js # 족보·점수 계산 (웹과 서버가 함께 씀)
js/solo.js # 혼자 하기 (서버 굴림, 오프라인이면 기기에서)
js/account.js # 로그인·내 정보
js/avatar.js # 아바타 아이템·그림 (서버도 씀)
privacy.html # 개인정보처리방침
js/net.js # 같이 하기 서버 연결·재접속
js/app.js # 화면
js/config.js # 서버 주소 (배포 때 자동으로 채워짐)
worker/ # Cloudflare Worker
src/match.ts # 방 규칙 (순수 로직, 단위 테스트)
src/solo.ts # 혼자 하기(서버 굴림)·이니셜·주간 기준 (순수 로직)
src/auth.ts # 구글 ID 토큰 검증, 로그인 토큰
src/account.ts # 계정·포인트·상점
migrations/ # D1 테이블 (solo_games, rankings)
src/room.ts # Durable Object: 연결·저장·타이머
src/index.ts # 라우팅, CORS
test/ # vitest
CLOUDFLARE_API_TOKEN: 2번 토큰CLOUDFLARE_ACCOUNT_ID: 3번 IDmain에 푸시하거나 Actions → CI & Deploy → Run workflowyahchoo의 OAuth 클라이언트 ID(웹 애플리케이션, 승인된 JavaScript 원본 https://yahchoo.ohsangplay.com, https://yahchoo.github.io)가 .github/workflows/ci.yml에 기본값으로 들어가 있음. 다른 ID를 쓰려면 저장소 변수 GOOGLE_CLIENT_ID를 넣으면 그 값을 우선 사용배포할 때 D1 데이터베이스(yacht-dice)를 찾거나 만들고 테이블을 준비하는 것까지 자동으로 합니다. Worker 이름은 yacht-dice-api라서 다른 프로젝트와 같은 Cloudflare 계정을 써도 겹치지 않습니다. 시크릿이 없으면 서버 배포는 건너뛰고 웹은 혼자 하기만 되는 상태로 배포됩니다. 서버 주소를 직접 정하려면 저장소 변수 API_BASE_URL을 넣으세요.
웹 주소가 바뀌면(저장소 이름 변경, 커스텀 도메인) worker/wrangler.toml의 ALLOWED_ORIGINS에 새 주소를 추가해야 같이 하기가 연결됩니다.
yahchoo.ohsangplay.com → GitHub Pages. Cloudflare DNS에 CNAME yahchoo → yahchoo.github.io (프록시 끔), 저장소 Settings → Pages → Custom domain에 같은 주소worker/wrangler.toml의 ALLOWED_ORIGINS와 구글 OAuth 클라이언트의 승인된 JavaScript 원본에 새 주소를 추가해야 함cd worker && npm install
npm run dev # 로컬 D1 테이블 준비 + 서버: http://127.0.0.1:8787
npm test # 규칙·방 로직 테스트
# 로그인 테스트: worker/.dev.vars에 DEV_LOGIN=1을 넣으면 localhost에서 '개발용 로그인' 버튼이 생김
# 다른 터미널에서
cd web && python3 -m http.server 5173
# http://localhost:5173 열기 (localhost에서는 자동으로 로컬 서버에 연결)