From 8e6358ebc40a88aa0c5541d226c77247ccad228d Mon Sep 17 00:00:00 2001 From: "Laetitia (O-01-67)" <68935009+O-01-67@users.noreply.github.com> Date: Sat, 18 Feb 2023 22:16:06 -0500 Subject: [PATCH] release conduit.js --- mods/conduit.js | 152 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 mods/conduit.js diff --git a/mods/conduit.js b/mods/conduit.js new file mode 100644 index 00000000..995d58d6 --- /dev/null +++ b/mods/conduit.js @@ -0,0 +1,152 @@ +//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]]}, +}; + +for(direction in autoConduitTable) { + defineConduitElement(direction,autoConduitTable[direction].ins,autoConduitTable[direction].outs); +}; \ No newline at end of file