Skip to content

About

StarCraft: Brood War / Remastered map editor aiming for SCMDraft 2 feature parity

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

ย 

History

330 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Splash Editor

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 ๋„ ๊ทธ๋ ‡๋‹ค.
  • ์œ ๋‹› ์• ๋‹ˆ๋ฉ”์ด์…˜ โ€” ์ •์ง€ ์ž์„ธ๋งŒ ๊ทธ๋ฆฐ๋‹ค.
  • ํฌ๋ฆฝ ๊ฐ€์žฅ์ž๋ฆฌ ๋ชจ์–‘ โ€” ๊ฒŒ์ž„๊ณผ ๊ฒฝ๊ณ„๊ฐ€ ๋‹ค๋ฅด๋‹ค. ํผ์ง€๋Š” ๊ทœ์น™์ด ์‹คํ–‰ ํŒŒ์ผ ์•ˆ์— ์žˆ๋‹ค.
  • ํŽธ์ง‘๊ธฐ ๊ป๋ฐ๊ธฐ ์ผ๋ถ€ โ€” ํ”Œ๋Ÿฌ๊ทธ์ธ, ์˜ค๋ธŒ์ ํŠธ ํŠธ๋ฆฌ, ์ฐฝ ๋‚˜๋ˆ„๊ธฐ, ์ž๋™ ์ €์žฅ, ํ”„๋กœํ•„ยท๋ชจ๋“œ ๋ฐ์ดํ„ฐ.

๊นŒ๋‹ญ๊ณผ ๋‹ค์‹œ ๋ถ™์„ ์‹ค๋งˆ๋ฆฌ๋Š” ๋ฐฑ๋กœ๊ทธ์— ์ ์–ด ๋‘์—ˆ๋‹ค.


๋นŒ๋“œ

macOS (Apple Silicon)

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-editor

Xcode 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)

Linux

sudo apt install build-essential cmake ninja-build qt6-base-dev libicu-dev
cmake -S . -B build -G Ninja
cmake --build build

Windows

Visual 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 ํ…Œ์ŠคํŠธ๋ฅผ ๋นŒ๋“œํ•œ๋‹ค

์ฒซ ์„ค์ • ๋•Œ ์˜์กด์„ฑ์„ ๋„คํŠธ์›Œํฌ๋กœ ๋ฐ›์œผ๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ์ดํ›„ ๋นŒ๋“œ๋Š” ์บ์‹œ๋œ๋‹ค.


์‚ฌ์šฉ๋ฒ•

GUI

./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

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 โ€ฆ)๋„ ๊ทธ๋Œ€๋กœ ๋ฐ›๋Š”๋‹ค. ์ƒˆ ์ด๋ฆ„์€ ๊ฐˆ๋ž˜ ์ชฝ์ด๋‹ค.


AI ๋กœ ๋งต ๋งŒ๋“ค๊ธฐ

ํ”„๋กฌํ”„ํŠธ ์ง€์‹œ๋กœ ๋งต์„ ๋งŒ๋“œ๋Š” ์—์ด์ „ํŠธ ์Šคํ‚ฌ์ด .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

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 ๋Š” ๋งต์ด ๊ฑด๋“œ๋ฆฌ๋Š” ์ž๋ฆฌ ๊ฐ€์šด๋ฐ ๋ฆฌ๋งˆ์Šคํ„ฐ์—์„œ ์•ˆ ๋˜๋Š” ๊ฒƒ๊ณผ ์“ฐ๊ธฐ๊ฐ€ ๋ง‰ํžŒ ๊ฒƒ์„ ๊ฐ€๋ ค๋‚ธ๋‹ค. ์“ฐ๊ธฐ๊ฐ€ ๋ง‰ํžŒ ์ž๋ฆฌ์— ์“ฐ๋Š” ๋งต์€ ๋ฆฌ๋งˆ์Šคํ„ฐ์—์„œ ์•„์˜ˆ ์—ด๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

euddraft

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

ํ…Œ์ŠคํŠธ๋Š” ๋‘ ์ธต์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  1. ํ•ฉ์„ฑ ๋งต โ€” ์ฝ”์–ด๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ๋งต์œผ๋กœ round-trip ์„ ๋ˆ๋‹ค. ์ €์ž‘๊ถŒ ์ž๋ฃŒ๊ฐ€ ์—†์–ด๋„ CI ์—์„œ ํ•ญ์ƒ ๋Œ์•„๊ฐ„๋‹ค.
  2. ์‹ค์ œ ๋งต โ€” 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() ๋Š” ์ด ํŒ๋ณ„์— ์“ธ ์ˆ˜ ์—†๋‹ค โ€” ์œ„ ์œ ํ˜•์˜ ๋งต๋“ค์ด ์ „๋ถ€ "๋ณดํ˜ธ ์•„๋‹˜"์œผ๋กœ ๋ณด๊ณ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ •๋ณด ํ‘œ์‹œ์—๋งŒ ์“ด๋‹ค.

round-trip ์ด ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ

๋งต ํŒŒ์ผ ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ ์•ˆ์˜ 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 ๋Š” "๋ฐฐ๊ฒฝ์ƒ‰ โ†’ ์–ด๋‘์šด ์ƒ‰" ๋งคํ•‘ํ‘œ๋‹ค). ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ๋”ฐ๋กœ ๊ทธ๋ฆฌ๋Š” ๊ตฌ์กฐ์—์„œ๋Š” ๋ฐฐ๊ฒฝ์„ ๋ชจ๋ฅด๋ฏ€๋กœ ๋ฐ˜ํˆฌ๋ช… ๊ฒ€์ •์œผ๋กœ ๊ทผ์‚ฌํ•˜๊ณ , ํ•ฉ์„ฑํ•˜๋Š” ์ชฝ์—์„œ ์•ŒํŒŒ๋ฅผ ์„ž๋Š”๋‹ค.

ํฌ๋ฆฝ ๊ฐ€์žฅ์ž๋ฆฌ์— ๋Œ€ํ•˜์—ฌ. ํƒ€์ผ์…‹์—๋Š” ํฌ๋ฆฝ ๊ฐ€์žฅ์ž๋ฆฌ ์ „์šฉ ํƒ€์ผ์ด ์—†๋‹ค. ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์ธํ–ˆ๋‹ค.

  1. images.tbl 929๊ฐœ ํ•ญ๋ชฉ์— ํฌ๋ฆฝ ๊ด€๋ จ ๊ทธ๋ž˜ํ”ฝ์ด ์—†๋‹ค โ€” ๋ณ„๋„ ์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค
  2. ํฌ๋ฆฝ ๋ฉ”๊ฐ€ํƒ€์ผ์€ 13์ข…๋ฟ์ด๊ณ  ์ „๋ถ€ ๊ฐ€๋“ ์ฐฌ ์งˆ๊ฐ์ด๋‹ค (Jungle ๊ธฐ์ค€ 128~140, ์•ž๋’ค๋Š” ํ’€ยท๋Œ์ด๋‹ค)
  3. ๊ทธ 13์ข…์— ๋น„์–ด ์žˆ๋Š”(ํˆฌ๋ช…) ๋ฏธ๋‹ˆํƒ€์ผ์ด ํ•˜๋‚˜๋„ ์—†๋‹ค โ€” ์ง€ํ˜•์ด ๋น„์ณ ๋ณด์ด๋Š” ๋ฐ˜ํˆฌ๋ช… ๊ฐ€์žฅ์ž๋ฆฌ ํƒ€์ผ์ด ์•„๋‹ˆ๋‹ค
  4. ํฌ๋ฆฝ์˜ ๋ฏธ๋‹ˆํƒ€์ผ์„ ํ•จ๊ป˜ ์“ฐ๋Š” ๋‹ค๋ฅธ ๋ฉ”๊ฐ€ํƒ€์ผ์„ ์ „๋ถ€ ์ฐพ์•„๋ดค์ง€๋งŒ, ํ’€ยทํ”Œ๋žซํผยทํ™ ์ฒ˜๋Ÿผ ์–ด๋‘์šด ํ…์Šค์ฒ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•œ ๊ฒƒ๋“ค์ด์—ˆ๋‹ค. 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 ์ฐธ๊ณ .

Qt ์™€ LGPLv3

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 ์— ์žˆ๋‹ค.

About

StarCraft: Brood War / Remastered map editor aiming for SCMDraft 2 feature parity

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages