This commit is contained in:
2025-12-04 16:50:57 +09:00
parent 0a7c50e6c9
commit 37a634643e
23 changed files with 1062 additions and 663 deletions
+9 -3
View File
@@ -20,6 +20,7 @@
- `ResponsiveContainer` 위젯을 통해 최대 너비(600px) 및 높이(1000px) 제한.
- 웹/태블릿 환경에서도 모바일 앱처럼 중앙 정렬된 화면 제공.
- **Battle UI Layout:** 플레이어(좌측 하단) vs 적(우측 상단) 대각선 구도 배치 및 캐릭터 임시 아이콘 적용.
- **Widget Refactoring:** `BattleScreen`의 주요 UI 컴포넌트(`CharacterStatusCard`, `BattleLogOverlay` 등)를 `lib/widgets/battle/`로 분리하여 모듈화.
### B. 전투 시스템 (`BattleProvider`)
@@ -31,6 +32,9 @@
- **선제 방어 (Pre-emptive Defense):** 적이 방어를 선택하면 턴 시작 전에 즉시 방어도가 적용됨.
- **Defense Restriction:** `DefenseForbidden` 상태 시 방어 행동 선택 불가.
- **Variance Removed:** 적의 공격/방어 수치 계산 시 랜덤 분산(Variance) 제거 (고정 수치).
- **적 장비 시스템 (Enemy Equipment):**
- 적에게 아이템 장착 가능 (`enemies.json``equipment` 필드).
- 장착된 아이템의 스탯 및 특수 효과(상태이상 등)가 전투 시 적용됨.
- **시각 효과 (Visual Effects):**
- **Floating Text:** 데미지 발생 시 캐릭터 위에 데미지 수치가 떠오름 (일반: 빨강, 출혈: 보라, 취약: 주황).
- **Action Feedback:** 공격 빗나감(MISS - 적 위치/회색) 및 방어 실패(FAILED - 내 위치/빨강) 텍스트 오버레이.
@@ -39,8 +43,8 @@
### C. 데이터 주도 설계 (Data-Driven Design)
- **JSON 데이터:** `assets/data/items.json`, `assets/data/enemies.json`.
- **데이터 로더:** `ItemTable`, `EnemyTable`.
- **JSON 데이터:** `assets/data/items.json` (ID 포함), `assets/data/enemies.json` (장비 포함).
- **데이터 로더:** `ItemTable` (ID 조회 지원), `EnemyTable` (장비 장착 지원).
### D. 아이템 및 경제 (`Item`, `Inventory`)
@@ -65,13 +69,15 @@
- **Streams:** `damageStream`, `effectStream`을 통해 UI(`BattleScreen`)에 비동기 이벤트 전달.
- **`lib/game/enums.dart`:** 프로젝트 전반의 Enum 통합 관리 (`ActionType`, `RiskLevel`, `StageType` 등).
- **`lib/utils/item_utils.dart`:** 아이템 타입별 아이콘 및 색상 로직 중앙화.
- **`lib/widgets/battle/`:** `BattleScreen`에서 분리된 재사용 가능한 위젯들 (`CharacterStatusCard`, `BattleLogOverlay`, `FloatingBattleTexts`, `StageUI`).
- **`lib/widgets/responsive_container.dart`:** 반응형 레이아웃 컨테이너.
- **`lib/game/model/`:**
- `damage_event.dart`, `effect_event.dart`: 이벤트 모델.
- `entity.dart`: `Character` (Player/Enemy).
- `item.dart`: `Item`.
- `item.dart`: `Item` (ID 필드 포함).
- **`lib/screens/battle_screen.dart`:**
- `StreamSubscription`을 통해 이펙트 이벤트 수신 및 `Overlay` 애니메이션 렌더링.
- `Stack``Positioned` 기반의 정교한 레이아웃.
## 4. 작업 컨벤션 (Working Conventions)
+28
View File
@@ -0,0 +1,28 @@
# 배틀 화면 위젯 리팩토링
## 목표
UI 컴포넌트를 별도의 위젯으로 추출하여 `BattleScreen`의 코드 유지보수성, 가독성 및 구조를 개선합니다.
## 변경 사항
1. **디렉토리 구조:**
- `lib/widgets/battle/` 디렉토리를 생성했습니다.
2. **추출된 위젯:**
- `CharacterStatusCard` (`lib/widgets/battle/character_status_card.dart`): 캐릭터 스탯(HP, 방어도, 공격력, 방어력), 체력 바, 상태 효과 및 의도를 표시합니다.
- `BattleLogOverlay` (`lib/widgets/battle/battle_log_overlay.dart`): 스크롤 가능한 배틀 로그 목록을 표시합니다.
- `FloatingBattleTexts` (`lib/widgets/battle/floating_battle_texts.dart`): 애니메이션 시각 효과를 위한 `FloatingDamageText`, `FloatingEffect`, `FloatingFeedbackText`를 포함합니다.
- `StageUI` (`lib/widgets/battle/stage_ui.dart`): 비전투 스테이지를 위한 `ShopUI``RestUI`를 포함합니다.
3. **BattleScreen 업데이트:**
- 추출된 위젯을 임포트하고 사용하도록 `lib/screens/battle_screen.dart`를 리팩토링했습니다.
- 인라인 위젯 빌드 메서드(`_buildCharacterStatus`, `_buildShopUI`, `_buildRestUI` 등)와 내부 클래스(`_FloatingDamageText` 등)를 제거했습니다.
## 이점
- **복잡도 감소:** `BattleScreen`은 이제 레이아웃과 상태 관리에 집중합니다.
- **재사용성:** 위젯은 필요에 따라 앱의 다른 부분에서 재사용할 수 있습니다.
- **유지보수성:** 특정 UI 요소를 찾고 수정하기가 더 쉬워졌습니다.
+27
View File
@@ -0,0 +1,27 @@
# 적 장비 시스템 구현 (Enemy Equipment System)
## 목표
적에게 아이템을 장착시켜 전투의 다양성을 높이고, 아이템 데이터 구조를 개선합니다.
## 주요 변경 사항
### 1. 데이터 구조 개선
- **`assets/data/items.json`**: 모든 아이템에 고유 `id` 필드를 추가했습니다. (예: `"id": "rusty_dagger"`)
- **`assets/data/enemies.json`**: 적 정보에 `equipment` 필드(아이템 ID 리스트)를 추가했습니다. (예: `Goblin``rusty_dagger` 장착)
### 2. 게임 로직 업데이트
- **`lib/game/model/item.dart`**: `Item` 클래스에 `id` 필드를 추가했습니다.
- **`lib/game/data/item_table.dart`**: ID로 아이템을 조회하는 `get(String id)` 메서드를 구현했습니다.
- **`lib/game/data/enemy_table.dart`**: 적 생성(`createCharacter`) 시 `equipment` 필드에 명시된 아이템을 자동으로 인벤토리에 추가하고 장착하도록 수정했습니다.
- **`lib/providers/battle_provider.dart`**: 초기 플레이어 지급 아이템 생성 시 `id`를 포함하도록 수정했습니다.
### 3. 버그 수정
- **`lib/screens/battle_screen.dart`**: `ScrollController`가 연결되지 않아 발생하던 에러를 수정했습니다. (불필요한 컨트롤러 제거)
## 결과
이제 `enemies.json` 설정만으로 적에게 다양한 장비를 입혀 스탯과 특수 효과(출혈, 스턴 등)를 부여할 수 있습니다.
+35
View File
@@ -0,0 +1,35 @@
# 플레이어 데이터 중앙화 (Centralize Player Data)
## 목표
캐릭터 선택 화면과 전투 시스템(`BattleProvider`)에서 사용하는 플레이어 스탯이 하드코딩되어 불일치하는 문제를 해결하기 위해, 플레이어 데이터를 JSON 파일로 중앙화하여 관리합니다.
## 주요 변경 사항
### 1. 데이터 구조 추가
- **`assets/data/players.json`**: 플레이어 템플릿 데이터를 정의했습니다.
```json
[
{
"id": "warrior",
"name": "Warrior",
"description": "A balanced fighter...",
"baseHp": 50,
"baseAtk": 5,
"baseDefense": 5,
...
}
]
```
- **`lib/game/data/player_table.dart`**: `players.json`을 로드하고 파싱하는 `PlayerTable` 클래스를 구현했습니다.
### 2. 게임 로직 업데이트
- **`lib/main.dart`**: 앱 시작 시 `PlayerTable.load()`를 호출하여 데이터를 메모리에 적재합니다.
- **`lib/screens/character_selection_screen.dart`**: 하드코딩된 텍스트 대신 `PlayerTable.get("warrior")`를 사용하여 UI를 렌더링합니다.
- **`lib/providers/battle_provider.dart`**: 전투 초기화(`initializeBattle`) 시 `PlayerTable`에서 캐릭터 정보를 가져와 생성합니다.
## 결과
이제 `players.json` 파일만 수정하면 게임 내 모든 곳(선택 화면, 전투 시작 스탯 등)에 일관되게 반영됩니다.