From eacc91b7dae027ba520d32db6a069b00e1e8e286 Mon Sep 17 00:00:00 2001 From: gahusb Date: Wed, 1 Apr 2026 22:43:48 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=94=84=EB=A0=88=EC=8A=A4=ED=8B=B0?= =?UTF-8?q?=EC=A7=80/=EC=97=85=EC=A0=81=20=EB=8D=B0=EC=9D=B4=ED=84=B0,=20?= =?UTF-8?q?=EC=BA=90=EB=A6=AD=ED=84=B0=20=EB=B9=84=EC=A3=BC=EC=96=BC,=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=83=89=EC=83=81=20=EC=8B=9C=EC=8A=A4?= =?UTF-8?q?=ED=85=9C=20=EC=B6=94=EA=B0=80=20(JSA-47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/data/achievements.json: 30개+ 업적 조건/보상 데이터 - src/data/prestige.json: 프레스티지 레벨별 배율 및 타이틀 테이블 - src/data/characterVisual.ts: 원소별 캐릭터 SVG 비주얼 파라미터 - src/styles/gameColors.ts: 게임 전용 색상 토큰 및 유틸 함수 Co-Authored-By: Paperclip --- src/data/achievements.json | 227 +++++++++++++ src/data/characterVisual.ts | 378 +++++++++++++++++++++ src/data/elements.json | 632 ++++++++++++++++++++++++++++++++++++ src/data/prestige.json | 47 +++ src/data/recipes.json | 40 +++ src/styles/gameColors.ts | 108 ++++++ 6 files changed, 1432 insertions(+) create mode 100644 src/data/achievements.json create mode 100644 src/data/characterVisual.ts create mode 100644 src/data/elements.json create mode 100644 src/data/prestige.json create mode 100644 src/data/recipes.json create mode 100644 src/styles/gameColors.ts diff --git a/src/data/achievements.json b/src/data/achievements.json new file mode 100644 index 0000000..3d69590 --- /dev/null +++ b/src/data/achievements.json @@ -0,0 +1,227 @@ +[ + { + "id": "ACH-01", + "name": "원소의 시작", + "description": "첫 번째 합성에 성공하세요", + "category": "beginner", + "condition": { "type": "fuse_count", "value": 1 }, + "reward": { "gold": 100 }, + "isHidden": false + }, + { + "id": "ACH-02", + "name": "불씨 수집가", + "description": "불(Fire) 원소를 50개 보유하세요", + "category": "beginner", + "condition": { "type": "element_count", "target": "fire", "value": 50 }, + "reward": { "gold": 200 }, + "isHidden": false + }, + { + "id": "ACH-03", + "name": "첫 번째 발견", + "description": "Tier 2 원소를 처음으로 합성하세요", + "category": "beginner", + "condition": { "type": "tier_unlock", "value": 2 }, + "reward": { "gold": 300, "boostType": "fusion_scroll", "boostDurationMin": 0 }, + "isHidden": false + }, + { + "id": "ACH-04", + "name": "강화의 시작", + "description": "원소를 처음으로 강화하세요", + "category": "beginner", + "condition": { "type": "enhance_count", "value": 1 }, + "reward": { "gold": 200 }, + "isHidden": false + }, + { + "id": "ACH-05", + "name": "방치 수익가", + "description": "오프라인 보상을 처음으로 수령하세요", + "category": "beginner", + "condition": { "type": "offline_claim", "value": 1 }, + "reward": { "gold": 500 }, + "isHidden": false + }, + { + "id": "ACH-06", + "name": "원소학자 지망생", + "description": "10종류의 원소를 발견하세요", + "category": "beginner", + "condition": { "type": "element_variety", "value": 10 }, + "reward": { "gold": 500 }, + "isHidden": false + }, + { + "id": "ACH-07", + "name": "황금 손길", + "description": "골드를 처음으로 1,000G 보유하세요", + "category": "beginner", + "condition": { "type": "gold_amount", "value": 1000 }, + "reward": { "gold": 0, "boostType": "gold_boost", "boostDurationMin": 60 }, + "isHidden": false + }, + { + "id": "ACH-08", + "name": "첫 강화 만렙", + "description": "원소 1개의 강화 레벨을 5로 달성하세요", + "category": "beginner", + "condition": { "type": "max_enhance_count", "value": 1 }, + "reward": { "gold": 1000 }, + "isHidden": false + }, + { + "id": "ACH-09", + "name": "Tier 3 정복자", + "description": "Tier 3 원소를 처음으로 합성하세요", + "category": "intermediate", + "condition": { "type": "tier_unlock", "value": 3 }, + "reward": { "gold": 1000, "boostType": "spawn_boost", "boostDurationMin": 30 }, + "isHidden": false + }, + { + "id": "ACH-10", + "name": "수집 마니아", + "description": "20종류의 원소를 발견하세요", + "category": "intermediate", + "condition": { "type": "element_variety", "value": 20 }, + "reward": { "gold": 2000 }, + "isHidden": false + }, + { + "id": "ACH-11", + "name": "부의 축적", + "description": "골드 10,000G를 보유하세요", + "category": "intermediate", + "condition": { "type": "gold_amount", "value": 10000 }, + "reward": { "gold": 3000 }, + "isHidden": false + }, + { + "id": "ACH-12", + "name": "연금술사", + "description": "총 합성을 100회 수행하세요", + "category": "intermediate", + "condition": { "type": "fuse_count", "value": 100 }, + "reward": { "gold": 2000, "bonusScrolls": 3 }, + "isHidden": false + }, + { + "id": "ACH-13", + "name": "강화 전문가", + "description": "5종류의 원소를 강화 레벨 5로 달성하세요", + "category": "intermediate", + "condition": { "type": "max_enhance_count", "value": 5 }, + "reward": { "gold": 3000 }, + "isHidden": false + }, + { + "id": "ACH-14", + "name": "부지런한 탐험가", + "description": "모든 원소 합산 1,000개 이상 보유하세요", + "category": "intermediate", + "condition": { "type": "total_elements", "value": 1000 }, + "reward": { "gold": 2500 }, + "isHidden": false + }, + { + "id": "ACH-15", + "name": "장인의 손", + "description": "단일 원소를 100개 보유하세요", + "category": "intermediate", + "condition": { "type": "single_element_count", "value": 100 }, + "reward": { "gold": 2000 }, + "isHidden": false + }, + { + "id": "ACH-16", + "name": "Tier 4 경험자", + "description": "Tier 4 원소를 처음으로 합성하세요", + "category": "intermediate", + "condition": { "type": "tier_unlock", "value": 4 }, + "reward": { "gold": 5000, "boostType": "gold_pack", "boostDurationMin": 0 }, + "isHidden": false + }, + { + "id": "ACH-17", + "name": "전설을 향해", + "description": "모든 Tier 3 원소 13종을 발견하세요", + "category": "intermediate", + "condition": { "type": "tier_variety", "tier": 3, "value": 13 }, + "reward": { "gold": 5000 }, + "isHidden": false + }, + { + "id": "ACH-18", + "name": "원소 마스터", + "description": "발견한 모든 원소를 강화 레벨 3 이상으로 올리세요", + "category": "intermediate", + "condition": { "type": "all_enhance_min_level", "value": 3 }, + "reward": { "gold": 8000 }, + "isHidden": false + }, + { + "id": "ACH-19", + "name": "전설의 탄생", + "description": "Tier 5 원소 '창조(Creation)'를 처음으로 획득하세요", + "category": "advanced", + "condition": { "type": "element_unlock", "target": "creation", "value": 1 }, + "reward": { "gold": 10000, "permanentGoldMultiplier": 0.05 }, + "isHidden": false + }, + { + "id": "ACH-20", + "name": "세계의 완성", + "description": "Tier 5 원소 '정령(Spirit)'을 처음으로 획득하세요", + "category": "advanced", + "condition": { "type": "element_unlock", "target": "spirit", "value": 1 }, + "reward": { "gold": 10000, "permanentSpawnMultiplier": 0.05 }, + "isHidden": false + }, + { + "id": "ACH-21", + "name": "원소의 신", + "description": "모든 42종류의 원소를 발견하세요", + "category": "advanced", + "condition": { "type": "element_variety", "value": 42 }, + "reward": { "gold": 20000, "title": "전지전능자" }, + "isHidden": false + }, + { + "id": "ACH-22", + "name": "최강 육성사", + "description": "발견한 모든 원소를 강화 레벨 5로 달성하세요", + "category": "advanced", + "condition": { "type": "all_enhance_min_level", "value": 5 }, + "reward": { "gold": 30000, "permanentGoldMultiplier": 0.10 }, + "isHidden": false + }, + { + "id": "ACH-23", + "name": "황금 제국", + "description": "골드 100,000G를 처음으로 보유하세요", + "category": "advanced", + "condition": { "type": "gold_amount", "value": 100000 }, + "reward": { "gold": 15000, "specialBackground": "golden_empire" }, + "isHidden": false + }, + { + "id": "ACH-24", + "name": "환생의 시작", + "description": "프레스티지(환생)를 1회 달성하세요", + "category": "prestige", + "condition": { "type": "prestige_count", "value": 1 }, + "reward": { "permanentGoldMultiplier": 0.10 }, + "isHidden": true + }, + { + "id": "ACH-25", + "name": "영원한 순환", + "description": "프레스티지(환생)를 5회 달성하세요", + "category": "prestige", + "condition": { "type": "prestige_count", "value": 5 }, + "reward": { "permanentSpawnMultiplier": 0.15, "title": "영원의 주인" }, + "isHidden": true + } +] diff --git a/src/data/characterVisual.ts b/src/data/characterVisual.ts new file mode 100644 index 0000000..d4d7964 --- /dev/null +++ b/src/data/characterVisual.ts @@ -0,0 +1,378 @@ +/** + * 캐릭터 비주얼 설정 + * docs/character-design-guide.md 기반으로 각 원소별 시각적 특성 정의 + */ + +export type ParticleType = + | 'flame' + | 'water' + | 'wind' + | 'earth' + | 'crystal' + | 'spark' + | 'star' + | 'smoke' + | 'rainbow' + | 'leaf'; + +export type PatternType = 'swirl' | 'wave' | 'crack' | 'spiral' | 'crystal' | 'none'; + +export type EyeStyle = 'energetic' | 'calm' | 'playful' | 'steady' | 'mysterious' | 'radiant'; + +export interface ElementVisualConfig { + particleType: ParticleType; + patternType: PatternType; + eyeStyle: EyeStyle; + glowColor: string; + particleColors: string[]; + /** body 가로/세로 비율 [rx, ry] — 기본값 [33, 31] */ + bodyShape?: [number, number]; +} + +/** 기본 비주얼 (매핑 없는 원소 폴백) */ +export const DEFAULT_VISUAL: ElementVisualConfig = { + particleType: 'star', + patternType: 'none', + eyeStyle: 'steady', + glowColor: '#AAAAAA', + particleColors: ['#AAAAAA', '#CCCCCC'], +}; + +export const CHARACTER_VISUAL: Record = { + // ───────────── Tier 1 — 기본 4원소 ───────────── + fire: { + particleType: 'flame', + patternType: 'swirl', + eyeStyle: 'energetic', + glowColor: '#FF6600', + particleColors: ['#FF4500', '#FFAA00', '#FF6600'], + bodyShape: [29, 36], + }, + water: { + particleType: 'water', + patternType: 'wave', + eyeStyle: 'calm', + glowColor: '#87CEEB', + particleColors: ['#1E90FF', '#87CEEB', '#00BFFF'], + bodyShape: [33, 31], + }, + wind: { + particleType: 'wind', + patternType: 'spiral', + eyeStyle: 'playful', + glowColor: '#FFFFFF', + particleColors: ['#FFFFFF', '#87CEEB', '#B0E2FF'], + bodyShape: [36, 28], + }, + earth: { + particleType: 'earth', + patternType: 'crack', + eyeStyle: 'steady', + glowColor: '#D2691E', + particleColors: ['#8B4513', '#D2691E', '#A0522D'], + bodyShape: [35, 30], + }, + + // ───────────── Tier 2 — 2차 원소 ───────────── + steam: { + particleType: 'smoke', + patternType: 'none', + eyeStyle: 'calm', + glowColor: '#FFFFFF', + particleColors: ['#FFFFFF', '#C0C0C0', '#E0E0E0'], + }, + firestorm: { + particleType: 'flame', + patternType: 'swirl', + eyeStyle: 'energetic', + glowColor: '#FF6347', + particleColors: ['#FF6347', '#FF4500', '#FFAA00'], + bodyShape: [32, 34], + }, + lava: { + particleType: 'flame', + patternType: 'crack', + eyeStyle: 'steady', + glowColor: '#FF6600', + particleColors: ['#FF2200', '#FF6600', '#FFAA00'], + }, + storm: { + particleType: 'wind', + patternType: 'wave', + eyeStyle: 'playful', + glowColor: '#6495ED', + particleColors: ['#4169E1', '#6495ED', '#87CEEB'], + bodyShape: [35, 30], + }, + mud: { + particleType: 'earth', + patternType: 'crack', + eyeStyle: 'steady', + glowColor: '#A0522D', + particleColors: ['#8B6914', '#A0522D', '#D2691E'], + }, + desert: { + particleType: 'earth', + patternType: 'wave', + eyeStyle: 'steady', + glowColor: '#F4A460', + particleColors: ['#DEB887', '#F4A460', '#D2B48C'], + bodyShape: [36, 29], + }, + // ── 신규 Tier 2 ── + ice: { + particleType: 'crystal', + patternType: 'crystal', + eyeStyle: 'calm', + glowColor: '#FFFFFF', + particleColors: ['#87CEEB', '#FFFFFF', '#B0E0FF'], + bodyShape: [34, 28], + }, + smoke: { + particleType: 'smoke', + patternType: 'swirl', + eyeStyle: 'calm', + glowColor: '#A9A9A9', + particleColors: ['#808080', '#A9A9A9', '#C0C0C0'], + }, + + // ───────────── Tier 3 — 희귀 원소 ───────────── + cloud: { + particleType: 'water', + patternType: 'none', + eyeStyle: 'playful', + glowColor: '#FFFFFF', + particleColors: ['#FFFFFF', '#E0E8F0', '#C8D8E8'], + bodyShape: [38, 28], + }, + fog: { + particleType: 'smoke', + patternType: 'none', + eyeStyle: 'mysterious', + glowColor: '#D3D3D3', + particleColors: ['#DCDCDC', '#C8C8C8', '#B8B8B8'], + bodyShape: [36, 29], + }, + volcano: { + particleType: 'flame', + patternType: 'crack', + eyeStyle: 'energetic', + glowColor: '#FF4500', + particleColors: ['#CC2200', '#FF4500', '#FF6600'], + bodyShape: [31, 35], + }, + rainbow: { + particleType: 'star', + patternType: 'wave', + eyeStyle: 'playful', + glowColor: '#FF69B4', + particleColors: ['#FF0000', '#FF9900', '#FFD700', '#00CC00', '#0000FF', '#8B00FF'], + bodyShape: [36, 30], + }, + obsidian: { + particleType: 'crystal', + patternType: 'crack', + eyeStyle: 'mysterious', + glowColor: '#4A4A8A', + particleColors: ['#1C1C1C', '#4A4A6A', '#2D2D4A'], + }, + ash: { + particleType: 'smoke', + patternType: 'none', + eyeStyle: 'steady', + glowColor: '#808080', + particleColors: ['#696969', '#808080', '#A0A0A0'], + }, + lightning: { + particleType: 'spark', + patternType: 'crystal', + eyeStyle: 'energetic', + glowColor: '#FFFFFF', + particleColors: ['#FFD700', '#FFFFFF', '#FFA500'], + bodyShape: [30, 35], + }, + tsunami: { + particleType: 'water', + patternType: 'wave', + eyeStyle: 'steady', + glowColor: '#00BFFF', + particleColors: ['#006994', '#008CB4', '#00BFFF'], + bodyShape: [36, 30], + }, + ceramic: { + particleType: 'earth', + patternType: 'crack', + eyeStyle: 'calm', + glowColor: '#CD853F', + particleColors: ['#D2691E', '#CD853F', '#DEB887'], + }, + dust: { + particleType: 'earth', + patternType: 'none', + eyeStyle: 'calm', + glowColor: '#C8A870', + particleColors: ['#BC8F5F', '#C8A870', '#D2B48C'], + }, + oasis: { + particleType: 'leaf', + patternType: 'wave', + eyeStyle: 'calm', + glowColor: '#32CD32', + particleColors: ['#228B22', '#32CD32', '#90EE90'], + }, + glass: { + particleType: 'crystal', + patternType: 'none', + eyeStyle: 'mysterious', + glowColor: '#AFEEEE', + particleColors: ['#E0FFFF', '#AFEEEE', '#B0E0E0'], + }, + + // ───────────── Tier 4 — 에픽 원소 ───────────── + thunderstorm: { + particleType: 'spark', + patternType: 'crystal', + eyeStyle: 'energetic', + glowColor: '#6666FF', + particleColors: ['#191970', '#4169E1', '#FFD700'], + bodyShape: [33, 33], + }, + island: { + particleType: 'leaf', + patternType: 'wave', + eyeStyle: 'calm', + glowColor: '#66CC66', + particleColors: ['#3CB371', '#228B22', '#87CEEB'], + bodyShape: [35, 32], + }, + crystal: { + particleType: 'crystal', + patternType: 'crystal', + eyeStyle: 'mysterious', + glowColor: '#DA70D6', + particleColors: ['#9400D3', '#DA70D6', '#8B00FF'], + bodyShape: [30, 36], + }, + life: { + particleType: 'star', + patternType: 'wave', + eyeStyle: 'radiant', + glowColor: '#66FF88', + particleColors: ['#00FF7F', '#7FFF00', '#32CD32'], + bodyShape: [34, 33], + }, + magnet: { + particleType: 'spark', + patternType: 'spiral', + eyeStyle: 'mysterious', + glowColor: '#DCDCDC', + particleColors: ['#A9A9A9', '#C0C0C0', '#FFD700'], + }, + aurora: { + particleType: 'rainbow', + patternType: 'wave', + eyeStyle: 'radiant', + glowColor: '#7DF9FF', + particleColors: ['#00FFAA', '#7DF9FF', '#9B59B6', '#FF69B4'], + bodyShape: [35, 33], + }, + // ── 신규 Tier 4 ── + glacier: { + particleType: 'crystal', + patternType: 'crystal', + eyeStyle: 'calm', + glowColor: '#AADDFF', + particleColors: ['#B8D8E8', '#FFFFFF', '#87CEEB'], + bodyShape: [35, 29], + }, + jungle: { + particleType: 'leaf', + patternType: 'wave', + eyeStyle: 'playful', + glowColor: '#44BB44', + particleColors: ['#1A6B1A', '#228B22', '#90EE90'], + bodyShape: [35, 32], + }, + wasteland: { + particleType: 'earth', + patternType: 'crack', + eyeStyle: 'steady', + glowColor: '#A08060', + particleColors: ['#8B7355', '#A08060', '#C2A261'], + bodyShape: [36, 29], + }, + maelstrom: { + particleType: 'wind', + patternType: 'spiral', + eyeStyle: 'energetic', + glowColor: '#4488FF', + particleColors: ['#1E3A8A', '#3B82F6', '#87CEEB'], + bodyShape: [34, 34], + }, + gemstone: { + particleType: 'crystal', + patternType: 'crystal', + eyeStyle: 'mysterious', + glowColor: '#AA66FF', + particleColors: ['#6B21A8', '#9333EA', '#C084FC'], + bodyShape: [31, 35], + }, + prism: { + particleType: 'rainbow', + patternType: 'wave', + eyeStyle: 'radiant', + glowColor: '#FF88CC', + particleColors: ['#FF0066', '#FF9900', '#00FF66', '#0066FF'], + bodyShape: [34, 32], + }, + ruins: { + particleType: 'earth', + patternType: 'crack', + eyeStyle: 'steady', + glowColor: '#B8793A', + particleColors: ['#92400E', '#B8793A', '#D4A070'], + bodyShape: [34, 30], + }, + cyclone: { + particleType: 'wind', + patternType: 'spiral', + eyeStyle: 'energetic', + glowColor: '#FFB84D', + particleColors: ['#D97706', '#F59E0B', '#FCD34D'], + bodyShape: [34, 31], + }, + deepsea: { + particleType: 'water', + patternType: 'wave', + eyeStyle: 'mysterious', + glowColor: '#4488BB', + particleColors: ['#1E3A5F', '#2E5A9F', '#4A8AC4'], + bodyShape: [34, 32], + }, + prairie: { + particleType: 'leaf', + patternType: 'wave', + eyeStyle: 'calm', + glowColor: '#AAFE44', + particleColors: ['#84CC16', '#A3E635', '#D9F99D'], + bodyShape: [36, 30], + }, + + // ───────────── Tier 5 — 전설 원소 ───────────── + creation: { + particleType: 'rainbow', + patternType: 'swirl', + eyeStyle: 'radiant', + glowColor: '#FFFFFF', + particleColors: ['#FF0000', '#FF9900', '#FFFF00', '#00FF00', '#0000FF', '#FF00FF'], + bodyShape: [35, 35], + }, + spirit: { + particleType: 'star', + patternType: 'swirl', + eyeStyle: 'radiant', + glowColor: '#FFD700', + particleColors: ['#FFD700', '#FFF0A0', '#FFFFFF'], + bodyShape: [34, 34], + }, +}; diff --git a/src/data/elements.json b/src/data/elements.json new file mode 100644 index 0000000..1cdd527 --- /dev/null +++ b/src/data/elements.json @@ -0,0 +1,632 @@ +[ + { + "id": "fire", + "name": "불", + "nameEn": "Fire", + "tier": 1, + "emoji": "🔥", + "color": "#FF4500", + "unlockCondition": "initial", + "baseSpawnSpeed": 5.0, + "idleIncomeRate": 1.0, + "evolutionMaxLevel": 5, + "rarity": "common", + "description": "모든 것의 시작, 원초의 불꽃", + "recipes": ["R-01", "R-02", "R-03", "R-28"] + }, + { + "id": "water", + "name": "물", + "nameEn": "Water", + "tier": 1, + "emoji": "💧", + "color": "#1E90FF", + "unlockCondition": "initial", + "baseSpawnSpeed": 5.0, + "idleIncomeRate": 1.0, + "evolutionMaxLevel": 5, + "rarity": "common", + "description": "생명의 근원, 흐르는 물", + "recipes": ["R-01", "R-04", "R-05", "R-27"] + }, + { + "id": "wind", + "name": "바람", + "nameEn": "Wind", + "tier": 1, + "emoji": "🌪️", + "color": "#87CEEB", + "unlockCondition": "initial", + "baseSpawnSpeed": 5.0, + "idleIncomeRate": 1.0, + "evolutionMaxLevel": 5, + "rarity": "common", + "description": "자유로운 영혼, 쉬지 않는 바람", + "recipes": ["R-02", "R-04", "R-06"] + }, + { + "id": "earth", + "name": "흙", + "nameEn": "Earth", + "tier": 1, + "emoji": "🌱", + "color": "#8B4513", + "unlockCondition": "initial", + "baseSpawnSpeed": 5.0, + "idleIncomeRate": 1.0, + "evolutionMaxLevel": 5, + "rarity": "common", + "description": "모든 것을 품는 대지", + "recipes": ["R-03", "R-05", "R-06"] + }, + { + "id": "steam", + "name": "수증기", + "nameEn": "Steam", + "tier": 2, + "emoji": "💨", + "color": "#C0C0C0", + "unlockCondition": "recipe:fire+water", + "baseSpawnSpeed": 3.0, + "idleIncomeRate": 2.0, + "evolutionMaxLevel": 5, + "rarity": "uncommon", + "description": "불과 물이 만나 생긴 뜨거운 증기", + "recipes": ["R-07", "R-08"] + }, + { + "id": "firestorm", + "name": "불폭풍", + "nameEn": "Firestorm", + "tier": 2, + "emoji": "🌪️", + "color": "#FF6347", + "unlockCondition": "recipe:fire+wind", + "baseSpawnSpeed": 3.0, + "idleIncomeRate": 2.0, + "evolutionMaxLevel": 5, + "rarity": "uncommon", + "description": "불꽃과 바람이 뒤엉킨 거대한 화염", + "recipes": ["R-09", "R-10"] + }, + { + "id": "lava", + "name": "용암", + "nameEn": "Lava", + "tier": 2, + "emoji": "🌋", + "color": "#FF2200", + "unlockCondition": "recipe:fire+earth", + "baseSpawnSpeed": 3.0, + "idleIncomeRate": 2.0, + "evolutionMaxLevel": 5, + "rarity": "uncommon", + "description": "땅을 녹여 흐르는 불의 강", + "recipes": ["R-11", "R-12"] + }, + { + "id": "storm", + "name": "폭풍", + "nameEn": "Storm", + "tier": 2, + "emoji": "⛈️", + "color": "#4169E1", + "unlockCondition": "recipe:water+wind", + "baseSpawnSpeed": 3.0, + "idleIncomeRate": 2.0, + "evolutionMaxLevel": 5, + "rarity": "uncommon", + "description": "물과 바람이 격렬히 부딪히는 폭풍", + "recipes": ["R-13", "R-14", "R-36"] + }, + { + "id": "mud", + "name": "진흙", + "nameEn": "Mud", + "tier": 2, + "emoji": "🟫", + "color": "#8B6914", + "unlockCondition": "recipe:water+earth", + "baseSpawnSpeed": 3.0, + "idleIncomeRate": 2.0, + "evolutionMaxLevel": 5, + "rarity": "uncommon", + "description": "물이 땅에 스며들어 만들어진 진흙", + "recipes": ["R-15", "R-16"] + }, + { + "id": "desert", + "name": "사막", + "nameEn": "Desert", + "tier": 2, + "emoji": "🏜️", + "color": "#DEB887", + "unlockCondition": "recipe:wind+earth", + "baseSpawnSpeed": 3.0, + "idleIncomeRate": 2.0, + "evolutionMaxLevel": 5, + "rarity": "uncommon", + "description": "바람이 만들어낸 끝없는 모래밭", + "recipes": ["R-17", "R-18"] + }, + { + "id": "ice", + "name": "얼음", + "nameEn": "Ice", + "tier": 2, + "emoji": "❄️", + "color": "#87CEEB", + "unlockCondition": "recipe:water+water", + "baseSpawnSpeed": 3.0, + "idleIncomeRate": 2.0, + "evolutionMaxLevel": 5, + "rarity": "uncommon", + "description": "물이 극한의 냉기로 굳어진 순수한 결정", + "recipes": [] + }, + { + "id": "smoke", + "name": "연기", + "nameEn": "Smoke", + "tier": 2, + "emoji": "🌫️", + "color": "#808080", + "unlockCondition": "recipe:fire+fire", + "baseSpawnSpeed": 3.0, + "idleIncomeRate": 2.0, + "evolutionMaxLevel": 5, + "rarity": "uncommon", + "description": "불꽃이 응집되어 피어오르는 짙은 연기", + "recipes": [] + }, + { + "id": "cloud", + "name": "구름", + "nameEn": "Cloud", + "tier": 3, + "emoji": "☁️", + "color": "#F0F8FF", + "unlockCondition": "recipe:steam+wind", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "하늘 높이 떠오른 물의 결정체", + "recipes": ["R-19", "R-24", "R-29"] + }, + { + "id": "fog", + "name": "안개", + "nameEn": "Fog", + "tier": 3, + "emoji": "🌫️", + "color": "#DCDCDC", + "unlockCondition": "recipe:steam+earth", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "땅을 가득 덮은 신비로운 안개", + "recipes": ["R-29", "R-30"] + }, + { + "id": "volcano", + "name": "화산", + "nameEn": "Volcano", + "tier": 3, + "emoji": "🌋", + "color": "#CC2200", + "unlockCondition": "recipe:firestorm+earth", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "대지를 가르며 솟구치는 화염의 산", + "recipes": ["R-20", "R-35"] + }, + { + "id": "rainbow", + "name": "무지개", + "nameEn": "Rainbow", + "tier": 3, + "emoji": "🌈", + "color": "#FF69B4", + "unlockCondition": "recipe:firestorm+water", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "불과 물이 빛을 만나 피어난 색의 다리", + "recipes": ["R-24", "R-34"] + }, + { + "id": "obsidian", + "name": "흑요석", + "nameEn": "Obsidian", + "tier": 3, + "emoji": "⬛", + "color": "#1C1C1C", + "unlockCondition": "recipe:lava+water", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "용암이 냉각되어 만들어진 검은 유리", + "recipes": ["R-21", "R-33", "R-37"] + }, + { + "id": "ash", + "name": "화산재", + "nameEn": "Ash", + "tier": 3, + "emoji": "💀", + "color": "#696969", + "unlockCondition": "recipe:lava+wind", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "모든 것을 태운 뒤 남은 재", + "recipes": ["R-31"] + }, + { + "id": "lightning", + "name": "번개", + "nameEn": "Lightning", + "tier": 3, + "emoji": "⚡", + "color": "#FFD700", + "unlockCondition": "recipe:storm+earth", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "하늘과 땅을 잇는 강렬한 전류", + "recipes": ["R-19", "R-23", "R-32"] + }, + { + "id": "tsunami", + "name": "쓰나미", + "nameEn": "Tsunami", + "tier": 3, + "emoji": "🌊", + "color": "#006994", + "unlockCondition": "recipe:storm+water", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "거대한 물의 장벽", + "recipes": ["R-32", "R-37"] + }, + { + "id": "ceramic", + "name": "도자기", + "nameEn": "Ceramic", + "tier": 3, + "emoji": "🏺", + "color": "#D2691E", + "unlockCondition": "recipe:mud+earth", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "흙을 불로 구워낸 인류의 예술", + "recipes": ["R-35", "R-38"] + }, + { + "id": "dust", + "name": "먼지", + "nameEn": "Dust", + "tier": 3, + "emoji": "💫", + "color": "#BC8F5F", + "unlockCondition": "recipe:mud+wind", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "바람에 날리는 미세한 흙의 조각", + "recipes": ["R-31", "R-36"] + }, + { + "id": "oasis", + "name": "오아시스", + "nameEn": "Oasis", + "tier": 3, + "emoji": "🌴", + "color": "#228B22", + "unlockCondition": "recipe:desert+water", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "사막 한가운데 피어난 생명의 샘", + "recipes": ["R-22", "R-30", "R-38"] + }, + { + "id": "glass", + "name": "유리", + "nameEn": "Glass", + "tier": 3, + "emoji": "🔮", + "color": "#E0FFFF", + "unlockCondition": "recipe:desert+earth", + "baseSpawnSpeed": 2.0, + "idleIncomeRate": 5.0, + "evolutionMaxLevel": 5, + "rarity": "rare", + "description": "모래가 열에 녹아 만들어진 투명한 물질", + "recipes": ["R-33", "R-34"] + }, + { + "id": "thunderstorm", + "name": "뇌우", + "nameEn": "Thunderstorm", + "tier": 4, + "emoji": "🌩️", + "color": "#191970", + "unlockCondition": "recipe:cloud+lightning", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "하늘을 뒤흔드는 폭풍과 번개의 교향곡", + "recipes": ["R-25"] + }, + { + "id": "island", + "name": "섬", + "nameEn": "Island", + "tier": 4, + "emoji": "🏝️", + "color": "#3CB371", + "unlockCondition": "recipe:volcano+water", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "바다 위에 솟아오른 새로운 대지", + "recipes": [] + }, + { + "id": "crystal", + "name": "수정", + "nameEn": "Crystal", + "tier": 4, + "emoji": "💎", + "color": "#9400D3", + "unlockCondition": "recipe:obsidian+water", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "수백만 년의 시간이 빚어낸 순수한 결정", + "recipes": ["R-26"] + }, + { + "id": "life", + "name": "생명", + "nameEn": "Life", + "tier": 4, + "emoji": "🌿", + "color": "#00FF7F", + "unlockCondition": "recipe:oasis+wind", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "물, 바람, 대지가 만들어낸 생명의 탄생", + "recipes": ["R-25", "R-26"] + }, + { + "id": "magnet", + "name": "자석", + "nameEn": "Magnet", + "tier": 4, + "emoji": "🧲", + "color": "#A9A9A9", + "unlockCondition": "recipe:lightning+earth", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "번개가 대지에 새긴 자기력의 흔적", + "recipes": [] + }, + { + "id": "aurora", + "name": "오로라", + "nameEn": "Aurora", + "tier": 4, + "emoji": "🌌", + "color": "#7DF9FF", + "unlockCondition": "recipe:rainbow+cloud", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "하늘을 물들이는 신비로운 빛의 커튼", + "recipes": [] + }, + { + "id": "glacier", + "name": "빙하", + "nameEn": "Glacier", + "tier": 4, + "emoji": "🏔️", + "color": "#B8D8E8", + "unlockCondition": "recipe:cloud+fog", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "구름과 안개가 수천 년에 걸쳐 쌓인 거대한 얼음 산", + "recipes": [] + }, + { + "id": "jungle", + "name": "정글", + "nameEn": "Jungle", + "tier": 4, + "emoji": "🌴", + "color": "#1A6B1A", + "unlockCondition": "recipe:fog+oasis", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "안개 속에 숨겨진 울창한 생명의 숲", + "recipes": [] + }, + { + "id": "wasteland", + "name": "황무지", + "nameEn": "Wasteland", + "tier": 4, + "emoji": "🏜️", + "color": "#8B7355", + "unlockCondition": "recipe:ash+dust", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "재와 먼지만 남은 황폐한 대지", + "recipes": [] + }, + { + "id": "maelstrom", + "name": "대소용돌이", + "nameEn": "Maelstrom", + "tier": 4, + "emoji": "🌀", + "color": "#1E3A8A", + "unlockCondition": "recipe:lightning+tsunami", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "번개와 해일이 만들어낸 거대한 소용돌이", + "recipes": [] + }, + { + "id": "gemstone", + "name": "원석", + "nameEn": "Gemstone", + "tier": 4, + "emoji": "💠", + "color": "#6B21A8", + "unlockCondition": "recipe:obsidian+glass", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "흑요석과 유리가 융합된 영롱한 보석 원석", + "recipes": [] + }, + { + "id": "prism", + "name": "프리즘", + "nameEn": "Prism", + "tier": 4, + "emoji": "🔮", + "color": "#EC4899", + "unlockCondition": "recipe:rainbow+glass", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "무지개빛을 굴절·분산시키는 마법의 수정체", + "recipes": [] + }, + { + "id": "ruins", + "name": "고대 유적", + "nameEn": "Ruins", + "tier": 4, + "emoji": "🏛️", + "color": "#92400E", + "unlockCondition": "recipe:volcano+ceramic", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "화산재 속에 묻혀 있던 잃어버린 문명의 흔적", + "recipes": [] + }, + { + "id": "cyclone", + "name": "사이클론", + "nameEn": "Cyclone", + "tier": 4, + "emoji": "🌪️", + "color": "#D97706", + "unlockCondition": "recipe:dust+storm", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "먼지와 폭풍이 뒤엉킨 거대한 모래바람", + "recipes": [] + }, + { + "id": "deepsea", + "name": "심해", + "nameEn": "Deep Sea", + "tier": 4, + "emoji": "🌊", + "color": "#1E3A5F", + "unlockCondition": "recipe:tsunami+obsidian", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "쓰나미가 흑요석 해저를 뒤덮어 탄생한 어둠의 심연", + "recipes": [] + }, + { + "id": "prairie", + "name": "초원", + "nameEn": "Prairie", + "tier": 4, + "emoji": "🌾", + "color": "#84CC16", + "unlockCondition": "recipe:oasis+ceramic", + "baseSpawnSpeed": 1.5, + "idleIncomeRate": 15.0, + "evolutionMaxLevel": 5, + "rarity": "epic", + "description": "오아시스의 물기와 도자기 대지가 빚어낸 넓은 초원", + "recipes": [] + }, + { + "id": "creation", + "name": "창조", + "nameEn": "Creation", + "tier": 5, + "emoji": "✨", + "color": "#FFFFFF", + "unlockCondition": "recipe:thunderstorm+life", + "baseSpawnSpeed": 1.0, + "idleIncomeRate": 50.0, + "evolutionMaxLevel": 5, + "rarity": "legendary", + "description": "모든 원소의 조화, 세계의 창조", + "recipes": [] + }, + { + "id": "spirit", + "name": "정령", + "nameEn": "Spirit", + "tier": 5, + "emoji": "👻", + "color": "#FFD700", + "unlockCondition": "recipe:crystal+life", + "baseSpawnSpeed": 1.0, + "idleIncomeRate": 50.0, + "evolutionMaxLevel": 5, + "rarity": "legendary", + "description": "물질을 초월한 순수한 에너지의 정수", + "recipes": [] + } +] diff --git a/src/data/prestige.json b/src/data/prestige.json new file mode 100644 index 0000000..b2025f7 --- /dev/null +++ b/src/data/prestige.json @@ -0,0 +1,47 @@ +[ + { + "count": 1, + "goldMultiplier": 1.5, + "spawnMultiplier": 1.2, + "starterGold": 1000, + "title": "불꽃의 탐험자", + "titleEmoji": "🔴", + "titleColor": "#FF4500" + }, + { + "count": 2, + "goldMultiplier": 2.0, + "spawnMultiplier": 1.4, + "starterGold": 2000, + "title": "물의 현자", + "titleEmoji": "🌊", + "titleColor": "#1E90FF" + }, + { + "count": 3, + "goldMultiplier": 2.8, + "spawnMultiplier": 1.6, + "starterGold": 4000, + "title": "바람의 정령", + "titleEmoji": "🌪️", + "titleColor": "#87CEEB" + }, + { + "count": 4, + "goldMultiplier": 3.5, + "spawnMultiplier": 1.8, + "starterGold": 7000, + "title": "대지의 수호자", + "titleEmoji": "⛰️", + "titleColor": "#8B4513" + }, + { + "count": 5, + "goldMultiplier": 4.5, + "spawnMultiplier": 2.0, + "starterGold": 12000, + "title": "창조의 신", + "titleEmoji": "✨", + "titleColor": "#FFD700" + } +] diff --git a/src/data/recipes.json b/src/data/recipes.json new file mode 100644 index 0000000..00050fc --- /dev/null +++ b/src/data/recipes.json @@ -0,0 +1,40 @@ +[ + { "id": "R-01", "ingredients": ["fire", "water"], "result": "steam", "tier": 2 }, + { "id": "R-02", "ingredients": ["fire", "wind"], "result": "firestorm", "tier": 2 }, + { "id": "R-03", "ingredients": ["fire", "earth"], "result": "lava", "tier": 2 }, + { "id": "R-04", "ingredients": ["water", "wind"], "result": "storm", "tier": 2 }, + { "id": "R-05", "ingredients": ["water", "earth"], "result": "mud", "tier": 2 }, + { "id": "R-06", "ingredients": ["wind", "earth"], "result": "desert", "tier": 2 }, + { "id": "R-07", "ingredients": ["steam", "wind"], "result": "cloud", "tier": 3 }, + { "id": "R-08", "ingredients": ["steam", "earth"], "result": "fog", "tier": 3 }, + { "id": "R-09", "ingredients": ["firestorm", "earth"], "result": "volcano", "tier": 3 }, + { "id": "R-10", "ingredients": ["firestorm", "water"], "result": "rainbow", "tier": 3 }, + { "id": "R-11", "ingredients": ["lava", "water"], "result": "obsidian", "tier": 3 }, + { "id": "R-12", "ingredients": ["lava", "wind"], "result": "ash", "tier": 3 }, + { "id": "R-13", "ingredients": ["storm", "earth"], "result": "lightning", "tier": 3 }, + { "id": "R-14", "ingredients": ["storm", "water"], "result": "tsunami", "tier": 3 }, + { "id": "R-15", "ingredients": ["mud", "earth"], "result": "ceramic", "tier": 3 }, + { "id": "R-16", "ingredients": ["mud", "wind"], "result": "dust", "tier": 3 }, + { "id": "R-17", "ingredients": ["desert", "water"], "result": "oasis", "tier": 3 }, + { "id": "R-18", "ingredients": ["desert", "earth"], "result": "glass", "tier": 3 }, + { "id": "R-19", "ingredients": ["cloud", "lightning"], "result": "thunderstorm", "tier": 4 }, + { "id": "R-20", "ingredients": ["volcano", "water"], "result": "island", "tier": 4 }, + { "id": "R-21", "ingredients": ["obsidian", "water"], "result": "crystal", "tier": 4 }, + { "id": "R-22", "ingredients": ["oasis", "wind"], "result": "life", "tier": 4 }, + { "id": "R-23", "ingredients": ["lightning", "earth"], "result": "magnet", "tier": 4 }, + { "id": "R-24", "ingredients": ["rainbow", "cloud"], "result": "aurora", "tier": 4 }, + { "id": "R-25", "ingredients": ["thunderstorm", "life"],"result": "creation", "tier": 5 }, + { "id": "R-26", "ingredients": ["crystal", "life"], "result": "spirit", "tier": 5 }, + { "id": "R-27", "ingredients": ["water", "water"], "result": "ice", "tier": 2 }, + { "id": "R-28", "ingredients": ["fire", "fire"], "result": "smoke", "tier": 2 }, + { "id": "R-29", "ingredients": ["cloud", "fog"], "result": "glacier", "tier": 4 }, + { "id": "R-30", "ingredients": ["fog", "oasis"], "result": "jungle", "tier": 4 }, + { "id": "R-31", "ingredients": ["ash", "dust"], "result": "wasteland", "tier": 4 }, + { "id": "R-32", "ingredients": ["lightning", "tsunami"],"result": "maelstrom", "tier": 4 }, + { "id": "R-33", "ingredients": ["obsidian", "glass"], "result": "gemstone", "tier": 4 }, + { "id": "R-34", "ingredients": ["rainbow", "glass"], "result": "prism", "tier": 4 }, + { "id": "R-35", "ingredients": ["volcano", "ceramic"], "result": "ruins", "tier": 4 }, + { "id": "R-36", "ingredients": ["dust", "storm"], "result": "cyclone", "tier": 4 }, + { "id": "R-37", "ingredients": ["tsunami", "obsidian"], "result": "deepsea", "tier": 4 }, + { "id": "R-38", "ingredients": ["oasis", "ceramic"], "result": "prairie", "tier": 4 } +] diff --git a/src/styles/gameColors.ts b/src/styles/gameColors.ts new file mode 100644 index 0000000..c7ecb19 --- /dev/null +++ b/src/styles/gameColors.ts @@ -0,0 +1,108 @@ +import { adaptive } from '@toss/tds-colors'; + +/** + * Archetype-FirstSpark 게임 전용 색상 시스템 + * @see docs/color-system.md + */ +export const gameColors = { + // ── 재화 ────────────────────────────────────────────── + goldPrimary: '#FFD700', + goldSecondary: '#FFAA00', + goldBg: '#FFF8E1', + goldText: '#5A3200', + + // ── 등급 ────────────────────────────────────────────── + rarityCommon: '#9E9E9E', + rarityUncommon: '#4CAF50', + rarityRare: '#2196F3', + rarityEpic: '#9C27B0', + rarityLegendary: '#FF9800', + + // ── 이벤트 ──────────────────────────────────────────── + fusionPrimary: '#7C4DFF', + fusionGlow: '#B388FF', + enhancePrimary: '#3182F6', + enhanceGlow: '#90CAF9', + + // ── 원소별 주요 색 ───────────────────────────────────── + elements: { + fire: '#FF4500', + water: '#1E90FF', + wind: '#87CEEB', + earth: '#8B4513', + steam: '#C0C0C0', + firestorm: '#FF6347', + lava: '#FF2200', + storm: '#4169E1', + mud: '#8B6914', + desert: '#DEB887', + cloud: '#87CEEB', + fog: '#DCDCDC', + volcano: '#CC2200', + rainbow: '#FF69B4', + obsidian: '#1C1C1C', + ash: '#696969', + lightning: '#FFD700', + tsunami: '#006994', + ceramic: '#D2691E', + dust: '#BC8F5F', + oasis: '#228B22', + glass: '#E0FFFF', + thunderstorm: '#191970', + island: '#3CB371', + crystal: '#9400D3', + life: '#00FF7F', + magnet: '#A9A9A9', + aurora: '#7DF9FF', + creation: '#FFFFFF', + spirit: '#FFD700', + }, + + // ── TDS Adaptive 색 ────────────────────────────────── + bg: adaptive.background, + greyBg: adaptive.greyBackground, + grey200: adaptive.grey200, + grey300: adaptive.grey300, + grey400: adaptive.grey400, + grey500: adaptive.grey500, + grey700: adaptive.grey700, + grey900: adaptive.grey900, + blue500: adaptive.blue500, +} as const; + +/** 등급 → 색상 매핑 */ +export function rarityColor(rarity: string): string { + const map: Record = { + common: gameColors.rarityCommon, + uncommon: gameColors.rarityUncommon, + rare: gameColors.rarityRare, + epic: gameColors.rarityEpic, + legendary: gameColors.rarityLegendary, + }; + return map[rarity] ?? gameColors.rarityCommon; +} + +/** 등급 → 그라디언트 배경 */ +export function rarityGradient(rarity: string): string { + const map: Record = { + common: 'linear-gradient(135deg, #616161, #9E9E9E)', + uncommon: 'linear-gradient(135deg, #2E7D32, #4CAF50)', + rare: 'linear-gradient(135deg, #1565C0, #2196F3)', + epic: 'linear-gradient(135deg, #7B1FA2, #9C27B0)', + legendary: 'linear-gradient(135deg, #FF6F00, #FFD700)', + }; + return map[rarity] ?? map.common; +} + +/** 원소 ID → 주요 색상 */ +export function elementColor(id: string): string { + return gameColors.elements[id as keyof typeof gameColors.elements] ?? '#888888'; +} + +/** 발견률(0~1) → 진행 바 그라디언트 */ +export function discoveryGradient(ratio: number): string { + if (ratio >= 1.0) return 'linear-gradient(90deg, #FF6F00, #FF69B4, #7C4DFF, #1E90FF, #4CAF50)'; + if (ratio >= 0.67) return 'linear-gradient(90deg, #7B1FA2, #9C27B0)'; + if (ratio >= 0.34) return 'linear-gradient(90deg, #1565C0, #3182F6)'; + return 'linear-gradient(90deg, #424242, #757575)'; +}