From 0116db1056a1b43b62f537d8e505b19aab1e9990 Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Tue, 31 Mar 2026 00:22:28 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20Progress=20Quest=20=EC=96=B8=EA=B8=89?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0=20+=20README=20=EC=A0=84=EB=A9=B4=20?= =?UTF-8?q?=EC=9E=AC=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README: 프로젝트 설명, 게임 시스템, 스탯 표 포함 재작성 - CLAUDE.md, ARCHITECTURE.md: PQ 참조 제거 - skill_data, pq_logic, game_state, game_mutations: 주석에서 PQ 언급 제거 - analysis/market-analysis: PQ 언급 제거 --- ARCHITECTURE.md | 2 +- CLAUDE.md | 4 +- README.md | 63 +++++++++++++++++-------- analysis/market-analysis-2026-03-30.md | 8 ++-- lib/data/skill_data.dart | 8 ++-- lib/src/core/engine/game_mutations.dart | 2 +- lib/src/core/model/game_state.dart | 3 +- lib/src/core/util/pq_logic.dart | 4 +- 8 files changed, 59 insertions(+), 35 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 5dceb1c..867b6d0 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -68,7 +68,7 @@ Config.dfm에서 추출한 종족, 직업, 스킬, 포션, 스토리 데이터. | 파일 | 역할 | |------|------| -| `pq_config_data.dart` | PQ 원본 데이터 (몬스터, 아이템, 주문 등) | +| `pq_config_data.dart` | 게임 원본 정적 데이터 (몬스터, 아이템, 주문 등) | | `class_data.dart` | 직업 정의 + 특성 | | `race_data.dart` | 종족 정의 + 특성 | | `skill_data.dart` | 68개 스킬 정의 | diff --git a/CLAUDE.md b/CLAUDE.md index da778b9..a63f31f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## 프로젝트 개요 -Askii Never Die는 Progress Quest 6.4의 핵심 메커니즘을 기반으로, 독자적 세계관("디지털 판타지")과 확장된 시스템으로 재구성한 오프라인 싱글플레이어 방치형 RPG입니다. 네트워크 기능은 제외됩니다. +Askii Never Die는 "디지털 판타지" 세계관의 오프라인 싱글플레이어 방치형 RPG입니다. ASCII 아트 비주얼과 자동 전투 시스템이 특징이며, 네트워크 기능은 제외됩니다. ## 빌드 및 실행 @@ -29,7 +29,7 @@ flutter test lib/ ├── main.dart # 앱 진입점 ├── data/ # 정적 데이터 (Config.dfm 추출 + 확장) -│ ├── pq_config_data.dart # PQ 원본 정적 데이터 +│ ├── pq_config_data.dart # 게임 원본 정적 데이터 │ ├── class_data.dart # 직업 데이터 │ ├── race_data.dart # 종족 데이터 │ ├── skill_data.dart # 스킬 데이터 diff --git a/README.md b/README.md index 8828683..2e79f73 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Ascii Never Die +# ASCII Never Die -Progress Quest 6.4의 핵심 메커니즘을 기반으로, "디지털 판타지" 세계관과 확장된 시스템으로 재구성한 오프라인 싱글플레이어 방치형 RPG. +"디지털 판타지" 세계관의 오프라인 방치형 RPG. ASCII 아트 비주얼과 자동 전투 시스템으로, 켜두기만 하면 캐릭터가 성장합니다. ## 스크린샷 @@ -15,25 +15,47 @@ Progress Quest 6.4의 핵심 메커니즘을 기반으로, "디지털 판타지" ## 주요 기능 -- **6개 화면** -- 타이틀/세이브 선택, 캐릭터 생성(3d6 스탯 롤), 게임 진행(장비/인벤토리/퀘스트/스킬/전투로그/스토리), 아레나 PvP, 명예의 전당, 설정 -- **완전 오프라인** -- 네트워크 불필요. 모든 게임 데이터와 세이브가 로컬에 저장 -- **수익화** -- AdMob 리워드/인터스티셜 광고 + IAP 광고 제거/프리미엄 -- **다국어 지원** -- 한국어, 영어, 일본어 (앱 UI + 게임 데이터) -- **ASCII 아트 애니메이션** -- Canvas 기반 전투/탐험/마을 씬, 종족별 캐릭터 프레임 -- **보안** -- 세이브 파일 HMAC-SHA256 무결성 검증, IAP 영수증 RSA 서명 검증 +- **방치형 자동 전투** -- 전투, 레벨업, 퀘스트, 스토리가 자동으로 진행 +- **ASCII 아트 애니메이션** -- Canvas 기반 전투/탐험/마을 씬, 21개 종족별 캐릭터 프레임 +- **깊은 캐릭터 빌드** -- 21개 종족, 18개 직업, 68개 스킬, 11개 장비 슬롯 +- **로컬 아레나** -- 클리어한 캐릭터들끼리 1:1 전투, 장비 약탈 +- **완전 오프라인** -- 네트워크 불필요, 모든 데이터가 로컬에 저장 +- **다국어 지원** -- 한국어, 영어, 일본어 + +## 게임 시스템 + +### 스탯 +| 스탯 | 효과 | +|------|------| +| STR | 물리 공격력, 쳐내기 | +| CON | 방어력, 최대 HP, 방패 방어 | +| DEX | 크리티컬, 회피, 명중, 공격 속도 | +| INT | 마법 공격력, DoT 데미지, MP | +| WIS | 마법 방어력, DoT 틱 간격, MP | +| CHA | 상점 할인 (최대 15%), 희귀 아이템 드롭률 보정 | + +### 장비 희귀도 +Common → Uncommon → Rare → Epic → Legendary (스탯 1.0x ~ 3.0x) + +### 스킬 시스템 +68개 전투 스킬 (공격/회복/버프/디버프), 쿨타임 기반, 자동 선택 AI + +### 수익화 +- AdMob 리워드/인터스티셜 광고 +- IAP 광고 제거 + 프리미엄 (영구 5배속, 되돌리기 3회, 보물 상자 10개, 오프라인 2배) ## 기술 스택 | 구분 | 기술 | |------|------| -| 프레임워크 | Flutter 3.x / Dart ^3.9.2 | -| 상태 관리 | Stream + 직접 관리 | +| 프레임워크 | Flutter 3.x / Dart 3.9+ | +| 상태 관리 | ValueNotifier + Stream | | 코드 생성 | freezed + json_serializable | | DI | GetIt (서비스 로케이터) | | 광고 | google_mobile_ads 7.x | | 인앱결제 | in_app_purchase 3.x | -| 보안 저장 | flutter_secure_storage, crypto (HMAC), pointycastle (RSA) | -| 오디오 | just_audio | +| 보안 | flutter_secure_storage, HMAC-SHA256, RSA 서명 검증 | +| 오디오 | just_audio (BGM 11곡, SFX 10종) | | 폰트 | JetBrainsMono (ASCII), PressStart2P (레트로 UI) | ## 빌드 및 실행 @@ -48,6 +70,9 @@ dart run build_runner build --delete-conflicting-outputs # 실행 (-d macos, -d chrome, -d android 등) flutter run +# 릴리즈 빌드 (난독화 포함) +flutter build appbundle --obfuscate --split-debug-info=build/debug-info + # 검증 dart format --set-exit-if-changed . flutter analyze @@ -58,7 +83,7 @@ flutter test ``` lib/ -├── main.dart # 앱 진입점 +├── main.dart # 앱 진입점 + 에러 핸들링 ├── data/ # 정적 게임 데이터 (종족, 직업, 스킬, 포션, 스토리) ├── l10n/ # 앱 UI 다국어 리소스 (arb) └── src/ @@ -66,11 +91,12 @@ lib/ ├── core/ │ ├── engine/ # 게임 루프, 전투, 보상, 스킬 등 30개 서비스 │ ├── model/ # GameState, 장비, 스킬, 전투 등 데이터 모델 - │ ├── infrastructure/ # AdMob, IAP 외부 서비스 구현 + │ ├── infrastructure/ # AdMob, IAP 외부 서비스 │ ├── di/ # GetIt 서비스 로케이터 + 인터페이스 │ ├── audio/ # BGM/SFX 오디오 서비스 │ ├── storage/ # 세이브/설정/통계 저장소 - │ └── util/ # RNG, 밸런스 상수, PQ 로직 헬퍼 + │ ├── logging/ # 로컬 에러 로거 + │ └── util/ # RNG, 밸런스 상수, 로직 헬퍼 ├── features/ │ ├── front/ # 타이틀/세이브 선택 │ ├── new_character/ # 캐릭터 생성 @@ -80,8 +106,8 @@ lib/ │ └── settings/ # 설정 └── shared/ # 테마, 레트로 위젯, ASCII 애니메이션 -example/pq/ # Delphi 원본 소스 (참조용) -test/ # 단위/위젯/회귀 테스트 (25개 파일) +test/ # 단위/위젯/회귀 테스트 (276개) +analysis/ # 프로젝트 감사/시장 분석 리포트 ``` 아키텍처 상세는 [ARCHITECTURE.md](ARCHITECTURE.md) 참조. @@ -90,7 +116,7 @@ test/ # 단위/위젯/회귀 테스트 (25개 파일) | 버전 | 날짜 | 주요 내용 | |------|------|-----------| -| 1.1.0 | 2026-03-30 | IAP RSA 검증, HMAC 세이브, CI, 테스트 105개 추가 | +| 1.1.0 | 2026-03-30 | IAP RSA 검증, HMAC 세이브, CI, 아키텍처 개선, 테스트 276개 | | 1.0.1 | 2026-03-19 | 초기 릴리즈 (Google Play 내부 테스트) | 전체 변경 이력은 [CHANGELOG.md](CHANGELOG.md) 참조. @@ -99,5 +125,4 @@ test/ # 단위/위젯/회귀 테스트 (25개 파일) 비공개 프로젝트. 무단 배포 금지. -Progress Quest 원본 소스(`example/pq/`)는 참조용으로만 포함되어 있습니다. 폰트 라이선스: JetBrains Mono (SIL OFL 1.1), Press Start 2P (SIL OFL 1.1). diff --git a/analysis/market-analysis-2026-03-30.md b/analysis/market-analysis-2026-03-30.md index 79d6fd8..f2f5629 100644 --- a/analysis/market-analysis-2026-03-30.md +++ b/analysis/market-analysis-2026-03-30.md @@ -6,7 +6,7 @@ ## 프로젝트 포지셔닝 **장르**: 오프라인 방치형 Idle RPG + ASCII 아트 -**원형**: Progress Quest 6.4 +**원형**: 클래식 방치형 RPG **수익화**: AdMob 광고 + IAP 광고 제거 프리미엄 (₩9,900) **플랫폼**: Android (출시), iOS (예정) **다국어**: 한/영/일 @@ -33,7 +33,7 @@ ## 3. Askii Never Die 차별화 1. **순수 ASCII 비주얼** — 그래픽 피로도 제로 -2. **Progress Quest 정통 계승** — Zero-player 철학의 모바일 최적화 +2. **방치형 RPG 정통 계승** — Zero-player 철학의 모바일 최적화 3. **완전 오프라인** — 데이터/서버 의존 없음 4. **3개 국어** — 텍스트 게임에서 현지화가 핵심 경쟁력 @@ -49,14 +49,14 @@ ## 5. 타겟 유저 -- **코어**: 30-40대 남성, IT 종사자, MUD/Progress Quest 경험자 +- **코어**: 30-40대 남성, IT 종사자, MUD/방치형 RPG 경험자 - **서브**: 디지털 디톡스 선호 미니멀리즘 게이머 - **페르소나**: "업무 중 옆에 켜두어도 눈치 안 보이는 게임" ## 6. 성장 전략 1. **커뮤니티 바이럴**: Reddit r/incremental_games, DC인사이드, 5ch -2. **ASO 키워드**: ASCII, MUD, Progress Quest, Text RPG, Idle RPG +2. **ASO 키워드**: ASCII, MUD, 방치형 RPG, Text RPG, Idle RPG 3. **크로스 플랫폼**: Android → iOS → Steam (PC) 4. **유저 기여**: ASCII 아트/이벤트 모딩 시스템 (장기) diff --git a/lib/data/skill_data.dart b/lib/data/skill_data.dart index 86a8e75..35e31a8 100644 --- a/lib/data/skill_data.dart +++ b/lib/data/skill_data.dart @@ -2,8 +2,8 @@ import 'package:asciineverdie/src/core/model/skill.dart'; /// 게임 내 스킬 정의 /// -/// PQ 스펠을 기반으로 68개 전투 스킬로 재구성 -/// 스펠 이름(영문)으로 스킬 조회 가능 +/// 68개 전투 스킬 정의 +/// 스킬 ID(영문)로 조회 가능 class SkillData { SkillData._(); @@ -1081,9 +1081,9 @@ class SkillData { // 스펠 이름 → 스킬 매핑 // ============================================================================ - /// PQ 스펠 이름으로 스킬 조회 + /// 스킬 ID로 스킬 조회 /// - /// 스펠 이름(영문)을 키로 사용하여 해당 전투 스킬을 반환 + /// 스킬 ID(영문)를 키로 사용하여 해당 전투 스킬을 반환 static const Map spellNameToSkill = { // 공격 스킬 'Stack Trace': stackTrace, diff --git a/lib/src/core/engine/game_mutations.dart b/lib/src/core/engine/game_mutations.dart index 4951aeb..5dbf854 100644 --- a/lib/src/core/engine/game_mutations.dart +++ b/lib/src/core/engine/game_mutations.dart @@ -5,7 +5,7 @@ import 'package:asciineverdie/src/core/model/game_state.dart'; import 'package:asciineverdie/src/core/model/pq_config.dart'; import 'package:asciineverdie/src/core/util/pq_logic.dart' as pq_logic; -/// Game state mutations that mirror the original PQ win/reward logic. +/// 게임 상태 변경(mutation) 함수 — 보상, 장비, 스탯 획득 로직. class GameMutations { const GameMutations(this.config); diff --git a/lib/src/core/model/game_state.dart b/lib/src/core/model/game_state.dart index 9f5242a..f1f663f 100644 --- a/lib/src/core/model/game_state.dart +++ b/lib/src/core/model/game_state.dart @@ -28,8 +28,7 @@ import 'package:asciineverdie/src/core/util/deterministic_random.dart'; /// 게임 전체 상태 (Game State) /// -/// Progress Quest 구조를 미러링하는 최소 스켈레톤 상태. -/// 로직은 Delphi 소스에서 충실하게 포팅됨. +/// 게임 진행에 필요한 모든 데이터를 포함하는 불변(immutable) 상태 객체. class GameState { GameState({ required DeterministicRandom rng, diff --git a/lib/src/core/util/pq_logic.dart b/lib/src/core/util/pq_logic.dart index 960fbc9..0c05b12 100644 --- a/lib/src/core/util/pq_logic.dart +++ b/lib/src/core/util/pq_logic.dart @@ -1,6 +1,6 @@ -/// Progress Quest 핵심 로직 모듈 +/// 게임 핵심 로직 모듈 /// -/// 원본 Delphi 소스(Main.pas / NewGuy.pas)의 유틸리티 함수들을 포팅. +/// 유틸리티 함수 모음. /// 이 파일은 분할된 모듈들을 re-export하여 기존 코드 호환성 유지. // 랜덤/확률 함수