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 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
리프트바운드(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 |