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:
parent
1c210e0e23
commit
372de694d0
|
|
@ -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>
|
<p>The original <a href="https://sandboxels.R74n.com/changelog.txt">plain text version</a> of this is still maintained.</p>
|
||||||
</div>
|
</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>
|
<h2 id="1.11">[Version 1.11 - February 21, 2025 - Everyone's Update]</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>+ Portals!</li>
|
<li>+ Portals!</li>
|
||||||
|
|
|
||||||
|
|
@ -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
|
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]
|
[Version 1.11 - February 21, 2025 - Everyone's Update]
|
||||||
+ Portals!
|
+ Portals!
|
||||||
+ Portal In and Portal Out elements
|
+ Portal In and Portal Out elements
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,8 @@
|
||||||
<tr><td>Open saves</td> <td><kbd>L</kbd></td></tr>
|
<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>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>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>Open Mod Manager</td> <td><kbd>M</kbd></td></tr>
|
||||||
<tr><td>Reset canvas</td> <td><kbd>R</kbd></td></tr>
|
<tr><td>Reset canvas</td> <td><kbd>R</kbd></td></tr>
|
||||||
<tr><td>Single step</td> <td><kbd>></kbd></td></tr>
|
<tr><td>Single step</td> <td><kbd>></kbd></td></tr>
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,10 @@ F1 = Toggle GUI / HUD
|
||||||
F2 or C = Capture Screenshot
|
F2 or C = Capture Screenshot
|
||||||
Drag & Drop = Insert an image or load save file
|
Drag & Drop = Insert an image or load save file
|
||||||
Paste = 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
|
Escape = Close Menu / Clear Logs
|
||||||
; = Replace Mode
|
; = Replace Mode
|
||||||
Shift + Mid Click = Pick Element (Copy Properties)
|
Shift + Mid Click = Pick Element (Copy Properties)
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
35231
index.html
35231
index.html
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
|
|
@ -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"}
|
||||||
552
lang/cs.json
552
lang/cs.json
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
549
lang/de.json
549
lang/de.json
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
|
|
@ -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"}
|
||||||
|
|
@ -1,13 +1 @@
|
||||||
{
|
{"\"#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"}
|
||||||
"#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"
|
|
||||||
}
|
|
||||||
|
|
@ -1,18 +1 @@
|
||||||
{
|
{"\"#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"}
|
||||||
"#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"
|
|
||||||
}
|
|
||||||
544
lang/es.json
544
lang/es.json
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
560
lang/fr.json
560
lang/fr.json
File diff suppressed because one or more lines are too long
|
|
@ -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"}
|
||||||
565
lang/hu.json
565
lang/hu.json
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
|
|
@ -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":"導電性の壁"}
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -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"}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
|
|
@ -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"}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
544
lang/pt_br.json
544
lang/pt_br.json
File diff suppressed because one or more lines are too long
549
lang/qha.json
549
lang/qha.json
File diff suppressed because one or more lines are too long
|
|
@ -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"}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
563
lang/ru.json
563
lang/ru.json
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
||||||
549
lang/tok.json
549
lang/tok.json
File diff suppressed because one or more lines are too long
555
lang/tr.json
555
lang/tr.json
File diff suppressed because one or more lines are too long
544
lang/uk.json
544
lang/uk.json
File diff suppressed because one or more lines are too long
561
lang/vi.json
561
lang/vi.json
File diff suppressed because one or more lines are too long
550
lang/zh_cn.json
550
lang/zh_cn.json
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -10,31 +10,31 @@ function findReachable(elems) {
|
||||||
redo = false;
|
redo = false;
|
||||||
let e1 = elems[i];
|
let e1 = elems[i];
|
||||||
if(e1 === "mushroom_gill") {
|
if(e1 === "mushroom_gill") {
|
||||||
redo = redo || addElement(elems, "mushroom_cap");
|
redo = redo || addElement_(elems, "mushroom_cap");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(e1 === "thorium" && elems.includes("neutron")) {
|
if(e1 === "thorium" && elems.includes("neutron")) {
|
||||||
redo = redo || addElement(elems, "radium");
|
redo = redo || addElement_(elems, "radium");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(elements[e1].burnInto) {
|
if(elements[e1].burnInto) {
|
||||||
redo = redo || addElement(elems, elements[e1].burnInto);
|
redo = redo || addElement_(elems, elements[e1].burnInto);
|
||||||
}
|
}
|
||||||
if(elements[e1].stateHigh) {
|
if(elements[e1].stateHigh) {
|
||||||
redo = redo || addElement(elems, elements[e1].stateHigh);
|
redo = redo || addElement_(elems, elements[e1].stateHigh);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(elements[e1].stateLow) {
|
if(elements[e1].stateLow) {
|
||||||
redo = redo || addElement(elems, elements[e1].stateLow);
|
redo = redo || addElement_(elems, elements[e1].stateLow);
|
||||||
}
|
}
|
||||||
if(elements[e1].breakInto) {
|
if(elements[e1].breakInto) {
|
||||||
redo = redo || addElement(elems, elements[e1].breakInto);
|
redo = redo || addElement_(elems, elements[e1].breakInto);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(elements[e1].extraTempLow) {
|
if(elements[e1].extraTempLow) {
|
||||||
for(let i in 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 (b == "CR" || b == "CH" || b == "LB" || b == "L1" || b == "L2" || b == "C2") {
|
||||||
if (!arg) { arg = "[???]" }
|
if (!arg) { arg = "[???]" }
|
||||||
else if (arg.indexOf(">") != -1) { arg = arg.split(">")[1]; }
|
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(elems.includes(j)) {
|
||||||
if(elements[e1].reactions[j].elem1) {
|
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) {
|
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;
|
return elems;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addElement(list, elem) {
|
function addElement_(list, elem) {
|
||||||
if(elem instanceof Array)
|
if(elem instanceof Array)
|
||||||
{
|
{
|
||||||
let result = false;
|
let result = false;
|
||||||
for(let i = 0; i < elem.length; i++)
|
for(let i = 0; i < elem.length; i++)
|
||||||
{
|
{
|
||||||
result = result || addElement(list,elem[i]);
|
result = result || addElement_(list,elem[i]);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -173,4 +173,5 @@ if (elements.border) {elements.border.tick = function(pixel){
|
||||||
var r = Math.floor(127*Math.sin(t/1.5));
|
var r = Math.floor(127*Math.sin(t/1.5));
|
||||||
pixel.color = "rgba("+r+","+r*2+","+r*2+","+r/127+")";
|
pixel.color = "rgba("+r+","+r*2+","+r*2+","+r/127+")";
|
||||||
};}
|
};}
|
||||||
if (elements.pipe_wall) {elements.pipe_wall.color = "#808080";}
|
if (elements.pipe_wall) {elements.pipe_wall.color = "#808080";}
|
||||||
|
if (elements.molten_rad_glass) {delete elements.molten_rad_glass.color;}
|
||||||
|
|
@ -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!");
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
16
mods/glow.js
16
mods/glow.js
|
|
@ -1,10 +1,3 @@
|
||||||
/* TODO:
|
|
||||||
|
|
||||||
- warning and automatic disable for non-chromium users
|
|
||||||
- firefly glow
|
|
||||||
- sun temperature-dependent glow strength
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
var isChromium = !!window.chrome;
|
var isChromium = !!window.chrome;
|
||||||
|
|
||||||
|
|
@ -27,6 +20,7 @@ delete canvasLayers.glowmod2;
|
||||||
elements.fire.emit = true;
|
elements.fire.emit = true;
|
||||||
elements.lightning.emit = 15;
|
elements.lightning.emit = 15;
|
||||||
elements.electric.emit = true;
|
elements.electric.emit = true;
|
||||||
|
elements.positron.emit = true;
|
||||||
elements.plasma.emit = true;
|
elements.plasma.emit = true;
|
||||||
elements.uranium.emit = 3;
|
elements.uranium.emit = 3;
|
||||||
elements.uranium.emitColor = "#009800";
|
elements.uranium.emitColor = "#009800";
|
||||||
|
|
@ -69,6 +63,12 @@ viewInfo[1] = { // Blur Glow (Emissive pixels only)
|
||||||
pixel: viewInfo[1].pixel,
|
pixel: viewInfo[1].pixel,
|
||||||
effects: true,
|
effects: true,
|
||||||
colorEffects: 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) {
|
pre: function(ctx) {
|
||||||
glowmodCtx2.canvas.width = ctx.canvas.width;
|
glowmodCtx2.canvas.width = ctx.canvas.width;
|
||||||
glowmodCtx2.canvas.height = ctx.canvas.height;
|
glowmodCtx2.canvas.height = ctx.canvas.height;
|
||||||
|
|
@ -88,7 +88,7 @@ renderEachPixel(function(pixel,ctx) {
|
||||||
if (view === 1) {
|
if (view === 1) {
|
||||||
if (elements[pixel.element].emit || pixel.emit || (elements[pixel.element].colorOn && pixel.charge)) {
|
if (elements[pixel.element].emit || pixel.emit || (elements[pixel.element].colorOn && pixel.charge)) {
|
||||||
let a = (settings.textures !== 0) ? pixel.alpha : undefined;
|
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;
|
if (d === true) d = 5;
|
||||||
let r = Math.floor(d/2);
|
let r = Math.floor(d/2);
|
||||||
drawSquare(glowmodCtx2,elements[pixel.element].emitColor||pixel.color,pixel.x-r,pixel.y-r,d,a);
|
drawSquare(glowmodCtx2,elements[pixel.element].emitColor||pixel.color,pixel.x-r,pixel.y-r,d,a);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
testLibrary = {}
|
||||||
|
|
||||||
|
testLibrary.logElementDensity = function (element) {
|
||||||
|
console.log(element + " density is " + elements[element].density);
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
})
|
||||||
|
|
@ -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);
|
||||||
21
style.css
21
style.css
|
|
@ -60,6 +60,19 @@ a:active, a:hover:active, .saveOption:active, .saveOption:hover:active {filter:
|
||||||
#bottomTopBox {
|
#bottomTopBox {
|
||||||
text-align: center;
|
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 {
|
#bottomLeftBox {
|
||||||
float: left;
|
float: left;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
|
|
@ -242,7 +255,7 @@ kbd:active {filter: brightness(70%);}
|
||||||
color: gray;
|
color: gray;
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
#saveFile, #loadFile, #saveConfirm, #promptOK, #promptCancel, #promptConfirm {
|
#saveFile, #loadFile, #saveConfirm, #promptOK, .promptOK, #promptCancel, #promptConfirm {
|
||||||
background-color: black;
|
background-color: black;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|
@ -253,7 +266,7 @@ kbd:active {filter: brightness(70%);}
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
border-top: 4px solid #9d9d9d;
|
border-top: 4px solid #9d9d9d;
|
||||||
}
|
}
|
||||||
#saveConfirm, #promptOK {
|
#saveConfirm, #promptOK, .promptOK {
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
}
|
}
|
||||||
|
|
@ -266,7 +279,7 @@ kbd:active {filter: brightness(70%);}
|
||||||
width: 50%;
|
width: 50%;
|
||||||
border-left: 4px solid #9d9d9d;
|
border-left: 4px solid #9d9d9d;
|
||||||
}
|
}
|
||||||
#saveConfirm, #promptOK {
|
#saveConfirm, #promptOK, .promptOK {
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
@ -573,7 +586,7 @@ button, input { /*Disable double tap zoom on mobile devices*/
|
||||||
touch-action: manipulation;
|
touch-action: manipulation;
|
||||||
color-scheme: dark;
|
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;
|
background-color: black;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue