# 맞고(고스톱) 게임 아트 프로젝트

> 디자이너 페르소나: **서아** (27세, 5년차, 캐주얼 게임 UI/아트)
> 아트 톤: **귀여운 캐주얼 투니 (모바일풍)** — warm red / golden yellow / jade green / cream, 두꺼운 외곽선, 소프트 셀셰이딩, 글로시
> 생성 도구: **Higgsfield nano_banana_pro** (정식) · 누끼/라벨/원형 마스크/시트/모킹업은 로컬 PIL+scipy

**상태: 1차 양산 + 2k 업스케일 완료 (2026-06-08)** — 게임 엔진 연결 직전 단계.

---

## 폴더 구조

```
matgo_project/
├─ README.md                              ← 이 파일
├─ asset_index.json                       ← 전체 자산 인덱스 (236 PNG 메타)
│
├─ prompts/
│   ├─ hwatu_48_prompts.md                ← 화투 48 + 보너스
│   ├─ matgo_ui_text.md                   ← UI 비주얼 + 게임 문구
│   └─ matgo_characters.md                ← 캐릭터/아바타 (1·2차 + 후순위)
│
├─ assets/
│   ├─ cards/
│   │   ├─ hwatu_{m}-{p}_{role}_v{N}.png  ← 1k 원본 49장 (48 앞면 + 1 뒷면)
│   │   ├─ cutout/                        ← 1k 누끼 RGBA 49장
│   │   ├─ labeled/                       ← 1k 라벨 합성 최종 49장
│   │   ├─ 2k/                            ← 2k retina 버전 49장 (1792×2400)
│   │   │   ├─ hwatu_*_v2k.png            ← 2k 원본
│   │   │   ├─ cutout/                    ← 2k 누끼 RGBA 49 ★
│   │   │   └─ labeled/                   ← 2k 라벨 합성 최종 49 ★
│   │   └─ _sheet_*.png                   ← 검수 시트
│   │
│   ├─ ui/
│   │   ├─ btn_*.png · icon_*.png · gauge_*.png · panel_* · fx_* (총 36)
│   │   ├─ cutout/                        ← 누끼 RGBA 36 ★
│   │   └─ _sheet_ui_full.png
│   │
│   ├─ characters/
│   │   ├─ char_curly_boy.png · char_dealer_male.png · ... (레거시 3.png 누끼본)
│   │   └─ v2/                            ← 신규 양산본
│   │       ├─ ava_*.png · emote_*.png (1k 원본, 26)
│   │       ├─ cutout/                    ← 누끼 RGBA 26
│   │       ├─ avatars_round/             ← 400×400 원형 골드 프레임 26 ★
│   │       └─ _sheet_*.png
│   │
│   ├─ mockups/
│   │   ├─ psd_layers/                    ← 10종 모킹업 레이어 패키지 (PSD 호환)
│   │   │   ├─ lobby_v3/                  ← 25 레이어 + manifest.json + assemble.jsx
│   │   │   ├─ ingame_v5/                 ← 51 레이어 (2k 카드 전부 별개) + JSX
│   │   │   ├─ result_win/                ← 28 레이어 + JSX
│   │   │   ├─ result_lose/               ← 25 레이어 + JSX
│   │   │   ├─ mypage/                    ← 34 레이어 + JSX
│   │   │   ├─ shop/                      ← 50 레이어 (6 상품 카드 전부 별개) + JSX
│   │   │   ├─ tutorial/                  ← 24 레이어 + JSX
│   │   │   ├─ room_entry/                ← 30 레이어 (4 좌석) + JSX
│   │   │   ├─ daily_bonus/               ← 36 레이어 (7일 그리드) + JSX
│   │   │   └─ ranking/                   ← 65 레이어 (Top 3 + 7명 리스트) + JSX
│   │   ├─ mockup_lobby_v3.png            ← 로비 ★
│   │   ├─ mockup_ingame_v4.png           ← 인게임 v4 (1k 카드 + 정식 뒷면 + 원형 아바타)
│   │   ├─ mockup_ingame_v5_2k.png        ← 인게임 v5 (2k retina 카드) ★
│   │   ├─ mockup_result_win.png          ← 승리 ★
│   │   ├─ mockup_result_lose.png         ← 패배 ★
│   │   ├─ mockup_room_entry.png          ← 방 입장 (4 좌석) ★
│   │   ├─ mockup_shop.png                ← 상점 (3 탭 + 6 상품) ★
│   │   ├─ mockup_daily_bonus.png         ← 일일 출석 보상 (7일 그리드) ★
│   │   ├─ mockup_friend_invite.png       ← 친구 초대 (검색 + 7명 리스트) ★
│   │   ├─ mockup_titles.png              ← 칭호 시스템 (3x3 그리드 + 장착 표시) ★
│   │   ├─ mockup_settings.png            ← 환경설정 (토글/슬라이더/편집) ★
│   │   ├─ mockup_tutorial.png            ← 튜토리얼 (진행도 + 마스코트 + 카드 매치 데모) ★
│   │   ├─ mockup_ranking.png             ← 랭킹 (Top 3 단상 + 4~10등 리스트) ★
│   │   ├─ mockup_mypage.png              ← 마이페이지 (풀바디 + 통계 + 칭호) ★
│   │   ├─ mockup_notice.png              ← 공지사항 (NEW/중요 뱃지) ★
│   │   ├─ mockup_events.png              ← 이벤트 (배너 + 진행률 게이지 3종) ★
│   │   ├─ mockup_help.png                ← 도움말 (4 카테고리 + 인기 도움말) ★
│   │   ├─ anim_card_flip.png             ← 애니메이션 콘티: 카드 뒤집기 (380ms) ★
│   │   ├─ anim_go_impact.png             ← 애니메이션 콘티: GO 임팩트 (500ms) ★
│   │   ├─ anim_result_entrance.png       ← 애니메이션 콘티: 결과창 입장 (900ms) ★
│   │   ├─ anim_card_draw.png             ← 애니메이션 콘티: 카드 뽑기 (650ms) ★
│   │   ├─ anim_shake.png                 ← 애니메이션 콘티: 흔들기 (700ms) ★
│   │   ├─ anim_gwangbak.png              ← 애니메이션 콘티: 광박 알림 (1100ms) ★
│   │   ├─ anim_ttadak.png                ← 애니메이션 콘티: 따닥 (850ms) ★
│   │   ├─ anim_ppeok.png                 ← 애니메이션 콘티: 뻑 (1000ms) ★
│   │   ├─ anim_jjok.png                  ← 애니메이션 콘티: 쪽 (950ms) ★
│   │   ├─ anim_mongtta.png               ← 애니메이션 콘티: 멍따 (1300ms) ★
│   │   ├─ anim_jappeok.png               ← 애니메이션 콘티: 자뻑 (1000ms, 쪽 강화판) ★
│   │   ├─ anim_cheotppeok.png            ← 애니메이션 콘티: 첫뻑 (1100ms, 첫 뻑 패널티 ×2) ★
│   │   ├─ anim_3ppeok.png                ← 애니메이션 콘티: 3뻑 (1500ms, 누적 3회 → 결과 패배) ★
│   │   ├─ anim_yangtta.png               ← 애니메이션 콘티: 양따 (900ms, 광+띠 동시) ★
│   │   ├─ anim_pokuhtan.png              ← 애니메이션 콘티: 폭탄 (1100ms, 손패 3장 burst) ★
│   │   └─ anim_nagari.png                ← 애니메이션 콘티: 나가리 (1200ms, 무승부) ★
│   │
│   └─ (레거시) buttons/ gauges/ icons/ logos/ states/  ← 3.png 누끼 41
│
└─ docs/
    └─ HIGGSFIELD_MCP_SETUP.md            ← Higgsfield 연결 방법
```

★ = 게임 엔진 투입용 최종본.

---

## 자산 통계

| 종류 | 장수 | 위치 |
|---|---|---|
| 화투 카드 1k (라벨된 최종) | 49 | `cards/labeled/` |
| 화투 카드 1k (누끼) | 49 | `cards/cutout/` |
| **화투 카드 2k (라벨된 최종, retina용)** | **49** | `cards/2k/labeled/` |
| **화투 카드 2k (누끼)** | 49 | `cards/2k/cutout/` |
| UI 에셋 (누끼 RGBA) | **36** | `ui/cutout/` |
| 캐릭터 (직사각 누끼 RGBA) | 26 | `characters/v2/cutout/` |
| 원형 아바타 (좌석/프로필) | **26** | `characters/v2/avatars_round/` |
| 모킹업 화면 | 9 | `mockups/` |
| 레거시 (3.png 누끼) | 41 | `assets/` 기타 |
| **합계 (asset_index.json)** | **334** | |

전체 메타데이터: [`asset_index.json`](asset_index.json)

---

## 생성 파라미터 (재현용)

- **모델:** `nano_banana_pro` (Higgsfield)
- **해상도:** `1k`
- **종횡비:**
  - 카드: `3:4` (vertical)
  - UI 버튼 가로형: `3:2` · 원형/아이콘: `1:1` · 게이지: `21:9` · 패널: `3:4`/`4:3`
  - 캐릭터 상반신: `4:5` · 풀바디: `3:4`
- **톤 레퍼런스 (모든 카드 양산 시 medias로 첨부 필수):**
  - 1-1 (1월 광) v1, job id `3795b864-6258-4163-8c42-c5a252a66add`
  - URL: `https://d8j0ntlcm91z4.cloudfront.net/user_3EYforyKDKfklxikbHnakpeikVD/hf_20260606_145732_3795b864-6258-4163-8c42-c5a252a66add.png`
- **프롬프트 접두사 (재생성 v2 시):**
  ```
  Use the exact same card style, frame, outline thickness, color palette and lighting as the reference image. Only change the subject described below.
  ```

## 재생성 / 확장 호출 규칙
- 카드 v2: 같은 1-1 레퍼런스, 같은 model/aspect/resolution, 장당 2 credits.
- UI v2: 레퍼런스 없이 강한 프롬프트만으로 톤 잡힘 (1차 검증됨).
- 캐릭터 추가: 1차 ava_student_girl (`6122e3f6-0b95-41b0-ad4d-2044a2643704`)을 톤 레퍼런스로 사용.
- 표정 추가: 1차 emote_joy (`24100004-48e0-4ba4-9474-69864b203128`)를 마스코트 얼굴 레퍼런스로.
- 풀바디: 해당 상반신 job id를 레퍼런스로 첨부 (얼굴/복장 색 동일성 강제).

---

## 작업 원칙 (서아 메모, 영구)

- **글자 금지:** 카드/버튼 안 글자(光/열끗/띠/한글 라벨)는 AI로 절대 넣지 말 것. 한글·한자가 깨짐. **후처리로 PIL/엔진에서 합성.**
- **배경 마젠타:** 모든 생성물 배경 `flat solid magenta` 단색 → 누끼 연결성분 라벨링으로 깨끗 분리.
- **그림자 금지:** 카드/버튼 자체에 배경 그림자/글로우 금지 (누끼 가장자리 더러워짐).
- **세트 일관성:** 첫 장 확정 후 **반드시 레퍼런스 첨부** + `"use same style"` 강제. 카드 / 캐릭터 풀바디 / 표정 시트 모두 동일 룰.
- **누끼 알고리즘:** 코너 색 샘플 → 거리 < THRESH_LOW 확정 배경 → connected component labeling으로 이미지 가장자리 닿는 컴포넌트만 진짜 배경 → 3px 팽창 fringe에 alpha matting (`assets/cards/_make_cutouts.py` 참고).

---

## 진행 현황 (요약)

| 단계 | 결과 | 비용 |
|---|---|---|
| 화투 1-1 톤 확정 | ✅ v1 채택 | 2 credits |
| 화투 47장 양산 | ✅ 톤 일관성 통과 | ~94 credits |
| 11-1·12-1 v2 (붉은 해 제거) | ✅ 채택 | 4 credits |
| 카드 뒷면 (B-1) | ✅ 국화 메달리온 + 골든 학 엠블럼 | 2 credits |
| 누끼 49장 + 라벨 합성 (광/열끗/쌍피) | ✅ 로컬 | 0 |
| UI 1차 11종 (우선 세트) | ✅ | 22 credits |
| UI 2차 25종 (작은 사각/아이콘 12/게이지 4/패널 5/FX 3) | ✅ | ~90 credits |
| 캐릭터 1차 11종 (아바타 6 + 딜러 1 + 표정 4) | ✅ | ~28 credits |
| 캐릭터 2차 15종 (풀바디 6 + 신규 아바타 5 + 표정 4) | ✅ | 30 credits |
| 누끼 26 + 원형 아바타 26 | ✅ 로컬 | 0 |
| 모킹업 4종 (로비, 인게임 v1→v4, 결과 승/패) | ✅ 로컬 PIL 합성 | 0 |
| **2k 업스케일 49장** (1k와 동일 cost, 1792×2400) | ✅ retina용 별도 폴더 | ~104 credits |
| **총 누적 소진** | | **~386.5 credits** |
| **현 잔액 (2026-06-08)** | | **~136.5 credits (Plus 플랜)** |

---

## 다음에 할 일 (선택지)

1. **게임 엔진 연결** — 자산 충분, 다음은 Unity/Phaser 등에 인덱스 import.
2. **2k 업스케일** — 카드만 2k로 재생성 (장당 cost ↑). 모바일 retina용.
3. **추가 화면 시안** — 방 입장 / 친구 초대 / 상점 / 일일 보너스.
4. **캐릭터 3차** — 4계절 마스코트, 직업/취미 캐릭터, 표정 8종 추가.
5. **다국어 라벨** — 영문 키 (GO/STOP/WIN/LOSE) 시안.

---

## 빠른 시작 (게임 엔진 import 가이드)

```python
# Python 예시 — Pygame/PIL 기반 게임 코드
import json
from pathlib import Path
from PIL import Image

PROJECT = Path("matgo_project")
idx = json.loads((PROJECT / "asset_index.json").read_text(encoding="utf-8"))

# 카드 49장 → dict[월][자리] = 라벨된 RGBA Image
cards = {}
for entry in idx["sections"][0]["items"]:  # "cards" section
    if entry.get("month") is None:
        continue  # back card
    m, p = entry["month"], entry["position"]
    cards.setdefault(m, {})[p] = Image.open(PROJECT / entry["path"]).convert("RGBA")

# UI 버튼 36종
ui = {entry["name"]: Image.open(PROJECT / entry["path"]).convert("RGBA")
      for entry in idx["sections"][2]["items"]}

# 원형 아바타 26종
avatars = {entry["name"]: Image.open(PROJECT / entry["path"]).convert("RGBA")
           for entry in idx["sections"][4]["items"]}
```
