StarCraft: Brood War / Remastered ๋งต ์๋ํฐ. Windows ยท macOS ยท Linux.
์ฅ๊ธฐ ๋ชฉํ๋ SCMDraft 2 ์์ค์ ๊ธฐ๋ฅ ํจ๋ฆฌํฐ๋ค. StarEdit ์์ค์์ ๋ฉ์ถ์ง ์๋๋ค.
๋งต์ ์ด๊ณ , ์งํยท์ ๋ยท๋ก์ผ์ด์ ยท๋๋๋๋ฅผ ๋ณด๊ณ ๊ณ ์น๊ณ , ํธ๋ฆฌ๊ฑฐ๋ฅผ ํธ์งํด ์ ์ฅํ ์ ์๋ค. ์ฌ์ ์ฅ๋ณธ์ด ๊ฒ์์์ ์ ์์ผ๋ก ์ด๋ฆฌ๋ ๊ฒ๊น์ง ํ์ธํ๋ค. ๋จ์ ๊ฒ์ ๋ฐฑ๋ก๊ทธ ์ฐธ๊ณ .
.scmยท.scxยท.chk์ด๊ธฐ- ์ด๋ฆ ยท ํฌ๊ธฐ ยท ํ์ผ์ ยท ๋ฒ์ ยท ์ ๋/๋ก์ผ์ด์ /ํธ๋ฆฌ๊ฑฐ/๋ฌธ์์ด ๊ฐ์ ํ์
- ๋ค์ ์ ์ฅ (์ ์ฅ ยท ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ์ฅ)
- ๋น ๋งต ์๋ก ๋ง๋ค๊ธฐ (CLI)
- CHK ๋ฐ์ดํธ๋ฅผ ๋ณด์กดํ๋ round-trip โ ํธ์งํ์ง ์์ ์น์ ์ ํ ๋ฐ์ดํธ๋ ๋ฐ๋์ง ์๋๋ค
- ์งํ ๋ณด๊ธฐ โ ๊ฒ์ ์ค์น๋ณธ์ ํ์ผ์ ์ผ๋ก ์ค์ ์งํ์ ๊ทธ๋ฆฐ๋ค. ์คํฌ๋กค ยท ํ๋/์ถ์
- ์ ๋ ยท ๋ก์ผ์ด์ ๋ณด๊ธฐ โ ์ค์ ์ ๋ ์คํ๋ผ์ดํธ(๊ทธ๋ฆผ์ยทํ๋ ์ด์ด ์ ์ ์ฉ), ๋ก์ผ์ด์ ์ด๋ฆ
- ์ ๋งต ๋ง๋ค๊ธฐ ยท ๋งต ์์ฑ โ ์ด๋ฆยท์ค๋ช ยทํฌ๊ธฐยทํ์ผ์
- ํ๋ ์ด์ด ์ค์ โ ์ข ์กฑยท์ฌ๋กฏยท์ธ๋ ฅ๊ณผ ์ธ๋ ฅ ์ด๋ฆ
- ๋ฌธ์์ด ํธ์ง๊ธฐ โ ๋งต์ ๋ฌธ์์ด์ ์ฐ์ ์ฌ๋ถ์ ํจ๊ป ๋ณด๊ณ ๊ณ ์น๋ค
- ๋ฏธ๋๋งต โ ํด๋ฆญ์ผ๋ก ์ด๋, ๋ณด๊ณ ์๋ ์์ญ ํ์
- ๊ฒฉ์ ํ์ ยท ์ต๊ทผ ํ์ผ ยท ์ ๋ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ
- ๋งต ์คํ๋ผ์ดํธ โ ํ๋ ํธ์์ ๊ณจ๋ผ ๋ฐฐ์น (THG2)
- ํฌ๋ฆฝ ๋ณด๊ธฐ โ ์ ๊ทธ ๊ฑด๋ฌผ ์ฃผ๋ณ ํฌ๋ฆฝ (ํ ๊ธ ๊ฐ๋ฅ)
- ์ ๋ ํธ์ง โ ์ ๋ ํ๋ ํธ๋ก ๋ฐฐ์น(๋ฐฐ์น ์๋ฆฌ ํฌํจ), ํด๋ฆญ ์ ํ, ๋๋๊ทธ ์ด๋, ์ญ์ , ์คํ ์ทจ์/๋ค์ ์คํ
- ๋ก์ผ์ด์ ํธ์ง โ ํด๋ฆญ ์ ํ, ๋๋๊ทธ ์ด๋
- ์งํ ํธ์ง โ ์ธ ๊ฐ์ง ๋ฐฉ์
- Isometric: ์ ๋ฒฝยทํด์์ด ์๋์ผ๋ก ์ด์ด์ง๋ค (ISOM ๋ธ๋ฌ์)
- Rectangular: ๋ธ๋ฌ์ ํฌ๊ธฐ๋งํผ ์ฌ๊ฐ์ผ๋ก ์น ํ๋ค
- Subtile: ํ ์นธ์ฉ ์ ๋ฐํ๊ฒ ์น ํ๋ค ํ์ผ ํ๋ ํธ, Alt+ํด๋ฆญ์ผ๋ก ํ์ผ ์ง๊ธฐ
- ํธ๋ฆฌ๊ฑฐ ํธ์ง๊ธฐ โ ๋ชฉ๋กยท์คํ ํ๋ ์ด์ดยท์กฐ๊ฑดยท๋์์ ๋ณด๊ณ ๊ณ ์น๋ค (StarEdit ๊ตฌ์ฑ)
- ํธ๋ฆฌ๊ฑฐ ํ ์คํธ โ SCMDraft ํ์์ผ๋ก ์ ์ฒด๋ฅผ ๋ณด๊ณ ๊ณ ์ณ ์ ์ฉ
- ๋๋๋ โ ํ๋ ํธ์์ ๊ณจ๋ผ ๋๊ธฐ, ๊ณ ๋ฅด๊ธฐ, ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ, ์งํ์ผ๋ก ํ๊ธฐ, ์ด๊ธ๋ ๋๋๋ ์ฐพ์ ๊ณ ์น๊ธฐ
- ๊ฐ๋ฆฌ๊ฐ(MASK) โ ์น ํ๊ธฐ, ์ผ๊ด ์ ์ฉ, ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ
- ์ค์ ์ฐฝ โ ์ ๋ยท์ ๊ทธ๋ ์ด๋ยท๊ธฐ์ ์ค์ , ์ค์์น ์ด๋ฆ, CUWP, ๋ฏธ์ ๋ธ๋ฆฌํ
- ์๋ฆฌ(WAV) โ ๋ฃ๊ธฐยท๋นผ๊ธฐยท๊บผ๋ด๊ธฐยท๋ค์ด ๋ณด๊ธฐ
- ๋ณดํธ๋ ๋งต ํ๊ธฐ โ ๋ค์ ํธ์งํ ์ ์๊ฒ ๋๋๋ฆฐ๋ค
- ์๋๋ฆฌ์ค ์ ํธ โ ๋งต ๊ทธ๋ฆผ์ผ๋ก ์ ์ฅ, ๋ฆฌ๋น๋ฌ ๊น๊ธฐยท์ง์ฐ๊ธฐ, ์์๋ ์๊ธฐ, ์ ๋ ๊ฒน์ณ ์๊ธฐ, ์ต์ ๋ฒ ํธ๋ฆฌ๊ฑฐ
- ๊ฒน์ณ ๋ณด๊ธฐ โ ๋์ดยท์ง๋ ์ ์๋ ๊ณณยท์ง์ ์ ์๋ ๊ณณยทํฌ๋ฆฝยท์ฌ๊ฑฐ๋ฆฌยท์์ผยท ์ ๋ ฅ ๋ฒ์ยท๊ธธ ์์ญยทAI ํ์ดยทํ์ผ ๋ฒํธ
- ํ๊ธ ๋งต โ CP949ยท932ยท936ยท1252 ๋ฅผ ๊ฐ๋ ค๋ด ์ฝ๊ณ ์ด๋ค
- EUD โ ํธ๋ฆฌ๊ฑฐ ํธ์ง๊ธฐ์์
Memory/Memory Masked์กฐ๊ฑดยท๋์์ ์ฃผ์๋ก ๋ฐ๋ก ๊ณ ์น๋ค. ์ฃผ์ ๊ณ์ฐ๊ธฐ(์ฃผ์ โ EPD โ Deaths ์๋ฆฌ, ์ด๋ฆ์ผ๋ก ์ฐพ๊ธฐ), ๋งต์ด ๊ฑด๋๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ์๋ฆฌ ํ๊ธฐ(๋ฆฌ๋ง์คํฐ์์ ๋๋์ง๊น์ง), ๊ทธ๋ฆฌ๊ณ euddraft ๋ก epScript ์ปดํ์ผ๊น์ง ์ฐฝ ์์์ ํ๋ค - ๋ชจ๋ ์๋ฃ โ ๊ฐ์ ๋ผ์ด MPQ ๋ฅผ ์น์ด ๋ชจ๋ ๋งต์ ์๋ ๋ชจ์ต๋๋ก ๋ณธ๋ค. ์ค์น ํด๋์ ๋ฌถ์ด ํ๋กํ๋ก ์ ์ฅํ๋ค
- ์๋ ์ ์ฅ โ ๊ณ ์น ๋งต์ ์ฌ๋ณธ์ ๋ฐ๋ก ์๋๋ค
- ์ค๋ธ์ ํธ ๋ชฉ๋ก ยท ์ฌ๋ฌ ๋ณด๊ธฐ ์ฐฝ ยท ๋ฐฐ์จ 12.5~800%
- SCMDraft ๋ธ๋ฌ์ ํ์ผ(.scb) ์ฝ๊ธฐ โ ๊ณต๊ฐ ์คํ์ด ์๋ค. ์ฐ๋ฆฌ ๋ธ๋ฌ์๋
.splashbrush๋ก ์ฃผ๊ณ ๋ฐ๋๋ค. - ๋ฆฌ๋ง์คํฐ(HD) ๊ทธ๋ํฝ โ ํด๋์(SD) ์์ฐ์ผ๋ก ๊ทธ๋ฆฐ๋ค. SCMDraft 2 ๋ ๊ทธ๋ ๋ค.
- ์ ๋ ์ ๋๋ฉ์ด์ โ ์ ์ง ์์ธ๋ง ๊ทธ๋ฆฐ๋ค.
- ํฌ๋ฆฝ ๊ฐ์ฅ์๋ฆฌ ๋ชจ์ โ ๊ฒ์๊ณผ ๊ฒฝ๊ณ๊ฐ ๋ค๋ฅด๋ค. ํผ์ง๋ ๊ท์น์ด ์คํ ํ์ผ ์์ ์๋ค.
- ํธ์ง๊ธฐ ๊ป๋ฐ๊ธฐ ์ผ๋ถ โ ํ๋ฌ๊ทธ์ธ, ์ค๋ธ์ ํธ ํธ๋ฆฌ, ์ฐฝ ๋๋๊ธฐ, ์๋ ์ ์ฅ, ํ๋กํยท๋ชจ๋ ๋ฐ์ดํฐ.
๊น๋ญ๊ณผ ๋ค์ ๋ถ์ ์ค๋ง๋ฆฌ๋ ๋ฐฑ๋ก๊ทธ์ ์ ์ด ๋์๋ค.
Apple Silicon(M1/M2/M3/M4) ์์ ํ์ธํ ์ ์ฐจ๋ค. ๊ฒ์ฆ ํ๊ฒฝ: macOS 15 (Sequoia), Apple clang 21, CMake 4.4, Qt 6.11, arm64 ๋ค์ดํฐ๋ธ.
# 1. ์ฌ์ ์ค๋น โ Homebrew ๊ฐ ์ด๋ฏธ ์๋ค๊ณ ๊ฐ์ ํ๋ค
brew install cmake ninja qt
# 2. ์ค์
cmake -S . -B build -G Ninja
# 3. ๋น๋
cmake --build build
# 4. ์คํ
./build/src/ui/splash-editorXcode Command Line Tools ๊ฐ ํ์ํ๋ค (xcode-select --install).
ICU ๋ ๋ฐ๋ก ์ค์นํ์ง ์์๋ ๋๋ค. Qt ๊ฐ ์์กด์ฑ์ผ๋ก ๋์ด์ค๋ฉฐ, Homebrew ์
ICU ๋ keg-only ๋ผ CMake ๊ธฐ๋ณธ ๊ฒฝ๋ก์ ์์ผ๋ฏ๋ก ๋น๋ ์คํฌ๋ฆฝํธ๊ฐ brew --prefix
๋ก ์๋ ํ์งํ๋ค. ์๋ ํ์ง๊ฐ ์คํจํ๋ฉด ์ง์ ์ง์ ํ ์ ์๋ค:
cmake -S . -B build -G Ninja -DICU_ROOT=$(brew --prefix icu4c@78)Qt ๊ฐ ์๋์ผ๋ก ์ ์กํ๋ฉด:
cmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATH=$(brew --prefix qt)sudo apt install build-essential cmake ninja-build qt6-base-dev libicu-dev
cmake -S . -B build -G Ninja
cmake --build buildVisual Studio 2022 (C++20) ์ Qt 6 ๊ฐ ํ์ํ๋ค.
cmake -S . -B build -DCMAKE_PREFIX_PATH="C:/Qt/6.11.2/msvc2022_64"
cmake --build build --config RelWithDebInfo| ์ต์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
SPLASH_BUILD_GUI |
ON |
Qt GUI ๋ฅผ ๋น๋ํ๋ค. OFF ๋ฉด Qt ์์ด ์ฝ์ด+CLI ๋ง ๋น๋ |
SPLASH_BUILD_TESTS |
ON |
ํ ์คํธ๋ฅผ ๋น๋ํ๋ค |
์ฒซ ์ค์ ๋ ์์กด์ฑ์ ๋คํธ์ํฌ๋ก ๋ฐ์ผ๋ฏ๋ก ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ์ดํ ๋น๋๋ ์บ์๋๋ค.
./build/src/ui/splash-editor # ๋น ์ฐฝ์ผ๋ก ์์
./build/src/ui/splash-editor path/to.scx # ๋งต์ ์ด๊ณ ์์
# ํ์ผ์
์ ์ฐ๋ ค๋ฉด StarCraft ์ค์น ํด๋๊ฐ ํ์ํ๋ค.
# ํ ๋ฒ ์ง์ ํ๋ฉด ๊ธฐ์ตํ๋ฏ๋ก ๋ค์๋ถํฐ๋ ์๋ตํด๋ ๋๋ค.
./build/src/ui/splash-editor path/to.scx --install "/๊ฒฝ๋ก/StarCraft"์ค์น ํด๋๋ ๋ฉ๋ด ํ์ผ โบ StarCraft ์ค์น ํด๋ ์ง์ โฆ ์ผ๋ก๋ ๊ณ ๋ฅผ ์ ์๋ค.
์ง์ ํ์ง ์์ผ๋ฉด ์งํ ๋์ ์๋ด ๋ฌธ๊ตฌ๊ฐ ๋จ๊ณ , ๋๋จธ์ง ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๋์ํ๋ค.
์กฐ์:
| ์คํฌ๋กค | ์คํฌ๋กค๋ฐ ยท ํ |
| ํ๋ / ์ถ์ | โ+ / โ- ยท Ctrl+ํ |
| ์ค์ ํฌ๊ธฐ | โ0 |
| ์ ๋ ํ์ | โ1 |
| ๋ก์ผ์ด์ ํ์ | โ2 |
| ํฌ๋ฆฝ ํ์ | โ3 |
| ๊ฒฉ์ ํ์ | โG |
| ๋ณต์ฌ / ๋ถ์ฌ๋ฃ๊ธฐ | โC / โV |
| ์ ๋ ยท ๋ก์ผ์ด์ ์ ํ | ํด๋ฆญ (๊ฒน์น๋ฉด ์ ๋ ์ฐ์ ) |
| ์ด๋ | ๋๋๊ทธ |
| ์ ํ ํด์ | Esc |
| ์ ํ ์ญ์ | Delete |
| ์คํ ์ทจ์ / ๋ค์ ์คํ | โZ / โงโZ |
| ์ ํ / ์ ๋ ๋๊ธฐ / ์งํ ๋๊ตฌ | S / U / T |
| ํ์ผ ์ง๊ธฐ (์งํ ๋๊ตฌ) | Alt+ํด๋ฆญ |
| ํ์ผ ยท ์ ๋ ํ๋ ํธ | ๋๊ตฌ ๋ฉ๋ด (ํด๋น ๋๊ตฌ๋ฅผ ๊ณ ๋ฅด๋ฉด ์๋์ผ๋ก ์ด๋ฆผ) |
| ํธ๋ฆฌ๊ฑฐ ํธ์ง๊ธฐ | โงโT |
| ํธ๋ฆฌ๊ฑฐ ํ ์คํธ ๋ณด๊ธฐ | โT |
| ์ ๋งต | โN |
| ๋งต ์์ฑ | โI |
| ํ๋ ์ด์ด ์ค์ | โP |
| ๋ฌธ์์ด ํธ์ง๊ธฐ | โงโS |
CLI ๋ GUI ์์ด ์ฝ์ด๋ฅผ ๋๋๋ฆฌ๋ ๋๊ตฌ์ด์ ํ ์คํธ ํ๋ค์ค๋ค. ํ๋ฉด์์ ๋๋ ํธ์ง์ ๋ช ๋ น์ผ๋ก๋ ๋๋ค. ๋ช ๋ น์ ๊ฐ๋๋ก ๋ฌถ์ฌ ์๋ค.
./build/src/cli/splash-cli help # ๊ฐ๋ ๋ชฉ๋ก
./build/src/cli/splash-cli unit # ๊ทธ ๊ฐ๋์ ๋ช
๋ น| ๊ฐ๋ | ํ๋ ์ผ |
|---|---|
unit |
๋๊ธฐยท์ง์ฐ๊ธฐยท์ฎ๊ธฐ๊ธฐยท์์ฑยท๊ฒน์ณ ์๊ธฐยท์ ๋์จ ์๊ธฐ |
sprite |
๋๊ธฐยท์ง์ฐ๊ธฐยท์์ฑ |
doodad |
๋๊ธฐยท์ง์ฐ๊ธฐยท์งํ์ผ๋ก ํ๊ธฐยท์ด๊ธ๋ ๊ฒ ์ฐพ๊ณ ๊ณ ์น๊ธฐ |
location |
๋ง๋ค๊ธฐยท์ง์ฐ๊ธฐยท์ด๋ฆยทํฌ๊ธฐยท๋์ดยท์ํ ๋ค์ง๊ธฐ |
object |
์ ๋ยท์คํ๋ผ์ดํธยท๋๋๋ยท๋ก์ผ์ด์ ์ ๋ค๋ชจ์งธ ์ค๋ ค ๋ถ์ด๊ธฐ |
terrain |
์น ํ๊ธฐยท๋ณต์ฌยท๋ถ์ฌ๋ฃ๊ธฐยท๋์นญยทISOM ๋ธ๋ฌ์ |
fog |
๊ฐ๋ฆฌ๊ฐ ์น ํ๊ธฐยท์ผ๊ดยท๋ณต์ฌยท๋ถ์ฌ๋ฃ๊ธฐ |
map |
์ด๋ฆยท์ค๋ช ยทํฌ๊ธฐยทํ์ผ์ |
player force |
์ข ์กฑยท์ฌ๋กฏยท์ธ๋ ฅยท์, ๋๋งนยท์์ผ ๊ณต์ |
string switch preset |
๋ฌธ์์ดยท์ค์์นยทCUWP |
map encoding |
์ฝ๋ ํ์ด์ง๋ฅผ ๋ณด๊ณ , --encoding ์ผ๋ก ๋ค์ ์ฝ๊ธฐ |
unitdef upgrade tech |
๋งต์ด ์ ํ๋ ๋ฅ๋ ฅ์นยท๋น์ฉ |
scenario |
๋ฆฌ๋น๋ฌยท์์ ์๊ธฐยท๋งต ๋ฐ ์น์ฐ๊ธฐยท๋ณดํธ ํด์ ยท๋งต ๊ทธ๋ฆผ |
sound |
๋ฃ๊ธฐยท๋นผ๊ธฐยท๊บผ๋ด๊ธฐ |
trigger briefing |
ํ ์คํธ๋ก ๋ฝ๊ณ ๋๋๋ ค ๋ฃ๊ธฐ, ๋ํ๊ธฐยท์ง์ฐ๊ธฐยท๋ฒ ๋ผ๊ธฐยท์คํ ํ๋ ์ด์ด, ์ธ์ ํ๋๋ง ๊ณ ์น๊ธฐ |
eud |
์ฃผ์ โ EPD, ์คํ์ ํ ์ฐพ๊ธฐ, ๋งต ์ EUD ํ๊ธฐยท๊ฐ๋ ค๋ด๊ธฐ, ์กฐ๊ฑดยท๋์ ๋ฃ๊ธฐ, euddraft ๋น๋ |
๊ณ ์น๋ ๋ช
๋ น์ ์ ์ฅํ ๊ณณ์ ๋ฐ๋์ ๋ฐ๋๋ค โ -o <์ถ๋ ฅ๋งต> ์ด๊ฑฐ๋
--in-place. ์๋ณธ์ ๋ง์์ด ๋ฎ์ด์ฐ์ง ์๋๋ค. --in-place ๋ ์์ ๋จผ์ ์ฐ๊ณ
๋ฐ๊ฟ์น๊ธฐํ๋ฏ๋ก, ์ฐ๋ค ๋ฉ์ถฐ๋ ์๋ณธ์ด ๋จ๋๋ค. ์ ์ฅํ ๋ค์์๋ ์ ์ฅ๋ณธ์ ๋ค์
์ด์ด ํ์ธํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ ์ค๋ก ์ฐ๋๋ค.
# ์ ๋์ ์ด๋ฆ์ผ๋ก ๋๊ธฐ (๋ฒํธ๋ก๋ ๋๋ค). ์ขํ๋ ํฝ์
, --tiles ๋ฉด ํ์ผ
splash-cli unit place map.scx "Terran Marine" 50 30 --tiles --owner 1 -o out.scx
# ์์ฑ ๋ฐ๊พธ๊ธฐ
splash-cli unit set map.scx 34 --owner 3 --hp 50 --cloaked on -o out.scx
# ๋ก์ผ์ด์
๋ง๋ค๊ณ ๋์ด ์กฐ๊ฑด ์ฃผ๊ธฐ
splash-cli location add map.scx 10 10 20 20 --tiles --name "์ํํฐ" -o out.scx
splash-cli location elevation out.scx 1 ์ ์ง๋,๊ณ ๊ณต --in-place
# ์งํ์ ๋ฒ ๊ปด ๋์๋ค๊ฐ ๋ค๋ฅธ ์๋ฆฌ์ ๋ถ์ด๊ธฐ
splash-cli terrain copy map.scx 10 10 6 3 patch.tiles --no-doodads
splash-cli terrain paste map.scx 40 40 patch.tiles -o out.scx
# ์ผ์ชฝ ์ ๋ฐ์ ์ค๋ฅธ์ชฝ์ ๊ฑฐ์ธ์ฒ๋ผ ๋ฒ ๋ผ๊ธฐ
splash-cli terrain mirror map.scx horizontal -o out.scx
# ๋ณธ์ง์ ํต์งธ๋ก ์ค๋ ค ๋ค๋ฅธ ์๋ฆฌ์ ๋ถ์ด๊ธฐ (์ ๋์จยท๋์ด๋์ค ์ฐ๊ฒฐ๋ ๋ฐ๋ผ์จ๋ค)
splash-cli object copy map.scx 0 0 20 20 base.objects
splash-cli object paste map.scx 40 40 base.objects --install "/๊ฒฝ๋ก/StarCraft" -o out.scx
# ๋งต ์ ์ฒด๋ฅผ ๋ฆฌ๋น๋ฌ๋ก ๋ฎ๊ธฐ
splash-cli scenario revealers map.scx --owner 1 --spacing 16 -o out.scx
# ์กฐ๊ฑดยท๋์์ ๋ฑ๊ฐ๋ก (์ข
๋ฅ ๋ฒํธ๋ trigger types ๋ก ๋ณธ๋ค)
splash-cli trigger types map.scx condition --install "/๊ฒฝ๋ก/StarCraft"
splash-cli trigger set-type map.scx condition 0 1 23 -o out.scx
splash-cli trigger line-enabled map.scx action 0 0 off -o out.scx
# ์ธ์๋ ์(์ญ์งยท0x 16์ง)๋ก๋, ์ด๋ฆ์ผ๋ก๋ ๋ฃ๋๋ค
splash-cli trigger set-arg map.scx action 0 0 0 "Player 3" --install "/๊ฒฝ๋ก/StarCraft" -o out.scx
splash-cli trigger set-arg map.scx condition 0 0 3 "at most" --install "/๊ฒฝ๋ก/StarCraft" -o out.scx์ด๋ฆ์ผ๋ก ๋ชป ์ฐพ์ผ๋ฉด ๊ณ ๋ฅผ ์ ์๋ ๊ฒ์ ํจ๊ป ๋ณด์ฌ ์ค๋๋ค. ๊ทธ ๋ชฉ๋ก์ด ๊ณง "์ด
์๋ฆฌ์ ์ด๋ฆํ๊ฐ ๋ถ์ ๊ฐ" ์ ์ ๋ถ์
๋๋ค โ ์ด๋ฆํ๊ฐ ์๋ ๊ฐ(๋น๊ต์ Setยท
NotSet ๋ฑ)์ ์๋ก ๋ฃ์ต๋๋ค.
์งํยท์ ๋์ ๊ฐ์ ๋ผ์ด ๋ชจ๋ ๋งต์ --mod <mpq> ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฃผ๋ฉด ์ค์น๋ณธ๋ณด๋ค
๋จผ์ ๋ค์ง๋๋ค โ ์์ ์ ์ ๊ฒ์ด ์ฐ์ ํฉ๋๋ค.
๊ธ์๊ฐ ๊นจ์ ธ ๋ณด์ด๋ฉด ์ฝ๋ ํ์ด์ง ์๋ ํ๋ณ์ด ํ๋ฆฐ ๊ฒ์ ๋๋ค. CHK ์๋ ์ฝ๋ ํ์ด์ง ์นธ์ด ์์ด์ ๋งต์ ์ ์ฅํด ๋ ์ ์๊ณ , ์ฝ๊ณ ์ธ ๋๋ง๋ค ์๋ ค ์ค์ผ ํฉ๋๋ค.
splash-cli map encoding map.scx --encoding cp949 # ์ด๋ ๊ฒ ์ฝ์ผ๋ฉด ๋ง๋์ง ๋ณธ๋ค
splash-cli string set map.scx 1 "์ ๊ธ์" --encoding cp949 -o out.scx์ง๋จยท๊ฒ์ฆ ๋ช ๋ น์ ๊ฐ๋ ์์ด ๊ทธ๋๋ก ์ด๋ค.
# ๋ฉํ๋ฐ์ดํฐ ๋ณด๊ธฐ
./build/src/cli/splash-cli info map.scx
# round-trip ๊ฒ์ฆ โ ์ด๊ณ ์ ์ฅํ ๋ค CHK ๋ฐ์ดํธ๋ฅผ ๋น๊ตํ๋ค
./build/src/cli/splash-cli roundtrip map.scx
# ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ๋จ๊ธฐ๊ธฐ (๊ฒ์์์ ์ด์ด ๋ณด๋ ค๋ฉด ์ด์ชฝ)
./build/src/cli/splash-cli roundtrip map.scx /๊ฒฝ๋ก/Maps/์ฌ์ ์ฅ๋ณธ.scx
# ์๋๋ฆฌ์ค ์ฒญํฌ๋ง ๊บผ๋ด๊ธฐ
./build/src/cli/splash-cli chk map.scx scenario.chk
# ๋น ๋งต ๋ง๋ค๊ธฐ (ํ์ฅ์๋ก ํฌ๋งท ๊ฒฐ์ : .scm=ํ์ด๋ธ๋ฆฌ๋, .scx=๋ธ๋ฃจ๋์)
# --install ์ ์ฃผ๋ฉด ๊ณ ๋ฅธ ์งํ์ผ๋ก ๋ฐ๋ฅ์ ์ฑ์ด๋ค. ์ฃผ์ง ์์ผ๋ฉด ํ์ผ์ด 0 ์ผ๋ก
# ๋จ์ terrain isom ์ด ์๋ฌด๊ฒ๋ ๋์ง ๋ชปํ๋ค.
./build/src/cli/splash-cli new new.scx 128 128 4 --melee \
--install "/๊ฒฝ๋ก/StarCraft" --terrain Dirt
# ๊ฒ์ ์ค์น๋ณธ ์กฐ์ฌ โ ์์นด์ด๋ธ ์ข
๋ฅ์ ํ์ผ์
๋ฐ์ดํฐ ์ ๋ฌด๋ฅผ ํ์ธํ๋ค
./build/src/cli/splash-cli assets "/๊ฒฝ๋ก/StarCraft"
# ์งํ์ ์ด๋ฏธ์ง๋ก ๋ฝ๊ธฐ (ํ์ผ์
๋์ฝ๋ฉ ๊ฒ์ฆ์ฉ, PPM ์ถ๋ ฅ)
./build/src/cli/splash-cli render map.scx "/๊ฒฝ๋ก/StarCraft" out.ppm
# ์ ๋ยท๋ก์ผ์ด์
ยทํฌ๋ฆฝ์ ๊ฒน์ณ ๊ทธ๋ฆฌ๊ธฐ
./build/src/cli/splash-cli render map.scx "/๊ฒฝ๋ก/StarCraft" out.ppm --units --locations --creep
# ์ ๋ ํ๋๋ง ๊ฒ์ฆ์ฉ์ผ๋ก ๋ฝ๊ธฐ (๊ฒฉ์ยท๊ฒฝ๊ณยท์ค์ฌ ํ์)
./build/src/cli/splash-cli unit-image "/๊ฒฝ๋ก/StarCraft" 176 out.ppm 0 0 1500
# ํ์ผ์
์กฐ์ฌ / ํ์ผ ์ํธ ๋ฝ๊ธฐ
./build/src/cli/splash-cli tileset-info "/๊ฒฝ๋ก/StarCraft" 4
# ๋จํ ํ์ผ ์ฐพ๊ธฐ โ ISOM ๋ธ๋ฌ์์๋ ๋จํ๊ฐ ์์ด์ ํ์ผ์ ์ง์ ์ฐ์ด์ผ ํ๋ค
./build/src/cli/splash-cli tileset-ramps "/๊ฒฝ๋ก/StarCraft" 4
./build/src/cli/splash-cli tile-sheet "/๊ฒฝ๋ก/StarCraft" 4 0 16 sheet.ppm์์ ์ด๋ฆ(move-unit, place-isom, set-triggers, units, triggers โฆ)๋
๊ทธ๋๋ก ๋ฐ๋๋ค. ์ ์ด๋ฆ์ ๊ฐ๋ ์ชฝ์ด๋ค.
ํ๋กฌํํธ ์ง์๋ก ๋งต์ ๋ง๋๋ ์์ด์ ํธ ์คํฌ์ด .agents/skills/ ์ ์๋ค.
Claude Code ๋ .claude/skills/ ๋ง ๋ค์ง๋ฏ๋ก .claude ๋ฅผ .agents ๋ก
์๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋์๋ค. ์๋งน์ด๋ .agents ์ชฝ ํ ๊ณณ๋ฟ์ด๋ค.
export SC_INSTALL=/๊ฒฝ๋ก/StarCraft
# ๋ฐ๋ฆฌ๋งต ๋ผ๋ โ ๋์นญ ์คํํ
, ๋ณธ์ง ๊ณ ์ง๋, ๋จํ, ์๋ง๋น, ๋ฐ๊นฅ ๋ฉํฐ
python3 .agents/skills/starcraft-map-melee/scripts/make_melee.py out.scx --players 4 --tileset jungle
# ์ ์ฆ๋งต ๋ผ๋ โ ์ฅ๋ฅด์ ๋ง๋ ํธ๋ฆฌ๊ฑฐ ๊ณ ๋ฆฌ๊น์ง
python3 .agents/skills/starcraft-map-usemap/scripts/make_usemap.py out.scx --config profile.json
# ์ฌ๊ธฐ (์๋ฆฌ ๋ฐธ๋ฐ์ค + ์ข
์กฑ ๋ฐธ๋ฐ์ค ๊ธฐ์ธ๊ธฐ) ์ ๊ทธ๋ ค ๋ณด๊ธฐ
python3 tools/mapgen/verify_map.py out.scx
python3 tools/mapgen/preview.py out.scx look.png์คํฌ์๋ ๊ณต์ ๋ฆฌ๊ทธ ๋งต 56๊ฐ์ ์ธ๊ธฐ ์ ์ฆ๋งต 93๊ฐ๋ฅผ ์ค์ ๋ก ๋ฏ์ด ์ฐ ๊ฐ์ด ํจ๊ป ๋ค์ด ์๋ค โ ๋ณธ์ง ๋ฏธ๋ค๋ 9๊ฐยท๊ฐ์ค 1๊ฐ, ๋ฏธ๋ค๋ 1500ยท๊ฐ์ค 5000, 2์ธ์ฉ์ ์์ธ ์์ด 180๋ ํ์ ๋์นญ, ์ ์ฆ๋งต ํธ๋ฆฌ๊ฑฐ ์ค์๊ฐ 153๊ฐ ๊ฐ์ ๊ฒ๋ค์ด๋ค. ์ข ์กฑ ๋ฐธ๋ฐ์ค๋ฅผ ์ด๋ ์์ก์ด๋ก ๊ธฐ์ธ์ด๋์ง๋ ๊ทผ๊ฑฐ์ ํจ๊ป ์ ์ด ๋์๋ค.
EUDยท๋นํ์ค ํฌ๊ธฐยทunused unit ์ฒ๋ผ ํ๋ณธ์ ํ๊ฑฐ๋ ์ํํ ๊ฒ์ ์ฐ๊ธฐ ์ ์ ์ฌ์ฉ์์๊ฒ ๋ฌป๋๋ก ๋์ด ์๊ณ , ํ๋ ์ด์ด ์ปดํจํฐ์ ํด๋ฅผ ๋ผ์น ์ ์๋ EUD ์๊ตฌ๋ ๊ฑฐ์ ํ๋ค.
EUD(Extended Unit Death)๋ ์ ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋๋ค. Deaths ์กฐ๊ฑด์ ํ๋ ์ด์ด
์๋ฆฌ์ ํ๋ ์ด์ด์ผ ์ ์๋ ํฐ ์๋ฅผ ๋ฃ์ผ๋ฉด ๊ฒ์์ด Deaths ํ ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ
์ฝ๋๋ค. MappingCore ๋ ๊ทธ๊ฒ์ Memory / Memory Masked ๋ผ๋ ๊ฐ์ ์ข
๋ฅ๋ก
๋ค๋ฃจ๊ณ , ์ฐ๋ฆฌ๋ ๊ฐ์ ์ฃ๋๋ฅผ ์ด๋ค โ ํ๋ ์ด์ด ์๋ฆฌ๊ฐ 28 ์ ๋์ผ๋ฉด EUD ๋ค.
Deaths ํ๋ ์ ๋ ๋ฐ๊นฅ, ํ๋ ์ด์ด ์์ชฝ์ด๋ค. P1 ๋ง๋ฆฐ, P2 ๋ง๋ฆฐ, โฆ P12 ๋ง๋ฆฐ, P1 ๊ณ ์คํธ โฆ ๊ผด๋ก, ํ ์ ๋์ด 48๋ฐ์ดํธ(12 x 4)๋ฅผ ์ฐจ์งํ๊ณ ๊ทธ๋ฐ ํญ๋ชฉ์ด 228๊ฐ๋ค.
์ฃผ์ = 0x0058A364 + 4 x (์ ๋ x 12 + ํ๋ ์ด์ด)
EPD = (์ฃผ์ - 0x0058A364) / 4 (๋ถํธ ์๋ ๋๋์
)
๋๋์ ์ ๋ถํธ ์์ด ํ๋ฉด ์ ๋๋ค. Deaths ํ๋ณด๋ค ์์ธ ์๋ฆฌ๋ ๊ฑฐ๋ฆฌ๊ฐ ์์์ธ๋ฐ, ๋ถํธ ์์ด ๋๋๋ฉด ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ค๋ฅธ ๋ต์ด ๋์จ๋ค. eudplibยทEUD Bookยท SCMDraft ๊ฐ ๋ชจ๋ ๋ถํธ ์๋ ์ชฝ์ ์ด๋ค (๋ฏธ๋ค๋์ EPD โ11421).
ํ ๋ฐ์ ๊ฐ๋ฆฌํฌ ๋๋ ์ ๋์ 0 ์ผ๋ก ๋๊ณ ํ๋ ์ด์ด ์๋ฆฌ์ EPD ๋ฅผ ํต์งธ๋ก ๋ฃ๋๋ค.
๊ฒ์์ด ์ ๋ x 12 + ํ๋ ์ด์ด ๋ฅผ 32๋นํธ๋ก ๊ฐ์ ์ธ๋ฏ๋ก ๊ฐ์ ์๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ,
euddraftยทSCMDraft ์ Memory ํ๊ธฐ์๋ ๊ฐ๋ค.
๋ถ๋ฐ์ด๋ก 165๊ฐ๋ฅผ ๋ค๊ณ ์๋ค. ๋ ๊ฐ๋์์ ์๋ค.
- ์์ฃผ ์ฐ๋ 24๊ฐ๋ ์ฐ๋ฆฌ๊ฐ ์ฐ๋ฆฌ๋ง ์ด๋ฆ๊ณผ ์ค๋ช , ๋ฆฌ๋ง์คํฐ ์ง์ ์ฌ๋ถ๋ฅผ ๋ถ์ฌ ์ง์ ์ ์๋ค.
- ๋๋จธ์ง๋ eudplib ์
src/eudplib/scdata์์ ๋ฝ์๋ค โ DAT ํ(unitsยทweaponsยทflingyยทspritesยท imagesยทtechยทupgradesยทorders)์ ํ๋ ์ด์ด ์ํ๋ค. eudplib ์ MIT ๋ผ ๊ณ ์ง๋ฌธ๋ง ์งํค๋ฉด ๋๋ค. ๋ฝ๋ ์ผ์tools/gen_eud_offsets.py๊ฐ ํ๊ณ , ๋ง๋ค์ด์ง ํ๋src/io/eud_offsets_eudplib.inc์ ์๋ค. ์ฃผ์๊ฐ ๊ฒน์น๋ฉด ์ฐ๋ฆฌ๋ง ์ด๋ฆ ์ชฝ์ ๋จ๊ธด๋ค.
๋ ํ์ํ๋ฉด EUD Book(armoha/eud-book) ์ api.json ์ ๋ฐ์ ๊ฐ๋ฆฌํจ๋ค โ
900๊ฐ๊ฐ ๋๋ ์๋ฆฌ๋ฅผ ๋ฆฌ๋ง์คํฐ ์ง์ ์ฌ๋ถ(Simple Data / Supported /
Read Only / Unsupported โฆ)์ ํจ๊ป ์ด๋ค. ๊ทธ ๊ฐ์ eudplib ์ ์์ด์, ์๋ฆฌ๊ฐ
๋ฆฌ๋ง์คํฐ์์ ๋๋์ง ์ด์ดํ ๊ฐ๋ ค๋ด๋ ค๋ฉด ์ด ํ๊ฐ ํ์ํ๋ค.
๊ทธ ํ์ผ์ ๋ผ์ด์ ์ค๊ฐ ๋ฐํ์ ธ ์์ง ์์ ์ ์ฅ์์ ๋ฃ์ง ์๋๋ค. ์ฐ๋ ค๋ ์ฌ๋์ด ์ง์ ๋ฐ์ ๊ฐ๋ฆฌํจ๋ค. (LICENSE ๋ README ๋ ์๊ณ , ๋ด๊ธด ์ค๋ช ๋ฌธ์ด EUDDB ๊ณ์ด ๋ฌธ๊ตฌ๋ผ ์์์๊ฐ armoha ๊ฐ ์๋ ์ ์๋ค.)
๊ฒ์์ ๋ฐ์ดํธยท์๋ ๊ฐ์ ๋ค ๋ฐ์ดํธ ๊ฒฝ๊ณ์ ๋์ฌ ์์ง ์์ ๊ฒ์ด ํํ๋ค
(์ ๋ ์ 0x00581D76 ์ฒ๋ผ). Deaths ๋ ๋ค ๋ฐ์ดํธ ๋จ์๋ก๋ง ์ฝ๊ณ ์ฐ๋ฏ๋ก ๊ทธ๋ฐ
์๋ฆฌ๋ ๋ด๊ธด ์นธ์ ์ฝ๊ณ ๋นํธ๋ง์คํฌ๋ก ๊ฑฐ๋ฅธ๋ค โ Memory Masked ๊ฐ ์๋
๊น๋ญ์ด๋ค. ๊ณ์ฐ๊ธฐ์ eud addr ์ด ๋ด๊ธด ์นธ๊ณผ ๋ง์คํฌ๋ฅผ ํจ๊ป ์๋ ค ์ค๋ค.
$ splash-cli eud addr 0x581D76
์ฃผ์ : 0x00581D76
๋ค ๋ฐ์ดํธ ๊ฒฝ๊ณ๊ฐ ์๋๋๋ค โ ๋ด๊ธด ์นธ์ ๋ง์คํฌ์ ํจ๊ป ์ฝ์ผ์ธ์.
๋ด๊ธด ์นธ : 0x00581D74
๋ง์คํฌ : 0x00FF0000
์ด๋ฆ : ํ๋ ์ด์ด ยท unitColor
# ํ๋ฉด: ํธ๋ฆฌ๊ฑฐ โบ EUD ์ฃผ์ ๊ณ์ฐ๊ธฐโฆ โบ ์คํ์
ํ ๋ถ๋ฌ์ค๊ธฐโฆ
# (ํ ๋ฒ ๊ณ ๋ฅด๋ฉด ๋ค์์ ์ผค ๋๋ ๊ทธ๋๋ก ์ด๋ค. 'ํ ๋น์ฐ๊ธฐ' ๋ก ๋๋๋ฆฐ๋ค)
# CLI: --db ๋ก ๊ทธ๋๊ทธ๋ ๊ฐ๋ฆฌํค๊ฑฐ๋, ํ๊ฒฝ ๋ณ์๋ก ๋ถ๋ฐ์ ๋๋ค
export SPLASH_EUD_OFFSETS=~/eud-book/api.json
splash-cli eud offsets "hyper"
splash-cli eud addr 0x57F0F0
splash-cli eud list map.scx
splash-cli eud check map.scx --db ~/eud-book/api.json # ์ด๋๋ง ๋ค๋ฅธ ํ๋ฅผ ์ฐ๊ธฐeud check ๋ ๋งต์ด ๊ฑด๋๋ฆฌ๋ ์๋ฆฌ ๊ฐ์ด๋ฐ ๋ฆฌ๋ง์คํฐ์์ ์ ๋๋ ๊ฒ๊ณผ
์ฐ๊ธฐ๊ฐ ๋งํ ๊ฒ์ ๊ฐ๋ ค๋ธ๋ค. ์ฐ๊ธฐ๊ฐ ๋งํ ์๋ฆฌ์ ์ฐ๋ ๋งต์ ๋ฆฌ๋ง์คํฐ์์
์์ ์ด๋ฆฌ์ง ์๋๋ค.
epScript ๋ฅผ ์ปดํ์ผํด ๋งต์ ์น๋ ์ผ์ euddraft ๊ฐ ํ๋ค. ๊ทธ๊ฒ์ ๋ค์ ๋ง๋ค์ง ์๊ณ ๋ฐ๊นฅ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ถ๋ฅธ๋ค.
splash-cli eud build base.scx -o out.scx \
--script hello.eps \
--plugin eudTurbo \
--plugin "SCBank: bank=mybank, size=100"ํ๋ฌ๊ทธ์ธ์ ์ด๋ฆ ๋๋ ์ด๋ฆ: ํค=๊ฐ, ํค=๊ฐ ์ด๋ค. ํ๋ฉด์์๋ ํธ๋ฆฌ๊ฑฐ โบ
EUD ๋น๋ (euddraft)โฆ ์ด๊ณ ํ๋ฌ๊ทธ์ธ ์์์ ํ ์ค์ ํ๋์ฉ ๊ฐ์ ํ๊ธฐ๋ก
์ ๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์๋ก ๋ง๋ค๊ณ ๊ณ ์น๋ ๊ฒ๊น์ง ์ฐฝ ์์์ ๋๋ค.
--dry-run ์ ์ฃผ๋ฉด ๋๋ฆฌ์ง ์๊ณ ๋ง๋ค์ด์ง .eds ๋ฅผ ๊ทธ๋๋ก ์ฐ๋๋ค.
์์ ๋ ๊ฒ:
.eds๋ก ๋ถ๋ฅธ๋ค..edd๋ก ๋ถ๋ฅด๋ฉด euddraft ๊ฐ ํ์ผ์ ์ง์ผ๋ณด๋ ๋ฐ๋ชฌ์ผ๋ก ๋์ ๋๋์ง ์๋๋ค.- euddraft ๋ ๋งต ๋ณดํธ(freeze)๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ผ ๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ์ ๋์ผ๋ก ๋์๋ค
โ ๋ณดํธ๋ ๋งต์ ๋ค์ ์ด์ด ๊ณ ์น ์ ์๋ค. ์ผ๋ ค๋ฉด
--freeze. - euddraft ๊ฐ ๋ฑ๋ ๋งต์
scenario.chk๋ฅผ ๋ก์ผ์ผ๋ก ์จ๊ธด๋ค. ์ค๋ฆฝ ๋ก์ผ์ผ์๋ 0๋ฐ์ดํธ์ง๋ฆฌ ๋ฏธ๋ผ๋ฅผ ๋๊ณ ์์ด(1033) ๋ก์ผ์ผ์ ์ง์ง๋ฅผ ๋ฃ๋๋ค. ์ฐ๋ฆฌreadScenarioChk๋ ์ค๋ฆฝ ์ชฝ์ด ๋น์์ผ๋ฉด ๋ก์ผ์ผ์ ํ๋๋ค. - ์ฐ์ถ๋ฌผ์ ๋งค๋ฒ ๋ค๋ฅด๋ค. eudplib ์ด ํ์ด๋ก๋ ์๋ฆฌ๋ฅผ ์๋๋ค โ ์ด ๋งต๋ค์ CHK ๋ฐ์ดํธ๋ก ๊ฒฌ์ค ์ ์๋ค. ํธ์ง์ฉ ๋งต๊ณผ ๋ฐฐํฌ์ฉ ๋งต์ ๊ฐ๋ผ ๋๋ ํธ์ด ๋ง๋ค.
- macOS ๋ฐฐํฌ๋ณธ 0.11.0.1 ์ ๋ณดํธ๋ฅผ ์ผ๋ฉด ๋งต์ ๋ค ์ด ๋ค
freezeMpq์์์ SIGBUS ๋ก ์ฃฝ๋๋ค(์ฐ์ถ๋ฌผ์ ๋ฉ์ฉกํ๋ค). ์ ์คํธ๋ฆผ PR #178 ์ด ๋ฆด๋ฆฌ์ค ๋ค์ ๊ณ ์ณค์ผ๋ฏ๋ก ๋ค์ ํ์์๋ ์์ด์ง ๊ฒ์ด๋ค. ๋ณดํธ๋ฅผ ๋๋ฉด ๊ฒช์ง ์๋๋ค.
์ฐพ๋ ๊ณณ์ ํ๊ฒฝ ๋ณ์ SPLASH_EUDDRAFT, PATH, ๊ทธ๋ฆฌ๊ณ ํยท์์ฉ ํ๋ก๊ทธ๋จ
ํด๋์ euddraft* ์์ด๋ค. splash-cli eud which ๋ก ํ์ธํ๋ค.
| ๋ณ์ | ์ฐ์ |
|---|---|
SPLASH_EUDDRAFT |
euddraft ์คํ ํ์ผ์ด๋ ๊ทธ๊ฒ์ด ๋ ํด๋ |
SPLASH_EUD_OFFSETS |
EUD Book api.json ๊ฒฝ๋ก (CLI ์์ --db ๋์ ) |
ctest --test-dir build --output-on-failureํ ์คํธ๋ ๋ ์ธต์ผ๋ก ๋๋๋ค.
- ํฉ์ฑ ๋งต โ ์ฝ์ด๊ฐ ์ง์ ๋ง๋ ๋งต์ผ๋ก round-trip ์ ๋๋ค. ์ ์๊ถ ์๋ฃ๊ฐ ์์ด๋ CI ์์ ํญ์ ๋์๊ฐ๋ค.
- ์ค์ ๋งต โ
tests/maps/์ ๋ฃ์ด ๋ ๋งต์ด ์์ผ๋ฉด ์ ๋ถ ๊ฒ์ฆํ๋ค. ๋น์ด ์์ผ๋ฉด ๊ฑด๋๋ฐ์๋ค๊ณ ๋ถ๋ช ํ ์ถ๋ ฅํ๋ค. ํฉ์ฑ ๋งต๋ง์ผ๋ก ํต๊ณผํ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ๋งต ๊ฒ์ฆ์ผ๋ก ์ฐฉ๊ฐํ์ง ์๊ธฐ ์ํด์๋ค.
์ค์ ๋งต์ ๋ฃ๋ ๋ฐฉ๋ฒ์ tests/maps/README.md ์ฐธ๊ณ .
์ค์ ๋งต ์ปฌ๋ ์ 966๊ฐ(1MB ๋ฏธ๋ง)๋ก ๊ฒ์ฆํ ๊ฒฐ๊ณผ๋ค.
| ๋งต ์ข ๋ฅ | CHK ๋ฐ์ดํธ ๋ณด์กด |
|---|---|
| ๋๋ ยท ๊ณต์ ๋งต | 100 / 100 (100%) |
| Enslavers ์บ ํ์ธ | 10 / 10 (100%) |
| Precursor ์บ ํ์ธ | 6 / 6 (100%) |
| Custom | 11 / 11 (100%) |
| ๋ฐฐํฌ ์ ์ฆ๋งต | 397 / 744 (53%) |
๊ท๊ฒฉ์ ์งํค๋ ๋งต์ ์ ๋ถ ๋ฐ์ดํธ ๋จ์๋ก ๋ณด์กด๋๋ค. ์คํจ๋ ๋ชจ๋ ๋ฐฐํฌ ์ ์ฆ๋งต์ ๋ชฐ๋ ค ์์ผ๋ฉฐ, ์์ธ์ ์ฐ๋ฆฌ ์ชฝ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๊ทธ ๋งต๋ค์ด ์๋์ ์ผ๋ก CHK ๊ท๊ฒฉ์ ๋ฒ์ด๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ธ๋ ์ ํ:
- ๋ถํ๋ฆฐ STR/STRx โ ๋ฌธ์์ด ์น์ ์ด 9~15MB. ์ค์ ์ฐ์ด๋ ๋ฌธ์์ด์ ์ผ๋ถ๋ฟ
- ๊ฐ์ง ์ค๋ณต ์น์ โ ํ ๋งต์ ์น์ ํญ๋ชฉ์ด 414๊ฐ(์ ์์ 28๊ฐ ์ํ). CHK ๋ ๊ฐ์ ์น์ ์ด ์ฌ๋ฌ ๋ฒ ๋์ค๋ฉด ๋ค์ฃ๊ฒ์ด ์ด๊ธฐ๋ฏ๋ก, ์์ชฝ์ ์ฐ๋ ๊ธฐ๋ฅผ ๊น์ ์๋ํฐ๋ฅผ ํผ๋์ํจ๋ค
- ์๋ฆฐ MTXM โ ์งํ ๋ฐ์ดํฐ๋ฅผ ๋งต ํฌ๊ธฐ๋ณด๋ค ์๊ฒ ๋ฃ๋๋ค. ๊ฒ์์ ๋๋จธ์ง๋ฅผ 0 ์ผ๋ก ์ฑ์ฐ์ง๋ง, ๋ค์ ์ธ ๋๋ ์ ์ ํฌ๊ธฐ๊ฐ ๋๋ค
- ๊ท๊ฒฉ ์ด๊ณผ ์ ์ธ โ STR ์ ๋ฌธ์์ด 65536 ๊ฐ ์ ์ธ(์ต๋ 32766), VER ์น์ ๋๋ฝ ๋ฑ. ์ด๋ฐ ๋งต์ ์ ์ฅ ์์ฒด๋ฅผ ๊ฑฐ๋ถํ๋ค
์ด๋ฐ ๋งต์ ๋ค์ ์ธ ๋ ๋ฐ์ดํธ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ ์ ๊ทํ์ด์ง ์์์ด ์๋๋ค. ๋ค๋ง ๊ฒ์์์ ์ด๋ฆฌ๋์ง๋ ๋ณ๊ฐ ๋ฌธ์ ์ด๋ฏ๋ก, ์ ์ฆ๋งต์ ํธ์งํ ๊ณํ์ด๋ผ๋ฉด ์ ์ฅ๋ณธ์ ๊ฒ์์์ ํ์ธํด์ผ ํ๋ค.
์ฐธ๊ณ ๋ก MappingCore ์ isProtected() ๋ ์ด ํ๋ณ์ ์ธ ์ ์๋ค โ ์
์ ํ์ ๋งต๋ค์ด ์ ๋ถ "๋ณดํธ ์๋"์ผ๋ก ๋ณด๊ณ ๋๋ค. ๊ทธ๋์ ์ ๋ณด ํ์์๋ง ์ด๋ค.
๋งต ํ์ผ ์ ์ฒด๊ฐ ์๋๋ผ ๊ทธ ์์ CHK(์๋๋ฆฌ์ค ์ฒญํฌ) ๋ฐ์ดํธ๋ฅผ ๋น๊ตํ๋ค. MPQ ์ปจํ ์ด๋๋ ํด์ ํ ์ด๋ธ ๋ฐฐ์น๋ ์์ถ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์์ด ๋ด์ฉ์ด ๊ฐ์๋ ๋ฐ์ดํธ๊ฐ ๋ฌ๋ผ์ง๋ค. ๋ณด์กดํด์ผ ํ๋ ๊ฒ์ ์๋๋ฆฌ์ค ๋ฐ์ดํฐ๋ค.
src/
io/ MappingCore ๋ฅผ ๊ฐ์ธ๋ ์์ I/O ๊ณ์ธต (Qt ์์)
map_archive ๋งต ์ด๊ธฐ/์ ์ฅ, ๊ตฌ์ญ๋ณ ์ฝ๊ธฐยท์ฐ๊ธฐ
game_assets ์ค์น๋ณธ ์กฐ์ฌ (CASC / MPQ)
game_graphics ์งํยท์ ๋ยท์์ด์ฝ ๊ทธ๋ฆฌ๊ธฐ, ๊ฒ์ ์๋ฃ ์ฝ๊ธฐ
text_encoding CHK ๋ฌธ์์ด์ ์ฝ๋ ํ์ด์ง ๊ฐ๋ฆฌ๊ธฐ
chk/ MapDocument โ ์ด๋ฆฐ ๋งต + ๊ณ ์นจ ํ์ + ์คํ ์ทจ์ (Qt ์์)
ui/ Qt Widgets GUI โ ๋งต ์ฐฝ, ํ๋ ํธ, ํธ์ง๊ธฐ ์ฐฝ๋ค
cli/ ์ปค๋งจ๋๋ผ์ธ ํ๋ฐํธ์๋
tests/ round-trip ํ
์คํธ
cmake/ ์์กด์ฑ ์ทจ๋, MappingCore ๋น๋ ์ ์
๋งต ์บ๋ฒ์ค๋ ๋ณด์ด๋ ์์ญ์ ํ์ผ๋ง ๊ทธ๋ฆฐ๋ค. ๋งต ์ ์ฒด๋ฅผ ํ ์ฅ ์ด๋ฏธ์ง๋ก ๋ง๋ค๋ฉด 256x256 ๋งต์ด 8192x8192 ํฝ์ , RGBA ๋ก 268MB ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ผ ๊ทธ๋ฆผ์ ํ์ผ ID ๋ณ๋ก ์บ์ํ๋ค โ ๋งต ํ๋๊ฐ ์ฐ๋ ๊ณ ์ ํ์ผ์ ๋ณดํต ์๋ฐฑ~์์ฒ ๊ฐ๋ค.
ํ์ผ ํ๋(32x32)๋ฅผ ๊ทธ๋ฆฌ๋ ๊ฒฝ๋ก๋ ์ ๋ถ MappingCore ๊ฐ ํ์ฑํ ์๋ฃ๋ฅผ ์ด๋ค:
tileId -> CV5 ํ์ผ ๊ทธ๋ฃน -> VX4 ๋ฉ๊ฐํ์ผ -> VR4 ๋ฏธ๋ํ์ผ(8x8) -> WPE ํ๋ ํธ
์ ๋ ์คํ๋ผ์ดํธ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ผ๊ฐ๋ค:
unitType -> units.dat(flingy) -> flingy.dat(sprite) -> sprites.dat(image)
-> images.dat(GRP) -> GRP ํ๋ ์ ๋์ฝ๋ฉ
GRP ์ ํ ์์ถ ๊ท์ฝ(ํฌ๋ช
/๋จ์/์ผ๋ฃฉ ๋ผ์ธ)์ MappingCore ์ Sc::Sprite::PixelLine
์ด ์บก์ํํ ๊ฒ์ ๊ทธ๋๋ก ์ด๋ค. ํ๋ ์ด์ด ์์ ํ๋ ํธ ์ธ๋ฑ์ค 8-15 ๊ตฌ๊ฐ์
tunit.pcx ์ ํ๋ ์ด์ด๋ณ 8์ ๊ทธ๋ผ๋ฐ์ด์
์ผ๋ก ๋ฐ๊ฟ ๋ฃ์ด ํํํ๋ค.
์คํ๋ผ์ดํธ๋ (์ ๋ ํ์ , ์์ ์, ์์๋ ๊ตฌ๊ฐ) ์กฐํฉ์ผ๋ก ์บ์ํ๋ค.
๋งต ์คํ๋ผ์ดํธ(THG2)๋ ๊ฐ์ ๊ฒฝ๋ก๋ก ๊ทธ๋ฆฐ๋ค โ ์กํฐ ์ด๊ธฐํ๋ง ๋ค๋ฅด๊ณ ๋ ์ด์ด ํฉ์ฑ์ ์ ๋๊ณผ ๊ณต์ ํ๋ค.
์ ๋ ํ๋๋ ๋จ์ผ ์ด๋ฏธ์ง๊ฐ ์๋๋ผ ์ฌ๋ฌ ์ด๋ฏธ์ง ์ค๋ฒ๋ ์ด๋ก ๊ตฌ์ฑ๋๋ค
(๋ณธ์ฒด + ๊ทธ๋ฆผ์ + ๋ถ๊ฐ๋ฌผ). ๊ทธ ์กฐ๋ฆฝ์ iscript ๊ฐ ์ ํ๋ฏ๋ก MappingCore ์
AnimContext ๋ฅผ ๋๋ ค์ ์ป๋๋ค. ์ด ๊ณ์ธต์ OpenGL ์ ์์กดํ์ง ์์
QPainter ๊ฒฝ๋ก์์๋ ๊ทธ๋๋ก ์ธ ์ ์๋ค.
๊ทธ๋ฆผ์๋ ๋ฐฐ๊ฒฝ์ ์ด๋ก๊ฒ ํ๋ ํจ๊ณผ๋ค(dark.pcx ๋ "๋ฐฐ๊ฒฝ์ โ ์ด๋์ด ์"
๋งคํํ๋ค). ์คํ๋ผ์ดํธ๋ฅผ ๋ฐ๋ก ๊ทธ๋ฆฌ๋ ๊ตฌ์กฐ์์๋ ๋ฐฐ๊ฒฝ์ ๋ชจ๋ฅด๋ฏ๋ก ๋ฐํฌ๋ช
๊ฒ์ ์ผ๋ก ๊ทผ์ฌํ๊ณ , ํฉ์ฑํ๋ ์ชฝ์์ ์ํ๋ฅผ ์๋๋ค.
ํฌ๋ฆฝ ๊ฐ์ฅ์๋ฆฌ์ ๋ํ์ฌ. ํ์ผ์ ์๋ ํฌ๋ฆฝ ๊ฐ์ฅ์๋ฆฌ ์ ์ฉ ํ์ผ์ด ์๋ค. ๋ค ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ์ธํ๋ค.
images.tbl929๊ฐ ํญ๋ชฉ์ ํฌ๋ฆฝ ๊ด๋ จ ๊ทธ๋ํฝ์ด ์๋ค โ ๋ณ๋ ์คํ๋ผ์ดํธ๊ฐ ์๋๋ค- ํฌ๋ฆฝ ๋ฉ๊ฐํ์ผ์ 13์ข ๋ฟ์ด๊ณ ์ ๋ถ ๊ฐ๋ ์ฐฌ ์ง๊ฐ์ด๋ค (Jungle ๊ธฐ์ค 128~140, ์๋ค๋ ํยท๋์ด๋ค)
- ๊ทธ 13์ข ์ ๋น์ด ์๋(ํฌ๋ช ) ๋ฏธ๋ํ์ผ์ด ํ๋๋ ์๋ค โ ์งํ์ด ๋น์ณ ๋ณด์ด๋ ๋ฐํฌ๋ช ๊ฐ์ฅ์๋ฆฌ ํ์ผ์ด ์๋๋ค
- ํฌ๋ฆฝ์ ๋ฏธ๋ํ์ผ์ ํจ๊ป ์ฐ๋ ๋ค๋ฅธ ๋ฉ๊ฐํ์ผ์ ์ ๋ถ ์ฐพ์๋ดค์ง๋ง, ํยทํ๋ซํผยทํ ์ฒ๋ผ ์ด๋์ด ํ ์ค์ฒ๋ฅผ ์ฌ์ฌ์ฉํ ๊ฒ๋ค์ด์๋ค. Jungle ๊ณผ Badlands ๋ ๋ค ๊ฐ๋ค
์ฆ ํฌ๋ฆฝ ๊ฒฝ๊ณ๋ ํ์ผ ๋จ์์ด๋ฉฐ, ๊ฒ์๋ ๊ทธ๋ ๊ฒ ํผ๋จ๋ฆฐ๋ค. ์ฌ๊ธฐ์๋ ๊ฑด๋ฌผ๋ง๋ค ํ์์ผ๋ก ๋ฒ์๋ฅผ ์ก๊ณ ํ ๋๋ฆฌ๋ง ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๋ค โ ๊ฒ์๋ณด๋ค ๋งค๋๋ฌ์ด ์ชฝ์ด๋ค. ๊ฒ์์ ์ ํํ ํ์ฐ ํจํด์ ์คํ ํ์ผ ์์ ์์ด ๋ฐ์ดํฐ๋ก๋ ์ ์ ์๋ค.
์ง์ ํ์ธํ๋ ค๋ฉด: splash-cli images-tbl, mega-sheet, find-creep, creep-kin
ํฌ๋ฆฝ ๋ฐ๋ฅ ํ์ผ์ ํ์ผ์
์์ Creep ํ๋๊ทธ๊ฐ ์ ํ์ผ ๊ทธ๋ฃน์ ์ฐพ์ ์ด๋ค.
๊ทธ๋ฃน ์์์ ์ค์ ๋ฉ๊ฐํ์ผ์ด ๋ฐฐ์ ๋ ์นธ๋ง ๊ณ ๋ฅด๊ณ (๋จ๋ ์นธ์ 0 ์ผ๋ก ์ฑ์์ ธ
์๋ค), ์ขํ๋ฅผ ์์ด ๋ณํ์ ๊ณจ๋ผ ๊ฒฉ์ ์ค๋ฌด๋ฌ๊ฐ ์๊ธฐ์ง ์๊ฒ ํ๋ค.
์ฝ์ด์๋ Qt ํ์
์ด ์๋ค. splash_io ์ splash_core ๋ Qt ๋ฅผ ๋งํฌํ์ง
์์ผ๋ฉฐ, ํค๋์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์
๋ง ๋
ธ์ถํ๋ค. UI ๋ MapDocument ๋ง ์๊ณ ,
MapDocument ๋ UI ๋ฅผ ๋ชจ๋ฅธ๋ค.
MappingCore ํค๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก src/io/map_archive.cpp ์์๋ง ์กด์ฌํ๋ค.
chk.h ํ๋๊ฐ 90KB ๋ฅผ ๋๊ณ ๋ฆฌํ๋ ์
๋งคํฌ๋ก๋ฅผ ๋๊ณ ์ค๋ฏ๋ก, pimpl ๋ค์ ๊ฐ๋๋ค.
์ ๋ถ CMake FetchContent ๋ก ์ปค๋ฐ ํด์๋ฅผ ๊ณ ์ ํด ๊ฐ์ ธ์จ๋ค. ์์ค๋ฅผ ๋ณต์ฌํด
๋ฃ์ง ์์ผ๋ฏ๋ก ์
์คํธ๋ฆผ ์ด๋ ฅ์ ์ถ์ ํ ์ ์๊ณ , ๊ณ ์ ํด์๋ฅผ ์ฐ๋ฏ๋ก ์
์คํธ๋ฆผ
๋ณ๊ฒฝ์ผ๋ก CHK ํ์ฑ ๋์์ด ์กฐ์ฉํ ๋ฐ๋๋ ์ผ์ ๋ง๋๋ค.
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ฉ๋ | ๋ผ์ด์ ์ค |
|---|---|---|
| MappingCore (Chkdraft) | CHK ํ์ฑ ยท ๋งต ๊ตฌ์กฐ | MIT |
| StormLib | MPQ ์์นด์ด๋ธ (๋งต ํ์ผ) | MIT |
| CascLib | CASC ์์นด์ด๋ธ (๋ฆฌ๋ง์คํฐ ์ค์น๋ณธ ์์ ) | MIT |
| RareCpp | MappingCore ๊ฐ ์ฐ๋ ๋ฆฌํ๋ ์ | MIT |
| ICU | UTF-8 / UTF-16 ๋ณํ | Unicode-DFS-2016 |
| Qt 6 Widgets ยท Multimedia | GUI ยท ๋ฐฐ์น ์๋ฆฌ | LGPLv3 (๋์ ๋งํฌ) |
CHK ์ ์งํ ํ์ฑ์ MappingCore ๋ง ์ฌ์ฌ์ฉํ๋ค. ํ์๋ฅผ ์ง์ ๋ค์ ๋ง๋ค์ง ์๋๋ค.
Splash Editor ์์ฒด๋ MIT ๋ค. LICENSE ์ฐธ๊ณ .
Splash Editor ๋ Qt 6 ์ LGPLv3 ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๋ฉฐ, ๊ทธ ์๋ฌด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์งํจ๋ค.
- ๋์ ๋งํฌ๋ง ์ด๋ค. Qt ๋ฅผ ์ ์ ๋งํฌํ์ง ์๋๋ค. ๋น๋ ์คํฌ๋ฆฝํธ๊ฐ ์ ์ Qt ๋ฅผ
๊ฐ์งํ๋ฉด ์ค์ ๋จ๊ณ์์ ๋น๋๋ฅผ ์ค๋จํ๋ค (
src/ui/CMakeLists.txt). - Qt ๋ ์์ ํ์ง ์๋๋ค. ๋ฐฐํฌํ Qt ๋ฅผ ๊ทธ๋๋ก ์ด๋ค.
- ์ฌ์ฉ์๋ Qt ๋ฅผ ์์ ์ด ๊ณ ๋ฅธ ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ๊ต์ฒดํ ์ ์๋ค โ ๋์ ๋งํฌ์ด๋ฏ๋ก ํธํ๋๋ Qt 6 ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ๊ฟ ๋ฃ์ผ๋ฉด ๋๋ค.
Qt ์์ค ์ฝ๋ ๋ฐ๋ ๋ฒ. Qt ๋ LGPLv3 ์ ๋ฐ๋ผ ์์ค๋ฅผ ์ ๊ณต๋ฐ์ ๊ถ๋ฆฌ๋ฅผ ์ค๋ค.
- ๊ณต์ ๋ฐฐํฌ: https://download.qt.io/official_releases/qt/
- Git: https://code.qt.io/cgit/qt/qt5.git/
- Homebrew ๋ก ์ค์นํ๋ค๋ฉด:
brew fetch --build-from-source qt๊ฐ ์์ค tarball ์ ๋ฐ์ ์จ๋ค.brew edit qt๋ก ์ด๋ ๋ฒ์ ์ ์ฐ๋์ง ํ์ธํ ์ ์๋ค.
์ด ์ ์ฅ์๊ฐ ๋ฐฐํฌํ๋ ๋ฐ์ด๋๋ฆฌ์ ๋์ํ๋ ์ ํํ Qt ๋ฒ์ ์ ๋น๋ ์์ ์
qmake --version ์ถ๋ ฅ์ผ๋ก ํ์ธํ ์ ์๋ค.
- ๋ณดํธ๋ ๋งต โ ์ ์ค์ธก ๊ฒฐ๊ณผ ์ฐธ๊ณ . ๋ฌธ์์ด ์นธ์ ํ๊ณ ๋๋จธ๋ก ๋ถํ๋ ค ๋ ๋งต์ '๋ณดํธ ํด์ '๋ฅผ ๋จผ์ ํด์ผ ์ ์ฅ๋๋ค. ์์นด์ด๋ธ๋ฅผ ์์งํด ๋ ๋งต์ ํต์งธ๋ก ์๋ก ์จ์ ์ ์ฅํ๋ฉฐ, ์ด๋ฆ์ ์ ์ ์๋ ํ์ผ์ ์ฎ๊ธฐ์ง ๋ชปํ๋ค.
- ํฌ๋งท ๋ณํ ์์ โ ์ ์ฅ์ ์๋ณธ ๋ฒ์ ์ ์ ์งํ๋ค. ํ์ด๋ธ๋ฆฌ๋ ๋งต์ ๋ธ๋ฃจ๋์๋ก ๋ฐ๊พธ๋ ์์ ๋ณํ์ ์์ง ์๋ค(์๋์ ์ผ๋ก ๋บ๋ค โ ์๋ ๋ณํ์ด ์น์ ์ ์กฐ์ฉํ ๋ฐ๊พธ๊ธฐ ๋๋ฌธ์ด๋ค).
- Chkdraft โ ์ฝ์ด(MappingCore)๋ง ์ฌ์ฌ์ฉํ๋ค. UI ๋ ๋ณต์ฌํ์ง ์๋๋ค.
- ChkForge โ Qt ์ ์ฝ์ด๋ฅผ ์๋ ๋ฐฉ์์์ ์์ด๋์ด๋ง ์ฐธ๊ณ ํ๋ค.
- SCMDraft 2 โ ๋์๊ณผ ์ ์ฅ ๊ฒฐ๊ณผ์ ์ค๋ผํด. ์ฝ๋ ๊ณต๊ธ์์ด ์๋๋ฉฐ ์ญ๊ณตํํ์ง ์๋๋ค.
๊ฐ๋ฐ ๊ท์น๊ณผ ์ง์ผ์ผ ํ๋ ์ ์ฝ์ AGENTS.md ์ ์๋ค.