# BC-Game Up/Down System

윈도우 환경에서 작동하는 완전한 BC-Game Up/Down 시스템입니다.

## 시스템 구조

```
bc-game-updown/
├── frontend/          # React 앱 (원본 소스 기반)
├── backend/           # PHP + MySQL 백엔드
│   ├── api/          # REST API 엔드포인트
│   ├── includes/     # PHP 클래스
│   ├── websocket/    # WebSocket 서버
│   └── config/       # 설정 파일
├── public/            # 공개 디렉토리
└── sql/              # 데이터베이스 스키마
```

## 기술 스택

- **프론트엔드**: React 18.3, TypeScript, Vite, WASM
- **백엔드**: PHP 8.x, MySQL 8.0
- **실시간 통신**: Ratchet WebSocket, Binance WebSocket
- **웹 서버**: Nginx (Laragon)

## 설치 방법

### 1. 데이터베이스 설정

데이터베이스는 이미 생성되어 있습니다:
- Database: `bc_game_updown`
- User: `root`
- Password: `Qlalfqjsgh00@`

### 2. PHP Composer 설치

```bash
cd C:\laragon\www\bc-game-updown\backend
composer install
```

### 3. Node.js 의존성 설치

```bash
cd C:\laragon\www\bc-game-updown\frontend
pnpm install
```

## 실행 방법

3개의 서비스를 **각각 별도의 CMD 창**에서 실행해야 합니다:

### 터미널 1: WebSocket 서버

```bash
cd C:\laragon\www\bc-game-updown\backend\websocket
php server.php
```

**포트**: ws://localhost:8080

### 터미널 2: 게임 매니저 (자동 라운드 관리)

```bash
cd C:\laragon\www\bc-game-updown\backend\websocket
php game-manager.php
```

이 스크립트는 자동으로:
- 60초마다 새 라운드 시작
- Binance에서 BTC 가격 가져오기
- 라운드 종료 및 결과 계산

### 터미널 3: React 개발 서버

```bash
cd C:\laragon\www\bc-game-updown\frontend
pnpm dev
```

**포트**: http://localhost:4200

## API 엔드포인트

### Game API
```
GET /api/game.php
```
현재 게임 상태 조회

### Bet API
```
POST /api/bet.php
Body: { direction: 'UP'|'DOWN', amount: number, session_id: string }
```
베팅 생성

### Round API
```
GET /api/round.php?round_id=123
GET /api/round.php?current=1
```
라운드 정보 조회

### History API
```
GET /api/history.php?limit=20
GET /api/history.php?session_id=xxx
```
히스토리 조회

## WebSocket 이벤트

### 클라이언트 → 서버

```javascript
// 구독
{ type: 'subscribe', session_id: 'xxx' }

// Ping
{ type: 'ping' }

// 상태 조회
{ type: 'get_state' }
```

### 서버 → 클라이언트

```javascript
// 게임 상태 (매초)
{
  type: 'game.state',
  round_id: 123,
  status: 'BETTING',
  countdown: 30,
  start_price: 98765.43,
  total_up_amount: 1000,
  total_down_amount: 500,
  ...
}

// 베팅 알림
{
  type: 'bet.placed',
  bet: { direction: 'UP', amount: 10, ... }
}

// 라운드 결과
{
  type: 'round.result',
  result: { result: 'UP', ... }
}
```

## 게임 로직

### 60초 라운드 구조

```
0-45초:  BETTING      (베팅 가능)
45-50초: CALCULATING  (베팅 마감)
50-55초: DISTRIBUTING (결과 계산)
55-60초: PUBLISHING   (결과 공지)
```

### 배당금 계산

- **RTP**: 98% (2% 하우스 수수료)
- **승자 배당**: (총 베팅액 × 0.98) ÷ 승자 총 베팅액

예시:
- UP 베팅: 1000 USDT
- DOWN 베팅: 500 USDT
- 결과: UP 승리
- 배당 배율: (1500 × 0.98) ÷ 1000 = 1.47x

## Nginx 설정

`C:\laragon\etc\nginx\sites-enabled\bc-game-updown.conf`:

```nginx
server {
    listen 80;
    server_name bc-game-updown.local;
    root C:/laragon/www/bc-game-updown/public;
    index index.html index.php;

    # API 요청
    location /api/ {
        try_files $uri $uri/ /backend/api/$1;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME C:/laragon/www/bc-game-updown/backend$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
    }

    # React 라우팅
    location / {
        try_files $uri $uri/ /index.html;
    }

    # PHP 처리
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass 127.0.0.1:9000;
    }
}
```

## 문제 해결

### WebSocket 연결 실패

1. 방화벽 확인 (포트 8080)
2. `php websocket/server.php` 실행 확인

### 게임이 시작되지 않음

1. `php websocket/game-manager.php` 실행 확인
2. Binance API 접근 가능 확인

### 데이터베이스 연결 오류

1. MySQL 서비스 실행 확인
2. `backend/config/database.php` 설정 확인

## 프로덕션 빌드

```bash
cd frontend
pnpm build
```

빌드 결과물: `frontend/dist/apps/up-down/`

## 보안 고려사항

1. **SQL Injection 방지**: PDO Prepared Statements 사용
2. **XSS 방지**: 입력 검증 및 이스케이프
3. **CORS**: 프로덕션에서는 특정 도메인만 허용
4. **Rate Limiting**: 과도한 API 요청 제한
5. **WebSocket 인증**: 세션 기반 인증 추가 권장

## 라이선스

Private Project - BC-Game Up/Down System
