Skip to content

Latest commit

ย 

History

641 Commits

Folders and files

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

Repository files navigation

SUBTARUNE

์•”ํ‘ ์ถ”๊ฒฉ์žยท๊ธฐ์กด ์žฅ๋ฉด ๊ต์ • (BUILD319)

๊ฒ€์€ ๊ธธ ๋‹ค์Œ ๋ฏธ๋กœ์˜ ์ถ”๊ฒฉ์ž๋Š” ๊ฒ€์€ ๊ตฌํ˜• ๋ชธ์ฒดยท๋ณด๋ผ ์˜ค๋ผยท๋ฐ์€ ์ค‘์•™ ์ฝ”์–ด๋ฅผ ๊ฐ€์ง„ ์ƒˆ ๋ณ„๋„ ์บ๋ฆญํ„ฐ๋‹ค.192ร—192 RGBA ํ•œ ์žฅยท์ค‘์‹ฌ ํ”ผ๋ฒ—96,96์„ ์›”๋“œ ์ด๋™์‹œํ‚ค๋ฉฐ, ์™ธ๊ณฝ ์˜ค๋ผ๋Š” ๊ธธ์„ ๋ฐํžˆ๊ฑฐ๋‚˜ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”๋‹ค. ์›๋ณธยทํ”„๋กฌํ”„ํŠธยท์•ŒํŒŒ/ํฌ๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์ถ”๊ฒฉ์ž ์ž์‚ฐ ๊ณ„์•ฝ, ๋ฒฝ ํ†ต๊ณผ ์ถ”๊ฒฉยท์ ‘์ด‰ ์žฌ์‹œ๋„ยทํšŒ๋ณต ์ƒ˜๊ณผ ๋งˆ์ง€๋ง‰ ๋‹ซํžŒ ๋ฌธ์€ ์ถ”๊ฒฉ ์ฝ˜ํ‹ฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

๊ธฐ์กด ๋™๋ฃŒ ์‹œํŠธยทํ‘œ์‹œ ํฌ๊ธฐ๋Š” ์œ ์ง€ํ•œ๋‹ค. ๋กœ๋น„์˜ ์ „์› ์•”์ „ ๋ฐฐ์น˜์™€ ์•ˆ์ „ํ•œ ๋ณดํ–‰์€ ๋Œ€๋ฌธ ์ฝ˜ํ‹ฐ, ๊ฑฐ์„ ์ดˆ์  ๋ฐœ์‚ฌ์ŒยทFrom Now On ์ „ํ™˜ยท10๋‹จ๊ณ„ ์นด๋ฉ”๋ผ๋Š” ๊ฑฐ์„ ์ฝ˜ํ‹ฐ๊ฐ€ ์ตœ์‹ ์ด๋‹ค. ๊ฒ€์€ ๊ธธ์€ ์ด๋™80px ๊ฐ„๊ฒฉ์˜ ๋„“์€ ํŒŒ๋™๋งŒ์œผ๋กœ ๊ธธ์„ ๋“œ๋Ÿฌ๋‚ธ๋‹ค. ์•„๋ž˜318์˜ ๋นˆ ๋„์ฐฉ ๋งต ๋ฒ”์œ„๋Š” ์ด๋ฒˆ ์ถ”๊ฒฉ ๋ฏธ๋กœยท์•ˆ์ „ ๋ฐฉ์œผ๋กœ ํ™•์žฅ๋์œผ๋ฉฐ, ๊ฒ€์ฆ๊ณผ ๋ฐฐํฌ ์—ฌ๋ถ€๋Š” STATE์—์„œ ๋ถ„๋ฆฌํ•œ๋‹ค.

์ค‘์•™ ๋Œ€๋ฌธ ๊ฐœ๋ฐฉยท์•”ํ‘ ํŒŒ๋™ ๊ธธ (BUILD318)

์–‘์ชฝ ๊ตฌ์ฒด ํ™œ์„ฑํ™” ๋’ค ๋™๋ฃŒ๋“ค๊ณผ ์ค‘์•™ ๋ฌธ์„ ์—ฌ๋Š” ํ›„์† ์—ฐ์ถœ์ด ์ด์–ด์ง„๋‹ค. ์•„๋ž˜316/311์˜ โ€œ๋Œ€๋ฌธ์€ ์•„์ง ๋‹ซํž˜โ€์€ ๋‹น์‹œ ์ง„ํ–‰ ๊ธฐ๋ก์ด๋ฉฐ318์ด ๋Œ€์ฒดํ•œ๋‹ค. ์—ด๋ฆฐ ๋ฌธ์€ ๊ธฐ์กด320ร—384 ๋ฌธํ‹€๊ณผ ๋™์ผํ•œ ์บ”๋ฒ„์Šคยทํ”ผ๋ฒ—์„ ์œ ์ง€ํ•œ ๋ณ„๋„ ์ƒ์„ฑ ์†Œํ’ˆ์ด๋‹ค. ์›๋ณธยทํ”„๋กฌํ”„ํŠธยท์•ŒํŒŒ ๋ณด์กด ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์—ด๋ฆฐ ๋Œ€๋ฌธ ์ž์‚ฐ ๊ณ„์•ฝ์„ ๋”ฐ๋ฅธ๋‹ค. ๊ธธ์€ ์™„์ „ ๊ฒ€์ •์ด๋ฉฐ ๋ฐœ๊ฑธ์Œ ํŒŒ๋™์ด ์‹ค์ œ ๊ธธ ๊ฒฝ๊ณ„์—์„œ ๋Š๊ฒจ ์œ„โ†’์˜ค๋ฅธ์ชฝโ†’์œ„์˜ ๋ฐฉํ–ฅ์„ ์ฐพ๋Š”๋‹ค. ๊ธฐ์กด ์–ผ๊ตดยท์˜ค๋ธŒ์ œ ๋ฐœ์†Œ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์ƒˆ ์บ๋ฆญํ„ฐ ๋””์ž์ธ์€ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

๊ฑฐ์„ ๋‹ค๋ฆฌยท๋ˆ„๋ˆ„์„ญยท์ฅฐํฌ ๋ฐ€๊ธฐ (BUILD316)

BUILD317 ํ‘œ์‹œ ๊ต์ •: ์›๋ณธ PNGยทํ”„๋ ˆ์ž„ยทํ”ผ๋ฒ—์€ ๋ณด์กดํ•˜๊ณ  ๋ˆ„๋ˆ„ ์žฅ๋ฉด ๋ฐฐ์œจ์€1.3, ๊ฑฐ์„๊ณผ ๋ฐ•ํžŒ ์ž”ํ•ด๋Š”1.5๋ฐฐ(๊ฑฐ์„ ์‹ค์ฒด ์•ฝ330px)๋กœ ํ†ต์ผํ•œ๋‹ค. ์•„๋ž˜0.88/220px๋Š” ์ œ์ž‘ ๋‹น์‹œ ๊ทœ๊ฒฉ์ด๋‹ค. ํŒŒํฌ๊ฐ€๋””์–ธ์€ ๋ผ์šด์ง€์™€ ๊ฐ™์€ ์ธํ˜•ํƒˆ park_guardian_costume2.22, ๋šœ์šธ๋ผ๋Š” ttuulla1.79๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ตœ์‹  ๊ตฌ๋„ยท๋ฐ€๊ธฐ ์ „ํ™˜์€ DESIGN์„ ๋”ฐ๋ฅธ๋‹ค.

๋ˆ„๋ˆ„์„ญ์€ ์ž‘์€ ๊ธฐ์ˆ˜์™€ ๋„ค ํŒ”์˜ ๊ฑฐ๋Œ€ํ•œ ์„ค์ธ์— ๊ฐ€์žฌ๋งจ์˜ ์•ˆ๊ฒฝยท๋‘ ๋ˆˆยท๋„“์€ ๋ณผยทํฐ ์ฝ”, ํšŒ์ฒญ/๋จน์ƒ‰ ์–ด๋‘  ํŒ”๋ ˆํŠธ๋ฅผ ๊ฒฐํ•ฉํ•œ๋‹ค.384px์…€2ร—2ยท๋ฐœ ํ”ผ๋ฒ—192,360ยท์žฅ๋ฉด ๋ฐฐ์œจ0.88์ด๋ฉฐ ๋ฐ€๊ธฐ ๋‘ ํฌ์ฆˆยทํฌํšจยท๋ฐ€๋ ค๋‚จ์„ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์›๋ณธ๊ณผ ๋ชจ์…˜ ๊ทœ๊ฒฉ์„ ๋”ฐ๋ฅธ๋‹ค. ์ฅฐํฌ๋Š” ๊ธฐ์กด ๋ถ„ํ™ ๋ชธยทํŒŒ๋ž€ ๋ˆˆยทํฐ ์ฝ”ยท์งง์€ ํŒ”๋‹ค๋ฆฌ๋ฅผ ์œ ์ง€ํ•œ ๋ณ„๋„ ์–‘์† ๋ฐ€๊ธฐ4ํฌ์ฆˆ๋กœ,128px์…€ยท๋ฐœ64,120ยท์† ์ ‘์ด‰๋ฉดx112ยท๋ชจ์…˜ ๋ฐฐ์œจ0.5๋‹ค. ๊ธฐ์กด ๊ฑท๊ธฐ/์›ƒ์Œ์€ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค. ์ฅฐํฌ ๊ทœ๊ฒฉ.

๊ฑฐ์„์€ ์‹ค์ œ220px ์ง€๋ฆ„์ด๋ฉฐ ๊ตด๋Ÿฌ๊ฐ€๋Š” ๊ทธ๋ฆผ๊ณผ ๋ฒฝ์— ๋ฐ•ํžŒ ๊ทธ๋ฆผ์˜ ํฌ๊ธฐยท์ ‘์ ์„ ๊ฐ™๊ฒŒ ์—ฐ๊ฒฐํ•œ๋‹ค. ๊ฑฐ์„/๋ฒฝ ์ž์‚ฐ ๊ณ„์•ฝ์„ ๋”ฐ๋ฅด๊ณ  ์†Œํ’ˆ ์ƒ์„ฑ๊ธฐ์˜ ์ค‘๊ฐ„ ์ถœ๋ ฅ์œผ๋กœ ์ตœ์ข… PNG๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค. ์—ฌ์„ฏ ๋น„์„ยทํ˜‘๋™ ๋ฐ€๊ธฐยท์™ผ์ชฝ ๋ด‰์ธ๊นŒ์ง€์˜ ์ง„ํ–‰์€ ์ฝ˜ํ‹ฐ, ๊ฒ€์ฆยท๋ฐฐํฌ ์ƒํƒœ๋Š” STATE ๊ธฐ์ค€์ด๋‹ค. ์™ผ์ชฝ ๊ตฌ์ฒด ์ ๋“ฑ ํ›„์—๋„ ์ค‘์•™ ๋Œ€๋ฌธ์€ ์•„์ง ์—ด์ง€ ์•Š๋Š”๋‹ค.

์˜ค๋ฅธ์ชฝ ๋ด‰์ธ ๊ตฌ์ฒด ๋ฐฉ (BUILD311)

๋ง์žํ•˜์„ญ ๋„์ฐฉ ๋งต ๋ถ์ชฝ ๋ฌธ์€ ๊ฒ€์€ ๋‹จ์ผ ํ™”๋ฉด ๋ฐฉ์œผ๋กœ ์ด์–ด์ง„๋‹ค. ์ค‘์•™ ๊ตฌ์ฒด๋Š”128ร—128ยท์ค‘์‹ฌ64,64์˜ ๋ณ„๋„ ์ƒ์„ฑ ์†Œํ’ˆ์ด๋ฉฐ ๋ณด๋ผ ์˜ค๋ผยท๋ฐ”๋‹ฅ ๊ด‘์›ยท์š”ํ”Œ๋ž˜ ์‹ค๋ฃจ์—ฃ ๊ทธ๋ฆผ์ž๋ฅผ ๋Ÿฐํƒ€์ž„์—์„œ ๋”ํ•œ๋‹ค. ์›๋ณธ/์ตœ์ข… ์ž์‚ฐ ๊ณ„์•ฝ์„ ๋”ฐ๋ฅด๊ณ  ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ๋ฌผ์„ ์ตœ์ข… PNG ๋Œ€์‹  ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ์ ‘์ด‰ ํ›„ ๋Œ€๋ฌธ ์˜ค๋ฅธ์ชฝ ๋ด‰์ธ๋งŒ ์ผœ์ง€๋Š” ์—ฐ์ถœ๊ณผ ์™„๋ฃŒ ์ €์žฅ ๊ณ„์•ฝ์€ ๊ตฌ์ฒด ๋ฐฉ ๊ธฐํš์„ ๋”ฐ๋ฅธ๋‹ค. ์™ผ์ชฝ ๋ด‰์ธ๊ณผ ๋Œ€๋ฌธ์€ ์•„์ง ๋‹ซํ˜€ ์žˆ๋‹ค.

๋ง์žํ•˜์„ญยทํ† ๋ฆฌ์ด ์ถ”๊ฒฉ (BUILD310)

๋ง์žํ•˜์„ญ์€ ์‚ฌ์šฉ์ž ์›๋ณธ์˜ ๋พฐ์กฑํ•œ ์ž์ฃผ์ƒ‰ ํ›„๋“œยท์ฒญ๋ก ๋ณด์„ ์„ธ ๊ฐœยท๊ฒ€์€ ์•ˆ๊ฒฝยท์ฒญ๋ก ๋ˆˆ ๋‘ ๊ฐœยท๋„“์€ ๋ณผยทํฐ ์ฝ”ยท์ž…์„ ๊ฐ€๋ฆฐ ๋ชฉ๋„๋ฆฌยท์ง™์€ ์กฐ๋ผ์™€ ํ—ˆ๋ฆฌ์ฒœ์„ ์œ ์ง€ํ•œ๋‹ค. ๊ฐ€์žฌ๋งจ ์›๋ณธ ์‹œํŠธ๋ฅผ ๋Œ€์‹  ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ๊ฒ€์€ ์˜ค๋ผ๋Š” ๋ณธ์ฒด ๋’ค์— ๋‘๋ฉฐ ์–ผ๊ตด์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๊ณต์ค‘ ๋Œ€๊ธฐ/์‹œ์ „/๋Œ์ง„/ํ”ผ๊ฒฉ์€ ๊ฐ๊ฐ128px์…€ 2ร—2 ์‹œํŠธยท์ค‘์‹ฌ ํ”ผ๋ฒ—64,64์ด๊ณ , ๊ณตํ—ˆ์ถฉ์€64px์…€ยท์ค‘์‹ฌ32,32๋‹ค. ์›๋ณธยท์ •ํ™•ํ•œ ์ƒ์„ฑ ํ”„๋กฌํ”„ํŠธยท์ตœ์ข… ์‹œํŠธ ๊ณ„์•ฝ์˜ ๋ฃจํŠธ PNG๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ ์ค‘๊ฐ„ sheet-transparent.png๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค.

๋จผ ๋ฐฐ๊ฒฝ ์ „ํˆฌ์˜ ์ ์€ ๊ฐ€์žฌ๋งจ์˜ ๋„“์€ ๋ณผยทํฐ ์ฝ”ยท์•ˆ๊ฒฝยท๋‘ ๋ˆˆ๊ณผ ์›Œ์œ…์˜ ๋Š‘๋Œ€/๋ฐœํ†ฑ, ์ด์ฆˆ๋ฆฌ์–ผ์˜ ๊ธˆ๋ฐœ/๋งˆ๋ฒ• ์žฅ๊ฐ‘, ์•ผ์Šค์˜ค์˜ ๋ฌถ์€ ๋จธ๋ฆฌ/๊ฒ€, ์•„์นผ๋ฆฌ์˜ ๋‹Œ์ž๋ณต/๋‚ซ์„ ์„ž์€ ๋ณ„๋„ ๋„ค ์บ๋ฆญํ„ฐ๋‹ค. ์–ผ๊ตด์€ ์ฝํžˆ๊ฒŒ ๋‘๊ณ  ํšŒ์ฒญ์ƒ‰ยท๋จน์ƒ‰ ๊ณ„์—ด์— ์ž‘์€ ์ฑ”ํ”ผ์–ธ ๊ตฌ๋ถ„์ƒ‰์„ ๋‚จ๊ธด๋‹ค.96px์…€ 2ร—2์˜ ์ˆœ์„œ๋Š” ๋Œ€๊ธฐโ†’์ค€๋น„โ†’๊ณต๊ฒฉโ†’ํ”ผ๊ฒฉ์ด๋ฉฐ ๋งˆ์ง€๋ง‰ ์…€์€ ํšŒ๋ณต/๋Œ€๊ธฐ ํฌ์ฆˆ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ƒˆ ๋ฐฐ๊ฒฝ ์‹œํŠธ์™€ ๊ทผ์ ‘ ๋ณด์Šค ์‹œํŠธ์˜ ํ‘œ์‹œ ํฌ๊ธฐ๋ฅผ ์„œ๋กœ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ œ์ž‘ ์›๋ณธ๊ณผ ๋ฐœ ์ •๋ ฌ, ์‹ค์ œ ์—ฐ๊ฒฐ์€ src/battle/modes/malzahar-background.js๊ฐ€ ์†Œ์œ ํ•œ๋‹ค.

๋ณด๋ผ ํ† ๋ฆฌ์ด๋Š” ๊ธฐ์กด ํŒŒ๋ž€ ํ† ๋ฆฌ์ด์˜ ๋ชจ์–‘ยท๋ถ„๋ฆฌ ๋ ˆ์ด์–ดยท์ƒ‰ํ‚ค๋ฅผ ์œ ์ง€ํ•œ ์ƒ‰์ƒ ๋ณ€ํ˜•์ด๋‹ค. ํŒ”๋ ˆํŠธ ์ƒ์„ฑ๊ณผ ๊ธฐ๊ณ„์  ์žฌ์ƒ‰์ƒ ๊ธฐ๋ก, ์—ฐ์† ๋‹ฌ๋ฆฌ๊ธฐ ์ „ํˆฌ ๊ณ„์•ฝ, ๊ฒ€์ฆยท๋ฐฐํฌ ์—ฌ๋ถ€๋Š” STATE๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ์ด ๊ตฌ๊ฐ„์˜ ๊ธฐ๋ณธ ์ด๋™/์ ํ”„/๋ฒ ๊ธฐ๋Š” ๊ธฐ์กด runner๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

๊ธฐ์–ต์˜ ๋ฐฉ ์–ด๋‘  ์ƒ‰๊ฐ (BUILD309)

์„ญ๋ฃจํ† ยท์ง€๋ขฐ์„ญยท์šฐ๋””๋ฅด์„ญ์€ ๊ฐ€์žฌ๋งจ gajaeman_shadow.png์ฒ˜๋Ÿผ ์ „์‹ ์— ์–ด๋‘ ์˜ ํž˜์„ ๋ฐ›์€ ํšŒ์ฒญ์ƒ‰ ํ”ผ๋ถ€ยท๋จน์ƒ‰/๋‚จ์ƒ‰ ์˜์ƒ์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค. ์•„๋ž˜308์˜ ๋ฐ์€ ์›์ƒ‰์€ ์ดˆ๊ธฐ ์ •์ฒด์„ฑ ๊ธฐ๋ก์ด๋ฉฐ ์ตœ์‹  ํŒ”๋ ˆํŠธ๋Š”309๊ฐ€ ์šฐ์„ ํ•œ๋‹ค. ์–ผ๊ตด ํ˜•ํƒœยท๋ˆˆ ๊ฐœ์ˆ˜ยท์•ˆ๊ฒฝ ์œ ๋ฌดยท์ฝ”ยท์˜์ƒ ์‹ค๋ฃจ์—ฃยท๊ณต๊ฒฉ ํฌ์ฆˆ๋Š” ์œ ์ง€ํ•˜๊ณ  ๊ธฐ์กด ๊ตฌ๋ถ„์ƒ‰์€ ๋‚ฎ์€ ์ฑ„๋„์˜ ์ž‘์€ ํ‘œ์‹์œผ๋กœ ๋‚จ๊ธด๋‹ค. ํ•„๋“œ ์ค‘๋ฆฝ๊ณผ ์ „ํˆฌ ์‹œ์ „, ์ง€๋ขฐ์„ญ ๊ฑฐ๋ฏธ์ค„ ๋’ท๋ชจ์Šต๋„ ๊ฐ™์€ ์ƒ‰ ๊ณ„์—ด์ด๋‹ค. ์›๋ณธ ํŽธ์ง‘ยทํ”„๋กฌํ”„ํŠธยท๋น„๊ตยท๊ทœ๊ฒฉ์€ assets/source/memory309/<id>/README.md๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

๊ธฐ์–ต์˜ ๋ฐฉ ์บ๋ฆญํ„ฐ ๊ธฐ์ค€ (BUILD308)

์„ธ ์ ์˜ ์™ธํ˜•์„ ์ˆ˜์ •ํ•  ๋•Œ assets/references/memory308-<id>.png์™€ ์•„๋ž˜ ์ž์‚ฐ ๊ณ„์•ฝ์„ ํ•จ๊ป˜ ํ™•์ธํ•œ๋‹ค. ํ•„๋“œ์™€ ์ „ํˆฌ๋Š” ๊ฐ™์€ ์–ผ๊ตดยท์˜์ƒยท์™ผ์ชฝ ์•„๋ž˜3/4 ์‹œ์ ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์ž‘์€ ์–ด๋‘์šด ๊ธฐ์šด์€ ์–ผ๊ตด ๋’ค์— ๋‘”๋‹ค.

์บ๋ฆญํ„ฐ ๊ณ ์ • ์™ธํ˜• ์›๋ณธยท๋Ÿฐํƒ€์ž„ ๊ณ„์•ฝ
์„ญ๋ฃจํ†  (seobruto) ๋…ธ๋ž€ ๋จธ๋ฆฌ, ๋‚˜๋ญ‡์žŽ ๋จธ๋ฆฌ๋ , ๋‘ฅ๊ทผ ์•ˆ๊ฒฝ๊ณผ ๋‘ ๋ˆˆ, ๋„“์€ ๋ณผยทํฐ U์ž ์ฝ”, ๋ณ„๋„ ์ž… ์—†์Œ, ์ฃผํ™ฉ/๋‚จ์ƒ‰ ๋‹Œ์ž์˜ท ์„ญ๋ฃจํ† 
์ง€๋ขฐ์„ญ (jiroesub) ๊ฒ€์ •/๋ถ„ํ™ ์Œ๊ฐˆ๋ž˜์™€ ๋ฆฌ๋ณธ, ์•ˆ๊ฒฝ ์—†๋Š” ๋‘ ๋ˆˆยทํฐ U์ž ์ฝ”ยท๋ณ„๋„ ์ž… ์—†์Œ, ๋ถ„ํ™ ํ”„๋ฆด, ๊ฒ€์ • ์น˜๋งˆ/๋ถ€์ธ , ์บ”๊ณผ ์ฟ ๋กœ๋ฏธ ๊ฐ€๋ฐฉ ์ง€๋ขฐ์„ญ
์šฐ๋””๋ฅด์„ญ (udyrsub) ๊ธด ๊ฐˆ์ƒ‰ ๋จธ๋ฆฌ์™€ ์ˆ˜์—ผ, ํŒŒ๋ž€ ๋จธ๋ฆฌ ๊ฐ€๋‹ฅ, ์•ˆ๊ฒฝ๊ณผ ๋‘ ๋ˆˆยทํฐ U์ž ์ฝ”, ๋ฌธ์‹ ํ•œ ์ƒ์ฒด, ์ฃผํ™ฉ ๊ตฌ์Šฌยทํฐ ๋ถ•๋Œ€ยท๊ฐ€์ฃฝ ์น˜๋งˆ ์šฐ๋””๋ฅด์„ญ

์„ธ ๋ชธ์ฒด๋Š”128px์…€ยทํ”ผ๋ฒ—64,120์˜4ํฌ์ฆˆ ์ „ํˆฌ ์‹œํŠธ์™€ ์ค‘๋ฆฝ ์…€์˜ ํ•„๋“œ ์ •์ง€ ๊ทธ๋ฆผ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ธฐ์–ต์˜ ๋ฐฉ ๋ฌธยท๊ฒ€์ • ์„์žฌยท๊ธฐ๋‘ฅ ์›๊ฒฝ์„ ์ˆ˜์ •ํ•  ๋•Œ๋Š” BUILD308 ํ™˜๊ฒฝ ๊ณ„์•ฝ์„ ์ ์šฉํ•œ๋‹ค. ํ˜„์žฌ ์ž์‚ฐ์€ ๊ธฐ์กด castle307_* ๋Ÿฐํƒ€์ž„ ํŒŒ์ผ์„ ๊ฐฑ์‹ ํ•˜๋ฏ€๋กœ ๊ณผ๊ฑฐ307 ์ƒ์„ฑ๊ธฐ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค. ์กฐ์šฐยท๋Œ€์‚ฌยท์ง„ํ–‰ ๋ฒ”์œ„๋Š” ๊ธฐ์–ต์˜ ๋ฐฉ ์ฝ˜ํ‹ฐ, ํ†ตํ•ฉ ๊ฒ€์ฆยท๋ฉ”์ธยท๋ฐฐํฌ ์ƒํƒœ๋Š” STATE๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

๋—๋ชฉ ํšŒ์ˆ˜ ๊ธฐ๋‘ฅ์€ ํšŒ์ˆ˜ ๋ ˆ๋ฒ„ ์›๋ณธยท๊ทœ๊ฒฉ์„ ๋”ฐ๋ฅธ๋‹ค.32ร—48 ๋Œ€๊ธฐ/๋‹น๊น€2ํฌ์ฆˆ, ๊ณตํ†ต ๋ฐ”๋‹ฅ ํ”ผ๋ฒ—16,48์ด๋ฉฐ ๊ธฐ์กด ์บ๋ฆญํ„ฐ๋‚˜ ๋—๋ชฉ ๊ทธ๋ฆผ์€ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.

BUILD306 ์„ฑ ๋ถ์ชฝ ๊ธธ์€ ์™ธ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒ€์€ ์„๋ฒฝยท๊ธฐ๋‘ฅยท์•„์น˜์™€ ๋ณด๋ผ ์ด๋ผ๊ฐ€ ์žˆ๋Š” ์„ฑ ๋‚ด๋ถ€ ์ง„์ž… ํ™€์ด๋‹ค. 32px ๋ฐ”๋‹ฅ4์ข…ยท๊ฑฐ๋Œ€ ์„ฑ๋ฌธยท์‹ค๋‚ด ๋ฐฐ๊ฒฝ์€ ์„ฑ ๋‚ด๋ถ€ ์ž์‚ฐ ๊ณ„์•ฝ, ๊ธฐ๋…์‚ฌ์ง„์˜ ํ•˜๊ฐ• ์นด๋ฉ”๋ผ ์†Œํ’ˆ์€ ์นด๋ฉ”๋ผ ๊ณ„์•ฝ์„ ๋”ฐ๋ฅธ๋‹ค. ๊ธฐ์กด ์บ๋ฆญํ„ฐ ์™ธํ˜•์€ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค. ์ดˆ๊ธฐ ์™ธ๋ถ€ ์„ฑ ์ „๊ฒฝ์€ ๋ฏธ์ฑ„ํƒ ์ดˆ์•ˆ์œผ๋กœ ๋ณด์กดํ•˜๋ฉฐ ๋Ÿฐํƒ€์ž„์— ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

BUILD305 ์ถœ์ • ์—ฐ์ถœ์˜ ์ฃผ๋จน ์‘๋‹ต์€ ๊ธฐ์กด ์š”ํ”Œ๋ž˜ยท๊ฒฝ์„ญยท๋น ๋งจ์˜ ์–ผ๊ตด๊ณผ ์˜์ƒ์„ ์œ ์ง€ํ•œ ๋ฌด๊ธฐ ์—†๋Š”4ํ”„๋ ˆ์ž„์ด๋‹ค. assets/sprites/*-deck-fist.png๋Š”512ร—128, ์…€128ร—128ยท๋ฐœ ํ”ผ๋ฒ—64,120ยท๋ฐฐ์œจ0.5์ด๋ฉฐ ์›๋ž˜ ๊ฑท๊ธฐ ๋†’์ด์— ๋งž์ถ˜๋‹ค. ์ƒ์„ฑ ์›๋ณธ/์ •ํ™•ํ•œ ํ”„๋กฌํ”„ํŠธ/NEARESTยท์•ŒํŒŒ ๋ณด์กด ์ฒ˜๋ฆฌ ๊ธฐ๋ก์€ ๊ฐ‘ํŒ ๋ชจ์…˜, ์„ฑ ์ž…๊ตฌ์˜32px ๋ณด๋ผ ์„์žฌ4์ข…์€ ํƒ€์ผ ๊ธฐ๋ก์— ์žˆ๋‹ค. ๋‚ด์žฅ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  ๊ธฐ์กด ๊ฑท๊ธฐยท์ „ํˆฌยท์ดˆ์ƒํ™”๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•˜๋‹ค.

๋ธํƒ€๋ฃฌ ์Šคํƒ€์ผ ํƒ‘๋‹ค์šด ๋„ํŠธ ์Šคํ† ๋ฆฌ ์–ด๋“œ๋ฒค์ฒ˜. ์›น์—์„œ ๋ฐ”๋กœ ์‹คํ–‰, ๋นŒ๋“œ ์—†์Œ(ES ๋ชจ๋“ˆ), ๋งตยท์•„ํŠธ๋Š” ํŒŒ์ด์ฌ ์ƒ์„ฑ๊ธฐ๋กœ ๋ฝ‘๊ณ  ์˜ค๋””์˜ค๋Š” mp3(์ถœ์ฒ˜ design/audio/references.md).

./dev.sh                          # ์บ์‹œ ๋ˆ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์žฌ๊ธฐ๋™ โ†’ http://localhost:8000  (์ž‘์—… ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์„œ๋น™ โ€” ์•„๋ž˜ '์ž‘์—… ๊ทœ์œจ')
tools/dev/check.sh                # ๋ฌธ๋ฒ• + ๋‹จ์œ„ ํ…Œ์ŠคํŠธ + ๋งต ์ƒ์„ฑ๊ธฐ ๋™๊ธฐํ™” (์ปค๋ฐ‹ ์ „, pre-commit ์ด --quick ์„ ๊ฐ•์ œ)
tests/playtest/run.sh battle teal5 # ํ—ค๋“œ๋ฆฌ์Šค ํ”Œ๋ ˆ์ดํ…Œ์ŠคํŠธ(Playwright, ์Šคํฌ๋ฆฐ์ƒท tests/playtest/shots/)

QA ๋ฐ”๋กœ๊ฐ€๊ธฐ: ํƒ€์ดํ‹€์—์„œ Q ๋˜๋Š” ?qa=<id> (๋ชฉ๋ก src/core/story.js QA_POINTS). ์ƒํƒœ๋Š” docs/STATE.md, ๊ทœ์น™์€ CLAUDE.md.

์ตœ๋ฏธ์Šค ์™ธํ˜• ๊ธฐ์ค€ (BUILD303)

์ตœ๋ฏธ์Šค๋Š” ๊ธฐ๋ณธ ๋ชจ์Šต์˜ ํฐ ์‚์นœ ๋จธ๋ฆฌยท๊ฒ€์€ ๋ˆˆ์นยท์‚ฌ๊ฐ ์•ˆ๊ฒฝยท๊ธด ์ฝ”ยท๋ณ„๋„ ์น˜์•„ ์ž…ยท๋ณผ ์ ์„ ์œ ์ง€ํ•œ๋‹ค. ๋ˆˆ์€ ๋‘ ๊ฐœ๋กœ ์ฝํ˜€์•ผ ํ•˜๋ฉฐ ์•ˆ๊ฒฝ ๋ฐ˜์‚ฌ๋‚˜ ๋ˆˆ์น์„ ์„ธ ๋ฒˆ์งธ ๋ˆˆ์ฒ˜๋Ÿผ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ์ „ํˆฌํผ์€ ์ด์ „ ํ™”๋ฉด ํ‚ค์˜ ์•ฝ1.4๋ฐฐ์ธ ๊ธธ๊ณ  ๊ฐ€๋Š” ์ฒดํ˜•์ด๋ฉฐ, ์–ผ๊ตด์„ ์„ธ๋กœ๋กœ ๋Š˜์—ฌ ํ‚ค๋ฅผ ๋งž์ถ”์ง€ ์•Š๋Š”๋‹ค. ๋ณ€์‹  ํ›„ ํ•„๋“œํผ๋„ ๊ฐ™์€ ๊ธด ์ฒดํ˜•ยท์–ผ๊ตด ์ •์ฒด์„ฑ์œผ๋กœ ์ด์–ด์ง€๋ฉฐ ๋งํ† ๋Š” ์ „ํˆฌ ์ง„์ž…์—์„œ ํŽผ์นœ๋‹ค. ๋ณ€์‹  ์ „ ๋šฑ๋šฑํ•œ ๊ธฐ๋ณธ ์ตœ๋ฏธ์Šค๋Š” ๊ทธ๋Œ€๋กœ๋‹ค. ํ•„๋“œ4๋ฐฉํ–ฅ ์›๋ณธยท๊ทœ๊ฒฉ.

๋งํ†  ๋Œ€๊ธฐยท์† ์˜ฌ๋ฆผยท์ตธ์†Œ ๊ณต๊ฒฉ์˜ ์ตœ์‹  ์ƒ์„ฑ ์›๋ณธ, ์‹ค์ œ ํ”„๋กฌํ”„ํŠธ, ํ”„๋ ˆ์ž„ ์‹œ๊ฐ„, ๊ณตํ†ต ํ”ผ๋ฒ—๊ณผ ํฌ๊ธฐ ๋น„๊ต๋Š” cape301 ์ž์‚ฐ ๊ณ„์•ฝ์„ ๋”ฐ๋ฅธ๋‹ค. ํ˜„์žฌ160px์…€ยทํ”ผ๋ฒ—72,152ยท๊ท ๋“ฑ ๋ฐฐ์œจ0.714๋กœ ๋Œ€๊ธฐ ํ‚ค99.96px๋‹ค. ํŒŒ์ด๋„์˜ ์ถ”๊ฐ€6ํ”„๋ ˆ์ž„ ๋งํ†  ํœ˜๋‘๋ฅด๊ธฐ๋Š” finale304 ๊ณ„์•ฝ์„ ๋”ฐ๋ฅธ๋‹ค. ๋ชธ ํฌ๊ธฐ๋Š” ์œ ์ง€ํ•˜๋ฉฐ ๋„“์€ ๋งํ† ๋งŒ ์ˆ˜์šฉํ•˜๋„๋ก224ร—192์…€ยทํ”ผ๋ฒ—136,180์„ ์“ด๋‹ค. ์žฅ๋ฉด๋ณ„ ์—ฐ๊ฒฐ๊ณผ ์ตœ์‹  ํ”Œ๋ ˆ์ด ๊ทœ์น™์€ DESIGN, ์ตœ์ข… ๊ฒ€์ˆ˜ยท๋ฉ”์ธยท๋ฐฐํฌ ์—ฌ๋ถ€๋Š” STATE์—์„œ ๊ตฌ๋ถ„ํ•œ๋‹ค.

์ž‘์—… ๊ทœ์œจ (๊ฐœ๋ฐœ์žยท์—์ด์ „ํŠธ ๊ณตํ†ต)

  • JS ์ˆ˜์ •์€ tools/dev/patch.py src/a.js <<'PY' โ€ฆ PY โ€” ์ž„์‹œ ์‚ฌ๋ณธ์— ์ ์šฉํ•ด node --check ๋ฅผ ํ†ต๊ณผํ•œ ๊ฒƒ๋งŒ ์›๋ณธ์œผ๋กœ ์˜ฎ๊ธด๋‹ค(์„œ๋ฒ„๊ฐ€ ์ž‘์—… ํŠธ๋ฆฌ๋ฅผ ์„œ๋น™ํ•˜๋ฏ€๋กœ ๊นจ์ง„ ์ค‘๊ฐ„ ์ƒํƒœ ๊ธˆ์ง€).
  • ํ•œ ์ค„ ๋ฌธ์žฅ ๋ // ์ฃผ์„ ๊ธˆ์ง€. ์ปท์‹  ์ขŒํ‘œ๋Š” rel: ๊ธฐ์ค€. ์ปค๋ฐ‹ ์ „ tools/dev/check.sh.
์กฐ์ž‘ ํ‚ค
์ด๋™ ๋ฐฉํ–ฅํ‚ค / WASD (๊ฒŒ์ž„ํŒจ๋“œ D-pad/์Šคํ‹ฑ)
ํ™•์ธ ยท ๋ง ๊ฑธ๊ธฐ ยท ๋Œ€์‚ฌ ๋„˜๊ธฐ๊ธฐ C (Enter/Z, ํŒจ๋“œ A)
์ทจ์†Œ ยท ๋Œ€์‚ฌ ์ฆ‰์‹œ ํ‘œ์‹œ ยท ๋‹ฌ๋ฆฌ๊ธฐ(ํ™€๋“œ) X (Esc/Shift, ํŒจ๋“œ B)
๋ฉ”๋‰ด V (Tab)
๋””๋ฒ„๊ทธ(ํžˆํŠธ๋ฐ•์Šค/ํ”Œ๋ž˜๊ทธ) F1

๊ตฌ์กฐ

index.html            ์บ”๋ฒ„์Šค (์˜ค๋””์˜ค๋Š” ์ฒซ ํ‚ค ์ž…๋ ฅ์—์„œ ์–ธ๋ฝ)
src/ui/title.js       ํƒ€์ดํ‹€ ํ™”๋ฉด: ๋ธ”๋ก ๋กœ๊ณ  "subtArune"(GLYPHS), C๋กœ ์‹œ์ž‘
src/main.js           Game: ์ƒํƒœ(field/dialogue/menu), ๋งต ์ „ํ™˜ ํŽ˜์ด๋“œ, ๋ฉ”๋‰ด, ๋ฃจํ”„
src/core/input.js     ํ‚ค๋ณด๋“œ+๊ฒŒ์ž„ํŒจ๋“œ โ†’ ์•ก์…˜(up/down/left/right/confirm/cancel/menu)
src/core/audio.js     mp3 ๋ธŒ๊ธˆ/ํšจ๊ณผ์Œ/๋ชฉ์†Œ๋ฆฌ ๋กœ๋”(preloadBgmยทplayBgmยทsfxยทblip) + WebAudio ํ•ฉ์„ฑ ํด๋ฐฑ
src/core/gfx.js       ๋ฌธ์ž์—ด ๋„ํŠธ์•„ํŠธ โ†’ ์บ”๋ฒ„์Šค, ๋ฐ•์Šค/ํ•˜ํŠธ, PNG ์˜ค๋ฒ„๋ผ์ด๋“œ ๋กœ๋”
src/ui/cutscene.js    ์ปท์‹  ๋ช…๋ น(move/face/camera/fade/shake/spawn/map/parallel) โ†’ /cutscene ์Šคํ‚ฌ ์ฐธ๊ณ 
src/data/cutscenes/   ์ปท์‹  ๋ฐ์ดํ„ฐ (opening.js โ€ฆ teal5_river.js, _template.js)
src/battle/           ํ„ด์ œ ์ „ํˆฌ(battle.js ์ƒํƒœ ๊ธฐ๊ณ„, bullets.js ํƒ„๋ง‰), ์  ๋ฐ์ดํ„ฐ src/data/enemies.js, ์•„์ดํ…œ src/data/items.js
src/core/story.js     ์Šคํ† ๋ฆฌ ๋‹จ๊ณ„ยทQA ์ง€์  / src/core/party.js ํŒŒํ‹ฐ ์ •๊ทœํ™”(๊ฑท๋Š” ์ˆœ์„œ ํ˜•์„ญโ†’๊ฒฝ์„ญโ†’๋น ๋งจ)
tools/maps/*.py       ๋งต ์ƒ์„ฑ๊ธฐ โ†’ assets/maps/*.json (--check ๋กœ ๋™๊ธฐํ™” ๊ฒ€์‚ฌ)  ยท  tools/art/*_set.py ํƒ€์ผยท์†Œํ’ˆ ํŽ˜์ธํ„ฐ
tools/dev/            patch.py(์•ˆ์ „ ํŒจ์น˜) ยท check.sh(ํ•œ ๋ฒˆ์— ๊ฒ€์‚ฌ)
src/ui/dialogue.js    TextBox(ํƒ€์ž๊ธฐยทํƒœ๊ทธยทํŽ˜์ด์ง€ยท์ดˆ์ƒํ™”ยท์„ ํƒ์ง€) + ScriptRunner(๋ผ๋ฒจ/๋ถ„๊ธฐ/ํ”Œ๋ž˜๊ทธ)
src/world/tiles.js    ํƒ€์ผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (registerTile)
src/world/world.js    TileMap / Camera / Entity ์ข…๋ฅ˜ (registerEntity)
src/data/art.js       ๋„ํŠธ ์•„ํŠธ ์›๋ณธ + ํŒ”๋ ˆํŠธ (์—ฌ๊ธธ ๊ณ ์น˜๋ฉด ๊ทธ๋ฆผ์ด ๋ฐ”๋€œ)
src/data/maps.js      ์ฝ”๋“œ ๋งต(๋ฐฉยท๊ฑฐ์‹ค ์ด๋ฏธ์ง€ ๋งต). ์ง„์ž…ํ•  ๋งต์˜ assets/maps/*.json ๊ณผ ํ•„์š”ํ•œ ๊ทธ๋ฆผ์„ ์ค€๋น„ํ•œ ๋’ค ๊ต์ฒดํ•œ๋‹ค
src/data/scripts.js   ๋Œ€์‚ฌ ์Šคํฌ๋ฆฝํŠธ (ํ•œ๊ธ€)
src/data/locale/ko.js ์‹œ์Šคํ…œ UI ๋ฌธ์ž์—ด
assets/               PNG๋ฅผ ๋„ฃ์œผ๋ฉด ์ž๋™ ๊ต์ฒด (์•„๋ž˜ ๊ทœ๊ฒฉ)
design/gdd/           ๊ธฐํš ๋ฌธ์„œ   ยท  .claude/  ๊ฒŒ์ž„ ์ŠคํŠœ๋””์˜ค ์—์ด์ „ํŠธ(49) + ์Šคํ‚ฌ
tests/unit            node:test โ€” ๋งต ๊ฐ์‚ฌยท์†Œํ’ˆ ํ‚คยท์ปท์‹ โ†”๋งต ์ •ํ•ฉยท์•„์ดํ…œยท์  ๋ฌธ๊ตฌยทํŒŒํ‹ฐยทQA ์ง€์  โ€ฆ
tests/playtest        Playwright ์‹œ๋‚˜๋ฆฌ์˜ค(run.sh ๋กœ ์‹คํ–‰) โ€” ๋งต๋งˆ๋‹ค ํ•˜๋‚˜, ์Šคํฌ๋ฆฐ์ƒท์„ ๋ˆˆ์œผ๋กœ ํ™•์ธ

์ฝ˜ํ…์ธ  ์ถ”๊ฐ€ํ•˜๋Š” ๋ฒ•

NPC ํ•˜๋‚˜ ์ถ”๊ฐ€ โ€” src/data/maps.js ์˜ entities ์— ํ•œ ์ค„:

{ type: 'npc', id: 'baker', sprite: 'merchant', ...at(5, 5), facing: 'down', wander: 16, script: 'baker' },

src/data/scripts.js ์— ๋Œ€์‚ฌ:

baker: [
  { speaker: '๋นต์ง‘ ์ฃผ์ธ', portrait: 'merchant', voice: 'low', text: '* ๊ฐ“ ๊ตฌ์šด ๋นต์ด์•ผ.{w=0.4} {c=yellow}๋จน์„๋ž˜?{/c}',
    choice: { options: [{ label: '์‘', goto: 'eat' }, { label: '์•„๋‹ˆ', goto: 'no' }], cancel: 1 } },
  { label: 'eat' }, { text: '* ๋ง›์žˆ๋‹ค.', voice: 'narrator' }, { set: { ate_bread: true } }, { end: true },
  { label: 'no' },  { text: '* ๋‹ค์Œ์— ๋จน์ž.', voice: 'narrator' },
],

๋Œ€์‚ฌ ํƒœ๊ทธ: {s=2} ๋น ๋ฅด๊ฒŒ ยท {s=0.5} ๋А๋ฆฌ๊ฒŒ ยท {/s} ๋ณต๊ท€ ยท {w=0.5} 0.5์ดˆ ๋ฉˆ์ถค ยท {c=red}โ€ฆ{/c} ์ƒ‰ ยท {shake}โ€ฆ{/shake} ยท {wave}โ€ฆ{/wave} ยท {n} ์ค„๋ฐ”๊ฟˆ ์Šคํฌ๋ฆฝํŠธ ๋…ธ๋“œ: text / choice / label / goto / if:(flags)=>bool, goto / set:{} / action:(game)=>{} / end ํ™”์ž ์Œ์ƒ‰: src/core/audio.js VOICES ์— ํ”„๋ฆฌ์…‹ ์ถ”๊ฐ€ (freq/wave/dur/jitter)

์ƒˆ ๋งต: ์ด๋ฏธ์ง€ ๋งต MAPS.xxx = { image:'assets/maps/xxx.png', walkable:[[x,y,w,h]], solids:[[...]], spawns:{}, entities:[] } ๋˜๋Š” ํƒ€์ผ ๋งต { rows:[...] } ์ƒˆ ํƒ€์ผ: registerTile('X', { name, solid, art | draw }) ์ƒˆ ์—”ํ‹ฐํ‹ฐ ์ข…๋ฅ˜: class Foo extends Entity + registerEntity('foo', Foo)

๊ทธ๋ฆผ ๊ต์ฒด (๊ทธ๋Œ€๋กœ ๋ฎ์–ด์“ฐ๊ธฐ)

ํŒŒ์ผ ๊ทœ๊ฒฉ
assets/sprites/<id>.png (์ฃผ์ธ๊ณต hyungsub, NPC๋Š” sprite: ์ด๋ฆ„) 4์—ด ๊ฑท๊ธฐ ํ”„๋ ˆ์ž„ ร— 4ํ–‰ [down, up, left, right]. ์…€ ํฌ๊ธฐ๋Š” PNG ํญ/4 ร— ๋†’์ด/4, ๊ฒŒ์ž„์šฉ 2x ํ•ด์ƒ๋„์ด๋ฉฐ ์บ๋ฆญํ„ฐ๋งˆ๋‹ค ๋‹ค๋ฆ„
assets/tiles/<ํƒ€์ผ name>.png 16ร—16 (grass, wall, tree, doorโ€ฆ)
assets/portraits/<์ด๋ฆ„>.png ์ƒ์„ฑ ํŒŒ์ผ 96ร—96, ๊ฒŒ์ž„ ๋Œ€ํ™”์ฐฝ์—์„œ 48ร—48๋กœ ํ‘œ์‹œ

ํŒŒ์ผ์ด ์—†์œผ๋ฉด src/data/art.js ์˜ ๋ฌธ์ž ๋„ํŠธ์•„ํŠธ๋ฅผ ์”€ (์ฝ˜์†”์˜ 404๋Š” ์ด ํƒ์ƒ‰ ๋•Œ๋ฌธ โ€” ์ •์ƒ).

์ปท์‹  ๋งŒ๋“ค๊ธฐ

/cutscene <์ด๋ฆ„> <ํ•œ ์ค„ ์„ค๋ช…> ์Šคํ‚ฌ์„ ์“ฐ๊ฑฐ๋‚˜, src/data/cutscenes/_template.js ๋ณต์‚ฌ โ†’ scripts.js ๋“ฑ๋ก โ†’ ๋งต์— ํŠธ๋ฆฌ๊ฑฐ. ๊ฒ€์€ ํ™”๋ฉด ๋‚˜๋ ˆ์ด์…˜์€ { style:'narration', voice:'none', speed:0.6, text:'...' }. ๋…ธ๋“œ ์ „์ฒด ๋ชฉ๋ก์€ .claude/skills/cutscene/SKILL.md. ์žฌ์ƒ ํ™•์ธ: node tests/playtest/cutscene.mjs <์ด๋ฆ„>

ํ…Œ์ŠคํŠธ๋ฃธ

http://localhost:8000/?map=test (๋˜๋Š” ํƒ€์ดํ‹€์—์„œ T). ์•ˆ๋‚ด/ํ…์ŠคํŠธ ํšจ๊ณผ/์„ ํƒ์ง€/ํ”Œ๋ ˆ์ด์–ด ์Šคํ”„๋ผ์ดํŠธ ๊ต์ฒด/์ „ํˆฌ ๋ชจ์…˜ ํŒป๋ง, ์ƒ์ž, ํ˜•์„ญยท๊ฒฝ์„ญยท๋น ๋งจ NPC, ๋Ÿฌ๊ทธ ๋ฐŸ์œผ๋ฉด ์ปท์‹  ๋ฐ๋ชจ. ?map=<๋งต>&spawn=<์Šคํฐ>&sprite=<์บ๋ฆญํ„ฐ> ๋กœ ํƒ€์ดํ‹€ยท์˜คํ”„๋‹ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ฐ”๋กœ ์ง„์ž….

์ฒญ๋ก์ˆฒ ๋ชฉ์กฐ ๋™์ƒ

์ฒญ๋ก์ˆฒ2(?qa=teal2)๋Š” ์ฅฐํฌ๋ฅผ ๋‹ฎ์€ ๋ชฉ์กฐ ๋™์ƒ 6์ข…์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ธฐ์กด ๋™์ƒ 13๊ฐœ์˜ ์œ„์น˜ยท์ถฉ๋Œยท๋Œ€์‚ฌ๋Š” ์œ ์ง€ํ•˜๊ณ  ํฌ์ฆˆ๋งŒ ๋‚˜๋ˆ  ๋ฐฐ์น˜ํ–ˆ๋‹ค. ๋™์ƒ ์•„ํŠธ๋Š” assets/props/statue_junhee_<pose>.png์ด๋ฉฐ, ๋งต ๋ฐฐ์น˜๋Š” tools/maps/teal.py --check๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „ํˆฌ ๋ชจ์…˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

์ „ํˆฌ ์‹œ์Šคํ…œ์— ๋ ˆ๋“œ/๋ธ”๋ฃจ ๋ฏธ๋‹ˆ์–ธ์ด๋‚˜ ์—ด๋ฆฐ ๋ฌด๊ธฐ ์ƒ์ž ์ด๋ฏธ์ง€๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ๋Š” ์ „ํˆฌ ์—์…‹ ์ „๋‹ฌ ๊ฐ€์ด๋“œ๋ฅผ ๋จผ์ € ํ™•์ธํ•œ๋‹ค. ๋‹จ์ผ ํ”„๋ ˆ์ž„ PNGยท๋ฐฉํ–ฅยทpivot๊ณผ ๊ธฐ์กด 4ร—4 ํ•„๋“œ ์‹œํŠธ์˜ ์ฐจ์ด๋ฅผ ์ •๋ฆฌํ–ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ „๋‹ฌ์šฉ์ด๋ฉฐ ๋Ÿฐํƒ€์ž„ ์ž๋™ ์ ์šฉ์€ ์•„๋‹ˆ๋‹ค.

http://localhost:8000/?map=test&battle=1 ๋˜๋Š” ํ…Œ์ŠคํŠธ๋ฃธ์˜ ์ „ํˆฌ ๋ชจ์…˜ ํŒป๋ง์—์„œ ์—ฐ๋‹ค. ์ขŒ์šฐ๋กœ ์บ๋ฆญํ„ฐ ์„ ํƒ, C๋กœ ๋ฌด๊ธฐ๋ฅผ ๋“ค๊ณ  ๊ณต๊ฒฉ ์ง€์ ๊นŒ์ง€ ๋‹ฌ๋ฆฌ๊ธฐ โ†’ ๊ณต๊ฒฉ โ†’ ์›์œ„์น˜ ๋ณต๊ท€, X๋กœ ์›๋ž˜ ํ•„๋“œ ๋ณต๊ท€, Esc๋กœ ํƒ€์ดํ‹€ ์ด๋™. ๋™์ž‘ ์ค‘์—๋Š” ์บ๋ฆญํ„ฐ ์„ ํƒ๊ณผ ์ถ”๊ฐ€ ๊ณต๊ฒฉ์„ ์ž ๊ทธ๋ฉฐ, ์ทจ์†Œํ•˜๋ฉด ๋ชจ๋‘ ์›์œ„์น˜๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ๊ฒŒ์ž„ํŒจ๋“œ๋„ ๊ธฐ์กด ์„ ํƒ/ํ™•์ธ/์ทจ์†Œ ์•ก์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

ํ˜•์„ญ์€ ์นผ(๋ชจ๋“  ํ”„๋ ˆ์ž„ ์ž… ์—†์Œ), ๊ฒฝ์„ญ์€ ์–‘์†๋„๋ผ, ๋น ๋งจ์€ ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ๋‹ฌ๋ฆฐ ํ•œ์† ๋งˆ๋ฒ•๋ด‰์„ ์‚ฌ์šฉํ•œ๋‹ค. ์บ๋ฆญํ„ฐ๋งˆ๋‹ค ๋Œ€๊ธฐ 4์žฅ๊ณผ ๊ณต๊ฒฉ 4์žฅ์ด ์žˆ์œผ๋ฉฐ, ๊ณต๊ฒฉ ์ค‘ ์žฌ์ž…๋ ฅ์€ ๋ฌด์‹œํ•˜๊ณ  ํ•œ ๋ฒˆ ์žฌ์ƒํ•œ ๋’ค ๋Œ€๊ธฐ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

์›๋ณธ๊ณผ ์ƒ์„ฑ ํ”„๋กฌํ”„ํŠธ๋Š” assets/battle/, ํ”„๋ ˆ์ž„ ์˜์—ญยท๋ฐœ ๊ธฐ์ค€์ ยท์†๋„๋Š” src/data/battle-sprites.js, ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์žฌ์ƒ์€ src/ui/battle-preview.js์— ์žˆ๋‹ค. ๋งˆ์  ํƒ€ RGB ์›๋ณธ์€ ๋ณด์กดํ•˜๊ณ , ๊ธฐ๋ณธ ์„ธ ์บ๋ฆญํ„ฐ๋Š” ๋™์ผ ํ”ฝ์…€์˜ ํˆฌ๋ช… ๋Ÿฐํƒ€์ž„ ์•„ํ‹€๋ผ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค(assets/battle/RUNTIME.md). ์ „์ฒด ์‹œํŠธ๋ฅผ ๊ท ๋“ฑ ๋ถ„ํ• ํ•˜๋ฉด ๋ฌด๊ธฐ๊ฐ€ ์ž˜๋ฆฌ๋ฏ€๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

ํ˜„์žฌ๋Š” ์—”์ง„ ์•ˆ์˜ ๋ชจ์…˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ด๋ฉฐ ์‹ค์ œ ์ „ํˆฌ ์‹œ์Šคํ…œ์€ ์•„๋‹ˆ๋‹ค. ์ ยทHPยทํ„ดยทํ”ผํ•ด ํŒ์ •ยท์Šคํ† ๋ฆฌ ์ „ํˆฌ ์ง„์ž…์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ธฐ์กด ์ด๋™ ์Šคํ”„๋ผ์ดํŠธ์™€ ์„ธ์ด๋ธŒ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒ์„ฑ์€ ์‚ฌ์šฉ์ž ์Šน์ธ์— ๋”ฐ๋ฅธ ๋‚ด์žฅ ์ด๋ฏธ์ง€ ๋„๊ตฌ์ด๋ฉฐ ํŠน์ • GPT Image 2.5 ๋ชจ๋ธ๋กœ ๊ณ ์ •ํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋‹ˆ๋‹ค.

๊ฒ€์ฆ: node --test tests/unit/battle-preview.test.mjs, BASE_URL=http://localhost:8000 node tests/playtest/battle-preview.mjs (๊ธฐ์กด Playwright ์‹คํ–‰ ํ™˜๊ฒฝ ํ•„์š”).

์บ๋ฆญํ„ฐ ์‹œํŠธ ๋ณ€ํ™˜

AI ์ƒ์„ฑ ์‹œํŠธ(๋ณด๋ผ ๋ฐฐ๊ฒฝ, ์บ๋ฆญํ„ฐ๋‹น 4์—ด ร— 4ํ–‰[์ •๋ฉด/์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ/๋’ท๋ชจ์Šต]) โ†’ ๊ฒŒ์ž„ ์‹œํŠธ + ์ดˆ์ƒํ™”:

pip install pillow numpy
python3 tools/sprites/slice_sheet.py sheet.png hyungsub gyeongsub ppaman   # โ†’ assets/sprites/*.png, assets/portraits/*.png

์ƒˆ ์บ๋ฆญํ„ฐ๋Š” src/data/characters.js ์— ํ•œ ์ค„ ์ถ”๊ฐ€. ํฐํŠธ๋Š” src/ui/font.js FONT_PRESET ํ•œ ์ค„ (๊ธฐ๋ณธ ๋„ค์˜ค๋‘ฅ๊ทผ๋ชจ). ๊ธฐ์กด ํฐํŠธ ํŒŒ์ผ์€ assets/fonts/์—์„œ ์ž์ฒด ์ œ๊ณตํ•˜๋ฉฐ ์™ธ๋ถ€ CDN์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ์ถœ์ฒ˜ยท๋ฐฐํฌ ๋ผ์ด์„ ์Šค๋Š” assets/source/fonts253/์— ์žˆ๋‹ค. ์‚ฌ์šด๋“œ ํŒŒ์ผ์€ assets/audio/sfx/<์ด๋ฆ„>.mp3 ๋ฅผ ๋„ฃ์œผ๋ฉด ํ•ฉ์„ฑ์Œ ๋Œ€์‹  ์žฌ์ƒ (design/audio/references.md).

ํ…Œ์ŠคํŠธ

node --test 'tests/unit/*.test.mjs'                                 # ๋Œ€์‚ฌ ํŒŒ์„œ/๋ ˆ์ด์•„์›ƒ/์ถฉ๋Œ
node tests/playtest/smoke.mjs                            # ํ—ค๋“œ๋ฆฌ์Šค ์ž๋™ ํ”Œ๋ ˆ์ด + ์Šคํฌ๋ฆฐ์ƒท (์„œ๋ฒ„ 8765 ํ•„์š”)

์ŠคํŠœ๋””์˜ค ์›Œํฌํ”Œ๋กœ์šฐ (.claude)

claude-code-game-studios ํ…œํ”Œ๋ฆฟ์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค. ์—”์ง„์€ "์ž์ฒด Canvas 2D / JS" ๋กœ ์„ค์ •๋จ (CLAUDE.md, .claude/docs/technical-preferences.md). /brainstorm โ†’ /design-system โ†’ /create-stories โ†’ /dev-story โ†’ /code-review ์ˆœ์œผ๋กœ ์“ฐ๋ฉด ๋œ๋‹ค.

์ฝ”๋“œ ๊ด€๋ฆฌ ๊ทœ์น™

  • ๋ธŒ๋žœ์น˜: main ์€ ํ•ญ์ƒ ์‹คํ–‰ ๊ฐ€๋Šฅ. ๊ธฐ๋Šฅ์€ feat/<์ด๋ฆ„>, ์ปท์‹ ์€ scene/<์ด๋ฆ„> ๋ธŒ๋žœ์น˜ โ†’ ์Šค๋ชจํฌ ํ†ต๊ณผ ํ›„ main.
  • ์ปค๋ฐ‹: type(scope): ์š”์•ฝ โ€” feat(dialogue), fix(world), art(sprites), scene(opening), docs, test. ํ•œ ์ปค๋ฐ‹ = ํ•œ ์˜๋„.
  • ์–ด๋””์— ๋ญ˜ ์“ฐ๋‚˜: ์—”์ง„ ๋กœ์ง src/core|world|ui ยท ์ฝ˜ํ…์ธ (๋งต/๋Œ€์‚ฌ/์ปท์‹ /์บ๋ฆญํ„ฐ) src/data ยท ๊ทธ๋ฆผ/์†Œ๋ฆฌ assets ยท ๊ธฐํš design ยท ์Šคํ‚ฌ .claude/skills
  • ์ฝ˜ํ…์ธ  ์ถ”๊ฐ€๋Š” ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด: ์บ๋ฆญํ„ฐ=์‹œํŠธ ๋ณ€ํ™˜+characters.js ํ•œ ์ค„, ์ปท์‹ =cutscenes/*.js, ์‚ฌ์šด๋“œ=assets/audio/sfx/<name>.mp3
  • ์ปค๋ฐ‹ ์ „ ์ฒดํฌ: node --test 'tests/unit/*.test.mjs' + node tests/playtest/smoke.mjs ํ†ต๊ณผ, ์ฝ˜์†” warn 0
  • ์ƒ์„ฑ๋ฌผ(assets/sprites, assets/portraits)์€ ์ปค๋ฐ‹ํ•œ๋‹ค. ์›๋ณธ AI ์‹œํŠธ๋Š” assets/source/ ์— ๋‘๊ณ  ๋„๊ตฌ๋กœ ์žฌ์ƒ์„ฑ.

์บ๋ฆญํ„ฐ ์‹œํŠธ ์žฌ์ถ”์ถœ

ํ˜„์žฌ ํ˜•์„ญยท๊ฒฝ์„ญยท๋น ๋งจ์˜ ๊ฑท๊ธฐ ์ด๋ฏธ์ง€๋Š” 2026-09-10 ์žฌ์ƒ์„ฑํ•œ walk-v3๋‹ค. ๊ฐ 4๋ฐฉํ–ฅร—4์—ด ์›๋ณธ๊ณผ ํ”„๋กฌํ”„ํŠธ, ํ”„๋ ˆ์ž„ ํฌ๊ธฐ ๋ฐ ์—ฐ๊ฒฐ ๋†’์ด๋Š” assets/source/walk-v3/manifest.json์„ ๋”ฐ๋ฅธ๋‹ค. ํ˜„์žฌ ๋ฒ„์ „์„ ์žฌ์ถ”์ถœํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค. --sprites-only๋Š” ๊ธฐ์กด ๋Œ€ํ™”์ฐฝ ์ดˆ์ƒํ™”๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค.

๊ฒฝ์„ญ์€ ๊ธฐ๋ณธ ์ด๋™ ์ •๋ฉด 4ํ”„๋ ˆ์ž„์˜ ๋ˆˆ๋งค๋ฅผ ํŽธ์•ˆํ•˜๊ฒŒ ์™„ํ™”ํ–ˆ๋‹ค. ์ƒ์„ฑ ์ˆ˜์ •์•ˆ์˜ ๋ˆˆ ์ฃผ๋ณ€๋งŒ ๊ธฐ์กด ์›๋ณธ์— ๋ฐ˜์˜ํ–ˆ์œผ๋ฉฐ, ์˜†ยท๋’ท๋ชจ์Šต๊ณผ ๊ฑท๋Š” ์ž์„ธยท์ดˆ์ƒํ™”ยท์ „ํˆฌ ์ด๋ฏธ์ง€๋Š” ์œ ์ง€ํ•œ๋‹ค.

uv run --with pillow --with numpy -- python tools/sprites/slice_sheet.py --sprites-only assets/source/walk-v3/hyungsub.png hyungsub
uv run --with pillow --with numpy -- python tools/sprites/slice_sheet.py --sprites-only assets/source/walk-v3/gyeongsub.png gyeongsub
uv run --with pillow --with numpy -- python tools/sprites/slice_sheet.py --sprites-only assets/source/walk-v3/ppaman.png ppaman

์„ธ ์บ๋ฆญํ„ฐ ๋ชจ๋‘ ์ƒˆ ์ค‘๋ฆฝ ์ƒ์ฒด์— ์ƒˆ ์›๋ณธ ํ•˜์ฒด A/B๋ฅผ ๋ถ™์—ฌ ๊ธฐ๋ณธโ†’๋ฐœ Aโ†’๊ธฐ๋ณธโ†’๋ฐœ B๋กœ ๊ฑท๋Š”๋‹ค. characters.js sideWalk์˜ ์—ฐ๊ฒฐ ๋†’์ด๋Š” ํ˜•์„ญ/๊ฒฝ์„ญ 76px, ๋น ๋งจ 82px๋‹ค. ์ฅฐํฌ์˜ ๊ธฐ์กด ๋ฐœ ์œ„์น˜ ์ด๋™ ๋ฐฉ์‹์€ ์œ ์ง€ํ•œ๋‹ค. ์ด์ „ ์›๋ณธ๊ณผ ์ดˆ์ƒํ™”๋Š” ๋ณด์กดํ–ˆ์œผ๋ฉฐ, ์•„๋ž˜์˜ 3์ธ ํ†ตํ•ฉ ์‹œํŠธ ๋ช…๋ นยทํ”ฝ์…€ ์ˆ˜์ • ๊ธฐ๋ก์€ ๊ณผ๊ฑฐ ๋ฒ„์ „ ๋ณต์›์šฉ์ด๋‹ค. ๊ทธ ๋ช…๋ น์œผ๋กœ ํ˜„์žฌ v3๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค.

์›๋ณธ 3์ธ ์‹œํŠธ์˜ ์™ผ์ชฝโ†’์˜ค๋ฅธ์ชฝ์€ **ํ˜•์„ญ(hyungsub) ยท ๊ฒฝ์„ญ(gyeongsub) ยท ๋น ๋งจ(ppaman)**์ด๋‹ค. ๋ถ„ํ™ ๋ผ์ง€๋Š” ๊ฒŒ์ž„์—์„œ **์ฅฐํฌ(junhee)**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์›๋ณธ ํ–‰ ์ˆœ์„œ(์ •๋ฉด/์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ/๋’ค)๋Š” ๋ณ€ํ™˜๊ธฐ๊ฐ€ ์—”์ง„ ์ˆœ์„œ(์ •๋ฉด/๋’ค/์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ)๋กœ ์žฌ๋ฐฐ์—ดํ•œ๋‹ค. ์™„์„ฑ PNG๋ฅผ ๋‹ค์‹œ ๋ณ€ํ™˜๊ธฐ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.

python3 tools/sprites/slice_sheet.py assets/source/sheet_hyungsub_gyeongsub_ppaman.png hyungsub gyeongsub ppaman
python3 tools/sprites/slice_sheet.py assets/source/sheet_junhee.png junhee
uv run --with pillow --with numpy --with pytest pytest tests/sprites -q
node tests/playtest/sprites.mjs  # ์„œ๋ฒ„ 8765, playwright-core ํ•„์š”. SHOT_DIR๋กœ ์บก์ฒ˜ ์œ„์น˜ ์ง€์ •

๋ฐฐ๊ฒฝ์€ ์…€ ๊ฐ€์žฅ์ž๋ฆฌ์— ์—ฐ๊ฒฐ๋œ ๋ฐฐ๊ฒฝ์ƒ‰๋งŒ ํˆฌ๋ช…ํ™”ํ•œ๋‹ค. ์™ธ๊ณฝ์„  ์นจ์‹ยท์ƒ‰ ํ‰๊ท ยทํŒ”๋ ˆํŠธ ์–‘์žํ™”๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์›๋ณธ ํŒŒ์ผ์€ ๋ณด์กดํ•˜๊ณ , ๊ธฐ์กด ์—”์ง„์šฉ ํฌ๊ธฐ ๋ณ€ํ™˜์—๋Š” ์ตœ๊ทผ์ ‘ ํ”ฝ์…€๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ์ดˆ์ƒํ™”๋„ ๊ฐ™์€ ์ •๋ฉด ํ”„๋ ˆ์ž„์—์„œ ์ถ”์ถœํ•œ๋‹ค. ํ˜•์„ญ์˜ ์ธํŠธ๋กœ ๋Œ€์‚ฌ๋Š” HS()๋กœ ์ด๋ฆ„ยท์ดˆ์ƒํ™”ยท๋ชฉ์†Œ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ณด๋ผ๋งต ์ดํ›„์—๋Š” ๋‚˜๋ ˆ์ด์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค(docs/STATE.md ์ฐธ์กฐ).

๊ฑท๊ธฐ ํ”„๋ ˆ์ž„์€ ๊ฐ™์€ ๋ฐฉํ–ฅ์˜ 4์žฅ์„ ๊ณตํ†ต ์˜์—ญ์œผ๋กœ ์ž๋ฅด๊ณ  ๊ฐ™์€ ์ถ•์†Œ ๊ฒฉ์ž์— ์ •๋ ฌํ•œ๋‹ค. ํ•œ ์žฅ์”ฉ ๋ชธ์— ๋”ฑ ๋งž์ถฐ ์ž๋ฅธ ๋’ค ๋ฐœ์„ ๋ฐ”๋‹ฅ์— ๋ถ™์ด๋ฉด, ๋“ค๋ฆฐ ๋ฐœ ๋•Œ๋ฌธ์— ๋จธ๋ฆฌ๊นŒ์ง€ ์œ„์•„๋ž˜๋กœ ํ”๋“ค๋ฆฐ๋‹ค. ์…€ ํ…Œ๋‘๋ฆฌ๋ฅผ ์ผ๊ด„ ์‚ญ์ œํ•˜๋Š” ์ฒ˜๋ฆฌ๋„ ์‹ ๋ฐœ์„ ์ž๋ฅด๋ฏ€๋กœ ๊ธˆ์ง€ํ•œ๋‹ค.

์˜†๊ฑท๊ธฐ๋Š” ๊ธฐ๋ณธ ์ž์„ธยทํ•œ์ชฝ ๋ฐœ ์•ž์œผ๋กœยท๋ฐ˜๋Œ€์ชฝ ๋ฐœ ์•ž์œผ๋กœ, ์ด 3ํฌ์ฆˆ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ๊ธฐ๋ณธ โ†’ ๋ฐœ A โ†’ ๊ธฐ๋ณธ โ†’ ๋ฐœ B์˜ 4๋ฐ•์ž๋กœ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋ฉˆ์ถ”๋ฉด ๊ธฐ๋ณธ ์ž์„ธ๋กœ ๋Œ์•„๊ฐ„๋‹ค. ํ˜•์„ญ์€ ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ณดํ–‰์„ ์œ„ํ•ด ์ค‘๋ฆฝ ์ƒ์ฒด์— ์›๋ณธ ํ•˜์ฒด A/B๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. ๋‹ค๋ฅธ PNG ์บ๋ฆญํ„ฐ๋Š” ๊ฐ ์˜†๋ฐฉํ–ฅ ์ฒซ ํ”„๋ ˆ์ž„์˜ ์ƒ์ฒด๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ๋ฐœ ์˜์—ญ๋งŒ ์ •์ˆ˜ ํ”ฝ์…€๋กœ ์ด๋™ํ•œ๋‹ค. src/data/characters.js์˜ sideWalk๊ฐ€ ์›๋ณธ ํ•˜์ฒด ํ”„๋ ˆ์ž„ยท์—ฐ๊ฒฐ ๋†’์ด ๋˜๋Š” ๋ฐœ ์˜์—ญยท๋ณดํญ์„ ์ง€์ •ํ•œ๋‹ค. ์ตœ์ดˆ ๋กœ๋“œ ์‹œ Canvas์— ๊ตฌ์›Œ ๋‘๋ฉฐ, ๋Œ€์ฒด ๋ฌธ์ž ๋„ํŠธ ์บ๋ฆญํ„ฐ๋„ ๊ธฐ์กด TORSO + 3์ข… LEGS ์กฐํ•ฉ์œผ๋กœ ๊ฐ™์€ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

์ด ๊ทœ์น™์€ ํ˜•์„ญยท๊ฒฝ์„ญยท๋น ๋งจยท์ฅฐํฌ์™€ ๋Œ€์ฒด ์บ๋ฆญํ„ฐ ๋ชจ๋‘์— ์ ์šฉํ•œ๋‹ค. ์›๋ณธ ๋ฐ ๊ฒŒ์ž„์šฉ PNG ์ž์ฒด๋Š” ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉฐ ์ •๋ฉด/๋’ท๋ฉด์˜ ๊ธฐ์กด 4ํ”„๋ ˆ์ž„๋„ ๊ทธ๋Œ€๋กœ๋‹ค. PNG๋งŒ ๋‹ค๋ฅธ ๋„๊ตฌ์— ๋„˜๊ธฐ๋ฉด ์ด ๋Ÿฐํƒ€์ž„ ์กฐํ•ฉ์€ ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ sideWalk ์„ค์ •๊ณผ ๊ฒŒ์ž„ ๋กœ๋”๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•œ๋‹ค. ์ด์ „ ํ˜•์„ญ ์ „์šฉ walkFrameOrder ์„ค์ •์€ ์ด 3ํฌ์ฆˆ ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ฒดํ–ˆ๋‹ค.

ํ˜•์„ญ์€ ๋ชจ๋“  ๋ฐฉํ–ฅ์—์„œ ์ž… ์—†์ด ์ฝ”๋งŒ ๋‚จ๊ธด๋‹ค. ์›๋ณธ์˜ ๋‚จ์€ ์˜†๋ชจ์Šต ์ž…์„ ์€ ์ง์ ‘ ํ”ฝ์…€ ํŽธ์ง‘์œผ๋กœ ์ œ๊ฑฐํ–ˆ์œผ๋ฉฐ assets/source/hyungsub-mouth-retouch.json์— ๋ฒ”์œ„๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค. ๊ฒฝ์„ญ์˜ ์ž…์€ ์ œ๊ฑฐ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค.

ํ™”๋ฉด ํ‘œ์‹œ๋Š” ๋ชจ๋‹ˆํ„ฐ DPR์„ ๋ฐ˜์˜ํ•˜์—ฌ ์บ”๋ฒ„์Šค ํ”ฝ์…€์˜ ์ •์ˆ˜๋ฐฐ๋กœ ๋งž์ถ˜๋‹ค. ์ผ๋ถ€ ์ฐฝ ํฌ๊ธฐ์—์„œ๋Š” ์—ฌ๋ฐฑ์ด ๋Š˜์–ด๋‚˜๋ฉฐ, ์บ”๋ฒ„์Šค๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” ์ž‘์€ ํ™”๋ฉด์—์„œ๋Š” ์ „์ฒด ํ™”๋ฉด ๋งž์ถค ์ถ•์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์›๋ณธ PNG์™€ ์‚ฌ์šฉ์ž ์ง€์ • ์บ๋ฆญํ„ฐ ํฌ๊ธฐ 1.43๋ฐฐ๋Š” ์œ ์ง€ํ•œ๋‹ค. ์›๋ณธ ๋„ํŠธ ์ž์ฒด๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ๋‚ด๋ถ€ 1.43๋ฐฐ ๋น„์œจ์˜ ๋น„๊ท ๋“ฑ ํ”ฝ์…€๊นŒ์ง€ ์ œ๊ฑฐํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋ฒ”์œ„๋Š” DESIGN.md ์ฐธ์กฐ.

ํ›„ํšŒ์˜ ๋ฐฉ ์บ๋ฆญํ„ฐ ๊ธฐ์ค€ (BUILD315)

๋งˆ์Šคํ„ฐ์ด์„ญยท์‹ ๋“œ๋ผ์„ญยทํƒˆ๋ฆฌ์•ผ์„ญยท์•„์šฐ์†”์„ญ์€ ๊ธฐ์กด ๊ธฐ์–ต์˜ ๋ฐฉ ๊ฐ€์žฌ๋งจ ๊ณ„์—ด์˜ ๋„“์€ ๋ณผ, ํฐ ์ฝ”, ๊ฒ€์€ ์•ˆ๊ฒฝ, ๋‘ ๋ˆˆ๊ณผ ์–ด๋‘์šด ํšŒ์ฒญ์ƒ‰ ์–ผ๊ตด์„ ์œ ์ง€ํ•œ๋‹ค. ๋งˆ์Šคํ„ฐ ์ด์˜ ๋‹ค์ค‘ ๋ Œ์ฆˆ/๊ฒ€, ์‹ ๋“œ๋ผ์˜ ์™•๊ด€/์€๋น› ๋จธ๋ฆฌ, ํƒˆ๋ฆฌ์•ผ์˜ ๋ฐ”์œ„ ์ง์กฐ ์˜์ƒ/์Šค์นดํ”„, ์•„์šฐ์†”์˜ ๋ฟ”/๊ฐ๊ธด ๋ณ„๋น› ์šฉ ๋ชธ์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. ๋ณ„๋„ ์ž…์„ ์€ ์—†๋‹ค.

๊ฐ ์ „ํˆฌ ์‹œํŠธ๋Š”256ร—256,128px์…€2ร—2์ด๋ฉฐ ์ค‘๋ฆฝโ†’์ค€๋น„โ†’๊ณต๊ฒฉ/์‹œ์ „โ†’ํ”ผ๊ฒฉ ์ˆœ์„œ, ํ”ผ๋ฒ—64,120์ด๋‹ค. ํ•„๋“œ๋Š” ์ •ํ™•ํ•œ ์ค‘๋ฆฝ ์…€128px๋‹ค. ๋งˆ์Šคํ„ฐ์ด/์‹ ๋“œ๋ผ ์ค‘๋ฆฝ ํ‚ค98px, ํƒˆ๋ฆฌ์•ผ97px, ๊ฐ๊ธด ์šฉ์ธ ์•„์šฐ์†”90px๋‹ค. ์ƒ์„ฑ ์›๋ณธยท์ •ํ™•ํ•œ ํ”„๋กฌํ”„ํŠธยท๊ธฐ๊ณ„์  ํˆฌ๋ช…ํ™”/์ตœ๊ทผ์ ‘ ํฌ๊ธฐ/๊ณตํ†ต์ถ• ์žฌํ˜„์€ assets/source/regret315/<id>/์— ๋ณด์กดํ•œ๋‹ค. ๊ธฐ์กด ์ด๋ฏธ์ง€์˜ ๋‹จ์ˆœ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋‚˜ ์ฝ”๋“œ๋กœ ๊ทธ๋ฆฐ ๋ชธ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค.

ํ•„๋“œ์—๋Š” ๋งˆ์Šคํ„ฐ์ด์„ญ, ์‹ ๋“œ๋ผ์„ญ, ํƒˆ๋ฆฌ์•ผ์„ญ๋งŒ ๋ฐฐ์น˜ํ•œ๋‹ค. ํƒˆ๋ฆฌ์•ผ์„ญ์€ ์•„์šฐ์†”์„ญ๊ณผ ํ•จ๊ป˜ ๋“ฑ์žฅํ•˜๋Š” ๋Œ€ํ‘œ ์กฐ์šฐ์ด๋ฉฐ ์ด3์ „ํˆฌ, ๊ฐ๊ฐHP45๋‹ค. ์™ธํ˜• ์ œ์ž‘ ์™„๋ฃŒ์™€ ์‚ฌ์šฉ์ž์˜ ์ตœ์ข… ๋ฏธ์  ํ™•์ •์€ ๊ตฌ๋ณ„ํ•œ๋‹ค. ๊ตฌ๊ฐ„ ๊ณ„์•ฝ.

๋งต ์—๋””ํ„ฐ (๋ธํƒ€๋ฃฌ ์—์…‹์œผ๋กœ ๋งต ๊ทธ๋ฆฌ๊ธฐ)

./dev.sh            # http://localhost:8000/editor.html
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: assets/library/deltarune/sprites/ ๋ธํƒ€๋ฃฌ ์บ๋ฆญํ„ฐยท์˜ค๋ธŒ์ ํŠธ ์Šคํ”„๋ผ์ดํŠธ 1963์žฅ(ch1~4, UTDRSpriteWeb), assets/library/deltarune/maps/ ์‹ค์ œ ์ง€์—ญ ๋งต/์Šคํฌ๋ฆฐ์ƒท 34์žฅ(Hometown ์ „์ฒด ์ง€๋„, ํ•™๊ต, ํ† ๋ฆฌ์—˜ ์ง‘ 1ยท2์ธต, ํ™€๋ฆฌ๋ฐ์ด ์ €ํƒ, ๊ตํšŒ, ๋…ธ์—˜ ๋ฐฉ โ€ฆ).
  • ์ƒˆ ๋งต: "+ ์ƒˆ ๋งต" โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์—ญ ์ด๋ฏธ์ง€์—์„œ ๋“œ๋ž˜๊ทธ๋กœ ์ž˜๋ผ ๋ฐฐ๊ฒฝ์œผ๋กœ (1440ร—1080 ์Šคํฌ๋ฆฐ์ƒท์€ ๋ฐฐ์œจ 2.25๋กœ ์ž๋™ ์ถ•์†Œ โ†’ ๊ฒŒ์ž„ ์›๋ณธ ํฌ๊ธฐ).
  • ๋„๊ตฌ: ๊ฑท๋Š” ์˜์—ญ(W) / ๋ง‰ํž˜(S) / ํŠธ๋ฆฌ๊ฑฐ(T, to+spawn ๋„ฃ์œผ๋ฉด ๋ฌธ) / ์ƒํ˜ธ์ž‘์šฉ(I, ์Šคํฌ๋ฆฝํŠธ ์ด๋ฆ„) / ์Šคํฐ(P) / NPC(N) / ์†Œํ’ˆ(B, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ณ ๋ฅธ ์Šคํ”„๋ผ์ดํŠธ ๋ฐฐ์น˜, y-์ •๋ ฌยท๋ง‰ํž˜ยท์ƒํ˜ธ์ž‘์šฉ).
  • ์ €์žฅ(โŒ˜S) โ†’ assets/maps/<id>.json (+index.json). ๊ฒŒ์ž„์ด ์‹œ์ž‘ํ•  ๋•Œ JSON ๋งต์„ ์ฝ”๋“œ ๋งต๋ณด๋‹ค ์šฐ์„  ๋กœ๋“œ. โ–ถ ํ”Œ๋ ˆ์ด ๋กœ ๋ฐ”๋กœ ํ™•์ธ.
  • ๋Œ€์‚ฌ๋Š” ์—ฌ์ „ํžˆ src/data/scripts.js โ€” ์ƒํ˜ธ์ž‘์šฉ/ํŠธ๋ฆฌ๊ฑฐ์˜ script ์— ๊ทธ ํ‚ค๋ฅผ ์ ๋Š”๋‹ค.

About

The episodic role-playing video game for sub created by rlaope

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages