From 4e9ab352df50a6d1453b2ab778c495770bbe6009 Mon Sep 17 00:00:00 2001 From: Evert Date: Sun, 8 Apr 2018 19:36:53 +0300 Subject: [PATCH] Add Solderer block, add items, add crafting recipes --- crafting.lua | 165 ++++++++++++ init.lua | 3 + items.lua | 3 + items/crafting_components.lua | 88 +++++++ mod.conf | 3 +- nodes.lua | 3 + nodes/common.lua | 8 +- nodes/solderer.lua | 238 ++++++++++++++++++ textures/holostorage_adapt_platter.png | Bin 0 -> 399 bytes textures/holostorage_advanced_node.png | Bin 0 -> 326 bytes textures/holostorage_advanced_processor.png | Bin 0 -> 467 bytes textures/holostorage_basic_node.png | Bin 0 -> 299 bytes textures/holostorage_basic_processor.png | Bin 0 -> 458 bytes textures/holostorage_disk_control_circuit.png | Bin 0 -> 441 bytes textures/holostorage_elite_node.png | Bin 0 -> 328 bytes textures/holostorage_elite_platter.png | Bin 0 -> 407 bytes textures/holostorage_elite_processor.png | Bin 0 -> 454 bytes textures/holostorage_nanostorage_platter.png | Bin 0 -> 406 bytes textures/holostorage_quartz_iron.png | Bin 0 -> 470 bytes textures/holostorage_quartz_platter.png | Bin 0 -> 396 bytes textures/holostorage_resistant_platter.png | Bin 0 -> 392 bytes textures/holostorage_silicon.png | Bin 0 -> 504 bytes textures/holostorage_wafer.png | Bin 0 -> 337 bytes 23 files changed, 509 insertions(+), 2 deletions(-) create mode 100644 crafting.lua create mode 100644 items/crafting_components.lua create mode 100644 nodes/solderer.lua create mode 100644 textures/holostorage_adapt_platter.png create mode 100644 textures/holostorage_advanced_node.png create mode 100644 textures/holostorage_advanced_processor.png create mode 100644 textures/holostorage_basic_node.png create mode 100644 textures/holostorage_basic_processor.png create mode 100644 textures/holostorage_disk_control_circuit.png create mode 100644 textures/holostorage_elite_node.png create mode 100644 textures/holostorage_elite_platter.png create mode 100644 textures/holostorage_elite_processor.png create mode 100644 textures/holostorage_nanostorage_platter.png create mode 100644 textures/holostorage_quartz_iron.png create mode 100644 textures/holostorage_quartz_platter.png create mode 100644 textures/holostorage_resistant_platter.png create mode 100644 textures/holostorage_silicon.png create mode 100644 textures/holostorage_wafer.png diff --git a/crafting.lua b/crafting.lua new file mode 100644 index 0000000..d89d95a --- /dev/null +++ b/crafting.lua @@ -0,0 +1,165 @@ +-- Soldering +local solderer_recipes = { + { + input = {"", "default:steel_ingot", ""}, + output = "holostorage:basic_chip", + time = 4, + }, + { + input = {"", "default:gold_ingot", ""}, + output = "holostorage:advanced_chip", + time = 4, + }, + { + input = {"", "default:diamond", ""}, + output = "holostorage:elite_chip", + time = 4, + }, + { + input = {"", "holostorage:silicon", ""}, + output = "holostorage:silicon_wafer", + time = 4, + }, + { + input = {"holostorage:basic_chip", "holostorage:silicon_wafer", "default:mese_crystal"}, + output = "holostorage:basic_processor", + time = 6, + }, + { + input = {"holostorage:advanced_chip", "holostorage:silicon_wafer", "default:mese_crystal"}, + output = "holostorage:advanced_processor", + time = 6, + }, + { + input = {"holostorage:elite_chip", "holostorage:silicon_wafer", "default:mese_crystal"}, + output = "holostorage:elite_processor", + time = 6, + }, + { + input = {"holostorage:elite_chip", "holostorage:grid", "default:mese_crystal"}, + output = "holostorage:crafting_grid", + time = 12, + }, + { + input = {"holostorage:elite_chip", "dye:dark_green", "default:mese_crystal"}, + output = "holostorage:disk_control_circuit", + time = 16, + }, +} + +for _, recipe in pairs(solderer_recipes) do + holostorage.solderer.register_recipe(recipe) +end + +-- Crafting +-- Recipes involving quartz +local quartz = minetest.get_modpath("quartz") ~= nil +if quartz then + minetest.register_craft({ + type = "shapeless", + output = "holostorage:quartz_iron", + recipe = { + "default:steel_ingot", "quartz:quartz_crystal", "quartz:quartz_crystal", "quartz:quartz_crystal" + } + }) + + minetest.register_craft({ + type = "cooking", + output = "holostorage:silicon", + recipe = "holostorage:quartz_iron" + }) +else + minetest.register_craft({ + type = "cooking", + output = "holostorage:silicon", + recipe = "default:desert_sand" + }) +end + +minetest.register_craft({ + output = "holostorage:machine_block", + recipe = { + {"holostorage:quartz_iron", "holostorage:quartz_iron", "holostorage:quartz_iron"}, + {"holostorage:quartz_iron", "", "holostorage:quartz_iron"}, + {"holostorage:quartz_iron", "holostorage:quartz_iron", "holostorage:quartz_iron"} + } +}) + +minetest.register_craft({ + output = "holostorage:solderer", + recipe = { + {"holostorage:quartz_iron", "holostorage:quartz_iron", "holostorage:quartz_iron"}, + {"default:mese_crystal", "holostorage:machine_block", "default:mese_crystal"}, + {"holostorage:quartz_iron", "holostorage:quartz_iron", "holostorage:quartz_iron"} + } +}) + +minetest.register_craft({ + output = "holostorage:disk_drive0", + recipe = { + {"holostorage:quartz_iron", "holostorage:advanced_processor", "holostorage:quartz_iron"}, + {"holostorage:quartz_iron", "holostorage:machine_block", "holostorage:quartz_iron"}, + {"holostorage:quartz_iron", "holostorage:advanced_processor", "holostorage:quartz_iron"} + } +}) + +minetest.register_craft({ + output = "holostorage:grid", + recipe = { + {"holostorage:basic_processor", "holostorage:quartz_iron", "default:glass"}, + {"default:mese_crystal", "holostorage:machine_block", "default:glass"}, + {"holostorage:basic_processor", "holostorage:quartz_iron", "default:glass"} + } +}) + +minetest.register_craft({ + output = "holostorage:cable 16", + recipe = { + {"holostorage:quartz_iron", "holostorage:quartz_iron", "holostorage:quartz_iron"} + } +}) + +minetest.register_craft({ + output = "holostorage:import_bus", + recipe = { + {"holostorage:advanced_processor", "holostorage:cable"}, + {"default:mese_crystal", "holostorage:machine_block"} + } +}) + +minetest.register_craft({ + output = "holostorage:export_bus", + recipe = { + {"holostorage:cable", "holostorage:advanced_processor"}, + {"default:mese_crystal", "holostorage:machine_block"} + } +}) + +minetest.register_craft({ + output = "holostorage:controller", + recipe = { + {"default:mese_crystal", "holostorage:quartz_iron", "default:mese_crystal"}, + {"default:diamond", "holostorage:machine_block", "default:diamond"}, + {"default:mese_crystal", "holostorage:cable", "default:mese_crystal"}, + } +}) + +-- Platters +minetest.register_craft({ + output = "holostorage:quartz_platter", + recipe = { + {"", "holostorage:quartz_iron", ""}, + {"holostorage:quartz_iron", "default:mese_crystal", "holostorage:quartz_iron"}, + {"", "holostorage:quartz_iron", ""}, + } +}) + +-- Disks +minetest.register_craft({ + output = "holostorage:storage_disk1", + recipe = { + {"holostorage:advanced_processor", "holostorage:quartz_platter", "holostorage:advanced_processor"}, + {"holostorage:quartz_platter", "holostorage:elite_processor", "holostorage:quartz_platter"}, + {"holostorage:disk_control_circuit", "holostorage:quartz_iron", "holostorage:disk_control_circuit"}, + } +}) diff --git a/init.lua b/init.lua index 0b11056..33fcd37 100644 --- a/init.lua +++ b/init.lua @@ -15,3 +15,6 @@ dofile(modpath.."/items.lua") -- Nodes dofile(modpath.."/nodes.lua") + +-- Crafting recipes +dofile(modpath.."/crafting.lua") diff --git a/items.lua b/items.lua index 5666a66..adbe047 100644 --- a/items.lua +++ b/items.lua @@ -2,3 +2,6 @@ -- Drives dofile(holostorage.modpath.."/items/storage_disk.lua") + +-- Crafting Components +dofile(holostorage.modpath.."/items/crafting_components.lua") diff --git a/items/crafting_components.lua b/items/crafting_components.lua new file mode 100644 index 0000000..ee71f88 --- /dev/null +++ b/items/crafting_components.lua @@ -0,0 +1,88 @@ + +-- Chips +minetest.register_craftitem("holostorage:basic_chip", { + description = "Basic Processor Chip", + inventory_image = "holostorage_basic_node.png" +}) + +minetest.register_craftitem("holostorage:advanced_chip", { + description = "Advanced Processor Chip", + inventory_image = "holostorage_advanced_node.png" +}) + +minetest.register_craftitem("holostorage:elite_chip", { + description = "Elite Processor Chip", + inventory_image = "holostorage_elite_node.png" +}) + +-- Silicon +minetest.register_craftitem("holostorage:silicon", { + description = "Silicon", + inventory_image = "holostorage_silicon.png", + groups = {silicon = 1} +}) + +minetest.register_craftitem("holostorage:silicon_wafer", { + description = "Silicon Wafer", + inventory_image = "holostorage_wafer.png", + groups = {wafer = 1} +}) + +-- Processors +minetest.register_craftitem("holostorage:basic_processor", { + description = "Basic Processor", + inventory_image = "holostorage_basic_processor.png" +}) + +minetest.register_craftitem("holostorage:advanced_processor", { + description = "Advanced Processor", + inventory_image = "holostorage_advanced_processor.png" +}) + +minetest.register_craftitem("holostorage:elite_processor", { + description = "Elite Processor", + inventory_image = "holostorage_elite_processor.png" +}) + +-- Disk components +minetest.register_craftitem("holostorage:quartz_platter", { + description = "Quartz Platter (1K)", + inventory_image = "holostorage_quartz_platter.png" +}) + +minetest.register_craftitem("holostorage:resistant_platter", { + description = "Resistant Platter (8K)", + inventory_image = "holostorage_resistant_platter.png" +}) + +minetest.register_craftitem("holostorage:adapt_platter", { + description = "Adapt Platter (16K)", + inventory_image = "holostorage_adapt_platter.png" +}) + +minetest.register_craftitem("holostorage:nanostorage_platter", { + description = "Nanostorage Platter (32K)", + inventory_image = "holostorage_nanostorage_platter.png" +}) + +minetest.register_craftitem("holostorage:elite_platter", { + description = "Elite Nanostorage Platter (64K)", + inventory_image = "holostorage_elite_platter.png" +}) + +minetest.register_craftitem("holostorage:disk_control_circuit", { + description = "Disk Control Circuit", + inventory_image = "holostorage_disk_control_circuit.png" +}) + +-- Other +minetest.register_node("holostorage:machine_block", { + description = "Machine Block", + tiles = {"holostorage_machine_block.png"}, + groups = {cracky = 2} +}) + +minetest.register_craftitem("holostorage:quartz_iron", { + description = "Quartz-Enriched Iron", + inventory_image = "holostorage_quartz_iron.png" +}) diff --git a/mod.conf b/mod.conf index 0b8c135..eb76d37 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,4 @@ name = holostorage description = A solution to your hoarding addiction. -depends = default +depends = default, dye +optional_depends = quartz diff --git a/nodes.lua b/nodes.lua index 3956acb..24254f1 100644 --- a/nodes.lua +++ b/nodes.lua @@ -18,6 +18,9 @@ dofile(holostorage.modpath.."/nodes/grid.lua") -- Buses dofile(holostorage.modpath.."/nodes/bus.lua") +-- Solderer +dofile(holostorage.modpath.."/nodes/solderer.lua") + -- Start the network holostorage.network.register_abm_controller("holostorage:controller_active") holostorage.network.register_abm_nodes() diff --git a/nodes/common.lua b/nodes/common.lua index e29fd40..69ae51c 100644 --- a/nodes/common.lua +++ b/nodes/common.lua @@ -4,10 +4,16 @@ holostorage.helpers = {} function holostorage.helpers.swap_node(pos, noded) local node = minetest.get_node(pos) + + if type(noded) ~= "table" then + noded = {name = noded} + end + if node.name == noded.name then - return + return false end minetest.swap_node(pos, noded) + return true end function holostorage.helpers.grid_refresh(pos, n, controller) diff --git a/nodes/solderer.lua b/nodes/solderer.lua new file mode 100644 index 0000000..480cb9f --- /dev/null +++ b/nodes/solderer.lua @@ -0,0 +1,238 @@ +-- Solderer + +holostorage.solderer = {} +holostorage.solderer.recipes = {} + +local box = { + type = "fixed", + fixed = { + {-0.4375, -0.5000, -0.4375, 0.4375, -0.2500, 0.4375}, + {-0.4375, 0.2500, -0.4375, 0.4375, 0.5000, 0.4375}, + {-0.3750, -0.2500, -0.3750, 0.3750, -0.1250, 0.3750}, + {-0.3750, 0.1250, -0.3750, 0.3750, 0.2500, 0.3750}, + {-0.2500, -0.1250, -0.2500, -0.1250, 0.1250, -0.1250}, + {-0.2500, -0.1250, 0.1250, -0.1250, 0.1250, 0.2500}, + {0.1250, -0.1250, 0.1250, 0.2500, 0.1250, 0.2500}, + {0.1250, -0.1250, -0.2500, 0.2500, 0.1250, -0.1250} + } +} + +local collision_box = { + type = "fixed", + fixed = {-1/2.3, -1/2, -1/2.3, 1/2.3, 1/2, 1/2.3}, +} + +local function get_formspec(min, max) + local bar = "image[3.5,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]" + + if min ~= nil then + local percent = math.floor((min/max)*100) + bar = "image[3.5,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (percent)..":gui_furnace_arrow_fg.png^[transformR270]" + end + + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0,0;Solderer]".. + "list[context;src;2.5,0.5;1,3;]".. + bar.. + "list[context;dst;4.5,1.5;1,1;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;src]".. + "listring[context;dst]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +local function allow_metadata_inventory_put (pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + if listname == "dst" then + return 0 + end + + return stack:get_count() +end + +local function allow_metadata_inventory_move (pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take (pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() +end + +local function get_recipe_index(items) + if not items or type(items) ~= "table" then return false end + local l = {} + for i, stack in ipairs(items) do + l[i] = ItemStack(stack):get_name() + end + return table.concat(l, "/") +end + +function holostorage.solderer.register_recipe(data) + for i, stack in ipairs(data.input) do + data.input[i] = ItemStack(stack):to_string() + end + + if type(data.output) == "table" then + for i, v in ipairs(data.output) do + data.output[i] = ItemStack(data.output[i]):to_string() + end + else + data.output = ItemStack(data.output):to_string() + end + + local index = get_recipe_index(data.input) + + holostorage.solderer.recipes[index] = data +end + +function holostorage.solderer.get_recipe(items) + local index = get_recipe_index(items) + local recipe = holostorage.solderer.recipes[index] + if recipe then + local new_input = {} + for i, stack in ipairs(items) do + new_input[i] = ItemStack(stack) + new_input[i]:take_item(1) + end + return {time = recipe.time, + new_input = new_input, + output = recipe.output} + else + return nil + end +end + +local function round(v) + return math.floor(v + 0.5) +end + +local function run_solderer(pos, _, controller) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local machine_node = "holostorage:solderer" + local machine_speed = 1 + + while true do + local result = holostorage.solderer.get_recipe(inv:get_list("src")) + if not result then + local swap = holostorage.helpers.swap_node(pos, machine_node) + if swap then + meta:set_string("infotext", "Solderer Idle") + meta:set_string("formspec", get_formspec()) + meta:set_int("src_time", 0) + end + return + end + meta:set_int("src_time", meta:get_int("src_time") + round(machine_speed * 10)) + holostorage.helpers.swap_node(pos, machine_node.."_active") + meta:set_string("infotext", "Solderer Active") + if meta:get_int("src_time") <= round(result.time*10) then + meta:set_string("formspec", get_formspec(meta:get_int("src_time"), round(result.time*10))) + return + end + local output = result.output + if type(output) ~= "table" then output = { output } end + local output_stacks = {} + for _, o in ipairs(output) do + table.insert(output_stacks, ItemStack(o)) + end + local room_for_output = true + inv:set_size("dst_tmp", inv:get_size("dst")) + inv:set_list("dst_tmp", inv:get_list("dst")) + for _, o in ipairs(output_stacks) do + if not inv:room_for_item("dst_tmp", o) then + room_for_output = false + break + end + inv:add_item("dst_tmp", o) + end + if not room_for_output then + holostorage.helpers.swap_node(pos, machine_node) + meta:set_string("infotext", "Solderer Idle") + meta:set_string("formspec", get_formspec()) + meta:set_int("src_time", round(result.time*10)) + return + end + meta:set_int("src_time", meta:get_int("src_time") - round(result.time*10)) + inv:set_list("src", result.new_input) + inv:set_list("dst", inv:get_list("dst_tmp")) + end +end + +minetest.register_node("holostorage:solderer", { + description = "Solderer", + drawtype = "nodebox", + node_box = box, + is_ground_content = false, + tiles = {"holostorage_machine_block.png"}, + groups = { + cracky = 1, + holostorage_distributor = 1, + holostorage_device = 1, + }, + on_construct = function (pos) + holostorage.network.clear_networks(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", get_formspec()) + + local inv = meta:get_inventory() + inv:set_size("src", 3) + inv:set_size("dst", 1) + end, + on_destruct = holostorage.network.clear_networks, + selection_box = collision_box, + collision_box = collision_box, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + holostorage_run = run_solderer, +}) + +minetest.register_node("holostorage:solderer_active", { + description = "Solderer", + drawtype = "nodebox", + paramtype = "light", + light_source = 8, + node_box = box, + is_ground_content = false, + drop = "holostorage:solderer", + tiles = {"holostorage_machine_block.png"}, + groups = { + cracky = 1, + holostorage_distributor = 1, + holostorage_device = 1, + not_in_creative_inventory = 1, + }, + on_destruct = holostorage.network.clear_networks, + selection_box = collision_box, + collision_box = collision_box, + + holostorage_disabled_name = "holostorage:solderer", + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + holostorage_run = run_solderer, +}) + +holostorage.devices["holostorage:solderer"] = true +holostorage.devices["holostorage:solderer_active"] = true diff --git a/textures/holostorage_adapt_platter.png b/textures/holostorage_adapt_platter.png new file mode 100644 index 0000000000000000000000000000000000000000..cae3bcacb21e4a6fb1a57338b774c9bf2a6d339b GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4MunGE?ix$~KUBAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{Sga?fH>>9#lHDKA=%83h!W@g+}zZ>5+Ij>!MP|k zu_QG`p**uBL&4qCHy}kXl^rPl+0(@_#NzbTNrpj(9e7;l|I6C=k>~k>XM7?%8RivE zv%(m*Eg{pP@Q1%m|24D zjb%aq!~5%(7yR43TwC&5+Ij>!MP|k zu_QG`p**uBL&4qCHy}kXm7Rfs(cII;F~s8Z*-87om>mV$_w!coY!K{jxY{_!C1(;x z(gpSn8^fg!det&*{J^;8i>%6my%9gz#FQ#J6k1}GBO+HUzxVFsTGt}?e|L@sE&uh_ z;C_C3n)tueGgg-_tdh7s@z~p!J0&wWWpN+oygtz_iizR0P=u{67t?h~Q^CUDJ`#l{>5UyRynj@0PVYJfpo#g&`&AfxIv8 zmTUa#>7o^PWTx!yd@IhzbLVjQ5|JCzS1T7}1?6q1sc~G9^zPF%3%!sByn4FXETR=V zWf@}L`#!iq4H&@2Z(4Q4w|EM;adu=kqmcCA<$*(q=|Bw8`@Xe`GKRG496BM?du6{1- HoD!M<_*b*1 literal 0 HcmV?d00001 diff --git a/textures/holostorage_basic_node.png b/textures/holostorage_basic_node.png new file mode 100644 index 0000000000000000000000000000000000000000..22046ee7c91798089c7e38c24d2b064b43a5564b GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~lSIQ#AN2%rdOfk$L9 z0|U1(2s1Lwnj--eWH0gbb!C6V!oe@k{3E$d9w;Q684^+AoS&PUnpXnkGB7w7r6!i7 zrYMwWmSiZnd-?{X=%um)#rr*7978Nlzny5v#jGg6aC}1C{=~QCI)}gRJL3OiR>3~S zh_=leEicVflIWZ8d5!b3m^q1s54V537yiEX?Os9KNH0zYP1fggB=~Ytmx?fGE?qzI zatBXAyqMnQ5Ps&~wRax>vFtER>ZxR3_nF7x+|1*<WFU8GbZ8()Nlj2>E@cM*00AyZL_t(I%gvIpN&`U@ zMbCuUB%olCZrC6zicNxzLBB=|{RFYFF+{M^Pq2xgR_bRMun|NM0x4ErXJHXdCbDCZ z>|(OJTI#LtJnp^o-kX7ci6vh<+7%c0+65E7vZ!5_wlG@=eC@QS0PsA8H{q(F2>f)2 znl*c#Vtcm`i75*~&jBErpOi}yjqQ+K2QbS&r{ zFHDrA%<)-7xZj^27q(uR3J4C~&{|;*P0Ad@7{kU%pTRKVA#aI4K}4pPmNkNelG_2m z-QHaO2&JNeoor*L(*a=fw9m&NV}$r=t}j}Nc-DM-bu>0VTb0{lZMopF07*qoM6N<$g5&G7 A6951J literal 0 HcmV?d00001 diff --git a/textures/holostorage_disk_control_circuit.png b/textures/holostorage_disk_control_circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..2604a506e18135facc64fef1ac97507fe54a11e5 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4MunGE?ix$~KUBAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{Sga?fD~g*!gp(+kZfj1M2T~LZf z(qGlwW^fn2 fP6qxv^#8i}^XZvZotH1SgF?{L)z4*}Q$iB}kqn{j literal 0 HcmV?d00001 diff --git a/textures/holostorage_elite_node.png b/textures/holostorage_elite_node.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac2d749da2e9b60670452d1c656ba4aa801bcc9 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~lSIQ#AN2%rdOfk$L9 z0|U1(2s1Lwnj--eWH0gbb!C6V!ojbo-nz7MGf+r2GbEzKIX^cyHLnE7WngeFN=+aSX9I{dS@u*C7KDhxibIJr05wy*ZrR+vgqJUBSTr zK=%!+jEq%U@rxxF7K+GNc{VpoX2~pBdciDB?EW{!_q8Y5@2hnf3A@bPxL45ZrZhj} ziPDpqdj-xlF0+~4!(eg0G(F{k60=Hc+AjN9>l?e4DPw0gh+nrOR)6oNuRWnGFQ)#lsbF6J(_QS#okQQ-{q_`($D z$p6UErXw%ywIG-1u0q8xDvx}2Y4~MdTzGeDq^e51TqVoD+8b-#Y*#WrxFHw$M*Q1j z*4MvFcUb2637A|IV9DKb=6mt$*bO`HxA>@db3A-DMay%V#Zk_No3GzAeO!OkftjJ@ z#Ho;#hu$Wubo>*3c#rnxO_ zTCKk2;-jKXMx87NUgceFO!wdPDOY$q|80q-f~{OV{vK*VoHHft`}1dOv?N;iEnL)G v_tj(f@z{`6>zeLgt+xO8p`^p^!}}xFP3GpG@-@mp0nXs*>gTe~DWM4fS!?B)nW=Dax`MlNTjIAA+{7aUSGdJ$~hPhj>t^5?MlhfiXpyaqgw8+C`w|KtJBGig)>JaMY-CKR z*w()B(1YAXVLZd!|=4i%Rj_P|{b7o($d6IPG#uA%px`nYW8zW<)E^>UmF{O;5;Qmbw`Gdux zcf^|aUhjX|m*-Z~%k6ezo?52)r$?zjb{8A8&R?sQYj~%8>D4t{cXw@>6>7=1H%4A| u*QeM1J-@;tXEP<_dQI|Jcm3X<^pDJwBPyMF{l2(?g45I0&t;ucLK6UW8?qt* literal 0 HcmV?d00001 diff --git a/textures/holostorage_nanostorage_platter.png b/textures/holostorage_nanostorage_platter.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd743df4d7a636a8354e1628d08f2cbd91295bf GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4MunGE?ix$~KUBAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{Sga?fVk*okyvh^kZfj1M2T~LZf}%WVsZNFB*P*mLmt=psWVOIJ(Rg}r?H89gR#iU z;H3{0OfoMmi=Cx=SkZzZJn=?om#j_Up-D@;uXtX&y!{`?zuFxe+qd17IPmjM;Pu|$ z9~+jf^bHLVJ=3$!_)O0}^J}lyH+LPXi=W+bxZ3f^LamUg$EzO}y=08gi|2N;SDW0) z?r=nK@uVP!PzHnFX|3Dt&M01>wM3*N&^Sh8)rN>YDSG84cRw6m6}0TKW99Bz?W=Q? zS(%cu&VOOWHGM^p9VmD_UHx3vIVCg!03ZdOxBvhE literal 0 HcmV?d00001 diff --git a/textures/holostorage_quartz_iron.png b/textures/holostorage_quartz_iron.png new file mode 100644 index 0000000000000000000000000000000000000000..46eae0d47e5dc550b73c4b32762e4d6612208c78 GIT binary patch literal 470 zcmV;{0V)28P)WFU8GbZ8()Nlj2>E@cM*00BBlL_t(I%iWSqPr^VD zhM#TsP+AkbhyfG1knjVD0w;d^-nbAyBO%-*Q3DuTA~fx`yB=yWMij3)$(&}McP8%) z{E1LXS*4WSRTKL_fL5!8>$*%P695K-f%s9N1l#R4#uxw`$HDVFDwPVu;czP?cY)n* zmn2C@(-a|!8B$8(%`4OCluoC^Xf*oRpalEF&wKuv^T6A(+lIgDcE;#2bZ{8D1$nL5 zw{OPHpB#q`W)$;XkdxHYS)78&qol`;+07w;LV0FMhJw4NZ$OG(Dmzg8ji-xah{frvlMKC?9R*tVe=pPfnP_%BOHrdEAu(O| zAJfK-8#||F2>K+>KQ{ka@6o$!Eq$Ao^64Bl`n>mMrOuz<7uFp*`AUiLlX9hP?WOgs zebb+3O5aXNvt1IAD|o3qLTH<0v1X(0u64{0eij%eCVdX_dKs#!)U<47V)cq=|3r_? z&An`5tdzw3kL$M1t>34v_I>R9`$R78{<`ItS(f^^zUG?QnXAOKGCwQ-7FXXqmm_(? z=kMti+s#j&&Z)w=@;pC#`EK7SEIsdbI|)50D6k}L-$I^{2a|952d h_t#d%(m%={3BL<7-&gm$V=*W|JYD@<);T3K0RUapnb-gT literal 0 HcmV?d00001 diff --git a/textures/holostorage_silicon.png b/textures/holostorage_silicon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca8ec63aadc29a9f7ee3bc04580f05b8321ca19 GIT binary patch literal 504 zcmVWFU8GbZ8()Nlj2>E@cM*00CS{L_t(I%gvJAic?_> zMOTvVoHNrp;IoZrE8~nm@8u}yMM2+9L}_i$muzpOGPdBQ?#np^Lg{`!Hz#zUfpW(=!#N-IbjB7 zv>`BemXDXLZeHnZgX{IJE-x2U3LA~dgRG*BBgzDX%t7#DyFH%MjwBgnB2A15F&J$a z7^0zZV4e?T7G;i<#|B40VOSbgg+(AivtXDm$PyyR+7l9qP66Sfsv|^K5(ELv*{Onk z-;-515EZ8YlkgVo`%KLp6!@}{hXa*GpOapq4Gwmufww?_%c&G;#df=+xzi0QlMpm6 z=;r4=c)EJ2Hcs?PWX3QKK;aH%hT+V+9h;B8T{scxdi_G5+Ij>!MP|k zu_QG`p**uBL&4qCHy}kXl^rO))zif>#NzbXNgMf^4R~DM=WK58{QuvE#p#V=QG1t( zg7U4-sxGDdySrr{yi6*&`F-#1-^)8$JatYVif)`TX?50%Ft3BV*0H z14r)dA6;2iaS1a1%sX$HJWGwKVQy?xL}+4~z(lL=*e%O;b=^K>EituawIaV>?yC7L zQR(IUt#5cHwXC}KIrb{c@4DUVRx<_unPYscFy%)}<-AC*ohA3Sy=926dzvV5Xyx38 a|5u0~@pt@ee>Pzw$Y-9eelF{r5}E)eHGRnd literal 0 HcmV?d00001