| 2026-03-02 |
v1.0 |
์ด๊ธฐ ๋ฒ์ ์์ฑ. ํ์ 4์ข
(ํ์ด/๋ํฌ/์ผ์/๋ฒ๊ฐ), ์ 4์ข
(์ผ๋ฐ/๋น ๋ฅธ/ํฑํฌ/๋ณด์ค), ์จ์ด๋ธ ์์คํ
, 5๋จ๊ณ ์
๊ทธ๋ ์ด๋, S์ ๊ฒฝ๋ก ๋งต |
| 2026-03-02 |
v1.0.1 |
๋ฒ๊ทธ ์์ - resize()์์ towers ๋ณ์ TDZ ์๋ฌ ํด๊ฒฐ |
| 2026-03-02 |
v1.1.0 |
ํ๋ฉด ํฌ๊ธฐ ํ๋ (800ร680 โ 1200ร900), ๋
ํ์ ์ถ๊ฐ (DOT 4์ด, 0.5์ด ๊ฐ๊ฒฉ ํฑ, ์คํ๋์ ๋
์ ํ), ํ์๋ณ ํฌ์ฌ์ฒด ์ดํํธ ์ฐจ๋ณํ (ํ์ด=์ง์ /๋ํฌ=์ฐ๊ธฐ+ํฌํ/์ผ์=ํ์ ๊ฒฐ์ /๋ฒ๊ฐ=์ ๊ธฐ์ค๊ธฐ/๋
=๋ฌผ๊ฒฐ๋ฐฉ์ธ) |
| 2026-03-02 |
v1.2.0 |
๊ฒ์ ์๋ ์กฐ์ (x1/x2/x3, Qํค ๋๋ ํด๋ฆญ), ์ ๋น์ฃผ์ผ ์ ๋ฉด ๊ฐ์ (์ผ๋ฐ=ํ์ ๋๊ธฐ+ํฑ๋ ์
/๋น ๋ฅธ=๋ ์นด๋ก์ด ๋ค์ด์+์๋์ /ํฑํฌ=์ฅ๊ฐํ+๋ชจ์๋ฆฌ ๋ฟ/๋ณด์ค=๋ฟ+์๊ด+๋ถ์ ์ค๋ผ+๋น๋๋ ๋+์ก๊ณณ๋), ๋ณด์ค ์ด๋ฒคํธ ๊ฐํ (5์จ์ด๋ธ๋ง๋ค ๋นจ๊ฐ ๊ฒฝ๊ณ ์ฐ์ถ 2.5์ด, ๋ณด์ค ๋ ๋ฒจ ์ค์ผ์ผ๋ง HP 8โ10โ12๋ฐฐ, ํธ์๋ณ ๋๋ฐ ์ถํ, ๋ณด์ ์ฆ๊ฐ) |
| 2026-03-02 |
v1.3.0 |
๋ชจ๋ฐ์ผ ๋ฐ์ํ ๊ฐ์ โ ๋ด๋ถ ์บ๋ฒ์ค ํด์๋์ CSS ํ์ ํฌ๊ธฐ ๋ถ๋ฆฌ (TILE ์ต์ 36 ๋ณด์ฅ, cssScale๋ก ์ถ์), isMobile ํ๋๊ทธ ๊ธฐ๋ฐ ์กฐ๊ฑด๋ถ UI (ํค๋ณด๋ ํํธ ์จ๊น, ํฐ์น ์๋ด ํ
์คํธ), ๋ชจ๋ฐ์ผ CSS ๋ฏธ๋์ด ์ฟผ๋ฆฌ (h1 ์ถ์, #info ์จ๊น, iOS Safari ๋ฐ์ด์ค ๋ฐฉ์ง) |
| 2026-03-02 |
v2.0.0 |
๋น์ฃผ์ผ+์ฌ์ด๋ ์ ๋ฉด ์
๊ทธ๋ ์ด๋ โ SoundManager(Web Audio API ํ๋ก์์ ๋ด 8bit ์ฌ์ด๋ 15์ข
, OscillatorNode/GainNode/WhiteNoise), ์ฐ๋น์ธํธ ์์คํ
(์๋ ๋ธ๋ ์ด๋ ๋ฐ๋ ํ๋ค๋ฆผ, ๊ฒฝ๋ก ์กฐ์ฝ๋/๊ท ์ด, ๋จผ์ง/๋ฐ๋ง๋ถ์ด ํํฐํด), ์คํฌ๋ฆฐ์์ดํฌ(๋ณด์ค์ฌ๋ง/๋ํฌ์คํ๋์/๋ผ์ดํ๊ฐ์), ์ถฉ๊ฒฉํ ๋ง(์ ์ฌ๋ง ์ ํ์ฅ ๋ง), ํฌ์ฌ์ฒด ๊ธ๋ก์ฐ(shadowBlur), ํ์ ๋จธ์ฆ ํ๋์, ์ง๋ฉด ์ถฉ๋ ๋งํฌ, ํ์/์ ๊ทธ๋ฆผ์, UI ๊ทธ๋ผ๋์ธํธ ํจ๋, ๋ฒํผ ํธ๋ฒ ๊ธ๋ก์ฐ, ๊ณจ๋/๋ผ์ดํ ๋ณ๊ฒฝ ํ๋์, ์จ์ด๋ธ ์ ํ ์ฌ๋ผ์ด๋ ์ค๋ฒ๋ ์ด, ๊ฒ์์ค๋ฒ ์ฐ์ถ(์ด๋์์ง๊ธฐโ์ค์ผ์ผ์ธโ์นด์ดํธ์
โ์ต๊ณ ์ ์โ์ฌ์์), ๋ณผ๋ฅจ ํ ๊ธ(๐/๐ ๋ฒํผ, Mํค) |
| 2026-03-06 |
v2.1.1 |
UI ๊ฐ์ โ ์๋จ ๋ฐ ๋ฒํผ ๊ณ ์ ๋๋น(์๋/๋ณผ๋ฅจ/์ธ์ด ํฌ๊ธฐ ๋ถ๋ณ), [Q] ํํธ ๋ฒํผ ์๋ ๋ถ๋ฆฌ, ์คํฏ ๋ฑ์ง ๊ฒน์นจ ํด๊ฒฐ(3๋ฒํผ ์ด ๋๋น ์์ฝ), ์์ ํ๋กฌํํธ ์ค์ ์ ๋ ฌ(measureText ๋์ ๋ฐ์ค), ๊ฒ์์ค๋ฒ ์ฌ์์ ๋ฅ๊ทผ ์ฌ๊ฐํ ๋ฒํผ(ํ๋ ํ
๋๋ฆฌ, ์์ญ ํด๋ฆญ๋ง ๊ฐ์ง, ๊ด๊ณ ์ ๊ฑฐ), restartBtn ๋ก์ปฌ๋ผ์ด์ ์ด์
|
| 2026-03-06 |
v2.1.0 |
๊ฒ์ํ๋ ์ด+๋ชจ๋ฐ์ผ ์
๊ทธ๋ ์ด๋ โ ๋์ด๋ ์ํฅ(HP=30+wร18+w^1.7ร6, ์๋/์๋ ๊ฐํ, ๋น ๋ฅธ์ ์จ์ด๋ธ2๋ถํฐ+๋ฐฉ์ด๋ ฅ, ํฑํฌ ์จ์ด๋ธ4๋ถํฐ), ํ์ดํ ์น๋ช
ํ(20%ํ๋ฅ ร2.5๋ฐฐ, ๊ธ์ ํํฐํด+๊ธ๋ก์ฐ+์ฌ์ด๋), ๋ฒ๊ฐํ ์ฐ์๊ณต๊ฒฉ(3๋ฐ์ด์ค, 70%๊ฐ์, ์ง๊ทธ์ฌ๊ทธ ๋ฒ๊ฐ ์๊ฐํจ๊ณผ), ๋ณด์ค ํน์๋ฅ๋ ฅ 3์ข
(๋ฐฉ์ด๋ง=ํ๋ ์ก๊ฐํ ๋ฐฐ๋ฆฌ์ด maxHPร15%+์ค๋๋ฐ/์ํ=2~4๋ง๋ฆฌ ์ํ์ /๊ฐ์๋์ง=2์ด ์๋ร2.5 ๋นจ๊ฐ ์๋์ ), applyDamageToEnemy ๋ฐ๋ฏธ์ง ์ค์ํ ํฌํผ, ์ฌ์ด๋ 5์ข
์ถ๊ฐ(arrowCrit/lightningChain/bossShield/bossSummon/bossSpeedBurst), ๋ชจ๋ฐ์ผ ๊ฐ๋ก๋ชจ๋ ์ต์ ํ(์ฌ๋ฐฑ์ถ์/MIN_TILE 28/์ธ๋ก๊ฐ์ง "ํ๋ฉด์ ๋๋ ค์ฃผ์ธ์" ์ค๋ฒ๋ ์ด/orientation ๋ฆฌ์ค๋/CSS landscape ๋ฏธ๋์ด ์ฟผ๋ฆฌ) |
| 2026-04-21 |
v3.0.0 |
๋ชจ๋ฐ์ผ+๋ฐธ๋ฐ์ค+ํฝ์
์คํ๋ผ์ดํธ 1์ฐจ โ DPR ๋ ๋๋ง, MAX_TILE 96, HP ์ง์ w^1.95ร8, ์
๊ทธ๋ ์ด๋ ๋น์ฉ ์ง์ํ, ๋ฌ์/ํค๋น ํน์ ์จ์ด๋ธ ์ถ๊ฐ (ํ์ v3.1์์ UI/๋ฐฐ๊ฒฝ ๋ชจ๋์ผ๋ก ์ ํ) |
| 2026-04-21 |
v3.1.0 |
ํฝ์
์บ๋ฆญํฐ + ๋ชจ๋ UI ํ์ด๋ธ๋ฆฌ๋ โ image-rendering: pixelated ์ ์ญ ์ ๊ฑฐ, imageSmoothingEnabled๋ drawSprite ๋ด๋ถ์์๋ง false๋ก ํ ๊ธํด UI/๋ฐฐ๊ฒฝ์ ๋ถ๋๋ฝ๊ฒ ์ ์ง. HUD ๋ณต์(๊ทธ๋ผ๋์ธํธ ํจ๋+๋ค์จ ๋ผ์ธ+๋ฅ๊ทผ ๋ชจ์๋ฆฌ 6px), ๋ฐฐ๊ฒฝ ๋ชจ๋ํ(์์ง ๊ทธ๋ผ๋์ธํธ ์๋+๋ผ๋์ผ ๊ฒฝ๋ก+๋ถ๋๋ฌ์ด ์ผ๋ฃฉ, ์คํ์คํฌ๋ฆฐ backgroundCache๋ก ์ ์ ํ๋ฆฌ๋ ๋), ์ ์คํ๋ผ์ดํธ ํด์๋ ์ํฅ(Normal/Fast 16โ24, Tank 20โ28, Boss 28โ40)+ํ์ด๋ผ์ดํธยท์๋์ฐ ํฝ์
ยท๋ณผํฐ์น ์ถ๊ฐ, ํ์ ์คํ๋ผ์ดํธ ์ํฅ(8โ16ร16 base)+์ธ๊ณฝ์ /ํ์ด๋ผ์ดํธ/์ฐฝ๋ฌธ/์คํค ๊ธฐ๋จ ๋ํ
์ผ, ํ์ ํฌ๊ธฐ TILE ๊ธฐ๋ฐ ์ฌ๊ณ์ฐ(displayScale=round(TILEรN/spriteW) ์ ์ ๋ฐฐ์จ), ์ HP ๋ฐ ๋ฅ๊ทผ ๋ชจ์๋ฆฌ+ํ์ด๋ผ์ดํธ, ์ ๊ทธ๋ฆผ์/ํ์ ๊ทธ๋ฆผ์ ctx.filter='blur(2px)' ์ ์ฉ, ๋ ๋ฒจ ๋ณ์ 5๊ฐ๋ณ+ํฉ๊ธ ๊ธ๋ก์ฐ๋ก ๊ต์ฒด, ๋ฒ๊ฐ ํ์ ์ค์ ์ค๋ธ ๋งฅ๋ฐ ๊ธ๋ก์ฐ |
| 2026-04-21 |
v3.2.0 |
UI ๋ฆฌ์ํฌ + ๋ฐธ๋ฐ์ค 2์ฐจ + ์ดํํธ ๊ฐํ โ ์๋จ ์ฐ์ธก ์๊ตฌ ์จ์ด๋ธ ๋ฑ์ง(โ ์์ด์ฝ+๋ณด์ค์จ์ด๋ธ ๋นจ๊ฐ ํดํธ), IN/OUT ์์ด์ฝํ(โถ ์ด๋ก ํ์ดํ+โ ๋นจ๊ฐ ๊ณผ๋
๋งฅ๋ฐ), HUD ๋ ์ด์์ ์ฌ์กฐ์ (์ผ์ชฝ ์คํฏ 3๊ฐ=๊ณจ๋/ํํธ/๋ณ TILEร1.95 ๊ณ ์ ๋๋นยท๊ทธ๋ผ๋์ธํธ ๋ฑ์งยท์๋จ ๊ดํ, ์ค๋ฅธ์ชฝ ๋ฒํผ 3๊ฐ=ํ/๋ณผ๋ฅจ/์๋ ๋์ผ TILEร1.5 ๋๋นยทdrawIconBtn ๊ณตํต ํฌํผ, ์คํฏโ๋ฒํผ ์ธ๋ก ๋ค์จ divider, UI_PAD=max(10,TILEร0.22) ์ข์ฐ ๊ณตํต ํจ๋ฉ), drawRoundRect์ ์ฝ๋๋ณ ๋ฐ๊ฒฝ({tl,tr,bl,br}) ์ง์, ํ์ ์
๊ทธ๋ ์ด๋ ํจ๋ overflow ํด๊ฒฐ(drawActionBtn ๊ณตํต ํฌํผ๋ก upgrade/sell/max ํต์ผยท๋ผ๋ฒจ ์ต๋๋๋น ์ธก์ ํ btnMinW=max+btnPadHร2ยทํฐํธ ์๋ ์ถ์ ๋ฃจํ), ํ์ ์ ํ ๋ฒํผ ๋ฆฌ๋์์ธ(์์ด์ฝ 30% ๊ณ ์ ์์ญยทํ
์คํธ maxWidth ํฐํธ ์ถ์), HTML h1 "TOWER DEFENSE" ์ ๊ฑฐ+info ์ ๊ฑฐ+์ฌ๋ฐฑ 24๋ก ์ถ์, ์์/์จ์ด๋ธ ํ๋กฌํํธ ์์ฝํ CTA ๋ฆฌ๋์์ธ(โถ ์์ด์ฝ+๋ฉ์ธ ๋ผ๋ฒจ+ํํธ, ์์=์ด๋ก/๋๊ธฐ=ํ๋ ๊ทธ๋ผ๋์ธํธ, ์ธ๊ณฝ ๊ธ๋ก์ฐ ๋งฅ๋ฐ), Game Over ์ค๋ฒ๋ ์ด ์ ๋ฉด ๋ฆฌ๋์์ธ(๋ผ๋์ผ ๋น๋คํธ+์ค์ ๋ชจ๋ฌ ํจ๋ยท์๋จ ๋นจ๊ฐ ์ก์ผํธยท๊ดํ, ์ ์ ์นด๋ ์จ์ด๋ธ/์ ์ 2๋ถํ ยท์ธ๋ก dividerยท์ ๊ตฌ๋ถ, ์ต๊ณ ์ ์ ๋ฑ์ง ์ ๊ธฐ๋ก์ ๐ ๋งฅ๋ฐ, CTA ๋ฒํผ 2์ข
=๋ถํ ์ด๋ก ๋งฅ๋ฐ+์ฌ์์ ํ๋ drawCTA ํฌํผ), ํ์ด ํฌ์ฌ์ฒด ๊ฐํ(์งํ๋ฐฉํฅ ํ์ +๊นํธ ๊ผฌ๋ฆฌ+ํ์ด๋ ์ +ํ์ด๋ผ์ดํธ ์ +์ธ๊ณฝ/๋ด๋ถ 2๊ฒน ๋น์ค๊ธฐ+์น๋ช
ํ ๊ธ์ ํ๋), ๋ํฌ ํฌ์ฌ์ฒด ๊ฐํ(์์ฒด ํ์ ํฌํ+๊ธ์ ๋ฐด๋+์ค๋ ์ง ํ์ด๋ผ์ดํธ+2์ธต ์ฐ๊ธฐ ๊ผฌ๋ฆฌ+๋ค์ชฝ ๋ถ๊ฝ 3๊ฐ), ํ์ ๋ ๋ฒจ ํฐ์ด ์๊ฐํ(Lv2 ํ๋ ๋ค์ด์ 1ยทLv3 ์ด๋ก ๋ค์ด์ 2ยทLv4 ๋ณด๋ผ ๋ค์ด์ 3ยทLv5 ํฉ๊ธ ํฌ๋ผ์ดโ+๋งฅ๋ฐ ๊ธ๋ก์ฐ), ๋ฐธ๋ฐ์ค 2์ฐจ ์ํ(HP=30+wร18+w^1.78ร6.5ยท์๋ wร0.04+floor(w/10)ร0.06ยท์นด์ดํธ floor(w/7)ร3ยท๊ณจ๋ wร0.55ยท์
๊ทธ๋ ์ด๋๋น์ฉ 0.7ร1.5^(lv-1)ยท๋ฌ์/ํค๋น ๊ฐ๋โยท๋ณด์คHP 4.8+lvร1.4) |