- 121KB 단일 문서를 22개 태스크 문서로 분리 - 메인 인덱스 문서 (game-system-overhaul-index.md) 생성 - Phase 1-10 태스크 문서 10개 분리 - 추가 시스템 태스크 문서 10개 분리 - 재미 요소 설계 문서 1개 분리 - 기존 문서는 archive/ 폴더로 이동
10 KiB
10 KiB
아이템 확장: 세트/강화/인벤토리/물약
1. 세트 아이템
1.1 세트 아이템 구조
class ItemSet {
final String id;
final String name;
final List<String> itemIds; // 세트 구성 아이템
final Map<int, SetBonus> bonuses; // 착용 개수별 보너스
}
class SetBonus {
final int requiredCount; // 필요 착용 개수
final String description; // "2세트: 공격력 +10%"
final Map<StatType, double> statBonuses;
final PassiveEffect? passiveEffect;
}
1.2 세트 목록 예시
| 세트명 | 부위 | 2세트 | 4세트 | 6세트 |
|---|---|---|---|---|
| 디버거의 유산 | 무기, 방어구, 투구, 장갑, 부츠, 반지 | 공격력 +10% | 크리티컬 +15% | 스킬 데미지 +25% |
| 널 가드 | 방패, 방어구, 투구, 장갑, 부츠, 목걸이 | 방어력 +15% | 블록률 +10% | 피해 반사 10% |
| 컴파일러의 지혜 | 지팡이, 로브, 모자, 장갑, 부츠, 반지 | MP +20% | 마법 데미지 +15% | 스킬 쿨타임 -20% |
| 가비지 컬렉터 | 무기, 중갑, 투구, 장갑, 부츠, 벨트 | HP +20% | 전투 후 HP 5% 회복 | 사망 시 50% 확률로 생존 |
1.3 세트 UI
┌─ 장착 장비 ─────────────────────────┐
│ │
│ 디버거의 유산 [4/6] ✨ │
│ ├─ 디버거의 검 ☑ │
│ ├─ 디버거의 갑옷 ☑ │
│ ├─ 디버거의 투구 ☑ │
│ ├─ 디버거의 장갑 ☑ │
│ ├─ 디버거의 부츠 ☐ │
│ └─ 디버거의 반지 ☐ │
│ │
│ 세트 효과: │
│ ✓ 2세트: 공격력 +10% │
│ ✓ 4세트: 크리티컬 +15% │
│ ○ 6세트: 스킬 데미지 +25% │
│ │
└─────────────────────────────────────┘
2. 강화/합성 시스템
2.1 아이템 강화
class EnhancementSystem {
/// 강화 시도
EnhanceResult enhance(Equipment item, int gold) {
final successRate = getSuccessRate(item.enhanceLevel);
final success = random() < successRate;
if (success) {
return EnhanceResult.success(
item.copyWith(enhanceLevel: item.enhanceLevel + 1),
);
} else {
// 실패 시 강화 레벨 유지 (파괴 없음)
return EnhanceResult.failure();
}
}
}
2.2 강화 단계
| 강화 레벨 | 성공률 | 비용 배율 | 스탯 증가 |
|---|---|---|---|
| +1 | 90% | 1x | +5% |
| +2 | 80% | 2x | +10% |
| +3 | 70% | 3x | +15% |
| +4 | 60% | 4x | +20% |
| +5 | 50% | 5x | +30% |
| +6 | 40% | 7x | +40% |
| +7 | 30% | 10x | +50% |
| +8 | 20% | 15x | +65% |
| +9 | 10% | 20x | +80% |
| +10 | 5% | 30x | +100% |
2.3 아이템 합성
class SynthesisSystem {
/// 동일 아이템 3개 → 상위 희귀도 1개
Equipment? synthesize(List<Equipment> items) {
if (items.length != 3) return null;
if (!_isSameItem(items)) return null;
final baseItem = items.first;
final nextRarity = _getNextRarity(baseItem.rarity);
if (nextRarity == null) return null; // 이미 최고 희귀도
return baseItem.copyWith(rarity: nextRarity);
}
}
2.4 합성 규칙
Common x3 → Uncommon x1
Uncommon x3 → Rare x1
Rare x3 → Epic x1
Epic x3 → Legendary x1
Legendary → 합성 불가
2.5 강화/합성 UI
┌─ 대장간 ────────────────────────────┐
│ │
│ [강화] [합성] │
│ │
│ ┌───────────────────────────────┐ │
│ │ 디버거의 검 +3 │ │
│ │ 공격력: 45 (+15%) │ │
│ │ 희귀도: Rare │ │
│ └───────────────────────────────┘ │
│ │
│ 강화 정보: │
│ 현재: +3 → +4 │
│ 성공률: 60% │
│ 비용: 2,000 골드 │
│ 스탯 증가: +15% → +20% │
│ │
│ [ 강화하기 ] │
│ │
└─────────────────────────────────────┘
3. 인벤토리 관리
3.1 인벤토리 구조
class Inventory {
final int maxSlots; // 최대 슬롯 수
final List<InventoryItem> items;
int get usedSlots => items.length;
int get freeSlots => maxSlots - usedSlots;
bool get isFull => freeSlots <= 0;
}
3.2 인벤토리 크기
| 레벨 | 기본 슬롯 | 확장 가능 |
|---|---|---|
| 1-20 | 30 | +10 (골드) |
| 21-50 | 40 | +15 (골드) |
| 51-80 | 55 | +20 (골드) |
| 81-100 | 75 | +25 (골드) |
| 최대 | 100 | - |
3.3 정렬 옵션
| 정렬 기준 | 설명 |
|---|---|
| 최근 획득 | 획득 시간 내림차순 |
| 희귀도 | 전설 > 에픽 > 레어 > ... |
| 레벨 | 아이템 레벨 내림차순 |
| 이름 | 가나다/ABC 순 |
| 슬롯 | 무기 → 방어구 → 악세서리 |
| 가중치 | 높은 가중치 우선 |
3.4 필터 옵션
| 필터 | 옵션 |
|---|---|
| 슬롯 | 전체, 무기, 방어구, 악세서리 등 |
| 희귀도 | 전체, Common ~ Legendary |
| 장착 가능 | 현재 레벨에서 장착 가능한 것만 |
| 세트 | 세트 아이템만 |
3.5 자동 정리
class InventoryAutoClean {
/// 인벤토리 자동 정리
void autoClean(Inventory inventory, AutoCleanSettings settings) {
if (settings.sellCommon) {
_sellByRarity(ItemRarity.common);
}
if (settings.sellBelowLevel) {
_sellBelowLevel(settings.minLevel);
}
if (settings.keepBestPerSlot) {
_keepBestPerSlot(settings.keepCount);
}
}
}
3.6 인벤토리 UI
┌─ 인벤토리 [45/50] ──────────────────┐
│ │
│ [정렬: 희귀도 ▼] [필터: 전체 ▼] │
│ │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │ ★ │ │ ★ │ │ ◆ │ │ ◆ │ │ ○ │ ... │
│ │검 │ │갑 │ │방 │ │투 │ │단 │ │
│ └───┘ └───┘ └───┘ └───┘ └───┘ │
│ │
│ 선택: 디버거의 검 +3 │
│ 공격력 +45, 크리티컬 +5% │
│ │
│ [장착] [판매] [강화] [분해] │
│ │
│ ───────────────────────────────── │
│ [ 자동 정리 ] [ 일괄 판매 ] │
└─────────────────────────────────────┘
4. 물약/소모품 시스템
4.1 소모품 종류
| 카테고리 | 아이템 | 효과 | 획득 방법 |
|---|---|---|---|
| HP 물약 | 소형 HP 물약 | HP +100 | 상점, 드롭 |
| 중형 HP 물약 | HP +300 | 상점, 드롭 | |
| 대형 HP 물약 | HP +500 | 상점, 드롭 | |
| 최상급 HP 물약 | HP 100% 회복 | 보스 드롭, 제작 | |
| MP 물약 | 소형 MP 물약 | MP +50 | 상점, 드롭 |
| 중형 MP 물약 | MP +150 | 상점, 드롭 | |
| 대형 MP 물약 | MP +300 | 상점, 드롭 | |
| 최상급 MP 물약 | MP 100% 회복 | 보스 드롭, 제작 | |
| 버프 물약 | 공격력 물약 | ATK +20%, 5분 | 상점, 제작 |
| 방어력 물약 | DEF +20%, 5분 | 상점, 제작 | |
| 경험치 물약 | EXP +50%, 5분 | 이벤트, 퀘스트 | |
| 골드 물약 | GOLD +50%, 5분 | 이벤트, 퀘스트 | |
| 행운 물약 | 드롭률 +30%, 5분 | 희귀 드롭 | |
| 특수 소모품 | 귀환 스크롤 | 마을로 즉시 이동 | 상점 |
| 부활의 부적 | 사망 시 장비 1개 보존 | 보스 드롭 | |
| 감정 스크롤 | 미감정 아이템 감정 | 상점 |
4.2 소모품 데이터 구조
class Consumable {
final String id;
final String name;
final ConsumableType type; // hp, mp, buff, special
final int value; // 회복량 또는 효과 수치
final Duration? duration; // 버프 지속 시간
final int maxStack; // 최대 중첩 수 (인벤토리)
final int buyPrice;
final int sellPrice;
}
class ConsumableInventory {
final Map<String, int> items; // id -> 수량
void use(String id);
void add(String id, int amount);
bool has(String id) => (items[id] ?? 0) > 0;
}
4.3 자동 사용 설정
┌─ 물약 자동 사용 설정 ───────────────┐
│ │
│ HP 물약 자동 사용 │
│ ● 켜기 ○ 끄기 │
│ HP가 [30]% 이하일 때 사용 │
│ 사용 우선순위: [소형 > 중형 > 대형]│
│ │
│ MP 물약 자동 사용 │
│ ● 켜기 ○ 끄기 │
│ MP가 [20]% 이하일 때 사용 │
│ │
│ 버프 물약 자동 사용 │
│ ○ 켜기 ● 끄기 │
│ (보스전에서만 자동 사용) │
│ │
└─────────────────────────────────────┘
4.4 물약 쿨타임
| 물약 종류 | 쿨타임 |
|---|---|
| HP 물약 | 3초 |
| MP 물약 | 3초 |
| 버프 물약 | 60초 |
| 특수 소모품 | 없음 |