From cef31ea0cff81c2af0a9e480c65a1c06406a813e Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 12 Dec 2021 20:41:49 +0100 Subject: [PATCH] Collider system added --- basis/recipe_lib.lua | 97 +++++++++++++++++++++++++++++++ collider/detector.lua | 15 ++++- collider/inlets.lua | 8 +-- collider/magnet.lua | 21 +++++++ collider/worker.lua | 71 +++++++++++----------- doc/guide.lua | 5 ++ doc/items.lua | 2 + doc/manual_DE.lua | 90 +++++++++++++++++++++++++++- doc/manual_EN.lua | 9 ++- doc/plans.lua | 31 ++++++++++ furnace/cooking.lua | 22 +++---- init.lua | 2 +- manuals/QSG.md | 7 ++- manuals/manual_DE.md | 8 ++- manuals/manual_EN.md | 8 ++- manuals/manual_ta4_DE.md | 83 +++++++++++++++++++++++++- manuals/manual_ta4_EN.md | 2 +- manuals/ta4_lua_controller_EN.md | 2 +- manuals/toc_DE.md | 6 +- manuals/toc_EN.md | 2 +- textures/techage_ta4c.png | Bin 0 -> 8959 bytes 21 files changed, 420 insertions(+), 71 deletions(-) create mode 100644 textures/techage_ta4c.png diff --git a/basis/recipe_lib.lua b/basis/recipe_lib.lua index 826410d..b9af669 100644 --- a/basis/recipe_lib.lua +++ b/basis/recipe_lib.lua @@ -164,3 +164,100 @@ end function techage.recipes.add_group_item(group, default_item_name) GROUP_ITEMS[group] = default_item_name end + +------------------------------------------------------------------------------- +-- Borrowed from ghaydn +------------------------------------------------------------------------------- +local has_i3 = minetest.get_modpath("i3") +local has_ui = minetest.get_modpath("unified_inventory") +local has_cg = minetest.get_modpath("craftguide") + +local function format_i3(input) + local output = {} + for _, entry in ipairs(input) do + local secondput = "" + if type(entry) == "table" then + for _, secondtry in ipairs(entry) do + secondput = secondput..secondtry.."," + end + table.insert(output, secondput) + else + table.insert(output, entry) + end + end + return output +end + +techage.recipes.register_craft_type = function(name, def) + if has_cg then + local cg_def = { + description = def.description, + icon = def.icon, + } + craftguide.register_craft_type(name, cg_def) + end + if has_i3 then + local i3_def = { + description = def.description, + icon = def.icon, + width = def.width or 3, + height = def.height or 3, + dynamic_display_size = def.dynamic_display_size or nil, + uses_crafting_grid = def.uses_crafting_grid, + } + i3.register_craft_type(name, i3_def) + end + if has_ui then + local ui_def = { + description = def.description, + icon = def.icon, + width = def.width or 3, + height = def.height or 3, + dynamic_display_size = def.dynamic_display_size or nil, + uses_crafting_grid = def.uses_crafting_grid, + } + unified_inventory.register_craft_type(name, ui_def) + end +end + +techage.recipes.register_craft = function(def) + if not def.items then + if def.input then + def.items = table.copy(def.input) + elseif def.recipe then + def.items = table.copy(def.recipe) + end + end + if not def.result then + if def.output then def.result = def.output end + end + + if has_cg then + local cg_def = { + result = def.result, + type = def.type, + items = def.items, + } + craftguide.register_craft(cg_def) + end + if has_i3 then + + local i3_def = { + result = def.result, + type = def.type, + items = format_i3(def.items), + width = def.width or 3, + } + i3.register_craft(i3_def) + end + if has_ui then + local ui_def = { + output = def.result, + type = def.type, + items = def.items, + width = def.width or 3, + height = def.height or 3, + } + unified_inventory.register_craft(ui_def) + end +end diff --git a/collider/detector.lua b/collider/detector.lua index 7470858..66a95b9 100644 --- a/collider/detector.lua +++ b/collider/detector.lua @@ -240,6 +240,7 @@ local function start_task(pos) coroutine.yield() local resp = techage.tube_inlet_command(pos2, "enumerate", 1) if not check_expr(own_num, term_num, "- Check number of magnets", resp == TNO_MAGNETS) then + nvm.locked = false return end @@ -248,23 +249,27 @@ local function start_task(pos) resp = techage.tube_inlet_command(pos2, "distance") if resp ~= true then techage.send_single(own_num, term_num, "append", "#" .. resp .. " defect!!!") + nvm.locked = false return end techage.send_single(own_num, term_num, "append", "ok") coroutine.yield() techage.send_single(own_num, term_num, "text", "- Start magnets...") + local t = {} for num = 1, TNO_MAGNETS do local resp = techage.tube_inlet_command(pos2, "pos", num) if not resp or type(resp) ~= "table" then techage.send_single(own_num, term_num, "append", "#" .. num .. " defect!!!") nvm.magnet_positions = nil + nvm.locked = false return else - nvm.magnet_positions[#nvm.magnet_positions + 1] = resp + t[#t + 1] = resp end coroutine.yield() end + nvm.magnet_positions = t techage.send_single(own_num, term_num, "append", "ok") coroutine.yield() @@ -276,6 +281,7 @@ local function start_task(pos) if nvm.magnet_positions then techage.send_single(own_num, term_num, "append", "ok") else + nvm.locked = false return end @@ -291,11 +297,13 @@ local function start_task(pos) if not res then techage.send_single(own_num, term_num, "append", err .. "!!!") nvm.magnet_positions = nil + nvm.locked = false return end else techage.send_single(own_num, term_num, "append", "defect!!!") nvm.magnet_positions = nil + nvm.locked = false return end coroutine.yield() @@ -303,7 +311,7 @@ local function start_task(pos) techage.send_single(own_num, term_num, "append", "ok") coroutine.yield() - techage.send_single(own_num, term_num, "text", "Ready.") + techage.send_single(own_num, term_num, "text", "Collider started.") nvm.ticks = 0 nvm.running = true end @@ -330,11 +338,14 @@ techage.register_node({"techage:ta4_detector_core"}, { M(pos):set_string("term_num", src) return true elseif topic == "start" then + -- Worker block + nvm.locked = true create_task(pos, start_task) return true elseif topic == "stop" then nvm.running = false techage.del_laser(pos) + nvm.locked = false return "Detector stopped." elseif topic == "status" then if nvm.running == true then diff --git a/collider/inlets.lua b/collider/inlets.lua index baf7c35..9ef28fa 100644 --- a/collider/inlets.lua +++ b/collider/inlets.lua @@ -110,7 +110,7 @@ minetest.register_craft({ output = "techage:ta4_collider_tube_inlet", recipe = { {'', '', ''}, - {'techage:ta4_vtubeS', 'default:steelblock', ''}, + {'techage:ta4_vtubeS', 'techage:ta4_colliderblock', ''}, {'', '', ''}, }, }) @@ -204,7 +204,7 @@ minetest.register_craft({ output = "techage:ta4_collider_pipe_inlet", recipe = { {'', '', ''}, - {'techage:ta3_pipeS', 'default:steelblock', ''}, + {'techage:ta3_pipeS', 'techage:ta4_colliderblock', ''}, {'', '', ''}, }, }) @@ -292,7 +292,7 @@ minetest.register_craft({ output = "techage:ta4_collider_pipe_outlet", recipe = { {'', 'techage:ta3_pipeS', ''}, - {'', 'default:steelblock', ''}, + {'', 'techage:ta4_colliderblock', ''}, {'', '', ''}, }, }) @@ -358,7 +358,7 @@ minetest.register_craft({ output = "techage:ta4_collider_cable_inlet", recipe = { {'', '', ''}, - {'techage:electric_cableS', 'default:steelblock', ''}, + {'techage:electric_cableS', 'techage:ta4_colliderblock', ''}, {'', '', ''}, }, }) diff --git a/collider/magnet.lua b/collider/magnet.lua index c84c95c..bbcd46f 100644 --- a/collider/magnet.lua +++ b/collider/magnet.lua @@ -28,6 +28,17 @@ local VTube = techage.VTube local power = networks.power local liquid = networks.liquid +minetest.register_node("techage:ta4_colliderblock", { + description = S("TA4 Collider Steel Block"), + tiles = { + "default_steel_block.png", + }, + paramtype2 = "facedir", + groups = {cracky = 1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + minetest.register_node("techage:ta4_detector_magnet", { description = S("TA4 Collider Detector Magnet"), tiles = { @@ -197,6 +208,7 @@ techage.register_node({"techage:ta4_magnet"}, { return send_to_next(pos, in_dir, topic, payload + 1) elseif topic == "pos" then if payload and tonumber(payload) == nvm.number then + nvm.tube_damage = nil return pos else return send_to_next(pos, in_dir, topic, payload) @@ -242,6 +254,15 @@ minetest.register_node("techage:ta4_magnet_base", { sounds = default.node_sound_metal_defaults(), }) +minetest.register_craft({ + output = "techage:ta4_colliderblock", + recipe = { + {'techage:aluminum', '', 'default:steel_ingot'}, + {'', '', ''}, + {'default:steel_ingot', '', 'techage:aluminum'}, + }, +}) + minetest.register_craft({ output = "techage:ta4_detector_magnet 2", diff --git a/collider/worker.lua b/collider/worker.lua index a5b3b63..dba2139 100644 --- a/collider/worker.lua +++ b/collider/worker.lua @@ -22,28 +22,27 @@ local AssemblyPlan = { -- level 1 -- left/right - { 1, {3,3,3,2}, 0, "default:steelblock"}, - { 1, {3,3,3}, 0, "default:steelblock"}, - { 1, {3,3,3,0}, 0, "default:steelblock"}, - { 1, {1,1,1,2}, 0, "default:steelblock"}, - { 1, {1,1,1}, 0, "default:steelblock"}, - { 1, {1,1,1,0}, 0, "default:steelblock"}, + { 1, {3,3,3,2}, 0, "techage:ta4_colliderblock"}, + { 1, {3,3,3}, 0, "techage:ta4_colliderblock"}, + { 1, {3,3,3,0}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,1,2}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,1}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,1,0}, 0, "techage:ta4_colliderblock"}, -- front - { 1, {3,3,2}, 0, "default:steelblock"}, - { 1, {3,2}, 0, "default:steelblock"}, - { 1, {2}, 0, "default:steelblock"}, - { 1, {1,2}, 0, "default:steelblock"}, - { 1, {1,1,2}, 0, "default:steelblock"}, + { 1, {3,3,2}, 0, "techage:ta4_colliderblock"}, + { 1, {3,2}, 0, "techage:ta4_colliderblock"}, + { 1, {2}, 0, "techage:ta4_colliderblock"}, + { 1, {1,2}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,2}, 0, "techage:ta4_colliderblock"}, -- back - { 1, {3,3,0}, 0, "default:steelblock"}, - { 1, {3,0}, 0, "default:steelblock"}, + { 1, {3,3,0}, 0, "techage:ta4_colliderblock"}, + { 1, {3,0}, 0, "techage:ta4_colliderblock"}, { 1, {0}, 2, "techage:ta4_collider_pipe_inlet"}, - { 1, {1,0}, 0, "default:steelblock"}, - { 1, {1,1,0}, 0, "default:steelblock"}, + { 1, {1,0}, 0, "techage:ta4_colliderblock"}, + { 1, {1,1,0}, 0, "techage:ta4_colliderblock"}, -- middle { 1, {3,3}, 0, "techage:ta4_detector_magnet"}, { 1, {3}, 0, "techage:ta4_detector_magnet"}, - { 1, {}, 0, "techage:ta4_detector_core"}, { 1, {1}, 0, "techage:ta4_detector_magnet"}, { 1, {1,1}, 0, "techage:ta4_detector_magnet"}, @@ -51,10 +50,10 @@ local AssemblyPlan = { -- left/right { 2, {3,3,3,2}, 1, "techage:ta4_collider_pipe_inlet"}, { 2, {3,3,3}, 1, "techage:ta4_collider_tube_inlet"}, - { 2, {3,3,3,0}, 0, "default:steelblock"}, + { 2, {3,3,3,0}, 0, "techage:ta4_colliderblock"}, { 2, {1,1,1,2}, 3, "techage:ta4_collider_pipe_inlet"}, { 2, {1,1,1}, 3, "techage:ta4_collider_tube_inlet"}, - { 2, {1,1,1,0}, 0, "default:steelblock"}, + { 2, {1,1,1,0}, 0, "techage:ta4_colliderblock"}, -- front { 2, {3,3,2}, 0, "techage:ta4_detector_magnet"}, { 2, {3,2}, 0, "techage:ta4_detector_magnet"}, @@ -64,36 +63,39 @@ local AssemblyPlan = { -- back { 2, {3,3,0}, 0, "techage:ta4_detector_magnet"}, { 2, {3,0}, 0, "techage:ta4_detector_magnet"}, - { 2, {0}, 0, "default:steelblock"}, + { 2, {0}, 0, "techage:ta4_colliderblock"}, { 2, {1,0}, 0, "techage:ta4_detector_magnet"}, { 2, {1,1,0}, 0, "techage:ta4_detector_magnet"}, -- level 3 -- left/right - { 3, {3,3,3,2}, 0, "default:steelblock"}, + { 3, {3,3,3,2}, 0, "techage:ta4_colliderblock"}, { 3, {3,3,3}, 1, "techage:ta4_collider_cable_inlet"}, - { 3, {3,3,3,0}, 0, "default:steelblock"}, - { 3, {1,1,1,2}, 0, "default:steelblock"}, + { 3, {3,3,3,0}, 0, "techage:ta4_colliderblock"}, + { 3, {1,1,1,2}, 0, "techage:ta4_colliderblock"}, { 3, {1,1,1}, 3, "techage:ta4_collider_cable_inlet"}, - { 3, {1,1,1,0}, 0, "default:steelblock"}, + { 3, {1,1,1,0}, 0, "techage:ta4_colliderblock"}, -- front - { 3, {3,3,2}, 0, "default:steelblock"}, - { 3, {3,2}, 0, "default:steelblock"}, - { 3, {2}, 0, "default:steelblock"}, - { 3, {1,2}, 0, "default:steelblock"}, - { 3, {1,1,2}, 0, "default:steelblock"}, + { 3, {3,3,2}, 0, "techage:ta4_colliderblock"}, + { 3, {3,2}, 0, "techage:ta4_colliderblock"}, + { 3, {2}, 0, "techage:ta4_colliderblock"}, + { 3, {1,2}, 0, "techage:ta4_colliderblock"}, + { 3, {1,1,2}, 0, "techage:ta4_colliderblock"}, -- back - { 3, {3,3,0}, 0, "default:steelblock"}, - { 3, {3,0}, 0, "default:steelblock"}, + { 3, {3,3,0}, 0, "techage:ta4_colliderblock"}, + { 3, {3,0}, 0, "techage:ta4_colliderblock"}, { 3, {0}, 2, "techage:ta4_collider_pipe_inlet"}, - { 3, {1,0}, 0, "default:steelblock"}, - { 3, {1,1,0}, 0, "default:steelblock"}, + { 3, {1,0}, 0, "techage:ta4_colliderblock"}, + { 3, {1,1,0}, 0, "techage:ta4_colliderblock"}, -- middle { 3, {3,3}, 0, "techage:ta4_detector_magnet"}, { 3, {3}, 0, "techage:ta4_detector_magnet"}, { 3, {}, 0, "techage:ta4_collider_pipe_outlet"}, { 3, {1}, 0, "techage:ta4_detector_magnet"}, { 3, {1,1}, 0, "techage:ta4_detector_magnet"}, + + -- Core block + { 1, {}, 0, "techage:ta4_detector_core"}, } local t = {} @@ -167,7 +169,10 @@ minetest.register_node("techage:ta4_collider_detector_worker", { end elseif fields.remove then if not nvm.assemble_locked then - remove(pos, player:get_player_name()) + local nvm = techage.get_nvm({x=pos.x, y=pos.y + 1, z=pos.z}) + if not nvm.locked then + remove(pos, player:get_player_name()) + end end end end, diff --git a/doc/guide.lua b/doc/guide.lua index c409678..b65e121 100644 --- a/doc/guide.lua +++ b/doc/guide.lua @@ -13,6 +13,8 @@ local function tooltip(item) local img, name = item[1], item[2] if img == "" then -- larger image for the plan? return "", name + elseif img == "10x10" then -- huge image for the plan? + return "10x10", name end local ndef = minetest.registered_nodes[name] if ndef and ndef.description then @@ -41,6 +43,9 @@ local function plan(images) elseif img == "" then img = tooltip -- use tooltip for bigger image tbl[#tbl+1] = "image["..x_offs..","..y_offs..";2.2,2.2;"..img.."]" + elseif img == "10x10" then + img = tooltip -- use tooltip for bigger image + tbl[#tbl+1] = "image["..x_offs..","..y_offs..";10,10;"..img.."]" elseif string.find(img, ":") then tbl[#tbl+1] = "item_image["..x_offs..","..y_offs..";1,1;"..img.."]" else diff --git a/doc/items.lua b/doc/items.lua index f2c91ff..3c5c9ad 100644 --- a/doc/items.lua +++ b/doc/items.lua @@ -126,6 +126,7 @@ techage.Items = { ta3_injector = "techage:ta3_injector_pas", ---------------------------- techage_ta4 = "techage_ta4.png", + techage_ta4c = "techage_ta4c.png", ta4_windturbine = "techage:ta4_wind_turbine", ta4_pillar = "techage:pillar", ta4_blinklamp = "techage:rotor_signal_lamp_off", @@ -198,6 +199,7 @@ techage.Items = { ta4_turncontroller = "techage:ta4_turncontroller", ta4_signallamp_2x = "techage:ta4_signallamp_2x", ta4_signallamp_4x = "techage:ta4_signallamp_4x", + ta4_terminal = "techage:terminal3", } function techage.add_manual_items(table_with_items) diff --git a/doc/manual_DE.lua b/doc/manual_DE.lua index f6700e3..7d88f1f 100644 --- a/doc/manual_DE.lua +++ b/doc/manual_DE.lua @@ -138,7 +138,7 @@ techage.manual_DE.aTitel = { "3,TechAge Programmer", "3,TechAge Kelle / Trowel", "3,TA3 Bohrgestängezange / TA3 Drill Pipe Wrench", - "1,TA4: Zukunft", + "1,TA4: Jetzt-Zeitalter", "2,Windkraftanlage", "3,TA4 Windkraftanlage / Wind Turbine", "3,TA4 Windkraftanlagengondel / Wind Turbine Nacelle", @@ -203,6 +203,10 @@ techage.manual_DE.aTitel = { "3,Fundament-Ebene", "3,Schotter-Ebene", "3,Einfüll-Ebene", + "2,TA4 Teilchenbeschleuniger / Collider", + "3,Detektor", + "3,Steuerung / TA4 Terminal", + "3,Aufbau", "2,Weitere TA4 Blöcke", "3,TA4 Tank / TA4 Tank", "3,TA4 Pumpe / TA4 Pump", @@ -224,7 +228,7 @@ techage.manual_DE.aTitel = { } techage.manual_DE.aText = { - "Tech Age ist eine Technik-Mod mit 4 Entwicklungsstufen:\n".. + "Tech Age ist eine Technik-Mod mit 5 Entwicklungsstufen:\n".. "\n".. "TA1: Eisenzeitalter (Iron Age) \n".. "Benutze Werkzeuge und Hilfsmittel wie Köhler\\, Kohlebrenner\\, Kiessieb\\, Hammer\\, Hopper um notwendige Erze und Metalle zu schürfen und zu verarbeiten.\n".. @@ -235,9 +239,12 @@ techage.manual_DE.aText = { "TA3: Ölzeitalter (Oil Age)\n".. "Suche und fördere Öl\\, baute Schienenwege zur Ölbeförderung. Ein Kraftwerk liefert den notwendigen Strom für deine Maschinen. Elektrisches Licht erhellt deine Industrieanlagen.\n".. "\n".. - "TA4: Zukunft (Future Age)\n".. + "TA4: Jetzt-Zeitalter (Now Age)\n".. "Regenerative Energiequellen wie Wind\\, Sonne und Biokraft helfen dir\\, das Ölzeitalter zu verlassen. Mit modernen Technologien und intelligenten Maschinen machst du dich auf in die Zukunft.\n".. "\n".. + "TA5: Zukunft (Future Age)\n".. + "Maschinen zur Überwindung von Raum und Zeit\\, neue Energiequellen und andere Errungenschaften prägen dein Leben.\n".. + "\n".. "Hinweis: Mit Klicken auf die Pluszeichen kommst du in die Unterkapitel dieser Anleitung.\n".. "\n".. "\n".. @@ -1720,6 +1727,75 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "Der Teilchenbeschleuniger ist eine Forschungsanlage\\, bei der Grundlagenforschung betrieben wird. Hier können Erfahrungspunkte (experience points) gesammelt werden\\, welche für TA5 (Future Age) benötigt werden.\n".. + "\n".. + "Der Teilchenbeschleuniger muss wie sein Original am CERN in Genf unterirdisch aufgebaut werden. Die Standardeinstellung ist hier Y <= -28. Der Wert kann aber per Konfiguration vom Server Personal geändert werden. Ab besten nachfragen\\, oder mit dem \"TA4 Collider Detector Worker\" Block ausprobieren.\n".. + "\n".. + "Pro Spieler kann nur ein Teilchenbeschleuniger betrieben werden. Es macht also keinen Sinn\\, zwei oder mehrere Teilchenbeschleuniger aufzubauen. Erfahrungspunkte werden dem Spieler gutgeschrieben\\, dem der Teilchenbeschleuniger gehört. Die Erfahrungspunkte können nicht übertragen werden.\n".. + "\n".. + "Ein Teilchenbeschleuniger besteht aus einem \"Ring\" aus Röhren und Magneten sowie dem Detektor mit Kühlanlage. \n".. + "\n".. + " - Der Detektor ist das Herz der Anlage. Hier finden die wissenschaftlichen Experimente statt. Der Detektor ist 3x3x7 Blöcke groß.\n".. + " - Die TA4 Collider Detector Magnete (22 Stück) müssen über jeweils 5 Blöcken der TA4 Vakuumröhre miteinander verbunden werden. Jeder Magnet benötigt zusätzlich Strom und einen Gasanschluss für die Kühlung. Das ganze bildet (wie rechts im Plan abgebildet) ein Quadrat mit einer Kantenlänge von 37 Metern.\n".. + " - Zusätzlich wird eine Kühlung benötigt\\, welche zusätzlich beim Detektor aufgebaut werden muss. Für die Kühlung wird Wasserstoff benötigt.\n".. + " - Die Anlage benötigt einiges an Strom. Daher ist eine eigene Stromversorgung sinnvoll.\n".. + "\n".. + "Der Plan zeigt die Anlage von oben:\n".. + "\n".. + " - der graue Block ist der Detektor mit dem Worker-Block in der Mitte\n".. + " - die roten Blöcke sind die Magnete\\, das blaue die Vakuumröhren\n".. + "\n".. + "\n".. + "\n", + "Der Detektor wird mit Hilfe des \"TA4 Collider Detector Worker\" Blocks automatisch aufgebaut (ähnlich wie beim Bohrturm). Alle dazu notwendigen Materialien müssen zuvor in den Worker-Block gelegt werden. Auf dem Worker-Block ist der Detektor symbolisch dargestellt. Der Detektor wird über dem Worker-Block in Querrichtung errichtet.\n".. + "\n".. + "Der Detektor kann mit Hilfe des Worker-Blocks auch wieder abgebaut werden.\n".. + "\n".. + "Auf den beiden Stirnseiten des Detektors befinden sich die Anschlüsse für Strom\\, Gas und Vakuumröhre. Oben muss eine TA4 Pumpe angeschlossen werden\\, um die Röhre leer zu saugen / das Vakuum zu erzeugen.\n".. + "\n".. + "Auf der Rückseite des Detektors muss das Kühlsystem angeschlossen werden. Im Plan rechts ist das Kühlsystem abgebildet. Hier wird neben dem TA4 Wärmetauscher des Energiespeichers (welcher hier zur Kühlung genutzt wird)\\, auch ein TA4 Kühlerblock benötigt. \n".. + "\n".. + "Hinweis: Der Pfeil des Wärmetauschers muss vom Detektor weg zeigen. Auch der Wärmetauscher muss mit Strom versorgt werden.\n".. + "\n".. + "\n".. + "\n", + "Der Teilchenbeschleuniger wird über ein TA4 Terminal gesteuert (nicht über das TA4 Lua Controller Terminal).\n".. + "\n".. + "Dieses Terminal muss mit dem Detektor verbunden werden. Die Nummer des Detektors wird als Infotext am Worker-Block angezeigt.\n".. + "\n".. + "Das Terminal unterstützt folgende Kommandos:\n".. + "\n".. + " - 'connect ' (verbinden mit dem Detektor)\n".. + " - 'start' (starten des Detektors)\n".. + " - 'stop' (stoppen des Detektors)\n".. + " - 'test ' (überprüfen eines Magneten)\n".. + " - 'points' (abfragen der bereits erreichten Erfahrungspunkte)\n".. + "\n".. + "Tritt beim 'start' an einem Magneten ein Fehler auf\\, so wird die Nummer des Magneten ausgegeben. Über das 'test' Kommando können weitere Informationen zum Fehler des Magneten angefordert werden.\n".. + "\n".. + "\n".. + "\n", + "Für den Teilchenbeschleunigers wird außer den Blöcken für den Bau folgendes benötigt:\n".. + "\n".. + " - Strom (145 ku)\n".. + " - TA4 Tank mit mindestens 250 Einheiten Wasserstoff\n".. + "\n".. + "Beim Aufbau des Teilchenbeschleunigers empfiehlt sich folgende Reihenfolge:\n".. + "\n".. + " - Einen Forceload Block setzen. Nur der Detektor mit der Kühlanlage muss sich im Bereich des Forceload Blockes befinden.\n".. + " - Den Worker-Block setzen\\, mit Items füllen und den Detektor über das Menü aufbauen\n".. + " - Den Ring mit Röhren und Magneten aufbauen\n".. + " - Alle Magneten und den Detektor mit Stromkabel verbinden\n".. + " - Alle Magneten und den Detektor mit den gelben Röhren verbinden und mit Wasserstoff füllen\n".. + " - Eine TA4 Pumpe als Vakuumpumpe auf dem Detektor installieren und einschalten (es wird kein zusätzlicher Tank benötigt). Geht die Pumpe in den \"standby\"\\, ist das Vakuum hergestellt. Dies dauert einige Sekunden\n".. + " - den Kühler (Wärmetauscher) aufbauen und mit dem Stromkabel verbinden\n".. + " - Das TA4 Terminal vor den Detektor setzen und über 'connect ' mit dem Detektor verbinden\n".. + " - Die Stromversorgung einschalten/herstellen\n".. + " - den Kühler (Wärmetauscher) einschalten\n".. + " - den Detektor über 'start' am TA4 Terminal einschalten. Der Detektor geht nach einigen Prüfschritten in den Normalbetrieb oder gibt einen Fehler aus.\n".. + "\n".. + "\n".. + "\n", "", "Siehe TA3 Tank.\n".. "\n".. @@ -2050,6 +2126,10 @@ techage.manual_DE.aItemName = { "", "", "", + "", + "ta4_terminal", + "techage_ta4c", + "", "ta4_tank", "ta4_pump", "ta4_furnaceheater", @@ -2272,6 +2352,10 @@ techage.manual_DE.aPlanTable = { "ta4_liquid_filter_base", "ta4_liquid_filter_gravel", "ta4_liquid_filter_top", + "techage_collider_plan", + "ta4_cooler", + "", + "", "", "", "", diff --git a/doc/manual_EN.lua b/doc/manual_EN.lua index d7a444f..a86f993 100644 --- a/doc/manual_EN.lua +++ b/doc/manual_EN.lua @@ -138,7 +138,7 @@ techage.manual_EN.aTitel = { "3,TechAge Programmer", "3,TechAge Trowel / Trowel", "3,TA3 drill pipe wrench", - "1,TA4: Future", + "1,TA4: Now Age", "2,Wind Turbine", "3,TA4 Wind Turbine", "3,TA4 Wind Turbine Nacelle", @@ -223,7 +223,7 @@ techage.manual_EN.aTitel = { } techage.manual_EN.aText = { - "Tech Age is a technology mod with 4 development stages:\n".. + "Tech Age is a technology mod with 5 development stages:\n".. "\n".. "TA1: Iron Age\n".. "Use tools and aids such as coal burners\\, coal burners\\, gravel sieves\\, hammers and hoppers to mine and process the necessary ores and metals.\n".. @@ -234,9 +234,12 @@ techage.manual_EN.aText = { "TA3: Oil Age\n".. "Find and extract oil\\, built railways for oil transportation. A power plant provides the necessary electricity for your machines. Electric light illuminates your industrial plants.\n".. "\n".. - "TA4: Future Age\n".. + "TA4: Now Age\n".. "Renewable energy sources such as wind\\, sun and biofuels help you to leave the oil age. With modern technologies and intelligent machines you set out into the future.\n".. "\n".. + "TA5: Future Age\n".. + "Machines to overcome space and time\\, new sources of energy and other achievements shape your life.\n".. + "\n".. "Note: With a click on the plus sign you get into the subchapters of this manual.\n".. "\n".. "\n".. diff --git a/doc/plans.lua b/doc/plans.lua index 4eb7b64..b2c50f4 100644 --- a/doc/plans.lua +++ b/doc/plans.lua @@ -24,6 +24,7 @@ local IMG41 = {"", "techage_ta4_tes.png"} local IMG42 = {"", "techage_ta4_solar.png"} local IMG43 = {"", "techage_reactor_inv.png"} local IMG44 = {"", "techage_ta4_filter.png"} +local IMG45 = {"10x10", "techage_collider_plan.png"} local TOP_V = {"top_view", ""} local SIDEV = {"side_view", ""} @@ -462,6 +463,36 @@ techage.ConstructionPlans["ta4_liquid_filter_top"] = { {false, CONCR, CONCR, CONCR, CONCR, CONCR}, } +-- +-- TA4 Collider +-- +local STEEL = {"default_steel_block.png", "techage:ta4_colliderblock"} +local COOL4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", "techage:ta4_collider_cooler"} + +techage.ConstructionPlans["techage_collider_plan"] = { + {IMG45, false, false, false}, + {false, false, false, false}, + {false, false, false, false}, + {false, false, false, false}, + {false, false, false, false}, + {false, false, false, false}, +} + +-- +-- TA4 Detector Cooler +-- +local STEEL = {"default_steel_block.png", "techage:ta4_colliderblock"} +local COOL4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", "techage:ta4_collider_cooler"} + +techage.ConstructionPlans["ta4_cooler"] = { + {false, false, false, SIDEV, false, false, false, false, false}, + {false, false, false, false, false, false, false, false, false}, + {false, STEEL, PIPEH, HEXR1, PIPEH, COOL4, PN270, false, false}, + {false, STEEL, false, HEXR2, false, false, PIPEV, false, false}, + {false, STEEL, PIPEH, HEXR3, PIPEH, PIPEH, PN180, false, false}, + {false, false, false, false, false, false, false, false, false}, +} + function techage.add_manual_plans(table_with_plans) for name, tbl in pairs(table_with_plans) do techage.ConstructionPlans[name] = tbl diff --git a/furnace/cooking.lua b/furnace/cooking.lua index 4583407..8e07c09 100644 --- a/furnace/cooking.lua +++ b/furnace/cooking.lua @@ -192,14 +192,12 @@ function techage.furnace.reset_cooking(nvm) end -if minetest.global_exists("unified_inventory") then - unified_inventory.register_craft_type("ta3_melting", { - description = S("TA3 Melting"), - icon = "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png", - width = 2, - height = 2, - }) -end +techage.recipes.register_craft_type("ta3_melting", { + description = S("TA3 Melting"), + icon = "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png", + width = 2, + height = 2, +}) function techage.furnace.register_recipe(recipe) local words = string.split(recipe.output, " ") @@ -224,9 +222,7 @@ function techage.furnace.register_recipe(recipe) end end - if minetest.global_exists("unified_inventory") then - recipe.items = recipe.recipe - recipe.type = "ta3_melting" - unified_inventory.register_craft(recipe) - end + recipe.items = recipe.recipe + recipe.type = "ta3_melting" + techage.recipes.register_craft(recipe) end \ No newline at end of file diff --git a/init.lua b/init.lua index f482367..966aa6d 100644 --- a/init.lua +++ b/init.lua @@ -55,7 +55,7 @@ techage.max_num_forceload_blocks = tonumber(minetest.settings:get("techage_max_n techage.basalt_stone_enabled = minetest.settings:get_bool("techage_basalt_stone_enabled") ~= false techage.ore_rarity = tonumber(minetest.settings:get("techage_ore_rarity")) or 1 techage.modified_recipes_enabled = minetest.settings:get_bool("techage_modified_recipes_enabled") ~= false -techage.collider_min_depth = tonumber(minetest.settings:get("techage_collider_min_depth")) or -30 +techage.collider_min_depth = tonumber(minetest.settings:get("techage_collider_min_depth")) or -28 -- allow to load marshal and sqlite3 techage.IE = minetest.request_insecure_environment() diff --git a/manuals/QSG.md b/manuals/QSG.md index 445ae89..1db6b4d 100644 --- a/manuals/QSG.md +++ b/manuals/QSG.md @@ -3,12 +3,13 @@ The Techage Modpack is an extensive collection of technical mods with many machines and systems, which unfortunately cannot be set up intuitively. Therefore, there is this Quick Start Guide and further manuals for the different mods. -Techage represents four technological ages: +Techage represents five technological ages: - Iron Age (TA1) - Simple tools like coal pile, coal burner, gravel sieve, hammer for getting ores and making goods - Steam Age (TA2) - Simple machines that are powered by steam engines and drive axles - Oil Age (TA3) - More modern machines that are powered by electricity -- Future Age (TA4) - Electricity from renewable energy sources such as sun and wind +- Now Age (TA4) - Electricity from renewable energy sources such as sun and wind +- Future Age (TA5) Since the levels build on each other, all ages have to be run through one after the other. @@ -61,7 +62,7 @@ Since the levels build on each other, all ages have to be run through one after -## Future Age (TA4) +## Now Age (TA4) 1. Build solar and wind plants to get renewable energy 2. Build a Thermal Energy Storage to store the energy diff --git a/manuals/manual_DE.md b/manuals/manual_DE.md index 6a4995a..1765209 100644 --- a/manuals/manual_DE.md +++ b/manuals/manual_DE.md @@ -1,6 +1,6 @@ # Tech Age Mod -Tech Age ist eine Technik-Mod mit 4 Entwicklungsstufen: +Tech Age ist eine Technik-Mod mit 5 Entwicklungsstufen: TA1: Eisenzeitalter (Iron Age) Benutze Werkzeuge und Hilfsmittel wie Köhler, Kohlebrenner, Kiessieb, Hammer, Hopper um notwendige Erze und Metalle zu schürfen und zu verarbeiten. @@ -11,9 +11,13 @@ Baue eine Dampfmaschine mit Antriebsachsen und betreibe damit deine ersten Masch TA3: Ölzeitalter (Oil Age) Suche und fördere Öl, baute Schienenwege zur Ölbeförderung. Ein Kraftwerk liefert den notwendigen Strom für deine Maschinen. Elektrisches Licht erhellt deine Industrieanlagen. -TA4: Zukunft (Future Age) +TA4: Jetzt-Zeitalter (Now Age) Regenerative Energiequellen wie Wind, Sonne und Biokraft helfen dir, das Ölzeitalter zu verlassen. Mit modernen Technologien und intelligenten Maschinen machst du dich auf in die Zukunft. +TA5: Zukunft (Future Age) +Maschinen zur Überwindung von Raum und Zeit, neue Energiequellen und andere Errungenschaften prägen dein Leben. + + Hinweis: Mit Klicken auf die Pluszeichen kommst du in die Unterkapitel dieser Anleitung. [techage_ta4|image] diff --git a/manuals/manual_EN.md b/manuals/manual_EN.md index e346d95..ac913cd 100644 --- a/manuals/manual_EN.md +++ b/manuals/manual_EN.md @@ -1,6 +1,6 @@ # Tech Age Mod -Tech Age is a technology mod with 4 development stages: +Tech Age is a technology mod with 5 development stages: TA1: Iron Age Use tools and aids such as coal burners, coal burners, gravel sieves, hammers and hoppers to mine and process the necessary ores and metals. @@ -11,9 +11,13 @@ Build a steam engine with drive axles and use it to operate your first ore proce TA3: Oil Age Find and extract oil, built railways for oil transportation. A power plant provides the necessary electricity for your machines. Electric light illuminates your industrial plants. -TA4: Future Age +TA4: Now Age Renewable energy sources such as wind, sun and biofuels help you to leave the oil age. With modern technologies and intelligent machines you set out into the future. +TA5: Future Age +Machines to overcome space and time, new sources of energy and other achievements shape your life. + + Note: With a click on the plus sign you get into the subchapters of this manual. [techage_ta4|image] diff --git a/manuals/manual_ta4_DE.md b/manuals/manual_ta4_DE.md index 1bdf928..3954e46 100644 --- a/manuals/manual_ta4_DE.md +++ b/manuals/manual_ta4_DE.md @@ -1,4 +1,4 @@ -# TA4: Zukunft +# TA4: Jetzt-Zeitalter Regenerative Energiequellen wie Wind, Sonne und Biokraft helfen dir, das Ölzeitalter zu verlassen. Mit modernen Technologien und intelligenten Maschinen machst du dich auf in die Zukunft. @@ -674,6 +674,87 @@ In den Einfüllstutzen muss Rotschlamm mittels einer Pumpe geleitet werden. +## TA4 Teilchenbeschleuniger / Collider + +Der Teilchenbeschleuniger ist eine Forschungsanlage, bei der Grundlagenforschung betrieben wird. Hier können Erfahrungspunkte (experience points) gesammelt werden, welche für TA5 (Future Age) benötigt werden. + +Der Teilchenbeschleuniger muss wie sein Original am CERN in Genf unterirdisch aufgebaut werden. Die Standardeinstellung ist hier Y <= -28. Der Wert kann aber per Konfiguration vom Server Personal geändert werden. Ab besten nachfragen, oder mit dem "TA4 Collider Detector Worker" Block ausprobieren. + +Pro Spieler kann nur ein Teilchenbeschleuniger betrieben werden. Es macht also keinen Sinn, zwei oder mehrere Teilchenbeschleuniger aufzubauen. Erfahrungspunkte werden dem Spieler gutgeschrieben, dem der Teilchenbeschleuniger gehört. Die Erfahrungspunkte können nicht übertragen werden. + +Ein Teilchenbeschleuniger besteht aus einem "Ring" aus Röhren und Magneten sowie dem Detektor mit Kühlanlage. + +- Der Detektor ist das Herz der Anlage. Hier finden die wissenschaftlichen Experimente statt. Der Detektor ist 3x3x7 Blöcke groß. +- Die TA4 Collider Detector Magnete (22 Stück) müssen über jeweils 5 Blöcken der TA4 Vakuumröhre miteinander verbunden werden. Jeder Magnet benötigt zusätzlich Strom und einen Gasanschluss für die Kühlung. Das ganze bildet (wie rechts im Plan abgebildet) ein Quadrat mit einer Kantenlänge von 37 Metern. +- Zusätzlich wird eine Kühlung benötigt, welche zusätzlich beim Detektor aufgebaut werden muss. Für die Kühlung wird Wasserstoff benötigt. +- Die Anlage benötigt einiges an Strom. Daher ist eine eigene Stromversorgung sinnvoll. + +Der Plan zeigt die Anlage von oben: + +- der graue Block ist der Detektor mit dem Worker-Block in der Mitte +- die roten Blöcke sind die Magnete, das blaue die Vakuumröhren + +[techage_collider_plan|plan] + +### Detektor + +Der Detektor wird mit Hilfe des "TA4 Collider Detector Worker" Blocks automatisch aufgebaut (ähnlich wie beim Bohrturm). Alle dazu notwendigen Materialien müssen zuvor in den Worker-Block gelegt werden. Auf dem Worker-Block ist der Detektor symbolisch dargestellt. Der Detektor wird über dem Worker-Block in Querrichtung errichtet. + +Der Detektor kann mit Hilfe des Worker-Blocks auch wieder abgebaut werden. + +Auf den beiden Stirnseiten des Detektors befinden sich die Anschlüsse für Strom, Gas und Vakuumröhre. Oben muss eine TA4 Pumpe angeschlossen werden, um die Röhre leer zu saugen / das Vakuum zu erzeugen. + +Auf der Rückseite des Detektors muss das Kühlsystem angeschlossen werden. Im Plan rechts ist das Kühlsystem abgebildet. Hier wird neben dem TA4 Wärmetauscher des Energiespeichers (welcher hier zur Kühlung genutzt wird), auch ein TA4 Kühlerblock benötigt. + +Hinweis: Der Pfeil des Wärmetauschers muss vom Detektor weg zeigen. Auch der Wärmetauscher muss mit Strom versorgt werden. + +[ta4_cooler|plan] + +### Steuerung / TA4 Terminal + +Der Teilchenbeschleuniger wird über ein TA4 Terminal gesteuert (nicht über das TA4 Lua Controller Terminal). + +Dieses Terminal muss mit dem Detektor verbunden werden. Die Nummer des Detektors wird als Infotext am Worker-Block angezeigt. + +Das Terminal unterstützt folgende Kommandos: + +- `connect ` (verbinden mit dem Detektor) +- `start` (starten des Detektors) +- `stop` (stoppen des Detektors) +- `test ` (überprüfen eines Magneten) +- `points` (abfragen der bereits erreichten Erfahrungspunkte) + +Tritt beim `start` an einem Magneten ein Fehler auf, so wird die Nummer des Magneten ausgegeben. Über das `test` Kommando können weitere Informationen zum Fehler des Magneten angefordert werden. + +[ta4_terminal|image] + + + +### Aufbau + +Für den Teilchenbeschleunigers wird außer den Blöcken für den Bau folgendes benötigt: + +- Strom (145 ku) +- TA4 Tank mit mindestens 250 Einheiten Wasserstoff + +Beim Aufbau des Teilchenbeschleunigers empfiehlt sich folgende Reihenfolge: + +- Einen Forceload Block setzen. Nur der Detektor mit der Kühlanlage muss sich im Bereich des Forceload Blockes befinden. +- Den Worker-Block setzen, mit Items füllen und den Detektor über das Menü aufbauen +- Den Ring mit Röhren und Magneten aufbauen +- Alle Magneten und den Detektor mit Stromkabel verbinden +- Alle Magneten und den Detektor mit den gelben Röhren verbinden und mit Wasserstoff füllen +- Eine TA4 Pumpe als Vakuumpumpe auf dem Detektor installieren und einschalten (es wird kein zusätzlicher Tank benötigt). Geht die Pumpe in den "standby", ist das Vakuum hergestellt. Dies dauert einige Sekunden +- den Kühler (Wärmetauscher) aufbauen und mit dem Stromkabel verbinden +- Das TA4 Terminal vor den Detektor setzen und über `connect ` mit dem Detektor verbinden +- Die Stromversorgung einschalten/herstellen +- den Kühler (Wärmetauscher) einschalten +- den Detektor über `start` am TA4 Terminal einschalten. Der Detektor geht nach einigen Prüfschritten in den Normalbetrieb oder gibt einen Fehler aus. + +[techage_ta4c|image] + + + ## Weitere TA4 Blöcke diff --git a/manuals/manual_ta4_EN.md b/manuals/manual_ta4_EN.md index b4cb554..5307a53 100644 --- a/manuals/manual_ta4_EN.md +++ b/manuals/manual_ta4_EN.md @@ -1,4 +1,4 @@ -# TA4: Future +# TA4: Now Age Renewable energy sources such as wind, sun and biofuels help you to leave the oil age. With modern technologies and intelligent machines you set out into the future. diff --git a/manuals/ta4_lua_controller_EN.md b/manuals/ta4_lua_controller_EN.md index 7a43200..ca14103 100644 --- a/manuals/ta4_lua_controller_EN.md +++ b/manuals/ta4_lua_controller_EN.md @@ -389,7 +389,7 @@ Please note, that this is not a technical distinction, only a logical. | "on", "off" | nil | turn a node on/off (machine, lamp,...) | | "red, "amber", "green", "off" | nil | set Signal Tower color | | "red, "amber", "green", "off" | lamp number (1..4) | Set the signal lamp color. Valid for "TA4 2x Signal Lamp" and "TA4 4x Signal Lamp" | -| "port" | `=on/off` | Enable/disable a Distributor filter slot..
Example: `yellow=on`
colors: "red", "green", "blue", "yellow" | +| "port" | string
`=on/off` | Enable/disable a Distributor filter slot..
Example: `"yellow=on"`
colors: red, green, blue, yellow | | "text" | text string | Text to be used for the Sensor Chest menu | | "reset" | nil | Reset the item counter of the TA4 Item Detector block | | "pull" | item string | Start the TA4 pusher to pull/push items.
Example: `default:dirt 8` | diff --git a/manuals/toc_DE.md b/manuals/toc_DE.md index 3cad548..b85969a 100644 --- a/manuals/toc_DE.md +++ b/manuals/toc_DE.md @@ -137,7 +137,7 @@ - [TechAge Programmer](./manual_ta3_DE.md#techage-programmer) - [TechAge Kelle / Trowel](./manual_ta3_DE.md#techage-kelle--trowel) - [TA3 Bohrgestängezange / TA3 Drill Pipe Wrench](./manual_ta3_DE.md#ta3-bohrgestängezange--ta3-drill-pipe-wrench) -- [TA4: Zukunft](./manual_ta4_DE.md#ta4:-zukunft) +- [TA4: Jetzt-Zeitalter](./manual_ta4_DE.md#ta4:-jetzt-zeitalter) - [Windkraftanlage](./manual_ta4_DE.md#windkraftanlage) - [TA4 Windkraftanlage / Wind Turbine](./manual_ta4_DE.md#ta4-windkraftanlage--wind-turbine) - [TA4 Windkraftanlagengondel / Wind Turbine Nacelle](./manual_ta4_DE.md#ta4-windkraftanlagengondel--wind-turbine-nacelle) @@ -202,6 +202,10 @@ - [Fundament-Ebene](./manual_ta4_DE.md#fundament-ebene) - [Schotter-Ebene](./manual_ta4_DE.md#schotter-ebene) - [Einfüll-Ebene](./manual_ta4_DE.md#einfüll-ebene) + - [TA4 Teilchenbeschleuniger / Collider](./manual_ta4_DE.md#ta4-teilchenbeschleuniger--collider) + - [Detektor](./manual_ta4_DE.md#detektor) + - [Steuerung / TA4 Terminal](./manual_ta4_DE.md#steuerung--ta4-terminal) + - [Aufbau](./manual_ta4_DE.md#aufbau) - [Weitere TA4 Blöcke](./manual_ta4_DE.md#weitere-ta4-blöcke) - [TA4 Tank / TA4 Tank](./manual_ta4_DE.md#ta4-tank--ta4-tank) - [TA4 Pumpe / TA4 Pump](./manual_ta4_DE.md#ta4-pumpe--ta4-pump) diff --git a/manuals/toc_EN.md b/manuals/toc_EN.md index 468a6a2..209d924 100644 --- a/manuals/toc_EN.md +++ b/manuals/toc_EN.md @@ -137,7 +137,7 @@ - [TechAge Programmer](./manual_ta3_EN.md#techage-programmer) - [TechAge Trowel / Trowel](./manual_ta3_EN.md#techage-trowel--trowel) - [TA3 drill pipe wrench](./manual_ta3_EN.md#ta3-drill-pipe-wrench) -- [TA4: Future](./manual_ta4_EN.md#ta4:-future) +- [TA4: Now Age](./manual_ta4_EN.md#ta4:-now-age) - [Wind Turbine](./manual_ta4_EN.md#wind-turbine) - [TA4 Wind Turbine](./manual_ta4_EN.md#ta4-wind-turbine) - [TA4 Wind Turbine Nacelle](./manual_ta4_EN.md#ta4-wind-turbine-nacelle) diff --git a/textures/techage_ta4c.png b/textures/techage_ta4c.png new file mode 100644 index 0000000000000000000000000000000000000000..a45e66442ae4abd61f2aff5626a27a0af192c3e2 GIT binary patch literal 8959 zcmVK zN>v>lAy`;pP*7S^Q(a9>Srif$b8~!eZ+Bv1Y(+&RiOZ~p)QAOJ~3K~#9!v|8)BqbL>?1)Oil95d0xXwpA> z-v1G2-#3_~tGeqHdK8t!#bWIXL=lO=(3}JfefHG23>fQ2UI4(T68DSo3#stzcd);kOfgJ z(=^X>K&Xf}(M~w13Es{0FvlQGy~7GRyhW`{Z;DyArj$kQl>^f>bfI_$D*AwFK#~(t zoZt+9urZNYxR)a}tw1Z&fp!r|g&o;@!bg}q1Xh&D1~#MSwl!uZyDB{3IhT0?fn+2Y zpe8&Cw*uLL1JkUe3U!xlSonL1oJB!T!1KhQmqj(hAdO-@0n^w&7coLE%mod*qb@{5 zjwun@iS&`=iew>O@utyWhum3>sV=oa0+Map=52A2A2hF28`D$8G{ZK~gc$(^Mp6WB zMzEw00>4!mKzm}ySf!L6|UiH6Got-{CF z6QkrmB039laVXpzya6?hWVfQ}9-DatQE$UC+vnm8>b1bNsj{Jf`PM%@1dL4ICSCX`U z5E589rfIIl1~tE!kRT9XIxxIXlpjC`2`Bjw-q4R_0Xae3(| z5Q73kK7W=+!!$-N7!?Uq8c)Ij^pWY98%s!eJt0$Q9nY#qh^Z01Psut>LET9xsyrVw^bj*oXo#T(8gv&G3GRYS zZ*v|0>d2i_1)7j7LmJY%GH8&&LQTUUy%VNWmPAV|8(&q?IAgxD)Okb&neEklH_5|k z4z>L?OvgahHN1KcMV&3MSD^KlGVNq@65?YIL3~<_RxVksEtEPNfp`J(Bg7KCYeyGd z*8mznOhgZkv}T?Vq1NdY*`YyFWbh1Y@ zdS5Af2?WxS))$#g5nw{gP~xDVDQ)dcEO<#V$3_<+ksn($PFmm*V2weN_m~2EXAdh; zQlIEaXCn6*hLjq12jP84>Q5qqh7yO$tq5rK<}@C}lA#7OoP|C|T@+cJI^%?aKx?L} zzK8*2NjK@eI4Da2zy^|0bEzFl#FlIHzD4pL1A``gh_ZvHPQtV$#@W;4OcxG%5zuY6 z!C9ORrg%63JrK?`DE1*4Xk&buz)#0Y@W`}WWL8U5O-rJRLM6}$E!SCKFwbX6IJn1Y zqWgz{LU|h}&YV{i0I~*WS132kR3+4TwJ@YZ!b}fpmq{}#oye4cE&=E>(7BR)sAnhC zzloRzYc~TFeTak7+=7yXKu%(CO$eQipA2y?YvJ)36lym}m#QhTI}rlShDiKT&aJ6( zmCO<0)O4Z?_7;-NM~@W-dQs4#V@Ik^M5>XzlYmx&yJVX3Nm`Do4xn#gp}JOsPbNc= zyii;oFwFrfx-;UrwPi&llfCR952n|P`x2K)-U~84R9#A`lYS0$yys~o2WetjbZ$O@ zvQA5xB^EK$;xjlh@EjznHdKcZKCmuf7;4CaF*ziccBYh!d&C34pj9i$=9ETtpm+`AaTXD!Azq(21k7orbVk2)1>LaniA^HwNIm|aVD#wQ36-V z+-C|^Av@&-9D^*fj^;Hi!%vu>?t2^#CAkY!9tUa~T4N=7$Y{tkC+flj!yzQ0p0j69 zEP`bjC3ydAp+$(0fb5_XeIzQwb~5k|J0eA~ek7W%lGw&~2xvfkoJCdt(4vuPtr{2?M@~i)`rHF;F<;`(akgXM6y^iqD)T< znFVWCm*enTdGvU~N}%_W81t!C#E_yTAnYBmX*}t0aK{mJ6(A$~E6**3=?ZkNQ0qaW z3r1%Gss@*3IUuXTg=^AuVkpL;FdWtG(KTwiL~3+0)SV%w83io@MNdHjug2J9tTMdi zxKPJ4-&k|(%d;`H@_@SuQPhwsdSvc7-V7@tL?^4BV`%^SE4Anf6p5 zH}dc#58jJY#4?-?s&1zO1C7JZEo-I$G?;ciE>OzwRo~V|?j}?>tWWiH!%=#xv zPp10!3||8#Pq?DZ(pSRey6#!trmMg~SN{cOM&}~Tn+mk*^SlLkX%{^B~`+F<{^nil6VUat51_2u4X#3b_GYZ_7H5{XPHjUjTIVKica}c4GQA z&D(rq(6yLH+NH|gjv$Z7H2r%4y%R&=#I#|IoT)~UlF?bM!*DrME4&A>e&tp1B^3aD zg`BF~4XYx&-}P*L>BrlKt9{G-*pTGDHQC;)#x$JH5Tqe{UFmn46;j`w-@Yfi8Sy5j z7As^VT$^DMv;%(1m!}z08frRkQ(VR#;r#I*W4fXG$nY(dhU-x%wWj;-e7iv3(ZPR>H;#g}$E0e{vAi?y;qSa*8psxgN#Ttw4YR=~ z8Ql$Ta!bw=-`eIGL7xV3Y1g|PKWqpZ-QAg^(ieMp3*K_|1kmJH#GfF7PALOmXK`O= zy@mJGr#V|1rCIy%<8RBP?!C-uG?{NTY;^pnzKsQXgYAQ_&=%;7VPj?<7kH290@unkw`r)X& z2i?H06QEoHif{WPNM;L^VQ@e28Hdi+p5KLXv9gFL=&mos2IUtlg?Z<0%Y;T+=k z7~=T++n`Mz&-Vo;E$^5lXLyZZtE2h%(>h56S1S-G+;1$89~ zB#Z`V#0AS})9TCp|3ADnWkT)YoD&-wA;PBEsj4JZ{GA?NPY0b5cQZwMWZVmg5&DZ? zE-zNmVZW-g`yE>J{l3-p?S8}6z4#mGy58_N@XO5&d|dZKAI|rX-d0W5srlj#0UWp^ zf;+>wNu3)W+0u&luSY#>Uyp6r9*^4q-|xfUKo7$WeuF>XBI9yR98(Ez%zQQL)Qgh5X|CCCgr$%D>Sg0X;0Q z2LYkIK7+mlJsi8zVNZX0N!oum6PAw46iVMyco^*JCU+1a8k6-<;CSD*lc~}PV6G2%E;yUc7p>s}&F5#+(&ga`iem?6LeQ$0($Zh=fVzFSX3#A|qz~Pk z$*AJgm4|s@3Ge2#-GoFP=6xJL3iSA4^VHFk>Hu_}_7re;09uy}!Eu-YeYLIwS zK;3thUTi+eBX*#BuHa=20#+EYl7QwDW~cMf!!6j!iTs=oSv=t4=<6KeUJ!Ko*)%=i z$`3h%CX`+0skkQyJ`!7@a3k1L9|YaXz7j!q{T{Q)z+ik^KHeXi$17mgAZL`U8SRPb zA+06>E??;ho7^I&Nz^eNgfOxXs%l%6x)ZRzt%9WI`86^gHgsFhQ{qt0GZ>o_U~W)E z)o9lRC@6vzw1nC*g~`z=yPl05O2Cn|krwC-2o$PEA%iU9q-4KD_RT?Lbi1y) z%q^I4<1P|Q+LM|=YtkO1nj?!cIV&TeF*>%YN;+NS1%PjmK|{hvEZ~}kw;S3`-+lQE zAFj;>8)0K+TOw#tdBnU((o-sFee$3uCuvV{ZV2SJP>u!@0|QfyAXgOCYrHFhS7ZAw zH)VW%vKhg>f>ZM@5==FNasqlB4o28vcFdjvZB)6QE7g0;JWYWcr0V4I3gaYlcTJA+ zB@ZmaKu#vO1lMx>Ep6kQDs)n!1e?mZwgJUry1n(FJ1=PA2CF(bfS_~LCq9&Gf&|() z(79bJ*;X!B1O6}+S<}-L&^iX4;H98wpY&ChidjHRuq!roahN>1E;5P}KPi&5T4%+e zouAZCz72+_tSGTWo_L%OlcC2=*G)jHJ!t=S2vxc~9w%vBL9YUX+0*PDmNd!B(IW)8mywk9E)mwjW8jsdo)25ZgdvmDA?_B5 z)3Y*;7!gILs5yajOYH5GM#V`Q3>v#_+$tqmO6VcUepdQE&z#nwCjvsjj*&P_X)E-` zJIEe-M{}tHSQ4=4=%AC8(HM7JMu`J1`aVMeh@R}k$9C!=b={u|dkp-87_>)iBBwMq zH~{*LpnEUsE^GyLtSDZ(+$E$T?5x?BHYyE#+UDCb323x)q^F}>_5=xC0pheCXKh#! zO7mm!M7EDJFAl5KA=A=ltv!KmsngK%${}x>SI}vnmo#Q9Et1|5yEqYk>BuNGuf%;L zjz;gOADLpheid<3}RtXd{v|DM+iAQ*OG59>R)18M#9OEsh8K{SL9{1cGSo zXA})YCGExgENLyE*BJEV2*RT(-aeP*4)o+qkN6kDUljDJRr;*VG2P?>J0@x<12LDEW%YiWY((Z$-?=N;;jho7Q1m+2DCDo{m9Z zZDhv7;GI&wjdAMOyz&qodCz<^JlaSOj|i41y~;~>;A@Ujra|7Ud1{G{*eRvkA3-Ch zZDqQI8IfNe93gei%T5fT6S8qB)?Tor@oednr8JF6$;c- zXemqTMtI*FC9O@;0L42iBgKY7#r!AStYoNHa-r7jeH)9x`rCL?Glu0tU4|0+t0pFf z$WMsjoqIKxX$OhMp{pv=Y!>NpAkdX2BIh16g8ux5v0f)T)H{pcwjF0n5~uYwXHJ_$ z6;MaXyM!IwCeyGKXH3;S&x_*5kY2{w@7hbGkDaaoEW6EA+*eh7cSDcPT?;GJONmEPhJZLZm%gL(P zg)rg00a0Uw9?q$9UU1NHd9FEQI@dfugW0`n9;P`Y*nT8Q|HO}A-goq1Nux@lH%R1q zIY^>=>E1IzZ)+e!LHX{vrF`YH^;TK(K0%I@YB+L2faD^MlCMZ_4#9-fkzU8~Gd&#e zour*EXX9e2A)+daUPmNv5rGDV9w7CWL6^e{wTws2uN}yFGKtd}1iMeL97m5FU*9)> z5Bgc)!F}bS?{@MIQ)x%Z`Yimixb1@e7nJn?3tXO{%#!jE$^svkwSZ|Ays`K|KiFQf zUm=ck;9iS+(4|_JrQWsz*2VES@KOv%T5x(sQUVbE;vg=|nLlT@b{QA=o$yBRKNx=Y z8^l3pw~^0HvS!eoB}va$0L_sHJTY6#To})U4S0}+{eg;M6aue;{~Yclg3k9PM<}P| zfFZNjYvGo`&F?LaAPJ*6Aq!N;{~Ngy z-L`cgsM2;N89F0?g50L)g9{k>{~vtZdr2{Aol23_q#ccidvQs*4}T1{J;FZ@#7+}0 zyzmupG{VI6u_Q8+mRmXk$^$gbbB{P%%2b0u$bjv<0DIr%5gfs!oAhUc+sB4qP5-wV zf%7h$FA8W(mF`yiNuWi`^%rV-VO2-moR;V&GmOe8>5nIwM+E&>*oK)OL5udu7uyCn z0D7808gB>4BPL0_fh@2|Bz-4MFD#H_Mg`3Cb~qJh=%SfI`s;K~_mJs-A)7}ZUAb8u zWBT?uK+|ukX$KmQmNczYi#pg1s-NC;D6+cwQ_yi*Vfwu;4=FeG1bQvy0gLWH(>Q^? z1f1#*e9f0U5ElZC7DOPa`P&&fq8FAA9F)h#)HBolKQhfqaRbqVPSyka@?g!}&!6dt zaJ)sje2XBD791jPm~hNn?g-?G5IR^zh?%YMCB0TMyuF6_P)0FQ+F z=c3L<_ITJZFe1Ja$0@>tj0Lx8z&L}Vjr^59fW|6~UqV(l=!zob5wXC6wc$r{Bfo$D z#7!m;C4M2HfsDCM{BHFKX__Gz>(=$1Rj0WDPED5Y&?Lfvgpv`D?IwHOMpD zX~$iKYRk0DLiZJUu=NPix5p%N2eUNywQcZJW9mm)3|ot1Q`#~4-F3So$;@}q^y$@o zq7ur!HAt0*pea)*Yo#F1=^RF;?1K&7+d&8|Ow-QPRpn}X=EujOC-6Iy|EKR)VacaJ5PNARSFtVLK7u7%u8)GTJ>;kNq#+H~`v z=V*FA631+EInNF=rzyWOigQVzAuWV=uydyR1+#p^GrS%BqIOLItA$5d5XxhnG&zlsf=?d?5Ct6NnTJ`nski>LYn1&_`H8$a-o6 zLoAtIa;lMOh@2#^Vl}&JI?0CeUyAY^#LS2kZ&b}4KO8si6Vt=>_=@RJ$b*I=4#GuK zuT!!}kq3jP=#QDU)TMKDk5(+`&odW(wE;0bT%%c!$?xh{TNa^1QEU9@V#F+~jCo)d z#l6Nu7JqF(`-(Y1(0##likaf_cTH=;C36vhnI><}=?M==pB-eCo5r;&$#C@9$vA3u z>M3=gLjop?P2B|<`^4im-{X&#nkl&Bxg>yhrHapENwYD>I7lM}M%CbgZrYKpMWJ8f!lP;HiscTv& zmth%N%K?I$Ya`eZ%tdBGq;PteO=;x6clJ$JRB8A$y52%FDy02&Fwjel;3>ZhZH;N- znFKP=R6P~6$MGZCj2~7)6VSa2sK;~1ScPe+=V5;xv_n*x_9RbiJzAe`dE98N)r}a} z8t-ui)AX4>xQ1ksRrfBXvvVI&I6_wxSQ7jV}0(@Q)l~JtUVU)YhB_CQsMajg{A0 zuD5d^1HF?Dh)5gLR0m-(5EV7gz&cya7DQ1q*?G{XpmnWDv6hNJ(~!e2EvGYV>TkT< z2z24WC!1?N*$e@zKTP0k}IMfE}%T=}jGPnkG z(r00&b>aonmXL8xE@szCjeaxGqXTW2jp@5FE%(j5;7?Fj<2Q`lOvx&YDOU%VoqWM2 z+8GPbF+G{f# z!u06Z61X!}=GOoK0x(HLK~(iJzN26Kx+Y_8ShC6Upr@~*JRXVVPUfs_nzmn#I_jBF zH+i4`U6(7ay1s}A?rpwB1x+T8K<`V%xqO1&6>QW_GiuaF^gRms1QIHy04<%t+J3ga zp3m3#3F{6^m=Be$Dcp2{CZnH37AeLNUi^JWLhBSE}-MYuoWoJOcUgR|Zw5SpDO>N)=Y1SN z8Mh>nB#2j^q;Z4O&?U9p?~f;j(s=Ho}c}UHZ6wxMi4~ zb#ZnEnotY+EO)`u6K6EdCz#7^Al~=%q0Q@@&X+D~c;3w^SorY++7BL^ZSHczGfHAG zMZ5>S9tPVcVvQ1-3e|i*5bKp2)USrRS?`7USaszztz2Tzk8SQgK0dnr7`j7K`!4+} zuk_kud)+nKh?l8d9>cIFOn2IS>A!Xg?+XI`5ALp$7I8+dF$ro4tYI|H#4s~`rQ%pZ Z{Xd!?f#nRURy6