Initial2D ์์ง์ผ๋ก ๊ฒ์์ ๋ง๋๋ ์๋ํฐ์ ๋๋ค. ํ๋ก์ ํธ(ํด๋)๋ฅผ ์ด๊ณ , ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๊ณ , ์ฌ์ ์ค๋ธ์ ํธ๋ฅผ ๋๊ณ , ์คํ ๋ฒํผ์ ๋๋ฅด๋ฉด ์์ง์์ ๊ทธ ๊ฒ์์ด ๋๋๋ค. ์๋ํฐ ์ฝ์ด๋ ์ฅ๋ฅด๋ฅผ ๋ชจ๋ฅด๊ณ , ํ์ผ๋งต๊ณผ RPG ์ด๋ฒคํธ๋ ํ์ฅ์ด ๋ํฉ๋๋ค. ๊ณํ๊ณผ ์งํ ์ํฉ์ docs/plans/index.md์ ์์ต๋๋ค (E0 ๋ถํฐ E6 ๊น์ง ๋ง์ณค๊ณ ํ๋ฆฌ๋ฆด๋ฆฌ์ค๋ Releases ์ ์์ต๋๋ค).
์๋ํฐ๋ฅผ ์ฐ๋ ๋ฒ์ ์ฌ์ฉ์ ๊ฐ์ด๋์ ์์ต๋๋ค. ์ฑ์์๋ ๋์๋ง > ์ฌ์ฉ์ ๊ฐ์ด๋(F1)๋ก ์ฝ๋๋ค. ์๋๋ ์๋ํฐ๋ฅผ ๋น๋ํ๊ณ ๊ณ ์น๋ ์ฌ๋์ ์ํ ๋ด์ฉ์ ๋๋ค.
๋ ๊ฐ์ง ๋ชจ๋๋ก ๋๋๋ค.
| ๋ชจ๋ | ๋ฌด์ | ๋ก์ปฌ ํ์ผ | ์์ง ์คํ |
|---|---|---|---|
| Tauri ์ฑ (์ ํ) | macOS, Windows, Linux ๋ฐ์คํฌํฑ ์ฑ | ์ง์ (ํด๋ ์ ํ, ๊ฐ์, ์์์ ์ ์ฅ) | ์์ง ์คํ ํ์ผ์ ๋์ด๋ค (E1). ์ค์ ์์ ์๋ํฐ ์(E4)์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค |
| ๋ธ๋ผ์ฐ์ (๊ฐ๋ฐ) | Vite dev ์๋ฒ + ์์ง ์ ์ฅ์์ ๋ธ๋ฆฌ์ง ์๋ฒ | ๋ธ๋ฆฌ์ง ์๋ฒ(127.0.0.1:5960)๋ฅผ ๊ฑฐ์ณ์ |
์๋ํฐ ์ ๊ฒ์ ํญ (์น ์์ง, E4) |
๋ธ๋ผ์ฐ์ ๋ชจ๋์๋ ์๋ฒ ์์ด ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋(?backend=memory)๋ ์์ด, UI ์์
๊ณผ ์ค๋ชจํฌ ํ
์คํธ์ ์๋๋ค.
Node 22 ์ด์(๋ธ๋ผ์ฐ์ ๋ชจ๋ ํ
์คํธ๊ฐ ์ ์ญ WebSocket์ ์ด๋ค), Yarn(์ ์ฅ์์ ๋ Berry 4.3.1, .yarn/releases/. ์ ์ญ yarn ์ด 1.x ์ฌ๋ ์ด๊ฒ์ผ๋ก ๋๊น๋๋ค), Tauri ์ฑ์ ๋น๋ํ๋ ค๋ฉด Rust ์์ ํ๊ณผ
ํ๋ซํผ๋ณ ์ค๋น๋ฌผ(docs/plans/01-tech-stack.md 7์ )์ด ํ์ํฉ๋๋ค.
yarn install
# ๋ธ๋ผ์ฐ์ ๋ชจ๋ (์์ง ์ ์ฅ์๊ฐ ์ ํด๋์ ์๋ค๊ณ ๊ฐ์ )
INITIAL2D_HMR=1 ../Initial2D/build/Initial2D & # 1. ๊ฒ์์ ํซ ๋ฆฌ๋ก๋ ์ผ๊ณ ์คํ (์ ํ)
node ../Initial2D/tools/bridge/server.js --project ../Initial2D # 2. ๋ธ๋ฆฌ์ง ์๋ฒ (127.0.0.1:5960)
yarn dev # 3. http://127.0.0.1:5173
# ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ (์๋ฒ ์์)
VITE_DEFAULT_BACKEND=memory yarn dev # ๋๋ http://127.0.0.1:5173/?backend=memory
# Tauri ์ฑ
yarn tauri dev # ๊ฐ๋ฐ (Vite dev ์๋ฒ๋ฅผ ํจ๊ป ๋์ด๋ค)
yarn tauri build # ๋ฒ๋ค (src-tauri/target/release/bundle/)
INITIAL_EDITOR_OPEN=~/mygame yarn tauri dev # ์์ํ์๋ง์ ๊ทธ ํด๋๋ฅผ ์ฐ๋ค (--open <ํด๋> ์ธ์๋ ๊ฐ๋ค)๋ธ๋ฆฌ์ง ์๋ฒ๋ ์์ง ์ ์ฅ์์ tools/bridge/server.js(0.2.0 ์ด์)์ด๋ฉฐ ํ๋ก์ ํธ์ scripts/, resources/,
.initial-editor/์ ๋ฃจํธ์ game.json๋ง ์ฝ๊ณ ์๋๋ค. ์ฌ์ฉ๋ฒ์ ์์ง README์ "์๋ํฐ ๋ธ๋ฆฌ์ง ์๋ฒ" ์ ์ ์์ต๋๋ค.
- ํ๋ก์ ํธ ํจ๋์์
.lua,.rb,.json์ ์ด๋ฉด Monaco ํธ์ง๊ธฐ๊ฐ ๋น๋๋ค. Ctrl+S ๋ก ์ ์ฅํ๋ฉด (์ค์ ์ด ์ผ์ ธ ์์ผ๋ฉด) ์คํ ์ค์ธ ๊ฒ์์ ํซ ๋ฆฌ๋ก๋๊ฐ ๊ฐ๋๋ค. ๋ฐ์์ ํ์ผ์ด ๋ฐ๋๋ฉด ์์ ์ค์ด ์๋ ๋๋ ์กฐ์ฉํ ๋ค์ ์ฝ๊ณ , ์์ ์ค์ด๋ฉด ๋ฐฐ๋๋ก ๋ฌป์ต๋๋ค. ์ ์ฅํ ๋ ๋์คํฌ์ ํ์ผ์ด ์ฐ ๋์ ๋ค๋ฅด๋ฉด(๋ฐฐ๋์์ ํธ์ง ๋ด์ฉ ์ ์ง๋ฅผ ๊ณจ๋์ด๋, ํ์ผ์ด ์ง์์ก์ด๋) ๋ฎ์ด์ฐ๊ธฐ, ๋ค์ ์ฝ๊ธฐ, ์ทจ์๋ฅผ ๋ชจ๋ฌ๋ก ํ ๋ฒ ๋ ๋ฌป์ต๋๋ค. ์ฌ, ๋งต, ๋ชจ๋ ์ ์ฅ๋ ๊ฐ์ต๋๋ค. ๋ค์ ์ฝ๊ธฐ๋ ์ ์ฅํ์ง ์์ ์์ ์ ๋ฒ๋ฆฌ๋ฏ๋ก ํ ๋ฒ ๋ ํ์ธํ๊ณ , ๋์คํฌ์ ํ์ผ์ด ๊นจ์ ธ ๋ค์ ์ฝ์ง ๋ชปํ๋ฉด "๋ค์ ์ฝ์ง ๋ชปํ๋ค"๊ณ ์๋ฆฐ ๋ค ๋ด ์์ ๊ณผ ๋ฐฐ๋๋ฅผ ๊ทธ๋๋ก ๋ก๋๋ค. ํฐ ๋งต์ ์ฐ๋ ์ค์ ๊ณ ์น๊ณ ๋ค์ ์ ์ฅํ๋ฉด ์์ ์ฐ๊ธฐ๊ฐ ๋๋ ๋ค ์ต์ ๋ด์ฉ์ผ๋ก ํ ๋ฒ ๋ ์ ์ฅํฉ๋๋ค. - ์๋์์ฑ์ ํ๋ก์ ํธ์
resources/api/initial2d-api.json(์์ง ์ ์ฅ์๊ฐ ๋ง๋ค์ด ๋ API ๋ช ์ธ)์ ์ฝ์ต๋๋ค. ์์ผ๋ฉด ๋ด์ฅ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์ํ๋ฉฐ ์ฝ์์ ๊ทธ๋ ๊ฒ ์ ํ๋๋ค.Input.๋ค์ ๋ฉค๋ฒ,(๋ค์ ์๊ทธ๋์ฒ, ๋น ํ์ผ์์ ์ฌ ๊ณ์ฝ ๋ค ํจ์ ์ค๋ํซ. - ๋ฐ์คํฌํฑ ์ฑ์ Lua ์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ฉด ์ฑ์ ๋ ์ธ์ด ์๋ฒ LuaLS ๋ฅผ ๋์๋๋ค. ์ง์ญ ๋ณ์,
requireํ ๋ชจ๋, ์ง์ ๋ง๋ ํจ์๊น์ง ์๋ ์๋ ์์ฑ๊ณผ ํธ๋ฒ, ์ง๋จ(๋ฌผ๊ฒฐ ๋ฐ์ค), ์ ์๋ก ์ด๋(F12, Ctrl+ํด๋ฆญ), ์ฐธ์กฐ(Shift+F12), ์ด๋ฆ ๋ฐ๊พธ๊ธฐ(F2, ์ฌ๋ฌ ํ์ผ์ด๋ฉด ๊ทธ ํ์ผ๋ค์ ์ด์ด ์ ์ฅํ ์ ์๊ฒ ํฉ๋๋ค), ๊ธฐํธ๋ก ์ด๋(Ctrl+Shift+O)์ด ๋ฉ๋๋ค. ์ํ ๋ฐ์LuaLS 3.19.1์ฒ๋ผ ๋ณด์ด๊ณ , ๋ฉ์ถ๋ฉด ๋๊ตฌ > ์ธ์ด ์๋ฒ ๋ค์ ์์. ์๋ฒ๊ฐ ๋๋ ๋์ ๋ช ์ธ ์๋์์ฑ์ ์ฌ ๊ณ์ฝ ์ค๋ํซ๋ง ๋จ์ต๋๋ค. - Ruby ์คํฌ๋ฆฝํธ์ ๋ธ๋ผ์ฐ์ ํ์ Lua ๋ ์์ปค ์์ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ(Ruby ๋ Prism, Lua ๋ luaparse)๊ฐ ๋ถ์ต๋๋ค. ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ์ฐ๋ ๋์ ๋ฐ์ค๋ก ๋ณด์ด๊ณ , ์ ์๋ก ์ด๋(F12)๊ณผ ๊ธฐํธ๋ก ์ด๋(Ctrl+Shift+O)์ด ํ๋ก์ ํธ์
scripts/์์์ ๋๊ณ , ์๋์์ฑ์ ์ง๊ธ ํ์ผ์ ํจ์ ์ด๋ฆ๊ณผ ํ๋ก์ ํธ์ ํด๋์ค, ๋ชจ๋, ์์ ์ด๋ฆ์ด ๋ํด์ง๋๋ค. ์์ง API ์ ์๋์์ฑ์ ์ง๊ธ์ฒ๋ผ ๋ช ์ธ์์ ์ต๋๋ค. - ์ง๋จ ๊ท์น์ ํ๋ก์ ํธ์
.luarc.json์ ๋๋ค. ์ Lua ํ๋ก์ ํธ๋ ์์ง ํ ํ๋ฆฟ์ ๊ฒ(ํ์ ๊ฒ์ฌ, ์ง์ญ ๋ณ์ ๋ค์ ์ ์ธ, ์ค ๋ ๊ณต๋ฐฑ์ ๋ LuaLS ๊ธฐ๋ณธ)๊ณผ ์์ง API ์คํ resources/api/initial2d.lua๋ฅผ ๋ฐ๊ณ , VS Code ๊ฐ์ ๋ค๋ฅธ ์๋ํฐ์ LuaLS ๋ ๊ฐ์ ํ์ผ์ ์ฝ์ต๋๋ค. ๋ ๋ค ์๋ ์ ํ๋ก์ ํธ๋ ๊ฐ์ ๊ท์น๊ณผ ์ฑ์ ๋ ์คํ ์ ์๋๋ค. ๋๊ตฌ > ์ค์ ์ "์ง๋จ ํ์"์์ ํ์ ์ ํจ, ๊ตฌ๋ฌธ ์ค๋ฅ๋ง, ๊ท์น ์ ์ฒด๋ฅผ ๊ณ ๋ฅด๊ณ , "์ธ์ด ์๋ฒ"๋ฅผ ๋๋ฉด ๋ช ์ธ ์๋์์ฑ๋ง ์๋๋ค. ๊ณํ๊ณผ ๊ตฌ์กฐ๋ docs/plans/language-server.md. - ์ฐพ๊ธฐ: ํธ์ง๊ธฐ ์ Ctrl+F, ํ๋ก์ ํธ ์ ์ฒด Ctrl+Shift+F (๋์๋ฌธ์, ์ ๊ท์). ์ ์คํฌ๋ฆฝํธ Ctrl+Alt+N (์ฌ ํ ํ๋ฆฟ ๋๋ ์ปดํฌ๋ํธ ํ ํ๋ฆฟ, Lua ๋ Ruby).
- ์์ง ํ๋ก์ธ์ค ์คํ(F5, ์ค์ ์ ์คํ ๋ฐฉ์์ด ํ๋ก์ธ์ค์ผ ๋)์ Tauri ์ฑ์์๋ง ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์์๋ F5 ๊ฐ ์๋ํฐ ์ ๊ฒ์ ํญ์์ ๋๋๋ค (์๋ "์๋ํฐ ์์์ ์คํ"). ์์ง์ ์ค์ ์ ๊ฒฝ๋ก, ํ๋ก์ ํธ์
.initial-editor/engine(ํ ์ค ๊ฒฝ๋ก), ํ๋ก์ ํธ ์build/Initial2D, ์ฑ์ ๋ ์์ง(์ค์น๋ณธ), ํ์ ํด๋../Initial2D/build/Initial2D์์๋ก ์ฐพ๊ณ--features๋ก ํ์ธํฉ๋๋ค. ํ๋ก์ ํธ๊ฐ ๊ฐ๋ฆฌํค๋ ์คํ ํ์ผ(.initial-editor/engine,build/, ํ์ ํด๋)์ ์ฒ์ ํ ๋ฒ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฌ ์ฃผ๊ณ ์คํํด๋ ๋๋์ง ๋ฌป์ต๋๋ค. ๋ต์ ํ๋ก์ ํธ๊ฐ ์๋๋ผ ์ฑ ์ค์ ์ ๋จ๊ณ , ๋๊ตฌ > ์ค์ ์ "์ฐพ์ ์์ง" ์ค์์ ์ ๋ขฐ ์ทจ์๋ ๋ค์ ๋ฌป๊ธฐ๋ฅผ ํฉ๋๋ค. ์์ง์ ๋ชป ์ฐพ์ผ๋ฉด F5 ๋ ์๋ํฐ ์ ๊ฒ์ ํญ์ผ๋ก ๋์ด๊ฐ๋๋ค (Ruby ํ๋ก์ ํธ๋ ์ด์ ๋ฅผ ๋์๋๋ค). ์ ์ง Shift+F5, ๋ฆฌ๋ก๋ Ctrl+Shift+R. ์์ง ์ถ๋ ฅ์ ์ฝ์์ ์ค๊ณํ์ผ:์ค:์ ๋งํฌ๋ผ ๋๋ฅด๋ฉด ๊ทธ ์ค๋ก ๊ฐ๋๋ค. ์ ์ฅํ์ง ์์ ๋ฌธ์๊ฐ ์์ผ๋ฉด F5 ์ Ctrl+F5, ๋ค์ ์์์ด ๋จผ์ ๋ฌป์ต๋๋ค. ๊ฒ์์ ๋์คํฌ์ ํ์ผ์ ์ฝ๊ธฐ ๋๋ฌธ์ ๋๋ค. Enter ๋ "๋ชจ๋ ์ ์ฅํ๊ณ ์คํ"์ด๊ณ , "์ ์ฅํ์ง ์๊ณ ์คํ"๊ณผ "์ทจ์"๋ ์์ต๋๋ค. - ๋ฐฐํฌ๋ ํ์ด์ง(Cloudflare Pages ๋ฑ, ๋ก์ปฌ์ด ์๋ ํธ์คํธ)์์๋ ๋ธ๋ฆฌ์ง์ ๋ฟ์ ์ ์์ด ์นํ(๋ธ๋ผ์ฐ์ ํด๋)์ผ๋ก ์์ํฉ๋๋ค. ํด๋ ์ด๊ธฐ๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋์ ๋๋ค. ์๋ "์นํ" ์ .
๊ฐ์ ์ฑ์ Cloudflare Pages ์ ์ฌ๋ฆฐ ๊ฒ์ด ์นํ์ ๋๋ค. ์ค์น ์์ด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด ์ปดํจํฐ์ ํ๋ก์ ํธ ํด๋๋ฅผ ์ง์ ์ฝ๊ณ ์๋๋ค (File System Access API, ์๋ฒ ์์). ๊ฒ์์ ๊ฒ์ ๋ทฐ์์ ์์ง์ WASM ๋น๋๋ก ํ์ด์ง ์์์ ๋๋๋ค.
- ๋ธ๋ผ์ฐ์ : ํฌ๋กฌ, ์ฃ์ง ๊ฐ์ ํฌ๋ก๋ฏธ์ ๊ณ์ด ๋ฐ์คํฌํฑ ๋ธ๋ผ์ฐ์ . ํ์ด์ดํญ์ค์ ์ฌํ๋ฆฌ์๋ ํด๋ ์ด๊ธฐ๊ฐ ์์ด์ ์ํ ํ๋ก์ ํธ(๋ฉ๋ชจ๋ฆฌ ๋ชจ๋)๋ก ์์ํ๊ณ ์์ ํ๋ฉด์ ๊ทธ๋ ๊ฒ ์ ํ๋๋ค.
- ํด๋ ์ด๊ธฐ: ์์ ํ๋ฉด์ "ํด๋ ์ด๊ธฐ"(๋๋ Ctrl+O, ํ์ผ > ํ๋ก์ ํธ ์ด๊ธฐ. "์ํ ํ๋ก์ ํธ ์ด๊ธฐ" ๋ค์๋ ๊ฐ์ต๋๋ค)๋ก
game.json์ด ์๋ ํด๋๋ฅผ ๊ณ ๋ฅด๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌป๋ ์์ ๊ถํ์ ๋์ํฉ๋๋ค. ์ฐ ํด๋๋ ๋ธ๋ผ์ฐ์ (IndexedDB)๊ฐ ํด๋ ์ด๋ฆ์ผ๋ก ๊ธฐ์ตํด "์ต๊ทผ ํด๋"์ ํ์ผ > ์ต๊ทผ ํ๋ก์ ํธ์ ๋์ต๋๋ค. ๊ฐ์ ์ด๋ฆ์ ํด๋๋ฅผ ๋ค์ ๊ณ ๋ฅด๋ฉด ๋ชฉ๋ก์ด ๋์ง ์๊ณ ๊ทธ ์๋ฆฌ๋ฅผ ์๋ก ๊ณ ๋ฅธ ํด๋๋ก ๋ฐ๊ฟ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ๊ถํ์ ๊ธฐ์ตํ์ง ์์์ผ๋ฉด "๋ค์ ์ด๊ธฐ"๋ฅผ ๋๋ฅผ ๋ ํ ๋ฒ ๋ ๋ฌป์ต๋๋ค. - ์ด๋ฆฐ ํ๋ก์ ํธ์ ์ ์ฅํ์ง ์์ ๋ฌธ์๊ฐ ์์ผ๋ฉด ํด๋๋ฅผ ๊ณ ๋ฅธ ๋ค ๋ซ์์ง ๋จผ์ ๋ฌป์ต๋๋ค. ์ฌ๊ธฐ์ ์ทจ์ํ๋ฉด ๊ธฐ์ตํ ํด๋ ๋ชฉ๋ก๋ ์ง๊ธ ์ด๋ฆฐ ํ๋ก์ ํธ๋ ๊ทธ๋๋ก์ ๋๋ค.
- ๋๋ ๊ฒ: ํ์ผ ํธ๋ฆฌ, ์คํฌ๋ฆฝํธ์ ์ฌ๊ณผ ๋งต ํธ์ง, ์ ์ฅ(์์ ํ์ผ์ ์ฐ๊ณ ํ ๋ฒ์ ๋ฐ๊พผ๋ค), ์ด๋ฆ ๋ฐ๊พธ๊ธฐ์ ์ง์ฐ๊ธฐ, ๋ฐ์์ ๋ฐ๋ ํ์ผ ๊ฐ์ง(1.5์ด ๊ฐ๊ฒฉ์ผ๋ก ํ์ธ), ์ ํ๋ก์ ํธ. ์ ๋๋ ๊ฒ: ์์ง ์คํ ํ์ผ ๋์ฐ๊ธฐ์ ์๋๋ก์ด๋ ์คํ ์ด์ง(๋ฐ์คํฌํฑ ์ฑ์ ์ผ). ์น ์์ง ๋น๋์ mruby ๊ฐ ์์ผ๋ฉด Ruby ๊ฒ์๋ ๋์ง ์์ต๋๋ค. ์์ ํ๋ฉด ์๋์ ์ด ์ค๊ณผ "๋ฐ์คํฌํฑ ์ฑ ๋ฐ๊ธฐ"(๋ฆด๋ฆฌ์ค ํ์ด์ง)๊ฐ ์์ต๋๋ค.
- ์ ํ๋ก์ ํธ: ์์ ํ๋ฉด์ "์ ํ๋ก์ ํธ"(๋๋ Ctrl+N, ํ์ผ > ์ ํ๋ก์ ํธ. "์ํ ํ๋ก์ ํธ ์ด๊ธฐ" ๋ค์๋ ๊ฐ์ต๋๋ค)๋ก ๋น ํด๋๋ฅผ ๊ณ ๋ฅด๊ณ ํ ํ๋ฆฟ๊ณผ ์ธ์ด๋ฅผ ์ ํ๋ฉด ๊ทธ ํด๋์ ํ ํ๋ฆฟ์ ์ฐ๊ณ ์ฝ๋๋ค. ํด๋๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ์ ๋ํ์์์์ "๋ง๋ค๊ธฐ"๋ฅผ ๋๋ฅธ ๋ค๋ผ, ์ค๊ฐ์ ์ทจ์ํ๋ฉด ์ต๊ทผ ํด๋๋ ํด๋ ์๋ ๊ทธ๋๋ก์ ๋๋ค. ๋น์ด ์์ง ์์ ํด๋๋ ํ ๋ฒ ๋ฌป๊ณ , ์๋ ํ์ผ์ ๊ทธ๋๋ก ๋๊ณ ์๋ ๊ฒ๋ง ๋ง๋ญ๋๋ค.
- ์ํ ํ๋ก์ ํธ ์ด๊ธฐ: ์์ง์ RPG ๋ฐ๋ชจ ใ๋ ๋๊ธฐ ์ ์ใ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ์ด ์ด๊ณ ํญ๊ตฌ ๋ง์ ๋งต(
resources/maps/port_town.json)์ ๋งต ๋ทฐ๋ก ๋์๋๋ค. ์ ํ๋ก์ ํธ์ "RPG ๋ฐ๋ชจ" ํ ํ๋ฆฟ๊ณผ ๊ฐ์ ํ์ผ์ ๋๋ค. ํ์ผ์ ์น ํ๊ฑฐ๋ ์ด๋ฒคํธ ๋ ์ด์ด์์ ๋์ฌ๋ฅผ ๊ณ ์น๊ณ ์ ์ฅํ ๋ค F5 ๋ฅผ ๋๋ฅด๋ฉด ํ์ดํ๋ถํฐ, Ctrl+F5 ๋ฅผ ๋๋ฅด๋ฉด ๊ทธ ๋งต์์ ๋ฐ๋ก ๊ฒ์ ํญ์ผ๋ก ์คํํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ผ ํ์ด์ง๋ฅผ ๋ค์ ์ด๋ฉด ์ฒ์ ์ํ๋ก ๋์๊ฐ๋๋ค. ์์ ์ ์ด์ ์ํ์ e2e ๊ฐ ์ฐ๋ฉฐ?sample=meadow๋ก ์ฝ๋๋ค. - ์ ๋ณด ์ฐฝ(๋์๋ง > InitialEditor ์ ๋ณด): ํ, ๋น๋ํ ์ปค๋ฐ, ์น ์์ง์ ์ปค๋ฐ๊ณผ ๊ธฐ๋ฅ, ๋ฐ์คํฌํฑ ์ฑ์ด๋ฉด ์ฐพ์ ์์ง(์ฑ์ ๋ ์์ง์ด๋ฉด ๊ทธ ํ), ์ 3์ ๊ณ ์ง(์น ์์ง๊ณผ ํจ๊ป ์ค๋ฆฐ
engine/THIRD-PARTY.md), ์นํ์ด๋ฉด "๋ฐ์คํฌํฑ ์ฑ ๋ฐ๊ธฐ", ๋ฐ์คํฌํฑ ์ฑ์ด๋ฉด "์นํ ์ด๊ธฐ". ๋ฐ๊นฅ ๋งํฌ๋ ๋ฐ์คํฌํฑ ์ฑ์์๋ ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋ก, ์นํ์์๋ ์ ํญ์ผ๋ก ์ด๋ฆฝ๋๋ค. - ๋ฐ์์ ๋ฐ๋ ํ์ผ์ ํฌ๊ธฐ์ ์์ ์๊ฐ๋ง ๋น๊ตํด์ ์ฐพ์ต๋๋ค(๋ด์ฉ์ ์ฝ์ง ์๋ ํด๋ง). ํฌ๊ธฐ์ ์์ ์๊ฐ์ด ๋ ๋ค ๊ทธ๋๋ก์ธ ๋ณ๊ฒฝ(์์ ์๊ฐ์ ๋ณด์กดํ๋ ๋ณต์ฌ ๋ฑ)์ ๋์นฉ๋๋ค.
- ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ ๋ธ๋ผ์ฐ์ ์
move()๊ฐ ๋๋ฉด ๊ทธ๊ฒ์, ์ ๋๊ฑฐ๋ ์คํจํ๋ฉด ๋ณต์ฌ ๋ค ์ง์ฐ๊ธฐ๋ฅผ ์๋๋ค. ํฌ๋กฌ 153 ์ ํ์ผ์๋งmove()๊ฐ ์์ด์ ํด๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ ๋ ๋ณต์ฌ์ ๋๋ค.move()์ชฝ์ ์๋ ํ ์คํธ๋ ๊ฐ์ง ํ์ผ ์์คํ ์ผ๋ก๋ง ๋๋๋ค. - ์ํฌ๋ฆฟ ์ฐฝ: ํฌ๋ก๋ฏธ์์ ์ํฌ๋ฆฟ ์ฐฝ(off-the-record ํ๋กํ)์์๋ IndexedDB ์ ๊ธฐ์ตํ ํด๋ ํธ๋ค์ ๊บผ๋ด๋ ์๊ฐ ํญ์ด ์๋๋ผ ๋ธ๋ผ์ฐ์ ํ๋ก์ธ์ค๊ฐ ํต์งธ๋ก ๊บผ์ง๋๋ค(ํฌ๋กฌ 153 ์์ ํ์ธ, ์ํฌ๋ฆฟ ์ฐฝ์ ์ ์ฅ์๋ ํจ๊ป ์ฌ๋ผ์ง๋๋ค). ๊ทธ๋์ "๋ค์ ์ด๊ธฐ"๋ ์ผ๋ฐ ์ฐฝ์ด๋ผ๊ณ ํ์ ํ ๋๋ง ํธ๋ค์ ๋ฐ๋ก ๊บผ๋
๋๋ค. ๊ธฐ์ค์ JS ํ ํ๋(
performance.memory.jsHeapSizeLimit)๋ฅผ ์ ์ ์๊ณ , ์ ์ฅ ํ ๋น๋์ด ๊ทธ ๋ ๋ฐฐ๋ณด๋ค ํฌ๊ณ 4 GiB ๋ณด๋ค๋ ํฐ ๊ฒ์ ๋๋ค. ๋๋จธ์ง๋ ๋ชจ๋ ํธ๋ค์ ๊บผ๋ด์ง ์๊ณ , ์ด์ ๋ฅผ ํ ์ค ์๋ฆฐ ๋ค ํด๋ ๊ณ ๋ฅด๊ธฐ ๋ํ์์๋ฅผ ์ฝ๋๋ค(ํฌ๋กฌ์ ์ง๋๋ฒ์ ๊ณ ๋ฅธ ํด๋์์ ์ฝ๋๋ค). ๊ฐ์ ํด๋๋ฅผ ๊ณ ๋ฅด๋ฉด ๋ฉ๋๋ค. ํฌ๋กฌ 153 ์ ์ํฌ๋ฆฟ ์ฐฝ๊ณผ ๊ฒ์คํธ ์ฐฝ์ ํ ๋น๋์ด ๋ฑ 2 GiB(์ด ๋ค์๋ 2 GiB ์ ์ฌ์ฉ๋์ ๋ํ ๊ฐ)์ด๊ณ , ์ผ๋ฐ ์ฐฝ์ 10 GiB ์์ต๋๋ค. ํ ํ๋๋ฅผ ์๋ ค ์ฃผ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ ์ผ๋ฐ ์ฐฝ์ด์ด๋ ํด๋ ๊ณ ๋ฅด๊ธฐ๋ก ๋๋๋ค. - ์ผ๋ฐ ์ฐฝ์์ ํธ๋ค์ ๊บผ๋ด๋ค ๋ธ๋ผ์ฐ์ ๊ฐ ๊บผ์ง ํ์ ์ด ๋ช ๋ถ ์์ ๋จ์ ์์ผ๋ฉด ๊ทธ ํ์ด์ง์์๋ "๋ค์ ์ด๊ธฐ"๊ฐ ํด๋ ๊ณ ๋ฅด๊ธฐ๋ก ๋๋๋ค. ํด๋๋ฅผ ํ๋ ์ด๋ฉด ํ์ ์ ์ง์๋๋ค.
- ๋ก์ปฌ์์ ์นํ์ ๋์ฐ๋ ค๋ฉด
yarn dev๋คhttp://127.0.0.1:5173/?backend=browser.?backend=opfs๋ ๋ธ๋ผ์ฐ์ ์ ์ฉ ์ ์ฅ์(OPFS)๋ฅผ ํด๋ ๋์ ๋ฐ๋ก ์ฌ๋ ํ ์คํธ์ฉ์ ๋๋ค (tests/e2e/web-folder.spec.ts).
Pages ๋ ์ ์ฅ์๋ฅผ ๋ฐ์ yarn build ์ dist/ ๋ฅผ ๋
๋๋ค. ์ค์ ์ Pages ๋์๋ณด๋์ ์๊ณ ์ ์ฅ์์๋ wrangler.toml ์ ๋์ง ์์ต๋๋ค.
๋์๋ณด๋ ๊ฐ์ ์ด๋ ์ต๋๋ค (๋ฐ๊ฟ ๋๋ ์ด ํ๋ ๊ณ ์นฉ๋๋ค).
| ์นธ | ๊ฐ |
|---|---|
| ํ๋ก์ ํธ | initial-editor |
| ๋น๋ ๋ช ๋ น | yarn build |
| ์ถ๋ ฅ ํด๋ | dist |
| ๋ฃจํธ | / (์ ์ฅ์ ๋ฃจํธ) |
| Node | .node-version (22) |
| Yarn | .yarnrc.yml ์ yarnPath (Berry 4.3.1) |
| ํ๊ฒฝ ๋ณ์ | ์์. ์ ๋ณด ์ฐฝ์ ์ปค๋ฐ์ Pages ๊ฐ ์ฃผ๋ CF_PAGES_COMMIT_SHA ๋ฅผ vite.config.ts ๊ฐ ์ฝ์ต๋๋ค |
| ํ๋ก๋์ | main ๋ธ๋์น, https://initial-editor.biud436.com (https://initial-editor.pages.dev) |
| ๋ฏธ๋ฆฌ๋ณด๊ธฐ | next ์ PR ๋ธ๋์น. next ๋ https://next.initial-editor.pages.dev |
- Pages ๋น๋๋ ์์ง์ ๋ง๋ค์ง ์์ต๋๋ค.
packages/app/public/engine/์ ์ปค๋ฐํ ์น ์์ง๊ณผ ์ 3์ ๊ณ ์ง๋ฅผ ๊ทธ๋๋ก ์ฃ์ต๋๋ค. - ์๋ต ํค๋๋
packages/app/public/_headers์ ๋๋ค:engine/์ ์ด๋ฆ์ ํด์๊ฐ ์์ดno-cache,Initial2D.wasm์application/wasm(์๋๋ฉด ์คํธ๋ฆฌ๋ฐ ์ปดํ์ผ์ด ์คํจํ๊ณ ์ฝ์์ ์ค๋ฅ ์ค์ด ๋น๋๋ค), ํด์ ์ด๋ฆ์assets/๋ 1๋ , ๋ชจ๋ ์๋ต์nosniff์ referrer ์ ์ฑ . ๊ต์ฐจ ์ถ์ฒ ๊ฒฉ๋ฆฌ ํค๋(COOP, COEP)์ CSP ๋ ๋์ง ์์ต๋๋ค. - ๋น๋ํ
dist/๊ฒ์ฌ:node scripts/check-web-dist.mjs๊ฐindex.html๊ณผ ๊ทธ๊ฒ์ด ๋ถ๋ฅด๋assets/,_headers๊ท์น(wasm ํ์ , ์์ง ์บ์, nosniff, ๊ฒฉ๋ฆฌ ํค๋ ์์), ์น ์์ง ํ์ผ๊ณผ MANIFEST ์ sha256,engine/THIRD-PARTY.md, Pages ํ๋(ํ์ผ ํ๋ 25 MiB, 2๋ง ๊ฐ)๋ฅผ ๋ด ๋๋ค. ๋ฐ์คํฌํฑ ๋ฒ๋ค์ฉ ๋น๋๋--desktop์ ๋ถ์ฌ ์์ค๋งต์ด ์๋์ง๋ ๋ด ๋๋ค. ๋ค๋ฅธ ํด๋๋--dist <ํด๋>. - ํค๋๊น์ง ๋ก์ปฌ์์ ๋ณด๋ ค๋ฉด
wrangler pages dev๋ก Pages ๋ฅผ ํ๋ด ๋ ๋๋ค (_headers๋ฅผ ์ ์ฉํฉ๋๋ค).
yarn build && node scripts/check-web-dist.mjs
npx wrangler@3 pages dev dist --port 8788 # http://127.0.0.1:8788/?backend=browser
PAGES_URL=http://127.0.0.1:8788 yarn test:e2e tests/e2e/pages.spec.ts # ๋์ ๋ Pages ๋ก
PAGES_WRANGLER=1 yarn test:e2e tests/e2e/pages.spec.ts # ์คํ์ด wrangler ๋ฅผ ๋์ฐ๊ณ ๋๋ค (ํฌํธ PAGES_PORT, ๊ธฐ๋ณธ 8788)tests/e2e/pages.spec.ts๋ ํค๋(wasm ํ์ , ์บ์, nosniff, ๊ฒฉ๋ฆฌ ํค๋ ์์, ๊ณ ์ง ํ์ผ)์ ํ๋ฆ(์ํ ํ๋ก์ ํธ ์ด๊ธฐ, F5, ๋งต์์ ํ ์นธ ์น ํด ์ ์ฅ, F5 ๋ก ๊ทธ ์นธ๋ง ๋ฐ๋๋์ง, ์คํธ๋ฆฌ๋ฐ ์ปดํ์ผ ์คํจ ์ค์ด ์๋์ง, ์ ๋ณด ์ฐฝ)์ ๋ด ๋๋ค.PAGES_URL๋PAGES_WRANGLER๋ ์์ผ๋ฉด ํค๋ ๊ฒ์ฌ๋ ๊น๋ญ์ ์ ๊ณ ๊ฑด๋๋ฐ๊ณ , ํ๋ฆ์ Playwright ๊ฐ ๋์ดvite preview๋ก ๋๋๋ค. wrangler ๋ฅผ ๋ฐ์ง ๋ชปํ๋ฉด ๊ทธ ๊น๋ญ๋ ์ ๊ณ ๊ฑด๋๋๋๋ค.
์์ง์ WebAssembly ๋น๋๋ฅผ ๊ฒ์ ํญ์ canvas ์ ์ฌ๋ ค ๊ฒ์์ ์๋ํฐ ์์์ ๋๋ฆฝ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ชจ๋(๋ธ๋ฆฌ์ง, ๋ฉ๋ชจ๋ฆฌ, ์นํ)์ F5 ๋ ๋ ์ด์ชฝ์ด๊ณ , Tauri ์ฑ์ ์ค์ ์ ์คํ ๋ฐฉ์(ํ๋ก์ธ์ค, ์๋ํฐ ์)์ผ๋ก ๊ณ ๋ฆ ๋๋ค. ์ํ ๋ฐ์ ์์ง ์นธ์ ๋ฐฉ์์ด ๋ถ์ต๋๋ค.
- F5 ๋ฅผ ๋๋ฅด๋ฉด ๊ฒ์ ํญ์ด ์ด๋ฆฌ๊ณ
game.json,scripts/,resources/๋ฅผ ์น ์์ง์ ๊ฐ์ ํ์ผ ์์คํ ์ ์ฌ๋ฆฐ ๋ค ์์ง์ด ๋น๋๋ค.resources/rtp/,resources/aldebaran/src/,*.zip,*.psd, 32 MB ๋ฅผ ๋๋ ํ์ผ์ ์ฌ๋ฆฌ์ง ์์ต๋๋ค. canvas ๋game.json์ ์ฐฝ ํฌ๊ธฐ์ด๊ณ ํญ์ ๋ง์ถฐ ์ ์ ๋ฐฐ์จ๋ก ์ปค์ง๋๋ค (ํญ์ด ์์ผ๋ฉด ์ค์ธ๋ค). - ๊ฒ์ ํญ์ ์ฒ์์ ๋ฌธ์ ์์ญ ์ค๋ฅธ์ชฝ์ ์ ๊ทธ๋ฃน์ ์ด๋ ค์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณ ์น๋ ๋์์๋ ๋ณด์ ๋๋ค. ํญ์ ๋ค๋ฅธ ์๋ฆฌ๋ก ๋์ด ๋๋ฉด ๋ซ์๋ค ๋ค์ ์ด์ด๋ ๊ทธ ์๋ฆฌ์ ์ด๋ฆฝ๋๋ค (์๋ํฐ๋ฅผ ์๋ก ๊ณ ์น๋ฉด ์ฒ์ ์๋ฆฌ๋ก).
- ๊ฒ์ ํญ์ ๋๋ฅด๊ฑฐ๋ (์ด๋ฏธ ์์ ์์ด๋) ๋ค๋ฅธ ์๋ฆฌ๋ก ๋์ด ์ฎ๊ธฐ๋ฉด ํค๊ฐ ๊ฒ์์ผ๋ก ๊ฐ๋๋ค. F5, Shift+F5, Ctrl+F5, ๋ฆฌ๋ก๋๋ ๊ฒ์์ด๋ ์คํฌ๋ฆฝํธ ํธ์ง๊ธฐ๋ ์ ๋ ฅ ์นธ์ ์ด์ ์ด ์์ด๋, ํ๊ธ์ ์กฐํฉํ๋ ์ค์ด์ด๋ ์๋ํฐ๊ฐ ๋ฐ๊ณ , ๋ธ๋ผ์ฐ์ ์ ์๋ก ๊ณ ์นจ์ผ๋ก ๊ฐ์ง ์์ต๋๋ค. ๋ฆฌ๋ก๋๊ฐ ๊บผ์ ธ ์์ ๋ ๋๋ฅธ Ctrl+Shift+R(mac์ Cmd+Shift+R)๋ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ ฅ ์๋ก ๊ณ ์นจ์ผ๋ก ๊ฐ์ง ์์ต๋๋ค. ์ค์ ๊ฐ์ ๋ํ์์๊ฐ ๋ ์์ ๋๋ ๋จ์ถํค๊ฐ ๋ํ์์ ๋ชซ์ด๋ผ F5 ๋ ์๋ฌด๊ฒ๋ ํ์ง ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ชจ๋์์ ์ ์ฅํ์ง ์์ ๋ฌธ์๊ฐ ์์ผ๋ฉด ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์น๊ฑฐ๋ ๋ซ๊ธฐ ์ ์ ๋ฌป์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋์ ์นํ์ "์ํ๋ก ํด ๋ณด๊ธฐ"๋ ํ์ผ์ด ํ์ด์ง์๋ง ์์ด์, ์ด๋ฒ์ ์ ์ฅํ ๊ฒ์ด ์์ผ๋ฉด ๋ฌธ์๊ฐ ๋ชจ๋ ์ ์ฅ๋์ด ์์ด๋ ๋ฌป์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋๋ฅด๊ธฐ ์ ์๋ ์๋ฆฌ๋ฅผ ๋ด์ง ์์์, ์๋ฆฌ๊ฐ ๋ฉ์ถฐ ์์ผ๋ฉด "์๋ฆฌ ์ผ๊ธฐ"๊ฐ ๋น๋๋ค (๊ฒ์ ํ๋ฉด์ ๋๋ฌ๋ ์ผ์ง๋ค).
- ์ถ๋ ฅ(Lua
print, ์์ง ๋ก๊ทธ)์ ์ฝ์์ ์ค๊ณ ์ค๋ฅ ์ค์ ๋งํฌ์ ๋๋ค. ์คํฌ๋ฆฝํธ, ์ฌ, ๋งต์ ์ ์ฅํ๋ฉด ๊ทธ ํ์ผ๋ง ๋ค์ ์ฌ๋ฆฌ๊ณ VM ์ ๋ค์ ์์ํฉ๋๋ค (์ฝ์์ "ํซ ๋ฆฌ๋ก๋: ์๋ํฐ ์ ์์ง"). ํ์ผ์ ์ฌ๋ฆฌ๊ฑฐ๋ ์์ง์ด ๋จ๋ ์ค์ ์ ์ฅํ๋ฉด ์์ง์ด ์ฒซ ํ๋ ์์ ๋ ๋ค์ ๊ทธ ํ์ผ์ ๋ค์ ์ฌ๋ฆฝ๋๋ค. ๊ทธ ์ฌ์ด ์์ ์คํฌ๋ฆฝํธ๋ ์ฒซupdate,render์ ์ค๋ฅ๊ฐ ๋๋ฉด ๊ฒ์์ ๊ณง ๋๋๋ฏ๋ก ๊ณ ์น ๊ฒ์ ์ฌ๋ฆฌ์ง ์๊ณ ์ฝ์์ "๊ฒ์์ด ๋จ๋ ์ค์ ๋๋์ ์ ์ฅํ ํ์ผ์ ์ฌ๋ฆฌ์ง ์์๋ค" ํ ์ค์ ๋จ๊ธฐ๋ F5๋ก ๋ค์ ์คํํฉ๋๋ค. ์คํ ์ค์๋update๋render์ ์ค๋ฅ๊ฐ ๋ ๋ค ๊ฒ์์ด ๋๋๊ธฐ ์ ์ ๋ ์ ์ฅ์ ์ฌ๋ฆฌ์ง ์๊ณ "๊ฒ์์ด ๋๋์ ์ ์ฅํ ํ์ผ์ ์ฌ๋ฆฌ์ง ์์๋ค" ํ ์ค๋ง ๋จ๊น๋๋ค (์ข ๋ฃ ์ฝ๋๋ ์์ง์ด ์ค 1). ๊ฒ์์ด ๋์ง ์์ ๋ ์ ์ฅํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋์ ์นํ(์ํ ํฌํจ)์ ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ์๋ ๋ฆฌ๋ก๋๋ ๊บผ์ ธ ์์ผ๋ฉฐ, ๋ธ๋ฆฌ์ง ๋ชจ๋๋ ํฐ๋ฏธ๋์์INITIAL2D_HMR=1๋ก ๋์ด ์์ง์ผ๋ก ๋ณด๋ด๋ ์์ง์ด ์์ผ๋ฉด ์ฝ์์ "์์ง์ด ๋ ์์ง ์์ ๋ฆฌ๋ก๋๋ฅผ ๊ฑด๋๋ฐ์๋ค" ํ ์ค๋ง ๋จ๊น๋๋ค. ์ ์งํ๊ฑฐ๋ ๊ฒ์ ํญ์ ๋ซ์ผ๋ฉด ์์ง ์ธ์คํด์ค์ WebGL ์ปจํ ์คํธ๋ฅผ ๋ฒ๋ฆฌ๊ณ , ๋ค์ ์คํํ๋ฉด ์๋ก ๋์๋๋ค. - ์คํฌ๋ฆฝํธ ์ค๋ฅ๋ ๋ค์ดํฐ๋ธ ์์ง๊ณผ ๊ฐ์ ์ค(
Lua error in update: ./scripts/lua/main.lua:5: ..., Ruby ๋mruby: uncaught exception in update์ ์ญ์ถ์ )๋ก ์ฝ์์ ์ค๊ณ , ์ค์ ๋๋ฅด๋ฉด ๊ทธ ํ์ผ ๊ทธ ์ค๋ก ๊ฐ๋๋ค. ๋๋๋ ๋ชจ์๋ ๋ค์ดํฐ๋ธ์ ๊ฐ์ต๋๋ค. ์์ ๋๋Update,Render์ ์ค๋ฅ๋ ๊ฒ์์ด ์ข ๋ฃ ์ฝ๋ 1 ๋ก ๋๋๊ณ (๊ฒ์ ํญ ์ํ ๋ "์ค๋ฅ๋ก ๋๋จ (์ข ๋ฃ ์ฝ๋ 1)", ์ํ ๋ฐ "์ข ๋ฃ ์ฝ๋ 1"), ์คํ ์ค ์ ์ฅํ ์คํฌ๋ฆฝํธ์ ์ค๋ฅ๋ ์คํฌ๋ฆฝํธ๋ง ๋ฉ์ถ๊ณ ๊ฒ์ ํญ์ ์ด์ ์์ด์ ๊ณ ์ณ ์ ์ฅํ๋ฉด ๋ค์ ๊ทธ๋ฆฝ๋๋ค (์ฝ์์ ๊ฒฝ๊ณ ). Ruby ์ ๋์๋ ์ฌ๊ท๋ C ๋ฅผ ๊ฑฐ์น๋ ๊ฒ(๋ฌธ์์ด ๋ณด๊ฐ ์์to_s๊ฐ์)๋ ๋ค์ดํฐ๋ธ์ฒ๋ผSystemStackError์ด๊ณ , ์์ง ๋ฐ์ธ๋ฉ ์์์ ๋ C++ ์์ธ(ํ์ ์ด ํ๋ฆฐ ๋งต์ ์ฝ์Tilemap.new๊ฐ์)๋RuntimeError๋ผ์rescue๋ก ์กํ๋๋ค. ์๋ ค์ง ํ๊ณ: ์น ์์ง์์๋ C๋ฅผ ๊ฑฐ์น ๊น์ ์ฌ๊ท ๋๋จธ์ ์์ธ๋ฅผrescue๋ก ์ก์ ๋๋ง๋ค ๊ฒ์์ด ๋ฉ์ถฅ๋๋ค. ํฌ๋กฌ์์ ์์ญ ms, DevTools๊ฐ ๋ถ์ด ์์ผ๋ฉด ์๋ฐฑ ms์ด๊ณ ๋ค์ดํฐ๋ธ๋ 0 ms์ ๋๋ค. ์์ธ ํ๋ ์์ ํ๋์ฉ ํ์ด ๋ด๋ WebAssembly ์์ธ ์ฒ๋ฆฌ์ ๋น์ฉ์ด๋ผ ์์ง์์ ๊ณ ์น ์ ์์ผ๋ฏ๋ก,update๋ง๋ค ์ก์ง ๋ง๊ณ ๋์๋ ์ฌ๊ท๋ฅผ ๊ณ ์นฉ๋๋ค. ์์ธ๊ฐ ์์ง ๋ฐ์ผ๋ก ๋์ค๋ฉด(์์ง์ด ์ฃฝ์๋ค) ์ฝ์์fatal: ํ์ : ๋ฉ์์ง์ค์ด ์ฐํ๊ณ ์ข ๋ฃ ์ฝ๋ 1 ๋ก ๋๋ฉ๋๋ค. ์น ์์ง์์ Lua ์os.exit์ Ruby ์exit!๋ ๊ฒ์์ ๋๋ด์ง ์์ผ๋ฏ๋กGameExit()๋System.exit์ ์๋๋ค. ์ด ํ๋จ๊ณผ FPS(์์ง์ด ๋ ํ๋ ์ ์)๋ ์์ง ๋ก๋์onExit,frames(),errorText()๋ฅผ ์ฐ๊ณ , ๊ทธ๊ฒ์ด ์๋ ์ ์์ง ๋น๋์์๋ ์ค๊ณผ window ์ค๋ฅ๋ก ์์๋ด๊ณ FPS ๋ ํ์ด์ง์ ํ๋ ์ ์์ ๋๋ค. - ์น ์์ง ๋น๋์ mruby ๊ฐ ๋ค์์ผ๋ฉด(
MANIFEST.json์ ๊ธฐ๋ฅ์ดlua mruby wasm)game.json์script๊ฐmruby์ธ ๊ฒ์๋ ๊ฒ์ ํญ์์ ๋๋๋ค. mruby ์์ด ๋ง๋ ๋น๋๋ฉด ๋์ฐ์ง ์๊ณ ์ด์ ๋ฅผ ์๋ฆฝ๋๋ค. - ์์ง ํ์ผ์
packages/app/public/engine/์ ๋ ์์ง ์ ์ฅ์ ์น ๋น๋์ ์ฌ๋ณธ์ด๊ณ Cloudflare Pages ๋น๋์ ๊ทธ๋๋ก ์ค๋ฆฝ๋๋ค. ์์ง์ ๊ณ ์ณค์ผ๋ฉด ์์ง ์ ์ฅ์์์tools/build_web.sh๋ฅผ ๋๋ฆฐ ๋คINITIAL2D_DIR=../Initial2D yarn sync:engine-web์ผ๋ก ๋ค์ ๋ณต์ฌํฉ๋๋ค.MANIFEST.json์ ์์ง ์ปค๋ฐ, ์ปค๋ฐ ์ ๋ ๋ณ๊ฒฝ์ด ์์๋์ง, sha256, ๊ธฐ๋ฅ(wasm ์ libmruby ๊ฐ ๋งํฌ๋์์ผ๋ฉดmruby)์ด ์ ํ๊ณ ๋จ์ ํ ์คํธ๊ฐ ํ์ผ๊ณผ ๋์กฐํฉ๋๋ค.INITIAL2D_DIR์ ์ฅ์๊ฐ MANIFEST ์ ์์ง ์ปค๋ฐ์ ์์ผ๋ฉด ๊ทธbuild-web/site/์๋ ๋์กฐํ๊ณ , ์ปค๋ฐ์ด ๋ค๋ฅด๋ฉด ๊น๋ญ์ ์ ๊ณ ๊ฑด๋๋๋๋ค. - e2e ๋
tests/e2e/game-view.spec.ts์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ ์ํ(Lua ์ Ruby, Lua ์ค๋ฅ ๋, Ruby ์ค๋ฅ ๋. Ruby ์ค๋ฅ๋ ๋ค์ดํฐ๋ธ ์์ง์ด ๊ฐ์ ํ์ผ๋ก ์ฐ๋ ์ค ๋ฌถ์๊ณผ ๊ฒฌ์ค๋๋ค)๊ณผ, ์์ง ์ ์ฅ์(INITIAL2D_DIR)๊ฐ ์์ผ๋ฉด ์๋ฐ๋ฐ๋ ์ฌ๋ณธ์ ๋ธ๋ฆฌ์ง ๋ชจ๋(ํฌํธ 6073,E2E_BRIDGE_PORT๋ก ๋ฐ๊ฟ๋๋ค)๋ก Lua ์ Ruby ๋ ํ ๋๋ฆฝ๋๋ค.GAME_VIEW_SCREENSHOT=<png ๊ฒฝ๋ก>๋ฅผ ์ฃผ๋ฉด ๊ฒ์ ํญ์ ์ฐ์ด ๋ก๋๋ค. - ๊ฐ์ ํ๋ฉด์ธ์ง: ๊ฐ์ e2e ๊ฐ ์์ง์ ์ธ์ ์ฌ(์๋ฐ๋ฐ๋ ํ์ดํ,
INITIAL2D_ALDEBARAN_STOP=title)์ ๊ฐ์ ํ์ผ๋ก ๋ค์ดํฐ๋ธ ์์ง(ํค๋๋ฆฌ์ค, ํ๋ก์ธ์ค ์คํ๊ณผ ๊ฐ์ ์คํ ํ์ผ)๊ณผ ๊ฒ์ ํญ์์ ๋๋ ค 20 ํ๋ ์์งธ๋ฅผ ๊ฒฌ์ค๋๋ค. ๊ท์น์ ์์ง์ ๊ณจ๋ ๊ฒ์ฌ์ ๊ฐ์ต๋๋ค (์ฑ๋ ์ฐจ์ด 24 ์ด๊ณผ๋ฉด ๋ค๋ฅธ ํฝ์ , ๋ค๋ฅธ ํฝ์ 2% ๊น์ง). ๋ค์ดํฐ๋ธ ์คํ ํ์ผ์INITIAL2D_NATIVE(๊ธฐ๋ณธ<์์ง ์ ์ฅ์>/build/Initial2D)์ด๊ณ , ์์ผ๋ฉด ์์ง ์ ์ฅ์์ ๊ณจ๋tests/golden/aldebaran_title.png์ ๊ฒฌ์ค๋๋ค. ์ฐ ๊ฐ์docs/plans/e4-embedded-play.md์ ์์ต๋๋ค.
-
resources/scenes/*.json์ ์ด๋ฉด ์ฌ ๋ทฐ(PIXI)๊ฐ ๋น๋๋ค. ํด๋ฆญ๊ณผ ์์ ์ ํ, ๋๊ธฐ(๋๋๋ฆฌ๊ธฐ ํ ๋จ๊ณ), ๋ฐฉํฅํค(1px, Shift 10px), ๊ฒฉ์์ ์ค๋ ๊ณผ ์ค(Ctrl+=, Ctrl+-, Ctrl+0), ์นด๋ฉ๋ผ ์ฌ๊ฐํ์game.json์ ์ฐฝ ํฌ๊ธฐ์ ๋ฐฐ์จ์์ ์ต๋๋ค. ์ฌ ๋ทฐ๋ ๊ทผ์ฌ์ด๊ณ ์ง์ง ํ๋ฉด์ ์คํ์ด ๋ณด์ฌ ์ค๋๋ค (ํ์ฌ ์ฌ๋ถํฐ ์คํ Ctrl+F5). -
๊ณ์ธต ํจ๋์ ๊ทธ๋ฆฌ๊ธฐ ์์์ด๊ณ (์๊ฐ ๋จผ์ ), ๋ ํ ๊ธ๊ณผ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ(F2)์ ๋์ด์ ์์ ๋ฐ๊พธ๊ธฐ๊ฐ ๋ฉ๋๋ค. ์ธ์คํํฐ๋ ๊ณตํต ์นธ(id, x, y, ํ์)๊ณผ ํ์ ๋ณ ์นธ(์คํ๋ผ์ดํธ: ์ด๋ฏธ์ง์ ํ๋ ์๊ณผ ๋ฐฐ์จ, ๊ธ์: ๊ธ๊ณผ ํฐํธ), ์คํฌ๋ฆฝํธ ๋ชฉ๋ก(๋ถ์ด๊ธฐ, ๋ง๋ค๊ธฐ, ์ด๊ธฐ, ์์, ๋งค๊ฐ๋ณ์), ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ ์ค๋๋ค.
-
์ปดํฌ๋ํธ์ ๋งค๊ฐ๋ณ์: ์ธ์คํํฐ๋ ๋ถ์ ์ปดํฌ๋ํธ๋ฅผ ์์ง์ด ๋ถ๋ฅด๋ ์์๋๋ก ๋ณด์ฌ ์ฃผ๊ณ , ์์๋ ๋จ์ถ๋ก ์์๋ฅผ ๋ฐ๊ฟ๋๋ค. ๋งค๊ฐ๋ณ์๋
scripts/components/<๊ฒฝ๋ก>.json์ ์ ์ธํฉ๋๋ค (Lua์ Ruby๊ฐ ๊ฐ์ ํ์ผ์ ์๋๋ค). ์ ์ธ์ด ์์ผ๋ฉด ์ธ์คํํฐ๊ฐ ๊ทธ ํ๋๋ก ํผ์ ๊ทธ๋ฆฌ๊ณ , ๊ณ ์น ๊ฐ๋ง ์ฌ ํ์ผ์params์ ๋ค์ด๊ฐ๋๋ค. "๊ธฐ๋ณธ๊ฐ ๋ณต์"์ ๊ณ ์น ๊ฐ์ ์ง์๋๋ค. ์ ์ธ์ด ์์ผ๋ฉด "๋งค๊ฐ๋ณ์ ์ ์ธ ๋ง๋ค๊ธฐ"๊ฐ ์ค๋ธ์ ํธ์ ์ด๋ฏธ ์๋ ๊ฐ์ ํ์์ผ๋ก ์ ์ธ ํ์ผ์ ๋ง๋ค์ด ์ฝ๋๋ค. ํธ์ง๊ธฐ๋ ์ ์ธ ํ์ผ์ ์คํค๋ง๋ก ๊ฒ์ฌํ๊ณ , ์ ์ธ์ ๋ง์ง ์๋ ๊ฐ(๋ชจ๋ฅด๋ ํค, ํ์, ๋ฒ์, ์ฌ์ ์๋ ์ค๋ธ์ ํธ)์ ๊ฒ์ฌ ๊ฒฐ๊ณผ์ ์ค๋ฅ๋ก ๋น๋๋ค. ํ์์ ์์งdocs/plans/r1-scene-loader.md5.4์ ์ ๋๋ค.{ "version": 1, "fields": [ { "key": "speed", "type": "number", "label": "์๋", "default": 60, "min": 0 }, { "key": "target", "type": "object", "label": "๋์" } ] }ํ๋ ํ์์ string, text, number, integer, boolean, enum(
values์ค ํ๋), object(์ฌ ์ค๋ธ์ ํธ id)์ ๋๋ค. Lua ์ปดํฌ๋ํธ๋ ํ ์ ๋ง์ง๋ง ์ธ์๋ก ๋ฐ๊ณ (function Mover.update(obj, scene, elapsed, params)), Ruby ์ปดํฌ๋ํธ๋initialize(params = {})๋ก ๋ฐ์ต๋๋ค.์ฌ ๋ก๋๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ๋ ํ ํ๋ฆฟ์์ ๋ณต์ฌ๋ฉ๋๋ค. ์์ง v2.0.0-alpha.2 ์ ์ ๋ง๋ ํ๋ก์ ํธ์ ๋ก๋๋ params ๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฏ๋ก, ์ธ์คํํฐ๊ฐ ์ด๋ฅผ ์๋ฆฌ๊ณ "์ฌ ๋ก๋ ๊ต์ฒด"๋ก ์๋ํฐ์ ๋ ๋ก๋๋ก ๋ฎ์ด์๋๋ค (๋ก๋๋ฅผ ์ง์ ๊ณ ์ณค๋ค๋ฉด ๊ทธ ๋ณ๊ฒฝ์ ์ฌ๋ผ์ง๋๋ค).
-
์ฌ ๋ฉ๋ด: ์ ์ฌ(Ctrl+Shift+N), ์ค๋ธ์ ํธ ์ถ๊ฐ(Ctrl+Shift+A ๋๋ ํ์ ๋ณ ํ์ ๋ฉ๋ด), ์์ ์ฌ์ผ๋ก ์ง์ (
game.json์startScene). ํธ์ง ๋ฉ๋ด์ ๋ณต์ฌ์ ๋ถ์ฌ๋ฃ๊ธฐ์ ๋ณต์ (Ctrl+D)์ ์ญ์ ๋ ์ฌ ํญ์์ ์ค๋ธ์ ํธ๋ฅผ ๋ค๋ฃน๋๋ค. -
ํ์ผ๋งต ์ค๋ธ์ ํธ: ์ฌ > ์ค๋ธ์ ํธ ์ถ๊ฐ > ํ์ผ๋งต. ์ธ์คํํฐ์์
resources/maps/์ ๋งต ํ์ผ์ ๊ณ ๋ฅด๋ฉด ์ฌ ๋ทฐ๊ฐ ๊ทธ ๋งต์ ๋ ์ด์ด๋ฅผ ํ์ผ์ ์ผ๋ก ์ค๋ธ์ ํธ ์๋ฆฌ์ ๊ทธ๋ฆฌ๊ณ , ๋งต ํ์ผ์ด๋ ํ์ผ์ ๊ทธ๋ฆผ์ด ๋ฐ๋๋ฉด ๋ค์ ๊ทธ๋ฆฝ๋๋ค. ๋ฐ๋ฅ ๋ ์ด์ด ์(groundLayers)๋งํผ์ ์ ๋ ์ด์ด๋ ์ฌ์ ๋ชจ๋ ์ค๋ธ์ ํธ ์๋์, ๋๋จธ์ง ๋ ์ด์ด๋ ๋ชจ๋ ์ค๋ธ์ ํธ ์์ ๊ทธ๋ฆฝ๋๋ค. ๋ชฉ๋ก์์ ํ์ผ๋งต๋ณด๋ค ์์ ์๋ ์ค๋ธ์ ํธ๋ ๋ฐ๋ฅ ์์ ๋ณด์ด๊ณ , ๊ฒ์(์์ง์scene_types/tilemap๋ชจ๋์ด ๊ฐ์ ํ์ผ์ ์ฐ๋ค)๊ณผ ๊ฐ์ ์์์ ๋๋ค. "๋งต ์ด๊ธฐ"๋ ๊ทธ ๋งต์ ๋งต ๋ทฐ๋ก ์ฝ๋๋ค. ์ฌ ๋ทฐ์์ ํ์ผ๋งต์ ๋ฐฐ๊ฒฝ์ฒ๋ผ ๋ค๋ฃน๋๋ค. ๋๋ฅด๊ณ ๋์ผ๋ฉด ๊ณ ๋ฅด๊ณ , ๊ณ ๋ฅธ ๋ค์ ๋์ด์ผ ์ฎ๊ฒจ์ง๋ฉฐ, ๊ณ ๋ฅด์ง ์์ ๋งต ์์์ ๋๋ฉด ์์ ์ ํ์ด ๋ฉ๋๋ค. ๋งต ํ์ผ์ ๊ณ ๋ฅด์ง ์์๊ฑฐ๋, ๊ณ ๋ฅธ ๋งต ํ์ผ์ด ์๊ฑฐ๋(์ง์ ๊ฑฐ๋ ์ด๋ฆ์ ๋ฐ๊ฟ), ์์ด๋ ์์ง์ด ์ด์ง ๋ชปํ๋ ๋งต(JSON์ด ์๋๊ฑฐ๋, ๋ฒ์ ๊ณผ ํฌ๊ธฐ๊ฐ ํ๋ ธ๊ฑฐ๋, ๋ ์ด์ด๋ ํ์ผ์ ์ด ๋น์๊ฑฐ๋, ํ์ผ์ ๊ทธ๋ฆผ์ด ์๋ ๋งต)์ ๊ฐ๋ฆฌํค๋ ํ์ผ๋งต์ ์์ง์ด ์ฌ์ ๊ฑฐ๋ถํ๋ฏ๋ก ๊ฒ์ฌ ๊ฒฐ๊ณผ์ ์ค๋ฅ๋ก ๋น๋๋ค. ๊ฒ์ฌ๋ ์์ง์ ๋งต ์ฝ๊ธฐ ๊ท์น์ ๊ทธ๋๋ก ๋ฐ๋ผ์, ์์ง์ด ์ฌ๋ ๋งต์ ์ค๋ฅ๋ก ๋ณด์ง ์์ต๋๋ค. ๋งต ํ์ผ์ด๋ ๊ทธ ํ์ผ์ ๊ทธ๋ฆผ์ด ๋ฐ๋๋ฉด ๋ค์ ๊ฒ์ฌํฉ๋๋ค. -
์ ํ๋ก์ ํธ(Tauri): ๋น ํ๋ก์ ํธ, ํ๋ํผ๋ฒ๋, ํ์ผ๋งต, RPG ๋ฐ๋ชจ ๊ฐ์ด๋ฐ ํ๋์ Lua ๋๋ Ruby. ์์ง์ ์ฌ ๋ก๋์ ์ง์ ํ์ผ๊ณผ ์์ ๊ฐ ํจ๊ป ๋ค์ด๊ฐ๋๋ค. ํ์ผ๋งต์ ํ์ผ์ ๊ณผ ๋งต ํ ์ฅ(
resources/maps/start.json), ๊ทธ ๋งต์ ์ฌ๋ ์ฌ, ๋งต ์ค๋ธ์ ํธ ์คํค๋ง๋ผ์ ๋งต์ ์น ํ๊ณ ๋ฐ๋ก F5 ๋ก ๋๋ ค ๋ณผ ์ ์์ต๋๋ค. RPG ๋ฐ๋ชจ๋ ์์ง์ ใ๋ ๋๊ธฐ ์ ์ใ(ํ์ดํ, ํญ๊ตฌ ๋ง์๊ณผ ์ฌ๊ด, ์ด๋ฒคํธ์ ๋ํ, ์์ดํ )์ด๊ณ RPG ๋ ์ด์ด๊ฐ Lua ์๋ง ์์ด Lua ๋ก๋ง ๋ง๋ญ๋๋ค..gitignore์๋.initial-editor/์ ์์ง์ด ์คํํ ๋ ์ฐ๋config.setting์ด ๋ค์ด๊ฐ๋๋ค. -
ํ ํ๋ฆฟ ํ์ผ์ ์์ง ์ ์ฅ์์ ์ฌ๋ณธ์ ๋๋ค.
INITIAL2D_DIR=../Initial2D yarn sync:templates๋ก ์์ง ์ฒดํฌ์์์์ ๋ค์ ๋ง์ถ๊ณ , ์์ง์ ํ ํ๋ฆฟ ๋ฌถ์(tools/pack_templates.py๊ฐ ๋ง๋Initial2D-templates.zip)์์ ๋ง์ถ ๋๋yarn sync:templates --from-zip <zip ์ด๋ dist ํด๋>์ ๋๋ค. ์์ง์ ์ถ์ ํ์ผ์ด ์ปค๋ฐ๊ณผ ๋ค๋ฅด๋ฉด ๋ฉ์ถ๋ฏ๋ก ์์ง์ ๋จผ์ ์ปค๋ฐํฉ๋๋ค (--allow-dirty๋ก ๋๊ธธ ์๋ ์์ง๋ง ๊ทธ ์ฌ๋ณธ์ ๋จ์ ํ ์คํธ๊ฐ ๋ง์ต๋๋ค). -
๊ต์ฐจ ๊ฒ์ฌ
yarn test:engine-scene์ด ํ ํ๋ฆฟ ์ x ์ธ์ด ๋์ ์์ ํ๋ก์ ํธ๋ก ์จ์ ์ง์ง ์์ง์ ํค๋๋ฆฌ์ค๋ก ๋๋ฆฝ๋๋ค. ๋น ํ๋ก์ ํธ๋ ์ปดํฌ๋ํธ์ ๋งค๊ฐ๋ณ์ ์ ์ธ๊ณผ ๊ฐ์ ์ฃผ๊ณ ์์ง์ด ๋๊ธด params ๋ฅผ ๋ด ๋๋ค. ํ์ผ๋งต์ ๋งต ๋ฌธ์๋ก ์นธ (24, 28) ์ ํ์ ํ์ผ๋ก ์น ํด ์ ์ฅํ ๋ค ์์ง ํ๋ฉด์ ๊ทธ ์นธ ์์ ๋ด ๋๋ค. ์์ง์INITIAL2D_DIR์build/Initial2D์ด๊ณ , ๋ฐฐํฌ์ฉ ๋น๋์ฒ๋ผ ๋ค๋ฅธ ์คํ ํ์ผ์INITIAL2D_EXE=<๊ฒฝ๋ก> yarn test:engine-scene์ผ๋ก ์ค๋๋ค.
์ปดํฌ๋ํธ๋ฅผ ๋ ธ๋ ๊ทธ๋ํ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ํ๋ ์ ์คํ๊ธฐ๊ฐ ์๋๋ผ Lua ์ Ruby ์ฝ๋๋ฅผ ๋ง๋๋ ์๋ณธ์ด๋ผ์, ๊ฒ์์ ์์ผ๋ก ์ด ์ปดํฌ๋ํธ์ ๋๊ฐ์ด ๋๋๋ค (์ฌ ๋ก๋, ๋งค๊ฐ๋ณ์, ํซ ๋ฆฌ๋ก๋, ์ค๋ฅ ์ค). ๊ณํ๊ณผ ํฌ๋งท์ docs/plans/visual-scripting.md์ ๋๋ค.
- ๊ทธ๋ํ๋
scripts/components/<๊ฒฝ๋ก>.graph.json์ด๊ณ ์ปดํฌ๋ํธcomponents/<๊ฒฝ๋ก>๊ฐ ๋ฉ๋๋ค. ์ ์ฅํ๋ฉดscripts/lua/components/<๊ฒฝ๋ก>.lua,scripts/ruby/components/<๊ฒฝ๋ก>.rb, ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ์ผ๋ฉด ์ ์ธ ํ์ผscripts/components/<๊ฒฝ๋ก>.json์ ํจ๊ป ์๋๋ค. ์์ฑ ํ์ผ์ ์ปค๋ฐํฉ๋๋ค (์์ง์ ๊ทธ๋ํ๋ฅผ ์ฝ์ง ์์ต๋๋ค). ๊ฒ์์ด ๋๋ ์ค์ด๋ฉด ์์ฑ ์ฝ๋๋ ํซ ๋ฆฌ๋ก๋์ ์ค๋ฆฝ๋๋ค. - ํ์ผ > ์ ๊ทธ๋ํ ์ปดํฌ๋ํธ(Ctrl+Alt+G)๋ก ๋ง๋ค๊ณ , ๊ทธ๋ํ ํ์ผ์ ์ด๋ฉด ์บ๋ฒ์ค๊ฐ ๋น๋๋ค. ๋ ธ๋๋ ์ค๋ฅธ์ชฝ ํด๋ฆญ์ด๋ ๋ ๋ฒ ํด๋ฆญ, ๋๋ ํฌํธ์์ ๋ ์ ์ ๋น ๊ณณ์ ๋์ ์ฌ๋ ๋ชฉ๋ก์์ ๋ํ๊ณ , ํฌํธ์์ ํฌํธ๋ก ๋์ด ์์ต๋๋ค. ์ด์ด์ง์ง ์์ ์ ๋ ฅ์ ์์๋ ๋ ธ๋ ์์์ ๊ณ ์นฉ๋๋ค. ์ ์ฐฝ์์ ๊ณ ๋ฅธ ๋ ธ๋์ ์ค์ ๊ณผ ์ํ ํ๋, ์ง์ญ ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ ธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณ ์นฉ๋๋ค. ์๋ ์ ๋ ฌ, ๋๋๋ฆฌ๊ธฐ, ๋ณต์ฌ์ ๋ถ์ฌ๋ฃ๊ธฐ, ๋ณต์ , ์ญ์ ๊ฐ ๋ฉ๋๋ค.
- ์ด๋์ ๊ฐ์ด๋ฐ๋ ์ค๋ฅธ์ชฝ ๋ฒํผ(๋๋ Space ์ ๋๊ธฐ), ํ๋๋ ํ , F ๋ ํ๋ฉด ๋ง์ถค์ด๊ณ , ์ค๋ฅธ์ชฝ ์๋ ๋ฏธ๋๋งต์ ๋๋ฅด๋ฉด ๊ทธ ์๋ฆฌ๋ก ๊ฐ๋๋ค. ์ ์ ์ค๋ฅธ์ชฝ ํด๋ฆญ์ด๋ Alt ์ ํฌํธ ํด๋ฆญ์ ์ฐ๊ฒฐ์ ๋์ต๋๋ค. ์ ์ ๋น ๊ณณ์ ๋์ ์ฐ ๋ชฉ๋ก์ ๊ทธ ์ ์ ์ด์ ์ ์๋ ๋ ธ๋๋ง ๋ณด์ ๋๋ค.
- ์ ์ฐฝ์ ์ํ ํ๋, ์ง์ญ ๋ณ์, ๋งค๊ฐ๋ณ์ ์ค ์์ โ ฟ ์์ด์ฝ์ ์บ๋ฒ์ค๋ก ๋๋๊ทธํ๋ฉด ๊ทธ ์ฝ๊ธฐ ๋ ธ๋๊ฐ ์๊ธฐ๊ณ , ์ ๋ ฅ ํฌํธ ์๋ก ๋๋๊ทธํ๋ฉด ๊ทธ ํฌํธ์ ๋ฐ๋ก ์ด์ด์ง๋๋ค. Alt ๋ฅผ ๋๋ฅธ ์ฑ ๋์ผ๋ฉด ์ฐ๊ธฐ ๋ ธ๋์ ๋๋ค (๋งค๊ฐ๋ณ์๋ ์ฝ๊ธฐ๋ง).
- ํจ๊ณผ์๊ณผ ๋ฐฐ๊ฒฝ ์์ ๋ ธ๋๋ ํ์ผ ๊ฒฝ๋ก(๋น ๊ฐ์ด๋ ํด๋ ๊ฒฝ๋ก๋ ์ค๋ฅ), ์ด๋ฆ(๋น์ฐ๋ฉด ํ์ผ ๊ฒฝ๋ก), ๋ฐ๋ณต(ํจ๊ณผ์์ ์ถ๊ฐ ๋ฐ๋ณต, ์์ ์ ์ฌ์ ํ์)์ ๋๋ค.
- ๋จธ๋ฆฌ์ค์ "๋ฉ๋ชจ"๋ ์ ํํ ๋ ธ๋๋ฅผ ๊ฐ์ธ๋ ๋ฉ๋ชจ ์์๋ฅผ ๋ง๋ญ๋๋ค. ์ ๋ชฉ ์ค์ ๋๋ฉด ์์ ๋ ธ๋๊ฐ ํจ๊ป ์์ง์ ๋๋ค. ๋ฉ๋ชจ๋ ์ฝ๋์ ๋ค์ด๊ฐ์ง ์์ต๋๋ค.
- ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ฝ๋๋ฅผ ๋ง๋ค์ง ์๊ณ , ๋ ธ๋ ํ ๋๋ฆฌ์ ์ ์ฐฝ์ ๋ฌธ์ ๋ชฉ๋ก์ ๋ณด์ ๋๋ค. ๊ฒ์์ ์ค๋ฅ ์ค(์ฝ์ ๋งํฌ)์ด ์์ฑ ํ์ผ์ ๊ฐ๋ฆฌํค๋ฉด ๊ทธ๋ํ๋ฅผ ์ด๊ณ ๊ทธ ์ค์ ๋ง๋ ๋ ธ๋๋ฅผ ๊ณ ๋ฆ ๋๋ค. ์์ฑ ํ์ผ์ ์คํฌ๋ฆฝํธ ์๋ํฐ์์ ์ฝ๊ธฐ ์ ์ฉ์ด๊ณ "๊ทธ๋ํ ์ด๊ธฐ" ๋จ์ถ๊ฐ ์์ต๋๋ค.
- ์ธ์คํํฐ์ ์ปดํฌ๋ํธ "์ด๊ธฐ"๋ ๊ทธ ์ปดํฌ๋ํธ์ ๊ทธ๋ํ๊ฐ ์์ผ๋ฉด ๊ทธ๋ํ๋ฅผ ์ฝ๋๋ค.
- ์์ฑ ํ์ผ์ ์ฒซ ์ค์
-- ๊ทธ๋ํ์์ ๋ง๋ ํ์ผ: <๊ทธ๋ํ ๊ฒฝ๋ก>์ ๋๋ค. ์ด ์ค์ด ์๋ ํ์ผ(์์ผ๋ก ์ด ํ์ผ)์ ๋ฎ์ด์ฐ์ง ์์ต๋๋ค. - ๋ ธ๋๋ ์ด๋ฒคํธ(init, update, render, destroy), ํ๋ฆ(์กฐ๊ฑด ๋ถ๊ธฐ, ๊ฐ ๋ถ๊ธฐ, ๋ฐ๋ณต), ์ํ์ ์ง์ญ ๋ณ์์ ๋งค๊ฐ๋ณ์, ์ค๋ธ์ ํธ์ props, ์ฌ, ์ํ, ๋น๊ต์ ๋ ผ๋ฆฌ, ํ ์คํธ, ์์ง API(์ ๋ ฅ, ์๋ฆฌ, ํ๋ฉด ํฌ๊ธฐ ๋ฑ 22๊ฐ)์ ๋๋ค.
- ๊ฒ์์ ๋์ฐ๋ฏธ ๋ชจ๋์ ๋
ธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(
*.nodes.json)๋ก ๋ ธ๋๊ฐ ๋ฉ๋๋ค. ๋ ์ธ์ด์ ์ด๋ฆ์ ์ ์ด ๋๋ฉด Lua ๋flappy.GRAVITY, Ruby ๋FlappyCommon::GRAVITY๋ก ๋ถ๋ฆ ๋๋ค. ๊ณต์ ์ํ ํ๋ฅผ ๋ฐํํ๋ ํจ์์ ํ๋(fields)๋ฅผ ์ ์ด ๋๋ฉด ๊ทธ ์ํ๋ฅผ ์ฐ๋ ๊ทธ๋ํ๋ค์ด ํ๋๋ฅผ ๋ค์ ์ ์ง ์์ต๋๋ค. - ์: ํ๋ํผ
bird์ ์ฒด๋ฅผ ๋ ธ๋ 80๊ฐ๋ก ์ ์ ๊ทธ๋ํ๊ฐpackages/core/src/graph/fixtures/flappy/์ ์๊ณ , ๋ง๋ ์ฝ๋(bird.expected.lua,bird.expected.rb)๊ฐ ๊ทธ ์์ ์์ต๋๋ค.
๊ต์ฐจ ๊ฒ์ฌ yarn test:engine-graph ๋ ๊ทธ๋ํ์์ ๋ง๋ ์ฝ๋๋ฅผ ์ง์ง ์์ง์ผ๋ก ๋๋ฆฝ๋๋ค. ํ๋ํผ๋ bird ๋ฅผ ๊ทธ๋ํ์ ๊ฒ์ผ๋ก ๋ฐ๊ฟ๋ ์์ผ๋ก ์ด bird ์ ๊ฐ์ ํ(์ํ ์ ์ด, ์ ์, ์์ฝ)์ด ๋์ค๋์ง, ์ํ๋ฌ ๊ทธ๋ํ๋ ๋
ธ๋๋ง๋ค ์ฐ์ ๊ฐ์ด ๊ธฐ๋๊ฐ๊ณผ ๊ฐ๊ณ Lua ์ Ruby ๊ฐ ๊ฐ์์ง ๋ด
๋๋ค.
INITIAL2D_DIR=../Initial2D yarn test:engine-graph # ์์ง ๋น๋(build/Initial2D)๊ฐ ์์ด์ผ ํ๋ค
KEEP_WORKDIR=1 yarn test:engine-graph # ์์ ํ๋ก์ ํธ๋ฅผ ๋จ๊ธด๋คresources/maps/*.json(์์ง ๋งต ํฌ๋งท v1, v2)์ ์ด๋ฉด ๋งต ๋ทฐ๊ฐ ๋น๋๋ค. ์๋ฐ๋ฐ๋ ์ฒ(256x28 ์นธ)์ฒ๋ผ ์์ฑ๊ธฐ๊ฐ ๋ง๋ ๋งต๋
์ค์ ํ์ผ์
์ผ๋ก ๋ณด์ด๊ณ , ๋ชฌ์คํฐ์ ์์ฐฐ ๋ฒ์, ํ์ , ๊ตฌ๊ฐ ๊ฐ์ ๋ฐฐ์น๊ฐ ๋งต ์์ ํ์์ผ๋ก ๋์ต๋๋ค.
- ์น ํ๊ธฐ: ํ๋ ํธ์์ ํ ์นธ์ ๋๋ฅด๊ฑฐ๋ ๋์ด์ ์ฌ๋ฌ ์นธ์ ๊ณ ๋ฅด๊ณ ํ(B), ์ฌ๊ฐํ(R), ์ฑ์ฐ๊ธฐ(G), ์ง์ฐ๊ฐ(E), ์คํฌ์ด๋(I)๋ก ์น ํฉ๋๋ค. ๋ถ์ง ํ ๋ฒ์ด ๋๋๋ฆฌ๊ธฐ ํ ๋จ๊ณ์ ๋๋ค. ์น ํ ๋ ์ด์ด๋ ๋ ์ด์ด ํจ๋์์ ๊ณ ๋ฅด๊ณ , ๊ฑฐ๊ธฐ์ ๋ณด์ด๊ธฐ์ ์ด๋ฆ๊ณผ ์ถ๊ฐ, ์ญ์ , ์์๋ ๋ฐ๊ฟ๋๋ค.
- ํตํ: ํตํ ๋๊ตฌ(C)๋ก ์ผ์ชฝ ํด๋ฆญ์ ํตํ ๋ถ๊ฐ(1), ์ค๋ฅธ์ชฝ ํด๋ฆญ์ด๋ Alt๋ ํตํ ๊ฐ๋ฅ(0)์ ๋๋ค. ๋งต > ํตํ ์ค๋ฒ๋ ์ด๋ก ๊ฒน์ณ ๋ด ๋๋ค.
- ์ค๋ธ์ ํธ: ์ค๋ธ์ ํธ ๋๊ตฌ(V)๋ก ๊ณ ๋ฅด๊ณ ๋์ด ์ฎ๊น๋๋ค. ์์ฐฐ ๋ฒ์ ์์ก์ด์ ๋ ๊ฐ์ฅ์๋ฆฌ๋ ๋๋ฆฝ๋๋ค. ๋งต ์ค๋ธ์ ํธ ํจ๋์ ํ์
๋ณ ๋ชฉ๋ก๊ณผ ์ถ๊ฐ, ์ธ์คํํฐ๋ ํ๋ก์ ํธ์
resources/schema/map-objects.json์ผ๋ก ๋ง๋ ํผ๊ณผ ๊ฒ์ฌ ๊ฒฐ๊ณผ์ ๋๋ค. ํ์ ๊ณผ ์นธ์ ์คํค๋ง๊ฐ ์ ํ๋ฏ๋ก ์๋ํฐ๋ ๋ชฌ์คํฐ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฆ ๋๋ค. ํ์ ์นธ์ด ๋น๋ฉด(๊ธ ์นธ์ ๊ณต๋ฐฑ๋ฟ์ด์ด๋) ๊ฒ์ฌ ๊ฒฐ๊ณผ์ ๋น๋๋ค. - ํธ์ง ๋ฉ๋ด: ๋งต ํญ์์๋ ์๋ผ๋ด๊ธฐ, ๋ณต์ฌ, ๋ถ์ฌ๋ฃ๊ธฐ, ๋ณต์ (Ctrl+D), ์ญ์ ๊ฐ ๋งต ์ค๋ธ์ ํธ๋ฅผ ๋ค๋ฃน๋๋ค. ๋ถ์ธ ๊ฒ๊ณผ ๋ณต์ ํ ๊ฒ์ ํ ์นธ ์ค๋ฅธ์ชฝ์ ๋์ด๊ณ y๋ ๊ทธ๋๋ก๋ผ ๋ฐ๋ฅ์ ์ ๋ชฌ์คํฐ์ ์์ ์ง์ ์ด ๋ฐ๋ฅ์ ๋จ์ต๋๋ค. ์์ฐฐ ๋ฒ์๋ ๊ฐ์ด ์ฎ๊ฒจ์ง๊ณ , ๋งต ์ค๋ฅธ์ชฝ ๋์ด๋ฉด ์ผ์ชฝ์ผ๋ก ๊ฐ๋๋ค. ์๋ผ๋ด๊ณ ๋ถ์ด๋ฉด id๊ฐ ๊ทธ๋๋ก๋ผ ์ฎ๊ธฐ๊ธฐ๊ฐ ๋ฉ๋๋ค(์์ ์ง์ ์
start๊ทธ๋๋ก). ์ฌ ์ค๋ธ์ ํธ์๋ ํด๋ฆฝ๋ณด๋๊ฐ ๋ฐ๋ก์ ๋๋ค. - ์ ๋งต: ๋งต > ์ ๋งต(Ctrl+Alt+M). ์ด๋ฆ, ํฌ๊ธฐ, ํ์ผ ํฌ๊ธฐ, ํ์ผ์
(ํ๋ก์ ํธ์ PNG), ๋ ์ด์ด ์ด๋ฆ, ํตํ์ ์ ํ๋ฉด
resources/maps/<์ด๋ฆ>.json์ด ์๊ธฐ๊ณ ์ด๋ฆฝ๋๋ค. - ํฌ๊ธฐ ๋ฐ๊พธ๊ธฐ: ๋งต > ํฌ๊ธฐ ๋ฐ๊พธ๊ธฐ, ๋๋ ๋งต ๋ทฐ ๋จธ๋ฆฌ ๋ ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆ ๋๋ค. ๊ธฐ์ค์ (์ํ ์นธ)์ ๋ฐ๋ผ ๋ด์ฉ์ด ์ฎ๊ฒจ์ง๊ณ , ๋งต ๋ฐ์ผ๋ก ๋๊ฐ๋ ์ค๋ธ์ ํธ๋ ์ง์ฐ์ง ์๊ณ ์๋ ค ์ค๋๋ค.
- ์ด ๋งต์์ ์คํ: ๋งต > ์ด ๋งต์์ ์คํ(Ctrl+F5, ๋ฐ์คํฌํฑ ์ฑ). ์คํค๋ง์
play.env๋ฅผ ์ฑ์ ์์ง์ ๋์๋๋ค. ์ค๋ธ์ ํธ๋ฅผ ํ๋ ๊ณจ๋์ผ๋ฉด ๊ทธ ์๋ฆฌ(๋ฒ์๊ฐ ์๋ ๋ชฌ์คํฐ๋ ๋ฒ์ ์ต์ X์์ 48px ์ผ์ชฝ), ์๋๋ฉด ์ปค์๋ ํ๋ฉด ๊ฐ์ด๋ฐ์ ์์ํฉ๋๋ค. ์๋ฐ๋ฐ๋์INITIAL2D_ALDEBARAN_STAGE์INITIAL2D_ALDEBARAN_AT์ ๋ฐ์ต๋๋ค. ์คํค๋ง์play์"maps": ["aldebaran_*"]์ฒ๋ผ ๋งต ์ด๋ฆ ๊ธ๋กญ ๋ชฉ๋ก(*๋ ์๋ฌด ๊ธ์์ด,?๋ ํ ๊ธ์)์ ๋๋ฉด ๋ง๋ ๋งต์์๋ง ์์ง์ ๋์๋๋ค. ๋ค๋ฅธ ๋งต์์๋ ์ฌ๊ธฐ์ ์คํ๊ณผ Ctrl+F5๋ ์ผ์ ธ ์๊ณ , ๋๋ฅด๋ฉด ๋์ฐ์ง ์๊ณ ์ด์ ๋ฅผ ํ ์คํธ์ ์ฝ์์ ํ ์ค๋ก ์๋ฆฝ๋๋ค. ๋ฉ๋ด ํดํ์๋ ๊ทธ ์ด์ ๊ฐ ๋ณด์ ๋๋ค. ์์ผ๋ฉด ๋ชจ๋ ๋งต์์ ๋์๋๋ค. - ์ ์ฅ(Ctrl+S)์ ์์ง๊ณผ ๊ฐ์ ํ์์
๋๋ค. 2์นธ ๋ค์ฌ์ฐ๊ธฐ์ ํ์ผ ๋ฐฐ์ด์ ๋งต ํ ์ค์ด ํ ์ค์ด๋ผ diff๊ฐ ์นธ ๋จ์๋ก ๋ณด์ด๊ณ ,
objects์events์ ๋ชจ๋ฅด๋ ํค๋ ๊ทธ๋๋ก ๋จ์ต๋๋ค. - ๋งต ํญ์ ์ด๋ฉด ํ๋ ํธ, ๋ ์ด์ด, ๋งต ์ค๋ธ์ ํธ ํจ๋์ด ์์ ๋ ๋ถ์ต๋๋ค (์ง์ ๋ซ์ ๊ฒ์ ๋ค์ ์ด์ง ์์ต๋๋ค). ์ฐฝ > ๋ ์ด์์ > ํ์ผ๋งต์ ๋งต ํธ์ง์ฉ ๋ฐฐ์น์ ๋๋ค.
์ธ์ ํ
์คํธ tests/e2e/aldebaran-map.spec.ts๋ ์์ง ์ ์ฅ์์ ์ฒ ๋งต์ ์ฌ๋ณธ์ผ๋ก ์ด์ด ํ์ผ ์ธ ์นธ๊ณผ ๋๋ ํ๋๋ฅผ ๊ณ ์ณ
์ ์ฅํ๊ณ , Ctrl+F5๊ฐ ๋๊ธด ํ๊ฒฝ ๋ณ์์ INITIAL2D_ALDEBARAN_TRACE=1์ ๋ํด ์์ง์ ํค๋๋ฆฌ์ค๋ก ๋๋ฆฝ๋๋ค (Lua, ๋น๋์ mruby๊ฐ
์์ผ๋ฉด Ruby๋). ์์ง์ด ์ฐ๋ ์๋ฐ๋ฐ๋: ๋งต <๊ฒฝ๋ก> ํ์ผ <๊ฒ์ฌํฉ> ์ค์ ๊ฒ์ฌํฉ์ด ์ ์ฅํ ํ์ผ์์ ๊ฐ์ ์(๋ ์ด์ด ์์์ ์นธ ์์๋๋ก
(ํฉ * 31 + gid) mod 1000000007)์ผ๋ก ๊ณ์ฐํ ๊ฐ๊ณผ ๊ฐ๊ณ ์๋ณธ์ ๊ฐ๊ณผ ๋ฌ๋ผ์ผ ํ๋ฉฐ, ์๋ฐ๋ฐ๋: ๋ชฌ์คํฐ ... ์ค์์ ์ฎ๊ธด ๋๋๊ฐ ์ x์
์์ฐฐ ๋ฒ์์ฌ์ผ ํต๊ณผํฉ๋๋ค. ์์ง์ด ๊ณ ์น์ง ์์ ๋งต์ ์ฝ์ผ๋ฉด ์คํจํฉ๋๋ค. ์์ง ์ ์ฅ์๋ ๊ณ ์น์ง ์์ต๋๋ค.
yarn build
INITIAL2D_DIR=../Initial2D yarn test:e2e tests/e2e/aldebaran-map.spec.ts # ์์ง ๋น๋(build/Initial2D)๊ฐ ์์ด์ผ ํ๋ค
KEEP_WORKDIR=1 INITIAL2D_DIR=../Initial2D yarn test:e2e tests/e2e/aldebaran-map.spec.ts # ์ฌ๋ณธ ํ๋ก์ ํธ์ ์คํฌ๋ฆฐ์ท์ ๋จ๊ธด๋ค์์ง ์คํ ํ์ผ์ด๋ ์ฒ ๋งต์ด ์์ผ๋ฉด ๊ฑด๋๋๋๋ค. ์์ง์ INITIAL2D_ALDEBARAN_AT์ผ๋ก ์์ํ ๋๋ง๋ค
์๋ฐ๋ฐ๋: ์์ x <x> (y <y>)๋ฅผ ์ฐ๊ณ (์์ง PR #47 ์ดํ), INITIAL2D_ALDEBARAN_TRACE=1์ด๋ฉด ๋งต๊ณผ ๋ชฌ์คํฐ ๊ฒ์ ์ค์ ์ฐ๋
ํ(์์ง PR #48 ์ดํ)์ด์ด์ผ ํฉ๋๋ค. ๊ฒ์ ์ค์ด ์๋ ์์ง์ด๋ฉด ํ
์คํธ๊ฐ ์คํจํฉ๋๋ค.
๊ต์ฐจ ๊ฒ์ฌ yarn test:engine-map์ ๋งต ํธ์ง์ด ์์ง๊ณผ ๋ง๋์ง ์ธ ๊ฐ์ง๋ก ๋ด
๋๋ค. ํธ์ง์ ๋งต ๋ทฐ์ ๋๊ตฌ์ ๋งต ๋ฌธ์, ์ฌ ๋ฌธ์๋ก ํ๊ณ
์ ์ฅ๋ ์ฑ๊ณผ ๊ฐ์ ํจ์๋ก ํฉ๋๋ค.
- ํตํ: ํ์ผ๋งต ํ
ํ๋ฆฟ์ ๋งต์์ ํตํ์ ๋ง๊ณ ํ์ด ์ ์ฅํฉ๋๋ค. ์ฌ์ ํ์นจ ์ปดํฌ๋ํธ๋ฅผ ๋ถ์ฌ ์์ง์
IsPassable(Ruby๋passable?)์ ์นธ๋ง๋ค ์ฐ๊ฒ ํ๊ณ , ์ ์ฅํ ํ์ผ๊ณผ ์๋ํฐ ๋ชจ๋ธ๊ณผ ์นธ๋ง๋ค ๊ฐ์์ง ๋ด ๋๋ค. Lua์ Ruby ๋ ๋ค ๋๋ฆฝ๋๋ค. - ์ ๋งต ๊ณจ๋ : ์ ๋งต ๋ํ์์์ ๊ฐ์ ํจ์๋ก ๋งต์ ๋ง๋ค๊ณ ๋ ๋ ์ด์ด๋ฅผ ์น ํด ์ฌ์ ํ์ผ๋งต ์ค๋ธ์ ํธ์ ๊ฒ๋๋ค. ์์ง์ ํ๋ ์ 30์ ์ ์ฅํ ๋งต๊ณผ ํ์ผ์ ์ผ๋ก ๊ทธ๋ฆฐ ๊ธฐ์ค๊ณผ ๊ฒฌ์ค๋๋ค. ๊ท์น์ ์ฒ๊ณผ ๊ฐ์ต๋๋ค (์ฑ๋๋ง๋ค ยฑ8, ๋ ์ด์ด๋ง๋ค, ์น ํ ์นธ๋ง๋ค). Lua์ Ruby ๋ ๋ค ๋๋ฆฝ๋๋ค.
- ํญ๊ตฌ ๋ง์: ์์ง ์ ์ฅ์ ์ถ์ ํ์ผ์ ์ฌ๋ณธ์์
port_town.json์ ์ด๋ฒคํธ ๋ ์ด์ด๊ฐ ๋ถ์ ์ฑ๋ก ์ด๊ณ , ๊ณจ๋ ํ๋ฉด ๋ฐ์ ํ ์นธ์ ์น ํด ์ ์ฅํฉ๋๋ค. ํ์ผ์ ๊ทธ ์นธ๋ง ๋ฌ๋ผ์ผ ํ๊ณ , ์์ง์ ์ธ์ ์๋๋ฆฌ์ค(run_engine_tests.py --only=rpgdemo_scene)๊ฐ ์น ํ๊ธฐ ์ ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ก ํต๊ณผํด์ผ ํฉ๋๋ค. ์ง ์์ ๋์ฌ๊ฐ ์ ์ฅํ ์ด๋ฒคํธ์ ๊ธ์ธ์ง, ๋ฌ๋๊ฐ ๋ณด๋ ๋งต ํ๋ฉด ์ (town, bag, wall)์ด ์น ํ๊ธฐ ์ ๊ณผ ํฝ์ ๊น์ง ๊ฐ์์ง๋ ๋ด ๋๋ค. ๋ฌ๋์ ๊ณจ๋ ๊ฒ์ฌ๋ ๋ค๋ฅธ ํฝ์ 2%๊น์ง ๋ฐ์์ ํ ์นธ ์ฐจ์ด๋ ๋ณด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ๋ง๋ค ๋์กฐ๊ฐ ์์ต๋๋ค. ์์ง์๊ฒ๋ง ๊ณ ์น๊ธฐ ์ ๋งต, ์น ํ๊ธฐ ์ ๋งต, deco๋ฅผ ๋น์ด ๋งต์ ์ฃผ๋ฉด ํ์ ์ด ๋จ์ด์ง๋์ง ๋ณด๊ณ , ๋ง์ ์ฒซ ํ๋ฉด ์์
์นธ์ ์น ํ๋ฉด ๊ทธ ํ๋ฉด์ด ๊ทธ ์นธ ์๋ฆฌ์์๋ง ๋ฌ๋ผ์ง๋์ง ๋ด
๋๋ค. ์์ง ์คํ ํ์ผ์ด ์์ผ๋ฉด SKIP: ํ ์ค์ ์ฐ๊ณ ํต๊ณผํฉ๋๋ค.
INITIAL2D_DIR์ด git ์ ์ฅ์๊ฐ ์๋๋ฉด ํญ๊ตฌ ๋ง์๋ง ๊ฑด๋๋๋๋ค. ์์ง ์ ์ฅ์๋ ๊ณ ์น์ง ์์ต๋๋ค.
INITIAL2D_DIR=../Initial2D yarn test:engine-map # ์์ง ๋น๋(build/Initial2D)์ python3, Pillow๊ฐ ์์ด์ผ ํ๋ค
KEEP_WORKDIR=1 yarn test:engine-map # ์์ ํ๋ก์ ํธ์ ์์ง ์ฌ๋ณธ์ ๋จ๊ธด๋ค์ค์น๋ณธ์ ์์ง ์คํ ํ์ผ ํ๋๋ฅผ ์ฑ ์์ ์ฃ์ต๋๋ค. ์์ง ์ ์ฅ์์ tools/build_dist.sh ๋ก ๋ง๋ ๋ฐฐํฌ์ฉ ๋น๋์ด๊ณ , ์๋ํฐ๊ฐ ๋ฌถ์ด๋ ์์ง ์ปค๋ฐ์
engine-pin.json ์ ์์ต๋๋ค.
# ํ์ด ์์ง์ ๊ณต๊ฐ ๋ฆด๋ฆฌ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ฉด (engineTag) ์์ง ๋น๋ ์์ด ๋ฆด๋ฆฌ์ค์์ ๋ฐ๋๋ค
yarn engine:fetch # ํ์ sha256 ์ผ๋ก ํ์ธํ๋ค
# ์์ง์ ์ง์ ๋ง๋ค ๋: ์์ง ์ ์ฅ์์์ (ํ์ ์ปค๋ฐ์ผ๋ก ์ฒดํฌ์์ํ ๋ค)
tools/build_dist.sh # dist/Initial2D-<ํธ๋ฆฌํ>, dist/engine-dist.json
# ์๋ํฐ์์
yarn engine:fetch --from ../Initial2D/dist # src-tauri/binaries/ ์ src-tauri/licenses/engine/ ์ผ๋ก ๋ฐ๋๋ค
yarn luals:fetch # ์ฑ์ ์ฃ๋ ์ธ์ด ์๋ฒ LuaLS ๋ฅผ src-tauri/luals/ ๋ก (์ค์น๋ณธ ๋น๋ ์ ์)
node scripts/check-sidecar.mjs src-tauri/binaries/Initial2D-aarch64-apple-darwin
yarn tauri dev --config src-tauri/tauri.sidecar.conf.json # ์ฑ์ ๋ ์์ง์ผ๋ก ๊ฐ๋ฐ ๋น๋
yarn tauri build --config src-tauri/tauri.dist.conf.json --config src-tauri/tauri.sidecar.conf.json # ์ค์น๋ณธ (.app ๊ณผ dmg)
yarn engine:check # ํ
ํ๋ฆฟ, ์น ์์ง, RPG ํฝ์ค์ฒ, ๋ฐ์ ์์ง์ด ํ์ ์ปค๋ฐ์ธ์ง-
์ค์น๋ณธ ๋น๋๋ ๋ฎ์ด์ฐ๊ธฐ ์ค์ ๋์ ์ด ์์๋ก ์ค๋๋ค.
tauri.dist.conf.json์ด ์์ค๋งต ์๋ ํ๋ฐํธ(yarn build:desktop)์ ์ 3์ ๊ณ ์ง(licenses/)์ ์ธ์ด ์๋ฒ(luals/, ๋จผ์ yarn luals:fetch)๋ฅผ,tauri.sidecar.conf.json์ด ์ฑ์ ๋ ์์ง๊ณผengine.json์ ์ฃ์ต๋๋ค.--bundles๋ฅผ ์ฃผ์ง ์์ผ๋ฉด.app๊ณผ ํจ๊ป dmg ๋ ๋ง๋ค๊ณ , ๊ทธ๋ Finder ์ฐฝ์ด ์ ๊น ๋น๋๋ค..app๋ง ๋ง๋ค๋ ค๋ฉด--bundles app์ ๋ถ์ ๋๋ค. -
--fromํด๋๋ ์์ง์dist/๋dist.yml์ฐ์ถ๋ฌผ ํด๋์ ๋๋ค. ์์ง ์ปค๋ฐ์ด ํ๊ณผ ๋ค๋ฅด๋ฉด ๋ฐ์ง ์๊ณ , ๋ค๋ฅธ ์์ง์ ์ ๊น ์ํํ ๋๋--any-commit์ ๋ถ์ ๋๋ค.--target <ํธ๋ฆฌํ>๋ก ๋ค๋ฅธ ํ๊น์ ๋ฐ๊ณ , Windows ํ๊น์ ์์ง์ด ์์ด ๊ณ ์ง๋ง ๋ฐ์ต๋๋ค.--templates <๋น ํด๋>๋ ์์ง ๋์ ํ ํ๋ฆฟ ๋ฌถ์(Initial2D-templates.zip)์ ํ๋๋ค. -
๋ฐ์ ํ์ผ์ gitignore ์ ๋๋ค:
src-tauri/binaries/Initial2D-<ํธ๋ฆฌํ>,src-tauri/binaries/engine.json(ํ ์ ๋ณด. ์ํ ๋ฐ ํดํ๊ณผ ์ค์ ์ "์ฑ์ ๋ ์์ง (cac4b94, lua mruby)" ์ฒ๋ผ ๋ณด์ ๋๋ค),src-tauri/licenses/engine/THIRD-PARTY.md. -
check-sidecar.mjs๋ ๋ฐ์ ํ์ผ์ด๋ ๋น๋ํ.app์ ๋ฐ์ ๋์ ์์กด(Homebrew ๊ฒฝ๋ก๊ฐ ์๋์ง),--features,--version์ ์ปค๋ฐ์ด ํ๊ณผengine.json์ ๊ฐ์์ง, ๋ชจ๋ฅด๋ ์ธ์์ ์ข ๋ฃ ์ฝ๋ 2 ์ธ์ง ๋ด ๋๋ค. ์์ง์ ๋ฒ๋ฆฌ๋ ์์ ํด๋์์ ์ฐฝ ์์ด ๋๋๋ค.engine.json์ ๋ฐ์ ํ์ผ ์(src-tauri/binaries/engine.json)์ด๋ ์ฑ์Contents/Resources/engine/์์ ์ฐพ๊ณ , ์์ผ๋ฉด ์คํจํฉ๋๋ค. ๋ค๋ฅธ ๊ณณ์ ์์ผ๋ฉด--engine-json <๊ฒฝ๋ก>, ์์ง ์คํ ํ์ผ๋ง ๋ณผ ๋๋--no-engine-json์ ๋ถ์ ๋๋ค. -
์์ง์ ์ฌ๋ฆด ๋๋
engine-pin.json์engineCommit์ ๋ฐ๊พธ๊ณ , ์์ง ์ ์ฅ์๋ฅผ ๊ทธ ์ปค๋ฐ์ผ๋ก ์ฒดํฌ์์ํดyarn sync:templates,yarn sync:engine-web,yarn sync:rpg๋ฅผ ๋ค์ ๋๋ฆฐ ๋คyarn engine:check๋ก ๋ง์ถฐ์ก๋์ง ๋ด ๋๋ค.ciEngineRef๋ ์ ์์ง ์ฝ๋๊ฐ ํ์ํ PR ์ด ์ ์ ์ฐ๋ ์นธ์ด๋ผ ๋ฆด๋ฆฌ์ค ์ ์๋ ๋น์๋๋ค. -
๊ทธ ์ปค๋ฐ์ ์์ง ํ๊ทธ์ ๊ณต๊ฐ ๋ฆด๋ฆฌ์ค๊ฐ ์์ผ๋ฉด
yarn engine:pin <ํ๊ทธ>๋ก ํ์ ๋ฆด๋ฆฌ์ค์ ๋ฌถ์ต๋๋ค. ๋ฆด๋ฆฌ์ค์engine-dist.json๊ณผSHA256SUMS.txt๋ฅผ ๋ฐ์engineTag์ ์์ฐ(ํ๊น๋ณ ์์ง, ํ ํ๋ฆฟ ๋ฌถ์, ์ 3์ ๊ณ ์ง)์ sha256 ์ ์ ์ต๋๋ค. ๋ฆด๋ฆฌ์ค์ ์ปค๋ฐ์ด ํ๊ณผ ๋ค๋ฅด๋ฉด ์ฐ์ง ์์ต๋๋ค. ํด๋์์ ์ฝ์ผ๋ ค๋ฉด--from <ํด๋>๋ฅผ ๋ถ์ ๋๋ค.
์ค์น ํ์ผ์ GitHub Actions ์ release ์ํฌํ๋ก๊ฐ ๋ง๋ญ๋๋ค. macOS arm64 dmg, Linux AppImage ์ deb, Windows NSIS ์
๋๋ค.
์์ง์ engine-pin.json ์ ์ปค๋ฐ์ผ๋ก ์ํฌํ๋ก ์์์ ๋น๋ํด ์ฃ๊ณ , ๋ง๋ ์ค์น๋ณธ์ด ์ค์ค๋ก ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด ๋๋ ค ๋ณธ ๋ค
๋ฒ๋ค๊ณผ SHA256SUMS.txt ๋ฅผ ์ฐ์ถ๋ฌผ๋ก ์ฌ๋ฆฝ๋๋ค. Actions ํญ์์ release ๋ฅผ ์๋์ผ๋ก ๋๋ฆฌ๋ฉด(dry run) ์ฐ์ถ๋ฌผ๋ง ๋์ค๊ณ ,
v* ํ๊ทธ๋ฅผ ๋ฐ๋ฉด ์ด์ ๋ฆด๋ฆฌ์ค๊น์ง ๋ง๋ญ๋๋ค. ๊ณต๊ฐ๋ ์ง์ ํฉ๋๋ค. Windows ํ์๋ ์์ง์ด ์์ด F5 ๊ฐ ์๋ํฐ ์์์ ๋๋๋ค.
์ค์น ํ์ผ์ ๊ทธ ์คํ์ Summary ์๋ Artifacts ์์ ๋ฐ์ต๋๋ค (InitialEditor-<์ปค๋ฐ> ํ๋์ ์ ๋ถ์ SHA256SUMS.txt). ์๋ช
ํ์ง ์์ ์ฑ์ด๋ผ ์ฒ์ ํ ๋ฒ ๋งํ๋๋ค.
- macOS (Apple Silicon๋ง): dmg ๋ฅผ ์ด์ด InitialEditor ๋ฅผ ์์ฉ ํ๋ก๊ทธ๋จ ํด๋๋ก ์ฎ๊น๋๋ค. ์ฒ์ ์ด ๋ ๋งํ๋ฉด ์์คํ
์ค์ > ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ๋ณด์์์ "๊ทธ๋๋ ์ด๊ธฐ", ๋๋
xattr -dr com.apple.quarantine /Applications/InitialEditor.app - Windows: ์ค์น ํ์ผ์ ์ด๋ฉด SmartScreen ์ด ๋ง์ต๋๋ค. "์ถ๊ฐ ์ ๋ณด" ๋ฅผ ๋๋ฌ "์คํ". ์ฌ์ฉ์ ํด๋์ ์ค์น๋์ด ๊ด๋ฆฌ์ ๊ถํ์ ํ์ ์์ต๋๋ค
- Linux: AppImage ๋
chmod +x InitialEditor_*.AppImage๋ค ์คํ (FUSE 2 ๊ฐ ํ์ํฉ๋๋ค). deb ๋sudo apt install ./InitialEditor_*.deb
๊ฐ์ ์๋ด๊ฐ docs/releases/first-open.md ์ ์๊ณ , ์ด์ ๋ฆด๋ฆฌ์ค ๋ณธ๋ฌธ ๋งจ ์์ ๋ค์ด๊ฐ๋๋ค.
yarn version:set 2.0.0-alpha.1 # ๋ฃจํธ์ packages/*, Cargo.toml, Cargo.lock ์ ํ์ ํ๊บผ๋ฒ์ ๋ฐ๊พธ๊ณ yarn install
yarn version:check # ํ์ด ํ ๊ฐ์ง์ธ์ง (--tag v<ํ>, --bundles <๋ฒ๋ค ํด๋> ๋ ๋ฆด๋ฆฌ์ค ์ํฌํ๋ก๊ฐ ์ด๋ค)
yarn licenses # src-tauri/licenses/THIRD-PARTY-editor.md ๋ฅผ ๋ค์ ์ด๋ค (์์กด์ฑ์ด ๋ฐ๋๋ฉด. CI ๋ --check)
yarn build:desktop # ์์ค๋งต ์๋ ํ๋ฐํธ (๋ฆด๋ฆฌ์ค ๋ฒ๋ค์ด ์ด๋ค)
# ์ด ์ปดํจํฐ์์ ์ค์น๋ณธ์ ๋ง๋ค์ด ์๊ฐ ๊ฒ์ฌ
yarn engine:fetch --from ../Initial2D/dist
yarn luals:fetch
yarn tauri build --bundles app --config src-tauri/tauri.dist.conf.json --config src-tauri/tauri.sidecar.conf.json
yarn selftest:app src-tauri/target/release/bundle/macos/InitialEditor.app
yarn selftest:app <์ฑ> --forest ../Initial2D # ์๋ฐ๋ฐ๋ ์ฒ์ ํ ์นธ์ ์น ํด ๊ฒ์ ํ๋ฉด๊ณผ ๊ฒฌ์ฃผ๋ ๊ฒ๊น์ง
yarn selftest:app <์ฑ> --rpg ../Initial2D # ํญ๊ตฌ ๋ง์์ ์ด๋ฒคํธ ๋ ์ด์ด์ ์ด๋ฒคํธ ์์์ ์คํ, ์๋ ์ฌ์๊น์งyarn selftest:app์ ์ฐฝ์ ๋์ฐ์ง ์์ต๋๋ค. ์ฑ์ ์๊ฐ ๊ฒ์ฌ ๋ชจ๋(INITIAL_EDITOR_SELFTEST=<๊ณํ ํ์ผ>)๋ก ๋์ฐ๋ฉด, ์ฑ์ ๋ ํ ํ๋ฆฟ์ผ๋ก ํ๋ํผ Lua, ํ๋ํผ Ruby, ํ์ผ๋งต ํ๋ก์ ํธ๋ฅผ ์์ ํด๋์ ๋ง๋ค๊ณ , ํ์ผ๋งต์ ๋งต ๋ฌธ์๋ก ํ ์นธ์ ์น ํด ์ ์ฅํ ๋ค, ์ ๋ค ์ฑ์ ๋ ์์ง์ผ๋ก ๋๋ฆฝ๋๋ค. ํ๋ํผ Lua ์์๋ ์ฑ์ ๋ LuaLS ๊ฐ ๋จ๊ณ ์ง์ ์คํฌ๋ฆฝํธ์Json.๋ค ์์ฑ๊ณผ ํธ๋ฒ์Load๊ฐ ๋์ค๋์ง๋ ๋ด ๋๋ค. ๋๋๋ฉดscripts/selftest-check.mjs๊ฐ ์คํ๋ง๋ค ๋จ์ ์ ์ฒด ๋ก๊ทธ์ ์คํฌ๋ฆฐ์ท์ผ๋ก ํ์ ํฉ๋๋ค. ์์ ํด๋(๋ณด๊ณ ์, ๋ก๊ทธ, ์คํฌ๋ฆฐ์ท)๋ ์ง์ฐ์ง ์๊ณ ๊ฒฝ๋ก๋ฅผ ์ฐ์ต๋๋ค.- ์๊ฐ ๊ฒ์ฌ๋ ์ค์ , ์ต๊ทผ ํ๋ก์ ํธ, ๋ ์ด์์, ์ฐฝ ์์น, ์น๋ทฐ ์ ์ฅ์๋ฅผ ์ฝ์ง๋ ์ฐ์ง๋ ์์ต๋๋ค. ํ์ธ ์ฐฝ์ด ๋จ๊ฑฐ๋ ์น๋ทฐ ๋ณด์ ์ ์ฑ (CSP) ์๋ฐ์ด ์์ผ๋ฉด ์คํจ์ ๋๋ค.
--forest <์์ง ์ ์ฅ์>๋ ์ฒ ๋งต์ ์ฌ๋ณธ์ ๋งต ๋ทฐ๋ก ์ด์ด deco ๋ ์ด์ด์ ๋น ์นธ ํ๋๋ฅผ ์น ํด ์ ์ฅํ๊ณ ์ฑ์ ๋ ์์ง์ผ๋ก ๋๋ฆฐ ๋ค, ๊ฒ์ ํ๋ฉด์ ๋งต ๋ทฐ์ ๊ฒฌ์ฃผ๊ณ ์ ์ฅํ ๋งต๊ณผ ํ์ผ์ ์ผ๋ก ์ง์ ๊ทธ๋ฆฐ ๊ธฐ์ค๊ณผ๋ ๊ฒฌ์ค๋๋ค. ๋ ์ด์ด๋ง๋ค, ์น ํ ์นธ๊น์ง ๊ฒ์ ํ๋ฉด์ ์์ด์ผ ํต๊ณผํฉ๋๋ค (๊ฒ์์ด ๋ ์ด์ด ํ๋๋ฅผ ๋นผ๊ณ ๊ทธ๋ฆฌ๊ฑฐ๋ ์น ํ๊ธฐ ์ ๋งต์ ๋๋ฆฌ๋ฉด ์คํจ).--rpg <์์ง ์ ์ฅ์>๋ ํญ๊ตฌ ๋ง์(port_town.json)์ ์ฌ๋ณธ์ ๋งต ๋ทฐ๋ก ์ด์ด RPG ํ์ฅ์ด ๋ถ์ธ ์ด๋ฒคํธ ๋ ์ด์ด์ ๋ทฐ๊ฐ ๊ทธ๋ฆฐ ํ์์ ๋ณด๊ณ ์์ ์ ๊ณ , ๋งต ๋ฉ๋ด์ "์ด ์ด๋ฒคํธ ์์์ ์คํ"๊ณผ "์ด ์ด๋ฒคํธ ์๋ ์ฌ์"์ ๋ฌผ๊ณ ๊ธฐ ์ฅ์์๊ฒ ์ฑ์ ๋ ์์ง์ผ๋ก ๋๋ฆฝ๋๋ค. ํ์ ์ ํ์ 17๊ฐ๊ฐ ๋งต ํ์ผ์ ์๋ฆฌ์ ๊ฒ์์ ๊ทธ๋ฆฌ๊ธฐ ๊ท์น๋๋ก ์๋์ง, ๊ฒ์์ด ์ด๋ฒคํธ๋ฅผ ๋ค ์ฝ์๋์ง, ํ๋ ์ด์ด๊ฐ ํ์ ์ด ๋งต ํ์ผ๋ก ์ ํ ์๋ฆฌ์ ์ฐ๋์ง(rpg:player:), ์๋ ์ฌ์์ด ์ด๋ฒคํธ๋ฅผ ๋๋ ธ๋์ง(rpg:event:) ๋ด ๋๋ค.--forest์ ๊ฐ์ ์ ์ฅ์๋ฉด ์ฌ๋ณธ ํ๋๋ฅผ ํจ๊ป ์๋๋ค.--embedded๋ ์๋ํฐ ์ ์คํ์ ๋ํ๋๋ฐ ์ฐฝ์ด ๋น๋๋ค.--total-timeout <ms>๋ก ์ ์ฒด ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.- ๋ก์ปฌ์์ dmg ๊น์ง ๋ง๋ค๋ฉด(
--bundles app,dmg) Finder ์ฐฝ์ด ์ ๊น ๋น๋๋ค. CI ์์๋ ๋จ์ง ์์ต๋๋ค. - CSP ๋
src-tauri/tauri.conf.json์app.security.csp์ ๋๋ค. ์ ๊ธฐ๋ฅ์ด ๋งํ๋ฉด ์๊ฐ ๊ฒ์ฌ ๋ณด๊ณ ์์cspViolations์ ๋ฌด์์ด ๋งํ๋์ง ๋์ต๋๋ค.
๋ฐ์คํฌํฑ ์ฑ์ "์คํ > ์๋๋ก์ด๋๋ก ์คํ
์ด์ง" ์ ์ด๋ฆฐ ํ๋ก์ ํธ๋ฅผ ์์ง ์ ์ฅ์์ android/app/src/main/assets/ ๋ก ์ฎ๊น๋๋ค. ์์ง์
android/prepare_assets.sh --project <ํ๋ก์ ํธ> ๋ฅผ ๋ถ๋ฅด๋ ๊ฒ์ด๋ผ ์์ง ์ ์ฅ์(Initial2D ์ฒดํฌ์์)์ bash, python3 ์ด ์์ด์ผ ํฉ๋๋ค.
APK ๋น๋์ ์ค์น๋ ํ์ง ์๊ณ , ๋๋๋ฉด ์ฝ์์ ์น ๋ช
๋ น์ ์ ์ด ์ค๋๋ค.
- ์์ง ์ ์ฅ์๋ ์ค์ ์ "์์ง ์ ์ฅ์" ์นธ, ์ด๋ฆฐ ํ๋ก์ ํธ ์์ , ์ฐพ์ ์์ง์ ์ ์ฅ์(
<์ ์ฅ์>/build/Initial2D), ํ์ ํด๋../Initial2D์์๋ก ์ฐพ์ต๋๋ค. ์ค์ ์นธ์ด ์๋ ๊ณณ์์ ์ฐพ์ ์คํฌ๋ฆฝํธ๋ ๊ฒฝ๋ก๋ฅผ ๋ณด์ด๊ณ "์คํฌ๋ฆฝํธ ์คํ ํ์ฉ" ์ ๋๋ฅธ ๋ค์๋ง ๋๋ฆฝ๋๋ค. ํ์ฉ์ ํ๋ก์ ํธ๋ง๋ค ์ฑ ์ค์ ์ ๋จ๊ณ ์ค์ ์์ ์ทจ์ํ ์ ์์ต๋๋ค. - ํ์ธ ๋ํ์์๊ฐ ํ์ผ ์์ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์
๋๋ค. ๋์ ํด๋๋ ํต์งธ๋ก ๋ฐ๋๋๋ค.
config.setting, ์ ํ์ผ, zip, psd ๋ ๋ฃ์ง ์์ต๋๋ค. - "RTP ๋ณํ๋ฌผ ๋ฃ๊ธฐ" ๋ ๊ธฐ๋ณธ ๊บผ์ง์
๋๋ค. ์ผ๋ฉด
resources/rtp/๊ฐ ๋ค์ด๊ฐ๋๋ฐ ์ฌ๋ฐฐํฌํ ์ ์๋ ์์ฌ๋ผ ๊ทธ APK ๋ ๊ฐ์ธ ๊ธฐ๊ธฐ ์ํ์๋ง ์๋๋ค. - Windows ๋ Git for Windows ์ bash ์ Python 3 ์ด ํ์ํฉ๋๋ค.
- ์์ง ์ ์ฅ์๊ฐ
--project๋ฅผ ๋ชจ๋ฅด๋ ํ(tools/stage_list.py๊ฐ ์๋ค)์ด๋ฉด ๋ฏธ๋ฆฌ ์ธ๊ธฐ์์ ๋ฉ์ถ๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ๋๋ฆฌ์ง ์์ต๋๋ค. ์์ง ์ ์ฅ์๋ฅผ ์ฌ๋ฆฝ๋๋ค. - ๊ต์ฐจ ๊ฒ์ฌ:
INITIAL2D_DIR=../Initial2D yarn test:android-stage๊ฐ ํ ํ๋ฆฟ์ผ๋ก ๋ง๋ ํ๋ํผ ํ๋ก์ ํธ๋ฅผ ์๋ํฐ์ ๊ฐ์ ์ธ์๋ก ์์ ํด๋์ ์คํ ์ด์งํ๊ณ , ๊ธฐ๊ธฐ์ฒ๋ผ ํ์ด ๋ฐ์คํฌํฑ ์์ง์ผ๋ก ๋๋ฆฝ๋๋ค.--project๋ฅผ ๋ชจ๋ฅด๋ ์์ง์ด๋ ๋น๋ํ ์์ง์ด ์์ผ๋ฉด ๊ฑด๋๋๋๋ค.
๋งต ํ์ผ์ events๋ฅผ ๋งต ์์์ ๊ณ ์น๋ RPG ํ์ฅ(packages/ext-rpg)์
๋๋ค. ์์ง์ ์ด๋ฒคํธ ์คํค๋ง(resources/schema/event-commands.json)์
๊ฒ์ ์ค์ (resources/data/rpg-game.json)์ ์ฝ๊ณ , ์์ง๊ณผ ๊ฐ์ ๊ฒ์ฌ๋ฅผ ๊ฐ์ ๊ฒฝ๋ก(events[3].commands[2].text)๋ก ๋ด๊ณ ,
๋๋๋ฆด ์ ์๋ ๋ช
๋ น์ผ๋ก ์ด๋ฒคํธ์ ์ปค๋งจ๋๋ฅผ ๊ณ ์นฉ๋๋ค. ๊ณ ์น ์ด๋ฒคํธ๋ ๊ทธ ์์์ ๋ฐ๋ก ๋์ ๋ด
๋๋ค.
๊ณ์ฝ์ ์ ๋ณธ์ ์์ง์ docs/plans/m2-rpg-events.md์
๋๋ค.
-
์ด๋ฒคํธ ๋ ์ด์ด:
rpg-game.json์ ๋ฑ๋ก๋ ๋งต(ํญ๊ตฌ ๋ง์, ์ฌ๊ด)์ ์ด๋ฉด ๋ ์ด์ด ํจ๋์ "์ด๋ฒคํธ" ์ค์ด ์ค๋ธ์ ํธ ์์ ์๊น๋๋ค. ์ธํ์ด ์๋ ์ด๋ฒคํธ๋ CharSet์ ์ ์๋ ํ๋ ์์ด ๊ฒ์๊ณผ ๊ฐ์ ์๋ฆฌ(๋ฐ์ด ์นธ ์๋ ๋ณ)์, ๋๋จธ์ง๋ ์นธ์ ํธ๋ฆฌ๊ฑฐ ๊ธ์(๋ง, ๋ฐ, ์, ๋ณ)๋ก ๋ณด์ ๋๋ค. ์ธํ์ ์คํค๋ง์ ํ๋ณด ์ค ํ๋ก์ ํธ์ ์๋ ์ฒซ ๊ทธ๋ฆผ์ด๋ผ RTP๊ฐ ์์ผ๋ฉด RTP ๊ทธ๋ฆผ์ ๋๋ค. ๋ฑ๋ก๋์ง ์์ ๋งต(์๋ฐ๋ฐ๋, ์ํ)์๋ ์ค ๋์ ํ ์ค ์๋ด๊ฐ ์๊ณ , ์คํค๋ง๊ฐ ์๋ ํ๋ก์ ํธ์๋ ๋ ์ด์ด ์ค๋, ๋งต ๋ฉ๋ด์ ์ด๋ฒคํธ ํญ๋ชฉ๋, ์ฐฝ ๋ฉ๋ด์ ์ด๋ฒคํธ๋ ์์ต๋๋ค. RTP ํ๊ณผ ๊ธฐ๋ณธ ํ์ด ๋ฐ๋ก ์๋ ๋งต(๋ง์, ์ค๋๋ง)๊ณผ ์คํค๋ง ๋ฒ์ ์ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ๋ ์ฝ๊ธฐ ์ ์ฉ์ด๊ณ ์ด์ ๊ฐ ์๋ฌผ์ ์์ ๋ณด์ ๋๋ค. ์ฝ๊ธฐ ์ ์ฉ์ด์ด๋ ๋งต ํฌ๊ธฐ๋ฅผ ๋ฐ๊พธ๋ฉด ์ด๋ฒคํธ๋ ํ์ผ๊ณผ ํจ๊ป ์ฎ๊ฒจ์ง๋๋ค. ๋ ์ด์ด์ ๋์ ๋๋ฉด ํ์ผ ๋ ์ด์ด์ฒ๋ผ ๋งต ๋ทฐ์์ ๊ณ ์น์ง ์๊ณ ์๋ฆฝ๋๋ค. -
์ด๋ฒคํธ ๋๊ตฌ(N): ํด๋ฆญ์ผ๋ก ๊ณ ๋ฅด๊ธฐ(Shift, Ctrl์ ๋ํ๊ณ ๋นผ๊ธฐ), ๋น ๊ณณ์ ๋๋ฉด ์์ ์ ํ, ๋์ด์ ์นธ ๋จ์๋ก ์ฎ๊ธฐ๊ธฐ(๋์ ์ ์๋ ์นธ์ด๋ฉด ๋นจ๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ก ์๋ ค ์ฃผ๊ณ ์ ์๋ฆฌ์ ๋ก๋๋ค. ๋ฐฐํ ๊ตฌ์ญ๋ ๊ฐ์ด ์ฎ๊ธฐ๊ณ Alt๋ฅผ ๋๋ฅด๋ฉด ๊ตฌ์ญ์ ๋ก๋๋ค), ๊ณ ๋ฅธ ์ด๋ฒคํธ์ ๋ฐฐํ ๊ตฌ์ญ ๊ฐ์ฅ์๋ฆฌ ๋๊ธฐ, ๋น ์นธ ๋๋ธํด๋ฆญ์ผ๋ก ์ ์ด๋ฒคํธ, ๋ฐฉํฅํค๋ก ํ ์นธ, Delete๋ก ์ง์ฐ๊ธฐ, Enter๋ก ์ปค๋งจ๋ ํธ์ง๊ธฐ. Ctrl+C, Ctrl+V(์ปค์ ์นธ์), Ctrl+D๋ ์ด๋ฒคํธ ์ ์ฉ ํด๋ฆฝ๋ณด๋๋ผ ๋งต ์ค๋ธ์ ํธ๋ ์ฌ๊ณผ ์์ด์ง ์์ต๋๋ค. ๋๊ธฐ ํ ๋ฒ, ์ ๋ ฅ ์นธ์ ํ์ดํ ํ ๋ฒ์ด ๋๋๋ฆฌ๊ธฐ ํ ๋จ๊ณ์ ๋๋ค.
-
์ธ์คํํฐ: ์คํค๋ง์ ์ด๋ฒคํธ ์นธ(id, ์นธ, ๋ฐฉํฅ, ํธ๋ฆฌ๊ฑฐ, ์ธํ๊ณผ 8๋ช ๊ฒฉ์, ์ง๋๊ฐ๊ธฐ, ๋ง๊ธฐ, ์๋, ๋ฐฐํ)๊ณผ ๊ทธ ์๋ ์ปค๋งจ๋ ๋ชฉ๋ก ํธ์ง๊ธฐ์ ๋๋ค. id๋ฅผ ๋ฐ๊พธ๋ฉด ์ด ๋งต์
moveRoute์turn์ ๋์๋ ํจ๊ป ๋ฐ๋๋๋ค. ์ปค๋งจ๋ ํธ๋ฆฌ๋ ์์๋๋ก ์ค, Enter๋ก ์ธ์ ํผ, Insert๋ก ํ๋ ํธ, Ctrl+์์๋๋ก ์ฎ๊ธฐ๊ธฐ, Ctrl+C์ Ctrl+V๋ก ์ฌ๋ฌ ์ค ๋ณต์ฌ์ ๋ถ์ฌ๋ฃ๊ธฐ, Delete๋ก ๋นผ๊ธฐ์ ๋๋ค (macOS๋ ๋๊ตฌ ์ค์ ๋ฃ๊ธฐ ๋จ์ถ๋ ๋ ์ค์ Enter). ํธ๋ฆฌ์์ ๋๋ฅธ ๊ธ์ ํค๋ ๋งต ๋๊ตฌ๋ฅผ ๋ฐ๊พธ์ง ์์ต๋๋ค. ์ธ์ ํผ์ ํ ์ค ์นธ์ Enter๋ก ๊ฐ์ ๋ฃ๊ณ ํผ์ ๋จ๊ณ , Escape๋ก ํธ๋ฆฌ์ ๋์๊ฐ๋๋ค. ์ ๋ ฅ ์นธ ์์ Ctrl+Z๋ ๋ฌธ์๋ฅผ ๋๋๋ฆฌ๊ณ ์นธ๋ ๋๋๋ฆฐ ๊ธ์ ๋ณด์ ๋๋ค (์ฌ ์ธ์คํํฐ์ ๊ฐ์ต๋๋ค). ๊ณ ๋ฅธ ์ด๋ฒคํธ๋ ๋ฒํธ๊ฐ ์๋๋ผ ์ด๋ฒคํธ๋ผ์ ์์ ์ด๋ฒคํธ๋ฅผ ์ง์ฐ๊ณ ๋๋๋ ค๋ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๊ณจ๋ผ์ ธ ์์ต๋๋ค. -
๋งต ์ด๋์ ๋์ ๊ณ ๋ฅด๊ธฐ:
transfer(๋งต ์ธ์์ x, y๊ฐ ์๋ ์ปค๋งจ๋)์ ์ธ์ ํผ ์๋์ "๋งต์์ ๊ณ ๋ฅด๊ธฐ"์ "๋์ ๋ณด๊ธฐ" ๋จ์ถ๊ฐ ์๊ณ Tab์ผ๋ก ๊ฐ ์ ์์ต๋๋ค. "๋งต์์ ๊ณ ๋ฅด๊ธฐ"๋ ๋์ ๋งต(rpg-game.json์file)์ ํญ์ผ๋ก ์ด๊ณ ๋ทฐ ์์ "ํ์ผ์ ํด๋ฆญํด ์ด๋ ์์น ์ง์ (Esc: ์ทจ์)" ๋ ๋ฅผ ๋์๋๋ค. ํ์ผ์ ๋๋ฅด๋ฉด ์๋ ๋งต์ ํญ์ผ๋ก ๋์์ x, y๊ฐ ํ ๋ฒ์ ๋ฐ๋๊ณ (์๋ ๋งต์ ๋๋๋ฆฌ๊ธฐ ํ ๋จ๊ณ) ๊ทธ ์ปค๋งจ๋์ ํผ์ด ์ด๋ ค ์์ต๋๋ค. Esc, ๋งต ๋ฐ์ด๋ ๋ทฐ ๋ฐ์ ๋๋ฆ, ๋ ์ ์ทจ์๋ ๋ฐ๊พธ์ง ์๊ณ ๋์์ค๊ณ , ๊ณ ๋ฅด๋ ๋์ ์๋ ํญ์ ๋ซ์ผ๋ฉด ๋ฐ๊พธ์ง ์๊ณ ๋๋ฉ๋๋ค. ๊ฐ์ ๋งต์ผ๋ก ๊ฐ๋ ์ด๋์ด๋ฉด ๊ทธ ๋งต์ ๋ทฐ์์ ๊ณ ๋ฆ ๋๋ค. ๊ณ ๋ฅด๋ ๋์ ๋งต ๋๊ตฌ๋ ๋๋ฆ๊ณผ ํค๋ฅผ ๋ฐ์ง ์๊ณ , ํ ๊ณผ ์ค๋ฅธ์ชฝ ๋๊ธฐ์ Space+๋๊ธฐ๋ ๊ทธ๋๋ก ๋ทฐ๋ฅผ ์ฎ๊น๋๋ค. "๋์ ๋ณด๊ธฐ"๋ ๋์ ๋งต์ ์ด๊ณ x, y ํ์ผ์ ๋ทฐ ๊ฐ์ด๋ฐ์ ๋ก๋๋ค. ๋งต์ด ๋น์๊ฑฐ๋,rpg-game.json์ ์๊ฑฐ๋, ํ์ผ์ด ์๊ฑฐ๋, ์์ง์ด ์ด ์ ์๋ ๋งต(๋ชจ๋ฅด๋ ๋ฒ์ , ํ์ผ์ ๊ทธ๋ฆผ ์์ ๋ฑ)์ด๋ฉด ๋ ๋จ์ถ๊ฐ ๊บผ์ง๊ณ ์ด์ ๊ฐ ํ ์ค ๋ณด์ ๋๋ค. ์ฝ๊ธฐ ์ ์ฉ ๋ ์ด์ด๋ ๊ณ ๋ฅด๊ธฐ๋ง, x, y๊ฐ ์์ผ๋ฉด ๋์ ๋ณด๊ธฐ๋ง ๊บผ์ง๋๋ค. -
์ด๋ฒคํธ ํจ๋(์ฐฝ > ์ด๋ฒคํธ, ํ์ผ๋งต ๋ ์ด์์์ ๋ค์ด ์์): ์ด ๋งต์ ์ด๋ฒคํธ ๋ชฉ๋ก๊ณผ ์ฐพ๊ธฐ(id, ํธ๋ฆฌ๊ฑฐ, ๋์ฌ), ์ค๋ฅ์ ๊ฒฝ๊ณ ์, ๊ทธ๋ฆฌ๊ณ ์์ ์ํ ํ ์ค(
arrived,item:warehouse_key=1๊ผด,INITIAL2D_RPG_STATE์ ๊ฐ์ ๊ท์น)์ ๋๋ค. ์์ ์ํ๋ ๋งต๋ง๋ค.initial-editor/rpg-play.json์ ๋จ์ต๋๋ค. -
์ ์ฅ: ์์ง์ด ๊ฑด๋๋ธ ์ค๋ฅ๊ฐ ์๋ ๋งต์ ์ ์ฅํ๊ธฐ ์ ์ ๋ชฉ๋ก์ ๋ณด์ด๊ณ ๋ฌป์ต๋๋ค. ์๋ํฐ์ ํธ์ง์ ๊ทธ๋ฐ ๊ฐ์ ๋ง๋ค์ง ์์ผ๋ฏ๋ก ๋ฐ์์ ๊ณ ์น ํ์ผ์์๋ง ๋์ต๋๋ค. ๊ฐ์ฒด๊ฐ ์๋ ์ด๋ฒคํธ ์นธ์ ์ด๋ฒคํธ ํจ๋์
events[n]๊ณผ ํจ๊ป ํ๋ฆฐ ์ค๋ก ๋ณด์ ๋๋ค. 2^53์ ๋๋ ์ ์(์์ง์ 64๋นํธ ์ ์๋ก ์ฝ์ต๋๋ค)๋ ๊ธ ๊ทธ๋๋ก ์ ์ฅํฉ๋๋ค. -
์ด ๋งต์์ ์คํ(Ctrl+F5): ๋ฑ๋ก๋ ๋งต์์๋
rpg-game.json์play๋ก ๋์๋๋ค. ์ด๋ฒคํธ ํ๋๋ฅผ ๊ณจ๋์ผ๋ฉด ๊ทธ ์ ์นธ์์ ์ด๋ฒคํธ ์ชฝ์ ๋ณด๊ณ , ์๋๋ฉด ์ปค์ ์นธ, ๊ทธ๋ค์ ๋ทฐ ๊ฐ์ด๋ฐ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ค ์ ์๋ ์นธ์ ์๋๋ฅผ ๋ณด๊ณ ์ญ๋๋ค. ์ ๋ค ์์ผ๋ฉด ์ ์ ํ์ผ์ ์์์ ๋๋ค. ๋ฑ๋ก๋์ง ์์ ๋งต(์๋ฐ๋ฐ๋)์ ์ง๊ธ์ฒ๋ผmap-objects.json์play(maps๊ฐ ๋ฐ๋ ๋งต๋ง)๋ก ๋์๋๋ค. -
์ด ์ด๋ฒคํธ ์์์ ์คํ, ์ด ์ด๋ฒคํธ ์๋ ์ฌ์: ์ธ์คํํฐ์ "์์์ ์คํ"๊ณผ "์๋ ์ฌ์" ๋จ์ถ, ๋งต ๋ฉ๋ด, ์ด๋ฒคํธ ํจ๋ ์ค์ ์ฐํด๋ฆญ(๋๋ Shift+F10)์ ์์ต๋๋ค. ์ ์นธ์ ์ธํ๊ณผ ๋ฐฉํฅ์ด ์์ผ๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ๋ผ๋ณด๋ ์นธ, ์๋๋ฉด ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์ ์์์ ๋๋ค. ์๋ ์ฌ์์ ๊ฒฐ์ ํค(action), ์ด๋ฒคํธ ์ชฝ์ผ๋ก ํ ๊ฑธ์(touch), ์์น ์์ด ๋งต์ ๋ค์ด์๊ธฐ(auto)๋ฅผ ํ ๋ฒ ํ๊ณ ๋ํ๋ฅผ ์์์ ๋๊ธฐ๋ฉฐ(์ ํ์ง๋ ์ฒซ ํญ๋ชฉ), ๋๋๋ฉด ๊ฒ์์ด ์ค์ค๋ก ๋ซํ๋๋ค. parallel์ ๋๋์ง ์์ ๋จ์ถ๊ฐ ๊บผ์ง๊ณ ์ด์ ๊ฐ ๋ณด์ ๋๋ค. ์ ์ฅํ์ง ์์ ๋งต์ ๋จผ์ ์ ์ฅํ ์ง ๋ฌป์ต๋๋ค. ์๋ํฐ๋ ์๋ ์ฌ์์ ์ค์ ์ง์ผ๋ด ๋๋ค. ์ฌ์ ๋ฐ๊พธ๋ ์ปค๋งจ๋(๋ฐ๋ชจ์ ๋ฐฐ)๋ก ๊ฒ์์ด ์ ๊ฒ์์ผ๋ก ์ฒ์๋ถํฐ ๋ค์ ์์ํ๋ฉด ๊ทธ ์๋ฆฌ์์ ๋ฉ์ถ๊ณ ์ด์ ๋ฅผ ์ฝ์๊ณผ ์๋ฆผ์ ๋จ๊น๋๋ค. ๊ฒ์์ด ๋๋ฌ๋๋ฐ ๊ทธ ์ด๋ฒคํธ์
rpg:event:<id>์ค์ด ์์์ผ๋ฉด ์ฑ๊ณต์ด ์๋๋ผ ์ค๋ฅ ์ค๋ก ์๋ฆฝ๋๋ค. ๋ฐฐํํ๋ NPC๋ ์์ auto ์ด๋ฒคํธ๊ฐ ๋๋ ๋์ ์๋ฆฌ๋ฅผ ๋ ๋ ์ ์์ผ๋, ์์ ์ํ๋ก ๊ทธ auto๋ฅผ ๊ฑด๋๋ฐ๊ฑฐ๋ ์์์ ์คํ์ผ๋ก ์์ ๋ง์ ๊ฒ๋๋ค. -
์์ ์ํ: ์ด๋ฒคํธ ํจ๋์ ์์ ์ํ ์นธ์ ์ ์ ๊ฐ์ด ์ธ ์คํ์
INITIAL2D_RPG_STATE๋ก ์ค๋ฆฝ๋๋ค. ๋น์ฐ๋ฉด ์ ๊ฒ์ ๊ทธ๋๋ก์ ๋๋ค. ๋ฐ๋ชจ์ ๋์ฌ๋ ๋๋ถ๋ถ ๊น๋ฐ๊ณผ ์์ดํ ์ผ๋ก ๊ฐ๋ฆฌ๋ฏ๋ก(arrived,heardAltar๋ฉด ์์ด๊ฐ ์กฐ๊ฐ ๋ชฉ๊ฑธ์ด๋ฅผ ์ค๋๋ค) ์ฌ๊ธฐ์ ์ ์ด ๋๊ณ ๋ด ๋๋ค. -
์คํ์ ๋ณ์์ ์ฝ์:
play.env์INITIAL2D_SCRIPT=lua,INITIAL2D_SCENE=rpg,INITIAL2D_MAP,INITIAL2D_RPG_AT,INITIAL2D_RPG_STATE,INITIAL2D_RPG_TRACE=1์ ์๋ ์ฌ์์play.probe์INITIAL2D_AUTOPLAY=1,INITIAL2D_RPG_ROUTE๋ฅผ ๋ํฉ๋๋ค. ์๋ ์ฌ์์ ์๋ํฐ๊ฐ ๊ฒ์์ ์ค์ ์ง์ผ๋ณด๋ฏ๋กplay์ ์์ด๋INITIAL2D_RPG_TRACE=1์ ๋ ๋ฃ๊ณ ,play.probe์{event}๋ ๊ทธ ์ด๋ฒคํธ์ id๋ก ์ฑ์๋๋ค. ํ๋ก์ธ์ค ์คํ๊ณผ ๊ฒ์ ํญ(์น ์์ง) ๋ชจ๋ ๊ฐ์ ๋ณ์์ด๊ณ , ์ฝ์์rpg:player:(์ ์นธ๊ณผ ๋ฐฉํฅ),rpg:event:,rpg:message:์ด๋ฆ|๋์ฌ,rpg:route:done์ค์ด ๋จ์ต๋๋ค.game.json์ด mruby์ฌ๋ RPG ์คํ์INITIAL2D_SCRIPT=lua๋ก ๋ฎ์ผ๋ฏ๋ก ์ธ์ด ๊ฒ์ฌ๋ ๋ฎ์ ๊ฐ์ผ๋ก ํฉ๋๋ค. -
ํฝ์ค์ฒ: ๋ชจ๋ธ ํ ์คํธ๋ ์์ง ํ์ผ์ ์ฌ๋ณธ(
packages/ext-rpg/test/fixtures/)์ผ๋ก ๋๋๋ค. ์ด๋ฒคํธ ์คํค๋ง, ๊ฒ์ ์ค์ , ์์ดํ ํ, ํญ๊ตฌ ๋ง์๊ณผ ์ฌ๊ด ๋งต, ๊ฒฝ๋ก ๋์กฐ ํฝ์ค์ฒ, ํ๋ ์ด์คํ๋ ๊ทธ๋ฆผ์ ๋๋ค. ์์ง ์ชฝ ํ์ผ์ด ๋ฐ๋๋ฉดyarn sync:rpg๋ก ๋ค์ ๋ง์ถฅ๋๋ค.MANIFEST.json์ ์์ง ์ปค๋ฐ(40์)๊ณผ sha256์ด ๋จ๊ณ , ์์ง ์ ์ฅ์๊ฐ ์์ ์์ผ๋ฉด ์ฌ๋ณธ์ด ์์ง ํ์ผ๊ณผ ๊ฐ์์ง ํ ์คํธ๊ฐ ๋ด ๋๋ค.resources/rtp/๋ ๋ณต์ฌํ์ง ์์ต๋๋ค. ์์ง ์์ ํธ๋ฆฌ๊ฐ ์ปค๋ฐ๊ณผ ๋ค๋ฅด๋ฉด ๋ฉ์ถ๊ณ , ๊ทธ๋๋ ๋ณต์ฌํ๋ ค๋ฉด--allow-dirty๋ฅผ ์ค๋๋ค. -
๊ต์ฐจ ๊ฒ์ฌ:
yarn test:engine-events๋ ์์ง ์ ์ฅ์์ ์ฌ๋ณธ ํ๋ก์ ํธ์์ ํญ๊ตฌ ๋ง์์ ์ฑ๊ณผ ๊ฐ์ ๊ธธ(๋งต ๋ฌธ์์ ์ด๋ฒคํธ ๋ ์ด์ด๊ฐ ๋ถ๋๋ค)๋ก ์ด์ด ๋ชจ๋ธ์ ๋ช ๋ น๋ง์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ง๋ค๊ณ ์ ์ฅํ ๋ค, ์๋ํฐ์ ์คํ ๋ช ๋ น๊ณผ ๊ฐ์ ํจ์๋ก ๋ง๋ ๋ณ์๋ก ์ง์ง ์์ง์ ํค๋๋ฆฌ์ค ํ๋ก์ธ์ค๋ก ๋์ trace ์ค(rpg:player:,rpg:message:,rpg:route:done)์ ๋ด ๋๋ค. ํ์ ๋ค์ฏ์ ๋๋ค: ๋ง ๊ฑธ๊ธฐ, ๋ฐ์์ ์ฌ๊ด์ผ๋ก ์ฎ๊ธฐ๊ธฐ, auto ๋์ด ์ฐจ๋ก๋ก ๋๊ธฐ, ๋๋๋ฆฐ ๋งต์ ์์ ์ํarrived๋ก ๋ค์ ๋์ฐ๊ธฐ, ์ฌ๊ธฐ์ ์คํ(๊ณ ๋ฅธ ์ด๋ฒคํธ ์์ ์๊ธฐ๋ง). ๊ทธ๋ฆฌ๊ณ ๋ฌ๋์ฒ๋ผ ์ค์ ์ง์ผ๋ณด๋ ์๋ ์ฌ์ ๋์ด ์์ต๋๋ค: ๋ฐฐ(ship)๋ ์ ๊ฒ์์ผ๋ก ๋ค์ ์์ํ๋ ์๋ฆฌ์์ ๋ฉ์ถ๊ณ , ๋ฐฐํํ๋ ์์ด(kid)๋ ์ด๋ฒคํธ๊ฐ ๋์ง ์์์ผ๋ฉด ์คํจ๋ก ์๋ฆฝ๋๋ค. ์ฌ๊ด์ผ๋ก ์ฎ๊ธฐ๋ ํ์ ๋์กฐ ํ ์ ์ด ๋ค๋ฐ๋ฆ ๋๋ค.transfer์ x, y, dir์ ํ๋์ฉ ๋นผ๊ณ ๋์ ๋์ฐฉ ๊ฒ์ฌ๊ฐ ์ค์ ๋ก ์คํจํ๋์ง ๋ด ๋๋ค. ์์ง ์คํ ํ์ผ์ด ์๊ฑฐ๋ M2 ๊ณ์ฝ ์ ์ ์์ง(Initial2D74febb4์ด์ )์ด๋ฉดSKIP:ํ ์ค์ ์ฐ๊ณ ํต๊ณผํฉ๋๋ค. ์์ง ์ ์ฅ์๋ ๊ณ ์น์ง ์์ต๋๋ค.
INITIAL2D_DIR=../Initial2D yarn sync:rpg # ์์ง ํ์ผ์ ํฝ์ค์ฒ๋ก ๋ณต์ฌํ๊ณ MANIFEST ๊ฐฑ์
INITIAL2D_DIR=../Initial2D yarn test:engine-events # ์์ง ๋น๋(build/Initial2D)๊ฐ ์์ด์ผ ํ๋ค
KEEP_WORKDIR=1 yarn test:engine-events # ์ฌ๋ณธ ํ๋ก์ ํธ๋ฅผ ๋จ๊ธด๋ค (๊ฒฝ๋ก๋ฅผ ๋ง์ง๋ง์ ์ฐ๋๋ค)
yarn build && yarn test:e2e tests/e2e/rpg-layer.spec.ts # ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋์ ํฝ์ค์ฒ๋ฅผ ์จ ๋ฃ๊ณ ์ด๋ฒคํธ ๋ ์ด์ด๋ฅผ ๋ธ๋ผ์ฐ์ ๋ก ๋ณธ๋ค
RPG_LAYER_SCREENSHOT=/tmp/shots yarn test:e2e tests/e2e/rpg-layer.spec.ts # ๋งต ๋ทฐ๋ฅผ ์ฐ์ด ๋จ๊ธด๋ค
INITIAL2D_DIR=../Initial2D yarn test:e2e tests/e2e/rpg-events.spec.ts # ๋๊ธฐ๋ถํฐ ์ ์ฅ๊น์ง, ์คํ ๋ช
๋ น์ ๋ณ์, ๋ธ๋ฆฌ์ง ๋ชจ๋์ ์๋ ์ฌ์
yarn build && yarn test:e2e tests/e2e/rpg-editor.spec.ts # ์ข์ ์ธ์คํํฐ, ์
๋ ฅ ์นธ์ Ctrl+Z, ์จ๊ธด ๋ ์ด์ด, RPG ์๋ ํ๋ก์ ํธ์ ๋ฉ๋ด
INITIAL2D_DIR=../Initial2D yarn test:e2e tests/e2e/rpg-transfer-pick.spec.ts # ๋งต ์ด๋์ ๋์ ๊ณ ๋ฅด๊ธฐ์ ๋์ ๋ณด๊ธฐ, ๋ธ๋ฆฌ์ง ๋ชจ๋์ ์ ์ฅ
E2E_BRIDGE_PORT=6561 RPG_EVENTS_SCREENSHOT=/tmp/rpg.png yarn test:e2e tests/e2e/rpg-events.spec.ts # ํฌํธ๋ฅผ ๋ฐ๊พธ๊ณ ๋๋ ํ๋ฉด์ ์ฐ๋๋คrpg-events.spec.ts์ ๋ธ๋ฆฌ์ง ๋ชจ๋๋ ์์ง ์ ์ฅ์์ resources(RTP ๋นผ๊ณ )์ scripts๋ฅผ ์์ ํด๋์ ๋ณต์ฌํด ์ด๊ณ , ์์ด๋ฅผ ๊ณ ๋ฅธ ๋ค ์๋ ์ฌ์์ ๋๋ฌ
๊ฒ์ ํญ์ ์น ์์ง์ด ์ฝ์์ ๋จ๊ธด ์ค์ ๋ด
๋๋ค. ๋ฐฐ์ ์๋ ์ฌ์์ ์ ๊ฒ์์ผ๋ก ๋ค์ ์์ํ๋ ์๋ฆฌ์์ ๋ฉ์ถ๋์ง ๋ด
๋๋ค. ํ๋ก์ธ์ค ์คํ์ ๋ธ๋ผ์ฐ์ ๋ก ๋ณผ ์ ์์ด yarn test:engine-events์ ๋ฌ๋์ ๋จ์ ํ
์คํธ
(RunnerStore.play.test.ts, ์คํ ์ ๊ณต์์ ๋ณ์๊ฐ RunSpec.env์ ๊ทธ๋๋ก ์ค๋ฆฐ๋ค)๊ฐ ๋งก์ต๋๋ค.
ํ๋ก์ ํธ๋ game.json์ด ์๋ ํด๋์
๋๋ค. ์์ง์ด ์์
ํด๋์ ./game.json์ ์ฝ์ผ๋ฏ๋ก ์ ๊ฐ๋
์ด ์๋๋๋ค.
game.json์ด ์๋ ํด๋(์: Initial2D ์ ์ฅ์ ์์ฒด)๋ฅผ ์ด๋ฉด ์๋ํฐ๊ฐ ๋ง๋ค ๊ฒ์ธ์ง ๋ฌป์ต๋๋ค. ์๋ํฐ๋ง ์ฐ๋ ์ํ
(๋ ์ด์์ ๋ฑ)๋ .initial-editor/์ ๋๋ฏ๋ก gitignore ํ๋ ๊ฒ์ ๊ถํฉ๋๋ค.
ํ๋ก์ ํธ ํจ๋์ ์ฒ์์ ํ๋ก์ ํธ ํ์ผ(game.json, scripts/, resources/)๋ง ๋ณด์ฌ ์ค๋๋ค. ์ ์ผ๋ก ์์ํ๋ ์ด๋ฆ๋ ๋น ์ง๋๋ค.
๋จธ๋ฆฌ์ ๊น๋๊ธฐ ๋จ์ถ ์ ์ซ์๊ฐ ์จ๊ธด ํญ๋ชฉ ์์ด๊ณ , ๋๋ฅด๋ฉด ์ ๋ถ ๋ณด์
๋๋ค. ์ผ๊ณ ๋ ์ํ๋ .initial-editor/project-view.json์ ๋จ์ต๋๋ค.
ํ๋ก์ ํธ ์ต์์์ .initial-editorignore(.gitignore ๋ฌธ๋ฒ)๋ฅผ ๋๋ฉด ๋ ๋บ ์ ์์ต๋๋ค.
# ์์
ํ์ผ
*.psd
/resources/aldebaran/src/ํ๋ก์ ํธ ์ ์ฒด ์ฐพ๊ธฐ, ๊ฒ์ ํญ์ด ์ฌ๋ฆฌ๋ ํ์ผ, ์ธ์คํํฐ์ ์ด๋ฏธ์ง์ ์ปดํฌ๋ํธ ๋ชฉ๋ก๋ ์ด ํ์ผ์ ๋ฐ๋ฆ
๋๋ค. .gitignore๋ ๋ฐ๋ฅด์ง ์์ต๋๋ค
(๊ฒ์์ด ์ฝ๋ resources/rtp๊น์ง ์จ๊ธฐ๊ฒ ๋ฉ๋๋ค). ๋ธ๋ฆฌ์ง ๋ชจ๋๋ ๋ธ๋ฆฌ์ง๊ฐ ์ด ํ์ผ์ ๋๊ฒจ์ฃผ์ง ์์ ๊ธฐ๋ณธ ๊ท์น๋ง ์๋๋ค.
packages/core/ DOM ๋ PIXI ๋ ๋ชจ๋ฅด๋ ๋ชจ๋ธ: ํ๋ก์ ํธ, ๋ฌธ์์ ๋๋๋ฆฌ๊ธฐ, ์ปค๋งจ๋์ ๋ฉ๋ด, ํ์ฅ API, ๋ก๊ทธ, ์ค์
packages/backend-bridge/ ProjectBackend ์ ๋ธ๋ฆฌ์ง(HTTP + WebSocket) ๊ตฌํ
packages/backend-fsaccess/ ProjectBackend ์ ๋ธ๋ผ์ฐ์ ํด๋(File System Access API) ๊ตฌํ. ์นํ์ด ์ด๋ค
packages/backend-tauri/ ProjectBackend ์ Tauri ๊ตฌํ (invoke ๋ํผ). Rust ๋ณธ์ฒด๋ src-tauri/
packages/app/ React ์
ธ: ๋ํน(dockview), ํจ๋, ๋ฉ๋ด์ ๋จ์ถํค, ํ
๋ง, ๋ ์ง์
๋ชจ๋
packages/ext-tilemap/ ํ์ผ๋งต ํ์ฅ: ๋งต ๋ชจ๋ธ(ํฌ๋งท, ํ์ผ ๊ณ์ฐ, ๋ช
๋ น, ์ค๋ธ์ ํธ ์คํค๋ง, ์คํ ํ์ผ)๊ณผ ์ฌ์ ํ์ผ๋งต ์ค๋ธ์ ํธ ํ์
,
๋ค๋ฅธ ํ์ฅ์ด ๋งต์ ๋ ์ด์ด์ ์ด ๋งต์์ ์คํ ์ ๊ณต์๋ฅผ ๋ถ์ด๊ณ , ๋งต์ ๋์ฐ๊ณ , ๋งต ๋ทฐ์์ ํ์ผ์ ๊ณ ๋ฅด๋ ์๋ฆฌ(contrib.ts)
packages/ui/ React ์
๋ ฅ ๋ถํ: ์ธ์คํํฐ์ ์ซ์, ๊ธ, ์คํค๋ง ์นธ ์
๋ ฅ. ์ฑ๊ณผ ํ์ฅ์ด ํจ๊ป ์ด๋ค
packages/ext-rpg/ RPG ํ์ฅ: ์ด๋ฒคํธ ๋ชจ๋ธ(์คํค๋ง, ๊ฒ์ ์ค์ , ๊ฒ์ฌ, ๋ช
๋ น, ์คํ ์ ๊ณต์์ ์คํ ๋ณ์), ๋งต ๋ทฐ์ ์ด๋ฒคํธ ๋ ์ด์ด
(๋ทฐ, ๋๊ตฌ, ์ธ์คํํฐ, ๋ชฉ๋ก ํจ๋), ์ปค๋งจ๋ ๋ชฉ๋ก ํธ์ง๊ธฐ, ์ด๋ฒคํธ ์คํ ๋ช
๋ น, ์์ง ๊ต์ฐจ ๊ฒ์ฌ
src-tauri/ Rust: ํ์ผ๊ณผ ํ๋ก์ธ์ค ๋ช
๋ น, ๊ฐ์, ํซ ๋ฆฌ๋ก๋ push, ์ฑ์ ๋ ์์ง ์ฐพ๊ธฐ
tests/e2e/ Playwright (๋ธ๋ผ์ฐ์ ๋ชจ๋)์ ์๋ฐ๋ฐ๋ ์ธ์ ํ
์คํธ, ๋์ฐ๋ฏธ๋ tests/e2e/support/
tests/scripts/ scripts/*.mjs ์ ๋จ์ ํ
์คํธ (ํ ๋ฒํธ, ๊ณ ์ง, ์๊ฐ ๊ฒ์ฌ ๊ณํ๊ณผ ํ์ )
.github/workflows/ ci.yml (๋งค ํธ์), release.yml (์ค์น ํ์ผ๊ณผ ์๊ฐ ๊ฒ์ฌ)
docs/plans/ ๊ณํ๊ณผ ์งํ ์ํฉ
docs/design/ UI ์ฉ์ด์ ๋ฌธ๊ตฌ ๊ท์น (ui-terms.md)
| ๋ช ๋ น | ๋ฌด์ |
|---|---|
yarn dev, yarn build, yarn preview |
์ฑ (Vite) |
yarn typecheck, yarn lint |
TypeScript ์ ESLint (core์ ext-rpg์ ๋ชจ๋ธ์ DOM ๊ณผ PIXI ๋ฅผ import ํ์ง ๋ชปํ๋ค) |
yarn test |
Vitest ๋จ์ ํ
์คํธ (๋ชจ๋ ํจํค์ง, e2e ๋์ฐ๋ฏธ tests/e2e/support/*.unit.ts, ์คํฌ๋ฆฝํธ tests/scripts/*.unit.ts) |
yarn test:conformance |
๋ธ๋ฆฌ์ง ๋ฐฑ์๋ ์ ํฉ์ฑ (์์ง ์ ์ฅ์์ ๋ธ๋ฆฌ์ง ์๋ฒ๋ฅผ ์์ ํ๋ก์ ํธ๋ก ๋์ด๋ค. ์์น๋ INITIAL2D_DIR, ๊ธฐ๋ณธ ../Initial2D) |
yarn test:rust |
cargo test (src-tauri) |
yarn test:engine-scene |
์๋ํฐ ํ
ํ๋ฆฟ์ผ๋ก ๋ง๋ ํ๋ก์ ํธ(๋น, ํ๋ํผ, ํ์ผ๋งต x Lua, Ruby)๋ฅผ ์ง์ง ์์ง์ด ๋๋ฆฌ๋ ๊ต์ฐจ ๊ฒ์ฌ (INITIAL2D_DIR, ์คํ ํ์ผ์ ์ง์ ์ค ๋๋ INITIAL2D_EXE) |
yarn test:engine-map |
๋งต ํธ์ง์ ์์ง ๊ต์ฐจ ๊ฒ์ฌ (์ "๋งต ํธ์ง (E3)"): ํตํ ํธ์ง๊ณผ ์์ง์ ๋งํ, ์ ๋งต๊ณผ ์์ง ํ๋ฉด์ ๊ณจ๋ (Lua, Ruby), ํญ๊ตฌ ๋ง์ ํ ์นธ์ ์น ํ ๋ค์ ์์ง ์ธ์ ์๋๋ฆฌ์ค (INITIAL2D_DIR, ์คํ ํ์ผ์ ์ง์ ์ค ๋๋ INITIAL2D_EXE) |
yarn test:android-stage |
์๋๋ก์ด๋ ์คํ
์ด์ง ๊ต์ฐจ ๊ฒ์ฌ (์๋ํฐ์ ๊ฐ์ ์ธ์๋ก ์คํ
์ด์งํ ํด๋๋ง์ผ๋ก ๋ฐ์คํฌํฑ ์์ง์ด ํ๋ํผ๋ฅผ ๋๋ฆฐ๋ค, ์คํฌํ, config.setting ๊ณผ RTP ๊ฐ ๋น ์ง๋์ง). ์์ง ์ ์ฅ์๋ INITIAL2D_DIR |
yarn test:engine-graph |
๊ทธ๋ํ์์ ๋ง๋ Lua ์ Ruby ๋ฅผ ์ง์ง ์์ง์ด ๋๋ฆฌ๋ ๊ต์ฐจ ๊ฒ์ฌ (์ "๋น์ฃผ์ผ ์คํฌ๋ฆฝํ
"): ๊ทธ๋ํ์ ํ๋ํผ bird ๊ฐ ์์ผ๋ก ์ด ๊ฒ๊ณผ ๊ฐ์ ํ์ธ์ง, ์ํ๋ฌ์ ๊ฐ์ด ๋ ์ธ์ด์์ ๊ฐ์์ง (INITIAL2D_DIR, ์คํ ํ์ผ์ ์ง์ ์ค ๋๋ INITIAL2D_EXE) |
yarn luals:fetch |
์ฑ์ ์ฃ๋ ์ธ์ด ์๋ฒ LuaLS ๋ฅผ ๋ฐ์(sha256 ํ์ธ) ์ฐ์ง ์๋ ๊ฒ์ ๋นผ๊ณ src-tauri/luals/ ์ ํผ๋ค. ๊ณ ์ง๋ src-tauri/licenses/luals/. --target <ํธ๋ฆฌํ>, --from <์์ถ ํ์ผ> |
yarn test:luals |
์ง์ง LuaLS ์ ์๋ํฐ์ LSP ํด๋ผ์ด์ธํธ (tests/luals/): ์ RPG ํ๋ก์ ํธ๊ฐ ๊ฒฝ๊ณ ์์ด ์ฝํ๋์ง, ์คํ
์๋ ํ๋ก์ ํธ์ ์ง๋จ, ์์ฑ, ํธ๋ฒ, ์ ์, ์ฐธ์กฐ, ์ด๋ฆ ๋ฐ๊พธ๊ธฐ. ๋จผ์ yarn luals:fetch, ๋ค๋ฅธ ์คํ ํ์ผ์ INITIAL_EDITOR_LUALS |
yarn test:engine-events |
๋ชจ๋ธ์ ๋ช
๋ น์ผ๋ก ๋ง๋ RPG ์ด๋ฒคํธ๋ฅผ ์ง์ง ์์ง์ด ๋๋ฆฌ๋ ๊ต์ฐจ ๊ฒ์ฌ (ํญ๊ตฌ ๋ง์ ์ฌ๋ณธ, ๋ค ํ๊ณผ ๋์กฐ ์ธ ํ, INITIAL2D_DIR) |
yarn sync:templates |
์์ง ์ ์ฅ์์ ์ฌ ๋ก๋์ ํ
ํ๋ฆฟ๊ณผ ์์ ๋ฅผ packages/app/templates/ ๋ก ๋ณต์ฌํ๊ณ MANIFEST(์ถ์ฒ, ์์ง ์ปค๋ฐ, sha256, ์์ฑ๋ฌผ ํ์)๋ฅผ ๊ฐฑ์ (INITIAL2D_DIR). --from-zip <zip ์ด๋ dist ํด๋> ๋ ์์ง์ ํ
ํ๋ฆฟ ๋ฌถ์์์ |
yarn sync:rpg |
์์ง ์ ์ฅ์์ RPG ์ด๋ฒคํธ ๊ณ์ฝ ํ์ผ์ packages/ext-rpg/test/fixtures/ ๋ก ๋ณต์ฌํ๊ณ MANIFEST(์ถ์ฒ, ์์ง ์ปค๋ฐ, sha256)๋ฅผ ๊ฐฑ์ (INITIAL2D_DIR) |
yarn engine:fetch |
์ฑ์ ์ฃ๋ ์์ง์ ๋ฐ๋๋ค. --from <์์ง dist ํด๋>, --target <ํธ๋ฆฌํ>, --templates <ํด๋>, --any-commit (์ "์ฑ์ ์ฃ๋ ์์ง") |
yarn engine:check |
ํ(engine-pin.json)๊ณผ ์์ง์์ ์จ MANIFEST ์ ๋ถ, ๋ฐ์ ๋ engine.json ์ ์์ง ์ปค๋ฐ ๋์กฐ |
yarn engine:pin <ํ๊ทธ> |
ํ์ ์์ง์ ๊ณต๊ฐ ๋ฆด๋ฆฌ์ค์ ๋ฌถ๋๋ค (engineTag ์ ์์ฐ์ sha256). --from <ํด๋> (์ "์ฑ์ ์ฃ๋ ์์ง") |
yarn version:set <ํ>, yarn version:check |
ํ ๋ฒํธ๋ฅผ ํ๊บผ๋ฒ์ ๋ฐ๊พธ๊ฑฐ๋ ํ ๊ฐ์ง์ธ์ง ๋ณธ๋ค (์ "์ค์น ํ์ผ๊ณผ ์๊ฐ ๊ฒ์ฌ") |
yarn licenses |
์๋ํฐ์ ์ 3์ ๊ณ ์ง src-tauri/licenses/THIRD-PARTY-editor.md ๋ฅผ ๋ค์ ์ด๋ค (scripts/gen-licenses.mjs). --check ๋ ๋ค๋ฅด๋ฉด ์คํจ |
yarn build:desktop |
์์ค๋งต ์๋ ๋น๋ (๋ฐ์คํฌํฑ ๋ฒ๋ค์ฉ, src-tauri/tauri.dist.conf.json ์ด ๋ถ๋ฅธ๋ค) |
yarn selftest:app <์ฑ> |
๋น๋ํ ์ฑ์ ์๊ฐ ๊ฒ์ฌ (์ฐฝ ์์). --forest <์์ง ์ ์ฅ์>, --rpg <์์ง ์ ์ฅ์>, --embedded, --plan <๊ณํ> --no-check |
yarn sync:engine-web |
์์ง ์ ์ฅ์์ ์น ๋น๋(build-web/site/ ์ Initial2D.js, Initial2D.wasm, initial2d-loader.js)์ ์ 3์ ๊ณ ์ง(THIRD-PARTY.md)๋ฅผ packages/app/public/engine/ ์ผ๋ก ๋ณต์ฌํ๊ณ MANIFEST(์ถ์ฒ, ์์ง ์ปค๋ฐ, sha256, ๊ธฐ๋ฅ)๋ฅผ ๊ฐฑ์ (INITIAL2D_DIR). ๋จผ์ ์์ง ์ ์ฅ์์์ tools/build_web.sh |
yarn test:engine |
์ง์ง ์์ง๊ณผ ํซ ๋ฆฌ๋ก๋ ๊ต์ฐจ ๊ฒ์ฌ (์์ง์ ํค๋๋ฆฌ์ค๋ก ๋์ฐ๊ณ I2DH ๋ฌถ์์ ๋ณด๋ด HotReload: reloaded ๋ฅผ ๋ณธ๋ค). ์์ง ์ ์ฅ์ ์์น๋ INITIAL2D_DIR, ๊ธฐ๋ณธ ../Initial2D |
yarn test:e2e |
Playwright, Chromium ์ผ๋ก ๋ชจ๋ ์คํ (๋จผ์ yarn build, ์ฒ์ ํ ๋ฒ yarn playwright install chromium). ๋ธ๋ฆฌ์ง ๋ชจ๋์ ์๋ฐ๋ฐ๋ ์ธ์ ํ
์คํธ๋ INITIAL2D_DIR์ ์์ง ์ ์ฅ์๋ฅผ ์ฐ๊ณ , ์์ผ๋ฉด ๊ฑด๋๋๋๋ค. ํฌํธ๋ ํ๊ฒฝ ๋ณ์๋ก ๋ฐ๊ฟ๋๋ค: E2E_PORT(๋ฏธ๋ฆฌ๋ณด๊ธฐ, ๊ธฐ๋ณธ 4173), E2E_BRIDGE_PORT(๋ธ๋ฆฌ์ง๋ฅผ ๊ณ ์ ํฌํธ๋ก ๋์ฐ๋ ํ
์คํธ์ ํฌํธ) |
yarn test:e2e:webkit |
๊ฐ์ Playwright ๋ฅผ WebKit(macOS ์ฑ์ ์น๋ทฐ WKWebView ์ ๊ฐ์ ์์ง)์ผ๋ก. ๋ธ๋ผ์ฐ์ ์์ง์ ๋ฐ๋ผ ๋์์ด ๊ฐ๋ฆฌ๋ ์คํ(playwright.config.ts ์ WEBKIT_SPECS: ์คํฌ๋ฆฝํธ ํธ์ง, ์คํฌ๋ฆฝํธ ํญ ์ฌ๋ฟ, ๊ทธ๋ํ, ์ธ์ด ์๋ฒ, ๋ถ์๊ธฐ ์์ปค)๋ง ๋๋๋ค. ์ธ์ด ์๋ฒ ์คํ(language-server.spec.ts)์ yarn luals:fetch ๋ก ๋ฐ์ LuaLS ๋ฅผ ์ํ ํ๋ก์ธ์ค๊ฐ ๋์ ๋ถ์ด๊ณ , ์์ผ๋ฉด CI ๊ฐ ์๋ ๋ ๊ฑด๋๋๋๋ค. ์ฒ์ ํ ๋ฒ npx playwright install --with-deps webkit, ์คํ ํ๋๋ง์ yarn test:e2e:webkit tests/e2e/script-tabs.spec.ts |
yarn guide:screenshots |
์ฌ์ฉ์ ๊ฐ์ด๋์ ํ๋ฉด(docs/guide/images/*.png)์ ๋ค์ ์ฐ๋๋ค (tests/guide/, playwright.guide.config.ts). ๋จผ์ yarn build. ์นํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋์์ RPG ๋ฐ๋ชจ์ ํ๋ํผ๋ฒ๋ ํ
ํ๋ฆฟ์ผ๋ก ์ฐ๊ณ ์ํ ๋ฐ๋ ์๋ผ ๋
๋๋ค |
yarn check:colors |
ํ ํฐ ํ์ผ ๋ฐ์ ์ ๋ฆฌํฐ๋ด ๊ฒ์ฌ (ํ ๋ง ๊ท์น) |
yarn check:terms |
UI ๋ฌธ๊ตฌ ๊ฒ์ฌ: packages/*/src, src-tauri/src ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๊ณผ JSX ํ
์คํธ์์ ์ฐ์ง ์๋ ๋ง๊ณผ ํ๋ค์ฒด ๋๋งบ์์ ์ฐพ๋๋ค (๊ท์น์ ์๋ "UI ๋ฌธ๊ตฌ"). ํด๋๋ ํ์ผ์ ์ฃผ๋ฉด ๊ฑฐ๊ธฐ๋ง |
node scripts/check-web-dist.mjs |
๋น๋ํ dist/ ๊ฒ์ฌ (_headers, ์น ์์ง๊ณผ MANIFEST, ๊ณ ์ง, Pages ํ๋). --desktop ์ ์์ค๋งต์ด ์๋์ง๋ (์ "์นํ ๋ฐฐํฌ") |
yarn tauri <cmd> |
Tauri CLI |
์์ packages/app/src/theme/tokens.css์ ํ ํฐ(CSS ๋ณ์)์ผ๋ก๋ง ์๋๋ค. <html data-theme="dark|light">๋ก ๋ฐ๋๊ณ
๊ธฐ๋ณธ์ OS ์ค์ ์ ๋ฐ๋ฆ
๋๋ค. ์ ํ
๋ง๋ ํ ํฐ ๊ฐ ํ ๋ฒ์ ๋ํ๋ฉด ๋ฉ๋๋ค. ๊ท์น์
docs/plans/02-scope-and-screens.md 6์ .
ํ๋ฉด, ์๋ฆผ, ์ฝ์, ์ค๋ฅ์ ์ฐ๋ ๋ง์ docs/design/ui-terms.md์ ์ฉ์ดํ์ ๋๋งบ์ ๊ท์น์ ๋ฐ๋ฆ
๋๋ค.
๊ฐ์ ๋์์ ์ด๋์๋ ๊ฐ์ ๋ง๋ก ๋ถ๋ฅด๊ณ (ํ์ผ, ๋ธ๋ฌ์, ๊ฒ์ ํญ, ์ด ๋งต์์ ์คํ), ๋ฉ๋ด์ ๋ ์ด๋ธ๊ณผ ์ํ๋ ์งง์ ๋ช
์ฌ๊ตฌ๋ก ์๋๋ค.
์ค๋ช
, ์๋ฆผ, ์ค๋ฅ, ํ์ธ ๋ํ์์์ ์ฌ์ค๊ณผ ๊ฒฐ๊ณผ๋ ํฉ๋๋ค์ฒด๋ก ์ฐ๊ณ ์ง๋ฌธ์ ~ํ ๊น์?๋ก ์๋๋ค. ๋ฌธ์ฅ์ด ๋ ์ด์์ด๋ฉด ๋ฌธ์ฅ๋ง๋ค ๋ง์นจํ๋ฅผ ์ฐ์ต๋๋ค.
๋ณ์ ๋ค์๋ ๋ฐ์นจ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์กฐ์ฌ๋ฅผ ๋ถ์ด์ง ์์ต๋๋ค. ์ ๋ฌธ๊ตฌ๋ฅผ ๋ฃ์ผ๋ฉด yarn check:terms๋ฅผ ๋๋ฆฝ๋๋ค.
ํ
์คํธ๋ฅผ ๋บ ์์ค์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๊ณผ JSX ํ
์คํธ์์ ์ฐ์ง ์๋ ๋ง, ํ๋ค์ฒด ๋๋งบ์, ํ์คํ๊ฒ ๊ตฌ๋ถ๋๋ ์ ๋ณด์ฒด ๋๋งบ์์ ์ฐพ๊ณ , CI๋ ์ ๋ฆฌํฐ๋ด ๊ฒ์ฌ ์์์ ๊ฐ์ ๊ฒ์ฌ๋ฅผ ํฉ๋๋ค.
๊ท์น์ด ๋ง์ง ์๋ ์ค(์ ์คํฌ๋ฆฝํธ ํ
ํ๋ฆฟ์ด ์ฐ๋ ์ฝ๋ ์ฃผ์ ๊ฐ์ ๊ฒ)์ ์ค ๋์ // terms-ok: <์ด์ > ๋ฅผ ์ ์ด ๋บ๋๋ค.
2020๋ ๋ถํฐ์ ํ์ผ๋งต ์๋ํฐ(PIXI 7, jQuery ์์ ์ ์ ธ)๋ E3์์ ์ง์ ์ต๋๋ค. ์ ๊ธฐ๋ฅ์ด ์ ์๋ํฐ์ ์ด๋๋ก ๊ฐ๋์ง๋ docs/plans/e3-tilemap.md์ ์ด์ ํ์ ์๊ณ , ์ฝ๋๋ git ์ด๋ ฅ์ ๋จ์ ์์ต๋๋ค.
MIT.