Add files via upload
Industry adds things like conveyors, beam emitters, and more. Essentially lets you build a Tycoon in Sandboxels.
This commit is contained in:
parent
cced781f70
commit
18b8a45fae
|
|
@ -0,0 +1,308 @@
|
|||
// Industry, made by PogDog.
|
||||
// For that sweet sweet feeling of destroying the Ozone.
|
||||
// Thanks nouser for the help, especially with the conveyors.
|
||||
|
||||
// Conveyors!
|
||||
|
||||
|
||||
elements.conveyer_right = {
|
||||
color: "#9999ff",
|
||||
behavior: behaviors.SOLID,
|
||||
category: "industry",
|
||||
state: "wall",
|
||||
density: 2500,
|
||||
data: {},
|
||||
movable: false,
|
||||
noMix: true,
|
||||
};
|
||||
|
||||
elements.conveyer_left = {
|
||||
color: "#9999cc",
|
||||
behavior: behaviors.SOLID,
|
||||
category: "industry",
|
||||
state: "wall",
|
||||
density: 2500,
|
||||
data: {},
|
||||
movable: false,
|
||||
noMix: true,
|
||||
};
|
||||
|
||||
runAfterLoad(function () {
|
||||
runEveryTick(function () {
|
||||
// RIGHTWARD movement: scan right to left
|
||||
for (let x = width - 1; x >= 0; x--) {
|
||||
for (let y = height - 1; y >= 0; y--) {
|
||||
const pixel = pixelMap[x][y];
|
||||
if (pixel && pixel.element === "conveyer_right") {
|
||||
for (let dy = 1; dy <= 10; dy++) {
|
||||
const targetY = y - dy;
|
||||
if (targetY < 0) break;
|
||||
const stackPixel = pixelMap[x]?.[targetY];
|
||||
if (!stackPixel || !elements[stackPixel.element]?.movable) break;
|
||||
if (isEmpty(x + 1, targetY)) {
|
||||
movePixel(stackPixel, x + 1, targetY);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// LEFTWARD movement: scan left to right
|
||||
for (let x = 0; x < width; x++) {
|
||||
for (let y = height - 1; y >= 0; y--) {
|
||||
const pixel = pixelMap[x][y];
|
||||
if (pixel && pixel.element === "conveyer_left") {
|
||||
for (let dy = 1; dy <= 10; dy++) {
|
||||
const targetY = y - dy;
|
||||
if (targetY < 0) break;
|
||||
const stackPixel = pixelMap[x]?.[targetY];
|
||||
if (!stackPixel || !elements[stackPixel.element]?.movable) break;
|
||||
if (isEmpty(x - 1, targetY)) {
|
||||
movePixel(stackPixel, x - 1, targetY);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Oven
|
||||
|
||||
elements.oven = {
|
||||
color: "#734700",
|
||||
behavior: behaviors.SOLID,
|
||||
category: "industry",
|
||||
state: "solid",
|
||||
density: 3000,
|
||||
movable: false,
|
||||
noMix: true,
|
||||
tick: function(pixel) {
|
||||
let x = pixel.x;
|
||||
let y = pixel.y + 1;
|
||||
if (isEmpty(x, y)) {
|
||||
createPixel("heat_ray", x, y);
|
||||
let ray = pixelMap[x][y];
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Freezer
|
||||
|
||||
|
||||
elements.freezer = {
|
||||
color: "#055b61",
|
||||
behavior: behaviors.SOLID,
|
||||
category: "industry",
|
||||
state: "solid",
|
||||
density: 3000,
|
||||
movable: false,
|
||||
noMix: true,
|
||||
tick: function(pixel) {
|
||||
let x = pixel.x;
|
||||
let y = pixel.y + 1;
|
||||
if (isEmpty(x, y)) {
|
||||
createPixel("freeze_ray", x, y);
|
||||
let ray = pixelMap[x][y];
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Exhaust
|
||||
|
||||
|
||||
elements.exhaust = {
|
||||
color: "#292929",
|
||||
category: "industry",
|
||||
state: "gas",
|
||||
density: 1.8,
|
||||
movable: false,
|
||||
noMix: true,
|
||||
tick: function(pixel) {
|
||||
const x = pixel.x;
|
||||
const y = pixel.y;
|
||||
const gasTypes = ["carbon_dioxide", "methane", "oxygen", "carbon_dioxide"]; // I am aware this isn't ideal, but it works for my purpouses.
|
||||
|
||||
for (let i = 0; i < gasTypes.length; i++) {
|
||||
let ty = y - 1 - i;
|
||||
if (ty < 0) break;
|
||||
if (isEmpty(x, ty)) {
|
||||
createPixel(gasTypes[i], x, ty);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// cancer machine!!1
|
||||
|
||||
elements.irradiator = {
|
||||
color: "#a0ff00",
|
||||
category: "industry",
|
||||
state: "solid",
|
||||
density: 3000,
|
||||
movable: false,
|
||||
noMix: true,
|
||||
tick: function(pixel) {
|
||||
const beamWidth = 1;
|
||||
const beamLength = 20; // how far down the beam goes
|
||||
const startX = pixel.x - Math.floor(beamWidth / 2);
|
||||
const endX = startX + beamWidth - 1;
|
||||
|
||||
for (let y = pixel.y + 1; y <= pixel.y + beamLength; y++) {
|
||||
if (y < 0 || y >= height) break;
|
||||
for (let x = startX; x <= endX; x++) {
|
||||
if (x < 0 || x >= width) continue;
|
||||
if (isEmpty(x, y)) {
|
||||
createPixel("radiation", x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Mixer
|
||||
|
||||
elements.mix_beam = {
|
||||
color: "#ffff99",
|
||||
category: "energy",
|
||||
state: "gas",
|
||||
density: 0.1,
|
||||
movable: false,
|
||||
noMix: true,
|
||||
tick: function(pixel) {
|
||||
const x = pixel.x;
|
||||
const y = pixel.y;
|
||||
|
||||
if (y + 1 >= height) {
|
||||
deletePixel(x, y);
|
||||
return;
|
||||
}
|
||||
|
||||
const below = pixelMap[x]?.[y + 1];
|
||||
|
||||
if (!below) {
|
||||
movePixel(pixel, x, y + 1);
|
||||
} else {
|
||||
const mixCoords = [];
|
||||
|
||||
for (let dx = -1; dx <= 1; dx++) {
|
||||
for (let dy = 0; dy <= 10; dy++) {
|
||||
const nx = x + dx;
|
||||
const ny = y + 1 + dy;
|
||||
|
||||
if (isEmpty(nx, ny)) continue;
|
||||
const p = pixelMap[nx]?.[ny];
|
||||
if (p) {
|
||||
mixCoords.push({ x: nx, y: ny, element: p.element });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Shuffle the element types
|
||||
const shuffledElements = mixCoords.map(p => p.element)
|
||||
.sort(() => Math.random() - 0.5);
|
||||
|
||||
// Assign shuffled elements back to original coordinates
|
||||
for (let i = 0; i < mixCoords.length; i++) {
|
||||
const pos = mixCoords[i];
|
||||
changePixel(pixelMap[pos.x][pos.y], shuffledElements[i]);
|
||||
}
|
||||
|
||||
deletePixel(x, y);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Mixer emitter
|
||||
|
||||
elements.beam_mixer_emitter = {
|
||||
color: "#ffcc00",
|
||||
category: "industry",
|
||||
state: "solid",
|
||||
behavior: behaviors.WALL,
|
||||
tick: function(pixel) {
|
||||
if (isEmpty(pixel.x, pixel.y + 1)) {
|
||||
createPixel("mix_beam", pixel.x, pixel.y + 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Shocker. Legit just irradiator, but a different element.
|
||||
|
||||
|
||||
|
||||
elements.charger = {
|
||||
color: "#f2f200",
|
||||
category: "industry",
|
||||
state: "solid",
|
||||
density: 3000,
|
||||
movable: false,
|
||||
noMix: true,
|
||||
tick: function(pixel) {
|
||||
const beamWidth = 1;
|
||||
const beamLength = 20; // how far down the beam goes
|
||||
const startX = pixel.x - Math.floor(beamWidth / 2);
|
||||
const endX = startX + beamWidth - 1;
|
||||
|
||||
for (let y = pixel.y + 1; y <= pixel.y + beamLength; y++) {
|
||||
if (y < 0 || y >= height) break;
|
||||
for (let x = startX; x <= endX; x++) {
|
||||
if (x < 0 || x >= width) continue;
|
||||
if (isEmpty(x, y)) {
|
||||
createPixel("electric", x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// adios beam
|
||||
|
||||
elements.deleter_beam = {
|
||||
color: "#ff4444",
|
||||
category: "energy",
|
||||
state: "gas",
|
||||
density: 0.1,
|
||||
movable: false,
|
||||
noMix: true,
|
||||
tick: function(pixel) {
|
||||
const x = pixel.x;
|
||||
const y = pixel.y;
|
||||
|
||||
if (y + 1 >= height) {
|
||||
deletePixel(x, y);
|
||||
return;
|
||||
}
|
||||
|
||||
const below = pixelMap[x]?.[y + 1];
|
||||
|
||||
if (!below) {
|
||||
movePixel(pixel, x, y + 1);
|
||||
} else {
|
||||
deletePixel(x, y);
|
||||
deletePixel(below.x, below.y);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
elements.deleter_beam_emitter = {
|
||||
color: "#ff2222",
|
||||
category: "industry",
|
||||
state: "solid",
|
||||
behavior: behaviors.WALL,
|
||||
tick: function(pixel) {
|
||||
if (isEmpty(pixel.x, pixel.y + 1)) {
|
||||
createPixel("deleter_beam", pixel.x, pixel.y + 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
Loading…
Reference in New Issue