diff --git a/mods/AnonymousWorldgenLibrary.js b/mods/AnonymousWorldgenLibrary.js new file mode 100644 index 00000000..943b35c8 --- /dev/null +++ b/mods/AnonymousWorldgenLibrary.js @@ -0,0 +1,55 @@ +// AnonymousWorldgenLibrary.js \\ +// A useful mod that provides a function to generate terrain when placing an element, could not be used a lot but can be useful \\ + + + + function generateWorld(pixel, layers = [], startX = -500, endX = 500, baseY = 82) { + deletePixel(pixel.x, pixel.y); // Deletes the pixel that triggered the generation + for (let x = startX; x <= endX; x++) { + layers.forEach((layer, layerIndex) => { + const y = baseY - layerIndex; // Each layer is placed one row above the previous + + // Check if the spot is empty and passes the chance check + if (Math.random() < layer.chance) { + tryCreate(layer.element, x, y); // Creates the pixel + } + }); + } + selectElement(null); +} + + +// ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +// generateWorld Function Reference: +// pixel: The generateWorld function is used in onPlace(pixel), the reason of including pixel is to delete it. +// layers: An array of layer objects like this: +// [{element: "yourElement", chance: 0.5}, {...}, ...] +// Each layer is placed one row above the previous. +// 'chance' must be between 0 and 1 — higher means more likely to generate. +// startX / endX: Horizontal range to generate across. Default is -500 to 500. +// baseY: Vertical starting point for the bottom layer. Default is 82 (bottom of medium canvas). +// +// Tip: To insert empty space between layers, use an empty object: {} +// Example: [layer1, {}, layer3] will skip one row between layer1 and layer3. +// Fact: The index 0 layer will be placed at the baseY, and the index 1 layer will be placed in baseY - 1, so when looking at the code, it looks upside down. +// Note: If someone is using tinier or bigger canvas size then this may not work as needed, you should make a case for each canvas size +// ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + +// Example usage of generateWorld +elements.generateWorldExample = { + color: "#808080", + category: "World Generator", + onPlace: (pixel) => { + generateWorld(pixel, [ + {element: "dirt", chance: 0.65}, + {element: "dirt", chance: 0.65}, + {element: "dirt", chance: 0.65}, + {element: "dirt", chance: 0.65}, + {element: Math.random() < 0.1 ? "grass_seed" : "grass", chance: 0.6}, + {}/* Space between grass/grass_seed and sapling */, + {element: "sapling", chance: 1 / 6} + ]); + }, + maxSize: 1 +};