kiwiengine 0.0.1-alpha → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/README.ko.md +550 -0
  2. package/README.md +575 -4
  3. package/examples/auto-battle/assets/bgm/battle.mp3 +0 -0
  4. package/examples/auto-battle/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  5. package/examples/auto-battle/assets/bitmap-fonts/white-peaberry.png +0 -0
  6. package/examples/auto-battle/assets/joystick/joystick.png +0 -0
  7. package/examples/auto-battle/assets/joystick/knob.png +0 -0
  8. package/examples/auto-battle/assets/sfx/hero/die/die.wav +0 -0
  9. package/examples/auto-battle/assets/sfx/hero/heal/heal.wav +0 -0
  10. package/examples/auto-battle/assets/sfx/hero/hit/hit1.wav +0 -0
  11. package/examples/auto-battle/assets/sfx/hero/hit/hit2.wav +0 -0
  12. package/examples/auto-battle/assets/sfx/hero/hit/hit3.wav +0 -0
  13. package/examples/auto-battle/assets/sfx/hero/miss/miss1.wav +0 -0
  14. package/examples/auto-battle/assets/sfx/hero/miss/miss2.wav +0 -0
  15. package/examples/auto-battle/assets/sfx/hero/miss/miss3.wav +0 -0
  16. package/examples/auto-battle/assets/sfx/orc/die/die.wav +0 -0
  17. package/examples/auto-battle/assets/sfx/orc/hit/hit1.wav +0 -0
  18. package/examples/auto-battle/assets/sfx/orc/hit/hit2.wav +0 -0
  19. package/examples/auto-battle/assets/sfx/orc/hit/hit3.wav +0 -0
  20. package/examples/auto-battle/assets/sfx/orc/miss/miss1.wav +0 -0
  21. package/examples/auto-battle/assets/sfx/orc/miss/miss2.wav +0 -0
  22. package/examples/auto-battle/assets/sfx/orc/miss/miss3.wav +0 -0
  23. package/examples/auto-battle/assets/spritesheets/hero-atlas.json +246 -0
  24. package/examples/auto-battle/assets/spritesheets/hero.png +0 -0
  25. package/examples/auto-battle/assets/spritesheets/orc-atlas.json +246 -0
  26. package/examples/auto-battle/assets/spritesheets/orc.png +0 -0
  27. package/examples/auto-battle/assets/spritesheets/potion-atlas.json +68 -0
  28. package/examples/auto-battle/assets/spritesheets/potion.png +0 -0
  29. package/examples/auto-battle/dist/game.js +2 -0
  30. package/examples/auto-battle/dist/game.js.LICENSE.txt +35 -0
  31. package/examples/auto-battle/hud/damage-text.ts +46 -0
  32. package/examples/auto-battle/hud/heal-text.ts +46 -0
  33. package/examples/auto-battle/hud/hp-bar.ts +38 -0
  34. package/examples/auto-battle/index.ts +41 -0
  35. package/examples/auto-battle/objects/character.ts +95 -0
  36. package/examples/auto-battle/objects/hero.ts +119 -0
  37. package/examples/auto-battle/objects/orc.ts +107 -0
  38. package/examples/auto-battle/objects/potion.ts +27 -0
  39. package/examples/auto-battle/stage.ts +366 -0
  40. package/examples/battle-benchmark-matterjs/assets/bgm/battle.mp3 +0 -0
  41. package/examples/battle-benchmark-matterjs/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  42. package/examples/battle-benchmark-matterjs/assets/bitmap-fonts/white-peaberry.png +0 -0
  43. package/examples/battle-benchmark-matterjs/assets/joystick/joystick.png +0 -0
  44. package/examples/battle-benchmark-matterjs/assets/joystick/knob.png +0 -0
  45. package/examples/battle-benchmark-matterjs/assets/sfx/hero/die/die.wav +0 -0
  46. package/examples/battle-benchmark-matterjs/assets/sfx/hero/heal/heal.wav +0 -0
  47. package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit1.wav +0 -0
  48. package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit2.wav +0 -0
  49. package/examples/battle-benchmark-matterjs/assets/sfx/hero/hit/hit3.wav +0 -0
  50. package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss1.wav +0 -0
  51. package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss2.wav +0 -0
  52. package/examples/battle-benchmark-matterjs/assets/sfx/hero/miss/miss3.wav +0 -0
  53. package/examples/battle-benchmark-matterjs/assets/sfx/orc/die/die.wav +0 -0
  54. package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit1.wav +0 -0
  55. package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit2.wav +0 -0
  56. package/examples/battle-benchmark-matterjs/assets/sfx/orc/hit/hit3.wav +0 -0
  57. package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss1.wav +0 -0
  58. package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss2.wav +0 -0
  59. package/examples/battle-benchmark-matterjs/assets/sfx/orc/miss/miss3.wav +0 -0
  60. package/examples/battle-benchmark-matterjs/assets/spritesheets/hero-atlas.json +246 -0
  61. package/examples/battle-benchmark-matterjs/assets/spritesheets/hero.png +0 -0
  62. package/examples/battle-benchmark-matterjs/assets/spritesheets/orc-atlas.json +246 -0
  63. package/examples/battle-benchmark-matterjs/assets/spritesheets/orc.png +0 -0
  64. package/examples/battle-benchmark-matterjs/assets/spritesheets/potion-atlas.json +68 -0
  65. package/examples/battle-benchmark-matterjs/assets/spritesheets/potion.png +0 -0
  66. package/examples/battle-benchmark-matterjs/dist/game.js +2 -0
  67. package/examples/battle-benchmark-matterjs/dist/game.js.LICENSE.txt +35 -0
  68. package/examples/battle-benchmark-matterjs/hud/damage-text.ts +46 -0
  69. package/examples/battle-benchmark-matterjs/hud/heal-text.ts +46 -0
  70. package/examples/battle-benchmark-matterjs/hud/hp-bar.ts +38 -0
  71. package/examples/battle-benchmark-matterjs/index.html +24 -0
  72. package/examples/battle-benchmark-matterjs/index.ts +41 -0
  73. package/examples/battle-benchmark-matterjs/objects/character.ts +95 -0
  74. package/examples/battle-benchmark-matterjs/objects/hero.ts +111 -0
  75. package/examples/battle-benchmark-matterjs/objects/orc.ts +107 -0
  76. package/examples/battle-benchmark-matterjs/objects/potion.ts +27 -0
  77. package/examples/battle-benchmark-matterjs/stage.ts +177 -0
  78. package/examples/battle-benchmark-separation/assets/bgm/battle.mp3 +0 -0
  79. package/examples/battle-benchmark-separation/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  80. package/examples/battle-benchmark-separation/assets/bitmap-fonts/white-peaberry.png +0 -0
  81. package/examples/battle-benchmark-separation/assets/joystick/joystick.png +0 -0
  82. package/examples/battle-benchmark-separation/assets/joystick/knob.png +0 -0
  83. package/examples/battle-benchmark-separation/assets/sfx/hero/die/die.wav +0 -0
  84. package/examples/battle-benchmark-separation/assets/sfx/hero/heal/heal.wav +0 -0
  85. package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit1.wav +0 -0
  86. package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit2.wav +0 -0
  87. package/examples/battle-benchmark-separation/assets/sfx/hero/hit/hit3.wav +0 -0
  88. package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss1.wav +0 -0
  89. package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss2.wav +0 -0
  90. package/examples/battle-benchmark-separation/assets/sfx/hero/miss/miss3.wav +0 -0
  91. package/examples/battle-benchmark-separation/assets/sfx/orc/die/die.wav +0 -0
  92. package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit1.wav +0 -0
  93. package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit2.wav +0 -0
  94. package/examples/battle-benchmark-separation/assets/sfx/orc/hit/hit3.wav +0 -0
  95. package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss1.wav +0 -0
  96. package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss2.wav +0 -0
  97. package/examples/battle-benchmark-separation/assets/sfx/orc/miss/miss3.wav +0 -0
  98. package/examples/battle-benchmark-separation/assets/spritesheets/hero-atlas.json +246 -0
  99. package/examples/battle-benchmark-separation/assets/spritesheets/hero.png +0 -0
  100. package/examples/battle-benchmark-separation/assets/spritesheets/orc-atlas.json +246 -0
  101. package/examples/battle-benchmark-separation/assets/spritesheets/orc.png +0 -0
  102. package/examples/battle-benchmark-separation/assets/spritesheets/potion-atlas.json +68 -0
  103. package/examples/battle-benchmark-separation/assets/spritesheets/potion.png +0 -0
  104. package/examples/battle-benchmark-separation/dist/game.js +2 -0
  105. package/examples/battle-benchmark-separation/dist/game.js.LICENSE.txt +35 -0
  106. package/examples/battle-benchmark-separation/hud/damage-text.ts +46 -0
  107. package/examples/battle-benchmark-separation/hud/heal-text.ts +46 -0
  108. package/examples/battle-benchmark-separation/hud/hp-bar.ts +38 -0
  109. package/examples/battle-benchmark-separation/index.html +24 -0
  110. package/examples/battle-benchmark-separation/index.ts +41 -0
  111. package/examples/battle-benchmark-separation/objects/character.ts +225 -0
  112. package/examples/battle-benchmark-separation/objects/hero.ts +110 -0
  113. package/examples/battle-benchmark-separation/objects/orc.ts +213 -0
  114. package/examples/battle-benchmark-separation/objects/potion.ts +27 -0
  115. package/examples/battle-benchmark-separation/stage.ts +178 -0
  116. package/examples/battle-benchmark-separation2/assets/bgm/battle.mp3 +0 -0
  117. package/examples/battle-benchmark-separation2/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  118. package/examples/battle-benchmark-separation2/assets/bitmap-fonts/white-peaberry.png +0 -0
  119. package/examples/battle-benchmark-separation2/assets/joystick/joystick.png +0 -0
  120. package/examples/battle-benchmark-separation2/assets/joystick/knob.png +0 -0
  121. package/examples/battle-benchmark-separation2/assets/sfx/hero/die/die.wav +0 -0
  122. package/examples/battle-benchmark-separation2/assets/sfx/hero/heal/heal.wav +0 -0
  123. package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit1.wav +0 -0
  124. package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit2.wav +0 -0
  125. package/examples/battle-benchmark-separation2/assets/sfx/hero/hit/hit3.wav +0 -0
  126. package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss1.wav +0 -0
  127. package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss2.wav +0 -0
  128. package/examples/battle-benchmark-separation2/assets/sfx/hero/miss/miss3.wav +0 -0
  129. package/examples/battle-benchmark-separation2/assets/sfx/orc/die/die.wav +0 -0
  130. package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit1.wav +0 -0
  131. package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit2.wav +0 -0
  132. package/examples/battle-benchmark-separation2/assets/sfx/orc/hit/hit3.wav +0 -0
  133. package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss1.wav +0 -0
  134. package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss2.wav +0 -0
  135. package/examples/battle-benchmark-separation2/assets/sfx/orc/miss/miss3.wav +0 -0
  136. package/examples/battle-benchmark-separation2/assets/spritesheets/hero-atlas.json +246 -0
  137. package/examples/battle-benchmark-separation2/assets/spritesheets/hero.png +0 -0
  138. package/examples/battle-benchmark-separation2/assets/spritesheets/orc-atlas.json +246 -0
  139. package/examples/battle-benchmark-separation2/assets/spritesheets/orc.png +0 -0
  140. package/examples/battle-benchmark-separation2/assets/spritesheets/potion-atlas.json +68 -0
  141. package/examples/battle-benchmark-separation2/assets/spritesheets/potion.png +0 -0
  142. package/examples/battle-benchmark-separation2/dist/game.js +2 -0
  143. package/examples/battle-benchmark-separation2/dist/game.js.LICENSE.txt +35 -0
  144. package/examples/battle-benchmark-separation2/hud/damage-text.ts +46 -0
  145. package/examples/battle-benchmark-separation2/hud/heal-text.ts +46 -0
  146. package/examples/battle-benchmark-separation2/hud/hp-bar.ts +38 -0
  147. package/examples/battle-benchmark-separation2/index.html +24 -0
  148. package/examples/battle-benchmark-separation2/index.ts +41 -0
  149. package/examples/battle-benchmark-separation2/objects/character.ts +195 -0
  150. package/examples/battle-benchmark-separation2/objects/hero.ts +110 -0
  151. package/examples/battle-benchmark-separation2/objects/orc.ts +213 -0
  152. package/examples/battle-benchmark-separation2/objects/potion.ts +27 -0
  153. package/examples/battle-benchmark-separation2/stage.ts +178 -0
  154. package/examples/collision-test/assets/cat.png +0 -0
  155. package/examples/collision-test/dist/game.js +2 -0
  156. package/examples/collision-test/dist/game.js.LICENSE.txt +35 -0
  157. package/examples/collision-test/index.html +24 -0
  158. package/examples/collision-test/index.ts +30 -0
  159. package/examples/dom-particle-test/assets/bird.png +0 -0
  160. package/examples/dom-particle-test/dist/game.js +2 -0
  161. package/examples/dom-particle-test/dist/game.js.LICENSE.txt +35 -0
  162. package/examples/dom-particle-test/index.html +24 -0
  163. package/examples/dom-particle-test/index.ts +27 -0
  164. package/examples/dom-sprite-test/assets/bird.png +0 -0
  165. package/examples/dom-sprite-test/assets/fire.png +0 -0
  166. package/examples/dom-sprite-test/assets/run.png +0 -0
  167. package/examples/dom-sprite-test/dist/game.js +2 -0
  168. package/examples/dom-sprite-test/dist/game.js.LICENSE.txt +35 -0
  169. package/examples/dom-sprite-test/index.html +24 -0
  170. package/examples/dom-sprite-test/index.ts +35 -0
  171. package/examples/dom-test/dist/game.js +2 -0
  172. package/examples/dom-test/dist/game.js.LICENSE.txt +35 -0
  173. package/examples/dom-test/index.html +24 -0
  174. package/examples/dom-test/index.ts +22 -0
  175. package/examples/particle-test/assets/bird.png +0 -0
  176. package/examples/particle-test/dist/game.js +2 -0
  177. package/examples/particle-test/dist/game.js.LICENSE.txt +35 -0
  178. package/examples/particle-test/index.html +24 -0
  179. package/examples/particle-test/index.ts +30 -0
  180. package/examples/renderer-test/dist/game.js +2 -0
  181. package/examples/renderer-test/dist/game.js.LICENSE.txt +35 -0
  182. package/examples/renderer-test/index.html +24 -0
  183. package/examples/renderer-test/index.ts +9 -0
  184. package/examples/simple-battle/assets/bgm/battle.mp3 +0 -0
  185. package/examples/simple-battle/assets/bitmap-fonts/white-peaberry.fnt +107 -0
  186. package/examples/simple-battle/assets/bitmap-fonts/white-peaberry.png +0 -0
  187. package/examples/simple-battle/assets/joystick/joystick.png +0 -0
  188. package/examples/simple-battle/assets/joystick/knob.png +0 -0
  189. package/examples/simple-battle/assets/sfx/hero/die/die.wav +0 -0
  190. package/examples/simple-battle/assets/sfx/hero/heal/heal.wav +0 -0
  191. package/examples/simple-battle/assets/sfx/hero/hit/hit1.wav +0 -0
  192. package/examples/simple-battle/assets/sfx/hero/hit/hit2.wav +0 -0
  193. package/examples/simple-battle/assets/sfx/hero/hit/hit3.wav +0 -0
  194. package/examples/simple-battle/assets/sfx/hero/miss/miss1.wav +0 -0
  195. package/examples/simple-battle/assets/sfx/hero/miss/miss2.wav +0 -0
  196. package/examples/simple-battle/assets/sfx/hero/miss/miss3.wav +0 -0
  197. package/examples/simple-battle/assets/sfx/orc/die/die.wav +0 -0
  198. package/examples/simple-battle/assets/sfx/orc/hit/hit1.wav +0 -0
  199. package/examples/simple-battle/assets/sfx/orc/hit/hit2.wav +0 -0
  200. package/examples/simple-battle/assets/sfx/orc/hit/hit3.wav +0 -0
  201. package/examples/simple-battle/assets/sfx/orc/miss/miss1.wav +0 -0
  202. package/examples/simple-battle/assets/sfx/orc/miss/miss2.wav +0 -0
  203. package/examples/simple-battle/assets/sfx/orc/miss/miss3.wav +0 -0
  204. package/examples/simple-battle/assets/spritesheets/hero-atlas.json +246 -0
  205. package/examples/simple-battle/assets/spritesheets/hero.png +0 -0
  206. package/examples/simple-battle/assets/spritesheets/orc-atlas.json +246 -0
  207. package/examples/simple-battle/assets/spritesheets/orc.png +0 -0
  208. package/examples/simple-battle/assets/spritesheets/potion-atlas.json +68 -0
  209. package/examples/simple-battle/assets/spritesheets/potion.png +0 -0
  210. package/examples/simple-battle/dist/game.js +2 -0
  211. package/examples/simple-battle/dist/game.js.LICENSE.txt +35 -0
  212. package/examples/simple-battle/hud/damage-text.ts +46 -0
  213. package/examples/simple-battle/hud/heal-text.ts +46 -0
  214. package/examples/simple-battle/hud/hp-bar.ts +38 -0
  215. package/examples/simple-battle/index.html +24 -0
  216. package/examples/simple-battle/index.ts +41 -0
  217. package/examples/simple-battle/objects/character.ts +95 -0
  218. package/examples/simple-battle/objects/hero.ts +111 -0
  219. package/examples/simple-battle/objects/orc.ts +107 -0
  220. package/examples/simple-battle/objects/potion.ts +27 -0
  221. package/examples/simple-battle/stage.ts +174 -0
  222. package/examples/spine-test/assets/spine/spineboy.atlas +95 -0
  223. package/examples/spine-test/assets/spine/spineboy.png +0 -0
  224. package/examples/spine-test/assets/spine/spineboy.skel +0 -0
  225. package/examples/spine-test/dist/game.js +2 -0
  226. package/examples/spine-test/dist/game.js.LICENSE.txt +35 -0
  227. package/examples/spine-test/index.html +24 -0
  228. package/examples/spine-test/index.ts +29 -0
  229. package/examples/sprite-test/assets/bird.png +0 -0
  230. package/examples/sprite-test/assets/fire.png +0 -0
  231. package/examples/sprite-test/dist/game.js +2 -0
  232. package/examples/sprite-test/dist/game.js.LICENSE.txt +35 -0
  233. package/examples/sprite-test/index.html +24 -0
  234. package/examples/sprite-test/index.ts +38 -0
  235. package/examples/tsconfig.json +2 -1
  236. package/examples/webpack.config.js +17 -3
  237. package/jest.config.ts +10 -0
  238. package/lib/asset/audio.js +47 -11
  239. package/lib/asset/audio.js.map +1 -1
  240. package/lib/asset/loaders/audio.js +7 -4
  241. package/lib/asset/loaders/audio.js.map +1 -1
  242. package/lib/asset/loaders/binary.js +7 -4
  243. package/lib/asset/loaders/binary.js.map +1 -1
  244. package/lib/asset/loaders/bitmap-font.js +74 -0
  245. package/lib/asset/loaders/bitmap-font.js.map +1 -0
  246. package/lib/asset/loaders/font.js +4 -1
  247. package/lib/asset/loaders/font.js.map +1 -1
  248. package/lib/asset/loaders/loader.js +17 -12
  249. package/lib/asset/loaders/loader.js.map +1 -1
  250. package/lib/asset/loaders/spritesheet.js +18 -8
  251. package/lib/asset/loaders/spritesheet.js.map +1 -1
  252. package/lib/asset/loaders/text.js +6 -3
  253. package/lib/asset/loaders/text.js.map +1 -1
  254. package/lib/asset/loaders/texture.js +22 -26
  255. package/lib/asset/loaders/texture.js.map +1 -1
  256. package/lib/asset/preload.js +60 -56
  257. package/lib/asset/preload.js.map +1 -1
  258. package/lib/collision/check-collision.js +804 -0
  259. package/lib/collision/check-collision.js.map +1 -0
  260. package/lib/collision/check-collision.test.js +300 -0
  261. package/lib/collision/check-collision.test.js.map +1 -0
  262. package/lib/collision/colliders.js +8 -0
  263. package/lib/collision/colliders.js.map +1 -0
  264. package/lib/debug.js.map +1 -0
  265. package/lib/dom/dom-animated-sprite.js +106 -0
  266. package/lib/dom/dom-animated-sprite.js.map +1 -0
  267. package/lib/dom/dom-game-object.js +108 -0
  268. package/lib/dom/dom-game-object.js.map +1 -0
  269. package/lib/dom/dom-particle.js +105 -0
  270. package/lib/dom/dom-particle.js.map +1 -0
  271. package/lib/dom/dom-preload.js +43 -0
  272. package/lib/dom/dom-preload.js.map +1 -0
  273. package/lib/dom/dom-sprite.js +40 -0
  274. package/lib/dom/dom-sprite.js.map +1 -0
  275. package/lib/dom/dom-texture-loader.js +36 -0
  276. package/lib/dom/dom-texture-loader.js.map +1 -0
  277. package/lib/dom/dom-utils.js +20 -0
  278. package/lib/dom/dom-utils.js.map +1 -0
  279. package/lib/index copy.js +16 -0
  280. package/lib/index copy.js.map +1 -0
  281. package/lib/index.js +36 -10
  282. package/lib/index.js.map +1 -1
  283. package/lib/input/joystick.js +262 -0
  284. package/lib/input/joystick.js.map +1 -0
  285. package/lib/node/core/dirty-number.js +19 -0
  286. package/lib/node/core/dirty-number.js.map +1 -0
  287. package/lib/node/core/game-node.js +63 -0
  288. package/lib/node/core/game-node.js.map +1 -0
  289. package/lib/node/core/game-object.js +8 -0
  290. package/lib/node/core/game-object.js.map +1 -0
  291. package/lib/node/core/renderable.js +59 -0
  292. package/lib/node/core/renderable.js.map +1 -0
  293. package/lib/node/core/transform.js +70 -0
  294. package/lib/node/core/transform.js.map +1 -0
  295. package/lib/node/core/transformable.js +85 -0
  296. package/lib/node/core/transformable.js.map +1 -0
  297. package/lib/node/ext/animated-sprite.js +77 -0
  298. package/lib/node/ext/animated-sprite.js.map +1 -0
  299. package/lib/node/ext/bitmap-text.js +93 -0
  300. package/lib/node/ext/bitmap-text.js.map +1 -0
  301. package/lib/node/ext/circle.js +43 -0
  302. package/lib/node/ext/circle.js.map +1 -0
  303. package/lib/node/ext/deplay.js +22 -0
  304. package/lib/node/ext/deplay.js.map +1 -0
  305. package/lib/node/ext/dom-container.js +51 -0
  306. package/lib/node/ext/dom-container.js.map +1 -0
  307. package/lib/node/ext/interval.js +22 -0
  308. package/lib/node/ext/interval.js.map +1 -0
  309. package/lib/node/ext/particle.js +98 -0
  310. package/lib/node/ext/particle.js.map +1 -0
  311. package/lib/node/ext/rectangle.js +52 -0
  312. package/lib/node/ext/rectangle.js.map +1 -0
  313. package/lib/node/ext/spine.js +272 -0
  314. package/lib/node/ext/spine.js.map +1 -0
  315. package/lib/node/ext/sprite.js +42 -0
  316. package/lib/node/ext/sprite.js.map +1 -0
  317. package/lib/node/physics/physics-object.js +92 -0
  318. package/lib/node/physics/physics-object.js.map +1 -0
  319. package/lib/node/physics/physics-world.js +29 -0
  320. package/lib/node/physics/physics-world.js.map +1 -0
  321. package/lib/node/physics/rigidbodies.js +7 -0
  322. package/lib/node/physics/rigidbodies.js.map +1 -0
  323. package/lib/renderer/camera.js +19 -0
  324. package/lib/renderer/camera.js.map +1 -0
  325. package/lib/renderer/container-manager.js +29 -0
  326. package/lib/renderer/container-manager.js.map +1 -0
  327. package/lib/renderer/fps-display.js +18 -0
  328. package/lib/renderer/fps-display.js.map +1 -0
  329. package/lib/renderer/layer.js +12 -0
  330. package/lib/renderer/layer.js.map +1 -0
  331. package/lib/renderer/renderer.js +146 -0
  332. package/lib/renderer/renderer.js.map +1 -0
  333. package/lib/renderer/ticker.js +56 -0
  334. package/lib/renderer/ticker.js.map +1 -0
  335. package/lib/renderer/ticker.test.js +241 -0
  336. package/lib/renderer/ticker.test.js.map +1 -0
  337. package/lib/types/animation-atlas.js +2 -0
  338. package/lib/types/animation-atlas.js.map +1 -0
  339. package/lib/types/asset/audio.d.ts +5 -4
  340. package/lib/types/asset/audio.d.ts.map +1 -1
  341. package/lib/types/asset/loaders/audio.d.ts +2 -1
  342. package/lib/types/asset/loaders/audio.d.ts.map +1 -1
  343. package/lib/types/asset/loaders/binary.d.ts +2 -1
  344. package/lib/types/asset/loaders/binary.d.ts.map +1 -1
  345. package/lib/types/asset/loaders/bitmap-font.d.ts +17 -0
  346. package/lib/types/asset/loaders/bitmap-font.d.ts.map +1 -0
  347. package/lib/types/asset/loaders/font.d.ts +2 -1
  348. package/lib/types/asset/loaders/font.d.ts.map +1 -1
  349. package/lib/types/asset/loaders/loader.d.ts +6 -6
  350. package/lib/types/asset/loaders/loader.d.ts.map +1 -1
  351. package/lib/types/asset/loaders/spritesheet.d.ts +14 -6
  352. package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -1
  353. package/lib/types/asset/loaders/text.d.ts +2 -1
  354. package/lib/types/asset/loaders/text.d.ts.map +1 -1
  355. package/lib/types/asset/loaders/texture.d.ts +2 -2
  356. package/lib/types/asset/loaders/texture.d.ts.map +1 -1
  357. package/lib/types/asset/preload.d.ts +7 -5
  358. package/lib/types/asset/preload.d.ts.map +1 -1
  359. package/lib/types/atlas copy.js +2 -0
  360. package/lib/types/atlas copy.js.map +1 -0
  361. package/lib/types/atlas.js +2 -0
  362. package/lib/types/atlas.js.map +1 -0
  363. package/lib/types/bitmap-font.js +2 -0
  364. package/lib/types/bitmap-font.js.map +1 -0
  365. package/lib/types/collision/check-collision.d.ts +4 -0
  366. package/lib/types/collision/check-collision.d.ts.map +1 -0
  367. package/lib/types/collision/check-collision.test.d.ts +2 -0
  368. package/lib/types/collision/check-collision.test.d.ts.map +1 -0
  369. package/lib/types/collision/colliders.d.ts +34 -0
  370. package/lib/types/collision/colliders.d.ts.map +1 -0
  371. package/lib/types/debug.d.ts.map +1 -0
  372. package/lib/types/dom/dom-animated-sprite.d.ts +23 -0
  373. package/lib/types/dom/dom-animated-sprite.d.ts.map +1 -0
  374. package/lib/types/dom/dom-game-object.d.ts +44 -0
  375. package/lib/types/dom/dom-game-object.d.ts.map +1 -0
  376. package/lib/types/dom/dom-particle.d.ts +30 -0
  377. package/lib/types/dom/dom-particle.d.ts.map +1 -0
  378. package/lib/types/dom/dom-preload.d.ts +2 -0
  379. package/lib/types/dom/dom-preload.d.ts.map +1 -0
  380. package/lib/types/dom/dom-sprite.d.ts +13 -0
  381. package/lib/types/dom/dom-sprite.d.ts.map +1 -0
  382. package/lib/types/dom/dom-texture-loader.d.ts +8 -0
  383. package/lib/types/dom/dom-texture-loader.d.ts.map +1 -0
  384. package/lib/types/dom/dom-utils.d.ts +3 -0
  385. package/lib/types/dom/dom-utils.d.ts.map +1 -0
  386. package/lib/types/index copy.d.ts +16 -0
  387. package/lib/types/index copy.d.ts.map +1 -0
  388. package/lib/types/index.d.ts +26 -11
  389. package/lib/types/index.d.ts.map +1 -1
  390. package/lib/types/input/joystick.d.ts +28 -0
  391. package/lib/types/input/joystick.d.ts.map +1 -0
  392. package/lib/types/node/core/dirty-number.d.ts +9 -0
  393. package/lib/types/node/core/dirty-number.d.ts.map +1 -0
  394. package/lib/types/node/core/game-node.d.ts +16 -0
  395. package/lib/types/node/core/game-node.d.ts.map +1 -0
  396. package/lib/types/node/core/game-object.d.ts +8 -0
  397. package/lib/types/node/core/game-object.d.ts.map +1 -0
  398. package/lib/types/node/core/renderable.d.ts +23 -0
  399. package/lib/types/node/core/renderable.d.ts.map +1 -0
  400. package/lib/types/node/core/transform.d.ts +27 -0
  401. package/lib/types/node/core/transform.d.ts.map +1 -0
  402. package/lib/types/node/core/transformable.d.ts +44 -0
  403. package/lib/types/node/core/transformable.d.ts.map +1 -0
  404. package/lib/types/node/ext/animated-sprite.d.ts +22 -0
  405. package/lib/types/node/ext/animated-sprite.d.ts.map +1 -0
  406. package/lib/types/node/ext/bitmap-text.d.ts +14 -0
  407. package/lib/types/node/ext/bitmap-text.d.ts.map +1 -0
  408. package/lib/types/node/ext/circle.d.ts +19 -0
  409. package/lib/types/node/ext/circle.d.ts.map +1 -0
  410. package/lib/types/node/ext/deplay.d.ts +8 -0
  411. package/lib/types/node/ext/deplay.d.ts.map +1 -0
  412. package/lib/types/node/ext/dom-container.d.ts +12 -0
  413. package/lib/types/node/ext/dom-container.d.ts.map +1 -0
  414. package/lib/types/node/ext/interval.d.ts +9 -0
  415. package/lib/types/node/ext/interval.d.ts.map +1 -0
  416. package/lib/types/node/ext/particle.d.ts +30 -0
  417. package/lib/types/node/ext/particle.d.ts.map +1 -0
  418. package/lib/types/node/ext/rectangle.d.ts +22 -0
  419. package/lib/types/node/ext/rectangle.d.ts.map +1 -0
  420. package/lib/types/node/ext/spine.d.ts +36 -0
  421. package/lib/types/node/ext/spine.d.ts.map +1 -0
  422. package/lib/types/node/ext/sprite.d.ts +13 -0
  423. package/lib/types/node/ext/sprite.d.ts.map +1 -0
  424. package/lib/types/node/physics/physics-object.d.ts +38 -0
  425. package/lib/types/node/physics/physics-object.d.ts.map +1 -0
  426. package/lib/types/node/physics/physics-world.d.ts +18 -0
  427. package/lib/types/node/physics/physics-world.d.ts.map +1 -0
  428. package/lib/types/node/physics/rigidbodies.d.ts +23 -0
  429. package/lib/types/node/physics/rigidbodies.d.ts.map +1 -0
  430. package/lib/types/renderer/camera.d.ts +13 -0
  431. package/lib/types/renderer/camera.d.ts.map +1 -0
  432. package/lib/types/renderer/container-manager.d.ts +9 -0
  433. package/lib/types/renderer/container-manager.d.ts.map +1 -0
  434. package/lib/types/renderer/fps-display.d.ts +7 -0
  435. package/lib/types/renderer/fps-display.d.ts.map +1 -0
  436. package/lib/types/renderer/layer.d.ts +7 -0
  437. package/lib/types/renderer/layer.d.ts.map +1 -0
  438. package/lib/types/renderer/renderer.d.ts +40 -0
  439. package/lib/types/renderer/renderer.d.ts.map +1 -0
  440. package/lib/types/renderer/ticker.d.ts +6 -0
  441. package/lib/types/renderer/ticker.d.ts.map +1 -0
  442. package/lib/types/renderer/ticker.test.d.ts +40 -0
  443. package/lib/types/renderer/ticker.test.d.ts.map +1 -0
  444. package/lib/types/sprite-atlas.js +2 -0
  445. package/lib/types/sprite-atlas.js.map +1 -0
  446. package/lib/types/types/animation-atlas.d.ts +14 -0
  447. package/lib/types/types/animation-atlas.d.ts.map +1 -0
  448. package/lib/types/types/atlas copy.d.ts +12 -0
  449. package/lib/types/types/atlas copy.d.ts.map +1 -0
  450. package/lib/types/types/atlas.d.ts +16 -0
  451. package/lib/types/types/atlas.d.ts.map +1 -0
  452. package/lib/types/types/bitmap-font.d.ts +18 -0
  453. package/lib/types/types/bitmap-font.d.ts.map +1 -0
  454. package/lib/types/types/sprite-atlas.d.ts +13 -0
  455. package/lib/types/types/sprite-atlas.d.ts.map +1 -0
  456. package/lib/types/utils/device.d.ts +2 -0
  457. package/lib/types/utils/device.d.ts.map +1 -0
  458. package/lib/utils/device.js +2 -0
  459. package/lib/utils/device.js.map +1 -0
  460. package/package.json +8 -7
  461. package/src/asset/audio.ts +134 -90
  462. package/src/asset/loaders/audio.ts +23 -20
  463. package/src/asset/loaders/binary.ts +20 -16
  464. package/src/asset/loaders/bitmap-font.ts +91 -0
  465. package/src/asset/loaders/font.ts +18 -14
  466. package/src/asset/loaders/loader.ts +27 -23
  467. package/src/asset/loaders/spritesheet.ts +47 -36
  468. package/src/asset/loaders/text.ts +19 -15
  469. package/src/asset/loaders/texture.ts +30 -37
  470. package/src/asset/preload.ts +71 -64
  471. package/src/collision/check-collision.test.ts +349 -0
  472. package/src/collision/check-collision.ts +821 -0
  473. package/src/collision/colliders.ts +19 -0
  474. package/src/debug.ts +5 -0
  475. package/src/dom/dom-animated-sprite.ts +132 -0
  476. package/src/dom/dom-game-object.ts +134 -0
  477. package/src/dom/dom-particle.ts +151 -0
  478. package/src/dom/dom-preload.ts +54 -0
  479. package/src/dom/dom-sprite.ts +50 -0
  480. package/src/dom/dom-texture-loader.ts +44 -0
  481. package/src/dom/dom-utils.ts +19 -0
  482. package/src/index.ts +47 -13
  483. package/src/input/joystick.ts +316 -0
  484. package/src/node/core/dirty-number.ts +21 -0
  485. package/src/node/core/game-node.ts +74 -0
  486. package/src/node/core/game-object.ts +11 -0
  487. package/src/node/core/renderable.ts +72 -0
  488. package/src/node/core/transform.ts +82 -0
  489. package/src/node/core/transformable.ts +111 -0
  490. package/src/node/ext/animated-sprite.ts +103 -0
  491. package/src/node/ext/bitmap-text.ts +113 -0
  492. package/src/node/ext/circle.ts +55 -0
  493. package/src/node/ext/deplay.ts +25 -0
  494. package/src/node/ext/dom-container.ts +62 -0
  495. package/src/node/ext/interval.ts +25 -0
  496. package/src/node/ext/particle.ts +142 -0
  497. package/src/node/ext/rectangle.ts +71 -0
  498. package/src/node/ext/spine.ts +323 -0
  499. package/src/node/ext/sprite.ts +53 -0
  500. package/src/node/physics/physics-object.ts +127 -0
  501. package/src/node/physics/physics-world.ts +41 -0
  502. package/src/node/physics/rigidbodies.ts +14 -0
  503. package/src/renderer/camera.ts +25 -0
  504. package/src/renderer/container-manager.ts +36 -0
  505. package/src/renderer/fps-display.ts +21 -0
  506. package/src/renderer/layer.ts +15 -0
  507. package/src/renderer/renderer.ts +181 -0
  508. package/src/renderer/ticker.test.ts +325 -0
  509. package/src/renderer/ticker.ts +54 -0
  510. package/src/types/atlas.ts +17 -0
  511. package/src/types/bitmap-font.ts +19 -0
  512. package/src/utils/device.ts +1 -0
  513. package/examples/test-dom/index.ts +0 -21
  514. package/lib/game-object/game-object-physics.js +0 -188
  515. package/lib/game-object/game-object-physics.js.map +0 -1
  516. package/lib/game-object/game-object-rendering.js +0 -35
  517. package/lib/game-object/game-object-rendering.js.map +0 -1
  518. package/lib/game-object/game-object.js +0 -162
  519. package/lib/game-object/game-object.js.map +0 -1
  520. package/lib/game-object/transform.js +0 -118
  521. package/lib/game-object/transform.js.map +0 -1
  522. package/lib/game-object-ext/animated-sprite.js +0 -117
  523. package/lib/game-object-ext/animated-sprite.js.map +0 -1
  524. package/lib/game-object-ext/dom-container.js +0 -56
  525. package/lib/game-object-ext/dom-container.js.map +0 -1
  526. package/lib/game-object-ext/rect.js +0 -30
  527. package/lib/game-object-ext/rect.js.map +0 -1
  528. package/lib/game-object-ext/spine.js +0 -206
  529. package/lib/game-object-ext/spine.js.map +0 -1
  530. package/lib/game-object-ext/sprite.js +0 -46
  531. package/lib/game-object-ext/sprite.js.map +0 -1
  532. package/lib/game-object-ext/text.js +0 -68
  533. package/lib/game-object-ext/text.js.map +0 -1
  534. package/lib/game-object-ext/tiling-sprite.js +0 -64
  535. package/lib/game-object-ext/tiling-sprite.js.map +0 -1
  536. package/lib/types/game-object/game-object-physics.d.ts +0 -42
  537. package/lib/types/game-object/game-object-physics.d.ts.map +0 -1
  538. package/lib/types/game-object/game-object-rendering.d.ts +0 -15
  539. package/lib/types/game-object/game-object-rendering.d.ts.map +0 -1
  540. package/lib/types/game-object/game-object.d.ts +0 -81
  541. package/lib/types/game-object/game-object.d.ts.map +0 -1
  542. package/lib/types/game-object/transform.d.ts +0 -43
  543. package/lib/types/game-object/transform.d.ts.map +0 -1
  544. package/lib/types/game-object-ext/animated-sprite.d.ts +0 -29
  545. package/lib/types/game-object-ext/animated-sprite.d.ts.map +0 -1
  546. package/lib/types/game-object-ext/dom-container.d.ts +0 -16
  547. package/lib/types/game-object-ext/dom-container.d.ts.map +0 -1
  548. package/lib/types/game-object-ext/rect.d.ts +0 -17
  549. package/lib/types/game-object-ext/rect.d.ts.map +0 -1
  550. package/lib/types/game-object-ext/spine.d.ts +0 -35
  551. package/lib/types/game-object-ext/spine.d.ts.map +0 -1
  552. package/lib/types/game-object-ext/sprite.d.ts +0 -14
  553. package/lib/types/game-object-ext/sprite.d.ts.map +0 -1
  554. package/lib/types/game-object-ext/text.d.ts +0 -26
  555. package/lib/types/game-object-ext/text.d.ts.map +0 -1
  556. package/lib/types/game-object-ext/tiling-sprite.d.ts +0 -20
  557. package/lib/types/game-object-ext/tiling-sprite.d.ts.map +0 -1
  558. package/lib/types/utils/debug.d.ts.map +0 -1
  559. package/lib/types/utils/go.d.ts +0 -26
  560. package/lib/types/utils/go.d.ts.map +0 -1
  561. package/lib/types/world/world-debug.d.ts +0 -11
  562. package/lib/types/world/world-debug.d.ts.map +0 -1
  563. package/lib/types/world/world-physics.d.ts +0 -16
  564. package/lib/types/world/world-physics.d.ts.map +0 -1
  565. package/lib/types/world/world-rendering.d.ts +0 -28
  566. package/lib/types/world/world-rendering.d.ts.map +0 -1
  567. package/lib/types/world/world.d.ts +0 -38
  568. package/lib/types/world/world.d.ts.map +0 -1
  569. package/lib/utils/debug.js.map +0 -1
  570. package/lib/utils/go.js +0 -33
  571. package/lib/utils/go.js.map +0 -1
  572. package/lib/world/world-debug.js +0 -89
  573. package/lib/world/world-debug.js.map +0 -1
  574. package/lib/world/world-physics.js +0 -45
  575. package/lib/world/world-physics.js.map +0 -1
  576. package/lib/world/world-rendering.js +0 -123
  577. package/lib/world/world-rendering.js.map +0 -1
  578. package/lib/world/world.js +0 -147
  579. package/lib/world/world.js.map +0 -1
  580. package/src/game-object/game-object-physics.ts +0 -191
  581. package/src/game-object/game-object-rendering.ts +0 -27
  582. package/src/game-object/game-object.ts +0 -190
  583. package/src/game-object/transform.ts +0 -164
  584. package/src/game-object-ext/animated-sprite.ts +0 -140
  585. package/src/game-object-ext/dom-container.ts +0 -67
  586. package/src/game-object-ext/rect.ts +0 -40
  587. package/src/game-object-ext/spine.ts +0 -235
  588. package/src/game-object-ext/sprite.ts +0 -55
  589. package/src/game-object-ext/text.ts +0 -83
  590. package/src/game-object-ext/tiling-sprite.ts +0 -73
  591. package/src/utils/debug.ts +0 -5
  592. package/src/utils/go.ts +0 -53
  593. package/src/world/world-debug.ts +0 -114
  594. package/src/world/world-physics.ts +0 -52
  595. package/src/world/world-rendering.ts +0 -145
  596. package/src/world/world.ts +0 -171
  597. /package/examples/{test-dom → auto-battle}/index.html +0 -0
  598. /package/lib/{utils/debug.js → debug.js} +0 -0
  599. /package/lib/types/{utils/debug.d.ts → debug.d.ts} +0 -0
@@ -0,0 +1,366 @@
1
+ import { checkCollision, IntervalNode, isMobile, musicPlayer, PhysicsWorld } from '../../src'
2
+ import { Hero } from './objects/hero'
3
+ import { Orc } from './objects/orc'
4
+ import { Potion } from './objects/potion'
5
+
6
+ /** UI 헬퍼 */
7
+ function createTextElement() {
8
+ const el = document.createElement('div')
9
+ el.style.color = 'white'
10
+ el.style.position = 'absolute'
11
+ el.style.top = '10px'
12
+ el.style.zIndex = '1'
13
+ el.style.userSelect = 'none'
14
+ el.style.pointerEvents = 'none'
15
+ return el
16
+ }
17
+
18
+ /** 밸런스 상수 */
19
+ const SCORE_PER_ORC = 100
20
+ const ATTACK_COOLDOWN = 0.3
21
+ const SEEK_POTION_HP_THRESHOLD = 500
22
+ const STOP_DIST2 = 25 // 정지 판단 제곱거리(≈5px)
23
+
24
+ /**
25
+ * 메인 스테이지
26
+ * - 오브젝트 스폰
27
+ * - UI 갱신
28
+ * - 영웅 AI(FSM) 구동
29
+ */
30
+ export class Stage extends PhysicsWorld {
31
+ // === 게임 오브젝트 컨테이너 ===
32
+ #hero = new Hero()
33
+ #orcs: Set<Orc> = new Set()
34
+ #potions: Set<Potion> = new Set()
35
+
36
+ // === 게임 상태 ===
37
+ #time = 0
38
+ #score = 0
39
+ #isGameOver = false
40
+
41
+ // === UI 엘리먼트 ===
42
+ #timeText: HTMLDivElement
43
+ #hpText: HTMLDivElement
44
+ #scoreText: HTMLDivElement
45
+
46
+ // === 스폰 타이머 ===
47
+ #spawnOrcInterval: IntervalNode
48
+ #spawnPotionInterval: IntervalNode
49
+ #tickInterval: IntervalNode
50
+
51
+ // === 영웅 AI (FSM) ===
52
+ #aiState: 'idle' | 'chasing' | 'attacking' | 'returning' | 'seekingPotion' = 'idle'
53
+ #targetOrc?: Orc
54
+ #targetPotion?: Potion
55
+ #attackCooldown = 0
56
+ #homeX = 0
57
+ #homeY = 0
58
+
59
+ constructor() {
60
+ super()
61
+
62
+ // BGM
63
+ musicPlayer.play('assets/bgm/battle.mp3')
64
+
65
+ // 월드 구성
66
+ this.add(this.#hero)
67
+ this.add(this.#spawnOrcInterval = new IntervalNode(1, () => this.#spawnOrc()))
68
+ this.add(this.#spawnPotionInterval = new IntervalNode(3, () => this.#spawnPotion()))
69
+ this.add(this.#tickInterval = new IntervalNode(1, () => this.#tick()))
70
+
71
+ // UI 초기화
72
+ this.#timeText = createTextElement()
73
+ this.#hpText = createTextElement()
74
+ this.#scoreText = createTextElement()
75
+
76
+ this.#timeText.textContent = `Time: ${this.#time}`
77
+ this.#hpText.textContent = `HP: ${this.#hero.hp}`
78
+ this.#scoreText.textContent = `Score: ${this.#score}`
79
+
80
+ this.#timeText.style.left = '10px'
81
+ this.#hpText.style.left = '50%'
82
+ this.#hpText.style.transform = 'translate(-50%, 0)'
83
+ this.#scoreText.style.right = '10px'
84
+
85
+ // 이벤트 바인딩
86
+ this.#bindHeroEvents()
87
+
88
+ // 영웅 초기 위치를 "집"으로 저장
89
+ this.#homeX = this.#hero.x
90
+ this.#homeY = this.#hero.y
91
+ }
92
+
93
+ /** 주기적 시각/스코어 갱신 */
94
+ #tick() {
95
+ this.#time += 1
96
+ this.#timeText.textContent = `Time: ${this.#time}`
97
+ // HP/Score는 각각 변경 시점 이벤트에서 갱신
98
+ }
99
+
100
+ /** 영웅-오크-포션 충돌/전투 이벤트 */
101
+ #bindHeroEvents() {
102
+ // 영웅 공격 성공 시 오크에게 피해 적용
103
+ this.#hero.on('hit', (damage: number) => {
104
+ for (const o of this.#orcs) {
105
+ if (checkCollision(this.#hero.hitbox, this.#hero.worldTransform, o.hurtbox, o.worldTransform)) {
106
+ o.takeDamage(damage)
107
+ }
108
+ }
109
+ })
110
+
111
+ // HP 변동 UI
112
+ this.#hero.on('changeHp', () => {
113
+ this.#hpText.textContent = `HP: ${this.#hero.hp}`
114
+ })
115
+
116
+ // 영웅 사망 처리
117
+ this.#hero.on('dead', () => {
118
+ this.#gameOver()
119
+ })
120
+ }
121
+
122
+ /** 게임오버 처리 */
123
+ #gameOver() {
124
+ if (this.#isGameOver) return
125
+ this.#isGameOver = true
126
+
127
+ this.#spawnOrcInterval.remove()
128
+ this.#spawnPotionInterval.remove()
129
+ this.#tickInterval.remove()
130
+
131
+ for (const o of this.#orcs) o.stop()
132
+
133
+ const gameOverText = createTextElement()
134
+ gameOverText.textContent = 'Game Over'
135
+ gameOverText.style.left = '50%'
136
+ gameOverText.style.top = '50%'
137
+ gameOverText.style.transform = 'translate(-50%, -50%)'
138
+ gameOverText.style.fontSize = '32px'
139
+ this.renderer?.container.append(gameOverText)
140
+ }
141
+
142
+ // ==== 렌더러 연결 시 UI 붙이기 ====
143
+ protected override set renderer(renderer) {
144
+ super.renderer = renderer
145
+ if (renderer) {
146
+ const c = renderer.container
147
+ c.append(this.#timeText, this.#hpText, this.#scoreText)
148
+ }
149
+ }
150
+ protected override get renderer() {
151
+ return super.renderer
152
+ }
153
+
154
+ // ==== 스폰 로직 ====
155
+ #spawnOrc() {
156
+ const o = new Orc()
157
+ o.x = Math.random() * 800 - 400
158
+ o.y = Math.random() * 600 - 300
159
+
160
+ // 오크 공격 → 영웅 피해
161
+ o.on('hit', (damage: number) => {
162
+ if (checkCollision(this.#hero.hurtbox, this.#hero.worldTransform, o.hitbox, o.worldTransform)) {
163
+ this.#hero.takeDamage(damage)
164
+ }
165
+ })
166
+
167
+ // 오크 제거 및 점수 반영
168
+ o.on('dead', () => {
169
+ this.#orcs.delete(o)
170
+ this.#score += SCORE_PER_ORC
171
+ this.#scoreText.textContent = `Score: ${this.#score}`
172
+ })
173
+
174
+ this.add(o)
175
+ this.#orcs.add(o)
176
+ }
177
+
178
+ #spawnPotion() {
179
+ const p = new Potion()
180
+ p.x = Math.random() * 800 - 400
181
+ p.y = Math.random() * 600 - 300
182
+ this.add(p)
183
+ this.#potions.add(p)
184
+ p.on('remove', () => this.#potions.delete(p))
185
+ }
186
+
187
+ // ==== 유틸: 가장 가까운 오크/포션 ====
188
+ #getClosestOrc(): Orc | undefined {
189
+ let best: Orc | undefined
190
+ let minD2 = Infinity
191
+ for (const o of this.#orcs) {
192
+ if (o.dead) continue
193
+ const dx = o.x - this.#hero.x
194
+ const dy = o.y - this.#hero.y
195
+ const d2 = dx * dx + dy * dy
196
+ if (d2 < minD2) { minD2 = d2; best = o }
197
+ }
198
+ return best
199
+ }
200
+
201
+ #getClosestPotion(): Potion | undefined {
202
+ let best: Potion | undefined
203
+ let minD2 = Infinity
204
+ for (const p of this.#potions) {
205
+ const dx = p.x - this.#hero.x
206
+ const dy = p.y - this.#hero.y
207
+ const d2 = dx * dx + dy * dy
208
+ if (d2 < minD2) { minD2 = d2; best = p }
209
+ }
210
+ return best
211
+ }
212
+
213
+ // ==== 메인 업데이트 ====
214
+ protected override update(dt: number) {
215
+ if (this.paused) return
216
+ super.update(dt)
217
+
218
+ if (this.#isGameOver) return
219
+
220
+ const h = this.#hero
221
+ if (h.dead) return
222
+
223
+ // ===== 오크 AI(영웅 추적/공격) =====
224
+ for (const o of this.#orcs) {
225
+ if (checkCollision(h.hurtbox, h.worldTransform, o.hitbox, o.worldTransform)) {
226
+ o.attack()
227
+ } else {
228
+ o.moveTo(h.x, h.y)
229
+ }
230
+
231
+ // 모바일에서 근접 시 자동 공격(품질 개선)
232
+ if (isMobile && checkCollision(h.hitbox, h.worldTransform, o.hurtbox, o.worldTransform)) {
233
+ h.attack()
234
+ }
235
+ }
236
+
237
+ // ===== 포션 줍기(충돌은 월드가 처리, heal & remove는 아래 루프에서) =====
238
+ for (const p of this.#potions) {
239
+ if (checkCollision(h.hitbox, h.worldTransform, p.triggerCollider, p.worldTransform)) {
240
+ h.heal(p.healAmount)
241
+ this.#hpText.textContent = `HP: ${h.hp}`
242
+ p.remove()
243
+ }
244
+ }
245
+
246
+ // ===== 영웅 AI(FSM) =====
247
+
248
+ // 1) HP 낮으면 포션 최우선
249
+ if (h.hp < SEEK_POTION_HP_THRESHOLD && this.#potions.size > 0) {
250
+ const closest = this.#getClosestPotion()
251
+ if (closest) {
252
+ this.#targetPotion = closest
253
+ this.#aiState = 'seekingPotion'
254
+ }
255
+ } else if (this.#aiState === 'seekingPotion') {
256
+ // 임계치 해소되면 취소
257
+ this.#targetPotion = undefined
258
+ this.#aiState = 'idle'
259
+ }
260
+
261
+ switch (this.#aiState) {
262
+ case 'idle': {
263
+ // 타겟 오크 탐색
264
+ const tgt = this.#getClosestOrc()
265
+ if (tgt) {
266
+ this.#targetOrc = tgt
267
+ this.#aiState = 'chasing'
268
+ } else {
269
+ // 적이 없으면 집으로 복귀
270
+ this.#aiState = 'returning'
271
+ }
272
+ break
273
+ }
274
+
275
+ case 'chasing': {
276
+ const t = this.#targetOrc
277
+ if (!t || t.dead) {
278
+ const nxt = this.#getClosestOrc()
279
+ if (nxt) {
280
+ this.#targetOrc = nxt
281
+ } else {
282
+ this.#targetOrc = undefined
283
+ this.#aiState = 'returning'
284
+ }
285
+ break
286
+ }
287
+
288
+ const inRange = checkCollision(h.hitbox, h.worldTransform, t.hurtbox, t.worldTransform)
289
+ if (!inRange) {
290
+ h.moveTo(t.x, t.y)
291
+ } else {
292
+ // 정지(엔진에 stop이 없으면 현재 위치로 moveTo)
293
+ if ((h as any).stop) (h as any).stop()
294
+ else h.moveTo(h.x, h.y)
295
+
296
+ h.attack()
297
+ this.#attackCooldown = ATTACK_COOLDOWN
298
+ this.#aiState = 'attacking'
299
+ }
300
+ break
301
+ }
302
+
303
+ case 'attacking': {
304
+ const t = this.#targetOrc
305
+ if (!t || t.dead) {
306
+ const nxt = this.#getClosestOrc()
307
+ if (nxt) {
308
+ this.#targetOrc = nxt
309
+ this.#aiState = 'chasing'
310
+ } else {
311
+ this.#targetOrc = undefined
312
+ this.#aiState = 'returning'
313
+ }
314
+ this.#attackCooldown = 0
315
+ break
316
+ }
317
+
318
+ if (this.#attackCooldown <= 0) {
319
+ const inRange = checkCollision(h.hitbox, h.worldTransform, t.hurtbox, t.worldTransform)
320
+ if (inRange) {
321
+ h.attack()
322
+ this.#attackCooldown = ATTACK_COOLDOWN
323
+ } else {
324
+ this.#aiState = 'chasing'
325
+ }
326
+ } else {
327
+ this.#attackCooldown -= dt
328
+ }
329
+ break
330
+ }
331
+
332
+ case 'returning': {
333
+ const dx = this.#homeX - h.x
334
+ const dy = this.#homeY - h.y
335
+ const d2 = dx * dx + dy * dy
336
+ if (d2 > STOP_DIST2) {
337
+ h.moveTo(this.#homeX, this.#homeY)
338
+ } else {
339
+ if ((h as any).stop) (h as any).stop()
340
+ else h.moveTo(h.x, h.y)
341
+ this.#aiState = 'idle'
342
+ }
343
+ break
344
+ }
345
+
346
+ case 'seekingPotion': {
347
+ const p = this.#targetPotion
348
+ if (!p) {
349
+ this.#aiState = 'idle'
350
+ break
351
+ }
352
+ const dx = p.x - h.x
353
+ const dy = p.y - h.y
354
+ const d2 = dx * dx + dy * dy
355
+ if (d2 > STOP_DIST2) {
356
+ h.moveTo(p.x, p.y)
357
+ } else {
358
+ if ((h as any).stop) (h as any).stop()
359
+ else h.moveTo(h.x, h.y)
360
+ // 실제 힐/삭제는 위 충돌 루프에서 처리
361
+ }
362
+ break
363
+ }
364
+ }
365
+ }
366
+ }
@@ -0,0 +1,107 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--Created using Glyph Designer - http://71squared.com/glyphdesigner-->
3
+ <font>
4
+ <info face="Peaberry" size="16" bold="0" italic="0" charset="" unicode="0" stretchH="100" smooth="1" aa="1" padding="0,0,0,0" spacing="2,2"/>
5
+ <common lineHeight="25" base="13" scaleW="215" scaleH="245" pages="1" packed="0"/>
6
+ <pages>
7
+ <page id="0" file="WhitePeaberry.png"/>
8
+ </pages>
9
+ <chars count="95">
10
+ <char id="32" x="20" y="208" width="0" height="0" xoffset="0" yoffset="27" xadvance="5" page="0" chnl="0" letter="space"/>
11
+ <char id="33" x="198" y="2" width="14" height="23" xoffset="-2" yoffset="5" xadvance="7" page="0" chnl="0" letter="!"/>
12
+ <char id="34" x="109" y="188" width="17" height="15" xoffset="-3" yoffset="5" xadvance="9" page="0" chnl="0" letter="&quot;"/>
13
+ <char id="35" x="149" y="29" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="#"/>
14
+ <char id="36" x="178" y="2" width="18" height="23" xoffset="-3" yoffset="5" xadvance="10" page="0" chnl="0" letter="$"/>
15
+ <char id="37" x="126" y="29" width="21" height="21" xoffset="-4" yoffset="6" xadvance="12" page="0" chnl="0" letter="%"/>
16
+ <char id="38" x="134" y="53" width="19" height="21" xoffset="-3" yoffset="6" xadvance="11" page="0" chnl="0" letter="&amp;"/>
17
+ <char id="39" x="77" y="188" width="14" height="16" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="0" letter="'"/>
18
+ <char id="40" x="56" y="2" width="15" height="25" xoffset="-2" yoffset="5" xadvance="8" page="0" chnl="0" letter="("/>
19
+ <char id="41" x="73" y="2" width="15" height="25" xoffset="-2" yoffset="5" xadvance="8" page="0" chnl="0" letter=")"/>
20
+ <char id="42" x="134" y="145" width="18" height="19" xoffset="-2" yoffset="5" xadvance="11" page="0" chnl="0" letter="*"/>
21
+ <char id="43" x="45" y="168" width="18" height="18" xoffset="-2" yoffset="7" xadvance="11" page="0" chnl="0" letter="+"/>
22
+ <char id="44" x="93" y="188" width="14" height="16" xoffset="-3" yoffset="14" xadvance="6" page="0" chnl="0" letter=","/>
23
+ <char id="45" x="2" y="208" width="16" height="12" xoffset="-1" yoffset="12" xadvance="10" page="0" chnl="0" letter="-"/>
24
+ <char id="46" x="167" y="188" width="14" height="14" xoffset="-3" yoffset="13" xadvance="6" page="0" chnl="0" letter="."/>
25
+ <char id="47" x="42" y="29" width="16" height="22" xoffset="-4" yoffset="5" xadvance="7" page="0" chnl="0" letter="/"/>
26
+ <char id="48" x="176" y="53" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="0"/>
27
+ <char id="49" x="2" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="1"/>
28
+ <char id="50" x="22" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="2"/>
29
+ <char id="51" x="42" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="3"/>
30
+ <char id="52" x="62" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="4"/>
31
+ <char id="53" x="82" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="5"/>
32
+ <char id="54" x="102" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="6"/>
33
+ <char id="55" x="122" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="7"/>
34
+ <char id="56" x="142" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="8"/>
35
+ <char id="57" x="162" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="9"/>
36
+ <char id="58" x="118" y="145" width="14" height="20" xoffset="-3" yoffset="8" xadvance="6" page="0" chnl="0" letter=":"/>
37
+ <char id="59" x="78" y="29" width="14" height="22" xoffset="-3" yoffset="8" xadvance="6" page="0" chnl="0" letter=";"/>
38
+ <char id="60" x="42" y="145" width="17" height="21" xoffset="-3" yoffset="5" xadvance="9" page="0" chnl="0" letter="&lt;"/>
39
+ <char id="61" x="58" y="188" width="17" height="16" xoffset="-3" yoffset="8" xadvance="9" page="0" chnl="0" letter="="/>
40
+ <char id="62" x="61" y="145" width="17" height="21" xoffset="-3" yoffset="5" xadvance="9" page="0" chnl="0" letter="&gt;"/>
41
+ <char id="63" x="136" y="2" width="18" height="24" xoffset="-3" yoffset="5" xadvance="10" page="0" chnl="0" letter="?"/>
42
+ <char id="64" x="171" y="29" width="20" height="21" xoffset="-4" yoffset="8" xadvance="11" page="0" chnl="0" letter="@"/>
43
+ <char id="65" x="193" y="29" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="A"/>
44
+ <char id="66" x="182" y="76" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="B"/>
45
+ <char id="67" x="2" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="C"/>
46
+ <char id="68" x="22" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="D"/>
47
+ <char id="69" x="42" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="E"/>
48
+ <char id="70" x="62" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="F"/>
49
+ <char id="71" x="82" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="G"/>
50
+ <char id="72" x="102" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="H"/>
51
+ <char id="73" x="122" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="I"/>
52
+ <char id="74" x="142" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="J"/>
53
+ <char id="75" x="155" y="53" width="19" height="21" xoffset="-3" yoffset="6" xadvance="11" page="0" chnl="0" letter="K"/>
54
+ <char id="76" x="162" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="L"/>
55
+ <char id="77" x="2" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="M"/>
56
+ <char id="78" x="182" y="99" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="N"/>
57
+ <char id="79" x="24" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="O"/>
58
+ <char id="80" x="2" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="P"/>
59
+ <char id="81" x="156" y="2" width="20" height="23" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="Q"/>
60
+ <char id="82" x="22" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="R"/>
61
+ <char id="83" x="42" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="S"/>
62
+ <char id="84" x="62" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="T"/>
63
+ <char id="85" x="82" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="U"/>
64
+ <char id="86" x="46" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="V"/>
65
+ <char id="87" x="68" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="W"/>
66
+ <char id="88" x="90" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="X"/>
67
+ <char id="89" x="112" y="53" width="20" height="21" xoffset="-4" yoffset="6" xadvance="11" page="0" chnl="0" letter="Y"/>
68
+ <char id="90" x="102" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="Z"/>
69
+ <char id="91" x="90" y="2" width="14" height="25" xoffset="-3" yoffset="5" xadvance="6" page="0" chnl="0" letter="["/>
70
+ <char id="92" x="60" y="29" width="16" height="22" xoffset="-4" yoffset="5" xadvance="7" page="0" chnl="0" letter="\"/>
71
+ <char id="93" x="106" y="2" width="14" height="25" xoffset="-3" yoffset="5" xadvance="6" page="0" chnl="0" letter="]"/>
72
+ <char id="94" x="154" y="145" width="20" height="18" xoffset="-4" yoffset="5" xadvance="11" page="0" chnl="0" letter="^"/>
73
+ <char id="95" x="183" y="188" width="18" height="12" xoffset="-3" yoffset="18" xadvance="10" page="0" chnl="0" letter="_"/>
74
+ <char id="96" x="150" y="188" width="15" height="14" xoffset="-4" yoffset="5" xadvance="6" page="0" chnl="0" letter="`"/>
75
+ <char id="97" x="24" y="168" width="19" height="18" xoffset="-4" yoffset="9" xadvance="10" page="0" chnl="0" letter="a"/>
76
+ <char id="98" x="122" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="b"/>
77
+ <char id="99" x="2" y="188" width="17" height="18" xoffset="-3" yoffset="9" xadvance="9" page="0" chnl="0" letter="c"/>
78
+ <char id="100" x="142" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="d"/>
79
+ <char id="101" x="21" y="188" width="17" height="18" xoffset="-3" yoffset="9" xadvance="9" page="0" chnl="0" letter="e"/>
80
+ <char id="102" x="162" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="f"/>
81
+ <char id="103" x="2" y="29" width="18" height="22" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="g"/>
82
+ <char id="104" x="182" y="122" width="18" height="21" xoffset="-3" yoffset="6" xadvance="10" page="0" chnl="0" letter="h"/>
83
+ <char id="105" x="94" y="29" width="14" height="22" xoffset="-1" yoffset="5" xadvance="8" page="0" chnl="0" letter="i"/>
84
+ <char id="106" x="2" y="2" width="16" height="25" xoffset="-2" yoffset="5" xadvance="9" page="0" chnl="0" letter="j"/>
85
+ <char id="107" x="80" y="145" width="17" height="21" xoffset="-2" yoffset="6" xadvance="10" page="0" chnl="0" letter="k"/>
86
+ <char id="108" x="110" y="29" width="14" height="22" xoffset="-1" yoffset="5" xadvance="8" page="0" chnl="0" letter="l"/>
87
+ <char id="109" x="176" y="145" width="20" height="18" xoffset="-4" yoffset="9" xadvance="11" page="0" chnl="0" letter="m"/>
88
+ <char id="110" x="65" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="n"/>
89
+ <char id="111" x="85" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="o"/>
90
+ <char id="112" x="2" y="145" width="18" height="21" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="p"/>
91
+ <char id="113" x="22" y="145" width="18" height="21" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="q"/>
92
+ <char id="114" x="105" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="r"/>
93
+ <char id="115" x="40" y="188" width="16" height="18" xoffset="-2" yoffset="9" xadvance="9" page="0" chnl="0" letter="s"/>
94
+ <char id="116" x="99" y="145" width="17" height="21" xoffset="-3" yoffset="6" xadvance="9" page="0" chnl="0" letter="t"/>
95
+ <char id="117" x="125" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="u"/>
96
+ <char id="118" x="145" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="v"/>
97
+ <char id="119" x="2" y="168" width="20" height="18" xoffset="-4" yoffset="9" xadvance="11" page="0" chnl="0" letter="w"/>
98
+ <char id="120" x="165" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="x"/>
99
+ <char id="121" x="22" y="29" width="18" height="22" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="y"/>
100
+ <char id="122" x="185" y="168" width="18" height="18" xoffset="-3" yoffset="9" xadvance="10" page="0" chnl="0" letter="z"/>
101
+ <char id="123" x="20" y="2" width="16" height="25" xoffset="-4" yoffset="5" xadvance="7" page="0" chnl="0" letter="{"/>
102
+ <char id="124" x="122" y="2" width="12" height="25" xoffset="-3" yoffset="5" xadvance="4" page="0" chnl="0" letter="|"/>
103
+ <char id="125" x="38" y="2" width="16" height="25" xoffset="-4" yoffset="5" xadvance="7" page="0" chnl="0" letter="}"/>
104
+ <char id="126" x="128" y="188" width="20" height="14" xoffset="-4" yoffset="10" xadvance="11" page="0" chnl="0" letter="~"/>
105
+ </chars>
106
+ <kernings count="0"/>
107
+ </font>