new helper functions and super-spicy elements

wall bomb, grand torch, holy fire, god slayer fire

also brimstone slag
This commit is contained in:
An Orbit 2024-01-24 23:35:57 -05:00 committed by GitHub
parent 13b154b667
commit 69cf2a5e63
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 332 additions and 8 deletions

View File

@ -26,7 +26,7 @@ try {
return Object.keys(object).find(key => object[key] === value);
};
//R.N.G.
//RNG
//Random integer from 0 to n
function randomIntegerFromZeroToValue(value) {
@ -47,6 +47,11 @@ try {
return array[randomIndex];
};
//Random 1 or -1
function randomSign() {
return Math.random() < 0.5 ? 1 : -1
};
//Random integer from m to n
function randomIntegerBetweenTwoValues(min,max) {
if(min > max) {
@ -1322,6 +1327,12 @@ try {
};
//Pixels
function tryMoveAndReturnBlockingPixel(pixel,nx,ny,leaveBehind,force) {
if(outOfBounds(nx,ny)) { return false };
if(isEmpty(nx,ny,false)) { return tryMove(pixel,nx,ny,leaveBehind,force) };
return pixelMap[nx][ny]
};
function exposedToAir(pixel) {
return (isEmpty(pixel.x+1,pixel.y) || isEmpty(pixel.x-1,pixel.y) || isEmpty(pixel.x,pixel.y+1) || isEmpty(pixel.x,pixel.y-1));
@ -1845,6 +1856,32 @@ try {
return true;
};
//Melt pixel
function meltPixel(pixel,changetemp=true) {
var info = elements[pixel.element];
var result = info.stateHigh;
if (!result) {
return false
};
if(result instanceof Array) {
result = result.filter(elementExists);
if(result.length == 0) {
return false;
};
} else {
if(!(elementExists(result))) {
return false;
};
};
while(result instanceof Array) {
result = randomChoice(result);
};
changePixel(pixel,result,changetemp);
return true;
};
//Logic
function xor(c1,c2) {
@ -3465,6 +3502,9 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
if(typeof(beforeFunction) === "function") {
beforeFunction(pixel,x,y,radius,fire,smoke,power,damage);
};
if(!pixel || pixel.del || typeof(pixel) == "undefined" || isEmpty(coords[i].x,coords[x].y)) {
continue
};
if (info.hardness) { // lower damage depending on hardness(0-1)
if (info.hardness < 1) {
damage = damage * ((1 - info.hardness)*10);
@ -3948,6 +3988,145 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
stain: 0.075,
};
elements.holy_fire = {
color: ["#FFFF96","#FFBF49","#CE743B"], //placeholder
tick: function(pixel) {
var moveResult = tryMoveAndReturnBlockingPixel(pixel,pixel.x + randomSign(),pixel.y - 1);
var blockingPixels = [];
var secondMoveResult = null;
if(typeof(moveResult) == "object" && !(elements[pixel.element].ignore.concat(pixel.element).includes(moveResult.element))) {
blockingPixels.push(moveResult)
};
//if move1Result = true then nothing else happens
if(moveResult !== true) {
var coords = randomChoice([[-1,0],[0,1],[1,0]]).map(offsetPair => addArraysInPairs(offsetPair,[pixel.x,pixel.y]));
secondMoveResult = tryMoveAndReturnBlockingPixel(pixel,...coords);
if(typeof(secondMoveResult) == "object" && !(elements[pixel.element].ignore.concat(pixel.element).includes(secondMoveResult.element))) {
blockingPixels.push(secondMoveResult)
};
};
if(blockingPixels.length > 0) {
blockingPixels.forEach(function(pixel) {
var blessRxn = elements.bless.reactions[pixel.element];
if(typeof(blessRxn) == "object") {
var elem2 = blessRxn.elem2;
if(elem2 !== null) {
while(Array.isArray(elem2)) { elem2 = randomChoice(elem2) };
changePixel(pixel,elem2)
}
};
var value = Math.random();
if(value < 0.01) {
if(pixel.burnInto) {
finishBurn(pixel)
} else {
changePixel(pixel,randomChoice(["ash","ash","light"]))
}
} else if(value < 0.20) {
pixel.burning = true;
pixel.burnStart ??= pixelTicks;
} else if(value < 0.205) {
changePixel(pixel,randomChoice(["ash","ash","light"]))
} else {
pixel.temp += 10; pixelTempCheck(pixel)
};
return
})
};
doDefaults(pixel);
},
temp:6000,
tempLow:1000,
stateLow: ["bless","fire"],
category: "energy",
burning: true,
fireElement: ["bless","plasma"],
ignore: ["ash","light","bless","plasma","wall"],
state: "gas",
density: 0.08,
ignoreAir: true
};
elements.god_slayer_fire = {
color: ["#FFBACE","#FC6DCA","#9954B0"],
tick: function(pixel) {
var moveResult = tryMoveAndReturnBlockingPixel(pixel,pixel.x + randomSign(),pixel.y - 1);
var blockingPixels = [];
var secondMoveResult = null;
if(typeof(moveResult) == "object" && !(elements[pixel.element].ignore.concat(pixel.element).includes(moveResult.element))) {
blockingPixels.push(moveResult)
};
//if move1Result = true then nothing else happens
if(moveResult !== true) {
var coords = randomChoice([[-1,0],[0,1],[1,0]]).map(offsetPair => addArraysInPairs(offsetPair,[pixel.x,pixel.y]));
secondMoveResult = tryMoveAndReturnBlockingPixel(pixel,...coords);
if(typeof(secondMoveResult) == "object" && !(elements[pixel.element].ignore.concat(pixel.element).includes(secondMoveResult.element))) {
blockingPixels.push(secondMoveResult)
};
};
if(blockingPixels.length > 0) {
blockingPixels.forEach(function(pixel) {
var value = Math.random();
var randomDefaultResult = randomChoice(["ash","slag","plasma"]);
var oldTemp = pixel.temp;
if(value < 0.03) {
if(pixel.stateHigh) {
meltPixel(pixel);
}
} else if(value < 0.06) {
if(pixel.burnInto) {
finishBurn(pixel);
} else {
changePixel(pixel,randomDefaultResult)
}
} else if(value < 0.09) {
if(pixel.breakInto) {
breakPixel(pixel);
} else {
changePixel(pixel,randomDefaultResult)
}
} else if(value < 0.24) {
pixel.burning = true;
pixel.burnStart ??= pixelTicks;
} else if(value < 0.245) {
changePixel(pixel,randomDefaultResult)
} else {
pixel.temp += 25; pixelTempCheck(pixel)
};
if(pixel) {
pixel.temp = Math.max(oldTemp,pixel.temp)
};
return
})
};
doDefaults(pixel);
},
temp:10000,
tempLow:1500,
stateLow: ["explosion","fire","fire","fire","fire","fire","fire","fire"],
category: "energy",
ignore: ["ash","slag","wall","plasma"],
burning: true,
fireElement: ["plasma"],
state: "gas",
density: 0.07,
ignoreAir: true
};
elements.cold_torch = {
"color": "#4394d6",
"behavior": [
@ -3977,6 +4156,47 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
"stateHigh": "wood",
};
elements.grand_torch = {
"color": "#FFBF2F",
"tick": function(pixel) {
var coords = circleCoords(pixel.x,pixel.y,2).concat([[-1,-2],[1,-2],[-1,2],[1,2],[-2,-1],[2,-1],[-2,1],[2,1],[-1,-3],[0,-3],[1,-3],[0,-4],[0,-5]].map(
function(offsets) {
return {x: offsets[0]+pixel.x, y: offsets[1]+pixel.y}
}
));
for(var i = 0; i < coords.length; i++) {
var coordPair = coords[i];
if(outOfBounds(coordPair.x,coordPair.y)) { continue };
if(coordPair.x == pixel.x && coordPair.y == pixel.y) { continue };
if(!(isEmpty(coordPair.x,coordPair.y))) { continue };
var newPixel = tryCreatePixelReturn("fire",coordPair.x,coordPair.y);
if(typeof(newPixel) == "object") {
newPixel.temp = 1500
}
};
},
"reactions": {
"water": { "elem1": "torch", chance: 0.01 },
"sugar_water": { "elem1": "torch", chance: 0.01 },
"salt_water": { "elem1": "torch", chance: 0.01 },
"seltzer": { "elem1": "torch", chance: 0.01 },
"dirty_water": { "elem1": "torch", chance: 0.01 },
"pool_water": { "elem1": "torch", chance: 0.01 },
"steam": { "elem1": "wood", chance: 0.01 },
"smog": { "elem1": "wood", chance: 0.01 },
"rain_cloud": { "elem1": "wood", chance: 0.01 },
"cloud": { "elem1": "wood", chance: 0.01 },
"snow_cloud": { "elem1": "wood", chance: 0.01 },
"hail_cloud": { "elem1": "wood", chance: 0.01 },
"black_damp": { "elem1": "wood", chance: 0.02 }
},
"temp": 1500,
"category": "special",
"breakInto": "charcoal",
"tempLow": 900,
"stateLow": "torch",
};
elements.plasma_torch = {
"color": "#86579c",
"tick": function(pixel) {
@ -4126,7 +4346,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
burn: 300,
burnTime: 500,
temp: airTemp,
},
};
elements.hypernapalm = {
name: "h y p e r n a p a l m", //HYPERNAPALM
@ -4146,7 +4366,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
burnTempChange: 30,
burn: 300,
burnTime: 500,
},
};
elements.cold_napalm = {
color: "#3e87e0",
@ -4164,7 +4384,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
fireElement: "cold_fire",
burnTempChange: -1,
burnInto: "cold_fire",
}
};
elements.rad_napalm = {
color: "#cdf760",
@ -4183,8 +4403,8 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
fireElement: "rad_fire",
temp: airTemp,
burnInto: "rad_fire",
},
};
runAfterLoad(function() {
if(eLists.spout) {
eLists.spout.push("cold_torch");
@ -7690,6 +7910,56 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
hardness: 0.7,
}
elements.brimstone_slag = {
color: ["#745B57","#534D4A","#463F53","#51113E","#6D283B","#BC4949","#EA9B4E"],
properties: {
needsOffset: true
},
colorPattern: [
"FGGFGFGGF",
"FFGFGFFGG",
"DEEDEEDEE",
"DEDEEEEED",
"BDCBACDCB",
"BCADCDDBB",
"ABBCAABCC"
],
colorKey: {
"A": "#745B57",
"B": "#534D4A",
"C": "#463F53",
"D": "#51113E",
"E": "#6D283B",
"F": "#BC4949",
"G": "#EA9B4E",
},
behavior: behaviors.POWDER,
hardness: 0.5,
enableOffsetsOnTextureColors: true,
breakInto: ["slag","sulfur"],
tempHigh: 1780,
state: "solid",
category: "solids",
tick: function(pixel) {
if(pixel.needsOffset) {
var offset = (elements[pixel.element].maxColorOffset ?? 15);
offset = randomIntegerFromZeroToValue(offset) * (Math.random() < 0.5 ? -1 : 1);
pixel.color = convertColorFormats(pixel.color,"json");
for(var k in pixel.color) { pixel.color[k] += offset };
pixel.color = convertColorFormats(pixel.color,"rgb");
delete pixel.needsOffset;
return
}
}
};
elements.molten_slag ??= {};
elements.molten_slag.reactions ??= {};
elements.molten_slag.reactions.sulfur = elements.molten_slag.reactions.molten_sulfur = elements.molten_slag.reactions.sulfur_gas = elements.molten_sulfur.reactions.slag = elements.sulfur.reactions.molten_slag = { elem1: "brimstone_slag", elem2: null };
elements.slag.tempHigh = 1780;
var temp = "firesea,lektre,concoction,mistake,unstable_mistake,toxic_mistake".split(",");
for(var i = 0; i < temp.length; i++) {
temp[i].state = "liquid";
@ -7716,7 +7986,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
var oY = adjacentCoords[i][1];
var fX = pX+oX;
var fY = pY+oY;
if(!isEmpty(fX,fY,true)) {
if(!isEmpty(fX,fY,true)) { //7989 yay soshi!
var checkPixel = pixelMap[fX][fY];
var otherElement = elements[checkPixel.element];
if (typeof(otherElement.cutInto) !== "undefined") {
@ -7986,7 +8256,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
var baseJSON = convertColorFormats(baseColor,"json");
var dyeJSON = convertColorFormats(dyeColor,"json");
var dyedColor = multiplyColors(dyeJSON,baseJSON,"json");
//70% multiplied //7989 yay soshi!
//70% multiplied
var semiDyedColor = averageColorObjects(dyedColor,baseJSON,0.7);
//35% dye color, 65% result
var finalColor = averageColorObjects(semiDyedColor,dyeJSON,0.65);
@ -34891,6 +35161,58 @@ Make sure to save your command in a file if you want to add this preset again.`
pixel.temp += (800 * ((1 + (7 * damage)) ** 2) * ((power ** 2) * 1.5));
};
//explodeAtPlus(x,y,radius,fire="fire",smoke="smoke",beforeFunction=null,afterFunction=null,changeTemp=true) {
//beforeFunction(pixel,x,y,radius,fire,smoke,power,damage)
function wallBombBeforeFunction(pixel,x,y,radius,fire,smoke,power,damage) {
var hardness = (elements[pixel.element].hardness ?? 0) / 2;
damage = damage * ((1 - hardness)*10);
//console.log(damage);
if(damage > 0.25) {
pixel.breakInto ? breakPixel(pixel) : deletePixel(pixel.x,pixel.y)
};
return
};
elements.wall_bomb = {
color: "#af8f8f",
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,10,"fire","smoke",wallBombBeforeFunction,null,false);
if(pixel) { deletePixel(pixel.x,pixel.y) };
return
};
};
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","smoke",wallBombBeforeFunction,null,false);
if(pixel) { deletePixel(pixel.x,pixel.y) };
return
};
};
if(outOfBounds(pixel.x,pixel.y+1)) { //[2][1] EX (don't ignore bounds, bound case)
explodeAtPlus(pixel.x,pixel.y,10,"fire","smoke",wallBombBeforeFunction,null,false);
if(pixel) { deletePixel(pixel.x,pixel.y) };
return
};
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: 3000,
excludeRandom: true,
};
function empCharge(pixel,x,y,radius,fire,smoke,power,damage) {
var info = elements[pixel.element];
if(info.conduct) {
@ -35713,6 +36035,8 @@ Make sure to save your command in a file if you want to add this preset again.`
excludeRandom: true,
hardness: 0.3,
};
//Wall bomb
elements.electric_cluster_bomb = {
color: "#ffffff",