@lewismoten/gamemaker-sandbox-tools 3.1.0 → 3.4.0

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 (343) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/NOTICE.md +105 -3
  3. package/README.md +301 -15
  4. package/dist/audio-files.js +82 -0
  5. package/dist/audio.js +23 -138
  6. package/dist/block-merge.js +43 -0
  7. package/dist/color-reduce.js +44 -0
  8. package/dist/colors.js +87 -0
  9. package/dist/delta.js +75 -0
  10. package/dist/disk-diff.js +220 -0
  11. package/dist/drawing.js +83 -869
  12. package/dist/embroidery/compile.js +85 -0
  13. package/dist/embroidery/dst.js +79 -0
  14. package/dist/embroidery/exp.js +26 -0
  15. package/dist/embroidery/fill.js +49 -0
  16. package/dist/embroidery/geom.js +82 -0
  17. package/dist/embroidery/pes.js +79 -0
  18. package/dist/embroidery/satin.js +29 -0
  19. package/dist/embroidery/simulate.js +30 -0
  20. package/dist/embroidery/strokeFont.js +253 -0
  21. package/dist/embroidery/svg.js +24 -0
  22. package/dist/embroidery/types.js +13 -0
  23. package/dist/embroidery/units.js +26 -0
  24. package/dist/embroidery/validate.js +15 -0
  25. package/dist/formats/blocks.js +1 -103
  26. package/dist/formats/character.js +1 -83
  27. package/dist/formats/cmf.js +1 -37
  28. package/dist/formats/fli.js +1 -296
  29. package/dist/formats/fliLimits.js +1 -54
  30. package/dist/formats/game.js +1 -193
  31. package/dist/formats/gif.js +1 -125
  32. package/dist/formats/graphicScripts.js +1 -44
  33. package/dist/formats/map.js +1 -38
  34. package/dist/formats/monster.js +1 -69
  35. package/dist/formats/palette.js +1 -58
  36. package/dist/formats/recording.js +1 -17
  37. package/dist/formats/sound.js +1 -44
  38. package/dist/formats/voc.js +1 -303
  39. package/dist/gif-shrink.js +56 -0
  40. package/dist/image/png.js +42 -0
  41. package/dist/images.js +81 -43
  42. package/dist/kit/actors.js +19 -0
  43. package/dist/kit/align.js +204 -0
  44. package/dist/kit/blit.js +45 -0
  45. package/dist/kit/blockRoles.js +97 -0
  46. package/dist/kit/clips.js +40 -0
  47. package/dist/kit/coverPaint.js +18 -0
  48. package/dist/kit/disk.js +76 -0
  49. package/dist/kit/fadeOut.js +13 -0
  50. package/dist/kit/fliClips.js +133 -0
  51. package/dist/kit/fliShrink.js +277 -0
  52. package/dist/kit/gameSim.js +235 -0
  53. package/dist/kit/hopBot.js +142 -0
  54. package/dist/kit/levelGen.js +1423 -0
  55. package/dist/kit/levelGrid.js +33 -0
  56. package/dist/kit/levelPicture.js +27 -0
  57. package/dist/kit/menuVersion.js +19 -0
  58. package/dist/kit/microText.js +35 -0
  59. package/dist/kit/mumble.js +74 -0
  60. package/dist/kit/music.js +8 -0
  61. package/dist/kit/palRamps.js +32 -0
  62. package/dist/kit/palette.js +49 -0
  63. package/dist/kit/pcText.js +72 -0
  64. package/dist/kit/photo.js +150 -0
  65. package/dist/kit/pixels.js +79 -0
  66. package/dist/kit/png.js +40 -0
  67. package/dist/kit/quantize.js +72 -0
  68. package/dist/kit/raytrace.js +379 -0
  69. package/dist/kit/recordedDemo.js +10 -0
  70. package/dist/kit/reel.js +77 -0
  71. package/dist/kit/road3d.js +67 -0
  72. package/dist/kit/routeChecks.js +8 -0
  73. package/dist/kit/saveSlots.js +11 -0
  74. package/dist/kit/sceneInit.js +13 -0
  75. package/dist/kit/sceneSim.js +112 -0
  76. package/dist/kit/screenText.js +15 -0
  77. package/dist/kit/sdftext.js +237 -0
  78. package/dist/kit/shading.js +69 -0
  79. package/dist/kit/song.js +251 -0
  80. package/dist/kit/songFx.js +179 -0
  81. package/dist/kit/sound.js +52 -0
  82. package/dist/kit/synthParts.js +20 -0
  83. package/dist/kit/tar.js +53 -0
  84. package/dist/kit/textBounds.js +84 -0
  85. package/dist/kit/textfit.js +246 -0
  86. package/dist/kit/transforms.js +57 -0
  87. package/dist/kit/tune.js +21 -0
  88. package/dist/look-alike.js +50 -0
  89. package/dist/menu-version.js +4 -0
  90. package/dist/mesh/colorBodies.js +137 -0
  91. package/dist/mesh/decimate.js +207 -0
  92. package/dist/mesh/meshCheck.js +51 -0
  93. package/dist/mesh/overhang.js +41 -0
  94. package/dist/mesh/sampledField.js +12 -0
  95. package/dist/mesh/stl.js +36 -0
  96. package/dist/mesh/surfaceNets.js +79 -0
  97. package/dist/mesh/tetraMesh.js +62 -0
  98. package/dist/mesh/threeMf.js +58 -0
  99. package/dist/mesh/zipFile.js +52 -0
  100. package/dist/microFont.js +101 -0
  101. package/dist/music/compose.js +72 -0
  102. package/dist/pack/meshPack.js +198 -0
  103. package/dist/pack/threeMfPack.js +92 -0
  104. package/dist/palette-reserve.js +116 -0
  105. package/dist/palettes.js +138 -0
  106. package/dist/release-notes.js +40 -0
  107. package/dist/simulation.js +16 -2774
  108. package/dist/text.js +74 -0
  109. package/dist/types/audio.d.ts +4 -0
  110. package/dist/types/audioFiles.d.ts +22 -0
  111. package/dist/types/audioWav.d.ts +4 -0
  112. package/dist/types/blockMerge.d.ts +24 -0
  113. package/dist/types/colorReduce.d.ts +23 -0
  114. package/dist/types/{web/packages/tools/src/colors.d.ts → colors.d.ts} +6 -0
  115. package/dist/types/delta.d.ts +32 -0
  116. package/dist/types/diskDiff.d.ts +47 -0
  117. package/dist/types/drawing.d.ts +15 -0
  118. package/dist/types/embroidery/compile.d.ts +3 -0
  119. package/dist/types/embroidery/dst.d.ts +13 -0
  120. package/dist/types/embroidery/exp.d.ts +8 -0
  121. package/dist/types/embroidery/fill.d.ts +6 -0
  122. package/dist/types/embroidery/geom.d.ts +19 -0
  123. package/dist/types/embroidery/pes.d.ts +10 -0
  124. package/dist/types/embroidery/satin.d.ts +11 -0
  125. package/dist/types/embroidery/simulate.d.ts +19 -0
  126. package/dist/types/embroidery/strokeFont.d.ts +20 -0
  127. package/dist/types/embroidery/svg.d.ts +3 -0
  128. package/dist/types/embroidery/types.d.ts +70 -0
  129. package/dist/types/embroidery/units.d.ts +10 -0
  130. package/dist/types/embroidery/validate.d.ts +22 -0
  131. package/dist/types/formats/blocks.d.ts +1 -0
  132. package/dist/types/formats/character.d.ts +1 -0
  133. package/dist/types/formats/cmf.d.ts +1 -0
  134. package/dist/types/formats/fli.d.ts +1 -0
  135. package/dist/types/formats/fliLimits.d.ts +1 -0
  136. package/dist/types/formats/game.d.ts +1 -0
  137. package/dist/types/formats/gif.d.ts +1 -0
  138. package/dist/types/formats/graphicScripts.d.ts +1 -0
  139. package/dist/types/formats/map.d.ts +1 -0
  140. package/dist/types/formats/monster.d.ts +1 -0
  141. package/dist/types/formats/palette.d.ts +1 -0
  142. package/dist/types/formats/recording.d.ts +1 -0
  143. package/dist/types/formats/sound.d.ts +1 -0
  144. package/dist/types/formats/voc.d.ts +1 -0
  145. package/dist/types/gifShrink.d.ts +8 -0
  146. package/dist/types/image/animatedGif.d.ts +9 -0
  147. package/dist/types/image/surface.d.ts +26 -0
  148. package/dist/types/images.d.ts +13 -0
  149. package/dist/types/kit/actors.d.ts +7 -0
  150. package/dist/types/kit/align.d.ts +93 -0
  151. package/dist/types/kit/audioEvents.d.ts +26 -0
  152. package/dist/types/kit/blit.d.ts +20 -0
  153. package/dist/types/kit/blockRoles.d.ts +243 -0
  154. package/dist/types/{games/kit → kit}/clips.d.ts +1 -1
  155. package/dist/types/kit/coverPaint.d.ts +7 -0
  156. package/dist/types/kit/disk.d.ts +15 -0
  157. package/dist/types/kit/fadeOut.d.ts +12 -0
  158. package/dist/types/kit/fliClips.d.ts +32 -0
  159. package/dist/types/kit/fliShrink.d.ts +149 -0
  160. package/dist/types/{games/kit → kit}/gameSim.d.ts +9 -5
  161. package/dist/types/kit/hopBot.d.ts +72 -0
  162. package/dist/types/kit/laserClearance.d.ts +16 -0
  163. package/dist/types/kit/laserJoints.d.ts +39 -0
  164. package/dist/types/kit/laserLayout.d.ts +54 -0
  165. package/dist/types/kit/laserPixels.d.ts +52 -0
  166. package/dist/types/kit/laserPreview.d.ts +9 -0
  167. package/dist/types/kit/laserSvg.d.ts +35 -0
  168. package/dist/types/kit/levelGen/castle.d.ts +17 -0
  169. package/dist/types/kit/levelGen/dungeon.d.ts +11 -0
  170. package/dist/types/kit/levelGen/forest.d.ts +17 -0
  171. package/dist/types/kit/levelGen/furnish.d.ts +31 -0
  172. package/dist/types/kit/levelGen/grid.d.ts +46 -0
  173. package/dist/types/kit/levelGen/index.d.ts +138 -0
  174. package/dist/types/kit/levelGen/interior.d.ts +18 -0
  175. package/dist/types/kit/levelGen/jumpModel.d.ts +78 -0
  176. package/dist/types/kit/levelGen/needs.d.ts +44 -0
  177. package/dist/types/kit/levelGen/overworld.d.ts +21 -0
  178. package/dist/types/kit/levelGen/platform.d.ts +59 -0
  179. package/dist/types/kit/levelGen/platformCap.d.ts +13 -0
  180. package/dist/types/kit/levelGen/platformReach.d.ts +37 -0
  181. package/dist/types/kit/levelGen/props.d.ts +37 -0
  182. package/dist/types/kit/levelGen/town.d.ts +24 -0
  183. package/dist/types/kit/levelGrid.d.ts +16 -0
  184. package/dist/types/kit/levelPicture.d.ts +9 -0
  185. package/dist/types/kit/menuVersion.d.ts +7 -0
  186. package/dist/types/kit/microText.d.ts +18 -0
  187. package/dist/types/kit/mumble.d.ts +41 -0
  188. package/dist/types/kit/music.d.ts +1 -0
  189. package/dist/types/kit/palMerge.d.ts +10 -0
  190. package/dist/types/kit/palRamps.d.ts +28 -0
  191. package/dist/types/kit/pcText.d.ts +19 -0
  192. package/dist/types/kit/photo.d.ts +69 -0
  193. package/dist/types/kit/png.d.ts +7 -0
  194. package/dist/types/kit/quantize.d.ts +20 -0
  195. package/dist/types/kit/raytrace.d.ts +169 -0
  196. package/dist/types/kit/recordedDemo.d.ts +1 -0
  197. package/dist/types/kit/road3d.d.ts +71 -0
  198. package/dist/types/kit/routeChecks.d.ts +6 -0
  199. package/dist/types/kit/saveSlots.d.ts +17 -0
  200. package/dist/types/kit/sceneInit.d.ts +11 -0
  201. package/dist/types/{games/kit → kit}/sceneSim.d.ts +5 -5
  202. package/dist/types/kit/screenText.d.ts +3 -0
  203. package/dist/types/kit/sdftext.d.ts +34 -0
  204. package/dist/types/kit/shading.d.ts +23 -0
  205. package/dist/types/kit/shareBlocks.d.ts +20 -0
  206. package/dist/types/kit/song.d.ts +89 -0
  207. package/dist/types/kit/songFx.d.ts +99 -0
  208. package/dist/types/kit/synthParts.d.ts +7 -0
  209. package/dist/types/kit/tar.d.ts +13 -0
  210. package/dist/types/kit/textfit.d.ts +74 -0
  211. package/dist/types/kit/transforms.d.ts +8 -0
  212. package/dist/types/lookAlike.d.ts +31 -0
  213. package/dist/types/menuVersionEntry.d.ts +1 -0
  214. package/dist/types/mesh/colorBodies.d.ts +18 -0
  215. package/dist/types/mesh/decimate.d.ts +10 -0
  216. package/dist/types/mesh/fieldTrinket.d.ts +40 -0
  217. package/dist/types/mesh/figureShapes.d.ts +24 -0
  218. package/dist/types/mesh/mesh.d.ts +9 -0
  219. package/dist/types/mesh/meshCheck.d.ts +22 -0
  220. package/dist/types/mesh/overhang.d.ts +24 -0
  221. package/dist/types/mesh/pixelFigure.d.ts +41 -0
  222. package/dist/types/mesh/sampledField.d.ts +3 -0
  223. package/dist/types/mesh/sdfShapes.d.ts +20 -0
  224. package/dist/types/mesh/stl.d.ts +9 -0
  225. package/dist/types/mesh/strokeText.d.ts +8 -0
  226. package/dist/types/mesh/surfaceNets.d.ts +14 -0
  227. package/dist/types/mesh/tetraMesh.d.ts +4 -0
  228. package/dist/types/mesh/threeMf.d.ts +12 -0
  229. package/dist/types/mesh/trinketKinds.d.ts +72 -0
  230. package/dist/types/mesh/trinketTool.d.ts +26 -0
  231. package/dist/types/mesh/voxel.d.ts +10 -0
  232. package/dist/types/mesh/zipFile.d.ts +13 -0
  233. package/dist/types/microFont.d.ts +6 -0
  234. package/dist/types/pack/meshPack.d.ts +26 -0
  235. package/dist/types/pack/threeMfPack.d.ts +11 -0
  236. package/dist/types/palettePresetData.d.ts +4 -0
  237. package/dist/types/palettePresets.d.ts +12 -0
  238. package/dist/types/paletteReserve.d.ts +52 -0
  239. package/dist/types/palettes.d.ts +4 -0
  240. package/dist/types/releaseNotes.d.ts +3 -0
  241. package/dist/types/simulation.d.ts +6 -0
  242. package/dist/types/{web/packages/tools/src/text.d.ts → text.d.ts} +6 -6
  243. package/package.json +145 -15
  244. package/dist/binary-D7wuaC5g.js +0 -120
  245. package/dist/pixels-DzfIIUOl.js +0 -76
  246. package/dist/types/games/kit/blit.d.ts +0 -10
  247. package/dist/types/games/kit/music.d.ts +0 -1
  248. package/dist/types/games/kit/pcText.d.ts +0 -8
  249. package/dist/types/games/kit/shading.d.ts +0 -11
  250. package/dist/types/web/packages/tools/src/audio.d.ts +0 -3
  251. package/dist/types/web/packages/tools/src/drawing.d.ts +0 -10
  252. package/dist/types/web/packages/tools/src/images.d.ts +0 -2
  253. package/dist/types/web/packages/tools/src/microFont.d.ts +0 -1
  254. package/dist/types/web/packages/tools/src/simulation.d.ts +0 -3
  255. package/dist/types/web/scripts/cdGames.d.ts +0 -103
  256. package/dist/types/web/scripts/gameShots.d.ts +0 -12
  257. package/dist/types/web/scripts/ogImage.d.ts +0 -21
  258. package/dist/types/web/src/audio/cmfLoad.d.ts +0 -7
  259. package/dist/types/web/src/audio/cmfPlayer.d.ts +0 -69
  260. package/dist/types/web/src/audio/context.d.ts +0 -12
  261. package/dist/types/web/src/audio/engine.d.ts +0 -39
  262. package/dist/types/web/src/audio/music.worklet.d.ts +0 -14
  263. package/dist/types/web/src/audio/opl.d.ts +0 -37
  264. package/dist/types/web/src/audio/output.d.ts +0 -13
  265. package/dist/types/web/src/desk/boxes/boxFacts.d.ts +0 -85
  266. package/dist/types/web/src/dosPlayer/fileExtensions.d.ts +0 -44
  267. package/dist/types/web/src/dosPlayer/patchRules.d.ts +0 -24
  268. package/dist/types/web/src/dosPlayer/patchTable.d.ts +0 -80
  269. package/dist/types/web/src/edition.d.ts +0 -6
  270. package/dist/types/web/src/eggs/eggState.d.ts +0 -26
  271. package/dist/types/web/src/eggs/eggs.d.ts +0 -31
  272. package/dist/types/web/src/engine/character.d.ts +0 -30
  273. package/dist/types/web/src/engine/funcKeys.d.ts +0 -33
  274. package/dist/types/web/src/engine/game.d.ts +0 -52
  275. package/dist/types/web/src/engine/keys.d.ts +0 -17
  276. package/dist/types/web/src/engine/machine.d.ts +0 -99
  277. package/dist/types/web/src/engine/menus.d.ts +0 -46
  278. package/dist/types/web/src/engine/monsters.d.ts +0 -19
  279. package/dist/types/web/src/engine/playGain.d.ts +0 -11
  280. package/dist/types/web/src/engine/playerLook.d.ts +0 -26
  281. package/dist/types/web/src/engine/recorder.d.ts +0 -60
  282. package/dist/types/web/src/engine/render.d.ts +0 -8
  283. package/dist/types/web/src/engine/scene.d.ts +0 -156
  284. package/dist/types/web/src/engine/scroll.d.ts +0 -16
  285. package/dist/types/web/src/engine/showGraphic.d.ts +0 -39
  286. package/dist/types/web/src/engine/slowPc.d.ts +0 -62
  287. package/dist/types/web/src/engine/touch.d.ts +0 -33
  288. package/dist/types/web/src/engine/world.d.ts +0 -215
  289. package/dist/types/web/src/export/gameAbout.d.ts +0 -15
  290. package/dist/types/web/src/formats/binary.d.ts +0 -44
  291. package/dist/types/web/src/formats/blocks.d.ts +0 -52
  292. package/dist/types/web/src/formats/character.d.ts +0 -65
  293. package/dist/types/web/src/formats/cmf.d.ts +0 -33
  294. package/dist/types/web/src/formats/fli.d.ts +0 -45
  295. package/dist/types/web/src/formats/fliLimits.d.ts +0 -13
  296. package/dist/types/web/src/formats/game.d.ts +0 -72
  297. package/dist/types/web/src/formats/gif.d.ts +0 -15
  298. package/dist/types/web/src/formats/graphicScripts.d.ts +0 -18
  299. package/dist/types/web/src/formats/highscore.d.ts +0 -10
  300. package/dist/types/web/src/formats/map.d.ts +0 -24
  301. package/dist/types/web/src/formats/monster.d.ts +0 -48
  302. package/dist/types/web/src/formats/palette.d.ts +0 -15
  303. package/dist/types/web/src/formats/recording.d.ts +0 -7
  304. package/dist/types/web/src/formats/sound.d.ts +0 -13
  305. package/dist/types/web/src/formats/voc.d.ts +0 -13
  306. package/dist/types/web/src/gfx/cp437Glyphs.d.ts +0 -2
  307. package/dist/types/web/src/gfx/font8x8.d.ts +0 -2
  308. package/dist/types/web/src/gfx/levelPicture.d.ts +0 -81
  309. package/dist/types/web/src/gfx/screen.d.ts +0 -46
  310. package/dist/types/web/src/gfx/titlePicture.d.ts +0 -21
  311. package/dist/types/web/src/input/chords.d.ts +0 -22
  312. package/dist/types/web/src/input/deskMouse.d.ts +0 -14
  313. package/dist/types/web/src/input/keyboard.d.ts +0 -39
  314. package/dist/types/web/src/input/scancodes.d.ts +0 -3
  315. package/dist/types/web/src/manual/printables/types.d.ts +0 -277
  316. package/dist/types/web/src/project/bizarre.d.ts +0 -28
  317. package/dist/types/web/src/project/companion.d.ts +0 -35
  318. package/dist/types/web/src/project/diskFacts.d.ts +0 -30
  319. package/dist/types/web/src/project/files.d.ts +0 -124
  320. package/dist/types/web/src/project/gameFiles.d.ts +0 -49
  321. package/dist/types/web/src/project/gamePack.d.ts +0 -17
  322. package/dist/types/web/src/project/health.d.ts +0 -30
  323. package/dist/types/web/src/project/secretGames.d.ts +0 -19
  324. package/dist/types/web/src/project/storage.d.ts +0 -46
  325. package/dist/types/web/src/project/streamGame.d.ts +0 -38
  326. package/dist/types/web/src/project/zip.d.ts +0 -33
  327. package/dist/types/web/src/retro/dos/disks.d.ts +0 -33
  328. package/dist/types/web/src/retro/text/cp437.d.ts +0 -4
  329. package/dist/types/web/src/seededRandom.d.ts +0 -6
  330. package/dist/types/web/src/tinHearts/deskHearts.d.ts +0 -33
  331. package/dist/types/web/src/tinHearts/manifest.d.ts +0 -30
  332. package/dist/types/web/src/tinHearts/tinHearts.d.ts +0 -84
  333. package/dist/types/web/src/walkthrough/format.d.ts +0 -92
  334. package/dist/types/web/src/walkthrough/madeUpScores.d.ts +0 -6
  335. package/dist/types/web/src/walkthrough/runtime.d.ts +0 -134
  336. /package/dist/types/{web/src/assistant → image}/png.d.ts +0 -0
  337. /package/dist/types/{games/kit → kit}/palette.d.ts +0 -0
  338. /package/dist/types/{games/kit → kit}/pixels.d.ts +0 -0
  339. /package/dist/types/{games/kit → kit}/reel.d.ts +0 -0
  340. /package/dist/types/{games/kit → kit}/sound.d.ts +0 -0
  341. /package/dist/types/{games/kit → kit}/textBounds.d.ts +0 -0
  342. /package/dist/types/{games/kit → kit}/tune.d.ts +0 -0
  343. /package/dist/types/{web/src/audio → music}/compose.d.ts +0 -0
@@ -0,0 +1,33 @@
1
+ class n {
2
+ constructor(t, i) {
3
+ this.width = t, this.height = i, this.cells = Array.from({ length: i }, () => Array(t).fill(" "));
4
+ }
5
+ width;
6
+ height;
7
+ cells;
8
+ /** One block. */
9
+ put(t, i, r) {
10
+ if (t < 0 || i < 0 || t >= this.width || i >= this.height) throw new Error(`Grid: (${t}, ${i}) is outside ${this.width}x${this.height}`);
11
+ return this.cells[i][t] = r, this;
12
+ }
13
+ /** A rectangle of `ch`, w blocks wide and h high. */
14
+ fill(t, i, r, h, e) {
15
+ for (let s = i; s < i + h; s++) for (let l = t; l < t + r; l++) this.put(l, s, e);
16
+ return this;
17
+ }
18
+ /** Blocks `x0` to `x1` (both included) along row `y`. */
19
+ row(t, i, r, h) {
20
+ return this.fill(i, t, r - i + 1, 1, h);
21
+ }
22
+ /** Blocks `y0` to `y1` (both included) down column `x`. */
23
+ col(t, i, r, h) {
24
+ return this.fill(t, i, 1, r - i + 1, h);
25
+ }
26
+ /** The level as rows of text, for StarterMap. */
27
+ rows() {
28
+ return this.cells.map((t) => t.join(""));
29
+ }
30
+ }
31
+ export {
32
+ n as Grid
33
+ };
@@ -0,0 +1,27 @@
1
+ import { orientIndex as k } from "@lewismoten/gamemaker-sandbox-engine/formats/blocks";
2
+ import { Pixels as v } from "./pixels.js";
3
+ function P(m, b, d, y, e, c, u, l, g = []) {
4
+ const i = new v(u * 20, l * 20);
5
+ for (let o = 0; o < l; o++)
6
+ for (let n = 0; n < u; n++) {
7
+ const r = b[m.blocks[(c + o) * 100 + e + n]];
8
+ for (let t = 0; t < 400; t++) i.px[(o * 20 + Math.floor(t / 20)) * i.w + n * 20 + t % 20] = r.pixels[t];
9
+ }
10
+ const p = (o, n, r, t = 0) => {
11
+ for (let f = 0; f < 20; f++)
12
+ for (let s = 0; s < 20; s++) {
13
+ const x = o[k(t, s, f)];
14
+ x !== 255 && i.set(n + s, r + f, x);
15
+ }
16
+ };
17
+ for (const o of m.monsters) {
18
+ if (o.monnum >= 64) continue;
19
+ const r = y[o.monnum]?.pic[0][0];
20
+ r === void 0 || r >= 100 || o.curx < e || o.cury < c || o.curx >= e + u || o.cury >= c + l || p(d[r].pixels, (o.curx - e) * 20, (o.cury - c) * 20);
21
+ }
22
+ for (const o of g) p(o.pixels, (o.x - e) * 20, (o.y - c) * 20);
23
+ return i;
24
+ }
25
+ export {
26
+ P as renderRegion
27
+ };
@@ -0,0 +1,19 @@
1
+ import { isGif as x, decodeGif as g, encodeGif as h } from "@lewismoten/gamemaker-sandbox-engine/formats/gif";
2
+ import { parseGame as w } from "@lewismoten/gamemaker-sandbox-engine/formats/game";
3
+ import { Pixels as G } from "./pixels.js";
4
+ import { outlined as k, textWidth as v } from "./pcText.js";
5
+ const y = 318, P = 190, n = (t, s) => 0.2126 * t[s * 3] + 0.7152 * t[s * 3 + 1] + 0.0722 * t[s * 3 + 2];
6
+ function E(t, s, c = {}) {
7
+ if (c === !1) return;
8
+ const p = [...t.keys()].find((o) => o.endsWith(".gam")), i = p && w(t.get(p)).scenes[0]?.files[2]?.toLowerCase(), d = i ? t.get(i) : void 0;
9
+ if (!d || !x(d)) return;
10
+ const e = g(d), m = new G(e.width, e.height);
11
+ m.px.set(e.pixels);
12
+ const l = [...new Set(e.pixels)], a = l.reduce((o, r) => n(e.palette, r) > n(e.palette, o) ? r : o), f = l.reduce((o, r) => n(e.palette, r) < n(e.palette, o) ? r : o);
13
+ if (n(e.palette, a) - n(e.palette, f) < 32) throw new Error(`${i}: no light and dark colors to letter the version in`);
14
+ const u = `v${s}`;
15
+ k(m, c.x ?? y - v(u), c.y ?? P, u, a, f), t.set(i, h({ ...e, pixels: m.px }));
16
+ }
17
+ export {
18
+ E as stampMenuVersion
19
+ };
@@ -0,0 +1,35 @@
1
+ import { MICRO_GLYPHS as k } from "../microFont.js";
2
+ import { textInk as w } from "./textBounds.js";
3
+ function y(f = {}) {
4
+ const { glyphs: t = k, fallback: m = "?", trailingGap: C = !1, glyphCase: a = !0, custom: g } = f;
5
+ if (!(m in t)) throw new RangeError("Micro font must contain its fallback glyph");
6
+ return (h, s, u, p, M, o = 1) => {
7
+ const d = w(h, p, void 0, (r) => r in t || r.toUpperCase() in t || !!g?.(r)), l = (r, i, e = M) => {
8
+ h.rect(r, i, o, o, e), d?.add(r, i, o, o);
9
+ };
10
+ let c = s;
11
+ for (const r of a ? p : p.toUpperCase()) {
12
+ const i = g?.(r);
13
+ if (i) {
14
+ for (let e = 0; e < i.h; e++)
15
+ for (let n = 0; n < i.w; n++) {
16
+ const x = i.get(n, e);
17
+ x !== 255 && l(c + n * o, u + e * o, x);
18
+ }
19
+ c += (i.w + 1) * o;
20
+ } else {
21
+ const e = (a ? t[r] ?? t[r.toUpperCase()] : t[r]) ?? t[m];
22
+ for (let n = 0; n < 15; n++) e[n] === "1" && l(c + n % 3 * o, u + Math.floor(n / 3) * o);
23
+ c += 4 * o;
24
+ }
25
+ }
26
+ return d?.end(), c - s - (C ? 0 : o);
27
+ };
28
+ }
29
+ const U = (f, t = 1) => f.length * 4 * t - t, G = (f, t = 1) => Math.max(0, U(f, t)), I = y();
30
+ export {
31
+ y as createMicroText,
32
+ I as micro,
33
+ U as microAdvance,
34
+ G as microWidth
35
+ };
@@ -0,0 +1,74 @@
1
+ import { encodeVoc as P } from "@lewismoten/gamemaker-sandbox-engine/formats/voc";
2
+ const E = {
3
+ a: [800, 1250],
4
+ e: [520, 1850],
5
+ i: [310, 2250],
6
+ o: [520, 950],
7
+ u: [340, 850]
8
+ }, S = {
9
+ bright: { pitch: 300, speed: 1 },
10
+ deep: { pitch: 125, speed: 0.8 },
11
+ small: { pitch: 420, speed: 1.3 }
12
+ };
13
+ function z(e) {
14
+ let t = 0, s = 0;
15
+ return (i, h, a) => {
16
+ const l = Math.exp(-Math.PI * a / e), m = 2 * l * Math.cos(2 * Math.PI * h / e), f = -l * l, n = (1 - m - f) * i + m * t + f * s;
17
+ return s = t, t = n, n;
18
+ };
19
+ }
20
+ function C(e) {
21
+ return e.reduce((t, s) => t + s[3] + (s[4] ?? 0), 0);
22
+ }
23
+ function F(e, t = {}) {
24
+ const s = t.rate ?? 11025, i = t.gain ?? 1.6, h = C(e), a = Math.round(h * s), l = new Float32Array(a), m = z(s), f = z(s);
25
+ let n = 0, c = t.noiseSeed ?? 11;
26
+ const p = () => (c = c * 1103515245 + 12345 & 2147483647, c / 1073741823 - 1), b = (r) => {
27
+ let u = 0, o, d = 0;
28
+ for (const y of e) {
29
+ const w = y[3] + (y[4] ?? 0);
30
+ if (r < u + w) {
31
+ o = y, d = r - u;
32
+ break;
33
+ }
34
+ u += w;
35
+ }
36
+ if (!o || d > o[3]) return 0;
37
+ const M = d / o[3], g = o[1] + (o[2] - o[1]) * M, [I, V] = E[o[0]];
38
+ n += g / s, n -= Math.floor(n);
39
+ const k = (n < 0.5 ? n * 4 - 1 : 3 - n * 4) * 0.8 + (n * 2 - 1) * 0.2, v = p() * Math.max(0, 0.5 - M * 3), L = Math.sin(Math.PI * Math.min(1, M * 1.15)) ** 0.7, x = k + v;
40
+ return (m(x, I, 90) * 0.9 + f(x, V, 140) * 0.55) * L;
41
+ };
42
+ for (let r = 0; r < a; r++) {
43
+ const u = r / s, o = u / h, d = Math.min(1, o * 40) * Math.min(1, (1 - o) * 25);
44
+ l[r] = Math.max(-1, Math.min(1, b(u) * d * i));
45
+ }
46
+ return l;
47
+ }
48
+ function B(e, t = {}) {
49
+ return P(F(e, t), t.rate ?? 11025);
50
+ }
51
+ function O(e) {
52
+ let t = e >>> 0 || 1;
53
+ return () => (t = Math.imul(t, 1664525) + 1013904223 >>> 0, t / 4294967296);
54
+ }
55
+ function T(e, t = {}) {
56
+ const s = t.pitch ?? S.bright.pitch, i = Math.max(0.2, t.speed ?? 1), h = O(t.seed ?? 1), a = [], l = e.toLowerCase().match(/[a-z']+[^a-z'\s]*/g) ?? [];
57
+ for (const m of l) {
58
+ const f = m.match(/[aeiouy]+/g) ?? ["u"];
59
+ f.forEach((p, b) => {
60
+ const r = p.replace("y", "i")[0], u = r in E ? r : "u", o = s * (0.85 + h() * 0.3), d = o * (0.85 + h() * 0.3), M = (0.16 + 0.04 * p.length + h() * 0.06) / i, g = b === f.length - 1;
61
+ a.push([u, o, d, M, g ? 0.08 / i : 0.02 / i]);
62
+ });
63
+ const n = m.match(/[^a-z'\s]+$/)?.[0] ?? "", c = a[a.length - 1];
64
+ c && n && (/[?]/.test(n) ? c[2] = c[1] * 1.3 : /[.!]/.test(n) && (c[2] = c[1] * 0.7, c[3] *= 1.5), c[4] = (/[,;:]/.test(n) ? 0.14 : 0.25) / i);
65
+ }
66
+ return a;
67
+ }
68
+ export {
69
+ S as MUMBLE_VOICES,
70
+ F as mumble,
71
+ C as mumbleSeconds,
72
+ B as mumbleVoc,
73
+ T as syllablesFromText
74
+ };
@@ -0,0 +1,8 @@
1
+ import { INSTRUMENTS as n, blankSong as S, midi as b, sbi as g, song as m } from "../music/compose.js";
2
+ export {
3
+ n as INSTRUMENTS,
4
+ S as blankSong,
5
+ b as midi,
6
+ g as sbi,
7
+ m as song
8
+ };
@@ -0,0 +1,32 @@
1
+ import { PaletteBuilder as p } from "./palette.js";
2
+ function u(e) {
3
+ const t = (r) => e.get(r);
4
+ return {
5
+ pal: e.pal,
6
+ r: t,
7
+ c: (r, n) => {
8
+ const o = t(r);
9
+ return o[Math.max(0, Math.min(o.length - 1, n))];
10
+ }
11
+ };
12
+ }
13
+ const d = (e) => ({ ...u(e), b: e });
14
+ function h(e, t = {}) {
15
+ const r = new p();
16
+ t.designerColors !== !1 && r.designerColors();
17
+ for (const [n, o, s, c, i, f] of e) {
18
+ const l = t.overrides?.[n];
19
+ if (l) {
20
+ r.ramp(n, o, ...l);
21
+ continue;
22
+ }
23
+ const a = (m) => t.transform?.(n, m, !!f) ?? m;
24
+ r.ramp(n, o, a(s), a(c), i ? a(i) : void 0);
25
+ }
26
+ return d(r);
27
+ }
28
+ export {
29
+ h as buildRampPalette,
30
+ u as wrap,
31
+ d as wrapWithBuilder
32
+ };
@@ -0,0 +1,49 @@
1
+ class f {
2
+ pal = new Uint8Array(768);
3
+ next = 0;
4
+ ramps = /* @__PURE__ */ new Map();
5
+ /** One color from 8-bit RGB; returns its index. */
6
+ color(r, t, e) {
7
+ const s = this.next++;
8
+ if (s > 254) throw new Error('Palette full (255 is "clear")');
9
+ return this.pal.set([r >> 2, t >> 2, e >> 2], s * 3), s;
10
+ }
11
+ /** A ramp of n shades from dark to light (8-bit RGB stops); returns the indexes. */
12
+ ramp(r, t, e, s, n) {
13
+ const a = [];
14
+ for (let l = 0; l < t; l++) {
15
+ const o = t === 1 ? 0 : l / (t - 1), [c, h, p] = n ? o < 0.5 ? [e, n, o * 2] : [n, s, (o - 0.5) * 2] : [e, s, o];
16
+ a.push(this.color(...c.map((i, u) => Math.round(i + (h[u] - i) * p))));
17
+ }
18
+ return this.ramps.set(r, a), a;
19
+ }
20
+ get(r) {
21
+ const t = this.ramps.get(r);
22
+ if (!t) throw new Error(`No ramp ${r}`);
23
+ return t;
24
+ }
25
+ /**
26
+ * Game-Maker's designers look for these grays, reds, black and LCD green; keep them. Black
27
+ * comes first: PLAYGAME clears the screen to color 0 before the high score prompt.
28
+ */
29
+ designerColors() {
30
+ for (const [r, t, e] of [
31
+ [0, 0, 0],
32
+ [33, 33, 33],
33
+ [43, 0, 0],
34
+ [28, 0, 0],
35
+ [28, 28, 28],
36
+ [23, 23, 23],
37
+ [18, 18, 18],
38
+ [53, 0, 0],
39
+ [8, 48, 24]
40
+ ])
41
+ this.color(r * 4, t * 4, e * 4);
42
+ }
43
+ get used() {
44
+ return this.next;
45
+ }
46
+ }
47
+ export {
48
+ f as PaletteBuilder
49
+ };
@@ -0,0 +1,72 @@
1
+ import { textInk as F } from "./textBounds.js";
2
+ import { FONT8X8 as I } from "@lewismoten/gamemaker-sandbox-engine/gfx/font8x8";
3
+ const O = (g, k = 1) => g.length * 8 * k;
4
+ function M(g = {}) {
5
+ const {
6
+ custom: k,
7
+ shadowPixels: T,
8
+ shadowOffsets: W = [
9
+ [2, 2],
10
+ [1, 2],
11
+ [2, 1]
12
+ ],
13
+ outlineDistance: p = () => 1,
14
+ codePointWidth: A = !1,
15
+ shadowZero: C = !0
16
+ } = g;
17
+ function b(n, i, e, r, h, t = 1, o = !1) {
18
+ const x = F(n, r), m = (d, u, f = h) => {
19
+ n.rect(d, u, t, t, f), x?.add(d, u, t, t);
20
+ };
21
+ let w = i;
22
+ for (const d of r) {
23
+ const u = k?.(d, h, o);
24
+ if (u)
25
+ for (let f = 0; f < u.h; f++)
26
+ for (let c = 0; c < u.w; c++) {
27
+ const s = u.get(c, f);
28
+ s !== 255 && m(w + c * t, e + f * t, s);
29
+ }
30
+ else {
31
+ const f = (d.charCodeAt(0) & 255) * 8;
32
+ for (let c = 0; c < 8; c++) {
33
+ const s = I[f + c];
34
+ for (let P = 0; P < 8; P++) s & 1 << P && m(w + P * t, e + c * t);
35
+ }
36
+ }
37
+ w += 8 * t;
38
+ }
39
+ return x?.end(), A ? w - i : O(r, t);
40
+ }
41
+ function v(n, i, e, r, h, t, o = 1, x) {
42
+ if (x !== void 0 && (C || x !== 0))
43
+ for (const [w, d] of T?.(o) ?? W.map(([u, f]) => [u * o, f * o]))
44
+ b(n, i + w, e + d, r, x, o, !0);
45
+ const m = p(o);
46
+ for (const [w, d] of [
47
+ [-1, 0],
48
+ [1, 0],
49
+ [0, -1],
50
+ [0, 1],
51
+ [-1, -1],
52
+ [1, 1],
53
+ [1, -1],
54
+ [-1, 1]
55
+ ])
56
+ b(n, i + w * m, e + d * m, r, t, o, !0);
57
+ b(n, i, e, r, h, o);
58
+ }
59
+ function D(n, i, e, r, h = 1, t, o = n.w / 2, x) {
60
+ const m = Math.round(o - O(e, h) / 2);
61
+ t === void 0 ? b(n, m, i, e, r, h) : v(n, m, i, e, r, t, h, x);
62
+ }
63
+ return { text: b, outlined: v, centered: D };
64
+ }
65
+ const { text: Z, outlined: j, centered: q } = M();
66
+ export {
67
+ q as centered,
68
+ M as createPcText,
69
+ j as outlined,
70
+ Z as text,
71
+ O as textWidth
72
+ };
@@ -0,0 +1,150 @@
1
+ import { readFileSync as C } from "node:fs";
2
+ import { decodePartialJpeg as F } from "@lewismoten/gamemaker-sandbox-engine/formats/jpeg";
3
+ const G = 5 / 6;
4
+ function _(t) {
5
+ const o = F(new Uint8Array(C(t)));
6
+ if (!o?.complete || o.channels !== 3) throw new Error("JPEG scan did not decode");
7
+ return { w: o.width, h: o.height, rgb: o.pixels };
8
+ }
9
+ function $(t, o, c = 0, w = [0, 0, 1, 1]) {
10
+ const [h, n, x, e] = w, a = h * t.w, f = n * t.h, r = (x - h) * t.w, i = (e - n) * t.h;
11
+ c || (c = Math.round(o * G * i / r));
12
+ const s = new Uint8Array(o * c * 3), u = r / o, l = i / c;
13
+ for (let d = 0; d < c; d++)
14
+ for (let m = 0; m < o; m++) {
15
+ const y = a + m * u, M = f + d * l, P = y + Math.max(u, 1), v = M + Math.max(l, 1), b = [0, 0, 0];
16
+ let S = 0;
17
+ for (let g = Math.floor(M); g < Math.ceil(v); g++)
18
+ for (let p = Math.floor(y); p < Math.ceil(P); p++) {
19
+ const E = (Math.min(p + 1, P) - Math.max(p, y)) * (Math.min(g + 1, v) - Math.max(g, M));
20
+ if (E <= 0) continue;
21
+ const U = (Math.min(t.h - 1, g) * t.w + Math.min(t.w - 1, p)) * 3;
22
+ for (let A = 0; A < 3; A++) b[A] += t.rgb[U + A] * E;
23
+ S += E;
24
+ }
25
+ for (let g = 0; g < 3; g++) s[(d * o + m) * 3 + g] = Math.round(b[g] / S);
26
+ }
27
+ return { w: o, h: c, rgb: s };
28
+ }
29
+ function I(t, o) {
30
+ const c = new Uint8Array(t.rgb.length);
31
+ for (let w = 0; w < c.length; w += 3) {
32
+ const h = o([t.rgb[w], t.rgb[w + 1], t.rgb[w + 2]]);
33
+ for (let n = 0; n < 3; n++) c[w + n] = Math.max(0, Math.min(255, Math.round(h[n])));
34
+ }
35
+ return { ...t, rgb: c };
36
+ }
37
+ function z(t, o = [40, 24, 10], c = [250, 230, 190], w = 1.1) {
38
+ return I(t, ([h, n, x]) => {
39
+ const e = Math.max(0, Math.min(1, ((0.299 * h + 0.587 * n + 0.114 * x) / 255 - 0.5) * w + 0.5));
40
+ return [0, 1, 2].map((a) => o[a] + (c[a] - o[a]) * e);
41
+ });
42
+ }
43
+ function J(t, o) {
44
+ const c = /* @__PURE__ */ new Map();
45
+ for (let e = 0; e < t.rgb.length; e += 3) {
46
+ const a = t.rgb[e] >> 3 << 10 | t.rgb[e + 1] >> 3 << 5 | t.rgb[e + 2] >> 3;
47
+ c.set(a, (c.get(a) ?? 0) + 1);
48
+ }
49
+ let h = [[...c.entries()].sort((e, a) => e[0] - a[0]).map(([e, a]) => ({ c: [e >> 10 & 31, e >> 5 & 31, e & 31], n: a }))];
50
+ const n = (e, a) => {
51
+ let f = 31, r = 0;
52
+ for (const i of e)
53
+ f = Math.min(f, i.c[a]), r = Math.max(r, i.c[a]);
54
+ return r - f;
55
+ }, x = (e) => e.reduce((a, f) => a + f.n, 0);
56
+ for (; h.length < o; ) {
57
+ let e = -1, a = 0;
58
+ if (h.forEach((l, d) => {
59
+ if (l.length < 2) return;
60
+ const m = Math.max(n(l, 0), n(l, 1), n(l, 2)) * Math.sqrt(x(l));
61
+ m > a && ([a, e] = [m, d]);
62
+ }), e < 0) break;
63
+ const f = h[e], r = [0, 1, 2].reduce((l, d) => n(f, d) > n(f, l) ? d : l, 0);
64
+ f.sort((l, d) => l.c[r] - d.c[r] || l.c[0] - d.c[0] || l.c[1] - d.c[1] || l.c[2] - d.c[2]);
65
+ const i = x(f) / 2;
66
+ let s = 0, u = 1;
67
+ for (; u < f.length - 1 && !((s += f[u - 1].n) >= i); u++) ;
68
+ h = [...h.slice(0, e), f.slice(0, u), f.slice(u), ...h.slice(e + 1)];
69
+ }
70
+ return h.map((e) => {
71
+ const a = x(e);
72
+ return [0, 1, 2].map((f) => Math.min(63, Math.round(e.reduce((r, i) => r + (i.c[f] * 8 + 4) * i.n, 0) / a / 4)));
73
+ });
74
+ }
75
+ function L(t, o, c = []) {
76
+ const w = new Set(c);
77
+ for (let n = 0; n < t.h; n++)
78
+ for (let x = 0; x < t.w; x++)
79
+ o && x >= o.x && n >= o.y && x < o.x + o.w && n < o.y + o.h || w.add(t.px[n * t.w + x]);
80
+ const h = [];
81
+ for (let n = 0; n < 256; n++) w.has(n) || h.push(n);
82
+ return h;
83
+ }
84
+ function T(t, o, c) {
85
+ const w = (r) => r << 2 | r >> 4, h = c.map((r) => [w(o[r * 3]), w(o[r * 3 + 1]), w(o[r * 3 + 2])]), n = /* @__PURE__ */ new Map(), x = (r, i, s) => {
86
+ const u = r >> 2 << 12 | i >> 2 << 6 | s >> 2;
87
+ let l = n.get(u);
88
+ if (l !== void 0) return l;
89
+ let d = 1 / 0;
90
+ return l = 0, h.forEach((m, y) => {
91
+ const M = 3 * (m[0] - r) ** 2 + 4 * (m[1] - i) ** 2 + 2 * (m[2] - s) ** 2;
92
+ M < d && ([d, l] = [M, y]);
93
+ }), n.set(u, l), l;
94
+ }, e = Float32Array.from(t.rgb), a = new Uint8Array(t.w * t.h), f = (r) => Math.max(0, Math.min(255, Math.round(r)));
95
+ for (let r = 0; r < t.h; r++) {
96
+ const i = r % 2 === 1;
97
+ for (let s = 0; s < t.w; s++) {
98
+ const u = i ? t.w - 1 - s : s, l = r * t.w + u, d = f(e[l * 3]), m = f(e[l * 3 + 1]), y = f(e[l * 3 + 2]), M = x(d, m, y);
99
+ a[l] = c[M];
100
+ const P = [d - h[M][0], m - h[M][1], y - h[M][2]], v = i ? -1 : 1, b = (S, g, p) => {
101
+ const E = u + S * v, U = r + g;
102
+ if (E < 0 || E >= t.w || U >= t.h) return;
103
+ const A = (U * t.w + E) * 3;
104
+ for (let j = 0; j < 3; j++) e[A + j] += P[j] * p;
105
+ };
106
+ b(1, 0, 7 / 16), b(-1, 1, 3 / 16), b(0, 1, 5 / 16), b(1, 1, 1 / 16);
107
+ }
108
+ }
109
+ return a;
110
+ }
111
+ function B(t, o, c, w, h, n = {}) {
112
+ const x = L(t, { x: w, y: h, w: c.w, h: c.h }, n.reserved), e = x.slice(0, n.colors ?? x.length);
113
+ if (e.length < 16) throw new Error(`pastePhoto: only ${e.length} free palette entries`);
114
+ const a = o.slice();
115
+ J(c, e.length).forEach((i, s) => a.set(i, e[s] * 3));
116
+ let f = e;
117
+ if (n.share ?? !0) {
118
+ const i = /* @__PURE__ */ new Set();
119
+ for (let s = 0; s < t.h; s++) for (let u = 0; u < t.w; u++) (u < w || s < h || u >= w + c.w || s >= h + c.h) && i.add(t.px[s * t.w + u]);
120
+ f = [...e, ...[...i].filter((s) => !(n.reserved ?? []).includes(s)).sort((s, u) => s - u)];
121
+ }
122
+ const r = T(c, a, f);
123
+ for (let i = 0; i < c.h; i++) for (let s = 0; s < c.w; s++) t.set(w + s, h + i, r[i * c.w + s]);
124
+ return { pal: a, slots: e };
125
+ }
126
+ function D(t, o, c, w, h, n, x = 14) {
127
+ const [e, a, f, r] = [o - 4, c - 4, w + 8, h + 4 + x];
128
+ if ((n.shadow ?? -1) >= 0 && t.rect(e + 3, a + 3, f, r, n.shadow), t.rect(e, a, f, r, n.paper).frame(e, a, f, r, n.edge), (n.tape ?? -1) >= 0)
129
+ for (const [i, s] of [
130
+ [e - 5, 1],
131
+ [e + f - 17, -1]
132
+ ])
133
+ for (let u = 0; u < 22; u++)
134
+ for (let l = 0; l < 7; l++) {
135
+ const d = i + u, m = a - 6 + l + Math.round((s > 0 ? 21 - u : u) / 3);
136
+ ((d + m) % 2 === 0 || l === 0 || l === 6) && t.set(d, m, n.tape);
137
+ }
138
+ return { cx: e + f / 2, cy: c + h + x / 2 };
139
+ }
140
+ export {
141
+ T as ditherTo,
142
+ L as freeColors,
143
+ J as medianCut,
144
+ B as pastePhoto,
145
+ D as polaroid,
146
+ _ as readScan,
147
+ $ as resample,
148
+ z as sepia,
149
+ I as tone
150
+ };
@@ -0,0 +1,79 @@
1
+ class a {
2
+ constructor(h, t, i = 0) {
3
+ this.w = h, this.h = t, this.px = new Uint8Array(h * t).fill(i);
4
+ }
5
+ w;
6
+ h;
7
+ px;
8
+ get(h, t) {
9
+ return h < 0 || t < 0 || h >= this.w || t >= this.h ? -1 : this.px[t * this.w + h];
10
+ }
11
+ set(h, t, i) {
12
+ return h = Math.round(h), t = Math.round(t), h >= 0 && t >= 0 && h < this.w && t < this.h && (this.px[t * this.w + h] = i), this;
13
+ }
14
+ rect(h, t, i, e, r) {
15
+ for (let s = t; s < t + e; s++) for (let n = h; n < h + i; n++) this.set(n, s, r);
16
+ return this;
17
+ }
18
+ frame(h, t, i, e, r) {
19
+ return this.rect(h, t, i, 1, r).rect(h, t + e - 1, i, 1, r), this.rect(h, t, 1, e, r).rect(h + i - 1, t, 1, e, r);
20
+ }
21
+ line(h, t, i, e, r) {
22
+ const s = Math.max(Math.abs(i - h), Math.abs(e - t), 1);
23
+ for (let n = 0; n <= s; n++) this.set(h + (i - h) * n / s, t + (e - t) * n / s, r);
24
+ return this;
25
+ }
26
+ disc(h, t, i, e) {
27
+ for (let r = Math.floor(t - i); r <= t + i; r++)
28
+ for (let s = Math.floor(h - i); s <= h + i; s++) (s - h) ** 2 + (r - t) ** 2 <= i * i && this.set(s, r, e);
29
+ return this;
30
+ }
31
+ ring(h, t, i, e) {
32
+ for (let r = 0; r < Math.PI * 2; r += 0.5 / Math.max(1, i)) this.set(h + Math.cos(r) * i, t + Math.sin(r) * i, e);
33
+ return this;
34
+ }
35
+ /** Every pixel through fn(x, y, current) → new color (or the same). */
36
+ map(h) {
37
+ for (let t = 0; t < this.h; t++) for (let i = 0; i < this.w; i++) this.px[t * this.w + i] = h(i, t, this.px[t * this.w + i]);
38
+ return this;
39
+ }
40
+ /** Copies another picture in, skipping `transparent` pixels. */
41
+ blit(h, t, i, e = -1) {
42
+ for (let r = 0; r < h.h; r++)
43
+ for (let s = 0; s < h.w; s++) {
44
+ const n = h.px[r * h.w + s];
45
+ n !== e && this.set(t + s, i + r, n);
46
+ }
47
+ return this;
48
+ }
49
+ /** A sub-rectangle as a new picture (cutting a 20x20 block out of a big drawing). */
50
+ crop(h, t, i, e) {
51
+ const r = new a(i, e);
52
+ for (let s = 0; s < e; s++) for (let n = 0; n < i; n++) r.px[s * i + n] = this.get(h + n, t + s) & 255;
53
+ return r;
54
+ }
55
+ flipX() {
56
+ return new a(this.w, this.h).map((t, i) => this.get(this.w - 1 - t, i));
57
+ }
58
+ /** ASCII art: each character maps to a color through `key`; others are skipped. */
59
+ draw(h, t, i, e) {
60
+ return i.forEach((r, s) => [...r].forEach((n, f) => n in e && this.set(h + f, t + s, e[n]))), this;
61
+ }
62
+ }
63
+ function l(o) {
64
+ let h = o >>> 0;
65
+ return () => {
66
+ h = h + 1831565813 >>> 0;
67
+ let t = h;
68
+ return t = Math.imul(t ^ t >>> 15, t | 1), t ^= t + Math.imul(t ^ t >>> 7, t | 61), ((t ^ t >>> 14) >>> 0) / 4294967296;
69
+ };
70
+ }
71
+ function u(o, h, t) {
72
+ const i = [0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5];
73
+ return t * 16 > i[(h & 3) * 4 + (o & 3)];
74
+ }
75
+ export {
76
+ a as Pixels,
77
+ u as dither,
78
+ l as rng
79
+ };
@@ -0,0 +1,40 @@
1
+ import { crc32 as x } from "@lewismoten/gamemaker-sandbox-archives/zip";
2
+ import { deflateSync as D } from "node:zlib";
3
+ import { writeFileSync as p } from "node:fs";
4
+ import { Pixels as M } from "./pixels.js";
5
+ function y(h, t) {
6
+ const r = new Uint8Array(12 + t.length), o = new DataView(r.buffer);
7
+ o.setUint32(0, t.length);
8
+ for (let e = 0; e < 4; e++) r[4 + e] = h.charCodeAt(e);
9
+ return r.set(t, 8), o.setUint32(8 + t.length, x(r.subarray(4, 8 + t.length))), r;
10
+ }
11
+ function v(h, t, r, o = 1) {
12
+ const e = t.w * o, w = t.h * o, i = new Uint8Array((e * 3 + 1) * w);
13
+ for (let n = 0; n < w; n++) {
14
+ i[n * (e * 3 + 1)] = 0;
15
+ for (let f = 0; f < e; f++) {
16
+ const u = t.px[Math.floor(n / o) * t.w + Math.floor(f / o)], a = n * (e * 3 + 1) + 1 + f * 3;
17
+ if (u === 255) {
18
+ const l = (f >> 3) + (n >> 3) & 1 ? 200 : 160;
19
+ i[a] = i[a + 1] = i[a + 2] = l;
20
+ } else for (let l = 0; l < 3; l++) i[a + l] = r[u * 3 + l] << 2 | r[u * 3 + l] >> 4;
21
+ }
22
+ }
23
+ const c = new Uint8Array(13), s = new DataView(c.buffer);
24
+ s.setUint32(0, e), s.setUint32(4, w), c.set([8, 2, 0, 0, 0], 8);
25
+ const g = [Uint8Array.from([137, 80, 78, 71, 13, 10, 26, 10]), y("IHDR", c), y("IDAT", D(i)), y("IEND", new Uint8Array(0))], A = g.reduce((n, f) => n + f.length, 0), U = new Uint8Array(A);
26
+ let m = 0;
27
+ for (const n of g)
28
+ U.set(n, m), m += n.length;
29
+ p(h, U);
30
+ }
31
+ function E(h, t = 16, r = 0) {
32
+ const o = Math.ceil(h.length / t), e = new M(t * 22, o * 22, r);
33
+ return h.forEach((w, i) => {
34
+ for (let c = 0; c < 20; c++) for (let s = 0; s < 20; s++) e.set(i % t * 22 + s, Math.floor(i / t) * 22 + c, w.pixels[c * 20 + s]);
35
+ }), e;
36
+ }
37
+ export {
38
+ E as blockSheet,
39
+ v as writePng
40
+ };