diff --git a/README.md b/README.md index dfa4a21d..66e6eeaa 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # Sandboxels -A falling sand simulation game. +A falling sand simulation game with hundreds of elements, heat simulation, chemical reactions, fire, density, electricity, and more. -Play at [Sandboxels.R74n.com](https://sandboxels.r74n.com/). +Play for free at [Sandboxels.R74n.com](https://sandboxels.r74n.com/). Join the [Discord server](https://discord.com/invite/ejUc6YPQuS). -![Landscape made in Sandboxels](https://raw.githubusercontent.com/R74nCom/sandboxels/main/icons/wallpaper.png) +![Landscape made in Sandboxels](https://raw.githubusercontent.com/R74nCom/sandboxels/main/icons/cover-3840x1240px-text.png) # Controls * Left Click = Draw pixels @@ -29,7 +29,7 @@ Join the [Discord server](https://discord.com/invite/ejUc6YPQuS). # Button Info * Pause = Pause/play the simulation - * Step = Run a single frame + * Step (>) = Run a single frame * Minus (-) = Decrease the cursor size * Plus (+) = Increase the cursor size * Reset = Clears the entire simulation @@ -37,5 +37,6 @@ Join the [Discord server](https://discord.com/invite/ejUc6YPQuS). * E = Select any element by name * TPS = Change how fast the simulation runs * Info = Open the element info screen + * Saves = Open the Save & Load menu * Mods = Open the Mod Manager * Settings = Open the settings menu diff --git a/ads.txt b/ads.txt deleted file mode 100644 index c180742e..00000000 --- a/ads.txt +++ /dev/null @@ -1,410 +0,0 @@ -ownerdomain=r74n.com -managerdomain=venatus.com -#V 07.02.2025 VH -#P - - -#----------------------------------------------------------------------------# -# . # -# .o8 # -# oooo ooo .ooooo. ooo. .oo. .oooo. .o888oo oooo oooo .oooo.o # -# `88. .8' d88' `88b `888P"Y88b `P )88b 888 `888 `888 d88( "8 # -# `88..8' 888ooo888 888 888 .oP"888 888 888 888 `"Y88b. # -# `888' 888 . 888 888 d8( 888 888 . 888 888 o. )88b # -# `8' `Y8bod8P' o888o o888o `Y888""8o "888" `V88V"V8P' 8""888P' # -# # -# The leading advertising solution for gaming and entertainment # -# # -# To become a publisher or advertise please contact info@venatus.com # -# # -#----------------------------------------------------------------------------# -adagio.io, 1090, DIRECT # Adagio_0_6 -rubiconproject.com, 19116, RESELLER, 0bfd66d529a55807 # Adagio_0_6 -pubmatic.com, 159110, RESELLER, 5d62403b186f2ace # Adagio_0_6 -rubiconproject.com, 16414, RESELLER, 0bfd66d529a55807 # Adagio_0_6 -lijit.com, 367236, RESELLER, fafdf38b16bf6b2b # Adagio_0_6 -improvedigital.com, 1790, RESELLER # Adagio_0_6 -triplelift.com, 13482, RESELLER, 6c33edb13117fd86 # Adagio_0_6 -rubiconproject.com, 12186, RESELLER, 0bfd66d529a55807 # Adagio_0_6 -video.unrulymedia.com, 5672421953199218469, RESELLER # Adagio_0_6 -amxrtb.com, 105199358, DIRECT # AdaptMX_1_6&7 -amxrtb.com, 105199778, DIRECT # AdaptMX_Ozone -indexexchange.com, 191503, RESELLER # AdaptMX_1_6&7 -appnexus.com, 12290, RESELLER # AdaptMX_1_6&7 -pubmatic.com, 158355, RESELLER, 5d62403b186f2ace # AdaptMX_1_6&7 -rubiconproject.com, 23844, RESELLER, 0bfd66d529a55807 # AdaptMX_1_6&7 -openx.com, 559680764, RESELLER, 6a698e2ec38604c6 # AdaptMX_1_6&7 -adform.com, 2767, RESELLER # Adform_0_6&7 -adyoulike.com, c1314a52de718f3c214c00173d2994f9, DIRECT # AdYouLike_0_6 -pubmatic.com, 160925, RESELLER, 5d62403b186f2ace # AdYouLike_0_6 -rubiconproject.com, 20736, RESELLER, 0bfd66d529a55807 # AdYouLike_0_6 -appnexus.com, 7664, RESELLER # AdYouLike_0_6 -alkimiexchange.com , 4245 , Direct # Alkimi -aps.amazon.com,70247b00-ff8f-4016-b3ab-8344daf96e09,DIRECT # Amazon_3_6&7 -aniview.com, 5f2063121d82c82557194737, RESELLER, 78b21b97965ec3f8 # Aniview -aniview.com, 643f8e74688b10f72307cc24, DIRECT, 78b21b97965ec3f8 # Aniview -google.com, pub-6346866704322274, RESELLER, f08c47fec0942fa0 # Aniview -pubmatic.com, 160993, RESELLER, 5d62403b186f2ace # Aniview -rubiconproject.com, 13918, RESELLER, 0bfd66d529a55807 # Aniview -google.com, pub-5717092533913515, RESELLER, f08c47fec0942fa0 # Aniview -gannett.com, 22652678936, RESELLER # Aniview -richaudience.com, 1ru8dKmJJV, RESELLER # Aniview -sharethrough.com, zLsEa05k, RESELLER, d53b998a7bd4ecd2 # Aniview -aps.amazon.com, 1ad7261b-91ea-4b6f-b9e9-b83522205b75, RESELLER # Aniview -pubmatic.com, 161335, RESELLER, 5d62403b186f2ace # Aniview -openx.com, 556532676, RESELLER, 6a698e2ec38604c6 # Aniview -mediago.io, 045ac24b888bcf59a09731e7f0f2084f, RESELLER # Baidu -blockthrough.com, 5643766199222272, DIRECT # Blockthrough -indexexchange.com, 194341, RESELLER, 50b1c356f2c5c8fc # Blockthrough -pubmatic.com, 160377, RESELLER, 5d62403b186f2ace # Blockthrough -onetag.com, 75804861b76a852, DIRECT # Blockthrough -amxrtb.com, 105199664, DIRECT # Blockthrough -criteo.com, B-062405, DIRECT, 9fac4a4a87c2a44f # Criteo_0_6&7 -themediagrid.com, CVQXOH, DIRECT, 35d5010d7789b49d # Criteo_0_6&7 -dxkulture.com, 1359, DIRECT, 259726033fc4df0c # DxKulture -zetaglobal.net,790,DIRECT # DxKulture -rubiconproject.com,26094,DIRECT,0bfd66d529a55807 # DxKulture -ssp.disqus.com,790,DIRECT # DxKulture -adswizz.com,dxkulture,DIRECT # DxKulture -adswizz.com,651,DIRECT # DxKulture -appnexus.com, 11716, RESELLER, f5ab79cb980f11d1 # Execute Media -freewheel.tv, 211121, DIRECT # Freewheel_0_7 -freewheel.tv, 211129-524565, DIRECT # Freewheel_OPG -freewheel.tv, 211129-169843, DIRECT # Freewheel_OPG -google.com, pub-5781531207509232, DIRECT, f08c47fec0942fa0 # Google_AdX_6&7 -google.com, pub-5781531207509232, RESELLER, f08c47fec0942fa0 # Google_AdX_6&7 -google.com, pub-2553634189837243, RESELLER, f08c47fec0942fa0 # Google_AdX_6&7 -gumgum.com, 13385, RESELLER, ffdef49475d318a9 # GumGum -gumgum.com, 14302, RESELLER, ffdef49475d318a9 # GumGum -rubiconproject.com, 23434, RESELLER, 0bfd66d529a55807 # GumGum -pubmatic.com, 157897, RESELLER, 5d62403b186f2ace # GumGum -indexexchange.com, 183921, DIRECT, 50b1c356f2c5c8fc # Index Exchange_0_6&7 -indexexchange.com, 193067, DIRECT, 50b1c356f2c5c8fc # Index Exchange_2_6&7 -indexexchange.com, 194127, DIRECT, 50b1c356f2c5c8fc # Index Exchange_7&4_6&7 -indexexchange.com, 205972, RESELLER, 50b1c356f2c5c8fc # Index Exchange_Oz -insticator.com,843c9a44-60ea-4342-8ad4-68f894283b3e,DIRECT,b3511ffcafb23a32 # Insticator -rubiconproject.com,17062,RESELLER,0bfd66d529a55807 # Insticator -video.unrulymedia.com,136898039,RESELLER # Insticator -pubmatic.com,95054,DIRECT,5d62403b186f2ace # Insticator -lijit.com,257618,RESELLER,fafdf38b16bf6b2b # Insticator -sharethrough.com,Q9IzHdvp,DIRECT,d53b998a7bd4ecd2 # Insticator -openx.com,558230700,RESELLER,6a698e2ec38604c6 # Insticator -kargo.com, 8688, DIRECT # Kargo_0_6 -rubiconproject.com, 13762, RESELLER, 0bfd66d529a55807 # Magnite_0&2_6&7 -media.net, 8CU8ARTF8, DIRECT # Media.net -Media.net, 8CU198XI2, DIRECT # Media.net -themediagrid.com, LTW57M, DIRECT, 35d5010d7789b49d # MediaGrid_2_6&7 -ogury.com, 086233d2-e8a8-44fc-907b-f0752e1c85de, DIRECT # Ogury_0_6 -appnexus.com, 11470, RESELLER # Ogury_0_6 -openx.com, 537144009, RESELLER, 6a698e2ec38604c6 # OpenX_0_6 -openx.com, 540134228, RESELLER, 6a698e2ec38604c6 # OpenX_0_7 -openx.com, 542378302, RESELLER, 6a698e2ec38604c6 # OpenX_2_6&7 -outbrain.com, 00cad1edda50a62c096c310d54360dfcdb, DIRECT # Outbrain -rubiconproject.com, 19668, RESELLER, 0bfd66d529a55807 # Outbrain -openx.com, 540393169, RESELLER, 6a698e2ec38604c6 # Outbrain -smaato.com, 1100048704, RESELLER, 07bcf65f187117b4 # Outbrain -the-ozone-project.com, ozoneven0005, DIRECT # Ozone_0_6 -openx.com, 540731760, RESELLER, 6a698e2ec38604c6 # Ozone_0_6 -pubmatic.com, 160557, RESELLER, 5d62403b186f2ace # Ozone_0_6 -themediagrid.com, WF71T3, DIRECT, 35d5010d7789b49d # Ozone_0_6 -Yahoo.com, 60170, DIRECT, e1a5b5b6e3255540 # Ozone_0_6 -primis.tech, 31136, DIRECT, b6b21d256ef43532 # Primis -pubmatic.com, 156595, RESELLER, 5d62403b186f2ace # Primis -google.com, pub-1320774679920841, RESELLER, f08c47fec0942fa0 # Primis -openx.com, 540258065, RESELLER, 6a698e2ec38604c6 # Primis -rubiconproject.com, 20130, RESELLER, 0bfd66d529a55807 # Primis -smartadserver.com, 3436, RESELLER, 060d053dcf45cbf3 # Primis -indexexchange.com, 191923, RESELLER, 50b1c356f2c5c8fc # Primis -Media.net, 8CU695QH7, RESELLER # Primis -triplelift.com, 8210, RESELLER, 6c33edb13117fd86 # Primis -appnexus.com,16007, RESELLER, f5ab79cb980f11d1 # Primis -pmc.com, 1240739, DIRECT, 8dd52f825890bb44 # Primis -rubiconproject.com, 10278, RESELLER, 0bfd66d529a55807 # Primis -video.unrulymedia.com, 776418614052335749, RESELLER # Primis -pubmatic.com, 159234, RESELLER, 5d62403b186f2ace # PubMatic_0_6&7 -pubmatic.com, 160552, RESELLER, 5d62403b186f2ace # PubMatic_4_7 -pubmatic.com, 159401, RESELLER, 5d62403b186f2ace # PubMatic_2_6&7 -pubmatic.com, 163598, RESELLER, 5d62403b186f2ace # Pubmatic_OW -pubmatic.com, 165533, RESELLER, 5d62403b186f2ace # Pubmatic_KR -richaudience.com, 1XvIoD5o0S, DIRECT # Rich Audience_0_6&7 -pubmatic.com, 81564, DIRECT, 5d62403b186f2ace # Rich Audience_0_6&7 -pubmatic.com, 156538, DIRECT, 5d62403b186f2ace # Rich Audience_0_6&7 -appnexus.com, 8233, DIRECT # Rich Audience_0_6&7 -rubiconproject.com, 13510, DIRECT # Rich Audience_0_6&7 -risecodes.com, 5fa94677b2db6a00015b22a9, DIRECT # Rise -pubmatic.com, 160295, RESELLER, 5d62403b186f2ace # Rise -xandr.com, 14082, RESELLER # Rise -rubiconproject.com, 23876, RESELLER, 0bfd66d529a55807 # Rise -sharethrough.com, 5926d422, RESELLER, d53b998a7bd4ecd2 # Rise -yieldmo.com, 2754490424016969782, RESELLER # Rise -media.net, 8CUQ6928Q, RESELLER # Rise -onetag.com, 69f48c2160c8113, RESELLER # Rise -amxrtb.com, 105199691, RESELLER # Rise -33across.com, 0010b00002Xbn7QAAR, RESELLER, bbea06d9c4d2853c # Rise -video.unrulymedia.com, 335119963, RESELLER # Rise -seedtag.com, 5aa6c80640c9e209009721e0, DIRECT # Seedtag -xandr.com, 4009, DIRECT, f5ab79cb980f11d1 # Seedtag -rubiconproject.com, 17280, DIRECT, 0bfd66d529a55807 # Seedtag -sharethrough.com, 31c129df, DIRECT, d53b998a7bd4ecd2 # Sharethrough_0_6&7 -sharethrough.com, awx1H4AI, RESELLER, d53b998a7bd4ecd2 # Sharethrough -pmc.com, 1242472, DIRECT, 8dd52f825890bb44 # She_Media -rubiconproject.com, 10278, RESELLER, 0bfd66d529a55807 # She_Media -smartadserver.com, 2161, RESELLER # Showheroes_7_8 -smartadserver.com, 3668, RESELLER # Showheroes_7_8 -showheroes.com, 6829, RESELLER # Showheroes_7_8 -smartadserver.com, 3490, DIRECT # Smart AdServer_0&1&2_6&7 -smartadserver.com, 4016, DIRECT # Smart AdServer_0&1&2_6&7 -smartadserver.com, 4074, DIRECT # Smart AdServer_0&1&2_6&7 -sonobi.com, 116da9d98c, DIRECT, d1a215d9eb5aee9e # Sonobi_0_6&7 -sonobi.com, e017850301, DIRECT, d1a215d9eb5aee9e # Sonobi_4_7 -sonobi.com, dc5f975b54, RESELLER, d1a215d9eb5aee9e # Sonobi_TAM -sonobi.com, 168faa72a7, RESELLER, d1a215d9eb5aee9e # Sonobi_Oz -sovrn.com, 237754, DIRECT, fafdf38b16bf6b2b # Sovrn_0&1&2_6&7 -lijit.com, 237754, DIRECT, fafdf38b16bf6b2b # Sovrn_0&1&2_6&7 -lijit.com, 506352, DIRECT, fafdf38b16bf6b2b # Sovrn_Ozone -tappx.com, 42745, DIRECT, 9f375a07da0318ec # Tappx -pubmatic.com, 158111, RESELLER, 5d62403b186f2ace # Tappx -sharethrough.com, 49574e61,RESELLER, d53b998a7bd4ecd2 # Tappx -smartadserver.com,1692, RESELLER,060d053dcf45cbf3 # Tappx -rubiconproject.com,13856,RESELLER,0bfd66d529a55807 # Tappx -video.unrulymedia.com,3341072718,RESELLER # Tappx -33across.com,0010b00001siQHqAAM,RESELLER,bbea06d9c4d2853c # Tappx -themediagrid.com,4FDQYH,RESELLER,35d5010d7789b49d # Tappx -triplelift.com, 6059, RESELLER, 6c33edb13117fd86 # Triplelift_0&2_6&7 -video.unrulymedia.com, 985572675, DIRECT # Unruly_0&2_7 -video.unrulymedia.com, 985572675, RESELLER # Unruly_0&2_7 -sharethrough.com, 6qlnf8SY, RESELLER, d53b998a7bd4ecd2 # Unruly -pubmatic.com, 156512, DIRECT # Wunderkind -indexexchange.com, 183753, DIRECT # Wunderkind -wunderkind.co, 6438, DIRECT # Wunderkind -wunderkind.co, 6449, DIRECT # Wunderkind -criteo.com, B-068503, DIRECT # Wunderkind -appnexus.com, 806, DIRECT, f5ab79cb980f11d1 # Xandr_0&2_6&7 -appnexus.com,1908,RESELLER,f5ab79cb980f11d1 # Xandr_0&2_6&7 -google.com, pub-3282547114800347, RESELLER, f08c47fec0942fa0 -adinplay.com, FTB, DIRECT - - - - - -# Kueez -kueez.com,e5b6208bc94ed2d5788e1e4c1cf5452e, DIRECT -rubiconproject.com, 16920, RESELLER, 0bfd66d529a55807 -openx.com, 557564833, RESELLER, 6a698e2ec38604c6 -Pubmatic.com, 162110, RESELLER, 5d62403b186f2ace -lijit.com, 407406, RESELLER, fafdf38b16bf6b2b #SOVRN -sharethrough.com, n98xDzeL, RESELLER, d53b998a7bd4ecd2 -sonobi.com, 4c4fba1717, RESELLER, d1a215d9eb5aee9e -appnexus.com, 8826,RESELLER, f5ab79cb980f11d1 -33across.com, 0010b00002ODU4HAAX, RESELLER, bbea06d9c4d2853c -Media.net,8CU4JTRF9, RESELLER - -# PGAM -pgamssp.com, 634dc90283fff00f005151f2, DIRECT -amxrtb.com, 105199776, RESELLER -pubmatic.com, 162623, RESELLER, 5d62403b186f2ace -rubiconproject.com, 24852, RESELLER, 0bfd66d529a55807 -onetag.com, 87f80e5d9d55274, RESELLER -freewheel.tv, 1489202, RESELLER - -#Yieldmo -yieldmo.com, 2440034636282143652, DIRECT -rubiconproject.com, 17070, RESELLER, 0bfd66d529a55807 -pubmatic.com, 160648, RESELLER, 5d62403b186f2ace -contextweb.com, 561118, RESELLER, 89ff185a4c4e857c -conversantmedia.com, 100270, RESELLER, 03113cd04947736d -appnexus.com, 7911, RESELLER - -# OptiDigital -optidigital.com,p230,DIRECT -pubmatic.com,158939,RESELLER,5d62403b186f2ace -rubiconproject.com,20336,RESELLER,0bfd66d529a55807 -smartadserver.com,3379,RESELLER,060d053dcf45cbf3 -criteo.com,B-060926,RESELLER,9fac4a4a87c2a44f -appnexus.com,12190,RESELLER,f5ab79cb980f11d1 -triplelift.com,8183,RESELLER,6c33edb13117fd86 - -# NHace -acexchange.co.kr, 1908143852, RESELLER -loopme.com, 11544, RESELLER, 6c8d5f95897a5a3b -smartyads.com, 300036, RESELLER, fd2bde0ff2e62c5d -yeahmobi.com, 5135284, Reseller - -# Smaato -smaato.com, 1100055690, DIRECT, 07bcf65f187117b4 -smaato.com, 1100049216, DIRECT, 07bcf65f187117b5 -rubiconproject.com, 24600, RESELLER, 0bfd66d529a55807 -sharethrough.com, iBAzay96, RESELLER, d53b998a7bd4ecd2 -pubmatic.com, 156177, RESELLER, 5d62403b186f2ace - -# OMS Test -onlinemediasolutions.com, 21009, DIRECT -pubmatic.com, 161332, RESELLER, 5d62403b186f2ace -amxrtb.com, 105199514, RESELLER -yieldmo.com, 2757543169808605705, RESELLER -audienciad.com, 210092, DIRECT -rubiconproject.com, 20416, RESELLER, 0bfd66d529a55807 -onomagic.com, 210091, DIRECT -lijit.com, 374814, RESELLER, fafdf38b16bf6b2b -onetag.com, 75753f1ebcc343c, RESELLER -openx.com, 537153209, RESELLER, 6a698e2ec38604c6 -video.unrulymedia.com, 6694405583287859332, RESELLER -appnexus.com, 11801, RESELLER -onetag.com, 7b561459c997848, RESELLER -appnexus.com, 15629, RESELLER, f5ab79cb980f11d1 -aps.amazon.com, 48266a61-b3d9-4cb7-b172-553abc6a42a4, DIRECT -indexexchange.com, 197494, RESELLER, 50b1c356f2c5c8fc -pubmatic.com, 163517, RESELLER, 5d62403b186f2ace -advibe.media, 821009, DIRECT -loopme.com, 12733, RESELLER, 6c8d5f95897a5a3b -rubiconproject.com, 24364, RESELLER, 0bfd66d529a55807 -getmediamx.com, 1221009, DIRECT -smartadserver.com, 4483, RESELLER -limpid.tv, 921009, DIRECT -rubiconproject.com, 25722, RESELLER, 0bfd66d529a55807 -sonobi.com, 3aed893727, RESELLER, d1a215d9eb5aee9e -Media.net, 8CUB46Z7R, RESELLER -themediagrid.com, IRK975, RESELLER, 35d5010d7789b49d -sharethrough.com, UxId3u8j, RESELLER, d53b998a7bd4ecd2 -pmc.com, 1242344, DIRECT, 8dd52f825890bb44 -rubiconproject.com, 10278, RESELLER, 0bfd66d529a55807 -adyoulike.com, e9a771d72c076dbe3cafc2c6477f9238, RESELLER - -# Adsolut Test -Adsolut.in, 17582, DIRECT -Playstream.media, 2713, DIRECT -Pubmatic.com, 164692, RESELLER, 5d62403b186f2ace -pubmatic.com, 162175, RESELLER, 5d62403b186f2ace -openx.com, 560878260, RESELLER, 6a698e2ec38604c6 -openx.com, 557904194, RESELLER, 6a698e2ec38604c6 -rubiconproject.com, 24872, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 24874, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 26768, RESELLER, 0bfd66d529a55807 -pubmatic.com, 159727, RESELLER, 5d62403b186f2ace -pubmatic.com, 157742, RESELLER, 5d62403b186f2ace -pubmatic.com, 157569, RESELLER, 5d62403b186f2ace -pubmatic.com, 159941, RESELLER, 5d62403b186f2ace -xandr.com, 9988, RESELLER -appnexus.com, 9988, RESELLER -teads.tv, 25843, DIRECT, 15a9c44f6d26cbe1 -vdopia.com, 15364, DIRECT, 49a66ce31a704197 #video -chocolateplatform.com, 15364, DIRECT, 49a66ce31a704197 #video -vdopia.com, 15364, DIRECT, 49a66ce31a704197 #banner -chocolateplatform.com, 15364, DIRECT, 49a66ce31a704197 #banner -smartadserver.com, 4164, DIRECT, 060d053dcf45cbf3 -smartadserver.com, 4164, RESELLER, 060d053dcf45cbf3 -smartadserver.com, 4164-OB, RESELLER, 060d053dcf45cbf3 -contextweb.com, 560288, RESELLER, 89ff185a4c4e857c -pubmatic.com, 156439, RESELLER, 5d62403b186f2ace -pubmatic.com, 154037, RESELLER, 5d62403b186f2ace -rubiconproject.com, 16114, RESELLER, 0bfd66d529a55807 -openx.com, 537149888, RESELLER, 6a698e2ec38604c6 -appnexus.com, 3703, RESELLER, f5ab79cb980f11d1 -loopme.com, 5679, RESELLER, 6c8d5f95897a5a3b -xad.com, 958, RESELLER, 81cbf0a75a5e0e9a -rhythmone.com, 2564526802, RESELLER, a670c89d4a324e47 -smaato.com, 1100044045, RESELLER, 07bcf65f187117b4 -pubnative.net, 1006576, RESELLER, d641df8625486a7b -verve.com, 15503, RESELLER, 0c8f5958fc2d6270 -adyoulike.com, b4bf4fdd9b0b915f746f6747ff432bde, RESELLER -axonix.com, 57264, RESELLER -admanmedia.com, 43, RESELLER -smartadserver.com, 4012, RESELLER -smartadserver.com, 4016, RESELLER -smartadserver.com, 4071, RESELLER -smartadserver.com, 4073, RESELLER -smartadserver.com, 4074, RESELLER -criteo.com, B-068838, DIRECT, 9fac4a4a87c2a44f -themediagrid.com, Q6VXLE, DIRECT, 35d5010d7789b49d -aps.amazon.com,5d8ed25e-57cc-441a-b62a-127b34faae4e, DIRECT -telaria.com,4pco5-ef5so,RESELLER,1a4e959a1b50034a -tremorhub.com,4pco5-ef5so,RESELLER,1a4e959a1b50034a -springserve.com, 2112, RESELLER, a24eb641fc82e93d - -# Nobid Test -nobid.io, 22629800915, DIRECT -zetaglobal.net, 693, DIRECT -sharethrough.com, aRE1degH, RESELLER, d53b998a7bd4ecd2 -rubiconproject.com, 18694, RESELLER, 0bfd66d529a55807 -pubmatic.com, 156557, RESELLER -lijit.com, 273657, RESELLER, fafdf38b16bf6b2b -rubiconproject.com, 24434, RESELLER, 0bfd66d529a55807 -amxrtb.com, 105199579, RESELLER -appnexus.com, 12290, RESELLER -lijit.com, 260380, RESELLER -xandr.com, 11429, RESELLER, f5ab79cb980f11d1 -onetag.com, 694e68b73971b58, RESELLER - -# Onetag Test -onetag.com, 59c7d7f65f9d658, DIRECT -appnexus.com, 13099, RESELLER -pubmatic.com, 161593, RESELLER, 5d62403b186f2ace -rubiconproject.com, 11006, RESELLER, 0bfd66d529a55807 - -# Pulsepoint Test -Contextweb.com,563522,DIRECT,89ff185a4c4e857c -rubiconproject.com, 26184, RESELLER, 0bfd66d529a55807 -iqzone.com,IQ272,RESELLER -mediafuse.com, 720, RESELLER -appnexus.com, 9538, RESELLER, f5ab79cb980f11d1 -sovrn.com, 253233, RESELLER, fafdf38b16bf6b2b -lijit.com, 253233, RESELLER, fafdf38b16bf6b2b -loopme.com, 11436, RESELLER, 6c8d5f95897a5a3b - -# NextMillennium Test -nextmillennium.io, 16749, DIRECT, 65bd090fa4a1e3d6 -admagnetix.io, 201898, DIRECT -appnexus.com, 9284, DIRECT, f5ab79cb980f11d1 -appnexus.com, 15799, DIRECT, f5ab79cb980f11d1 -rubiconproject.com, 17888, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 26296, RESELLER, 0bfd66d529a55807 -pubmatic.com, 157577, DIRECT, 5d62403b186f2ace -pubmatic.com, 164400, RESELLER, 5d62403b186f2ace -indexexchange.com, 194648, RESELLER, 50b1c356f2c5c8fc -indexexchange.com, 207985, RESELLER, 50b1c356f2c5c8fc -openx.com, 540224251, DIRECT, 6a698e2ec38604c6 -openx.com, 540225743, DIRECT, 6a698e2ec38604c6 -33across.com, 0010b00002e4MRRAA2, DIRECT, bbea06d9c4d2853c -33across.com, 001Pg000007PnplIAC, DIRECT, bbea06d9c4d2853c #33Across #hb #tag -yieldmo.com, 2230523609997805235, DIRECT -yieldmo.com, 3483642730188317326, DIRECT - -# Nativo Test -nativo.com, 5712, DIRECT, 59521ca7cc5e9fee -openx.com, 540709535, RESELLER, 6a698e2ec38604c6 -pubmatic.com, 156500, RESELLER, 5d62403b186f2ace -smartadserver.com, 4878, RESELLER, 060d053dcf45cbf3 -zetaglobal.net, 989, RESELLER - -# 33across Test -33across.com, 0010b00001rrIFkAAM, DIRECT, bbea06d9c4d2853c -appnexus.com, 10239, RESELLER, f5ab79cb980f11d1 -video.unrulymedia.com, 2439829435, DIRECT -conversantmedia.com, 100141, DIRECT, 03113cd04947736d -pubmatic.com, 156423, RESELLER, 5d62403b186f2ace -rubiconproject.com, 16414, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 21642, RESELLER, 0bfd66d529a55807 -loopme.com,11575,RESELLER,6c8d5f95897a5a3b -openx.com, 537120563, RESELLER, 6a698e2ec38604c6 -contextweb.com, 561516, RESELLER, 89ff185a4c4e857c -adyoulike.com, 1f301d3bcd723f5c372070bdfd142940, RESELLER - -# Weborama Test -appnexus.com, 12986, RESELLER, f5ab79cb980f11d1 -improvedigital.com, 1069, RESELLER -pubmatic.com, 158056, RESELLER -Weborama.nl, 10714, DIRECT - -# Inmobi Test -inmobi.com, cdfd74ce1cdd4a67b1c4794c072324ff, DIRECT, 83e75a7ae333ca9d -rubiconproject.com,11726,RESELLER,0bfd66d529a55807 -rubiconproject.com,12266,RESELLER,0bfd66d529a55807 -Blis.com,33,RESELLER,61453ae19a4b73f4 -loopme.com,9724,RESELLER,6c8d5f95897a5a3b -pubmatic.com,157097,RESELLER,5d62403b186f2ace -conversantmedia.com,40881,RESELLER,03113cd04947736d -pubmatic.com,156931,RESELLER,5d62403b186f2ace -pubmatic.com,159035,RESELLER,5d62403b186f2ace -outbrain.com,00bba279fec6daa01a0cb6fdccb023f0d5,RESELLER -venatus.com, 67a9ed9754327b1c4246265f, DIRECT \ No newline at end of file diff --git a/adtest.html b/adtest.html deleted file mode 100644 index 08e4fa39..00000000 --- a/adtest.html +++ /dev/null @@ -1,18793 +0,0 @@ - - - - - - Sandboxels - Experiment with Pixels - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

<

- -
-
-
-

Loading...

- - -
-
-
-
- -
- -
-
-
-
- - -
-
-
- - Title - -
- -
- - -
-
- - Enabled Mods - - - - See the Mod List or GitHub. - -
- -
- - - - - - -
-
- - Settings - -
-
-
- -
- -
-
- - - -

🌐 Language [BETA]:

- - -
-
- -

Try our NEW GAME: Infinite Chef

-

Email us at contact@R74n.com for advertising, help, or education!

-
Be notified when Sandboxels and other R74n projects are updated, along with ramblings from the developer!

-
- -
- - - -

Support development by subscribing on our Patreon! Many benefits!!

-
- -
-

Sandboxels Introduction

-

Sandboxels is a free falling-sand simulator that can be played in your browser. It features heat simulation, electricity, density, chemical reactions, cooking, and fire spread. With over 500 unique elements to play with, Sandboxels is a great way to pass the time and relax.

-

There are thousands of interactions between the many materials, plants, animals, fluids, and powders in the game.

-

Falling-sand games are a genre of sandbox games characterized by falling particles of various types.

-

Simply click or use your touchscreen to select a category, like Liquids, then pick an element, like Water. Drag on the canvas above to place your pixels, and watch them interact with others!

- Rainforest landscape made in Sandboxels -

Sandboxels has many applications in education. With a hands-on experience, it can give students an understanding of emerging phenomena in many fields, such as biology, chemistry, ecology, geology, cooking, and even virology. There are countless aspects to discover.

-

We have a thriving community on Discord! There you can post feedback or share your creations.

- -

Business inquiries? Education stories? Help needed? Email us at contact@R74n.com!

- -

Thanks to our Patrons: Serioustar, ggod, Midi_png, personman, fnl4y, PitsPower, swagg boi, moss, Suss, epsiloneridani, WeiChei, Trent, u2ce

- -

Sandboxels is developed by R74n. Check out !

- - - -
-
-

Controls

- - - - - - - - - - - - - - - - - - - -
Draw pixels Left Click
Erase pixels Right Click
Pick element Middle Click
Pause simulation Space or P
Intensify effect Shift + Heat/Cool/Drag/Mix
Draw line Shift + Click
Change cursor size Scroll or +- or []
Change category
Select by name E
Element info I or /
Open settings \
Reset canvas R
Single step >
Fullscreen F or F11
Change view 123
Toggle GUI F1
Capture screenshot C or F2
More controls
-
-
-
- - - - - - - - - - - - diff --git a/archive.txt b/archive.txt index deaef04e..1b97ab52 100644 --- a/archive.txt +++ b/archive.txt @@ -4,7 +4,7 @@ // If elem1 exists if (elements[key].reactions[reaction].elem1) { // If elem1 is an array, loop through each element, else check once. Don't delete if it === null - if (Array.isArray(elements[key].reactions[reaction].elem1)) { + if (Array.isArray(elements[key].reactions[reaction].elem1)) { for (var i = 0; i < elements[key].reactions[reaction].elem1.length; i++) { if (elements[key].reactions[reaction].elem1[i] && !elements[elements[key].reactions[reaction].elem1[i]]) { elements[key].reactions[reaction].elem1.splice(i,1); @@ -101,4 +101,4 @@ else { if (elements[key].breakInto[i]!==null && !elements[elements[key].breakInto]) { delete elements[key].breakInto; } } - } \ No newline at end of file + } diff --git a/controls.html b/controls.html index 6b8fbf4f..26714878 100644 --- a/controls.html +++ b/controls.html @@ -128,6 +128,7 @@ E Select any element by name TPS Change how fast the simulation runs (Default 30tps) Info Open the element info screen + Saves Open the Save & Load menu Mods Open the Mod Manager Settings Open the Settings Menu diff --git a/controls.txt b/controls.txt index 827321c0..92a80ba9 100644 --- a/controls.txt +++ b/controls.txt @@ -56,5 +56,6 @@ Replace = Override existing pixels when placing E = Select any element by name TPS = Change how fast the simulation runs Info = Open the element info screen +Saves = Open the Save & Load menu Mods = Open the Mod Manager -Settings = Open the Settings Menu \ No newline at end of file +Settings = Open the Settings Menu diff --git a/education-use.html b/education-use.html index 1e436af4..3ed4fa74 100644 --- a/education-use.html +++ b/education-use.html @@ -52,7 +52,6 @@

< Sandboxels in Education

-

Sandboxels is a free experimentation simulator that can be played in any web browser. It features heat simulation, electricity, density, chemical reactions, cooking, and fire spread.

diff --git a/feedback.html b/feedback.html index 6c5b1ea3..57f7fb51 100644 --- a/feedback.html +++ b/feedback.html @@ -52,7 +52,6 @@

< Sandboxels Feedback

-

We accept any suggestions, feedback, or kind words you'd like to send us! We usually can't provide support for mod issues.

diff --git a/help.html b/help.html index 32e205e8..1d9784da 100644 --- a/help.html +++ b/help.html @@ -52,7 +52,6 @@

< Troubleshooting Sandboxels

-

This page will walk you through fixing the most common issues that users have playing Sandboxels.

diff --git a/icons/cover-3840x1240px-text.png b/icons/cover-3840x1240px-text.png new file mode 100644 index 00000000..cd8697e1 Binary files /dev/null and b/icons/cover-3840x1240px-text.png differ diff --git a/icons/promo1.png b/icons/promo1.png new file mode 100644 index 00000000..a6bb3650 Binary files /dev/null and b/icons/promo1.png differ diff --git a/icons/promo2.png b/icons/promo2.png new file mode 100644 index 00000000..187ec0bd Binary files /dev/null and b/icons/promo2.png differ diff --git a/icons/promo3.png b/icons/promo3.png new file mode 100644 index 00000000..644d003a Binary files /dev/null and b/icons/promo3.png differ diff --git a/icons/promo4.png b/icons/promo4.png new file mode 100644 index 00000000..bcc13d4a Binary files /dev/null and b/icons/promo4.png differ diff --git a/index.html b/index.html index 64be082e..2f943d32 100644 --- a/index.html +++ b/index.html @@ -52,6 +52,7 @@ currentversion = "1.11.1"; saveVersion = 4; standalone = false; + standaloneType = null; - -

< Test

+

< Images

+ + -
-This is a test page. +
-
-
-
-
+
+ +

Sand city

+
by R74n
+
+
diff --git a/mobile-use.html b/mobile-use.html index ea5e2868..84395b94 100644 --- a/mobile-use.html +++ b/mobile-use.html @@ -52,7 +52,6 @@

< Sandboxels Mobile Use

-

Sandboxels can be played on practically any device, as long as they have an updated web browser. Please find your platform below to learn how.

diff --git a/mod-list.html b/mod-list.html index c41e32cc..50d99c79 100644 --- a/mod-list.html +++ b/mod-list.html @@ -69,7 +69,6 @@

< Sandboxels Mods

-

Sandboxels has a huge selection of mods that add new content to the simulator. They are created by community members and aren't endorsed by the developer of Sandboxels.

@@ -92,355 +91,353 @@ Top-rated Mods -chem.jsAdds several chemistry and physics-related elementslllllllllwith10ls -aChefsDream.jsMore foods, animals, tools, and other cooking items. See the YouTube Playlist for updatesSquareScreamYT -delete_all_of_element.jsAdds a tool that deletes every pixel of the element(s) the user clicks onAlice +chem.jsSeveral chemistry and physics-related elementslllllllllwith10ls +aChefsDream.jsMore foods, animals, tools, and other cooking items [YouTube Playlist]SquareScreamYT +delete_all_of_element.jsTool that deletes every pixel of the element(s) the user clicks onAlice survival.jsWith limited resources, you must craft, sell, and buy to progressR74n -alchemy.jsStart with only 4 elements and unlock more by reacting them together. (Most are not possible)R74n -nousersthings.jsAdds many chemical elements, compounds, and morenousernamefound +alchemy.jsStart with only 4 elements and unlock more by reacting them together (Most are not possible)R74n +nousersthings.jsMany chemical elements, compounds, and morenousernamefound spring.jsMany nature elements, like sakura trees, butterflies, beehives, and moreR74n -weapons.jsAdds a variety of different weaponsJayd elementsManager.jsCreate and edit custom elementsggod -fey_and_more.jsAdds fairies, magic, and a lot of other thingsMelecie +weapons.jsVariety of different weaponsJayd +fey_and_more.jsFairies, magic, and a lot of other thingsMelecie Official -alchemy.jsStart with only 4 elements and unlock more by reacting them together. (Most are not possible)R74n -building.jsAdds building generators and materialsR74n -classic_explosives.jsAdds back 4 explosives removed in v1.9.3R74n +alchemy.jsStart with only 4 elements and unlock more by reacting them together (Most are not possible)R74n +building.jsBuilding generators and materialsR74n +classic_explosives.jsRe-adds 4 explosives removed in v1.9.3R74n classic_textures.jsUse textures from early versions of the gameR74n color_everything.jsAllows every element to have a custom colorR74n devtests.jsExperimental features from the Sandboxels developerR74n edible_everything.jsAllows every element to be mixed into Batter and DoughR74n -fools.jsAdds back FOOLS ModeR74n -fools24.jsAdds back the 2024 Multiversal Update (v5.9.1)R74n -fools25.jsAdds back the 2025 Element ModulatorR74n +fools.jsRe-adds FOOLS ModeR74n +fools24.jsRe-adds the 2024 Multiversal Update (v5.9.1)R74n +fools25.jsRe-adds the 2025 Element ModulatorR74n glow.js[CHROME ONLY] Adds a cool lighting effect to many emissive pixels, like FireR74n +gravity_test.jsTest for altered gravity, makes all pixels move inwardR74n rainbow_cursor.jsMakes your cursor multicoloredR74n smooth_water.jsChanges water mechanics so that it flows in one direction until it bounces off of somethingR74n -souls.jsAdds Human Souls, Ectoplasm, and TombstonesR74n +souls.jsHuman Souls, Ectoplasm, and TombstonesR74n spring.jsMany nature elements, like sakura trees, butterflies, beehives, and moreR74n survival.jsWith limited resources, you must craft, sell, and buy to progressR74n velocity.jsBeta for explosion velocity, and later wind, which may come to the base game in the futureR74n Tools & Settings - -betaworldgen.jsadds a more advanced world generation to the gameAdora +betaworldgen.jsAdvanced world generationAdora betterModManager.jsImprovements to the Mod Managerggod -betterSettings.jsAdds additional settings and functionalityggod -betterStats.jsSeparate “real” and “set” TPS, meaning you can see what the TPS actually is, instead of only seeing what it’s set tomollthecoder +betterSettings.jsAdditional settings and functionalityggod +betterStats.jsTrack actual running TPS of the simulationmollthecoder buildingreplicator.jsScans and replicates builds anywhere on the screen, along with some preset submitted buildsnousernamefound -change.jsAdds a tool that only replaces existing pixelsAlice -color_tools.jsAdds tools that manipulate colorsAlice -controllable_pixel_test.jsAdds a pixel that can be controlled with the keyboard keys. Read the commit description for more info. [PC ONLY]Alice -controllable_pixel.jsAdds a pixel controlled using WASD (keyboard required)Jayd -cpt_alt.jsAdds a more destructive variant of the controllable pixelAlice -customtemptools.jsAdds temperature tools (set/heat/cool) that you change the value of.guzzo86 +change.jsTool that only replaces existing pixelsAlice +color_tools.jsTools that manipulate colorsAlice +controllable_pixel.jsPixel controlled using WASD (keyboard required)Jayd +cpt_alt.jsDestructive variant of the controllable pixelAlice +customtemptools.jsCustomizable temperature toolsguzzo86 debugRework.jsRevamps the Debug toolFioushemastor -delete_all_of_element.jsAdds a tool that deletes every pixel of the element(s) the user clicks onAlice -descriptions.jsAdds descriptions to the info page and tooltips of elementsmollthecoder -editTools.jsSelections, Copying, Pasting, Cutting, Shapes, and more!ggod -elementEraser.jsAdds a tool that deletes only desired elementSquareScreamYT -elementreplacer.jsAdds a tool that replaces elements with other elements while keeping their colorSuss +delete_all_of_element.jsTool that deletes every pixel of the element(s) the user clicks onAlice +descriptions.jsDescriptions to the info page and tooltips of elementsmollthecoder +editTools.jsSelections, Copying, Pasting, Cutting, Shapes, and moreggod +elementEraser.jsTool that deletes only desired elementSquareScreamYT +elementreplacer.jsTool that replaces elements with other elements while keeping their colorSuss elementsManager.jsCreate and edit custom elementsggod -evenmoretemptools.jsAdds different temperature-modifying tools (±350/tick, NaN, and Infinity)Alice -extra_element_info.jsAdds descriptions to various vanilla elements. Used to provide the functionality that desc now does before it was added to vanillaMelecie -extrasaveslots.jsAdds extra saves slots !SAVE IMPORTANT SAVES AS FILES!Jayd -find.jsAdds a find mode that highlights a chosen element as pulsating red and yellow (read commit description)Alice -hideandshowtools.jsAdds two tools, one that hides elements, and one that shows hidden elementsMicaelNotUsed -human_friendly_design.jsMakes the drag and mix tools not kill humans.Nekonico +evenmoretemptools.jsTemperature-modifying tools (±350/tick, NaN, and Infinity)Alice +extra_element_info.jsDescriptions to various vanilla elements. Used to provide the functionality that desc now does before it was added to vanillaMelecie +extrasaveslots.jsExtra saves slots [KEEP IMPORTANT SAVES AS FILES!!]Jayd +find.jsFind mode that highlights a chosen element as pulsating red and yellow [More Info]Alice +hideandshowtools.jsTools to hide elements and show hidden elementsMicaelNotUsed +human_friendly_design.jsDrag and Mix tools don't kill humansNekonico insane_random_events.jsMassively buffs random eventsAlice -jaydsfunctions.jsAdds extra toolsJayd -moretools.jsAdds more temperature-modifying tools (±10/tick, ±50/tick, and absolute zero tools)Sightnado -move_tools.jsAdds tools that move pixelsAlice -no_scroll.jsDisables scrolling, useful for Apple Magic Mouse usersCrimera Games -noconfirm.jsRemoves all confirmation pop upsmollthecoder -page_color.jsAllows changing the background color outside of the canvas with the “pageColor” query parameterAlice -pixelResizeTool.jsAdds a button to change pixel scalefeeshmaster -prompt.jsAdds a primitive command consoleAlice -prop.jsAdds tool to edit the attributes of pixelsAlice -replace_all.jsAdds a way to replace every pixel of an element with another element
Read the commit description for usageAlice -replace.jsAdds a tool that replaces every pixel of a specified element with another specified element. (The prompt to specify these is toggled by pressing " or by the button in the element description)Alice -save_loading.jsAdds the ability to save and load scenes from files (See the info page of the element)Alice -selective_paint.jsAdds a tool to paint only selected elementsSquareScreamYT -stripe_paint.jsAdds a tool to paint with stripesAlice -texturepack.jsAdds tools that let you create and share custom texture packsnousernamefound -text.jsAdds tools to write textRedBirdly -the_ground.jsAdds several rock types, worldgen settings, and gemstonesAlice +jaydsfunctions.jsExtra toolsJayd +move_tools.jsTools that move pixelsAlice +no_scroll.jsDisables canvas scrolling, useful for Apple Magic Mouse usersCrimera Games +noconfirm.jsRemoves all confirmation popupsmollthecoder +page_color.jsChange the page color with the "pageColor" query parameterAlice +pixelResizeTool.jsButton to change pixel scalefeeshmaster +prompt.jsPrimitive command consoleAlice +prop.jsTool to edit the attributes of pixelsAlice +replace_all.jsWay to replace every pixel of an element with another element [More Info]Alice +replace.jsTool that replaces every pixel of a specified element with another specified element [" to open]Alice +save_loading.jsThe ability to save and load scenes from files [See the info page of the element]Alice +selective_paint.jsTool to paint only selected elementsSquareScreamYT +stripe_paint.jsTool to paint with stripesAlice +text.jsTools to write textRedBirdly +texturepack.jsTools that let you create and share custom texture packsnousernamefound +the_ground.jsSeveral rock types, worldgen settings, and gemstonesAlice Science & Chemistry -alcohol.jsAdds methanol, (iso-)propanol, and butanolAlice -alkahest.jsAdds the alkahest, a liquid which dissolves anythingAlice -aScientistsWish.jsAdds several things that related to science and physics Carbon Monoxide, salmonfishy -bettermetalscrap.jsAllows metal scrap to be melted back into its original materialnousernamefound -bigger_star_spawners.jsAdds spawners for larger starsAlice -biology.jsAdds various elements and functions that let you build your own organism.Nekonico -bioooze_and_pyrogens.jsAdds Bio-Ooze from Frackin’ Universe and several heat-producing materials from various games’ modsAlice -boiling_things.jsAllows for various elements to be vaporizedAlice -bouncing_balls.jsAdds new types of balls that bounce accurately and roll.Nekonico -chalcopyrite.jsAdds the chalcopyrite oreSophie -charsonsmoduno.jsAdds Arsenic, Beryllium, Silicon, compounds, and some non-realistic stuff, such as Aresium and NahniumCharsonBurensen -chem.jsAdds several chemistry and physics-related elementslllllllllwith10ls -clf3.jsAdds Chlorine TrifluorideAlice -debrisable.jsExpands the number of breakable elements, changes erosion, and adds way to craft certain elements from breaking other elements. Nekonico -fire_extinguisher.jsAdds fire extinguisher blocks and realistic firefighting foam to put out nearly anythingDr_Lego -fire_mod.jsAdds various properties to change fire behavior, & a radioactive version of fireAlice -fire_slime.jsAdds a pyrogenic version of slimeAlice -Gemstones.jsAdds more gemstonesSchweeny -glenn_gases.jsAdds most gases from the Glenn's Gases mod into SandboxelsAlice -grav_mudstones.jsAdds various forms of mudstone with different gravitiesAlice -halogen.jsAdds the missing halogensnousernamefound +alcohol.jsMethanol, (iso-)propanol, and butanolAlice +alkahest.jsThe alkahest, a liquid which dissolves anythingAlice +aScientistsWish.jsSeveral things related to science and physicsCarbon Monoxide, salmonfishy +bettermetalscrap.jsMetal scrap can be melted back into its original materialnousernamefound +bigger_star_spawners.jsSpawners for larger starsAlice +biology.jsVarious elements and features that let you build your own organismNekonico +bioooze_and_pyrogens.jsBio-Ooze from Frackin' Universe and several heat-producing materials from various games' modsAlice +boiling_things.jsVarious elements can be vaporizedAlice +bouncing_balls.jsNew types of balls that bounce accurately and rollNekonico +chalcopyrite.jsThe chalcopyrite oreSophie +charsonsmoduno.jsArsenic, Beryllium, Silicon, compounds, and some fake elementsCharsonBurensen +chem.jsSeveral chemistry and physics-related elementslllllllllwith10ls +clf3.jsChlorine TrifluorideAlice +debrisable.jsExpands the number of breakable elements, changes erosion, and adds way to craft certain elements from breaking other elementsNekonico +fire_extinguisher.jsFire extinguisher blocks and realistic firefighting foam to put out nearly anythingDr_Lego +fire_mod.jsVarious properties to change fire behavior and radioactive fireAlice +fire_slime.jsPyrogenic version of slimeAlice +Gemstones.jsGemstonesSchweeny +glenn_gases.jsMost gases from the Glenn's Gases mod into SandboxelsAlice +grav_mudstones.jsVarious forms of mudstone with different gravitiesAlice +halogen.jsThe missing halogensnousernamefound hidden_ground.jsHides most rock variants from the_ground.js excluding the base rocks and wallsMelecie -iocalfaeus_clones.jsAdds Iorefrius, Iolucius, and Ioradius gasAlice -jaydstuff.jsAdds various chemicals and compoundsJayd -laetium.jsAdds several fictional elementsAlice -liquid_energy.jsAdds liquid versions of the elements in the Energy categoryAlice -liquid_mixing.jsAllows liquids to mix colors dynamicallyNekonico -lye.jsAdds lyeBatteRaquette58 -mars.jsAdds some things from Mars with 2 minerals to smelt.charcoal_afterlife -metals.jsAdds several metalsAlice -mixture.jsAllows many chemicals to be mixedlllllllllwith10ls -more_gold.jsAdds Green Goldpixelegend4 -morechemistry.jsAdds many new chemicals and compounds as well as some new machinesAdora -moreliquids.jsAdds various liquidste-agma-at -nellfire.jsAdds a weird transforming flame and several rock typesAlice -Neutronium Mod.jsVariety of scientific elements
ExplosionsStellarX20 -neutronium_compressor.jsAdds a compressor (in reference to Minecraft’s Avaritia mod) that compresses 10,000 pixels of an element into a “singularity”Alice -noblegas.jsAdds the missing noble gasesnousernamefound -nousersthings.jsAdds many chemical elements, compounds, and morenousernamefound -radioactive.jsAdds every radioactive elements on the periodic table (WIP)kaeud +iocalfaeus_clones.jsIorefrius, Iolucius, and Ioradius gasAlice +jaydstuff.jsVarious chemicals and compoundsJayd +laetium.jsSeveral fictional elementsAlice +liquid_energy.jsLiquid versions of the elements in the Energy categoryAlice +liquid_mixing.jsLiquids can mix colors dynamicallyNekonico +lye.jsLyeBatteRaquette58 +mars.jsMartian materialscharcoal_afterlife +metals.jsSeveral metalsAlice +mixture.jsMany chemicals can be mixedlllllllllwith10ls +more_gold.jsGreen Goldpixelegend4 +morechemistry.jsNew chemicals, compounds, and machinesAdora +moreliquids.jsVarious liquidste-agma-at +neutronium_compressor.jsCompressor from Minecraft's Avaritia mod that compresses 10,000 pixels of an element into a singularityAlice +noblegas.jsThe missing noble gasesnousernamefound +nousersthings.jsMany chemical elements, compounds, and morenousernamefound +radioactive.jsRadioactive elements on the periodic table [WIP]kaeud random_rocks.jsRandomly generates rocks on game loadAlice -roseyiede.jsAdds several variants of a substance called roseyiedeAlice -some_tf_liquids.jsAdds various liquids from the Thermal Foundation Minecraft modAlice -stickystuff.jsAllows slime, honey and all things normally sticky to stick to other elementsSuss -the_ground.jsAdds several rock types, worldgen settings, and gemstonesAlice +roseyiede.jsSeveral variants of a substance called roseyiedeAlice +some_tf_liquids.jsVarious liquids from the Thermal Foundation Minecraft modAlice +stickystuff.jsSlime, Honey, and others can stick to other elementsSuss +the_ground.jsSeveral rocks, worldgen types, and gemstonesAlice Machines & Technology -circuitcore.jsAn extension to logicgates.js that adds advanced circuits. Documentation.RedBirdly -clone_liquid.jsAdds a liquid form of clonerAlice -colored_lightbulbs.jsAdds a light bulb that can be painted.guzzo86, ggod -combustion.jsAdds components necessary for combustion enginesuptzik +circuitcore.jsExtension for logicgates.js that adds advanced circuits [More Info]RedBirdly +clone_liquid.jsLiquid form of clonerAlice +colored_lightbulbs.jsLight bulb that can be paintedguzzo86, ggod +combustion.jsComponents necessary for combustion enginesuptzik conveyance.jsConveyors, operated with and without electricityMelecie -drill.jsAdds drills made out of several materialsSuss -ExtraMachines.jsAdds sensors, energy resources, materials, and moreMecoolnotcool -fine_tuned_cloner.jsAdds a cloner that can spawn at different rates and prevent unwated cloningBatteRaquette58 -flipflop.jsToggleable switches; ExplanationFlix -fueled_generators.jsFuel powered generators. +drill.jsDrills made out of several materialsSuss +ExtraMachines.jsSensors, energy resources, materials, and moreMecoolnotcool +fine_tuned_cloner.jsCloner that can spawn at different rates and prevent unwanted cloningBatteRaquette58 +flipflop.jsToggleable switches [More Info]Flix +fueled_generators.jsFuel powered generatorsguzzo86 gameOfLife.jsConway's Game of Life on a screenggod -heatshield.jsadds heatshields, makes plasma coolerTaterbob -human_friendly_design.jsMakes pipes and portals not kill humans, as well as making drag and mix not kill humans.Nekonico -logicgates.jsAdds predictable electricity and logic gatesnousernamefound -note_block.jsAdds musical Note BlocksAlice +heatshield.jsHeatshields, makes Plasma coolerTaterbob +human_friendly_design.jsPipes, Portals, Drag, and Mix don't kill humansNekonico +logicgates.jsPredictable electricity and logic gatesnousernamefound +note_block_advanced.jsEdit of Alice's note_block.js, adds different blocks with different frequenciesCharsonBurensen +note_block.jsMusical Note BlocksAlice nousersthings.jsDestroyable machines, pipe variants, filters, and morenousernamefound -portal.jsAdds portals that can teleport pixelsAlice -pullers.jsAdds pixels that pull pixels towards themvoidapex11 -pushers.jsAdds pixels that push elements away from themAlice -sandboxels.jsAdds a digital screen to play a mini version of SandboxelsNekonico -spouts.jsAdds spouts for all liquidskaeud -state_voids.jsAdds several elements that each delete a specific state of matter (and combinations thereof)Alice -switches.jsAdds electrical switches that can be toggledAlice -ticking_temp_stuff.jsAdds more heaters and coolersAlice -video.jsAdds a video playerggod -waterspout.jsAdds back the old Water Spoutmollthecoder -WhisperingTheory.jsAdds many more variants of heater and coolerkaeud +portal.jsPortals that can teleport pixelsAlice +pullers.jsPixels that pull pixels towards themvoidapex11 +pushers.jsPixels that push elements away from themAlice +sandboxels.jsDigital screen to play a mini version of SandboxelsNekonico +spouts.jsSpouts for all liquidskaeud +state_voids.jsSeveral elements that delete specific states of matterAlice +switches.jsElectrical switches that can be toggledAlice +ticking_temp_stuff.jsHeater and Cooler variantsAlice +video.jsVideo playerggod +waterspout.jsRe-adds the old Water Spoutmollthecoder +WhisperingTheory.jsMany more variants of heater and coolerkaeud wifi_draw.jsDraws connections between WiFi in wifi.js and logicgates.jsRedBirdly Weapons -aircrafts.jsAdds aircraft and aircraft part pixelsJayd -c_fighter_jet.jsAdds a controllable fighter jet, wasd to move, q+wasd to shoot, gvbn for missiles.Jayd -guided_rocket.jsAdds a homing misile.voidapex11 -icb.jsAdds various levels of nested cluster bombsAlice -life_eater.jsAdds Warhammer 40,000’s Life-Eater Virus and Virus BombsAlice -liquid_void.jsAdds a liquid variant of VoidAlice -meat_rockets.jsAdds rockets that create meat when explodingMelecie -more_breaking.jsAllows for breaking more elements in explosionsAlice -rays.jsAdds more Ray typesAlice -rays++.jsAdds a couple more raysuptzik -subspace.jsAdds the Subspace Tripmine from Robloxnousernamefound -war_crimes.jsAdds tear gas & morevoidapex11 -weapons.jsAdds a variety of different weaponsJayd +aircrafts.jsAircrafts and aircraft partsJayd +c_fighter_jet.jsControllable fighter jet [WASD to move, Q+WASD to shoot, GVBN for missiles]Jayd +guided_rocket.jsHoming misilevoidapex11 +icb.jsVarious levels of nested cluster bombsAlice +life_eater.jsWarhammer 40,000's Life-Eater Virus and Virus BombsAlice +liquid_void.jsLiquid variant of VoidAlice +meat_rockets.jsRockets that create meat when explodingMelecie +more_breaking.jsMore elements can be brokenAlice +rays.jsMore Ray typesAlice +rays++.jsCouple more raysuptzik +subspace.jsThe Subspace Tripmine from Robloxnousernamefound +war_crimes.jsTear gas and morevoidapex11 +weapons.jsVariety of different weaponsJayd Food & Cooking -aChefsDream_beta.jsBeta testing for aChefsDream. The code can be found on GitHubSquareScreamYT +aChefsDream_beta.jsBeta testing for aChefsDream.jsSquareScreamYT +aChefsDream.jsMore foods, animals, tools, and other cooking items [YouTube Playlist]SquareScreamYT aChefsDream2.jsThe sequel to aChefsDream.js, with brand new elements and toolsSquareScreamYT -aChefsDream.jsMore foods, animals, tools, and other cooking items. See the YouTube Playlist for updatesSquareScreamYT -bananas.jsAdds bananas and banana plantsAlice -CherrySoda.jsAdds materials to make Cherry soda. Benzaldehyde + seltzer = Cherrysoda.guzzo86 -community_desserts.jsAdds various desserts from community suggestionsTisquares -GrapeSoda.jsAdds materials to make Grape soda. Methylanthranilic acid + seltzer = Cherrysoda.guzzo86 -greenitemsandmore.jsAdds various green things, including apples and more foodzonneschijn7 -ketchup_mod.jsAdds a bunch of ketchup related stuff, plus a few other condimentsNubo318 (main dev), Devi, Alice (contributors) -lemonade.jsAdds lemons and lemonadepersonman / baconthemyth -morefoodsmod.jsAdds more foodsClide4 +bananas.jsBananas and banana plantsAlice +CherrySoda.jsMaterials to make cherry sodaguzzo86 +community_desserts.jsVarious desserts from community suggestionsTisquares +GrapeSoda.jsMaterials to make grape sodaguzzo86 +greenitemsandmore.jsVarious green things, including apples and more foodzonneschijn7 +ketchup_mod.jsMany ketchup related elements, plus a few other condimentsNubo318, Devi, Alice +lemonade.jsLemons and lemonadepersonman, baconthemyth +morefoodsmod.jsMore foodsClide4 pizzasstuff.jsNew animals, foods, and plants_ilikepizza_ -potato_chips.jsPotato chips.guzzo86 -sbstuff.jsAdds many foodsstefanblox -soups.jsAdds seasoning and souppixelegend4 -weAllScreamFor.jsAdds ice cream toppingsrottenEgghead +potato_chips.jsPotato chips and sunflower oilguzzo86 +sbstuff.jsMany foodsstefanblox +soups.jsSeasoning and souppixelegend4 +weAllScreamFor.jsIce cream toppingsrottenEgghead Life & Nature -apioforms_pre.jsAn incomplete implementation of elements from the Apioform GameAlice -baby.jsAdds various babiesSuss -bacteria_mod.jsAdds content from the Bacterium Mod: (Bacteria, Replacer B., Jammer Block)Alice -bananas.jsAdds bananas and banana plantsAlice -biology.jsAdds various elements and functions that let you build your own organism.Nekonico -cat.jsAdds cats and cat foodSquareScreamYT -cells.jsAdds several experimental edits of the Cell elementAlice -children.jsAdds pesky little gremlinsTaterbob -colonies.jsAdds rockets that contain settlers to terraform a planet.Nekonico -crimson.jsAdds elements relating to the Crimson from TerrariaAlice -dogs.jsAdds a simple dog and dog foodhedera-ivy -fairy_chain.jsAdds way too many fairies to fey_and_more.jsAlice -fantastic_creatures.jsAdds various animalsMelecie +apioforms_pre.jsIncomplete implementation of elements from the Apioform GameAlice +baby.jsVarious babiesSuss +bacteria_mod.jsContent from Minecraft's Bacterium ModAlice +bananas.jsBananas and banana plantsAlice +biology.jsVarious elements and features that let you build your own organismNekonico +cat.jsCats and cat foodSquareScreamYT +cells.jsSeveral experimental edits of the Cell elementAlice +children.jsPesky little gremlinsTaterbob +colonies.jsRockets that contain settlers to terraform a planetNekonico +crimson.jsElements relating to the Crimson from TerrariaAlice +dogs.jsSimple dog and dog foodhedera-ivy +fairy_chain.jsWay too many fairies to fey_and_more.jsAlice +fantastic_creatures.jsVarious animalsMelecie fantasy_elements.jsFantasy creatures and substancespixelegend4 -fey_and_more.jsAdds fairies, magic, and a lot of other thingsMelecie -fishin.jsAdds a fishing rod and more fish with scientific names, press B to open bank account, A, S or D to cast your line and Q to reel it back in.Nekonico -flowers_and_forests.jsadds trees and flowers and things to do with naturepixelegend4 and SquareScreamYT -fwibblen.jsAdds a flying creature that turns nickel into itself, and a second creature that does the same to the first oneAlice -genetics.jsAdds an organism that evolves and changes as it creates more of itself by eating, and adapts to environment.Nekonico +fey_and_more.jsFairies, magic, and a lot of other thingsMelecie +fishin.jsFishing rod and more fish with scientific names [More Info]Nekonico +flowers_and_forests.jsTrees and flowerspixelegend4, SquareScreamYT +fwibblen.jsFlying creature that turns nickel into itself, and another that does the same to the first oneAlice +genetics.jsOrganism that evolves and changes as it creates more of itself by eatingNekonico human_edit.jsImprovements to humansAlice -Humanitize.jsMakes humans cultured and able to craft, mine, build houses, trade, and much more.Nekonico -kopalstuff.jsAdds creatures, spirits, DNA, foods, and moreDaviStudios -lizard_mod.jsAdds lizards to sandboxels.RedBirdly -lost_souls.jsAdds souls and related elements, the mod can also be found on Githubpixelegend4, SquareScreamYT, salmonfishy -miscible_psoup_and_birthpool.jsMakes Primordial Soup and Birthpool mix instead of the birthpool settling to the bottom. Will be deprecated upon the release of Magical MenagerieAlice -mobs.jsAdds Creepers, Zombies, and SkeletonsAlice -moretrees.jsAdds 25 more tree & wood types.guzzo86 -nocancer.jsRemoves cancer from the game one tick after it is createdmollthecoder -nocancer2.jsRemoves cancer from the game altogether. May be incompatible with other mods that spawn cancermollthecoder +Humanitize.jsHumans are cultured and able to craft, mine, build houses, trade, and moreNekonico +kopalstuff.jsCreatures, spirits, DNA, foods, and moreDaviStudios +lizard_mod.jsLizardsRedBirdly +lost_souls.jsSouls and related elementspixelegend4, SquareScreamYT, salmonfishy +miscible_psoup_and_birthpool.jsPrimordial Soup and Birthpool can mix (fey_and_more.js)Alice +mobs.jsCreepers, Zombies, and SkeletonsAlice +moretrees.js25 more tree and wood typesguzzo86 +nocancer.jsRemoves cancer one tick after it is createdmollthecoder +nocancer2.jsRemoves cancer from the game altogether; May be incompatible with other mods that spawn cancermollthecoder nograssgrow.jsPrevents Grass from growingmollthecoder -ocean.jsAdds many Marine lifeSquareScreamYT -ores.jsAdds ore generation along with tools to mine themnousernamefound +ocean.jsMarine lifeSquareScreamYT +ores.jsOre generation along with tools to mine themnousernamefound pizzasstuff.jsNew animals, foods, and plants_ilikepizza_ -plants.jsAdds a wide variety of new plants and fruitsAdora -primordial_birthpool.jsA cross between Primordial Soup and Birthpool. Requires F&MAlice +plants.jsWide variety of new plants and fruitsAdora +primordial_birthpool.jsCross between Primordial Soup and Birthpool. Requires fey_and_more.jsAlice spring.jsMany nature elements, like sakura trees, butterflies, beehives, and moreR74n the_ground_og.jsSimplified and more stable version of the_ground.jsAlice -the_ground.jsAdds several rock types, worldgen settings, and gemstonesAlice +the_ground.jsSeveral rock types, worldgen settings, and gemstonesAlice toothpaste.jsTeeth and pasteAlice -volcanic_expansion.jsAdds Obsidian, Pumice, and Andesite rocksJayd +volcanic_expansion.jsObsidian, Pumice, and Andesite rocksJayd Fun & Games -10kelements.jsInserts a customizable amount of randomly generated elements into the gamenousernamefound -all_around_fillers.jsAdds directional Filler variantsidk73248 +10kelements.jsCustomizable amount of randomly generated elementsnousernamefound +all_around_fillers.jsDirectional Filler variantsidk73248 allliquids.jsMade all elements liquidsAdora -amogus.jsAdds a small amogus structureAlice -bfdi.jsAdds several references to bfdiTaterbob -citybuilding.jsAdds seeds that create miniature buildings and other city-related itemsSquareScreamYT +amogus.jsSmall Among Us structureAlice +bfdi.jsSeveral references to Battle for Dream IslandTaterbob +citybuilding.jsSeeds that create miniature buildings and other city-related itemsSquareScreamYT collab_mod.jsCreated by multiple people, adds random thingsmrapple, ilikepizza, stefanblox -doom.jsAs seen on TikTok - Select the Doom element to start, WASDggod -elem3.jsAdds all elements and combinations from Elemental 3 [Very Large]Sophie -fishin.jsAdds a fishing rod and more fish with scientific names, press B to open bank account, A, S or D to cast your line and Q to reel it back in.Nekonico -fools+.jsimproves and makes fools.js EXTREMELY annoying.SquareScreamYT -funny elements 2022-11-15.jsAdds a few curated randomly-generated elementsAlice -funny_solid.jsAdds fecesAlice -funnynames.jsAdds various ways to mess with the names of elementsnousernamefound -haseulite.jsAdds Loona-related materials with various propertiesAlice -lactose_intolerance_and_celiac.jsMakes humans explode on contact with milk, wheat, bread, or toastNubo318 -lattice_filler.jsAdds a combination of lattice and filler and a destructive variantSuss -liquid_mixing.jsAllows liquids to mix colors dynamicallyNekonico -lone_urea.jsAdds urea without the rest of the piss modAlice -maze.jsAdds a solvable maze generatorggod -memelists.jsMakes it so you must select elements through a list at the bottom of the page.
We like listsmollthecoder -minecraft.jsAdds several things from MinecraftStellarX20, nousernamefound -minesweeper.jsA subpar implementation of MinesweeperAlice +doom.jsAs seen on TikTok - Select the Doom element to start [WASD to move]ggod +elem3.jsAll elements and combinations from Elemental 3 [Very Large]Sophie +fishin.jsFishing rod and more fish with scientific names [More Info]Nekonico +fools+.jsImproves and makes fools.js extremely annoyingSquareScreamYT +funny elements 2022-11-15.jsFew curated randomly-generated elementsAlice +funny_solid.jsFecesAlice +funnynames.jsVarious ways to mess with the names of elementsnousernamefound +haseulite.jsLoona-related materials with various propertiesAlice +lactose_intolerance_and_celiac.jsHumans explode on contact with milk, wheat, bread, or toastNubo318 +lattice_filler.jsCombination of lattice and filler and a destructive variantSuss +liquid_mixing.jsLiquids can mix colors dynamicallyNekonico +lone_urea.jsUreaAlice +maze.jsSolvable maze generatorggod +memelists.jsYou must select elements through a list at the bottom of the pagemollthecoder +minecraft.jsSeveral things from Minecraftnousernamefound +minesweeper.jsImplementation of MinesweeperAlice musicalfruit.jsHumans get gas from eating Beansmollthecoder -nekonicos_stuff.jsRandom stuff like graphite, oobleck, and red ice, as well as many machines.Nekonico -prideflags.jsAdds some pride flags to the gameAdora +nekonicos_stuff.jsRandom stuff like graphite, oobleck, and red ice, as well as many machinesNekonico +prideflags.jsSome pride flags to the gameAdora random_elems.jsCurated randomly generated elementsAlice random_liquids.jsRandomly generates liquids on game loadAlice -sbmixup.jsAdds silly elements from a Mix-Up! gamestefanblox -sports_beta.jsAdds several sports itemsBluBun5193 -star_wars.jsAdds various items from Star Wars by DisneySeaPickle754 -sus.jsAdds an Among Us crewmateNv7 -triggerable_random_powders.jsAdds powders with different abilities, such as heating and coolingAlice -troll.jsAdds various dumb elements that iterate randomly on the entire screenAlice -WhisperingTheory.jsAdds powder and gas variant of heater and coolerkaeud +sbmixup.jsSilly elements from a Mix-Up! gamestefanblox +sports_beta.jsSeveral sports itemsBluBun5193 +star_wars.jsVarious items from Star Wars by DisneySeaPickle754 +sus.jsAmong Us crewmateNv7 +triggerable_random_powders.jsPowders with different abilities, such as heating and coolingAlice +troll.jsVarious dumb elements that iterate randomly on the entire screenAlice +WhisperingTheory.jsPowder and gas variant of heater and coolerkaeud Visual Effects -acid_and_shapes.jsWeird visual effects. Enable in SettingsAlice -clouds.jsAdds moving clouds, recommended to include sky.js tooRedBirdly +acid_and_shapes.jsWeird visual effects enabled in settingsAlice +clouds.jsMoving clouds, sky.js recommendedRedBirdly customBackground.jsSet your background to an image linkJayd -fast_lightmap.jsMakes light sources glow, but the fast versionRedBirdly -fractals.jsAdds an element and tools to render fractals in gamenousernamefound -hexagon_test.jsMakes pixels look like hexagonsRedBirdly +fast_lightmap.jsLight sources glow, but fasterRedBirdly +fractals.jsElement and tools to render fractals in gamenousernamefound heatglow.jsRed glowing effect for hot metalsnousernamefound -invisible_dye.jsAdds elements like Dye and Spray Paint that take the color of the backgroundAlice -invisible_wall.jsAdds an element like Wall that takes the color of the backgroundAlice -lightmap.jsMakes light sources glowRedBirdly -liquid_mixing.jsAllows liquids to mix colors dynamicallyNekonico +hexagon_test.jsPixels look like hexagonsRedBirdly +invisible_dye.jsElements like Dye and Spray Paint that take the color of the backgroundAlice +invisible_wall.jsElement like Wall that takes the color of the backgroundAlice +lightmap.jsLight sources glowRedBirdly +liquid_mixing.jsLiquids can mix colors dynamicallyNekonico moreViews.jsMany new rendering modesggod -nicer_flame.jsMakes fire visually pleasingRedBirdly -occlusion.jsAdds realistic shadows (similar to Terraria's lighting)RedBirdly -onecolor.jsMakes all placed pixels single-colorednousernamefound -paint_event.jsAdds a random event that randomly paints a circleAlice -rainbow_tests.jsAdds variants of the rainbow element with different mathsAlice -real_light.jsChanges view code to make everything dark if not hit with a photon or light element, as well as making hot things and glowing things still be visible.Nekonico -shader_by_jayd.jsAdds a glow around light elementsJayd -Shroomboxels.jsA variant of acid_and_shapes.js that uses a different trigonometric functionAlice -singleColor.jsMakes all elements pick one color each time they're drawnstefanblox -sky.jsAdds a day-night cycleRedBirdly -solidcolor.jsMakes all placed pixels have a solid color (clone of onecolor.js)SquareScreamYT -texture_pack_by_jayd.jsAdds a cool backgroundJayd -UwUify.jsAdds an "UwU" backgroundJayd - +nicer_flame.jsFire is visually pleasingRedBirdly +occlusion.jsRealistic shadows, similar to Terraria's lightingRedBirdly +onecolor.jsPlaced pixels are single-colorednousernamefound +paint_event.jsRandom event that randomly paints a circleAlice +rainbow_tests.jsVariants of the rainbow element with different mathsAlice +real_light.jsEverything is dark unless hit with a photon (Light) pixel, hot, or glowingNekonico +shader_by_jayd.jsGlow around light elementsJayd +Shroomboxels.jsVariant of acid_and_shapes.js that uses a different trigonometric functionAlice +singleColor.jsElements pick one color each time they're drawnstefanblox +sky.jsDay-night cycleRedBirdly +solidcolor.jsPlaced pixels have a solid colorSquareScreamYT +texture_pack_by_jayd.jsCool backgroundJayd +UwUify.js"UwU" backgroundJayd Compilations -food_mods.jsA mod combining most food modsstefanblox, moss, Tisquares, SquareScreamYT, Adora, pixelegend4, Alice, Nubo318, Clide4, rottenEgghead +food_mods.jsCombination of most food modsstefanblox, moss, Tisquares, SquareScreamYT, Adora, pixelegend4, Alice, Nubo318, Clide4, rottenEgghead Technical Libraries & Tests 1.10example.jsExamples for modern rendering modding and moreR74n a_bundle_of_tests.jsSeveral test functionsAlice -all_stain.jsMakes every element stain solidsstefanblox +all_stain.jsEvery element stains solidsstefanblox betterMenuScreens.jsLibrary for mods to create their own menusggod -changePixelDebug.jsMakes the changePixel() function abort and log to console when it tries to change to a non-existent elementAlice -changeTempReactionParameter.jsAdds the changeTemp property to modded reactionsAlice -code_library.jsAdds functions and variables common to some other modsAlice -customexplosion.jsAdded a custom explosion element and interface for it. check out its source code for how modders can use it.Alex +changePixelDebug.jsThe changePixel() function aborts and logs to console when it tries to change to a non-existent elementAlice +changeTempReactionParameter.jsThe changeTemp property to modded reactionsAlice +code_library.jsFunctions and variables common to some other modsAlice +controllable_pixel_test.jsPixel that can be controlled with the keyboard keys [More Info] [PC ONLY]Alice +customexplosion.jsAdded a custom explosion element and interface for it. check out its source code for how modders can use itAlex date_test.jsK-pop idol birthday testing stuffAlice -drawPixels_change_test.jsA test of altering drawPixels(). Gives burning pixels a red overlay similar to the yellow overlay for charged pixelsAlice -example_mod.jsAn example mod for new moddersR74n +drawPixels_change_test.jsTest of altering drawPixels(). Gives burning pixels a red overlay similar to the yellow overlay for charged pixelsAlice +example_mod.jsExample mod for new moddersR74n explodeAtPlus.jsExtension of the explodeAt function with more optionsAlice fill_script.jsScript that fills an areaTealEgg#7646 generative_mods.jsModpack with optional mass element generationAlice -generator_prompt.jsAdds a prompt to use generative_mods.js’s element generators after the game finishes loadingAlice +generator_prompt.jsPrompt to use generative_mods.js's element generators after the game finishes loadingAlice gradient_background_support.jsEnables linear gradients for backgrounds as arrays in settings.bgAlice libpacman-v1.jsLibrary for making modsmollthecoder libpixeltracking.jsLibrary for tracking pixelsmollthecoder -maxColorOffset.jsAdds a property to specify how much a pixel’s color can be randomly offset from the element colorAlice -modlangs.jsAdds a customisable property in an element to allow for translations in mods. See the file for instructions on how to implement.SquareScreamYT -nested_for_reaction_example.jsAn example of using a nested for loop to add reactions. It makes various things kill plantsAlice -nv7.jsAdds a giant Nv7 image [Large]Nv7 +maxColorOffset.jsProperty to specify how much a pixel's color can be randomly offset from the element colorAlice +modlangs.jsCustomisable property in an element to allow for translations in mods. See the file for instructions on how to implementSquareScreamYT +nested_for_reaction_example.jsExample of using a nested for loop to add reactions. It makes various things kill plantsAlice +nv7.jsGiant Nv7 image [Large]Nv7 place_all_elements.jsExperimental function that places every pixelAlice randomness_but_tick.jsRandom experimental elements using the tick function featureAlice randomness_but_tool.jsRandom experimental elements using the tool function featureAlice randomness.jsRandom experimental elementsAlice -scenexe.jsWork-in-progress mod, allows you to move through and damage a simulated field of polygonsnousernamefound +scenexe.jsMove through and damage a simulated field of polygons [WIP]nousernamefound structure_test_2.jsAnother test for implementing structures into Sandboxels (requires the previous test)Alice -structure_test.jsA test for implementing structures into SandboxelsAlice -test.jsA test mod that adds mayo :)R74n +structure_test.jsTest for implementing structures into SandboxelsAlice +test.jsTest that adds mayo :)R74n tool_pixel_behavior.jsGives unique behaviors to tools if placed with cheatsAlice -worldgen_test.jsAdds an element that generates a save with a grass layer, dirt layer, rock layer, and a pondAlice +worldgen_test.jsElement that generates a save with a grass layer, dirt layer, rock layer, and a pondAlice Broken or Deprecated -a_mod_by_alice.jsA mod combining most of Alice’s mods, and some other thingsAlice -advanced_colonies.jsAdds davlers, creatures with complex coloniesDaviStudios -humans.jsAdds humans. Now part of the base gameR74n +a_mod_by_alice.jsCombination of most of Alice's mods, and some other thingsAlice +adjustablepixelsize.jsSet the pixelSize with a URL parameterAlice +advanced_colonies.jsDavlers, creatures with complex coloniesDaviStudios +humans.jsHumans. Now part of the base gameR74n invertscroll.jsInverts the scroll wheel for adjusting brush size (now a setting)SquareScreamYT -mobile_shift.jsAdds a button for shift on mobile (Now in the base game)SquareScreamYT +mobile_shift.jsButton for shift on mobile (Now in the base game)SquareScreamYT nopixellimit.jsRemoves the pixel limit. (now a setting)Jayd unhide.jsUnhides all elements except molten ones. (This functionality now exists as a vanilla setting)R74n wheel_fix.jsAttempts to fix the brush scaling too much with the mouse wheel for some people. DeprecatedNubo318 diff --git a/mods/UwUify.js b/mods/UwUify.js index 6f3ef9b8..b5c6bb5e 100644 --- a/mods/UwUify.js +++ b/mods/UwUify.js @@ -1,6 +1,10 @@ document.body.style.backgroundImage = 'url("https://jayd-rubies.github.io/image/uwuify.png")'; document.body.style.backgroundSize = 'cover'; gameDiv.style.border = "1px solid #ffffff00"; +var statsbar = document.getElementById("stats"); +var stylesheetchangevar = document.querySelector("link[rel=stylesheet]"); +stylesheetchangevar.href = "https://jayd-Rubies.github.io/assets/css/UwUstyle.css"; +statsbar.style.backgroundColor = 'transparent'; window.addEventListener("load",function(){ document.querySelectorAll(".categoryButton").forEach(e => { e.style.backgroundColor = "#ffc0cb40"; @@ -80,4 +84,4 @@ function pixelColorPick(pixel,customColor=null) { } }*/ return color; -} +} \ No newline at end of file diff --git a/mods/aScientistsWish.js b/mods/aScientistsWish.js index 0df99162..56f2077a 100644 --- a/mods/aScientistsWish.js +++ b/mods/aScientistsWish.js @@ -1,6 +1,6 @@ -//Main version +//Main version. Still in WIP //reminder for creator: human code is on index.html line 3242. - +//Ini adalah aScientistsWish.js, mod dari Sandboxels yang diciptakan oleh Carbon Monoxide dengan bantuan startup oleh Salmonfishy, bertema sains dan semi fiktif dengan adanya zombie, mod ini masih dalam tahap pengembangan. elements.carbon_monoxide = { color: ["#b5b5b5", "#404040", "#2b2b2b",], behavior: behaviors.GAS, @@ -232,7 +232,7 @@ reactions: { } }; -elements.radiated_metal = { +elements.radiated_metal = { behavior: [ ["XX","CR:radiation%25","XX"], ["CR:radiation%25","XX","CR:radiation%25"], @@ -929,6 +929,7 @@ elements.liquid_phosgene = { category: "states", density: 7.50, tempLow: -118, + hidden: true, temp: -10, stateLow: "solid_phosgene", tempHigh: 8, @@ -939,6 +940,7 @@ elements.solid_phosgene = { behavior: behaviors.WALL, state: "solid", category: "states", + hidden: true, density: 12.45, temp: -150, tempHigh: -117, @@ -962,3 +964,232 @@ elements.chlorophyll = { "acid": { elem1: ["magnesium"], } } } +elements.lithium = { //Unsur lithium, buat versi baru, masih WIP. + color: ["#928c96", "#9c9c9c",], + state: "powder", + category: "powders", + behavior: behaviors.POWDER, + density: 0.5, + tempHigh: 180, + stateHigh: "molten_lithium", + conduct: 0.2, + burn: 85, + burnTime: 500, + reactions: { + "water": { elem1: ["pop","explosion","hydrogen","lithium_hydroxide"] }, + "salt_water": { elem1: ["pop","explosion","hydrogen","lithium_hydroxide"] }, + "pool_water": { elem1: ["pop","explosion","hydrogen","lithium_hydroxide"] }, + "dirty_water": { elem1: ["pop","explosion","hydrogen","lithium_hydroxide"] }, + "sugar_water": { elem1: ["pop","explosion","hydrogen","lithium_hydroxide"] }, + "steam": { elem1: ["pop","explosion","hydrogen","lithium_hydroxide"] }, + "oxygen": { elem1: "lithium_oxide" }, + "chlorine": { elem1: "lithium_chloride" }, + "acid": { elem1: ["lithium_chloride","hydrogen"], chance: 0.2 }, + "carbon_dioxide": { elem1: "lithium_carbonate" }, + "carbon_monoxide": { elem1: "lithium_carbonate" }, + "nitrogen": { elem1: "lithium_nitride", chance: 0.1 } + } + } +elements.molten_lithium = { + color: ["#c0c0c0", "#d0d0d0", "#b0b0b0"], + behavior: behaviors.LIQUID, + temp: 250, // temperatur normal + density: 0.5, + conduct: 0.5, + state: "liquid", + category: "states", + hidden: true, + tempLow: 180, + stateLow: "lithium", + burn: 50, + burnTime: 300, + burnInto: "lithium_oxide", +} + +elements.lithium_hydroxide = { + color: "#c8e4d8", + behavior: behaviors.POWDER, + category: "powders", + state: "solid", + density: 1500, + tempHigh: 462, // titik leleh LiOH + stateHigh: "molten_lithium_hydroxide", + reactions: {}, +}; + +// Molten Lithium Hydroxide +elements.molten_lithium_hydroxide = { + color: "#dff7f2", + behavior: behaviors.LIQUID, + category: "states", + state: "liquid", + density: 1400, + hidden: true, + temp: 463, + tempHigh: 924, // perkiraan titik didih + stateHigh: "lithium_hydroxide_gas", // opsional + reactions: {}, +}; + +// Lithium Oxide (hasil reaksi lithium dengan oksigen) +elements.lithium_oxide = { + color: "#d0d0d0", + behavior: behaviors.POWDER, + category: "powders", + state: "solid", + density: 2013, + tempHigh: 1438, + stateHigh: "molten_lithium_oxide", + reactions: {}, +}; + +// Molten Lithium Oxide +elements.molten_lithium_oxide = { + color: "#e8e8e8", + behavior: behaviors.LIQUID, + category: "states", + state: "liquid", + density: 1800, + hidden: true, + temp: 1440, + reactions: {}, +}; + +// Lithium Carbonate (hasil reaksi lithium dengan karbon dioksida) +elements.lithium_carbonate = { + color: "#f0f0f0", + behavior: behaviors.POWDER, + category: "powders", + state: "solid", + density: 2110, + tempHigh: 723, + stateHigh: "molten_lithium_carbonate", + reactions: {}, +}; + +// Molten Lithium Carbonate +elements.molten_lithium_carbonate = { + color: "#fafafa", + behavior: behaviors.LIQUID, + category: "states", + state: "liquid", + density: 1900, + hidden: true, + temp: 725, + reactions: {}, +}; + +// Lithium Chloride (hasil reaksi lithium dengan klorin atau asam) +elements.lithium_chloride = { + color: "#e0e0f8", + behavior: behaviors.POWDER, + category: "powders", + state: "solid", + density: 2068, + tempHigh: 614, + stateHigh: "molten_lithium_chloride", + reactions: {}, +}; + +// Molten Lithium Chloride +elements.molten_lithium_chloride = { + color: "#f0f0ff", + behavior: behaviors.LIQUID, + category: "states", + state: "liquid", + hidden: true, + density: 1900, + temp: 615, + reactions: {}, +}; + +// Lithium Nitride (hasil reaksi lithium dengan nitrogen) +elements.lithium_nitride = { + color: "#b8b8b8", + behavior: behaviors.POWDER, + category: "powders", + state: "solid", + density: 1270, + tempHigh: 813, + stateHigh: "molten_lithium_nitride", + reactions: {}, +}; + +// Molten Lithium Nitride +elements.molten_lithium_nitride = { + color: "#c8c8c8", + behavior: behaviors.LIQUID, + category: "states", + state: "liquid", + hidden: true, + density: 1100, + temp: 815, + reactions: {}, +}; +elements.phosphorus = { + color: ["#ffffcc", "#ffff99", "#ffff66"], + behavior: behaviors.POWDER, + category: "powders", + state: "solid", + density: 1820, + burn: 100, + burnTime: 100, + burnInto: "fire", + reactions: { + "oxygen": { elem1: "fire", chance: 0.5 }, + "water": { elem1: "explosion", }, + }, + tempHigh: 44, + stateHigh: "molten_phosphorus", + hidden: false, +}; +elements.molten_phosphorus = { + color: ["#ffcc00", "#ff9900"], + behavior: behaviors.LIQUID, + category: "states", + state: "liquid", + density: 1600, + hidden: true, + burning: true, + burnTime: 2000, + burnInto: "fire", + reactions: { + "oxygen": { elem1: "fire", chance: 1 }, + }, + temp: 100, + tempLow: 43, + stateLow: "phosphorus", + viscosity: 20, +}; +elements.phosphorus_bomb = { + color: "#ffdd66", + behavior: behaviors.POWDER, + category: "weapons", + state: "solid", + density: 1200, + desc: "Bom fosfor – meledak saat menyentuh elemen lain dan menyebarkan molten_phosphorus.", + tick: function(pixel) { + // Periksa apakah ada elemen lain di sekitarnya + for (let dx = -1; dx <= 1; dx++) { + for (let dy = -1; dy <= 1; dy++) { + if (dx === 0 && dy === 0) continue; + let x = pixel.x + dx; + let y = pixel.y + dy; + if (!isEmpty(x, y)) { + // Meledak: ubah area sekitar jadi molten_phosphorus + for (let ex = -3; ex <= 3; ex++) { + for (let ey = -3; ey <= 3; ey++) { + let nx = pixel.x + ex; + let ny = pixel.y + ey; + if (isEmpty(nx, ny) && Math.random() < 0.6) { + createPixel("molten_phosphorus", nx, ny); + } + } + } + deletePixel(pixel.x, pixel.y); // Hancurkan bomb setelah meledak + return; + } + } + } + } +}; diff --git a/mods/barista.js b/mods/barista.js new file mode 100644 index 00000000..7f4e024e --- /dev/null +++ b/mods/barista.js @@ -0,0 +1,209 @@ +/* +Barista Mods by Salmonfishyy (eu) +Add many ingredients for drinks + +Changelog - Foundation Level (v0.1) + - Matcha Elements +Changelog - Foundation Level (v0.2) + - Oolong tea + - cinnamon tea +*/ + +elements.tencha = { + behavior: behaviors.POWDER, + category: "food", + state: "solid", + color: ["#25360c","#324a0c"], + density: 500, + breakInto: "matcha_powder", + isFood: true, + desc: "Tea leaves, can break into matcha, look pretty sussy.", +reactions: { + "water": { elem2:"tea", tempMin:80 } + } +}; + +elements.matcha_powder = { + behavior: behaviors.POWDER, + category: "food", + state: "solid", + color: ["#74A662","#74A12E"], + density: 400, + tempHigh: 80, + stateHigh: "burn_matcha", + isFood: true, + desc: "Fine green powder from tea leaves. Vibrant color, earthy taste, and packed with antioxidants. Used in drinks, desserts, and rituals. Basically, classy leaf dust. Watch out for heat and oxygen!", + reactions: { + "oxygen": { elem2: "broke_matcha", chance: 0.5 }, + "dirty_water": { elem2: "null", chance: 0.5 }, + "pool_water": { elem2: "null", chance: 0.5 }, + "water": { elem2: "matcha_tea", chance: 0.5 }, + "seltzer": { elem2: "matcha_soda", chance: 0.5 }, + "salt_water": { elem2: "salty_matcha", chance: 0.5 }, + "sugar_water": { elem2: "sweet_matcha", chance: 0.5 } + } +}; + +elements.broke_matcha = { + behavior: behaviors.POWDER, + category: "food", + state: "solid", + color: ["#556B2F","#8B4513"], + density: 400, + desc: "Broke matcha—once a proud green powder, now a sad, terrible mess. Faded, bitter, and questioning its life choices. Now useless." +}; + +elements.matcha_tea = { + behavior: behaviors.LIQUID, + category: "food", + state: "liquid", + color: ["#5F8A3D"], + density: 1000, + isFood: true, + desc: "Thick green drink, kinda earthy, kinda bitter. Looks like a magic potion, feels like a forest hug. Smooth, strong, and definitely plotting something...", + reactions: { + "milk": { elem2: "matcha_latte", chance: 0.5 }, + "cream": { elem2: "matcha_latte", chance: 0.5 }, + "salt": { elem2: "salty_matcha", chance: 0.5 }, + "sugar": { elem2: "sweet_matcha", chance: 0.5 }, + "carbon_dioxide": { elem2: "matcha_soda", chance: 0.5 } + } +}; + +elements.matcha_latte = { + behavior: behaviors.LIQUID, + category: "food", + state: "liquid", + color: ["#DDEEAF"], + density: 1000, + isFood: true, + desc: "Green tea and milk mixed together. Smooth, slightly sweet, and a bit earthy. Looks fancy, tastes cozy.", + reactions: { + "milk": { elem2:null, chance: 0.5 }, + "cream": { elem2:null, chance: 0.5 } + } +}; + +elements.salty_matcha = { + behavior: behaviors.LIQUID, + category: "food", + state: "liquid", + color: ["#A2B57D"], + density: 1000, + isFood: true, + desc: "Green tea but slightly salty. Confusing, kinda wrong, yet somehow still drinkable. Like matcha decided to rebel.", + reactions: { + "salt": { elem2:null, chance: 0.5 } + } +}; + +elements.matcha_soda = { + behavior: behaviors.LIQUID, + behavior: [ + "XX|CR:foam%3|XX", + "M2|XX|M2", + "M2|M1|M2", + ], +tick: function(pixel) { + if (Math.random() < 0.05 && isEmpty(pixel.x,pixel.y-1)) { + let foam = releaseElement(pixel, "foam"); + if (foam) foam.color = pixelColorPick(foam,"#7EBF5C"); + } +}, + + onMix: function(pixel) { + releaseElement(pixel, "foam", shiftDown) + }, + + category: "food", + state: "liquid", + color: ["#7EBF5C"], + density: 1000, + isFood: true, + desc: "Carbonated green tea. Slightly bitter, extra fizzy. Tastes fresh, feels weird...", + reactions: { + "carbon_dioxide": { elem2:null, chance: 0.5 } + } +}; + +elements.oolong_leaves = { + behavior: behaviors.POWDER, + category: "food", + state: "solid", + color: ["#CDB361","#8F6B3A"], + density: 200, + isFood: true, + tempHigh: 120, + stateHigh: "roasted_oolong", + desc: "Dark, twisty tea leaves that look kinda serious. Smell fancy, taste like tea that went through a phase. Smooth, strong, and slightly dramatic.", +reactions: { + "water": { elem2:"oolong_tea", tempMin:80 }, + } +}; + +elements.roasted_oolong = { + behavior: behaviors.POWDER, + category: "food", + state: "solid", + color: ["#8F6B3A","#654321"], + density: 220, + isFood: true, + desc: "Roasted oolong—deeper flavor, slightly smoky, and probably wiser now.", +reactions: { + "water": { elem2:"oolong_tea", tempMin:80 }, + } +}; + + +elements.cinnamon = { + behavior: behaviors.SUPPORTPOWDER, + category: "food", + state: "solid", + color: ["#6a462f","#4a3120"], + density: 500, + breakInto: "cinnamon_powder", + isFood: true, + desc: "Cinnamon, a thingy things with spicy flavour.", + reactions: { + "water": { elem2:"cinnamon_tea", tempMin:80, color2:"#6c3213" }, + } +}; + +elements.cinnamon_powder = { + behavior: behaviors.SUPPORTPOWDER, + category: "food", + state: "solid", + color: ["#986544"], + density: 589, + isFood: true, + desc: "Cinnamon powder, from cinnamon, a thingy things powder with spicy flavour.", +reactions: { + "water": { elem2:"cinnamon_tea", chance: 0.5, color2:"#6c3213" }, + } +}; + +elements.cinnamon_tea = { + behavior: behaviors.LIQUID, + category: "food", + state: "solid", + color: ["#723900"], + density: 1000, + isFood: true, + desc: "Cozy tea with spicy taste.", +reactions: { + "cinnamon_powder": { elem2:"null", chance: 0.5 }, + } +}; + +elements.oolong_tea = { + behavior: behaviors.LIQUID, + category: "food", + state: "solid", + color: ["#ADA07B"], + density: 1000, + isFood: true, + desc: "it's just tea, make from oolong.", +reactions: { + "sugar": { elem2:"null", chance: 0.5 }, + } +}; diff --git a/mods/building.js b/mods/building.js index f5f70af1..70e04531 100644 --- a/mods/building.js +++ b/mods/building.js @@ -116,4 +116,39 @@ worldgentypes.city = { // ["bird", 0.025, 10], ], baseHeight: 0.25 +} + + +currentBuildingElement = "wood"; + +function buildSelectHandler(r) { + if (!r) { return; } + e = r.replace(/ /g, "_"); + es = mostSimilarElement(e); + if (es) { + currentBuildingElement = es; + logMessage("Element \"" + e + "\" selected"); + } + else { + currentBuildingElement = "wood"; + logMessage("Element \"" + e + "\" not found"); + selectElement(null); + } +} + +elements.slab = { + color: "#888888", + onSelect: () => { + promptInput("Which element should the slab be?", buildSelectHandler, "Select Material") + }, + onPlace: (pixel) => { + pixel.mat = currentBuildingElement; + }, + renderer: (pixel,ctx) => { + let color = elements[pixel.mat].color; + if (Array.isArray(color)) color = color[0]; + if (color) { ctx.fillStyle = color; } + ctx.fillRect(canvasCoord(pixel.x), canvasCoord(pixel.y+0.5), pixelSize, pixelSize/2); + }, + category: "solids" } \ No newline at end of file diff --git a/mods/cookingnstuff.js b/mods/cookingnstuff.js new file mode 100644 index 00000000..66fb805e --- /dev/null +++ b/mods/cookingnstuff.js @@ -0,0 +1 @@ + logMessage("This mod (cookingnstuff.js) has been moved to talismanadditions.js"); diff --git a/mods/devtests.js b/mods/devtests.js index d6414882..457ccb9c 100644 --- a/mods/devtests.js +++ b/mods/devtests.js @@ -193,138 +193,28 @@ elements.clone_fluid = { // category: "special" // } -addCanvasLayer("devtests"); -addCanvasLayer("devtests2"); -canvasLayersPre.unshift(canvasLayers["devtests"]); -devtestsCtx = canvasLayers["devtests"].getContext("2d"); -devtestsCtx2 = canvasLayers["devtests2"].getContext("2d"); -delete canvasLayers.devtests; -delete canvasLayers.devtests2; - -viewInfo[9] = { // Blur - name: "blur", - pixel: viewInfo[1].pixel, - post: function(ctx) { - devtestsCtx.canvas.width = ctx.canvas.width; - devtestsCtx.canvas.height = ctx.canvas.height; - devtestsCtx.filter = "blur(80px)"; - // Draw the blurred content on the canvas - devtestsCtx.drawImage(canvasLayers["pixels"], 0, 0); - devtestsCtx.filter = "none"; - }, -}; - -elements.fire.emit = true; -elements.lightning.emit = 15; -elements.electric.emit = true; -elements.plasma.emit = true; -elements.uranium.emit = 3; -elements.uranium.emitColor = "#009800"; -elements.rainbow.emit = true; -elements.static.emit = true; -elements.flash.emit = true; -elements.cold_fire.emit = true; -elements.blaster.emit = true; -elements.ember.emit = true; -elements.fw_ember.emit = 10; -elements.bless.emit = true; -elements.pop.emit = true; -elements.explosion.emit = true; -elements.n_explosion.emit = 10; -elements.supernova.emit = 20; -elements.midas_touch.emit = true; -elements.fireball.emit = true; - -elements.sun.emit = 15; -elements.light.emit = 3; -elements.liquid_light.emit = true; -elements.laser.emit = 3; -elements.neutron.emit = 3; -elements.proton.emit = 3; -elements.radiation.emit = 3; -elements.fallout.emit = 3; -elements.rad_steam.emit = 2; -elements.rad_steam.emitColor = "#6ad48c"; -elements.rad_cloud.emit = 2; -elements.rad_cloud.emitColor = "#009800"; -elements.rad_glass.emit = 2; -elements.rad_glass.emitColor = "#009800"; -elements.rad_shard.emit = 2; -elements.rad_shard.emitColor = "#009800"; -elements.malware.emit = 2; -elements.border.emit = 2; - -viewInfo[8] = { // Blur Glow (Emissive pixels only) - name: "blurglow", - pixel: viewInfo[1].pixel, - effects: true, - colorEffects: true, - pre: function(ctx) { - devtestsCtx2.canvas.width = ctx.canvas.width; - devtestsCtx2.canvas.height = ctx.canvas.height; - }, - pixel: viewInfo[1].pixel, - post: function(ctx) { - devtestsCtx.canvas.width = ctx.canvas.width; - devtestsCtx.canvas.height = ctx.canvas.height; - devtestsCtx.filter = "blur(30px)"; - // Draw the blurred content on the canvas - devtestsCtx.drawImage(devtestsCtx2.canvas, 0, 0); - devtestsCtx.filter = "none"; - }, -}; - -// viewInfo[7] = { // Pixelized Glow (Emissive pixels only) -// name: "pixelglow", -// pixel: viewInfo[1].pixel, -// effects: true, -// colorEffects: true, -// pre: function(ctx) { -// devtestsCtx2.canvas.width = width; -// devtestsCtx2.canvas.height = height; -// devtestsCtx.canvas.width = ctx.canvas.width; -// devtestsCtx.canvas.height = ctx.canvas.height; -// if (devtestsCtx.msImageSmoothingEnabled !== false) { -// devtestsCtx.msImageSmoothingEnabled = false; -// devtestsCtx.mozImageSmoothingEnabled = false; -// devtestsCtx.webkitImageSmoothingEnabled = false; -// devtestsCtx.imageSmoothingEnabled = false; -// } -// }, -// pixel: viewInfo[1].pixel, -// post: function(ctx) { -// // devtestsCtx.canvas.width = ctx.canvas.width; -// // devtestsCtx.canvas.height = ctx.canvas.height; -// // devtestsCtx.filter = "blur(30px)"; -// // Draw the blurred content on the canvas -// devtestsCtx.filter = "blur(30px)"; -// devtestsCtx.drawImage(devtestsCtx2.canvas, 0, 0, width, height, 0, 0, devtestsCtx.canvas.width, devtestsCtx.canvas.height); -// devtestsCtx.filter = "none"; -// devtestsCtx.drawImage(devtestsCtx.canvas, 0, 0, devtestsCtx.canvas.width, devtestsCtx.canvas.height, 0, 0, devtestsCtx.canvas.width, devtestsCtx.canvas.height); -// }, -// }; - -renderEachPixel(function(pixel,ctx) { - if (view === 8) { - if (elements[pixel.element].emit || pixel.emit || (elements[pixel.element].colorOn && pixel.charge)) { - let a = (settings.textures !== 0) ? pixel.alpha : undefined; - let d = elements[pixel.element].emit||true; - if (d === true) d = 5; - let r = Math.floor(d/2); - drawSquare(devtestsCtx2,elements[pixel.element].emitColor||pixel.color,pixel.x-r,pixel.y-r,d,a); - // viewInfo[1].pixel(pixel,devtestsCtx2); +elements.hue_paint = { + color: elements.paint.color, + tool: (pixel) => { + let hsl; + if (pixel.color.match(/^rgb/)) { + hsl = RGBToHSL(pixel.color.match(/\d+/g)); } - if (pixel.charge && !elements[pixel.element].colorOn) { - drawSquare(devtestsCtx2,"#ffff00",pixel.x-1,pixel.y-1,3); + if (hsl) { + let newRGB = hexToRGB(currentColorMap.hue_paint); + let newHSL = RGBToHSL([newRGB.r,newRGB.g,newRGB.b]); + hsl[0] = parseFloat(newHSL[0]); + hsl[1] = parseFloat(hsl[1]); + if (hsl[1] < 0.05) hsl[1] = 0.1; + hsl[2] = parseFloat(hsl[2]); + newRGB = HSLtoRGB(hsl); + newRGB[0] = Math.floor(newRGB[0]); + newRGB[1] = Math.floor(newRGB[1]); + newRGB[2] = Math.floor(newRGB[2]); + pixel.color = "rgb("+newRGB.join(",")+")"; + delete pixel.origColor; } - } - // else if (view === 7) { - // let a = (settings.textures !== 0) ? pixel.alpha : undefined; - // let d = elements[pixel.element].emit||true; - // if (d === true) d = 5; - // let r = Math.floor(d/2); - // devtestsCtx2.fillStyle = pixel.color; - // if (devtestsCtx2.globalAlpha !== a) { devtestsCtx2.globalAlpha = a; } - // devtestsCtx2.fillRect(pixel.x-r, pixel.y-r, d, d); - // } -}) + }, + category: "special", + customColor: true, +} \ No newline at end of file diff --git a/mods/glow.js b/mods/glow.js index 12cc3f2b..066313a4 100644 --- a/mods/glow.js +++ b/mods/glow.js @@ -1,7 +1,9 @@ var isChromium = !!window.chrome; +var ua = navigator.userAgent.toLowerCase(); +var isAndroid = ua.indexOf("android") > -1; //&& ua.indexOf("mobile"); -if (!isChromium) { +if (!isChromium && !isAndroid) { window.addEventListener("load",function(){ console.log(1) logMessage("Error: glow.js only works on Chrome or Chromium-based browsers.") @@ -58,6 +60,13 @@ elements.malware.emit = 2; elements.border.emit = 2; elements.void.emit = 10; +window.addEventListener("load",()=>{ + glowmodCtx2.canvas.width = ctx.canvas.width; + glowmodCtx2.canvas.height = ctx.canvas.height; + glowmodCtx.canvas.width = ctx.canvas.width; + glowmodCtx.canvas.height = ctx.canvas.height; +}) + viewInfo[1] = { // Blur Glow (Emissive pixels only) name: "", pixel: viewInfo[1].pixel, @@ -85,7 +94,7 @@ viewInfo[1] = { // Blur Glow (Emissive pixels only) }; renderEachPixel(function(pixel,ctx) { - if (view === 1) { + if (view === 1 && settings.textures !== 0) { if (elements[pixel.element].emit || pixel.emit || (elements[pixel.element].colorOn && pixel.charge)) { let a = (settings.textures !== 0) ? pixel.alpha : undefined; let d = pixel.emit||elements[pixel.element].emit||true; diff --git a/gravity.js b/mods/gravity.js similarity index 100% rename from gravity.js rename to mods/gravity.js diff --git a/mods/gravity_test.js b/mods/gravity_test.js new file mode 100644 index 00000000..3c90a653 --- /dev/null +++ b/mods/gravity_test.js @@ -0,0 +1,51 @@ +// validateMoves((pixel,nx,ny) => { +// if (pixel.y-ny < 0) { //goes down usually +// return false; +// } +// }) + +validateMoves((pixel,nx,ny) => { + if (elements[pixel.element].isGas) return true; + if (true || pixel.y-ny < 0) { //goes down usually + + nx = 0; + ny = 0; + + const centerX = Math.floor(width/2); + const centerY = Math.floor(height/2); + + let diffX = centerX-pixel.x; + let diffY = centerY-pixel.y; + + let dirX = 0; + let dirY = 0; + if (Math.abs(diffX) > Math.abs(diffY)) { + dirX = Math.sign(diffX); + } + else { + dirY = Math.sign(diffY); + } + + if (Math.random() < Math.abs(diffX)/100) diffX = Math.sign(diffX); + else diffX = 0; + if (Math.random() < Math.abs(diffY)/100) diffY = Math.sign(diffY); + else diffY = 0; + + if ((diffX || diffY) && !isEmpty(pixel.x+diffX,pixel.y+diffY)) { + if (dirX !== 0) { + diffY = Math.random() < 0.5 ? 1 : -1; + } + else if (dirY !== 0) { + diffX = Math.random() < 0.5 ? 1 : -1; + } + } + + // if (!(pixel.y-ny)) { + // diffX += pixel.y-ny; + // diffY += pixel.x-nx; + // } + + return [pixel.x+diffX,pixel.y+diffY]; + + } +}) \ No newline at end of file diff --git a/mods/mars.js b/mods/mars.js index cd33c235..22d17f11 100644 --- a/mods/mars.js +++ b/mods/mars.js @@ -1,4 +1,3 @@ - elements.mars_gunk = { color: "#121212", behavior: behaviors.DGAS, @@ -29,8 +28,8 @@ elements.mars_basalt = { state: "solid", density: 5000, extraInfo: "Woah", - tempHigh: "molten_mars", - stateHigh: "600", + tempHigh: "700", + stateHigh: "molten_mars", hardness: 0.7, breakInto: ["mars_dust", "mars_rock", "mars_rock", "mars_rock", "molten_mars", "mars_debris", "mars_debris", "gunk", "mars_rock_wall"] } @@ -113,7 +112,11 @@ elements.mars_ironheart_ore = { } elements.mars_ironheart = { color: ["#e8e8e8", "#bd1102"], - behavior: behaviors.STURDYPOWDER, + behavior: [ + "XX|CR:radiation%3|XX", + "XX|XX|XX", + "XX|XX|XX", + ], category: "mars", state: "solid", density: 1500, @@ -155,10 +158,10 @@ elements.nosmoker = { breakInto: ["ironheart", "mars_ironheart", "ironheart_ore", "antigunk"] } elements.ironheart = { - color: "#e9825a", + color: "#FF6B5A", behavior: [ - "XX|XX|XX|", - "XX|XX|XX|", + "XX|CR:radiation%2|XX|", + "XX|CH:feynmanium%0.1|XX|", "M2|M1|M2|", ], category: "mars", @@ -166,6 +169,40 @@ elements.ironheart = { state: "solid", stateHigh: "molten_mars", extraInfo: "Very Sturdy.", + stateLow: "depleted_ironheart", + tempLow: -50, + tempHigh: 1500, + reactions: { + "electric": { elem1: "smint", elem2: "null" }, + }, +} +elements.depleted_ironheart = { + color: "#e9825a", + behavior: [ + "XX|XX|XX|", + "XX|XX|XX|", + "M2|M1|M2|", + ], + category: "mars", + density: 1200, + state: "solid", + stateHigh: "molten_mars", + reactions: { + "electric": { elem1: "smint", elem2: "null" }, + }, +} +elements.feynmanium = { + color: "#8C7656", + behavior: [ + "XX|XX|XX|", + "XX|XX|XX|", + "M2|M1|M2|", + ], + category: "mars", + density: 1200, + state: "solid", + stateHigh: "molten_mars", + tempHigh: 6000, reactions: { "electric": { elem1: "smint", elem2: "null" }, }, @@ -190,7 +227,7 @@ elements.red_gold_powder = { } elements.red_gold = { color: ["#D20103", "#E4080A", "#EFC3CA"], - behavior: behaviors.POWDER, + behavior: behaviors.WALL, category: "mars", state: "solid", density: 1350, @@ -240,7 +277,7 @@ elements.mars_coal = { stateHigh: "molten_mars", temp: 10, reactions: { - "electric": { elem2: "useless", chance: 0.01 }, + "electric": { elem2: "smint", chance: 0.01 }, } } elements.mars_ice = { @@ -354,7 +391,8 @@ elements.ironheart_core = { conduct: 1, extraInfo: "wha" } -// 2.9.17.1 + +// 2.10.20 // most elements done :D // iron heart ore // iron heart @@ -385,7 +423,10 @@ elements.ironheart_core = { // added cores that emit electricity // its like plants // dumbed down ironheart a bit, im thinking about its behaviour - +// Ironheart is Radioactive +// Red Gold is Solid +// Feynmanium +// make things have recaitons // Creditssss // Ghanisma - idea for 2.9.16 diff --git a/mods/nekonicos_stuff.js b/mods/nekonicos_stuff.js index 70169cd6..9f2b6824 100644 --- a/mods/nekonicos_stuff.js +++ b/mods/nekonicos_stuff.js @@ -1,3 +1,4 @@ + behaviors.SOLIDIFY = function(pixel) { pixel.solid = true } @@ -1548,12 +1549,107 @@ grabAllWeights = function(pixel){ return results } -/*elements.Cherries_Ceri_Moji = { - color: "#fcd1d7", - category: Student, - state: High_School, - behavior: [Shy, Introverted, Easily_Excited, Kind], - pronouns: [She,Her,Herself], - sexuality: [Panromantic, Asexual], - desc: "Ceri is a 16 year old high school student who loves cats" -}*/ +var modName = "mods/nekonicos_stuff.js"; +var cookieMod = "mods/cookie_clicker.js"; + +if (!enabledMods.includes(cookieMod)) { + +elements.cookie_dough = { + color: ["#bfac91","#CDBFAB",], + behavior: behaviors.STURDYPOWDER, + reactions: { + "chocolate": { elem1:"chocolate_chip_cookie_dough", elem2:null, chance: 0.5 }, + "chocolate_powder": { elem1:"chocolate_chip_cookie_dough", elem2:null, chance: 0.5 }, + }, + category: "food", + tempHigh: 74, + stateHigh: "plain_cookie", + burn:40, + burnTime:25, + burnInto:"ash", + state: "solid", + density: 526.9, + isFood: true +} + +elements.chocolate_chip_cookie_dough = { + color: ["#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#4d2818","#3b1b0d","#33160a"], + behavior: behaviors.STURDYPOWDER, + category: "food", + tempHigh: 74, + stateHigh: "cookie", + burn:40, + burnTime:25, + burnInto:"ash", + state: "solid", + density: 526.9, + isFood: true +} + +clicked = false +cookies = 0 +oldcookies = 0 +createdcookies = 0 + +elements.plain_cookie = { + color: ["#C4966C","#C0946B"], + behavior: behaviors.POWDER, + reactions: { + "chocolate": { elem1:"cookie", elem2:null, chance: 0.25 }, + "chocolate_powder": { elem1:"cookie", elem2:null, chance: 0.25 }, + }, + tempHigh: 192, + stateHigh: "toast", + category: "food", + burn: 10, + burnTime: 200, + burnInto: "toast", + breakInto: "crumb", + breakIntoColor: ["#c8946a","#c08655","#ba7a45","#a86d3e"], + state: "solid", + density: 233.96, + isFood: true +} + +elements.cookie = { + color: ["#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#4d2818","#3b1b0d","#33160a"], + behavior: behaviors.POWDER, + tick: function(pixel) { + var top = mousePos.y - Math.floor(mouseSize/2); + var bottom = mousePos.y + Math.floor(mouseSize/2); + var left = mousePos.x - Math.floor(mouseSize/2); + var right = mousePos.x + Math.floor(mouseSize/2); + if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown === true && clicked === false) { + clicked = true + cookies += 1 + } + else if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown !== true && clicked === true) { + clicked = false + } + doDefaults(pixel); + }, + tempHigh: 95, + stateHigh: ["melted_chocolate","plain_cookie","plain_cookie"], + category: "food", + burn: 10, + burnTime: 200, + burnInto: ["melted_chocolate","plain_cookie","plain_cookie"], + breakInto: ["crumb","crumb","crumb","crumb","crumb","chocolate","chocolate_powder"], + breakIntoColor: ["#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#4d2818","#3b1b0d","#33160a"], + state: "solid", + density: 233.96, + isFood: true, + renderer: function(pixel,ctx) { + if (!viewInfo[view].effects) { return } + if (isEmpty(pixel.x,pixel.y+1) || !outOfBounds(pixel.x,pixel.y+1) || pixelMap[pixel.x][pixel.y+1].element === "pipe") { + drawPlus(ctx,"#C4966C",pixel.x,pixel.y,undefined,2) + } + drawDefault(ctx,pixel) + } +} + +elements.dough.reactions.sugar = { elem1:"cookie_dough", elem2: null, chance:0.5} +elements.dough.reactions.chocolate = { elem1:"chocolate_chip_cookie_dough", elem2: null, chance:0.5} +elements.dough.reactions.chocolate_powder = { elem1:"chocolate_chip_cookie_dough", elem2: null, chance:0.5} + +} diff --git a/mods/note_block_advanced.js b/mods/note_block_advanced.js new file mode 100644 index 00000000..8cdca6ca --- /dev/null +++ b/mods/note_block_advanced.js @@ -0,0 +1,628 @@ +audioContext = new AudioContext() + +//Derived from Alice's note_block.js - thanks! +//adv_note_block/note_block_advance/nba + +oscillatorDefaults = { + frequency: 440, + type: "sine", + endType: "none", + length: 1, + volume: 1, + delay: 0, +}; + +audioObject = {}; + +function oscillator(name="test",parameterObject=oscillatorDefaults){ //creates oscillator with gain node, has specifiable frequency and type, fades out over 1 second (hard-coded) + var defaultKeys = Object.keys(oscillatorDefaults); //readability variable + + for(i = 0; i < defaultKeys.length; i++) { + var key = defaultKeys[i]; //the indexed keyname + if(typeof(parameterObject[key]) === "undefined") { + parameterObject[key] = oscillatorDefaults[key]; + }; + }; + + var oscillatorNodeName = `${name}Oscillator`; + var gainNodeName = `${name}Gain`; + + audioObject[oscillatorNodeName] = audioContext.createOscillator() + audioObject[gainNodeName] = audioContext.createGain() + audioObject[gainNodeName].gain.value = parameterObject.volume; + audioObject[oscillatorNodeName].type = parameterObject.type + audioObject[oscillatorNodeName].connect(audioObject[gainNodeName]) + audioObject[oscillatorNodeName].frequency.value = parameterObject.frequency + audioObject[gainNodeName].connect(audioContext.destination) + audioObject[oscillatorNodeName].start(audioContext.currentTime + parameterObject.delay) + + //stopping handler + if(parameterObject.endType === "exponential") { //starts fading immediately + audioObject[gainNodeName].gain.exponentialRampToValueAtTime( + 0.00001, audioContext.currentTime + parameterObject.length + ); + } else if(parameterObject.endType === "linear") { //starts fading immediately + audioObject[gainNodeName].gain.linearRampToValueAtTime( + 0.00001, audioContext.currentTime + parameterObject.length + ); + } else { //waits to stop + audioObject[oscillatorNodeName].stop(audioContext.currentTime + parameterObject.delay + parameterObject.length); + }; +}; + +elements.c_note_block = { + color: "#eb4034", + name: "Note Block - C", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 261.63, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.cs_note_block = { + color: "#fc3903", + name: "Note Block - C Sharp", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 277.183, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.d_note_block = { + color: "#fc6203", + name: "Note Block - D", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 293.66, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.ef_note_block = { + color: "#fc9803", + name: "Note Block - E Flat", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 293.66, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + + +elements.e_note_block = { + color: "#fce303", + name: "Note Block - E", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 329.63, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.f_note_block = { + color: "#fce303", + name: "Note Block - F", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 349.228, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.fs_note_block = { + color: "#03fc3d", + name: "Note Block - F Sharp", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 369.99, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.g_note_block = { + color: "#03fcca", + name: "Note Block - G", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 391.995, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.gs_note_block = { + color: "#0394fc", + name: "Note Block - G Sharp", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 415.305, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.a_note_block = { + color: "#0f03fc", + name: "Note Block - A", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 440, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.bf_note_block = { + color: "#9803fc", + name: "Note Block - B Flat", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 466.164, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; + +elements.b_note_block = { + color: "#fc03b5", + name: "Note Block - B", + behavior: behaviors.WALL, + state: "solid", + category: "note_blocks", + density: 1200, + hardness: 0.2, + breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], + conduct: 1, + properties: { + frequency: 493.883, + type: "triangle", + endType: "none", + length: 0.5, + volume: 0.7, + delay: 0, + debounce: 0, + debounceLength: tps, + }, + tick: function(pixel) { + var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name + + var pixelPropertyObject = { //Load sound properties from pixel as object; + frequency: pixel.frequency, + type: pixel.type, + endType: pixel.endType, + length: pixel.length, + volume: pixel.volume, + delay: pixel.delay, + }; + + //console.log(pixelPropertyObject); + + if(pixel.debounce < 1) { + //console.log(`${pixel.debounce} not debounced, play`); + if(pixel.charge) { + oscillator(pixelSoundName,pixelPropertyObject); + delete pixel.charge; + pixel.debounce = pixel.debounceLength; + }; + } else if(pixel.debounce > 0) { + //console.log(`${pixel.debounce} debounced, don't play`); + pixel.debounce--; + }; + }, +}; diff --git a/mods/reverse_time.js b/mods/reverse_time.js new file mode 100644 index 00000000..f02876a7 --- /dev/null +++ b/mods/reverse_time.js @@ -0,0 +1,421 @@ +emptyList = [] + +runPerPixel(function(pixel) { + // run any code on each pixel every tick + if (pixel.start>pixelTicks) { + if (pixel.olderelement != undefined && pixel.oldercolor != undefined && pixel.olderstart != undefined && pixel.oldertemp != undefined && pixel.olderanimal != undefined && pixel.olderage != undefined) { + OGChangePixel(pixel) + } + else { + deletePixel(pixel.x,pixel.y) + } + } /* + if (pixel.start>pixelTicks+10) { + deletePixel(pixel.x,pixel.y) + } */ + if (pixel.burnStart && pixel.burnStart>pixelTicks) { + if (pixel.burning) { + delete pixel.burning; + delete pixel.burnStart; + } + } + if (pixel.origColor && !pixel.stainStart) { + pixel.stainStart = pixelTicks + } + if (pixel.stainStart && pixel.origColor && pixel.stainStart>pixelTicks) { + pixel.color = "rgb("+pixel.origColor[0]+","+pixel.origColor[1]+","+pixel.origColor[2]+")" + delete pixel.origColor + delete pixel.stainStart + } +}) + + +changePixel = function(pixel,element,changetemp=true) { + if (!element) { return } + if (elements[pixel.element].onChange !== undefined) { + elements[pixel.element].onChange(pixel,element); + } + if (!elements[element]) { + pixel.invalidElement = element; + element = "unknown" + } + if (!pixel.olderelement) { + pixel.olderelement = [] + } + if (!pixel.oldercolor) { + pixel.oldercolor = [] + } + if (!pixel.olderstart) { + pixel.olderstart = [] + } + if (!pixel.oldertemp) { + pixel.oldertemp = [] + } + if (!pixel.olderanimal) { + pixel.olderanimal = [] + } + if (!pixel.olderage) { + pixel.olderage = [] + } + for (var i = 0; i <= 500; i++) { + if (!pixel.olderelement[i]) { + pixel.olderelement[i] = pixel.element + if (pixel.element === "human") { + pixel.olderelement[i] = "head" + } + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.oldercolor[i]) { + pixel.oldercolor[i] = pixel.color + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.olderstart[i]) { + pixel.olderstart[i] = pixel.start + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.oldertemp[i]) { + pixel.oldertemp[i] = pixel.temp + if (elements[pixel.element].tempHigh && elements[pixel.element].tempHigh < pixel.temp) { + pixel.oldertemp[i] = (elements[pixel.element].tempHigh - 1.5) + } + if (elements[pixel.element].tempLow && elements[pixel.element].tempLow > pixel.temp) { + pixel.oldertemp[i] = (elements[pixel.element].tempLow + 1.5) + } + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.olderanimal[i]) { + pixel.olderanimal[i] = pixel.animal + if (!pixel.animal) { + pixel.olderanimal[i] = pixel.element + } + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.olderage[i]) { + pixel.olderage[i] = pixel.age + if (!pixel.age) { + pixel.olderage[i] = pixel.start + } + break; + } + } + pixel.element = element; + pixel.color = pixelColorPick(pixel); + pixel.start = pixelTicks; + var elementInfo = elements[element]; + if (elementInfo.burning == true) { + pixel.burning = true; + pixel.burnStart = pixelTicks; + } + else if (pixel.burning && !elementInfo.burn) { + delete pixel.burning; + delete pixel.burnStart; + } + delete pixel.origColor; // remove stain + delete pixel.clone; + if (pixel.glow !== undefined) { + delete pixel.glow; + } + if (pixel.r && !elementInfo.rotatable) { + delete pixel.r; + } + if (pixel.flipX && !elementInfo.flippableX) { + delete pixel.flipX; + } + if (pixel.flipY && !elementInfo.flippableY) { + delete pixel.flipY; + } + // If elementInfo.flippableX, set it to true or false randomly + if (elementInfo.flipX !== undefined) { pixel.flipX = elementInfo.flipX } + else if (elementInfo.flippableX) { + pixel.flipX = Math.random() >= 0.5; + } + // If elementInfo.flippableY, set it to true or false randomly + if (elementInfo.flipY !== undefined) { pixel.flipY = elementInfo.flipY } + else if (elementInfo.flippableY) { + pixel.flipY = Math.random() >= 0.5; + } + if (elementInfo.temp !== undefined && changetemp) { + pixel.temp = (elementInfo.temp+pixel.temp)/2; + pixelTempCheck(pixel) + } + if (pixel.con && !elementInfo.canContain) { + delete pixel.con; + } + // If elementInfo.properties, set each key to its value + if (elementInfo.properties !== undefined) { + for (var key in elementInfo.properties) { + // If it is an array or object, make a copy of it + if (typeof elementInfo.properties[key] == "object") { + pixel[key] = JSON.parse(JSON.stringify(elementInfo.properties[key])); + } + else { + pixel[key] = elementInfo.properties[key]; + } + } + } + if (pixel.alpha !== undefined) { + delete pixel.alpha; + } + if (pixel.emit) { + delete pixel.emit; + } + if (elements[element].alpha !== undefined) { + pixel.alpha = elements[element].alpha; + } + if (elements[element].onPlace !== undefined) { + elements[element].onPlace(pixel); + } + checkUnlock(element); +} + +OGChangePixel = function(pixel) { + if (pixel.olderelement != undefined && pixel.oldercolor != undefined && pixel.olderstart != undefined && pixel.oldertemp != undefined && pixel.olderanimal != undefined && pixel.olderage != undefined && pixel.olderelement.length > emptyList.length && pixel.oldercolor.length > emptyList.length && pixel.olderstart.length > emptyList.length && pixel.oldertemp.length > emptyList.length && pixel.olderanimal.length > emptyList.length && pixel.olderage.length > emptyList.length && pixel.startpixelTicks) { + deletePixel(pixel.x,pixel.y) + } + else if (pixel.animal && pixel.start-pixelTicks >= 500 && Math.random() < 0.2) { + deletePixel(pixel.x,pixel.y) + } + if (pixel.start === pixelTicks) {return} + if (pixel.drag) pixel.fall = 0; + if (!tryMove(pixel, pixel.x, pixel.y+1)) { + if (pixel.animal || pixel.fall < 20) { + if (Math.random() < 0.5) { + if (!tryMove(pixel, pixel.x+1, pixel.y+1)) { + tryMove(pixel, pixel.x-1, pixel.y+1); + } + } else { + if (!tryMove(pixel, pixel.x-1, pixel.y+1)) { + tryMove(pixel, pixel.x+1, pixel.y+1); + } + } + pixel.fall = 0; + } + else if (outOfBounds(pixel.x,pixel.y+1) || (!isEmpty(pixel.x,pixel.y+1,true) && elements.egg.ignore.indexOf(pixelMap[pixel.x][pixel.y+1].element) === -1 && elements[pixelMap[pixel.x][pixel.y+1].element].state === "solid")) { + changePixel(pixel,"yolk") + } + else {pixel.fall = 0} + if (pixel.animal && pixelTicks-pixel.start >= 500 && Math.random() < 0.2) { + changePixel(pixel,pixel.animal) + } + } + else {pixel.fall ++} + if (pixel.temp < -2 || pixel.temp > 100) { + pixel.animal = null; + } + doDefaults(pixel); + }, + ignore: ["paper","sponge","straw","wheat","rat","frog","pollen","clay","snow","mud","wet_sand","tinder","feather","bread","ice_cream","dough"], + innerColor: "#ffffff", + properties: { "fall":0 }, + tempHigh: 1500, + stateHigh: ["steam","calcium","carbon_dioxide","sulfur_gas"], + breakInto: "yolk", + category: "food", + state: "solid", + density: 1031, + cooldown: defaultCooldown +} + +elements.tadpole = { + color: "#87b574", + behavior: [ + "XX|XX|M2%25 AND SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water%14", + "XX|FX%0.5|SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water%14", + "XX|M1|SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water%14", + ], + tick: function(pixel) { + if (pixel.start-pixelTicks > 500) { + OGChangePixel(pixel,"egg") + pixel.color = pixelColorPick(pixel,"#717c80") + pixel.animal = "tadpole" + } + if (pixelTicks-pixel.start > 500) { + changePixel(pixel,"frog"); + } + }, + reactions: { + "algae": { elem2:null, chance:0.25 }, + "kelp": { elem2:"water", chance:0.25 } + }, + tempHigh: 100, + stateHigh: "steam", + tempLow: -10, + stateLow: "ice", + breakInto: ["slime",null], + category:"life", + hidden: true, + state: "solid", + density: 1450, + conduct: 0.2 +} + +elements.frog = { + color: "#607300", + behavior: [ + "XX|XX|M2%3 AND SW:water,salt_water,sugar_water,dirty_water,seltzer%7", + "XX|FX%0.5|CR:slime%0.01 AND BO", + "XX|M1|XX", + ], + reactions: { + "fly": { elem2:null, chance:0.5, func:behaviors.FEEDPIXEL }, + "firefly": { elem1:"meat", elem2:null, chance:0.5 }, + "stink_bug": { elem2:null, chance:0.55, func:behaviors.FEEDPIXEL }, + "snail": { elem2:"limestone", chance:0.05, func:behaviors.FEEDPIXEL }, + "slug": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "worm": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "spider": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "algae": { elem2:null, chance:0.5, func:behaviors.FEEDPIXEL }, + "kelp": { elem2:"water", chance:0.5, func:behaviors.FEEDPIXEL }, + "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, + "dead_bug": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "mercury": { elem1:"rotten_meat", chance:0.1 }, + "bleach": { elem1:"rotten_meat", chance:0.1 }, + "infection": { elem1:"rotten_meat", chance:0.025 }, + "uranium": { elem1:"rotten_meat", chance:0.1 }, + "cyanide": { elem1:"rotten_meat", chance:0.1 }, + "chlorine": { elem1:"meat", chance:0.1 }, + "alcohol": { elem1:"meat", chance:0.025 }, + "dirty_water": { elem1:"rotten_meat", chance:0.0001 }, + "pool_water": { elem1:"rotten_meat", chance:0.005 }, + "vinegar": { elem1:"rotten_meat", chance:0.001 }, + }, + tick: function(pixel) { + if (pixelTicks < pixel.start) { + OGChangePixel(pixel,"tadpole"); + } + }, + foodNeed: 10, + baby: "tadpole", + eggColor:"#717c80", + temp: 19.1, + tempHigh: 100, + stateHigh: "cooked_meat", + stateHighColor: "#CDAF96", + onStateHigh: function(pixel) { + releaseElement(pixel,"steam"); + }, + tempLow: -18, + stateLow: "frozen_frog", + category:"life", + breakInto: "slime", + burn:15, + burnTime:300, + state: "solid", + density: 1450, + conduct: 0.2 +} + +elements.fly = { + color: "#4c4e42", + behaviorOn: [ + "XX|CR:flash|XX", + "CR:flash|CH:ash|CR:flash", + "XX|CR:flash|XX", + ], + reactions: { + "dead_plant": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "meat": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "cooked_meat": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "rotten_meat": { elem2:[null,null,"ammonia"], chance:0.15, func:behaviors.FEEDPIXEL }, + "cheese": { elem2:[null,null,"ammonia"], chance:0.15, func:behaviors.FEEDPIXEL }, + "cheese_powder": { elem2:[null,null,"ammonia"], chance:0.15, func:behaviors.FEEDPIXEL }, + "rotten_cheese": { elem2:[null,null,"ammonia"], chance:0.15, func:behaviors.FEEDPIXEL }, + "vine": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "corn": { elem2:null, chance:0.05, func:behaviors.FEEDPIXEL }, + "potato": { elem2:null, chance:0.05, func:behaviors.FEEDPIXEL }, + "crumb": { elem2:null, chance:0.05, func:behaviors.FEEDPIXEL }, + "wheat": { elem2:null, chance:0.1, func:behaviors.FEEDPIXEL }, + "yeast": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "caramel": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "bread": { elem2:null, chance:0.1, func:behaviors.FEEDPIXEL }, + "sugar_water": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "honey": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "soda": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL } + }, + tick: function(pixel, onHit) { + var nx = pixel.flipX ? -1 : 1; + var ny = Math.random() < 0.5 ? -1 : 1; + var hit = false; + if (!tryMove(pixel, pixel.x+nx, pixel.y+ny)) { + if (!tryMove(pixel, pixel.x+nx, pixel.y-ny)) { + if (!tryMove(pixel, pixel.x, pixel.y+ny)) { + if (!tryMove(pixel, pixel.x, pixel.y-ny)) {hit=[pixel.x, pixel.y-ny]} + }else {hit=[pixel.x, pixel.y+ny]} + }else {hit=[pixel.x+nx, pixel.y-ny]} + }else {hit=[pixel.x+nx, pixel.y+ny]} + if (hit && onHit) { + if (!isEmpty(hit[0], hit[1], true)) { + onHit(pixel, pixelMap[hit[0]][hit[1]]); + } + else {onHit(pixel);} + } + if (pixel.del) {return} + if (!isEmpty(pixel.x+nx,pixel.y) || Math.random() < 0.02) { + pixel.flipX = !pixel.flipX; + } + if (pixel.charge && elements[pixel.element].behaviorOn) { + pixelTick(pixel) + } + doDefaults(pixel); + if (pixel.start-pixelTicks > 500) { + OGChangePixel(pixel,"egg") + pixel.animal = "fly" + } + }, + foodNeed: 15, + tempHigh: 100, + stateHigh: "ash", + tempLow: 0, + stateLow: "dead_bug", + breakInto: "dead_bug", + category:"life", + burn:95, + burnTime:25, + state: "solid", + density: 600, + conduct: 1 +} */ \ No newline at end of file diff --git a/mods/talismanadditions.js b/mods/talismanadditions.js new file mode 100644 index 00000000..81ef978f --- /dev/null +++ b/mods/talismanadditions.js @@ -0,0 +1,124 @@ + +behaviors.YOGURT = [ + "XX|XX|XX", + "XX|XX|XX", + "M2%5|M1|M2%5", +]; + +elements.kefir = { + color: "#f0f1fa", + behavior: behaviors.YOGURT, + category: "food", + state: "solid", + stateHigh: "yogurt", + stateLow: "frozen_kefir", + stateLowColorMultiplier: 1.05, + tempHigh: 125, + tempLow: 0, + reactions: { + "honey": { elem1: "honey_kefir", elem2: null }, + "caramel": { elem1: "honey_kefir", elem2: null }, + "sugar": { elem1: "honey_kefir", elem2: null }, + } +} + +elements.frozen_kefir = { + temp: -5, + tempHigh: 0, + stateHigh: "kefir", + breakInto: "kefir", + behavior: behaviors.STURDYPOWDER, + category: "food", + isFood: true, + stateHighColorMultiplier: 0.955, +} + +elements.honey_kefir = { + color: "#ffe7cf", + behavior: behaviors.YOGURT, + category: "states", + state: "solid", + stateHigh: "honey", + stateLowName: "frozen_kefir", + stateLowColorMultiplier: 1.05, + tempHigh: 125, + tempLow: 0, +} + +elements.honey_yogurt = { + color: "#fff6e6", + category: "states", + behavior: behaviors.YOGURT, + tempHigh: 1000, + stateHigh: ["smoke","smoke","honey","calcium"], + tempLow: 0, + stateLowName: "frozen_yogurt", + stateLowColorMultiplier: 1.05, + state: "liquid", + density: 820.33, + isFood: true, + alias: "honey_yoghurt", +} + +elements.beet = { + color: "#ff576d", + category: "food", + behavior: behaviors.POWDER, + state: "solid", + stateHigh: "beet_juice", + tempHigh: 125, + breakInto: "beet_juice", +} + +elements.beet_juice = { + color: "#ff0062", + category: "liquids", + behavior: behaviors.LIQUID, + state: "solid", + stateHigh: "sugar", + tempHigh: 125, + stateLow: "frozen_beet_juice", + stateLowColorMultiplier: 1.15, + tempLow: 0, +} + +elements.frozen_beet_juice = { + temp: -5, + tempHigh: 0, + stateHigh: "beet_juice", + breakInto: "beet_juice", + behavior: behaviors.STURDYPOWDER, + category: "states", + isFood: true, + stateHighColorMultiplier: 0.955, +} + +const swaps = { + "meat": "cooked_meat", + "kefir": "honey_kefir", + "bread": "toast", + "yogurt": "honey_yogurt", + "egg": "yolk", + "wheat": "flour", + "frozen_meat": "meat", + "coffee_beans": "coffee_ground", + "coffee_ground": "coffee", + "corn": "popcorn", + "flour": "dough", + "potato": "baked_potato", + "beet": "beet_juice", +}; +elements.prepare = { + color: "#ffe7cf", + tool: function(pixel) { + if (pixel.element in swaps) { + changePixel(pixel, swaps[pixel.element]) + } + }, + category: "tools", +}; + +if (!elements.yogurt.reactions) { // Include this block once + elements.yogurt.reactions = {} // This creates the property if it doesn't exist +} +elements.yogurt.reactions.honey = { "elem1":"honey_yogurt", "elem2":null } \ No newline at end of file diff --git a/mods/velocity2.js b/mods/velocity2.js new file mode 100644 index 00000000..ad65ee8f --- /dev/null +++ b/mods/velocity2.js @@ -0,0 +1,207 @@ +airResistance = 0.1; +terminalVelocity = 5; +gravityPull = 0.2; + +validateMoves((pixel,nx,ny) => { + if (elements[pixel.element].isGas) return true; + if (isEmpty(pixel.x,pixel.y+1) && pixel.y-ny < 0) { //goes down usually + pixel.vy = (pixel.vy||0) + gravityPull; + } + return true; +}) + +runPerPixel((pixel) => { + + let vx = pixel.vx; + let vy = pixel.vy; + if (vx === undefined ) vx = 0; + else if (Math.abs(vx) > terminalVelocity) vx = (vx + terminalVelocity) / 2; + if (vy === undefined ) vy = 0; + else if (Math.abs(vy) > terminalVelocity) vy = (vy + terminalVelocity) / 2; + + if (vx !== 0 || vy !== 0) { + + if (!elements[pixel.element].movable) { + pixel.vx = 0; + pixel.vy = 0; + return; + }; + + // Calculate change in position; Random chance for in-between decimal values + const changeX = Math.trunc(vx) + + (Math.random() < (vx % 1) ? Math.sign(vx) : 0); + const changeY = Math.trunc(vy) + + (Math.random() < (vy % 1) ? Math.sign(vy) : 0); + + const loopFor = Math.max(Math.abs(changeX),Math.abs(changeY)); + // console.log(Math.trunc(vy)); + + // let hit = false; + for (let i = 0; i < loopFor; i++) { + const newX = pixel.x + (changeX ? Math.sign(changeX) : 0); + const newY = pixel.y + (changeY ? Math.sign(changeY) : 0); + + if (!tryMove(pixel,newX,newY)) { + if (!isEmpty(newX,newY,true)) { + const newPixel = pixelMap[newX][newY]; + newPixel.vx = (newPixel.vx||0) + vx*0.6; + newPixel.vy = (newPixel.vy||0) + vy*0.6; + } + vx = vx*0.3; + vy = vy*0.3; + }; + } + + // const newX = pixel.x + changeX; + // const newY = pixel.y + changeY; + + const multiplier = (1-airResistance); + pixel.vx = vx * multiplier; + pixel.vy = vy * multiplier; + + // Cut off very low decimal values + if (Math.abs(pixel.vx) < 0.01) pixel.vx = 0; + if (Math.abs(pixel.vy) < 0.01) pixel.vy = 0; + + } + +}) + +elements.push_up = { + color: "#ffffff", + tool: function(pixel) { + pixel.vx = (Math.random() * 2) * (Math.random() < 0.5 ? 1 : -1); + pixel.vy = (Math.random() * 2) * -1; + }, + category: "special" +} + +elements.repeller = { + color: "#ffffff", + tick: function(pixel) { + var coords = circleCoords(pixel.x,pixel.y,5); + for (var i = 0; i < coords.length; i++) { + var coord = coords[i]; + if (!isEmpty(coord.x,coord.y,true)) { + if (!elements[pixelMap[coord.x][coord.y].element].movable) continue; + pixelMap[coord.x][coord.y].vx = (pixelMap[coord.x][coord.y].vx||0) + (Math.random() < 0.5 ? 1 : -1); + pixelMap[coord.x][coord.y].vy = (pixelMap[coord.x][coord.y].vy||0) -1; + } + } + }, + movable: false, + category: "machines", + emit: true +} + +viewInfo["4"] = { // Velocity View + name: "velocity", + pixel: function(pixel,ctx) { + const thermalMin = -5; + const thermalMax = 5; + + var temp = pixel.vx || 0; + var hue = Math.round((temp - thermalMin) / (thermalMax - thermalMin) * 255); + if (hue < 0) {hue = 0} + if (hue > 225) {hue = 225} + drawSquare(ctx,"hsl("+hue+",100%,50%)",pixel.x,pixel.y) + } +} + + +explodeAt = function(x,y,radius,fire="fire") { + // if fire contains , split it into an array + if (fire.indexOf(",") !== -1) { + fire = fire.split(","); + } + var coords = circleCoords(x,y,radius); + var power = radius/10; + //for (var p = 0; p < Math.round(radius/10+1); p++) { + for (var i = 0; i < coords.length; i++) { + // damage value is based on distance from x and y + var distance = (Math.floor(Math.sqrt(Math.pow(coords[i].x-x,2) + Math.pow(coords[i].y-y,2)))) / radius; + const dirX = coords[i].x > x ? 1 : -1; + const dirY = coords[i].y > y ? 1 : -1; + var damage = Math.random() + distance; + // invert + damage = 1 - damage; + if (damage < 0) { damage = 0; } + damage *= power; + if (isEmpty(coords[i].x,coords[i].y)) { + // create smoke or fire depending on the damage if empty + if (damage < 0.02) { } // do nothing + else if (damage < 0.2) { + createPixel("smoke",coords[i].x,coords[i].y); + pixelMap[coords[i].x][coords[i].y].vy = power * (1-distance) * -1; + pixelMap[coords[i].x][coords[i].y].vx = power * (1-distance) * dirX; + } + else { + // if fire is an array, choose a random item + if (Array.isArray(fire)) { + createPixel(fire[Math.floor(Math.random() * fire.length)],coords[i].x,coords[i].y); + } + else { + createPixel(fire,coords[i].x,coords[i].y); + } + pixelMap[coords[i].x][coords[i].y].vy = 2*power * (1-distance) * -1; + pixelMap[coords[i].x][coords[i].y].vx = 2*power * (1-distance) * dirX; + } + } + else if (!outOfBounds(coords[i].x,coords[i].y)) { + // damage the pixel + var pixel = pixelMap[coords[i].x][coords[i].y]; + var info = elements[pixel.element]; + if (info.hardness) { // lower damage depending on hardness(0-1) + if (info.hardness < 1) { + // more hardness = less damage, logarithmic + damage *= Math.pow((1-info.hardness),info.hardness); + } + else { damage = 0; } + } + pixel.vy = 3 * (1-distance) * -1; + pixel.vx = 3 * (1-distance) * dirX; + if (damage > 0.9) { + if (Array.isArray(fire)) { + var newfire = fire[Math.floor(Math.random() * fire.length)]; + } + else { + var newfire = fire; + } + changePixel(pixel,newfire); + // pixel.vy = 10 * damage * (Math.random() < 0.5 ? 1 : -1); + // pixel.vx = 10 * damage * (Math.random() < 0.5 ? 1 : -1); + continue; + } + else if (damage > 0.25) { + if (isBreakable(pixel)) { + breakPixel(pixel); + continue; + } + else { + if (Array.isArray(fire)) { + var newfire = fire[Math.floor(Math.random() * fire.length)]; + } + else { + var newfire = fire; + } + if (elements[pixel.element].onBreak !== undefined) { + elements[pixel.element].onBreak(pixel); + } + changePixel(pixel,newfire); + // pixel.vy = 10 * damage * (Math.random() < 0.5 ? 1 : -1); + // pixel.vx = 10 * damage * (Math.random() < 0.5 ? 1 : -1); + continue; + } + } + if (damage > 0.75 && info.burn) { + pixel.burning = true; + pixel.burnStart = pixelTicks; + } + pixel.temp += damage*radius*power; + pixel.vy = 3 * (1-distance) * -1; + pixel.vx = 3 * (1-distance) * dirX; + // console.log(pixel.vy); + pixelTempCheck(pixel); + } + } +} \ No newline at end of file diff --git a/mods/vinegar.js b/mods/vinegar.js new file mode 100644 index 00000000..ae952ab4 --- /dev/null +++ b/mods/vinegar.js @@ -0,0 +1,17 @@ +elements.acetobacter = { + color: ["#328fa8", "#6bbfd6", "#19718a"], + category: "life", + tempHigh: "102", + tempLow: "-2", + stateHigh: ["steam","steam","steam","sugar"], + stateLow: ["ice","ice","ice","sugar_ice"], + breakInto:["dna","dna","dna","water"], + behavior: [ + ["XX","M1%30","XX"], + ["M1%50","XX","M1%50"], + ["XX","M1%30","XX"] + ], + reactions:{ + "alcohol" :{ elem1: "acetobacter", elem2:"vinegar", chance:0.2,} + } +} diff --git a/offline-use.html b/offline-use.html index e2289bae..504a53e9 100644 --- a/offline-use.html +++ b/offline-use.html @@ -61,7 +61,6 @@

< Sandboxels Offline Use

-

Sandboxels can be installed for offline use on mobile. See our Mobile Use Guide.

diff --git a/presskit.html b/presskit.html new file mode 100644 index 00000000..85d597ac --- /dev/null +++ b/presskit.html @@ -0,0 +1,159 @@ + + + + + + Press Kit - Sandboxels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +

The Game

+

Sandboxels is a falling-sand simulator playable in any web browser.

+

It brings nostalgia to players of old falling-sand games. This modern take on the genre has a strong focus on chemistry, life, and even food.

+

Players are allowed to freely experiment with over 500 different materials — liquids, powders, metals, plants, bugs, gases, and more — and see how they interact with each other in real time.

+

Sandboxels is releasing on Steam for Windows and macOS. Sandboxels is and always will be available to play in the browser as well.

+ +

The Dev

+

R74n was founded in 2017 as a web collective. We published Sandboxels in late 2021, and have been marketing it on YouTube and TikTok, where it has amassed millions of views.

+ +

Official Trailer

+

Watch the official trailer we posted for the Steam release!

+ + +

Screenshots

+

You are free to use any assets or screenshots in your articles!

+ + + + +

Assets

+

Click here for all logos and assets.

+ + +

Pricing

+

Sandboxels is free to play in the browser, and the Steam version will only cost under a dollar.

+ +

Quick Facts

+

Initial release: December 15th, 2021

+

Press Email: contact@R74n.com

+

Engine: None! :] Just HTML5 and JavaScript

+ +

Quick Links

+

+

+ + +
+ + + + + + + + + + + + + + diff --git a/sitemap.txt b/sitemap.txt index 91cceb3d..a903a9e3 100644 --- a/sitemap.txt +++ b/sitemap.txt @@ -9,4 +9,5 @@ https://sandboxels.r74n.com/mobile-use https://sandboxels.r74n.com/mod-list https://sandboxels.r74n.com/offline-use https://sandboxels.r74n.com/feedback -https://sandboxels.r74n.com/tips \ No newline at end of file +https://sandboxels.r74n.com/tips +https://sandboxels.r74n.com/presskit \ No newline at end of file diff --git a/style.css b/style.css index af33c67e..48a9e883 100644 --- a/style.css +++ b/style.css @@ -50,6 +50,12 @@ a:active, a:hover:active, .saveOption:active, .saveOption:hover:active {filter: margin-top: 0!important; border: none!important; } +.standalone.mobile #savesButton, .standalone.mobile #extraInfo { + display: none +} +.standalone #extraInfo { + display: none +} #game { image-rendering: pixelated; } diff --git a/template.html b/template.html index 6a34f7ef..389908ca 100644 --- a/template.html +++ b/template.html @@ -52,7 +52,6 @@

< Sandboxels Page

-

Section

diff --git a/tips.html b/tips.html index 53cc55e5..f47566f4 100644 --- a/tips.html +++ b/tips.html @@ -58,7 +58,6 @@

< 50 Things to Do in Sandboxels

-

Sandboxels is the ultimate sandbox simulator, allowing you to experiment with chemistry, ecosystems, food, and much more, with 500+ elements, like sand, water, fire, and plants! Get started on any device with a web browser, even your phone, by visiting the WEBSITE for free!

diff --git a/translate.html b/translate.html index 0f26684f..5c51e070 100644 --- a/translate.html +++ b/translate.html @@ -52,7 +52,6 @@

< Translation

-

What's This?