Update plants.js

This commit is contained in:
Alexthetransfem 2025-09-14 19:53:37 -05:00 committed by GitHub
parent 55a5d7cf4c
commit 43a91664b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 1502 additions and 1381 deletions

View File

@ -1,18 +1,14 @@
/* /*
Version 2.2.0 Version 2.2.0
*/ */
function noiseify(color, range){ let plants;
if(color.startsWith("#")){ if(!enabledMods.includes("/mods/orchidslibrary.js")){
color = hexToRGB(color); let continueWithout = confirm("Missing dependency for plants.js: \"orchidslibrary.js\". Continue without? (cancel will add mod and refresh the page)");
if(!continueWithout){
addMod("/mods/orchidslibrary.js", true);
window.location.reload();
}
} else { } else {
color = getRGB(color);
}
let num = Math.round(Math.random()*(range*2))-range;
for(let value in color){
color[value] += num;
}
return `rgb(${color.r},${color.g},${color.b})`;
}
let is2d = (arr)=>{ let is2d = (arr)=>{
return arr.some(item => Array.isArray(item)); return arr.some(item => Array.isArray(item));
} }
@ -57,11 +53,11 @@ class growInterval {
} }
let flowerExclude = ["pineapple"]; let flowerExclude = ["pineapple"];
let vineGrow = ["wood", "rock_wall", "straw", "wall", "ewall", "bush_cane", "bush_base", "fruit_branch"]; let vineGrow = ["wood", "rock_wall", "straw", "wall", "ewall", "bush_cane", "bush_base", "fruit_branch"];
let plants = { plants = {
tree: [], tree: [],
vine: ["grape", "tomato"], vine: ["grape", "tomato"],
bush: [], bush: [],
other: ["pineapple", "watermelon", "banana"], other: ["pineapple", "watermelon", "banana", "onion"],
includes: function(target){ includes: function(target){
for(item in this){ for(item in this){
if(this[item] && Array.isArray(this[item]) && this[item].includes(target)){return true;} if(this[item] && Array.isArray(this[item]) && this[item].includes(target)){return true;}
@ -311,6 +307,108 @@ elements.grape.tick = function(pixel){
} }
elements.wood.properties = {age: 0, fruit: ""}; elements.wood.properties = {age: 0, fruit: ""};
elements.nutrient_agar = {
category: "life",
behavior: behaviors.STURDYPOWDER,
properties: {
value: null,
},
state: "solid",
color: ["#edeae4", "#f2f0eb", "#e8e7e3", "#f5f1e9"],
tick: function(pixel) {
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
let p2 = getPixel(x,y);
if(p2 != null){
if(["wine", "yeast", "grape", "apple", "plum"].includes(p2.element) && pixel.value == null){
pixel.value = "yeast";
} else if(p2.element == "mold" && pixel.value == null){
pixel.value = "mold";
}else if(p2.element == "mushroom_spore" && pixel.value == null){
pixel.value = "mushroom_spore";
}else if (p2.element == pixel.element && p2.value != null && pixel.value == null && Math.random()<0.0035){
pixel.value = p2.value;
}
}
}
if(Math.random() < 0.00075){
if(pixel.value == null && Math.random() < 0.025){
let elems = ["mold", "mold", "mushroom_spore"];
let elem = elems[Math.round(Math.random()*elems.length)];
while(elem == undefined){
elem = elems[Math.round(Math.random()*elems.length)];
}
changePixel(pixel, elem);
} else {
changePixel(pixel, pixel.value);
}
}
}
};
elements.mold = {
category: "life",
behavior: behaviors.POWDER,
color: ["#33402a", "#303d25", "#2b4f39", "#254231"],
reactions: {
cheese: {elem2: ["rotten_cheese", "rotten_cheese", "mold"], chance: 0.075},
meat: {elem2: ["rotten_meat", "rotten_meat", "mold"], chance: 0.075},
},
state: "solid",
tick: function(pixel){
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1], p2 = getPixel(x,y);
if(p2 != null){
if(plants.includes(p2.element) && Math.random() < 0.025){
let elems = ["mold", "rotten_fruit", "rotten_fruit"];
let elem = elems[Math.round(Math.random()*elems.length)];
while(elem == undefined){
elem = elems[Math.round(Math.random()*elems.length)];
}
changePixel(p2, elem);
}
}
}
}
};
elements.rotten_fruit = {
color: ["#5e3d00", "#5c3c01", "#4a3205", "#634102"],
category: "life",
behavior: behaviors.POWDER,
reactions: {
cheese: {elem2: ["rotten_cheese", "rotten_cheese", "mold"], chance: 0.075},
meat: {elem2: ["rotten_meat", "rotten_meat", "mold"], chance: 0.075},
},
state: "solid",
};
elements.yeast = {
color: ["#e3d3a6", "#f2dea7", "#e3cf98", "#f2dfaa"],
category: "life",
density: 1033,
behavior: behaviors.POWDER,
reactions: {
sugar_water: {elem2: "wine", color2: ["#6e85b5", "#6d81ab"], chance: 0.00025},
water: {elem2: "seltzer", chance: 0.00005},
},
tick: function(pixel){
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1], p2 = getPixel(x,y);
if(p2 != null){
if(p2.element == "juice" && Math.random() < 0.00025){
let rgb = getRGB(p2.color);
for(key in rgb){
rgb[key] = Math.max(rgb[key] - 10, 0);
}
changePixel(p2, "wine");
p2.color = normalize(rgb);
}
}
}
}
}
elements.fruit_branch = { elements.fruit_branch = {
color: elements.tree_branch.color, color: elements.tree_branch.color,
behavior: [ behavior: [
@ -741,22 +839,6 @@ elements.tomato_seed = new vineSeed("tomato", ["#F8F5D1","#E7E5CF","#E3E1C5"]);
elements.apple = new fruit("apple", ["#FF0507", "#EC0A0D", "#F22426", "#DC2C2E"], ["#F9C497", "#EED3BB", "#EEDEBB"]); elements.apple = new fruit("apple", ["#FF0507", "#EC0A0D", "#F22426", "#DC2C2E"], ["#F9C497", "#EED3BB", "#EEDEBB"]);
elements.apple.bloomColor = ["#fff0f7", "#fcebf3", "#fff0f7", "#ffe6f2", "#fff7fb"]; elements.apple.bloomColor = ["#fff0f7", "#fcebf3", "#fff0f7", "#ffe6f2", "#fff7fb"];
elements.apple_seed = new treeSeed("apple", ["#3B1C01", "#3E2107", "#3A1C02"]); elements.apple_seed = new treeSeed("apple", ["#3B1C01", "#3E2107", "#3A1C02"]);
function colorMix(p1, p2, bias = 0.5){
p1.color = interpolateRgb(getRGB(p1.color), getRGB(p2.color), bias);
p2.color = interpolateRgb(getRGB(p1.color), getRGB(p2.color), bias);
}
function interpolateRgb(rgb1, rgb2, ratio = 0.5) {
const interpolatedRgb = {
r: Math.round(rgb1.r + (rgb2.r - rgb1.r) * ratio),
g: Math.round(rgb1.g + (rgb2.g - rgb1.g) * ratio),
b: Math.round(rgb1.b + (rgb2.b - rgb1.b) * ratio),
};
return normalize(interpolatedRgb);
}
function getRGB(rgb){
let rgb2 = rgb.replace(")", "").replace("rgb(", "").replace(/,/g, "r").split("r")
return { r: parseInt(rgb2[0]), g: parseInt(rgb2[1]), b: parseInt(rgb2[2]) };
}
elements.juice.tick = function(pixel){ elements.juice.tick = function(pixel){
for(let i = 0; i < squareCoords.length; i++){ for(let i = 0; i < squareCoords.length; i++){
@ -790,9 +872,6 @@ elements.fruit_milk.onMix = function(pixel){
} }
} }
} }
function normalize(obj){
return `rgb(${obj.r},${obj.g},${obj.b})`;
}
elements.milk.reactions.juice = {func: function(p1, p2){ elements.milk.reactions.juice = {func: function(p1, p2){
let rgb = interpolateRgb(getRGB(p1.color), getRGB(p2.color), 0.25); let rgb = interpolateRgb(getRGB(p1.color), getRGB(p2.color), 0.25);
@ -1502,3 +1581,45 @@ elements.onion_seed = {
} }
} }
} }
elements.grape.reactions.sugar_water = {elem2: "wine", chance: 0.0006};
elements.grape.reactions.water = {elem2: "wine", chance: 0.00006};
elements.wine = {
density: 992,
color: ["#381b30", "#402137", "#261321", "#38192f"],
behavior: behaviors.LIQUID,
category: "liquids",
state: "liquid",
properties: {
alcChance: 0.13,
},
tick: function(pixel){
if(Math.random() < 0.00025){
pixel.alcChance += 0.01;
}
if(pixel.temp >70){
let chanceMulti = (pixel.temp-70)/20;
let chance = (pixel.alcChance/100)*chanceMulti;
for(let coords of squareCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < chance){
createPixel("alcohol_gas", x,y);
if(Math.random() < 0.5){
let rgb = getRGB(pixel.color);
for(let key in rgb){
rgb[key] += 10;
rgb[key] = Math.max(rgb[key], 0);
}
changePixel(pixel, "juice");
pixel.color = noiseify(RGBToHex(rgb), 6);
}
}
}
}
},
tempHigh: 100,
stateHigh: ["sugar", "carbon_dioxide", "steam", "alcohol_gas"],
};
}