From 9b0c84c4d7cb5565b71e4602ede87a8d4b16ba63 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sat, 8 Jun 2019 22:57:01 +0200 Subject: [PATCH] oil tower added --- basic_machines/blackhole.lua | 2 +- basic_machines/chest.lua | 2 +- basic_machines/legacy_nodes.lua | 6 +- basis/assemble.lua | 130 +++++++++++ basis/command.lua | 86 ++++--- basis/consumer.lua | 2 +- basis/firebox_lib.lua | 38 ++- basis/lib.lua | 11 + coal_power_station/boiler_base.lua | 15 +- coal_power_station/boiler_top.lua | 38 +-- coal_power_station/cooler.lua | 34 +-- coal_power_station/firebox.lua | 44 +++- coal_power_station/generator.lua | 22 +- coal_power_station/turbine.lua | 64 ++++-- init.lua | 3 + iron_age/gravelsieve.lua | 2 +- iron_age/hopper.lua | 2 +- oil/drillbox.lua | 317 ++++++++++++++++++++++++++ oil/explore.lua | 27 ++- oil/oilpump.lua | 31 +++ oil/tower.lua | 283 +++++++++++++++++++++++ power/power.lua | 22 -- sounds/techage_oildrill.ogg | Bin 0 -> 29458 bytes steam_engine/boiler.lua | 25 +- steam_engine/cylinder.lua | 28 ++- steam_engine/firebox.lua | 62 ++++- textures/techage_appl_oildrill.png | Bin 0 -> 233 bytes textures/techage_oil_drill.png | Bin 0 -> 946 bytes textures/techage_oil_drillbit.png | Bin 0 -> 299 bytes textures/techage_oil_drillbit_inv.png | Bin 0 -> 863 bytes textures/techage_oil_tower1.png | Bin 0 -> 437 bytes textures/techage_oil_tower2.png | Bin 0 -> 769 bytes textures/techage_oil_tower3.png | Bin 0 -> 550 bytes textures/techage_oil_tower4.png | Bin 0 -> 485 bytes textures/techage_oil_tower_inv.png | Bin 0 -> 45974 bytes textures/techage_oil_tower_top.png | Bin 0 -> 596 bytes 36 files changed, 1126 insertions(+), 170 deletions(-) create mode 100644 basis/assemble.lua create mode 100644 oil/drillbox.lua create mode 100644 oil/oilpump.lua create mode 100644 oil/tower.lua create mode 100644 sounds/techage_oildrill.ogg create mode 100644 textures/techage_appl_oildrill.png create mode 100644 textures/techage_oil_drill.png create mode 100644 textures/techage_oil_drillbit.png create mode 100644 textures/techage_oil_drillbit_inv.png create mode 100644 textures/techage_oil_tower1.png create mode 100644 textures/techage_oil_tower2.png create mode 100644 textures/techage_oil_tower3.png create mode 100644 textures/techage_oil_tower4.png create mode 100644 textures/techage_oil_tower_inv.png create mode 100644 textures/techage_oil_tower_top.png diff --git a/basic_machines/blackhole.lua b/basic_machines/blackhole.lua index 2abf82b..4babc71 100644 --- a/basic_machines/blackhole.lua +++ b/basic_machines/blackhole.lua @@ -49,7 +49,7 @@ minetest.register_craft({ }, }) -techage.register_node("techage:blackhole", {}, { +techage.register_node({"techage:blackhole"}, { on_pull_item = nil, -- not needed on_unpull_item = nil, -- not needed diff --git a/basic_machines/chest.lua b/basic_machines/chest.lua index fb83429..bb447aa 100644 --- a/basic_machines/chest.lua +++ b/basic_machines/chest.lua @@ -230,7 +230,7 @@ minetest.register_node("techage:chest_ta4", { sounds = default.node_sound_wood_defaults(), }) -techage.register_node("techage:chest_ta2", {"techage:chest_ta3", "techage:chest_ta4"}, { +techage.register_node({"techage:chest_ta2", "techage:chest_ta3", "techage:chest_ta4"}, { on_pull_item = function(pos, in_dir, num) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() diff --git a/basic_machines/legacy_nodes.lua b/basic_machines/legacy_nodes.lua index 121807f..8984c29 100644 --- a/basic_machines/legacy_nodes.lua +++ b/basic_machines/legacy_nodes.lua @@ -31,7 +31,7 @@ local function is_owner(pos, meta) end -techage.register_node("default:chest", {"default:chest_open"}, { +techage.register_node({"default:chest", "default:chest_open"}, { on_pull_item = function(pos, in_dir, num) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -49,7 +49,7 @@ techage.register_node("default:chest", {"default:chest_open"}, { end, }) -techage.register_node("default:chest_locked", {"default:chest_locked_open"}, { +techage.register_node({"default:chest_locked", "default:chest_locked_open"}, { on_pull_item = function(pos, in_dir, num) local meta = minetest.get_meta(pos) if is_owner(pos, meta) then @@ -69,7 +69,7 @@ techage.register_node("default:chest_locked", {"default:chest_locked_open"}, { end, }) -techage.register_node("default:furnace", {"default:furnace_active"}, { +techage.register_node({"default:furnace", "default:furnace_active"}, { on_pull_item = function(pos, in_dir, num) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() diff --git a/basis/assemble.lua b/basis/assemble.lua new file mode 100644 index 0000000..b0fd1ec --- /dev/null +++ b/basis/assemble.lua @@ -0,0 +1,130 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + Assemble routines + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +-- Load support for intllib. +local MP = minetest.get_modpath("techage") +local I,_ = dofile(MP.."/intllib.lua") + +techage.assemble = {} + +local Face2Dir = {[0]= + {x=0, y=0, z=1}, + {x=1, y=0, z=0}, + {x=0, y=0, z=-1}, + {x=-1, y=0, z=0}, + {x=0, y=-1, z=0}, + {x=0, y=1, z=0} +} + +-- Determine the destination position based on the base position, +-- param2, and a route table like : {0,3} +-- 0 = forward, 1 = right, 2 = backward, 3 = left +local function dest_pos(pos, param2, route, y_offs) + local p2 = param2 + local pos1 = {x=pos.x, y=pos.y+y_offs, z=pos.z} + for _,dir in ipairs(route) do + p2 = (param2 + dir) % 4 + pos1 = vector.add(pos1, Face2Dir[p2]) + end + return pos1, p2 +end + + +-- timer based function +local function build(pos, param2, AssemblyPlan, idx) + local item = AssemblyPlan[idx] + if item ~= nil then + local y, path, fd_offs, node_name = item[1], item[2], item[3], item[4] + local pos1 = dest_pos(pos, param2, path, y) + minetest.add_node(pos1, {name=node_name, param2=(param2 + fd_offs) % 4}) + minetest.after(0.5, build, pos, param2, AssemblyPlan, idx+1) + else + local mem = tubelib2.get_mem(pos) + mem.assemble_locked = false + end +end + +-- timer based function +local function remove(pos, param2, AssemblyPlan, idx) + local item = AssemblyPlan[idx] + if item ~= nil then + local y, path = item[1], item[2] + local pos1 = dest_pos(pos, param2, path, y) + minetest.remove_node(pos1) + minetest.after(0.5, remove, pos, param2, AssemblyPlan, idx-1) + else + local mem = tubelib2.get_mem(pos) + mem.assemble_locked = false + end +end + +local function check_space(pos, param2, AssemblyPlan, player_name) + for _,item in ipairs(AssemblyPlan) do + local y, path, node_name = item[1], item[2], item[4] + pos1 = dest_pos(pos, param2, path, y) + if minetest.is_protected(pos1, player_name) then + minetest.chat_send_player(player_name, I("Area is protected!")) + return false + end + + local ndef = minetest.registered_nodes[minetest.get_node(pos1).name] + --print(dump(ndef)) + if not ndef or ndef.walkable then + minetest.chat_send_player(player_name, I("Not enough space!")) + return false + end + end + return true +end + + +-- Two important flags: +-- 1) mem.assemble_locked is true while the object is being assembled/disassembled +-- 2) mem.assemble_build is true if the object is assembled +function techage.assemble.build(pos, AssemblyPlan, player_name) + -- check protection + if minetest.is_protected(pos, player_name) then + return + end + local mem = tubelib2.get_mem(pos) + if mem.assemble_locked then + return + end + local node = minetest.get_node(pos) + if check_space(pos, node.param2, AssemblyPlan, player_name) then + mem.assemble_locked = true + build(pos, node.param2, AssemblyPlan, 1) + mem.assemble_build = true + end +end + +function techage.assemble.remove(pos, AssemblyPlan, player_name) + -- check protection + if minetest.is_protected(pos, player_name) then + return + end + local mem = tubelib2.get_mem(pos) + if mem.assemble_locked then + return + end + local node = minetest.get_node(pos) + mem.assemble_locked = true + remove(pos, node.param2, AssemblyPlan, #AssemblyPlan) + mem.assemble_build = false +end diff --git a/basis/command.lua b/basis/command.lua index 324e364..4012e41 100644 --- a/basis/command.lua +++ b/basis/command.lua @@ -31,7 +31,6 @@ local function update_mod_storage() storage:set_string("NextNumber", minetest.serialize(NextNumber)) storage:set_string("Version", minetest.serialize(Version)) storage:set_string("Number2Pos", minetest.serialize(Number2Pos)) - storage:set_string("Key2Number", nil) -- not used any more -- store data each hour minetest.after(60*59, update_mod_storage) minetest.log("action", "[TechAge] Data stored") @@ -47,12 +46,17 @@ minetest.after(60*59, update_mod_storage) -- Key2Number will be generated at runtine local Key2Number = {} -local Name2Name = {} -- translation table - ------------------------------------------------------------------- -- Local helper functions ------------------------------------------------------------------- +local function in_list(list, x) + for _, v in ipairs(list) do + if v == x then return true end + end + return false +end + -- Localize functions to avoid table lookups (better performance). local string_split = string.split local NodeDef = techage.NodeDef @@ -97,9 +101,8 @@ local function register_lbm(name, nodenames) nodenames = nodenames, run_at_every_load = true, action = function(pos, node) - local name = Name2Name[node.name] - if NodeDef[name] and NodeDef[name].on_node_load then - NodeDef[name].on_node_load(pos) + if NodeDef[node.name] and NodeDef[node.name].on_node_load then + NodeDef[node.name].on_node_load(pos) end end }) @@ -134,13 +137,13 @@ end local function get_next_node(pos, out_dir) local res, npos, node = Tube:compatible_node(pos, out_dir) local in_dir = tubelib2.Turn180Deg[out_dir] - return res, npos, in_dir, Name2Name[node.name] or node.name + return res, npos, in_dir, node.name end local function get_dest_node(pos, out_dir) local spos, in_dir = Tube:get_connected_node_pos(pos, out_dir) local _,node = Tube:get_node(spos) - return spos, in_dir, Name2Name[node.name] or node.name + return spos, in_dir, node.name end local function item_handling_node(name) @@ -245,8 +248,7 @@ end -- Register node for techage communication -- Call this function only at load time! --- Param name: The node name like "techage:pusher" --- Param add_names: Alternativ node names if needded, e.g.: "techage:pusher_active" +-- Param names: List of node names like {"techage:pusher_off", "techage:pusher_on"} -- Param node_definition: A table according to: -- { -- on_pull_item = func(pos, in_dir, num), @@ -255,31 +257,24 @@ end -- on_recv_message = func(pos, topic, payload), -- on_node_load = func(pos), -- LBM function -- on_node_repair = func(pos), -- repair defect (feature!) nodes +-- on_transfer = func(pos, in_dir, topic, payload), -- } -function techage.register_node(name, add_names, node_definition) - NodeDef[name] = node_definition +function techage.register_node(names, node_definition) -- store facedir table for all known node names - Name2Name[name] = name - for _,n in ipairs(add_names) do - Name2Name[n] = name + for _,n in ipairs(names) do + NodeDef[n] = node_definition end if node_definition.on_pull_item or node_definition.on_push_item or node_definition.is_pusher then - Tube:add_secondary_node_names({name}) - Tube:add_secondary_node_names(add_names) + Tube:add_secondary_node_names(names) - techage.KnownNodes[name] = true - for _,n in ipairs(add_names) do + for _,n in ipairs(names) do techage.KnownNodes[n] = true end end -- register LBM if node_definition.on_node_load then - local nodenames = {name} - for _,n in ipairs(add_names) do - nodenames[#nodenames + 1] = n - end - register_lbm(name, nodenames) + register_lbm(names[1], names) end end @@ -287,7 +282,7 @@ end -- Send message functions ------------------------------------------------------------------- -function techage.send_message(numbers, placer_name, clicker_name, topic, payload) +function techage.send_multi(numbers, placer_name, clicker_name, topic, payload) for _,num in ipairs(string_split(numbers, " ")) do if Number2Pos[num] and Number2Pos[num].name then local data = Number2Pos[num] @@ -300,7 +295,7 @@ function techage.send_message(numbers, placer_name, clicker_name, topic, payload end end -function techage.send_request(number, topic, payload) +function techage.send_single(number, topic, payload) if Number2Pos[number] and Number2Pos[number].name then local data = Number2Pos[number] if NodeDef[data.name] and NodeDef[data.name].on_recv_message then @@ -310,12 +305,45 @@ function techage.send_request(number, topic, payload) return false end +-- The destination node location is either: +-- A) a destination position, specified by pos +-- B) a neighbor position, specified by caller pos/outdir, or pos/side +-- C) a tubelib2 network connection, specified by caller pos/outdir, or pos/side +-- outdir is one of: 1..6 +-- side is one of: "B", "R", "F", "L", "D", "U" +-- network is a tuebelib2 network instance +-- opt: nodenames is a table of valid the callee node names +function techage.transfer(pos, outdir, topic, payload, network, nodenames) + -- determine out-dir + if outdir and type(outdir) == "string" then + local param2 = Tube:get_node_lvm(pos).param2 + outdir = side_to_dir(outdir, param2) + end + -- determine destination pos + local dpos, indir + if network then + dpos, indir = network:get_connected_node_pos(pos, outdir) + else + dpos, indir = tubelib2.get_pos(pos, outdir) + end + -- check node name + local name = Tube:get_node_lvm(dpos).name + if nodenames and not in_list(nodenames, name) then + return false + end + -- call "on_transfer" + local ndef = NodeDef[name] + if ndef and ndef.on_transfer then + return ndef.on_transfer(dpos, indir, topic, payload) + end + return false +end + -- for defect nodes function techage.repair_node(pos) local node = minetest.get_node(pos) - local name = Name2Name[node.name] - if NodeDef[name] and NodeDef[name].on_node_repair then - return NodeDef[name].on_node_repair(pos) + if NodeDef[node.name] and NodeDef[node.name].on_node_repair then + return NodeDef[node.name].on_node_repair(pos) end return false end diff --git a/basis/consumer.lua b/basis/consumer.lua index b67bf12..06a370f 100644 --- a/basis/consumer.lua +++ b/basis/consumer.lua @@ -266,7 +266,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode) power_network = power_network, }) end - techage.register_node(name_pas, {name_act, name_def}, tNode.tubing) + techage.register_node({name_pas, name_act, name_def}, tNode.tubing) end return names[1], names[2], names[3] end diff --git a/basis/firebox_lib.lua b/basis/firebox_lib.lua index b1088e1..bfb6da0 100644 --- a/basis/firebox_lib.lua +++ b/basis/firebox_lib.lua @@ -22,8 +22,6 @@ local I,_ = dofile(MP.."/intllib.lua") techage.firebox = {} -local BURN_TIME_FACTOR = 1 - techage.firebox.Burntime = { ["techage:charcoal"] = true, -- will be replaced by burntime ["default:coal_lump"] = true, @@ -34,7 +32,7 @@ techage.firebox.Burntime = { local function determine_burntimes() for k,_ in pairs(techage.firebox.Burntime)do local fuel,_ = minetest.get_craft_result({method = "fuel", width = 1, items = {k}}) - techage.firebox.Burntime[k] = fuel.time * BURN_TIME_FACTOR + techage.firebox.Burntime[k] = fuel.time end end minetest.after(1, determine_burntimes) @@ -44,18 +42,21 @@ function techage.firebox.formspec(mem) if mem.running then fuel_percent = ((mem.burn_cycles or 1) * 100) / (mem.burn_cycles_total or 1) end - return "size[8,6]".. + local power_level = mem.power_level or 4 + return "size[8,6.5]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. "list[current_name;fuel;1,0.5;1,1;]".. - "image[3,0.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + "image[2,0.5;1,1;default_furnace_fire_bg.png^[lowpart:".. fuel_percent..":default_furnace_fire_fg.png]".. - "button[5,0.5;1.8,1;update;"..I("Update").."]".. - "list[current_player;main;0,2;8,4;]".. + "label[4.5,0.1;"..I("Power")..":]".. + "dropdown[6,0;1.8;power_level;25%,50%,75%,100%;"..power_level.."]".. + "button[1,1.5;1.8,1;update;"..I("Update").."]".. + "list[current_player;main;0,2.8;8,4;]".. "listring[current_name;fuel]".. "listring[current_player;main]".. - default.get_hotbar_bg(0, 2) + default.get_hotbar_bg(0, 2.8) end function techage.firebox.can_dig(pos, player) @@ -74,15 +75,34 @@ function techage.firebox.allow_metadata_inventory(pos, listname, index, stack, p return 0 end +local PowerLevel = { + ["25%"] = 1, + ["50%"] = 2, + ["75%"] = 3, + ["100%"] = 4, +} + function techage.firebox.on_receive_fields(pos, formname, fields, player) if minetest.is_protected(pos, player:get_player_name()) then return end - + print(dump(fields)) if fields.update then local mem = tubelib2.get_mem(pos) M(pos):set_string("formspec", techage.firebox.formspec(mem)) end + if fields.power_level then + local mem = tubelib2.get_mem(pos) + mem.power_level = PowerLevel[fields.power_level] + techage.transfer( + {x=pos.x, y=pos.y+2, z=pos.z}, + nil, -- outdir + "power_level", -- topic + mem.power_level, -- payload + nil, -- network + {"techage:coalboiler_top"} -- nodenames + ) + end end function techage.firebox.on_rightclick(pos, node, clicker) diff --git a/basis/lib.lua b/basis/lib.lua index 6c29454..49c1580 100644 --- a/basis/lib.lua +++ b/basis/lib.lua @@ -53,3 +53,14 @@ function techage.is_primary_node(pos, dir) local param2 = M(npos):get_int("tl2_param2") return param2 ~= 0 end + +-- returns true if node can be dug +function techage.can_node_dig(node) + -- don't remove nodes with some intelligence or undiggable nodes + local ndef = minetest.registered_nodes[node.name] + if not ndef or node.name == "air" then return false end + if ndef.drop == "" then return false end + if ndef.diggable == false then return false end + if ndef.after_dig_node then return false end + return true +end diff --git a/coal_power_station/boiler_base.lua b/coal_power_station/boiler_base.lua index 355d31d..031d8d5 100644 --- a/coal_power_station/boiler_base.lua +++ b/coal_power_station/boiler_base.lua @@ -23,10 +23,6 @@ local I,_ = dofile(MP.."/intllib.lua") local Pipe = techage.SteamPipe -local function turn_on(pos, mem, in_dir, on) - return on -end - minetest.register_node("techage:coalboiler_base", { description = I("TA3 Boiler Base"), tiles = {"techage_coal_boiler_mesh_base.png"}, @@ -48,11 +44,20 @@ minetest.register_node("techage:coalboiler_base", { }) techage.power.register_node({"techage:coalboiler_base"}, { - turn_on = turn_on, conn_sides = {"F"}, power_network = Pipe, }) +-- for logical communication +techage.register_node({"techage:coalboiler_base"}, { + on_transfer = function(pos, in_dir, topic, payload) + if topic == "start" then + return true + elseif topic == "stop" then + return true + end + end +}) minetest.register_craft({ output = "techage:coalboiler_base", diff --git a/coal_power_station/boiler_top.lua b/coal_power_station/boiler_top.lua index 1ee5ac9..0bb7908 100644 --- a/coal_power_station/boiler_top.lua +++ b/coal_power_station/boiler_top.lua @@ -65,13 +65,14 @@ local function can_start(pos, mem, state) end local function start_node(pos, mem, state) - local out_dir = techage.power.side_to_outdir(pos, "F") - mem.running = techage.power.start_line_node(pos, out_dir, "techage:turbine", true) + print("start_node", S(pos)) + mem.running = techage.transfer(pos, "F", "start", nil, Pipe, {"techage:turbine"}) + techage.transfer(pos, "F", "power_level", mem.power_level, Pipe, {"techage:turbine"}) end local function stop_node(pos, mem, state) - local out_dir = techage.power.side_to_outdir(pos, "F") - techage.power.start_line_node(pos, out_dir, "techage:turbine_on", false) + print("stop_node", S(pos)) + techage.transfer(pos, "F", "stop", nil, Pipe, {"techage:turbine_on"}) mem.running = false end @@ -254,14 +255,6 @@ minetest.register_node("techage:coalboiler_top", { minetest.after(0.5, move_to_water, pos) end, - trigger_boiler = function(pos) - local mem = tubelib2.get_mem(pos) - mem.fire_trigger = true - if not minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):start(CYCLE_TIME) - end - end, - drop = "", paramtype2 = "facedir", groups = {cracky=1}, @@ -274,7 +267,26 @@ techage.power.register_node({"techage:coalboiler_top"}, { conn_sides = {"F"}, power_network = Pipe, }) - + +techage.register_node({"techage:coalboiler_top"}, { + on_transfer = function(pos, in_dir, topic, payload) + if topic == "trigger" then + local mem = tubelib2.get_mem(pos) + mem.fire_trigger = true + if not minetest.get_node_timer(pos):is_started() then + minetest.get_node_timer(pos):start(CYCLE_TIME) + end + elseif topic == "power_level" then + local mem = tubelib2.get_mem(pos) + mem.power_level = payload + print("coalboiler_top power_level", payload) + techage.transfer(pos, "F", topic, payload, Pipe, + {"techage:turbine", "techage:turbine_on"}) + end + end +}) + + minetest.register_craft({ output = "techage:coalboiler_top", recipe = { diff --git a/coal_power_station/cooler.lua b/coal_power_station/cooler.lua index 7e60dfc..21c20c6 100644 --- a/coal_power_station/cooler.lua +++ b/coal_power_station/cooler.lua @@ -21,7 +21,7 @@ local M = minetest.get_meta local MP = minetest.get_modpath("techage") local I,_ = dofile(MP.."/intllib.lua") -local Power = techage.SteamPipe +local Pipe = techage.SteamPipe local function swap_node(pos, name) local node = minetest.get_node(pos) @@ -32,17 +32,6 @@ local function swap_node(pos, name) minetest.swap_node(pos, node) end --- called from pipe network -local function turn_on(pos, mem, dir, on) - on = techage.power.start_line_node(pos, dir, "techage:coalboiler_base", on) - if on then - swap_node(pos, "techage:cooler_on") - else - swap_node(pos, "techage:cooler") - end - return on -end - minetest.register_node("techage:cooler", { description = I("TA3 Cooler"), tiles = { @@ -102,10 +91,27 @@ minetest.register_node("techage:cooler_on", { sounds = default.node_sound_wood_defaults(), }) +-- for mechanical pipe connections techage.power.register_node({"techage:cooler", "techage:cooler_on"}, { - turn_on = turn_on, conn_sides = {"L", "R"}, - power_network = Power, + power_network = Pipe, +}) + +-- for logical communication +techage.register_node({"techage:cooler", "techage:cooler_on"}, { + on_transfer = function(pos, in_dir, topic, payload) + if topic == "start" then + local on = techage.transfer(pos, in_dir, "start", nil, Pipe, {"techage:coalboiler_base"}) + if on then + swap_node(pos, "techage:cooler_on") + end + return on + elseif topic == "stop" then + techage.transfer(pos, in_dir, "stop", nil, Pipe, {"techage:coalboiler_base"}) + swap_node(pos, "techage:cooler") + return false + end + end }) minetest.register_craft({ diff --git a/coal_power_station/firebox.lua b/coal_power_station/firebox.lua index 3356d8e..fb68dd7 100644 --- a/coal_power_station/firebox.lua +++ b/coal_power_station/firebox.lua @@ -40,16 +40,22 @@ end local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) if mem.running then - local ndef = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+2, z=pos.z}).name] - if ndef and ndef.trigger_boiler then - ndef.trigger_boiler({x=pos.x, y=pos.y+2, z=pos.z}) - end + techage.transfer( + {x=pos.x, y=pos.y+2, z=pos.z}, + nil, -- outdir + "trigger", -- topic + nil, -- payload + nil, -- network + {"techage:coalboiler_top"} -- nodenames + ) mem.burn_cycles = (mem.burn_cycles or 0) - 1 if mem.burn_cycles <= 0 then local taken = firebox.get_fuel(pos) if taken then mem.burn_cycles = firebox.Burntime[taken:get_name()] / CYCLE_TIME + mem.burn_cycles = mem.burn_cycles * 4 / (mem.power_level or 4) mem.burn_cycles_total = mem.burn_cycles + print("firebox", mem.burn_cycles_total) else mem.running = false firehole(pos, false) @@ -174,6 +180,33 @@ minetest.register_node("techage:coalfirehole_on", { groups = {not_in_creative_inventory=1}, }) +techage.register_node({"techage:coalfirehole", "techage:coalfirehole_on"}, { + on_pull_item = function(pos, in_dir, num) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return techage.get_items(inv, "fuel", num) + end, + on_push_item = function(pos, in_dir, stack) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return techage.put_items(inv, "fuel", stack) + end, + on_unpull_item = function(pos, in_dir, stack) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return techage.put_items(inv, "fuel", stack) + end, + on_recv_message = function(pos, topic, payload) + if topic == "state" then + local meta = minetest.get_meta(pos) + return techage.get_inv_state(meta, "fuel") + else + return "unsupported" + end + end, +}) + + minetest.register_craft({ output = "techage:coalfirebox", recipe = { @@ -183,7 +216,7 @@ minetest.register_craft({ }, }) -techage.register_node("techage:coalfirebox", {}, { +techage.register_node({"techage:coalfirebox"}, { on_push_item = function(pos, in_dir, stack) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -206,3 +239,4 @@ minetest.register_lbm({ end }) + diff --git a/coal_power_station/generator.lua b/coal_power_station/generator.lua index 087a64a..549a48c 100644 --- a/coal_power_station/generator.lua +++ b/coal_power_station/generator.lua @@ -24,7 +24,7 @@ local I,_ = dofile(MP.."/intllib.lua") local STANDBY_TICKS = 4 local COUNTDOWN_TICKS = 4 local CYCLE_TIME = 8 -local POWER_CAPACITY = 75 +local POWER_CAPACITY = 80 local Cable = techage.ElectricCable @@ -43,7 +43,10 @@ end local function turbine_running(pos) local pos1 = techage.get_pos(pos, 'L') local node = minetest.get_node(pos1) - return node.name == "techage:turbine_on" + if node.name == "techage:turbine_on" then + return true + end + return false end local function start_node(pos, mem, state) @@ -68,7 +71,7 @@ local State = techage.NodeStates:new({ -- Pass1: Power balance calculation local function on_power_pass1(pos, mem) if State:is_active(mem) then - return -POWER_CAPACITY + return -POWER_CAPACITY * (mem.power_level or 4) / 4 end return 0 end @@ -117,6 +120,7 @@ end local function on_rightclick(pos) local mem = tubelib2.get_mem(pos) + techage.power.power_distribution(pos) M(pos):set_string("formspec", formspec(State, pos, mem)) end @@ -216,6 +220,18 @@ techage.power.register_node({"techage:generator", "techage:generator_on"}, { power_network = Cable, }) +-- for logical communication +techage.register_node({"techage:generator", "techage:generator_on"}, { + on_transfer = function(pos, in_dir, topic, payload) + print("generator", topic, payload) + local mem = tubelib2.get_mem(pos) + if topic == "power_level" then + local mem = tubelib2.get_mem(pos) + mem.power_level = payload + end + end +}) + techage.register_help_page(I("TA3 Generator"), I([[Part of the Coal Power Station. Has to be placed side by side diff --git a/coal_power_station/turbine.lua b/coal_power_station/turbine.lua index 22e7ebe..0e437f2 100644 --- a/coal_power_station/turbine.lua +++ b/coal_power_station/turbine.lua @@ -21,7 +21,7 @@ local M = minetest.get_meta local MP = minetest.get_modpath("techage") local I,_ = dofile(MP.."/intllib.lua") -local Power = techage.SteamPipe +local Pipe = techage.SteamPipe local function swap_node(pos, name) local node = minetest.get_node(pos) @@ -51,25 +51,14 @@ local function stop_sound(pos) end end --- called from pipe network -local function turn_on(pos, mem, dir, on) - if on then - on = techage.power.start_line_node(pos, 6, "techage:cooler", true) - else - techage.power.start_line_node(pos, 6, "techage:cooler_on", false) - end - - if on then - swap_node(pos, "techage:turbine_on") - mem.running = true - play_sound(pos) - else - swap_node(pos, "techage:turbine") - mem.running = false - stop_sound(pos) - end - return on -end +-- called with any pipe change +local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) + local mem = tubelib2.get_mem(pos) + techage.transfer(pos, 6, "stop", nil, Pipe, {"techage:cooler_on"}) + swap_node(pos, "techage:turbine") + mem.running = false + stop_sound(pos) +end minetest.register_node("techage:turbine", { description = I("TA3 Turbine"), @@ -119,6 +108,7 @@ minetest.register_node("techage:turbine_on", { }, }, }, + after_tube_update = after_tube_update, paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, @@ -128,16 +118,44 @@ minetest.register_node("techage:turbine_on", { sounds = default.node_sound_wood_defaults(), }) +-- for mechanical pipe connections techage.power.register_node({"techage:turbine", "techage:turbine_on"}, { - turn_on = turn_on, conn_sides = {"L", "U"}, - power_network = Power, + power_network = Pipe, +}) + +-- for logical communication +techage.register_node({"techage:turbine", "techage:turbine_on"}, { + on_transfer = function(pos, in_dir, topic, payload) + print("turbine", topic, payload) + local mem = tubelib2.get_mem(pos) + if topic == "power_level" then + local mem = tubelib2.get_mem(pos) + mem.power_level = payload + techage.transfer(pos, "R", topic, payload, nil, + {"techage:generator", "techage:generator_on"}) + elseif topic == "start" then + local on = techage.transfer(pos, 6, "start", nil, Pipe, {"techage:cooler"}) + if on then + swap_node(pos, "techage:turbine_on") + mem.running = true + play_sound(pos) + end + return on + elseif topic == "stop" then + techage.transfer(pos, 6, "stop", nil, Pipe, {"techage:cooler_on"}) + swap_node(pos, "techage:turbine") + mem.running = false + stop_sound(pos) + return false + end + end }) minetest.register_craft({ output = "techage:turbine", recipe = { - {"basic_materials:steel_bar", "techage:iron_ingot", "default:wood"}, + {"basic_materials:steel_bar", "techage:steam_pipeS", "default:wood"}, {"techage:steam_pipeS", "basic_materials:gear_steel", ""}, {"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, }, diff --git a/init.lua b/init.lua index 1ff10cb..46dae34 100644 --- a/init.lua +++ b/init.lua @@ -32,6 +32,7 @@ else dofile(MP.."/basis/consumer.lua") -- consumer base model dofile(MP.."/basis/firebox_lib.lua") -- common firebox functions dofile(MP.."/basis/mark.lua") + dofile(MP.."/basis/assemble.lua") -- Overrides dofile(MP.."/overrides/signs_bot.lua") @@ -116,6 +117,8 @@ else -- Oil dofile(MP.."/oil/explore.lua") + dofile(MP.."/oil/tower.lua") + dofile(MP.."/oil/drillbox.lua") --dofile(MP.."/test/generator.lua") diff --git a/iron_age/gravelsieve.lua b/iron_age/gravelsieve.lua index 95bcf7f..fdfff7e 100644 --- a/iron_age/gravelsieve.lua +++ b/iron_age/gravelsieve.lua @@ -139,7 +139,7 @@ for idx = 0,3 do }) end -techage.register_node("techage:sieve0", {"techage:sieve1", "techage:sieve2", "techage:sieve3"}, { +techage.register_node({"techage:sieve0", "techage:sieve1", "techage:sieve2", "techage:sieve3"}, { on_push_item = function(pos, in_dir, stack) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() diff --git a/iron_age/hopper.lua b/iron_age/hopper.lua index 4a08c93..e292552 100644 --- a/iron_age/hopper.lua +++ b/iron_age/hopper.lua @@ -143,7 +143,7 @@ minetest.register_craft({ }, }) -techage.register_node("techage:hopper_ta1", {}, { +techage.register_node({"techage:hopper_ta1"}, { on_pull_item = nil, -- not needed on_unpull_item = nil, -- not needed diff --git a/oil/drillbox.lua b/oil/drillbox.lua new file mode 100644 index 0000000..215e32d --- /dev/null +++ b/oil/drillbox.lua @@ -0,0 +1,317 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + TA3 Oil Drill Box + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta +-- Consumer Related Data +local CRD = function(pos) return (minetest.registered_nodes[minetest.get_node(pos).name] or {}).consumer end + +-- Load support for intllib. +local MP = minetest.get_modpath("techage") +local I,_ = dofile(MP.."/intllib.lua") + +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 6 +local CYCLE_TIME = 8 + +local formspec0 = "size[5,4]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "image[1,0;3.4,3.4;techage_oil_tower_inv.png]".. + "button_exit[1,3.2;3,1;build;"..I("Build Tower").."]" + +local function play_sound(pos) + local mem = tubelib2.get_mem(pos) + if mem.techage_state == techage.RUNNING then + mem.handle = minetest.sound_play("techage_oildrill", { + pos = pos, + gain = 1, + max_hear_distance = 15}) + minetest.after(4, play_sound, pos) + end +end + +local function stop_sound(pos) + local mem = tubelib2.get_mem(pos) + if mem.techage_state ~= techage.RUNNING and mem.handle then + minetest.sound_stop(mem.handle) + mem.handle = nil + end +end + +local function formspec(self, pos, mem) + if not mem.assemble_build then + return formspec0 + end + local depth = M(pos):get_int("depth") + local curr_depth = pos.y - (mem.drill_pos or pos).y + return "size[8,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;1,1;1,1;]".. + "label[1.3,0.5;IN]".. + "item_image[1,1;1,1;techage:oil_drillbit]".. + "label[1,2;"..I("Drill Bit").."]".. + "label[0.5,3;"..I("Depth")..": "..curr_depth.."/"..depth.."]".. + "image[3.5,0;1,1;"..techage.get_power_image(pos, mem).."]".. + "image[3.5,1;1,1;techage_form_arrow.png]".. + "image_button[3.5,2;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. + "label[6.2,0.5;OUT]".. + "list[context;dst;6,1;1,1;]".. + "button_exit[5,3;3,1;destroy;"..I("Destroy Tower").."]".. + "list[current_player;main;0,4;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4) +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 + --local meta = minetest.get_meta(pos) + --local inv = meta:get_inventory() + local crd = CRD(pos) + if listname == "src" then + crd.State:start_if_standby(pos) + return stack:get_count() + end + return 0 +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 on_rightclick(pos) + local mem = tubelib2.get_mem(pos) + M(pos):set_string("formspec", formspec(CRD(pos).State, pos, mem)) +end + +local function drilling(pos, crd, mem, inv) + M(pos):set_string("formspec", formspec(CRD(pos).State, pos, mem)) + print("drilling") + if inv:contains_item("src", ItemStack("techage:oil_drillbit")) then + mem.drill_pos = mem.drill_pos or {x=pos.x, y=pos.y, z=pos.z} + mem.drill_pos.y = mem.drill_pos.y-1 + local owner = M(pos):get_string("owner") + local depth = M(pos):get_int("depth") + if mem.drill_pos.y > -depth then + if not minetest.is_protected(mem.drill_pos, owner) then + local node = minetest.get_node(mem.drill_pos) + if node.name ~= "techage:oil_drillbit2" then + local item = ItemStack(node.name) + if techage.can_node_dig(node) then + if inv:room_for_item("dst", item) then + inv:add_item("dst", item) + else + stop_sound(pos) + crd.State:blocked(pos, mem) + end + end + minetest.swap_node(mem.drill_pos, {name = "techage:oil_drillbit2"}) + inv:remove_item("src", ItemStack("techage:oil_drillbit")) + end + else + stop_sound(pos) + crd.State:fault(pos, mem) + end + crd.State:keep_running(pos, mem, COUNTDOWN_TICKS) + return + else + M(pos):set_string("oil_found", "true") + stop_sound(pos) + crd.State:stop(pos, mem) + end + end + crd.State:idle(pos, mem) +end + +local function keep_running(pos, elapsed) + local mem = tubelib2.get_mem(pos) + local crd = CRD(pos) + local inv = M(pos):get_inventory() + if inv then + drilling(pos, crd, mem, inv) + end + return crd.State:is_active(mem) +end + +local function can_dig(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local mem = tubelib2.get_mem(pos) + if mem.assemble_locked or mem.assemble_build then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("dst") and inv:is_empty("src") +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + if fields.build then + techage.oiltower.build(pos, player:get_player_name()) + elseif fields.destroy then + local inv = M(pos):get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + techage.oiltower.remove(pos, player:get_player_name()) + end + else + local mem = tubelib2.get_mem(pos) + if not mem.assemble_locked and M(pos):get_string("oil_found") ~= "true" then + if CRD(pos).State:state_button_event(pos, mem, fields) then + if mem.techage_state == techage.RUNNING then + play_sound(pos) + else + stop_sound(pos) + end + end + end + end +end + +local tiles = {} +-- '#' will be replaced by the stage number +tiles.pas = { + -- up, down, right, left, back, front + "techage_filling_ta#.png^techage_frame_ta#_top.png", + "techage_filling_ta#.png^techage_frame_ta#.png", + "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png", + "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png", + "techage_filling_ta#.png^techage_appl_oildrill.png^techage_frame_ta#.png", + "techage_filling_ta#.png^techage_appl_oildrill.png^techage_frame_ta#.png", +} + +tiles.act = tiles.pas +tiles.def = tiles.pas + +local tubing = { + on_pull_item = function(pos, in_dir, num) + local meta = minetest.get_meta(pos) + if meta:get_int("pull_dir") == in_dir then + local inv = M(pos):get_inventory() + return techage.get_items(inv, "dst", num) + end + end, + on_push_item = function(pos, in_dir, stack) + local meta = minetest.get_meta(pos) + if meta:get_int("push_dir") == in_dir or in_dir == 5 then + local inv = M(pos):get_inventory() + return techage.put_items(inv, "src", stack) + end + end, + on_unpull_item = function(pos, in_dir, stack) + local meta = minetest.get_meta(pos) + if meta:get_int("pull_dir") == in_dir then + local inv = M(pos):get_inventory() + return techage.put_items(inv, "dst", stack) + end + end, + on_recv_message = function(pos, topic, payload) + local resp = CRD(pos).State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + CRD(pos).State:on_node_load(pos) + end, + on_node_repair = function(pos) + return CRD(pos).State:on_node_repair(pos) + end, +} + +local node_name_ta2, node_name_ta3, node_name_ta4 = + techage.register_consumer("drillbox", I("Oil Drill Box"), tiles, { + drawtype = "normal", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 10, + formspec = formspec, + tubing = tubing, + after_place_node = function(pos, placer) + local inv = M(pos):get_inventory() + inv:set_size("src", 1) + inv:set_size("dst", 1) + local info = techage.explore.get_oil_info(pos) + M(pos):set_int("depth", info.depth) + M(pos):set_int("amount", info.amount) + M(pos):set_string("oil_found", "false") + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldmetadata.fields.oil_found == "true" then + minetest.set_node(pos, {name = "techage:oil_source"}) + end + end, + can_dig = can_dig, + node_timer = keep_running, + on_receive_fields = on_receive_fields, + on_rightclick = on_rightclick, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + groups = {choppy=2, cracky=2, crumbly=2}, + sounds = default.node_sound_wood_defaults(), + num_items = {0,1,1,1}, + power_consumption = {0,10,16,24}, + }) + +minetest.register_craft({ + output = node_name_ta3, + recipe = { + {"default:steel_ingot", "default:diamond", "default:steel_ingot"}, + {"techage:tubeS", "basic_materials:gear_steel", "techage:tubeS"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) + +techage.register_help_page(I("Oil Drill Box"), +I([[Used to drill for oil, +Oil is used as fuel.]]), node_name_ta3) + +minetest.register_lbm({ + label = "[techage] Oil Tower sound", + name = "techage:oil_tower", + nodenames = {"techage:ta3_drillbox_act"}, + run_at_every_load = true, + action = function(pos, node) + local mem = tubelib2.get_mem(pos) + if mem.techage_state == techage.RUNNING then + play_sound(pos) + end + end +}) diff --git a/oil/explore.lua b/oil/explore.lua index 44be931..7428743 100644 --- a/oil/explore.lua +++ b/oil/explore.lua @@ -8,9 +8,9 @@ local MP = minetest.get_modpath("techage") local I,IS = dofile(MP.."/intllib.lua") -local PROBABILITY = 10 -local OIL_MIN = 500 -local OIL_MAX = 10000 +local PROBABILITY = 100 +local OIL_MIN = 1000 +local OIL_MAX = 20000 local DEPTH_MIN = 8 local DEPTH_MAX = (16 * 25) + 8 local DEPTH_STEP = 96 @@ -42,8 +42,8 @@ end local function gen_oil_slice(pos1, posc, y, radius, data, id) local y_offs = (y - pos1.y) * 16 - for x = posc.x - radius, posc.x + radius do - for z = posc.z - radius, posc.z + radius do + for x = posc.x - radius + 2, posc.x + radius + 2 do + for z = posc.z - radius + 1, posc.z + radius + 1 do local idx = x - pos1.x + y_offs + (z - pos1.z) * 16 * 16 data[idx] = id end @@ -58,7 +58,6 @@ local function gen_oil_bubble(pos1, posC, amount, data) local sum = 0 for y = posC.y - radius, posC.y + radius do sum = sum + gen_oil_slice(pos1, posC, y, radius + 1, data, id) - print(y, sum, amount) if sum >= amount then break end end end @@ -123,7 +122,6 @@ local function explore_area(pos, pos1, pos2, posC, depth, amount, player_name) vm:set_data(data) vm:write_to_map() vm:update_map() - print("explore_area", S(pos1), S(pos2)) M(pos):set_int("oil_amount", amount) M(pos):set_int("depth", depth) set_oil_amount(posC, amount) @@ -153,7 +151,6 @@ local function emerge_area(pos, node, player_name) if amount > 0 then if get_oil_amount(posC) == 0 then -- not explored so far? - print("emerge_area", S(pos1), S(pos2), S(posC)) minetest.emerge_area(pos1, pos2) minetest.after(2, explore_area, pos, pos1, pos2, posC, depth, amount, player_name) else @@ -341,3 +338,17 @@ To go deeper, you can click on the block several times. When oil is found, the position for the Oil Tower is highlighted. Hint: Mark and protect the position for later use.]]), "techage:oilexplorer") + +techage.explore = {} + +function techage.explore.get_oil_info(pos) + local amount = 0 + local depth = DEPTH_MIN + while amount == 0 and depth < DEPTH_MAX do + depth = depth + DEPTH_STEP + local posC = {x = center(pos.x), y = center(-depth), z = center(pos.z)} + amount = oil_amount(posC) + end + return {depth = center(depth) - 2 + pos.y, amount = amount} +end + diff --git a/oil/oilpump.lua b/oil/oilpump.lua new file mode 100644 index 0000000..2892ad8 --- /dev/null +++ b/oil/oilpump.lua @@ -0,0 +1,31 @@ +local function formspec(self, pos, mem) + if not mem.tower_built then + return formspec0 + end + local icon = "techage_oil_inv" + local depth = "1/480" + return "size[8,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;1,1;1,1;]".. + "label[1.3,0.5;IN]".. + "item_image[1,1;1,1;techage:oil_drillbit]".. + "label[1,2;"..I("Drill Bit").."]".. + "label[0.5,3;"..I("Depth")..": "..depth.."]".. + "image[3.5,0;1,1;"..techage.get_power_image(pos, mem).."]".. + "image[3.5,1;1,1;techage_form_arrow.png]".. + "image_button[3.5,2;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. + "label[6.2,0.5;OUT]".. + "list[context;dst;6,1;1,1;]".. + "label[6.2,2;"..I("Oil").."]".. + "label[5.5,3;"..I("Extract")..": "..depth.."]".. + "item_image[6,1;1,1;techage:oil_source]".. + "button_exit[0,3.9;3,1;destroy;"..I("Destroy Tower").."]".. + "list[current_player;main;0,4;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4) +end diff --git a/oil/tower.lua b/oil/tower.lua new file mode 100644 index 0000000..7ba7eb4 --- /dev/null +++ b/oil/tower.lua @@ -0,0 +1,283 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + TA3 Oil Tower + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +-- Load support for intllib. +local MP = minetest.get_modpath("techage") +local I,_ = dofile(MP.."/intllib.lua") + + +minetest.register_node("techage:oiltower1", { + description = I("TA3 Oil Tower"), + tiles = { + "techage_oil_tower1.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, -7/16, 8/16, 8/16}, + { 7/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, + {-8/16, 7/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, 8/16, 8/16, -7/16}, + {-8/16, -8/16, 7/16, 8/16, 8/16, 8/16}, + }, + }, + drop = "", + diggable = false, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + groups = {not_in_creative_inventory = 1}, + is_ground_content = false, +}) + +minetest.register_node("techage:oiltower2", { + description = I("TA3 Oil Tower"), + tiles = { + -- up, down, right, left, back, front + "techage_oil_tower_top.png^[transformR180", + "techage_oil_tower_top.png^[transformR180", + "techage_oil_tower2.png^[transformFX", + "techage_oil_tower2.png", + "techage_oil_tower2.png", + "techage_oil_tower2.png^[transformFX", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, -7/16, 8/16, 4/16}, + { 3/16, -8/16, -8/16, 4/16, 8/16, 4/16}, + {-8/16, -8/16, -8/16, 4/16, -7/16, 4/16}, + {-8/16, 7/16, -8/16, 4/16, 8/16, 4/16}, + {-8/16, -8/16, -8/16, 4/16, 8/16, -7/16}, + {-8/16, -8/16, 3/16, 4/16, 8/16, 4/16}, + }, + }, + drop = "", + diggable = false, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + groups = {not_in_creative_inventory = 1}, + is_ground_content = false, +}) + +minetest.register_node("techage:oiltower3", { + description = I("TA3 Oil Tower"), + tiles = { + -- up, down, right, left, back, front + "techage_oil_tower_top.png^[transformR180", + "techage_oil_tower_top.png^[transformR180", + "techage_oil_tower3.png^[transformFX", + "techage_oil_tower3.png", + "techage_oil_tower3.png", + "techage_oil_tower3.png^[transformFX", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, -7/16, 8/16, 0/16}, + {-1/16, -8/16, -8/16, 0/16, 8/16, 0/16}, + {-8/16, -8/16, -8/16, 0/16, -7/16, 0/16}, + {-8/16, 7/16, -8/16, 0/16, 8/16, 0/16}, + {-8/16, -8/16, -8/16, 0/16, 8/16, -7/16}, + {-8/16, -8/16, -1/16, 0/16, 8/16, 0/16}, + }, + }, + drop = "", + diggable = false, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + groups = {not_in_creative_inventory = 1}, + is_ground_content = false, +}) + +minetest.register_node("techage:oiltower4", { + description = I("TA3 Oil Tower"), + tiles = { + -- up, down, right, left, back, front + "techage_oil_tower_top.png^[transformR180", + "techage_oil_tower_top.png^[transformR180", + "techage_oil_tower4.png^[transformFX", + "techage_oil_tower4.png", + "techage_oil_tower4.png", + "techage_oil_tower4.png^[transformFX", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, -7/16, 8/16, -4/16}, + {-5/16, -8/16, -8/16, -4/16, 8/16, -4/16}, + {-8/16, -8/16, -8/16, -4/16, -7/16, -4/16}, + {-8/16, 7/16, -8/16, -4/16, 8/16, -4/16}, + {-8/16, -8/16, -8/16, -4/16, 8/16, -7/16}, + {-8/16, -8/16, -5/16, -4/16, 8/16, -4/16}, + }, + }, + drop = "", + diggable = false, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + groups = {not_in_creative_inventory = 1}, + is_ground_content = false, +}) + +minetest.register_node("techage:oiltower5", { + description = I("TA4 Oil Tower"), + tiles = { + -- up, down, right, left, back, front + "techage_oil_tower1.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, 7/16, 8/16, 8/16, 8/16}, + }, + }, + drop = "", + diggable = false, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + groups = {not_in_creative_inventory = 1}, + is_ground_content = false, +}) + +minetest.register_node("techage:oil_drillbit", { + description = I("TA3 Drill Bit"), + drawtype = "plantlike", + tiles = {"techage_oil_drillbit.png"}, + inventory_image = "techage_oil_drillbit_inv.png", + wield_image = "techage_oil_drillbit_inv.png", + visual_scale = 1, + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 1}, + is_ground_content = false, +}) + +minetest.register_node("techage:oil_drillbit2", { + description = I("TA3 Drill Bit"), + drawtype = "plantlike", + tiles = {"techage_oil_drillbit.png"}, + inventory_image = "techage_oil_drillbit_inv.png", + wield_image = "techage_oil_drillbit_inv.png", + visual_scale = 1, + paramtype = "light", + drop = "", + diggable = false, + sunlight_propagates = true, + groups = {not_in_creative_inventory = 1}, + is_ground_content = false, +}) + +local AssemblyPlan = { + -- y-offs, path, facedir-offs, name + + -- level 0 + { 0, {0,1}, 0, "techage:oiltower1"}, + { 0, {0,3}, 0, "techage:oiltower1"}, + { 0, {2,1}, 0, "techage:oiltower1"}, + { 0, {2,3}, 0, "techage:oiltower1"}, + -- level 1 + { 1, {0,1}, 0, "techage:oiltower1"}, + { 1, {0,3}, 0, "techage:oiltower1"}, + { 1, {2,1}, 0, "techage:oiltower1"}, + { 1, {2,3}, 0, "techage:oiltower1"}, + { 1, {0}, 2, "techage:oiltower5"}, + { 1, {1}, 3, "techage:oiltower5"}, + { 1, {2}, 0, "techage:oiltower5"}, + { 1, {3}, 1, "techage:oiltower5"}, + -- level 2 + { 2, {0,1}, 0, "techage:oiltower2"}, + { 2, {0,3}, 3, "techage:oiltower2"}, + { 2, {2,1}, 1, "techage:oiltower2"}, + { 2, {2,3}, 2, "techage:oiltower2"}, + { 2, {0}, 2, "techage:oiltower5"}, + { 2, {1}, 3, "techage:oiltower5"}, + { 2, {2}, 0, "techage:oiltower5"}, + { 2, {3}, 1, "techage:oiltower5"}, + -- level 3 + { 3, {0,1}, 0, "techage:oiltower3"}, + { 3, {0,3}, 3, "techage:oiltower3"}, + { 3, {2,1}, 1, "techage:oiltower3"}, + { 3, {2,3}, 2, "techage:oiltower3"}, + { 3, {0}, 2, "techage:oiltower5"}, + { 3, {1}, 3, "techage:oiltower5"}, + { 3, {2}, 0, "techage:oiltower5"}, + { 3, {3}, 1, "techage:oiltower5"}, + -- level 4 + { 4, {0,1}, 0, "techage:oiltower4"}, + { 4, {0,3}, 3, "techage:oiltower4"}, + { 4, {2,1}, 1, "techage:oiltower4"}, + { 4, {2,3}, 2, "techage:oiltower4"}, + { 4, {0}, 2, "techage:oiltower5"}, + { 4, {1}, 3, "techage:oiltower5"}, + { 4, {2}, 0, "techage:oiltower5"}, + { 4, {3}, 1, "techage:oiltower5"}, + -- level 5 + { 5, {0}, 2, "techage:oiltower5"}, + { 5, {1}, 3, "techage:oiltower5"}, + { 5, {2}, 0, "techage:oiltower5"}, + { 5, {3}, 1, "techage:oiltower5"}, + -- level 6 + { 6, {0}, 2, "techage:oiltower5"}, + { 6, {1}, 3, "techage:oiltower5"}, + { 6, {2}, 0, "techage:oiltower5"}, + { 6, {3}, 1, "techage:oiltower5"}, + -- level 7 + { 7, {}, 0, "techage:oiltower1"}, + -- drill bits + { 1, {}, 0, "techage:oil_drillbit2"}, + { 2, {}, 0, "techage:oil_drillbit2"}, + { 3, {}, 0, "techage:oil_drillbit2"}, + { 4, {}, 0, "techage:oil_drillbit2"}, + { 5, {}, 0, "techage:oil_drillbit2"}, + { 6, {}, 0, "techage:oil_drillbit2"}, +} + +minetest.register_craft({ + output = "techage:oil_drillbit 12", + recipe = { + {"", "default:steel_ingot", "default:obsidian_shard"}, + {"", "default:steel_ingot", ""}, + {"default:obsidian_shard", "default:steel_ingot", ""}, + }, +}) + +techage.oiltower = {} + +-- Two important flags: +-- 1) mem.assemble_locked is true while the tower is being assembled/disassembled +-- 2) mem.assemble_build is true if the tower is assembled +function techage.oiltower.build(pos, player_name) + techage.assemble.build(pos, AssemblyPlan, player_name) +end + +function techage.oiltower.remove(pos, player_name) + techage.assemble.remove(pos, AssemblyPlan, player_name) +end + diff --git a/power/power.lua b/power/power.lua index a6f534f..f350e6a 100644 --- a/power/power.lua +++ b/power/power.lua @@ -184,7 +184,6 @@ function techage.power.register_node(names, pwr_def) if ndef then minetest.override_item(name, { power = { - turn_on = pwr_def.turn_on, -- line-like networks on_power_pass1 = pwr_def.on_power_pass1, on_power_pass2 = pwr_def.on_power_pass2, on_power_pass3 = pwr_def.on_power_pass3, @@ -262,24 +261,3 @@ function techage.power.side_to_outdir(pos, side) local node = minetest.get_node(pos) return side_to_dir(node.param2, side) end - - --- Simplified version of power distribution for line-like networks --- like the for the steam engine pipe. --- Function uses the node "turn_on" callback --- Returns true, if node could be started/stopped. -function techage.power.start_line_node(pos, out_dir, node_name, on) - local mem = tubelib2.get_mem(pos) - local conn = mem.connections and mem.connections[out_dir] - if conn and conn.in_dir and conn.pos then - local node = minetest.get_node(conn.pos) - if node.name == node_name then - local pwr = PWR(conn.pos) - if pwr and pwr.turn_on then - local mem = tubelib2.get_mem(conn.pos) - return pwr.turn_on(conn.pos, mem, conn.in_dir, on) - end - end - end - return false -end diff --git a/sounds/techage_oildrill.ogg b/sounds/techage_oildrill.ogg new file mode 100644 index 0000000000000000000000000000000000000000..749d011a88fb635bc6609858ae341222cd222d55 GIT binary patch literal 29458 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 literal 0 HcmV?d00001 diff --git a/steam_engine/boiler.lua b/steam_engine/boiler.lua index a4aee22..3e988d6 100644 --- a/steam_engine/boiler.lua +++ b/steam_engine/boiler.lua @@ -65,13 +65,11 @@ local function can_start(pos, mem, state) end local function start_node(pos, mem, state) - local out_dir = techage.side_to_outdir("U") - mem.running = techage.power.start_line_node(pos, out_dir, "techage:cylinder", true) + mem.running = techage.transfer(pos, 6, "start", nil, Pipe, {"techage:cylinder"}) end local function stop_node(pos, mem, state) - local out_dir = techage.side_to_outdir("U") - techage.power.start_line_node(pos, out_dir, "techage:cylinder_on", false) + techage.transfer(pos, 6, "stop", nil, Pipe, {"techage:cylinder_on"}) mem.running = false end @@ -271,14 +269,6 @@ minetest.register_node("techage:boiler2", { minetest.after(0.5, move_to_water, pos) end, - power_signal_heat = function(pos) - local mem = tubelib2.get_mem(pos) - mem.fire_trigger = true - if not minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):start(CYCLE_TIME) - end - end, - drop = "", groups = {cracky=1}, on_rotate = screwdriver.disallow, @@ -291,6 +281,17 @@ techage.power.register_node({"techage:boiler2"}, { power_network = Pipe, }) +techage.register_node({"techage:boiler2"}, { + on_transfer = function(pos, in_dir, topic, payload) + if topic == "trigger" then + local mem = tubelib2.get_mem(pos) + mem.fire_trigger = true + if not minetest.get_node_timer(pos):is_started() then + minetest.get_node_timer(pos):start(CYCLE_TIME) + end + end + end +}) minetest.register_craft({ output = "techage:boiler1", diff --git a/steam_engine/cylinder.lua b/steam_engine/cylinder.lua index 20dac81..5731acb 100644 --- a/steam_engine/cylinder.lua +++ b/steam_engine/cylinder.lua @@ -32,11 +32,6 @@ local function swap_node(pos, name) minetest.swap_node(pos, node) end -local function turn_on(pos, mem, in_dir, on) - mem.running = on - return on -end - -- called from flywheel local function start_cylinder(pos, on) local mem = tubelib2.get_mem(pos) @@ -51,6 +46,11 @@ local function start_cylinder(pos, on) end end +-- called with any pipe change +local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) + local mem = tubelib2.get_mem(pos) + mem.running = false +end minetest.register_node("techage:cylinder", { description = I("TA2 Cylinder"), @@ -105,6 +105,7 @@ minetest.register_node("techage:cylinder_on", { }, start_cylinder = start_cylinder, + after_tube_update = after_tube_update, paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, @@ -115,11 +116,24 @@ minetest.register_node("techage:cylinder_on", { }) techage.power.register_node({"techage:cylinder", "techage:cylinder_on"}, { - turn_on = turn_on, conn_sides = {"L"}, power_network = Pipe, }) +-- used by firebox +techage.register_node({"techage:cylinder", "techage:cylinder_on"}, { + on_transfer = function(pos, in_dir, topic, payload) + local mem = tubelib2.get_mem(pos) + if topic == "start" then + mem.running = true + return true + elseif topic == "stop" then + mem.running = false + return false + end + end +}) + minetest.register_craft({ output = "techage:cylinder", recipe = { @@ -133,4 +147,4 @@ techage.register_help_page(I("TA2 Cylinder"), I([[Part of the steam engine. Has to be placed side by side with the TA2 Flywheel. -(see TA2 Steam Engine)]]), "techage:cylinder") \ No newline at end of file +(see TA2 Steam Engine)]]), "techage:cylinder") diff --git a/steam_engine/firebox.lua b/steam_engine/firebox.lua index e5b3ad9..00f0b58 100644 --- a/steam_engine/firebox.lua +++ b/steam_engine/firebox.lua @@ -25,14 +25,36 @@ local firebox = techage.firebox local CYCLE_TIME = 2 +local function formspec(mem) + local fuel_percent = 0 + if mem.running then + fuel_percent = ((mem.burn_cycles or 1) * 100) / (mem.burn_cycles_total or 1) + end + return "size[8,6]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;fuel;1,0.5;1,1;]".. + "image[3,0.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + fuel_percent..":default_furnace_fire_fg.png]".. + "button[5,0.5;1.8,1;update;"..I("Update").."]".. + "list[current_player;main;0,2;8,4;]".. + "listring[current_name;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 2) +end local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) if mem.running then - local ndef = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+2, z=pos.z}).name] - if ndef and ndef.power_signal_heat then - ndef.power_signal_heat({x=pos.x, y=pos.y+2, z=pos.z}) - end + techage.transfer( + {x=pos.x, y=pos.y+2, z=pos.z}, + nil, -- outdir + "trigger", -- topic + nil, -- payload + nil, -- network + {"techage:boiler2"} -- nodenames + ) mem.burn_cycles = (mem.burn_cycles or 0) - 1 if mem.burn_cycles <= 0 then local taken = firebox.get_fuel(pos) @@ -42,7 +64,7 @@ local function node_timer(pos, elapsed) else mem.running = false firebox.swap_node(pos, "techage:firebox") - M(pos):set_string("formspec", firebox.formspec(mem)) + M(pos):set_string("formspec", formspec(mem)) return false end end @@ -50,6 +72,22 @@ local function node_timer(pos, elapsed) end end +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + if fields.update then + local mem = tubelib2.get_mem(pos) + M(pos):set_string("formspec", formspec(mem)) + end +end + +local function on_rightclick(pos, node, clicker) + local mem = tubelib2.get_mem(pos) + M(pos):set_string("formspec", formspec(mem)) +end + + minetest.register_node("techage:firebox", { description = I("TA2 Firebox"), tiles = { @@ -71,15 +109,15 @@ minetest.register_node("techage:firebox", { can_dig = firebox.can_dig, allow_metadata_inventory_put = firebox.allow_metadata_inventory, allow_metadata_inventory_take = firebox.allow_metadata_inventory, - on_receive_fields = firebox.on_receive_fields, - on_rightclick = firebox.on_rightclick, + on_receive_fields = on_receive_fields, + on_rightclick = on_rightclick, on_construct = function(pos) local mem = tubelib2.init_mem(pos) mem.running = false mem.burn_cycles = 0 local meta = M(pos) - meta:set_string("formspec", firebox.formspec(mem)) + meta:set_string("formspec", formspec(mem)) local inv = meta:get_inventory() inv:set_size('fuel', 1) end, @@ -90,7 +128,7 @@ minetest.register_node("techage:firebox", { -- activate the formspec fire temporarily mem.burn_cycles = firebox.Burntime[stack:get_name()] / CYCLE_TIME mem.burn_cycles_total = mem.burn_cycles - M(pos):set_string("formspec", firebox.formspec(mem)) + M(pos):set_string("formspec", formspec(mem)) mem.burn_cycles = 0 firebox.swap_node(pos, "techage:firebox_on") minetest.get_node_timer(pos):start(CYCLE_TIME) @@ -129,8 +167,8 @@ minetest.register_node("techage:firebox_on", { can_dig = firebox.can_dig, allow_metadata_inventory_put = firebox.allow_metadata_inventory, allow_metadata_inventory_take = firebox.allow_metadata_inventory, - on_receive_fields = firebox.on_receive_fields, - on_rightclick = firebox.on_rightclick, + on_receive_fields = on_receive_fields, + on_rightclick = on_rightclick, }) minetest.register_craft({ @@ -142,7 +180,7 @@ minetest.register_craft({ }, }) -techage.register_node("techage:firebox", {"techage:firebox_on"}, { +techage.register_node({"techage:firebox", "techage:firebox_on"}, { on_push_item = function(pos, in_dir, stack) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() diff --git a/textures/techage_appl_oildrill.png b/textures/techage_appl_oildrill.png new file mode 100644 index 0000000000000000000000000000000000000000..466d05dba30f07a93c80eaf4e22962cc8935283d GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&pI^ja`&OT)rgXAW*2x)5S3);_%z6fm{s+Jj@qfPA&Sc z{Ke;UxEH%w&XwLL{)v;e^5^&lb`=}8GkkfmcjnUl<>CGfdLQ=b7JvS$9?(|6QgF=b z5-UT=e;wv@vsQXmCK;xtCiu940Zr&;-&v(HY#YwomOduHBzdr=gXgTVlKo&x}+lrYAi zC<+8YfGUcjKpjnYlu}636aXNEKoA57!w{3n1jZNuKp2Mbl~Ndw$0&-zy*%$X%Q9GN zXM`%H<|-Bh0f-1f2&}BExbr;EopD)~VKSLuiC@UF3_=L(?(TYM!Sc1+I17&B*fYjV8OZb8`7(}Uk9~KQOt9tF+8Gy1Dd87I;i8h2V46mw z(WR9b4u_>u3PK1ZN#a$r#TWyhHK`&=63cP?9G zIRFq5@;slqpew5GxV66Q&YwTM10e*25DP7@qcsNR;l;~+*Wn)ATf^gr8?NiU+WXuq zQ^GKurs1L(sN>zi_n9owTD!BZV7Y!D>+3-zgm6mq1Vpu%o%Mz5 zhJCQJy$SA`hhI+c{_q%F@!C>!9$Yu$#p zU-d`VNv5k3TI*IO@;sk5qj?PQG*q8t`Y6%X%2}?@O`&c%m)E|vy~!Q*@vgBMG3`9P zUUnwrZ`8*-*N&@Yu{uEZ@%bVoN#b$+U?p4-Dy6WrwB#rvqARg{-cZBY6h%?Va(yCl z&Ez8e{Gx%$a=p=LR1%R}IIn6u=G~%cJC;&{h^7oEr8;fL95`LJW1f(jwqut250gz# U`!?_GiU0rr07*qoM6N<$f)pCAl>h($ literal 0 HcmV?d00001 diff --git a/textures/techage_oil_drillbit.png b/textures/techage_oil_drillbit.png new file mode 100644 index 0000000000000000000000000000000000000000..696d28c46159da6273f6a81bc57edb0ae58e707b GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP-8wVek$#GNtZ$P0Po-U3d7N_4%-k8heDBya3ZBLld zi$%AkJYw3VZ{}$45L(xCa-HBQg@t@>?H`^`DA*#TsIAWT+38a}mn+52jSrkN9i z7P%U_-I-fCkCWlDi7BH>Vj4rq`R-}*S7slO|H}49+rfLv{Jjg)cAIvJehO@l>I>hk p&^gE0QE1YvUkPbPBs?`ga$mY1(as`jFb(Jj22WQ%mvv4FO#ty%af|=} literal 0 HcmV?d00001 diff --git a/textures/techage_oil_drillbit_inv.png b/textures/techage_oil_drillbit_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..606eb50fe68f904e65ac0714d481bec613acc95d GIT binary patch literal 863 zcmV-l1EBngP)fqMi$!FF4wOXbRs z5C|cV2S~_&u|*CU7DkJX0u4@2*loENKqbLeoUthyH2LLFF0vQouGMPjJN~vgsNrVvKy^qE& zFE4Mf04FCW114pyjgHwK2g&x7QporZS65e%QsVsl99?+w^yN+S=VRyhi;Ih!2M_o0 z>HXV5*BN6>{Oz2Bu+~B;6=iE5m`Ap;fz7SM&hMLBhsZVrQqEaPtu>TV5X0dR)>>3m z1#2yc2&2&mDQxc^-{rycXvi1T$%)sw#NzVXeKB z62=&4tx?xC%CfxmT`2{T=lP5RZ4#>_<}%sqx}J%=T|b<2(<|r#tKhxwMS^8-2Qm-# zE4U&pLRD2L%Mx1aUeQY_ggB23i+LeqhGq@;!Qn1#d zX&MNu8Oa>DZxlr_eTK_&;6A{9#X6%00MVWW{x@PbTo+!cD*(@dMuA_aIF znxAC)kVv(1_A9t4%ty{kMV}_rrG)qX)_B+1j97M_UhfLFF+bkLcHAzD?E$jy46v*{ z6Vc3d#3UplWLXv^vey2S$QKPY{F;n0V86mz3m!_Olu75Gzx)_1bM*DwufZyb$$m2; ziUjgJ$9OzWZpYP|4})h%`wN%TZ{L3pUcJ}>uoHKSuI*SUH6_677?VhC$69N+$-7Me pkGj^wv$M0GZQ@oKgujw|!rjuB11bOj002ovPDHLkV1o9$fII*I literal 0 HcmV?d00001 diff --git a/textures/techage_oil_tower1.png b/textures/techage_oil_tower1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c922a58cfb24f9c34d8fc6deef16f506a2c6e5f GIT binary patch literal 437 zcmV;m0ZRUfP)d3`}6bjYHDiE&d%iIX4*&oF0d!JM zQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jd0@ z6Am&4r*EL_t(2&rMM~s>Co1oFYvcpDBevIE7CW5N}VBLSXj6rh2gKtx_14 zG&#eQKl!8x(l8p0JQyXiOhh8Iq(^)}Nom^IPr@|Gv>_(kKKjCM!_{}`iN9{S5oW;; z=%jSJwG8JEz@{12rAEoa9%6-7Agr*K0T&9zWp&1A|2~uz86FXH?T4xW{N|Bt2-wRU zR{*;91e_X1p{4E~^V+hqxf8r=q3!5*)93@urT8=k%`P>D942+G8gdwORDtZ&73<}q zSbS7Ld!ForTh#{Hu7Ms8lHc5@q8ZnKFLr1E7wX*!qNBP$ES%1Ki0drO>$T_0m6ja%>;l zafO0)UAGux5Mu-YG);qPnvhb05aQ+elo9|yYmNK;4gjd@8bSz2DKXD8rfC8INGWkD z5ztz%hZFeGE13`i-h0$_4W-ojeT;D>A40%9&p3l=Ap|I;aJ^nD{9xAFnQ08qY&gfZqt`6VZeG3((uZjpcx zVvRta7H%r?(C^{0Qm{2jMM;z-x;*q-TviH5xqBq`x?%3+-r+g!N1bqw#E~FLct?j* zZ#i)qQAr~qgeMZ#+9ibWHagyW#2ERl_{f}d73G>pNGb8o``o_PKyJe@RC$_Wj2MQY z;^4B%@JIvONRYZYo)hlrSMT$@ODQ3QVD$&WEoxvK$G2k2$MxR(Qio+tLyq@KDLCgU z=Ukya*xes@^$Q zg%A!S$i5MI?{_PKJiFa)hb2e9?L~obSt;0hVXa+g8gj}l#<;5oRv*w>zZ?`oKuYN; z??=}6eMQ&sJzQ1_@(5UKm$q$L<(Zdq+qO?pAl#3tfJQ8N#{C~Xn~!c9$3>8QHIq_e z97oomDPhq)k)?t2`3x$lZx7F>W(Z-$Wo<@62q>l4gNZYQXfY{z^Y{0+5Q$H=W7_}T zZO17k{%%NDv!-dDwqhZ~3z_YEdVafQYpwAQtQ+mH4yXhS00000NkvXXu0mjfA4gNy literal 0 HcmV?d00001 diff --git a/textures/techage_oil_tower3.png b/textures/techage_oil_tower3.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4b428b572dcbd3df3e512518b4f3045ee6abb6 GIT binary patch literal 550 zcmV+>0@?kEP)nhN7E8adTc(cv3?{x4Q3)Xr>6?h!DlZ|zWr-qjiF0>82ZO;i z&-2TBk5UQ%z*>u1D?|iD^s(1DhhN#T8>T zy?bxB+pE?(&Opu?)>?=N?)Uqv7k9m0VXYl!zX3^Pzl0W(8H;JwE@ z&)qCoYsU)^5!6}{V>Hc-XK)t{^I2=xhZ0dY3n~l{(W+;R(KIP~aVipQ`Jxx6B7t-6 z3Uf+{JB?G2j`rg37HwwG@WLm;Z!`Z^;2>bOtn_zoMA=_csw4jobzg~ oGpAz_(P5ySjLw{nMFh-@KQ{?Aqi`WQ*Z=?k07*qoM6N<$f`8@ThyVZp literal 0 HcmV?d00001 diff --git a/textures/techage_oil_tower4.png b/textures/techage_oil_tower4.png new file mode 100644 index 0000000000000000000000000000000000000000..094ca5c1d405da3fe9d5d020e7d5fa1d90d7a99f GIT binary patch literal 485 zcmVZ$N~pEMdq1cLfZjU*tY?6k5o3giAf<$T-vQ z7eW|^dhZ7dCJcD*hu)3yPa`LLx$~^)i?gH<5suFGFa?O@@)y{Je}PZXy9QBj@ahXfUC;X%*-qavaAQ zW3(SeIcMj+2NBtsFvf^&+iq9&ZQE=-FfS##3-sR6T7z4iz~}QhTWiC7=C|Y4+PE3r b-Hv|%nu6hw(2*;r00000NkvXXu0mjfx~|K( literal 0 HcmV?d00001 diff --git a/textures/techage_oil_tower_inv.png b/textures/techage_oil_tower_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..d3642e18ad47722432c202480f79526732745e56 GIT binary patch literal 45974 zcmV)dK&QWnP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+MStck|Vitg#Y6dIs&%9avTH}Gu=SP*XLQ?^JeBP zCR3GlkxeEOK)}NnFx>z7?-%}ypPFk7)%s|&wa8DMb>_vB5r2O4-1(RJcYa+8QC)B4+u>aWq0|MiXEujlc%8|9yeq5*iGehnDr?~w~H z|BI2^96i>5{D1u#;Qd-+>sH(77TRe!$5QewjeqH9v=U1yvn(Fl_qS)gT6k{!u2Rc) z7yV)M&Wz%(85Lcaxlx))Z^VDpj(hy7{GVR`hSD1pOZN(YUrNkBZ~VRJvHY9YfBl4S zdWE;kpKjLv_0IgKjS2s0XTD|qsnE6ldY1q8y2Tg%JiYhMc<+8!)Kwb*ZNCuqd-3Vl zb-?ticaO$zi>6|Cp6GY*tn=3aq4T@=_0;0y(U5TZ6-EyPCMP)Lb|*( z+1Z$DZh2+TC*ORMXYHbuly@;cuz7v|F_-iW$)J?PlSL1D$U7az;KKj^Z}`7n_}*5D zk{Wva^fmL!+Lp|#DS#^;xU7EL`g>2xA3ONZKa`e*>6-fclVyeU^HJfbe4AQ%v~M@! z->_X7(wIbwjnPX@M%7czxl`s4d&x89QnTg72I$>FE4AD++sBhyM}G0woYyzgpBbmW zBKyxjKVuuSYCj)ju=H!ONelUwQ~qhOd@iK#O-;Bk8BMrr0nB?P0iaQZBc|NH>Za1F zuCYAuxKx1NusR#|6z^WwW@Ry60V50>%R#;Wyg(6!#NdaBix->AF0t=k5i ztrd)!&G#_Bt+19&QKA_z-Fx3N)9&RAN?6~iy%`h++PA0kY`N`xcblQy?7LPfJKo-j zDdaNBpb<-Yc9V~G*F9x67TD+ECb6#!S0)@ zyK(1f<>e5cmFutR?Q-j@EPU3n1j>G^CGEs&Mw7GJ?E}v6mv3jz%j>36k=^z1kco0$ zI(MA99))f%%_oe^cPD$NmCrK$XbZ=-YL>HEyDhbQn2|r`FY@osKRy!=s2z9rL;(hH zY|T?=ax?aQ!Pw)ri(C1a)Ul59`fc8LqwY}rp7z{Iy}pvMgvWYt1WVfV8>;hB=as=} z^4W{`!#+2zue7ZuF+zR4C!5v6dUDXd;AHR-S2<9| zfoBeEg3!Ee{m{k@MmRL~3OogK8=Bdk-=#5MUUX`mz;MPrZfCRRnx(CY${p)%>^L{S zY(UZ$M~EoEN^3ECn>}tC@7>l$EHh2G1gh8(zM1eYDsrO%5}U^QVcle9KoG3oyasnL zy4Uts)h4WaTjXXgFjJ^peT-LY`UW>wd)v=E(y3k;9CtNdaLcXVT;U0thk3Pj$`}YU z(7CT2pFbpB$79Pbm#}vFl6g!f1B}6c^DrB*g`gs9Y}6Vu4xP$*ZSi$97A&)zi=1X{PKeGd`=X|hS} z9O^N{)mkq^fC-!MXfak!n*k~V==hU-ymvXm3;5{IMZ>y4tL8-}dQ{VgZZt8S!@>^t zX20%(?qO0G@PfE`X#Wq65pL~lOMI<44`rKeI0A>c8!W76AP|{LVpg5qFO!b35?R@W zbfF{Ea%``i4aV!zw69FYq03$~5DAjt9e6+A$x_%|qX{H}Pp$yUowG0)HKNeS!olw` zp@pqkwhE;A*bzW}4>d;dXsw3auF31E*NhFM=^eiG4~%or=?2vnxc0Ob@>PA{Us|1! z(PqdZe%Q4;(7O1kJMg6)#)m#MgvOq+L571VQrK}rUUV#~LW|qpycw?xJi~A9NOpxH zSo!1j*EgJu0KS3xVR<^F;5ARMWFWiY85nPmh`3*NsPw+lI!Ntlo%VTPs#BZEO1#ld zh*{(24WhURHk^Gu7`zI$CvCkG<${AOAzT0in(YuS9SvcEmLY3!ORh<53$8APxr1QP zzQf4}2_-yIM-T>)J=@TnBiUGw!=DbrV3t7`bMXn&p85#y`ZSCft?w3QdleKZlayjJ=mqyKWe}(O`3Ks*xwO^gt%SE?4>u#>>Hrm z!ub6W4)-Gm&}z_xb01s{V%R|wVpj(;8rYEb=;eAItHf3S+a=P$l;An&wu$I2nE*SR zdMsFp&;aobKu}M%gS9(>G}z70%V(pUG!8hxZ0);qpDjTE?bAHvm)_Vo+@$C_Np%H0ppvFn6%hAh{L{H7t@UIAVJX z>^`kB2C@@xW>4@}Xfbyg_`1Ppc@ApEC0H$4N88exGEDYu@9>2xbrvXmrO;@o4O`M8 zvlNqTS-eT$f&e#E4Sk}u@Gjba)kSQBb>iMVbEyH3u`_t+*w*(oab||$AVpEMKMMK^PToZXpSWF} zUFGt)!6@h#oeQU68L8>Q;mZC(5Bl#2q}z>uXy2g;Yk+d$Ayx!OQKWazy7n-73vtdS zz3W`fuoq=tiBjnH7AU(@rE_qPolzi;O1Mz$wgFoJ5&^kLXiN;SrmW;X#0%rrG4n2c zjEW?33Ke@Fw=opjzKy9MX0PYb2#xJ(p*Wo#v0AVMMXgDFQafV;s27lHZhgxmMRLD+ zHbsLpao+B8$*L4ULHCg2?}9C9FL*+@!wIlO4?guFs?8UHHoAiS1p{qc$(WqGa1JOV z2y4g}?{pLzClOg=S4diqwkU-=fg^z}Z&@v6g2p{yy}7vvx5glY4Q6hr3{=(P!lr27 z=;gx}w6fw(^hF97zJ}@L4cZo0PwcxGWJs1oNCCFo`hiOvKY58hFcT@w1R|s;?M7dx zbOY&-76BSG4rPzHAGVz7;jMeY2*A?33P~>!kz{i&K(O#8nWE$R#EKs9Or>xK@dHlM zVXmhVA4KuUV4};GNFo!Mdih>rJX#+OQ=E};04QM)r|!O{M#AzUkML`1wD!PeV9#mi z@};E%$-C4VoPP{HF$%ldNe{nE%8nCzO#sGtcR5tJ9-qN3$<-W|N8)&Eps-zZfP^YD z;a%|m_Ru(p{eo!8n7Y5`cknO(9iL8^{Ri zTnta+ZxTupK$!@XjX3ODFx5#M1qMm^hADvD5wt+y?BeKy!s8jT=8ehmos~h!Oc*^R z;Z3|2@}HfH6HW!6G{(VKMKFliQ6qo{>IxzZi5C0oJl`LAKn(eYa_2VIQaXu^DhLko z)=+g$gKtgvg@o?oJh71pJs6AK2Js|Fr>&#KgtJth)h0|GxDd%D1Sh{v_p^vsiD4Rm z@yWV_7>RYWw?DAZtw|ao-Q@wYr9tAs;kB7$5V{g%YMFk=_|xUB>0D@UUSsuz&rj-& zDnB-yP>*(0i5QZ&h&wD0*M!Jd>`=gXV-N?y3|lxJXgu&Sgs8Hjlunewe`e-^Xwl0C z7PgbG_BM|vi#RX=0aluwWNnz=#6>?9U~_2&tQR@Kv03FQr=ZEVW0@c`C=!98_D?3$ z*9?u;!WwQBmL)yB1sGz+klpzF2weU?8o-(!4b53F+yP&UFXXC6IX)+aj7?)zG!?>1H?dy@UVP_^1gF$ zmxz(c&`?K84`-YmbeP1VDrg*EZhJb+yQMfi5F6>Z=={cXK2}ybhx|o496GZy@!^KC zK}xt-+Jr;yGQ4mOO^kTaeezeSQJK`(F^ux)v^x4GfPq4!hgQ)cbz~_s;Hjy~{SN!| z#lgB578DA4(1}Au4&~?o2n!~`8CPkgm{Um0$x*I+kpcl3JRedF5qwv=O6NMb7i#v(IW0nfD;DWqW7Y7*TmRLJ?uGZCcG zB#;CZQ|S})jB*rIi7rZKq%T~FQo*5tyoWF7oeceS{50aefjvDk48&=jukE|C;Yk7g zhQV>P9RgjbfSd#706UHeEvK?Kghw)&>&&$Wu;q3TU8av_z?;}-Hu5LTps5vSJWo#W z0+9oXCAdznNFC;Af)!#dF(=?LE24*C*xA{E7WH)v5gax|doMJj^W%pzZ8F>#e?Gwq zNg9V91dLYVPHaD>FWwloy@02i!Q${9`~sVzi%6R*D?IW$u^#fR_&Pj7$06aL8+^nbPwDPEm?Y9a z008#f?MUI&q4Hf49%9SqQ0}MB;$TF|K?$C*kPJ>uK@fnPjQK@~< zNh**s&vCHHc-+wjTV*<4z)F(QvAH*sBQj(F{Po$}aMN9671H;fh>3dNGhbBeeS_?-|kzlhAF zBKe|V`mrpVgeh5GM zYBJ*b3aYAaI=z8uX#h6>s>;-l-~{7O;n2U2yUsPFhHR-30ZB2uoj~JJwA6Pi`sOzR z@D8$RoCV0>qVL;E9sR*RywxhH1x2QqGOAP+G0{2F(|1k~2cGQe`yk2J?SU$`0r(xu zp@Ti0^b&;IchI7*Sui&VQ-XcKI8=7yy`%5<{}(;p$5Uqa2Xz1d00VPENmK|32;1RL z-~a$107*naRCwC#y?3}>*L5Gb*53Qn+wbcYo#-G4iliipsuX1vN|x=h5<9ZSjvRSp zXY3@N*fahn$!HwUcqZ}0&d45Hks}w$vL$&WS+pu8kzx_S0)iw!^as3t?|rx5d)h85 zf1LNg2Ld2LH9qk3`Oe4h5^tYd&iYQMcU{@-7X;gxleF~W6Ee)$ic{N|@XI1E{- zkQ>?khM{c--Tb(nDR(MoPCxMJxLcpP`CXfDey5u&eC-ea$JX+ho9_I;@q7RDH9zx_ zC-3=#X0!R0|NghLLz|Os{h^P4c>j<8*2IA~$}mF4uKk-JLZV<(!Mt`#Neze>{~eW5 zQ53%H_X-gr#k!KWW6@K*orpxU#2^45fPh!tu{sAdIy&Bul}uu8d1oK_!m)3CGCMHt zW%5bbRWjLf^V`HaPxbALvSYSOk}D` zCS)`s0MJYNBF2C#=)j0J^c*q(fQT4lh)6^)^Mgd-a^nj<>L-Rk8Wt!PD&CAmsQ4=p z8~}(A$FUGB%l!aB#=*eWTMTzvGmrKfOL39_;?b}F>9KGAnVT*9xpIDd`{>y8(fdDZ zJ02I7=UByo5gCWvwgC*|9AEm4LI6#0%Y@F^l;}&qv9X92KoJ4~0tlp{t;&v?$izgi zNai3wgg6QmS=rKvol{|R$+fW4Tqq1qY`y(`ZfPv+wyS54s3cfE^H{qdoWJjLnQShX zFP(nqvxV}|;N}BI@A>^bcYaW~sHN0ex95*d?0>^WQo1H|D%d$-rt>CN8y6XuQ0+RP zq{l0hIa1d{c)76yZ=ZSSlf?MS>~UlCfxG|Jrkn3V0O7*!*S$eW&@h74t(;L!eICCycl@v_^L7Y52J z92~Y^n0nP)>obooKKqbxJfqdAdp~yep}!VRraZMr*qQS5K4c;{G95LSmX3UBbjPjJ zdv8Df^*^bfJ#5)NBl-B>{>L4!eJ?U@(ut&N!Uq8m!A)b@;czvBf`~#0rPM~gg|9qt z5OOZVuwOklxcxTaGOsX9WQ;KYga|=%5dqrs#|#k@w$a)zj>NqN0BzcQFp0vj-#+l; zzqx$mOW9n$asIJmon_#*5Z8L6QiF2CfSJs_kU>GjBuR|c!mF?NwiHV&h_0+|B= zjn+xjV~oe$q&f2hvm9ecYu)M87-Pb+Y}*3@!3B3w1x?rUl+qU-`@A9GPVUKjJ_S5>Yl>q;Oeq8rEz3eg z+i_Cs!x&qo7DOQWk-_B^2o3@O#Po*N&pj%oL}JB>T|s9>_3HV7O;{);{dR6*e=^rO z{qT1Py?zjJ21y)@4?Fq1Z&@}n1_X>D=e99M2Ct3@`^MoV2B7nCtEkN(mi zw+OJ;T;6ue+x4(>^ntHif(wpHn=nd-x832&`F1bv)Rz2Q**9ccT4|Ne){7eyhYk!~ z)u0dnXINRTNttjit~R5%E|Z#0yp&Q(xjuWAqQtT+##l--jIs3EA0S*_sb+;NC)2N< zX{{_J%GjL6L1)h$Z{2y@-6tRXo1wAIZgybd_;=>3F?X`Y7$QIb#+ZzII_z<$FtYU~ z&voMVG8ZD7$z4kfO9VHKDo0%1pa`*2t@iu97eK}f!v!zGB}pVe7z8PQFvhqLoH1cp zmJrAo=X^c2d~aZRWttTPAcCN=81y=h?SLjDqbEN1@%rfpcE08(S_{WL&a{e~iznH- zc|wG9Pkm=%a+Dj(GD#e0LQ&HED!523udNNN}G$^U7(d%^Dt=9U$D1X8DWUMP&0;F695j6O}nPfoWhRVf4X(@-fCs> z#=Ab)I(OJ8dDV=?szG_7loyd%T3j$jYY z2LfoVnw>Z+FDyR&4bJ(*-ZvyN{QCd*k?PEoCYEsmOO^J>@W8gs!!vW8D>lU|Y$5D9f+n?mQu}Dm&z@c$ zD2nNcK_OT+<79mtnA)d0i*a*y`Sjyw=Q_8&=Ah9=Fcg+^xs!>{85E`TRb7pCyWQz@ zUS4FpC{_SKYpu0TsU^iUgIDO$ZZ-&DW$8kzI?pYqU0>=fpDqlH-TuB`ADGysl8_-Y zTA!V%CeloeWl9C-$kVf(zT^z6$G>@QrjjX7AN;WoG253?2A!HtBqF;sQ4d6LXiPf- z3|%P`%6Sk3wQ7}ZFl1Z}E-8OpG%gzs9EMhJG^Qu6KCv&&Rx{oYf>N;{s4wFXk!3R( zPZ;PepZV5b1}ihd@wC>S=WLo9a$P%$6Js=I{KBz^xZqlwO08vEoC_Pd;KB;(b4l1o z&M(@RROPjASWo1xY*3IfrBtn2NnO6{GRwTtd<9<^00ZT$c~M z%*Kc9`am(??J~=bY{w-cBO|4xQ3@%Jqj2x8DKJr~RLEwmp zg(2)DJk%`Ftepsk6ez9;iNF9b0ER$oh`}|)5D^oszcMR8b8br&WQ&9S*2>WCHxbFx zM;=_6sRPetJg1m<6KQ5HRGV!R#rn)lG`ZiL_&yKt=jE&g%EUoB4cAQhbAaH+TkP(mK})*Lmn^yO`r%7peMN@ z>`EReo)~P!f*}NoD}w}}O=^h{2@J3#Nk)cqnBS%QX8`f0cYJtodLa9EU;e~Le(~m; z2YrvEg0ttBXXhIe;}cxzMAB2oXLs)yMICOxRrFMc3nRDltrGzwf2na+Z zIB&IDy+93@b7+!YW4SyqD!hCgglpemb(&w;pfJYbI9^$)ZE$Je3%~+_1gI`$#0L9j z&smwvUV%zo4tfqTh9GNc1SmOb6)~E8U-^sSS0dF5I%e*HU0Wtk+$)cN^`lz#S|`3d zJvj^@h{W_%VY$*=_hcg&x$V|>S-mq$ryj`=T6QUpG-IooqBV%F8Wcnzx^fMrvb=mT zAiNFCtEUc@5tZ&M=9mp zQny@UhYoI;o2xZi5$EhVND^j;wg%1PLz@qD>$8X*#t00WH8CGU2sK{Kpa1|etSl|d zBu2(x>NBh*0)kvW>Va0R)C1)-ddw zD;kuvnBHzSd)*G>*B>%CXatzoBPZmRKKT}?jpdLcfXDUvF!g&r7&1WC>veB_)oo84 zzQ0nbaLyRxnT)k}=LCUhG|Bh;MCv4AoTD*BL@H7B(~k_7_+&N-mJ`j3XCD4c(5k37 z5S;l!6Q`TTt`MQ5PG}eg^_3NN9Xg?FgfZSFUw~$7zi(ri6=moL@f;9is5Nx@fh9OH zjtFTk*bp&>LeRl|lg5xzTFL>&co2GsxRfEzbr>ZabR6_Tm3zbMZh7qC`}|xXm&@Ne z-0?D$b!=r2FXN0PNh-_BcwJ?j(~yJ!=Jm*u9wcBEC<45Q{8y&HSR0K9`F!rk`j zHQRQQWOYff)>;Umlre?`=a%5w(2(yatq01Rr0jJ%^8Wk3sg)|{v+ZWf%NF7|cANx3 zTWdPb=VhIVs8*{grLLpcl>jYJee%w$i8aD7&-1W15I7iuz#oLIMl@O*W5OUfdGeSL zJV}xu=w~vyT5Xwg-VYq3rR#`ZptRvb139V45(r=rnd3M_WDvoGv$N-H+tHdMG61A2 z7Epv(snvphpI;~WE&^m=7?_G4SkNO1_!?ns)FhZD$ke1YzRXERKV$FQzBUiBz^_Nzy{t0BDRx zh78#ikvi9G_fP%o&;8=P-@NbWvDr7=zTb8IIM!NUGSfg{jETY^TPTkVmpq5s ztu`_sB5iaOh3h4BjPa$#g(!-C^iC)Na3qe9)*u1Etd*;;w3rte8YHTk@`4_bB%T+N zY; zkPzY`1Q=tDM!nzfG4}F=CuuJYgTU9K_cX(6)+L&WkN|*mPdjsZtZDKbj6jn{;_Py| z-LTAoh+q_f0k~w123#s-0{~+T5oxV2>K`vo7$O>Dlv0B8I8m*3_ib;z)e`*Zk;fjm z@7{a9*gSRWsS|jpICVTSuGmh)HUSWP=@%B63G%`B= z@B`n5HK8_Rtl#f7R#q5iFJmT@F2xD}08)w-zFK%P0ARTp-~-c!6{0=?wiA)c9wN;y zrW-i|0zFqf+F;-yM2w?ITLw|Q=pDaY|CrhZGDaH;!%!R3X*V6)X*C;B6fn*|`!|2S zYxjX52rNr5?e@0reIoO;V3qLi{w%r{r&7kJNcz2Tvu!$;0<+p+iNn{PXP z=9Jc&$fQoFRI*yBGX8S9YcC2(Lxyw9&E_q~%R_h#kr?AztEFn4i=hkW&-%Xad43c{r%yjCxY)LJ^89>aTfEf{ zR~pgSa8aAy>_U{wIMWm5Lf&_rjPHAM3$12H{qo)KEtUr?%Mz*H2T^NXtt=a@UdCi7 zu9^(Gy7NYkmv#LdGET$lDA7_XF7jHdG__?}wqrBK5~WlwW1l%!sb+Ee)-liFnT#t0&COSL z?%W$Ye6vLZRfkI5IMl&ldqPo6Bdi*-p22W~QPP z%VxYZ@jbuPl!{74+ZOoLvHAJMdKC2M=Pwvzv{L71&ZNtMIOqLdzgn$yyWNeNBPSwb z*LOhED)5ij1qlWrHTc=*5&iSG~{}W6b*7frv^O z&t{g&6g{?2~4iwp%9Mw@Ilhg|rc(8hQk-?wXg=Z^7aCwlgDv(<_B>>S;_b8D$I zaOlu&*<9YX*yO}STA$;Le{XmEN5dGF<7JCOwwocMA7HL_Lx95&xSaA18G@HudUHL` z^L)qg(j_^F49G-r?7E`c?cQ?R9oui%HG5&^nWvucGucE+%Ml|(g_#SLAc#r@f4S10 zTj(kc7v|fob~sSZN~J2x^HYC%s?7DoIG)ih%Cz*8J$RZq*y8$W8x_GJRyXol;VPa@$;YV_uGz>CxU^Z zaIFE~cTSw1pP8+V437$iNurLQTHG21g?y&nZmu+|1LeH!W&p`(BbB5LChj6Y*Yn*> zfeW#gFvM3NI1n*WDvV=}>>6jl7~{I`;=^cVguEa=EayR2du` zj7n~&)8~vCGK{f}=7Va3#Oy>$N)qeRlETGY5Pg3Q#5R)H=Oz9OWNdkPL0Fb;+hG`7 zxG{ zR2s(ULaCI=c+F<3*XsxiY}+x$Fhn8}mRQdn>q|K=7u|L`ozzLb*z+l^LkS^-WuiKy7kE;k0_;{J$AHOt2wso z`(C%(QA#(PbsVg^Nsov=X<40fS}!M zuBUCwvH-vsy4Yy&a=84kadVL;E_PpuqX^P!6cMeJ6fS<-v=s*dq@aPdLKUoQD7F3# zUw&|;t=5J!@-If2EmSp;#uOrNub}Tw9QW^_3a{d9I%?6t&ijVcO4vh?G)@aIq=ikJvyz?^Qa@Y4H*O z!Z3t&ph=tWrfn@#rb+XAsZ3%cFb4s0QV}r?cuk^yLnMSaee!s%wp=I_jnSUxpE-5> zyAR!`lv?fMX|Pc_`M`J1xQ=H#POqn4`}((JixYo$&%L{L4g+UeX#ysdCW2Ib4giJ> zBDR`!$IaJUXfG~)?2mr$4R5;3w(ayrBcc%2{onfPBj5c_7zU2xjEs&eDThYJMn}h! zB=P;s)bti@wClL}LeZEF5ddFKX6f%ui&LDJW&gdP$~*R%+Ek zp_s~gqbOjE4-5>Yzc7whWfs+Hr93cLv@F|po;rGj@uyyOaGS97zMbPl$T@4Zxosh4 zETv7mMF5b==2ljgmnyw_+x+}5{Pe@$`SL>#eA~7iA*>X3_kHWD&m4V1Yn{#JZ@KNY ziwkp$&AGE@PjSYhC@huAY^^ohPyBc9-?@8V6ownN56aanVA}U*ygJF$>nlHAcS@D_|xBg@Voln~PULbATb6poeISz77fWSH9+)9#IYqD*ZbDkuz5WKRyID28HTB{Ta1r#d6dB`ZGHI)ze*nk#>y9!o4O6I_qKy)O2+)PZ z!6aSXn`eClA^;A?XCVL>U_hjm6qdyp@3dRTj~#u-JKp`^{a=0bkq2%%bgR~o@o=#0 zwpxMXaLzd*^D`nzbf;4x(7BvHJXl;_S-NntGBG~U4-?KvtC(XvJy~Ro12D!d&sCf= z&V|;x*{t{bJtAYj*nRQ?@&fXjrqD2j^uG;Vtm#sX2J4Y^{NcZg!oHN! z^}NM}SuwEP%MUEf9FG&JwdPDB@+b-%+l}LR)21!c6XT1Ev%nqC5rsm=vh8*!=ybz; zE}w>-K@bcMmM6!D%B8aH51&1^?0W=j@^{b60KonOhqmq5rIl*88@XIz&%T?sY}u}~ zTB%ixF;XVkY?d)THa=CYEL)bfZ~skF%Inng*jQdP0;MMhBS1axWMC9GP;S;m_%9kcK)gM{4rtK9E@h%$ll~l??T2;fBO?#Zhi0c zp?94>{P{QvPn=pBA1$PbJ_5hrSUCFG-|Z$mjx-tCvvX>0vE6J(&+UmsBm}S5tNs3H zzu&8`R1yWPcJK9f++HdVD6MSHEMd)@J1vAYHNEBdv8RkNoQouhpML7`ey=+?G}7yI za=F6D$hg)@aO)o&(jP6+ak2c=muDXRBDZ}nTNJ_qW>rr;2mnrQ@QKfUL?scoTqR{b z@3@|eh{(9$1{t@r#bF?V+_6)QiBW&|j*&;7Jl|IOB6ToiVHhc67eLi-cu8d+g})(p;mlV%x55JC@b6_+R4!1o^ ztg66Wo1gyLf1Z8fD`X@BSeDH>cWmamE@ND2rDW{n2H*6P@0*yI?sfyq5)3g(%-m8> z8#6ZSW;6DVtwXzZjD}&vxfmUr^gNd_w!F0PH=q8*=Rfx;+jfGW7e#^KeCF)QIEoN4 zlgS-F{?ysCCvUm!b=hn#2m;Q9QYxFx=kf*Hw(Bd^ey_)`x3auP4FCWj07*naR2E^^ zB{;}{m&v=1?Uly%y!q#qijyQEqYu38LsPGMXQz5T2?JzI8)b}Pj7yoM=`SG!8Qp71 zDWwoxX)`)f%w@gBrIkmXIAdFE_m1+=fLE!t=a<^P@A-a)3rlP5`Puh>;Fs>a>+T@v z5fSG?X`RR<&1^BoP8>U0Di3VmzU!d}zAcj^2>Q)NJzpp$Nu0{C5Z84u{RfBiha2B& z$%P#>msAoMLk@!*!5M)&L)+I;9cANw#ehJZo{VujWJr^ zuyxEBee~FTzpn_Gl#+8+S?LA+UJ&#=&qDyq5~YIo&T3no)o1Mw#a)`{&WP9BX=d1f5r7*fq?aFn-9Ei+F(_1|PLbJMNVr`%Em-rX}z{~EdTu0FgATlXqnIymjB5=;NQc@;Fz&O{&7;Rk7 zLqx_PPE-_AdVdj_?|EPQ%m4H6cOTAVGNZ$pnc3nX z!QG={lihA_dSbwL`SzU$e)G3}=jK~plO(ZaIYI~mlL`P*aw-%`=gys6T$n$2(=C~7 zE{S7gEMF*TtVAWE2rZVLvytS$KIFM+CsR5W*$`M0PP( zt(0Pnrz$&$L>z~E_8)X?n}~{~0c2>55$o0= z(@P*ousPX$Lu`a|oq&VL_B_iIseH?EGugpS#%R}d1!vvbd2T^>=_CiElm?(MO1eEc zGBkk50n^3zdixzez5T$er$#bSoZPr)YGSN>eztP*%%UY$rM64UjZqd+Mg$6>p2 z7Ljz^LquaV=OUlYD4iHW#=scE80Lnz3``a3YB&mezK2m9HQQ0EBbCzW%7fJYEG#uG z+lk@`NHN9@ng<_xaAIPbbDnPG8^w`r+w&LBb~|k@L_g@y&(7@IyKm?A8gmNX24gb9&xN;g{Ww6&oKKjEkh-I(Pq{g}sL5<%FB9pL=}i z*$23rl}TiK`IWPeee?G}ETev;3}Z?NODf4xce)+dW{6B1(#9;Ec!ni)*L982a|?}? zM#MO0>=J>Q5KIVRv?`apZZ|r4;zSa*3PY1oyNLkC5Q6DTtcJGWXpH&%XFjQkic|Xn zQC7f#D3KD8YeR7yCvn0^S*Qgl2G7-52+z*hm#|KGbA!( zl!hyAP{w|E^g*u#=0G5V`nkuFI1+A#3n9aJWasVe%1o`Y;N^$Nn1Ru0M#}aIL1RH1 zoy0NcJPhMh1nxKvV=R%zvMs@w($H!roZ}TA%yc(iBF?$p>nn?C;rKj>fHAENA{Zht z3Z+uol1a?C*n0cV7#W%fGXv9%0STWxhqPnao@0r?9&I=!sY{H3Q6Lpq9JUpr%_Yqt z0pz5lQc0Qe(Xaz&+N6os~JAz~QG^Ro>DmNBG>aQz}6 zNH_RFLu9nl1m_pxi4m^PJux`F-_GV&7S9S{r6oFHIYb5lbJ<+|#J6X@`&mQ~!ZO^Q zKl=6B`KJ<j$N#G-n<|*;P^kKyK`Y@uIt}Ad4=@h-bnR6zU z4EsSZjDHBzzxrFRd*&b@Ve$I%nV?A>SC%hLkcy3J4hE+F%?d z?$9AeUkEz&fVAUy>F!LKOwRLsrBrEPP;k+0E%#bYM6_*(0K&yn^88Z(kjW1)#-F|S zPl1W_w>X(nA?tHtg>hn8*3Mn~e)a>uWZSmZGNlTJsFiFrJMB(eCJC;sOZ(wX|D|^u zuPd`c002RA!Erp9B%EWa^vw9a4!hb=6a{MvKbB~TYwP$d%OXPCwj9UN+Ss$rGdZnIE>|>0 z8l#2ayjNpP^}DNlMjFAo0cV9*GreG3d>58*!TS)=yy8pey^vEMr4e0THSg1 zntFNTRXm1kyo##3XH zT|a-MQ=4VnvTX|hI2VjDW3+8M=~7t6&}hxrYHwt%wbtM`X*+XT?Qu&0fVOQ*DYe$= z)_+8xwX`fd&Dq!MjY@UN687-$h;7?a#zdyykFwd^$jE4~-y7QTnu*wK|TED!cN9mnB}@%l>j)QMwTx9@5;S5jaxE`Xk^#^AL*>vYxWPdSFJ zm^8V3h1j|+Fjqf(qbyChTFRVpRy*}@(q59g%h`-vFB9}TfJ{o+@3zP&0`xOEP4MK` zKT$pRL}_sJhTS)oOXd1Xb;quKAO5x9ESHC#dHQkNvK`lvakA}(J-K{QE6q5k=k{g4 z{Ji2s;tO7a>*(ZSoQyB}DfFCozLA-Oh+B@GVNo0t8OwH3DR~q}GmreOaGb%dubO}Q z8@02KmZ$eE-v8%Or^akg$wVemT6=TdOcaG$$-?N?R^_~sv5GoD6lOCMLNEkcTyCE| zUzwb+`az_Pkx8gz`1;%TB0wBRp67SFog_&d#~}hl2|%3lTsBh}o*p~!V~rEv^2$@) z`J)k;($xN3A?H$9S)2_QPZUdK&znMku-{W!-Sy6&dgGlx)@n3A^Qn(>#`hn*?cC|( z4Y@)Dj0uAH8jZ-6p8NGK2wuxo>v-rz2uW;IU>M=p)l-khy_yWWhCnbD$5GlN;Ouul z$2k|a$DC|){#gC|5n;J1>>#qVl?r2QsTxm>dz>>N+^AbOT3ePqSS}Uwe!m}`Iy+w~ z7Q)E5jt~MZi!%*Kf{1g*ZQB;Y%H^`zY(9#DI8HpzO~pR>d{N1W3v1JjZ}FHK-T&6d zKlK}NZTa0F_@{4q^DT|pbHDf7zfqVNeAiF@V@o)H`2T!_jCs>t@A}|}KUA-UM;||& zB=OMj*iEGb(H3-j~%6= zEih}Zip3HD^n&9_3JUqg=Xtf$dhI3)rUUT8(!=LyU~{Nk-}w17WMFGuY@XXlMJc7VoSmPqRH}{u;y@k0 zEo|FPn>zr2Qc}r82y6daKHyu>T0FIPILZ08Wjlo25Yt-i-hb$gcfGq>SvY<2Sg|x< z+s^3|$L8l|XU?81l?S)(*pn}mkn!{r&z?R3jGHU;6L?;s?z!_~!vVU=(y!-TMb~i2 z)kd<7X;Zl1-OAa1r-_UU&eM)WQmJ-xWoXyy%bO2bwj;8`jg{pvk^bPObek=$6=S?m zC>pZkM9C!9T9Z+Qu^YH>$e72Eo^Q7L6Jxo9`=&VO1cVGO*#HU=0G5}Rj7nU`TCR0n z*GZ(5GFfx($Z?(4?9ohNu-B}7`Okm1*X^de1mT(@aPPre7~{Eo@y4598}xfp#t+~3 z)ymS`>)!lM1Q?&*3dn@8QsMEsIeU@GeyLM_mGO9uA4Gs+V|pA+VD-%5s9W=kLkPH< zCJK9kLF4oTWDFt-;c#JTl~{sDMiVkz74%Y^D6NTc&NyGnCDsmP_5o$+#Max zO({5arlK{iPeKxfOBn_t-<3#X+ z`zGN_u{Bq{gsx%a#@!wAvLF@&=ayw_rIbl5%aTb{9^Jg-j-S;@WLb81>DkK6)1%|l zuX*F!j~{s`B^a$WG8RRV5IoJBS(Xh1`}W@O;QUjuRt&Mxij z?AX(6x4-b|kDq+z@i)HxC$hQXgWvp8r&YHd7l7XLkA9JmNu_dyG7)5Q1t}A$HKd!8 zzK9QjFTJpWFKO6@-l^$Ixi8RKb07c`mYqa_aI$;e_)olo7soJZ_rLLH|7KzCe06Cq zjN&9oJkLv#gmWPnYNZ9|sjFd(nLm4sr~U_#WeH^X^wBe(vvXv)fB==cA_A?A>sb4D zk21!D5SWnCDwlCA%Rc?=li5rzlgV->(v3*NZhK^W8o3qrI|M*P=T4uv@wPWDFU&73 zoZq?c=G$KXb|Ea=@xJisk0Ilu6VvBTK2sSy%)V5dMey5B>WDFP-@~-PxX@AbAAAMjoGtE#*Z3(_@$N1@)YONj(4&;Z*Hj(jt zXXp0eOeQljHpw}+Y#RtT7jYEqz3DY06PtRyPAp?7lPC&>WgD%vjLQSV>0YN^CL4y) z*T3}XmFm)K-*R^%Wv|~&l87;6jNftBPu7;_k3MqW?gO_P0&U0`a%^vT@j?&=jEi-a z{u0@kS^HnJ?!1zJz}CHBX6=%z4?_dYtc|>USo+tE+k(MzJlnFe0~48iIgUda2l>$( zdW|I$G`9^qfLL9ci^DLNFZr1)7oyv4kk+o}Yi;sbH=A)_wdn?%*tFdkqqLNX%4S{9 zvv=(n-*dzG`Pte^qf;u_yLSxi+CG@^?D@r&FbK8Lwkz_VIQoe{_;+Vd9DVg0-ccGHi{seO6;C{KB#y#vtA63! z$?ba&5#s37_BcrhSt>%4Nvt%jpVxJhhvw23^gE$24_Jc>TT8+c+mJSe z8L8XLrxmeo<*bT2$SsuwqkG=qmL{M1;_vFP>1MLu_`+XS7B3`m*zL3s(a+=@&zDL9 zfYEaA-fh`jQETNm-o&QuaTHmCkBydn&mJAlwK`F$;QB5dJvJXFAUJvsJ2zWDesWI9 zhzLBF4-NRkqoeQrxnDi`%%f+HAIav6h`<;_fTg)}n|JJa^_$;4IJU{QT?FX&x}A38 zj<@~ft#5dj(#CT9XOBKwU7Gd$jAc7Br;j!3HP6pPaSX@_m{L+3Z4ALGCa!UUpZ{>b z=ty(*k?YWaX@{-!)W8z5dd6oP)8imxy7k3GCPE0t7y@#}f#6l|`e!T47yjxGKl11Q z`G21|eGD1D?M?4F`0BUxI?YV3C~Vg#sSU{_EDa1=jwiTqJwFJ#!V*NVWqN32C|@dA zhaW$E_I#Cbmdkp!Ef_)~WyW)S&l8rz7+2bikK`QJ+O+HDJAeEGhztR>HprNgl3VuB z=ycF+k4$ZIy-Xq#t#!6g+P3=;w;XNo{F!5a|2KbPlyqH>3#(a~Kl1Q5T8&z-+h*J{ z0DiW_85foXj9m*F*3I#YV8UEF_)2fG`f-<{LG+B@)P;%~Sd_zya%fo%ZcMX+L`De5 z5>~osEQ|tfyR%2Xo-GW%@5BGw!uiuDpFV7i+I8^NZ+!PZQAy0XsMnS{tp*nsXG~bu z{Q1-UUYl_i$01`vE17oP;2iq>kaO1RM5Du{1A8Vdi`AP^r<+WS=Qm9a7-Ni4)oRNa z$r-j`LjAtSxBJ*5V*q#i#_kaA?lPJiS z2LYI6IXiEBZLizgaq#w$$*n7u`Ps9_ZO7%DJC4_FH^Y7}j$@@YA`8QyI5;+64VNoT z#;}<8_uMd+&w31LsT#~K^-rB^tTg%)qa`I{&bTqqX!Z#Vv)wQXWs(pXDU&3L9mnl= z8pV-G$IA%YOE;sO*s}W{{qjc~*FW;`y>6zUjo!NV)*BAq&KL(WliT-=PHqc>pt^Xz zQCnt~qm}mkY`@d0RTh}#YJw|H@a5jp@umq+vEkw?D%nIs7v z$L%(2joQ-d-}}M*;CQ=H+q(bNN@+rloEy?}XO9(zr}o}|V%p{}a4MVW7dQpe0*!U`lOf>?oa??T5g}u;-w4{ZL@5iD5JD+wJO1q9zpb8p zKqfJFa=Y&O5VNxnf9X$W&d)b>UK5rkc4bNv{eIhM*$ZfXIdolHYb~YhN6L2WZo84s zh)%aRPypNF^UFc6Z!EEHdsQ;bEp5N`ZqkXANv{{5J2#t1dgCwrPG)Gcma*fyw&MuS zy430fvZzi*BP*9GTj*_chxO-qENo&YU@1xLrvj_rMe3OO;kUMdw)~c@nGGpY4 z(@V8_hjV7=65Wh3#>$O2wuLD28C@zkItiB+E6r9rb%TgVDH-(Im4%sOhreOlb}Cc# zGP%Y|_1@3?;o{k6N`s?^zxr3l58umdUu&baAtEPR4x*?yJT*48_0ezqO})A(96ydD zZNMPE3=muc*O#LKIUy%z8RnS(M&5e{Tb5mAf_ts)&N}N9 zKJV_m$859K{MauGNzl`x=~iim7dJ98^S!wDymR(mdzsH*7BGvL5f}pXU2w0}N4h#) zCrD;IQH7wZCBm(v0vY``{si$euqJ$R3Iqtj^-ni^`LjfjrU%E@6R&R6Zic` zS639{x#Rl<>d1db{h3Y{225KpEtg9&y&OqUGLE2_q(F$66HerNv~gL8)$q(hAh3iV z)TCAY=%k<^mCh^?X^Yb2h?oW$02qP`F-nP2N;g=VxZ;L02cCNFKmYdiKk;j$>vp_w z-|r|XTSIHg*|U+Tsa>mpqOe5CRAyC+$Gf`7^o5ybY1vC7|IQ>>DZ>;g2C4Ky54*I; zq1F;X=@`j-r<5WhL_B%mneNzz;qi^l()qk-5Bj}BFMNB)b$4ES&&NkM?VQ+h<;hnb zef%q*&P9Q>EYW@)Oz1S~{kDFg(Qq{fr`LhR=wt%uXdj@b-56)WaoQN?d zhpZRB@^6WvkalVM#G{}2wX8jiQVEo^XO9rG55!y}qSovjE2YzTwy7)I9^UubiGIJy z@*xm!q;zoU?;t3eVw|Hx07P6`iOx}xtAV4@H65rbrIgmX-(OKmdx}iF;i|VDeeCnj zHGpWXZH=xU-nx6K=PrBe$NIhU*h}APwYsfVCmY+!osl>oY0*cq>mC1O_T+09Prhcg z0@N;~$iEuJ9fP>Ux@IAiWCP!0Ah9}8gTFP252x4FXkr0F+0mSg#QbB(^8zue` zrY116HumDd$6mbeck=eA4-J4U+QT9EB=yS7QYng&nOR7I$P@u&jGqULLl!$Bo2XnAn#)&VipJxV^m5`&Gy%hTPa2D z0)VhK3n7LO0ix8V87y8n@B~OjMBX<_XXo}mIapby7(*nK(mTIcPg!G5zVhw)snZ-I z#n2hwGPZe#vYFPpsY^haw~>QQpd;q*4+Ip0`>!7ZDWCY>QxcMi-}gs~AG~-}f8WI7 z@6*cq!80EW&MlnY*BYJ-#Hf%3JJ+OQFUA0XX${2~lb6;dT%Z+#LkI~Cl;l&AGo~>n zMH(T5Qd)qlSLSzJHa4i}?1kmrPITL?5M#HE-LAS}P|;A0dcQ4|6|89*6`d-LZPFCGU- zMBHyHrKB>bEh^uiJ9GH)ZwyUrHN{ZkMXrj?B*qB{+ZrYz`3Gw#`~x4^_dmf;Kf3&b ze+>P=R|uDa+kgE>iP6~Q3rC;&+`nWYLhwz~Xsri>zLZKSl|biGuG*%gPDThmq0H0c zPaXHfbxYsM^8yjA%@CogDgbC2r?s}$2#!JsO8sOOL~+$5Q9uYWvJgxmgfxq{)+%kh ztC@vTYIt}gMhd|v<)?IP#TZ(xj`zObU#XiWfiPk)R{sD1AOJ~3K~#*fOlTG z-qnJlR7wCUZJ8n>#^9Q2V2dGbY+064N@I;RHiQs@2c}y;{=biIzACsX?T{blmqPe^ z*cU4J@4sdlD9iHs{`BJfba!+@Dcv+pmgNADVn&wb02rgMs!~dw7J;>vh`sko{xL-q zrF8lh05Zo`t0N_*l-7G^j7} z6PMq3{^%=-|LwgpY8Yi#+WS2 zwbltyV61Hojm0?A@2@bEZ^}-)>tkGd*)_f{Q&g*~GEkg8{+dKlw7P3HUAcb8-m)q; z?6^iq-Rh2J?IC6m9GA`=o@vT%tAk{fWFsRf4?l2>XCdeZM(ThNBm^0rdC;;=kh>`N#wA)=NwJ|nEziK<zw>&pAJO(Jsvh=QMcSis) zhQJ8KOu-MY-MV4-t&e{8H}^gC1r&Vs-5+NbM_+jKxvzZ&V%_Rakgr#!P8ppAUja(N z0sv5%*B<%8nf*`Y-O=55e&p!mUj&qMXATA5{C%@g{^92w|HJ0to_Br>5Pe-GiydE=FMR!vymw7g8Jo9<#|KNZ)@CtAqe3gU zP29meUQa8!`pQu$LwjW1 zmR;8$d*LBKS(XDS;cY+l>lco_a`wQ}?RMv~8$ZN#zdbrRyy5aEKmV^mNSkHT$M@a) z&Yx+j{xe_x-B%v^yw1DpuekQxpZhH#)%ACO^xXa@Ru*Qa4nMQ*^6R5-ASD*Yp4tD@ z;b;C@BJRBDo{25H4nI;$DScguH%ZC(O$Ylh2#CQ~Rmp;540&hG?3u$x={1{o&YnNf z^cRRo8TOMnsvMH_@K($BkQ*dCRF;(dNyx9 z5)2SnfYMqBK$L^UX3xrP zM%TvRjm_$^*I%4NrK+lwQpPB@U46UFtTwj4IJI!`M0;dya19F)LR>rEe#_3yEFdk- z?+zWzJa_s)<9rCd+qP5l?y?)+HFN6VD-Zseu{k8kbLNvTKfLYQyEbgQa%j!knNtTB zrcUmE;;R=9KZjDs5E7eB2ob&8xbp@9DiY0|KfZa-U01*TBXxgKDlN4k;$zR;4*z|hogu+(aGm6TGdHJdIsSz&Cx zc=1G2mpbo|tJd$>yZ!20M9bBCWFUbC*-?QYn4Gp9CP3<70;;bMPr z2GtLwk^TRt#le8GsRr{GP7*UBy1KmKy}y`uMrO_&p-6&h&Bh&L8@3;M`mdu9qZ==8 zwc1CX{OSu2e6|>wK!7!yu9!P>sO-&ex%&2{sZ)YN>RKYI>65P^N@Hx6xAN}j(_jAG zy0?%Qt(k@9=&7F4*~C~@6zIeE;Eag5X&f^tCFhp|MSt$#Q`f!glf#o+D27xwnXJ_v z-+b=1$E7l^skBl|(Pl+|X~t-cD2bRkGDU5&*Pnf$>dj4VyK2wfKYi}-3r~Fhx0h$m z744zWRHGZO+;zu?PrmTLD-V8Q=J=}{cHJ^MvA!5uGrsLD(KiA>E8Xo5bM$XYd-O-; zSZQ~C)&Y$^>8{hNu6uq(8)bV|~7+Saesv}R|FO}&|Y##KNQA*#GTle18 zn>{mFoGIGF(Z?X;1acB?3cC$GNiLrO}NT5A)6Tes`xYI(Lbx>g9T z%l^>1%Xh!^CswAwTy%z%Qrb?wMV%LS2JRaTx@OpL1Gj@ht&Xkx6r+;^iJcL^r%gSBe&rZp>z zvsJHmX|HpZv>hd+rRbVj@7i>3zR=^<5tx^p*sw>Eo}y{Ea_R$_$N;x!&CQ15a((byL z-L`uA`PYePZhrC9**O4t+18Ow>pE5A54?VEVX$dimim-uLhR=X$V| zw}${20gNr4zwh^-`Pyglb~kT#w%_<}0eJDyGh42?EBYo$IRw|l7_NEyPhWohJ2?g+ z1RzojLcpGTKe_3Oy+ky3{={H$=BhhCwD;amoPPP?`7?(%@41Wr#-|vVqR|#X1lRnd ziyTZWwO*P&6RMul2AFJXxIH= zI=R_5wGcu|R7wf}Yit^lt=?&=q|yk`>(^5=%dYa%v;8bH$4<`pz|Msb!(iZh%Vm~X zDHRKzU+6FPnh;^(!ts&yJBsdT3;_|P(oHp(yKs^s1@B#57DHoAwbCA2-yPd1h={mx zb!T{d*X{4C`b*zanz=e_4{g}7M^IpaAm!GpZ{KmtJ+0Ao#mMBu*0+R9qIeYi(Bu}A zx0xwYd{f+4egqOyK&g~O8AG&1Cu6sCe(#D!BA;bWLR$3qqcUzO=U7OqW>qZ(Ec3!@|$aE6U?sl^7 zP|G=Qj1??~hgu^Yn_1N!T|af=wb+!#WHH7Vy~&Es=sKx1A}V90Qob6LOEV^GF_QoR zfGhLU$6tEb7TxbMEoW4^8LZ5mJF0C?(N|^v?7?T2E}V7c%FM~vW{$tAvlbHxA($!a zj2fFMspOl~2YXW&2PCtqRarOh9VZMmku+J=UwY)T|Hs_<<0@;ZEYFG#BBbePmgUS` z*Jaio>aJN!%+n_iF3+7OCLx3|y45PW?VKX9pw#9T{y0cO>?;J$k@>2mS?{5>4T5|RnZw`rUVACMd#S_4_-X} zngGaK-L>1Udj9@DeELhjGqQH;rfcqe^;>`9svb&}z~f920Z^*>b4MwJAHG}Uo4PnI z<>0FT-7HIYL>U`h{n(%X>)BHWDaK~7GO^>j?&##8wOg495aZKd{P#qB z_1!;xYX8&ckG_((I)a&Exc)sqH?d{s^Y{P9llvZ%N;6YdbYFkwfqf5uzOG86P2TC= z@ZMisclotv55M3D_q_Y($(7T`UsX0wzO_sgVqhT#OS8=M!#`Qxz~DVI zDO>oadgM=jbN19h7SJ9U-*Lk|bEghWop^QE?eDLhlPF{G0`>Om-`QWB>CK(%42>A2 zf@_+lK}2GhUmSRsggPjAf9Bvb2Oj%MWMZbO4i~4FXXciyHHdKH^!)r{DG>nR{M5?q z+;Y`hh%rj3di{E7r8@A;BjjpjiY#lbl0;%yIDca4;;}UwuM|SWx<7s9$l1d$o|V2Ur)dGRM8nd^6UdI-2VqmVar=?Lx862Pi)=2=dKS* z5c{9}+QBEjy6diw9)0@0roXf*urC#&B8n*0kA6b>-6GlW-|*t^l08g^3ZS}pd|wPf zFf)_VcHzSD`~JhPPM_M3+T@+#HJf&xef`Cysnb{9_Ws2S$6I;syt8@HTby2;Id|nv z?+zh`7)Lf-;e%I7)peaLe6pgWq!bc;J$UTTe(U0i*R(CtaUO}7D9`lC)6-Ma%Mue; zRxr{2LuUt7B#O>C?>&J&`r6BNZ|?k&7k#y&w9(oqWlq2P?GWPVrYp?c=X}``C*Qhq^zy@yeYyzY7tRvaTAO ze)ZeiuYLQrt8ahqtG|Eo)a%vC{LyE=X7YA$bul#7nb;_Z-YhRbyacLP6^s(A<0t|V z@%vu^g-7rbq7)v5N8zOK61)^%3YT6AoDxn6Cq<*6QKC*S4UK_XiP}JIpwa0+MJXYM z7?TiS-tN5e%|BV0J1aohqJ7ov@4j&KWj9#7@}_r8pFTW&@*tYloge;G+3#tS&z^W? zdHUqqtylDy7ZzvET(0f902;qkRM-t!?$bQI(rTUz5|-9ag) zW(NSPQj^RAC6<*_$`nOWRW*p9mFSF29DC}^&;RuwI_Crn5R6JMoISjD(>7xifXIq& z(H$m=-H~ydx0zWf8=Aqw)aeju-Q_pD?c@JkO8v-Ze{=ET$$Vt}9UuE=QtPVhgH-+b z^Ydp9-|)U)+I8D|v-a@er@l6}eed~0&n-=zlG-MXV^q37e_^mVBY)`Ql|;pNAXq^F z_6UR^m}5%clHEjt-T(j-B~UKn_i5E}LUIG7iAkbhFhzQUJ4D3HBm_&82`o+=Gf^8E zw6;xC8I#YQJ1!;Utzne78JoSxoW$Ci3_EanL^Jk6@jZNHk&pUVS-MKRLOyPA%GlLG-Lt&KKX+jd(mE{chbn@+#>bW!BibmwNKnT3?nHO;x#pWU_h`Yi9P zEY2dp<{ej_dHto4kugpvHh~rf84Ma%PHfn;{>tmm9C#))gPY#_^WDkG#q%fI?T)ee z#lz3qp|xOIn|9xF`$vBDsW1KRsr^q6kF2?P_?caIeazSW7(5aAri#J+@SEsr6we_< zAtC|_W@3_3#t;GUlDw_}Oiwx_owG~pca@Wg64Sb1A^?%BLzsyL3uFL+fI({o*g)^DP_k8F*Pd)S)0&1)!c+jtwjQ^70$*7ECXE{j)O{P9r|CVfXF%noUw?d7in* zm*V>0!B_i#ant#S9xFL4}(4cq0ZDD@{Eu2Dz*x z1iBQNLX4xM-HFMu^JmY*5U;)I+L`m`P98b7<+81J+;#m8H(rrre@z!!s(jCT@A&Y? z-)FSZ*33@Nbi2j29oy=vHd-5FopZC(Q_i`%ZaDhkA?pTL=;9zY9#q zD55b|N@OrTh*0+tvFR@og%Cs2G`*FTtFPVlWAD3r--|EK&(Ck!w)vg!x$}u{J-BD@ zW!K$!4Kr9{5tWvdt7dWPkS|J*iRnYzwe1J{XtjFw>s^5Fxa?t^Uc>z zPQ;hDWJkxEr`~bf`ggqNZa_SJ?9h?N|6;u8t>3bl8KhK32^5|M1lCcgD0CD$2pw3n zP~RnHo%AfeM_%Q>J#rXmVhp*~L?jVdaNsB<3TkAsYDP$B00IF(62t}oAsi7S6EkN@ zNDP7ng8&qX>#aZtB@_x4ERj;IkpiV;5MF=>h*b0Z?3~diS?UP}Yt7NaN17(=+_nAW z(NoJSE83Wio7O3ek3aZGQ4~$%5FpPpg)q5pe0qAmD2kKEPiv)6VqMqFVo(OH!21Rz zS}UdS&piIJ_b$uK^z0x~Oo!dy-he`g1Fs$2ws}2sT<-acGj8)bO}zN6`yWbpcK{d~ z>b~;)J^|G24gmnk>6!&yH5c)u7I09U+QA|Bl-(%jLW7`|`v4pLulKdYfsB&$^j!5Yg<>5G{~i~x{jnGYTTL-ZWeXLFY2A$SCg z(J{ruQ8dOdu>>GyEuz&BTwf4}7|OB_fJ8JswE(~)Bg4mzp7!2bYppSd4<6gU@AaZ6 zq)c2R8DsR$D=qW9)o!Lrn!)R7Y`h}jqeqU`ltZ-|G7I!)ta>?x)4ycJ^@4Eif8D_SdK%+$rHL0KAO zUfb8xN^7Htq5u%F`O`o8(#*`lp1oIo{Acg628jIo-**!V|ImXkG>yyiBDZ9*Ar&H# zL2O)8E?2kRx~spk{OH3ked`;~?7en(tCiPvS+C52Uod{q%5xXIL=Nt%^+B#(FYpP2ujTqJevr)5VR_d%B&rOG!kOWy*&-hLFs|QBa5t5unTv(xPLO5Sm5`$TQ=EXNp=Y=UntPNLl2$_tBLr zQc8iKq!fyk60RZV8bFzbELv;l9DtQF#YXl%rjTQ;@!nrj$cxq{8d->uo5m&k5&#$) z8a75REiDScLqkI$#D2dg1SS0)DOI&?Lgp5Sx~5&A(ydO*gfO0GdTQ!o z(|ANMT1k|3?Tj%}DrWM&$+EoNP9qp4gh*?ps%r23@bCzttm{fjb>YHXp66Pt|MbTX zCC+V@*%*cQK3!^_=Z`;rAH2Hn?Be1A zATqg3v)4jnh%rWTz^sG-0fhkpkpv?m6G?=mK%}$|A$aeM4k(c#8JuSkJO`%fafMP! z&w-UyO2_CtX93zw&P83}xI|D!38OS~An$$f2!JS2a&oAN+(-}xw(dj0iekA_AO&V2xHpB6eB5>Ip>?kB?MNCgb3aTAs_^wWw|kynd{mi zV$(PPDFhNlX2BfFvW$`Hy2`S=C~|8}r_-tH+WQbf7z~IgYOS@_)(#bgP1oP+RsDW# zZFcC;#So%aBE-0E?MRkoQbGtm1o8UoXWn|tRtbTE2WG1P*b$KcG)k7`01&jwiAhV{ zL?@+0@KSQFO^ngGMk`G*#2Az7HlS>r*IFY`@IB{zx6LswOQR`9qH|IzMWIHCuBo+B zR$*0@c~NMkoO29-LNraSwXqrzqF~?3Z44n9HB#`wd!-b|$VA#|5P@T`#x|~DCc%_j z)40lLn^~=t3Nau`q7Zze70%9=bwk~5cWG$}Kse`s5))22;xb8}78Bx2m;+V$N|H~pI4`=)8u zuit2lO|w%37!3MKYbEs?(n&_^mELlvGpw~fapGt>7ziN}bvxze$=A3jT14#JO8Ou~ z)Y^m)`u)Kh7*zo9-fOK9Bo}Hl0+G!NQ`(y87UfLh>3|&LS$wJl(^DsR#pZ{L^j<`A)wW2 zwc9NKF&I=rKv5Klbx28B1(Apl!8yOYypovK&UtH%5L}j(QZhzzuCJ6d#wLmTEX$0s zgF%0Ebj=l4>{?t}DDonKhK#Y!I|<-JWTx)Wu(es!Gz$x}6JwK&Z$b#`)@~%`UT-;E z;`I}8j9y9*0+muRQqweuGO0xnag3p^n*>--@*!^+@RVgG1SFigb5-JJrwk@VM?_4@ zO(A$@iZN!H1wdo8a~@G5qLNB06^ZJqgrblr#j4M8+F&FlCfNZ*6u?c>AgtE9)*9Ei zbp1-INKs3vtYX1~eorbTrJ~rVPNy3~XqrYV4TvE`0O4IDl`_VJ7_7-C#zZ6+tI{)q zg&>LuNP<$+&|1sH=|&{SULvyABu74_G=QMUi6fsT(lJKCq_q|xjIqu&Atd+~^!ugv zE=E#H_If=b1c0DRYG{|XEE;2oNC=VC5S%Mxj3I=S)h6?=rKL2-65cyRDW!C-De^)o z6DbOiRaFCkPv^8!#%kwkKy0--mGgpS<6P6MFtc}#n4N1H=Y(dewJ}Z8P^1_mBBp=F5Q?J3f{93L?Vb0|YpvmuyGjgEfKXD0;Oiz0K2yp{ z##pH?Nm?Wla0roznArKoXswN@>)Kjtv|%Qcm|8~8duF0YF$Se|;EuIt{n3;%`QqF~$x%p0aNXPp0@k3)16N~e6&bhI%37h99 z&!17sc87+`a-ft_G^op-4;*!O+x9C4&_f{rq}3jf7Z;bc#^K>^p5^@k)U{7hY8B-w zW!(hlLaMe9AQDLwQUWo65LzolIVdY;ArV825;4Z6-OjR1hY+*OxF$BO_JmG(l@41gE$PLS$LyofjY|5&|M1q>mOdIc=9^X)~LagEbb>r@29-Sk;vT znMNOos00Y_eZov@ts}*{sf(hWWqAl8y>&9UOT$bbd}giIx~fZKvgF@Pk%%d?NkdpD zsVKEyK&3}cER=vt9d}0j8~rQio3_Yfj9Dh7L?I9n(|IIBk^_W<{vwJg*v3dgh`O$n zQh%e%AOsN^Z6eC5*ViiQRpr0ccOZ&Vo5A^4`P^U`jEpsv3l~otYmElzEy{sJtg7JL zTws)t6{hIqD*9d--RO;FSt_lEhDYY+m$q&hz5SLgU-;sSQ`3vvw~ZCKK5*#x)mLrq z4}uT?08P{Q5Z|(E)96T1R!!1zpr4X!?6fB5{ zVszdC03c*GE348NlV=4H2@nz_AQ&`6@r{d9N(qKkwi#_!@#PFDvR$$Q6}_I1Av*80 z*50p*>mp)OQX%4|X(F-FQYoma#(A33JC~MZfQ~mexS0-KzS7Oe1!>Sylw! z2q7W`@A<~-wubq&%q#m&BSO1X+4vR8@!q{#HmzA$ z?5~|1y5}9c|EHh3{kpxI=H~lv***Eozw~wh+`et%C*OC&#CWHy9JrNRuezr}f%{G?+Hh{|NSEefrz5D*0vRtFLQkQ)_Jyh9WK3`oQj$cGq-Lhv9U ziS1{ZX&mjjdh_~qqsz;KbLW??-Lq+SzG}6yBDWz#MA_}O{_@K&-S_oZ>c&}PUVZKC zUwr8$qvfZ5;cdf1`RGWpn~V=Uc%;QhIK0MNDwT7*= z&NV6JZ<<;vX^k=3WY(tRo&}@Cba_NE)me32X{Fn(c1jktGOeN|Q99?GbLo)v&b!9p zDlk`RttFx{mWe_LC=tE)iH)d~O3X75Y>ZB{(zL!nKv5J%>li38*|jmu>>4LPq#D(G z4*(LScb>6ex#P-RBz zNObVvK8i%lMNt@IIVHBl%z{Y>7Vp1qvaoXVSbonnx#CYe6UwQFsUw?UeX6Z{` zeQ{-_|NbA}vvtb^fMjCl!z!5=?309ip#mci&&XytLfkym9!>J9aT+ z(}dG!=e3q;$k4c^EC*#dNWojMKt!n&f<&p5ROu#r@11v5T{TS&h(ZV-e2g)(nY9KH zGn-|37D7l+80TE1NE8JKsT3xtG!bQ4rgf6Q!bp@V$8?G-rRt^{lmiyRW;TQnDS`m4 zwXr5fO4T_tF|kxC%X5m+J7;Z{#&*mcVn76$yrP*S#inVLQdwTqbroZfQZaL$7h3D| z(OH(g_{!3as-bS{?RQ)e zV|?V>hyS<#^Q+S{y*uyNdE<3k7MJ?YI{<+wGponPI*)wks1L#z6JjjOvfZ-#_Mba) zY;I(v^NEk%USwD|jrYE+Tq@3$RMuD)LZVVqd*{=kFPM$dX-!+3WmyIYOx!A3NqOcH zs0xw_QVcPb4n`Z45&)7ubBr;D=)FTJrIIKFlvPQQl-62lX7=7Y*Hm@If~~dIW(X*y zR7zQ65i!J&syHbnMPlYuchz;7-d6zj`#tZ2H5nqNw~ebpvn-`b={m(&6s@`ryRIDn zm4ABA{KB%eHeGZgAt=S;W1Uu!J@eeDhrWGa-P+Et|H_XQxrro%AZA|a_3|8BEt?t@ zh$y8Zid9uE%+Fh!ZQ8sow>mu!g)#}PBS5d_e#58d$`H9<$8+;luO=^)&8$EW0*FW% zmF3XVUK`8IRap{oyOq8C>e;V+8QgRq8LLA%tTBqI5U|x1|=|)HCC{QM0H))b>+Qpn!2f*7-OW>+8z-l zqBT}4&4Ru6byFisA{vx~7=u0v2jfZ zAwjD+gNXuBGLH5SSVgL~Jy^_{yoT-2cjd`rPAJU$yy{f9dT;L(_NwuBy7< z?VSY4V+aI7tXVT|jiKl%5>X_w-PR?%o8!7ly%u3lmlawu{J3r3qhGxc~KDa*qR|9X#3Xg(sGkpL0W4e zK%y8KZl!kO$@jrQTXh!?xn?B4>yBMg zB3#P(^UR(&Irr&5e6-y%Teqws;s-TdXFOZ&-w)N6qGGg^Dp6EW#3*fyicw-!tlDld ztEIK~R&gGc^D=MpIk|Gqb^XqFK9W8-(djb6N;ABB zBWX#~K4+lc+n-*q^k1g$5k=GqrnK4hqFuenn&5t(3|EV^JjZJ*-UVgKNMf5ih|+goG%%cH}7cJdb>%I;h8;UXix<~^Xf6=4&fL`%|0@{@gw(T3;i z$0#aBAVhR>3rj318F^~+gg zruj#5{w?b(bp#k&1*lCrjm)!On>0j@yor)}p|w6<;?;$2SbLFcX$nu{rAI_k zGn3k6WRq#Q?y}dNGz9FR>rR^?ceEv9ZoK6Eu6=MWkn{PZ~s(jw1Ex-#JPS=QPAm>lY>j2VP5M`(}~Q5U(99p7jRGZvuk(H*vA{KFD+h^ybKheHzK76Apm)GBQO~ZKw4Fy z2P1C}ONx8T1(DI}G%#Si{v@kIbXlj71MoE%lbfCT=>Zc`Wo34tjzuB&M^bOOIyj8a z8U>+!^+tq~#lcufU{~p8lnOmCSC`O`w9a2p-k0};8HoZ(jf=#O)XzBDdfg?Dz6$v2 zJ!sc7urB>!`!YqR*&XT)ddWZmRf$w$;u%h1>d~*!dx+z~4HPe{>L*CFtPn5K3>~Bm zRc-Ka8-^}zt5+#J#xqI9aGl%KuLC=(BAr zr)2v=AhNvM1(QU)bz2)KA3UcJO-~k;y_5*TMAGA6Ej}L)TLKQhAR_*zC9Jm6JbP?8 zIR{F{z(=ZXvD)v_zeZ3Z#L4Jao$9T(bLcWW*Dov42*|*|02w!o zW*Fj`WvRB`b2Ej+w*cMmq&fU%`O&e)kh`Qn2{Cj)qLj3EehZU5k{0o38^$;~iJX9)-0QqG6b1T{dwQ*XIK5pahXMGc*Ozd?$JNR3f(yrCtthpZRPS2LV21Gg%0 zR@*DyTtTgo*dn=2%pG|U|0CU7oE5L3fr1xyipSUoAIAm$s4Dju2%A9Qr80lBEN0Bp zJKC3tv5sBuwn$HkUjfvZ$(FW*q-9jj@+Zq!{^S!{?i z*8n$pfPa_z&Dj7ZTAZ$$eM+t;!kwDdKP%V{I9`lNX8P?PB+IubaO;nM3glENE_Hgs zNnE%*CVaT)oB=V=e*z*Frcwae`uvzw0E?`$UA(#CYxq5DQ1TLOmiz>dW*s%sj4_k^k*u+oTp(iJzu@zMbLro)~Yfm%MZ{Q)=Zsb#N$(ds)!uH5l@PlLlfhpZ{!n)lIJKC0h6!TxPfFa>= ze9>n7C|orA1*;c`4;N*!(E7M0HSc-A6&mO(ffn4H92J+~dW)vs;rSyQoM&euEt(&2 zd6rPVAza<(s}-<9m`R*>b!lW}Y)|FNOSObk-PGXCDKZe=CR8nDNOban<@S4^96lG7 zW#7B!)y!-21((eIH`DSy8foi|871P=_E(?C1-$pK_C2{F`Cy%G@n|dU^1@atmx*L) zo$0t~j|Jb^?cZ)bXiv1wZP%J$HKH;#gZJ(d=n|{xAMC@7dcYjX_gTtZs@miA<9wweBXt z_V@sCwc^G^0H;@MAU7Z8pWhy#D~Vfpg-pcKctOFU{4Q5}5_b=*yjNQ3Z}D?Jv8jUJMD$xsXl(86cF&gp~@s zH-LTs0s$j|u$0wZ&okpJ>D?WLE_cn&&TZeVCJ(gK&*taSKb>~IhsUCQ7ZZTLjnudi z!D(q%o%p3R;y`X{^M3cf#-dJWU08>|)5=n!oHqY#Rpl4d9@i5FX~#E6QjkptQ_g)w z0L3@TT=GC}O7AeB*+Ui;rNCc8YG7p)=_Xk`cJu+lk z-eP4AkMuz8G9K*BAG~}mt~a(!ZwDMrq~*M_Y4Qk0LE(V!l}D|+80tU-kdh3AxZ{A` z*Hq;}F)6%(QrSg&?zQo9+jxH1LNlq}p+`CsAVr`P0ICm#d>a)F5zi|qv^PwGuVxE+ zF;Y+1z+9qwpA4VRH8LtPSnKJ*!C-6cBqJ{l>BR?)7-SyjD|Hkf%T**KvVEF*Df0%^ zDP?%-(Pp~2DaUn7z|p_n$sHYzmi_tTS?AroBoR|nL$8&(3Z;@%me%D_mJr~pMOAI4 zQTv>vNZ`Go^0snl8(2zX^kuM_(@*!q;EK;Ekq+QvjQBJAiU^_KX>QEc+b=O`N9QgB zX)M7^mI#Ssg3C@+i`%S0%kF_>^C1nD_w0>VUpt-XX1<419A`+KRdksNI7d+Ep$mIw zokyn+U)|62xteZZ{xr^>iFKe3^vXNl*vj(p=$Q0&^YgvvY;r>~<}xKRafNngVI}al zo`fwyzn(hx2_ZjIb5ep7C=u1yRDm!AN*+8Wd%zwhXdv)+^B|N7%nK07+Xbm$DiJaE zEb2-m()3t1^hd5$p%yB>REpOGqgY)Hx0kmRVcF>ioqC+kh0IcE-BMmJb}{6wN`do( zei^0P?m4wwE_~39=^UHhm^(;|F_+$T<49mq4AmQxvc;7bxjlMpD-H@wKmaTZ1DT#n5AJwfjdmUL^i+TWdZ$G-p_NCFgsN$8&$OGwrUB=3#CmwMDIkKWaYAWW3#U zT=Q`D9G5@%@WqGxeNboM+?mX$!vCz@&d(lG4?O2xDMR{F$_qRV1^(*07o!65EFh^q zr{bT0zS*;)tpPpW!m8~_l%P?=x2IFk^eUhtL+fqJU%A~;<$~uSt$ls!@x(?G>t_I4 z#nbtesBW^cN3nzg4fAyFEDqcG z<@D|?tfb#B6^xavF?lj5idF-M#6o@gUytkU1O>tKJb+aCQY7+t1P;bnr4YF(sK}^* zA{~kolZzA_l#q4{Y#E-#p|;MMU}#%Z?~dPXn7M13xXL}~4CVoSe1`!d;^uDmBvLb0 zQuIjU#LyCXki4=^fMv>R`Nn~_j7?Y=u#uF2xMhUmi)h#9r)SJMV_7`<>5Pvs*&C~= z+T^I+J{$Bqk|B7lkKm7%cApHIHJ3x=rs^)MLuzK6`FP&Z_#HgC6F_euyH; zB~~$N29`94!oU|A24dHD;)I+{Q+OD#*y0z&N`7BtQGu!*S(26o?5(f5D0d)m^oMgY zZ3z`VKUIWe&Y@5YV##3U{+hR7B2U~f57_sTUy!@5*`LuI-b}&aicml6t0R6O?tt3M zhpf{W5s@FIG9FIK?Wbu??^d;VZC#)5cU>K3`7WKyc@DoZzVDUa=hL(?LyeR3J6PIK zCt+e)wVU|MSXuw0RpLOv*Jt6?p4aoQf2bJ3X??aulW%f_C4nd`f^Enh z?CtltEk!r*nEjq#zO%avo0Rr&l^}-*PLf z0237h|0z&z5^6`SWqHW=M&7J%?6jUb+75Q$($kHPntftteBTZJ_9ZT*I|w&<4?o}k zt3^1yx*e-mwdwi-6q>rDKsReNJ|EA~bir{os)fo;2}O+-#`8B^;&Yrb>o2-v&4ljQ z{Cslj|Fr;@yRkE;^Wm|6%SD3(pTX~8r$Y37{q8^zrnXs@j6$9pBbY0iva4XBd@mSmpd>s70e02YOcHYMfK^_0yXr69l*6TR>3k0b zz?OoZo&35j;^~C8cC0~s4S0&tO<{k8Kt#(@a5NqYRZ)1w+t$S~AohlRh^le;NuTjl zfH3Q~;Eh%L+27>BF)@+qdsv#)8E`>T>keAkC|lz2v7zHjtH$@k*9h zL+$9QbI-b4WEz{6N%NWh!}nCrsR2d~$o}c+-^rUrtvA6|c(8`6P;ivJ)dD7-_@h>J z(foy^8CzQNd&$GqF}>pz*2d#EvZLQAUX!9d%hgEd?|bALi;m%%@Ws&#aj;bGv~M-3 z{k`Pu;f{hN!~9Bhz){COhyt4&x0Fu?X!L-g=6{_1d*vt-@ZaY0xX{x+Vue^pKQ<5I zculyHJ8!z3>3`Ih<##&lvaoQm~c(Fy?DieA*Er&b!^ z^Ei3IjGy;I=bpd=uXermsaS{IWkn`SChk4WN3ajg%lAU!K%tamWTcHk8GO@tyJy$4 zZvg;!jreG12=niYNRMrY^(3jhHt={*@&(q(6#qeVK3Yo`L7wdh3U2?Gek_}ZBJsr_ zDsba*=S2BXaCfS5ZwlbzPlXedNZE5bByRHpOSW5;NHp_Yr73z-mEx7>mI6|AVBdXt zKLN3E9%Qumds>iiU00KJDqj*ob%mci?CCa2PYC^2^Hkd7ub98L*E^FyU=ufs@p01^ z$xu#^3Zw2Qkm2MPQl2%ontIeK^36kQ)7ts&k+ZXZ0s)7q$Ma3c96p;%n2ytT+l0S) z^Kb6&$Z`SqXUmHZ2shfPna7392n>o2>k33f=Bl)S=_K2nGpz8e~S1&KcLvMFOG>rP*_wUqa!3~q5-@8pfGVfX9DMBEB{SS za&9E8Fd>u)MoBrO$&FH{UV3UAsY(KQ_FfIjg9twQ+;O@w5(J~WwTtQ!$QaJyRoAF& zN>Cib`B!gX?uCujcdd84lx*Fvz>YB zC`q*c@A~RgrolU(VCJ>>XIVX7_b*Y-WqaC$cw5f-cKMc|Wt|q{v*I_o%JK|D0L&{8!f1tXy-w(X3~i84Q7VrqZ`EP)UwbjI;H2 z@VUskz9`#m-e$X4Ay`FanxJnKa{_QNW$UertYMNrQOMqUWLykEfKw(^FpVypxxiq?XdTM-r{vt9T2h;- z05D4*&ZI~X=eBPc5X=h(kSQ`qe?0^8Df3v-v>Fv94eUz~?)Clcv65z`eUhkZ=)Nb2 zd~Ou|@da8lPiI)%$R0CR6|MF1=YXjC@0`dun98bxkoTFg3$fu8az0z>?FFQRM}R3HfLZn?9N@bjh&l>c@V$%Wl7FzdB+ zGh2l_rPNXSY@Z|GY_z4~XXTf6fu|JQ%O7h0L$~Fcz;E2!p1RjC^XNyyE2zA^<8e^I zZCE#Mt9Kc98Fs0Agtq4b+L=-&zvJ609$hUdHnSe?JbvW0yVkoCLN{~KGb;r_>mSef zSvkDZuVc+0P0IzWZSJm3Rs*?n84!ZzGpu*>2cXq&EKLAGE~#aLz39&( z9qb0Y&xAPT2Yk5p2J(}V5S59wMWJ)`@`~!!JS2%+r2JlJyIN?f+FhywqBUy7uhT4$6n{qFYL{@(~SEnCg0X?6d9L(_lv z*k&j>E->4znlD+M|;xqr5u zQi?&Lq`B6``gABZ;A-u+@9g={va-`QQU_W|!&X?5CoOx1hpfAeyJU{)&QRUecdpTA zmI3~Q_?5HFrt_|x_%+x4JbDWv$M0y?Z0wzQ)$s%ixK-| z^)s3~^l!961F3++Uc^QspX$pGcq(w}HJc@+&_?6Y=Nw~CYmNWmuNxYQ(7N@6*P!f5 zeD$3QmN$s5)QBVoGE7pzSZZY^rQ)CUBl1Bnh>2>z6bf`NU5NU5mI&K zq@5`j2+-B*^m%ggy`yIH?k16h?Ogb5H_caM)jJFgsxRWQIfrRMvU@pCigP-`u5LeS z+$A)`mXtar0@3A2>|oSJ(7EFqv%k`AXKyo$9BU+5X*mKev_X3L8%u`Y|18z#NPbq% zNsf^$7tES*JEQE_Dod6D6v2d!bp&r+EBP zZlMBYgZtB?^ULMsBH_jhN7Dz2NpK(n$x5+t>_ad{s>4BpN~P&xl=x5ej%Q8f|7gyd z2I3X=T`EQ<>S{8Me!#h1gDzJG%_e^<4O()gt!KgY;XcO`o`j zTNKrg@RMW~w(VvzCcA0Z#YviwV1#dc5u$?~LwUml(Mu6Q#z4#f!t9lTBeN}r%JqKN z>qDt18H{uzD{V-TR!$2vrZ;v9M*Hf!VHPhmLvRXfzD9;CW%yKFWI_CQ%D%azM;THGP0$X8|+FC=s{>ihGszd{)7PoD5jk(;zG220G zi{DD`zHsLDF*I!;KJfiRHV1?i=PbBD<#lkpz$RmE;^y=sYNvD zF<={H8QJBwn4P0g-5 z61Stfl-DqDSbJF&+s3$2+FQRDyxGBW@=X8(MO*&&9|-s7L+!F3 z>s?6&$_%@fDjAw#H=GGLnUqT#wLilWjeijTfiQSCl4}r+vy5&k5xO()w=|Q0h_iR= zdfE_hM(30n;DL0nhW?$ceWC>On&oz-dZseNC>V2-9;o$EaaS3U zk4q`WAwF8qg>!}OK=@z)7OhSMC0Fb68&#gV|ER#7LtBTK1O)sG1JtkVM}oUbK13;A z5y>W>%?D@5KIGPTZ_X9=@+COb#f&MKcv&zFtL6a0LE^3P^dSCgSw;)U33nyk1sv zDos5P*6nwGOzw`2Ai!RB53S$e+ytxLiOA4SCm58459 zlK@g%kyqwm|DfE(656SddhE8D$wtfGBxZPmbi)@` zO*Hw~BatrRtaM#E>cc+L*IT_CFJI6h?%+$DhlTc}D^FbCNisB2Mt$$z7sO?_`J(v? z-q`DpSLre^yczvzc*EJ?CCT4GPnq#zLCbS`=n8{y~*de*hw=6qNW!0rG!S<>`|;T z3456aixExW-vyb}9{cUUMeqHk4r=&vX2{!xjDii)yy%MEq$R|3CFYFxH=dm-ZMU7B zd225<`3DSbJETeQdU60pMlAK0*Z~PJ@jNohsWu3Cvh}LM5RCv885q)ylcNyh4+Sb^ zKHmoHjLUu4s8`sRJK60S{&0sX)9Y&C=qG(J33|sQMN{3n94HXO&0aQqp&z^Q+YdOw z+&}BYxmAWFBN}r!} z2`YMeU~uvX0g9=R#^uIwPMG`H_Mv*te^I-vKg?}c%H``VS0u`iht9Df5z#RCBeu{a z6kiiEC6n`ac6SWqos7*z8a_s+y!*B3qe(wHRM=jL=Ft-qez#*`7TC0JE(uckqQ zMMlz(<@Y}$BO>-yy0h<@-EdYbs5UZEn*%)~U^k*=$4SZeg|#l^-5 zEMM@D#6-EhV5RS5gg%-YJM@+k4e@s$XFqp;dT8{P@AqcS!;3Y^Oz}>~Vkh#sRgXUx z#jXS1+o|KLO;12rI@oLNB;TyEBQg2%fkN(>_rQYgs8q|mDoZgsKp-WMemLCoWNzb2 zv*+>b^%B-&;QdmX?$#mBRfV*lPS@2l_1Bw3c1 z_>JwGi1W7dF|SB)B`p({lmAPx=dg1r0+EB4UA^fM&I3lq5*q85BkPB?Pi|6}(U$KA zC%|pLYGWvRZV$RXB${M0b9eg;T7x<$QHJ^-;8fg{VCR)MICkY>Mc2V=Ppvd=DDK0U6b-mc{E| z!|ugR0=>4I@RR2UB<#npZI}mplV19?4@%k=im^_!e#BNfS=WuVH71dly+S6Lc1m6) zv(i;x@vN<7)4-DAtf|qT!l*y-F&v zezXThIWRf-2Nh@iJpMJ}{__vBiYQ2m`nO2D&vtGSDnfD&a#JOca^N<0wIZu_`7d*+ z^zOl5Z-+{sK}$UeNM3fgkT6}>;wn~hyMb7;j+cCb6KL}d*VG6E zG6i#JZA_Bp>y03NCr4V$H)#XtIXKz+x#ibqhrPWA1IG497ae$qn!A35wIOeqBA5Ob zkcC}LF^YC8c?70HPV-$t>c6F=AikCJc9z=r@2!7!vS5;4i&A89t_mvrVvkzWmr6!_ z%`$$cPD)e^7Ek-UFPMc+b0O?nr(5>9b_V+54!J@pVJbZLa;inE>Ur)f*0H1>O{DUE z5{IUnd&~qMul7N4v!@NrIN0`-*vT)2uI&I)+hC!Y;f$=0|N6#hzv?|l=@B{S+6tLU zW?|AH?(QbSw_=NHYVbj8DyQZ$z;YjlGs|7>HnbdGe$m&j#x@!0jcsg1m$?}pRp~30 zVE4W9^zw=&Al@MHmkbFa)%v;Ixw;9LDKJU`6z1AvZFJA@z9o|)A^`%_xfr?~YwBTl zwV^XIt^HfPH~d7Qg1oqDef+{0b@f9Mp2QXy-?4h z?k2$Jv)D%O+|Bj7NOjrMR1&q0;!G=(hl$)`FeZQHu-eTlY-G>da$J8|SW;YpC@d^N zp~zLi^puohX{HrQQDA3&7YE+Xes*BdCQ!R58l{fZL7~Lc{#cjzUriL0UT%&m37t0) zTFw%~&qDTQqS#7X>b%$bY-%2FJukcNWJ{?JLxCTxOFqlPhhaB+*1Qj=)fBdoDLrFj zyH`y!9buOCACKDE$D4K*pvF^-+m~l&HhE&8(EVq;9afd1gY*bf1F%v!Unt*RhRSQT z&|6q55+5?(6bn(6N6jg4$|ESBy%o)S@cBtNUH{d-T;nyzBf0Yh0fWjEuS}n9RC{uf zu|QD{FvCrVCl0nJX7}_rumLSSSY=PcVCLbeO8Jr#wEF3B6zmS^=`RX7w>6A^CdP+@ zjmKEWKIi7gIU2enX_U-Z9Nzro3$;Mr1SyJP$$pM+LQoxdUj%b=wg2(%9Ia| zV*mijeZs7bo`*wtC!f2UINI1kJxH(Gx8?i~ck>BpnwJC_vFn5VZNK^DqN&GFbf@O4 zi=%u;Len2Ls%UE@A_?~N=@H|vOw*<*r+bj!u5XhQMhnbMvoc$Le%!;>9B-$~dAkm> zIhoxB85!Fe&S%U_n#7iEC7E)?Th|LlN)J+glzyO*HwtWY(+84B$3}B2QOR_Q%}RLC zYhcj6871q%`2dvYtNlaka;3k)!|m!S-zi2pdE`ZC-gtl2K%xCam3T|-kQiQf^z1Ch zhwjmvay;2w&}GGp=D>bOA1ARl7!?ehn0p$uA0)GjJ=A-Da%G#wKU!KYxQN$4J(H>6 zyYs2#&EtiPs)1dh%pzeq4>0!)k^s4Yo5*AHVsTiW9}B`PF;r;Le|(YVy^SlkD01RX zLpT!{6I>j9e4sedqq|N_*KA4H*uO`L3i^nJ5HL6cPpHZdTsc#yhK|>EGGfLtwx(gPx#b-&?_2v!*c)PT6}-UW1}8tp zuwOt$JTC&gVkm^^jS3E;de&m$*W`i^=fv2lx7pA_7ayF=@i^^F?7f0hQKb$o%Setq zhk7M@&F5sPKM75;t#i>-1&5-TFid?J77OGgU>IEii)4|C*LrNJrw1Y>=t6Od))WVX zFV?H3C&$;j`H8BSdnDP`d26_1TKd!DtpUc+;qK=1tw>!%k28w?Zu-HMTNY95pGCp zLm1pJ<=Cf5(=eA}0|LUlJYrLeFyM1N>u8>dw6^z1t zD-xpVK>ZSNKXC4`(fV5bs_P348SHvJAIY$Vu2B!R`g8*d-+79&lyB9etFrai*Ix0u z^WFL=92jVsV$F^6;8ee==oFpN1S_dn8#*f(GCf!LLhy2UPbnWrs>syN6N^B>9rW*s z^{2+U=7roT#yTvQ2UeFE*B31lU{>OoiqaHTd?W5SI#=?Dy}BU^jhLLrIdQHFc7Ov09Qyyq`3pnAAhk zqO<(2@_nG0xC`P;Kv19(44bd*Hi5|Ew~YA`gFBt#;LdEpWL?-D_aM^R+=1X+YjntA zEpmKOcWc5sQ-RrWBdN-&%Z)bzMTJi*MTYuT?4#Y;9IEsqbp_0rUHh+c^;r1Qh|e7i z&>pg$;N*lo0~7~{`&)F9e(P;zu{2phs^P9*Z=?pr-mP*|d8xM5-c+#Zn}o-C0^eWT z$=<)fa{s*gJf^!Ls55qtzMT37qiYzD^Y6#F)Xn^)6vW+E{T>`%btP;>QyMa=ss!oX zvy_`K!mH2In+Y~1kBVj`JUOcYC!q1*ffob&fBk|p)s0iPk;)hhN)ba=w ztQ9h~m91$PB{W*EF!Aw&URbRDQU zWSPQb-P_FWcX+^Mam9U7Jnoc&KX;Y zPpja~W>V4_pPDj;7f1_y%^NmSOQ1s3 zOewXmT9G_z2oqCdvcR-7!&_^s27k@40`SQmt9e{7tq?s#sjlq?91#aO#N%BZOQys% z;AK;rTQe1NXj+I{!(W0a`})Id5`sTY+Vq7&Sw{Q5Jv`WB;bK@xiv){Wav;f7RFW8e z3PwNR9tb(cSG1|_^hNzg2Sr?7SQ5ReC zTznU~stOrk!{A%)f}8m5T2dh2^LpobA~lsFHIKj;(&h)h|G+rqWuES{CPXs&qGOc6nkJ4pDfr*t97$seYehR=BXO^jUzx26#Ny>QK5 zVvJv*`NZ7&Odw;pEi``K&a=Pi^_`ymGQ5#WD~~cIvc$&zm zn1>cM)mC-Gs&ph}RJ};d*DN(Le8etS9Zrda8%1=4J%Splf%8VSXa1lyYr55tH0J}J z9Ko@HL$^A~wtP|cUFqLwZz^!}O79z|TQ0d71?%eFgHDRvRJMPr>Pa&Azk@h5JuMIJ zh<(>UO)35L6v#-uvstU_O9c>B=!!R_q-NfGzX`9mo|>UoUKVwTaH0|{>ox!k4G zboBJ1Rh{3D7}*+aFM%=a?&?K9b_w}$uPYt1rXwL==Q70b?JN(ZdAO@3EX?TW4QZbALR4sm|2dP{Eo7Y_|>v>1572{7BlTY)J zA6b}l&>Z~b1n{7<>|0+MDdJilFP9=5a`NjvBk6;8Z-e@F2)=%5b+3#!JI_Aa{zO_r z1M7wdLj${wc$zakL^|7xWv>iF=meGKwFKKIzG5-$GK>O-?i2rdSj7r>2cA!UlpTMu z7^!bn2V?;3V)9$|Vn^ZhAEh6WS*U+6abVyMwYt$LA28%k8~YpDvi{XBYyLKvXM^I5 zth!WUF9&w;{m^BhChkG;MasrM=bLQBdy`?$3w>!lw>xv_*U#T*_a`Sn!9){nrguK! zq1c|6Z(}S`-Co=5QU6XKBUOMUV6xNQny0qvqpRY1-C7V#uKU0%_06aO^Uj=y=4mDl zC;rwwz|sTQ&cG=XBZDYqI|e^tBmGDK?66k9UUC;%+m#p)mdq5hKH-lZ!-i z#}1L}e<+cvxU7X0{4Flh`=?myvRXvqatV8Zc~jLdF~9U@^%dpUdTN8T-I{`~(A6=w z7}Vuepr0N_7f?``H~w%NS%mAKR2OXrh8&a8vyJ{N`$;Ezil=`E002@|73Fn5b(cJT zcPWfP#mAd)XU{2+4;g*bd)8S=cP}U|vawbBLNOgMTK8KArwkfuY~OUmF_J*@hlx1(tQYfOxbW?Atdhs@#2Q`*(N(pwD8g zen0!dkfI@W80EJ4?tZs|C|i`v+^yKw#=o_lSMTygGCPax->+SBya~+y)|Bz7gLI7m NRV7Wu5|~Bs{{hmOHE93< literal 0 HcmV?d00001 diff --git a/textures/techage_oil_tower_top.png b/textures/techage_oil_tower_top.png new file mode 100644 index 0000000000000000000000000000000000000000..cac22f23cb03c1031bfee98db97813e55c66287f GIT binary patch literal 596 zcmV-a0;~OrP)ij9)o* zT^HN71@Aoo09b2*h#-Uj#u$(&aZS^}G)({iRUINq?+Ovq;vt0MSmM0*Y2unr2mv0C z2TaohnkT+quP3?NVHhG2fwi{CBO(yd=I<|;OC%yt&bg!{!SbW{^Z5+cT2O7Ln6eJ56V^a7? zuzWAiI&ze`f-R$t`UN!$uuSvLa%h?cLI}I~+wFFO0=lk?FPTt6dhi~;296Asi&0J_ za@@+-;G6^R{WA)_iQPUh_waEXAzWkT5v&8wOB9+vo8oYydpV@%aB2bS-N@ipLizaEBaZ>4(| zJg?@iCD*aYvG4o%$*!2!Ri*!YWLM1Z8WBM$wW^-;vpij{*00e?nUIUZ*DSE)B=bK0 z)8Ko9Dixz6;hg)unrW^7eFMC%cFtvU{n6ly$!QpdC^xYt*5_TYlyCVygz$_4MEujK iuJz)Yyw(*XBK!aXj@JKVBP&V(0000