kiwiengine 0.5.2 → 0.5.4

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 (325) hide show
  1. package/README.ko.md +2 -2
  2. package/README.md +2 -2
  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/dom-sprite-test/index.ts +6 -9
  155. package/examples/simple-battle/assets/spritesheets/hero-atlas.json +180 -223
  156. package/examples/simple-battle/assets/spritesheets/orc-atlas.json +180 -223
  157. package/examples/simple-battle/assets/spritesheets/potion-atlas.json +46 -61
  158. package/examples/simple-battle/hud/damage-text.ts +1 -0
  159. package/examples/simple-battle/hud/heal-text.ts +1 -0
  160. package/examples/simple-battle/objects/character.ts +3 -3
  161. package/examples/simple-battle/objects/hero.ts +3 -5
  162. package/examples/simple-battle/objects/orc.ts +3 -5
  163. package/examples/simple-battle/objects/potion.ts +0 -2
  164. package/examples/simple-battle/stage.ts +2 -4
  165. package/examples/sprite-test/index.ts +6 -9
  166. package/examples/webpack.config.js +4 -1
  167. package/lib/asset/loaders/audio.js +4 -1
  168. package/lib/asset/loaders/audio.js.map +1 -1
  169. package/lib/asset/loaders/binary.js +4 -1
  170. package/lib/asset/loaders/binary.js.map +1 -1
  171. package/lib/asset/loaders/bitmap-font.js +24 -21
  172. package/lib/asset/loaders/bitmap-font.js.map +1 -1
  173. package/lib/asset/loaders/font.js +3 -0
  174. package/lib/asset/loaders/font.js.map +1 -1
  175. package/lib/asset/loaders/spritesheet.js +12 -1
  176. package/lib/asset/loaders/spritesheet.js.map +1 -1
  177. package/lib/asset/loaders/text.js +3 -0
  178. package/lib/asset/loaders/text.js.map +1 -1
  179. package/lib/asset/loaders/texture.js +21 -26
  180. package/lib/asset/loaders/texture.js.map +1 -1
  181. package/lib/asset/preload.js.map +1 -1
  182. package/lib/collision/check-collision.js +16 -16
  183. package/lib/collision/check-collision.js.map +1 -1
  184. package/lib/dom/dom-animated-sprite.js +21 -36
  185. package/lib/dom/dom-animated-sprite.js.map +1 -1
  186. package/lib/dom/dom-game-object.js +9 -7
  187. package/lib/dom/dom-game-object.js.map +1 -1
  188. package/lib/dom/dom-particle.js.map +1 -1
  189. package/lib/index.js +1 -0
  190. package/lib/index.js.map +1 -1
  191. package/lib/node/core/dirty-number.js +0 -19
  192. package/lib/node/core/dirty-number.js.map +1 -1
  193. package/lib/node/core/renderable.js +7 -0
  194. package/lib/node/core/renderable.js.map +1 -1
  195. package/lib/node/core/transform.js +22 -11
  196. package/lib/node/core/transform.js.map +1 -1
  197. package/lib/node/ext/animated-sprite.js +3 -22
  198. package/lib/node/ext/animated-sprite.js.map +1 -1
  199. package/lib/node/ext/bitmap-text.js +7 -3
  200. package/lib/node/ext/bitmap-text.js.map +1 -1
  201. package/lib/node/ext/circle.js +18 -3
  202. package/lib/node/ext/circle.js.map +1 -1
  203. package/lib/node/ext/deplay.js +2 -0
  204. package/lib/node/ext/deplay.js.map +1 -1
  205. package/lib/node/ext/dom-container.js +2 -2
  206. package/lib/node/ext/dom-container.js.map +1 -1
  207. package/lib/node/ext/interval.js +2 -0
  208. package/lib/node/ext/interval.js.map +1 -1
  209. package/lib/node/ext/particle.js.map +1 -1
  210. package/lib/node/ext/rectangle.js +24 -4
  211. package/lib/node/ext/rectangle.js.map +1 -1
  212. package/lib/node/physics/physics-object.js +9 -29
  213. package/lib/node/physics/physics-object.js.map +1 -1
  214. package/lib/node/physics/physics-world.js +2 -0
  215. package/lib/node/physics/physics-world.js.map +1 -1
  216. package/lib/node/physics/rigidbodies.js +7 -0
  217. package/lib/node/physics/rigidbodies.js.map +1 -0
  218. package/lib/renderer/renderer.js +3 -2
  219. package/lib/renderer/renderer.js.map +1 -1
  220. package/lib/types/animation-atlas.js +2 -0
  221. package/lib/types/animation-atlas.js.map +1 -0
  222. package/lib/types/asset/loaders/audio.d.ts +1 -0
  223. package/lib/types/asset/loaders/audio.d.ts.map +1 -1
  224. package/lib/types/asset/loaders/binary.d.ts +1 -0
  225. package/lib/types/asset/loaders/binary.d.ts.map +1 -1
  226. package/lib/types/asset/loaders/bitmap-font.d.ts +1 -0
  227. package/lib/types/asset/loaders/bitmap-font.d.ts.map +1 -1
  228. package/lib/types/asset/loaders/font.d.ts +1 -0
  229. package/lib/types/asset/loaders/font.d.ts.map +1 -1
  230. package/lib/types/asset/loaders/spritesheet.d.ts +11 -3
  231. package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -1
  232. package/lib/types/asset/loaders/text.d.ts +1 -0
  233. package/lib/types/asset/loaders/text.d.ts.map +1 -1
  234. package/lib/types/asset/loaders/texture.d.ts +1 -1
  235. package/lib/types/asset/loaders/texture.d.ts.map +1 -1
  236. package/lib/types/asset/preload.d.ts +2 -2
  237. package/lib/types/asset/preload.d.ts.map +1 -1
  238. package/lib/types/atlas copy.js +2 -0
  239. package/lib/types/atlas copy.js.map +1 -0
  240. package/lib/types/atlas.js +2 -0
  241. package/lib/types/atlas.js.map +1 -0
  242. package/lib/types/dom/dom-animated-sprite.d.ts +4 -10
  243. package/lib/types/dom/dom-animated-sprite.d.ts.map +1 -1
  244. package/lib/types/dom/dom-game-object.d.ts +1 -1
  245. package/lib/types/dom/dom-game-object.d.ts.map +1 -1
  246. package/lib/types/dom/dom-particle.d.ts.map +1 -1
  247. package/lib/types/index.d.ts +2 -0
  248. package/lib/types/index.d.ts.map +1 -1
  249. package/lib/types/node/core/dirty-number.d.ts +0 -8
  250. package/lib/types/node/core/dirty-number.d.ts.map +1 -1
  251. package/lib/types/node/core/renderable.d.ts +1 -0
  252. package/lib/types/node/core/renderable.d.ts.map +1 -1
  253. package/lib/types/node/core/transform.d.ts +4 -2
  254. package/lib/types/node/core/transform.d.ts.map +1 -1
  255. package/lib/types/node/ext/animated-sprite.d.ts +4 -10
  256. package/lib/types/node/ext/animated-sprite.d.ts.map +1 -1
  257. package/lib/types/node/ext/bitmap-text.d.ts.map +1 -1
  258. package/lib/types/node/ext/circle.d.ts +3 -3
  259. package/lib/types/node/ext/circle.d.ts.map +1 -1
  260. package/lib/types/node/ext/deplay.d.ts.map +1 -1
  261. package/lib/types/node/ext/dom-container.d.ts +1 -1
  262. package/lib/types/node/ext/dom-container.d.ts.map +1 -1
  263. package/lib/types/node/ext/interval.d.ts.map +1 -1
  264. package/lib/types/node/ext/particle.d.ts.map +1 -1
  265. package/lib/types/node/ext/rectangle.d.ts +4 -4
  266. package/lib/types/node/ext/rectangle.d.ts.map +1 -1
  267. package/lib/types/node/physics/physics-object.d.ts +2 -2
  268. package/lib/types/node/physics/physics-object.d.ts.map +1 -1
  269. package/lib/types/node/physics/physics-world.d.ts.map +1 -1
  270. package/lib/types/node/physics/rigidbodies.d.ts +23 -0
  271. package/lib/types/node/physics/rigidbodies.d.ts.map +1 -0
  272. package/lib/types/renderer/renderer.d.ts.map +1 -1
  273. package/lib/types/sprite-atlas.js +2 -0
  274. package/lib/types/sprite-atlas.js.map +1 -0
  275. package/lib/types/types/animation-atlas.d.ts +14 -0
  276. package/lib/types/types/animation-atlas.d.ts.map +1 -0
  277. package/lib/types/types/atlas copy.d.ts +12 -0
  278. package/lib/types/types/atlas copy.d.ts.map +1 -0
  279. package/lib/types/types/atlas.d.ts +16 -0
  280. package/lib/types/types/atlas.d.ts.map +1 -0
  281. package/lib/types/types/sprite-atlas.d.ts +13 -0
  282. package/lib/types/types/sprite-atlas.d.ts.map +1 -0
  283. package/package.json +1 -1
  284. package/src/asset/loaders/audio.ts +5 -2
  285. package/src/asset/loaders/binary.ts +5 -1
  286. package/src/asset/loaders/bitmap-font.ts +33 -27
  287. package/src/asset/loaders/font.ts +4 -0
  288. package/src/asset/loaders/spritesheet.ts +18 -5
  289. package/src/asset/loaders/text.ts +4 -0
  290. package/src/asset/loaders/texture.ts +19 -27
  291. package/src/asset/preload.ts +4 -8
  292. package/src/collision/check-collision.ts +16 -16
  293. package/src/dom/dom-animated-sprite.ts +24 -45
  294. package/src/dom/dom-game-object.ts +9 -6
  295. package/src/dom/dom-particle.ts +1 -1
  296. package/src/index.ts +2 -0
  297. package/src/node/core/dirty-number.ts +0 -24
  298. package/src/node/core/renderable.ts +7 -0
  299. package/src/node/core/transform.ts +23 -11
  300. package/src/node/ext/animated-sprite.ts +9 -29
  301. package/src/node/ext/bitmap-text.ts +7 -3
  302. package/src/node/ext/circle.ts +18 -3
  303. package/src/node/ext/deplay.ts +1 -0
  304. package/src/node/ext/dom-container.ts +2 -2
  305. package/src/node/ext/interval.ts +1 -0
  306. package/src/node/ext/particle.ts +1 -1
  307. package/src/node/ext/rectangle.ts +24 -4
  308. package/src/node/physics/physics-object.ts +11 -40
  309. package/src/node/physics/physics-world.ts +1 -0
  310. package/src/node/physics/rigidbodies.ts +14 -0
  311. package/src/renderer/renderer.ts +4 -3
  312. package/src/types/atlas.ts +17 -0
  313. package/examples/flappy-cat/assets/bgm/bgm.ogg +0 -0
  314. package/examples/flappy-cat/assets/images/base.png +0 -0
  315. package/examples/flappy-cat/assets/images/bg.png +0 -0
  316. package/examples/flappy-cat/assets/images/cat.png +0 -0
  317. package/examples/flappy-cat/assets/images/pipe-green.png +0 -0
  318. package/examples/flappy-cat/assets/images/pipe-red.png +0 -0
  319. package/examples/flappy-cat/assets/sfx/die.wav +0 -0
  320. package/examples/flappy-cat/assets/sfx/hit.wav +0 -0
  321. package/examples/flappy-cat/assets/sfx/point.wav +0 -0
  322. package/examples/flappy-cat/assets/sfx/wing.wav +0 -0
  323. package/examples/flappy-cat/dist/game.js +0 -0
  324. package/examples/flappy-cat/index.ts +0 -0
  325. /package/examples/{flappy-cat → auto-battle}/index.html +0 -0
@@ -0,0 +1,213 @@
1
+ import {
2
+ AnimatedSpriteNode,
3
+ ColliderType,
4
+ DelayNode,
5
+ GameObjectOptions,
6
+ RigidbodyType,
7
+ sfxPlayer,
8
+ } from '../../../src/index'
9
+ import orcAtlas from '../assets/spritesheets/orc-atlas.json'
10
+ import { Character } from './character'
11
+
12
+ const ORC_MOVE_SPEED = 3 as const // 엔진이 dt(초)를 주면 아래 step 계산 주석 참고
13
+ const ORC_HITBOX_X = 24 as const
14
+ const ORC_ATTACK_DAMAGE = 1 as const
15
+ const EPS = 1e-3 // 스냅/오버슈트 방지용
16
+ const EPS2 = EPS * EPS
17
+
18
+ export class Orc extends Character<{
19
+ hit: (damage: number) => void
20
+ dead: () => void
21
+ }> {
22
+ protected _sprite: AnimatedSpriteNode
23
+
24
+ // ── 타겟/방향(정규화) ─────────────────────────────────────────────
25
+ #tx: number | null = null
26
+ #ty: number | null = null
27
+ #dirX = 0
28
+ #dirY = 0
29
+ #moveSpeed = ORC_MOVE_SPEED
30
+
31
+ // ── 상태 ─────────────────────────────────────────────────────────
32
+ #attacking = false
33
+
34
+ constructor(options?: GameObjectOptions) {
35
+ super({
36
+ ...options,
37
+ maxHp: 100,
38
+ hp: 100,
39
+ rigidbody: { type: RigidbodyType.Rectangle, width: 30, height: 30 },
40
+ hitbox: { type: ColliderType.Rectangle, width: 32, height: 52, x: ORC_HITBOX_X, y: -8 },
41
+ hurtbox: { type: ColliderType.Rectangle, width: 24, height: 32, x: 0, y: 0 },
42
+ })
43
+
44
+ this._sprite = new AnimatedSpriteNode({
45
+ src: 'assets/spritesheets/orc.png',
46
+ atlas: orcAtlas,
47
+ animation: 'idle',
48
+ scale: 2,
49
+ })
50
+
51
+ this._sprite.on('animationend', (animation: string) => {
52
+ if (animation.startsWith('attack')) {
53
+ this.#attacking = false
54
+ // 이동 중이면 walk, 아니면 idle (중복 전환 방지)
55
+ if (this.#isMoving()) this.#setWalk()
56
+ else this.#setIdle()
57
+ } else if (animation === 'die') {
58
+ this.emit('dead')
59
+ }
60
+ })
61
+
62
+ this.add(this._sprite)
63
+ }
64
+
65
+ // ── 외부 인터페이스 ──────────────────────────────────────────────
66
+ moveTo(x: number, y: number) {
67
+ if (this.dead) return
68
+ this.#tx = x
69
+ this.#ty = y
70
+
71
+ // 방향 벡터 미리 정규화(삼각함수 없음)
72
+ const dx = x - this.x
73
+ const dy = y - this.y
74
+ const len2 = dx * dx + dy * dy
75
+ if (len2 > EPS2) {
76
+ // 역길이 계산(정확 sqrt 대신 1/sqrt 사용; JS에 fast invsqrt 없음)
77
+ const invLen = 1 / Math.sqrt(len2)
78
+ this.#dirX = dx * invLen
79
+ this.#dirY = dy * invLen
80
+ } else {
81
+ this.#dirX = 0
82
+ this.#dirY = 0
83
+ }
84
+
85
+ // 좌우 플립/히트박스 오프셋(부호만 필요)
86
+ const scale = Math.abs(this._sprite.scaleX)
87
+ this._sprite.scaleX = dx >= 0 ? scale : -scale
88
+ this.hitboxX = dx >= 0 ? ORC_HITBOX_X : -ORC_HITBOX_X
89
+
90
+ if (!this.#attacking) this.#setWalk()
91
+ }
92
+
93
+ stop() {
94
+ this.#tx = null
95
+ this.#ty = null
96
+ this.#dirX = 0
97
+ this.#dirY = 0
98
+ if (!this.#attacking && !this.dead) this.#setIdle()
99
+ }
100
+
101
+ attack() {
102
+ if (this.dead || this.#attacking) return
103
+ this.#attacking = true
104
+ // 이동 즉시 정지(불필요한 계산 차단)
105
+ this.#tx = null
106
+ this.#ty = null
107
+ this.#dirX = 0
108
+ this.#dirY = 0
109
+
110
+ // 랜덤 공격 모션(애니메이션 변경 최소)
111
+ const nextAnim = (Math.random() < 0.5) ? 'attack1' : 'attack2'
112
+ if (this._sprite.animation !== nextAnim) {
113
+ this._sprite.animation = nextAnim
114
+ }
115
+
116
+ // 타격 타이밍
117
+ this.add(new DelayNode(0.3, () => this.emit('hit', ORC_ATTACK_DAMAGE)))
118
+
119
+ // SFX (대량 동시 재생은 믹서에서 한정/풀링 권장)
120
+ sfxPlayer.playRandom(
121
+ 'assets/sfx/orc/miss/miss1.wav',
122
+ 'assets/sfx/orc/miss/miss2.wav',
123
+ 'assets/sfx/orc/miss/miss3.wav'
124
+ )
125
+ }
126
+
127
+ // ── 루프 ─────────────────────────────────────────────────────────
128
+ protected override update(dt: number) {
129
+ if (this.paused) return
130
+ super.update(dt)
131
+
132
+ if (this.dead || this.#attacking) return
133
+ if (this.#tx === null || this.#ty === null) return
134
+
135
+ // 남은 거리 제곱(정확 sqrt 불필요)
136
+ const rx = this.#tx - this.x
137
+ const ry = this.#ty - this.y
138
+ const remaining2 = rx * rx + ry * ry
139
+ if (remaining2 <= EPS2) {
140
+ // 도착 처리
141
+ this.x = this.#tx
142
+ this.y = this.#ty
143
+ this.stop()
144
+ return
145
+ }
146
+
147
+ // 한 프레임 이동량(step)
148
+ const step = this.#moveSpeed * (dt > 0 ? dt * 60 : 1) // 프레임 기준 정규화
149
+
150
+ // 오버슈트 방지: step^2와 remaining^2 비교
151
+ const step2 = step * step
152
+ if (remaining2 <= step2) {
153
+ this.x = this.#tx
154
+ this.y = this.#ty
155
+ this.stop()
156
+ return
157
+ }
158
+
159
+ // 미리 정규화해둔 방향으로 이동(삼각함수 없음)
160
+ this.x += this.#dirX * step
161
+ this.y += this.#dirY * step
162
+
163
+ // 진행 방향에 따른 좌우 플립/히트박스 (dirX 부호만 사용)
164
+ const scale = Math.abs(this._sprite.scaleX)
165
+ const dirX = this.#dirX
166
+ if (dirX > 0) {
167
+ if (this._sprite.scaleX < 0) this._sprite.scaleX = scale
168
+ if (this.hitboxX !== ORC_HITBOX_X) this.hitboxX = ORC_HITBOX_X
169
+ } else if (dirX < 0) {
170
+ if (this._sprite.scaleX > 0) this._sprite.scaleX = -scale
171
+ if (this.hitboxX !== -ORC_HITBOX_X) this.hitboxX = -ORC_HITBOX_X
172
+ }
173
+
174
+ // 이동 중 애니메이션 보장(중복 전환 방지)
175
+ if (this._sprite.animation !== 'walk') this.#setWalk()
176
+ }
177
+
178
+ // ── 피격/사망 ────────────────────────────────────────────────────
179
+ override takeDamage(damage: number) {
180
+ super.takeDamage(damage)
181
+ sfxPlayer.playRandom(
182
+ 'assets/sfx/orc/hit/hit1.wav',
183
+ 'assets/sfx/orc/hit/hit2.wav',
184
+ 'assets/sfx/orc/hit/hit3.wav'
185
+ )
186
+ }
187
+
188
+ protected override onDie() {
189
+ this.#tx = null
190
+ this.#ty = null
191
+ this.#dirX = 0
192
+ this.#dirY = 0
193
+ if (this._sprite.animation !== 'die') {
194
+ this._sprite.animation = 'die'
195
+ }
196
+ sfxPlayer.play('assets/sfx/orc/die/die.wav')
197
+ }
198
+
199
+ // ── 내부 유틸 ────────────────────────────────────────────────────
200
+ #isMoving() {
201
+ return this.#tx !== null && this.#ty !== null
202
+ }
203
+ #setWalk() {
204
+ if (this._sprite.animation !== 'walk') {
205
+ this._sprite.animation = 'walk'
206
+ }
207
+ }
208
+ #setIdle() {
209
+ if (this._sprite.animation !== 'idle') {
210
+ this._sprite.animation = 'idle'
211
+ }
212
+ }
213
+ }
@@ -0,0 +1,27 @@
1
+ import { AnimatedSpriteNode, CircleCollider, CircleNode, ColliderType, debugMode, GameObject, GameObjectOptions } from '../../../src'
2
+ import potionAtlas from '../assets/spritesheets/potion-atlas.json'
3
+
4
+ export type PotionOptions = {
5
+ healAmount?: number
6
+ } & GameObjectOptions
7
+
8
+ export class Potion extends GameObject {
9
+ triggerCollider: CircleCollider = { type: ColliderType.Circle, radius: 16 }
10
+ healAmount: number
11
+
12
+ constructor(options?: PotionOptions) {
13
+ super({ ...options, useYSort: true })
14
+ this.healAmount = options?.healAmount ?? 100
15
+
16
+ this.add(new AnimatedSpriteNode({
17
+ src: 'assets/spritesheets/potion.png',
18
+ atlas: potionAtlas,
19
+ animation: 'animation',
20
+ scale: 2
21
+ }))
22
+
23
+ if (debugMode) {
24
+ this.add(new CircleNode({ ...this.triggerCollider, stroke: 'green', alpha: 0.5, layer: 'hud' }))
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,178 @@
1
+ import { checkCollision, GameObject, IntervalNode, isMobile, Joystick, musicPlayer } from '../../src'
2
+ import { Hero } from './objects/hero'
3
+ import { Orc } from './objects/orc'
4
+ import { Potion } from './objects/potion'
5
+
6
+ function createTextElement() {
7
+ const el = document.createElement('div')
8
+ el.style.color = 'white'
9
+ el.style.position = 'absolute'
10
+ el.style.top = '10px'
11
+ el.style.zIndex = '1'
12
+ return el
13
+ }
14
+
15
+ const SCORE_PER_ORC = 100
16
+
17
+ export class Stage extends GameObject {
18
+ #hero = new Hero();
19
+ #orcs: Set<Orc> = new Set();
20
+ #potions: Set<Potion> = new Set();
21
+
22
+ #time = 0
23
+ #score = 0
24
+ #isGameOver = false
25
+
26
+ #timeText: HTMLDivElement
27
+ #hpText: HTMLDivElement
28
+ #scoreText: HTMLDivElement
29
+
30
+ #spawnOrcInterval: IntervalNode
31
+ #spawnPotionInterval: IntervalNode
32
+
33
+ constructor() {
34
+ super()
35
+ musicPlayer.play('assets/bgm/battle.mp3')
36
+
37
+ this.add(this.#hero)
38
+ this.add(this.#spawnOrcInterval = new IntervalNode(1, () => this.#spawnOrc()))
39
+ this.add(this.#spawnPotionInterval = new IntervalNode(3, () => this.#spawnPotion()))
40
+
41
+ for (let i = 0; i < 1000; i++) {
42
+ this.#spawnOrc()
43
+ }
44
+
45
+ const joystickImage = new Image()
46
+ joystickImage.src = 'assets/joystick/joystick.png'
47
+
48
+ const knobImage = new Image()
49
+ knobImage.src = 'assets/joystick/knob.png'
50
+
51
+ this.add(
52
+ new Joystick({
53
+ onMove: (r, d) => this.#hero.move(r, d),
54
+ onRelease: () => this.#hero.stop(),
55
+ onKeyDown: (code) => {
56
+ if (code === 'KeyA') this.#hero.attack()
57
+ },
58
+ joystickImage,
59
+ knobImage,
60
+ maxKnobDistance: 70,
61
+ }),
62
+ )
63
+
64
+ this.#timeText = createTextElement()
65
+ this.#hpText = createTextElement()
66
+ this.#scoreText = createTextElement()
67
+
68
+ this.#timeText.textContent = `Time: ${this.#time}`
69
+ this.#hpText.textContent = `HP: ${this.#hero.hp}`
70
+ this.#scoreText.textContent = `Score: ${this.#score}`
71
+
72
+ this.#timeText.style.left = '10px'
73
+ this.#hpText.style.left = '50%'
74
+ this.#hpText.style.transform = 'translate(-50%, 0)'
75
+ this.#scoreText.style.right = '10px'
76
+
77
+ this.#hero.on('hit', (damage) => {
78
+ for (const o of this.#orcs) {
79
+ if (checkCollision(this.#hero.hitbox, this.#hero.worldTransform, o.hurtbox, o.worldTransform)) {
80
+ o.takeDamage(damage)
81
+ }
82
+ }
83
+ })
84
+
85
+ this.#hero.on('changeHp', () => {
86
+ this.#hpText.textContent = `HP: ${this.#hero.hp}`
87
+ })
88
+
89
+ this.#hero.on('dead', () => {
90
+ this.#gameOver()
91
+ })
92
+ }
93
+
94
+ #gameOver() {
95
+ this.#isGameOver = true
96
+ this.#spawnOrcInterval.remove()
97
+ this.#spawnPotionInterval.remove()
98
+ for (const o of this.#orcs) {
99
+ o.stop()
100
+ }
101
+
102
+ const gameOverText = createTextElement()
103
+ gameOverText.textContent = 'Game Over'
104
+ gameOverText.style.left = '50%'
105
+ gameOverText.style.top = '50%'
106
+ gameOverText.style.transform = 'translate(-50%, -50%)'
107
+ this.renderer?.container.append(gameOverText)
108
+ }
109
+
110
+ protected override set renderer(renderer) {
111
+ super.renderer = renderer
112
+
113
+ if (renderer) {
114
+ const c = renderer.container
115
+ c.append(this.#timeText, this.#hpText, this.#scoreText)
116
+ }
117
+ }
118
+
119
+ protected override get renderer() {
120
+ return super.renderer
121
+ }
122
+
123
+ #spawnOrc() {
124
+ const o = new Orc()
125
+ o.x = Math.random() * 800 - 400
126
+ o.y = Math.random() * 600 - 300
127
+ o.on('hit', (damage) => {
128
+ if (checkCollision(this.#hero.hurtbox, this.#hero.worldTransform, o.hitbox, o.worldTransform)) {
129
+ this.#hero.takeDamage(damage)
130
+ }
131
+ })
132
+ this.add(o)
133
+ this.#orcs.add(o)
134
+ o.on('dead', () => {
135
+ this.#orcs.delete(o)
136
+ this.#score += SCORE_PER_ORC
137
+ this.#scoreText.textContent = `Score: ${this.#score}`
138
+ })
139
+ }
140
+
141
+ #spawnPotion() {
142
+ const p = new Potion()
143
+ p.x = Math.random() * 800 - 400
144
+ p.y = Math.random() * 600 - 300
145
+ this.add(p)
146
+ this.#potions.add(p)
147
+ p.on('remove', () => this.#potions.delete(p))
148
+ }
149
+
150
+ protected override update(dt: number) {
151
+ if (this.paused) return
152
+ super.update(dt)
153
+
154
+ if (this.#isGameOver) return
155
+
156
+ const h = this.#hero
157
+ if (h.dead) return
158
+
159
+ for (const o of this.#orcs) {
160
+ if (checkCollision(h.hurtbox, h.worldTransform, o.hitbox, o.worldTransform)) {
161
+ o.attack()
162
+ } else {
163
+ o.moveTo(this.#hero.x, this.#hero.y)
164
+ }
165
+
166
+ if (isMobile && checkCollision(h.hitbox, h.worldTransform, o.hurtbox, o.worldTransform)) {
167
+ h.attack()
168
+ }
169
+ }
170
+
171
+ for (const p of this.#potions) {
172
+ if (checkCollision(h.hitbox, h.worldTransform, p.triggerCollider, p.worldTransform)) {
173
+ h.heal(p.healAmount)
174
+ p.remove()
175
+ }
176
+ }
177
+ }
178
+ }
@@ -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>