diff --git a/mods/betaworldgen.js b/mods/betaworldgen.js index 9c25dd1f..33561e42 100644 --- a/mods/betaworldgen.js +++ b/mods/betaworldgen.js @@ -1,128 +1,187 @@ -//This mod was made by Alex the transfem, https://discord.com/users/778753696804765696 on discord and https://www.tiktok.com/@alextheagenenby?_t=8hoCVI3NRhu&_r=1 on tiktok. -function randomAlter(num, list){ - let r = Math.floor(Math.random() * list.length); - return (num + list[r]); +//This mod was made by Adora the transfem, https://discord.com/users/778753696804765696 on discord and https://www.tiktok.com/@alextheagenenby?_t=8hoCVI3NRhu&_r=1 on tiktok. +let code = { a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10, k: 11, l: 12, m: 13, n: 14, o: 15, p: 16, q: 17, r: 18, s: 19, t: 20, u: 21, v: 22, w: 23, x: 24, y: 25, z: 26, A: 27, B: 28, C: 29, D: 30, E: 31, F: 32, G: 33, H: 34, I: 35, J: 36, K: 37, L: 38, M: 39, N: 40, O: 41, P: 42, Q: 43, R: 44, S: 45, T: 46, U: 47, V: 48, W: 49, X: 50, Y: 51, Z: 52 } +let invertedCode = {} +let flat = function(){ + let str = ""; + for(var i = 0; i < width; i++){ + str += "a"; + } + return str; +} +let biomes = { + plains: { + layers: 2, + thicknesses: [15, 10], + specificSeeds: "flat", + heights: [1, 21], + layersObj: { + 1: ["rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","iron","iron","iron","aluminum","aluminum","aluminum","aluminum","uranium","diamond","copper","copper","copper","copper","sodium","sodium","potassium","potassium","charcoal","charcoal","charcoal","charcoal","charcoal", "calcium"], + 2: ["dirt", "dirt", "dirt", "dirt", "dirt", "dirt", "dirt", "dirt", "dirt","dirt", "dirt", "dirt","dirt", "dirt", "gravel", "gravel"] + }, + ssHeight: 39, + ssElems: ["grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","sapling","pinecone","seeds","seeds"] + }, + desert: { + layers: 1, + thicknesses: [20], + specificSeeds: "flat", + heights: [1], + layersObj: { + 1: ["sand"] + }, + ssHeight: 40, + ssElems: [undefined,undefined,undefined,undefined,undefined,undefined,"cactus"] + }, + forest: { + layers: 2, + specificSeeds: "flat", + heights: [1, 16], + thicknesses: [15, 10], + ssHeight: 29, + layersObj: { + 1: ["rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","charcoal","charcoal","charcoal","charcoal","charcoal","iron","iron","iron","aluminum","aluminum","aluminum","calcium","calcium","sodium","potassium","diamond"], + 2: ["dirt","dirt","dirt","dirt","dirt","dirt","dirt","dirt","dirt","dirt","dirt","dirt","dirt","dirt","gravel"] + }, + ssElems: ["grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","grass_seed","sapling", "pinecone"], + } +} +for (var item in code){ + invertedCode[code[item]] = item; +} +let ranNum = function(max, last) { + // Calculate a bias factor + let bias = Math.random() * 0.07 + 0.5; // Adjust this range to control the bias strength + + // Generate a biased random number towards the 'last' value + let num = Math.round(bias * last + (1 - bias) * Math.random() * max) + 1; + + // Randomly assign a negative or positive sign + return (Math.random() > 0.5) ? num : -num; +} +function decode(str){ + let result = []; + str.split(""); + for(var i = 0; i < str.length; i++){ + if(code[str[i]]){ + if(str[i - 1] == "*"){ + result[i] = code[str[i]] * 2; + } else { + result[i] = code[str[i]]; + } + } else if(str[i] == ":"){ + result[i] = ":"; + } else {continue;} + } + return result.filter(element => element !== undefined); +} +function makeSeed(layers, thickness){ + let result = ""; + for(var i = 0; i < layers; i++){ + let avgThickness = thickness[i]; + let str = ""; + let lastNum = 0; + for(var ii = 1; ii <= width-1; ii++){ + let num = ranNum(4, lastNum); + let cThickness = avgThickness + num; + lastNum = num; + if(invertedCode[cThickness] != undefined){ + str += invertedCode[cThickness]; + } else { + let num = Math.round(cThickness / 2); + str += `*${invertedCode[num]}`; + } + } + result += (i == (layers - 1)) ? str : `${str}:`; + } + return result; +} +function splitArrayByCharacter(arr, char) { + let result = []; + let subArray = []; + + arr.forEach(element => { + if (element === char) { + result.push(subArray); + subArray = []; + } else { + subArray.push(element); + } + }); + + // Push the last subarray if it's not empty + if (subArray.length > 0) { + result.push(subArray); + } + + return result; } -let avgheight = 0; let seed = ""; -function getSeed(type = "plains", thickness = 15){ - seed = ""; - console.log(thickness) - if(thickness == 15){ - avgheight = Math.floor(Math.random() * (18 - 12 + 1)) + 12; +function generate(type, seed1 = undefined){ + if(seed1){ + seed = seed1; } else{ - avgheight = thickness; + seed = makeSeed(biomes[type].layers, biomes[type].thicknesses); } - console.log(avgheight) - - if(type == "plains"){ - let location = Math.floor(Math.random(0, pixelMap.length) * 100); - let i = 0; - while (i < pixelMap.length){ - if (i !== location){ - seed += `${randomAlter(avgheight, [0, 1, 1, 2, 0, 0])}|`; - i += 1; - } else if (i == location){ - let height = `${Math.floor(Math.random(40, pixelMap[i].length) * 10)}`; - let prevH = randomAlter(avgheight, [1, 1, 1, 2, 0, 0]); - while (height > prevH){ - prevH = randomAlter(prevH, [0, 1, 1, 2, 0, 0, 0, 1]); - seed += `${prevH}|`; - } - - i += 1; - + let semifinalArr = decode(seed); + let finalArr = splitArrayByCharacter(semifinalArr, ":"); + for(var i = 0; i < finalArr.length; i++){ + let lHeight = biomes[type].heights[i]; + for(var ii = 1; ii < width-1; ii++){ + for(var iii = (height - 1) - lHeight; iii > height - lHeight - finalArr[i][ii]; iii--){ + let x = ii; + let y = iii; + let Num = Math.round(Math.random() * biomes[type].layersObj[i+1].length); + if(Num == biomes[type].layersObj[i+1].length){Num-=1;} + let element = biomes[type].layersObj[i+1][Num]; + if(isEmpty(x, y) && !outOfBounds(x, y)){ + createPixel(element, x, y); + } else {console.log("could not place. " + x + ", " + y); continue;} + } + } + } + if(biomes[type].specificSeeds){ + if(biomes[type].specificSeeds == "flat"){ + for(var i = 1; i < width-1; i++){ + let y = height - biomes[type].ssHeight; + let Num = Math.round(Math.random() * biomes[type].ssElems.length); + if(Num == biomes[type].ssElems.length){Num-=1;} + let element = biomes[type].ssElems[Num]; + if(element == undefined){continue;} + if(isEmpty(i, y) && !outOfBounds(i, y)){ + createPixel(element, i, y); } } - return seed; } - if(type == "desert"){ - let i = 0; - while (i < pixelMap.length){ - seed += `${randomAlter(avgheight, [0, 1, 1, 2, 0, 0])}|`; - i += 1; + } +} +elements.copy_seed = { + category: "tools", + onSelect: function(pixel){ + navigator.clipboard.writeText(seed).then(function() { + alert(`Seed succesfully copied to clipboard!`); + }).catch(function(error) { + alert("Unable to copy text.") + }); - } - } - return seed; - } -function spawnElements(seed, list, height2 = 1, condition = [1, 1, 0]){ - console.log(list); - let width = pixelMap.length - 1; - let element; - let height = pixelMap[1].length - 1; - console.log(seed); - let seedArray = seed.split("|"); - console.log(seedArray); - seedArray.splice(seedArray.indexOf(""), 1); - seedArray.splice(pixelMap.length); - console.log(seedArray); - let i = 0; - while (i < seedArray.length - 1){ - - let ii = 0; - while (ii < seedArray[i]){ - if((Math.floor(Math.random() * (condition[0] - condition[1] + 1))) == condition[2]){ - if (height2 != 1){ - element = list[Math.floor(Math.random() * list.length)]; - createPixel(element, (width - 1) - i, (height - (height2 + 1)) - ii); - } else{ - element = list[Math.floor(Math.random() * list.length)]; - createPixel(element, (width - 1) - i, (height - 1) - ii); - } - } - ii += 1; - } - - i += 1; } } - -function flat(){ - let iii = 0; - let flat = ""; - while (iii < pixelMap.length){ - flat += "1|"; - iii += 1; - } - return flat; -} -function processSeed(seed, type = "plains"){ - - console.log(flat()); - let seedsArray = seed.split(":"); - console.log(seedsArray); - if(type == "plains"){ - spawnElements(seedsArray[0],["rock","rock","rock","rock","rock","rock","metal_scrap","metal_scrap","metal_scrap","gold_coin","uranium","uranium","diamond","rock","iron","iron","iron","aluminum","aluminum","aluminum","aluminum","copper","copper","copper","zinc","zinc","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock","rock"].sort(() => Math.random() - 0.5)); - setTimeout(function(){ spawnElements(seedsArray[1], ["dirt"], 24); }, 200); - setTimeout(function(){ spawnElements(flat(),["grass","grass","grass","sapling","flower_seed","grass","grass","pinecone","grass","grass","grass","grass","grass","grass","grass","grass","grass","grass"], 40); }, 300); - } else if(type == "desert"){ - spawnElements(seed, ["sand"]); - setTimeout(function(){ spawnElements(flat(), ["cactus"], 40, [6, 0, 3]); }, 100); +elements.random_generation = { + category: "tools", + onSelect: function(pixel){ + autoResizeCanvas(); + focusGame(); + let type = prompt("Enter the biome you want to generate: \nOptions: plains, desert, forest"); + if(!biomes[type]) {type = "plains";} + generate(type); } } -elements.worldGen = { - color: "#FFFFFF", - behavior: elements.erase.behavior, - temp: 2, - category: "tools", - insulate:true, - canPlace: false, - desc: "Generate worlds with random seeds or your own seeds.", - onSelect: function() { - let Seed = prompt("Enter desert or plains random generation! automatically set to plains."); - let regex = /[a-z]/; - if (regex.test(Seed)){ - if(Seed.toLowerCase() == "desert"){ - processSeed(getSeed("desert", 30), "desert"); - } - } else { - if (Seed == ""){ - seed = `${getSeed("plains", 20)}:${getSeed("plains", 8)}` - processSeed(seed); - } else{ - processSeed(Seed); - } - } +elements.seed_generation = { + category: "tools", + onSelect: function(pixel){ + autoResizeCanvas(); + focusGame(); + let type = prompt("Enter the biome you want to generate: \nOptions: plains, desert, forest"); + let seed1 = prompt("Enter the seed: "); + generate(type, seed1); } } diff --git a/mods/morechemistry.js b/mods/morechemistry.js index 3d793eea..6dacbe57 100644 --- a/mods/morechemistry.js +++ b/mods/morechemistry.js @@ -1,5 +1,5 @@ //This mod was made by Adora the transfem, https://discord.com/users/778753696804765696 on discord and https://www.tiktok.com/@alextheagenenby?_t=8hoCVI3NRhu&_r=1 on tiktok. -let version = "1.5.2"; +let version = "1.6.2"; function pixelInRange(pixel, range){ let i = 0; while (i < range.length) { @@ -20,6 +20,8 @@ function customExplosion(pixel1, pixel2, radius, list) { let y = pixel1.y; deletePixel(x, y); deletePixel(pixel2.x, pixel2.y); + doFrame(); + focusGame(); explodeAt(x, y, radius, list); }; function reactPixels(pixel1,pixel2) { @@ -169,7 +171,7 @@ elements.sodiumhydroxidecrystals = { //tempHigh: 64.7, fireColor: "#fba600", category: "powders", - state: "powder", + state: "solid", density: 2130, name: "SodiumHydroxideCrystals", } @@ -632,10 +634,13 @@ elements.potassiumhydroxidecrystals = { //tempHigh: 64.7, fireColor: "#fba600", category: "powders", - state: "powder", + state: "solid", density: 2040, name: "PotassiumHydroxideCrystals", } +let filterItems; +let direction; + elements.iron_chloride = { color: ["#010014", "#a2ff94"], reactions: { @@ -691,7 +696,7 @@ elements.kilonova = { temp: 100000000, } elements.supernova.behavior = [ ["XX", "XX", "XX"], [ "XX", "EX:80>plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,molten_iron,molten_uranium,oxygen,molten_sodium,sulfur_gas,neon,chlorine,molten_calcium,molten_nickel,molten_copper,molten_zinc,gallium_gas,hydrogen,hydrogen,hydrogen,hydrogen,helium,helium,helium AND CH:NeutronStar", "XX" ], ["XX", "XX", "XX"] ] -elements.kilonova.behavior = [ ["XX", "XX", "XX"], [ "XX", "EX:200>plasma,plasma,plasma,plasma,plasma,plasma,molten_iron,molten_uranium,molten_lead,oxygen,molten_sodium,molten_gold,molten_tungsten,sulfur_gas,neon,chlorine,molten_calcium,molten_nickel,molten_copper,molten_zinc,gallium_gas,hydrogen,hydrogen,hydrogen,hydrogen,hydrogen,helium,helium,helium,helium AND CH:void", "XX" ], ["XX", "XX", "XX"] ] +elements.kilonova.behavior = [ ["XX", "XX", "XX"], [ "XX", "EX:200>plasma,plasma,molten_iron,molten_uranium,molten_lead,oxygen,molten_sodium,molten_gold,molten_tungsten,sulfur_gas,neon,chlorine,molten_calcium,molten_nickel,molten_copper,molten_zinc,gallium_gas,hydrogen,hydrogen,hydrogen,hydrogen,hydrogen,helium,helium,helium,helium AND CH:void", "XX" ], ["XX", "XX", "XX"] ] elements.NeutronStar = { behavior: [["XX", "XX", "XX"], ["CR:light", "XX", "CR:light"], ["XX", "XX", "XX"]], name: "NeutronStar", @@ -708,6 +713,7 @@ elements.NeutronStar = { "NeutronStar": { "elem1": "kilonova", "temp1": 100000000, }, }, density: 10**17, + hardness: 1, } elements.acid.ignore.push("pipe"); elements.acid.ignore.push("gold"); @@ -724,27 +730,16 @@ elements.NaK = { color: "#848484", viscosity: 9.4, reactions: { - "water": { - func: function (pixel1, pixel2) {customExplosion(pixel1, pixel2, 5, ["fire", "fire", "pop", "hydrogen", "sodiumhydroxide", "potassiumhydroxide","sodiumhydroxide", "potassiumhydroxide","sodiumhydroxide", "potassiumhydroxide"])} - }, + water: { + explosion: "fire,fire,pop,hydrogen,sodiumhydroxide,potassiumhydroxide,sodiumhydroxide,potassiumhydroxide,sodiumhydroxide,potassiumhydroxide", radius: 5,}, acid: { - func: function (pixel1, pixel2) {customExplosion(pixel1, pixel2, 6, ["fire", "pop", "hydrogen", "water", "pop", "hydrogen", "hydrogen"])} - }, + explosion: "fire,fire,pop,hydrogen,salt,potassium_salt,hydrogen,fire", radius: 6,}, acidic_water: { - func: function (pixel1, pel2) {customExplosion(pixel1, pixel2, 3, ["pop", "hydrogen", "hydrogen", "water","sodiumhyixdroxide", "potassiumhydroxide"])} - }, - chloroauric_acid: { elem1: "gold", - func: function (pixel1, pixel2) {customExplosion(pixel1, pixel2, 7, ["fire", "fire", "pop", "hydrogen", "gold_coin", "hydrogen", "pop"])} - }, - liquid_chloroauric_acid: { elem1: "gold", - func: function (pixel1, pixel2) {customExplosion(pixel1, pixel2, 7, ["fire", "fire", "pop", "hydrogen", "gold_coin", "hydrogen", "hydrogen", "pop"])} - }, - nitric_acid:{ - func: function (pixel1, pixel2) {customExplosion(pixel1, pixel2, 6, ["fire", "fire", "pop", "hydrogen", "hydrogen", "pop"])} - }, + explosion: "fire,fire,pop,hydrogen,sodiumhydroxide,potassiumhydroxide,salt,potassium_salt", radius: 5,}, + nitric_acid: { + explosion: "fire,fire,fire,pop,hydrogen,sodiumhydroxide,potassiumhydroxide", radius: 6,}, aqua_regia: { - func: function (pixel1, pixel2) {customExplosion(pixel1, pixel2, 9, ["fire", "fire", "pop", "hydrogen", "fire", "fire", "hydrogen", "pop", "flash"])} - }, + explosion: "fire,fire,pop,hydrogen,sodiumhydroxide,potassiumhydroxide,salt,potassium_salt,fire,hydrogen,pop", radius: 7,}, }, density: 868, }; @@ -770,6 +765,7 @@ elements.rubidium = { tick: function(pixel) { pixel.burning = true; }, + state: "solid", } elements.moltenrubidium = { density: 1532, @@ -798,7 +794,7 @@ elements.moltenrubidium = { } elements.rubidiumsalt = { - state: "powder", + state: "solid", name: "RubidiumSalt", alias: "Rubidium Chloride or RbCl", color: ["#e6e6e6", "#f5f5f5", "#fafafa", "#f0f0f0"], @@ -899,7 +895,7 @@ elements.rubidiumhydroxidecrystals = { }, fireColor: "#d91e1e", category: "powders", - state: "powder", + state: "solid", density: 2.12, name: "RubidiumHydroxideCrystals", } @@ -1022,11 +1018,12 @@ elements.specialsmasher = { } }, tick: function(pixel) { - if(pixel.start == pixelTicks) { + if(pixel.start + 1 == pixelTicks) { pixel.range = num2; + pixel.exclude = exclude; } let range = mouseRange(pixel.x, pixel.y, pixel.range); - smash(range, exclude); + smash(range, pixel.exclude); } } let num3 = 0; @@ -1038,7 +1035,7 @@ elements.specialmixer = { noMix: true, onSelect: function(pixel) { let item = prompt("enter range for mixing."); - exclude = prompt("Enter elements to exclude, seperate them with commas.").replace(/\s/g, "").split(","); + exclude1 = prompt("Enter elements to exclude, seperate them with commas.").replace(/\s/g, "").split(","); if(/^\d+$/.test(item)){ num3 = parseInt(item); } else { @@ -1046,11 +1043,12 @@ elements.specialmixer = { } }, tick: function(pixel) { - if(pixel.start == pixelTicks) { + if(pixel.start + 1 == pixelTicks) { pixel.range = num3; + pixel.exclude = exclude1; } let range = mouseRange(pixel.x, pixel.y, pixel.range); - mix(range, exclude); + mix(range, pixel.exclude); } } @@ -1355,7 +1353,10 @@ function pull(range, pixel1, include = []){ } } } - +function reduceToSign(num) { + if(num == 0){return 0;} + return num && num / Math.abs(num); +} let prevNum; elements.etemper = { name: "E-Temper", @@ -1377,11 +1378,15 @@ elements.etemper = { if(outOfBounds(x,y)){ continue; } if(isEmpty(x,y)){ continue; } let pixel2 = pixelMap[x][y]; - - if (pixel2.temp < pixel.Temp && pixel.charge > 0 ){ - pixel2.temp += pixel.Temp / 6; + if(reduceToSign(pixel.Temp) == -1){ + if (pixel2.temp > pixel.Temp && pixel.charge > 0 ){ + pixel2.temp += pixel.Temp / 6; + } + } else { + if (pixel2.temp < pixel.Temp && pixel.charge > 0 ){ + pixel2.temp += pixel.Temp / 6; + } } - } }, } @@ -1401,6 +1406,7 @@ elements.sign = { let attrElem = ""; let magnetRange = 0; let magnetElems = []; +let magnetPixels = []; elements.magnet = { category: "machines", tick:function(pixel){ @@ -1413,6 +1419,9 @@ elements.magnet = { for (var i = 0; i < currentPixels.length; i++){ if(pixelInRange(currentPixels[i], range)){ let pixel2 = currentPixels[i] + if(!magnetPixels.includes(pixel2)){ + magnetPixels.push(pixel2); + } if(!pixel2.drag && pixel.elem.includes(pixel2.element)){pixel2.drag = true} if(pixel2.drag && !pixel.elem.includes(pixel2.element) && !beamPixels.includes(pixel2) && ((draggingPixels && draggingPixels.includes(pixel2)) || !draggingPixels)){pixel2.drag = false;} if(!magnetElems.includes(pixel2) && pixel.elem.includes(pixel2.element)){magnetElems.push(pixel2)} @@ -1424,6 +1433,18 @@ elements.magnet = { currentPixels[i].drag = false; } } + for(var i = 0; i < magnetPixels.length; i++){ + if(magnetPixels.length != 0){ + if(!pixel.elem.includes(magnetPixels[i].element)){ + magnetPixels[i].drag = false; + magnetPixels.splice(i, 1); + } + if(!pixelInRange(magnetPixels[i], range)){ + magnetPixels[i].drag = false; + magnetPixels.splice(i, 1); + } + } + } }, onSelect: function(){ attrElem = prompt("Enter the element you want to attract.", (attrElem || undefined)); @@ -1537,6 +1558,44 @@ document.addEventListener("keydown", function(event){ } } } + if(event.key.toLowerCase() == "v"){ + for(var i = 0; i < UFOs.length; i++){ + let pixel = UFOs[i]; + let x = pixel.x + for (var y = pixel.y + 1; y < height; y++) { + if (outOfBounds(x, y)) { + break; + } + if (isEmpty(x, y)) { + if (Math.random() > 0.05) { continue } + createPixel("flash", x, y); + pixelMap[x][y].color = "#032dff"; + pixelMap[x][y].temp = -3500; + } + else { + if (elements[pixelMap[x][y].element].isGas) { continue } + if (elements[pixelMap[x][y].element].id === elements.heat_ray.id) { break } + pixelMap[x][y].temp -= 10; + pixelTempCheck(pixelMap[x][y]); + break; + } + } + } + } + if(event.key.toLowerCase() == "t"){ + for(var i = 0; i < UFOs.length; i++){ + for(var ii = 0; ii < adjacentCoords.length; ii++){ + let x = UFOs[i].x + adjacentCoords[ii][0]; + let y = UFOs[i].y + adjacentCoords[ii][1]; + if(x == pixel.x || y == pixel.y) {continue;} + if(!outOfBounds(x,y) && !isEmpty(x,y)){ + if(pixelMap[x][y].element == "ufo"){continue;} + deletePixel(x,y); + + } + } + } + } }) function isArray(item) { return Object.prototype.toString.call(item) === '[object Array]';