158 lines
5.2 KiB
JavaScript
158 lines
5.2 KiB
JavaScript
//Base element, uninitialized IO
|
|
elements.thermal_conduit = {
|
|
hidden: true,
|
|
category: "thermal_conduits",
|
|
hardness: 1,
|
|
state: "solid",
|
|
density: 3000,
|
|
temp: -273.15,
|
|
behavior: behaviors.WALL,
|
|
color: "#cf9f7f",
|
|
insulate: true,
|
|
properties: {
|
|
inputs: [],
|
|
outputs: [],
|
|
rate: 2,
|
|
},
|
|
tick: function(pixel) {
|
|
if(pixel.inputs.length == 0 && pixel.outputs.length == 0) {
|
|
return;
|
|
};
|
|
//Iterate through inputs
|
|
for(var i = 0; i < pixel.inputs.length; i++) {
|
|
//Readability variable for offset pair
|
|
var coordPair = pixel.inputs[i];
|
|
//Coord RVs
|
|
var newX = pixel.x + coordPair[0];
|
|
var newY = pixel.y + coordPair[1];
|
|
//Skip empties
|
|
if(isEmpty(newX,newY,true)) {
|
|
continue;
|
|
} else {
|
|
//New pixel RV
|
|
var newPixel = pixelMap[newX][newY];
|
|
//More sugar
|
|
var newPixelTempKelvin = newPixel.temp + 273.15;
|
|
//Skip pixels at or below absolute zero
|
|
if(newPixelTempKelvin <= 0) {
|
|
continue;
|
|
};
|
|
//If temp withdrawal would put pixel below absolute zero
|
|
if(newPixelTempKelvin <= pixel.rate) {
|
|
//Special "draining" logic
|
|
pixel.temp += newPixelTempKelvin;
|
|
newPixel.temp = -273.15;
|
|
} else {
|
|
//If not, just move the temperature
|
|
pixel.temp += pixel.rate;
|
|
newPixel.temp -= pixel.rate;
|
|
};
|
|
};
|
|
};
|
|
|
|
if(pixelTempKelvin <= 0 || pixel.outputs.length == 0) {
|
|
return false;
|
|
};
|
|
|
|
//Iterate through outputs
|
|
var availableOutputs = [];
|
|
//Adjust effective output count;
|
|
for(var i = 0; i < pixel.outputs.length; i++) {
|
|
var coordPair = pixel.outputs[i];
|
|
var newX = pixel.x + coordPair[0];
|
|
var newY = pixel.y + coordPair[1];
|
|
if(!isEmpty(newX,newY,true)) {
|
|
availableOutputs.push([newX,newY]);
|
|
};
|
|
};
|
|
|
|
var pixelTempKelvin = pixel.temp + 273.15;
|
|
var isDraining = (pixelTempKelvin <= pixel.rate);
|
|
var effectiveRate = (isDraining ? pixelTempKelvin : pixel.rate) / availableOutputs.length;
|
|
//Actual distribution
|
|
for(var i = 0; i < availableOutputs.length; i++) {
|
|
var coordPair = availableOutputs[i];
|
|
var newPixel = pixelMap[coordPair[0]][coordPair[1]];
|
|
newPixel.temp += effectiveRate;
|
|
};
|
|
if(availableOutputs.length > 0) { isDraining ? pixel.temp = -273.15 : pixel.temp -= pixel.rate };
|
|
},
|
|
};
|
|
|
|
function defineConduitElement(nameDescriber,inputOffsetNestedArray,outputOffsetNestedArray) {
|
|
//There is no validation here. Please don't do anything stupid.
|
|
//Pretty please don't run after script loading, i don't feel like adding that code in.
|
|
var autoName = `thermal_${nameDescriber}_conduit`;
|
|
//console.log(inputOffsetNestedArray);
|
|
elements[autoName] = {
|
|
category: "thermal_conduits",
|
|
properties: {
|
|
inputs: inputOffsetNestedArray,
|
|
outputs: outputOffsetNestedArray,
|
|
rate: 2,
|
|
},
|
|
hardness: 1,
|
|
state: "solid",
|
|
density: 3000,
|
|
temp: -273.15,
|
|
behavior: behaviors.WALL,
|
|
color: "#cf9f7f",
|
|
insulate: true,
|
|
tick: function(pixel) {
|
|
pixel.element = "thermal_conduit"; //manual change to preserve properties
|
|
},
|
|
};
|
|
return autoName;
|
|
}
|
|
|
|
autoConduitTable = {
|
|
//up_to_up: useless,
|
|
up_to_down: {ins: [[0,-1]], outs: [[0,1]]},
|
|
up_to_left: {ins: [[0,-1]], outs: [[-1,0]]},
|
|
up_to_right: {ins: [[0,-1]], outs: [[1,0]]},
|
|
|
|
down_to_up: {ins: [[0,1]], outs: [[0,-1]]},
|
|
//down_to_down: useless,
|
|
down_to_left: {ins: [[0,1]], outs: [[-1,0]]},
|
|
down_to_right: {ins: [[0,1]], outs: [[1,0]]},
|
|
|
|
left_to_up: {ins: [[-1,0]], outs: [[0,-1]]},
|
|
left_to_down: {ins: [[-1,0]], outs: [[0,1]]},
|
|
//left_to_left: useless,
|
|
left_to_right: {ins: [[-1,0]], outs: [[1,0]]},
|
|
|
|
right_to_up: {ins: [[1,0]], outs: [[0,-1]]},
|
|
right_to_down: {ins: [[1,0]], outs: [[0,1]]},
|
|
right_to_left: {ins: [[1,0]], outs: [[-1,0]]},
|
|
//right_to_right: useless,
|
|
|
|
left_and_right_to_down: {ins: [[-1,0],[1,0]], outs: [[0,1]]},
|
|
up_and_down_to_left: {ins: [[0,-1],[0,1]], outs: [[-1,0]]},
|
|
left_and_right_to_up: {ins: [[-1,0],[1,0]], outs: [[0,-1]]},
|
|
up_and_down_to_right: {ins: [[0,-1],[0,1]], outs: [[1,0]]},
|
|
|
|
down_to_left_and_right: {outs: [[-1,0],[1,0]], ins: [[0,1]]},
|
|
left_to_up_and_down: {outs: [[0,-1],[0,1]], ins: [[-1,0]]},
|
|
up_to_left_and_right: {outs: [[-1,0],[1,0]], ins: [[0,-1]]},
|
|
right_to_up_and_down: {outs: [[0,-1],[0,1]], ins: [[1,0]]},
|
|
|
|
up_down_and_left_to_right: {ins: [[0,-1],[0,1],[-1,0]], outs: [[1,0]]},
|
|
up_left_and_right_to_down: {ins: [[0,-1],[-1,0],[1,0]], outs: [[0,1]]},
|
|
up_down_and_right_to_left: {ins: [[0,-1],[0,1],[1,0]], outs: [[-1,0]]},
|
|
down_left_and_right_to_up: {ins: [[0,1],[-1,0],[1,0]], outs: [[0,-1]]},
|
|
|
|
right_to_up_down_and_left: {outs: [[0,-1],[0,1],[-1,0]], ins: [[1,0]]},
|
|
down_to_up_left_and_right: {outs: [[0,-1],[-1,0],[1,0]], ins: [[0,1]]},
|
|
left_to_up_down_and_right: {outs: [[0,-1],[0,1],[1,0]], ins: [[-1,0]]},
|
|
up_to_down_left_and_right: {outs: [[0,1],[-1,0],[1,0]], ins: [[0,-1]]},
|
|
|
|
left_and_down_to_right: {ins: [[-1,0],[0,1]], outs: [[1,0]]},
|
|
right_and_down_to_left: {ins: [[1,0],[0,1]], outs: [[-1,0]]},
|
|
left_and_up_to_right: {ins: [[-1,0],[0,-1]], outs: [[1,0]]},
|
|
right_and_up_to_left: {ins: [[1,0],[0,-1]], outs: [[-1,0]]},
|
|
};
|
|
|
|
for(direction in autoConduitTable) {
|
|
defineConduitElement(direction,autoConduitTable[direction].ins,autoConduitTable[direction].outs);
|
|
};
|