Deletions for merging about 4.5 mods into generative_mods.js + generator_prompt.js update

love4eva
This commit is contained in:
Laetitia (O-01-67) 2023-01-23 14:40:02 -05:00 committed by GitHub
commit 5227eac563
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 2252 deletions

View File

@ -1,27 +1,12 @@
var lategenOptions = [];
var creeperMod = "mods/mobs.js";
var spoutMod = "mods/spouts.js";
var fairyMod = "mods/more_fairies.js";
var cloudMod = "mods/more_clouds.js";
var bombMod = "mods/more_bombs.js";
var mainMod = "mods/generative_mods.js";
var singularityMod = "mods/neutronium_compressor.js";
if(enabledMods.includes(creeperMod)) {
if(enabledMods.includes(mainMod)) {
lategenOptions.push("creeper");
};
if(enabledMods.includes(spoutMod)) {
lategenOptions.push("spout");
};
if(enabledMods.includes(fairyMod)) {
lategenOptions.push("fairy");
};
if(enabledMods.includes(cloudMod)) {
lategenOptions.push("cloud");
};
if(enabledMods.includes(bombMod)) {
lategenOptions.push("bomb");
};
if(enabledMods.includes(bombMod)) {
lategenOptions.push("bomb");
};
if(enabledMods.includes(singularityMod)) {
@ -29,7 +14,7 @@ if(enabledMods.includes(singularityMod)) {
};
lgoDisplayString = lategenOptions.join(", ");
if(lgoDisplayString === "") {
lgoDisplayString: "[None. This requires at least one element-generating mod: mobs.js, spouts.js, more_fairies.js, more_clouds.js, more_bombs.js, or neutronium_compressor.js!]";
lgoDisplayString: "[None. This requires at least one element-generating mod!: generative_mods.js or neutronium_compressor.js]";
};
document.addEventListener("keydown", function(e) { //prop prompt listener
@ -58,31 +43,43 @@ function generatorPrompt() {
elements = prompt(`Enter the element(s) you want to generate ${typePlural} for.
Elements are separated by commas; to use a combination of elements, the elements are separated by plus signs (like "gold_coin+diamond").`);
elements = parseForLateGenerationParameter(elements);
switch(type) {
case "creeper":
generateCreeper(elements,true);
break;
case "spout":
generateSpout(elements,true);
break;
case "fairy":
generateFairy(elements,true);
break;
case "cloud":
generateCloud(elements,true);
break;
case "singularity":
generateSingularity(elements,true);
break;
case "bomb":
var number = prompt(`Enter a bomb number (default: 1)
1 corresponds to radius 10, 2 corresponds to radius 15, etc.`);
if(isNaN(parseFloat(number))) { number = 1 };
generateBomb(elements,true,number);
break;
default:
alert("An invalid type made it past the if statement. You shouldn't ever see this error.");
throw new Error("An invalid type made it through the if statement.");
try {
var amount = 0;
switch(type) {
case "creeper":
amount += generateCreeper(elements,true).length;
break;
case "spout":
amount += generateSpout(elements,true).length;
break;
case "fairy":
amount += generateFairy(elements,true).length;
break;
case "cloud":
amount += generateCloud(elements,true).length;
break;
case "singularity":
amount += generateSingularity(elements,true).length;
break;
case "bomb":
var number = prompt(`Enter a bomb number (default: 1)
1 corresponds to radius 10, 2 corresponds to radius 15, etc.`);
if(isNaN(parseFloat(number))) { number = 1 };
amount += generateBomb(elements,true,number).length;
break;
default:
alert("An invalid type made it past the if statement. You shouldn't ever see this error.");
throw new Error("An invalid type made it through the if statement.");
};
alert(`Generated ${amount} ${amount == 1 ? "element" : "elements"}`);
} catch (error) {
var errorString = error.toString();
var errorText = "";
if(errorString.includes("Cannot read properties of undefined")) {
errorText += "\r\n(This is most likely from a nonexistent or misspelled element)";
};
alert("There was an error!\r\n" + error.toString() + errorText);
throw error; //for console
};
};
};

View File

@ -5113,822 +5113,6 @@ if(enabledMods.includes(runAfterAutogenMod) && enabledMods.includes(explodeAtPlu
/* -------------------------
- End skeleton elements -
------------------------- */
/* Creeper generation
___#___#___#___#___#___#___#___#___#___
__#___#___#___#___#___#___#___#___#___#
_#___#___#___#___#___#___#___#___#___#_
#___#___#___#___#___#___#___#___#___#__
___#___#___#___#___#___#___#___#___#___
__#___#___#___#___#___#___#___#___#___#
_#___#___#___#___#___#___#___#___#___#_
#___#___#___#___#___#___#___#___#___#__
___#___#___#___#___#___#___#___#___#___
__#___#___#___#___#___#___#___#___#___#
_#___#___#___#___#___#___#___#___#___#_
#___#___#___#___#___#___#___#___#___#__
___#___#___#___#___#___#___#___#___#___
__#___#___#___#___#___#___#___#___#___#
_#___#___#___#___#___#___#___#___#___#_
#___#___#___#___#___#___#___#___#___#__
*/
//This code is a lot worse than I'd have liked it to be...
//Include generated creepers in Random tool?
if(urlParams.get('creeperIncludeRandom') !== null) { //if the variable exists at all
creeperIncludeRandom = true
} else { //if it doesn't (and it returns null)
creeperIncludeRandom = false
}
//Generate creepers
if(urlParams.get('generateCreepers') !== null) { //if the variable exists at all
generateCreepers = true
} else { //if it doesn't (and it returns null)
generateCreepers = false
}
//Start Creeper Template Functions {
autoCreeperPlacerTick = function(pixel) {
var creeperElement = elements[pixel.element].creeperType;
var headName,bodyName;
if(typeof(creeperElement === "string")) { //comma separated string check
if(creeperElement.includes(",")) { //if it is
creeperElement = creeperElement.split(","); //to array
creeperElement = creeperElement.filter(function(e) { //strip nonexistent elements
return typeof(elements[e]) === "object";
});
};
};
if(Array.isArray(creeperElement)) {
headName = `${creeperElement.join("_")}_creeper_head`; //auto head element name
bodyName = `${creeperElement.join("_")}_creeper_body`; //auto body element name
} else {
headName = `${creeperElement}_creeper_head`; //auto head element name
bodyName = `${creeperElement}_creeper_body`; //auto body element name
};
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel(bodyName, pixel.x, pixel.y+1);
pixel.element = headName;
pixel.color = pixelColorPick(pixel)
} else if (isEmpty(pixel.x, pixel.y-1)) {
createPixel(headName, pixel.x, pixel.y-1);
pixel.element = bodyName;
pixel.color = pixelColorPick(pixel)
} else {
deletePixel(pixel.x, pixel.y);
};
};
autoCreeperBodyTick = function(pixel) {
var creeperElement = elements[pixel.element].creeperType;
var headName,bodyName,explodeInto;
if(typeof(creeperElement === "string")) { //comma separated string check
if(creeperElement.includes(",")) { //if it is
creeperElement = creeperElement.split(","); //to array
creeperElement = creeperElement.filter(function(e) { //strip nonexistent elements
return typeof(elements[e]) === "object";
});
};
};
if(Array.isArray(creeperElement)) {
headName = `${creeperElement.join("_")}_creeper_head`; //auto head element name
bodyName = `${creeperElement.join("_")}_creeper_body`; //auto body element name
explodeInto = creeperElement.join(","); //auto body element name
} else {
headName = `${creeperElement}_creeper_head`; //auto head element name
bodyName = `${creeperElement}_creeper_body`; //auto body element name
explodeInto = creeperElement; //auto body element name
};
if (tryMove(pixel, pixel.x, pixel.y+1)) { // Fall
if (!isEmpty(pixel.x, pixel.y-2, true)) { // Drag head down
var headPixel = pixelMap[pixel.x][pixel.y-2];
if (headPixel.element == headName) {
if (isEmpty(pixel.x, pixel.y-1)) {
movePixel(pixelMap[pixel.x][pixel.y-2], pixel.x, pixel.y-1);
}
else {
swapPixels(pixelMap[pixel.x][pixel.y-2], pixelMap[pixel.x][pixel.y-1]);
}
}
}
}
doHeat(pixel);
doBurning(pixel);
doElectricity(pixel);
if (pixel.dead) {
// Turn into rotten_meat if pixelTicks-dead > 500
if (pixelTicks-pixel.dead > 200) {
Math.random() < 0.1 ? changePixel(pixel,"gunpowder") : changePixel(pixel,"rotten_meat");
}
return
}
// Find the head
if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == headName) {
var head = pixelMap[pixel.x][pixel.y-1];
if (head.dead) { // If head is dead, kill body
pixel.dead = head.dead;
}
}
else { var head = null }
if (isEmpty(pixel.x, pixel.y-1)) {
// create blood if decapitated 10% chance
if (Math.random() < 0.1) {
createPixel("blood", pixel.x, pixel.y-1);
// set dead to true 15% chance
if (Math.random() < 0.15) {
pixel.dead = pixelTicks;
}
}
}
else if (head == null) { return }
else if (Math.random() < 0.1) { // Move 10% chance
var movesToTry = [
[1*pixel.dir,0],
[1*pixel.dir,-1],
];
// While movesToTry is not empty, tryMove(pixel, x, y) with a random move, then remove it. if tryMove returns true, break.
while (movesToTry.length > 0) {
var move = movesToTry.splice(Math.floor(Math.random() * movesToTry.length), 1)[0];
if (isEmpty(pixel.x+move[0], pixel.y+move[1]-1)) {
if (tryMove(pixel, pixel.x+move[0], pixel.y+move[1])) {
movePixel(head, head.x+move[0], head.y+move[1]);
break;
};
};
};
// 15% chance to change direction while not chasing a human
if(!head.following) {
if (Math.random() < 0.15) {
pixel.dir *= -1;
//console.log("*turns around cutely to face ${pixel.dir < 0 ? 'left' : 'right'}*");
};
}/* else {
//console.log("*chases cutely*");
};*/
};
if(pixel.charge) {
pixel.charged = true;
};
if(head) {
if(typeof(head.charge) !== "undefined") {
if(head.charge) {
pixel.charged = true;
};
};
if(typeof(head.charged) !== "undefined") {
if(head.charged) {
pixel.charged = true;
};
};
};
if(typeof(pixel.charged) === "undefined") {
pixel.charged = false;
};
if(pixel.charged) {
var explosionRadius = 7;
if(!pixel.didChargeBlueTinted) { //do once, on initial charge
//console.log("something something halsey lyric");
var color = pixel.color;
if(color.startsWith("rgb")) {
//console.log("rgb detected");
color = color.split(","); //split color for addition
var red = parseFloat(color[0].substring(4));
var green = parseFloat(color[1]);
var blue = parseFloat(color[2].slice(0,-1));
red = rgbColorBound(red + 51);
green = rgbColorBound(green + 51);
blue = rgbColorBound(blue + 102);
color = `rgb(${red},${green},${blue})`;
pixel.color = color;
//console.log("color set");
} else if(color.startsWith("hsl")) {
//console.log("hsl detected");
color = color.split(","); //split color for addition
var hue = parseFloat(color[0].substring(4));
var saturation = parseFloat(color[1].slice(0,-1));
var luminance = parseFloat(color[2].slice(0,-2));
hue = hue % 360; //piecewise hue shift
if(hue <= 235 && hue >= 135) {
hue = 185;
} else if(hue < 135) {
hue += 50;
} else if(hue > 235 && hue < 360) {
hue -= 50;
};
saturation = slBound (saturation + 10);
luminance = slBound(luminance + 20);
color = `hsl(${hue},${saturation}%,${luminance}%)`;
pixel.color = color;
//console.log("color set");
};
pixel.didChargeBlueTinted = true;
};
} else {
var explosionRadius = 5;
};
if(pixel.burning) {
pixel.hissing = true;
if(!pixel.hissStart) {
pixel.hissStart = pixelTicks;
};
if(!pixel.burnStart) { //I don't like errors.
pixel.burnStart = pixel.ticks;
};
if(pixelTicks - pixel.burnStart > 30) {
//console.log("Kaboom?");
explodeAt(pixel.x,pixel.y,explosionRadius,creeperElement);
//console.log("Yes, Rico, kaboom.");
};
};
//Head hissing color handler: keeps track of head's hissing for coloring purposes
for(i = 0; i < 1; i++) { //dummy for loop
if(pixel.dead || !head || head.dead) { //can't hiss without a head according to the classic creeper anatomy
//console.log("ss-- oof");
pixel.hissing = false;
break;
};
if(head.hissing) {
//console.log("Ssssssss");
if(!head.hissStart) {
//console.log("t-30 ticks or whatever it was");
head.hissStart = pixelTicks;
};
//Color code {
var ticksHissing = pixelTicks - head.hissStart;
var color = pixel.color; //do on each hissing tick
if(color.startsWith("rgb")) {
//console.log("rgb detected");
color = color.split(","); //split color for addition
var red = parseFloat(color[0].substring(4));
var green = parseFloat(color[1]);
var blue = parseFloat(color[2].slice(0,-1));
red = rgbColorBound(red + ticksHissing);
green = rgbColorBound(green + ticksHissing);
blue = rgbColorBound(blue + ticksHissing);
color = `rgb(${red},${green},${blue})`;
pixel.color = color;
//console.log("color set");
} else if(color.startsWith("hsl")) {
//console.log("hsl detected");
color = color.split(","); //split color for addition
var hue = parseFloat(color[0].substring(4));
var saturation = parseFloat(color[1].slice(0,-1));
var luminance = parseFloat(color[2].slice(0,-2));
//console.log("the j");
luminance = slBound(luminance + 1.176);
//console.log(luminance);
color = `hsl(${hue},${saturation}%,${luminance}%)`;
pixel.color = color;
//console.log("color set");
};
//}
};
};
};
autoCreeperHeadTick = function(pixel) {
var creeperElement = elements[pixel.element].creeperType;
var headName,bodyName,explodeInto;
if(typeof(creeperElement === "string")) { //comma separated string check
if(creeperElement.includes(",")) { //if it is
creeperElement = creeperElement.split(","); //to array
creeperElement = creeperElement.filter(function(e) { //strip nonexistent elements
return typeof(elements[e]) === "object";
});
};
};
if(Array.isArray(creeperElement)) {
headName = `${creeperElement.join("_")}_creeper_head`; //auto head element name
bodyName = `${creeperElement.join("_")}_creeper_body`; //auto body element name
explodeInto = creeperElement.join(","); //auto body element name
} else {
headName = `${creeperElement}_creeper_head`; //auto head element name
bodyName = `${creeperElement}_creeper_body`; //auto body element name
explodeInto = creeperElement; //auto body element name
};
doHeat(pixel);
doBurning(pixel);
doElectricity(pixel);
if (pixel.dead) {
// Turn into rotten_meat if pixelTicks-dead > 500
if (pixelTicks-pixel.dead > 200) {
Math.random() < 0.1 ? changePixel(pixel,"gunpowder") : changePixel(pixel,"rotten_meat");
return
}
}
// Find the body
if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == bodyName) {
var body = pixelMap[pixel.x][pixel.y+1];
if (body.dead) { // If body is dead, kill head
pixel.dead = body.dead;
}
}
else { var body = null }
if(body) {
if(body.dir !== pixel.dir) { //hacky workaround: lock head dir to body dir
pixel.dir = body.dir;
};
};
if (isEmpty(pixel.x, pixel.y+1)) {
tryMove(pixel, pixel.x, pixel.y+1);
// create blood if severed 10% chance
if (isEmpty(pixel.x, pixel.y+1) && !pixel.dead && Math.random() < 0.1) {
createPixel("blood", pixel.x, pixel.y+1);
// set dead to true 15% chance
if (Math.random() < 0.15) {
pixel.dead = pixelTicks;
}
}
}
//start of most new code
var pX = pixel.x;
var pY = pixel.y;
if(pixel.charge) {
pixel.charged = true;
};
if(body) {
if(typeof(body.charge) !== "undefined") {
if(body.charge) {
pixel.charged = true;
};
};
if(typeof(body.charged) !== "undefined") {
if(body.charged) {
pixel.charged = true;
};
};
};
if(typeof(pixel.charged) === "undefined") {
pixel.charged = false;
};
if(pixel.charged) {
var explosionRadius = 10;
if(!pixel.didChargeBlueTinted) { //do once, on initial charge
//console.log("something something halsey lyric");
var color = pixel.color;
if(color.startsWith("rgb")) {
//console.log("rgb detected");
color = color.split(","); //split color for addition
var red = parseFloat(color[0].substring(4));
var green = parseFloat(color[1]);
var blue = parseFloat(color[2].slice(0,-1));
red = rgbColorBound(red + 51);
green = rgbColorBound(green + 51);
blue = rgbColorBound(blue + 102);
color = `rgb(${red},${green},${blue})`;
pixel.color = color;
//console.log("color set");
} else if(color.startsWith("hsl")) {
//console.log("hsl detected");
color = color.split(","); //split color for addition
var hue = parseFloat(color[0].substring(4));
var saturation = parseFloat(color[1].slice(0,-1));
var luminance = parseFloat(color[2].slice(0,-2));
hue = hue % 360; //piecewise hue shift
if(hue <= 235 && hue >= 135) {
hue = 185;
} else if(hue < 135) {
hue += 50;
} else if(hue > 235 && hue < 360) {
hue -= 50;
};
saturation = slBound (saturation + 10);
luminance = slBound(luminance + 20);
color = `hsl(${hue},${saturation}%,${luminance}%)`;
pixel.color = color;
//console.log("color set");
};
pixel.didChargeBlueTinted = true;
};
} else {
var explosionRadius = 7;
};
//Human detection loop (looks ahead according to direction and sets the "following" variable to true, telling the body to lock the direction)
var directionAdverb = "left";
if(pixel.dir > 0) {
directionAdverb = "right";
};
//console.log(`Looking ${directionAdverb}`)
if(pixel.dir === -1) {
for(i = -4; i < 4+1; i++) {
var oY = i;
//console.log(`Starting row look at row ${pY+oY}`)
for(j = (-1); j > (-16 - 1); j--) {
var oX = j;
var nX = pX+oX;
var nY = pY+oY;
if(outOfBounds(nX,nY)) {
//console.log(`Stopping row look at pixel (${nX},${nY}) due to OoB`)
break;
};
if(isEmpty(nX,nY)) {
////console.log(`Skipping pixel (${nX},${nY}) (empty)`)
continue;
};
if(!isEmpty(nX,nY,true)) {
var newPixel = pixelMap[nX][nY];
var newElement = newPixel.element;
if(enemyHumanoidArray.includes(newElement)) {
//console.log(`Human part found at (${nX},${nY})`)
if(!newPixel.dead) {
pixel.following = true;
//console.log(`Human detected at (${nX},${nY})`)
//Start "hissing" if a human is close enough
if(coordPyth(pX,pY,nX,nY) <= 3.15) { //probably misapplying the tolerance from the MC Wiki line: "Creepers will chase after any player, as long as it is within a 16 block (±5%) radius"
pixel.hissing = true;
if(!pixel.hissStart) {
pixel.hissStart = pixelTicks;
};
};
};
} else {
//console.log(`Stopping row look at pixel (${nX},${nY}) due to non-human pixel in the way`)
break; //can't see through humans
};
};
};
};
} else if(pixel.dir === 1) {
for(i = -4; i < 4+1; i++) {
var oY = i;
//console.log(`Starting row look at row ${pY+oY}`)
for(j = 1; j < 16 + 1; j++) {
var oX = j;
var nX = pX+oX;
var nY = pY+oY;
if(outOfBounds(nX,nY)) {
//console.log(`Stopping row look at pixel (${nX},${nY}) due to OoB`)
break;
};
if(isEmpty(nX,nY)) {
////console.log(`Skipping pixel (${nX},${nY}) (empty)`)
continue;
};
if(!isEmpty(nX,nY,true)) {
var newPixel = pixelMap[nX][nY];
var newElement = newPixel.element;
if(enemyHumanoidArray.includes(newElement)) {
//console.log(`Human part found at (${nX},${nY})`)
if(!newPixel.dead) {
pixel.following = true;
//console.log(`Human detected at (${nX},${nY})`)
//Start "hissing" if a human is close enough
if(coordPyth(pX,pY,nX,nY) <= 3.15) {
pixel.hissing = true;
if(!pixel.hissStart) {
pixel.hissStart = pixelTicks;
};
};
break;
};
} else {
//console.log(`Stopping row look at pixel (${nX},${nY}) due to non-human pixel in the way`)
break;
};
};
};
};
};
//Pre-explosion handler: keeps track of time before the kaboom
for(i = 0; i < 1; i++) { //dummy for loop
if(pixel.hissing) {
//console.log("Ssssssss");
if(pixel.dead || !body || body.dead) { //can't explode without a body according to the classic creeper anatomy
//console.log("ss-- oof");
pixel.hissing = false;
break;
};
if(!pixel.hissStart) {
//console.log("t-30 ticks or whatever it was");
pixel.hissStart = pixelTicks;
};
//Color code {
var ticksHissing = pixelTicks - pixel.hissStart;
var color = pixel.color; //do on each hissing tick
if(color.startsWith("rgb")) {
//console.log("rgb detected");
color = color.split(","); //split color for addition
var red = parseFloat(color[0].substring(4));
var green = parseFloat(color[1]);
var blue = parseFloat(color[2].slice(0,-1));
red = rgbColorBound(red + ticksHissing);
green = rgbColorBound(green + ticksHissing);
blue = rgbColorBound(blue + ticksHissing);
color = `rgb(${red},${green},${blue})`;
pixel.color = color;
//console.log("color set");
} else if(color.startsWith("hsl")) {
//console.log("hsl detected");
color = color.split(","); //split color for addition
var hue = parseFloat(color[0].substring(4));
var saturation = parseFloat(color[1].slice(0,-1));
var luminance = parseFloat(color[2].slice(0,-2));
luminance = slBound(luminance + 1.176);
color = `hsl(${hue},${saturation}%,${luminance}%)`;
pixel.color = color;
//console.log("color set");
};
//}
if(pixelTicks - pixel.hissStart > 30) {
//console.log("Kaboom?");
//console.log(`Exploding with element ${creeperElement} and radius ${explosionRadius} (charged: ${pixel.charged})`);
explodeAt(body.x,body.y,explosionRadius,explodeInto);
//console.log("Yes, Rico, kaboom.");
};
};
};
if(Math.random() < 0.01) { //1% chance each tick to lose interest
pixel.following = false;
//console.log("Meh.");
};
};
//End Creeper Template Functions }
var placeholderColor = "#FF00FF";
var hslOffsets = [[0, -5, 5], [0, -20, 10], [0, 0, 10], [0, -20, 10], [0, -35, 0], [0, -20, -30], [0, 10, -10], [0, 10, 20], [0, -20, 10], [0, -10, 5]];
var colorOfRandomCreeper = ["#7ba883", "#8aba8a", "#87b292", "#8aba8a", "#71a171", "#346434", "#4d6d72", "#a0caad", "#8aba8a", "#7dac7f"]
//random_creeper's final color but all values of the sixth one increased by 16 decimal and then everything's R and B -= 48 decimal
elements.spawn_random_creeper = {
color: colorOfRandomCreeper,
behavior: behaviors.WALL,
category: "special",
excludeRandom: false, //see below
movable: true,
tick: function(pixel) {
changePixel(pixel,spawnCreepers[Math.floor(Math.random() * spawnCreepers.length)]) //spawnCreepers is already excludeRandom filtered
},
};
//Standalone generator function
function generateCreeper(creeperElements,isAfterScriptLoading=false) {//it can be a single element, though
//To specify an array creeper, have the array be inside another array.
/*For reasons related to how element colors are loaded, if this function is being run from a JS mod file, isAfterScriptLoading should be false.
Otherwise, you'll get TypeErrors for some reason when trying to place your creeper. If this is being run after the game has loaded (e.g. in the console),
then isAfterScriptLoading should be true or you might also get TypeErrors (this latter case was a bit inconsistent when I tested it, but
the former case wasn't. **isAfterScriptLoading must be false when this function is run from a JS mod file**.
If isAfterScriptLoading is true, buttons (depending on the hiding setting) will be added to the auto creeper category, the 3 new elements per creeper will be assigned IDs, and the footer will be updated with the increased element counts.*/
if(typeof(creeperElements) === "string") { //it should be an array, so string check
//console.log("String detected");
if(creeperElements.includes(",")) { //comma-separated string?
//console.log("Splitting string to array");
creeperElements = creeperElements.split(","); //,SS to array
} else {
//console.log("Wrapping string in array");
creeperElements = [creeperElements]; //single string to array
};
};
for(aaf = 0; aaf < creeperElements.length; aaf++) {
var elementOfCreeper = creeperElements[aaf];
var startColor;
var randomExcl = 0;
//console.log("randomExcl set")
//console.log(elementOfCreeper);
var headName,bodyName,placerName,descElement;
if(typeof(elementOfCreeper === "string")) { //comma separated string check
if(elementOfCreeper.includes(",")) { //if it is
elementOfCreeper = elementOfCreeper.split(","); //to array
elementOfCreeper = elementOfCreeper.filter(function(e) { //strip nonexistent elements
return typeof(elements[e]) === "object";
});
};
};
if(Array.isArray(elementOfCreeper)) {
headName = `${elementOfCreeper.join("_")}_creeper_head`; //auto head element name
bodyName = `${elementOfCreeper.join("_")}_creeper_body`; //auto body element name
placerName = `${elementOfCreeper.join("_")}_creeper`; //auto placer element name
descElement = elementOfCreeper.join(", "); //auto explosion element list
//array case color concatenator and excludeRandom handler
startColor = [];
//console.log(elementOfCreeper);
for(ll = 0; ll < elementOfCreeper.length; ll++) {
if(typeof(elements[elementOfCreeper[ll]].excludeRandom !== "undefined")) { //if excludeRandom exists (prevent TypeError)
if(elements[elementOfCreeper[ll]].excludeRandom) { //it it's true
randomExcl = 1; //the whole array creeper is excluded
//console.log("array nyet" + elementOfCreeper);
};
};
//console.log(elementOfCreeper[ll]);
startColor = startColor.concat(elements[elementOfCreeper[ll]].color);
};
} else { //they should all be strings, so here
headName = `${elementOfCreeper}_creeper_head`; //auto head element name
bodyName = `${elementOfCreeper}_creeper_body`; //auto body element name
placerName = `${elementOfCreeper}_creeper`; //auto placer element name
descElement = elementOfCreeper; //auto explosion element
startColor = elements[elementOfCreeper].color;
if(typeof(elements[elementOfCreeper].excludeRandom !== "undefined")) { //if excludeRandom exists (prevent TypeError)
if(elements[elementOfCreeper].excludeRandom) { //it it's true
//console.log("nyet " + elementOfCreeper);
randomExcl = 1; //the creeper is excluded
} else {
//console.log("allow " + elementOfCreeper);
randomExcl = 0;
};
};
};
//Color gen
if(Array.isArray(startColor)) { //Average arrays, make colors rgb()
startColor = averageRgbPrefixedColorArray(startColor);
} else {
startColor = rgbHexCatcher(startColor);
};
var preColor = rgbStringToHSL(startColor);
var colorsArray = [preColor, preColor, preColor, preColor, preColor, preColor, preColor, preColor, preColor, preColor]
var colorObjectArray = [];
for(q = 0; q < hslOffsets.length; q++) {
colorsArray[q] = addArraysInPairs(colorsArray[q],hslOffsets[q]);
colorsArray[q] = hslToHex(...colorsArray[q]);
colorObjectArray[q] = hexToRGB(colorsArray[q]); //outputs hex
if(isAfterScriptLoading) { // if it's after the hex -> RGB conversion
var coq = colorObjectArray[q]; //pull the object
//console.log(coq.r);
colorsArray[q] = `rgb(${coq.r},${coq.g},${coq.b})`; //and change to the RGB from its values
};
};
//End color gen
//console.log(`${headName}; ${bodyName}; ${placerName}; ${descElement}`)
//Placer
elements[placerName] = {
movable: true,
creeperType: elementOfCreeper,
color: colorsArray,
colorObject: colorObjectArray,
category: "auto creepers",
properties: {
dead: false,
dir: 1,
panic: 0,
following: false,
},
tick: function(pixel) {
autoCreeperPlacerTick(pixel);
},
related: [bodyName,headName,"creeper"],
desc: `Auto-generated creeper.<br/>Explodes into ${descElement}.`,
};
eLists.CREEPER.push(placerName);
//Body
elements[bodyName] = {
movable: true,
creeperType: elementOfCreeper,
color: colorsArray,
colorObject: colorObjectArray,
category: "auto creepers",
hidden: true,
excludeRandom: true,
density: 1500,
state: "solid",
conduct: 25,
tempHigh: 250,
stateHigh: "cooked_meat",
tempLow: -30,
stateLow: "frozen_meat",
burn: 10,
burnTime: 250,
burnInto: ["cooked_meat","cooked_meat","cooked_meat","cooked_meat","gunpowder"],
breakInto: ["blood","gunpowder"],
reactions: {
"cancer": { "elem1":"cancer", "chance":0.005 },
"radiation": { "elem1":["ash","meat","rotten_meat","cooked_meat"], "chance":0.4 },
"plague": { "elem1":"plague", "chance":0.05 },
},
properties: {
dead: false,
dir: 1,
panic: 0,
charged: false,
didChargeBlueTinted: false,
},
tick: function(pixel) {
autoCreeperBodyTick(pixel);
},
};
//Head
elements[headName] = {
movable: true,
creeperType: elementOfCreeper,
color: colorsArray,
colorObject: colorObjectArray,
category: "auto creepers",
hidden: true,
excludeRandom: true,
density: 1080,
state: "solid",
conduct: 25,
tempHigh: 250,
stateHigh: "cooked_meat",
tempLow: -30,
stateLow: "frozen_meat",
burn: 10,
burnTime: 250,
burnInto: ["cooked_meat","cooked_meat","cooked_meat","cooked_meat","cooked_meat","cooked_meat","cooked_meat","cooked_meat","cooked_meat","gunpowder"],
breakInto: "blood",
reactions: {
"cancer": { "elem1":"cancer", "chance":0.005 },
"radiation": { "elem1":["ash","meat","rotten_meat","cooked_meat"], "chance":0.4 },
"plague": { "elem1":"plague", "chance":0.05 },
"oxygen": { "elem2":"carbon_dioxide", "chance":0.5 },
},
properties: {
dead: false,
following: false,
hissing: false,
charged: false,
didChargeBlueTinted: false,
},
tick: function(pixel) {
autoCreeperHeadTick(pixel);
},
};
if(isAfterScriptLoading) {
elementCount += 3; //placer, body, head
createElementButton(placerName)
if(settings["unhide"] === 0) { //hide some elements: body and head would be hidden, so only update hidden count
hiddenCount += 2;
} else if(settings["unhide"] === 1) { //unhide all elements: b/h would not be hidden, so only create their buttons
createElementButton(bodyName);
createElementButton(headName);
} else if(settings["unhide"] === 2) {
settings.unlocked[bodyName] ? createElementButton(bodyName) : hiddenCount++; //ternary: if headName is unlocked, create button, else increase hiddenCount
settings.unlocked[headName] ? createElementButton(headName) : hiddenCount++; //above with headName
};
elements[placerName].id = nextid++; //set placer's id to nextid and then increment nextid
elements[bodyName].id = nextid++; //repeat with body and head
elements[headName].id = nextid++;
headBodyObject[headName] = bodyName;
document.getElementById("extraInfo").innerHTML = "<small><p>There are " + elementCount + " elements, including " + hiddenCount + " hidden ones.</p><p>©2021-" + new Date().getFullYear() + ". All Rights Reserved. <a href='https://r74n.com'>R74n</a></p></small>"; //update extra info counts (and the copyright year, due to the method used)
};
if(creeperIncludeRandom) {
randomExcl ? elements[placerName].excludeRandom = true : elements[placerName].excludeRandom = false;
} else {
elements[placerName].excludeRandom = true;
};
if(!randomExcl) {
//console.log("spawn enabling " + placerName);
spawnCreepers.push(placerName);
} else {
//console.log("nyetted " + placerName);
};
};
};
runAfterAutogen(function() {
if(generateCreepers) {
var tempArray = Object.keys(elements);
tempArray.push(["rock", "sand"]);
generateCreeper(tempArray,false)
};
});
var solidBlacklist = ["mistake", "birthpool", "firesea"]; //exclude these since they seem to be liquid
solids = Object.keys(elements).filter(function(e) {
return elements[e].category === "solids" && !solidBlacklist.includes(e);
});
for(i = 0; i < solids.length; i++) { //A lot of elements in solids, particularly metals, are missing a "state: solid".
var solidName = solids[i]
elements[solidName].state = "solid";
};
} else {
if(!enabledMods.includes(runAfterAutogenMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,runAfterAutogenMod) };
if(!enabledMods.includes(explodeAtPlusMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,explodeAtPlusMod) };

View File

@ -1,507 +0,0 @@
var modName = "mods/more_bombs.js";
var explodeAtPlusMod = "mods/explodeAtPlus.js";
var runAfterAutogenMod = "mods/runAfterAutogen and onload restructure.js";
var libraryMod = "mods/code_library.js";
if(enabledMods.includes(runAfterAutogenMod) && enabledMods.includes(libraryMod)) {
eLists.BOMB = ["bomb", "tnt", "c4", "grenade", "dynamite", "gunpowder", "firework", "nuke", "h_bomb", "dirty_bomb", "emp_bomb", "sticky_bomb", "cold_bomb", "hot_bomb", "electro_bomb", "water_bomb", "antimatter_bomb", "flashbang", "smoke_grenade", "fireball", "landmine", "cluster_bomb", "cluster_nuke", "op_hottester_bomb", "anti-bomb", "electric_bomblet", "electric_cluster_bomb", "radioactive_popper", "acid_bomb", "amalgamated_bomb"];
var excludedBombElements = ["water", "antimatter", "acid"];
//Generate bombs
if(urlParams.get('generateBombs') !== null) { //if the variable exists at all
generateBombs = true
} else { //if it doesn't (and it returns null)
generateBombs = false
}
function firebombFire(pixel,x,y,radius,fire,smoke,power,damage) {
var coords = circleCoords(pixel.x,pixel.y,radius);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if(!isEmpty(x,y,true)) {
var pixel = pixelMap[x][y];
var info = elements[pixel.element];
var cursedFireChance = 0.15 + power;
if (info.burn) { //Light everything on fire
pixel.burning = true;
pixel.burnStart = pixelTicks;
pixel.temp += 10; //smoke prevention
} else if(Math.random() < cursedFireChance) { //(15+power)%/px cursed burning
pixel.burning = true;
pixel.burnStart = pixelTicks;
pixel.temp += 10;
};
} else if(isEmpty(x,y)) { //if there's space for fire
if (Array.isArray(fire)) { //this should remain "fire"
var newfire = fire[Math.floor(Math.random() * fire.length)];
} else {
var newfire = fire;
};
createPixel(newfire,x,y); //add fire
var firePixel = pixelMap[x][y];
firePixel.temp = Math.max(elements[newfire].temp,firePixel.temp);
firePixel.burning = true;
};
};
};
if(urlParams.get('bombAmount') != null) { //null check
bombAmount = urlParams.get('bombAmount')
if(isNaN(bombAmount) || bombAmount === "" || bombAmount === null) { //NaN check
bombAmount = 10
}
bombAmount = parseInt(bombAmount)
if(bombAmount > 50) {
alert("Maximum amount of additional bomb/anti-bomb pairs is 50.\nOnly 50 were added.")
} else if(bombAmount < 1) {
alert("Minimum amount of additional bomb/anti-bomb pairs is 1.\n1 pair was added.")
}
bombAmount = Math.min(50,Math.max(bombAmount,1))
} else {
bombAmount = 10
}
function hotterBomb(pixel,x,y,radius,fire,smoke,power,damage) {
//console.log(`Radius: ${radius}\nPower: ${power}\nPixel: (${pixel.x},${pixel.y})\nDamage: ${damage}`);
//console.log(`Expected temperature increase for pixel at (${pixel.x},${pixel.y}): ${800 * ((1 + (7 * damage)) ** 2) * ((power ** 2) * 1.5)}`);
pixel.temp += (800 * ((1 + (7 * damage)) ** 2) * ((power ** 2) * 1.5));
};
elements.firebomb = {
color: "#ee7e3e",
tick: function(pixel) {
if(!isEmpty(pixel.x,pixel.y-1,true)) { //[0][1] EX (ignore bounds)
var newPixel = pixelMap[pixel.x][pixel.y-1];
var newElement = newPixel.element;
var newInfo = elements[newElement];
if(newInfo.state !== "gas" && newElement !== pixel.element) {
explodeAtPlus(pixel.x,pixel.y,10,"fire,fire,fire,fire,fire,greek_fire","fire",null,firebombFire);
};
};
if(!isEmpty(pixel.x,pixel.y+1,true)) { //[2][1] EX (don't ignore bounds, non-bound case)
var newPixel = pixelMap[pixel.x][pixel.y+1];
var newElement = newPixel.element;
var newInfo = elements[newElement];
if(newInfo.state !== "gas" && newElement !== pixel.element) {
explodeAtPlus(pixel.x,pixel.y,10,"fire,fire,fire,fire,fire,greek_fire","fire",null,firebombFire);
};
};
if(outOfBounds(pixel.x,pixel.y+1)) { //[2][1] EX (don't ignore bounds, bound case)
explodeAtPlus(pixel.x,pixel.y,10,"fire,fire,fire,fire,fire,greek_fire","fire",null,firebombFire);
};
if(!tryMove(pixel,pixel.x,pixel.y+1)) { //behaviors.POWDER
Math.random() < 0.5 ? tryMove(pixel,pixel.x-1,pixel.y+1) : tryMove(pixel,pixel.x+1,pixel.y+1);
};
},
category: "weapons",
state: "solid",
density: 1500,
excludeRandom: true,
desc: "An advanced incendiary weapon. <br/>To enable automatic bomb generation, set the generateBombs query parameter.",
};
elements.cluster_nuke = {
color: "#e3f636",
behavior: [
"CR:radiation%5|EX:90>plasma,plasma,plasma,nuke,nuke,nuke,radiation,radiation,radiation,rad_steam,rad_steam,radiation,rad_steam AND CR:radiation%5|CR:radiation%5",
"CR:radiation%5|XX|CR:radiation%5",
"M2 AND CR:radiation%5|M1 AND EX:90>plasma,plasma,plasma,nuke,nuke,nuke,radiation,radiation,radiation,rad_steam,rad_steam,radiation,rad_steam AND CR:radiation%5|M2 AND CR:radiation%5",
],
category: "weapons",
state: "solid",
density: 1500,
excludeRandom: true,
desc: "It's a nuke that drops more nukes. <br/>To enable automatic bomb generation, set the generateBombs query parameter.",
};
elements.anti_bomb = {
color: "#525c61",
behavior: [
"M2|M1 AND EX:10|M2",
"XX|XX|XX",
"XX|EX:10|XX",
],
category: "weapons",
state: "solid",
density: 1300,
excludeRandom: true,
};
elements.electric_bomblet = {
color: "#ffffff",
behavior: [
"SH%50|EX:8>electric AND SH%50|SH%50",
"SH%50|EX:9>electric%0.5|SH%50",
"M2 AND SH%50|M1 AND SH%50 AND EX:8>electric AND SW:electric|M2 AND SH%50",
],
category: "weapons",
state: "solid",
density: 1200,
hidden: true,
excludeRandom: true,
hardness: 0.3,
};
elements.electric_cluster_bomb = {
color: "#ffffff",
behavior: [
"SH%50|EX:8>electric_bomblet AND SH%50|SH%50",
"SH%50|XX|SH%50",
"M2 AND SH%50|M1 AND SH%50 AND EX:8>electric_bomblet AND SW:electric|M2 AND SH%50",
],
category: "weapons",
state: "solid",
density: 1800,
hidden: true,
excludeRandom: true,
hardness: 0.3,
};
elements.radioactive_popper = {
color: "#d6ce72",
behavior: [
"XX|EX:7>radiation|XX",
"XX|XX|XX",
"M2|M1 AND EX:7>radiation|M2",
],
category: "weapons",
state: "solid",
density: 1200,
hidden: true,
excludeRandom: true,
hardness: 0.3,
cooldown: 3,
};
elements.acid_bomb = {
color: "#7d8a63",
behavior: [
"XX|EX:15>acid_gas|XX",
"XX|XX|XX",
"M2|M1 AND EX:15>acid_gas|M2",
],
category: "weapons",
state: "solid",
density: 1400,
excludeRandom: true,
cooldown: defaultCooldown,
};
amalgamatedBombFire = "plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,smoke,plasma,plasma,fire,smoke,fire,smoke,plasma,metal_scrap,metal_scrap,metal_scrap,metal_scrap,metal_scrap,acid,acid,oil,oil,oil,oil,oil,oil,oil,plasma,plasma,plasma,plasma,plasma,smoke,plasma,plasma,fire,smoke,plasma,metal_scrap,metal_scrap,metal_scrap,metal_scrap,metal_scrap,metal_scrap,flash,flash,flash,flash,flash,acid_gas,acid_gas,acid_gas,acid,oil,oil,oil,oil,oil,oil,oil,oil,oil,oil,plasma,plasma,plasma,plasma,metal_scrap,metal_scrap,metal_scrap,metal_scrap,metal_scrap,acid,acid,oil,oil,oil,oil,oil,oil,oil,plasma,plasma,plasma,plasma,plasma,smoke,plasma,plasma,fire,smoke,plasma,metal_scrap,metal_scrap,metal_scrap,metal_scrap,metal_scrap,metal_scrap,electric_cluster_bomb,electric_cluster_bomb,flash,flash,flash,flash,flash,acid_gas,acid_gas,acid_gas,acid,oil,oil,oil,oil,oil,oil,oil,oil,oil,oil,plasma,plasma,plasma,plasma,plague,plague,plague,plague,plague,plague,radiation,radiation,radiation,radiation,radiation,radiation,radiation,radiation,uranium,uranium,uranium,uranium,uranium,uranium,greek_fire,greek_fire,greek_fire,greek_fire,greek_fire,antimatter,antimatter,antimatter,antimatter,antimatter,smoke_grenade,antimatter,smoke_grenade,fireball,flash,acid_gas,acid_gas,acid_gas,plague,plague,plague,plague,plague,plague,radiation,radiation,radiation,radiation,radiation,radiation,radiation,radiation,uranium,uranium,uranium,uranium,uranium,uranium,greek_fire,greek_fire,greek_fire,greek_fire,greek_fire,antimatter,antimatter,antimatter,antimatter,antimatter,smoke_grenade,antimatter,flash,acid_gas,acid_gas,acid_gas,radiation,radiation,radiation,radiation,plague,acid_gas,acid_gas,acid_gas,chlorine,chlorine,chlorine"
elements.amalgamated_bomb = {
color: ["#FF0000","#FF0000","#FFFF00","#FFFF00","#00FF00","#00FF00","#0000FF","#0000FF"],
tick: function(pixel) {
doDefaults(pixel);
if(!isEmpty(pixel.x,pixel.y-1,true)) { //[0][1] EX (ignore bounds)
var newPixel = pixelMap[pixel.x][pixel.y-1];
var newElement = newPixel.element;
var newInfo = elements[newElement];
if(newInfo.state !== "gas" && newElement !== pixel.element) {
explodeAtPlus(pixel.x,pixel.y,70,amalgamatedBombFire,amalgamatedBombFire);
};
};
if(!isEmpty(pixel.x,pixel.y+1,true)) { //[2][1] EX (don't ignore bounds, non-bound case)
var newPixel = pixelMap[pixel.x][pixel.y+1];
var newElement = newPixel.element;
var newInfo = elements[newElement];
if(newInfo.state !== "gas" && newElement !== pixel.element) {
explodeAtPlus(pixel.x,pixel.y,70,amalgamatedBombFire,amalgamatedBombFire);
};
};
if(outOfBounds(pixel.x,pixel.y+1)) { //[2][1] EX (don't ignore bounds, bound case)
explodeAtPlus(pixel.x,pixel.y,70,amalgamatedBombFire,amalgamatedBombFire);
};
if(!tryMove(pixel,pixel.x,pixel.y+1)) { //behaviors.POWDER
Math.random() < 0.5 ? tryMove(pixel,pixel.x-1,pixel.y+1) : tryMove(pixel,pixel.x+1,pixel.y+1);
};
},
category: "weapons",
state: "solid",
temp: 7065,
density: 158000,
excludeRandom: true,
};
elements.op_hottester_bomb = {
color: "#cc436e",
properties: {
radius: 15, //just so people can edit it per pixel to be stupidly high
},
tick: function(pixel) {
doDefaults(pixel);
if(!isEmpty(pixel.x,pixel.y-1,true)) { //[0][1] EX (ignore bounds)
var newPixel = pixelMap[pixel.x][pixel.y-1];
var newElement = newPixel.element;
var newInfo = elements[newElement];
if(newInfo.state !== "gas" && newElement !== pixel.element) {
explodeAtPlus(pixel.x,pixel.y,pixel.radius,"plasma","plasma",hotterBomb,hotterBomb,false);
};
};
if(!isEmpty(pixel.x,pixel.y+1,true)) { //[2][1] EX (don't ignore bounds, non-bound case)
var newPixel = pixelMap[pixel.x][pixel.y+1];
var newElement = newPixel.element;
var newInfo = elements[newElement];
if(newInfo.state !== "gas" && newElement !== pixel.element) {
explodeAtPlus(pixel.x,pixel.y,pixel.radius,"plasma","plasma",hotterBomb,hotterBomb,false);
};
};
if(outOfBounds(pixel.x,pixel.y+1)) { //[2][1] EX (don't ignore bounds, bound case)
explodeAtPlus(pixel.x,pixel.y,pixel.radius,"plasma","plasma",hotterBomb,hotterBomb,false);
};
if(!tryMove(pixel,pixel.x,pixel.y+1)) { //behaviors.POWDER
Math.random() < 0.5 ? tryMove(pixel,pixel.x-1,pixel.y+1) : tryMove(pixel,pixel.x+1,pixel.y+1);
};
},
category: "weapons",
state: "solid",
temp: 7065,
density: 1900,
excludeRandom: true,
};
for (var i = 2; i <= bombAmount + 1; i++) {
elements[`bomb_${i}`] = {
name: `bomb ${i}`,
color: "#624c41",
behavior: [
`XX|EX:${5*(i+1)}>fire|XX`,
"XX|XX|XX",
`M2|M1 AND EX:${5*(i+1)}>fire|M2`,
],
state: "solid",
density: 1300 * 8**((i-1)/2),
excludeRandom:true,
category: "weapons",
desc: `${5*(i+1)/10} times the radius of the regular bomb`,
cooldown: defaultCooldown,
};
eLists.BOMB.push(`bomb_${i}`);
};
elements.anti_bomb = {
color: "#625c71",
behavior: [
"M2|M1 AND EX:10|M2",
"XX|XX|XX",
"XX|EX:10|XX",
],
category: "weapons",
state: "solid",
density: 1300,
excludeRandom: true,
cooldown: defaultCooldown,
};
for (var i = 2; i <= bombAmount + 1; i++) {
elements[`anti_bomb_${i}`] = {
color: "#625c71",
behavior: [
`M2|M1 AND EX:${5*(i+1)}>fire|M2`,
"XX|XX|XX",
`XX|EX:${5*(i+1)}>fire|XX`,
],
state: "solid",
density: 1300 * 8**((i-1)/2),
excludeRandom:true,
category: "weapons",
desc: `${5*(i+1)/10} times the radius of the regular anti-bomb`,
cooldown: defaultCooldown,
};
eLists.BOMB.push(`anti_bomb_${i}`);
};
//genfunc
function generateBomb(bombElements,isAfterScriptLoading=false,bombNumber=1) {//it can be a single element, though
bombNumber = Math.max(0,bombNumber);
//To specify an array bomb, have the array be inside another array.
/*For reasons related to how element colors are loaded, if this function is being run from a JS mod file, isAfterScriptLoading should be false.
Otherwise, you'll get TypeErrors for some reason when trying to place your bomb. If this is being run after the game has loaded (e.g. in the console),
then isAfterScriptLoading should be true or you might also get TypeErrors (this latter case was a bit inconsistent when I tested it, but
the former case wasn't. **isAfterScriptLoading must be false when this function is run from a JS mod file**.*/
if(typeof(bombElements) === "string") { //it should be an array, so string check
//console.log("String detected");
if(bombElements.includes(",")) { //comma-separated string?
//console.log("Splitting string to array");
bombElements = bombElements.split(","); //,SS to array
} else {
//console.log("Wrapping string in array");
bombElements = [bombElements]; //single string to array
};
};
for(aaf = 0; aaf < bombElements.length; aaf++) {
var elementOfBomb = bombElements[aaf];
var startColor;
//console.log(elementOfBomb);
var bombName;
if(typeof(elementOfBomb === "string")) { //comma separated string check
if(elementOfBomb.includes(",")) { //if it is
elementOfBomb = elementOfBomb.split(","); //to array
elementOfBomb = elementOfBomb.filter(function(e) { //strip nonexistent elements
return typeof(elements[e]) === "object";
});
};
};
if(Array.isArray(elementOfBomb)) {
bombName = `${elementOfBomb.join("_")}_bomb`; //auto placer element name
//array case color concatenator (bombs are always excludeRandom)
startColor = [];
//console.log(elementOfBomb);
for(ll = 0; ll < elementOfBomb.length; ll++) {
startColor = startColor.concat(elements[elementOfBomb[ll]].color);
};
} else { //they should all be strings, so here
bombName = `${elementOfBomb}_bomb`; //auto placer element name
startColor = elements[elementOfBomb].color;
};
//Color gen
if(Array.isArray(startColor)) { //Average arrays, make colors rgb()
startColor = averageRgbPrefixedColorArray(startColor);
} else {
startColor = rgbHexCatcher(startColor);
};
startColor = addColors(changeLuminance(changeSaturation(startColor,0.6,"multiply","hsl_json"),0.5,"multiply","rgb"),"rgb(24,0,0)","rgb");
var newColorObject = rgbStringToObject(startColor);
//End color gen
//The bomb
//console.log(elementOfBomb);
var firstInfo, firstTemp;
if(Array.isArray(elementOfBomb)) {
firstInfo = elements[elementOfBomb[0]];
firstTemp = airTemp;
if(typeof(firstInfo.temp) !== "undefined") {
firstTemp = firstInfo.temp;
};
} else {
firstInfo = elements[elementOfBomb];
firstTemp = airTemp;
if(typeof(firstInfo.temp) !== "undefined") {
firstTemp = firstInfo.temp;
};
};
elementOfBomb = tryJoin(elementOfBomb,",");
descElement = tryJoin(elementOfBomb,", ");
//console.log(elementOfBomb);
if(bombNumber !== 1) {
bombName += `_${bombNumber}`;
};
if(!elementExists(bombName)) {
elements[bombName] = {
color: startColor,
insulate: true,
flippableX: true,
colorObject: newColorObject,
behavior: [
["XX",`EX:${5*(bombNumber+1)}>${elementOfBomb}`,"XX"],
["XX","XX","XX"],
["M2",`M1 AND EX:${5*(bombNumber+1)}>${elementOfBomb}`,"M2"]
],
category: "auto_bombs",
desc: `Explodes into ${descElement}<br/>Radius: ${5*(bombNumber+1)}`,
temp: firstTemp,
excludeRandom: true,
};
if(typeof(eLists) === "undefined") {
eLists = {};
};
if(typeof(eLists.BOMB) === "undefined") {
eLists.BOMB = [];
};
eLists.BOMB.push(bombName);
if(typeof(bombChoices) === "undefined") {
bombChoices = []
};
if(!bombChoices.includes(bombName)) {
bombChoices.push(bombName);
};
if(isAfterScriptLoading) {
elements[bombName].flippableX = true;
elementCount++; //increment for new bomb element
createElementButton(bombName);
elements[bombName].id = nextid++;
document.getElementById("extraInfo").innerHTML = "<small><p>There are " + elementCount + " elements, including " + hiddenCount + " hidden ones.</p><p>©2021-" + new Date().getFullYear() + ". All Rights Reserved. <a href='https://r74n.com'>R74n</a></p></small>"; //update extra info counts (and the copyright year, due to the method used)
};
};
};
};
runAfterAutogen(function() {
if(elementExists("vaporized_rock")) {
elements.molten_dirt.tempHigh = 3000;
elements.molten_dirt.stateHigh = "vaporized_rock";
};
if(generateBombs) {
var tempArray = Object.keys(elements);
tempArray.push(["rock", "sand"]);
generateBomb(tempArray,false)
};
});
runAfterLoad(function() {
if(enabledMods.includes("mods/fey_and_more.js")) {
amalgamatedBombFire += ",poisonwater".repeat(8);
amalgamatedBombFire += ",mystic_fire".repeat(4);
amalgamatedBombFire += ",firesea".repeat(6);
amalgamatedBombFire += ",lektre".repeat(6);
};
if(enabledMods.includes("mods/Neutronium Mod.js")) {
amalgamatedBombFire += ",flamer".repeat(3);
amalgamatedBombFire += ",flamebomb".repeat(3);
amalgamatedBombFire += ",toxin".repeat(3);
};
if(enabledMods.includes("mods/randomness.js")) {
amalgamatedBombFire += ",burning_unnamed_gas".repeat(4);
amalgamatedBombFire += ",warp".repeat(6);
amalgamatedBombFire += ",bomb_3".repeat(3);
amalgamatedBombFire += ",op_hottester_bomb".repeat(3);
eLists.BOMB.push("unnamed_bomb");
eLists.BOMB.push("warp_bomb");
};
if(enabledMods.includes("mods/glenn_gases.js")) {
amalgamatedBombFire += ",electric_gas".repeat(3);
amalgamatedBombFire += ",corrosive_gas".repeat(3);
amalgamatedBombFire += ",iocalfaeus_gas".repeat(3);
amalgamatedBombFire += ",ignited_gas".repeat(3);
amalgamatedBombFire += ",finine".repeat(3);
amalgamatedBombFire += ",acidic_vapour".repeat(3);
amalgamatedBombFire += ",nitrous_gas".repeat(3);
amalgamatedBombFire += ",void_gas".repeat(3);
amalgamatedBombFire += ",black_damp".repeat(3);
};
if(enabledMods.includes("mods/some_tf_liquids.js")) {
amalgamatedBombFire += ",blazing_pyrotheum".repeat(5);
amalgamatedBombFire += ",tectonic_petrotheum".repeat(7);
amalgamatedBombFire += ",resonant_ender".repeat(5);
};
if(enabledMods.includes("mods/chem.js")) {
amalgamatedBombFire += ",FOOF".repeat(8);
};
if(enabledMods.includes("mods/the_ground.js")) {
amalgamatedBombFire += ",liquid_irradium".repeat(7);
};
if(enabledMods.includes("mods/bioooze.js")) {
amalgamatedBombFire += ",bioooze".repeat(8);
};
});
} else {
if(!enabledMods.includes(runAfterAutogenMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,runAfterAutogenMod) };
if(!enabledMods.includes(explodeAtPlusMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,explodeAtPlusMod) };
if(!enabledMods.includes(libraryMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,libraryMod) };
localStorage.setItem("enabledMods", JSON.stringify(enabledMods));
alert(`The "${runAfterAutogenMod}", "${explodeAtPlusMod}", and "${libraryMod}" mods are all required; any missing mods in this list have been automatically inserted (reload for this to take effect).`)
};

View File

@ -1,249 +0,0 @@
var modName = "mods/clouds.js";
var runAfterAutogenMod = "mods/runAfterAutogen and onload restructure.js";
var libraryMod = "mods/code_library.js";
if(enabledMods.includes(runAfterAutogenMod) && enabledMods.includes(libraryMod)) {
//Generate clouds
if(urlParams.get('generateClouds') !== null) { //if the variable exists at all
generateClouds = true
} else { //if it doesn't (and it returns null)
generateClouds = false
}
if(urlParams.get('cloudIncludeRandom') !== null) { //if the variable exists at all
cloudIncludeRandom = true
} else { //if it doesn't (and it returns null)
cloudIncludeRandom = false
}
eLists.CLOUD = ["cloud", "rain_cloud", "snow_cloud", "fire_cloud", "hail_cloud", "acid_cloud", "pyrocumulus"];
var excludedCloudElements = ["snow", "fire", "hail", "acid"];
var includedClouds = ["cloud", "rain_cloud", "snow_cloud", "fire_cloud", "hail_cloud", "acid_cloud", "pyrocumulus"];
var backupCategoryWhitelist = ["land","powders","weapons","food","life","corruption","states","fey","Fantastic Creatures","dyes","energy liquids","random liquids","random gases","random rocks"];
var backupElementWhitelist = ["mercury", "chalcopyrite_ore", "chalcopyrite_dust", "copper_concentrate", "fluxed_copper_concentrate", "unignited_pyrestone", "ignited_pyrestone", "everfire_dust", "extinguished_everfire_dust", "mistake", "polusium_oxide", "vaporized_polusium_oxide", "glowstone_dust", "redstone_dust", "soul_mud", "wet_soul_sand", "nitrogen_snow", "fusion_catalyst", "coal", "coal_coke", "blast_furnace_fuel", "molten_mythril"];
//forces elements that logically should be clouded, but are refused even though the condition is true, to be clouded
function defaultCloudCondition(name) {
if(typeof(elements[name]) !== "object") {
throw new Error(`Nonexistent element ${name}`);
};
var info = elements[name];
//console.log(`${name} (${JSON.stringify(elements[name])})`);
if(typeof(info.state) === "undefined") {
var state = null;
} else {
var state = info.state;
};
if(typeof(info.category) === "undefined") {
var category = "other";
} else {
var category = info.category;
};
if(excludedCloudElements.includes(name)) {
return false
};
var include = false;
if(["liquid","gas"].includes(state)) {
include = true;
};
if(info.movable) {
include = true;
};
if(backupCategoryWhitelist.includes(category)) {
include = true;
};
if(backupElementWhitelist.includes(name)) {
include = true;
};
if(category.includes("mudstone")) {
include = true;
};
//console.log(include);
return include;
};
//Generator function
//Standalone generator
function generateCloud(cloudElements,isAfterScriptLoading=false) {//it can be a single element, though
//To specify an array cloud, have the array be inside another array.
/*For reasons related to how element colors are loaded, if this function is being run from a JS mod file, isAfterScriptLoading should be false.
Otherwise, you'll get TypeErrors for some reason when trying to place your cloud. If this is being run after the game has loaded (e.g. in the console),
then isAfterScriptLoading should be true or you might also get TypeErrors (this latter case was a bit inconsistent when I tested it, but
the former case wasn't. **isAfterScriptLoading must be false when this function is run from a JS mod file**.*/
if(typeof(cloudElements) === "string") { //it should be an array, so string check
//console.log("String detected");
if(cloudElements.includes(",")) { //comma-separated string?
//console.log("Splitting string to array");
cloudElements = cloudElements.split(","); //,SS to array
} else {
//console.log("Wrapping string in array");
cloudElements = [cloudElements]; //single string to array
};
};
for(aaf = 0; aaf < cloudElements.length; aaf++) {
var elementOfCloud = cloudElements[aaf];
var startColor;
var randomExcl = 0;
//console.log("randomExcl set")
//console.log(elementOfCloud);
var cloudName;
if(typeof(elementOfCloud === "string")) { //comma separated string check
if(elementOfCloud.includes(",")) { //if it is
elementOfCloud = elementOfCloud.split(","); //to array
elementOfCloud = elementOfCloud.filter(function(e) { //strip nonexistent elements
return typeof(elements[e]) === "object";
});
};
};
if(Array.isArray(elementOfCloud)) {
cloudName = `${elementOfCloud.join("_")}_cloud`; //auto placer element name
//array case color concatenator and excludeRandom handler
startColor = [];
//console.log(elementOfCloud);
for(ll = 0; ll < elementOfCloud.length; ll++) {
if(typeof(elements[elementOfCloud[ll]].excludeRandom !== "undefined")) { //if excludeRandom exists (prevent TypeError)
if(elements[elementOfCloud[ll]].excludeRandom) { //it it's true
randomExcl = 1; //the whole array cloud is excluded
//console.log("array nyet" + elementOfCloud);
};
};
//console.log(elementOfCloud[ll]);
startColor = startColor.concat(elements[elementOfCloud[ll]].color);
};
} else { //they should all be strings, so here
cloudName = `${elementOfCloud}_cloud`; //auto placer element name
startColor = elements[elementOfCloud].color;
if(typeof(elements[elementOfCloud].excludeRandom !== "undefined")) { //if excludeRandom exists (prevent TypeError)
if(elements[elementOfCloud].excludeRandom) { //it it's true
//console.log("nyet " + elementOfCloud);
randomExcl = 1; //the cloud is excluded
} else {
//console.log("allow " + elementOfCloud);
randomExcl = 0;
};
};
};
//Color gen
if(Array.isArray(startColor)) { //Average arrays, make colors rgb()
startColor = averageRgbPrefixedColorArray(startColor);
} else {
startColor = rgbHexCatcher(startColor);
};
startColor = changeLuminance(changeSaturation(startColor,0.5,"multiply","hsl_json"),0.5,"multiply","rgb");
var newColorObject = rgbStringToObject(startColor);
//End color gen
//The cloud
//console.log(elementOfCloud);
var firstInfo, firstTemp;
if(Array.isArray(elementOfCloud)) {
firstInfo = elements[elementOfCloud[0]];
firstTemp = airTemp;
if(typeof(firstInfo.temp) !== "undefined") {
firstTemp = firstInfo.temp;
};
} else {
firstInfo = elements[elementOfCloud];
firstTemp = airTemp;
if(typeof(firstInfo.temp) !== "undefined") {
firstTemp = firstInfo.temp;
};
};
elementOfCloud = tryJoin(elementOfCloud,",");
//console.log(elementOfCloud);
if(!elementExists(cloudName)) {
elements[cloudName] = {
color: startColor,
insulate: true,
colorObject: newColorObject,
behavior: [
["XX","XX","XX"],
["XX",`CH:${elementOfCloud}%0.05`,"M1%2.5 AND BO"],
["XX","XX","XX"]
],
category: "clouds",
temp: firstTemp,
state: "gas",
density: 0.6,
ignoreAir: true,
conduct: 0.01,
};
} else {
elements[`auto_${cloudName}`] = {
color: startColor,
insulate: true,
colorObject: newColorObject,
behavior: [
["XX","XX","XX"],
["XX",`CH:${elementOfCloud}%0.05`,"M1%2.5 AND BO"],
["XX","XX","XX"]
],
category: "clouds",
temp: firstTemp,
state: "gas",
density: 0.6,
ignoreAir: true,
conduct: 0.01,
};
};
eLists.CLOUD.push(cloudName);
if(!randomExcl) {
if(typeof(cloudChoices) === "undefined") {
cloudChoices = []
};
if(!cloudChoices.includes(cloudName)) {
cloudChoices.push(cloudName);
};
}
if(cloudIncludeRandom) {
randomExcl ? elements[cloudName].excludeRandom = true : elements[cloudName].excludeRandom = false;
} else {
elements[cloudName].excludeRandom = true;
};
if(isAfterScriptLoading) {
elementCount++; //increment for new cloud element
createElementButton(cloudName);
elements[cloudName].id = nextid++;
document.getElementById("extraInfo").innerHTML = "<small><p>There are " + elementCount + " elements, including " + hiddenCount + " hidden ones.</p><p>©2021-" + new Date().getFullYear() + ". All Rights Reserved. <a href='https://r74n.com'>R74n</a></p></small>"; //update extra info counts (and the copyright year, due to the method used)
};
};
};
runAfterAutogen(function() {
if(generateClouds) {
liquidArray = Object.keys(elements).filter(function(e) {
return (defaultCloudCondition(e));
});
liquidArray.push(["rock","sand"]);
generateCloud(liquidArray,false);
};
});
elements.random_cloud = {
color: ["#3e5f8a","#a334ec","#ea96f9","#a6ecf6","#70ebc8","#d9286b","#7eed91","#a18b30"],
behavior: behaviors.WALL,
category: "special",
excludeRandom: true,
tick: function(pixel) {
changePixel(pixel,cloudChoices[Math.floor(Math.random() * cloudChoices.length)])
},
};
} else {
if(!enabledMods.includes(runAfterAutogenMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,runAfterAutogenMod) };
if(!enabledMods.includes(libraryMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,libraryMod) };
alert(`The "${runAfterAutogenMod}" and "${libraryMod}" mods are required; any missing mods in this list have been automatically inserted (reload for this to take effect).`)
localStorage.setItem("enabledMods", JSON.stringify(enabledMods));
};

View File

@ -1,382 +0,0 @@
var modName = "mods/more_fairies.js";
var runAfterAutogenMod = "mods/runAfterAutogen and onload restructure.js";
var libraryMod = "mods/code_library.js";
var feyAndMoreMod = "mods/fey_and_more.js";
if(enabledMods.includes(runAfterAutogenMod) && enabledMods.includes(libraryMod) && enabledMods.includes(feyAndMoreMod)) {
//keep old fairies
elements.acid_fairy = {
name: "acid fairy",
color: ["#e2f777","#d1ff94","#d8f7c1"],
behavior: [
"XX|M1|M1",
"XX|FX%5|XX",
"XX|CR:acid%0.5 AND CR:fairy_dust%0.005 AND M1|M1",
],
state: "solid",
category: "fey",
desc: "Like the other fairies, but with acid. <br/>To enable automatic fairy generation, set the generateFairies query parameter.",
}
elements.oil_fairy = {
name: "oil fairy",
color: ["#636360","#a6956f","#a3816d","#cfc191"],
behavior: [
"XX|M1|M1",
"XX|FX%5|XX",
"XX|CR:oil%0.5 AND CR:fairy_dust%0.005 AND M1|M1",
],
state: "solid",
category: "fey",
desc: "Like the other fairies, but with oil. <br/>To enable automatic fairy generation, set the generateFairies query parameter.",
}
elements.honey_fairy = {
name: "honey fairy",
color: ["#ffeaa6","#ffe987","#f2e7c2"],
behavior: [
"XX|M1|M1",
"XX|FX%5|XX",
"XX|CR:honey%0.5 AND CR:fairy_dust%0.005 AND M1|M1",
],
state: "solid",
category: "fey",
desc: "Like the other fairies, but with sweet honey. <br/>To enable automatic fairy generation, set the generateFairies query parameter.",
}
var excludedFairyElements = []
var backupCategoryWhitelist = ["land","powders","weapons","food","life","corruption","states","fey","Fantastic Creatures","dyes","energy liquids","random liquids","random gases","random rocks"];
var backupElementWhitelist = ["mercury", "chalcopyrite_ore", "chalcopyrite_dust", "copper_concentrate", "fluxed_copper_concentrate", "unignited_pyrestone", "ignited_pyrestone", "everfire_dust", "extinguished_everfire_dust", "mistake", "polusium_oxide", "vaporized_polusium_oxide", "glowstone_dust", "redstone_dust", "soul_mud", "wet_soul_sand", "nitrogen_snow", "fusion_catalyst", "coal", "coal_coke", "blast_furnace_fuel", "molten_mythril"];
//forces elements that logically should be fairied, but are refused even though the condition is true, to be fairied
function defaultFairyCondition(name) {
if(typeof(elements[name]) !== "object") {
throw new Error(`Nonexistent element ${name}`);
};
var info = elements[name];
//console.log(`${name} (${JSON.stringify(elements[name])})`);
if(typeof(info.state) === "undefined") {
var state = null;
} else {
var state = info.state;
};
if(typeof(info.category) === "undefined") {
var category = "other";
} else {
var category = info.category;
};
if(excludedFairyElements.includes(name)) {
return false
};
var include = false;
if(["liquid","gas"].includes(state)) {
include = true;
};
if(info.movable) {
include = true;
};
if(backupCategoryWhitelist.includes(category)) {
include = true;
};
if(backupElementWhitelist.includes(name)) {
include = true;
};
if(category.includes("mudstone")) {
include = true;
};
//console.log(include);
return include;
};
if(urlParams.get('fairyIncludeRandom') !== null) { //if the variable exists at all
fairyIncludeRandom = true
} else { //if it doesn't (and it returns null)
fairyIncludeRandom = false
}
//Generate fairies
if(urlParams.get('generateFairies') !== null) { //if the variable exists at all
generateFairies = true
} else { //if it doesn't (and it returns null)
generateFairies = false
}
//Generator function
runAfterLoad(function() {
if(typeof(eLists.FAIRY) === "undefined") { eLists.FAIRY = [] };
eLists.FAIRY.push("acid_fairy");
eLists.FAIRY.push("oil_fairy");
eLists.FAIRY.push("honey_fairy");
fairyChoices = eLists.FAIRY;
for(i = 0; i < eLists.FAIRY.length; i++) {
var fairyName = eLists.FAIRY[i];
if(!fairyChoices.includes(fairyName)) {
fairyChoices.push(fairyName);
};
};
});
//Standalone generator
function generateFairy(fairyElements,isAfterScriptLoading=false) {//it can be a single element, though
//To specify an array fairy, have the array be inside another array.
/*For reasons related to how element colors are loaded, if this function is being run from a JS mod file, isAfterScriptLoading should be false.
Otherwise, you'll get TypeErrors for some reason when trying to place your fairy. If this is being run after the game has loaded (e.g. in the console),
then isAfterScriptLoading should be true or you might also get TypeErrors (this latter case was a bit inconsistent when I tested it, but
the former case wasn't. **isAfterScriptLoading must be false when this function is run from a JS mod file**.*/
if(typeof(fairyElements) === "string") { //it should be an array, so string check
//console.log("String detected");
if(fairyElements.includes(",")) { //comma-separated string?
//console.log("Splitting string to array");
fairyElements = fairyElements.split(","); //,SS to array
} else {
//console.log("Wrapping string in array");
fairyElements = [fairyElements]; //single string to array
};
};
for(aaf = 0; aaf < fairyElements.length; aaf++) {
var elementOfFairy = fairyElements[aaf];
var startColor;
var randomExcl = 0;
var isNocheer = 0;
//console.log("randomExcl set")
//console.log(elementOfFairy);
var fairyName;
if(typeof(elementOfFairy === "string")) { //comma separated string check
if(elementOfFairy.includes(",")) { //if it is
elementOfFairy = elementOfFairy.split(","); //to array
elementOfFairy = elementOfFairy.filter(function(e) { //strip nonexistent elements
return typeof(elements[e]) === "object";
});
};
};
if(Array.isArray(elementOfFairy)) {
fairyName = `${elementOfFairy.join("_")}_fairy`; //auto placer element name
//array case color concatenator and excludeRandom handler
startColor = [];
//console.log(elementOfFairy);
for(ll = 0; ll < elementOfFairy.length; ll++) {
if(typeof(elements[elementOfFairy[ll]].excludeRandom !== "undefined")) { //if excludeRandom exists (prevent TypeError)
if(elements[elementOfFairy[ll]].excludeRandom) { //it it's true
randomExcl = 1; //the whole array fairy is excluded
//console.log("array nyet" + elementOfFairy);
};
};
//console.log(elementOfFairy[ll]);
startColor = startColor.concat(elements[elementOfFairy[ll]].color);
};
for(ll = 0; ll < elementOfFairy.length; ll++) {
if(typeof(elements[elementOfFairy[ll]].nocheer !== "undefined")) { //if nocheer exists (prevent TypeError)
if(elements[elementOfFairy[ll]].nocheer) { //it it's true
isNocheer = 1; //the whole array fairy is excluded
//console.log("array nyet" + elementOfFairy);
};
};
//console.log(elementOfFairy[ll]);
startColor = startColor.concat(elements[elementOfFairy[ll]].color);
};
} else { //they should all be strings, so here
fairyName = `${elementOfFairy}_fairy`; //auto placer element name
startColor = elements[elementOfFairy].color;
if(typeof(elements[elementOfFairy].excludeRandom !== "undefined")) { //if excludeRandom exists (prevent TypeError)
if(elements[elementOfFairy].excludeRandom) { //it it's true
//console.log("nyet " + elementOfFairy);
randomExcl = 1; //the fairy is excluded
} else {
//console.log("allow " + elementOfFairy);
randomExcl = 0;
};
};
if(typeof(elements[elementOfFairy].nocheer !== "undefined")) { //if nocheer exists (prevent TypeError)
if(elements[elementOfFairy].nocheer) { //it it's true
//console.log("nyet " + elementOfFairy);
isNocheer = 1; //the fairy is excluded
} else {
//console.log("allow " + elementOfFairy);
isNocheer = 0;
};
};
};
//Color gen
if(Array.isArray(startColor)) { //Average arrays, make colors rgb()
startColor = averageRgbPrefixedColorArray(startColor);
} else {
startColor = rgbHexCatcher(startColor);
};
//console.log(`rgbStringToObject(${startColor}) from more_fairies.js`)
var newColorObjectArray = [];
var newColorArray = [];
for(i = 0; i < elements.fairy.color.length; i++) {
var newFairyColorlet = elements.fairy.color[i];
var newColor = multiplyColors(startColor,newFairyColorlet);
var newColorJSON = multiplyColors(startColor,newFairyColorlet,"json");
newColorArray.push(newColor);
newColorObjectArray.push(newColorJSON);
};
//End color gen
//The fairy
//console.log(elementOfFairy);
var firstInfo, firstTemp;
if(Array.isArray(elementOfFairy)) {
firstInfo = elements[elementOfFairy[0]];
firstTemp = airTemp;
if(typeof(firstInfo.temp) !== "undefined") {
firstTemp = firstInfo.temp;
};
} else {
firstInfo = elements[elementOfFairy];
firstTemp = airTemp;
if(typeof(firstInfo.temp) !== "undefined") {
firstTemp = firstInfo.temp;
};
};
elementOfFairy = tryJoin(elementOfFairy,",");
//console.log(elementOfFairy);
if(!elementExists(fairyName)) {
elements[fairyName] = {
color: newColorArray,
insulate: true,
flippableX: true,
colorObject: newColorObjectArray,
behavior: [
["XX","M1","M1"],
["XX","FX%5","XX"],
["XX",`CR:${elementOfFairy}%0.5 AND CR:fairy_dust%0.005 AND M1`,"M1"]
],
category: "auto_fey",
temp: firstTemp,
hardness: 1,
};
if(typeof(eLists) === "undefined") {
eLists = {};
};
if(typeof(eLists.FAIRY) === "undefined") {
eLists.FAIRY = [];
};
eLists.FAIRY.push(fairyName);
if(!randomExcl) {
if(typeof(fairyChoices) === "undefined") {
fairyChoices = []
};
if(!fairyChoices.includes(fairyName)) {
fairyChoices.push(fairyName);
};
}
if(isNocheer) {
elements[fairyName].nocheer = true;
}
if(fairyIncludeRandom) {
randomExcl ? elements[fairyName].excludeRandom = true : elements[fairyName].excludeRandom = false;
} else {
elements[fairyName].excludeRandom = true;
};
if(isAfterScriptLoading) {
elements[fairyName].flippableX = true;
elementCount++; //increment for new fairy element
if (settings.cheerful && elements[fairyName].nocheer) {
elements[fairyName].hidden = true;
hiddenCount++;
} else {
createElementButton(fairyName);
};
elements[fairyName].id = nextid++;
document.getElementById("extraInfo").innerHTML = "<small><p>There are " + elementCount + " elements, including " + hiddenCount + " hidden ones.</p><p>©2021-" + new Date().getFullYear() + ". All Rights Reserved. <a href='https://r74n.com'>R74n</a></p></small>"; //update extra info counts (and the copyright year, due to the method used)
};
};
};
};
runAfterAutogen(function() {
if(generateFairies) {
fairyArray = Object.keys(elements).filter(function(e) { //same criteria as spouts
return (defaultFairyCondition(e));
});
fairyArray.push(["rock","sand"]);
generateFairy(fairyArray,false);
};
});
elements.spawn_random_fairy = {
color: ["#3e5f8a","#a334ec","#ea96f9","#a6ecf6","#70ebc8","#d9286b","#7eed91","#a18b30"],
behavior: behaviors.WALL,
category: "special",
excludeRandom: true,
tick: function(pixel) {
changePixel(pixel,fairyChoices[Math.floor(Math.random() * fairyChoices.length)])
},
};
//Post-generation tasks
//Revamp fairykill
behaviors.FAIRYKILL_OLD = behaviors.FAIRYKILL;
behaviors.FAIRYKILL = function(pixel) {
if (pixel.start === pixelTicks) {return}
if (pixel.charge && elements[pixel.element].behaviorOn) {
pixelTick(pixel)
}
var ignore = [];
if(typeof(elements[pixel.element].ignore) !== "undefined") {
ignore = elements[pixel.element].ignore;
};
for(i = 0; i < adjacentCoords.length; i++) {
var coord = adjacentCoords[i];
var offsetX = coord[0];
var offsetY = coord[1];
var newX = pixel.x+offsetX;
var newY = pixel.y+offsetY;
if(!isEmpty(newX,newY,true)) {
var newPixel = pixelMap[newX][newY];
var newElement = newPixel.element;
var isIgnored = (newElement === ignore || ignore.includes(newElement))
if(eLists.FAIRY.includes(newElement) && !isIgnored) {
deletePixel(newX,newY);
};
};
};
doDefaults(pixel);
};
//Add ignores
var ignoreArray = ["acid", "iron", "silver", "steel", "tungstensteel", "void", "liquid_void", "chute", "vute", "drute", "drolute", "volute", "alkahest", "acid_gas"];
for(l = 0; l < ignoreArray.length; l++) {
var name = ignoreArray[l];
var fairyName = `${ignoreArray[l]}_fairy`;
if(elementExists(name) && elementExists(fairyName)) {
var baseInfo = elements[name];
if(typeof(baseInfo.ignore) === "undefined") {
baseInfo.ignore = [];
} else if(typeof(baseInfo.ignore) === "string") {
baseInfo.ignore = [baseInfo.ignore];
};
baseInfo.ignore.push(fairyName);
};
};
//Add updated fairykills
var fairykillElements = ["iron", "silver", "steel", "tungstensteel"];
for(q = 0; q < fairykillElements.length; q++) {
var name = fairykillElements[q];
if(elementExists(name)) {
elements[name].behavior = behaviors.FAIRYKILL;
};
};
} else {
if(!enabledMods.includes(runAfterAutogenMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,runAfterAutogenMod) };
if(!enabledMods.includes(libraryMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,libraryMod) };
if(!enabledMods.includes(feyAndMoreMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,feyAndMoreMod) };
alert(`The "${runAfterAutogenMod}", "${libraryMod}", and "${feyAndMoreMod}" mods are required; any missing mods in this list have been automatically inserted (reload for this to take effect).`)
localStorage.setItem("enabledMods", JSON.stringify(enabledMods));
};

View File

@ -1,255 +0,0 @@
var modName = "mods/spouts.js";
var runAfterAutogenMod = "mods/runAfterAutogen and onload restructure.js";
var libraryMod = "mods/code_library.js";
if(enabledMods.includes(runAfterAutogenMod) && enabledMods.includes(libraryMod)) {
spoutChoices = ["spout", "udder", "torch"];
//Generate spouts
if(urlParams.get('generateSpouts') !== null) { //if the variable exists at all
generateSpouts = true
} else { //if it doesn't (and it returns null)
generateSpouts = false
}
if(urlParams.get('spoutIncludeRandom') !== null) { //if the variable exists at all
spoutIncludeRandom = true
} else { //if it doesn't (and it returns null)
spoutIncludeRandom = false
}
eLists.SPOUT = ["spout", "udder", "torch"];
var excludedSpoutElements = ["ketchup", "liquid_cloner", "fire_cloner"]
var includedSpouts = ["ketchup_spout", "spout", "udder", "torch"]
var backupCategoryWhitelist = ["land","powders","weapons","food","life","corruption","states","fey","Fantastic Creatures","dyes","energy liquids","random liquids","random gases","random rocks"];
var backupElementWhitelist = ["mercury", "chalcopyrite_ore", "chalcopyrite_dust", "copper_concentrate", "fluxed_copper_concentrate", "unignited_pyrestone", "ignited_pyrestone", "everfire_dust", "extinguished_everfire_dust", "mistake", "polusium_oxide", "vaporized_polusium_oxide", "glowstone_dust", "redstone_dust", "soul_mud", "wet_soul_sand", "nitrogen_snow", "fusion_catalyst", "coal", "coal_coke", "blast_furnace_fuel", "molten_mythril"];
//forces elements that logically should be spouted, but are refused even though the condition is true, to be spouted
function defaultSpoutCondition(name) {
if(typeof(elements[name]) !== "object") {
throw new Error(`Nonexistent element ${name}`);
};
var info = elements[name];
//console.log(`${name} (${JSON.stringify(elements[name])})`);
if(typeof(info.state) === "undefined") {
var state = null;
} else {
var state = info.state;
};
if(typeof(info.category) === "undefined") {
var category = "other";
} else {
var category = info.category;
};
if(excludedSpoutElements.includes(name)) {
return false
};
var include = false;
if(["liquid","gas"].includes(state)) {
include = true;
};
if(info.movable) {
include = true;
};
if(backupCategoryWhitelist.includes(category)) {
include = true;
};
if(backupElementWhitelist.includes(name)) {
include = true;
};
if(category.includes("mudstone")) {
include = true;
};
//console.log(include);
return include;
};
//Generator function
//Standalone generator
function generateSpout(spoutElements,isAfterScriptLoading=false) {//it can be a single element, though
//To specify an array spout, have the array be inside another array.
/*For reasons related to how element colors are loaded, if this function is being run from a JS mod file, isAfterScriptLoading should be false.
Otherwise, you'll get TypeErrors for some reason when trying to place your spout. If this is being run after the game has loaded (e.g. in the console),
then isAfterScriptLoading should be true or you might also get TypeErrors (this latter case was a bit inconsistent when I tested it, but
the former case wasn't. **isAfterScriptLoading must be false when this function is run from a JS mod file**.*/
if(typeof(spoutElements) === "string") { //it should be an array, so string check
//console.log("String detected");
if(spoutElements.includes(",")) { //comma-separated string?
//console.log("Splitting string to array");
spoutElements = spoutElements.split(","); //,SS to array
} else {
//console.log("Wrapping string in array");
spoutElements = [spoutElements]; //single string to array
};
};
for(aaf = 0; aaf < spoutElements.length; aaf++) {
var elementOfSpout = spoutElements[aaf];
var startColor;
var randomExcl = 0;
var isNocheer = 0;
//console.log("randomExcl set")
//console.log(elementOfSpout);
var spoutName;
if(typeof(elementOfSpout === "string")) { //comma separated string check
if(elementOfSpout.includes(",")) { //if it is
elementOfSpout = elementOfSpout.split(","); //to array
elementOfSpout = elementOfSpout.filter(function(e) { //strip nonexistent elements
return typeof(elements[e]) === "object";
});
};
};
if(Array.isArray(elementOfSpout)) {
spoutName = `${elementOfSpout.join("_")}_spout`; //auto placer element name
//array case color concatenator and excludeRandom handler
startColor = [];
//console.log(elementOfSpout);
for(ll = 0; ll < elementOfSpout.length; ll++) {
if(typeof(elements[elementOfSpout[ll]].excludeRandom !== "undefined")) { //if excludeRandom exists (prevent TypeError)
if(elements[elementOfSpout[ll]].excludeRandom) { //it it's true
randomExcl = 1; //the whole array spout is excluded
//console.log("array nyet" + elementOfSpout);
};
};
//console.log(elementOfSpout[ll]);
startColor = startColor.concat(elements[elementOfSpout[ll]].color);
};
for(ll = 0; ll < elementOfSpout.length; ll++) {
if(typeof(elements[elementOfSpout[ll]].nocheer !== "undefined")) { //if nocheer exists (prevent TypeError)
if(elements[elementOfSpout[ll]].nocheer) { //it it's true
isNocheer = 1; //the whole array spout is excluded
//console.log("array nyet" + elementOfSpout);
};
};
//console.log(elementOfSpout[ll]);
startColor = startColor.concat(elements[elementOfSpout[ll]].color);
};
} else { //they should all be strings, so here
spoutName = `${elementOfSpout}_spout`; //auto placer element name
startColor = elements[elementOfSpout].color;
if(typeof(elements[elementOfSpout].excludeRandom !== "undefined")) { //if excludeRandom exists (prevent TypeError)
if(elements[elementOfSpout].excludeRandom) { //it it's true
//console.log("nyet " + elementOfSpout);
randomExcl = 1; //the spout is excluded
} else {
//console.log("allow " + elementOfSpout);
randomExcl = 0;
};
};
if(typeof(elements[elementOfSpout].nocheer !== "undefined")) { //if nocheer exists (prevent TypeError)
if(elements[elementOfSpout].nocheer) { //it it's true
//console.log("nyet " + elementOfSpout);
isNocheer = 1; //the spout is excluded
} else {
//console.log("allow " + elementOfSpout);
isNocheer = 0;
};
};
};
//Color gen
if(Array.isArray(startColor)) { //Average arrays, make colors rgb()
startColor = averageRgbPrefixedColorArray(startColor);
} else {
startColor = rgbHexCatcher(startColor);
};
var newColorObject = rgbStringToObject(startColor);
//End color gen
//The spout
//console.log(elementOfSpout);
var firstInfo, firstTemp;
if(Array.isArray(elementOfSpout)) {
firstInfo = elements[elementOfSpout[0]];
firstTemp = airTemp;
if(typeof(firstInfo.temp) !== "undefined") {
firstTemp = firstInfo.temp;
};
} else {
firstInfo = elements[elementOfSpout];
firstTemp = airTemp;
if(typeof(firstInfo.temp) !== "undefined") {
firstTemp = firstInfo.temp;
};
};
elementOfSpout = tryJoin(elementOfSpout,",");
//console.log(elementOfSpout);
elements[spoutName] = {
color: startColor,
insulate: true,
colorObject: newColorObject,
behavior: [
["XX",`CR:${elementOfSpout}`,"XX"],
[`CR:${elementOfSpout}`,"XX",`CR:${elementOfSpout}`],
["XX",`CR:${elementOfSpout}`,"XX"]
],
category: "spouts",
temp: firstTemp,
hardness: 1,
};
if(!randomExcl) {
if(typeof(spoutChoices) === "undefined") {
spoutChoices = []
};
if(!spoutChoices.includes(spoutName)) {
spoutChoices.push(spoutName);
};
}
if(spoutIncludeRandom) {
randomExcl ? elements[spoutName].excludeRandom = true : elements[spoutName].excludeRandom = false;
} else {
elements[spoutName].excludeRandom = true;
};
if(isNocheer) {
elements[spoutName].nocheer = true;
}
if(isAfterScriptLoading) {
elementCount++; //increment for new spout element
if (settings.cheerful && elements[spoutName].nocheer) {
elements[spoutName].hidden = true;
hiddenCount++;
} else {
createElementButton(spoutName);
};
elements[spoutName].id = nextid++;
document.getElementById("extraInfo").innerHTML = "<small><p>There are " + elementCount + " elements, including " + hiddenCount + " hidden ones.</p><p>©2021-" + new Date().getFullYear() + ". All Rights Reserved. <a href='https://r74n.com'>R74n</a></p></small>"; //update extra info counts (and the copyright year, due to the method used)
};
eLists.SPOUT.push(spoutName);
};
};
runAfterAutogen(function() {
if(generateSpouts) {
liquidArray = Object.keys(elements).filter(function(e) {
return (defaultSpoutCondition(e));
});
liquidArray.push(["rock","sand"]);
generateSpout(liquidArray,false);
};
});
elements.random_spout = {
color: ["#3e5f8a","#a334ec","#ea96f9","#a6ecf6","#70ebc8","#d9286b","#7eed91","#a18b30"],
behavior: behaviors.WALL,
category: "special",
excludeRandom: true,
tick: function(pixel) {
changePixel(pixel,spoutChoices[Math.floor(Math.random() * spoutChoices.length)])
},
};
} else {
if(!enabledMods.includes(runAfterAutogenMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,runAfterAutogenMod) };
if(!enabledMods.includes(libraryMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,libraryMod) };
alert(`The "${runAfterAutogenMod}" and "${libraryMod}" mods are required; any missing mods in this list have been automatically inserted (reload for this to take effect).`)
localStorage.setItem("enabledMods", JSON.stringify(enabledMods));
};