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,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
리프트바운드(Riftbound) TCG 정보 허브 — 티어리스트 · 카드 DB · 덱 시뮬레이터 · 시세 · 커뮤니티. (riba.gg) • Framework: Next.js 14 (App Router) + TypeScript • Styling: Tailwind CSS — "Tactile Neo-Arcade" 디자인 시스템 (DESIGN.md) • BaaS: Supabase (Postgres + Auth + Storage), Row Level Security 기반查看完整 README ↗
리프트바운드(Riftbound) TCG 정보 허브 — 티어리스트 · 카드 DB · 덱 시뮬레이터 · 시세 · 커뮤니티. (riba.gg)
DESIGN.md)rift-report/
├── src/
│ ├── app/ # App Router
│ │ ├── layout.tsx # 루트 레이아웃 (폰트, Navbar, Footer)
│ │ ├── globals.css # 디자인 토큰(CSS 변수) + 컴포넌트 클래스
│ │ ├── page.tsx # ★ 메인 대시보드
│ │ ├── not-found.tsx
│ │ │
│ │ ├── reports/ # 리포트(뉴스·분석)
│ │ │ ├── page.tsx # 목록
│ │ │ └── [slug]/page.tsx # 상세
│ │ │
│ │ ├── tiers/ # 덱 티어리스트
│ │ │ ├── page.tsx # S/A/B/C 티어 보드
│ │ │ └── [slug]/page.tsx # 덱 상세 + 덱리스트
│ │ │
│ │ ├── cards/ # 카드 DB
│ │ │ ├── page.tsx # 검색 + 필터 + 그리드
│ │ │ └── [id]/page.tsx # 카드 상세 (모달은 인터셉트 라우트로 확장)
│ │ │
│ │ ├── rules/ # 룰 & 용어
│ │ │ └── page.tsx # 초보자 가이드 + 용어 검색
│ │ │
│ │ ├── community/ # 커뮤니티 게시판
│ │ │ ├── page.tsx # 카테고리 허브
│ │ │ ├── [category]/page.tsx # 자유 / 공략·팁 / 덱 분석 목록
│ │ │ ├── post/[id]/page.tsx # 게시글 + 댓글
│ │ │ └── new/page.tsx # 글쓰기 (로그인 가드)
│ │ │
│ │ ├── trading/ # 카드 거래 게시판
│ │ │ ├── page.tsx # 팝니다/삽니다/교환 목록
│ │ │ ├── [id]/page.tsx # 거래글 상세
│ │ │ └── new/page.tsx # 거래글 등록 (로그인 가드)
│ │ │
│ │ ├── tournaments/ # 대회 정보
│ │ │ ├── page.tsx # 상태별 카드 뷰
│ │ │ └── [slug]/page.tsx # 대회 상세
│ │ │
│ │ ├── login/page.tsx # 매직 링크 + OAuth
│ │ ├── auth/callback/route.ts # 세션 교환 (오픈 리다이렉트 차단)
│ │ └── me/page.tsx # 내 프로필 (로그인 가드)
│ │
│ ├── components/
│ │ ├── layout/ # navbar, footer
│ │ ├── home/ # 대시보드 섹션 (report-highlights, tier-summary, ...)
│ │ ├── auth/ # login-form, sign-out-button
│ │ └── ui/ # section-header, tier-badge, page-heading (공용 프리미티브)
│ │
│ └── lib/
│ ├── constants.ts # 네비, 카테고리, 티어 스타일, 카드 도메인/타입/레어도
│ ├── utils.ts # cn(), formatKRW()
│ ├── queries.ts # 홈 대시보드용 서버 읽기 쿼리 (server-only)
│ ├── supabase/
│ │ ├── client.ts # 브라우저 클라이언트
│ │ ├── server.ts # 서버 컴포넌트/액션 클라이언트
│ │ └── middleware.ts # 세션 쿠키 갱신
│ └── types/database.ts # 스키마 타입 (supabase gen types 로 대체 가능)
│
├── middleware.ts # updateSession 연결
├── supabase/
│ ├── schema.sql # 테이블 · 인덱스 · 트리거 · ENUM
│ ├── policies.sql # RLS 정책 + Storage 정책 가이드
│ └── seed.sql # 개발용 시드
├── tailwind.config.ts # 디자인 토큰 → Tailwind 매핑
├── .env.local.example
└── DESIGN.md # 디자인 시스템 스펙
확장 포인트
- 카드 상세 모달:
app/cards/@modal/(.)[id]/page.tsx인터셉트 라우트- 관리자:
app/(admin)/라우트 그룹 +is_staff()가드- i18n:
next-intl도입 시app/[locale]/로 이동
npm install
cp .env.local.example .env.local # Supabase 키 입력
Project Settings > API 에서 URL / anon key 복사SQL Editor 에서 순서대로 실행: supabase/schema.sql → supabase/policies.sql (→ 선택: seed.sql)Authentication > Providers 에서 Email(매직 링크) 활성화, 필요 시 Google OAuth 설정Authentication > URL Configuration 의 Redirect URLs 에 http://localhost:3000/auth/callback 추가Storage 에서 버킷 생성: avatars, trade-images, report-covers, card-images (모두 public read) — 업로드 정책은 policies.sql 하단 참고npm run dev # http://localhost:3000
npm run typecheck # 타입 점검
DB 미연결 상태에서도 홈은 빈 상태(Empty State)로 정상 렌더된다 (lib/queries.ts 의 safe() 폴백).
전체 DDL은 supabase/schema.sql, 권한은 supabase/policies.sql.
| 테이블 | 용도 | 주요 컬럼 | 쓰기 권한 (RLS) |
|---|---|---|---|
profiles | auth.users 1:1 확장 | username, avatar_url, role(user|editor|admin) | 본인만 update, 가입 시 트리거로 자동 생성 |
reports | 뉴스·분석 글 | slug, title, body, status(draft|published), tag, view_count | editor·admin |
cards | 카드 DB | code, name, domains[], type, cost, might, rarity, search_tsv | editor·admin |
decks | 티어리스트 덱 | slug, tier(S|A|B|C), tier_rank, archetype, champion_card_ids[], guide | editor·admin |
deck_cards | 덱 ↔ 카드 (수량) | (deck_id, card_id, board) PK, quantity, board(main|rune|sideboard) | editor·admin |
glossary_terms | 룰 & 용어 | term, reading, category, definition, related_terms[], search_tsv | editor·admin |
posts | 커뮤니티 게시글 | category(free|guide|deck-analysis), title, body, author_id, deck_id?, view/like/comment_count | 작성: 로그인, 수정·삭제: 본인 or staff |
comments | 댓글 (대댓글) | post_id, parent_id?, body, author_id | 작성: 로그인, 수정·삭제: 본인 |
post_likes | 좋아요 | (post_id, user_id) PK | 본인만 |
trade_listings | 카드 거래 | , , , , , , , |
auth.users ─1:1─ profiles ─1:N─ posts ─1:N─ comments
│ └─1:N─ post_likes
├─1:N─ trade_listings ─N:1─ cards
└─1:N─ reports (author)
decks ─N:M─ cards (deck_cards 조인 테이블: quantity, board)
decks.champion_card_ids[] → cards.id (대표 챔피언 아이콘, 배열 참조)
posts.deck_id (nullable) → decks.id ('덱 분석' 카테고리)
comments insert/delete → posts.comment_countpost_likes insert/delete → posts.like_countupdated_at 은 모든 갱신 대상 테이블에 set_updated_at() 트리거increment_view_count('reports'|'posts', id) RPC 로 원자적 증가tsvector 생성 컬럼 + GIN 인덱스 (to_tsvector), 부분 일치는 pg_trgm(type, cost, rarity) 복합 인덱스 + domains GINservice_role 키는 .env.local 서버 전용, 시드/관리 스크립트에서만.is_staff() (security definer) 한 곳에서.next 파라미터를 내부 절대경로로만 제한 (오픈 리다이렉트 차단).getUser() 로 1차 가드 후, 최종 방어선은 RLS.CHECK 제약으로 강제.trade-images/{uid}/... 처럼 본인 폴더 경로만 허용.category(sell|buy|trade)card_id?card_conditionprice?status(open|reserved|closed)regionimages[]seller_id| 작성: 로그인, 수정·삭제: 본인 |
tournaments | 대회 | slug, name, status(upcoming|ongoing|finished), starts_at, format, location, is_online, registration_url, prize_pool | editor·admin |