studyup 0.0.0-stage → 1.0.1

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 (898) hide show
  1. package/hexgl-package/HexGL-master/.htaccess +4 -0
  2. package/hexgl-package/HexGL-master/LICENSE +21 -0
  3. package/hexgl-package/HexGL-master/README.md +26 -0
  4. package/hexgl-package/HexGL-master/audio/LICENSE +28 -0
  5. package/hexgl-package/HexGL-master/audio/bg.ogg +0 -0
  6. package/hexgl-package/HexGL-master/audio/boost.ogg +0 -0
  7. package/hexgl-package/HexGL-master/audio/crash.ogg +0 -0
  8. package/hexgl-package/HexGL-master/audio/destroyed.ogg +0 -0
  9. package/hexgl-package/HexGL-master/audio/wind.ogg +0 -0
  10. package/hexgl-package/HexGL-master/bkcore/Audio.js +142 -0
  11. package/hexgl-package/HexGL-master/bkcore/hexgl/CameraChase.js +73 -0
  12. package/hexgl-package/HexGL-master/bkcore/hexgl/Gameplay.js +231 -0
  13. package/hexgl-package/HexGL-master/bkcore/hexgl/HUD.js +270 -0
  14. package/hexgl-package/HexGL-master/bkcore/hexgl/HexGL.js +446 -0
  15. package/hexgl-package/HexGL-master/bkcore/hexgl/Ladder.js +52 -0
  16. package/hexgl-package/HexGL-master/bkcore/hexgl/RaceData.js +99 -0
  17. package/hexgl-package/HexGL-master/bkcore/hexgl/ShipControls.js +806 -0
  18. package/hexgl-package/HexGL-master/bkcore/hexgl/ShipEffects.js +186 -0
  19. package/hexgl-package/HexGL-master/bkcore/hexgl/tracks/Cityscape.js +521 -0
  20. package/hexgl-package/HexGL-master/bkcore/threejs/Loader.js +260 -0
  21. package/hexgl-package/HexGL-master/bkcore/threejs/Particles.js +191 -0
  22. package/hexgl-package/HexGL-master/bkcore/threejs/Preloader.js +151 -0
  23. package/hexgl-package/HexGL-master/bkcore/threejs/RenderManager.js +132 -0
  24. package/hexgl-package/HexGL-master/bkcore/threejs/Shaders.js +950 -0
  25. package/hexgl-package/HexGL-master/bkcore.coffee/ImageData.coffee +141 -0
  26. package/hexgl-package/HexGL-master/bkcore.coffee/ImageData.js +156 -0
  27. package/hexgl-package/HexGL-master/bkcore.coffee/Timer.coffee +118 -0
  28. package/hexgl-package/HexGL-master/bkcore.coffee/Timer.js +159 -0
  29. package/hexgl-package/HexGL-master/bkcore.coffee/Utils.coffee +193 -0
  30. package/hexgl-package/HexGL-master/bkcore.coffee/Utils.js +250 -0
  31. package/hexgl-package/HexGL-master/bkcore.coffee/controllers/GamepadController.coffee +45 -0
  32. package/hexgl-package/HexGL-master/bkcore.coffee/controllers/GamepadController.js +73 -0
  33. package/hexgl-package/HexGL-master/bkcore.coffee/controllers/OrientationController.coffee +72 -0
  34. package/hexgl-package/HexGL-master/bkcore.coffee/controllers/OrientationController.js +130 -0
  35. package/hexgl-package/HexGL-master/bkcore.coffee/controllers/TouchController.coffee +109 -0
  36. package/hexgl-package/HexGL-master/bkcore.coffee/controllers/TouchController.js +188 -0
  37. package/hexgl-package/HexGL-master/bkcore.coffee/tests.html +10 -0
  38. package/hexgl-package/HexGL-master/bkcore.coffee/threejs/Particles.coffee +199 -0
  39. package/hexgl-package/HexGL-master/bkcore.coffee/threejs/Particles.js +210 -0
  40. package/hexgl-package/HexGL-master/cache.appcache +74 -0
  41. package/hexgl-package/HexGL-master/css/BebasNeue-webfont.eot +0 -0
  42. package/hexgl-package/HexGL-master/css/BebasNeue-webfont.svg +245 -0
  43. package/hexgl-package/HexGL-master/css/BebasNeue-webfont.ttf +0 -0
  44. package/hexgl-package/HexGL-master/css/BebasNeue-webfont.woff +0 -0
  45. package/hexgl-package/HexGL-master/css/bg.jpg +0 -0
  46. package/hexgl-package/HexGL-master/css/fonts.css +16 -0
  47. package/hexgl-package/HexGL-master/css/help-0.png +0 -0
  48. package/hexgl-package/HexGL-master/css/help-1.png +0 -0
  49. package/hexgl-package/HexGL-master/css/help-2.png +0 -0
  50. package/hexgl-package/HexGL-master/css/help-3.png +0 -0
  51. package/hexgl-package/HexGL-master/css/mobile-controls-1.jpg +0 -0
  52. package/hexgl-package/HexGL-master/css/mobile-controls-2.jpg +0 -0
  53. package/hexgl-package/HexGL-master/css/mobile-over.jpg +0 -0
  54. package/hexgl-package/HexGL-master/css/mobile.jpg +0 -0
  55. package/hexgl-package/HexGL-master/css/multi.css +264 -0
  56. package/hexgl-package/HexGL-master/css/title.png +0 -0
  57. package/hexgl-package/HexGL-master/css/touchcontroller.css +8 -0
  58. package/hexgl-package/HexGL-master/favicon.png +0 -0
  59. package/hexgl-package/HexGL-master/geometries/bonus/base/base.js +45 -0
  60. package/hexgl-package/HexGL-master/geometries/booster/booster.js +45 -0
  61. package/hexgl-package/HexGL-master/geometries/ships/feisar/feisar.js +45 -0
  62. package/hexgl-package/HexGL-master/geometries/tracks/cityscape/bonus/speed.js +45 -0
  63. package/hexgl-package/HexGL-master/geometries/tracks/cityscape/scrapers1.js +45 -0
  64. package/hexgl-package/HexGL-master/geometries/tracks/cityscape/scrapers2.js +45 -0
  65. package/hexgl-package/HexGL-master/geometries/tracks/cityscape/start.js +45 -0
  66. package/hexgl-package/HexGL-master/geometries/tracks/cityscape/startbanner.js +45 -0
  67. package/hexgl-package/HexGL-master/geometries/tracks/cityscape/track.js +45 -0
  68. package/hexgl-package/HexGL-master/geometries/tracks/edge/track.js +38 -0
  69. package/hexgl-package/HexGL-master/icon_128.png +0 -0
  70. package/hexgl-package/HexGL-master/icon_256.png +0 -0
  71. package/hexgl-package/HexGL-master/icon_32.png +0 -0
  72. package/hexgl-package/HexGL-master/icon_64.png +0 -0
  73. package/hexgl-package/HexGL-master/index.html +129 -0
  74. package/hexgl-package/HexGL-master/launch.coffee +85 -0
  75. package/hexgl-package/HexGL-master/launch.js +116 -0
  76. package/hexgl-package/HexGL-master/libs/DAT.GUI.min.js +53 -0
  77. package/hexgl-package/HexGL-master/libs/Detector.js +59 -0
  78. package/hexgl-package/HexGL-master/libs/Editor.html +717 -0
  79. package/hexgl-package/HexGL-master/libs/Editor_files/App.js +212 -0
  80. package/hexgl-package/HexGL-master/libs/Editor_files/CanvasRenderer.js +389 -0
  81. package/hexgl-package/HexGL-master/libs/Editor_files/Diagram.js +148 -0
  82. package/hexgl-package/HexGL-master/libs/Editor_files/Iterator.js +92 -0
  83. package/hexgl-package/HexGL-master/libs/Editor_files/Links.js +56 -0
  84. package/hexgl-package/HexGL-master/libs/Editor_files/ModuleList.js +47 -0
  85. package/hexgl-package/HexGL-master/libs/Editor_files/Node.js +122 -0
  86. package/hexgl-package/HexGL-master/libs/Editor_files/Parser.js +140 -0
  87. package/hexgl-package/HexGL-master/libs/Editor_files/Project.js +162 -0
  88. package/hexgl-package/HexGL-master/libs/Editor_files/Timer.js +166 -0
  89. package/hexgl-package/HexGL-master/libs/Editor_files/ace.js +11 -0
  90. package/hexgl-package/HexGL-master/libs/Editor_files/class.js +989 -0
  91. package/hexgl-package/HexGL-master/libs/Editor_files/editor.css +16 -0
  92. package/hexgl-package/HexGL-master/libs/Editor_files/font.css +24 -0
  93. package/hexgl-package/HexGL-master/libs/Editor_files/gamecore.js +133 -0
  94. package/hexgl-package/HexGL-master/libs/Editor_files/hashlist.js +41 -0
  95. package/hexgl-package/HexGL-master/libs/Editor_files/jhashtable.js +468 -0
  96. package/hexgl-package/HexGL-master/libs/Editor_files/jquery-1.8.js +2 -0
  97. package/hexgl-package/HexGL-master/libs/Editor_files/kinetic.js +30 -0
  98. package/hexgl-package/HexGL-master/libs/Editor_files/main.css +204 -0
  99. package/hexgl-package/HexGL-master/libs/Editor_files/mode-json.js +1 -0
  100. package/hexgl-package/HexGL-master/libs/Editor_files/pooled.js +542 -0
  101. package/hexgl-package/HexGL-master/libs/Editor_files/theme-monokai.js +1 -0
  102. package/hexgl-package/HexGL-master/libs/ShaderExtras.js +1788 -0
  103. package/hexgl-package/HexGL-master/libs/Stats.js +6 -0
  104. package/hexgl-package/HexGL-master/libs/Three.dev.js +758 -0
  105. package/hexgl-package/HexGL-master/libs/Three.r53.js +767 -0
  106. package/hexgl-package/HexGL-master/libs/leap-0.4.1.min.js +3 -0
  107. package/hexgl-package/HexGL-master/libs/postprocessing/BloomPass.js +100 -0
  108. package/hexgl-package/HexGL-master/libs/postprocessing/DotScreenPass.js +52 -0
  109. package/hexgl-package/HexGL-master/libs/postprocessing/EffectComposer.js +143 -0
  110. package/hexgl-package/HexGL-master/libs/postprocessing/FilmPass.js +51 -0
  111. package/hexgl-package/HexGL-master/libs/postprocessing/MaskPass.js +86 -0
  112. package/hexgl-package/HexGL-master/libs/postprocessing/RenderPass.js +63 -0
  113. package/hexgl-package/HexGL-master/libs/postprocessing/SavePass.js +52 -0
  114. package/hexgl-package/HexGL-master/libs/postprocessing/ShaderPass.js +51 -0
  115. package/hexgl-package/HexGL-master/libs/postprocessing/TexturePass.js +37 -0
  116. package/hexgl-package/HexGL-master/manifest.webapp +18 -0
  117. package/hexgl-package/HexGL-master/package.webapp +10 -0
  118. package/hexgl-package/HexGL-master/package.zip +0 -0
  119. package/hexgl-package/HexGL-master/replays/cityscape-casual/bkcore.replay.json +1 -0
  120. package/hexgl-package/HexGL-master/textures/bonus/base/diffuse.jpg +0 -0
  121. package/hexgl-package/HexGL-master/textures/bonus/base/normal.jpg +0 -0
  122. package/hexgl-package/HexGL-master/textures/bonus/base/specular.jpg +0 -0
  123. package/hexgl-package/HexGL-master/textures/checker.png +0 -0
  124. package/hexgl-package/HexGL-master/textures/hud/hex.jpg +0 -0
  125. package/hexgl-package/HexGL-master/textures/hud/hud-bg.png +0 -0
  126. package/hexgl-package/HexGL-master/textures/hud/hud-fg-shield.png +0 -0
  127. package/hexgl-package/HexGL-master/textures/hud/hud-fg-speed.png +0 -0
  128. package/hexgl-package/HexGL-master/textures/particles/cloud - Copie.png +0 -0
  129. package/hexgl-package/HexGL-master/textures/particles/cloud.png +0 -0
  130. package/hexgl-package/HexGL-master/textures/particles/damage.png +0 -0
  131. package/hexgl-package/HexGL-master/textures/particles/spark - Copie.png +0 -0
  132. package/hexgl-package/HexGL-master/textures/particles/spark.png +0 -0
  133. package/hexgl-package/HexGL-master/textures/ships/feisar/booster/booster.png +0 -0
  134. package/hexgl-package/HexGL-master/textures/ships/feisar/booster/boostersprite.jpg +0 -0
  135. package/hexgl-package/HexGL-master/textures/ships/feisar/diffuse.jpg +0 -0
  136. package/hexgl-package/HexGL-master/textures/ships/feisar/normal.jpg +0 -0
  137. package/hexgl-package/HexGL-master/textures/ships/feisar/specular.jpg +0 -0
  138. package/hexgl-package/HexGL-master/textures/skybox/dawnclouds/nx.jpg +0 -0
  139. package/hexgl-package/HexGL-master/textures/skybox/dawnclouds/ny.jpg +0 -0
  140. package/hexgl-package/HexGL-master/textures/skybox/dawnclouds/nz.jpg +0 -0
  141. package/hexgl-package/HexGL-master/textures/skybox/dawnclouds/px.jpg +0 -0
  142. package/hexgl-package/HexGL-master/textures/skybox/dawnclouds/py.jpg +0 -0
  143. package/hexgl-package/HexGL-master/textures/skybox/dawnclouds/pz.jpg +0 -0
  144. package/hexgl-package/HexGL-master/textures/tracks/cityscape/collision.png +0 -0
  145. package/hexgl-package/HexGL-master/textures/tracks/cityscape/diffuse.jpg +0 -0
  146. package/hexgl-package/HexGL-master/textures/tracks/cityscape/height.png +0 -0
  147. package/hexgl-package/HexGL-master/textures/tracks/cityscape/normal.jpg +0 -0
  148. package/hexgl-package/HexGL-master/textures/tracks/cityscape/scrapers1/diffuse.jpg +0 -0
  149. package/hexgl-package/HexGL-master/textures/tracks/cityscape/scrapers1/normal.jpg +0 -0
  150. package/hexgl-package/HexGL-master/textures/tracks/cityscape/scrapers1/specular.jpg +0 -0
  151. package/hexgl-package/HexGL-master/textures/tracks/cityscape/scrapers2/diffuse.jpg +0 -0
  152. package/hexgl-package/HexGL-master/textures/tracks/cityscape/scrapers2/normal.jpg +0 -0
  153. package/hexgl-package/HexGL-master/textures/tracks/cityscape/scrapers2/specular.jpg +0 -0
  154. package/hexgl-package/HexGL-master/textures/tracks/cityscape/specular.jpg +0 -0
  155. package/hexgl-package/HexGL-master/textures/tracks/cityscape/start/diffuse.jpg +0 -0
  156. package/hexgl-package/HexGL-master/textures/tracks/cityscape/start/normal.jpg +0 -0
  157. package/hexgl-package/HexGL-master/textures/tracks/cityscape/start/specular.jpg +0 -0
  158. package/hexgl-package/HexGL-master/textures/tracks/cityscape/start/start.jpg +0 -0
  159. package/hexgl-package/HexGL-master/textures.full/bonus/base/diffuse.jpg +0 -0
  160. package/hexgl-package/HexGL-master/textures.full/bonus/base/normal.jpg +0 -0
  161. package/hexgl-package/HexGL-master/textures.full/bonus/base/specular.jpg +0 -0
  162. package/hexgl-package/HexGL-master/textures.full/checker.png +0 -0
  163. package/hexgl-package/HexGL-master/textures.full/hud/hex.jpg +0 -0
  164. package/hexgl-package/HexGL-master/textures.full/hud/hud-bg.png +0 -0
  165. package/hexgl-package/HexGL-master/textures.full/hud/hud-fg-shield.png +0 -0
  166. package/hexgl-package/HexGL-master/textures.full/hud/hud-fg-speed.png +0 -0
  167. package/hexgl-package/HexGL-master/textures.full/particles/cloud - Copie.png +0 -0
  168. package/hexgl-package/HexGL-master/textures.full/particles/cloud.png +0 -0
  169. package/hexgl-package/HexGL-master/textures.full/particles/damage.png +0 -0
  170. package/hexgl-package/HexGL-master/textures.full/particles/spark - Copie.png +0 -0
  171. package/hexgl-package/HexGL-master/textures.full/particles/spark.png +0 -0
  172. package/hexgl-package/HexGL-master/textures.full/ships/feisar/booster/booster.png +0 -0
  173. package/hexgl-package/HexGL-master/textures.full/ships/feisar/booster/boostersprite.jpg +0 -0
  174. package/hexgl-package/HexGL-master/textures.full/ships/feisar/diffuse.jpg +0 -0
  175. package/hexgl-package/HexGL-master/textures.full/ships/feisar/normal.jpg +0 -0
  176. package/hexgl-package/HexGL-master/textures.full/ships/feisar/specular.jpg +0 -0
  177. package/hexgl-package/HexGL-master/textures.full/skybox/dawnclouds/nx.jpg +0 -0
  178. package/hexgl-package/HexGL-master/textures.full/skybox/dawnclouds/ny.jpg +0 -0
  179. package/hexgl-package/HexGL-master/textures.full/skybox/dawnclouds/nz.jpg +0 -0
  180. package/hexgl-package/HexGL-master/textures.full/skybox/dawnclouds/px.jpg +0 -0
  181. package/hexgl-package/HexGL-master/textures.full/skybox/dawnclouds/py.jpg +0 -0
  182. package/hexgl-package/HexGL-master/textures.full/skybox/dawnclouds/pz.jpg +0 -0
  183. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/collision.png +0 -0
  184. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/diffuse.jpg +0 -0
  185. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/height.png +0 -0
  186. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/normal.jpg +0 -0
  187. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/scrapers1/diffuse.jpg +0 -0
  188. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/scrapers1/normal.jpg +0 -0
  189. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/scrapers1/specular.jpg +0 -0
  190. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/scrapers2/diffuse.jpg +0 -0
  191. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/scrapers2/normal.jpg +0 -0
  192. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/scrapers2/specular.jpg +0 -0
  193. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/specular.jpg +0 -0
  194. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/start/diffuse.jpg +0 -0
  195. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/start/normal.jpg +0 -0
  196. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/start/specular.jpg +0 -0
  197. package/hexgl-package/HexGL-master/textures.full/tracks/cityscape/start/start.jpg +0 -0
  198. package/index.html +518 -0
  199. package/package.json +13 -4
  200. package/sandboxels-package/sandboxels-1.13.2/.github/CONTRIBUTING.md +10 -0
  201. package/sandboxels-package/sandboxels-1.13.2/.github/FUNDING.yml +13 -0
  202. package/sandboxels-package/sandboxels-1.13.2/.github/SUPPORT.md +9 -0
  203. package/sandboxels-package/sandboxels-1.13.2/404.html +74 -0
  204. package/sandboxels-package/sandboxels-1.13.2/CITATION.cff +42 -0
  205. package/sandboxels-package/sandboxels-1.13.2/CNAME +1 -0
  206. package/sandboxels-package/sandboxels-1.13.2/README.md +47 -0
  207. package/sandboxels-package/sandboxels-1.13.2/SECURITY.md +9 -0
  208. package/sandboxels-package/sandboxels-1.13.2/ad.html +73 -0
  209. package/sandboxels-package/sandboxels-1.13.2/aff.json +3 -0
  210. package/sandboxels-package/sandboxels-1.13.2/archive/first-version.html +234 -0
  211. package/sandboxels-package/sandboxels-1.13.2/archive/second-version.html +1293 -0
  212. package/sandboxels-package/sandboxels-1.13.2/archive/third-version.html +2242 -0
  213. package/sandboxels-package/sandboxels-1.13.2/archive.txt +231 -0
  214. package/sandboxels-package/sandboxels-1.13.2/backgrounds/License.txt +1 -0
  215. package/sandboxels-package/sandboxels-1.13.2/backgrounds/sky.png +0 -0
  216. package/sandboxels-package/sandboxels-1.13.2/backgrounds/sky_dark.png +0 -0
  217. package/sandboxels-package/sandboxels-1.13.2/backgrounds/sky_grass.png +0 -0
  218. package/sandboxels-package/sandboxels-1.13.2/backgrounds/sky_pink.png +0 -0
  219. package/sandboxels-package/sandboxels-1.13.2/backgrounds/sky_purple.png +0 -0
  220. package/sandboxels-package/sandboxels-1.13.2/backgrounds/sky_warm.png +0 -0
  221. package/sandboxels-package/sandboxels-1.13.2/changelog.html +3362 -0
  222. package/sandboxels-package/sandboxels-1.13.2/changelog.txt +3096 -0
  223. package/sandboxels-package/sandboxels-1.13.2/controls.html +191 -0
  224. package/sandboxels-package/sandboxels-1.13.2/controls.txt +65 -0
  225. package/sandboxels-package/sandboxels-1.13.2/education-use.html +109 -0
  226. package/sandboxels-package/sandboxels-1.13.2/feed.rss +30 -0
  227. package/sandboxels-package/sandboxels-1.13.2/feedback.html +89 -0
  228. package/sandboxels-package/sandboxels-1.13.2/fonts/PressStart2P-License-OFL.txt +93 -0
  229. package/sandboxels-package/sandboxels-1.13.2/fonts/PressStart2P-Regular.ttf +0 -0
  230. package/sandboxels-package/sandboxels-1.13.2/fonts/VT323-License-OFL.txt +93 -0
  231. package/sandboxels-package/sandboxels-1.13.2/fonts/VT323-Regular.ttf +0 -0
  232. package/sandboxels-package/sandboxels-1.13.2/fonts/Vietnamese_Pixel.ttf +0 -0
  233. package/sandboxels-package/sandboxels-1.13.2/fonts/fusion-pixel-12px-monospaced-ja.ttf +0 -0
  234. package/sandboxels-package/sandboxels-1.13.2/fonts/fusion-pixel-12px-monospaced-ko.ttf +0 -0
  235. package/sandboxels-package/sandboxels-1.13.2/fonts/fusion-pixel-12px-monospaced-latin.ttf +0 -0
  236. package/sandboxels-package/sandboxels-1.13.2/fonts/fusion-pixel-12px-monospaced-zh_hans.ttf +0 -0
  237. package/sandboxels-package/sandboxels-1.13.2/fonts/fusion-pixel-12px-monospaced-zh_hant.ttf +0 -0
  238. package/sandboxels-package/sandboxels-1.13.2/help.html +122 -0
  239. package/sandboxels-package/sandboxels-1.13.2/icons/80x15.png +0 -0
  240. package/sandboxels-package/sandboxels-1.13.2/icons/88x31.png +0 -0
  241. package/sandboxels-package/sandboxels-1.13.2/icons/android-chrome-192x192.png +0 -0
  242. package/sandboxels-package/sandboxels-1.13.2/icons/android-chrome-384x384.png +0 -0
  243. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-114x114-precomposed.png +0 -0
  244. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-114x114.png +0 -0
  245. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-120x120-precomposed.png +0 -0
  246. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-120x120.png +0 -0
  247. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-144x144-precomposed.png +0 -0
  248. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-144x144.png +0 -0
  249. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-152x152-precomposed.png +0 -0
  250. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-152x152.png +0 -0
  251. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-180x180-precomposed.png +0 -0
  252. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-180x180.png +0 -0
  253. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-57x57-precomposed.png +0 -0
  254. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-57x57.png +0 -0
  255. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-60x60-precomposed.png +0 -0
  256. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-60x60.png +0 -0
  257. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-72x72-precomposed.png +0 -0
  258. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-72x72.png +0 -0
  259. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-76x76-precomposed.png +0 -0
  260. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-76x76.png +0 -0
  261. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon-precomposed.png +0 -0
  262. package/sandboxels-package/sandboxels-1.13.2/icons/apple-touch-icon.png +0 -0
  263. package/sandboxels-package/sandboxels-1.13.2/icons/browserconfig.xml +9 -0
  264. package/sandboxels-package/sandboxels-1.13.2/icons/card.png +0 -0
  265. package/sandboxels-package/sandboxels-1.13.2/icons/cover-3840x1240px-text.png +0 -0
  266. package/sandboxels-package/sandboxels-1.13.2/icons/cover-3840x1240px.png +0 -0
  267. package/sandboxels-package/sandboxels-1.13.2/icons/cover-3840x1240px.webp +0 -0
  268. package/sandboxels-package/sandboxels-1.13.2/icons/cover.png +0 -0
  269. package/sandboxels-package/sandboxels-1.13.2/icons/favicon-16x16.png +0 -0
  270. package/sandboxels-package/sandboxels-1.13.2/icons/favicon-32x32.png +0 -0
  271. package/sandboxels-package/sandboxels-1.13.2/icons/favicon.ico +0 -0
  272. package/sandboxels-package/sandboxels-1.13.2/icons/icon-hd.png +0 -0
  273. package/sandboxels-package/sandboxels-1.13.2/icons/icon.png +0 -0
  274. package/sandboxels-package/sandboxels-1.13.2/icons/index.html +196 -0
  275. package/sandboxels-package/sandboxels-1.13.2/icons/modulator.png +0 -0
  276. package/sandboxels-package/sandboxels-1.13.2/icons/mstile-150x150.png +0 -0
  277. package/sandboxels-package/sandboxels-1.13.2/icons/original-logo-recreated-pixel.png +0 -0
  278. package/sandboxels-package/sandboxels-1.13.2/icons/promo1.png +0 -0
  279. package/sandboxels-package/sandboxels-1.13.2/icons/promo2.png +0 -0
  280. package/sandboxels-package/sandboxels-1.13.2/icons/promo3.png +0 -0
  281. package/sandboxels-package/sandboxels-1.13.2/icons/promo4.png +0 -0
  282. package/sandboxels-package/sandboxels-1.13.2/icons/safari-pinned-tab.svg +107 -0
  283. package/sandboxels-package/sandboxels-1.13.2/icons/site.webmanifest +20 -0
  284. package/sandboxels-package/sandboxels-1.13.2/icons/tall.webp +0 -0
  285. package/sandboxels-package/sandboxels-1.13.2/icons/wallpaper-old.png +0 -0
  286. package/sandboxels-package/sandboxels-1.13.2/icons/wallpaper.png +0 -0
  287. package/sandboxels-package/sandboxels-1.13.2/icons/wallpaper.webp +0 -0
  288. package/sandboxels-package/sandboxels-1.13.2/icons/wordmark-black.png +0 -0
  289. package/sandboxels-package/sandboxels-1.13.2/icons/wordmark-white.png +0 -0
  290. package/sandboxels-package/sandboxels-1.13.2/index.html +21523 -0
  291. package/sandboxels-package/sandboxels-1.13.2/lang/README.txt +5 -0
  292. package/sandboxels-package/sandboxels-1.13.2/lang/af.json +1 -0
  293. package/sandboxels-package/sandboxels-1.13.2/lang/ar.json +1 -0
  294. package/sandboxels-package/sandboxels-1.13.2/lang/ar_sy.json +1 -0
  295. package/sandboxels-package/sandboxels-1.13.2/lang/bn.json +1 -0
  296. package/sandboxels-package/sandboxels-1.13.2/lang/ca.json +1 -0
  297. package/sandboxels-package/sandboxels-1.13.2/lang/cs.json +1 -0
  298. package/sandboxels-package/sandboxels-1.13.2/lang/da.json +1 -0
  299. package/sandboxels-package/sandboxels-1.13.2/lang/de.json +1 -0
  300. package/sandboxels-package/sandboxels-1.13.2/lang/el.json +1 -0
  301. package/sandboxels-package/sandboxels-1.13.2/lang/en.json +1 -0
  302. package/sandboxels-package/sandboxels-1.13.2/lang/en_au.json +1 -0
  303. package/sandboxels-package/sandboxels-1.13.2/lang/en_ca.json +1 -0
  304. package/sandboxels-package/sandboxels-1.13.2/lang/en_gb.json +1 -0
  305. package/sandboxels-package/sandboxels-1.13.2/lang/es.json +1 -0
  306. package/sandboxels-package/sandboxels-1.13.2/lang/et.json +1 -0
  307. package/sandboxels-package/sandboxels-1.13.2/lang/fi.json +1 -0
  308. package/sandboxels-package/sandboxels-1.13.2/lang/fil.json +1 -0
  309. package/sandboxels-package/sandboxels-1.13.2/lang/fr.json +1 -0
  310. package/sandboxels-package/sandboxels-1.13.2/lang/gen.js +21 -0
  311. package/sandboxels-package/sandboxels-1.13.2/lang/he.json +1 -0
  312. package/sandboxels-package/sandboxels-1.13.2/lang/hu.json +1 -0
  313. package/sandboxels-package/sandboxels-1.13.2/lang/id.json +1 -0
  314. package/sandboxels-package/sandboxels-1.13.2/lang/it.json +1 -0
  315. package/sandboxels-package/sandboxels-1.13.2/lang/ja.json +1 -0
  316. package/sandboxels-package/sandboxels-1.13.2/lang/ko.json +1 -0
  317. package/sandboxels-package/sandboxels-1.13.2/lang/la.json +1 -0
  318. package/sandboxels-package/sandboxels-1.13.2/lang/ne.json +1 -0
  319. package/sandboxels-package/sandboxels-1.13.2/lang/nl.json +1 -0
  320. package/sandboxels-package/sandboxels-1.13.2/lang/no.json +1 -0
  321. package/sandboxels-package/sandboxels-1.13.2/lang/pl.json +1 -0
  322. package/sandboxels-package/sandboxels-1.13.2/lang/pt.json +1 -0
  323. package/sandboxels-package/sandboxels-1.13.2/lang/pt_br.json +1 -0
  324. package/sandboxels-package/sandboxels-1.13.2/lang/qha.json +1 -0
  325. package/sandboxels-package/sandboxels-1.13.2/lang/qvp.json +1 -0
  326. package/sandboxels-package/sandboxels-1.13.2/lang/ro.json +1 -0
  327. package/sandboxels-package/sandboxels-1.13.2/lang/ru.json +1 -0
  328. package/sandboxels-package/sandboxels-1.13.2/lang/sr.json +1 -0
  329. package/sandboxels-package/sandboxels-1.13.2/lang/sv.json +1 -0
  330. package/sandboxels-package/sandboxels-1.13.2/lang/template.json +677 -0
  331. package/sandboxels-package/sandboxels-1.13.2/lang/th.json +1 -0
  332. package/sandboxels-package/sandboxels-1.13.2/lang/tok.json +1 -0
  333. package/sandboxels-package/sandboxels-1.13.2/lang/tok_old.json +543 -0
  334. package/sandboxels-package/sandboxels-1.13.2/lang/tr.json +1 -0
  335. package/sandboxels-package/sandboxels-1.13.2/lang/uk.json +1 -0
  336. package/sandboxels-package/sandboxels-1.13.2/lang/vi.json +1 -0
  337. package/sandboxels-package/sandboxels-1.13.2/lang/xem.json +1 -0
  338. package/sandboxels-package/sandboxels-1.13.2/lang/zh_cn.json +1 -0
  339. package/sandboxels-package/sandboxels-1.13.2/lang/zh_hant.json +1 -0
  340. package/sandboxels-package/sandboxels-1.13.2/license.txt +48 -0
  341. package/sandboxels-package/sandboxels-1.13.2/lite.html +1599 -0
  342. package/sandboxels-package/sandboxels-1.13.2/manifest.json +33 -0
  343. package/sandboxels-package/sandboxels-1.13.2/media.html +134 -0
  344. package/sandboxels-package/sandboxels-1.13.2/mobile-use.html +110 -0
  345. package/sandboxels-package/sandboxels-1.13.2/mod-list.html +535 -0
  346. package/sandboxels-package/sandboxels-1.13.2/mods/1.10example.js +118 -0
  347. package/sandboxels-package/sandboxels-1.13.2/mods/10kelements.js +172 -0
  348. package/sandboxels-package/sandboxels-1.13.2/mods/3pms_mod.js +144 -0
  349. package/sandboxels-package/sandboxels-1.13.2/mods/AnonymousWorldgenLibrary.js +55 -0
  350. package/sandboxels-package/sandboxels-1.13.2/mods/Batteries.js +288 -0
  351. package/sandboxels-package/sandboxels-1.13.2/mods/BlueStuff.js +681 -0
  352. package/sandboxels-package/sandboxels-1.13.2/mods/CandyCanes.js +15 -0
  353. package/sandboxels-package/sandboxels-1.13.2/mods/CandyCorn.js +8 -0
  354. package/sandboxels-package/sandboxels-1.13.2/mods/CherrySoda.js +77 -0
  355. package/sandboxels-package/sandboxels-1.13.2/mods/EasterEggs.js +1 -0
  356. package/sandboxels-package/sandboxels-1.13.2/mods/ExtraMachines.js +2338 -0
  357. package/sandboxels-package/sandboxels-1.13.2/mods/FoodFoodFood.js +114 -0
  358. package/sandboxels-package/sandboxels-1.13.2/mods/Gemstones.js +80 -0
  359. package/sandboxels-package/sandboxels-1.13.2/mods/GrapeSoda.js +141 -0
  360. package/sandboxels-package/sandboxels-1.13.2/mods/Humanitize.js +959 -0
  361. package/sandboxels-package/sandboxels-1.13.2/mods/Inators.js +108 -0
  362. package/sandboxels-package/sandboxels-1.13.2/mods/IreThings.js +169 -0
  363. package/sandboxels-package/sandboxels-1.13.2/mods/Lab.js +397 -0
  364. package/sandboxels-package/sandboxels-1.13.2/mods/LimesAdditions.js +401 -0
  365. package/sandboxels-package/sandboxels-1.13.2/mods/MarkusFoodMod.js +334 -0
  366. package/sandboxels-package/sandboxels-1.13.2/mods/Mucho_frio_y_Calor.js +16 -0
  367. package/sandboxels-package/sandboxels-1.13.2/mods/Natural_disasters.js +207 -0
  368. package/sandboxels-package/sandboxels-1.13.2/mods/Neutronium Mod.js +1228 -0
  369. package/sandboxels-package/sandboxels-1.13.2/mods/PRNGworldgenlib.js +526 -0
  370. package/sandboxels-package/sandboxels-1.13.2/mods/Quicksand_one.js +1355 -0
  371. package/sandboxels-package/sandboxels-1.13.2/mods/RF_transmitter_receiver.js +62 -0
  372. package/sandboxels-package/sandboxels-1.13.2/mods/Random_quicksands.js +932 -0
  373. package/sandboxels-package/sandboxels-1.13.2/mods/Science_mod.js +1791 -0
  374. package/sandboxels-package/sandboxels-1.13.2/mods/Shroomboxels.js +71 -0
  375. package/sandboxels-package/sandboxels-1.13.2/mods/SuperASAX_Funny_Mod.js +297 -0
  376. package/sandboxels-package/sandboxels-1.13.2/mods/Temperature+.js +47 -0
  377. package/sandboxels-package/sandboxels-1.13.2/mods/Thread.js +180 -0
  378. package/sandboxels-package/sandboxels-1.13.2/mods/UAMM.js +502 -0
  379. package/sandboxels-package/sandboxels-1.13.2/mods/Ultra_Steel.js +61 -0
  380. package/sandboxels-package/sandboxels-1.13.2/mods/UwUify.js +87 -0
  381. package/sandboxels-package/sandboxels-1.13.2/mods/VCR_OSD_MONO.ttf +0 -0
  382. package/sandboxels-package/sandboxels-1.13.2/mods/Vegan.js +255 -0
  383. package/sandboxels-package/sandboxels-1.13.2/mods/WhisperingTheory.js +213 -0
  384. package/sandboxels-package/sandboxels-1.13.2/mods/aChefsDream.js +8159 -0
  385. package/sandboxels-package/sandboxels-1.13.2/mods/aChefsDream2.js +815 -0
  386. package/sandboxels-package/sandboxels-1.13.2/mods/aChefsDream_beta.js +12 -0
  387. package/sandboxels-package/sandboxels-1.13.2/mods/aScientistsWish.js +1195 -0
  388. package/sandboxels-package/sandboxels-1.13.2/mods/a_bundle_of_tests.js +417 -0
  389. package/sandboxels-package/sandboxels-1.13.2/mods/a_mod_by_alice.js +46043 -0
  390. package/sandboxels-package/sandboxels-1.13.2/mods/acid_and_shapes.js +1 -0
  391. package/sandboxels-package/sandboxels-1.13.2/mods/adaceythings.js +343 -0
  392. package/sandboxels-package/sandboxels-1.13.2/mods/adjustablepixelsize.js +28 -0
  393. package/sandboxels-package/sandboxels-1.13.2/mods/advanced_colonies.js +146 -0
  394. package/sandboxels-package/sandboxels-1.13.2/mods/advancedbugs.js +37 -0
  395. package/sandboxels-package/sandboxels-1.13.2/mods/aircrafts.js +260 -0
  396. package/sandboxels-package/sandboxels-1.13.2/mods/alchem.js +372 -0
  397. package/sandboxels-package/sandboxels-1.13.2/mods/alchemy.js +69 -0
  398. package/sandboxels-package/sandboxels-1.13.2/mods/alcohol.js +113 -0
  399. package/sandboxels-package/sandboxels-1.13.2/mods/alkahest.js +33 -0
  400. package/sandboxels-package/sandboxels-1.13.2/mods/alkali_metal.js +308 -0
  401. package/sandboxels-package/sandboxels-1.13.2/mods/all_around_fillers.js +73 -0
  402. package/sandboxels-package/sandboxels-1.13.2/mods/all_stain.js +7 -0
  403. package/sandboxels-package/sandboxels-1.13.2/mods/allliquids.js +24 -0
  404. package/sandboxels-package/sandboxels-1.13.2/mods/amogus.js +69 -0
  405. package/sandboxels-package/sandboxels-1.13.2/mods/anmm.js +566 -0
  406. package/sandboxels-package/sandboxels-1.13.2/mods/ants.js +137 -0
  407. package/sandboxels-package/sandboxels-1.13.2/mods/apioforms_pre.js +238 -0
  408. package/sandboxels-package/sandboxels-1.13.2/mods/applestuff.js +80 -0
  409. package/sandboxels-package/sandboxels-1.13.2/mods/asciiboxels.js +231 -0
  410. package/sandboxels-package/sandboxels-1.13.2/mods/aussieAdditions.js +123 -0
  411. package/sandboxels-package/sandboxels-1.13.2/mods/baby.js +65 -0
  412. package/sandboxels-package/sandboxels-1.13.2/mods/background_changer.js +59 -0
  413. package/sandboxels-package/sandboxels-1.13.2/mods/bacteria_mod.js +121 -0
  414. package/sandboxels-package/sandboxels-1.13.2/mods/bananas.js +543 -0
  415. package/sandboxels-package/sandboxels-1.13.2/mods/barf_mod.js +42 -0
  416. package/sandboxels-package/sandboxels-1.13.2/mods/barista.js +209 -0
  417. package/sandboxels-package/sandboxels-1.13.2/mods/bere.js +85 -0
  418. package/sandboxels-package/sandboxels-1.13.2/mods/betterMenuScreens.js +279 -0
  419. package/sandboxels-package/sandboxels-1.13.2/mods/betterModManager.js +174 -0
  420. package/sandboxels-package/sandboxels-1.13.2/mods/betterSettings.js +304 -0
  421. package/sandboxels-package/sandboxels-1.13.2/mods/betterStats.js +55 -0
  422. package/sandboxels-package/sandboxels-1.13.2/mods/better_smooth_water.js +6 -0
  423. package/sandboxels-package/sandboxels-1.13.2/mods/betterelec.js +51 -0
  424. package/sandboxels-package/sandboxels-1.13.2/mods/bettergraygoo.js +1 -0
  425. package/sandboxels-package/sandboxels-1.13.2/mods/bettermetalscrap.js +37 -0
  426. package/sandboxels-package/sandboxels-1.13.2/mods/bf.js +394 -0
  427. package/sandboxels-package/sandboxels-1.13.2/mods/bfdi.js +145 -0
  428. package/sandboxels-package/sandboxels-1.13.2/mods/bigger_star_spawners.js +198 -0
  429. package/sandboxels-package/sandboxels-1.13.2/mods/biology.js +8694 -0
  430. package/sandboxels-package/sandboxels-1.13.2/mods/bioooze_and_pyrogens.js +264 -0
  431. package/sandboxels-package/sandboxels-1.13.2/mods/black_hole.js +43 -0
  432. package/sandboxels-package/sandboxels-1.13.2/mods/blocks.js +164 -0
  433. package/sandboxels-package/sandboxels-1.13.2/mods/boiling_things.js +540 -0
  434. package/sandboxels-package/sandboxels-1.13.2/mods/bojithekings_mod.js +377 -0
  435. package/sandboxels-package/sandboxels-1.13.2/mods/boompaste.js +76 -0
  436. package/sandboxels-package/sandboxels-1.13.2/mods/borders.js +76 -0
  437. package/sandboxels-package/sandboxels-1.13.2/mods/bouncing_balls.js +703 -0
  438. package/sandboxels-package/sandboxels-1.13.2/mods/broken_mod_test.js +1 -0
  439. package/sandboxels-package/sandboxels-1.13.2/mods/building.js +154 -0
  440. package/sandboxels-package/sandboxels-1.13.2/mods/buildingreplicator.js +210 -0
  441. package/sandboxels-package/sandboxels-1.13.2/mods/c_fighter_jet.js +449 -0
  442. package/sandboxels-package/sandboxels-1.13.2/mods/cannibal_cooking.js +620 -0
  443. package/sandboxels-package/sandboxels-1.13.2/mods/cash_n_more.js +58 -0
  444. package/sandboxels-package/sandboxels-1.13.2/mods/cat.js +100 -0
  445. package/sandboxels-package/sandboxels-1.13.2/mods/cells.js +376 -0
  446. package/sandboxels-package/sandboxels-1.13.2/mods/chalcopyrite.js +124 -0
  447. package/sandboxels-package/sandboxels-1.13.2/mods/chalk.js +499 -0
  448. package/sandboxels-package/sandboxels-1.13.2/mods/change.js +58 -0
  449. package/sandboxels-package/sandboxels-1.13.2/mods/changePixelDebug.js +9 -0
  450. package/sandboxels-package/sandboxels-1.13.2/mods/changeTempReactionParameter.js +73 -0
  451. package/sandboxels-package/sandboxels-1.13.2/mods/chaos.js +32 -0
  452. package/sandboxels-package/sandboxels-1.13.2/mods/charsonsmodbeta.js +494 -0
  453. package/sandboxels-package/sandboxels-1.13.2/mods/charsonsmoduno.js +2116 -0
  454. package/sandboxels-package/sandboxels-1.13.2/mods/chem.js +7877 -0
  455. package/sandboxels-package/sandboxels-1.13.2/mods/chemFormula.js +44 -0
  456. package/sandboxels-package/sandboxels-1.13.2/mods/chemFormulas.json +549 -0
  457. package/sandboxels-package/sandboxels-1.13.2/mods/cherries.js +543 -0
  458. package/sandboxels-package/sandboxels-1.13.2/mods/chess.js +1463 -0
  459. package/sandboxels-package/sandboxels-1.13.2/mods/children.js +14 -0
  460. package/sandboxels-package/sandboxels-1.13.2/mods/circuitcore.js +1914 -0
  461. package/sandboxels-package/sandboxels-1.13.2/mods/circuitcore_displays.js +157 -0
  462. package/sandboxels-package/sandboxels-1.13.2/mods/citybuilding.js +193 -0
  463. package/sandboxels-package/sandboxels-1.13.2/mods/classic_explosives.js +62 -0
  464. package/sandboxels-package/sandboxels-1.13.2/mods/classic_textures.js +196 -0
  465. package/sandboxels-package/sandboxels-1.13.2/mods/clf3.js +86 -0
  466. package/sandboxels-package/sandboxels-1.13.2/mods/clone_liquid.js +22 -0
  467. package/sandboxels-package/sandboxels-1.13.2/mods/clouds.js +103 -0
  468. package/sandboxels-package/sandboxels-1.13.2/mods/cmur.js +5195 -0
  469. package/sandboxels-package/sandboxels-1.13.2/mods/code_library.js +1827 -0
  470. package/sandboxels-package/sandboxels-1.13.2/mods/coffee.js +228 -0
  471. package/sandboxels-package/sandboxels-1.13.2/mods/cold_liquid_explosion.js +20 -0
  472. package/sandboxels-package/sandboxels-1.13.2/mods/cold_opposites.js +66 -0
  473. package/sandboxels-package/sandboxels-1.13.2/mods/coldblooded.js +729 -0
  474. package/sandboxels-package/sandboxels-1.13.2/mods/collab_mod.js +253 -0
  475. package/sandboxels-package/sandboxels-1.13.2/mods/colonies.js +574 -0
  476. package/sandboxels-package/sandboxels-1.13.2/mods/colorLED.js +38 -0
  477. package/sandboxels-package/sandboxels-1.13.2/mods/color_everything.js +3 -0
  478. package/sandboxels-package/sandboxels-1.13.2/mods/color_tools.js +297 -0
  479. package/sandboxels-package/sandboxels-1.13.2/mods/colored_lightbulbs.js +44 -0
  480. package/sandboxels-package/sandboxels-1.13.2/mods/combustion.js +416 -0
  481. package/sandboxels-package/sandboxels-1.13.2/mods/community_desserts.js +829 -0
  482. package/sandboxels-package/sandboxels-1.13.2/mods/content.js +131 -0
  483. package/sandboxels-package/sandboxels-1.13.2/mods/controllable_pixel.js +75 -0
  484. package/sandboxels-package/sandboxels-1.13.2/mods/controllable_pixel_test.js +161 -0
  485. package/sandboxels-package/sandboxels-1.13.2/mods/conveyance.js +95 -0
  486. package/sandboxels-package/sandboxels-1.13.2/mods/cooked_apple.js +26 -0
  487. package/sandboxels-package/sandboxels-1.13.2/mods/cookie_clicker.js +943 -0
  488. package/sandboxels-package/sandboxels-1.13.2/mods/cookingnstuff.js +1 -0
  489. package/sandboxels-package/sandboxels-1.13.2/mods/cool_tools.js +35 -0
  490. package/sandboxels-package/sandboxels-1.13.2/mods/copy_canvas.js +9 -0
  491. package/sandboxels-package/sandboxels-1.13.2/mods/copypaste.js +100 -0
  492. package/sandboxels-package/sandboxels-1.13.2/mods/coresbyp.js +90 -0
  493. package/sandboxels-package/sandboxels-1.13.2/mods/cpt_alt.js +241 -0
  494. package/sandboxels-package/sandboxels-1.13.2/mods/crimson.js +424 -0
  495. package/sandboxels-package/sandboxels-1.13.2/mods/cs_expanded.js +31 -0
  496. package/sandboxels-package/sandboxels-1.13.2/mods/cubesstuff.js +3329 -0
  497. package/sandboxels-package/sandboxels-1.13.2/mods/currency.js +246 -0
  498. package/sandboxels-package/sandboxels-1.13.2/mods/cursed_shader_by_jayd.js +90 -0
  499. package/sandboxels-package/sandboxels-1.13.2/mods/cursor.js +3 -0
  500. package/sandboxels-package/sandboxels-1.13.2/mods/cursor_shapes.js +149 -0
  501. package/sandboxels-package/sandboxels-1.13.2/mods/customBackground.js +45 -0
  502. package/sandboxels-package/sandboxels-1.13.2/mods/customexplosion.js +110 -0
  503. package/sandboxels-package/sandboxels-1.13.2/mods/customtemptools.js +50 -0
  504. package/sandboxels-package/sandboxels-1.13.2/mods/dalgonacandy.js +41 -0
  505. package/sandboxels-package/sandboxels-1.13.2/mods/datawire.js +238 -0
  506. package/sandboxels-package/sandboxels-1.13.2/mods/date_test.js +268 -0
  507. package/sandboxels-package/sandboxels-1.13.2/mods/death_count.js +35 -0
  508. package/sandboxels-package/sandboxels-1.13.2/mods/debris.js +75 -0
  509. package/sandboxels-package/sandboxels-1.13.2/mods/debrisable.js +1136 -0
  510. package/sandboxels-package/sandboxels-1.13.2/mods/debugRework.js +169 -0
  511. package/sandboxels-package/sandboxels-1.13.2/mods/delete_all_of_element.js +17 -0
  512. package/sandboxels-package/sandboxels-1.13.2/mods/deneme.js +70 -0
  513. package/sandboxels-package/sandboxels-1.13.2/mods/dependency_test.js +13 -0
  514. package/sandboxels-package/sandboxels-1.13.2/mods/descriptions.js +17 -0
  515. package/sandboxels-package/sandboxels-1.13.2/mods/devsnacks.js +193 -0
  516. package/sandboxels-package/sandboxels-1.13.2/mods/devtests.js +278 -0
  517. package/sandboxels-package/sandboxels-1.13.2/mods/discord_port.js +36 -0
  518. package/sandboxels-package/sandboxels-1.13.2/mods/doElectricity changes.js +55 -0
  519. package/sandboxels-package/sandboxels-1.13.2/mods/dogs.js +85 -0
  520. package/sandboxels-package/sandboxels-1.13.2/mods/doom.js +935 -0
  521. package/sandboxels-package/sandboxels-1.13.2/mods/doomsday.js +56 -0
  522. package/sandboxels-package/sandboxels-1.13.2/mods/drawPixels_change_test.js +39 -0
  523. package/sandboxels-package/sandboxels-1.13.2/mods/dried_food.js +38 -0
  524. package/sandboxels-package/sandboxels-1.13.2/mods/drill.js +261 -0
  525. package/sandboxels-package/sandboxels-1.13.2/mods/drills.js +760 -0
  526. package/sandboxels-package/sandboxels-1.13.2/mods/easysurvival.js +917 -0
  527. package/sandboxels-package/sandboxels-1.13.2/mods/edible_everything.js +7 -0
  528. package/sandboxels-package/sandboxels-1.13.2/mods/editTools.js +608 -0
  529. package/sandboxels-package/sandboxels-1.13.2/mods/eklegems.js +1313 -0
  530. package/sandboxels-package/sandboxels-1.13.2/mods/electricityTest.js +42 -0
  531. package/sandboxels-package/sandboxels-1.13.2/mods/elem3.js +352316 -0
  532. package/sandboxels-package/sandboxels-1.13.2/mods/elementEraser.js +40 -0
  533. package/sandboxels-package/sandboxels-1.13.2/mods/element_UI.js +140 -0
  534. package/sandboxels-package/sandboxels-1.13.2/mods/elementreplacer.js +12 -0
  535. package/sandboxels-package/sandboxels-1.13.2/mods/elementsManager.js +1212 -0
  536. package/sandboxels-package/sandboxels-1.13.2/mods/empty.js +7 -0
  537. package/sandboxels-package/sandboxels-1.13.2/mods/evenmoretemptools.js +42 -0
  538. package/sandboxels-package/sandboxels-1.13.2/mods/example_mod.js +89 -0
  539. package/sandboxels-package/sandboxels-1.13.2/mods/example_mod_old.js +84 -0
  540. package/sandboxels-package/sandboxels-1.13.2/mods/exoplanet.js +220 -0
  541. package/sandboxels-package/sandboxels-1.13.2/mods/explodeAtPlus.js +138 -0
  542. package/sandboxels-package/sandboxels-1.13.2/mods/explosionsound.js +19 -0
  543. package/sandboxels-package/sandboxels-1.13.2/mods/extra_element_info.js +79 -0
  544. package/sandboxels-package/sandboxels-1.13.2/mods/extrasaveslots.js +42 -0
  545. package/sandboxels-package/sandboxels-1.13.2/mods/fans.js +204 -0
  546. package/sandboxels-package/sandboxels-1.13.2/mods/fantastic_creatures.js +198 -0
  547. package/sandboxels-package/sandboxels-1.13.2/mods/fantasy_elements.js +800 -0
  548. package/sandboxels-package/sandboxels-1.13.2/mods/fast_lightmap.js +339 -0
  549. package/sandboxels-package/sandboxels-1.13.2/mods/fey_and_more.js +1678 -0
  550. package/sandboxels-package/sandboxels-1.13.2/mods/fill_script.js +42 -0
  551. package/sandboxels-package/sandboxels-1.13.2/mods/find.js +115 -0
  552. package/sandboxels-package/sandboxels-1.13.2/mods/fine_tuned_cloner.js +121 -0
  553. package/sandboxels-package/sandboxels-1.13.2/mods/fire_extinguisher.js +128 -0
  554. package/sandboxels-package/sandboxels-1.13.2/mods/fire_mod.js +565 -0
  555. package/sandboxels-package/sandboxels-1.13.2/mods/fire_slime.js +68 -0
  556. package/sandboxels-package/sandboxels-1.13.2/mods/fishin.js +519 -0
  557. package/sandboxels-package/sandboxels-1.13.2/mods/fission.js +68 -0
  558. package/sandboxels-package/sandboxels-1.13.2/mods/fission_physics.js +86 -0
  559. package/sandboxels-package/sandboxels-1.13.2/mods/fiveys_stuff.js +119 -0
  560. package/sandboxels-package/sandboxels-1.13.2/mods/flesh_infection.js +645 -0
  561. package/sandboxels-package/sandboxels-1.13.2/mods/flipflop.js +36 -0
  562. package/sandboxels-package/sandboxels-1.13.2/mods/flowers_and_forests.js +468 -0
  563. package/sandboxels-package/sandboxels-1.13.2/mods/flying_fish.js +49 -0
  564. package/sandboxels-package/sandboxels-1.13.2/mods/food_mods.js +15 -0
  565. package/sandboxels-package/sandboxels-1.13.2/mods/foodgalore +100 -0
  566. package/sandboxels-package/sandboxels-1.13.2/mods/fools+.js +299 -0
  567. package/sandboxels-package/sandboxels-1.13.2/mods/fools.js +99 -0
  568. package/sandboxels-package/sandboxels-1.13.2/mods/fools24.js +842 -0
  569. package/sandboxels-package/sandboxels-1.13.2/mods/fools25.js +350 -0
  570. package/sandboxels-package/sandboxels-1.13.2/mods/fossils.js +676 -0
  571. package/sandboxels-package/sandboxels-1.13.2/mods/fractals.js +156 -0
  572. package/sandboxels-package/sandboxels-1.13.2/mods/franklin.js +44 -0
  573. package/sandboxels-package/sandboxels-1.13.2/mods/freeTPS.js +19 -0
  574. package/sandboxels-package/sandboxels-1.13.2/mods/fueled_generators.js +131 -0
  575. package/sandboxels-package/sandboxels-1.13.2/mods/funny elements 2022-11-15.js +84 -0
  576. package/sandboxels-package/sandboxels-1.13.2/mods/funny_liquid.js +618 -0
  577. package/sandboxels-package/sandboxels-1.13.2/mods/funny_liquid_2.js +322 -0
  578. package/sandboxels-package/sandboxels-1.13.2/mods/funny_liquid_3.js +254 -0
  579. package/sandboxels-package/sandboxels-1.13.2/mods/funny_solid.js +163 -0
  580. package/sandboxels-package/sandboxels-1.13.2/mods/funnynames.js +320 -0
  581. package/sandboxels-package/sandboxels-1.13.2/mods/fwibblen.js +69 -0
  582. package/sandboxels-package/sandboxels-1.13.2/mods/gambling.js +94 -0
  583. package/sandboxels-package/sandboxels-1.13.2/mods/gameOfLife.js +83 -0
  584. package/sandboxels-package/sandboxels-1.13.2/mods/garn47.js +325 -0
  585. package/sandboxels-package/sandboxels-1.13.2/mods/gasdecay.js +31 -0
  586. package/sandboxels-package/sandboxels-1.13.2/mods/generative_mods.js +2479 -0
  587. package/sandboxels-package/sandboxels-1.13.2/mods/generator_prompt.js +166 -0
  588. package/sandboxels-package/sandboxels-1.13.2/mods/genetics.js +4038 -0
  589. package/sandboxels-package/sandboxels-1.13.2/mods/glenn_gases.js +411 -0
  590. package/sandboxels-package/sandboxels-1.13.2/mods/glow.js +130 -0
  591. package/sandboxels-package/sandboxels-1.13.2/mods/gradient_background_support.js +21 -0
  592. package/sandboxels-package/sandboxels-1.13.2/mods/graphite.js +460 -0
  593. package/sandboxels-package/sandboxels-1.13.2/mods/grav_mudstones.js +382 -0
  594. package/sandboxels-package/sandboxels-1.13.2/mods/gravity.js +40 -0
  595. package/sandboxels-package/sandboxels-1.13.2/mods/gravity_test.js +51 -0
  596. package/sandboxels-package/sandboxels-1.13.2/mods/greenitemsandmore.js +183 -0
  597. package/sandboxels-package/sandboxels-1.13.2/mods/guided_rocket.js +106 -0
  598. package/sandboxels-package/sandboxels-1.13.2/mods/halogen.js +384 -0
  599. package/sandboxels-package/sandboxels-1.13.2/mods/haseulite.js +1673 -0
  600. package/sandboxels-package/sandboxels-1.13.2/mods/heatglow.js +74 -0
  601. package/sandboxels-package/sandboxels-1.13.2/mods/heatshield.js +30 -0
  602. package/sandboxels-package/sandboxels-1.13.2/mods/hexagon.js +45 -0
  603. package/sandboxels-package/sandboxels-1.13.2/mods/hidden_ground.js +42 -0
  604. package/sandboxels-package/sandboxels-1.13.2/mods/hideandshowtools.js +18 -0
  605. package/sandboxels-package/sandboxels-1.13.2/mods/human_edit.js +725 -0
  606. package/sandboxels-package/sandboxels-1.13.2/mods/human_friendly_design.js +899 -0
  607. package/sandboxels-package/sandboxels-1.13.2/mods/humans.js +203 -0
  608. package/sandboxels-package/sandboxels-1.13.2/mods/hydroid.js +224 -0
  609. package/sandboxels-package/sandboxels-1.13.2/mods/icb.js +32 -0
  610. package/sandboxels-package/sandboxels-1.13.2/mods/iean.js +135 -0
  611. package/sandboxels-package/sandboxels-1.13.2/mods/immune.js +199 -0
  612. package/sandboxels-package/sandboxels-1.13.2/mods/incinerators.js +29 -0
  613. package/sandboxels-package/sandboxels-1.13.2/mods/industry.js +308 -0
  614. package/sandboxels-package/sandboxels-1.13.2/mods/infLiqLight.js +8 -0
  615. package/sandboxels-package/sandboxels-1.13.2/mods/injector.js +450 -0
  616. package/sandboxels-package/sandboxels-1.13.2/mods/insane_random_events.js +123 -0
  617. package/sandboxels-package/sandboxels-1.13.2/mods/invertscroll.js +8 -0
  618. package/sandboxels-package/sandboxels-1.13.2/mods/invisible_things.js +83 -0
  619. package/sandboxels-package/sandboxels-1.13.2/mods/iocalfaeus_clones.js +100 -0
  620. package/sandboxels-package/sandboxels-1.13.2/mods/jaydsfunctions.js +187 -0
  621. package/sandboxels-package/sandboxels-1.13.2/mods/jaydsmods.js +89 -0
  622. package/sandboxels-package/sandboxels-1.13.2/mods/jaydstuff.js +783 -0
  623. package/sandboxels-package/sandboxels-1.13.2/mods/junction.js +50 -0
  624. package/sandboxels-package/sandboxels-1.13.2/mods/ketchup_mod.js +526 -0
  625. package/sandboxels-package/sandboxels-1.13.2/mods/kopalsBar.js +175 -0
  626. package/sandboxels-package/sandboxels-1.13.2/mods/kopalstuff.js +541 -0
  627. package/sandboxels-package/sandboxels-1.13.2/mods/lactose_intolerance_and_celiac.js +18 -0
  628. package/sandboxels-package/sandboxels-1.13.2/mods/laetium.js +328 -0
  629. package/sandboxels-package/sandboxels-1.13.2/mods/lattice_filler.js +29 -0
  630. package/sandboxels-package/sandboxels-1.13.2/mods/lemonade.js +71 -0
  631. package/sandboxels-package/sandboxels-1.13.2/mods/libhooktick.js +49 -0
  632. package/sandboxels-package/sandboxels-1.13.2/mods/libpacman-v1.js +61 -0
  633. package/sandboxels-package/sandboxels-1.13.2/mods/libpixeltracking.js +29 -0
  634. package/sandboxels-package/sandboxels-1.13.2/mods/library_test.js +5 -0
  635. package/sandboxels-package/sandboxels-1.13.2/mods/life_eater.js +169 -0
  636. package/sandboxels-package/sandboxels-1.13.2/mods/light.js +218 -0
  637. package/sandboxels-package/sandboxels-1.13.2/mods/lighting_test.js +79 -0
  638. package/sandboxels-package/sandboxels-1.13.2/mods/lightmap.js +382 -0
  639. package/sandboxels-package/sandboxels-1.13.2/mods/limewater.js +75 -0
  640. package/sandboxels-package/sandboxels-1.13.2/mods/liquid_energy.js +294 -0
  641. package/sandboxels-package/sandboxels-1.13.2/mods/liquid_mixing.js +184 -0
  642. package/sandboxels-package/sandboxels-1.13.2/mods/liquid_void.js +29 -0
  643. package/sandboxels-package/sandboxels-1.13.2/mods/littlejohnny.js +72 -0
  644. package/sandboxels-package/sandboxels-1.13.2/mods/lizard_mod.js +91 -0
  645. package/sandboxels-package/sandboxels-1.13.2/mods/logicgates.js +482 -0
  646. package/sandboxels-package/sandboxels-1.13.2/mods/lone_urea.js +69 -0
  647. package/sandboxels-package/sandboxels-1.13.2/mods/lost_souls.js +177 -0
  648. package/sandboxels-package/sandboxels-1.13.2/mods/lye.js +34 -0
  649. package/sandboxels-package/sandboxels-1.13.2/mods/machines.js +293 -0
  650. package/sandboxels-package/sandboxels-1.13.2/mods/manyMoreThemes.js +67 -0
  651. package/sandboxels-package/sandboxels-1.13.2/mods/mars.js +473 -0
  652. package/sandboxels-package/sandboxels-1.13.2/mods/maxColorOffset.js +54 -0
  653. package/sandboxels-package/sandboxels-1.13.2/mods/maze.js +71 -0
  654. package/sandboxels-package/sandboxels-1.13.2/mods/meat_rockets.js +70 -0
  655. package/sandboxels-package/sandboxels-1.13.2/mods/memelists.js +17 -0
  656. package/sandboxels-package/sandboxels-1.13.2/mods/metals.js +791 -0
  657. package/sandboxels-package/sandboxels-1.13.2/mods/minecraft.js +818 -0
  658. package/sandboxels-package/sandboxels-1.13.2/mods/minesweeper.js +100 -0
  659. package/sandboxels-package/sandboxels-1.13.2/mods/miscellaneous_elements.js +278 -0
  660. package/sandboxels-package/sandboxels-1.13.2/mods/miscible_psoup_and_birthpool.js +7 -0
  661. package/sandboxels-package/sandboxels-1.13.2/mods/mix.js +65 -0
  662. package/sandboxels-package/sandboxels-1.13.2/mods/mixture.js +714 -0
  663. package/sandboxels-package/sandboxels-1.13.2/mods/mixtureII.js +440 -0
  664. package/sandboxels-package/sandboxels-1.13.2/mods/mjsstuff.js +233 -0
  665. package/sandboxels-package/sandboxels-1.13.2/mods/mobile_keybinds.js +33 -0
  666. package/sandboxels-package/sandboxels-1.13.2/mods/mobile_shift.js +336 -0
  667. package/sandboxels-package/sandboxels-1.13.2/mods/mobs.js +5147 -0
  668. package/sandboxels-package/sandboxels-1.13.2/mods/mod_for_mnem.js +1 -0
  669. package/sandboxels-package/sandboxels-1.13.2/mods/modlangs.js +53 -0
  670. package/sandboxels-package/sandboxels-1.13.2/mods/moreViews.js +473 -0
  671. package/sandboxels-package/sandboxels-1.13.2/mods/more_art_states.js +89 -0
  672. package/sandboxels-package/sandboxels-1.13.2/mods/more_breaking.js +189 -0
  673. package/sandboxels-package/sandboxels-1.13.2/mods/more_disasters.js +497 -0
  674. package/sandboxels-package/sandboxels-1.13.2/mods/more_gold.js +115 -0
  675. package/sandboxels-package/sandboxels-1.13.2/mods/morebombs.js +1143 -0
  676. package/sandboxels-package/sandboxels-1.13.2/mods/morechemistry.js +1764 -0
  677. package/sandboxels-package/sandboxels-1.13.2/mods/morefoodsmod.js +154 -0
  678. package/sandboxels-package/sandboxels-1.13.2/mods/moreliquids.js +138 -0
  679. package/sandboxels-package/sandboxels-1.13.2/mods/morepowders.js +335 -0
  680. package/sandboxels-package/sandboxels-1.13.2/mods/moretools.js +68 -0
  681. package/sandboxels-package/sandboxels-1.13.2/mods/moretrees.js +490 -0
  682. package/sandboxels-package/sandboxels-1.13.2/mods/mossstuff.js +2301 -0
  683. package/sandboxels-package/sandboxels-1.13.2/mods/mouthwash.js +23 -0
  684. package/sandboxels-package/sandboxels-1.13.2/mods/move_tools.js +71 -0
  685. package/sandboxels-package/sandboxels-1.13.2/mods/moveable_cubes.js +258 -0
  686. package/sandboxels-package/sandboxels-1.13.2/mods/moving_pixels.js +179 -0
  687. package/sandboxels-package/sandboxels-1.13.2/mods/mush_infection.js +321 -0
  688. package/sandboxels-package/sandboxels-1.13.2/mods/musicalfruit.js +4 -0
  689. package/sandboxels-package/sandboxels-1.13.2/mods/mustard.js +48 -0
  690. package/sandboxels-package/sandboxels-1.13.2/mods/mystic.js +274 -0
  691. package/sandboxels-package/sandboxels-1.13.2/mods/nastystuff.js +57 -0
  692. package/sandboxels-package/sandboxels-1.13.2/mods/nature_Mod.js +1384 -0
  693. package/sandboxels-package/sandboxels-1.13.2/mods/nekonicos_stuff.js +1651 -0
  694. package/sandboxels-package/sandboxels-1.13.2/mods/nested_for_reaction_example.js +19 -0
  695. package/sandboxels-package/sandboxels-1.13.2/mods/nettysaddon.js +48 -0
  696. package/sandboxels-package/sandboxels-1.13.2/mods/neutronium_compressor.js +416 -0
  697. package/sandboxels-package/sandboxels-1.13.2/mods/nicer_flame.js +48 -0
  698. package/sandboxels-package/sandboxels-1.13.2/mods/nirmod.js +296 -0
  699. package/sandboxels-package/sandboxels-1.13.2/mods/nitroglycerin.js +54 -0
  700. package/sandboxels-package/sandboxels-1.13.2/mods/no_blood.js +23 -0
  701. package/sandboxels-package/sandboxels-1.13.2/mods/no_radiation_events.js +3 -0
  702. package/sandboxels-package/sandboxels-1.13.2/mods/no_random_grbs.js +9 -0
  703. package/sandboxels-package/sandboxels-1.13.2/mods/no_scroll.js +5 -0
  704. package/sandboxels-package/sandboxels-1.13.2/mods/noblegas.js +215 -0
  705. package/sandboxels-package/sandboxels-1.13.2/mods/nocancer.js +9 -0
  706. package/sandboxels-package/sandboxels-1.13.2/mods/nocancer2.js +1 -0
  707. package/sandboxels-package/sandboxels-1.13.2/mods/noconfirm.js +1 -0
  708. package/sandboxels-package/sandboxels-1.13.2/mods/nograssgrow.js +6 -0
  709. package/sandboxels-package/sandboxels-1.13.2/mods/noita.js +4895 -0
  710. package/sandboxels-package/sandboxels-1.13.2/mods/noita_demake.js +430 -0
  711. package/sandboxels-package/sandboxels-1.13.2/mods/nopixellimit.js +2 -0
  712. package/sandboxels-package/sandboxels-1.13.2/mods/note_block.js +97 -0
  713. package/sandboxels-package/sandboxels-1.13.2/mods/note_block_advanced.js +628 -0
  714. package/sandboxels-package/sandboxels-1.13.2/mods/nousersthings.js +4081 -0
  715. package/sandboxels-package/sandboxels-1.13.2/mods/nuclear.js +300 -0
  716. package/sandboxels-package/sandboxels-1.13.2/mods/nv7.js +35013 -0
  717. package/sandboxels-package/sandboxels-1.13.2/mods/obsidian.js +51 -0
  718. package/sandboxels-package/sandboxels-1.13.2/mods/occlusion.js +149 -0
  719. package/sandboxels-package/sandboxels-1.13.2/mods/ocean.js +130 -0
  720. package/sandboxels-package/sandboxels-1.13.2/mods/ochem_prerelease.js +774 -0
  721. package/sandboxels-package/sandboxels-1.13.2/mods/oldTooltip.js +23 -0
  722. package/sandboxels-package/sandboxels-1.13.2/mods/oldleds.js +20 -0
  723. package/sandboxels-package/sandboxels-1.13.2/mods/onTryMoveInto.js +85 -0
  724. package/sandboxels-package/sandboxels-1.13.2/mods/onecolor.js +146 -0
  725. package/sandboxels-package/sandboxels-1.13.2/mods/orchidslibrary.js +70 -0
  726. package/sandboxels-package/sandboxels-1.13.2/mods/ores.js +232 -0
  727. package/sandboxels-package/sandboxels-1.13.2/mods/organism.js +915 -0
  728. package/sandboxels-package/sandboxels-1.13.2/mods/oxide.theme.js +46 -0
  729. package/sandboxels-package/sandboxels-1.13.2/mods/page_color.js +35 -0
  730. package/sandboxels-package/sandboxels-1.13.2/mods/paint_event.js +17 -0
  731. package/sandboxels-package/sandboxels-1.13.2/mods/periodic_and_more.js +64 -0
  732. package/sandboxels-package/sandboxels-1.13.2/mods/peta.js +214 -0
  733. package/sandboxels-package/sandboxels-1.13.2/mods/petal_dye.js +40 -0
  734. package/sandboxels-package/sandboxels-1.13.2/mods/pixelResizeTool.js +18 -0
  735. package/sandboxels-package/sandboxels-1.13.2/mods/pizzasstuff.js +2338 -0
  736. package/sandboxels-package/sandboxels-1.13.2/mods/place_all_elements.js +30 -0
  737. package/sandboxels-package/sandboxels-1.13.2/mods/placuchtestthing.js +17 -0
  738. package/sandboxels-package/sandboxels-1.13.2/mods/planet.js +270 -0
  739. package/sandboxels-package/sandboxels-1.13.2/mods/planet_cracker.js +81 -0
  740. package/sandboxels-package/sandboxels-1.13.2/mods/plants.js +1616 -0
  741. package/sandboxels-package/sandboxels-1.13.2/mods/plastic.js +93 -0
  742. package/sandboxels-package/sandboxels-1.13.2/mods/portal.js +120 -0
  743. package/sandboxels-package/sandboxels-1.13.2/mods/potato_chips.js +44 -0
  744. package/sandboxels-package/sandboxels-1.13.2/mods/prairie.js +200 -0
  745. package/sandboxels-package/sandboxels-1.13.2/mods/precisionDrawing.js +58 -0
  746. package/sandboxels-package/sandboxels-1.13.2/mods/pressure.js +223 -0
  747. package/sandboxels-package/sandboxels-1.13.2/mods/pressure_sensitive.js +20 -0
  748. package/sandboxels-package/sandboxels-1.13.2/mods/prideflags.js +307 -0
  749. package/sandboxels-package/sandboxels-1.13.2/mods/primordial_birthpool.js +38 -0
  750. package/sandboxels-package/sandboxels-1.13.2/mods/prompt.js +1215 -0
  751. package/sandboxels-package/sandboxels-1.13.2/mods/prop and prompt variables.js +16 -0
  752. package/sandboxels-package/sandboxels-1.13.2/mods/prop.js +466 -0
  753. package/sandboxels-package/sandboxels-1.13.2/mods/pullers.js +479 -0
  754. package/sandboxels-package/sandboxels-1.13.2/mods/purple_guys_mod.js +3635 -0
  755. package/sandboxels-package/sandboxels-1.13.2/mods/pushers.js +287 -0
  756. package/sandboxels-package/sandboxels-1.13.2/mods/radioactive.js +135 -0
  757. package/sandboxels-package/sandboxels-1.13.2/mods/rainbow_cursor.js +12 -0
  758. package/sandboxels-package/sandboxels-1.13.2/mods/rainbow_tests.js +348 -0
  759. package/sandboxels-package/sandboxels-1.13.2/mods/rainsmod.js +412 -0
  760. package/sandboxels-package/sandboxels-1.13.2/mods/random_elems.js +463 -0
  761. package/sandboxels-package/sandboxels-1.13.2/mods/random_everything.js +7 -0
  762. package/sandboxels-package/sandboxels-1.13.2/mods/random_fixes.js +42 -0
  763. package/sandboxels-package/sandboxels-1.13.2/mods/random_liquids.js +220 -0
  764. package/sandboxels-package/sandboxels-1.13.2/mods/random_rocks.js +164 -0
  765. package/sandboxels-package/sandboxels-1.13.2/mods/random_things.js +69 -0
  766. package/sandboxels-package/sandboxels-1.13.2/mods/randomelements.js +200 -0
  767. package/sandboxels-package/sandboxels-1.13.2/mods/randomness.js +730 -0
  768. package/sandboxels-package/sandboxels-1.13.2/mods/randomness_but_tick.js +1257 -0
  769. package/sandboxels-package/sandboxels-1.13.2/mods/randomness_but_tool.js +26 -0
  770. package/sandboxels-package/sandboxels-1.13.2/mods/ray_cloner.js +150 -0
  771. package/sandboxels-package/sandboxels-1.13.2/mods/rays++.js +60 -0
  772. package/sandboxels-package/sandboxels-1.13.2/mods/rays.js +464 -0
  773. package/sandboxels-package/sandboxels-1.13.2/mods/reactor_supplies_and_others.js +88 -0
  774. package/sandboxels-package/sandboxels-1.13.2/mods/real_light.js +754 -0
  775. package/sandboxels-package/sandboxels-1.13.2/mods/replace.js +79 -0
  776. package/sandboxels-package/sandboxels-1.13.2/mods/replace_all.js +45 -0
  777. package/sandboxels-package/sandboxels-1.13.2/mods/reverse_time.js +421 -0
  778. package/sandboxels-package/sandboxels-1.13.2/mods/rich_grain.js +54 -0
  779. package/sandboxels-package/sandboxels-1.13.2/mods/rising_powders.js +3 -0
  780. package/sandboxels-package/sandboxels-1.13.2/mods/rock_paper_scissors.js +32 -0
  781. package/sandboxels-package/sandboxels-1.13.2/mods/roseyiede.js +363 -0
  782. package/sandboxels-package/sandboxels-1.13.2/mods/rpg.js +1342 -0
  783. package/sandboxels-package/sandboxels-1.13.2/mods/ru_expanded.js +25 -0
  784. package/sandboxels-package/sandboxels-1.13.2/mods/runAfterAutogen and onload restructure.js +1 -0
  785. package/sandboxels-package/sandboxels-1.13.2/mods/runAfterAutogen2.js +56 -0
  786. package/sandboxels-package/sandboxels-1.13.2/mods/sandboxels.js +2501 -0
  787. package/sandboxels-package/sandboxels-1.13.2/mods/saturnsstuff.js +729 -0
  788. package/sandboxels-package/sandboxels-1.13.2/mods/save_loading.js +520 -0
  789. package/sandboxels-package/sandboxels-1.13.2/mods/sbmixup.js +1439 -0
  790. package/sandboxels-package/sandboxels-1.13.2/mods/sbstuff.js +1865 -0
  791. package/sandboxels-package/sandboxels-1.13.2/mods/scenexe.js +770 -0
  792. package/sandboxels-package/sandboxels-1.13.2/mods/schematics.js +214 -0
  793. package/sandboxels-package/sandboxels-1.13.2/mods/scp.js +7831 -0
  794. package/sandboxels-package/sandboxels-1.13.2/mods/selective_paint.js +60 -0
  795. package/sandboxels-package/sandboxels-1.13.2/mods/sensitive.js +20 -0
  796. package/sandboxels-package/sandboxels-1.13.2/mods/shade.js +46 -0
  797. package/sandboxels-package/sandboxels-1.13.2/mods/shader_by_jayd.js +168 -0
  798. package/sandboxels-package/sandboxels-1.13.2/mods/shipstuff.js +198 -0
  799. package/sandboxels-package/sandboxels-1.13.2/mods/singleColor.js +1 -0
  800. package/sandboxels-package/sandboxels-1.13.2/mods/single_humans.js +147 -0
  801. package/sandboxels-package/sandboxels-1.13.2/mods/sky.js +141 -0
  802. package/sandboxels-package/sandboxels-1.13.2/mods/slag_fix.js +25 -0
  803. package/sandboxels-package/sandboxels-1.13.2/mods/smooth_water.js +6 -0
  804. package/sandboxels-package/sandboxels-1.13.2/mods/solid_rock.js +74 -0
  805. package/sandboxels-package/sandboxels-1.13.2/mods/solidcolor.js +146 -0
  806. package/sandboxels-package/sandboxels-1.13.2/mods/solubility.js +287 -0
  807. package/sandboxels-package/sandboxels-1.13.2/mods/some_tf_liquids.js +358 -0
  808. package/sandboxels-package/sandboxels-1.13.2/mods/souls.js +163 -0
  809. package/sandboxels-package/sandboxels-1.13.2/mods/soups.js +104 -0
  810. package/sandboxels-package/sandboxels-1.13.2/mods/spaceship.js +138 -0
  811. package/sandboxels-package/sandboxels-1.13.2/mods/special_property_library.js +155 -0
  812. package/sandboxels-package/sandboxels-1.13.2/mods/sponge_edit.js +76 -0
  813. package/sandboxels-package/sandboxels-1.13.2/mods/sports_beta.js +69 -0
  814. package/sandboxels-package/sandboxels-1.13.2/mods/spouts.js +715 -0
  815. package/sandboxels-package/sandboxels-1.13.2/mods/spring.js +283 -0
  816. package/sandboxels-package/sandboxels-1.13.2/mods/stainless_steel.js +126 -0
  817. package/sandboxels-package/sandboxels-1.13.2/mods/star_wars.js +70 -0
  818. package/sandboxels-package/sandboxels-1.13.2/mods/state_voids.js +347 -0
  819. package/sandboxels-package/sandboxels-1.13.2/mods/static.js +182 -0
  820. package/sandboxels-package/sandboxels-1.13.2/mods/stickyslime.js +3 -0
  821. package/sandboxels-package/sandboxels-1.13.2/mods/stickystuff.js +59 -0
  822. package/sandboxels-package/sandboxels-1.13.2/mods/stormlib.js +99 -0
  823. package/sandboxels-package/sandboxels-1.13.2/mods/stripe_paint.js +110 -0
  824. package/sandboxels-package/sandboxels-1.13.2/mods/structure_test.js +755 -0
  825. package/sandboxels-package/sandboxels-1.13.2/mods/sturdierpowders.js +595 -0
  826. package/sandboxels-package/sandboxels-1.13.2/mods/subspace.js +46 -0
  827. package/sandboxels-package/sandboxels-1.13.2/mods/survival.js +499 -0
  828. package/sandboxels-package/sandboxels-1.13.2/mods/survivalhack.js +500 -0
  829. package/sandboxels-package/sandboxels-1.13.2/mods/sus.js +92 -0
  830. package/sandboxels-package/sandboxels-1.13.2/mods/switches.js +53 -0
  831. package/sandboxels-package/sandboxels-1.13.2/mods/talismanadditions.js +124 -0
  832. package/sandboxels-package/sandboxels-1.13.2/mods/tech.js +282 -0
  833. package/sandboxels-package/sandboxels-1.13.2/mods/test.js +8 -0
  834. package/sandboxels-package/sandboxels-1.13.2/mods/test_2.js +399 -0
  835. package/sandboxels-package/sandboxels-1.13.2/mods/testmod.js +7 -0
  836. package/sandboxels-package/sandboxels-1.13.2/mods/text.js +681 -0
  837. package/sandboxels-package/sandboxels-1.13.2/mods/texture_pack_by_jayd.js +116 -0
  838. package/sandboxels-package/sandboxels-1.13.2/mods/texturepack.js +94 -0
  839. package/sandboxels-package/sandboxels-1.13.2/mods/the_ground.js +3 -0
  840. package/sandboxels-package/sandboxels-1.13.2/mods/the_ground_og.js +2570 -0
  841. package/sandboxels-package/sandboxels-1.13.2/mods/the_snail.js +63 -0
  842. package/sandboxels-package/sandboxels-1.13.2/mods/themostrandomstuff.js +523 -0
  843. package/sandboxels-package/sandboxels-1.13.2/mods/thermal_conduit.js +157 -0
  844. package/sandboxels-package/sandboxels-1.13.2/mods/thiquovite.js +1745 -0
  845. package/sandboxels-package/sandboxels-1.13.2/mods/ticking_temp_stuff.js +494 -0
  846. package/sandboxels-package/sandboxels-1.13.2/mods/time.js +7 -0
  847. package/sandboxels-package/sandboxels-1.13.2/mods/toms_stuff.js +308 -0
  848. package/sandboxels-package/sandboxels-1.13.2/mods/tool_pixel_behavior.js +792 -0
  849. package/sandboxels-package/sandboxels-1.13.2/mods/tooltip.js +32 -0
  850. package/sandboxels-package/sandboxels-1.13.2/mods/toothpaste.js +154 -0
  851. package/sandboxels-package/sandboxels-1.13.2/mods/tpt.js +89 -0
  852. package/sandboxels-package/sandboxels-1.13.2/mods/triggerable_random_powders.js +68 -0
  853. package/sandboxels-package/sandboxels-1.13.2/mods/troll.js +170 -0
  854. package/sandboxels-package/sandboxels-1.13.2/mods/true_flashbang.js +520 -0
  855. package/sandboxels-package/sandboxels-1.13.2/mods/ultimadrink.js +3191 -0
  856. package/sandboxels-package/sandboxels-1.13.2/mods/uncook.js +51 -0
  857. package/sandboxels-package/sandboxels-1.13.2/mods/unhide.js +10 -0
  858. package/sandboxels-package/sandboxels-1.13.2/mods/variety_mod.js +727 -0
  859. package/sandboxels-package/sandboxels-1.13.2/mods/velocity.js +139 -0
  860. package/sandboxels-package/sandboxels-1.13.2/mods/velocity2.js +209 -0
  861. package/sandboxels-package/sandboxels-1.13.2/mods/video.js +125 -0
  862. package/sandboxels-package/sandboxels-1.13.2/mods/vinegar.js +17 -0
  863. package/sandboxels-package/sandboxels-1.13.2/mods/volcanic_expansion.js +94 -0
  864. package/sandboxels-package/sandboxels-1.13.2/mods/war.js +51 -0
  865. package/sandboxels-package/sandboxels-1.13.2/mods/war_crimes.js +131 -0
  866. package/sandboxels-package/sandboxels-1.13.2/mods/waterspout.js +26 -0
  867. package/sandboxels-package/sandboxels-1.13.2/mods/weAllScreamFor.js +218 -0
  868. package/sandboxels-package/sandboxels-1.13.2/mods/weapons.js +1286 -0
  869. package/sandboxels-package/sandboxels-1.13.2/mods/wheel_fix.js +19 -0
  870. package/sandboxels-package/sandboxels-1.13.2/mods/wifi.js +162 -0
  871. package/sandboxels-package/sandboxels-1.13.2/mods/wifi_draw.js +87 -0
  872. package/sandboxels-package/sandboxels-1.13.2/mods/wine.js +8 -0
  873. package/sandboxels-package/sandboxels-1.13.2/mods/wirelike_test.js +681 -0
  874. package/sandboxels-package/sandboxels-1.13.2/mods/worldEdit.js +441 -0
  875. package/sandboxels-package/sandboxels-1.13.2/mods/worldEdit.ts +569 -0
  876. package/sandboxels-package/sandboxels-1.13.2/mods/world_gen_test.js +315 -0
  877. package/sandboxels-package/sandboxels-1.13.2/mods/worldgen_test.js +173 -0
  878. package/sandboxels-package/sandboxels-1.13.2/mods/worldgenlibrary.js +164 -0
  879. package/sandboxels-package/sandboxels-1.13.2/mods/x_dependent_change_test.js +34 -0
  880. package/sandboxels-package/sandboxels-1.13.2/mods/yumcherries.js +543 -0
  881. package/sandboxels-package/sandboxels-1.13.2/mods/zonneschijn7.js +6 -0
  882. package/sandboxels-package/sandboxels-1.13.2/mods/zoom.js +322 -0
  883. package/sandboxels-package/sandboxels-1.13.2/offline-use.html +103 -0
  884. package/sandboxels-package/sandboxels-1.13.2/offline.html +1 -0
  885. package/sandboxels-package/sandboxels-1.13.2/presskit.html +165 -0
  886. package/sandboxels-package/sandboxels-1.13.2/promo.html +13 -0
  887. package/sandboxels-package/sandboxels-1.13.2/scripts/im2elements/code.go +116 -0
  888. package/sandboxels-package/sandboxels-1.13.2/scripts/im2elements/go.mod +5 -0
  889. package/sandboxels-package/sandboxels-1.13.2/scripts/im2elements/go.sum +2 -0
  890. package/sandboxels-package/sandboxels-1.13.2/scripts/im2elements/main.go +58 -0
  891. package/sandboxels-package/sandboxels-1.13.2/scripts/perlin.js +165 -0
  892. package/sandboxels-package/sandboxels-1.13.2/service-worker.js +16 -0
  893. package/sandboxels-package/sandboxels-1.13.2/sitemap.txt +13 -0
  894. package/sandboxels-package/sandboxels-1.13.2/style.css +1105 -0
  895. package/sandboxels-package/sandboxels-1.13.2/template.html +86 -0
  896. package/sandboxels-package/sandboxels-1.13.2/tips.html +147 -0
  897. package/sandboxels-package/sandboxels-1.13.2/translate.html +105 -0
  898. package/README.md +0 -3
@@ -0,0 +1,3329 @@
1
+ /*
2
+ Use intellisense for sandboxels modding here:
3
+ to show availavle functions and show global variables
4
+ https://github.com/Cube14yt/sandboxels-types
5
+ */
6
+
7
+
8
+ // Changelog
9
+ /*
10
+ V1
11
+ Solids: Aerogel, Nordic Gold, Nordic Gold coin, Pyrite
12
+ Machines: Disco Ball
13
+ Extras: Fire Extinguisher Powder
14
+
15
+ V2
16
+ Machines: Button, Disco Floor, Faulty Wire, Randomizer,
17
+ Tools: Press, Circle
18
+ Solids: Cardboard, Obsidian
19
+ Powders: Glow Stick, Obsidian Shard
20
+ Liquids: Glow Stick Liquid, Lighter fluid, Gasoline
21
+ Life: Mold, Moss,
22
+ Gases: Lighter Fluid Gas
23
+ Food: Pie, Pie Crust
24
+
25
+ V3
26
+ Tools: RGB LED, Dice, Custom Bomb
27
+ Life: Pineapple Plants (seed, stem, fruit)
28
+ Hazards: Lithium Battery, Lithium, Rubidium, Asbestos
29
+ Minerals: Chalk, Chalk Powder, Lapis Lazuli
30
+ Light: UV Light, Phosphor, Neon Tube
31
+ Extras: Realistic Ball
32
+
33
+ V3.1
34
+ Bug Fixes
35
+ Chalk powder, Wet chalk poeder, and Obsidian shard can now be glued back as intended.
36
+ Dog can now be smashed correctly.
37
+ Steam support with promptInput() instead of prompt()
38
+
39
+ V3.2
40
+ Machines: Robot, Adjustable heater/cooler
41
+
42
+ Bug Fixes
43
+ Fixed compatibility issue with nousersthings.js
44
+
45
+ V4
46
+ Machines: Paper filter, Indestructable filter, and Note block
47
+ Life: Cacao Plants (seed, stem, fruit)
48
+ Tools: Polish
49
+ Extras: 2 ways to make an element with no name
50
+ Special: Black hole
51
+ Building Materials: Roman concrete/cement
52
+
53
+ V5
54
+ Machines: Random Teleporter
55
+ Life: Carrot seed and fruit
56
+ Minerals: Quartz and Quartz powder
57
+ Special: Random Word Generator, Fill all,
58
+ Element fill all, Pulsing Color, Element line, White hole
59
+
60
+ Changes:
61
+ Moved sandstone to land category
62
+
63
+ Technical:
64
+ New helpers for squareCoords and adjacentCoords
65
+ Rainbow color preset
66
+ */
67
+ let globals = {
68
+ circleRad: 7,
69
+ circleElem: "wood",
70
+ red: randomIntInRange(0, 255),
71
+ green: randomIntInRange(0, 255),
72
+ blue: randomIntInRange(0, 255),
73
+ explodeElem: "fire",
74
+ adjusted_heater_temp: 100
75
+ }
76
+
77
+ const rainbowColor = ["#ff0000", "#ff8800", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"]
78
+
79
+ elements.button = {
80
+ color: "#970000",
81
+ conduct: 1,
82
+ charge: 0,
83
+ category: "machines",
84
+ behavior: behaviors.WALL,
85
+ state: "solid",
86
+ onSelect: function () {
87
+ logMessage("Click the button with no elements equipped to charge the button.")
88
+ },
89
+ properties: {
90
+ clicked: false,
91
+ clickTime: 1,
92
+ },
93
+ onClicked: function (pixel) {
94
+ pixel.clicked = true
95
+ pixel.clickTime = 1
96
+ },
97
+ tick: function (pixel) {
98
+ if (pixel.clicked == true && pixel.clickTime > 0) {
99
+ pixel.charge = 1
100
+ pixel.clickTime--
101
+ }
102
+ else if (pixel.clicked == true && pixel.clickTime <= 0) {
103
+ pixel.clicked = false
104
+ pixel.charge = 0
105
+ }
106
+ }
107
+ }
108
+
109
+
110
+ function isPressable(pixel) {
111
+ if (elements[pixel.element].pressInto !== undefined) return true;
112
+ }
113
+
114
+ elements.aerogel = {
115
+ color: "#79ffff",
116
+ category: "solids",
117
+ behavior: behaviors.WALL,
118
+ state: "solid",
119
+ tempHigh: 1200,
120
+ stateHigh: "ash",
121
+ insulate: true,
122
+ density: 0.2,
123
+ hardness: 0.1,
124
+ breakInto: "dust",
125
+ onPlace: function (pixel) {
126
+ if (pixel.alpha === undefined) { pixel.alpha = Math.random() * (0.5 - 0.4) + 0.4 }
127
+ }
128
+ }
129
+
130
+ let oldCopperReactions = elements.copper.reactions
131
+ elements.molten_copper.reactions.molten_aluminum = { elem1: "molten_nordic_gold", elem2: null, chance: 0.5 }
132
+ elements.acid.ignore.push("nordic_gold")
133
+ elements.acid.ignore.push("nordic_gold_coin")
134
+
135
+ elements.nordic_gold = {
136
+ color: ["#f1db7c", "#e5c34b", "#d2a742", "#b98c31", "#a47320"],
137
+ tempHigh: 1060,
138
+ behavior: behaviors.WALL,
139
+ category: "solids",
140
+ state: "solid",
141
+ density: 8800,
142
+ conduct: 0.90,
143
+ breakInto: "nordic_gold_coin"
144
+ }
145
+
146
+ elements.nordic_gold_coin = {
147
+ color: ["#f1db7c", "#e5c34b", "#d2a742", "#b98c31", "#a47320"],
148
+ tempHigh: 1060,
149
+ stateHigh: "molten_nordic_gold",
150
+ behavior: behaviors.POWDER,
151
+ category: "powders",
152
+ state: "solid",
153
+ density: 8800,
154
+ conduct: 0.90,
155
+ alias: "euro_coin",
156
+ reactions: {
157
+ "glue": { elem1: "nordic_gold", elem2: null }
158
+ }
159
+ }
160
+
161
+ function randomColor() {
162
+ const letters = "0123456789ABCDEF";
163
+ let color = "#";
164
+ for (let i = 0; i < 6; i++) {
165
+ color += letters[Math.floor(Math.random() * 16)];
166
+ }
167
+ return color;
168
+ }
169
+
170
+ elements.disco_ball = {
171
+ color: "#ebebc3",
172
+ buttonColor: rainbowColor,
173
+ renderer: renderPresets.LED,
174
+ behavior: behaviors.WALL,
175
+ category: "machines",
176
+ tempHigh: 1500,
177
+ stateHigh: ["molten_glass", "molten_glass", "molten_copper"],
178
+ conduct: 1,
179
+ breakInto: "glass_shard",
180
+ forceSaveColor: true,
181
+ tick: function (pixel) {
182
+ if (!pixel.charge) {
183
+ pixel.charge = 0
184
+ }
185
+ for (var i = 0; i < squareCoords.length; i++) {
186
+ var coord = squareCoords[i];
187
+ var x = pixel.x + coord[0];
188
+ var y = pixel.y + coord[1];
189
+ if (pixel.charge > 0) {
190
+ pixel.color = randomColor()
191
+ if (isEmpty(x, y)) {
192
+ createPixel("light", x, y)
193
+ let p = getPixel(x, y)
194
+ if (p !== null && p.element == "light") {
195
+ p.color = pixel.color
196
+ }
197
+ }
198
+ }
199
+ else { pixel.color = "#ebebc3" }
200
+ }
201
+ },
202
+ state: "solid"
203
+ }
204
+
205
+ elements.molten_iron.reactions.sulfur = { elem1: "pyrite", elem2: null, chance: 0.25 }
206
+ elements.molten_iron.reactions.molten_sulfur = { elem1: "pyrite", elem2: null, chance: 0.25 }
207
+ elements.molten_iron.reactions.sulfur_gas = { elem1: "pyrite", elem2: null, chance: 0.25 }
208
+
209
+ elements.cubesstuff_pyrite = {
210
+ color: ["#d8c25e", "#bbaa49", "#998f3e"],
211
+ alias: ["fools_gold", "Iron Disulfide"],
212
+ density: 5000,
213
+ tempHigh: 1177,
214
+ stateHigh: ["iron", "molten_sulfur"],
215
+ grain: 0.4,
216
+ state: "solid",
217
+ behavior: behaviors.WALL,
218
+ category: "deprecated"
219
+ }
220
+
221
+ elements.fire_extinguisher_powder = {
222
+ color: "#ececec",
223
+ behavior: [
224
+ "XX|XX|XX",
225
+ "XX|DL%1|XX",
226
+ "M2%30|M1%30|M2%30"
227
+ ],
228
+ extinguish: true,
229
+ tick: function (pixel) {
230
+ for (var i = 0; i < adjacentCoords.length; i++) {
231
+ var coords = adjacentCoords[i];
232
+ var x = pixel.x + coords[0];
233
+ var y = pixel.y + coords[1];
234
+ if (getPixel(x, y)?.burning === true) {
235
+ let elem = getPixel(x, y)
236
+ elem.burning = false
237
+ }
238
+ }
239
+ },
240
+ tool: function (pixel) {
241
+ if (pixel.burning === true) {
242
+ delete pixel.burning;
243
+ delete pixel.burnStart;
244
+ }
245
+ },
246
+ canPlace: true,
247
+ category: "powders",
248
+ state: "solid"
249
+ }
250
+
251
+ elements.pie_crust = {
252
+ color: "#f1f192",
253
+ breakInto: "crumb",
254
+ tempHigh: 500,
255
+ stateHigh: "ash",
256
+ burn: 5,
257
+ burnTime: 400,
258
+ burnInto: ["smoke", "smoke", "smoke", "ash"],
259
+ category: "food",
260
+ state: "solid",
261
+ behavior: behaviors.STURDYPOWDER,
262
+ isFood: true,
263
+ hidden: true,
264
+ density: 230,
265
+ reactions: {
266
+ "pumpkin": { elem1: "pie", elem2: null, tempMin: 200 },
267
+ "cooked_meat": { elem1: "pie", elem2: null, tempMin: 200 },
268
+ "meat": { elem1: "pie", elem2: null, tempMin: 200 },
269
+ "potato": { elem1: "pie", elem2: null, tempMin: 200 },
270
+ "mashed_potato": { elem1: "pie", elem2: null, tempMin: 200 },
271
+ "baked_potato": { elem1: "pie", elem2: null, tempMin: 200 },
272
+ "grape": { elem1: "pie", elem2: null, tempMin: 200, func: function (pixel) { pixel.originColor = "#8200fc" } },
273
+ "pineapple": { elem1: "pie", elem2: null, tempMin: 200, func: function (pixel) { pixel.originColor = "#ffd900" } }
274
+ }
275
+ }
276
+
277
+ elements.pie = {
278
+ color: "#fac145",
279
+ darkText: false,
280
+ behavior: behaviors.STURDYPOWDER,
281
+ category: "food",
282
+ isFood: true,
283
+ density: 240,
284
+ burn: 5,
285
+ burnTime: 400,
286
+ burnInto: ["smoke", "smoke", "smoke", "ash"],
287
+ state: "solid",
288
+ tempHigh: 500,
289
+ stateHigh: "ash",
290
+ breakInto: "sauce",
291
+ breakIntoColor: ["#ff822e", "#ff8c2e"],
292
+ tick: function (pixel) {
293
+ if (pixel.originColor) {
294
+ pixel.breakIntoColor = pixel.originColor
295
+ }
296
+ }
297
+ }
298
+
299
+ elements.gasoline = {
300
+ color: ["#ffff66", "#ffff55", "#ffff44"],
301
+ behavior: behaviors.LIQUID,
302
+ burn: 80,
303
+ burnTime: 100,
304
+ burnInto: ["fire", "fire", "fire", "explosion"],
305
+ viscosity: 0.7,
306
+ density: 750,
307
+ category: "liquids",
308
+ state: "liquid",
309
+ conduct: 0.02,
310
+ behaviorOn: [
311
+ "XX|XX|XX",
312
+ "XX|EX:10|XX",
313
+ "XX|XX|XX"
314
+ ]
315
+ }
316
+
317
+ // Make molten sulfur stinky
318
+ elements.molten_sulfur.tick = function (pixel) {
319
+ for (var i = 0; i < adjacentCoords.length; i++) {
320
+ var coords = adjacentCoords[i];
321
+ var x = pixel.x + coords[0];
322
+ var y = pixel.y + coords[1];
323
+ if (isEmpty(x, y) && Math.random() <= 0.0005) {
324
+ createPixel("stench", x, y)
325
+ let p = getPixel(x, y)
326
+ if (p !== null && p.element == "stench") {
327
+ p.temp = pixel.temp
328
+ }
329
+ }
330
+ }
331
+ }
332
+
333
+ elements.disco_floor = {
334
+ color: rainbowColor,
335
+ breakInto: "glass_shard",
336
+ category: "machines",
337
+ forceSaveColor: true,
338
+ conduct: 1,
339
+ behavior: behaviors.WALL,
340
+ state: "solid",
341
+ tick: function (pixel) {
342
+ pixel.changeCd ??= 20;
343
+ pixel.changeCd--;
344
+
345
+ if (pixel.changeCd <= 0) {
346
+ let colors = elements.disco_floor.color;
347
+ pixel.color = colors[Math.floor(Math.random() * colors.length)];
348
+ pixel.changeCd = 20;
349
+ }
350
+ }
351
+ };
352
+
353
+ elements.moss = {
354
+ color: ["#007900", "#006000", "#008300"],
355
+ behavior: behaviors.POWDER,
356
+ tick: function (pixel) {
357
+ for (var i = 0; i < squareCoords.length; i++) {
358
+ var coords = squareCoords[i];
359
+ var x = pixel.x + coords[0];
360
+ var y = pixel.y + coords[1];
361
+ if (isEmpty(x, y) && Math.random() <= 0.01 && getPixel(pixel.x, pixel.y + 1) && getPixel(pixel.x, pixel.y + 1).element !== "moss") {
362
+ createPixel('moss', x, y)
363
+ }
364
+ }
365
+ },
366
+ tempHigh: 70,
367
+ stateHigh: "dead_plant",
368
+ extraTempHigh: {
369
+ "100": ["dead_plant", "dead_plant", "steam"]
370
+ },
371
+ tempLow: -10,
372
+ stateLow: "frozen_plant",
373
+ burn: 50,
374
+ burnTime: 30,
375
+ reactions: {
376
+ "carbon_dioxide": { elem2: "oxygen", chance: 0.1 },
377
+ "rock": { elem2: "dirt", chance: 0.0025 },
378
+ "rock_wall": { elem2: "dirt", chance: 0.0025 },
379
+ "gravel": { elem2: "dirt", chance: 0.0025 },
380
+ },
381
+ category: "life",
382
+ state: "solid"
383
+ }
384
+
385
+ elements.magma.extraTempLow = { "700": "obsidian" }
386
+
387
+ elements.obsidian = {
388
+ color: ["#1f1f1f", "#1f1f1f", "#1f1f1f", "#1f1f1f", "#292929"],
389
+ buttonColor: ["#1a1a1a", "#2b2b2b", "#3b3b3b"],
390
+ colorPattern: textures.GLASS,
391
+ colorKey: {
392
+ "g": "#1f1f1f",
393
+ "s": "#292929",
394
+ "S": "#252525"
395
+ },
396
+ grain: 0,
397
+ behavior: behaviors.WALL,
398
+ category: "solids",
399
+ tempHigh: 1200,
400
+ stateHigh: "magma",
401
+ state: "solid",
402
+ density: 2500,
403
+ breakInto: "obsidian_shard"
404
+ }
405
+
406
+ elements.obsidian_shard = {
407
+ color: ["#1f1f1f", "#1f1f1f", "#1f1f1f", "#1f1f1f", "#292929"],
408
+ behavior: behaviors.POWDER,
409
+ grain: 0,
410
+ category: "powders",
411
+ tempHigh: 1200,
412
+ stateHigh: "magma",
413
+ state: "solid",
414
+ density: 2500,
415
+ reactions: {
416
+ "glue": { elem1: "obsidian", elem2: null }
417
+ }
418
+ }
419
+
420
+ elements.cardboard = {
421
+ color: ["#9E6B34"],
422
+ burn: 70,
423
+ burnTime: 300,
424
+ burnInto: ["fire", "fire", "fire", "fire", "fire", "ash"],
425
+ behavior: behaviors.WALL,
426
+ reactions: {
427
+ "water": { elem1: "cellulose", elem2: null },
428
+ "dirty_water": { elem1: "cellulose", elem2: null },
429
+ "salt_water": { elem1: "cellulose", elem2: null },
430
+ "sugar_water": { elem1: "cellulose", elem2: null },
431
+ "seltzer": { elem1: "cellulose", elem2: null },
432
+ "soda": { elem1: "cellulose", elem2: null },
433
+ "blood": { elem1: "cellulose", elem2: null },
434
+ "foam": { elem1: "cellulose", elem2: null },
435
+ "bubble": { elem1: "cellulose", elem2: null },
436
+ "oil": { elem1: "cellulose", elem2: null },
437
+ "alcohol": { elem1: "cellulose", elem2: null },
438
+ "vinegar": { elem1: "cellulose", elem2: null }
439
+ },
440
+ category: "solids",
441
+ tempHigh: 248,
442
+ stateHigh: ["fire", "fire", "fire", "fire", "fire", "ash"],
443
+ state: "solid",
444
+ density: 1200
445
+ }
446
+
447
+ elements.paper.pressInto = "cardboard"
448
+
449
+ function pressPixel(pixel) {
450
+ if (elements[pixel.element].pressInto === undefined) { return; }
451
+ // if it is an array, choose a random item, else just use the value
452
+ let result;
453
+ if (elements[pixel.element].pressInto !== undefined) {
454
+ if (Array.isArray(elements[pixel.element].pressInto)) {
455
+ result = elements[pixel.element].pressInto[Math.floor(Math.random() * elements[pixel.element].pressInto.length)];
456
+ }
457
+ else {
458
+ result = elements[pixel.element].pressInto;
459
+ }
460
+ }
461
+ // change the pixel to the result
462
+ if (result === null) {
463
+ deletePixel(pixel.x, pixel.y);
464
+ return;
465
+ }
466
+
467
+ else if (result !== undefined) {
468
+ changePixel(pixel, result);
469
+ }
470
+ }
471
+
472
+ elements.press = {
473
+ color: ["#999999", "#c0c0c0", "#999999"],
474
+ category: "tools",
475
+ tool: function (pixel) {
476
+ // edited smash code
477
+ if (isPressable(pixel)) {
478
+ let old = pixel.element
479
+ if (Math.random() < (1 - (elements[pixel.element].resistPress || 0)) / (shiftDown ? 1 : 4)) {
480
+ pressPixel(pixel)
481
+ }
482
+
483
+ else if (old === pixel.element && elements[pixel.element].movable && !isEmpty(pixel.x, pixel.y + 1) && !paused) {
484
+ let x = 0; let y = 0;
485
+ if (Math.random() < 0.66) x = Math.random() < 0.5 ? 1 : -1;
486
+ if (Math.random() < 0.66) y = Math.random() < 0.5 ? 1 : -1;
487
+ tryMove(pixel, pixel.x + x, pixel.y + y)
488
+ }
489
+ }
490
+ if (elements[pixel.element].onPress !== undefined) {
491
+ elements[pixel.element].onPress(pixel)
492
+ }
493
+ }
494
+ }
495
+
496
+ elements.malware.reactions.wire = { elem2: [null, "faulty_wire"], chance: 0.01 };
497
+
498
+ elements.faulty_wire = {
499
+ color: ["#4d0a03", "#4d0a03", "#4d0a03", "#4d0a03", "#4d0a03", "#4d0a03", "#4d0a03", "#4d0a03", "#4d0a03", "#a95232",],
500
+ buttonColor: "#4d0a03",
501
+ behavior: behaviors.WALL,
502
+ behaviorOn: [
503
+ "XX|CR:electric,flash%1|XX",
504
+ "CR:electric,flash%1|XX|CR:electric,flash%1",
505
+ "XX|CR:electric,flash%1|XX"
506
+ ],
507
+ category: "machines",
508
+ insulate: true,
509
+ conduct: 0.7,
510
+ noMix: true,
511
+ state: "solid"
512
+ }
513
+
514
+ elements.lighter_fluid = {
515
+ color: "#f1e185",
516
+ behavior: [
517
+ "XX|XX|XX",
518
+ "M2 AND SW:lighter_fluid_gas|XX|M2 AND SW:lighter_fluid_gas",
519
+ "M1 AND SW:lighter_fluid_gas|M1 AND SW:lighter_fluid_gas|M1 AND SW:lighter_fluid_gas"
520
+ ],
521
+ category: "liquids",
522
+ state: "liquid",
523
+ density: 750,
524
+ tick: function (pixel) {
525
+ pixel.gasMade ??= 0
526
+ for (var i = 0; i < squareCoordsShuffle.length; i++) {
527
+ var coord = squareCoordsShuffle[i];
528
+ var x = pixel.x + coord[0];
529
+ var y = pixel.y + coord[1];
530
+ if (isEmpty(x, y) && Math.random() >= 0.75) {
531
+ createPixel("lighter_fluid_gas", x, y)
532
+ pixel.gasMade += 1
533
+ }
534
+ }
535
+
536
+ if (pixel.gasMade > 100 && Math.random() <= 0.01) {
537
+ deletePixel(pixel.x, pixel.y)
538
+ }
539
+ }
540
+ }
541
+
542
+ elements.lighter_fluid_gas = {
543
+ color: "#f1e185",
544
+ alpha: 0.1,
545
+ behavior: behaviors.GAS,
546
+ category: "gases",
547
+ state: "gas",
548
+ burn: 100,
549
+ isGas: true,
550
+ hidden: true,
551
+ density: 20,
552
+ tick: function (pixel) {
553
+ if (Math.random() <= 0.1) {
554
+ deletePixel(pixel.x, pixel.y)
555
+ }
556
+ }
557
+ }
558
+
559
+ elements.mold = {
560
+ color: "#054e05",
561
+ category: "life",
562
+ behavior: behaviors.POWDER,
563
+ state: "solid",
564
+ burn: 70,
565
+ burnTime: 100,
566
+ tempHigh: 200,
567
+ stateHigh: "fire",
568
+ tempLow: -10,
569
+ stateLow: "frozen_plant",
570
+ reactions: {
571
+ "meat": { elem1: "rotten_meat", elem2: "rotten_meat" },
572
+ "cheese": { elem1: "rotten_cheese", elem2: "rotten_cheese" }
573
+ },
574
+ tick: function (pixel) {
575
+ let moldable = ["meat", "cheese", "rotten_meat", "rotten_cheese"]
576
+ for (var i = 0; i < squareCoords.length; i++) {
577
+ var coords = squareCoords[i];
578
+ var x = pixel.x + coords[0];
579
+ var y = pixel.y + coords[1];
580
+ if (isEmpty(x, y) && Math.random() <= 0.01 && getPixel(pixel.x, pixel.y + 1) && moldable.includes(getPixel(pixel.x, pixel.y + 1).element)) {
581
+ createPixel('mold', x, y)
582
+ }
583
+ }
584
+ }
585
+ }
586
+
587
+ elements.glow_stick = {
588
+ color: ["#00ff00", "#ea00ff", "#00eeff"],
589
+ glow: true,
590
+ behavior: behaviors.POWDER,
591
+ breakInto: "glow_stick_liquid",
592
+ category: "powders",
593
+ tempHigh: 300,
594
+ stateHigh: ["molten_plastic", "stench"],
595
+ state: "solid"
596
+ }
597
+
598
+ elements.glow_stick_liquid = {
599
+ color: ["#00ff00", "#ea00ff", "#00eeff"],
600
+ glow: true,
601
+ behavior: behaviors.LIQUID,
602
+ category: "liquids",
603
+ hidden: true,
604
+ tempHigh: 300,
605
+ stateHigh: "stench",
606
+ tempLow: -5,
607
+ stateLow: "glow_stick_ice",
608
+ state: "solid"
609
+ }
610
+
611
+ elements.glow_stick_ice = {
612
+ color: ["#00ff00", "#ea00ff", "#00eeff"],
613
+ behavior: behaviors.WALL,
614
+ category: "states",
615
+ hidden: true,
616
+ temp: -5,
617
+ tempHigh: -5,
618
+ stateHigh: "glow_stick_liquid",
619
+ state: "solid"
620
+ }
621
+
622
+ // Add TPS keybind
623
+ keybinds["KeyT"] = function () {
624
+ tpsPrompt()
625
+ }
626
+
627
+ function addRowWhenReady() {
628
+ const table = document.getElementById("controlsTable");
629
+
630
+ if (!table) {
631
+ // Table not ready yet, try again in 100ms
632
+ setTimeout(addRowWhenReady, 100);
633
+ return;
634
+ }
635
+
636
+ // Table exists, add the row
637
+ const rowCount = table.rows.length;
638
+ const newRow = table.insertRow(rowCount - 1);
639
+
640
+ const cell1 = newRow.insertCell(0);
641
+ const cell2 = newRow.insertCell(1);
642
+
643
+ cell1.textContent = "Change TPS";
644
+ cell2.innerHTML = "<kbd>T</kbd>";
645
+
646
+ console.log("Row added successfully!");
647
+ }
648
+
649
+ // Start the process
650
+ addRowWhenReady();
651
+
652
+
653
+ elements.randomizer = {
654
+ buttonColor: rainbowColor,
655
+ excludeRandom: true,
656
+ onSelect: function () {
657
+ logMessage("Warning: It can fill up the screen with random elements")
658
+ },
659
+ tick: function (pixel) {
660
+ pixel.color = randomColor()
661
+ for (var i = 0; i < adjacentCoords.length; i++) {
662
+ var coords = adjacentCoords[i];
663
+ var x = pixel.x + coords[0];
664
+ var y = pixel.y + coords[1];
665
+ let p = getPixel(x, y)
666
+ if (!isEmpty(x, y) && !outOfBounds(x, y)) {
667
+ if (p && p.element !== "randomizer") {
668
+ changePixel(p, "random")
669
+ }
670
+ }
671
+ }
672
+ },
673
+ behavior: behaviors.WALL,
674
+ insulate: true,
675
+ hardness: 1,
676
+ category: "special",
677
+ state: "solid"
678
+ }
679
+
680
+ elements.cloner.ignore.push("randomizer")
681
+ elements.ecloner.ignore.push("randomizer")
682
+ elements.floating_cloner.ignore.push("randomizer")
683
+ elements.slow_cloner.ignore.push("randomizer")
684
+ elements.rocket.ignore.push("randomizer")
685
+
686
+ elements.antibomb.tick = function (pixel) {
687
+ doDefaults(pixel)
688
+ if (!tryMove(pixel, pixel.x, pixel.y + 1)) {
689
+ if (!outOfBounds(pixel.x, pixel.y + 1)) {
690
+ var elem = pixelMap[pixel.x][pixel.y + 1].element;
691
+ if (elements[elem].isGas) { return }
692
+ }
693
+ else {
694
+ var elem = "smoke";
695
+ }
696
+ if (elem !== "antibomb" && elem !== "randomizer") {
697
+ explodeAt(pixel.x, pixel.y, 8, elem)
698
+ }
699
+ }
700
+ }
701
+
702
+ function drawCircle(x0, y0, radius, element) {
703
+ for (let y = -radius; y <= radius; y++) {
704
+ for (let x = -radius; x <= radius; x++) {
705
+ if (x * x + y * y <= radius * radius) {
706
+ let px = x0 + x;
707
+ let py = y0 + y;
708
+ if (isEmpty(px, py)) {
709
+ createPixel(element, px, py);
710
+ }
711
+ }
712
+ }
713
+ }
714
+ }
715
+
716
+ elements.circle = {
717
+ color: "#ffffff",
718
+ behavior: behaviors.WALL,
719
+ category: "special",
720
+ state: "solid",
721
+ onSelect: function () {
722
+ promptInput(
723
+ "Select the radius you want your circle to be:",
724
+ function (input1) {
725
+ let ans1 = Number(input1)
726
+ if (Number.isInteger(ans1) && ans1 > 0) {
727
+ globals.circleRad = ans1
728
+ } else {
729
+ globals.circleRad = 7
730
+ logMessage("Invalid radius, using default size: " + globals.circleRad);
731
+ }
732
+ promptInput(
733
+ "Select the element you want your circle to be:",
734
+ function (ans2) {
735
+ let similar = mostSimilarElement(ans2);
736
+ if (similar && elements[similar]) {
737
+ globals.circleElem = similar;
738
+ } else {
739
+ globals.circleElem = "wood"
740
+ logMessage("Invalid element, using default element: " + globals.circleElem);
741
+ }
742
+ },
743
+ "Element prompt",
744
+ "wood"
745
+ );
746
+ },
747
+ "Radius prompt",
748
+ "7"
749
+ );
750
+ },
751
+ onPlace: function (pixel) {
752
+ drawCircle(pixel.x, pixel.y, globals.circleRad, globals.circleElem);
753
+ changePixel(pixel, globals.circleElem);
754
+ pixel.temp = (elements[globals.circleElem].temp || 20)
755
+ },
756
+ maxSize: 1,
757
+ excludeRandom: true
758
+ };
759
+
760
+ runAfterReset(function () {
761
+ if (globals.rCircle) {
762
+ globals.circleRad = 7;
763
+ globals.circleElem = "wood";
764
+ }
765
+ })
766
+
767
+ /**
768
+ * gets a random int in a range
769
+ * @param {number} min
770
+ * @param {number} max
771
+ * @returns {number}
772
+ */
773
+ function randomIntInRange(min, max) {
774
+ return Math.floor(Math.random() * (max - min + 1)) + min;
775
+ }
776
+
777
+
778
+
779
+ elements.rgb_led = {
780
+ buttonColor: rainbowColor,
781
+ behavior: behaviors.WALL,
782
+ desc: "Input the red, green, and blue value (not exceeding 255) and get the color.",
783
+ renderer: renderPresets.LED,
784
+ conduct: 1,
785
+ state: "solid",
786
+ breakInto: "glass_shard",
787
+ forceSaveColor: true,
788
+ reactions: {
789
+ "light": { charge1: 1, elem2: null },
790
+ "liquid_light": { charge1: 1, elem2: null }
791
+ },
792
+ category: "deprecated",
793
+ tempHigh: 1500,
794
+ stateHigh: ["molten_glass", "molten_glass", "molten_glass", "molten_gallium"],
795
+
796
+ onSelect: () => {
797
+ promptInput("Enter red value (0-255):", function (r_inp) {
798
+ r_inp = parseInt(r_inp);
799
+ if (r_inp > 255 || r_inp < 0 || isNaN(r_inp)) {
800
+ logMessage("Red value is invalid, using default/last red value: " + globals.red);
801
+ } else {
802
+ globals.red = r_inp;
803
+ }
804
+
805
+ promptInput("Enter green value (0-255):", function (g_inp) {
806
+ g_inp = parseInt(g_inp);
807
+ if (g_inp > 255 || g_inp < 0 || isNaN(g_inp)) {
808
+ logMessage("Green value is invalid, using default/last green value: " + globals.green);
809
+ } else {
810
+ globals.green = g_inp;
811
+ }
812
+
813
+ promptInput("Enter blue value (0-255):", function (b_inp) {
814
+ b_inp = parseInt(b_inp);
815
+ if (b_inp > 255 || b_inp < 0 || isNaN(b_inp)) {
816
+ logMessage("Blue value is invalid, using default/last blue value: " + globals.blue);
817
+ } else {
818
+ globals.blue = b_inp;
819
+ }
820
+ }, "Blue Value", globals.blue); // optional default input
821
+ }, "Green Value", globals.green);
822
+ }, "Red Value", globals.red);
823
+ },
824
+
825
+ onPlace: (pixel) => {
826
+ var ledColor = RGBToHex([globals.red, globals.green, globals.blue]);
827
+ pixel.color = ledColor;
828
+ }
829
+ };
830
+
831
+
832
+ runAfterReset(() => {
833
+ if (globals.rRGBLed) {
834
+ globals.red = 100;
835
+ globals.greed = 100;
836
+ globals.blue = 100;
837
+ }
838
+ })
839
+
840
+ if (!elements.malware.reactions) { elements.malware.reactions = {} }
841
+ elements.malware.reactions.rgb_led = { elem2: ["led_r", "led_g", "led_b"], chance: 0.01 }
842
+ elements.malware.reactions.led_r = { elem2: ["rgb_led", "led_g", "led_b"], chance: 0.01 }
843
+ elements.malware.reactions.led_g = { elem2: ["rgb_led", "led_r", "led_b"], chance: 0.01 }
844
+ elements.malware.reactions.led_b = { elem2: ["rgb_led", "led_g", "led_r"], chance: 0.01 }
845
+
846
+ elements.dice = {
847
+ color: "#d5d5d5",
848
+ state: "solid",
849
+ onClicked(pixel) {
850
+ pixel.clicked = true;
851
+ },
852
+
853
+ tick(pixel) {
854
+ if (pixel.rolled === undefined) {
855
+ pixel.rolled = false;
856
+ }
857
+
858
+ if (pixel.clicked && !pixel.rolled) {
859
+ const roll = randomIntInRange(1, 6);
860
+ clearLog()
861
+ logMessage("Dice roll: " + roll);
862
+ pixel.rolled = true;
863
+ }
864
+
865
+ if (!pixel.clicked) {
866
+ pixel.rolled = false;
867
+ }
868
+
869
+ pixel.clicked = false;
870
+ },
871
+ behavior: behaviors.WALL,
872
+ density: 500,
873
+ category: "special",
874
+ onSelect: () => {
875
+ logMessage("Click The Dice to Roll")
876
+ logMessage("It is reccomended to roll only one dice at a time as it will only show one value")
877
+ }
878
+ }
879
+
880
+ elements.wood.pressInto = "plank";
881
+ elements.wood.resistPress = 0.5;
882
+
883
+ elements.plank = {
884
+ color: "#98633B",
885
+ behavior: behaviors.WALL,
886
+ renderer: renderPresets.WOODCHAR,
887
+ tempHigh: 400,
888
+ stateHigh: ["ember", "charcoal", "fire", "fire", "fire"],
889
+ category: "solids",
890
+ burn: 5,
891
+ burnTime: 300,
892
+ burnInto: ["ember", "charcoal", "fire"],
893
+ state: "solid",
894
+ hardness: 0.50,
895
+ breakInto: "sawdust",
896
+ forceSaveColor: true
897
+ }
898
+
899
+ elements.sand.pressInto = "packed_sand";
900
+ elements.sand.resistPress = 0.2
901
+ elements.snow.pressInto = "packed_snow";
902
+ elements.snow.resistPress = 0.2
903
+
904
+ elements.asbestos = {
905
+ color: "#f1f5f1",
906
+ behavior: [
907
+ "SP|XX|SP",
908
+ "XX|XX|XX",
909
+ "SA AND M2|M1|SP AND M2"
910
+ ],
911
+ category: "powders",
912
+ state: "solid",
913
+ tempHigh: 800,
914
+ stateHigh: ["dust", "ash", "fire"],
915
+ breakInto: ["gravel", "sand", "dust"],
916
+ reactions: {
917
+ "body": { elem2: "cancer", chance: 0.5 },
918
+ "head": { elem2: "cancer", chance: 0.5 }
919
+ },
920
+ nocheer: true
921
+ }
922
+
923
+ elements.lithium_battery = {
924
+ color: "#616161",
925
+ behavior: [
926
+ "XX|SH|XX",
927
+ "SH|XX|SH",
928
+ "XX|SH|XX"
929
+ ],
930
+ tempHigh: 1400,
931
+ stateHigh: ["explosion", "lithium", "acid_gas"],
932
+ hardness: 0.8,
933
+ breakInto: ["lithium", "acid"],
934
+ category: "machines",
935
+ alias: "lithium-ion battery",
936
+ state: "solid"
937
+ }
938
+
939
+ elements.lithium = {
940
+ color: "#acacac",
941
+ behavior: behaviors.POWDER,
942
+ reactions: {
943
+ "water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
944
+ "salt_water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
945
+ "pool_water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
946
+ "sugar_water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
947
+ "seltzer": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
948
+ "dirty_water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
949
+ "primordial_soup": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
950
+ "nut_milk": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 }
951
+ },
952
+ density: 533.4,
953
+ tempHigh: 180.5,
954
+ conduct: 0.45,
955
+ category: "powders",
956
+ state: "solid"
957
+ }
958
+
959
+ elements.molten_lithium = {
960
+ tempHigh: 1344,
961
+ stateHigh: 'lithium_gas',
962
+ reactions: {
963
+ "water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
964
+ "salt_water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
965
+ "pool_water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
966
+ "sugar_water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
967
+ "seltzer": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
968
+ "dirty_water": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
969
+ "primordial_soup": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 },
970
+ "nut_milk": { elem1: ["pop", "pop", "pop", "hydrogen"], chance: 0.01, temp2: 200 }
971
+ },
972
+ state: "liquid"
973
+ }
974
+
975
+ elements.lithium_gas = {
976
+ color: "#cccccc",
977
+ behavior: behaviors.GAS,
978
+ isGas: true,
979
+ tempLow: 1334,
980
+ stateLow: "molten_lithium",
981
+ density: 533.4,
982
+ conduct: 0.45,
983
+ temp: 1334,
984
+ category: "states",
985
+ hidden: true,
986
+ state: "gas"
987
+ }
988
+
989
+ elements.chalk = {
990
+ color: "#fff3ac",
991
+ behavior: behaviors.WALL,
992
+ stain: 0.25,
993
+ category: "land",
994
+ breakInto: "chalk_powder",
995
+ tempHigh: 1000,
996
+ density: 2700,
997
+ reactions: {
998
+ "water": { elem1: "wet_chalk", elem2: null, chance: 0.5 },
999
+ "salt_water": { elem1: "wet_chalk", elem2: null, chance: 0.5 },
1000
+ "seltzer": { elem1: "wet_chalk", elem2: null, chance: 0.5 },
1001
+ "dirty_water": { elem1: "wet_chalk", elem2: null, chance: 0.5 },
1002
+ "sugar_water": { elem1: "wet_chalk", elem2: null, chance: 0.5 },
1003
+ "pool_water": { elem1: "wet_chalk", elem2: null, chance: 0.5 },
1004
+ "primordial_soup": { elem1: "wet_chalk", elem2: null, chance: 0.5 },
1005
+ "nut_milk": { elem1: "wet_chalk", elem2: null, chance: 0.5 }
1006
+ },
1007
+ alias: "calcite",
1008
+ state: "solid"
1009
+ }
1010
+
1011
+ elements.chalk_powder = {
1012
+ color: "#fff3ac",
1013
+ behavior: behaviors.POWDER,
1014
+ stain: 0.25,
1015
+ category: "powders",
1016
+ tempHigh: 1000,
1017
+ stateHigh: "molten_chalk",
1018
+ density: 2700,
1019
+ reactions: {
1020
+ "water": { elem1: "wet_chalk_powder", elem2: null, chance: 0.5 },
1021
+ "salt_water": { elem1: "wet_chalk_powder", elem2: null, chance: 0.5 },
1022
+ "seltzer": { elem1: "wet_chalk_powder", elem2: null, chance: 0.5 },
1023
+ "dirty_water": { elem1: "wet_chalk_powder", elem2: null, chance: 0.5 },
1024
+ "sugar_water": { elem1: "wet_chalk_powder", elem2: null, chance: 0.5 },
1025
+ "pool_water": { elem1: "wet_chalk_powder", elem2: null, chance: 0.5 },
1026
+ "primordial_soup": { elem1: "wet_chalk_powder", elem2: null, chance: 0.5 },
1027
+ "nut_milk": { elem1: "wet_chalk_powder", elem2: null, chance: 0.5 },
1028
+ "glue": { elem1: "chalk", elem2: null }
1029
+ },
1030
+ state: "solid"
1031
+ }
1032
+
1033
+ elements.wet_chalk = {
1034
+ color: "#bbb17b",
1035
+ behavior: behaviors.WALL,
1036
+ stain: 0.25,
1037
+ category: "land",
1038
+ breakInto: "wet_chalk_powder",
1039
+ tempHigh: 100,
1040
+ stateHigh: "chalk",
1041
+ density: 2300,
1042
+ onStateHigh: (pixel) => {
1043
+ releaseElement(pixel, "steam")
1044
+ },
1045
+ state: "solid"
1046
+ }
1047
+
1048
+ elements.wet_chalk_powder = {
1049
+ color: "#bbb17b",
1050
+ behavior: behaviors.POWDER,
1051
+ stain: 0.25,
1052
+ category: "powders",
1053
+ tempHigh: 100,
1054
+ stateHigh: "chalk_powder",
1055
+ density: 2000,
1056
+ onStateHigh: (pixel) => {
1057
+ releaseElement(pixel, "steam")
1058
+ },
1059
+ state: "solid",
1060
+ reactions: {
1061
+ "glue": { elem1: "chalk", elem2: null }
1062
+ }
1063
+ }
1064
+
1065
+ elements.lapis_lazuli = {
1066
+ color: ["#0000df", "#1212cc", "#120A8F", "#060080"],
1067
+ behavior: behaviors.WALL,
1068
+ breakInto: "lapis_lazuli_powder",
1069
+ tempHigh: 1100,
1070
+ stateHigh: 'magma',
1071
+ state: "solid",
1072
+ category: "solids"
1073
+ }
1074
+
1075
+ elements.lapis_lazuli_powder = {
1076
+ color: "#120A8F",
1077
+ behavior: behaviors.POWDER,
1078
+ tempHigh: 1100,
1079
+ stateHigh: "magma",
1080
+ alias: "Ultramarine",
1081
+ category: "powders",
1082
+ state: "solid"
1083
+ }
1084
+
1085
+ elements.uv_light = {
1086
+ color: "#440088",
1087
+ behavior: [
1088
+ "XX|XX|XX",
1089
+ "XX|DL%1|XX",
1090
+ "XX|XX|XX"
1091
+ ],
1092
+ glow: true,
1093
+ tick: behaviors.BOUNCY,
1094
+ temp: 35,
1095
+ tempLow: -273,
1096
+ stateLow: ["liquid_light", null],
1097
+ stateLowColorMultiplier: 0.8,
1098
+ breakInto: "light",
1099
+ breakIntoColor: "#ffcfcf",
1100
+ category: "energy",
1101
+ state: "gas",
1102
+ density: 0.00001,
1103
+ ignoreAir: true,
1104
+ reactions: {
1105
+ "ozone": { elem1: null, chance: 0.9 },
1106
+ }
1107
+ };
1108
+
1109
+ if (!settings.cheerful) {
1110
+ elements.uv_light.reactions.cell = { elem2: "cancer", chance: 0.05 },
1111
+ elements.uv_light.reactions.skin = { elem2: "cancer", chance: 0.005 }
1112
+ }
1113
+ else {
1114
+ if (elements.uv_light.reactions.cell) {
1115
+ delete elements.uv_light.reactions.cell
1116
+ }
1117
+ if (elements.uv_light.reactions.skin) {
1118
+ delete elements.uv_light.reactions.skin
1119
+ }
1120
+ }
1121
+
1122
+ function fadeColor(base, glow, ratio) {
1123
+ // ratio 1 = full glow, 0 = base color
1124
+ let r1 = parseInt(glow.substr(1, 2), 16);
1125
+ let g1 = parseInt(glow.substr(3, 2), 16);
1126
+ let b1 = parseInt(glow.substr(5, 2), 16);
1127
+ let r2 = parseInt(base.substr(1, 2), 16);
1128
+ let g2 = parseInt(base.substr(3, 2), 16);
1129
+ let b2 = parseInt(base.substr(5, 2), 16);
1130
+ let r = Math.round(r1 * ratio + r2 * (1 - ratio));
1131
+ let g = Math.round(g1 * ratio + g2 * (1 - ratio));
1132
+ let b = Math.round(b1 * ratio + b2 * (1 - ratio));
1133
+ return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
1134
+ }
1135
+
1136
+
1137
+ elements.phosphor = {
1138
+ color: "#fffbe7",
1139
+ behavior: behaviors.POWDER,
1140
+ tick: function (pixel) {
1141
+ let nearUV = false;
1142
+ for (let i = 0; i < adjacentCoords.length; i++) {
1143
+ let x = pixel.x + adjacentCoords[i][0];
1144
+ let y = pixel.y + adjacentCoords[i][1];
1145
+ let p = getPixel(x, y);
1146
+ if (p && p.element == "uv_light") {
1147
+ nearUV = true;
1148
+ break;
1149
+ }
1150
+ }
1151
+
1152
+ if (nearUV) {
1153
+ pixel.colorStay = 60; // longer for realism
1154
+ }
1155
+
1156
+ if (pixel.colorStay > 0) {
1157
+ let ratio = pixel.colorStay / 60; // exponential fade would be even better
1158
+ pixel.color = fadeColor("#fffbe7", "#00c500", ratio);
1159
+ pixel.colorStay--;
1160
+ } else {
1161
+ pixel.color = "#fffbe7"
1162
+ }
1163
+ if (enabledMods.includes("mods/glow.js")) {
1164
+ if (pixel.color !== "#fffbe7") {
1165
+ pixel.emit = pixel.colorStay / 10
1166
+ }
1167
+ }
1168
+ },
1169
+ category: "powders",
1170
+ state: "solid",
1171
+ };
1172
+
1173
+ elements.packed_sand.pressInto = "sandstone"
1174
+ elements.packed_sand.resistPress = 0.7
1175
+ elements.packed_snow.pressInto = "ice"
1176
+ elements.packed_snow.resistPress = 0.7
1177
+
1178
+ elements.sandstone = {
1179
+ color: "#d3bc56",
1180
+ behavior: behaviors.WALL,
1181
+ breakInto: "sand",
1182
+ hardness: 0.5,
1183
+ state: "solid",
1184
+ stateHigh: "glass",
1185
+ tempHigh: 1700,
1186
+ category: "land"
1187
+ }
1188
+
1189
+ // Glow.js integrtion
1190
+ if (enabledMods.includes("mods/glow.js")) {
1191
+ elements.uv_light.emit = true
1192
+ elements.glow_stick.emit = true
1193
+ delete elements.glow_stick.glow
1194
+ elements.glow_stick_liquid.emit = true
1195
+ delete elements.glow_stick_liquid.glow
1196
+ }
1197
+
1198
+
1199
+ let neonTubeChoice = "#00ff00"; // default color
1200
+
1201
+ elements.neon_tube = {
1202
+ color: "#d1d1b5",
1203
+ renderer: renderPresets.BORDER,
1204
+ alpha: 0.25,
1205
+ conduct: 1,
1206
+ behavior: behaviors.WALL,
1207
+ breakInto: ["neon", "glass_shard"],
1208
+ grain: 0,
1209
+ category: "machines",
1210
+ state: "solid",
1211
+ tick: (pixel) => {
1212
+ pixel.def_color ??= pixel.color;
1213
+ pixel.glow_color ??= neonTubeChoice;
1214
+
1215
+ if (pixel.charge) {
1216
+ pixel.alpha = 1;
1217
+ pixel.color = pixel.glow_color;
1218
+ } else {
1219
+ pixel.alpha = 0.25;
1220
+ pixel.color = pixel.def_color;
1221
+ }
1222
+
1223
+ if (enabledMods.includes("mods/glow.js")) {
1224
+ if (pixel.charge) {
1225
+ pixel.emit = true;
1226
+ pixel.emitColor = pixel.glow_color;
1227
+ } else {
1228
+ delete pixel.emit;
1229
+ delete pixel.emitColor;
1230
+ }
1231
+ }
1232
+ },
1233
+ // Broken since yellow stacks above color
1234
+ // only green is good
1235
+ /*
1236
+ onSelect() {
1237
+ promptChoose(
1238
+ "Pick a color for your neon tube:",
1239
+ ["Red", "Green", "Blue", "Pink"],
1240
+ function(choice) {
1241
+ let colors = {
1242
+ "Red": "#ff0000",
1243
+ "Green": "#00ff00",
1244
+ "Blue": "#0000ff",
1245
+ "Pink": "#ff66cc"
1246
+ };
1247
+ neonTubeChoice = colors[choice] || "#00ff00";
1248
+ logMessage("Neon tube color set to " + choice);
1249
+ },
1250
+ "Neon Tube Setup"
1251
+ );
1252
+ }
1253
+ */
1254
+ };
1255
+
1256
+ elements.realistic_ball = {
1257
+ color: "#e35693",
1258
+ tempHigh: 250,
1259
+ stateHigh: "molten_plastic",
1260
+ category: "special",
1261
+ state: "solid",
1262
+ density: 1052,
1263
+ hidden: true,
1264
+ tick: function (pixel) {
1265
+ // initialize velocity
1266
+ if (pixel.vy === undefined) {
1267
+ pixel.vy = 0;
1268
+ }
1269
+
1270
+ // gravity
1271
+ pixel.vy += 0.3;
1272
+
1273
+ // predict next position
1274
+ let nextY = pixel.y + Math.sign(pixel.vy);
1275
+
1276
+ if (isEmpty(pixel.x, nextY)) {
1277
+ // free space → move
1278
+ tryMove(pixel, pixel.x, pixel.y + Math.sign(pixel.vy));
1279
+ } else {
1280
+ // collision: reverse velocity (bounce)
1281
+ pixel.vy *= -0.7;
1282
+
1283
+ // stop very small bounces
1284
+ if (Math.abs(pixel.vy) < 0.5) {
1285
+ pixel.vy = 0;
1286
+ }
1287
+ }
1288
+ }
1289
+ }
1290
+
1291
+ elements.custom_bomb = {
1292
+ color: "#49443b",
1293
+ category: "weapons",
1294
+ state: "solid",
1295
+ density: 1300,
1296
+ excludeRandom: true,
1297
+ cooldown: defaultCooldown,
1298
+ behavior: behaviors.STURDYPOWDER,
1299
+ onSelect: function () {
1300
+ promptInput(
1301
+ "Input the element you want your bomb to explode into",
1302
+ function (input) {
1303
+ let pr1 = mostSimilarElement(input)
1304
+ if (pr1 && elements[pr1]) {
1305
+ if (pr1 === "custom_bomb") {
1306
+ promptConfirm("Are you sure you want custom bomb to create itself as it will spread", (a) => { if (!a) { globals.explodeElem = 'fire' } else globals.explodeElem = 'custom_bomb' }, "Warning")
1307
+ }
1308
+ else { globals.explodeElem = pr1 }
1309
+ }
1310
+ else {
1311
+ globals.explodeElem = 'fire'
1312
+ logMessage("Invalid element. Using default: fire")
1313
+ }
1314
+ },
1315
+ "Element prompt",
1316
+ "fire"
1317
+ )
1318
+ },
1319
+ tick: function (pixel) {
1320
+ let belowPixel = getPixel(pixel.x, pixel.y + 1);
1321
+
1322
+ // If pixel is at the bottom or resting on a solid
1323
+ if (outOfBounds(pixel.x, pixel.y + 1) || (belowPixel && belowPixel.element !== "custom_bomb" && !isEmpty(pixel.x, pixel.y + 1) && belowPixel.element !== "fire" && belowPixel.element !== "smoke")) {
1324
+ explodeAt(pixel.x, pixel.y, 10, globals.explodeElem);
1325
+ deletePixel(pixel.x, pixel.y);
1326
+ }
1327
+ }
1328
+ }
1329
+
1330
+ runAfterReset(() => {
1331
+ if (globals.rCustomBomb) {
1332
+ globals.explodeElem = 'fire'
1333
+ }
1334
+ })
1335
+
1336
+ elements.pineapple = {
1337
+ color: "#ffd900",
1338
+ isFood: true,
1339
+ behavior: behaviors.STURDYPOWDER,
1340
+ breakInto: ["juice", "juice", "juice", "juice", "juice", "pineapple_seed"],
1341
+ breakIntoColor: "#fffc00",
1342
+ category: "food",
1343
+ state: "solid",
1344
+ seed: "pineapple_seed"
1345
+ }
1346
+
1347
+ elements.pineapple_seed = {
1348
+ color: "#695531",
1349
+ behavior: behaviors.STURDYPOWDER,
1350
+ cooldown: defaultCooldown,
1351
+ category: "life",
1352
+ tempHigh: 400,
1353
+ stateHigh: "fire",
1354
+ tempLow: -2,
1355
+ stateLow: "frozen_plant",
1356
+ burn: 50,
1357
+ burnTime: 20,
1358
+ state: "solid",
1359
+ tick: function (pixel) {
1360
+ let belowPixel = getPixel(pixel.x, pixel.y + 1)
1361
+ if (
1362
+ !isEmpty(pixel.x, pixel.y + 1) &&
1363
+ belowPixel &&
1364
+ Math.random() <= 0.05
1365
+ ) {
1366
+ changePixel(pixel, "pineapple_stem")
1367
+ pixel.growthState = 1
1368
+ pixel.growDiagLeft = true
1369
+ pixel.growDiagRight = true
1370
+ }
1371
+ },
1372
+ seed: true
1373
+ }
1374
+
1375
+ eListAdd("SEEDS", "pineapple_seed")
1376
+
1377
+ elements.pineapple_stem = {
1378
+ color: "#3aab11",
1379
+ behavior: behaviors.WALL,
1380
+ movable: false,
1381
+ category: "life",
1382
+ tempHigh: 100,
1383
+ stateHigh: "dead_plant",
1384
+ tempLow: -1.66,
1385
+ stateLow: "frozen_plant",
1386
+ burn: 15,
1387
+ burnTime: 60,
1388
+ burnInto: "dead_plant",
1389
+ breakInto: "dead_plant",
1390
+ tick: function (pixel) {
1391
+ let left = pixel.x - 1
1392
+ let right = pixel.x + 1
1393
+ let up = pixel.y - 1
1394
+ let down = pixel.y + 1
1395
+ let belowPixel = getPixel(pixel.x, down)
1396
+ pixel.fruitCD ??= 60
1397
+ if (!outOfBounds(pixel.x, down) && belowPixel && eLists.SOIL.includes(belowPixel.element) && pixel.growthState === 1) {
1398
+ changePixel(belowPixel, "root")
1399
+ }
1400
+ if (pixel.growthState === 1 && Math.random() <= 0.05) {
1401
+ if (isEmpty(left, up) && pixel.growDiagLeft === true) {
1402
+ createPixel("pineapple_stem", left, up)
1403
+ let newPixel = getPixel(left, up)
1404
+ if (newPixel) {
1405
+ newPixel.growthState = 2
1406
+ newPixel.growDiagLeft = true
1407
+ delete newPixel.growDiagRight
1408
+ }
1409
+ }
1410
+ else {
1411
+ delete pixel.growDiagLeft
1412
+ }
1413
+ if (isEmpty(right, up) && pixel.growDiagRight === true) {
1414
+ createPixel("pineapple_stem", right, up)
1415
+ let newPixel = getPixel(right, up)
1416
+ if (newPixel) {
1417
+ newPixel.growthState = 2
1418
+ newPixel.growDiagRight = true
1419
+ delete newPixel.growDiagLeft
1420
+ }
1421
+ }
1422
+ else {
1423
+ delete pixel.growDiagRight
1424
+ }
1425
+ }
1426
+ if (!pixel.growDiagLeft && !pixel.growDiagRight && pixel.growthState === 1) {
1427
+ if (Math.random() <= 0.05 && isEmpty(pixel.x, up) && !pixel.fruitCD && !pixel.pineappleGrown) {
1428
+ createPixel("pineapple", pixel.x, up)
1429
+ pixel.fruitCD = 60
1430
+ pixel.pineappleGrown = true
1431
+ }
1432
+ if (pixel.fruitCD && !pixel.pineappleGrown) {
1433
+ pixel.fruitCD--
1434
+ }
1435
+ }
1436
+ if (isEmpty(pixel.x, up)) {
1437
+ pixel.pineappleGrown = false
1438
+ }
1439
+ if (pixel.growthState === 2 && Math.random() <= 0.05) {
1440
+ if (isEmpty(left, up) && pixel.growDiagLeft === true) {
1441
+ createPixel("pineapple_stem", left, up)
1442
+ }
1443
+ if (isEmpty(right, up) && pixel.growDiagRight === true) {
1444
+ createPixel("pineapple_stem", right, up)
1445
+ }
1446
+ }
1447
+ }
1448
+ }
1449
+
1450
+ // making redstone conductive bc idk why its not
1451
+ if (enabledMods.includes("mods/minecraft.js")) {
1452
+ runAfterLoad(() => {
1453
+ elements.redstone_dust.conduct = 1
1454
+ })
1455
+ }
1456
+
1457
+ elements.rubidium = {
1458
+ color: "#c0c0c0",
1459
+ state: "solid",
1460
+ behavior: behaviors.POWDER,
1461
+ tempHigh: 39.30,
1462
+ stateHigh: "liquid_rubidium",
1463
+ density: 1534,
1464
+ conduct: 0.6,
1465
+ reactions: {
1466
+ "water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1467
+ "salt_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1468
+ "sugar_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1469
+ "pool_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1470
+ "dirty_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1471
+ "seltzer": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1472
+ "primordial_soup": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1473
+ "nut_milk": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 }
1474
+ },
1475
+ category: "powders"
1476
+ }
1477
+
1478
+ elements.liquid_rubidium = {
1479
+ color: "#d0d0d0",
1480
+ state: "liquid",
1481
+ behavior: behaviors.LIQUID,
1482
+ tempHigh: 688,
1483
+ density: 1460,
1484
+ conduct: 0.6,
1485
+ tempLow: 39.30,
1486
+ stateLow: "rubidium",
1487
+ temp: 40,
1488
+ reactions: {
1489
+ "water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1490
+ "salt_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1491
+ "sugar_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1492
+ "pool_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1493
+ "dirty_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1494
+ "seltzer": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1495
+ "primordial_soup": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
1496
+ "nut_milk": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 }
1497
+ },
1498
+ category: "states",
1499
+ hidden: true
1500
+ }
1501
+
1502
+ elements.dog = {
1503
+ color: ["#221d0c", "#5c4300", "#7c5b00", "#fcfceb"],
1504
+ behavior: [
1505
+ "XX|XX|M2%3",
1506
+ "XX|FX%5|M2%5",
1507
+ "XX|M1|XX"
1508
+ ],
1509
+ tempHigh: 100,
1510
+ stateHigh: "cooked_meat",
1511
+ tempLow: -10,
1512
+ stateLow: "frozen_meat",
1513
+ category: "life",
1514
+ state: "solid",
1515
+ burn: 30,
1516
+ burnTime: 50,
1517
+ burnInto: ["cooked_meat", "smoke"],
1518
+ breakInto: ["meat", "blood"],
1519
+ reactions: {
1520
+ "meat": { elem2: null, chance: 0.5, func: behaviors.FEEDPIXEL },
1521
+ "egg": { elem2: null, chance: 0.5, func: behaviors.FEEDPIXEL },
1522
+ "yolk": { elem2: null, chance: 0.5, func: behaviors.FEEDPIXEL },
1523
+ "cheese": { elem2: null, chance: 0.5, func: behaviors.FEEDPIXEL },
1524
+ "cooked_meat": { elem2: null, chance: 0.5, func: behaviors.FEEDPIXEL },
1525
+ "chocolate": { elem2: null, chance: 0.2, func: behaviors.FEEDPIXEL, elem1: "rotten_meat" },
1526
+ "grape": { elem2: null, chance: 0.2, func: behaviors.FEEDPIXEL, elem1: "rotten_meat" },
1527
+ "rat": { elem2: null, chance: 0.3, func: behaviors.FEEDPIXEL },
1528
+ "nut_butter": { elem2: null, chance: 0.5, func: behaviors.FEEDPIXEL },
1529
+ },
1530
+ egg: "dog",
1531
+ }
1532
+
1533
+ // Keyboard state tracking
1534
+ const robotKeys = {
1535
+ left: false,
1536
+ right: false,
1537
+ jump: false
1538
+ };
1539
+
1540
+ // Set up keyboard listeners
1541
+ window.addEventListener('keydown', (e) => {
1542
+ const key = e.key.toLowerCase();
1543
+ if (key === 'a' || key === 'arrowleft') robotKeys.left = true;
1544
+ if (key === 'd' || key === 'arrowright') robotKeys.right = true;
1545
+ if (key === 'w' || key === 'arrowup') robotKeys.jump = true;
1546
+ });
1547
+
1548
+ window.addEventListener('keyup', (e) => {
1549
+ const key = e.key.toLowerCase();
1550
+ if (key === 'a' || key === 'arrowleft') robotKeys.left = false;
1551
+ if (key === 'd' || key === 'arrowright') robotKeys.right = false;
1552
+ if (key === 'w' || key === 'arrowup') robotKeys.jump = false;
1553
+ });
1554
+
1555
+ // Helper function for movement
1556
+ function tryMoveRobot(headPixel, direction) {
1557
+ const newX = headPixel.x + direction;
1558
+ const body = getPixel(headPixel.x, headPixel.y + 1);
1559
+
1560
+ if (body && body.element === "robot_body" &&
1561
+ isEmpty(newX, headPixel.y) &&
1562
+ isEmpty(newX, body.y)) {
1563
+ movePixel(body, newX, body.y);
1564
+ movePixel(headPixel, newX, headPixel.y);
1565
+ return true;
1566
+ }
1567
+ return false;
1568
+ }
1569
+
1570
+ function tryJump(headPixel) {
1571
+ const body = getPixel(headPixel.x, headPixel.y + 1);
1572
+ if (!body || body.element !== "robot_body") return false;
1573
+
1574
+ // Check if grounded (on solid surface or bottom of screen)
1575
+ const underBody = getPixel(body.x, body.y + 1);
1576
+ const isGrounded = (!isEmpty(body.x, body.y + 1) || outOfBounds(body.x, body.y + 1));
1577
+
1578
+ if (isGrounded) {
1579
+ // Check space above
1580
+ if (isEmpty(headPixel.x, headPixel.y - 1) &&
1581
+ isEmpty(headPixel.x, headPixel.y - 2)) {
1582
+
1583
+ // Two-stage jump animation
1584
+ pixelTicks = 0;
1585
+ headPixel.jumping = true;
1586
+
1587
+ // First frame - small hop
1588
+ movePixel(headPixel, headPixel.x, headPixel.y - 1);
1589
+ movePixel(body, body.x, headPixel.y + 1);
1590
+
1591
+ // Second frame - complete jump (after small delay)
1592
+ setTimeout(() => {
1593
+ if (headPixel.jumping) { // Only if still jumping
1594
+ movePixel(headPixel, headPixel.x, headPixel.y - 1);
1595
+ movePixel(body, body.x, headPixel.y + 1);
1596
+ headPixel.jumping = false;
1597
+ }
1598
+ }, 100); // 100ms delay for smoother animation
1599
+ return true;
1600
+ }
1601
+ }
1602
+ return false;
1603
+ }
1604
+ // Robot elements
1605
+ elements.robot_head = {
1606
+ color: "#d9d9d9",
1607
+ category: "machines",
1608
+ state: "solid",
1609
+ tick(pixel) {
1610
+ const body = getPixel(pixel.x, pixel.y + 1);
1611
+
1612
+ if (body && body.element === "robot_body") {
1613
+ pixel.connected = true;
1614
+ body.connected = true;
1615
+
1616
+ // Controlled movement
1617
+ if (pixel.mode === "Controlled") {
1618
+ if (robotKeys.left) {
1619
+ tryMoveRobot(pixel, -1);
1620
+ }
1621
+ else if (robotKeys.right) {
1622
+ tryMoveRobot(pixel, 1);
1623
+ }
1624
+
1625
+ if (robotKeys.jump && !pixel.jumping) {
1626
+ tryJump(pixel);
1627
+ }
1628
+ }
1629
+ // Aimless wandering
1630
+ else if (pixel.mode === "Aimless" && Math.random() < 0.02) {
1631
+ pixel.dir = pixel.dir || (Math.random() < 0.5 ? -1 : 1);
1632
+ if (!tryMoveRobot(pixel, pixel.dir)) {
1633
+ pixel.dir *= -1;
1634
+ }
1635
+ }
1636
+ }
1637
+ else {
1638
+ pixel.connected = false;
1639
+ tryMove(pixel, pixel.x, pixel.y + 1);
1640
+ }
1641
+ }
1642
+ };
1643
+
1644
+ elements.robot_body = {
1645
+ color: "#b1b1b1",
1646
+ category: "machines",
1647
+ state: "solid",
1648
+ tick(pixel) {
1649
+ const head = getPixel(pixel.x, pixel.y - 1);
1650
+
1651
+ if (head && head.element === "robot_head") {
1652
+ pixel.connected = true;
1653
+ head.connected = true;
1654
+
1655
+ // Gravity - move down if space below
1656
+ if (isEmpty(pixel.x, pixel.y + 1)) {
1657
+ let oldY = pixel.y;
1658
+ movePixel(pixel, pixel.x, pixel.y + 1);
1659
+ movePixel(head, head.x, oldY);
1660
+ }
1661
+ }
1662
+ else {
1663
+ pixel.connected = false;
1664
+ tryMove(pixel, pixel.x, pixel.y + 1);
1665
+ }
1666
+ }
1667
+ };
1668
+
1669
+ // Robot creator element
1670
+ globals.mode = "Aimless"
1671
+ elements.robot = {
1672
+ color: "#b1b1b1",
1673
+ category: "machines",
1674
+ state: "solid",
1675
+ onSelect() {
1676
+ promptChoose(
1677
+ "Choose robot mode",
1678
+ ["Aimless", "Controlled"],
1679
+ (choice) => {
1680
+ if (choice === "Controlled" && isMobile) {
1681
+ logMessage("Controlled mode doesn't work on mobile");
1682
+ globals.mode = "Aimless";
1683
+ } else {
1684
+ globals.mode = choice || "Aimless";
1685
+ if (globals.mode === "Controlled") {
1686
+ logMessage("Controls: A/D to move and W to jump or (Not reccomended) ←/→ to move, and ↑ to jump");
1687
+ }
1688
+ }
1689
+ },
1690
+ "Robot Mode"
1691
+ );
1692
+ },
1693
+ onPlace(pixel) {
1694
+ // Try to create head above
1695
+ if (isEmpty(pixel.x, pixel.y - 1)) {
1696
+ createPixel("robot_head", pixel.x, pixel.y - 1);
1697
+ const head = getPixel(pixel.x, pixel.y - 1);
1698
+ head.mode = globals.mode;
1699
+ changePixel(pixel, "robot_body");
1700
+ pixel.mode = globals.mode;
1701
+ }
1702
+ // Try to create body below if above is blocked
1703
+ else if (isEmpty(pixel.x, pixel.y + 1)) {
1704
+ createPixel("robot_body", pixel.x, pixel.y + 1);
1705
+ const body = getPixel(pixel.x, pixel.y + 1);
1706
+ body.mode = globals.mode;
1707
+ changePixel(pixel, "robot_head");
1708
+ pixel.mode = globals.mode;
1709
+ }
1710
+ // Delete if no space
1711
+ else {
1712
+ deletePixel(pixel.x, pixel.y);
1713
+ }
1714
+ },
1715
+ cooldown: defaultCooldown
1716
+ };
1717
+
1718
+ elements.mercury_gas.behaviorOn = [
1719
+ "M2|CR:uv_light%10 AND M1|M2",
1720
+ "CR:uv_light%10 AND M1|XX|CR:uv_light%10 AND M1",
1721
+ "M2|CR:uv_light%10 AND M1|M2"
1722
+ ]
1723
+
1724
+
1725
+ elements.broken_adjustable_heater = {
1726
+ color: "#ff0000",
1727
+ category: "extras",
1728
+ insulate: true,
1729
+ behavior: behaviors.WALL,
1730
+
1731
+ onSelect() {
1732
+ promptInput(
1733
+ "Select the temperature you want to adjust to",
1734
+ function (choice) {
1735
+ if (choice && !isNaN(Number(choice))) {
1736
+ globals.adjusted_heater_temp = Number(choice)
1737
+ logMessage("Occasionally creates superheated pixels")
1738
+ }
1739
+ },
1740
+ "Temperature Prompt", `${globals.adjusted_heater_temp}`
1741
+ )
1742
+ },
1743
+ tick(pixel) {
1744
+ pixel.heat_temp ??= globals.adjusted_heater_temp
1745
+ for (let i = 0; i < adjacentCoords.length; i++) {
1746
+ let x = pixel.x + adjacentCoords[i][0];
1747
+ let y = pixel.y + adjacentCoords[i][1];
1748
+ let current_pixel = getPixel(x, y);
1749
+
1750
+ if (
1751
+ current_pixel &&
1752
+ !elements[current_pixel.element]?.insulate
1753
+ && current_pixel.temp < pixel.heat_temp
1754
+ ) {
1755
+ current_pixel.temp = Math.min(current_pixel.temp + 2, pixel.heat_temp);
1756
+ }
1757
+ }
1758
+ }
1759
+ };
1760
+
1761
+ globals.adjusted_temp = 100
1762
+ globals.heatAmount = 2
1763
+
1764
+ elements.adjustable_heater = {
1765
+ color: "#ff0000",
1766
+ category: "deprecated",
1767
+ insulate: true,
1768
+ behavior: behaviors.WALL,
1769
+
1770
+ onSelect() {
1771
+ promptInput(
1772
+ "Select the temperature you want to adjust to",
1773
+ function (choice) {
1774
+ if (choice && !isNaN(Number(choice))) {
1775
+ globals.adjusted_temp = Number(choice);
1776
+ }
1777
+ },
1778
+ "Temperature Prompt", `${globals.adjusted_temp}`
1779
+ );
1780
+ },
1781
+
1782
+ tick(pixel) {
1783
+ for (let i = 0; i < adjacentCoords.length; i++) {
1784
+ let x = pixel.x + adjacentCoords[i][0];
1785
+ let y = pixel.y + adjacentCoords[i][1];
1786
+ let current_pixel = getPixel(x, y);
1787
+
1788
+ if (
1789
+ current_pixel &&
1790
+ !elements[current_pixel.element]?.insulate
1791
+ ) {
1792
+ // Heat or cool toward the adjusted temp
1793
+ if (current_pixel.temp < globals.adjusted_temp) {
1794
+ current_pixel.temp = Math.min(current_pixel.temp + globals.heatAmount, globals.adjusted_temp);
1795
+ } else if (current_pixel.temp > globals.adjusted_temp) {
1796
+ current_pixel.temp = Math.max(current_pixel.temp - globals.heatAmount, globals.adjusted_temp);
1797
+ }
1798
+ pixelTempCheck(current_pixel)
1799
+ }
1800
+ }
1801
+ }
1802
+ };
1803
+
1804
+ globals.adjusted_cooler_temp = 0; // default cooling target
1805
+
1806
+ elements.broken_adjustable_cooler = {
1807
+ color: "#0000ff",
1808
+ category: "extras",
1809
+ insulate: true,
1810
+ behavior: behaviors.WALL,
1811
+
1812
+ onSelect() {
1813
+ promptInput(
1814
+ "Select the temperature you want to cool to",
1815
+ function (choice) {
1816
+ if (choice && !isNaN(Number(choice))) {
1817
+ globals.adjusted_cooler_temp = Number(choice);
1818
+ logMessage("Occasionally creates supercooled pixels");
1819
+ }
1820
+ },
1821
+ "Temperature Prompt", `${globals.adjusted_cooler_temp}`
1822
+ );
1823
+ },
1824
+
1825
+ tick(pixel) {
1826
+ pixel.cool_temp ??= globals.adjusted_cooler_temp;
1827
+ for (let i = 0; i < adjacentCoords.length; i++) {
1828
+ let x = pixel.x + adjacentCoords[i][0];
1829
+ let y = pixel.y + adjacentCoords[i][1];
1830
+ let current_pixel = getPixel(x, y);
1831
+
1832
+ if (
1833
+ current_pixel &&
1834
+ !elements[current_pixel.element]?.insulate &&
1835
+ current_pixel.temp > pixel.cool_temp
1836
+ ) {
1837
+ // Cool the pixel toward the target
1838
+ current_pixel.temp = Math.max(current_pixel.temp - 2, pixel.cool_temp);
1839
+ }
1840
+ }
1841
+ }
1842
+ };
1843
+
1844
+ globals.adjusted_cool_temp = 0; // default cooling target
1845
+ globals.coolAmount = 2; // adjustable step
1846
+
1847
+ elements.adjustable_cooler = {
1848
+ color: "#0000ff",
1849
+ category: "deprecated",
1850
+ insulate: true,
1851
+ behavior: behaviors.WALL,
1852
+
1853
+ onSelect() {
1854
+ promptInput(
1855
+ "Select the temperature you want to cool to",
1856
+ function (choice) {
1857
+ if (choice && !isNaN(Number(choice))) {
1858
+ globals.adjusted_cool_temp = Number(choice);
1859
+ }
1860
+ },
1861
+ "Temperature Prompt", `${globals.adjusted_cool_temp}`
1862
+ );
1863
+ },
1864
+
1865
+ tick(pixel) {
1866
+ for (let i = 0; i < adjacentCoords.length; i++) {
1867
+ let x = pixel.x + adjacentCoords[i][0];
1868
+ let y = pixel.y + adjacentCoords[i][1];
1869
+ let current_pixel = getPixel(x, y);
1870
+
1871
+ if (
1872
+ current_pixel &&
1873
+ !elements[current_pixel.element]?.insulate
1874
+ ) {
1875
+ // Cool or heat toward target (mirrors fixed heater logic)
1876
+ if (current_pixel.temp > globals.adjusted_cool_temp) {
1877
+ current_pixel.temp = Math.max(current_pixel.temp - globals.coolAmount, globals.adjusted_cool_temp);
1878
+ } else if (current_pixel.temp < globals.adjusted_cool_temp) {
1879
+ current_pixel.temp = Math.min(current_pixel.temp + globals.coolAmount, globals.adjusted_cool_temp);
1880
+ }
1881
+
1882
+ pixelTempCheck(current_pixel)
1883
+ }
1884
+ }
1885
+ }
1886
+ };
1887
+
1888
+
1889
+ globals.polishedList = new Set()
1890
+ elements.polish = {
1891
+ desc: "Polishes textured elements",
1892
+ category: "tools",
1893
+ color: ["#a0dff0", "#c0e8f8", "#e0f5ff"],
1894
+ tool(pixel) {
1895
+ let element = pixel.element
1896
+ if ((elements[pixel.element].colorPattern && !globals.polishedList.has(`${pixel.x}, ${pixel.y}`)) || shiftDown) {
1897
+ deletePixel(pixel.x, pixel.y)
1898
+ createPixel(element, pixel.x, pixel.y)
1899
+ globals.polishedList.add(`${pixel.x}, ${pixel.y}`)
1900
+ }
1901
+ },
1902
+ onUnselect() {
1903
+ globals.polishedList.clear()
1904
+ }
1905
+ }
1906
+
1907
+ elements[" "] = {
1908
+ category: "extras",
1909
+ onSelect() {
1910
+ logMessage("This Element has weird properties since its a space ' '")
1911
+ },
1912
+ alias: "space"
1913
+ }
1914
+
1915
+ elements.paper_filter = {
1916
+ desc: "Filters solids from liquids",
1917
+ color: "#ececec",
1918
+ behavior: behaviors.WALL,
1919
+ reactions: {
1920
+ "light": { stain1: "#ebdfa7" },
1921
+ "oxygen": { stain1: "#ebdfa7" }
1922
+ },
1923
+ tempHigh: 248,
1924
+ stateHigh: ["fire", "fire", "fire", "fire", "fire", "ash"],
1925
+ burn: 70,
1926
+ burnTime: 300,
1927
+ burnInto: ["fire", "fire", "fire", "fire", "fire", "ash"],
1928
+ category: "machines",
1929
+ density: 1201,
1930
+ breakInto: "confetti",
1931
+ breakIntoColor: ["#ffffff", "#e6e6e6", "#dbdbdb"],
1932
+ tick(pixel) {
1933
+ let upPixel = getPixel(pixel.x, pixel.y - 1)
1934
+
1935
+ if (upPixel && elements[upPixel.element].state == "liquid" && !pixel.con) {
1936
+ deletePixel(pixel.x, pixel.y - 1)
1937
+ pixel.con = upPixel
1938
+ }
1939
+
1940
+ if (upPixel && (upPixel.element === "paper_filter" || upPixel.element === "indestructable_filter") && upPixel.con && !pixel.con) {
1941
+ let liquid = upPixel.con
1942
+ let viscMove = true
1943
+
1944
+ let visc = elements[liquid.element].viscosity
1945
+ if (visc) {
1946
+ viscMove = (Math.random() * 100) < (100 / Math.pow(visc, 0.5))
1947
+ }
1948
+
1949
+ if (viscMove) {
1950
+ pixel.con = liquid
1951
+ delete upPixel.con
1952
+ }
1953
+ }
1954
+
1955
+ if (isEmpty(pixel.x, pixel.y + 1) && !outOfBounds(pixel.x, pixel.y + 1) && pixel.con) {
1956
+ let liquid = pixel.con
1957
+ let viscExit = true
1958
+
1959
+ let visc = elements[liquid.element].viscosity
1960
+ if (visc) {
1961
+ viscExit = (Math.random() * 100) < (100 / Math.pow(visc, 0.5))
1962
+ }
1963
+
1964
+ if (viscExit) {
1965
+ createPixel(liquid.element, pixel.x, pixel.y + 1)
1966
+ delete pixel.con
1967
+ }
1968
+ }
1969
+ }
1970
+ }
1971
+
1972
+ elements.indestructable_filter = {
1973
+ desc: "Filters solids from liquids",
1974
+ color: "#aaaaaa",
1975
+ behavior: behaviors.WALL,
1976
+ category: "machines",
1977
+ state: "solid",
1978
+ movable: false,
1979
+ tick(pixel) {
1980
+ let upPixel = getPixel(pixel.x, pixel.y - 1)
1981
+ let belowPixel = getPixel(pixel.x, pixel.y + 1)
1982
+
1983
+ if (upPixel && elements[upPixel.element].state == "liquid" && !pixel.con) {
1984
+ deletePixel(pixel.x, pixel.y - 1)
1985
+ pixel.con = upPixel
1986
+ }
1987
+
1988
+ if (upPixel && (upPixel.element === "indestructable_filter" || upPixel.element === "paper_filter") && upPixel.con && !pixel.con) {
1989
+ let liquid = upPixel.con
1990
+ let viscMove = true
1991
+
1992
+ let visc = elements[liquid.element].viscosity
1993
+ if (visc) {
1994
+ viscMove = (Math.random() * 100) < (100 / Math.pow(visc, 0.5))
1995
+ }
1996
+
1997
+ if (viscMove) {
1998
+ pixel.con = liquid
1999
+ delete upPixel.con
2000
+ }
2001
+ }
2002
+
2003
+ if (isEmpty(pixel.x, pixel.y + 1) && !outOfBounds(pixel.x, pixel.y + 1) && pixel.con) {
2004
+ let liquid = pixel.con
2005
+ let viscExit = true
2006
+
2007
+ let visc = elements[liquid.element].viscosity
2008
+ if (visc) {
2009
+ viscExit = (Math.random() * 100) < (100 / Math.pow(visc, 0.5))
2010
+ }
2011
+
2012
+ if (viscExit) {
2013
+ createPixel(liquid.element, pixel.x, pixel.y + 1)
2014
+ delete pixel.con
2015
+ }
2016
+ }
2017
+ }
2018
+ }
2019
+
2020
+ globals.blackHoleExpand = false
2021
+ elements.black_hole = {
2022
+ color: "#111111",
2023
+ hardness: 1,
2024
+ category: "special",
2025
+ properties: {
2026
+ absorbed: 0
2027
+ },
2028
+ renderer: function (pixel, ctx) {
2029
+ if (!viewInfo[view].colorEffects) { drawDefault(ctx, pixel); return }
2030
+ renderPresets.HEATGLOW(pixel, ctx);
2031
+ if (pixel.alpha === 0) return;
2032
+
2033
+ let edge = false;
2034
+ pixel.edge = false;
2035
+ pixel.color = "#111111";
2036
+
2037
+ for (var i = 0; i < adjacentCoords.length; i++) {
2038
+ var coords = adjacentCoords[i];
2039
+ var x = pixel.x + coords[0];
2040
+ var y = pixel.y + coords[1];
2041
+ if (!outOfBounds(x, y)) {
2042
+ let neighbor = getPixel(x, y);
2043
+ if (!neighbor || elements[neighbor.element].movable !== elements[pixel.element].movable) {
2044
+ edge = true;
2045
+ break;
2046
+ }
2047
+ }
2048
+ }
2049
+ if (edge) { pixel.color = "#ffae00"; pixel.edge = true }
2050
+ },
2051
+ tick(pixel) {
2052
+ // Glow effect
2053
+ if (pixel.edge) {
2054
+ pixel.glow = true;
2055
+ if (enabledMods.includes("mods/glow.js")) {
2056
+ pixel.emit = 10;
2057
+ }
2058
+ }
2059
+ else {
2060
+ pixel.glow = false;
2061
+ if (enabledMods.includes("mods/glow.js")) {
2062
+ pixel.emit = 0;
2063
+ }
2064
+ }
2065
+
2066
+ // Suction physics
2067
+ let radius = 20; // how far the suction reaches
2068
+ for (let dx = -radius; dx <= radius; dx++) {
2069
+ for (let dy = -radius; dy <= radius; dy++) {
2070
+ if (dx === 0 && dy === 0) continue;
2071
+
2072
+ let x = pixel.x + dx;
2073
+ let y = pixel.y + dy;
2074
+
2075
+ if (!outOfBounds(x, y)) {
2076
+ let other = getPixel(x, y);
2077
+ if (other && other !== pixel) {
2078
+ let elemDef = elements[other.element];
2079
+
2080
+ // Skip if indestructible
2081
+ if (elemDef.hardness === 1) continue;
2082
+
2083
+ // Distance to black hole
2084
+ let dist = Math.sqrt(dx * dx + dy * dy);
2085
+
2086
+ if (dist <= radius) {
2087
+ // Suction chance: closer = stronger pull
2088
+ let chance = 1 / dist;
2089
+ if (Math.random() < chance) {
2090
+ let stepX = Math.sign(pixel.x - x);
2091
+ let stepY = Math.sign(pixel.y - y);
2092
+
2093
+ let newX = x + stepX;
2094
+ let newY = y + stepY;
2095
+
2096
+ if (isEmpty(newX, newY) && !outOfBounds(newX, newY)) {
2097
+ movePixel(other, newX, newY);
2098
+ }
2099
+ else if (dist <= 1.5) {
2100
+ deletePixel(x, y); // absorb it
2101
+ pixel.absorbed++
2102
+ }
2103
+ }
2104
+ }
2105
+ }
2106
+ }
2107
+ }
2108
+ if (globals.blackHoleExpand) {
2109
+ for (var i = 0; i < adjacentCoords.length; i++) {
2110
+ var x = pixel.x + adjacentCoords[i][0];
2111
+ var y = pixel.y + adjacentCoords[i][1];
2112
+ if (pixel.absorbed >= 30 && isEmpty(x, y)) {
2113
+ createPixel("black_hole", x, y)
2114
+ pixel.absorbed = 0
2115
+ }
2116
+ }
2117
+ }
2118
+ }
2119
+ },
2120
+ forceSaveColor: true,
2121
+ onSelect() {
2122
+ promptChoose(
2123
+ "Do you want the black hole to grow?",
2124
+ ["Yes", "No"],
2125
+ (choice) => {
2126
+ if (!choice) {
2127
+ choice = "No"
2128
+ }
2129
+ if (choice == "Yes") {
2130
+ globals.blackHoleExpand = true
2131
+ }
2132
+ else {
2133
+ globals.blackHoleExpand = false
2134
+ }
2135
+ }
2136
+ )
2137
+ }
2138
+ };
2139
+
2140
+ elements.white_hole = {
2141
+ color: "#ffffff",
2142
+ renderer: function (pixel, ctx) {
2143
+ if (!viewInfo[view].colorEffects) { drawDefault(ctx, pixel); return }
2144
+ renderPresets.HEATGLOW(pixel, ctx);
2145
+ if (pixel.alpha === 0) return;
2146
+ let edge = false;
2147
+ for (var i = 0; i < adjacentCoords.length; i++) {
2148
+ var coords = adjacentCoords[i];
2149
+ var x = pixel.x + coords[0];
2150
+ var y = pixel.y + coords[1];
2151
+ if (isEmpty(x, y) || (!outOfBounds(x, y) && elements[pixelMap[x][y].element].movable !== elements[pixel.element].movable)) {
2152
+ edge = true;
2153
+ break;
2154
+ }
2155
+ }
2156
+ if (edge) { drawSquare(ctx, "rgba(0,0,0," + (pixel.alpha || 1) / 4 + ")", pixel.x, pixel.y) }
2157
+ },
2158
+ tick(pixel) {
2159
+ for (var i = 0; i < squareCoords.length; i++) {
2160
+ var coord = squareCoords[i];
2161
+ var x = pixel.x + coord[0];
2162
+ var y = pixel.y + coord[1];
2163
+ if (isEmpty(x, y) && !outOfBounds(x, y) && Math.random() <= 0.0005) {
2164
+ createPixel(
2165
+ ["proton", "neutron", "electric",
2166
+ "proton", "neutron", "electric",
2167
+ "proton", "neutron", "electric",
2168
+ "proton", "neutron", "electric",
2169
+ "random"], x, y)
2170
+ }
2171
+ }
2172
+ let radius = 20;
2173
+ for (let dx = -radius; dx <= radius; dx++) {
2174
+ for (let dy = -radius; dy <= radius; dy++) {
2175
+ if (dx === 0 && dy === 0) continue;
2176
+
2177
+ let x = pixel.x + dx;
2178
+ let y = pixel.y + dy;
2179
+
2180
+ if (!outOfBounds(x, y)) {
2181
+ let other = getPixel(x, y);
2182
+ if (other && other !== pixel) {
2183
+ let elemDef = elements[other.element];
2184
+
2185
+ if (elemDef.hardness === 1) continue;
2186
+
2187
+ let dist = Math.sqrt(dx * dx + dy * dy);
2188
+
2189
+ if (dist <= radius) {
2190
+ let chance = 1 / (dist * 0.75);
2191
+ if (Math.random() < chance) {
2192
+ let stepX = Math.sign(pixel.x - x);
2193
+ let stepY = Math.sign(pixel.y - y);
2194
+
2195
+ let newX = x - stepX;
2196
+ let newY = y - stepY;
2197
+
2198
+ if (isEmpty(newX, newY) && !outOfBounds(newX, newY)) {
2199
+ movePixel(other, newX, newY);
2200
+ }
2201
+ }
2202
+ }
2203
+ }
2204
+ }
2205
+ }
2206
+ }
2207
+ },
2208
+ hardness: 1,
2209
+ behavior: behaviors.WALL,
2210
+ category: "special"
2211
+ }
2212
+
2213
+ elements.cacao_fruit = {
2214
+ color: "#854700",
2215
+ behavior: [
2216
+ "XX|ST:cacao_stem|XX",
2217
+ "ST:cacao_stem|XX|ST:cacao_stem",
2218
+ "XX|ST:cacao_stem AND M1|XX"
2219
+ ],
2220
+ isFood: true,
2221
+ burn: 10,
2222
+ burnTime: 100,
2223
+ burnInto: "ash",
2224
+ breakInto: "cacao_bean",
2225
+ category: "food",
2226
+ state: "solid",
2227
+ density: 1000
2228
+ }
2229
+
2230
+ elements.cacao_bean = {
2231
+ color: "#ffe7ba",
2232
+ isFood: true,
2233
+ behavior: [
2234
+ "XX|XX|XX",
2235
+ "XX|XX|XX",
2236
+ "M2%10|M1|M2%10"
2237
+ ],
2238
+ tempHigh: 100,
2239
+ stateHigh: "dried_cacao_bean",
2240
+ onStateHigh(pixel) { releaseElement(pixel, "steam") },
2241
+ state: "solid",
2242
+ category: "food",
2243
+ density: 1000
2244
+ }
2245
+
2246
+ elements.dried_cacao_bean = {
2247
+ color: "#61321e",
2248
+ behavior: behaviors.POWDER,
2249
+ reactions: {
2250
+ "sugar_water": { elem2: "melted_chocolate", tempMin: 65 },
2251
+ "water": { elem2: "melted_chocolate", tempMin: 65 }
2252
+ },
2253
+ tempHigh: 400,
2254
+ stateHigh: "ash",
2255
+ isFood: true,
2256
+ category: "food",
2257
+ state: "solid",
2258
+ density: 1000
2259
+ }
2260
+
2261
+ elements.coffee_bean.reactions.sugar_water = { elem2: "coffee", tempMin: 80 }
2262
+ elements.coffee.reactions.sugar_water = { elem2: "coffee", tempMin: 70, chance: 0.2 }
2263
+ elements.coffee_ground.reactions.sugar_water = elements.coffee_ground.reactions.water
2264
+ elements._ = {
2265
+ category: "extras",
2266
+ onSelect() {
2267
+ logMessage("Another way to make an element with no name \"_\"")
2268
+ },
2269
+ alias: ["underscore"]
2270
+ }
2271
+
2272
+ elements.cacao_seed = {
2273
+ color: "#8b3f00",
2274
+ behavior: behaviors.STURDYPOWDER,
2275
+ cooldown: defaultCooldown,
2276
+ category: "life",
2277
+ tempHigh: 400,
2278
+ stateHigh: "fire",
2279
+ tempLow: -2,
2280
+ stateLow: "frozen_plant",
2281
+ burn: 50,
2282
+ burnTime: 20,
2283
+ state: "solid",
2284
+ tick(pixel) {
2285
+ let belowPixel = getPixel(pixel.x, pixel.y + 1)
2286
+ if ((!isEmpty(pixel.x, pixel.y + 1) && belowPixel) || outOfBounds(pixel.x, pixel.y + 1) && Math.random() <= 0.005) {
2287
+ changePixel(pixel, "cacao_stem")
2288
+ pixel.stage = 1
2289
+ }
2290
+ }
2291
+ }
2292
+
2293
+ elements.cacao_stem = {
2294
+ color: "#916a00",
2295
+ renderer: renderPresets.WOODCHAR,
2296
+ movable: false,
2297
+ tempHigh: 100,
2298
+ stateHigh: "wood",
2299
+ tempLow: -30,
2300
+ stateLow: "wood",
2301
+ category: "life",
2302
+ burn: 2,
2303
+ burnTime: 300,
2304
+ burnInto: ["sap", "ember", "charcoal", "smoke"],
2305
+ state: "solid",
2306
+ density: 1500,
2307
+ hardness: 0.15,
2308
+ breakInto: ["sap", "sawdust"],
2309
+ seed: "cacao_seed",
2310
+ forceSaveColor: true,
2311
+ stateHighColorMultiplier: 0.95,
2312
+ onPlace(pixel) {
2313
+ pixel.stage = 1
2314
+ },
2315
+ hoverStat(pixel) {
2316
+ if (pixel.stage) return pixel.stage;
2317
+ else return 0;
2318
+ },
2319
+ tick(pixel) {
2320
+ // 1 = trunk
2321
+ // 2 = spread
2322
+ // 3 = stop
2323
+ if (pixel.stage === 1 && isEmpty(pixel.x, pixel.y - 1) && Math.random() <= 0.05) {
2324
+ tryMove(pixel, pixel.x, pixel.y - 1, "cacao_stem")
2325
+ let oldPixel = getPixel(pixel.x, pixel.y + 1)
2326
+ if (oldPixel) {
2327
+ delete oldPixel.stage
2328
+ }
2329
+ if (Math.random() <= 0.3) {
2330
+ pixel.stage = 2
2331
+ }
2332
+ }
2333
+ if (pixel.stage === 2) {
2334
+ let rand = Math.random()
2335
+ let nx;
2336
+ if (rand < 0.4) {
2337
+ nx = 1
2338
+ }
2339
+ else if (rand < 0.8) {
2340
+ nx = -1
2341
+ }
2342
+ else nx = 0;
2343
+ if (isEmpty(pixel.x + nx, pixel.y - 1) && Math.random() <= 0.05) {
2344
+ createPixel(["cacao_stem", "plant"], pixel.x + nx, pixel.y - 1)
2345
+ let newPixel = getPixel(pixel.x + nx, pixel.y - 1)
2346
+ if (Math.random() <= 0.2 && newPixel) {
2347
+ newPixel.stage = 3
2348
+ }
2349
+ else if (newPixel) newPixel.stage = 2;
2350
+ }
2351
+ if (!isEmpty(pixel.x + 1, pixel.y - 1) && !isEmpty(pixel.x, pixel.y - 1) && !isEmpty(pixel.x - 1, pixel.y - 1) && Math.random() <= 0.005) {
2352
+ shuffleArray(adjacentCoordsShuffle)
2353
+ for (var i = 0; i < adjacentCoordsShuffle.length; i++) {
2354
+ var x = pixel.x + adjacentCoordsShuffle[i][0];
2355
+ var y = pixel.y + adjacentCoordsShuffle[i][1];
2356
+ if (isEmpty(x, y) && !pixel.fruitMade) {
2357
+ createPixel("cacao_fruit", x, y)
2358
+ pixel.fruitMade = true
2359
+ pixel.fruitCoordsx = x
2360
+ pixel.fruitCoordsy = y
2361
+ break
2362
+ }
2363
+ }
2364
+ }
2365
+ }
2366
+ if (pixel.fruitCoordsx && pixel.fruitCoordsy) {
2367
+ if (getPixel(pixel.fruitCoordsx, pixel.fruitCoordsy) && getPixel(pixel.fruitCoordsx, pixel.fruitCoordsy).element === "cacao_fruit") return;
2368
+ pixel.fruitMade = false
2369
+ delete pixel.fruitCoordsx
2370
+ delete pixel.fruitCoordsy
2371
+ }
2372
+ }
2373
+ }
2374
+
2375
+
2376
+ // --- audio setup ---
2377
+ const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
2378
+
2379
+ function playNote(frequency, duration = 1, type = "sine", volume = 0.1) {
2380
+ if (!Number.isFinite(frequency)) {
2381
+ console.error("Invalid frequency:", frequency);
2382
+ return;
2383
+ }
2384
+
2385
+ const osc = audioCtx.createOscillator();
2386
+ const gain = audioCtx.createGain();
2387
+
2388
+ osc.type = type;
2389
+ osc.frequency.value = frequency;
2390
+
2391
+ gain.gain.setValueAtTime(volume, audioCtx.currentTime);
2392
+ osc.connect(gain);
2393
+ gain.connect(audioCtx.destination);
2394
+
2395
+ gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + duration);
2396
+
2397
+ osc.start();
2398
+ osc.stop(audioCtx.currentTime + duration);
2399
+ }
2400
+
2401
+
2402
+ const pianoFrequencies = {
2403
+ "A0": 27.500, "A#0": 29.135, "BB0": 29.135, "B0": 30.868,
2404
+ "C1": 32.703, "C#1": 34.648, "DB1": 34.648, "D1": 36.708,
2405
+ "D#1": 38.891, "EB1": 38.891, "E1": 41.203, "F1": 43.654,
2406
+ "F#1": 46.249, "GB1": 46.249, "G1": 48.999, "G#1": 51.913,
2407
+ "AB1": 51.913, "A1": 55.000, "A#1": 58.270, "BB1": 58.270,
2408
+ "B1": 61.735,
2409
+
2410
+ "C2": 65.406, "C#2": 69.296, "DB2": 69.296, "D2": 73.416,
2411
+ "D#2": 77.782, "EB2": 77.782, "E2": 82.407, "F2": 87.307,
2412
+ "F#2": 92.499, "GB2": 92.499, "G2": 97.999, "G#2": 103.826,
2413
+ "AB2": 103.826, "A2": 110.000, "A#2": 116.541, "BB2": 116.541,
2414
+ "B2": 123.471,
2415
+
2416
+ "C3": 130.813, "C#3": 138.591, "DB3": 138.591, "D3": 146.832,
2417
+ "D#3": 155.563, "EB3": 155.563, "E3": 164.814, "F3": 174.614,
2418
+ "F#3": 184.997, "GB3": 184.997, "G3": 195.998, "G#3": 207.652,
2419
+ "AB3": 207.652, "A3": 220.000, "A#3": 233.082, "BB3": 233.082,
2420
+ "B3": 246.942,
2421
+
2422
+ "C4": 261.626, "C#4": 277.183, "DB4": 277.183, "D4": 293.665,
2423
+ "D#4": 311.127, "EB4": 311.127, "E4": 329.628, "F4": 349.228,
2424
+ "F#4": 369.994, "GB4": 369.994, "G4": 391.995, "G#4": 415.305,
2425
+ "AB4": 415.305, "A4": 440.000, "A#4": 466.164, "BB4": 466.164,
2426
+ "B4": 493.883,
2427
+
2428
+ "C5": 523.251, "C#5": 554.365, "DB5": 554.365, "D5": 587.330,
2429
+ "D#5": 622.254, "EB5": 622.254, "E5": 659.255, "F5": 698.456,
2430
+ "F#5": 739.989, "GB5": 739.989, "G5": 783.991, "G#5": 830.609,
2431
+ "AB5": 830.609, "A5": 880.000, "A#5": 932.328, "BB5": 932.328,
2432
+ "B5": 987.767,
2433
+
2434
+ "C6": 1046.502, "C#6": 1108.731, "DB6": 1108.731, "D6": 1174.659,
2435
+ "D#6": 1244.508, "EB6": 1244.508, "E6": 1318.510, "F6": 1396.913,
2436
+ "F#6": 1479.978, "GB6": 1479.978, "G6": 1567.982, "G#6": 1661.219,
2437
+ "AB6": 1661.219, "A6": 1760.000, "A#6": 1864.655, "BB6": 1864.655,
2438
+ "B6": 1975.533,
2439
+
2440
+ "C7": 2093.005, "C#7": 2217.461, "DB7": 2217.461, "D7": 2349.318,
2441
+ "D#7": 2489.016, "EB7": 2489.016, "E7": 2637.020, "F7": 2793.826,
2442
+ "F#7": 2959.955, "GB7": 2959.955, "G7": 3135.963, "G#7": 3322.438,
2443
+ "AB7": 3322.438, "A7": 3520.000, "A#7": 3729.310, "BB7": 3729.310,
2444
+ "B7": 3951.066,
2445
+
2446
+ "C8": 4186.009
2447
+ };
2448
+
2449
+
2450
+ globals.note = 261.626; // default C4
2451
+ globals.notesToPlay = [];
2452
+
2453
+ function flushNotes() {
2454
+ if (globals.notesToPlay.length === 0) return;
2455
+
2456
+
2457
+ let baseVolume = 0.2;
2458
+ let volume = baseVolume / Math.sqrt(globals.notesToPlay.length);
2459
+
2460
+ for (let f of globals.notesToPlay) {
2461
+ playNote(f, 1, "sine", volume);
2462
+ }
2463
+
2464
+ globals.notesToPlay = [];
2465
+ }
2466
+
2467
+ elements.note_block = {
2468
+ color: "#965500",
2469
+ behavior: behaviors.WALL,
2470
+ onSelect() {
2471
+ promptInput(
2472
+ "Select the note this note block should be",
2473
+ function (choice) {
2474
+ if (!choice) {
2475
+ if (!globals.note) { globals.note = 261.626; }
2476
+ return;
2477
+ }
2478
+ let key = choice.toUpperCase();
2479
+ if (key in pianoFrequencies) {
2480
+ globals.note = pianoFrequencies[key];
2481
+ } else {
2482
+ globals.note = 261.626; // fallback = C4
2483
+ }
2484
+ },
2485
+ "Note prompt"
2486
+ );
2487
+ },
2488
+ onPlace(pixel) {
2489
+ pixel.note = globals.note;
2490
+ },
2491
+ tick(pixel) {
2492
+ if (pixel.charge) {
2493
+ globals.notesToPlay.push(Number(pixel.note));
2494
+ }
2495
+ },
2496
+ conduct: 1,
2497
+ category: "machines"
2498
+ };
2499
+
2500
+ runEveryTick(function () { flushNotes() });
2501
+
2502
+ /*
2503
+ elements.uncook = {
2504
+ color: ["#4dcdff", "#70ddff", "#bcddff", "#ffffff"],
2505
+ category: "tools",
2506
+ tool(pixel) {
2507
+ if (!pixel || !pixel.element) return;
2508
+
2509
+ // 1) If the current element itself defines stateLow, use it (common case)
2510
+ const cur = elements[pixel.element];
2511
+ if (cur && cur.stateLow !== undefined) {
2512
+ const low = cur.stateLow;
2513
+ pixel.element = Array.isArray(low) ? low[Math.floor(Math.random() * low.length)] : low;
2514
+ if (typeof pixel.temp === "number") pixel.temp = Math.max(0, pixel.temp - 1);
2515
+ return; // done
2516
+ }
2517
+
2518
+ // 2) Otherwise search for an element whose stateHigh === the current element
2519
+ for (const key in elements) {
2520
+ const el = elements[key];
2521
+ if (!el) continue;
2522
+ if (el.stateHigh === pixel.element) {
2523
+ // 'key' is the low-state element name
2524
+ changePixel(pixel, key)
2525
+ if (typeof pixel.temp === "number") pixel.temp = Math.max(0, pixel.temp - 1);
2526
+ return; // done
2527
+ }
2528
+ // If el.stateHigh can be an array of high-state names:
2529
+ if (Array.isArray(el.stateHigh) && el.stateHigh.includes(pixel.element)) {
2530
+ changePixel(pixel, key)
2531
+ if (typeof pixel.temp === "number") pixel.temp = Math.max(0, pixel.temp - 1);
2532
+ return;
2533
+ }
2534
+ }
2535
+ }
2536
+ };
2537
+ */
2538
+
2539
+ elements.roman_cement = {
2540
+ color: "#b8b8b8",
2541
+ behavior: behaviors.LIQUID,
2542
+ category: "liquids",
2543
+ viscosity: 1000,
2544
+ density: 1400,
2545
+ state: "solid",
2546
+ tempLow: -10,
2547
+ stateLow: "roman_concrete",
2548
+ tempHigh: 1550,
2549
+ stateHigh: "magma",
2550
+ tick(pixel) {
2551
+ if (pixelTicks - pixel.start > 100 && Math.random() <= 0.1) {
2552
+ changePixel(pixel, "roman_concrete")
2553
+ }
2554
+ }
2555
+ }
2556
+
2557
+ elements.roman_concrete = {
2558
+ color: "#ababab",
2559
+ behavior: behaviors.SUPPORT,
2560
+ tempHigh: 1500,
2561
+ stateHigh: "magma",
2562
+ category: "powders",
2563
+ state: "solid",
2564
+ density: 2400,
2565
+ hardness: 0.5,
2566
+ breakInto: "dust",
2567
+ darkText: true
2568
+ }
2569
+
2570
+ /**
2571
+ *
2572
+ * @param {string} element
2573
+ * @param {object} reaction
2574
+ * @returns {void}
2575
+ */
2576
+ function doWaterReactions(element, reaction) {
2577
+ if (!elements[element].reactions) {
2578
+ elements[element].reactions = {}
2579
+ }
2580
+ elements[element].reactions.water = reaction
2581
+ elements[element].reactions.salt_water = reaction
2582
+ elements[element].reactions.pool_water = reaction
2583
+ elements[element].reactions.sugar_water = reaction
2584
+ elements[element].reactions.dirty_water = reaction
2585
+ elements[element].reactions.selter = reaction
2586
+ elements[element].reactions.primordial_soup = reaction
2587
+ elements[element].reactions.nut_milk = reaction
2588
+ }
2589
+
2590
+ doWaterReactions("slaked_lime", { elem1: "roman_cement", elem2: null, chance: 0.25 })
2591
+
2592
+ globals.cachedWords = [];
2593
+ globals.otherCachedWords = [];
2594
+ globals.filteredCachedWords = [];
2595
+ globals.loadingLogged = false;
2596
+
2597
+
2598
+ async function getWordList() {
2599
+ if (globals.cachedWords) return globals.cachedWords;
2600
+ try {
2601
+ const response = await fetch("https://raw.githubusercontent.com/first20hours/google-10000-english/refs/heads/master/google-10000-english-no-swears.txt");
2602
+ if (!response.ok) throw new Error('Network error');
2603
+ const text = await response.text();
2604
+ globals.cachedWords = text.split("\n");
2605
+ return globals.cachedWords;
2606
+ } catch (err) {
2607
+ console.error(err);
2608
+ return [];
2609
+ }
2610
+ }
2611
+
2612
+
2613
+ async function getCleanWordList() {
2614
+ if (globals.otherCachedWords) return globals.otherCachedWords;
2615
+ try {
2616
+ const response = await fetch("https://raw.githubusercontent.com/dwyl/english-words/refs/heads/master/words.txt");
2617
+ if (!response.ok) throw new Error('Network error');
2618
+ const text = await response.text();
2619
+ globals.otherCachedWords = text.split("\n");
2620
+ return globals.otherCachedWords;
2621
+ } catch (err) {
2622
+ console.error(err);
2623
+ return [];
2624
+ }
2625
+ }
2626
+
2627
+ async function filterWordList() {
2628
+ if (!globals.cachedWords) await getWordList();
2629
+ if (!globals.otherCachedWords) await getCleanWordList();
2630
+
2631
+ if (globals.filteredCachedWords) return globals.filteredCachedWords;
2632
+
2633
+ const cleanSet = new Set(globals.otherCachedWords);
2634
+ globals.filteredCachedWords = [];
2635
+
2636
+ const chunkSize = 1000;
2637
+ for (let i = 0; i < globals.cachedWords.length; i += chunkSize) {
2638
+ const chunk = globals.cachedWords.slice(i, i + chunkSize);
2639
+ globals.filteredCachedWords.push(...chunk.filter(word => cleanSet.has(word)));
2640
+ await new Promise(requestAnimationFrame);
2641
+ }
2642
+ console.log("Finished filtering")
2643
+ return globals.filteredCachedWords;
2644
+ }
2645
+
2646
+ filterWordList()
2647
+
2648
+ // getting myself familiar with async functions
2649
+ elements.random_word_generator = {
2650
+ color: "#ffffff",
2651
+ behavior: behaviors.WALL,
2652
+ desc: "When shocked logs a random word",
2653
+ conduct: 1,
2654
+ category: "special",
2655
+ tick: function (pixel) {
2656
+ pixel.cd ??= 0;
2657
+
2658
+ if (pixel.charge === 1 && pixel.cd <= 0) {
2659
+ if (!globals.filteredCachedWords && !globals.loadingLogged) {
2660
+ logMessage("Loading...");
2661
+ globals.loadingLogged = true;
2662
+ }
2663
+
2664
+ const words = globals.filteredCachedWords ?? []
2665
+
2666
+ if (words.length > 0) {
2667
+ const word = words[Math.floor(Math.random() * words.length)];
2668
+ logMessage("Your word is: " + word);
2669
+ pixel.cd = 10;
2670
+ } else {
2671
+ logMessage("Failed to load words.");
2672
+ }
2673
+ } else if (pixel.cd > 0) {
2674
+ pixel.cd--;
2675
+ }
2676
+ }
2677
+ };
2678
+
2679
+ globals.paint_color = "#ff0000";
2680
+
2681
+ elements.paint_using_hex = {
2682
+ color: elements.paint.color,
2683
+ onSelect() {
2684
+ promptInput(
2685
+ "Select the color you want in hex. If you pass an array, make sure each hex value is wrapped with quotes.",
2686
+ (choice) => {
2687
+ if (!choice) return;
2688
+
2689
+ const regex = /^#([a-fA-F0-9]{6})$/;
2690
+
2691
+ if (regex.test(choice)) {
2692
+ globals.paint_color = choice;
2693
+ return;
2694
+ }
2695
+
2696
+ try {
2697
+ const converted = choice.replace(/'/g, '"')
2698
+ const parsed = JSON.parse(converted);
2699
+
2700
+ if (Array.isArray(parsed)) {
2701
+ let valid = true;
2702
+ for (let value of parsed) {
2703
+ if (!regex.test(value)) {
2704
+ valid = false;
2705
+ break;
2706
+ }
2707
+ }
2708
+ if (valid) {
2709
+ globals.paint_color = parsed;
2710
+ return;
2711
+ }
2712
+ }
2713
+ } catch (e) {
2714
+ logMessage("Parse failed")
2715
+ console.log(e)
2716
+ }
2717
+
2718
+ logMessage("Invalid color or array of colors");
2719
+ console.log(`${choice}`)
2720
+ }
2721
+ );
2722
+ },
2723
+ tool(pixel) {
2724
+ if (!shiftDown) {
2725
+ pixel.color = pixelColorPick(pixel, globals.paint_color);
2726
+ }
2727
+ else if (Array.isArray(globals.paint_color)) {
2728
+ pixel.color = choose(globals.paint_color)
2729
+ }
2730
+ else {
2731
+ pixel.color = globals.paint_color
2732
+ }
2733
+ },
2734
+ category: "tools"
2735
+ };
2736
+
2737
+ globals.rCircle = false
2738
+ globals.rRGBLed = false
2739
+ globals.rCustomBomb = false
2740
+ dependOn("betterSettings.js", () => {
2741
+ var Reset = new SettingsTab("Reset");
2742
+ var resetCircle = new Setting("Reset circle value and radius on reset", "Reset circle", settingType.BOOLEAN, false, defaultValue = false);
2743
+ var resetRGBLed = new Setting("Reset RGB Led value on reset", "Reset RGB Led", settingType.BOOLEAN, false, defaultValue = false);
2744
+ var resetCustomBomb = new Setting("Reset Custom Bomb value on reset", "Reset Custom Bomb", settingType.BOOLEAN, false, defaultValue = false);
2745
+ Reset.registerSettings("Reset", resetRGBLed)
2746
+ Reset.registerSettings("Reset", resetCircle)
2747
+ Reset.registerSettings("Reset", resetCustomBomb)
2748
+ settingsManager.registerTab(Reset);
2749
+ runEveryTick(() => {
2750
+ if (resetCircle.value == true) {
2751
+ globals.rCircle = true
2752
+ } else globals.rCircle = false
2753
+ if (resetCustomBomb.value == true) {
2754
+ globals.rCustomBomb = true
2755
+ } else globals.rCustomBomb = false
2756
+ if (resetRGBLed.value == true) {
2757
+ globals.rRGBLed = true
2758
+ } else globals.rRGBLed = false
2759
+ })
2760
+ }, true)
2761
+
2762
+ elements.quartz = {
2763
+ color: ["#f0f0f0", "#ebebeb", "#f8f8f8"],
2764
+ grain: 0,
2765
+ conduct: 0.3,
2766
+ behavior: behaviors.WALL,
2767
+ onBreak(pixel) {
2768
+ if (Math.random() <= 0.2) {
2769
+ pixel.charge = 1
2770
+ }
2771
+ },
2772
+ onPress(pixel) {
2773
+ if (Math.random() <= 0.2) {
2774
+ pixel.charge = 1
2775
+ }
2776
+ },
2777
+ density: 2650,
2778
+ hardness: 0.7,
2779
+ breakInto: "quartz_powder",
2780
+ category: "solids"
2781
+ }
2782
+
2783
+ elements.quartz_powder = {
2784
+ color: ["#dddddd", "#e0e0e0", "#f0f0f0"],
2785
+ grain: 0,
2786
+ conduct: 0.3,
2787
+ behavior: behaviors.POWDER,
2788
+ onBreak(pixel) {
2789
+ if (Math.random() <= 0.2) {
2790
+ pixel.charge = 1
2791
+ }
2792
+ },
2793
+ density: 2650,
2794
+ hardness: 0.7,
2795
+ category: "powders"
2796
+ }
2797
+
2798
+ elements.carrot_seed = {
2799
+ color: '#925420',
2800
+ behavior: behaviors.STURDYPOWDER,
2801
+ cooldown: defaultCooldown,
2802
+ category: "life",
2803
+ tempHigh: 400,
2804
+ stateHigh: "fire",
2805
+ tempLow: -2,
2806
+ stateLow: "frozen_plant",
2807
+ burn: 50,
2808
+ burnTime: 20,
2809
+ state: "solid",
2810
+ tick(pixel) {
2811
+ let belowPixel = getPixel(pixel.x, pixel.y + 1)
2812
+ if (belowPixel && eLists.SOIL.includes(belowPixel.element) && Math.random() <= 0.05) {
2813
+ changePixel(belowPixel, "carrot")
2814
+ belowPixel.stage = 1
2815
+ belowPixel.connected = true
2816
+ changePixel(pixel, "plant")
2817
+ }
2818
+ }
2819
+ }
2820
+
2821
+
2822
+ elements.carrot = {
2823
+ color: ["#ec9a00", "#d67200"],
2824
+ behavior: behaviors.STURDYPOWDER,
2825
+ category: "food",
2826
+ density: 700,
2827
+ isFood: true,
2828
+ breakInto: "juice",
2829
+ breakIntoColor: "#ffa600",
2830
+ hoverStat(pixel) {
2831
+ if (pixel.stage) return pixel.stage
2832
+ else return 0;
2833
+ },
2834
+ tick(pixel) {
2835
+ let belowPixel = getPixel(pixel.x, pixel.y + 1)
2836
+ if (getPixel(pixel.x, pixel.y - 1) && getPixel(pixel.x, pixel.y - 1).element != "carrot" && getPixel(pixel.x, pixel.y - 1).element != "plant") {
2837
+ pixel.connected = false;
2838
+ }
2839
+ if (!getPixel(pixel.x, pixel.y - 1)) {
2840
+ pixel.connected = false
2841
+ }
2842
+ if (pixel.stage == 1 && Math.random() <= 0.05 && belowPixel && eLists.SOIL.includes(belowPixel.element) && pixel.connected) {
2843
+ changePixel(belowPixel, "carrot");
2844
+ let newStage;
2845
+ if (Math.random() <= 0.3) newStage = 1; else newStage = 2;
2846
+ belowPixel.stage = newStage
2847
+ belowPixel.connected = true
2848
+ }
2849
+ else if (pixel.stage == 2) {
2850
+ if (Math.random() <= 0.1 && belowPixel && eLists.SOIL.includes(belowPixel.element) && pixel.connected) {
2851
+ changePixel(belowPixel, "root")
2852
+ }
2853
+ }
2854
+ }
2855
+ }
2856
+
2857
+ function factorial(n) {
2858
+ if (n < 0) throw new Error("Factorial not defined for negative numbers");
2859
+ let result = 1;
2860
+ for (let i = 2; i <= Number(n); i++) {
2861
+ result *= i;
2862
+ }
2863
+ return result;
2864
+ }
2865
+
2866
+ function parseEquation(eq) {
2867
+ eq = eq.replace(/\s+/g, "");
2868
+
2869
+ let tokens = [];
2870
+ let current_num = "";
2871
+
2872
+ for (let i = 0; i < eq.length; i++) {
2873
+ // Multi-character constants
2874
+ if (eq.startsWith("pi", i)) {
2875
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); current_num = ""; }
2876
+ tokens.push(Math.PI);
2877
+ i++;
2878
+ continue;
2879
+ }
2880
+ if (eq.startsWith("phi", i)) {
2881
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); current_num = ""; }
2882
+ tokens.push(1.6180339887);
2883
+ i += 2;
2884
+ continue;
2885
+ }
2886
+ // Multi-character functions
2887
+ if (eq.startsWith("sqrt", i)) {
2888
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); current_num = ""; }
2889
+ tokens.push("sqrt");
2890
+ i += 3; // skip 'qrt'
2891
+ continue;
2892
+ }
2893
+
2894
+ let char = eq[i];
2895
+
2896
+ if (/[0-9.]/.test(char)) {
2897
+ current_num += char;
2898
+ } else {
2899
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); current_num = ""; }
2900
+
2901
+ if (char === "-" && (i === 0 || /[+\-*/(]/.test(eq[i - 1]))) {
2902
+ current_num = "-";
2903
+ }
2904
+ else if (char === "e") { tokens.push(Math.E); }
2905
+ else if (char === "π") { tokens.push(Math.PI); }
2906
+ else if (char === "φ") { tokens.push(1.6180339887); }
2907
+ else if (char === "×") { tokens.push("*"); }
2908
+ else if (char === "÷") { tokens.push("/"); }
2909
+ else { tokens.push(char); }
2910
+ }
2911
+ }
2912
+
2913
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); }
2914
+
2915
+ // Implicit multiplication
2916
+ let fixed = [];
2917
+ for (let i = 0; i < tokens.length; i++) {
2918
+ fixed.push(tokens[i]);
2919
+ let curr = tokens[i];
2920
+ let next = tokens[i + 1];
2921
+
2922
+ if (
2923
+ (typeof curr === "number" && next === "(") ||
2924
+ (curr === ")" && typeof next === "number") ||
2925
+ (curr === ")" && next === "(") ||
2926
+ (typeof curr === "number" && next === "sqrt") // implicit multiplication with functions
2927
+ ) {
2928
+ fixed.push("*");
2929
+ }
2930
+ }
2931
+
2932
+ return fixed;
2933
+ }
2934
+
2935
+
2936
+ function evaluate(tokens) {
2937
+ function helper(start = 0) {
2938
+ let stack = [];
2939
+ let i = start;
2940
+
2941
+ while (i < tokens.length) {
2942
+ let token = tokens[i];
2943
+
2944
+ if (typeof token === "number") {
2945
+ stack.push(token);
2946
+
2947
+ // Check for factorial
2948
+ if (tokens[i + 1] === "!") {
2949
+ stack[stack.length - 1] = factorial(stack[stack.length - 1]);
2950
+ i++; // skip the '!' token
2951
+ }
2952
+ }
2953
+ else if (token === "sqrt") {
2954
+ let [val, nextIndex] = helper(i + 1);
2955
+ stack.push(Math.sqrt(val));
2956
+
2957
+ // Check for factorial after function
2958
+ if (tokens[nextIndex + 1] === "!") {
2959
+ stack[stack.length - 1] = factorial(stack[stack.length - 1]);
2960
+ nextIndex++;
2961
+ }
2962
+
2963
+ i = nextIndex;
2964
+ }
2965
+ else if (token === "(") {
2966
+ let [val, nextIndex] = helper(i + 1);
2967
+ stack.push(val);
2968
+
2969
+ // Factorial for parentheses
2970
+ if (tokens[nextIndex + 1] === "!") {
2971
+ stack[stack.length - 1] = factorial(stack[stack.length - 1]);
2972
+ nextIndex++;
2973
+ }
2974
+
2975
+ i = nextIndex;
2976
+ }
2977
+ else if (token === ")") {
2978
+ break;
2979
+ }
2980
+ else {
2981
+ // operator
2982
+ stack.push(token);
2983
+ }
2984
+ i++;
2985
+ }
2986
+
2987
+
2988
+ // First handle * and /
2989
+ for (let j = 0; j < stack.length; j++) {
2990
+ if (stack[j] === "*" || stack[j] === "/") {
2991
+ let left = stack[j - 1];
2992
+ let right = stack[j + 1];
2993
+ let result = stack[j] === "*" ? left * right : left / right;
2994
+ stack.splice(j - 1, 3, result);
2995
+ j--;
2996
+ }
2997
+ }
2998
+
2999
+ // Then handle + and -
3000
+ for (let j = 0; j < stack.length; j++) {
3001
+ if (stack[j] === "+" || stack[j] === "-") {
3002
+ let left = stack[j - 1];
3003
+ let right = stack[j + 1];
3004
+ let result = stack[j] === "+" ? left + right : left - right;
3005
+ stack.splice(j - 1, 3, result);
3006
+ j--;
3007
+ }
3008
+ }
3009
+
3010
+ return [stack[0], i];
3011
+ }
3012
+
3013
+ return helper(0)[0];
3014
+ }
3015
+
3016
+ function calculate(expr) {
3017
+ let tokens = parseEquation(expr);
3018
+ return evaluate(tokens);
3019
+ }
3020
+
3021
+ elements.calculator = {
3022
+ canPlace: false,
3023
+ onSelect() {
3024
+ promptInput("Input your equation", (eq) => {
3025
+ try {
3026
+ let ans = calculate(eq)
3027
+ if (ans == Infinity) {
3028
+ logMessage("Division by 0 error")
3029
+ return;
3030
+ }
3031
+ if (isNaN(ans)) {
3032
+ logMessage("Error")
3033
+ return;
3034
+ }
3035
+ logMessage(Number(ans.toFixed(10)))
3036
+ }
3037
+ catch (e) {
3038
+ logMessage("Invalid Characters Detected")
3039
+ console.log(e)
3040
+ }
3041
+ })
3042
+ },
3043
+ category: "tools"
3044
+ }
3045
+
3046
+ elements.random_teleporter = {
3047
+ buttonColor: ["#5fdaff", "#dd8500"],
3048
+ color: "#5fdaff",
3049
+ grain: 0,
3050
+ tick(pixel) {
3051
+ // Color fading
3052
+ pixel.fadeTo ??= "orange"
3053
+ pixel.colorStay ??= 30
3054
+ if (pixel.fadeTo === "orange") {
3055
+ if (pixel.colorStay > 0) {
3056
+ let ratio = pixel.colorStay / 30
3057
+ pixel.color = fadeColor("#dd8500", "#5fdaff", ratio)
3058
+ pixel.colorStay--
3059
+ } else pixel.fadeTo = "blue";
3060
+ } else {
3061
+ if (30 - pixel.colorStay > 0) {
3062
+ let ratio = (30 - pixel.colorStay) / 30
3063
+ pixel.color = fadeColor("#5fdaff", "#dd8500", ratio)
3064
+ pixel.colorStay++
3065
+ } else pixel.fadeTo = "orange";
3066
+ }
3067
+
3068
+ for (var i = 0; i < squareCoords.length; i++) {
3069
+ let coord = squareCoords[i];
3070
+ let x = pixel.x + coord[0];
3071
+ let y = pixel.y + coord[1];
3072
+ if (!isEmpty(x, y)) {
3073
+ let p = getPixel(x, y)
3074
+ if (!p) return;
3075
+ if (elements[p.element]?.hardness === 1) return;
3076
+ let availableCoords = [];
3077
+ for (let j = 0; j <= width; j++) {
3078
+ for (let k = 0; k <= height; k++) {
3079
+ if (isEmpty(j, k)) {
3080
+ availableCoords.push([j, k])
3081
+ }
3082
+ }
3083
+ }
3084
+ if (availableCoords.length > 0) {
3085
+ let newCoords = choose(availableCoords)
3086
+ tryMove(p, newCoords[0], newCoords[1])
3087
+ }
3088
+ }
3089
+ }
3090
+ },
3091
+ hardness: 1,
3092
+ behavior: behaviors.WALL,
3093
+ renderer: renderPresets.BORDER,
3094
+ category: "machines"
3095
+ }
3096
+
3097
+ elements.fill_all = {
3098
+ color: "#ae4cd9",
3099
+ behavior: behaviors.WALL,
3100
+ category: "special",
3101
+ reactions: {
3102
+ "neutron": { elem1: "lattice" },
3103
+ "proton": { elem1: "vertical" },
3104
+ "electric": { elem1: "horizontal" },
3105
+ "positron": { elem1: "vertical" },
3106
+ "plasma": { elem1: "armageddon", tempMin: 500, charged: true }
3107
+ },
3108
+ density: 1834,
3109
+ tick(pixel) {
3110
+ for (let x = 0; x <= width; x++) {
3111
+ for (let y = 0; y <= height; y++) {
3112
+ tryCreate("filler", x, y)
3113
+ }
3114
+ }
3115
+ changePixel(pixel, "filler")
3116
+ },
3117
+ maxSize: 1,
3118
+ excludeRandom: true
3119
+ }
3120
+
3121
+ globals.elemFillAll = "sand"
3122
+ elements.element_fill_all = {
3123
+ color: "#ae4cd9",
3124
+ behavior: behaviors.WALL,
3125
+ category: "special",
3126
+ excludeRandom: true,
3127
+ reactions: {
3128
+ "neutron": { elem1: "lattice" },
3129
+ "proton": { elem1: "vertical" },
3130
+ "electric": { elem1: "horizontal" },
3131
+ "positron": { elem1: "vertical" },
3132
+ "plasma": { elem1: "armageddon", tempMin: 500, charged: true }
3133
+ },
3134
+ onSelect() {
3135
+ promptInput("What element should this filler fill", (elem) => {
3136
+ let el = mostSimilarElement(elem)
3137
+ if (el) {
3138
+ globals.elemFillAll = el
3139
+ }
3140
+ }, "Element Prompt")
3141
+ },
3142
+ tick(pixel) {
3143
+ for (let x = 0; x <= width; x++) {
3144
+ for (let y = 0; y <= height; y++) {
3145
+ tryCreate(globals.elemFillAll, x, y)
3146
+ }
3147
+ }
3148
+ changePixel(pixel, globals.elemFillAll)
3149
+ },
3150
+ maxSize: 1,
3151
+ }
3152
+
3153
+ globals.pulsecol1 = "#ffffff"
3154
+ globals.pulsecol2 = "#000000"
3155
+ elements.pulsing_color = {
3156
+ buttonColor: rainbowColor,
3157
+ behavior: behaviors.WALL,
3158
+ category: "special",
3159
+ onSelect() {
3160
+ promptInput("Input the starting color of the pulse in hex", (col1) => {
3161
+ if (col1) {
3162
+ if (/^#([A-Fa-f0-9]{6})$/.test(col1)) {
3163
+ globals.pulsecol1 = col1
3164
+ promptInput("Input the second color that it should pulse to", (col2) => {
3165
+ if (col2) {
3166
+ if (/^#([A-Fa-f0-9]{6})$/.test(col2)) {
3167
+ globals.pulsecol2 = col2
3168
+ }
3169
+ }
3170
+ })
3171
+ }
3172
+ }
3173
+ })
3174
+ },
3175
+ onPlace(pixel) {
3176
+ pixel.color = globals.pulsecol1
3177
+ },
3178
+ tick(pixel) {
3179
+ // 1 = fade to color 2, 0 = fade to color 1
3180
+ let frames = 30
3181
+ pixel.fadeTo ??= 1
3182
+ pixel.colorStay ??= frames
3183
+ pixel.col1 ??= globals.pulsecol1
3184
+ pixel.col2 ??= globals.pulsecol2
3185
+ if (pixel.fadeTo === 1) {
3186
+ if (pixel.colorStay > 0) {
3187
+ let ratio = pixel.colorStay / frames
3188
+ pixel.color = fadeColor(pixel.col2, pixel.col1, ratio)
3189
+ pixel.colorStay--
3190
+ } else pixel.fadeTo = 0;
3191
+ } else {
3192
+ if (frames - pixel.colorStay > 0) {
3193
+ let ratio = (frames - pixel.colorStay) / frames
3194
+ pixel.color = fadeColor(pixel.col1, pixel.col2, ratio)
3195
+ pixel.colorStay++
3196
+ } else pixel.fadeTo = 1;
3197
+ }
3198
+ }
3199
+ }
3200
+
3201
+ globals.createElemWDir = "wood"
3202
+ globals.lineDir = 0
3203
+ elements.element_line = {
3204
+ color: "#d9d9d9",
3205
+ behavior: behaviors.WALL,
3206
+ category: "special",
3207
+ hidden: true,
3208
+ excludeRandom: true,
3209
+ insulate: true,
3210
+ movable: false,
3211
+ onSelect() {
3212
+ promptInput("Input the element it should use", (input) => {
3213
+ if (!input) return;
3214
+ let elem = mostSimilarElement(input)
3215
+ if (elem) {
3216
+ globals.createElemWDir = elem
3217
+ }
3218
+ promptDir("Choose The direction the line should draw in", (dir) => {
3219
+ globals.lineDir = dir
3220
+ }, "Direction Input")
3221
+ }, "Element Input")
3222
+ },
3223
+ onPlace(pixel) {
3224
+ pixel.clone ??= globals.createElemWDir
3225
+ pixel.dir ??= globals.lineDir
3226
+ },
3227
+ tick(pixel) {
3228
+ if (pixel.dir === 0) {
3229
+ if (!tryMove(pixel, pixel.x + 1, pixel.y, pixel.clone)) {
3230
+ changePixel(pixel, pixel.clone, true)
3231
+ }
3232
+ }
3233
+ if (pixel.dir === 1) {
3234
+ if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) {
3235
+ changePixel(pixel, pixel.clone, true)
3236
+ }
3237
+ }
3238
+ if (pixel.dir === 2) {
3239
+ if (!tryMove(pixel, pixel.x + 1, pixel.y, pixel.clone)) {
3240
+ changePixel(pixel, pixel.clone, true)
3241
+ }
3242
+ }
3243
+ if (pixel.dir === 3) {
3244
+ if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) {
3245
+ changePixel(pixel, pixel.clone, true)
3246
+ }
3247
+ }
3248
+ }
3249
+ }
3250
+
3251
+ function getSquareCoords(pixel) {
3252
+ let x, y;
3253
+ for (let i = 0; i < squareCoords.length; i++) {
3254
+ let coord = squareCoords[i];
3255
+ x = pixel.x + coord[0];
3256
+ y = pixel.y + coord[1];
3257
+ }
3258
+ return { x, y }
3259
+ }
3260
+
3261
+ function getAdjacentCoords(pixel) {
3262
+ let x, y;
3263
+ for (let i = 0; i < adjacentCoords.length; i++) {
3264
+ x = pixel.x + adjacentCoords[i][0];
3265
+ y = pixel.y + adjacentCoords[i][1];
3266
+ }
3267
+ return { x, y }
3268
+ }
3269
+
3270
+ function getSquareCoordsShuffle(pixel) {
3271
+ shuffleArray(squareCoordsShuffle);
3272
+ let x, y;
3273
+ for (var i = 0; i < squareCoordsShuffle.length; i++) {
3274
+ var coord = squareCoordsShuffle[i];
3275
+ x = pixel.x + coord[0];
3276
+ y = pixel.y + coord[1];
3277
+ }
3278
+ return { x, y }
3279
+ }
3280
+
3281
+ function getAdjacentCoordsShuffle(pixel) {
3282
+ shuffleArray(adjacentCoordsShuffle)
3283
+ let x, y
3284
+ for (var i = 0; i < adjacentCoordsShuffle.length; i++) {
3285
+ x = pixel.x + adjacentCoordsShuffle[i][0];
3286
+ y = pixel.y + adjacentCoordsShuffle[i][1];
3287
+ }
3288
+ return { x, y }
3289
+ }
3290
+
3291
+ function getScreenCoords() {
3292
+ let coords = []
3293
+ for (let x = 0; x <= width; x++) {
3294
+ for (let y = 0; y <= height; y++) {
3295
+ coords.push([x, y])
3296
+ }
3297
+ }
3298
+ return coords
3299
+ }
3300
+
3301
+ globals.replaceElem = "wood"
3302
+ elements.replace_all_of_element = {
3303
+ color: ["#35008a", "#000000"],
3304
+ category: "tools",
3305
+ onSelect() {
3306
+ promptInput("What should it change into?", (input) => {
3307
+ if (!input) return;
3308
+ let elem = mostSimilarElement(input)
3309
+ if (elem) {
3310
+ globals.replaceElem = elem
3311
+ }
3312
+ }, "Element Prompt")
3313
+ },
3314
+ tool(pixel) {
3315
+ let elem = pixel.element
3316
+ if (elem === globals.replaceElem) return
3317
+
3318
+ for (let row of pixelMap) {
3319
+ for (let p of row) {
3320
+ if (p?.element === elem) {
3321
+ changePixel(p, globals.replaceElem)
3322
+ }
3323
+ }
3324
+ }
3325
+ }
3326
+ }
3327
+
3328
+
3329
+