Version 1.11.1 - April 1, 2025 - FOOLS-2-5

[Version 1.11.1 - April 1, 2025 - FOOLS-2-5]
    + Border setting
        + Void deletes pixels that touch the sides
        + Loop teleports pixels that touch the sides
    ~ Improved Thermal View now uses hottest and coldest pixels as bounds
    + Finnish and Indonesian languages
   [FOOLS]
    + Element Modulator
    + FOOLS Mode is back!
    ~ Note: FOOLS features will disappear April 4th
   [Changes]
    + Keybind: Ctrl+O to load a save file
    + Keybind: Ctrl+Shift+O to reload the last loaded save
    + Flame test can be done on elements with fire colors
    + Honey and Molasses freeze into Candy
    + 'Golden Wind' Tornado variant
    + Milk variants can be churned into Butter
    + Udders can absorb certain liquids to produce Milk variants
    + Cheese can be made with Cream
    + Soda foam has a unique color
    + Candy dissolves in Water
    + Void is insulative
    + Bless stops panic in Humans
    + Gunpowder explodes when shocked
    + Ozone can cure Infection
    + Dust and Ash dirty Seltzer
    + Calcium can react with Steam
    + Magnesium reacts with Water and Steam
    + Sponges can release Water absorbed from soils
    + Sponges separate Water variant contents
    + Primordial Soup can freeze
    + Positrons shock Antimatter
    ~ Antimatter no longer explodes when touching Cloners
    ~ Thermite burns into Molten Iron
    + Acid stains Silver
    ~ Tweaked Acid-Potassium reaction
    ~ Frogs have a unique egg color
    ~ Molten Rad Glass is greener
    ~ Recolored Pilk Cheese
    ~ Bless removes Filler, Lattice, Vertical, and Horizontal
    ~ Copper Sulfate is no longer flammable
    + Copper Sulfate produces Poison Gas when burned
    + Baking Soda alias 'Sodium Bicarbonate'
    + Cellulose alias 'Paper Paste'
    + Cyanide alias 'Hydrogen Cyanide'
    + Acid Gas alias 'Hydrochloric Acid Gas'
    + Adobe alias 'Mud Brick'
    + Saves can keep Limitless Mode if settings are included
    ~ Saves no longer update cursor size
    + Partial translations for Dutch, Korean, Italian, Serbian, and Emoji
    ~ Halacae translations completed
    ~ Prompt inputs no longer allow autocomplete
   [Bug Fixes]
    ~ Fixed: Half-pixels on the edges of smaller canvases
    ~ Fixed: LEDs can create ghost pixels when absorbing Light
    ~ Fixed: Eggs break when placed with Drag tool
    ~ Fixed: Frozen Yogurt variants don't retain color when melting
    ~ Fixed: Frozen elements aren't generated properly when no state is present
    ~ Fixed: Tea and Coffee start boiling when placed manually
    ~ Fixed: Duplicate mods can be added
    ~ Fixed: Portals can't teleport pixels being dragged
    ~ Fixed: Embers are never deleted when Burning is disabled
    ~ Fixed: Mix tool can be used on ghost pixels
    ~ Fixed: Saves can set cursor size to impossible sizes
    ~ Fixed: colorOn isn't applied by reactions
   [Technical]
    + Mod dependency system, see dependency_test.js for more info
    + Elements can be added dynamically with addElement()
    + onAddElement(callback) function, called when element is added dynamically
    + loadedMods array holds mods that have been loaded
    + onSelect and onUnselect properties for custom views
    + Portals display channel on hover
    + 'mouseColor' setting
    ~ Unknown is now in the Special category (Still hidden)
    ~ Save version is now sb4 and includes new border settings
This commit is contained in:
slweeb 2025-04-01 11:52:52 -04:00
parent 1c210e0e23
commit 372de694d0
58 changed files with 18597 additions and 25208 deletions

View File

@ -109,6 +109,84 @@
<p>The original <a href="https://sandboxels.R74n.com/changelog.txt">plain text version</a> of this is still maintained.</p>
</div>
<h2 id="1.11.1">[Version 1.11.1 - April 1, 2025 - FOOLS-2-5]</h2>
<ul>
<li>+ Border setting</li>
<li> + Void deletes pixels that touch the sides</li>
<li> + Loop teleports pixels that touch the sides</li>
<li>+ Finnish and Indonesian languages</li>
<li>[FOOLS]</li>
<li>+ Element Modulator</li>
<li>+ FOOLS Mode is back!</li>
<li>~ Note: FOOLS features will disappear April 4th</li>
<li>[Changes]</li>
<li>~ Improved Thermal View now uses hottest and coldest pixels as bounds</li>
<li>+ Keybind: Ctrl+O to load a save file</li>
<li>+ Keybind: Ctrl+Shift+O to reload the last loaded save</li>
<li>+ Flame test can be done on elements with fire colors</li>
<li>+ Honey and Molasses freeze into Candy</li>
<li>+ 'Golden Wind' Tornado variant</li>
<li>+ Milk variants can be churned into Butter</li>
<li>+ Udders can absorb certain liquids to produce Milk variants</li>
<li>+ Cheese can be made with Cream</li>
<li>+ Soda foam has a unique color</li>
<li>+ Candy dissolves in Water</li>
<li>+ Void is insulative</li>
<li>+ Bless stops panic in Humans</li>
<li>+ Gunpowder explodes when shocked</li>
<li>+ Ozone can cure Infection</li>
<li>+ Dust and Ash dirty Seltzer</li>
<li>+ Calcium can react with Steam</li>
<li>+ Magnesium reacts with Water and Steam</li>
<li>+ Sponges can release Water absorbed from soils</li>
<li>+ Sponges separate Water variant contents</li>
<li>+ Primordial Soup can freeze</li>
<li>+ Positrons shock Antimatter</li>
<li>~ Antimatter no longer explodes when touching Cloners</li>
<li>~ Thermite burns into Molten Iron</li>
<li>+ Acid stains Silver</li>
<li>~ Tweaked Acid-Potassium reaction</li>
<li>~ Frogs have a unique egg color</li>
<li>~ Molten Rad Glass is greener</li>
<li>~ Recolored Pilk Cheese</li>
<li>~ Bless removes Filler, Lattice, Vertical, and Horizontal</li>
<li>~ Copper Sulfate is no longer flammable</li>
<li>+ Copper Sulfate produces Poison Gas when burned</li>
<li>+ Baking Soda alias 'Sodium Bicarbonate'</li>
<li>+ Cellulose alias 'Paper Paste'</li>
<li>+ Cyanide alias 'Hydrogen Cyanide'</li>
<li>+ Acid Gas alias 'Hydrochloric Acid Gas'</li>
<li>+ Adobe alias 'Mud Brick'</li>
<li>+ Saves can keep Limitless Mode if settings are included</li>
<li>~ Saves no longer update cursor size</li>
<li>+ Partial translations for Dutch, Korean, Italian, Serbian, and Emoji</li>
<li>~ Halacae translations completed</li>
<li>~ Prompt inputs no longer allow autocomplete</li>
<li>[Bug Fixes]</li>
<li>~ Fixed: Half-pixels on the edges of smaller canvases</li>
<li>~ Fixed: LEDs can create ghost pixels when absorbing Light</li>
<li>~ Fixed: Eggs break when placed with Drag tool</li>
<li>~ Fixed: Frozen Yogurt variants don't retain color when melting</li>
<li>~ Fixed: Frozen elements aren't generated properly when no state is present</li>
<li>~ Fixed: Tea and Coffee start boiling when placed manually</li>
<li>~ Fixed: Duplicate mods can be added</li>
<li>~ Fixed: Portals can't teleport pixels being dragged</li>
<li>~ Fixed: Embers are never deleted when Burning is disabled</li>
<li>~ Fixed: Mix tool can be used on ghost pixels</li>
<li>~ Fixed: Saves can set cursor size to impossible sizes</li>
<li>~ Fixed: colorOn isn't applied by reactions</li>
<li>[Technical]</li>
<li>+ Mod dependency system, see dependency_test.js for more info</li>
<li>+ Elements can be added dynamically with addElement()</li>
<li>+ onAddElement(callback) function, called when element is added dynamically</li>
<li>+ loadedMods array holds mods that have been loaded</li>
<li>+ onSelect and onUnselect properties for custom views</li>
<li>+ Portals display channel on hover</li>
<li>+ 'mouseColor' setting</li>
<li>~ Unknown is now in the Special category (Still hidden)</li>
<li>~ Save version is now sb4 and includes new border settings</li>
</ul>
<h2 id="1.11">[Version 1.11 - February 21, 2025 - Everyone's Update]</h2>
<ul>
<li>+ Portals!</li>

View File

@ -4,6 +4,82 @@ See sneak peaks for upcoming updates on the Discord: https://discord.gg/ejUc6YPQ
A fancier version of this changelog can be found here: https://sandboxels.R74n.com/changelog
[Version 1.11.1 - April 1, 2025 - FOOLS-2-5]
+ Border setting
+ Void deletes pixels that touch the sides
+ Loop teleports pixels that touch the sides
~ Improved Thermal View now uses hottest and coldest pixels as bounds
+ Finnish and Indonesian languages
[FOOLS]
+ Element Modulator
+ FOOLS Mode is back!
~ Note: FOOLS features will disappear April 4th
[Changes]
+ Keybind: Ctrl+O to load a save file
+ Keybind: Ctrl+Shift+O to reload the last loaded save
+ Flame test can be done on elements with fire colors
+ Honey and Molasses freeze into Candy
+ 'Golden Wind' Tornado variant
+ Milk variants can be churned into Butter
+ Udders can absorb certain liquids to produce Milk variants
+ Cheese can be made with Cream
+ Soda foam has a unique color
+ Candy dissolves in Water
+ Void is insulative
+ Bless stops panic in Humans
+ Gunpowder explodes when shocked
+ Ozone can cure Infection
+ Dust and Ash dirty Seltzer
+ Calcium can react with Steam
+ Magnesium reacts with Water and Steam
+ Sponges can release Water absorbed from soils
+ Sponges separate Water variant contents
+ Primordial Soup can freeze
+ Positrons shock Antimatter
~ Antimatter no longer explodes when touching Cloners
~ Thermite burns into Molten Iron
+ Acid stains Silver
~ Tweaked Acid-Potassium reaction
~ Frogs have a unique egg color
~ Molten Rad Glass is greener
~ Recolored Pilk Cheese
~ Bless removes Filler, Lattice, Vertical, and Horizontal
~ Copper Sulfate is no longer flammable
+ Copper Sulfate produces Poison Gas when burned
+ Baking Soda alias 'Sodium Bicarbonate'
+ Cellulose alias 'Paper Paste'
+ Cyanide alias 'Hydrogen Cyanide'
+ Acid Gas alias 'Hydrochloric Acid Gas'
+ Adobe alias 'Mud Brick'
+ Saves can keep Limitless Mode if settings are included
~ Saves no longer update cursor size
+ Partial translations for Dutch, Korean, Italian, Serbian, and Emoji
~ Halacae translations completed
~ Prompt inputs no longer allow autocomplete
[Bug Fixes]
~ Fixed: Half-pixels on the edges of smaller canvases
~ Fixed: LEDs can create ghost pixels when absorbing Light
~ Fixed: Eggs break when placed with Drag tool
~ Fixed: Frozen Yogurt variants don't retain color when melting
~ Fixed: Frozen elements aren't generated properly when no state is present
~ Fixed: Tea and Coffee start boiling when placed manually
~ Fixed: Duplicate mods can be added
~ Fixed: Portals can't teleport pixels being dragged
~ Fixed: Embers are never deleted when Burning is disabled
~ Fixed: Mix tool can be used on ghost pixels
~ Fixed: Saves can set cursor size to impossible sizes
~ Fixed: colorOn isn't applied by reactions
[Technical]
+ Mod dependency system, see dependency_test.js for more info
+ Elements can be added dynamically with addElement()
+ onAddElement(callback) function, called when element is added dynamically
+ loadedMods array holds mods that have been loaded
+ onSelect and onUnselect properties for custom views
+ Portals display channel on hover
+ 'mouseColor' setting
~ Unknown is now in the Special category (Still hidden)
~ Save version is now sb4 and includes new border settings
[Version 1.11 - February 21, 2025 - Everyone's Update]
+ Portals!
+ Portal In and Portal Out elements

View File

@ -95,6 +95,8 @@
<tr><td>Open saves</td> <td><kbd>L</kbd></td></tr>
<tr><td>Open save prompt</td> <td><kbd>Ctrl</kbd> + <kbd>S</kbd></td></tr>
<tr><td>Instant save</td> <td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>S</kbd></td></tr>
<tr><td>Load save</td> <td><kbd>Ctrl</kbd> + <kbd>O</kbd></td></tr>
<tr><td>Reload last save</td> <td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>O</kbd></td></tr>
<tr><td>Open Mod Manager</td> <td><kbd>M</kbd></td></tr>
<tr><td>Reset canvas</td> <td><kbd>R</kbd></td></tr>
<tr><td>Single step</td> <td><kbd>&gt;</kbd></td></tr>

View File

@ -33,6 +33,10 @@ F1 = Toggle GUI / HUD
F2 or C = Capture Screenshot
Drag & Drop = Insert an image or load save file
Paste = Insert an image or load save file
Ctrl + S = Open save prompt
Ctrl + Shift + S = Instant save
Ctrl + O = Load save
Ctrl + Shift + O = Reload last save
Escape = Close Menu / Clear Logs
; = Replace Mode
Shift + Mid Click = Pick Element (Copy Properties)

BIN
icons/modulator.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because it is too large Load Diff

1
lang/af.json Normal file
View File

@ -0,0 +1 @@
{}

1
lang/ar.json Normal file
View File

@ -0,0 +1 @@
{}

1
lang/ar_sy.json Normal file
View File

@ -0,0 +1 @@
{}

1
lang/bn.json Normal file
View File

@ -0,0 +1 @@
{}

1
lang/ca.json Normal file
View File

@ -0,0 +1 @@
{"liquids":"líquids","gases":"gasos","food":"menjar","machines":"màquines","special":"especial","other":"altres","states":"estats","heat":"escalfar","cool":"refredar","erase":"esborrar","dirty_water":"aigua bruta","pool_water":"aigua de piscina","dirt":"terra","mud":"fang","wet_sand":"sorra humida","rock":"pedra","rock_wall":"mur de pedra","mudstone":"fang sec","packed_sand":"sorra compacta","plant":"planta","dead_plant":"planta morta","frozen_plant":"planta congelada","grass":"herba","algae":"algues","concrete":"formigó","wall":"mur","fire":"foc","ice":"gel","void":"buit","sun":"sol","cell":"cèl·lula","cancer":"càncer","dna":"ADN","plague":"malaltia","worm":"cuc","frozen_worm":"cuc congelat","ant":"formiga","spider":"aranya","web":"tela d'aranya","fly":"mosca","bee":"abella","pipe":"canonada","\"gui.settingLabel-limitless\"":"sense límits","\"gui.clearMods\"":"Eliminar modificacions","\"gui.settingLabel-worldgen\"":"Generació de món","\"gui.setting-worldgen-off\"":"Deshabilitat","\"gui.settingLabel-imageelem\"":"Element d'imatge","portal_in":"portal a dins","portal_out":"portal a fora","coral":"coral"}

File diff suppressed because one or more lines are too long

1
lang/da.json Normal file
View File

@ -0,0 +1 @@
{}

File diff suppressed because one or more lines are too long

1
lang/el.json Normal file
View File

@ -0,0 +1 @@
{}

1
lang/en.json Normal file
View File

@ -0,0 +1 @@
{}

1
lang/en_au.json Normal file
View File

@ -0,0 +1 @@
{"\"#lang.name\"":"English (Australia)","soda":"soft_drink","gray_goo":"grey_goo","aluminum":"aluminium","candy":"sweets","jelly":"jam","ketchup":"tomato_sauce","molten_aluminum":"molten_aluminium","color_smoke":"colour_smoke","sulfur":"sulphur","molten_sulfur":"molten_sulphur","sulfur_gas":"sulphur_gas","color_sand":"colour_sand","soda_ice":"soft_drink_ice","\"gui.saveColors\"":"Colours"}

View File

@ -1,13 +1 @@
{
"#lang.name": "English (Canadian)",
"#lang.credit": "R74n",
"seltzer": "soda_water",
"oxidized_copper": "oxidised_copper",
"anesthesia": "anaesthesia",
"gray_goo": "grey_goo",
"fiber": "fibre",
"color_smoke": "colour_smoke",
"color_sand": "colour_sand",
"yogurt": "yogourt",
"frozen_yogurt": "frozen_yogourt"
}
{"\"#lang.name\"":"English (Canadian)","seltzer":"soda_water","anesthesia":"anaesthesia","gray_goo":"grey_goo","fiber":"fibre","yogurt":"yogourt","frozen_yogurt":"frozen_yogourt","color_smoke":"colour_smoke","oxidized_copper":"oxidised_copper","color_sand":"colour_sand"}

View File

@ -1,18 +1 @@
{
"#lang.name": "English (British)",
"#lang.credit": "R74n",
"seltzer": "soda_water",
"oxidized_copper": "oxidised_copper",
"anesthesia": "anaesthesia",
"gray_goo": "grey_goo",
"aluminum": "aluminium",
"molten_aluminum": "molten_aluminium",
"fiber": "fibre",
"color_smoke": "colour_smoke",
"sulfur": "sulphur",
"molten_sulfur": "molten_sulphur",
"sulfur_gas": "sulphur_gas",
"color_sand": "colour_sand",
"yogurt": "yoghurt",
"frozen_yogurt": "frozen_yoghurt"
}
{"\"#lang.name\"":"English (British)","seltzer":"soda_water","anesthesia":"anaesthesia","gray_goo":"grey_goo","aluminum":"aluminium","fiber":"fibre","yogurt":"yoghurt","frozen_yogurt":"frozen_yoghurt","molten_aluminum":"molten_aluminium","color_smoke":"colour_smoke","sulfur":"sulphur","molten_sulfur":"molten_sulphur","sulfur_gas":"sulphur_gas","oxidized_copper":"oxidised_copper","color_sand":"colour_sand","\"gui.saveColors\"":"Colours"}

File diff suppressed because one or more lines are too long

1
lang/et.json Normal file
View File

@ -0,0 +1 @@
{}

1
lang/fi.json Normal file

File diff suppressed because one or more lines are too long

1
lang/fil.json Normal file
View File

@ -0,0 +1 @@
{}

File diff suppressed because one or more lines are too long

1
lang/he.json Normal file
View File

@ -0,0 +1 @@
{"\"#lang.name\"":"עברית","mix":"לערבב","sand":"חול","mud":"בוץ","plant":"צמח","dead_plant":"צמח_מת","grass":"דשא","wall":"קיר","fire":"אש","bomb":"פצצה","ice":"קרח","snow":"שלג","wood":"עץ","meat":"בשר","salt":"מלח","wire":"חוט","dust":"אבק","void":"ריק","sun":"שמש","cell":"תא","dna":"dna","worm":"תולעת","flea":"פרעוש","ant":"נמלה","web":"רשת","fly":"זבוב","bee":"דבורה","hive":"כוורת","body":"גוף","head":"ראש","bird":"ציפור","rat":"עכברוש","frog":"צפרדע","fish":"דג","slug":"שבלול","pipe":"צינור","fuse":"פיוז","bone":"עצם","ball":"כדור","c4":"c4","\"gui.pageDesc\"":"הירגע או התנסה עם למעלה מ-500 חומרים בסימולטור חול נופל זה, הכולל חום, תגובות כימיות, צפיפות, שריפה, פיצוצים.","\"gui.shiftButton\"":"↑","\"gui.frameButton\"":">","\"gui.sizeDownButton\"":"-","\"gui.sizeUpButton\"":"+","\"gui.replaceButton.title\"":"עוקף פיקסלים קיימים בעת מיקום","\"gui.elemSelectButton\"":"E","\"gui.tpsButton.title\"":"שנה את הסימולציה טיקים לשניה (TPS)","\"gui.saveAuthorLabel\"":"מאת","\"gui.modWarning\"":"ייתכן שלא יהיה צורך לכלול מודים ועשויים לעצבן את המשתמש!","\"guitemplate.saves.overwrite\"":"זה ידרוס את השמירה במשבצת $1!","\"gui.setting-units-s\"":"SI"}

File diff suppressed because one or more lines are too long

1
lang/id.json Normal file

File diff suppressed because one or more lines are too long

1
lang/it.json Normal file

File diff suppressed because one or more lines are too long

1
lang/ja.json Normal file
View File

@ -0,0 +1 @@
{"\"#lang.name\"":"日本語","land":"土地","liquids":"液体","life":"生命","powders":"粉","solids":"固体","energy":"エネルギー","weapons":"武器","gases":"気体","food":"食物","machines":"機械","special":"特殊","other":"その他","states":"状態","heat":"加熱する","cool":"冷却する","erase":"消去する","drag":"引っ張る","pick":"選択する","mix":"混ぜる","lookup":"調べる","shock":"電撃する","paint":"色を塗る","sand":"砂","water":"水","salt_water":"塩水","sugar_water":"砂糖水","seltzer":"炭酸水","dirty_water":"汚水","pool_water":"カルキ水","dirt":"土","mud":"泥","wet_sand":"湿った砂","rock":"石","rock_wall":"岩壁","mudstone":"泥岩","packed_sand":"固い砂","plant":"植物","dead_plant":"枯れた植物","frozen_plant":"凍った植物","grass":"草","algae":"藻","concrete":"コンクリート","wall":"壁","fire":"火","bomb":"爆弾","steam":"水蒸気","ice":"氷","rime":"霜","snow":"雪","slush":"雪水","packed_snow":"固い雪","wood":"木","smoke":"煙","magma":"マグマ","plasma":"プラズマ","cold_fire":"冷たい火","glass":"ガラス","molten_glass":"融けたガラス","molten_rad_glass":"融けた放射性ガラス","rad_glass":"放射性ガラス","meat":"肉","rotten_meat":"腐った肉","cured_meat":"塩漬けの肉","cooked_meat":"熱した肉","frozen_meat":"凍った肉","salt":"塩","molten_salt":"融けた塩","sugar":"砂糖","flour":"小麦粉","wire":"導線","battery":"電池","cloner":"複製器","sensor":"センサー","heater":"加熱器","cooler":"冷却器","random":"ランダム","image":"画像","unpaint":"塗った色を消す","uncharge":"電荷を消す","unburn":"燃焼を止める","smash":"潰す","filler":"フィラー","lattice":"格子","gravel":"砂利","slime":"スライム","cement":"セメント","dust":"ちり","void":"虚空","sun":"太陽","cell":"細胞","cancer":"ガン","dna":"DNA","plague":"疫病","worm":"イモムシ","frozen_worm":"凍ったイモムシ","flea":"ノミ","termite":"シロアリ","ant":"アリ","spider":"クモ","web":"クモの巣","fly":"ハエ","firefly":"ホタル","bee":"ハチ","hive":"ハチの巣","stink_bug":"カメムシ","dead_bug":"死んだ虫","human":"人間","body":"胴体","head":"頭","bird":"鳥","rat":"ネズミ","frog":"カエル","frozen_frog":"凍ったカエル","tadpole":"オタマジャクシ","fish":"魚","frozen_fish":"凍った魚","slug":"ナメクジ","snail":"カタツムリ","burner":"バーナー","superheater":"超加熱器","freezer":"フリーザー","pipe":"パイプ","pipe_wall":"パイプの壁","mixer":"ミキサー","grinder":"粉砕器","fuse":"導火線","ewall":"導電性の壁"}

1
lang/ko.json Normal file

File diff suppressed because one or more lines are too long

1
lang/la.json Normal file
View File

@ -0,0 +1 @@
{"\"#lang.name\"":"Latinus","land":"terra","liquids":"liquidus","life":"vita","powders":"pulvis","solids":"solidus","weapons":"telae","gases":"caelus","food":"cibus","special":"proprius","other":"alius","water":"aqua","rock":"saxum","rock_wall":"murus saxi","plant":"planta","wall":"murus","fire":"ignis"}

1
lang/ne.json Normal file
View File

@ -0,0 +1 @@
{}

1
lang/nl.json Normal file
View File

@ -0,0 +1 @@
{"\"#lang.name\"":"Nederlands","land":"Land","liquids":"Vloeistoffen","life":"Leven","powders":"Poeder","solids":"Vaste stoffen","energy":"Energie","weapons":"Wapens","gases":"Gassen","food":"Eten","machines":"Machines","special":"Special","other":"Anderen","states":"Staten","heat":"Warmte","cool":"Koud","erase":"Uitgummen","drag":"Mee slepen","pick":"Pakken","mix":"Mix","lookup":"Op Zoeken","shock":"Schok","paint":"Verfen","sand":"Zand","water":"Water","salt_water":"Zout Water","sugar_water":"Suiker Water","seltzer":"seltzer","dirty_water":"Vies water","pool_water":"Zwembad water","dirt":"Aarde","mud":"Modder","wet_sand":"Nat zand","rock":"Steen","rock_wall":"Stenen muur","mudstone":"Moddersteen","packed_sand":"Ingepakt zand","plant":"Plant","dead_plant":"Dode plant","frozen_plant":"Bevroren plant","grass":"Gras","algae":"Algen","concrete":"Beton","wall":"Muur","fire":"Vuur","bomb":"Bom","steam":"Stoom","ice":"ijs","rime":"Rijp","snow":"Sneeuw","slush":"Dik water","packed_snow":"Verpakte sneeuw","wood":"Hout","smoke":"Rook","magma":"Lava","plasma":"Heet Vuur","cold_fire":"Koud Vuur","glass":"Glas","molten_glass":"Gesmolten Glas","molten_rad_glass":"Gesmolten radioactief glas","rad_glass":"Radioactief glas","meat":"Vlees","rotten_meat":"Verrot Vlees","cured_meat":"Gepekeld Vlees","cooked_meat":"Gekookt Vlees","frozen_meat":"Bevroren Vlees","salt":"Zout","molten_salt":"Gesmolten zout","sugar":"Suiker","flour":"Meel","wire":"Stroomdraad","battery":"Batterij","cloner":"Klonen","sensor":"Sensor","heater":"Verwarming","cooler":"Koeler","random":"Willekeurig","image":"Afbeelding","unpaint":"Verf ongedaan maken","uncharge":"Elektriciteit ongedaan maken","unburn":"Brand ongedaan maken","smash":"Breek","filler":"Opvuller","lattice":"Rooster","gravel":"Grind","slime":"Slijm","cement":"Cement","dust":"Stof","void":"Zwart Gat","sun":"Zon","cell":"Cel","cancer":"Kanker","dna":"DNA","plague":"Plaag","worm":"Worm","frozen_worm":"Bevroren Worm","flea":"Vlo","termite":"Termiet","ant":"Mier","spider":"Spin","web":"Spinnenweb","fly":"Vlieg","firefly":"Vuurvlieg","bee":"Bij","hive":"Bijenkorf","stink_bug":"Stink insect","dead_bug":"Dood Insect","human":"Mens","body":"Lichaam","head":"Hoofd","bird":"Vogel","rat":"Rat","frog":"Kikker","frozen_frog":"Bevroren Kikker","tadpole":"Kikkervisje","fish":"Vis","frozen_fish":"Bevroren Vis","slug":"Naaktslak","snail":"Slak","burner":"Brander","superheater":"Super verwarming","freezer":"vriezer","pipe":"Pijp","pipe_wall":"Pijp muur","mixer":"Meng","grinder":"Slijper","fuse":"Lont","ewall":"Elektrische muur","torch":"Fakkel","spout":"Waterspuit","udder":"Uier","bone_marrow":"Beenmerg","bone":"Bot","ball":"Bal","balloon":"Ballon","antipowder":"Anti poeder","antimolten":"Gesmolten anti","antifire":"Anti vuur","antifluid":"Anti vloeistof","antigas":"Anti gas","vertical":"Verticaal","horizontal":"Horizontaal","ash":"As","molten_ash":"Gesmolten as","light":"Licht","liquid_light":"Vloeibaar licht","laser":"Laser","pointer":"Punter","charcoal":"Steenkool\n","tinder":"Tondel","sawdust":"Zaagsel","hail":"Hagel","hydrogen":"Waterstof","oxygen":"Zuurstof","nitrogen":"Stikstof","helium":"Helium","anesthesia":"Anesthesie","carbon_dioxide":"Koolstofdioxide","bubble":"Bubbels","ammonia":"Ammoniak","liquid_ammonia":"Vloeibaar ammoniak","oil":"Olie","lamp_oil":"Kerosine","propane":"Propaan","liquid_propane":"Vloeibaar propaan","methane":"Methaan","liquid_methane":"Vloeibaar methaan","stained_glass":"Gekleurd glas","molten_stained_glass":"Gesmolten gekleurd glas","art":"Kunst","rainbow":"Regenboog","static":"Statisch","border":"Grens","clay":"Klei","clay_soil":"Klei grond","cloth":"Wol","cellulose":"Houtstof","wax":"Wax","melted_wax":"Gesmolten wax","incense":"Wierook","dioxin":"Dioxide","insulation":"Isolatie","sponge":"Spons","bamboo":"Bamboe","iron":"IJzer","copper":"Koper","gold":"Goud","steel":"Staal","galvanized_steel":"Gegalvaniseerd staal","zinc":"Zink","silver":"Zilver","tin":"Tin","lead":"Lood","nickel":"Nikkel","aluminum":"Aluminium","tungsten":"Wolfraam","molten_tungsten":"Gesmolten Wolfraam","brass":"Geelkoper","bronze":"Brons","sterling":"Sterling","gallium":"Gallium","molten_gallium":"Gesmolten Gallium","gallium_gas":"Gallium gas","rose_gold":"Rosé goud","purple_gold":"Paars goud\n","blue_gold":"Blauw Goud","electrum":"Groen Goud","pyrite":"Pyriet","solder":"Soldeersel","amber":"Barnsteen","molten_copper":"Gesmolten koper","molten_copper_sulfate":"Gesmolten koper sulfaat","molten_gold":"Gesmolten goud","molten_silver":"Gesmolten zilver","molten_iron":"Gesmolten IJzer","molten_nickel":"Gesmolten nikkel","molten_tin":"Gesmolten tin","molten_lead":"Gesmolten lood","molten_solder":"Gesmolten soldeersel","juice":"Sap","juice_ice":"Sap ijs","broth":"Bouillon"}

1
lang/no.json Normal file
View File

@ -0,0 +1 @@
{}

File diff suppressed because one or more lines are too long

1
lang/pt.json Normal file
View File

@ -0,0 +1 @@
{}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
lang/qvp.json Normal file
View File

@ -0,0 +1 @@
{"\"#lang.name\"":"Viossa","land":"lantstof","liquids":"ishkestof","life":"vonastof","powders":"pudrastof","solids":"ishilykstof","energy":"zeusstof","weapons":"krizstof","gases":"luftstof","food":"namting","machines":"ilo","special":"viktistof","other":"anderstof","states":"vapazmatel","heat":"plusvapa","cool":"plussamui","erase":"keshite","drag":"bidra","pick":"kawari","mix":"visk","lookup":"suha","shock":"zeus","paint":"vaha","sand":"san","water":"ishke","salt_water":"shio_ishke","sugar_water":"sokkeri_ishke","seltzer":"bersoda_ishke","dirty_water":"bjurkishke","pool_water":"ojoiplas_ishke"}

1
lang/ro.json Normal file
View File

@ -0,0 +1 @@
{}

File diff suppressed because one or more lines are too long

1
lang/sr.json Normal file

File diff suppressed because one or more lines are too long

1
lang/sv.json Normal file
View File

@ -0,0 +1 @@
{}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -10,31 +10,31 @@ function findReachable(elems) {
redo = false;
let e1 = elems[i];
if(e1 === "mushroom_gill") {
redo = redo || addElement(elems, "mushroom_cap");
redo = redo || addElement_(elems, "mushroom_cap");
}
if(e1 === "thorium" && elems.includes("neutron")) {
redo = redo || addElement(elems, "radium");
redo = redo || addElement_(elems, "radium");
}
if(elements[e1].burnInto) {
redo = redo || addElement(elems, elements[e1].burnInto);
redo = redo || addElement_(elems, elements[e1].burnInto);
}
if(elements[e1].stateHigh) {
redo = redo || addElement(elems, elements[e1].stateHigh);
redo = redo || addElement_(elems, elements[e1].stateHigh);
}
if(elements[e1].stateLow) {
redo = redo || addElement(elems, elements[e1].stateLow);
redo = redo || addElement_(elems, elements[e1].stateLow);
}
if(elements[e1].breakInto) {
redo = redo || addElement(elems, elements[e1].breakInto);
redo = redo || addElement_(elems, elements[e1].breakInto);
}
if(elements[e1].extraTempLow) {
for(let i in elements[e1].extraTempLow) {
redo = redo || addElement(elems, elements[e1].extraTempLow[i]);
redo = redo || addElement_(elems, elements[e1].extraTempLow[i]);
}
}
@ -58,7 +58,7 @@ function findReachable(elems) {
if (b == "CR" || b == "CH" || b == "LB" || b == "L1" || b == "L2" || b == "C2") {
if (!arg) { arg = "[???]" }
else if (arg.indexOf(">") != -1) { arg = arg.split(">")[1]; }
redo = redo || addElement(elems, arg.split(","));
redo = redo || addElement_(elems, arg.split(","));
}
}
}
@ -69,10 +69,10 @@ function findReachable(elems) {
{
if(elems.includes(j)) {
if(elements[e1].reactions[j].elem1) {
redo = redo || addElement(elems, elements[e1].reactions[j].elem1);
redo = redo || addElement_(elems, elements[e1].reactions[j].elem1);
}
if(elements[e1].reactions[j].elem2) {
redo = redo || addElement(elems, elements[e1].reactions[j].elem2);
redo = redo || addElement_(elems, elements[e1].reactions[j].elem2);
}
}
}
@ -80,13 +80,13 @@ function findReachable(elems) {
return elems;
}
function addElement(list, elem) {
function addElement_(list, elem) {
if(elem instanceof Array)
{
let result = false;
for(let i = 0; i < elem.length; i++)
{
result = result || addElement(list,elem[i]);
result = result || addElement_(list,elem[i]);
}
return result;
}

View File

@ -174,3 +174,4 @@ if (elements.border) {elements.border.tick = function(pixel){
pixel.color = "rgba("+r+","+r*2+","+r*2+","+r/127+")";
};}
if (elements.pipe_wall) {elements.pipe_wall.color = "#808080";}
if (elements.molten_rad_glass) {delete elements.molten_rad_glass.color;}

13
mods/dependency_test.js Normal file
View File

@ -0,0 +1,13 @@
// Run code when library_test.js loads
dependOn("library_test.js", function(){
testLibrary.logElementDensity("sand");
})
// Force load library_test.js and run code
dependOn("library_test.js", function(){
testLibrary.logElementDensity("water");
},true)
// Dependency system does not currently supported nested dependencies (dependencies with other dependencies)
console.log("Dependency Test loaded!");

346
mods/fools25.js Normal file
View File

@ -0,0 +1,346 @@
/* FOOLS-2-5 */
let perlinscript = document.createElement("script");
perlinscript.src = "scripts/perlin.js";
perlinscript.addEventListener("load",()=> {
document.getElementById("controls").insertAdjacentHTML("beforeend",`
<div style="text-align:center;justify-content:space-around;">
<button class="elementButton" id="modulatorButton" style="border-color:#ff00ff; background-image: linear-gradient(to right bottom, rgb(255, 213, 180), rgb(238, 108, 255));" onclick="openModulator();">Element Modulator</button>
</div>
`)
})
document.head.appendChild(perlinscript);
function openModulator() {
let genericParent = document.getElementById("genericParent");
genericParent.style.display = "block";
showingMenu = "generic";
let genericMenuTitle = document.getElementById("genericMenuTitle");
genericMenuTitle.innerText = "Element Modulator";
let genericMenuText = document.getElementById("genericMenuText");
genericMenuText.innerHTML = "Tap to target a universe.";
document.getElementById("genericMenuOK").innerText = "Modulate";
let modulator = document.createElement("canvas");
modulator.id = "modulator";
genericMenuText.appendChild(modulator);
// modulator.style.backgroundColor = "gray";
modulator.style.width = "100%";
modulator.style.display = "block";
modulator.style.imageRendering = "pixelated";
modulator.style.backgroundImage = 'url("icons/modulator.png")';
modulator.style.backgroundSize = 'cover';
modulator.style.backgroundRepeat = 'no-repeat';
modulator.style.filter = 'hue-rotate(1deg)';
modulator.height = 100;
let modulatorCtx = modulator.getContext("2d");
modulator.onclick = handleModulation;
modulator.onmousedown = handleModulation;
modulator.oncontextmenu = ()=>false;
modulator.onmousemove = (e) => {
if (e.buttons || e.button) handleModulation(e);
}
modulator.ontouchstart = (e) => {
e.preventDefault();
handleModulation(e.touches[0])
};
modulator.ontouchmove = (e) => {
e.preventDefault();
handleModulation(e.touches[0])
};
// genericMenuText.insertAdjacentHTML("beforeend",`
// <span id="modulatorText">X???,Y???,Z</span><input type="number" id="modulatorZ" placeholder="0" value="1" style="width:3em;padding:0" onchange="if(!this.value && this.value!==0){this.value=0}document.getElementById('modulator').style.filter = 'hue-rotate('+(this.value % 359)+'deg)';">
// `);
genericMenuText.insertAdjacentHTML("beforeend",`
<span id="modulatorText">X???,Y???,Z</span><span id="modulatorTextZ" style="width:6em;display:inline-block">1</span><input type="range" min="1" max="500" id="modulatorZ" value="1" style="width:5em;padding:0" oninput="if(!this.value && this.value!==0){this.value=0}document.getElementById('modulator').style.filter = 'hue-rotate('+(this.value % 359)+'deg)';document.getElementById('modulatorTextZ').innerText = this.value;">
`);
genericMenuHandler = modulateElement;
}
function handleModulation(e) {
let modulator = document.getElementById("modulator");
let modulatorCtx = modulator.getContext("2d");
modulatorCtx.webkitImageSmoothingEnabled = false;
modulatorCtx.mozImageSmoothingEnabled = false;
modulatorCtx.imageSmoothingEnabled = false;
const rect = modulator.getBoundingClientRect();
let x = e.clientX - rect.left;
let y = e.clientY - rect.top;
x = Math.floor((x / modulator.clientWidth) * modulator.width);
y = Math.floor((y / modulator.clientHeight) * modulator.height);
let z = document.getElementById("modulatorZ").value || 0;
// let value = noise.perlin3(x/50, y/50, z/50);
// value = (value - -0.5) / (0.5 - -0.5);
// value = Math.max(0,Math.min(1,value));
// console.log(value);
currentModulatorPos = [x,y,z];
modulatorCtx.clearRect(0,0,modulator.width,modulator.height);
modulatorCtx.fillStyle = "#ff9ffc";
/*
W
W
WW WW
W
W
*/
modulatorCtx.fillRect(x+2, y, 4, 2);
modulatorCtx.fillRect(x, y+2, 2, 4);
modulatorCtx.fillRect(x, y-4, 2, 4);
modulatorCtx.fillRect(x-4, y, 4, 2);
document.getElementById("modulatorText").innerText = `X${x},Y${y},Z`;
}
currentModulatorPos = null;
function modulateValue(seed) {
seed = seed / 174;
noise.seed(seed);
let value = noise.perlin3(currentModulatorPos[0]/50,currentModulatorPos[1]/50,currentModulatorPos[2]/50);
value = (value - -0.5) / (0.5 - -0.5);
value = Math.max(0.0001,Math.min(0.9999,value));
return value;
}
function modulateChoose(array,seed) {
let value = modulateValue(seed);
// value = Math.min(0.99,value);
return array[Math.floor(value*array.length)];
}
function modulateRange(min, max, seed) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(modulateValue(seed) * (max - min + 1)) + min;
}
wordSyllables = {
"C": "B,C,D,F,G,H,J,K,L,M,N,P,QU,R,S,T,V,W,X,Y,Z,CH,TH,SH,PH,CK,NG,SS".toLowerCase().split(","),
"V": "A,A,A,E,E,E,I,I,I,O,O,O,U,U,OU,AE,EE,IE,EA,EU,UI,OI,AI,OO,OW,OE,IA".toLowerCase().split(",")
}
function generateName() {
let word = "";
syllableCount = modulateChoose([2,3],1);
let type = modulateValue(2) < 0.5;
if (type === false && syllableCount === 1) syllableCount++;
for (let i = 0; i < syllableCount; i++) {
let letter;
if (type === true) {
letter = modulateChoose(wordSyllables.C,3+i);
syllableCount++;
}
else letter = modulateChoose(wordSyllables.V,4+i);
word += letter;
type = !type;
}
if (word.charCodeAt(0) === word.charCodeAt(1)) {
word = word.substring(1);
}
return word;
}
behaviors.FOOLS_LOOPY = [
"XX|M2|M1",
"XX|RT%20|M2",
"XX|XX|XX",
];
behaviors.FOOLS_ELECTRIC = [
"CL%5|CL%5|CL%5",
"CL%5|SH%5 AND DL%50|CL%5",
"M1%15 AND CL%6|M1%50 AND CL%13|M1%15 AND CL%6",
];
behaviors.FOOLS_BALL = [
"XX|XX|XX",
"XX|FY:0%5|XX",
"XX|M1 AND BO|XX",
];
modulatorChoices = {
behavior: [
"POWDER","POWDER","POWDER","AGPOWDER","LIQUID","LIQUID","LIQUID","SUPERFLUID","LIGHTWEIGHT","AGLIQUID","UL_UR_OPTIMIZED","WALL","GAS","DGAS","SUPPORT","SUPPORTPOWDER","STURDYPOWDER","FOAM","BOUNCY","CRAWLER2","FOOLS_LOOPY","BOMB","BOMB","FOOLS_ELECTRIC","FOOLS_BALL"
],
releases: [
"radiation","foam","smoke","fire","cold_fire","electric","bless","neutron","fw_ember"
],
burnInto: [
null,"fire","smoke","ash","explosion","flash","electric","fw_ember","radiation","plasma","pop"
]
}
function modulateElement() {
if (!currentModulatorPos) {
logMessage("Modulator position wasn't specified!")
return;
}
let element = {};
let name = generateName();
let oldName = name;
if (modulateValue(6) < 0.25) {
let suffix = modulateChoose(["ium","ite","on"],7)
name = name.replace(/([aeiou])$/g,suffix);
if (name === oldName) name += suffix;
}
let h = modulateValue(1);
let s = modulateValue(2);
let l = Math.max(0.1,modulateValue(3));
element.color = RGBToHex(HSLtoRGB([h,s,l]));
let behavior = modulateChoose(modulatorChoices.behavior, 4);
if (behavior == "LIQUID" || behavior == "SUPERFLUID" || behavior == "AGLIQUID" || behavior == "FOAM") {
element.state = "liquid";
element.category = "liquids";
}
else if (behavior == "UL_UR_OPTIMIZED" || behavior == "GAS" || behavior == "DGAS") {
element.state = "gas";
element.category = "gases";
}
else if (behavior == "BOUNCY") {
element.state = modulateChoose(["liquid","gas"], 5);
element.category = "energy";
}
else if (behavior == "CRAWLER2") {
element.state = "solid";
element.category = "life";
element.tempHigh = 100;
element.stateHigh = modulateChoose(["ash","cooked_meat"], 5);
element.tempLow = 0;
element.stateLow = modulateChoose(["dead_bug","frozen_meat"], 5);
}
else if (behavior == "BOMB") {
element.state = "solid";
element.category = "weapons";
let choice = modulateChoose(randomChoices, 5);
behavior = [
"XX|XX|XX",
"XX|XX|XX",
"M2|M1 AND EX:10>"+choice+"|M2"
];
name = choice+"_bomb";
element.cooldown = defaultCooldown;
}
else if (behavior == "POWDER" || behavior == "AGPOWDER" || behavior == "SUPPORTPOWDER" || behavior == "STURDYPOWDER" || behavior == "SUPPORT" || behavior == "LIGHTWEIGHT") {
element.state = "solid";
element.category = "powders";
if (modulateValue(5) < 0.2) {
element.category = "land";
eLists.SOIL.push(name);
eLists.CRAWLTHRU.push(name);
}
}
else if (behavior == "WALL") {
element.state = "solid";
element.category = "solids";
element.movable = false;
}
else {
element.state = modulateChoose(["solid","liquid","gas"], 5);
element.category = "special";
}
if (behaviors[behavior]) behavior = behaviors[behavior];
element.behavior = behavior;
let functions = [];
if (modulateValue(20) < 0.15) {
let releases = modulateChoose(modulatorChoices.releases, 30);
functions.push(function(pixel) {
if (Math.random() < 0.05) releaseElement(pixel, releases);
})
}
if (modulateValue(21) < 0.15) {
let deletes = modulateChoose(["solid","liquid","gas"], 31);
functions.push(function(pixel) {
for (var i = 0; i < adjacentCoords.length; i++) {
var x = pixel.x+adjacentCoords[i][0];
var y = pixel.y+adjacentCoords[i][1];
if (!isEmpty(x,y,true)) {
let pixel2 = pixelMap[x][y];
if (Math.random() < 0.1 && (deletes === true || elements[pixel2.element].state === deletes)) {
deletePixel(pixel2.x,pixel2.y);
if (deletes === true) { deletePixel(pixel.x,pixel.y); return; }
}
}
}
})
}
element.tick = function(pixel) {
functions.forEach((fn) => {
fn(pixel);
})
}
element.density = modulateRange(0,100000,50)/100;
if (element.category !== "energy") {
if (!element.stateHigh && (element.state === "solid" || element.state === "liquid")) {
element.tempHigh = modulateRange(25,200000,51)/100;
}
if (!element.stateLow && (element.state === "liquid" || element.state === "gas")) {
element.tempLow = modulateRange(-27315,15,52)/100;
}
}
element.reactions = {};
let reactChoices = randomChoices.filter((key) => elements[key].category !== "states");
for (let i = 0; i < 10; i++) {
let key = modulateChoose(reactChoices, 60+i);
let v = modulateValue(60+1);
element.reactions[key] = {
elem1: v < 0.25 ? null : modulateChoose(reactChoices, 20+i),
elem2: v < 0.25 ? null : modulateChoose(reactChoices, 30+i),
chance: 0.05
}
}
if (modulateValue(70) < 0.25) {
element.burn = modulateRange(1,100,71);
element.burnInto = modulateChoose(modulatorChoices.burnInto, 72);
element.burnTime = modulateRange(1,1000,73);
let h = modulateValue(74);
let s = modulateValue(75);
let l = Math.max(0.1,modulateValue(76));
element.fireColor = RGBToHex(HSLtoRGB([h,s,l]));
}
if (modulateValue(77) < 0.2) {
element.emit = true;
let h = modulateValue(78);
let s = modulateValue(79);
let l = Math.max(0.1,modulateValue(80));
element.emitColor = RGBToHex(HSLtoRGB([h,s,l]));
}
if (modulateValue(81) < 0.25) {
element.conduct = modulateRange(1,100,82)/100;
}
addElement(name,element);
selectCategory(element.category);
selectElement(name);
logMessage("Modulation completed... Unlocked "+name.toUpperCase());
currentModulatorPos = null;
return element;
}

View File

@ -1,10 +1,3 @@
/* TODO:
- warning and automatic disable for non-chromium users
- firefly glow
- sun temperature-dependent glow strength
*/
var isChromium = !!window.chrome;
@ -27,6 +20,7 @@ delete canvasLayers.glowmod2;
elements.fire.emit = true;
elements.lightning.emit = 15;
elements.electric.emit = true;
elements.positron.emit = true;
elements.plasma.emit = true;
elements.uranium.emit = 3;
elements.uranium.emitColor = "#009800";
@ -69,6 +63,12 @@ viewInfo[1] = { // Blur Glow (Emissive pixels only)
pixel: viewInfo[1].pixel,
effects: true,
colorEffects: true,
onUnselect: function(ctx) {
glowmodCtx2.canvas.width = ctx.canvas.width;
glowmodCtx2.canvas.height = ctx.canvas.height;
glowmodCtx.canvas.width = ctx.canvas.width;
glowmodCtx.canvas.height = ctx.canvas.height;
},
pre: function(ctx) {
glowmodCtx2.canvas.width = ctx.canvas.width;
glowmodCtx2.canvas.height = ctx.canvas.height;
@ -88,7 +88,7 @@ renderEachPixel(function(pixel,ctx) {
if (view === 1) {
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;
let d = pixel.emit||elements[pixel.element].emit||true;
if (d === true) d = 5;
let r = Math.floor(d/2);
drawSquare(glowmodCtx2,elements[pixel.element].emitColor||pixel.color,pixel.x-r,pixel.y-r,d,a);

5
mods/library_test.js Normal file
View File

@ -0,0 +1,5 @@
testLibrary = {}
testLibrary.logElementDensity = function (element) {
console.log(element + " density is " + elements[element].density);
}

12
mods/rainbow_cursor.js Normal file
View File

@ -0,0 +1,12 @@
runAfterReset(()=>{
const gradient = ctx.createLinearGradient(0,0, width*pixelSize,height*pixelSize);
gradient.addColorStop(0, '#ff0000');
gradient.addColorStop(0.125, '#ff8800');
gradient.addColorStop(0.25, '#ffff00');
gradient.addColorStop(0.375, '#00ff00');
gradient.addColorStop(0.5, '#00ffff');
gradient.addColorStop(0.625, '#0000ff');
gradient.addColorStop(0.75, '#8800ff');
gradient.addColorStop(1, '#ff00ff');
settings.mouseColor = gradient;
})

165
scripts/perlin.js Normal file
View File

@ -0,0 +1,165 @@
/*
* A speed-improved perlin and simplex noise algorithms for 2D.
*
* Based on example code by Stefan Gustavson (stegu@itn.liu.se).
* Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).
* Better rank ordering method by Stefan Gustavson in 2012.
* Converted to Javascript by Joseph Gentle.
*
* Version 2012-03-09
*
* This code was placed in the public domain by its original author,
* Stefan Gustavson. You may use it as you see fit, but
* attribution is appreciated.
*
*/
(function(global){
var module = global.noise = {};
function Grad(x, y, z) {
this.x = x; this.y = y; this.z = z;
}
Grad.prototype.dot2 = function(x, y) {
return this.x*x + this.y*y;
};
Grad.prototype.dot3 = function(x, y, z) {
return this.x*x + this.y*y + this.z*z;
};
var grad3 = [new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0),
new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1),
new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)];
var p = [151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180];
// To remove the need for index wrapping, double the permutation table length
var perm = new Array(512);
var gradP = new Array(512);
// This isn't a very good seeding function, but it works ok. It supports 2^16
// different seed values. Write something better if you need more seeds.
module.seed = function(seed) {
if(seed > 0 && seed < 1) {
// Scale the seed out
seed *= 65536;
}
seed = Math.floor(seed);
if(seed < 256) {
seed |= seed << 8;
}
for(var i = 0; i < 256; i++) {
var v;
if (i & 1) {
v = p[i] ^ (seed & 255);
} else {
v = p[i] ^ ((seed>>8) & 255);
}
perm[i] = perm[i + 256] = v;
gradP[i] = gradP[i + 256] = grad3[v % 12];
}
};
module.seed(0);
/*
for(var i=0; i<256; i++) {
perm[i] = perm[i + 256] = p[i];
gradP[i] = gradP[i + 256] = grad3[perm[i] % 12];
}*/
// Skewing and unskewing factors for 2, 3, and 4 dimensions
var F2 = 0.5*(Math.sqrt(3)-1);
var G2 = (3-Math.sqrt(3))/6;
var F3 = 1/3;
var G3 = 1/6;
// ##### Perlin noise stuff
function fade(t) {
return t*t*t*(t*(t*6-15)+10);
}
function lerp(a, b, t) {
return (1-t)*a + t*b;
}
// 2D Perlin Noise
module.perlin2 = function(x, y) {
// Find unit grid cell containing point
var X = Math.floor(x), Y = Math.floor(y);
// Get relative xy coordinates of point within that cell
x = x - X; y = y - Y;
// Wrap the integer cells at 255 (smaller integer period can be introduced here)
X = X & 255; Y = Y & 255;
// Calculate noise contributions from each of the four corners
var n00 = gradP[X+perm[Y]].dot2(x, y);
var n01 = gradP[X+perm[Y+1]].dot2(x, y-1);
var n10 = gradP[X+1+perm[Y]].dot2(x-1, y);
var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1);
// Compute the fade curve value for x
var u = fade(x);
// Interpolate the four results
return lerp(
lerp(n00, n10, u),
lerp(n01, n11, u),
fade(y));
};
// 3D Perlin Noise
module.perlin3 = function(x, y, z) {
// Find unit grid cell containing point
var X = Math.floor(x), Y = Math.floor(y), Z = Math.floor(z);
// Get relative xyz coordinates of point within that cell
x = x - X; y = y - Y; z = z - Z;
// Wrap the integer cells at 255 (smaller integer period can be introduced here)
X = X & 255; Y = Y & 255; Z = Z & 255;
// Calculate noise contributions from each of the eight corners
var n000 = gradP[X+ perm[Y+ perm[Z ]]].dot3(x, y, z);
var n001 = gradP[X+ perm[Y+ perm[Z+1]]].dot3(x, y, z-1);
var n010 = gradP[X+ perm[Y+1+perm[Z ]]].dot3(x, y-1, z);
var n011 = gradP[X+ perm[Y+1+perm[Z+1]]].dot3(x, y-1, z-1);
var n100 = gradP[X+1+perm[Y+ perm[Z ]]].dot3(x-1, y, z);
var n101 = gradP[X+1+perm[Y+ perm[Z+1]]].dot3(x-1, y, z-1);
var n110 = gradP[X+1+perm[Y+1+perm[Z ]]].dot3(x-1, y-1, z);
var n111 = gradP[X+1+perm[Y+1+perm[Z+1]]].dot3(x-1, y-1, z-1);
// Compute the fade curve value for x, y, z
var u = fade(x);
var v = fade(y);
var w = fade(z);
// Interpolate
return lerp(
lerp(
lerp(n000, n100, u),
lerp(n001, n101, u), w),
lerp(
lerp(n010, n110, u),
lerp(n011, n111, u), w),
v);
};
})(this);

View File

@ -60,6 +60,19 @@ a:active, a:hover:active, .saveOption:active, .saveOption:hover:active {filter:
#bottomTopBox {
text-align: center;
}
#bottomTopBoxColumns {
display:flex; justify-content: space-around
}
@media screen and (max-width: 1300px) {
#bottomTopBoxColumns {
display:block; justify-content: unset;
}
}
@media screen and (min-width: 1300px) {
#newsletterFrame {
border: none!important;
}
}
#bottomLeftBox {
float: left;
width: 50%;
@ -242,7 +255,7 @@ kbd:active {filter: brightness(70%);}
color: gray;
cursor: not-allowed;
}
#saveFile, #loadFile, #saveConfirm, #promptOK, #promptCancel, #promptConfirm {
#saveFile, #loadFile, #saveConfirm, #promptOK, .promptOK, #promptCancel, #promptConfirm {
background-color: black;
text-align: center;
vertical-align: middle;
@ -253,7 +266,7 @@ kbd:active {filter: brightness(70%);}
cursor: pointer;
border-top: 4px solid #9d9d9d;
}
#saveConfirm, #promptOK {
#saveConfirm, #promptOK, .promptOK {
bottom: 0;
position: fixed;
}
@ -266,7 +279,7 @@ kbd:active {filter: brightness(70%);}
width: 50%;
border-left: 4px solid #9d9d9d;
}
#saveConfirm, #promptOK {
#saveConfirm, #promptOK, .promptOK {
left: 0;
width: 100%;
}
@ -573,7 +586,7 @@ button, input { /*Disable double tap zoom on mobile devices*/
touch-action: manipulation;
color-scheme: dark;
}
.settingsButton, select, .toggleInput, #settingsMenu input[type="number"], #settingsMenu input[type="text"], #savePromptMenu input, input[type="email"] {
.settingsButton, select, .toggleInput, #settingsMenu input[type="number"], #settingsMenu input[type="text"], #savePromptMenu input, input[type="email"], input[type="number"] {
background-color: black;
vertical-align: middle;
margin-left: 4px;