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 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.js Adds several chemistry and physics-related elements lllllllllwith10ls
-
aChefsDream.js More foods, animals, tools, and other cooking items. See the YouTube Playlist for updates SquareScreamYT
-
delete_all_of_element.js Adds a tool that deletes every pixel of the element(s) the user clicks on Alice
+
chem.js Several chemistry and physics-related elements lllllllllwith10ls
+
aChefsDream.js More foods, animals, tools, and other cooking items [YouTube Playlist] SquareScreamYT
+
delete_all_of_element.js Tool that deletes every pixel of the element(s) the user clicks on Alice
survival.js With limited resources, you must craft, sell, and buy to progress R74n
-
alchemy.js Start with only 4 elements and unlock more by reacting them together. (Most are not possible) R74n
-
nousersthings.js Adds many chemical elements, compounds, and more nousernamefound
+
alchemy.js Start with only 4 elements and unlock more by reacting them together (Most are not possible) R74n
+
nousersthings.js Many chemical elements, compounds, and more nousernamefound
spring.js Many nature elements, like sakura trees, butterflies, beehives, and more R74n
-
weapons.js Adds a variety of different weapons Jayd
elementsManager.js Create and edit custom elements ggod
-
fey_and_more.js Adds fairies, magic, and a lot of other things Melecie
+
weapons.js Variety of different weapons Jayd
+
fey_and_more.js Fairies, magic, and a lot of other things Melecie
Official
-
alchemy.js Start with only 4 elements and unlock more by reacting them together. (Most are not possible) R74n
-
building.js Adds building generators and materials R74n
-
classic_explosives.js Adds back 4 explosives removed in v1.9.3 R74n
+
alchemy.js Start with only 4 elements and unlock more by reacting them together (Most are not possible) R74n
+
building.js Building generators and materials R74n
+
classic_explosives.js Re-adds 4 explosives removed in v1.9.3 R74n
classic_textures.js Use textures from early versions of the game R74n
color_everything.js Allows every element to have a custom color R74n
devtests.js Experimental features from the Sandboxels developer R74n
edible_everything.js Allows every element to be mixed into Batter and Dough R74n
-
fools.js Adds back FOOLS Mode R74n
-
fools24.js Adds back the 2024 Multiversal Update (v5.9.1) R74n
-
fools25.js Adds back the 2025 Element Modulator R74n
+
fools.js Re-adds FOOLS Mode R74n
+
fools24.js Re-adds the 2024 Multiversal Update (v5.9.1) R74n
+
fools25.js Re-adds the 2025 Element Modulator R74n
glow.js [CHROME ONLY] Adds a cool lighting effect to many emissive pixels, like Fire R74n
+
gravity_test.js Test for altered gravity, makes all pixels move inward R74n
rainbow_cursor.js Makes your cursor multicolored R74n
smooth_water.js Changes water mechanics so that it flows in one direction until it bounces off of something R74n
-
souls.js Adds Human Souls, Ectoplasm, and Tombstones R74n
+
souls.js Human Souls, Ectoplasm, and Tombstones R74n
spring.js Many nature elements, like sakura trees, butterflies, beehives, and more R74n
survival.js With limited resources, you must craft, sell, and buy to progress R74n
velocity.js Beta for explosion velocity, and later wind, which may come to the base game in the future R74n
Tools & Settings
-
-
betaworldgen.js adds a more advanced world generation to the game Adora
+
betaworldgen.js Advanced world generation Adora
betterModManager.js Improvements to the Mod Manager ggod
-
betterSettings.js Adds additional settings and functionality ggod
-
betterStats.js Separate “real” and “set” TPS, meaning you can see what the TPS actually is, instead of only seeing what it’s set to mollthecoder
+
betterSettings.js Additional settings and functionality ggod
+
betterStats.js Track actual running TPS of the simulation mollthecoder
buildingreplicator.js Scans and replicates builds anywhere on the screen, along with some preset submitted builds nousernamefound
-
change.js Adds a tool that only replaces existing pixels Alice
-
color_tools.js Adds tools that manipulate colors Alice
-
controllable_pixel_test.js Adds a pixel that can be controlled with the keyboard keys. Read the commit description for more info. [PC ONLY] Alice
-
controllable_pixel.js Adds a pixel controlled using WASD (keyboard required) Jayd
-
cpt_alt.js Adds a more destructive variant of the controllable pixel Alice
-
customtemptools.js Adds temperature tools (set/heat/cool) that you change the value of. guzzo86
+
change.js Tool that only replaces existing pixels Alice
+
color_tools.js Tools that manipulate colors Alice
+
controllable_pixel.js Pixel controlled using WASD (keyboard required) Jayd
+
cpt_alt.js Destructive variant of the controllable pixel Alice
+
customtemptools.js Customizable temperature tools guzzo86
debugRework.js Revamps the Debug tool Fioushemastor
-
delete_all_of_element.js Adds a tool that deletes every pixel of the element(s) the user clicks on Alice
-
descriptions.js Adds descriptions to the info page and tooltips of elements mollthecoder
-
editTools.js Selections, Copying, Pasting, Cutting, Shapes, and more! ggod
-
elementEraser.js Adds a tool that deletes only desired element SquareScreamYT
-
elementreplacer.js Adds a tool that replaces elements with other elements while keeping their color Suss
+
delete_all_of_element.js Tool that deletes every pixel of the element(s) the user clicks on Alice
+
descriptions.js Descriptions to the info page and tooltips of elements mollthecoder
+
editTools.js Selections, Copying, Pasting, Cutting, Shapes, and more ggod
+
elementEraser.js Tool that deletes only desired element SquareScreamYT
+
elementreplacer.js Tool that replaces elements with other elements while keeping their color Suss
elementsManager.js Create and edit custom elements ggod
-
evenmoretemptools.js Adds different temperature-modifying tools (±350/tick, NaN, and Infinity) Alice
-
extra_element_info.js Adds descriptions to various vanilla elements. Used to provide the functionality that desc now does before it was added to vanilla Melecie
-
extrasaveslots.js Adds extra saves slots !SAVE IMPORTANT SAVES AS FILES! Jayd
-
find.js Adds a find mode that highlights a chosen element as pulsating red and yellow (read commit description) Alice
-
hideandshowtools.js Adds two tools, one that hides elements, and one that shows hidden elements MicaelNotUsed
- human_friendly_design.js Makes the drag and mix tools not kill humans. Nekonico
+
evenmoretemptools.js Temperature-modifying tools (±350/tick, NaN, and Infinity) Alice
+
extra_element_info.js Descriptions to various vanilla elements. Used to provide the functionality that desc now does before it was added to vanilla Melecie
+
extrasaveslots.js Extra saves slots [KEEP IMPORTANT SAVES AS FILES!!] Jayd
+
find.js Find mode that highlights a chosen element as pulsating red and yellow [More Info] Alice
+
hideandshowtools.js Tools to hide elements and show hidden elements MicaelNotUsed
+ human_friendly_design.js Drag and Mix tools don't kill humans Nekonico
insane_random_events.js Massively buffs random events Alice
-
jaydsfunctions.js Adds extra tools Jayd
-
moretools.js Adds more temperature-modifying tools (±10/tick, ±50/tick, and absolute zero tools) Sightnado
-
move_tools.js Adds tools that move pixels Alice
-
no_scroll.js Disables scrolling, useful for Apple Magic Mouse users Crimera Games
-
noconfirm.js Removes all confirmation pop ups mollthecoder
-
page_color.js Allows changing the background color outside of the canvas with the “pageColor” query parameter Alice
-
pixelResizeTool.js Adds a button to change pixel scale feeshmaster
-
prompt.js Adds a primitive command console Alice
-
prop.js Adds tool to edit the attributes of pixels Alice
-
replace_all.js Adds a way to replace every pixel of an element with another elementRead the commit description for usage Alice
-
replace.js Adds 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.js Adds the ability to save and load scenes from files (See the info page of the element) Alice
-
selective_paint.js Adds a tool to paint only selected elements SquareScreamYT
-
stripe_paint.js Adds a tool to paint with stripes Alice
-
texturepack.js Adds tools that let you create and share custom texture packs nousernamefound
-
text.js Adds tools to write text RedBirdly
-
the_ground.js Adds several rock types, worldgen settings, and gemstones Alice
+
jaydsfunctions.js Extra tools Jayd
+
move_tools.js Tools that move pixels Alice
+
no_scroll.js Disables canvas scrolling, useful for Apple Magic Mouse users Crimera Games
+
noconfirm.js Removes all confirmation popups mollthecoder
+
page_color.js Change the page color with the "pageColor" query parameter Alice
+
pixelResizeTool.js Button to change pixel scale feeshmaster
+
prompt.js Primitive command console Alice
+
prop.js Tool to edit the attributes of pixels Alice
+
replace_all.js Way to replace every pixel of an element with another element [More Info] Alice
+
replace.js Tool that replaces every pixel of a specified element with another specified element [" to open] Alice
+
save_loading.js The ability to save and load scenes from files [See the info page of the element] Alice
+
selective_paint.js Tool to paint only selected elements SquareScreamYT
+
stripe_paint.js Tool to paint with stripes Alice
+
text.js Tools to write text RedBirdly
+
texturepack.js Tools that let you create and share custom texture packs nousernamefound
+
the_ground.js Several rock types, worldgen settings, and gemstones Alice
Science & Chemistry
-
alcohol.js Adds methanol, (iso-)propanol, and butanol Alice
-
alkahest.js Adds the alkahest, a liquid which dissolves anything Alice
-
aScientistsWish.js Adds several things that related to science and physics Carbon Monoxide, salmonfishy
-
bettermetalscrap.js Allows metal scrap to be melted back into its original material nousernamefound
-
bigger_star_spawners.js Adds spawners for larger stars Alice
-
biology.js Adds various elements and functions that let you build your own organism. Nekonico
-
bioooze_and_pyrogens.js Adds Bio-Ooze from Frackin’ Universe and several heat-producing materials from various games’ mods Alice
-
boiling_things.js Allows for various elements to be vaporized Alice
-
bouncing_balls.js Adds new types of balls that bounce accurately and roll. Nekonico
-
chalcopyrite.js Adds the chalcopyrite ore Sophie
-
charsonsmoduno.js Adds Arsenic, Beryllium, Silicon, compounds, and some non-realistic stuff, such as Aresium and Nahnium CharsonBurensen
-
chem.js Adds several chemistry and physics-related elements lllllllllwith10ls
-
clf3.js Adds Chlorine Trifluoride Alice
-
debrisable.js Expands the number of breakable elements, changes erosion, and adds way to craft certain elements from breaking other elements. Nekonico
-
fire_extinguisher.js Adds fire extinguisher blocks and realistic firefighting foam to put out nearly anything Dr_Lego
-
fire_mod.js Adds various properties to change fire behavior, & a radioactive version of fire Alice
-
fire_slime.js Adds a pyrogenic version of slime Alice
-
Gemstones.js Adds more gemstones Schweeny
-
glenn_gases.js Adds most gases from the Glenn's Gases mod into Sandboxels Alice
-
grav_mudstones.js Adds various forms of mudstone with different gravities Alice
-
halogen.js Adds the missing halogens nousernamefound
+
alcohol.js Methanol, (iso-)propanol, and butanol Alice
+
alkahest.js The alkahest, a liquid which dissolves anything Alice
+
aScientistsWish.js Several things related to science and physics Carbon Monoxide, salmonfishy
+
bettermetalscrap.js Metal scrap can be melted back into its original material nousernamefound
+
bigger_star_spawners.js Spawners for larger stars Alice
+
biology.js Various elements and features that let you build your own organism Nekonico
+
bioooze_and_pyrogens.js Bio-Ooze from Frackin' Universe and several heat-producing materials from various games' mods Alice
+
boiling_things.js Various elements can be vaporized Alice
+
bouncing_balls.js New types of balls that bounce accurately and roll Nekonico
+
chalcopyrite.js The chalcopyrite ore Sophie
+
charsonsmoduno.js Arsenic, Beryllium, Silicon, compounds, and some fake elements CharsonBurensen
+
chem.js Several chemistry and physics-related elements lllllllllwith10ls
+
clf3.js Chlorine Trifluoride Alice
+
debrisable.js Expands the number of breakable elements, changes erosion, and adds way to craft certain elements from breaking other elements Nekonico
+
fire_extinguisher.js Fire extinguisher blocks and realistic firefighting foam to put out nearly anything Dr_Lego
+
fire_mod.js Various properties to change fire behavior and radioactive fire Alice
+
fire_slime.js Pyrogenic version of slime Alice
+
Gemstones.js Gemstones Schweeny
+
glenn_gases.js Most gases from the Glenn's Gases mod into Sandboxels Alice
+
grav_mudstones.js Various forms of mudstone with different gravities Alice
+
halogen.js The missing halogens nousernamefound
hidden_ground.js Hides most rock variants from the_ground.js excluding the base rocks and walls Melecie
-
iocalfaeus_clones.js Adds Iorefrius, Iolucius, and Ioradius gas Alice
-
jaydstuff.js Adds various chemicals and compounds Jayd
-
laetium.js Adds several fictional elements Alice
-
liquid_energy.js Adds liquid versions of the elements in the Energy category Alice
-
liquid_mixing.js Allows liquids to mix colors dynamically Nekonico
-
lye.js Adds lye BatteRaquette58
-
mars.js Adds some things from Mars with 2 minerals to smelt. charcoal_afterlife
-
metals.js Adds several metals Alice
-
mixture.js Allows many chemicals to be mixed lllllllllwith10ls
-
more_gold.js Adds Green Gold pixelegend4
-
morechemistry.js Adds many new chemicals and compounds as well as some new machines Adora
-
moreliquids.js Adds various liquids te-agma-at
-
nellfire.js Adds a weird transforming flame and several rock types Alice
-
Neutronium Mod.js Variety of scientific elements Explosions StellarX20
-
neutronium_compressor.js Adds a compressor (in reference to Minecraft’s Avaritia mod) that compresses 10,000 pixels of an element into a “singularity” Alice
-
noblegas.js Adds the missing noble gases nousernamefound
-
nousersthings.js Adds many chemical elements, compounds, and more nousernamefound
-
radioactive.js Adds every radioactive elements on the periodic table (WIP) kaeud
+
iocalfaeus_clones.js Iorefrius, Iolucius, and Ioradius gas Alice
+
jaydstuff.js Various chemicals and compounds Jayd
+
laetium.js Several fictional elements Alice
+
liquid_energy.js Liquid versions of the elements in the Energy category Alice
+
liquid_mixing.js Liquids can mix colors dynamically Nekonico
+
lye.js Lye BatteRaquette58
+
mars.js Martian materials charcoal_afterlife
+
metals.js Several metals Alice
+
mixture.js Many chemicals can be mixed lllllllllwith10ls
+
more_gold.js Green Gold pixelegend4
+
morechemistry.js New chemicals, compounds, and machines Adora
+
moreliquids.js Various liquids te-agma-at
+
neutronium_compressor.js Compressor from Minecraft's Avaritia mod that compresses 10,000 pixels of an element into a singularity Alice
+
noblegas.js The missing noble gases nousernamefound
+
nousersthings.js Many chemical elements, compounds, and more nousernamefound
+
radioactive.js Radioactive elements on the periodic table [WIP] kaeud
random_rocks.js Randomly generates rocks on game load Alice
-
roseyiede.js Adds several variants of a substance called roseyiede Alice
-
some_tf_liquids.js Adds various liquids from the Thermal Foundation Minecraft mod Alice
-
stickystuff.js Allows slime, honey and all things normally sticky to stick to other elements Suss
-
the_ground.js Adds several rock types, worldgen settings, and gemstones Alice
+
roseyiede.js Several variants of a substance called roseyiede Alice
+
some_tf_liquids.js Various liquids from the Thermal Foundation Minecraft mod Alice
+
stickystuff.js Slime, Honey, and others can stick to other elements Suss
+
the_ground.js Several rocks, worldgen types, and gemstones Alice
Machines & Technology
-
circuitcore.js An extension to logicgates.js that adds advanced circuits. Documentation . RedBirdly
-
clone_liquid.js Adds a liquid form of cloner Alice
-
colored_lightbulbs.js Adds a light bulb that can be painted. guzzo86, ggod
-
combustion.js Adds components necessary for combustion engines uptzik
+
circuitcore.js Extension for logicgates.js that adds advanced circuits [More Info] RedBirdly
+
clone_liquid.js Liquid form of cloner Alice
+
colored_lightbulbs.js Light bulb that can be painted guzzo86, ggod
+
combustion.js Components necessary for combustion engines uptzik
conveyance.js Conveyors, operated with and without electricity Melecie
-
drill.js Adds drills made out of several materials Suss
-
ExtraMachines.js Adds sensors, energy resources, materials, and more Mecoolnotcool
-
fine_tuned_cloner.js Adds a cloner that can spawn at different rates and prevent unwated cloning BatteRaquette58
-
flipflop.js Toggleable switches; Explanation Flix
-
fueled_generators.js Fuel powered generators.
+
drill.js Drills made out of several materials Suss
+
ExtraMachines.js Sensors, energy resources, materials, and more Mecoolnotcool
+
fine_tuned_cloner.js Cloner that can spawn at different rates and prevent unwanted cloning BatteRaquette58
+
flipflop.js Toggleable switches [More Info] Flix
+
fueled_generators.js Fuel powered generators guzzo86
gameOfLife.js Conway's Game of Life on a screen ggod
-
heatshield.js adds heatshields, makes plasma cooler Taterbob
-
human_friendly_design.js Makes pipes and portals not kill humans, as well as making drag and mix not kill humans. Nekonico
-
logicgates.js Adds predictable electricity and logic gates nousernamefound
-
note_block.js Adds musical Note Blocks Alice
+
heatshield.js Heatshields, makes Plasma cooler Taterbob
+
human_friendly_design.js Pipes, Portals, Drag, and Mix don't kill humans Nekonico
+
logicgates.js Predictable electricity and logic gates nousernamefound
+
note_block_advanced.js Edit of Alice's note_block.js, adds different blocks with different frequencies CharsonBurensen
+
note_block.js Musical Note Blocks Alice
nousersthings.js Destroyable machines, pipe variants, filters, and more nousernamefound
-
portal.js Adds portals that can teleport pixels Alice
-
pullers.js Adds pixels that pull pixels towards them voidapex11
-
pushers.js Adds pixels that push elements away from them Alice
-
sandboxels.js Adds a digital screen to play a mini version of Sandboxels Nekonico
-
spouts.js Adds spouts for all liquids kaeud
-
state_voids.js Adds several elements that each delete a specific state of matter (and combinations thereof) Alice
-
switches.js Adds electrical switches that can be toggled Alice
-
ticking_temp_stuff.js Adds more heaters and coolers Alice
-
video.js Adds a video player ggod
-
waterspout.js Adds back the old Water Spout mollthecoder
-
WhisperingTheory.js Adds many more variants of heater and cooler kaeud
+
portal.js Portals that can teleport pixels Alice
+
pullers.js Pixels that pull pixels towards them voidapex11
+
pushers.js Pixels that push elements away from them Alice
+
sandboxels.js Digital screen to play a mini version of Sandboxels Nekonico
+
spouts.js Spouts for all liquids kaeud
+
state_voids.js Several elements that delete specific states of matter Alice
+
switches.js Electrical switches that can be toggled Alice
+
ticking_temp_stuff.js Heater and Cooler variants Alice
+
video.js Video player ggod
+
waterspout.js Re-adds the old Water Spout mollthecoder
+
WhisperingTheory.js Many more variants of heater and cooler kaeud
wifi_draw.js Draws connections between WiFi in wifi.js and logicgates.js RedBirdly
Weapons
-
aircrafts.js Adds aircraft and aircraft part pixels Jayd
-
c_fighter_jet.js Adds a controllable fighter jet, wasd to move, q+wasd to shoot, gvbn for missiles. Jayd
-
guided_rocket.js Adds a homing misile. voidapex11
-
icb.js Adds various levels of nested cluster bombs Alice
-
life_eater.js Adds Warhammer 40,000’s Life-Eater Virus and Virus Bombs Alice
-
liquid_void.js Adds a liquid variant of Void Alice
-
meat_rockets.js Adds rockets that create meat when exploding Melecie
-
more_breaking.js Allows for breaking more elements in explosions Alice
-
rays.js Adds more Ray types Alice
-
rays++.js Adds a couple more rays uptzik
-
subspace.js Adds the Subspace Tripmine from Roblox nousernamefound
-
war_crimes.js Adds tear gas & more voidapex11
-
weapons.js Adds a variety of different weapons Jayd
+
aircrafts.js Aircrafts and aircraft parts Jayd
+
c_fighter_jet.js Controllable fighter jet [WASD to move, Q+WASD to shoot, GVBN for missiles] Jayd
+
guided_rocket.js Homing misile voidapex11
+
icb.js Various levels of nested cluster bombs Alice
+
life_eater.js Warhammer 40,000's Life-Eater Virus and Virus Bombs Alice
+
liquid_void.js Liquid variant of Void Alice
+
meat_rockets.js Rockets that create meat when exploding Melecie
+
more_breaking.js More elements can be broken Alice
+
rays.js More Ray types Alice
+
rays++.js Couple more rays uptzik
+
subspace.js The Subspace Tripmine from Roblox nousernamefound
+
war_crimes.js Tear gas and more voidapex11
+
weapons.js Variety of different weapons Jayd
Food & Cooking
-
aChefsDream_beta.js Beta testing for aChefsDream. The code can be found on GitHub SquareScreamYT
+
aChefsDream_beta.js Beta testing for aChefsDream.js SquareScreamYT
+
aChefsDream.js More foods, animals, tools, and other cooking items [YouTube Playlist] SquareScreamYT
aChefsDream2.js The sequel to aChefsDream.js, with brand new elements and tools SquareScreamYT
-
aChefsDream.js More foods, animals, tools, and other cooking items. See the YouTube Playlist for updates SquareScreamYT
-
bananas.js Adds bananas and banana plants Alice
-
CherrySoda.js Adds materials to make Cherry soda. Benzaldehyde + seltzer = Cherrysoda. guzzo86
-
community_desserts.js Adds various desserts from community suggestions Tisquares
-
GrapeSoda.js Adds materials to make Grape soda. Methylanthranilic acid + seltzer = Cherrysoda. guzzo86
-
greenitemsandmore.js Adds various green things, including apples and more food zonneschijn7
-ketchup_mod.js Adds a bunch of ketchup related stuff, plus a few other condiments Nubo318 (main dev), Devi, Alice (contributors)
-
lemonade.js Adds lemons and lemonade personman / baconthemyth
-
morefoodsmod.js Adds more foods Clide4
+
bananas.js Bananas and banana plants Alice
+
CherrySoda.js Materials to make cherry soda guzzo86
+
community_desserts.js Various desserts from community suggestions Tisquares
+
GrapeSoda.js Materials to make grape soda guzzo86
+
greenitemsandmore.js Various green things, including apples and more food zonneschijn7
+ketchup_mod.js Many ketchup related elements, plus a few other condiments Nubo318, Devi, Alice
+
lemonade.js Lemons and lemonade personman, baconthemyth
+
morefoodsmod.js More foods Clide4
pizzasstuff.js New animals, foods, and plants _ilikepizza_
-
potato_chips.js Potato chips. guzzo86
-
sbstuff.js Adds many foods stefanblox
-
soups.js Adds seasoning and soup pixelegend4
-
weAllScreamFor.js Adds ice cream toppings rottenEgghead
+
potato_chips.js Potato chips and sunflower oil guzzo86
+
sbstuff.js Many foods stefanblox
+
soups.js Seasoning and soup pixelegend4
+
weAllScreamFor.js Ice cream toppings rottenEgghead
Life & Nature
-
apioforms_pre.js An incomplete implementation of elements from the Apioform Game Alice
-
baby.js Adds various babies Suss
-
bacteria_mod.js Adds content from the Bacterium Mod : (Bacteria, Replacer B., Jammer Block) Alice
-
bananas.js Adds bananas and banana plants Alice
-
biology.js Adds various elements and functions that let you build your own organism. Nekonico
-
cat.js Adds cats and cat food SquareScreamYT
-
cells.js Adds several experimental edits of the Cell element Alice
-
children.js Adds pesky little gremlins Taterbob
-
colonies.js Adds rockets that contain settlers to terraform a planet. Nekonico
-
crimson.js Adds elements relating to the Crimson from Terraria Alice
-
dogs.js Adds a simple dog and dog food hedera-ivy
-
fairy_chain.js Adds way too many fairies to fey_and_more.js Alice
-
fantastic_creatures.js Adds various animals Melecie
+
apioforms_pre.js Incomplete implementation of elements from the Apioform Game Alice
+
baby.js Various babies Suss
+
bacteria_mod.js Content from Minecraft's Bacterium Mod Alice
+
bananas.js Bananas and banana plants Alice
+
biology.js Various elements and features that let you build your own organism Nekonico
+
cat.js Cats and cat food SquareScreamYT
+
cells.js Several experimental edits of the Cell element Alice
+
children.js Pesky little gremlins Taterbob
+
colonies.js Rockets that contain settlers to terraform a planet Nekonico
+
crimson.js Elements relating to the Crimson from Terraria Alice
+
dogs.js Simple dog and dog food hedera-ivy
+
fairy_chain.js Way too many fairies to fey_and_more.js Alice
+
fantastic_creatures.js Various animals Melecie
fantasy_elements.js Fantasy creatures and substances pixelegend4
-
fey_and_more.js Adds fairies, magic, and a lot of other things Melecie
-
fishin.js Adds 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.js adds trees and flowers and things to do with nature pixelegend4 and SquareScreamYT
-
fwibblen.js Adds a flying creature that turns nickel into itself, and a second creature that does the same to the first one Alice
-
genetics.js Adds an organism that evolves and changes as it creates more of itself by eating, and adapts to environment. Nekonico
+
fey_and_more.js Fairies, magic, and a lot of other things Melecie
+
fishin.js Fishing rod and more fish with scientific names [More Info] Nekonico
+
flowers_and_forests.js Trees and flowers pixelegend4, SquareScreamYT
+
fwibblen.js Flying creature that turns nickel into itself, and another that does the same to the first one Alice
+
genetics.js Organism that evolves and changes as it creates more of itself by eating Nekonico
human_edit.js Improvements to humans Alice
-
Humanitize.js Makes humans cultured and able to craft, mine, build houses, trade, and much more. Nekonico
-
kopalstuff.js Adds creatures, spirits, DNA, foods, and more DaviStudios
-
lizard_mod.js Adds lizards to sandboxels. RedBirdly
-
lost_souls.js Adds souls and related elements, the mod can also be found on Github pixelegend4, SquareScreamYT, salmonfishy
-
miscible_psoup_and_birthpool.js Makes Primordial Soup and Birthpool mix instead of the birthpool settling to the bottom. Will be deprecated upon the release of Magical Menagerie Alice
-
mobs.js Adds Creepers, Zombies, and Skeletons Alice
-
moretrees.js Adds 25 more tree & wood types. guzzo86
-
nocancer.js Removes cancer from the game one tick after it is created mollthecoder
-
nocancer2.js Removes cancer from the game altogether. May be incompatible with other mods that spawn cancer mollthecoder
+
Humanitize.js Humans are cultured and able to craft, mine, build houses, trade, and more Nekonico
+
kopalstuff.js Creatures, spirits, DNA, foods, and more DaviStudios
+
lizard_mod.js Lizards RedBirdly
+
lost_souls.js Souls and related elements pixelegend4, SquareScreamYT, salmonfishy
+
miscible_psoup_and_birthpool.js Primordial Soup and Birthpool can mix (fey_and_more.js) Alice
+
mobs.js Creepers, Zombies, and Skeletons Alice
+
moretrees.js 25 more tree and wood types guzzo86
+
nocancer.js Removes cancer one tick after it is created mollthecoder
+
nocancer2.js Removes cancer from the game altogether; May be incompatible with other mods that spawn cancer mollthecoder
nograssgrow.js Prevents Grass from growing mollthecoder
-
ocean.js Adds many Marine life SquareScreamYT
-
ores.js Adds ore generation along with tools to mine them nousernamefound
+
ocean.js Marine life SquareScreamYT
+
ores.js Ore generation along with tools to mine them nousernamefound
pizzasstuff.js New animals, foods, and plants _ilikepizza_
-
plants.js Adds a wide variety of new plants and fruits Adora
-
primordial_birthpool.js A cross between Primordial Soup and Birthpool. Requires F&M Alice
+
plants.js Wide variety of new plants and fruits Adora
+
primordial_birthpool.js Cross between Primordial Soup and Birthpool. Requires fey_and_more.js Alice
spring.js Many nature elements, like sakura trees, butterflies, beehives, and more R74n
the_ground_og.js Simplified and more stable version of the_ground.js Alice
-
the_ground.js Adds several rock types, worldgen settings, and gemstones Alice
+
the_ground.js Several rock types, worldgen settings, and gemstones Alice
toothpaste.js Teeth and paste Alice
-
volcanic_expansion.js Adds Obsidian, Pumice, and Andesite rocks Jayd
+
volcanic_expansion.js Obsidian, Pumice, and Andesite rocks Jayd
Fun & Games
-
10kelements.js Inserts a customizable amount of randomly generated elements into the game nousernamefound
-
all_around_fillers.js Adds directional Filler variants idk73248
+
10kelements.js Customizable amount of randomly generated elements nousernamefound
+
all_around_fillers.js Directional Filler variants idk73248
allliquids.js Made all elements liquids Adora
-
amogus.js Adds a small amogus structure Alice
-
bfdi.js Adds several references to bfdi Taterbob
-
citybuilding.js Adds seeds that create miniature buildings and other city-related items SquareScreamYT
+
amogus.js Small Among Us structure Alice
+
bfdi.js Several references to Battle for Dream Island Taterbob
+
citybuilding.js Seeds that create miniature buildings and other city-related items SquareScreamYT
collab_mod.js Created by multiple people, adds random things mrapple, ilikepizza, stefanblox
-
doom.js As seen on TikTok - Select the Doom element to start, WASD ggod
-
elem3.js Adds all elements and combinations from Elemental 3 [Very Large] Sophie
-
fishin.js Adds 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+.js improves and makes fools.js EXTREMELY annoying. SquareScreamYT
-
funny elements 2022-11-15.js Adds a few curated randomly-generated elements Alice
-
funny_solid.js Adds feces Alice
-
funnynames.js Adds various ways to mess with the names of elements nousernamefound
-
haseulite.js Adds Loona-related materials with various properties Alice
-
lactose_intolerance_and_celiac.js Makes humans explode on contact with milk, wheat, bread, or toast Nubo318
-
lattice_filler.js Adds a combination of lattice and filler and a destructive variant Suss
-
liquid_mixing.js Allows liquids to mix colors dynamically Nekonico
-
lone_urea.js Adds urea without the rest of the piss mod Alice
-
maze.js Adds a solvable maze generator ggod
-
memelists.js Makes it so you must select elements through a list at the bottom of the page. We like lists mollthecoder
-
minecraft.js Adds several things from Minecraft StellarX20, nousernamefound
-
minesweeper.js A subpar implementation of Minesweeper Alice
+
doom.js As seen on TikTok - Select the Doom element to start [WASD to move] ggod
+
elem3.js All elements and combinations from Elemental 3 [Very Large] Sophie
+
fishin.js Fishing rod and more fish with scientific names [More Info] Nekonico
+
fools+.js Improves and makes fools.js extremely annoying SquareScreamYT
+
funny elements 2022-11-15.js Few curated randomly-generated elements Alice
+
funny_solid.js Feces Alice
+
funnynames.js Various ways to mess with the names of elements nousernamefound
+
haseulite.js Loona-related materials with various properties Alice
+
lactose_intolerance_and_celiac.js Humans explode on contact with milk, wheat, bread, or toast Nubo318
+
lattice_filler.js Combination of lattice and filler and a destructive variant Suss
+
liquid_mixing.js Liquids can mix colors dynamically Nekonico
+
lone_urea.js Urea Alice
+
maze.js Solvable maze generator ggod
+
memelists.js You must select elements through a list at the bottom of the page mollthecoder
+
minecraft.js Several things from Minecraft nousernamefound
+
minesweeper.js Implementation of Minesweeper Alice
musicalfruit.js Humans get gas from eating Beans mollthecoder
-
nekonicos_stuff.js Random stuff like graphite, oobleck, and red ice, as well as many machines. Nekonico
-
prideflags.js Adds some pride flags to the game Adora
+
nekonicos_stuff.js Random stuff like graphite, oobleck, and red ice, as well as many machines Nekonico
+
prideflags.js Some pride flags to the game Adora
random_elems.js Curated randomly generated elements Alice
random_liquids.js Randomly generates liquids on game load Alice
-
sbmixup.js Adds silly elements from a Mix-Up! game stefanblox
-sports_beta.js Adds several sports items BluBun5193
-
star_wars.js Adds various items from Star Wars by Disney SeaPickle754
-sus.js Adds an Among Us crewmate Nv7
-
triggerable_random_powders.js Adds powders with different abilities, such as heating and cooling Alice
-
troll.js Adds various dumb elements that iterate randomly on the entire screen Alice
-
WhisperingTheory.js Adds powder and gas variant of heater and cooler kaeud
+
sbmixup.js Silly elements from a Mix-Up! game stefanblox
+sports_beta.js Several sports items BluBun5193
+
star_wars.js Various items from Star Wars by Disney SeaPickle754
+sus.js Among Us crewmate Nv7
+
triggerable_random_powders.js Powders with different abilities, such as heating and cooling Alice
+
troll.js Various dumb elements that iterate randomly on the entire screen Alice
+
WhisperingTheory.js Powder and gas variant of heater and cooler kaeud
Visual Effects
-
acid_and_shapes.js Weird visual effects. Enable in Settings Alice
-
clouds.js Adds moving clouds, recommended to include sky.js too RedBirdly
+
acid_and_shapes.js Weird visual effects enabled in settings Alice
+
clouds.js Moving clouds, sky.js recommended RedBirdly
customBackground.js Set your background to an image link Jayd
-
fast_lightmap.js Makes light sources glow, but the fast version RedBirdly
-
fractals.js Adds an element and tools to render fractals in game nousernamefound
-
hexagon_test.js Makes pixels look like hexagons RedBirdly
+
fast_lightmap.js Light sources glow, but faster RedBirdly
+
fractals.js Element and tools to render fractals in game nousernamefound
heatglow.js Red glowing effect for hot metals nousernamefound
-
invisible_dye.js Adds elements like Dye and Spray Paint that take the color of the background Alice
-
invisible_wall.js Adds an element like Wall that takes the color of the background Alice
-
lightmap.js Makes light sources glow RedBirdly
-
liquid_mixing.js Allows liquids to mix colors dynamically Nekonico
+
hexagon_test.js Pixels look like hexagons RedBirdly
+
invisible_dye.js Elements like Dye and Spray Paint that take the color of the background Alice
+
invisible_wall.js Element like Wall that takes the color of the background Alice
+
lightmap.js Light sources glow RedBirdly
+
liquid_mixing.js Liquids can mix colors dynamically Nekonico
moreViews.js Many new rendering modes ggod
-
nicer_flame.js Makes fire visually pleasing RedBirdly
-
occlusion.js Adds realistic shadows (similar to Terraria's lighting) RedBirdly
-
onecolor.js Makes all placed pixels single-colored nousernamefound
-
paint_event.js Adds a random event that randomly paints a circle Alice
-
rainbow_tests.js Adds variants of the rainbow element with different maths Alice
-
real_light.js Changes 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.js Adds a glow around light elements Jayd
-
Shroomboxels.js A variant of acid_and_shapes.js that uses a different trigonometric function Alice
-
singleColor.js Makes all elements pick one color each time they're drawn stefanblox
-
sky.js Adds a day-night cycle RedBirdly
-
solidcolor.js Makes all placed pixels have a solid color (clone of onecolor.js) SquareScreamYT
-
texture_pack_by_jayd.js Adds a cool background Jayd
-
UwUify.js Adds an "UwU" background Jayd
-
+
nicer_flame.js Fire is visually pleasing RedBirdly
+
occlusion.js Realistic shadows, similar to Terraria's lighting RedBirdly
+
onecolor.js Placed pixels are single-colored nousernamefound
+
paint_event.js Random event that randomly paints a circle Alice
+
rainbow_tests.js Variants of the rainbow element with different maths Alice
+
real_light.js Everything is dark unless hit with a photon (Light) pixel, hot, or glowing Nekonico
+
shader_by_jayd.js Glow around light elements Jayd
+
Shroomboxels.js Variant of acid_and_shapes.js that uses a different trigonometric function Alice
+
singleColor.js Elements pick one color each time they're drawn stefanblox
+
sky.js Day-night cycle RedBirdly
+
solidcolor.js Placed pixels have a solid color SquareScreamYT
+
texture_pack_by_jayd.js Cool background Jayd
+
UwUify.js "UwU" background Jayd
Compilations
-
food_mods.js A mod combining most food mods stefanblox, moss, Tisquares, SquareScreamYT, Adora, pixelegend4, Alice, Nubo318, Clide4, rottenEgghead
+
food_mods.js Combination of most food mods stefanblox, moss, Tisquares, SquareScreamYT, Adora, pixelegend4, Alice, Nubo318, Clide4, rottenEgghead
Technical Libraries & Tests
1.10example.js Examples for modern rendering modding and more R74n
a_bundle_of_tests.js Several test functions Alice
-
all_stain.js Makes every element stain solids stefanblox
+
all_stain.js Every element stains solids stefanblox
betterMenuScreens.js Library for mods to create their own menus ggod
-
changePixelDebug.js Makes the changePixel() function abort and log to console when it tries to change to a non-existent element Alice
-
changeTempReactionParameter.js Adds the changeTemp property to modded reactions Alice
-
code_library.js Adds functions and variables common to some other mods Alice
-
customexplosion.js Added a custom explosion element and interface for it. check out its source code for how modders can use it. Alex
+
changePixelDebug.js The changePixel() function aborts and logs to console when it tries to change to a non-existent element Alice
+
changeTempReactionParameter.js The changeTemp property to modded reactions Alice
+
code_library.js Functions and variables common to some other mods Alice
+
controllable_pixel_test.js Pixel that can be controlled with the keyboard keys [More Info] [PC ONLY] Alice
+
customexplosion.js Added a custom explosion element and interface for it. check out its source code for how modders can use it Alex
date_test.js K-pop idol birthday testing stuff Alice
-
drawPixels_change_test.js A test of altering drawPixels(). Gives burning pixels a red overlay similar to the yellow overlay for charged pixels Alice
-
example_mod.js An example mod for new modders R74n
+
drawPixels_change_test.js Test of altering drawPixels(). Gives burning pixels a red overlay similar to the yellow overlay for charged pixels Alice
+
example_mod.js Example mod for new modders R74n
explodeAtPlus.js Extension of the explodeAt function with more options Alice
fill_script.js Script that fills an area TealEgg#7646
generative_mods.js Modpack with optional mass element generation Alice
-
generator_prompt.js Adds a prompt to use generative_mods.js’s element generators after the game finishes loading Alice
+
generator_prompt.js Prompt to use generative_mods.js's element generators after the game finishes loading Alice
gradient_background_support.js Enables linear gradients for backgrounds as arrays in settings.bg Alice
libpacman-v1.js Library for making mods mollthecoder
libpixeltracking.js Library for tracking pixels mollthecoder
-
maxColorOffset.js Adds a property to specify how much a pixel’s color can be randomly offset from the element color Alice
-
modlangs.js Adds 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.js An example of using a nested for loop to add reactions. It makes various things kill plants Alice
-
nv7.js Adds a giant Nv7 image [Large] Nv7
+
maxColorOffset.js Property to specify how much a pixel's color can be randomly offset from the element color Alice
+
modlangs.js 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.js Example of using a nested for loop to add reactions. It makes various things kill plants Alice
+
nv7.js Giant Nv7 image [Large] Nv7
place_all_elements.js Experimental function that places every pixel Alice
randomness_but_tick.js Random experimental elements using the tick function feature Alice
randomness_but_tool.js Random experimental elements using the tool function feature Alice
randomness.js Random experimental elements Alice
-
scenexe.js Work-in-progress mod, allows you to move through and damage a simulated field of polygons nousernamefound
+
scenexe.js Move through and damage a simulated field of polygons [WIP] nousernamefound
structure_test_2.js Another test for implementing structures into Sandboxels (requires the previous test) Alice
-
structure_test.js A test for implementing structures into Sandboxels Alice
-
test.js A test mod that adds mayo :) R74n
+
structure_test.js Test for implementing structures into Sandboxels Alice
+
test.js Test that adds mayo :) R74n
tool_pixel_behavior.js Gives unique behaviors to tools if placed with cheats Alice
-
worldgen_test.js Adds an element that generates a save with a grass layer, dirt layer, rock layer, and a pond Alice
+
worldgen_test.js Element that generates a save with a grass layer, dirt layer, rock layer, and a pond Alice
Broken or Deprecated
-
a_mod_by_alice.js A mod combining most of Alice’s mods, and some other things Alice
-
advanced_colonies.js Adds davlers, creatures with complex colonies DaviStudios
-
humans.js Adds humans. Now part of the base game R74n
+
a_mod_by_alice.js Combination of most of Alice's mods, and some other things Alice
+
adjustablepixelsize.js Set the pixelSize with a URL parameter Alice
+
advanced_colonies.js Davlers, creatures with complex colonies DaviStudios
+
humans.js Humans. Now part of the base game R74n
invertscroll.js Inverts the scroll wheel for adjusting brush size (now a setting) SquareScreamYT
-
mobile_shift.js Adds a button for shift on mobile (Now in the base game) SquareScreamYT
+
mobile_shift.js Button for shift on mobile (Now in the base game) SquareScreamYT
nopixellimit.js Removes the pixel limit. (now a setting) Jayd
unhide.js Unhides all elements except molten ones. (This functionality now exists as a vanilla setting) R74n
wheel_fix.js Attempts to fix the brush scaling too much with the mouse wheel for some people. Deprecated Nubo318
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.start
pixelTicks) {
+ 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 May 16th, 2025 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?