From 859be9954de03bade9ff2543fe982c85e33ac541 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Fri, 7 Jan 2022 22:35:12 +0100 Subject: [PATCH] Add first items of the fusion reactor --- fusion_reactor/controller.lua | 78 ++++++++ fusion_reactor/gas_pipe.lua | 2 +- fusion_reactor/magnet.lua | 258 ++++++++++++++++++++++++++ fusion_reactor/plasma.lua | 73 ++++++++ fusion_reactor/shell.lua | 60 ++++++ init.lua | 4 + textures/techage_magnet_hole.png | Bin 0 -> 109 bytes textures/techage_plasma1.png | Bin 0 -> 602 bytes textures/techage_plasma2.png | Bin 0 -> 2626 bytes textures/techage_reactor_shell.png | Bin 0 -> 3257 bytes textures/techage_steel_tiles.png | Bin 0 -> 2625 bytes textures/techage_steel_tiles_side.png | Bin 0 -> 2638 bytes textures/techage_steel_tiles_top.png | Bin 0 -> 2634 bytes textures/techage_steel_tiles_top2.png | Bin 0 -> 2747 bytes 14 files changed, 474 insertions(+), 1 deletion(-) create mode 100644 fusion_reactor/controller.lua create mode 100644 fusion_reactor/magnet.lua create mode 100644 fusion_reactor/plasma.lua create mode 100644 fusion_reactor/shell.lua create mode 100644 textures/techage_magnet_hole.png create mode 100644 textures/techage_plasma1.png create mode 100644 textures/techage_plasma2.png create mode 100644 textures/techage_reactor_shell.png create mode 100644 textures/techage_steel_tiles.png create mode 100644 textures/techage_steel_tiles_side.png create mode 100644 textures/techage_steel_tiles_top.png create mode 100644 textures/techage_steel_tiles_top2.png diff --git a/fusion_reactor/controller.lua b/fusion_reactor/controller.lua new file mode 100644 index 0000000..0c8bc69 --- /dev/null +++ b/fusion_reactor/controller.lua @@ -0,0 +1,78 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Fusion Reactor Controller + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local Cable = techage.ElectricCable +local Pipe = techage.GasPipe +local power = networks.power +local liquid = networks.liquid +local control = networks.control + +minetest.register_node("techage:ta5_fr_controller", { + description = "TA5 Fusion Reactor Controller", + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta5_top.png", + "techage_filling_ta4.png^techage_frame_ta4_bottom.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", + "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", + "techage_filling_ta4.png^techage_frame_ta5.png", + "techage_filling_ta4.png^techage_frame_ta5.png", + }, + after_place_node = function(pos, placer, itemstack) + minetest.get_node_timer(pos):start(2) + Cable:after_place_node(pos) + end, + on_timer = function(pos) + local node = minetest.get_node(pos) or {} + local outdir = networks.side_to_outdir(pos, "R") + local mem = techage.get_mem(pos) + mem.idx = ((mem.idx or 0) + 1) % 4 + local cmnd = ({[0]= "test_plasma", "test_shell", "on", "off"})[mem.idx] + if mem.idx <= 1 then + local resp = control.request( + pos, + Cable, + outdir, + "con", + cmnd) + print(dump(resp)) + else + local resp = control.send( + pos, + Cable, + outdir, + "con", + cmnd) + print(dump(resp)) + end + return true + end, + after_dig_node = function(pos, oldnode) + Cable:after_dig_node(pos) + techage.del_mem(pos) + end, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +power.register_nodes({"techage:ta5_fr_controller"}, Cable, "con", {"L", "R"}) \ No newline at end of file diff --git a/fusion_reactor/gas_pipe.lua b/fusion_reactor/gas_pipe.lua index 60cdcd6..2f11245 100644 --- a/fusion_reactor/gas_pipe.lua +++ b/fusion_reactor/gas_pipe.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information diff --git a/fusion_reactor/magnet.lua b/fusion_reactor/magnet.lua new file mode 100644 index 0000000..38f899b --- /dev/null +++ b/fusion_reactor/magnet.lua @@ -0,0 +1,258 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Fusion Reactor Magnet + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local Cable = techage.ElectricCable +local Pipe = techage.GasPipe +local power = networks.power +local liquid = networks.liquid +local control = networks.control +local tubelib2_get_pos = tubelib2.get_pos +local tubelib2_side_to_dir = tubelib2.side_to_dir + +local CAPACITY = 20 +local SHELLBLOCKS = {"techage:ta5_fr_shell1", "techage:ta5_fr_shell2"} + +local function get_pos(pos, sides, param2) + local pos1 = {x = pos.x, y = pos.y, z = pos.z} + for side in sides:gmatch"." do + pos1 = tubelib2_get_pos(pos1, tubelib2_side_to_dir(side, param2)) + end + return pos1 +end + +minetest.register_node("techage:ta5_magnet1", { + description = S("TA5 Fusion Reactor Magnet 1"), + tiles = { + -- up, down, right, left, back, front + "techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top.png^[transformR180]", + "techage_collider_magnet.png^techage_steel_tiles_top.png", + "techage_collider_magnet.png^techage_steel_tiles_side.png", + "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]", + "techage_collider_magnet.png^techage_appl_hole_electric.png", + "techage_steel_tiles.png", + }, + after_place_node = function(pos, placer, itemstack) + Pipe:after_place_node(pos) + Cable:after_place_node(pos) + end, + ta_rotate_node = function(pos, node, new_param2) + Pipe:after_dig_node(pos) + Cable:after_dig_node(pos) + minetest.swap_node(pos, {name = node.name, param2 = new_param2}) + Pipe:after_place_node(pos) + Cable:after_place_node(pos) + end, + after_dig_node = function(pos, oldnode) + Pipe:after_dig_node(pos) + Cable:after_dig_node(pos) + techage.del_mem(pos) + end, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:ta5_magnet2", { + description = S("TA5 Fusion Reactor Magnet 2"), + tiles = { + -- up, down, right, left, back, front + "techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top2.png^[transformR180]", + "techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top2.png^[transformR270]", + "techage_steel_tiles.png", + "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]", + "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png", + "techage_steel_tiles.png", + }, + after_place_node = function(pos, placer, itemstack) + Pipe:after_place_node(pos) + Cable:after_place_node(pos) + end, + ta_rotate_node = function(pos, node, new_param2) + Pipe:after_dig_node(pos) + Cable:after_dig_node(pos) + minetest.swap_node(pos, {name = node.name, param2 = new_param2}) + Pipe:after_place_node(pos) + Cable:after_place_node(pos) + end, + after_dig_node = function(pos, oldnode) + Pipe:after_dig_node(pos) + Cable:after_dig_node(pos) + techage.del_mem(pos) + end, + drawtype = "nodebox", + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:ta5_magnet3", { + description = S("TA5 Fusion Reactor Magnet 3"), + drawtype = "nodebox", + tiles = { + -- up, down, right, left, back, front + "techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top.png^[transformR180]", + "techage_collider_magnet.png^techage_steel_tiles_top.png", + "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png", + "techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]", + "techage_magnet_hole.png", + "techage_steel_tiles.png", + }, + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, 8/16, 2/16}, + {-8/16, -8/16, 2/16, -2/16, 8/16, 8/16}, + { 2/16, -8/16, 2/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, 2/16, 8/16, -2/16, 8/16}, + {-8/16, 2/16, 2/16, 8/16, 8/16, 8/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + after_place_node = function(pos, placer, itemstack) + Pipe:after_place_node(pos) + Cable:after_place_node(pos) + end, + ta_rotate_node = function(pos, node, new_param2) + Pipe:after_dig_node(pos) + Cable:after_dig_node(pos) + minetest.swap_node(pos, {name = node.name, param2 = new_param2}) + Pipe:after_place_node(pos) + Cable:after_place_node(pos) + end, + after_dig_node = function(pos, oldnode) + Pipe:after_dig_node(pos) + Cable:after_dig_node(pos) + techage.del_mem(pos) + end, + drawtype = "nodebox", + paramtype2 = "facedir", + paramtype = "light", + use_texture_alpha = "blend", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +power.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, Cable, "con", {"L", "B"}) +power.register_nodes({"techage:ta5_magnet3"}, Cable, "con", {"L", "R"}) +liquid.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2", "techage:ta5_magnet3"}, Pipe, "tank", {"U"}, { + capa = CAPACITY, + peek = function(pos, indir) + local nvm = techage.get_nvm(pos) + return liquid.srv_peek(nvm) + end, + put = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + return liquid.srv_put(nvm, name, amount, CAPACITY) + end, + take = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + return liquid.srv_take(nvm, name, amount) + end, + untake = function(pos, indir, name, amount) + local nvm = techage.get_nvm(pos) + liquid.srv_put(nvm, name, amount, CAPACITY) + end, +}) + +local function check_plasma(pos, param2) + local pos1 = get_pos(pos, "F", param2) + local node = minetest.get_node(pos1) or {} + techage.mark_position("singleplayer", pos1, "pos1", nil, 2) + return node.name == "techage:plasma1" or node.name == "techage:plasma2" +end + +local function swap_plasma(pos, name, param2) + local pos1 = get_pos(pos, "F", param2) + minetest.swap_node(pos1, {name = name, param2 = param2}) +end + +local function check_steel(pos, param2) + local pos1 = get_pos(pos, "D", param2) + local pos2 = get_pos(pos, "BU", param2) + local _,t = minetest.find_nodes_in_area(pos1, pos2, SHELLBLOCKS) + local cnt = 0 + for k,v in pairs(t) do + cnt = cnt + v + end + print("shell", cnt) + return cnt == 5 +end + +local function on_receive(pos, tlib2, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "on" then + nvm.running = true + elseif topic == "off" then + nvm.running = false + end +end + +local function on_receive3(pos, tlib2, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == "on" then + nvm.running = true + local node = minetest.get_node(pos) or {} + swap_plasma(pos, "techage:plasma2", node.param2) + elseif topic == "off" then + nvm.running = false + local node = minetest.get_node(pos) or {} + swap_plasma(pos, "techage:plasma1", node.param2) + end +end + +local function on_request(pos, tlib2, topic) + local nvm = techage.get_nvm(pos) + if topic == "state" then + if not nvm.liquid or not nvm.liquid.amount or nvm.liquid.amount < CAPACITY then + return false, "no gas" + elseif nvm.liquid.name ~= "techage:isobutane" then + return false, "wrong gas" + elseif nvm.running then + return false, "stopped" + end + return true, "running" + elseif topic == "test_plasma" then + local node = minetest.get_node(pos) or {} + return check_plasma(pos, node.param2) + elseif topic == "test_shell" then + local node = minetest.get_node(pos) or {} + return check_steel(pos, node.param2) + end + return false +end + +control.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, { + on_receive = on_receive, + on_request = on_request, + } +) + +control.register_nodes({"techage:ta5_magnet3"}, { + on_receive = on_receive3, + on_request = on_request, + } +) diff --git a/fusion_reactor/plasma.lua b/fusion_reactor/plasma.lua new file mode 100644 index 0000000..8f0ca57 --- /dev/null +++ b/fusion_reactor/plasma.lua @@ -0,0 +1,73 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Fusion Reactor Plasma + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +local MAGNETS = {"techage:ta5_magnet1", "techage:ta5_magnet2", "techage:ta5_magnet3"} + +minetest.register_node("techage:plasma2", { + description = "TA5 Plasma", + tiles = { + "techage_plasma1.png", + "techage_plasma1.png", + "techage_plasma1.png", + "techage_plasma1.png", + { + image = "techage_plasma2.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 64, + aspect_h = 64, + length = 0.5, + }, + }, + "techage_plasma1.png", + }, + node_box = { + type = "fixed", + fixed = { + {-8/16, -4/16, -4/16, 8/16, 4/16, 4/16}, + }, + }, + drawtype = "nodebox", + paramtype2 = "facedir", + paramtype = "light", + light_source = 14, + drop = "", + use_texture_alpha = "blend", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:plasma1", { + description = "TA5 Plasma", + tiles = { + "techage_plasma1.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + paramtype = "light", + light_source = 0, + drop = "", + use_texture_alpha = "blend", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) diff --git a/fusion_reactor/shell.lua b/fusion_reactor/shell.lua new file mode 100644 index 0000000..e10f33d --- /dev/null +++ b/fusion_reactor/shell.lua @@ -0,0 +1,60 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + TA5 Fusion Reactor Shell + +]]-- + +-- for lazy programmers +local S2P = minetest.string_to_pos +local P2S = minetest.pos_to_string +local M = minetest.get_meta +local S = techage.S + +minetest.register_node("techage:ta5_fr_shell1", { + description = "TA5 Fusion Reactor Shell 1", + tiles = { + "techage_reactor_shell.png", + }, + drawtype = "nodebox", + paramtype2 = "facedir", + paramtype = "light", + use_texture_alpha = "blend", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:ta5_fr_shell2", { + description = "TA5 Fusion Reactor Shell 2", + tiles = { + "techage_reactor_shell.png", + }, + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, -2/16, 8/16, 8/16}, + { 2/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, 8/16, -2/16, 8/16}, + {-8/16, 2/16, -8/16, 8/16, 8/16, 8/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + drawtype = "nodebox", + paramtype2 = "facedir", + paramtype = "light", + use_texture_alpha = "blend", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) diff --git a/init.lua b/init.lua index accd883..4e1141d 100644 --- a/init.lua +++ b/init.lua @@ -398,7 +398,11 @@ dofile(MP.."/collider/worker.lua") dofile(MP.."/teleport/teleport_tube.lua") dofile(MP.."/teleport/teleport_pipe.lua") +dofile(MP.."/fusion_reactor/shell.lua") dofile(MP.."/fusion_reactor/gas_pipe.lua") +dofile(MP.."/fusion_reactor/magnet.lua") +dofile(MP.."/fusion_reactor/plasma.lua") +dofile(MP.."/fusion_reactor/controller.lua") -- Prevent other mods from using IE techage.IE = nil diff --git a/textures/techage_magnet_hole.png b/textures/techage_magnet_hole.png new file mode 100644 index 0000000000000000000000000000000000000000..5e00e1e66a11d994636786bcc93cb26e814148a8 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NO08UGa+FE|MHowh z{DK)Ap4~_Tazs5{978y+C;#AQ;SmwEfAUdKM2eq5$F)kF`4@)@PyvIdtDnm{r-UW| D*xwl+ literal 0 HcmV?d00001 diff --git a/textures/techage_plasma1.png b/textures/techage_plasma1.png new file mode 100644 index 0000000000000000000000000000000000000000..52d5561242e704ff392d86b8fa51af2836a1bd84 GIT binary patch literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFt%noI|q0=J1Z0v<)>xlq%tsQ zOst(~>v1?hq}4xoX_S^ynLy!*fVnyyT^3oQT>*+$xYk)7^x65h=SJMOjj>VHFFY2CB5g(Kx__+1>Z;SWy4p)C?blQ8yWOXvng_7Go>cUB8 z+m+hl1RXePU${l2O*7Q?)ckSnx@~Fj-J_M$>hI6Ly7-wc8;i>$$+Q_}AFV!KS(aOH zPrYx`q%}hGh5KifI6iV;r!BX?P;Zychchc?dY%__?>w3$t(|+uYnhvkr%bTv+)u4* zj%z*FJr}j})U5AM^n0FseX6?dvXqk$cSH+|AlIrJ4w7b%w!B^v;c>b0&~f`0zf_Af zpWI?lK5nCRL1A~@2m2qk(W?y%->JF^IXv%vT*Je>Fm^#;@tpU`$1~?J987=UmH$(_ zG~w6eFHzpzvW$CgA2?d-9sI4~v~0qIlM{SzPHo!K;>1{Czc~LC|R})_y3#8^Y6@em5Q>@XvgsaWG zgtNdSvY3HEPZ@+6E0)@q0R`DhJbhi+pE0rvu`>xxK71G`Bw6AbQR1ARo12?fJTWi6 g@WoL>MikJmdKI;Vst0DZIY@Bjb+ literal 0 HcmV?d00001 diff --git a/textures/techage_plasma2.png b/textures/techage_plasma2.png new file mode 100644 index 0000000000000000000000000000000000000000..1758822e65fda12bba40205e525adb6e16df7824 GIT binary patch literal 2626 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 literal 0 HcmV?d00001 diff --git a/textures/techage_reactor_shell.png b/textures/techage_reactor_shell.png new file mode 100644 index 0000000000000000000000000000000000000000..0467b92a3560799b2aa72e19b715e6ff958f1a27 GIT binary patch literal 3257 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 literal 0 HcmV?d00001 diff --git a/textures/techage_steel_tiles.png b/textures/techage_steel_tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..270dec7c563406ca36e331b0af557eb71eaeb8bf GIT binary patch literal 2625 zcmV-H3cmG;P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b@mg6W4{Ld-&2u2`2jw2Afw>Q}1Z%KA%l1z6` zGBa_#C`(n~q;$vt-xT(sl-bU()<``JHqJ;MFNc(^?v z3?=-g^R~)mFBs<^6Fz*z@i-pZ^@Q5BP&^)7C-ZFAdLJal=^T&wTBxt{qV!hpLmk&b z^D^{Mu5Z4Db^h3Wco?WaNg0k3(MmBLer{(3$-a~XztPW??5g29CJsJSuEhYz!}dOY zkK-Po2arFm!ZZ4}t0(YDuJQDQWw|iI#itJ zzA>jpwA|%xp3tcxU-a0a^X@+EhchOQ_YoY zskOG+tF+W|<5pU2t@S3IdV&UWFTM8Gdl#V~a3okuU@sUMG}6d}M;Udr(T7Z=&&-o& znRT|=rzmMs$b=TH+O(^z7#5Ub<;AP4y4vbXHgavJoj32Y>u$Smxv_S!`qS|SYw==@ zoGG)bH`Xv3YW-Lunw+q42F55yFkX!TBs3XkM~gX=F=w0|olq1^2$GGPpwSoug?UBd z9dF$IVD2T}0=JiVqhB!>jJm(UTmW@H^Y#gAYJF}xV`mi_rbj~cZHE6622juitFiNv zIT0IrSdpRyC4dfCw$?th0t&=ooii%(eReJzk9kW4CLG*$0M9|#cSDm|W9k|rvbf-0 zk0nu7mI22HZA~%~xhYE@Kp3c_XvfB$HY;+N5O| zzEw|ovHwO5F4u1ZjaW85MQkT$l|_I)s*@UW4)$ZcjrrWfEW3xr~ItaLXe z{KlM5r-a{_^E?H^ngf@_jsq!i%$5O%rqYCc8L$m_=fI6H?7uV*Z`yxp9$vI>gfj@m zwvlkeU{4e^gC|Iximla?F<9V_tO$}UOhcvWa5NgS7io_tB-A%Y^|UgBZN9J;Dk^;I z<_$05Yd6Scl37H%I|X@UrBWCwOzcjeYsx^0so_PdbA?cas-uZRG%YCN0(I$UvKS%J`J0w4m5mUqJCuo-n4gRw z;{Zu8eK@!vx3EGx%?gSzBMHg(WN4wbPEBJ*B+wj-RAoJ)~ks7E$Ce9Fue39U`L;nd9Uj7}BdImo)4M!2r86acXg7$ajwgyRgONFZP@u zr0Y~r5da)a(FA2D^tW-R(T1_?pgeC3)1O_r?s)XgzIM9r^ z#$j02lF*7~QIBkGPn)^X4(vY`=wf6@^>m#oBTw^zT7&6COEm8unl32g=DxEvAn>sS z+#|zG89_7{(6wurLN^1+~ZGWY;1qA)n+KzX1 z-(^3X_5J6)Ekti+f8N`IHMehiTTx$X+diP6C}&fy0*X+PVr-HEX4Y^i?|x&>r&Gdj z%=vUmc$#Cn*jyJ42kU9nO){cbI*(HoQ9HRtE ztj8+nEzVlG%9{7&FO1~%!esn(|N+jKj``;aw+86 z03*jdD$pRie(*o|JzJ|VG43Tr5+5`g?%V+o!ax`TeczMYecQH=aFk_12m$9k0N#6YyPwTwm>B>fLNr4~5dr5Mx!s@7 zXYMDZL~(oFC0;n4PLySt)%7})K-;#cD$cpvuEJz8A-8)oqbLeQ1T!PX$S@3~bPY~! z_f=Ir0&)ME`@G6;CC<65t}(`II4+4og?NdNdBsa4w`*P3q?FkFTJxvtQ0Msg_yE9p zM{bwJVv(ArA%>n1!P0e206sqt0OWL8E|+P)-}CQj+m^bnF*BN`A*ajO2gW`y_JOev jjD2A217jcf@B6@CR}_5Mu@Jcw00000NkvXXu0mjf7O2iJ literal 0 HcmV?d00001 diff --git a/textures/techage_steel_tiles_side.png b/textures/techage_steel_tiles_side.png new file mode 100644 index 0000000000000000000000000000000000000000..adfb27b30662249688647e8411562ac1b04982c2 GIT binary patch literal 2638 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 literal 0 HcmV?d00001 diff --git a/textures/techage_steel_tiles_top.png b/textures/techage_steel_tiles_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d96c7fa35ff4e9b50d501d4b65d5a636f89be8 GIT binary patch literal 2634 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 literal 0 HcmV?d00001 diff --git a/textures/techage_steel_tiles_top2.png b/textures/techage_steel_tiles_top2.png new file mode 100644 index 0000000000000000000000000000000000000000..f46b9b1373a1e6ca951192d087de9ea8e341af66 GIT binary patch literal 2747 zcmV;s3PkmZP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxmLsVS{AU%jghU_&%Ml39nH}8aPl!yrT@QEJ zecM@nBri!3QYb6T|NXndKX_4z6f#RKt&{_=+;Stuk9wT1wm;*M_ve1mHHG^RuY=k=f0S0`(bayr zI+o8lc6;DmZF1He=bZxJXh{XI7&<$OFV=~Vg!yA1SveHl&OP($V>(&DW_B@ z2vu_1*duYTC8k0?3~d4toJtaK(~^R$oEiBexgv*@6K7^FEL;OO){;stTuPDRBBzoh z3ri7^DowPenk&~*rPkW2HfjkP$gMPKwY8>7L19R7mSVkPq*G5lckZQ2uf260NS~1h zk1}M`(S{mXGRTA#6RXxtXABccG4teErp!9q)P-DIY30SMELnB6rFYgYR=-?tuof@Y zXfx&OUMfHYOF@6>K(iB~u4pl{51TNdlMC+c zm>P9v?FjpzWl4LYy_B_e;0w&rc2__|i;Y>RV_;U{!-SZ-;Z|ldZf&nsAfiK0pAl>l zod^j`9mkwAXyww}JGk8ji)K!aKW_OPNahW+@mO5U1Q6pS95Q>HohN)7lX@^BSVi+W z;Ixkz+`=(gr)V#;1AK%Jlu+V}b-CXXdA0~tE8>mD7(i%sWgJ5cTinGBGwA zm8?{8Kn1QyMg*egfT%xtkejj|+%UZBRTV%1$?20wGtv&0{87Nug|Ua&dF?=0;1+`t z+ir_*34gHX+b!V__I%o6;7TkM;xe$1j5uabfx}X%${TRd4U|U54I;P9C2{HBEe~(5 zf4V%pwtjjYBV|2zc4&k-6b&8{kOE>^!kJyD4E&K-LDE@4=>nx#*Kn+Mk;-L<%yX$tb}J~W}hAmQ>VF4K%wpgY-q3$G~WT9#0!j3e__KFH@Z$9 zbkX7Rxfm&4*PQrfZ zP|NJ~JD|MSU3a2&lxT+P1h0D3ETjd|wzStZl&_(Dj}sP;eM;IYgD{FNSaN5mOW6m( zY(UHjdZDN@mjL+13F06+PFhhuq&AjdPNNM(@0pI|!yFV8is714fEg-eYXKQ}Wz%pf@7m8f?)M9OzTFc3V9&Q(!pA*x zc(3gMry$c}aar7oQBWZGk727Kdxt5E8$K%ymCj+lxBlt!@aFo5<$}ydrK_jT85(4$ zplXm{?5eg^+A+by;qo$Z{SnBq*Rr{;cYh>C-un!@GC_5Nr-!dtp6Xlt?bw3TWrO~z zmGE0LpR5S49ZWl)9zL{#@UsiCKZztYqYZFthu(y5EMAMGvi$8rAP zgpKjfT3a|H|NmQCK%CE7Tf#p%(DK3FMt-aO5dQF>{D9!<-lMp z+rmFtE&Kfqw6tAnc`2>yULIyou2 zNQw6)g%&Yhc)XAE?m4`7A0X7rOtU&h0Zq5fbTT1kb1P!#6#;}0!8CegW*M`Rl!9-4 z-BUN!U7Tn6_x)MDYTjZ%KqQ`FhG`S86Hjj12Iqa^C@aY-@j3B`Nf#u3#t9I72Cnp$zfuRLK1r{&wAc~Qw+&oew=`uBxZDBypA6ZQT`5RQ zC=`JAGy0|+5V-}qSG~D4&vE(yWN22Y8{ps&7%o!wn$Nqt+UNFfPjh}hUjK5R;w}`w z00006VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru<^cy3 z0v`x(C+z?L0kla(K~z}7?bbnV+CUV5;s3oEXo!qRSIwqbTS{+{vvLOz zeF%ZSO(V%N*KFS%LE4$sUsOxbikq`oU`l{nyh0DuJO1lRb3@B^6{DgY&L5E>bjw^?-bI5775O-vfOQ^gYn`K;Hv>4}4S){0Cw!u4p7YL8$-$002ovPDHLkV1j$y B9V-9; literal 0 HcmV?d00001