From b33dc8805e7afe0c41127de1ddbcf623ca90cc43 Mon Sep 17 00:00:00 2001
From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com>
Date: Fri, 4 Jul 2025 10:34:17 -0500
Subject: [PATCH] Update plants.js
---
mods/plants.js | 299 +++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 278 insertions(+), 21 deletions(-)
diff --git a/mods/plants.js b/mods/plants.js
index a739f157..89a5992b 100644
--- a/mods/plants.js
+++ b/mods/plants.js
@@ -1,8 +1,13 @@
+let is2d = (arr)=>{
+ return arr.some(item => Array.isArray(item));
+}
+let flowerExclude = ["pineapple"];
let vineGrow = ["wood", "rock_wall", "straw", "wall", "ewall", "bush_cane", "bush_base", "fruit_branch"];
let plants = {
tree: [],
vine: ["grape", "tomato"],
bush: [],
+ other: ["pineapple"],
includes: function(target){
for(item in this){
if(this[item] && Array.isArray(this[item]) && this[item].includes(target)){return true;}
@@ -10,6 +15,24 @@ let plants = {
return false;
}
}
+let growthPatterns = {
+ pineapple1: [[-1,-1],[-2,-2],[1,-1],[2,-2],[0,-1],[0,-2],[0,-3],[0,-4],[0,-5],[0,-6],[-1,-6],[1,-6],[-1,-5],[1,-5],[-1,-4],[1,-4],[-1,-3],[1,-3],[0,-7],[-1,-8],[1,-8]],
+ pineapple2: [[[-1,-1],[1,-1]],[[-2,-2],[2,-2]], [0,-1],[0,-2],[0,-3],[0,-4],[0,-5],[0,-6],[[-1,-6],[1,-6]],[[-1,-5],[1,-5]],[[-1,-4],[1,-4]],[[-1,-3],[1,-3]],[[-1,-2],[1,-2]],[0,-7],[-1,-8],[1,-8]],
+ pineapple3: [[-1,0],[-2,-1],[-3,-2],[1,0],[2,-1],[-4,-3],[3,-2],[4,-3],[-5,-4],[5,-4],[0,-1],[0,-2],[0,-3],[0,-4],[0,-5],[0,-6],[0,-7],[0,-8],[0,-9],[0,-10],[-1,-10],[1,-10],[-1,-9],[1,-9],[-1,-8],[1,-8],[-1,-7],[1,-7],[-1,-6],[1,-6],[-1,-5],[1,-5],[-1,-4],[1,-4],[-2,-9],[2,-9],[-2,-8],[2,-8],[2,-7],[-2,-7],[-2,-6],[2,-6],[2,-5],[-2,-5],[0,-11],[-1,-12],[1,-12],[2,-13],[-2,-13]],
+ melon_2x2: [[0,-1],[1,-2],[1,-1],[[1,0],[2,-1]],[2,0]],
+ melon_3x3: [[0,-1],[0,-2],[1,-3],[2,-3],[2,-2],[[1,-2],[1,-1]],[2,-1],[2,0],[1,0],[3,0],[3,-1],[3,-2]],
+ melon_4x4: [[0,-1],[0,-2],[0,-3],[1,-4],[2,-4],[3,-4],[3,-3],[2,-3],[2,-2],[3,-2],[1,-2],[1,-3],[1,-1],[2,-1],[3,-1],[1,0],[2,0],[3,0],[4,0],[4,-1],[4,-2],[4,-3]],
+ melon_5x5: [[0,-1],[0,-2],[0,-3],[0,-4],[1,-5],[2,-5],[3,-5],[3,-4],[2,-4],[3,-3],[4,-4],[4,-3],[2,-3],[1,-4],[5,-4],[3,-2],[2,-2],[4,-2],[5,-2],[1,-2],[1,-3],[5,-3],[1,-1],[2,-1],[3,-1],[4,-1],[5,-1],[5,0],[4,0],[3,0],[2,0],[1,0]],
+};
+let growthElems = {
+ pineapple1: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves"],
+ pineapple2: ["fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves"],
+ pineapple3: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
+ melon_2x2: ["fruit_leaves","fruit_leaves","flower","flower","flower","flower"],
+ melon_3x3: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
+ melon_4x4: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
+ melon_5x5: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
+}
let ethyleneChance = {
tomato: 0.000055,
orange: 0.000005,
@@ -245,16 +268,31 @@ elements.fruit_leaves = {
properties: {
age: 0,
fruit: "",
+ growthStage: 0,
+ dir: [1,1],
+ bloomColor: "#FFE2E2",
},
tick: function(pixel){
- if(pixelTicks == pixel.start + 1 && pixel.blooming == undefined){
+ if(pixelTicks == pixel.start + 1 && pixel.blooming == undefined && !pixel.growthPattern && !pixel.noBloom){
if(Math.floor(Math.random() * 3) == 2){
pixel.blooming = true;
- pixel.color = "#FFE2E2";
+ pixel.color ="#FFE2E2";
} else {
pixel.blooming = false;
}
}
+ if(pixel.blooming && elements[pixel.fruit] != undefined && elements[pixel.fruit].bloomColor != undefined && !elements[pixel.fruit].bloomColor.includes(pixel.bloomColor)){
+ pixel.bloomColor = elements[pixel.fruit].bloomColor;
+ }
+ if(pixel.blooming && !pixel.bloomColor.includes(pixel.color)){
+ let color = "";
+ if(Array.isArray(pixel.bloomColor)){
+ color = pixel.bloomColor[Math.round(Math.random()*pixel.bloomColor.length)];
+ } else {
+ color = pixel.bloomColor;
+ }
+ pixel.color = color;
+ }
for(var i = 0; i < adjacentCoords.length; i++){
let x = pixel.x+adjacentCoords[i][0];
let y = pixel.y+adjacentCoords[i][1];
@@ -273,7 +311,12 @@ elements.fruit_leaves = {
}
}
}
- if(pixel.blooming){
+ if(pixel.blooming && pixel.fruit == "pineapple" && Math.random() < 0.0035){
+ let x = pixel.x, y = pixel.y;
+ changePixel(pixel, "unripe_fruit");
+ pixelMap[x][y].fruit = "pineapple";
+ }
+ if(pixel.blooming && !flowerExclude.includes(pixel.fruit)){
let chance = 0.0025;
for(let i = 0; i < squareCoords.length; i++){
let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
@@ -297,21 +340,39 @@ elements.fruit_leaves = {
}
}
}
- if(pixel.fruit == "pineapple" && isEmpty(pixel.x, pixel.y-1) && !outOfBounds(pixel.x, pixel.y-1) && pixel.age < 300){
- pixel.blooming = false;
- pixel.color = elements.plant.color;
- createPixel("unripe_fruit", pixel.x, pixel.y-1);
- if(isEmpty(pixel.x, pixel.y-2)){
- createPixel("unripe_fruit", pixel.x, pixel.y-2);
- }
- if(isEmpty(pixel.x, pixel.y-3)){
- createPixel("fruit_leaves", pixel.x, pixel.y-3);
- }
- if(isEmpty(pixel.x-1, pixel.y-4)){
- createPixel("fruit_leaves", pixel.x-1, pixel.y-4);
- }
- if(isEmpty(pixel.x+1, pixel.y-4)){
- createPixel("fruit_leaves", pixel.x+1, pixel.y-4);
+ if(pixel.growthPattern == true){
+ let chance = (pixel.age-150)/2500;
+ chance = Math.max(Math.min(chance, 1), 0);
+ if(Math.random() < chance){
+ let value = growthPatterns[pixel.pattern][pixel.growthStage];
+ if(pixel.growthStage < growthPatterns[pixel.pattern].length && is2d(value)){
+ for(let coords of value){
+ let x = pixel.x+(coords[0]*pixel.dir[0]), y = pixel.y+(coords[1]*pixel.dir[1]);
+ if(isEmpty(x,y) && !outOfBounds(x,y)){
+ if(growthElems[pixel.pattern][pixel.growthStage] == "flower"){
+ createPixel("fruit_leaves", x, y);
+ pixelMap[x][y].blooming = true;
+ pixelMap[x][y].fruit = pixel.fruit;
+ } else {
+ createPixel((growthElems[pixel.pattern][pixel.growthStage] == undefined) ? growthElems[pixel.pattern][0] : growthElems[pixel.pattern][pixel.growthStage], x, y);
+ pixelMap[x][y].noBloom = true;
+ }
+ }
+ }
+ } else if(pixel.growthStage < growthPatterns[pixel.pattern].length) {
+ let x = pixel.x+(value[0]*pixel.dir[0]), y = pixel.y+(value[1]*pixel.dir[1]);
+ if(isEmpty(x,y) && !outOfBounds(x,y)){
+ if(growthElems[pixel.pattern][pixel.growthStage] == "flower"){
+ createPixel("fruit_leaves", x, y);
+ pixelMap[x][y].blooming = true;
+ pixelMap[x][y].fruit = pixel.fruit.split("_")[0];
+ } else {
+ createPixel((growthElems[pixel.pattern][pixel.growthStage] == undefined) ? growthElems[pixel.pattern][0] : growthElems[pixel.pattern][pixel.growthStage], x, y);
+ pixelMap[x][y].noBloom = true;
+ }
+ }
+ }
+ pixel.growthStage += 1;
}
}
pixel.age++;
@@ -733,12 +794,208 @@ elements.avocado.breakInto = "guacamole";
elements.guacamole = {
color: ["#cff74a", "#caf244", "#c1e649", "#b3d640"],
behavior: behaviors.LIQUID,
- viscosity: 950,
+ viscosity: 1350,
category: "food",
state: "liquid",
isFood: true,
+ onMix: function(pixel){
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].isFood && pixelMap[x][y].element != "quacamole"){
+ let chance = (shiftDown) ? 1 : 0.5;
+ if(Math.random() < chance){
+ let rgb = interpolateRgb(getRGB(pixel.color), getRGB(pixelMap[x][y].color), 0.8);
+ changePixel(pixelMap[x][y], "guacamole");
+ pixel.color = rgb;
+ pixelMap[x][y].color = rgb;
+ }
+ }
+ }
+ }
}
-settingsMenu.innerHTML += `
+runAfterAutogen(()=>{settingsMenu.innerHTML += `
-`;
+`;});
+elements.cocoa = new fruit("cocoa", ["#b09533", "#ad9439", "#b39736", "#99732c", "#ab8338", "#ad8231"], ["#826a3e", "#634f28", "#634b1f", "#5c461c"], "tree", ["#826a3e", "#634f28", "#634b1f", "#5c461c"]);
+elements.cocoa.breakInto = "cocoa_seed";
+elements.cocoa_seed.name = "CocoaBean";
+elements.cocoa_seed.breakInto = undefined;
+elements.cocoa_seed.tempHigh = 125;
+elements.cocoa_seed.stateHigh = "roasted_cocoa_bean";
+elements.roasted_cocoa_bean = {
+ category: "food",
+ behavior: behaviors.POWDER,
+ extract: "melted_cocoa_butter",
+ color: ["#2b1b01", "#291a02", "#211503", "#211503"],
+ breakInto: "cocoa_powder",
+}
+elements.cocoa_powder = {
+ category: "food",
+ behavior: behaviors.POWDER,
+ color: ["#3b2604", "#332104", "#402802", "#301e01"],
+}
+elements.cocoa_butter = {
+ behavior: behaviors.STURDYPOWDER,
+ tempHigh: 36,
+ color: ["#feffe8", "#f4f5dc", "#fcfce1", "#feffed", "#feffd6"],
+ category: "food",
+ isFood: true,
+ stateHigh: "melted_cocoa_butter",
+}
+elements.melted_cocoa_butter = {
+ behavior: behaviors.LIQUID,
+ color: ["#fff082", "#e3d676", "#f2e57e", "#fff07d"],
+ tempLow: 35,
+ stateLow: "cocoa_butter",
+ reactions: {
+ cocoa_powder: {elem1: "chocolate", elem2: "chocolate"}
+ },
+ category: "states",
+ isFood: true,
+ viscosity: 750,
+ temp: 36,
+};
+elements.extractor = {
+ category: "machines",
+ behavior: behaviors.WALL,
+ tick: function(pixel){
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].extract != undefined){
+ changePixel(pixelMap[x][y], elements[pixelMap[x][y].element].extract);
+ }
+ }
+ },
+ movable: false,
+}
+elements.pineapple_seed = {
+ behavior: behaviors.POWDER,
+ color: ["#242000", "#1f1c00", "#1a1701", "#1f1c01"],
+ category: "life",
+ properties: {
+ age: 0,
+ fruit: "pineapple",
+ growthPattern: true,
+ },
+ tick: function(pixel){
+ let num = Math.round((Math.random()*0.75)*3)+1;
+ chance = (pixel.age -140)/100;
+ chance = Math.max(Math.min(chance, 1), 0);
+ if(Math.random()