ruby2d 0.12.0 → 1.0.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 (619) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +7 -0
  3. data/README.md +141 -0
  4. data/USAGE.md +2435 -0
  5. data/assets/Rakefile +637 -0
  6. data/assets/build_support/CMakeLists.txt +94 -0
  7. data/assets/build_support/mruby/build_config.rb +34 -0
  8. data/assets/build_support/mruby/build_config_wasm.rb +30 -0
  9. data/assets/build_support/sdl_test.c +174 -0
  10. data/assets/deps.yaml +16 -0
  11. data/assets/platform/include/SDL3/SDL.h +91 -0
  12. data/assets/platform/include/SDL3/SDL_assert.h +705 -0
  13. data/assets/platform/include/SDL3/SDL_asyncio.h +550 -0
  14. data/assets/platform/include/SDL3/SDL_atomic.h +692 -0
  15. data/assets/platform/include/SDL3/SDL_audio.h +2370 -0
  16. data/assets/platform/include/SDL3/SDL_begin_code.h +553 -0
  17. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_bits.h +47 -27
  18. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_blendmode.h +59 -55
  19. data/assets/platform/include/SDL3/SDL_camera.h +535 -0
  20. data/assets/platform/include/SDL3/SDL_clipboard.h +331 -0
  21. data/assets/{include/SDL2/close_code.h → platform/include/SDL3/SDL_close_code.h} +9 -8
  22. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_copying.h +3 -1
  23. data/assets/platform/include/SDL3/SDL_cpuinfo.h +374 -0
  24. data/assets/platform/include/SDL3/SDL_dialog.h +343 -0
  25. data/assets/platform/include/SDL3/SDL_dlopennote.h +234 -0
  26. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_egl.h +11 -8
  27. data/assets/platform/include/SDL3/SDL_endian.h +645 -0
  28. data/assets/platform/include/SDL3/SDL_error.h +226 -0
  29. data/assets/platform/include/SDL3/SDL_events.h +1645 -0
  30. data/assets/platform/include/SDL3/SDL_filesystem.h +537 -0
  31. data/assets/platform/include/SDL3/SDL_gamepad.h +1656 -0
  32. data/assets/platform/include/SDL3/SDL_gpu.h +4608 -0
  33. data/assets/platform/include/SDL3/SDL_guid.h +106 -0
  34. data/assets/platform/include/SDL3/SDL_haptic.h +1461 -0
  35. data/assets/platform/include/SDL3/SDL_hidapi.h +571 -0
  36. data/assets/platform/include/SDL3/SDL_hints.h +5001 -0
  37. data/assets/platform/include/SDL3/SDL_init.h +507 -0
  38. data/assets/platform/include/SDL3/SDL_intrin.h +410 -0
  39. data/assets/platform/include/SDL3/SDL_iostream.h +1379 -0
  40. data/assets/platform/include/SDL3/SDL_joystick.h +1385 -0
  41. data/assets/platform/include/SDL3/SDL_keyboard.h +608 -0
  42. data/assets/platform/include/SDL3/SDL_keycode.h +347 -0
  43. data/assets/platform/include/SDL3/SDL_loadso.h +145 -0
  44. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_locale.h +40 -24
  45. data/assets/platform/include/SDL3/SDL_log.h +541 -0
  46. data/assets/platform/include/SDL3/SDL_main.h +704 -0
  47. data/assets/platform/include/SDL3/SDL_main_impl.h +151 -0
  48. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_messagebox.h +85 -48
  49. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_metal.h +29 -29
  50. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_misc.h +13 -12
  51. data/assets/platform/include/SDL3/SDL_mouse.h +813 -0
  52. data/assets/platform/include/SDL3/SDL_mutex.h +1117 -0
  53. data/assets/platform/include/SDL3/SDL_oldnames.h +1339 -0
  54. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl.h +1247 -278
  55. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl_glext.h +5 -1
  56. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles.h +6 -7
  57. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2.h +10 -11
  58. data/assets/platform/include/SDL3/SDL_pen.h +198 -0
  59. data/assets/platform/include/SDL3/SDL_pixels.h +1441 -0
  60. data/assets/{include/SDL2/SDL_test_log.h → platform/include/SDL3/SDL_platform.h} +25 -26
  61. data/assets/platform/include/SDL3/SDL_platform_defines.h +497 -0
  62. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_power.h +40 -20
  63. data/assets/platform/include/SDL3/SDL_process.h +441 -0
  64. data/assets/platform/include/SDL3/SDL_properties.h +572 -0
  65. data/assets/platform/include/SDL3/SDL_rect.h +528 -0
  66. data/assets/platform/include/SDL3/SDL_render.h +3028 -0
  67. data/assets/platform/include/SDL3/SDL_revision.h +59 -0
  68. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_scancode.h +59 -68
  69. data/assets/platform/include/SDL3/SDL_sensor.h +321 -0
  70. data/assets/platform/include/SDL3/SDL_stdinc.h +6186 -0
  71. data/assets/platform/include/SDL3/SDL_storage.h +686 -0
  72. data/assets/platform/include/SDL3/SDL_surface.h +1769 -0
  73. data/assets/platform/include/SDL3/SDL_system.h +840 -0
  74. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test.h +16 -22
  75. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_assert.h +27 -34
  76. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_common.h +109 -52
  77. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_compare.h +22 -14
  78. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_crc32.h +27 -30
  79. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_font.h +50 -49
  80. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_fuzzer.h +64 -79
  81. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_harness.h +47 -30
  82. data/assets/platform/include/SDL3/SDL_test_log.h +83 -0
  83. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_md5.h +21 -28
  84. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_memory.h +19 -16
  85. data/assets/platform/include/SDL3/SDL_thread.h +602 -0
  86. data/assets/platform/include/SDL3/SDL_time.h +249 -0
  87. data/assets/platform/include/SDL3/SDL_timer.h +454 -0
  88. data/assets/platform/include/SDL3/SDL_touch.h +184 -0
  89. data/assets/platform/include/SDL3/SDL_tray.h +544 -0
  90. data/assets/platform/include/SDL3/SDL_version.h +198 -0
  91. data/assets/platform/include/SDL3/SDL_video.h +3497 -0
  92. data/assets/platform/include/SDL3/SDL_vulkan.h +287 -0
  93. data/assets/platform/include/SDL3_image/SDL_image.h +3328 -0
  94. data/assets/platform/include/SDL3_mixer/SDL_mixer.h +3369 -0
  95. data/assets/platform/include/SDL3_ttf/SDL_textengine.h +181 -0
  96. data/assets/platform/include/SDL3_ttf/SDL_ttf.h +2833 -0
  97. data/assets/{include → platform/include}/mrbconf.h +42 -31
  98. data/assets/{include → platform/include}/mruby/array.h +3 -4
  99. data/assets/{include → platform/include}/mruby/boxing_nan.h +10 -0
  100. data/assets/platform/include/mruby/boxing_no.h +59 -0
  101. data/assets/{include → platform/include}/mruby/boxing_word.h +72 -26
  102. data/assets/platform/include/mruby/class.h +157 -0
  103. data/assets/{include → platform/include}/mruby/common.h +30 -1
  104. data/assets/{include → platform/include}/mruby/compile.h +52 -74
  105. data/assets/{include → platform/include}/mruby/data.h +2 -2
  106. data/assets/{include → platform/include}/mruby/debug.h +12 -5
  107. data/assets/{include → platform/include}/mruby/dump.h +7 -9
  108. data/assets/{include → platform/include}/mruby/endian.h +1 -1
  109. data/assets/platform/include/mruby/error.h +173 -0
  110. data/assets/platform/include/mruby/gc.h +79 -0
  111. data/assets/{include → platform/include}/mruby/hash.h +1 -7
  112. data/assets/platform/include/mruby/internal.h +282 -0
  113. data/assets/platform/include/mruby/irep.h +143 -0
  114. data/assets/{include → platform/include}/mruby/istruct.h +1 -1
  115. data/assets/platform/include/mruby/khash.h +455 -0
  116. data/assets/platform/include/mruby/mempool.h +19 -0
  117. data/assets/{include → platform/include}/mruby/numeric.h +7 -10
  118. data/assets/platform/include/mruby/object.h +51 -0
  119. data/assets/{include → platform/include}/mruby/opcode.h +5 -5
  120. data/assets/{include → platform/include}/mruby/ops.h +19 -6
  121. data/assets/platform/include/mruby/presym/id.h +1447 -0
  122. data/assets/{include → platform/include}/mruby/presym/scanning.h +10 -7
  123. data/assets/platform/include/mruby/presym/table.h +2893 -0
  124. data/assets/platform/include/mruby/presym.h +65 -0
  125. data/assets/platform/include/mruby/proc.h +184 -0
  126. data/assets/{include → platform/include}/mruby/range.h +0 -2
  127. data/assets/{include → platform/include}/mruby/string.h +33 -53
  128. data/assets/platform/include/mruby/throw.h +81 -0
  129. data/assets/{include → platform/include}/mruby/value.h +64 -29
  130. data/assets/{include → platform/include}/mruby/variable.h +6 -23
  131. data/assets/{include → platform/include}/mruby/version.h +7 -7
  132. data/assets/{include → platform/include}/mruby.h +238 -116
  133. data/assets/platform/macos-arm64/bin/mrbc +0 -0
  134. data/assets/platform/macos-arm64/lib/libSDL3.a +0 -0
  135. data/assets/platform/macos-arm64/lib/libSDL3_image.a +0 -0
  136. data/assets/platform/macos-arm64/lib/libSDL3_mixer.a +0 -0
  137. data/assets/platform/macos-arm64/lib/libSDL3_ttf.a +0 -0
  138. data/assets/platform/macos-arm64/lib/libmruby.a +0 -0
  139. data/assets/platform/wasm/lib/libFLAC.a +0 -0
  140. data/assets/platform/wasm/lib/libSDL3.a +0 -0
  141. data/assets/platform/wasm/lib/libSDL3_image.a +0 -0
  142. data/assets/platform/wasm/lib/libSDL3_mixer.a +0 -0
  143. data/assets/platform/wasm/lib/libSDL3_ttf.a +0 -0
  144. data/assets/platform/wasm/lib/libfreetype.a +0 -0
  145. data/assets/platform/wasm/lib/libharfbuzz.a +0 -0
  146. data/assets/platform/wasm/lib/libmruby.a +0 -0
  147. data/assets/platform/wasm/lib/libogg.a +0 -0
  148. data/assets/platform/wasm/lib/libplutosvg.a +0 -0
  149. data/assets/platform/wasm/lib/libplutovg.a +0 -0
  150. data/assets/platform/wasm/lib/libpng.a +0 -0
  151. data/assets/platform/wasm/lib/libpng16.a +0 -0
  152. data/assets/platform/wasm/lib/libvorbis.a +0 -0
  153. data/assets/platform/wasm/lib/libvorbisfile.a +0 -0
  154. data/assets/platform/wasm/lib/libzlibstatic.a +0 -0
  155. data/assets/platform/windows-arm64-mingw-ucrt/bin/mrbc.exe +0 -0
  156. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3.a +0 -0
  157. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  158. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  159. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  160. data/assets/platform/windows-arm64-mingw-ucrt/lib/libmruby.a +0 -0
  161. data/assets/platform/windows-x86_64-mingw-ucrt/bin/mrbc.exe +0 -0
  162. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3.a +0 -0
  163. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  164. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  165. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  166. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libmruby.a +0 -0
  167. data/assets/resources/fonts/outfit/OFL.txt +93 -0
  168. data/assets/resources/fonts/outfit/outfit.ttf +0 -0
  169. data/assets/resources/fonts/roboto_mono/OFL.txt +91 -0
  170. data/assets/resources/fonts/roboto_mono/roboto_mono.ttf +0 -0
  171. data/assets/resources/icons/icon.icns +0 -0
  172. data/assets/resources/icons/icon.png +0 -0
  173. data/assets/resources/spritesheets/License.txt +28 -0
  174. data/assets/resources/spritesheets/spritesheet-backgrounds.png +0 -0
  175. data/assets/resources/spritesheets/spritesheet-backgrounds.xml +16 -0
  176. data/assets/resources/spritesheets/spritesheet-characters.png +0 -0
  177. data/assets/resources/spritesheets/spritesheet-characters.xml +47 -0
  178. data/assets/resources/spritesheets/spritesheet-enemies.png +0 -0
  179. data/assets/resources/spritesheets/spritesheet-enemies.xml +62 -0
  180. data/assets/resources/spritesheets/spritesheet-tiles.png +0 -0
  181. data/assets/resources/spritesheets/spritesheet-tiles.xml +316 -0
  182. data/assets/{wasm → resources/web}/template.html +1 -1
  183. data/assets/target.rb +131 -0
  184. data/bin/ruby2d +281 -82
  185. data/examples/astar.rb +269 -0
  186. data/examples/asteroids.rb +403 -0
  187. data/examples/bezier_editor.rb +96 -0
  188. data/examples/boids.rb +191 -0
  189. data/examples/bouncing_balls.rb +119 -0
  190. data/examples/breakout.rb +186 -0
  191. data/examples/constellations.rb +100 -0
  192. data/examples/dashboard.rb +133 -0
  193. data/examples/double_pendulum.rb +254 -0
  194. data/examples/falling_sand.rb +291 -0
  195. data/examples/fireworks.rb +110 -0
  196. data/examples/fluid_dynamics.rb +340 -0
  197. data/examples/fourier_epicycles.rb +142 -0
  198. data/examples/fractal_tree.rb +326 -0
  199. data/examples/game_of_life.rb +148 -0
  200. data/examples/gamepads.rb +333 -0
  201. data/examples/hill_driver.rb +613 -0
  202. data/examples/logo_animation.rb +251 -0
  203. data/examples/lorenz_attractor.rb +115 -0
  204. data/examples/mandelbrot.rb +207 -0
  205. data/examples/marching_squares.rb +200 -0
  206. data/examples/maze.rb +323 -0
  207. data/examples/nbody.rb +338 -0
  208. data/examples/outrun.rb +391 -0
  209. data/examples/pixel_paint.rb +313 -0
  210. data/examples/platformer.rb +335 -0
  211. data/examples/ray_casting_maze.rb +175 -0
  212. data/examples/shadow_casting.rb +151 -0
  213. data/examples/shape_recognizer.rb +908 -0
  214. data/examples/snake.rb +144 -0
  215. data/examples/sprite_sheets.rb +246 -0
  216. data/examples/swarm.rb +206 -0
  217. data/examples/tsp_annealing.rb +104 -0
  218. data/examples/ui_controls.rb +163 -0
  219. data/examples/wireframe_3d.rb +139 -0
  220. data/ext/ruby2d/audio.c +324 -0
  221. data/ext/ruby2d/canvas.c +1715 -494
  222. data/ext/ruby2d/ext.c +541 -0
  223. data/ext/ruby2d/extconf.rb +122 -145
  224. data/ext/ruby2d/font.c +566 -20
  225. data/ext/ruby2d/fps.c +92 -0
  226. data/ext/ruby2d/image.c +466 -41
  227. data/ext/ruby2d/ruby2d.c +374 -1890
  228. data/ext/ruby2d/ruby2d.h +840 -460
  229. data/ext/ruby2d/shapes.c +931 -101
  230. data/ext/ruby2d/text.c +586 -21
  231. data/ext/ruby2d/window.c +1693 -283
  232. data/lib/ruby2d/atlas_parser.rb +194 -0
  233. data/lib/ruby2d/audio.rb +73 -0
  234. data/lib/ruby2d/benchmark.rb +259 -0
  235. data/lib/ruby2d/bitmap_text.rb +155 -0
  236. data/lib/ruby2d/button.rb +402 -0
  237. data/lib/ruby2d/canvas.rb +703 -279
  238. data/lib/ruby2d/circle.rb +206 -29
  239. data/lib/ruby2d/cli/browser.rb +314 -0
  240. data/lib/ruby2d/cli/build.rb +471 -257
  241. data/lib/ruby2d/cli/colorize.rb +7 -5
  242. data/lib/ruby2d/cli/examples.rb +127 -0
  243. data/lib/ruby2d/cli/launch.rb +24 -39
  244. data/lib/ruby2d/cli/lib_files.rb +48 -0
  245. data/lib/ruby2d/cli/messages.rb +40 -0
  246. data/lib/ruby2d/cli/setup.rb +273 -0
  247. data/lib/ruby2d/cli/static_server.rb +160 -0
  248. data/lib/ruby2d/cli/usage.rb +255 -0
  249. data/lib/ruby2d/color.rb +191 -69
  250. data/lib/ruby2d/core.rb +37 -19
  251. data/lib/ruby2d/deps_help.rb +89 -0
  252. data/lib/ruby2d/dsl.rb +51 -12
  253. data/lib/ruby2d/ellipse.rb +228 -0
  254. data/lib/ruby2d/exceptions.rb +0 -2
  255. data/lib/ruby2d/font.rb +34 -74
  256. data/lib/ruby2d/gamepad.rb +323 -0
  257. data/lib/ruby2d/gem_paths.rb +19 -0
  258. data/lib/ruby2d/image.rb +155 -52
  259. data/lib/ruby2d/interactive.rb +103 -0
  260. data/lib/ruby2d/json_parser.rb +268 -0
  261. data/lib/ruby2d/line.rb +194 -85
  262. data/lib/ruby2d/mruby_compat.rb +12 -0
  263. data/lib/ruby2d/polygon.rb +297 -0
  264. data/lib/ruby2d/polyline.rb +368 -0
  265. data/lib/ruby2d/quad.rb +358 -94
  266. data/lib/ruby2d/rectangle.rb +77 -19
  267. data/lib/ruby2d/renderable.rb +411 -11
  268. data/lib/ruby2d/sprite.rb +471 -180
  269. data/lib/ruby2d/sprite_sheet.rb +64 -0
  270. data/lib/ruby2d/square.rb +29 -17
  271. data/lib/ruby2d/text.rb +196 -65
  272. data/lib/ruby2d/tileset.rb +139 -81
  273. data/lib/ruby2d/triangle.rb +324 -89
  274. data/lib/ruby2d/version.rb +1 -3
  275. data/lib/ruby2d/vertices.rb +62 -85
  276. data/lib/ruby2d/warnings.rb +29 -0
  277. data/lib/ruby2d/window/class_methods.rb +218 -0
  278. data/lib/ruby2d/window/gamepad_events.rb +141 -0
  279. data/lib/ruby2d/window/key_events.rb +74 -0
  280. data/lib/ruby2d/window/mouse_events.rb +171 -0
  281. data/lib/ruby2d/window/object_events.rb +168 -0
  282. data/lib/ruby2d/window.rb +632 -585
  283. data/lib/ruby2d.rb +14 -19
  284. metadata +275 -428
  285. data/assets/app.icns +0 -0
  286. data/assets/include/GLES2/gl2.h +0 -656
  287. data/assets/include/GLES2/gl2ext.h +0 -3949
  288. data/assets/include/GLES2/gl2ext_angle.h +0 -701
  289. data/assets/include/GLES2/gl2platform.h +0 -27
  290. data/assets/include/GLES3/gl3.h +0 -1192
  291. data/assets/include/GLES3/gl31.h +0 -1507
  292. data/assets/include/GLES3/gl32.h +0 -1808
  293. data/assets/include/GLES3/gl3platform.h +0 -27
  294. data/assets/include/KHR/khrplatform.h +0 -290
  295. data/assets/include/SDL2/SDL.h +0 -233
  296. data/assets/include/SDL2/SDL_assert.h +0 -326
  297. data/assets/include/SDL2/SDL_atomic.h +0 -415
  298. data/assets/include/SDL2/SDL_audio.h +0 -1500
  299. data/assets/include/SDL2/SDL_clipboard.h +0 -141
  300. data/assets/include/SDL2/SDL_config.h +0 -61
  301. data/assets/include/SDL2/SDL_config_android.h +0 -194
  302. data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
  303. data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
  304. data/assets/include/SDL2/SDL_config_macosx.h +0 -277
  305. data/assets/include/SDL2/SDL_config_minimal.h +0 -95
  306. data/assets/include/SDL2/SDL_config_ngage.h +0 -89
  307. data/assets/include/SDL2/SDL_config_os2.h +0 -207
  308. data/assets/include/SDL2/SDL_config_pandora.h +0 -141
  309. data/assets/include/SDL2/SDL_config_windows.h +0 -331
  310. data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
  311. data/assets/include/SDL2/SDL_config_winrt.h +0 -220
  312. data/assets/include/SDL2/SDL_config_xbox.h +0 -235
  313. data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
  314. data/assets/include/SDL2/SDL_endian.h +0 -348
  315. data/assets/include/SDL2/SDL_error.h +0 -163
  316. data/assets/include/SDL2/SDL_events.h +0 -1166
  317. data/assets/include/SDL2/SDL_filesystem.h +0 -149
  318. data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
  319. data/assets/include/SDL2/SDL_gesture.h +0 -117
  320. data/assets/include/SDL2/SDL_guid.h +0 -100
  321. data/assets/include/SDL2/SDL_haptic.h +0 -1341
  322. data/assets/include/SDL2/SDL_hidapi.h +0 -451
  323. data/assets/include/SDL2/SDL_hints.h +0 -2569
  324. data/assets/include/SDL2/SDL_image.h +0 -2173
  325. data/assets/include/SDL2/SDL_joystick.h +0 -1066
  326. data/assets/include/SDL2/SDL_keyboard.h +0 -353
  327. data/assets/include/SDL2/SDL_keycode.h +0 -358
  328. data/assets/include/SDL2/SDL_loadso.h +0 -115
  329. data/assets/include/SDL2/SDL_log.h +0 -404
  330. data/assets/include/SDL2/SDL_main.h +0 -275
  331. data/assets/include/SDL2/SDL_mixer.h +0 -2784
  332. data/assets/include/SDL2/SDL_mouse.h +0 -465
  333. data/assets/include/SDL2/SDL_mutex.h +0 -471
  334. data/assets/include/SDL2/SDL_name.h +0 -33
  335. data/assets/include/SDL2/SDL_pixels.h +0 -644
  336. data/assets/include/SDL2/SDL_platform.h +0 -261
  337. data/assets/include/SDL2/SDL_quit.h +0 -58
  338. data/assets/include/SDL2/SDL_rect.h +0 -376
  339. data/assets/include/SDL2/SDL_render.h +0 -1919
  340. data/assets/include/SDL2/SDL_revision.h +0 -6
  341. data/assets/include/SDL2/SDL_rwops.h +0 -841
  342. data/assets/include/SDL2/SDL_sensor.h +0 -322
  343. data/assets/include/SDL2/SDL_shape.h +0 -155
  344. data/assets/include/SDL2/SDL_stdinc.h +0 -830
  345. data/assets/include/SDL2/SDL_surface.h +0 -997
  346. data/assets/include/SDL2/SDL_system.h +0 -623
  347. data/assets/include/SDL2/SDL_syswm.h +0 -386
  348. data/assets/include/SDL2/SDL_test_images.h +0 -78
  349. data/assets/include/SDL2/SDL_test_random.h +0 -115
  350. data/assets/include/SDL2/SDL_thread.h +0 -464
  351. data/assets/include/SDL2/SDL_timer.h +0 -222
  352. data/assets/include/SDL2/SDL_touch.h +0 -150
  353. data/assets/include/SDL2/SDL_ttf.h +0 -2316
  354. data/assets/include/SDL2/SDL_types.h +0 -29
  355. data/assets/include/SDL2/SDL_version.h +0 -204
  356. data/assets/include/SDL2/SDL_video.h +0 -2150
  357. data/assets/include/SDL2/SDL_vulkan.h +0 -215
  358. data/assets/include/SDL2/begin_code.h +0 -187
  359. data/assets/include/mruby/boxing_no.h +0 -58
  360. data/assets/include/mruby/class.h +0 -108
  361. data/assets/include/mruby/error.h +0 -147
  362. data/assets/include/mruby/gc.h +0 -94
  363. data/assets/include/mruby/irep.h +0 -147
  364. data/assets/include/mruby/khash.h +0 -284
  365. data/assets/include/mruby/object.h +0 -43
  366. data/assets/include/mruby/presym/disable.h +0 -70
  367. data/assets/include/mruby/presym/enable.h +0 -37
  368. data/assets/include/mruby/presym.h +0 -40
  369. data/assets/include/mruby/proc.h +0 -211
  370. data/assets/include/mruby/throw.h +0 -66
  371. data/assets/macos/universal/bin/mrbc +0 -0
  372. data/assets/macos/universal/lib/libFLAC.a +0 -0
  373. data/assets/macos/universal/lib/libSDL2.a +0 -0
  374. data/assets/macos/universal/lib/libSDL2_image.a +0 -0
  375. data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
  376. data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
  377. data/assets/macos/universal/lib/libavif.a +0 -0
  378. data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
  379. data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
  380. data/assets/macos/universal/lib/libfreetype.a +0 -0
  381. data/assets/macos/universal/lib/libgraphite2.a +0 -0
  382. data/assets/macos/universal/lib/libharfbuzz.a +0 -0
  383. data/assets/macos/universal/lib/libhwy.a +0 -0
  384. data/assets/macos/universal/lib/libjpeg.a +0 -0
  385. data/assets/macos/universal/lib/libjxl.a +0 -0
  386. data/assets/macos/universal/lib/libmodplug.a +0 -0
  387. data/assets/macos/universal/lib/libmpg123.a +0 -0
  388. data/assets/macos/universal/lib/libmruby.a +0 -0
  389. data/assets/macos/universal/lib/libogg.a +0 -0
  390. data/assets/macos/universal/lib/libpng.a +0 -0
  391. data/assets/macos/universal/lib/libtiff.a +0 -0
  392. data/assets/macos/universal/lib/libvorbis.a +0 -0
  393. data/assets/macos/universal/lib/libvorbisfile.a +0 -0
  394. data/assets/macos/universal/lib/libwebp.a +0 -0
  395. data/assets/macos/universal/lib/libzstd.a +0 -0
  396. data/assets/test_media/README.md +0 -3
  397. data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
  398. data/assets/test_media/bitstream_vera/vera.ttf +0 -0
  399. data/assets/test_media/boom.png +0 -0
  400. data/assets/test_media/coin.png +0 -0
  401. data/assets/test_media/colors.png +0 -0
  402. data/assets/test_media/controller.png +0 -0
  403. data/assets/test_media/dial.wav +0 -0
  404. data/assets/test_media/hero.png +0 -0
  405. data/assets/test_media/image.bmp +0 -0
  406. data/assets/test_media/image.jpg +0 -0
  407. data/assets/test_media/image.png +0 -0
  408. data/assets/test_media/music.flac +0 -0
  409. data/assets/test_media/music.mp3 +0 -0
  410. data/assets/test_media/music.ogg +0 -0
  411. data/assets/test_media/music.wav +0 -0
  412. data/assets/test_media/originals/boom.pxm +0 -0
  413. data/assets/test_media/originals/coin.pxm +0 -0
  414. data/assets/test_media/originals/controller.sketch +0 -0
  415. data/assets/test_media/originals/hero.pxm +0 -0
  416. data/assets/test_media/originals/image.pxm +0 -0
  417. data/assets/test_media/originals/music.caf +0 -0
  418. data/assets/test_media/originals/texture_atlas.pxm +0 -0
  419. data/assets/test_media/rondo_alla_turka.ogg +0 -0
  420. data/assets/test_media/sound.flac +0 -0
  421. data/assets/test_media/sound.mp3 +0 -0
  422. data/assets/test_media/sound.ogg +0 -0
  423. data/assets/test_media/sound.wav +0 -0
  424. data/assets/test_media/sprite_sheet.png +0 -0
  425. data/assets/test_media/texture_atlas.png +0 -0
  426. data/assets/wasm/libmruby.a +0 -0
  427. data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
  428. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
  429. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
  430. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
  431. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
  432. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
  433. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
  434. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
  435. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
  436. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
  437. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
  438. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
  439. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
  440. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
  441. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
  442. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
  443. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
  444. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
  445. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
  446. data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
  447. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
  448. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
  449. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
  450. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
  451. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
  452. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
  453. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
  454. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
  455. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
  456. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
  457. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
  458. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
  459. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
  460. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
  461. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
  462. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
  463. data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
  464. data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
  465. data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
  466. data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
  467. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
  468. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
  469. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
  470. data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
  471. data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
  472. data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
  473. data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
  474. data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
  475. data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
  476. data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
  477. data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
  478. data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
  479. data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
  480. data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
  481. data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
  482. data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
  483. data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
  484. data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
  485. data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
  486. data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
  487. data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
  488. data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
  489. data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
  490. data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
  491. data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
  492. data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
  493. data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
  494. data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
  495. data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
  496. data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
  497. data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
  498. data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
  499. data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  500. data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
  501. data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
  502. data/assets/xcode/ios/Info.plist +0 -43
  503. data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
  504. data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
  505. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  506. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  507. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  508. data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
  509. data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
  510. data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
  511. data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
  512. data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
  513. data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
  514. data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
  515. data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
  516. data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
  517. data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
  518. data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
  519. data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
  520. data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
  521. data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
  522. data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
  523. data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
  524. data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
  525. data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
  526. data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
  527. data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
  528. data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
  529. data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
  530. data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
  531. data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
  532. data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
  533. data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
  534. data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
  535. data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
  536. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  537. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  538. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  539. data/assets/xcode/ios/main.c +0 -1
  540. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  541. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
  542. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
  543. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  544. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
  545. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  546. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  547. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  548. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
  549. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
  550. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  551. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
  552. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  553. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  554. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
  555. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
  556. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
  557. data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
  558. data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
  559. data/assets/xcode/tvos/Info.plist +0 -30
  560. data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
  561. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
  562. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  563. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  564. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  565. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
  566. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
  567. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
  568. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
  569. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
  570. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
  571. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
  572. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
  573. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
  574. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
  575. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
  576. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
  577. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
  578. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
  579. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
  580. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
  581. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
  582. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
  583. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
  584. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
  585. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
  586. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
  587. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
  588. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
  589. data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
  590. data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
  591. data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
  592. data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
  593. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  594. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  595. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  596. data/assets/xcode/tvos/main.c +0 -1
  597. data/ext/ruby2d/common.c +0 -185
  598. data/ext/ruby2d/controllers.c +0 -110
  599. data/ext/ruby2d/gl.c +0 -398
  600. data/ext/ruby2d/gl2.c +0 -86
  601. data/ext/ruby2d/gl3.c +0 -304
  602. data/ext/ruby2d/gles.c +0 -302
  603. data/ext/ruby2d/input.c +0 -48
  604. data/ext/ruby2d/music.c +0 -127
  605. data/ext/ruby2d/sound.c +0 -132
  606. data/lib/ruby2d/cli/console.rb +0 -65
  607. data/lib/ruby2d/cli/enable_console.rb +0 -7
  608. data/lib/ruby2d/cli/platform.rb +0 -17
  609. data/lib/ruby2d/music.rb +0 -77
  610. data/lib/ruby2d/pixel.rb +0 -18
  611. data/lib/ruby2d/pixmap.rb +0 -39
  612. data/lib/ruby2d/pixmap_atlas.rb +0 -56
  613. data/lib/ruby2d/sound.rb +0 -61
  614. data/lib/ruby2d/texture.rb +0 -38
  615. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
  616. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
  617. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
  618. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
  619. /data/assets/{include → platform/include}/mruby/re.h +0 -0
data/bin/ruby2d CHANGED
@@ -8,97 +8,181 @@ require 'ruby2d/version'
8
8
 
9
9
  # Usage ########################################################################
10
10
 
11
- usage = "Ruby 2D: Make cross-platform 2D applications in Ruby".bold + "\n
12
- Usage: ruby2d <command> <options>
13
- [-v|--version]
11
+ r = "\e[38;2;246;60;56m"
12
+ x = "\e[0m"
14
13
 
15
- Summary of commands and options:
16
- console Run script in an interactive console
17
- build Build a Ruby source file
18
- launch Launch a built Ruby 2D application
19
- simulator Interact with iOS and tvOS simulators
20
- -v|--version Prints the installed version\n\n"
14
+ usage = "
15
+ #{r} ◆#{x}
16
+ #{r} ◆ ◆#{x} #{'Ruby 2D'.ruby2d_red.bold} #{('v' + Ruby2D::VERSION).dim}
17
+ #{r} ◆ ◆#{x}
18
+ #{r} ◆#{x} Make 2D applications with Ruby
19
+ #{r} ◆#{x}
21
20
 
22
- usage_build = "
23
- Use the #{'build'.bold} command to compile or build Ruby 2D apps.
21
+ #{'Commands:'.bold}
22
+ build Build a Ruby source file
23
+ launch Launch a built Ruby 2D application
24
+ setup Build the native libraries (SDL3 + mruby) for your platform
25
+ usage Browse the Ruby 2D usage guide by section
26
+ examples Browse and run the bundled example apps
27
+ agents Print the usage guide for AI coding agents
24
28
 
25
- To compile and create a native executable, use:
26
- build --native <ruby_file>
29
+ #{'Options:'.bold}
30
+ -h, --help Show this help (or use after a command for its help)
31
+ -v, --version Print the installed version
27
32
 
28
- To build for the web with WebAssembly, use:
29
- build --web <ruby_file>
33
+ #{'ruby2d.com'.dim}
34
+ \n"
30
35
 
31
- To build a macOS app bundle, use:
32
- build --macos <ruby_file>
36
+ usage_build = "
37
+ Use the #{'build'.bold} command to compile or build Ruby 2D apps.
33
38
 
34
- To build an iOS or tvOS app, use:
35
- build --ios <ruby_file>
36
- build --tvos <ruby_file>
39
+ Usage: ruby2d build [options] <ruby_file>
37
40
 
38
- To build for every platform supported by the current system, use:
39
- build --all <ruby_file>
41
+ Targets:
42
+ --native Build a native executable only
43
+ --web Build for the web with WebAssembly only
44
+ (default) Build for all platforms
40
45
 
41
- To clean up the build directory, use:
42
- build --clean
46
+ Options:
47
+ --assets <dir> Bundle a directory of media files (native and web)
48
+ --template <file> Use a custom HTML template for the web build (web only)
49
+ --single-file Produce a single self-contained HTML file (web only)
50
+ --debug Print debugging info and keep intermediate files
51
+ --clean Clean up the build directory
43
52
 
44
- Add the #{'--debug'.bold} option to print debugging info
45
- and keep all intermediate files generated.\n\n"
53
+ An app can bundle its own asset directories without the --assets flag by
54
+ declaring them in its source: #{'# ruby2d:assets <dir>'.bold} (one per line).\n\n"
46
55
 
47
56
  usage_launch = "
48
57
  Use the #{'launch'.bold} command to run a Ruby 2D app that has been built.
49
58
  Choose one of the following options to select the kind of app to run:
50
59
 
51
60
  --native
52
- --web
53
- --ios
54
- --tvos\n\n"
61
+ --web\n\n"
62
+
63
+ usage_setup = "
64
+ Use the #{'setup'.bold} command to build Ruby 2D's native libraries (SDL3 and
65
+ mruby) for your platform, so you can compile native apps with #{'ruby2d build'.bold}.
66
+
67
+ The gem bundles these for common platforms; run #{'setup'.bold} when yours isn't
68
+ bundled (e.g. Linux or Intel macOS). It needs git, CMake, and a C compiler (on
69
+ Linux, also pkg-config and X11 or Wayland dev libraries), and builds into a
70
+ per-user cache outside the gem.
71
+
72
+ It prints what it's about to do and asks before starting.
55
73
 
56
- usage_simulator = "
57
- Choose an option with the #{'simulator'.bold} command:
74
+ Usage: ruby2d setup [options]
58
75
 
59
- --list List available devices
60
- --booted Show currently booted devices
76
+ Options:
77
+ --force Rebuild even if the libraries already exist
78
+ --clean Remove the built libraries for this platform
79
+ -y, --yes Skip the confirmation prompt\n\n"
61
80
 
62
- --open <device_name> Open a simulator device with a given device name
81
+ usage_usage = "
82
+ Use the #{'usage'.bold} command to browse the Ruby 2D usage guide by section.
63
83
 
64
- --install <app_file> Install an app on the booted simulator given the path
65
- to the app e.g. \"Release-iphonesimulator/MyApp.app\"
84
+ Usage: ruby2d usage [<name|number>|list|all]
66
85
 
67
- --launch <bundle_id> Launch an app given the app bundle's identifier,
68
- e.g. \"Ruby2D.MyApp\"
86
+ (no args) Open the interactive browser
87
+ <name> View a section by name (e.g. shapes)
88
+ <number> View a section by its number in the list
89
+ list Print the full list and exit
90
+ all View the entire guide\n\n"
69
91
 
70
- --log Stream log of the booted simulator
71
- --log <app> Stream log for the app only, given the app name
72
- --log-errors Stream log containing only error messages\n\n"
92
+ usage_examples = "
93
+ Use the #{'examples'.bold} command to browse and run the bundled example apps.
94
+
95
+ Usage: ruby2d examples [<name|number>|list|source <name>]
96
+
97
+ (no args) Open the interactive browser
98
+ <name> Run an example by file name (e.g. snake)
99
+ <number> Run an example by its number in the list
100
+ list Print the full list and exit
101
+ source <name> Print the source of an example\n\n"
73
102
 
74
103
  # Check Command-line Arguments #################################################
75
104
 
76
105
  case ARGV[0]
77
- when 'console'
78
- require 'ruby2d/cli/console'
79
106
  when 'build'
80
107
  require 'ruby2d/cli/build'
81
108
  if ARGV.delete '--debug' then @debug = true end
82
- case ARGV[1]
83
- when '--native'
84
- build(:native, ARGV[2])
85
- when '--web'
86
- build(:web, ARGV[2])
87
- when '--macos'
88
- build_macos(ARGV[2])
89
- when '--ios'
90
- build_ios_tvos(ARGV[2], 'ios')
91
- when '--tvos'
92
- build_ios_tvos(ARGV[2], 'tvos')
93
- when '--all'
94
- build_native(ARGV[2])
95
- build_web(ARGV[2])
96
- build_ios_tvos(ARGV[2], 'ios')
97
- build_ios_tvos(ARGV[2], 'tvos')
98
- when '--clean'
109
+ if ARGV.delete '--single-file' then @single_file = true end
110
+ if idx = ARGV.index('--assets')
111
+ value = ARGV[idx + 1]
112
+ # `--assets DIR` takes a directory. Without a valid one (missing, another
113
+ # flag, or — the common slip — the source file), fail loud instead of
114
+ # silently swallowing the next token (e.g. the .rb to build).
115
+ if value.nil? || value.start_with?('-') || !Dir.exist?(value)
116
+ puts "#{'Error:'.error} --assets requires a directory path"
117
+ exit 1
118
+ end
119
+ ARGV.delete_at(idx) # remove '--assets'
120
+ ARGV.delete_at(idx) # remove the directory value (now shifted into idx)
121
+ @assets_dir = value
122
+ end
123
+ if idx = ARGV.index('--template')
124
+ value = ARGV[idx + 1]
125
+ # `--template FILE` takes an HTML file. Without a valid one (missing, another
126
+ # flag, or the source file slipped in), fail loud rather than swallow the
127
+ # next token — same contract as `--assets`.
128
+ if value.nil? || value.start_with?('-') || !File.file?(value)
129
+ puts "#{'Error:'.error} --template requires an HTML file path"
130
+ exit 1
131
+ end
132
+ ARGV.delete_at(idx) # remove '--template'
133
+ ARGV.delete_at(idx) # remove the file value (now shifted into idx)
134
+ @template = value
135
+ end
136
+ # Target flags are position-independent: `build app.rb --native` honors
137
+ # --native the same as `build --native app.rb`.
138
+ native = ARGV.delete('--native')
139
+ web = ARGV.delete('--web')
140
+ # Whether web was requested explicitly (vs. implied by the all-platforms
141
+ # default), so a missing `emcc` fails loudly for `--web` but skips quietly otherwise.
142
+ @web_explicit = !web.nil?
143
+ if ARGV.delete('--help') || ARGV.delete('-h')
144
+ puts usage_build
145
+ elsif ARGV.delete('--clean')
146
+ # `--clean` is standalone: it only empties the build directory. Warn if it
147
+ # was combined with build arguments so the skipped build isn't silent.
148
+ leftover = (ARGV[1..] || []).reject { |a| a.start_with?('-') }
149
+ if native || web || !leftover.empty?
150
+ puts "#{'Note:'.bold} `--clean` only cleans the build directory; other build arguments were ignored."
151
+ end
99
152
  clean_up(:all)
100
153
  else
101
- puts usage_build
154
+ targets = if native && !web then :native
155
+ elsif web && !native then :web
156
+ else [:native, :web]
157
+ end
158
+ # `--template`/`--single-file` are web-only; reject them on a native-only
159
+ # build instead of silently dropping the request. (`--assets` bundles for
160
+ # both native and web, so it's allowed here.)
161
+ if targets == :native
162
+ offenders = []
163
+ offenders << '--template' if @template
164
+ offenders << '--single-file' if @single_file
165
+ unless offenders.empty?
166
+ verb = offenders.size == 1 ? 'is' : 'are'
167
+ puts "#{'Error:'.error} #{offenders.join(' and ')} #{verb} web-only and can't be used with --native"
168
+ puts usage_build
169
+ exit 1
170
+ end
171
+ end
172
+ # Everything after `build`; the known flags were deleted above, so any
173
+ # remaining `-`-prefixed token is an unrecognized option, not the source file.
174
+ rest = ARGV[1..] || []
175
+ if (unknown = rest.find { |a| a.start_with?('-') })
176
+ puts "#{'Error:'.error} unknown option `#{unknown}`"
177
+ puts usage_build
178
+ exit 1
179
+ end
180
+ ruby_file = rest.first
181
+ if ruby_file
182
+ build(targets, ruby_file)
183
+ else
184
+ puts usage_build
185
+ end
102
186
  end
103
187
  when 'launch'
104
188
  require 'ruby2d/cli/launch'
@@ -107,32 +191,147 @@ when 'launch'
107
191
  launch_native
108
192
  when '--web'
109
193
  launch_web
110
- when '--ios'
111
- launch_apple('ios')
112
- when '--tvos'
113
- launch_apple('tvos')
194
+ when '--help', '-h'
195
+ puts usage_launch
114
196
  else
115
197
  puts usage_launch
116
198
  end
117
- # TODO: Need add this functionality to the gem
118
- when 'simulator'
199
+ when 'setup'
200
+ require 'ruby2d/cli/setup'
201
+ if ARGV.delete('--help') || ARGV.delete('-h')
202
+ puts usage_setup
203
+ else
204
+ force = !ARGV.delete('--force').nil?
205
+ clean = !ARGV.delete('--clean').nil?
206
+ yes = !(ARGV.delete('--yes') || ARGV.delete('-y')).nil?
207
+ # The known flags were deleted above, so any remaining `-`-prefixed token is
208
+ # an unrecognized option.
209
+ if (unknown = (ARGV[1..] || []).find { |a| a.start_with?('-') })
210
+ puts "#{'Error:'.error} unknown option `#{unknown}`"
211
+ puts usage_setup
212
+ exit 1
213
+ end
214
+ begin
215
+ setup(force: force, clean: clean, yes: yes)
216
+ rescue Interrupt
217
+ # Ctrl-C reaches the whole foreground process group, so it lands here
218
+ # rather than in `system`'s return value — and it can arrive at the
219
+ # confirmation prompt, mid-build, or during `gem pristine`. Report the
220
+ # cancel plainly instead of letting Ruby print an Interrupt backtrace;
221
+ # a build leaves no version stamp, so re-running resumes from the
222
+ # sources already cloned.
223
+ puts "\n\n Cancelled. Re-run #{'ruby2d setup'.bold} to pick up where this left off.\n\n"
224
+ exit 130
225
+ end
226
+ end
227
+ when 'usage'
228
+ require 'ruby2d/cli/usage'
229
+ case ARGV[1]
230
+ when nil
231
+ Ruby2D::CLI::Usage.browse
232
+ when 'list'
233
+ Ruby2D::CLI::Usage.print_list
234
+ when 'all'
235
+ Ruby2D::CLI::Usage.view(Ruby2D::CLI::Usage.content)
236
+ when '--help', '-h'
237
+ puts usage_usage
238
+ else
239
+ section = Ruby2D::CLI::Usage.find(ARGV[1])
240
+ if section
241
+ Ruby2D::CLI::Usage.view(section)
242
+ else
243
+ puts "#{'Error:'.error} No section matching '#{ARGV[1]}'."
244
+ Ruby2D::CLI::Usage.print_list
245
+ exit 1
246
+ end
247
+ end
248
+ when 'examples'
249
+ require 'ruby2d/cli/examples'
250
+ case ARGV[1]
251
+ when nil
252
+ Ruby2D::CLI::Examples.browse
253
+ when 'list'
254
+ Ruby2D::CLI::Examples.print_list
255
+ when 'source'
256
+ name = ARGV[2]
257
+ if name.nil?
258
+ puts "#{'Error:'.error} Specify an example: ruby2d examples source <name>"
259
+ Ruby2D::CLI::Examples.print_list
260
+ exit 1
261
+ end
262
+ example = Ruby2D::CLI::Examples.find(name)
263
+ if example
264
+ puts File.read(example[:path])
265
+ else
266
+ puts "#{'Error:'.error} No example matching '#{name}'."
267
+ Ruby2D::CLI::Examples.print_list
268
+ exit 1
269
+ end
270
+ when '--help', '-h'
271
+ puts usage_examples
272
+ else
273
+ example = Ruby2D::CLI::Examples.find(ARGV[1])
274
+ if example
275
+ puts
276
+ puts " #{'Ruby 2D'.ruby2d_red.bold} — Examples"
277
+ puts
278
+ puts " Running #{example[:title].bold} #{"(#{example[:name]}.rb)".dim}"
279
+ puts
280
+ Ruby2D::CLI::Examples.print_header(example)
281
+ # Run from the gem root so an example's relative asset paths (e.g.
282
+ # `assets/resources/spritesheets`) resolve against the bundled assets.
283
+ exec(Gem.ruby, example[:path], chdir: Ruby2D::CLI::Examples::ROOT_DIR)
284
+ else
285
+ puts "#{'Error:'.error} No example matching '#{ARGV[1]}'."
286
+ Ruby2D::CLI::Examples.print_list
287
+ exit 1
288
+ end
289
+ end
290
+ when 'agents'
291
+ require 'ruby2d/cli/usage'
292
+ sections = Ruby2D::CLI::Usage.all
293
+
294
+ print_help = lambda do
295
+ size_kb = (Ruby2D::CLI::Usage.content.bytesize / 1024.0).round
296
+ puts "Ruby 2D v#{Ruby2D::VERSION} — API reference for AI coding agents"
297
+ puts
298
+ puts 'The canonical source for using Ruby 2D. Output is plain Markdown.'
299
+ puts
300
+ puts 'Usage:'
301
+ puts " ruby2d agents all Print the full guide (~#{size_kb} KB)"
302
+ puts ' ruby2d agents <section> Print one section'
303
+ puts ' ruby2d agents all | grep -i <kw> Search across sections'
304
+ puts
305
+ puts 'Section names are case-insensitive and accept partial matches;'
306
+ puts 'spaces, hyphens, and underscores are interchangeable. Examples:'
307
+ puts
308
+ puts ' ruby2d agents shape-basics'
309
+ puts ' ruby2d agents getting-started'
310
+ puts ' ruby2d agents "Lines and Polygons"'
311
+ puts
312
+ puts 'For working code samples, see also:'
313
+ puts ' ruby2d examples list List all bundled examples'
314
+ puts ' ruby2d examples source <name> Print an example to stdout'
315
+ puts
316
+ puts 'Sections:'
317
+ sections.each { |s| puts " #{s[:title]}" }
318
+ end
319
+
119
320
  case ARGV[1]
120
- when '--list'
121
- puts `simple2d simulator --list`
122
- when '--booted'
123
- puts `simple2d simulator --booted`
124
- when '--open'
125
- puts `simple2d simulator --open "#{ARGV[2]}"`
126
- when '--install'
127
- puts `simple2d simulator --install "#{ARGV[2]}"`
128
- when '--launch'
129
- puts `simple2d simulator --launch "#{ARGV[2]}"`
130
- when '--log'
131
- puts `simple2d simulator --log`
132
- when '--log-errors'
133
- puts `simple2d simulator --log-errors`
321
+ when nil, '--help', '-h'
322
+ print_help.call
323
+ when 'all'
324
+ puts Ruby2D::CLI::Usage.content
134
325
  else
135
- puts usage_simulator
326
+ section = Ruby2D::CLI::Usage.find(ARGV[1])
327
+ if section
328
+ puts section[:content]
329
+ else
330
+ puts "No section matching '#{ARGV[1]}'."
331
+ puts
332
+ print_help.call
333
+ exit 1
334
+ end
136
335
  end
137
336
  when '-v', '--version'
138
337
  puts Ruby2D::VERSION
data/examples/astar.rb ADDED
@@ -0,0 +1,269 @@
1
+ # A* pathfinding
2
+ # Paint walls, then watch A*'s frontier fill in and trace the optimal path.
3
+ #
4
+ # Click and drag to paint walls; click and drag the green start or red
5
+ # goal to move them. Press SPACE to run A* — the search frontier fills
6
+ # in cell by cell, then the optimal path is highlighted in yellow. C
7
+ # clears the search overlay; R clears the grid back to empty.
8
+
9
+ require 'ruby2d'
10
+
11
+ # === Tunables ===
12
+
13
+ WIDTH = 800 # window width in pixels
14
+ HEIGHT = 600 # window height in pixels
15
+ HEADER = 40 # HUD strip height in pixels
16
+ CELL = 16 # rendered cell size in pixels
17
+ REVEAL_PER_FRAME = 14 # cells revealed per frame during the playback
18
+
19
+ GRID_TOP = HEADER
20
+ GRID_H = HEIGHT - GRID_TOP
21
+ COLS = WIDTH / CELL # 50
22
+ ROWS = GRID_H / CELL # 35
23
+
24
+ C_EMPTY = [0.06, 0.08, 0.13, 1].freeze
25
+ C_WALL = [0.50, 0.52, 0.62, 1].freeze
26
+ C_CLOSED = [0.18, 0.32, 0.55, 1].freeze
27
+ C_PATH = [0.99, 0.86, 0.32, 1].freeze
28
+ C_START = [0.32, 0.85, 0.40, 1].freeze
29
+ C_GOAL = [0.95, 0.30, 0.30, 1].freeze
30
+
31
+ HEADER_BG = '#131c2e' # HUD strip background
32
+ HEADER_RULE = '#1f2a40' # rule line under the HUD strip
33
+ HINT_COLOR = '#cbd5e1' # controls hint text
34
+ DIM_COLOR = '#94a3b8' # status label and counter
35
+ WARN_COLOR = '#fbbf24' # "no path" indicator
36
+
37
+ # === Window ===
38
+
39
+ set title: 'Ruby 2D ▸ Examples ▸ A* pathfinding',
40
+ width: WIDTH, height: HEIGHT, background: '#0b1220'
41
+ set close_on_esc: true
42
+
43
+ # === HUD ===
44
+
45
+ canvas = Canvas.new(x: 0, y: GRID_TOP, width: WIDTH, height: GRID_H, fill: C_EMPTY)
46
+ Rectangle.new(x: 0, y: 0, width: WIDTH, height: HEADER, color: HEADER_BG)
47
+ Line.new(x1: 0, y1: HEADER, x2: WIDTH, y2: HEADER, stroke_width: 1, color: HEADER_RULE)
48
+
49
+ Text.new('CLICK paint · DRAG start/goal · SPACE run · C clear · R reset',
50
+ x: 14, y: 13, size: 14, color: HINT_COLOR)
51
+ no_path_text = Text.new('no path', x: WIDTH - 230, y: 13, size: 14, color: WARN_COLOR, visible: false)
52
+ Text.new('Explored', x: WIDTH - 160, y: 13, size: 14, color: DIM_COLOR)
53
+ explored_number = Text.new('0', x: WIDTH - 70, y: 13, size: 14, color: DIM_COLOR)
54
+
55
+ # === Helpers ===
56
+
57
+ def manhattan(a, b)
58
+ (a[0] - b[0]).abs + (a[1] - b[1]).abs
59
+ end
60
+
61
+ # === State ===
62
+
63
+ walls = Array.new(ROWS) { Array.new(COLS, false) }
64
+ start_cell = [3, ROWS / 2]
65
+ goal_cell = [COLS - 4, ROWS / 2]
66
+ closed_order = [] # cells closed by A*, in order
67
+ path = [] # final reconstructed path
68
+ reveal_idx = 0 # how many of `closed_order` have been drawn so far
69
+ mouse_mode = :none
70
+ dirty = true
71
+
72
+ # === Operations ===
73
+
74
+ clear_search = lambda do
75
+ closed_order.clear
76
+ path.clear
77
+ reveal_idx = 0
78
+ dirty = true
79
+ end
80
+
81
+ # Standard A* with Manhattan heuristic and 4-connected moves. Uses
82
+ # `min_by` for the priority pick — O(n²) over the search but fine at
83
+ # this grid size, and it keeps the example free of an external heap.
84
+ run_astar = lambda do
85
+ clear_search.call
86
+ open = [start_cell.dup]
87
+ open_set = { start_cell => true }
88
+ came_from = {}
89
+ g_score = { start_cell => 0 }
90
+ f_score = { start_cell => manhattan(start_cell, goal_cell) }
91
+ closed = {}
92
+
93
+ until open.empty?
94
+ current = open.min_by { |c| f_score[c] }
95
+ open.delete(current)
96
+ open_set.delete(current)
97
+ closed[current] = true
98
+ closed_order << current
99
+
100
+ if current == goal_cell
101
+ n = current
102
+ while n
103
+ path.unshift(n)
104
+ n = came_from[n]
105
+ end
106
+ dirty = true
107
+ return
108
+ end
109
+
110
+ [[1, 0], [-1, 0], [0, 1], [0, -1]].each do |dx, dy|
111
+ nx = current[0] + dx
112
+ ny = current[1] + dy
113
+ next if nx < 0 || nx >= COLS || ny < 0 || ny >= ROWS
114
+ next if walls[ny][nx]
115
+
116
+ neighbor = [nx, ny]
117
+ next if closed[neighbor]
118
+
119
+ tentative_g = g_score[current] + 1
120
+ next if g_score[neighbor] && tentative_g >= g_score[neighbor]
121
+
122
+ came_from[neighbor] = current
123
+ g_score[neighbor] = tentative_g
124
+ f_score[neighbor] = tentative_g + manhattan(neighbor, goal_cell)
125
+ unless open_set[neighbor]
126
+ open << neighbor
127
+ open_set[neighbor] = true
128
+ end
129
+ end
130
+ end
131
+ dirty = true
132
+ end
133
+
134
+ # === Input ===
135
+
136
+ on :mouse_down do |event|
137
+ next if event.y < GRID_TOP
138
+
139
+ cx = event.x / CELL
140
+ cy = (event.y - GRID_TOP) / CELL
141
+ next if cx < 0 || cx >= COLS || cy < 0 || cy >= ROWS
142
+
143
+ cell = [cx, cy]
144
+ mouse_mode = if cell == start_cell
145
+ :move_start
146
+ elsif cell == goal_cell
147
+ :move_goal
148
+ elsif walls[cy][cx]
149
+ walls[cy][cx] = false
150
+ clear_search.call
151
+ :erase
152
+ else
153
+ walls[cy][cx] = true
154
+ clear_search.call
155
+ :paint
156
+ end
157
+ end
158
+
159
+ on :mouse_up do
160
+ mouse_mode = :none
161
+ end
162
+
163
+ on :mouse_move do |event|
164
+ next if mouse_mode == :none
165
+ next if event.y < GRID_TOP
166
+
167
+ cx = event.x / CELL
168
+ cy = (event.y - GRID_TOP) / CELL
169
+ next if cx < 0 || cx >= COLS || cy < 0 || cy >= ROWS
170
+
171
+ case mouse_mode
172
+ when :paint
173
+ unless walls[cy][cx]
174
+ walls[cy][cx] = true
175
+ clear_search.call
176
+ end
177
+ when :erase
178
+ if walls[cy][cx]
179
+ walls[cy][cx] = false
180
+ clear_search.call
181
+ end
182
+ when :move_start
183
+ if [cx, cy] != start_cell
184
+ start_cell[0] = cx
185
+ start_cell[1] = cy
186
+ walls[cy][cx] = false
187
+ clear_search.call
188
+ end
189
+ when :move_goal
190
+ if [cx, cy] != goal_cell
191
+ goal_cell[0] = cx
192
+ goal_cell[1] = cy
193
+ walls[cy][cx] = false
194
+ clear_search.call
195
+ end
196
+ end
197
+ end
198
+
199
+ on key_down: :space do
200
+ run_astar.call
201
+ end
202
+
203
+ on key_down: :r do
204
+ walls.each { |row| row.fill(false) }
205
+ clear_search.call
206
+ end
207
+
208
+ on key_down: :c do
209
+ clear_search.call
210
+ end
211
+
212
+ # === Per-frame update ===
213
+
214
+ # The grid only needs a redraw when something has changed (mouse paint,
215
+ # search complete, animation step). Marking `dirty` lets the rest of
216
+ # the time skip the bucketing + canvas calls entirely.
217
+ update do
218
+ if reveal_idx < closed_order.length
219
+ reveal_idx += REVEAL_PER_FRAME
220
+ reveal_idx = closed_order.length if reveal_idx > closed_order.length
221
+ dirty = true
222
+ end
223
+
224
+ next unless dirty
225
+
226
+ canvas.clear
227
+ wall_rects = []
228
+ ROWS.times do |r|
229
+ row = walls[r]
230
+ COLS.times do |c|
231
+ wall_rects << [c * CELL, r * CELL, CELL, CELL] if row[c]
232
+ end
233
+ end
234
+ canvas.fill_rectangles(rectangles: wall_rects, color: C_WALL) unless wall_rects.empty?
235
+
236
+ closed_rects = []
237
+ i = 0
238
+ while i < reveal_idx
239
+ cell = closed_order[i]
240
+ closed_rects << [cell[0] * CELL, cell[1] * CELL, CELL, CELL] unless cell == start_cell || cell == goal_cell
241
+ i += 1
242
+ end
243
+ canvas.fill_rectangles(rectangles: closed_rects, color: C_CLOSED) unless closed_rects.empty?
244
+
245
+ if reveal_idx >= closed_order.length && !path.empty?
246
+ path_rects = []
247
+ path.each do |cell|
248
+ next if cell == start_cell || cell == goal_cell
249
+
250
+ path_rects << [cell[0] * CELL, cell[1] * CELL, CELL, CELL]
251
+ end
252
+ canvas.fill_rectangles(rectangles: path_rects, color: C_PATH) unless path_rects.empty?
253
+ end
254
+
255
+ canvas.fill_rectangle(x: start_cell[0] * CELL, y: start_cell[1] * CELL,
256
+ width: CELL, height: CELL, color: C_START)
257
+ canvas.fill_rectangle(x: goal_cell[0] * CELL, y: goal_cell[1] * CELL,
258
+ width: CELL, height: CELL, color: C_GOAL)
259
+
260
+ # HUD readout: cells explored so far (ticks up during playback), plus a
261
+ # "no path" flag once an exhausted search reveals no route to the goal.
262
+ count = reveal_idx.to_s
263
+ explored_number.content = count unless explored_number.content == count
264
+ no_path_text.visible = closed_order.any? && reveal_idx >= closed_order.length && path.empty?
265
+
266
+ dirty = false
267
+ end
268
+
269
+ show