Skip to content

Commit 36ebd23

Browse files
committed
docs: update README.md with detailed project description, features, technology stack, build instructions, and troubleshooting tips; add ASCII controls and references
1 parent b0cb3b0 commit 36ebd23

File tree

1 file changed

+133
-12
lines changed

1 file changed

+133
-12
lines changed

README.md

Lines changed: 133 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,114 @@
11
# Chocolate Doom (Web/WASM Port)
22

3-
Chocolate Doom compiled to WebAssembly for running in web browsers.
3+
[![Build and Deploy to GitHub Pages](https://github.com/devMinseok/ascii-doom/actions/workflows/deploy.yml/badge.svg?branch=main&event=push)](https://github.com/devMinseok/ascii-doom/actions/workflows/deploy.yml)
44

5-
## Prerequisites
5+
Chocolate Doom을 WebAssembly로 포팅하여 브라우저에서 실행할 수 있도록 한 프로젝트입니다. 클래식한 Doom 게임을 웹에서 ASCII 아트로 즐길 수 있습니다.
6+
7+
## 🎮 특징
8+
9+
- 🌐 **브라우저에서 바로 실행**: 별도 설치 없이 웹 브라우저에서 바로 플레이
10+
- 🎨 **ASCII 아트 렌더링**: 터미널 스타일의 고유한 비주얼 경험
11+
- 📦 **WebAssembly 기반**: 네이티브에 가까운 성능으로 실행
12+
- 🚀 **자동 배포**: GitHub Actions를 통한 CI/CD 파이프라인
13+
- 🐳 **Docker 기반 빌드**: 일관된 빌드 환경 제공
14+
15+
## 🛠️ 기술 스택
16+
17+
### 핵심 기술
18+
19+
- **[Emscripten](https://emscripten.org/)**: C/C++ 코드를 WebAssembly와 JavaScript로 컴파일
20+
- **[WebAssembly (WASM)](https://webassembly.org/)**: 고성능 바이너리 포맷으로 네이티브에 가까운 성능 제공
21+
- **[SDL2](https://www.libsdl.org/)**: 크로스 플랫폼 멀티미디어 라이브러리 (입력, 오디오, 네트워킹)
22+
- **[Chocolate Doom](https://www.chocolate-doom.org/)**: 정확한 Doom 소스 포트
23+
24+
### 빌드 도구
25+
26+
- **Autotools** (autoconf, automake): 빌드 시스템 자동화
27+
- **Docker**: 일관된 빌드 환경 제공
28+
- **GitHub Actions**: 자동 빌드 및 배포
29+
30+
### Emscripten 기능
31+
32+
- `ASYNCIFY`: 동기 C 코드를 비동기 JavaScript로 변환
33+
- `ALLOW_MEMORY_GROWTH`: 동적 메모리 할당 지원
34+
- `FORCE_FILESYSTEM`: Emscripten 가상 파일 시스템으로 WAD 파일 로드
35+
- `USE_SDL=2`: SDL2 바인딩을 통한 브라우저 API 접근
36+
- `EXPORTED_RUNTIME_METHODS`: JavaScript에서 WebAssembly 함수 호출을 위한 런타임 메서드 노출
37+
- **WASM SIMD**: ASCII 렌더링 성능 최적화를 위한 SIMD 명령어 사용 (`i_ascii.cpp`)
38+
39+
## ⚙️ 동작 방식
40+
41+
### 빌드 프로세스
42+
43+
```text
44+
C/C++ 소스 코드 (Chocolate Doom)
45+
46+
Emscripten 컴파일러 (emcc)
47+
48+
WebAssembly (.wasm) + JavaScript (.js) + HTML (.html)
49+
50+
브라우저에서 실행
51+
```
52+
53+
1. **소스 코드 컴파일**
54+
- Chocolate Doom의 C/C++ 소스 코드를 Emscripten으로 컴파일
55+
- SDL2를 브라우저 API로 변환 (Canvas, Web Audio API 등)
56+
- ASCII 렌더링을 위한 커스텀 구현 (`i_ascii.cpp`)
57+
58+
2. **WebAssembly 생성**
59+
- 게임 로직은 WebAssembly로 컴파일되어 고성능 실행
60+
- JavaScript는 WebAssembly와 브라우저 간 브릿지 역할
61+
62+
3. **파일 시스템**
63+
- Emscripten의 가상 파일 시스템을 통해 WAD 파일 로드
64+
- 브라우저의 IndexedDB를 백엔드로 사용
65+
66+
4. **렌더링**
67+
- ASCII 아트 렌더링 엔진이 게임 화면을 터미널 스타일로 변환
68+
- Canvas API를 통해 브라우저에 렌더링
69+
70+
### 아키텍처
71+
72+
```text
73+
┌─────────────────┐
74+
│ Web Browser │
75+
│ ┌───────────┐ │
76+
│ │ HTML/JS │ │ ← 사용자 인터페이스
77+
│ └─────┬─────┘ │
78+
│ │ │
79+
│ ┌─────▼─────────────────┐
80+
│ │ WASM (WebAssembly) │
81+
│ │ ┌─────────────────┐ │
82+
│ │ │ 게임 로직 (C) │ │ ← Chocolate Doom 엔진
83+
│ │ └───────┬─────────┘ │
84+
│ │ │ │
85+
│ │ ┌───────▼─────────┐ │
86+
│ │ │ ASCII 렌더링 │ │ ← i_ascii.cpp (C++)
87+
│ │ │ 엔진 │ │ 픽셀 → ASCII 변환
88+
│ │ └───────┬─────────┘ │
89+
│ └──────────┼─────────────┘
90+
│ │
91+
│ ┌──────────▼─────────┐
92+
│ │ SDL2 │ │ ← 브라우저 API 브릿지
93+
│ │ (Canvas API) │ │
94+
│ └────────────────────┘ │
95+
└──────────────────────────┘
96+
97+
98+
┌──────────────────────────┐
99+
│ Emscripten FS │ ← 가상 파일 시스템
100+
│ (WAD files) │ (IndexedDB 백엔드)
101+
└──────────────────────────┘
102+
```
103+
104+
## 📋 Prerequisites
6105

7106
**Docker Desktop만 설치하면 됩니다** (모든 플랫폼: macOS, Windows, Linux)
8107

9108
- [Docker Desktop 다운로드](https://www.docker.com/products/docker-desktop)
10109
- Docker Compose는 Docker Desktop에 포함되어 있음
11110

12-
## Build
111+
## 🔨 Build
13112

14113
### Dev Container 사용 (권장)
15114

@@ -28,10 +127,18 @@ Chocolate Doom compiled to WebAssembly for running in web browsers.
28127
```
29128

30129
빌드된 파일은 `src/` 디렉토리에 생성됩니다:
130+
131+
**게임 실행 파일:**
132+
31133
- `chocolate-doom.html`, `chocolate-heretic.html`, `chocolate-hexen.html`, `chocolate-strife.html`
32-
- `chocolate-setup.html`, `chocolate-server.html`
33134
- 각각의 `.wasm``.js` 파일
34135

136+
**설정 및 서버 파일:**
137+
138+
- `chocolate-doom-setup.html`, `chocolate-heretic-setup.html`, `chocolate-hexen-setup.html`, `chocolate-strife-setup.html`
139+
- `chocolate-setup.html` (공통 설정)
140+
- `chocolate-server.html` (전용 서버)
141+
35142
### Docker Compose 사용 (대안)
36143

37144
Dev Container를 사용할 수 없는 경우:
@@ -44,7 +151,7 @@ docker-compose build
44151
docker-compose run --rm build /usr/local/bin/build.sh
45152
```
46153

47-
## Run
154+
## 🚀 Run
48155

49156
```bash
50157
cd src
@@ -53,9 +160,9 @@ python3 -m http.server 8000
53160

54161
브라우저에서 `http://localhost:8000/chocolate-doom.html` 열기
55162

56-
**Note**: 게임을 실행하려면 WAD 파일(`doom1.wad`, `doom2.wad` 등)이 필요합니다. `index.html``preRun` 섹션을 수정하여 WAD 파일을 미리 로드하세요.
163+
**Note**: 게임을 실행하려면 WAD 파일(`doom1.wad`, `doom2.wad` 등)이 필요합니다. 각 게임 HTML 파일의 `preRun` 섹션을 수정하거나, `index.html`을 사용하여 WAD 파일을 미리 로드할 수 있습니다.
57164

58-
## Deploy to GitHub Pages
165+
## 📤 Deploy to GitHub Pages
59166

60167
GitHub Actions가 자동으로 빌드하고 배포합니다.
61168

@@ -67,13 +174,27 @@ GitHub Actions가 자동으로 빌드하고 배포합니다.
67174

68175
사이트는 `https://<username>.github.io/ascii-doom/`에서 확인할 수 있습니다.
69176

70-
## Troubleshooting
177+
## 🔧 Troubleshooting
71178

72179
- **컨테이너 연결 실패**: Docker Desktop이 실행 중인지 확인
73180
- **빌드 실패**: `emmake make clean && emmake make -j4 -k` 재시도
74181
- **아이콘 파일 에러**: 무시해도 됨 (게임 빌드에는 영향 없음)
75182

76-
## 조작키
77-
이동 : 방향키
78-
공격 : a
79-
문 열기 : s
183+
## ⌨️ 조작키
184+
185+
| 동작 ||
186+
|------|-----|
187+
| 이동 | 방향키 (↑↓←→) |
188+
| 공격 | `A` |
189+
| 문 열기 | `S` |
190+
191+
## 📚 참고 자료
192+
193+
- [Chocolate Doom 공식 사이트](https://www.chocolate-doom.org/)
194+
- [Emscripten 문서](https://emscripten.org/docs/getting_started/index.html)
195+
- [WebAssembly 소개](https://webassembly.org/)
196+
- [SDL2 문서](https://wiki.libsdl.org/)
197+
198+
## 📄 라이선스
199+
200+
이 프로젝트는 Chocolate Doom을 기반으로 하며, [GNU General Public License v2](COPYING.md)를 따릅니다.

0 commit comments

Comments
 (0)