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()